00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include "BlockMgmt.h"
00025 #include <stdint.h>
00026 #include <getopt.h>
00027 #include <string.h>
00028 #include <stdlib.h>
00029
00030 void dump_strings( Array<String> strings)
00031 {
00032 for(Uint32 i = 0; i < strings.size(); ++i ) {
00033 std::cout << strings[i] << std::endl;
00034 }
00035 }
00036
00037 void usage(String name)
00038 {
00039 std::cout << name << " is a simple utility to learn smi-s block service "
00040 "functionality with openpegasus\n\n" << std::endl;
00041 std::cout << "Syntax: " << name << " host port namespace [ createvol <storage pool> <name> <size>\n"
00042 "| createinit <name> <id> [WWN|ISCSI]]\n"
00043 "| deleteinit <id>\n"
00044 "| deletevol <Volume name> \n"
00045 "| resize <name> <size> | list [volumes|pools|initiators]] \n"
00046 "| mapcreate <initiator> <volumes>\n"
00047 "| mapdelete <initiator> <volumes>\n"
00048 "| jobstatus <job>\n"
00049 "| snapshot <source volumes> <dest pool> <dest name> ]" << std::endl;
00050 std::cout << "Note: Expects no authentication, if required export DEMO_SMIS_USER and DEMO_SMIS_PASS" << std::endl;
00051 std::cout << "Built on " << __DATE__ << " @ " << __TIME__ << std::endl;
00052 std::cout << "\n\nExample:\n" << std::endl;
00053 std::cout << name << " 192.168.2.25 5988 root/ontap create aggr3 testvolume 50000000\n" << std::endl;
00054 exit(EXIT_FAILURE);
00055 }
00056
00060 struct args {
00061 String host;
00062 Uint16 port;
00063 String ns;
00064 String username;
00065 String password;
00066 String operation;
00067 Array<String> opArgs;
00068 };
00069
00070 void process_args( int argc, char *argv[] , struct args *cmdline_args)
00071 {
00072 if( argc < 5 ) {
00073 usage(argv[0]);
00074 }
00075
00076 cmdline_args->host = argv[1];
00077 cmdline_args->port = (Uint16)atol(argv[2]);
00078 cmdline_args->ns = argv[3];
00079 cmdline_args->operation = argv[4];
00080 cmdline_args->operation.toLower();
00081
00082 for(int i = 5; i < argc; ++i) {
00083 cmdline_args->opArgs.append(argv[i]);
00084 }
00085
00086 if( getenv("DEMO_SMIS_USER") ) {
00087 cmdline_args->username = getenv("DEMO_SMIS_USER");
00088
00089 if( getenv("DEMO_SMIS_PASS") ) {
00090 cmdline_args->password = getenv("DEMO_SMIS_PASS");
00091 } else {
00092 std::cout << "Missing DEMO_SMIS_PASS ?" << std::endl;
00093 usage(argv[0]);
00094 }
00095 }
00096 }
00097
00098 int main(int argc, char *argv[])
00099 {
00100 struct args arguments;
00101
00102 try {
00103 process_args(argc, argv, &arguments);
00104 BlockMgmt bm(arguments.host, arguments.port, arguments.ns, arguments.username, arguments.password);
00105
00106 if( arguments.operation == "createvol" ) {
00107 if( arguments.opArgs.size() != 3 ) {
00108 std::cout << "create expects <storage pool> <name> <size>" << std::endl;
00109 return EXIT_FAILURE;
00110 }
00111
00112 bm.createLun(arguments.opArgs[0], arguments.opArgs[1], atoll(arguments.opArgs[2].getCString()));
00113
00114 }
00115 else if ( arguments.operation == "createinit" ) {
00116 if( arguments.opArgs.size() != 3 ) {
00117 std::cout << "createinit expects <Name> <ID> [WWN|IQN]" << std::endl;
00118 return EXIT_FAILURE;
00119 }
00120
00121 if( arguments.opArgs[2] == "WWN" || arguments.opArgs[2] == "IQN" ) {
00122 bm.createInit(arguments.opArgs[0], arguments.opArgs[1], arguments.opArgs[2]);
00123 } else {
00124 std::cout << "[WWN|IQN] expected not " << arguments.opArgs[2] << std::endl;
00125 return EXIT_FAILURE;
00126 }
00127 }
00128 else if ( arguments.operation == "deleteinit" ) {
00129 if( arguments.opArgs.size() != 1 ) {
00130 std::cout << "deleteinit expects <ID>" << std::endl;
00131 return EXIT_FAILURE;
00132 }
00133
00134 bm.deleteInit(arguments.opArgs[0]);
00135 }
00136 else if ( arguments.operation == "snapshot" ) {
00137 if( arguments.opArgs.size() != 3 ) {
00138 std::cout << "snapshot expects <source volume> <dest. storage pool> <dest. name>" << std::endl;
00139 return EXIT_FAILURE;
00140 }
00141
00142 bm.createSnapShot(arguments.opArgs[0], arguments.opArgs[1], arguments.opArgs[2]);
00143 } else if( arguments.operation == "deletevol" ) {
00144 if( arguments.opArgs.size() != 1 ) {
00145 std::cout << "deletevol expects <name>" << std::endl;
00146 return EXIT_FAILURE;
00147 }
00148
00149 bm.deleteLun(arguments.opArgs[0]);
00150 } else if( arguments.operation == "resize" ) {
00151 if( arguments.opArgs.size() != 2 ) {
00152 std::cout << "resize expects <name> <size>" << std::endl;
00153 return EXIT_FAILURE;
00154 }
00155
00156 bm.resizeLun(arguments.opArgs[0], atoll(arguments.opArgs[1].getCString()));
00157
00158 } else if( arguments.operation == "list" ) {
00159 if( arguments.opArgs.size() != 1 ) {
00160 std::cout << "list expects one of the following [volumes|pools|initiators|initgroups]" << std::endl;
00161 return EXIT_FAILURE;
00162 }
00163
00164 arguments.opArgs[0].toLower();
00165
00166 if( arguments.opArgs[0] == "volumes" ) {
00167 dump_strings( bm.getLuns());
00168 } else if( arguments.opArgs[0] == "pools" ) {
00169 dump_strings( bm.getStoragePools());
00170 } else if( arguments.opArgs[0] == "initiators") {
00171 dump_strings( bm.getInitiators());
00172 } else {
00173 std::cout << "Unsupported list type= " << arguments.opArgs[0] << std::endl;
00174 }
00175
00176 } else if ( arguments.operation == "mapcreate" ) {
00177 if( arguments.opArgs.size() != 2 ) {
00178 std::cout << "mapcreate expects <initiator> <volume>" << std::endl;
00179 return EXIT_FAILURE;
00180 }
00181
00182 bm.mapLun(arguments.opArgs[0], arguments.opArgs[1]);
00183
00184 } else if ( arguments.operation == "mapdelete" ) {
00185 if( arguments.opArgs.size() != 2 ) {
00186 std::cout << "mapdelete expects <initiator> <volume>" << std::endl;
00187 return EXIT_FAILURE;
00188 }
00189
00190 bm.unmapLun(arguments.opArgs[0], arguments.opArgs[1]);
00191 } else if ( arguments.operation == "jobstatus" ) {
00192 if( arguments.opArgs.size() != 1 ) {
00193 std::cout << "jobstatus expects job id" << std::endl;
00194 return EXIT_FAILURE;
00195 }
00196
00197 bm.jobStatus(arguments.opArgs[0]);
00198 }else {
00199 std::cout << "Unsupported operation: " << arguments.operation << std::endl;
00200 }
00201
00202 } catch (Exception &e) {
00203 std::cerr << "Error: " << e.getMessage() << std::endl;
00204 exit(1);
00205 }
00206 return 0;
00207 }
00208