From fb59f9165bac1d8354034b2ae34d644f90c169fe Mon Sep 17 00:00:00 2001 From: Edison Su Date: Wed, 25 May 2011 16:16:00 -0400 Subject: [PATCH] fix ant --- cloud-cli/bindir/cloudvoladm | 1022 +++++++++++++++++----------------- deps/manageontap.jar | Bin 55444 -> 0 bytes 2 files changed, 511 insertions(+), 511 deletions(-) delete mode 100644 deps/manageontap.jar diff --git a/cloud-cli/bindir/cloudvoladm b/cloud-cli/bindir/cloudvoladm index cfb1075e517..f9e59d45c3d 100755 --- a/cloud-cli/bindir/cloudvoladm +++ b/cloud-cli/bindir/cloudvoladm @@ -20,28 +20,28 @@ header = "Volume Manager CLI, the available COMMANDS are:" def cmd_help(): - print header - print - print "createpool add a new pool to the system" - print "modifypool change the allocation algorithm for a pool" - print "destroypool destroy a pool" - print "listpools list all the pools" - print "createvol add volume to a storage server" - print "deletevol delete volume on a storage server" - print "listvol list volume on a storage server" - print "createlun create LUN on a storage server" - print "listlun list LUN on a storage server" - print "destroylun destroy LUN on a storage server" - print "assoclun assoc LUN on a storage server" - print "disassoclun disassoc LUN on a storage server" - print - print "\"cloudvoladm COMMAND --help\" for more information on a specific command" - print - print "Global Options:" - print "--cloudStackMgtSvrIP the IP address of CloudStack Management Server" - print - print "Config file is ~/.cloudvoladmrc, Config options including: " - print "cloudStackMgtSvrIP=Cloudstack Management Server Address, which can be overriden by --cloudStackMgtSvrIP. If neither is provided, localhost is used." + print header + print + print "createpool add a new pool to the system" + print "modifypool change the allocation algorithm for a pool" + print "destroypool destroy a pool" + print "listpools list all the pools" + print "createvol add volume to a storage server" + print "deletevol delete volume on a storage server" + print "listvol list volume on a storage server" + print "createlun create LUN on a storage server" + print "listlun list LUN on a storage server" + print "destroylun destroy LUN on a storage server" + print "assoclun assoc LUN on a storage server" + print "disassoclun disassoc LUN on a storage server" + print + print "\"cloudvoladm COMMAND --help\" for more information on a specific command" + print + print "Global Options:" + print "--cloudStackMgtSvrIP the IP address of CloudStack Management Server" + print + print "Config file is ~/.cloudvoladmrc, Config options including: " + print "cloudStackMgtSvrIP=Cloudstack Management Server Address, which can be overriden by --cloudStackMgtSvrIP. If neither is provided, localhost is used." usage="Volume Manager CLI: add a new volume to a storage pool" addvolParser= OptionParser(usage) @@ -109,561 +109,561 @@ disassocLunParser.add_option("-g", dest="guest_iqn", help="the guest IQN. By def disassocLunParser.add_option("-l", dest="lun_name", help="The LUN name") cmdParsers = {cmds[0]:addvolParser, cmds[1]:delvolParser, cmds[2]:listvolParser, cmds[3]:createlunParser, cmds[4]:listlunParser, - cmds[5]:destroylunParser, cmds[6]:assocLunParser, cmds[7]:disassocLunParser, cmds[8]:createPoolParser, cmds[9]:modifyPoolParser, cmds[10]:destroyPoolParser, cmds[11]:listPoolParser} + cmds[5]:destroylunParser, cmds[6]:assocLunParser, cmds[7]:disassocLunParser, cmds[8]:createPoolParser, cmds[9]:modifyPoolParser, cmds[10]:destroyPoolParser, cmds[11]:listPoolParser} def validate_parameter(input, signature): - (options, args) = signature.parse_args([]) - inputDict = input.__dict__ - sigDict = options.__dict__ - for k,v in sigDict.iteritems(): - inputValue = inputDict[k] - if inputValue == None: - print "Volume Manager CLI: missing operand " - print - signature.parse_args(["--help"]) + (options, args) = signature.parse_args([]) + inputDict = input.__dict__ + sigDict = options.__dict__ + for k,v in sigDict.iteritems(): + inputValue = inputDict[k] + if inputValue == None: + print "Volume Manager CLI: missing operand " + print + signature.parse_args(["--help"]) def help_callback(option, opt, value, parser): - argv = sys.argv[1:] - try: - argv.remove(opt) - except: - argv.remove("--h") + argv = sys.argv[1:] + try: + argv.remove(opt) + except: + argv.remove("--h") - if len(argv) == 0: - cmd_help() - return - (options, args) = parser.parse_args(argv) - for cmd in cmds: - if cmd == args[0]: - cmdParsers[cmd].parse_args(["--help"]) + if len(argv) == 0: + cmd_help() + return + (options, args) = parser.parse_args(argv) + for cmd in cmds: + if cmd == args[0]: + cmdParsers[cmd].parse_args(["--help"]) def Help(): - usage = "usage: %prog cmd[createpool|listpools|modifypool|destroypool|createvol|deletevol|listvol|createlun|listlun|destroylun|assoclun|disassoclun] arg1 arg2 [--help, -h]" - parser = OptionParser(usage=usage, add_help_option=False) - parser.add_option("-h", "--help", action="callback", callback=help_callback); - parser.add_option("-i", metavar="server ip", dest="server_ip", help="The IP address of the storage server") - parser.add_option("--cloudstackSvr", dest="cloudstackSvr", help="cloudStack Server IP") - parser.add_option("-u", metavar="username", dest="username", help="username to access the storage server with") - parser.add_option("-w", metavar="password", dest="password", help="the password to access the storage server with") - parser.add_option("-p", dest="pool_name", help="the name of the pool to allocate from") - parser.add_option("-v", dest="vol_name", help="the name of volume") - parser.add_option("-A", dest="algorithm", help="roundrobin or leastfull") - parser.add_option("-a", dest="aggregate_name", help="The name of aggregate") - parser.add_option("-o", dest="options", help="requested option string for the NFS export or attach") - parser.add_option("-S", dest="snapshots", help="Snapshot schedule e.g.2 4 5@1,4 6@2,5") - parser.add_option("-r", dest="percentage", help="Percentage used for snapshot reservation") - parser.add_option("-s", dest="size", help="size in GB eg.1") - parser.add_option("-t", dest="target_iqn", help="the target IQN") - parser.add_option("-g", dest="guest_iqn", help="the guest IQN") - parser.add_option("-l", dest="lun_name", help="the LUN name") - - return parser + usage = "usage: %prog cmd[createpool|listpools|modifypool|destroypool|createvol|deletevol|listvol|createlun|listlun|destroylun|assoclun|disassoclun] arg1 arg2 [--help, -h]" + parser = OptionParser(usage=usage, add_help_option=False) + parser.add_option("-h", "--help", action="callback", callback=help_callback); + parser.add_option("-i", metavar="server ip", dest="server_ip", help="The IP address of the storage server") + parser.add_option("--cloudstackSvr", dest="cloudstackSvr", help="cloudStack Server IP") + parser.add_option("-u", metavar="username", dest="username", help="username to access the storage server with") + parser.add_option("-w", metavar="password", dest="password", help="the password to access the storage server with") + parser.add_option("-p", dest="pool_name", help="the name of the pool to allocate from") + parser.add_option("-v", dest="vol_name", help="the name of volume") + parser.add_option("-A", dest="algorithm", help="roundrobin or leastfull") + parser.add_option("-a", dest="aggregate_name", help="The name of aggregate") + parser.add_option("-o", dest="options", help="requested option string for the NFS export or attach") + parser.add_option("-S", dest="snapshots", help="Snapshot schedule e.g.2 4 5@1,4 6@2,5") + parser.add_option("-r", dest="percentage", help="Percentage used for snapshot reservation") + parser.add_option("-s", dest="size", help="size in GB eg.1") + parser.add_option("-t", dest="target_iqn", help="the target IQN") + parser.add_option("-g", dest="guest_iqn", help="the guest IQN") + parser.add_option("-l", dest="lun_name", help="the LUN name") + + return parser def httpErrorHandler(code, msg): - if code == 430: - info = msg.split(":")[1] - info = info.split("<")[0] - print "Reason:" + info - elif code == 436: - print msg - elif code == 530: - print "Internal Error" - + if code == 430: + info = msg.split(":")[1] + info = info.split("<")[0] + print "Reason:" + info + elif code == 436: + print msg + elif code == 530: + print "Internal Error" + def getText(nodelist): - rc = [] - for node in nodelist: - if node.nodeType == node.TEXT_NODE: rc.append(node.data) - return ''.join(rc) + rc = [] + for node in nodelist: + if node.nodeType == node.TEXT_NODE: rc.append(node.data) + return ''.join(rc) def createvol(options): - args = [] - if options.pool_name == None: - print "Volume Manager CLI: missing operand " - print - addvolParser.parse_args(["--help"]) - if options.aggregate_name == None: - print "Volume Manager CLI: missing operand " - print - addvolParser.parse_args(["--help"]) - if options.vol_name == None: - print "Volume Manager CLI: missing operand " - print - addvolParser.parse_args(["--help"]) - - if options.snapshots != None: - args += ['--snapshotpolicy=' + options.snapshots] - - if options.size == None: - print "Volume Manager CLI: missing operand " - print - addvolParser.parse_args(["--help"]) - - if options.percentage != None: - args += ['--snapshotreservation=' + options.percentage] + args = [] + if options.pool_name == None: + print "Volume Manager CLI: missing operand " + print + addvolParser.parse_args(["--help"]) + if options.aggregate_name == None: + print "Volume Manager CLI: missing operand " + print + addvolParser.parse_args(["--help"]) + if options.vol_name == None: + print "Volume Manager CLI: missing operand " + print + addvolParser.parse_args(["--help"]) + + if options.snapshots != None: + args += ['--snapshotpolicy=' + options.snapshots] + + if options.size == None: + print "Volume Manager CLI: missing operand " + print + addvolParser.parse_args(["--help"]) + + if options.percentage != None: + args += ['--snapshotreservation=' + options.percentage] - if NetAppServerIP == None: - print "Volume Manager CLI: missing operand " - print - addvolParser.parse_args(["--help"]) + if NetAppServerIP == None: + print "Volume Manager CLI: missing operand " + print + addvolParser.parse_args(["--help"]) - if NetAppUserName == None: - print "Volume Manager CLI: missing operand " - print - addvolParser.parse_args(["--help"]) - - if NetAppPassword == None: - print "Volume Manager CLI: missing operand " - print - addvolParser.parse_args(["--help"]) + if NetAppUserName == None: + print "Volume Manager CLI: missing operand " + print + addvolParser.parse_args(["--help"]) + + if NetAppPassword == None: + print "Volume Manager CLI: missing operand " + print + addvolParser.parse_args(["--help"]) - ''' - snapshot = options.snapshots - tokens = snapshot.split(" ") - print tokens - pos = 0; - for token in tokens: - if pos == 0: - #week - try: - week = int(token) - if week < 0: - raise - except: - print "Pls input correct week" - sys.exit(1) - elif pos == 1: - try: - day = int(token) - if day < 0: - raise - except: - print "Pls input correct day" - sys.exit(1) - - elif pos == 2: - try: - hours = token.split("@") - if int(hours[0]) < 0: - raise - hourlists = hours[1].split(",") - for hour in hourlists: - if int(hour) < 0 or int(hour) > 24: - raise - except: - print "Pls input correct hour" - sys.exit(1) - elif pos == 3: - try: - minutes = token.split("@") - if int(minutes[0]) < 0: - raise - - minuteslist = minutes[1].split(",") - for minute in minuteslist: - if int(minute) < 0 or int(minute) > 60: - raise - except: - print "Pls input correct hour" - sys.exit(1) - - ''' - + ''' + snapshot = options.snapshots + tokens = snapshot.split(" ") + print tokens + pos = 0; + for token in tokens: + if pos == 0: + #week + try: + week = int(token) + if week < 0: + raise + except: + print "Pls input correct week" + sys.exit(1) + elif pos == 1: + try: + day = int(token) + if day < 0: + raise + except: + print "Pls input correct day" + sys.exit(1) + + elif pos == 2: + try: + hours = token.split("@") + if int(hours[0]) < 0: + raise + hourlists = hours[1].split(",") + for hour in hourlists: + if int(hour) < 0 or int(hour) > 24: + raise + except: + print "Pls input correct hour" + sys.exit(1) + elif pos == 3: + try: + minutes = token.split("@") + if int(minutes[0]) < 0: + raise + + minuteslist = minutes[1].split(",") + for minute in minuteslist: + if int(minute) < 0 or int(minute) > 60: + raise + except: + print "Pls input correct hour" + sys.exit(1) + + ''' + - try: - output = cloudtool.main(['cloud-tool', 'createVolumeOnFiler', '--ipaddress=' + NetAppServerIP , '--aggregatename=' + options.aggregate_name, - '--poolname=' + options.pool_name, '--volumename=' + options.vol_name, - '--size=' + options.size, - '--username=' + NetAppUserName, '--password=' + NetAppPassword, "--server=" + CloudStackSvrIP + ":" + str(CloudStackSvrPort)] + args) - except urllib2.HTTPError, err: - code = err.code - msg = err.read() - print "executing createvol cmd failed, http returning error code: %s" % (code) - httpErrorHandler(code, msg) - sys.exit(1) - except urllib2.URLError, err: - print "executing createvol cmd failed: %s" % (err.reason) - sys.exit(1) + try: + output = cloudtool.main(['cloud-tool', 'createVolumeOnFiler', '--ipaddress=' + NetAppServerIP , '--aggregatename=' + options.aggregate_name, + '--poolname=' + options.pool_name, '--volumename=' + options.vol_name, + '--size=' + options.size, + '--username=' + NetAppUserName, '--password=' + NetAppPassword, "--server=" + CloudStackSvrIP + ":" + str(CloudStackSvrPort)] + args) + except urllib2.HTTPError, err: + code = err.code + msg = err.read() + print "executing createvol cmd failed, http returning error code: %s" % (code) + httpErrorHandler(code, msg) + sys.exit(1) + except urllib2.URLError, err: + print "executing createvol cmd failed: %s" % (err.reason) + sys.exit(1) - xmlResult = xml.dom.minidom.parseString(output) - result = getText(xmlResult.getElementsByTagName("success")[0].childNodes).strip() - if result == "true": - print "Successfully added volume" - else: - exception = getText(xmlResult.getElementsByTagName("exception")[0].childNodes).strip() - print "Unable to add volume: %s" %(exception) - + xmlResult = xml.dom.minidom.parseString(output) + result = getText(xmlResult.getElementsByTagName("success")[0].childNodes).strip() + if result == "true": + print "Successfully added volume" + else: + exception = getText(xmlResult.getElementsByTagName("exception")[0].childNodes).strip() + print "Unable to add volume: %s" %(exception) + def deletevol(options): - validate_parameter(options, delvolParser) + validate_parameter(options, delvolParser) - try: - output = cloudtool.main(['cloud-tool', 'destroyVolumeOnFiler', '--ipaddress=' + NetAppServerIP, '--aggregatename=' + options.aggregate_name, - '--volumename=' + options.vol_name, "--server=" + CloudStackSvrIP + ":" + str(CloudStackSvrPort)]) - except urllib2.HTTPError, err: - code = err.code - msg = err.read() - print "executing deletevol cmd failed, http returning error code: %s" % (code) - httpErrorHandler(code, msg) - sys.exit(1) - except urllib2.URLError, err: - print "executing deletevol cmd failed: %s" % (err.reason) - sys.exit(1) + try: + output = cloudtool.main(['cloud-tool', 'destroyVolumeOnFiler', '--ipaddress=' + NetAppServerIP, '--aggregatename=' + options.aggregate_name, + '--volumename=' + options.vol_name, "--server=" + CloudStackSvrIP + ":" + str(CloudStackSvrPort)]) + except urllib2.HTTPError, err: + code = err.code + msg = err.read() + print "executing deletevol cmd failed, http returning error code: %s" % (code) + httpErrorHandler(code, msg) + sys.exit(1) + except urllib2.URLError, err: + print "executing deletevol cmd failed: %s" % (err.reason) + sys.exit(1) - xmlResult = xml.dom.minidom.parseString(output) - result = getText(xmlResult.getElementsByTagName("success")[0].childNodes).strip() - if result == "true": - print "Successfully deleted volume" - else: - exception = getText(xmlResult.getElementsByTagName("exception")[0].childNodes).strip() - print "Unable to delete volume: %s"% (exception) - + xmlResult = xml.dom.minidom.parseString(output) + result = getText(xmlResult.getElementsByTagName("success")[0].childNodes).strip() + if result == "true": + print "Successfully deleted volume" + else: + exception = getText(xmlResult.getElementsByTagName("exception")[0].childNodes).strip() + print "Unable to delete volume: %s"% (exception) + def listvol(options): - validate_parameter(options, listvolParser) - - try: - output = cloudtool.main(['cloud-tool', 'listVolumesOnFiler', '--poolname=' + options.pool_name, "--server=" + CloudStackSvrIP + ":" + str(CloudStackSvrPort)]) - except urllib2.HTTPError, err: - code = err.code - msg = err.read() - print "executing listvol cmd failed, http returning error code: %s" % (code) - httpErrorHandler(code, msg) - sys.exit(1) - except urllib2.URLError, err: - print "executing listvol cmd failed: %s" % (err.reason) - sys.exit(1) + validate_parameter(options, listvolParser) + + try: + output = cloudtool.main(['cloud-tool', 'listVolumesOnFiler', '--poolname=' + options.pool_name, "--server=" + CloudStackSvrIP + ":" + str(CloudStackSvrPort)]) + except urllib2.HTTPError, err: + code = err.code + msg = err.read() + print "executing listvol cmd failed, http returning error code: %s" % (code) + httpErrorHandler(code, msg) + sys.exit(1) + except urllib2.URLError, err: + print "executing listvol cmd failed: %s" % (err.reason) + sys.exit(1) - xmlResult = xml.dom.minidom.parseString(output) - result = getText(xmlResult.getElementsByTagName("success")[0].childNodes).strip() - if result == "true": - print "%-10s %-20s %-20s %-40s %-20s %-30s "%('Id', 'Address', 'Aggregate', 'Volume', 'Size(GB)', 'snapshotPolicy', ) - for volume in xmlResult.getElementsByTagName("volume"): - aggregatename = getText(volume.getElementsByTagName('aggregatename')[0].childNodes).strip() - id = getText(volume.getElementsByTagName('id')[0].childNodes).strip() - volumeName = getText(volume.getElementsByTagName('volumename')[0].childNodes).strip() - snapshotPolicy = getText(volume.getElementsByTagName('snapshotpolicy')[0].childNodes).strip() - ipaddress = getText(volume.getElementsByTagName('ipaddress')[0].childNodes).strip() - volSize = getText(volume.getElementsByTagName('volsizestr')[0].childNodes).strip() - print "%-10s %-20s %-20s %-40s %-20s %-30s "%(id, ipaddress, aggregatename, volumeName, volSize, snapshotPolicy) - else: - exception = getText(xmlResult.getElementsByTagName("exception")[0].childNodes).strip() - print "Unable to list volume: %s"% (exception) + xmlResult = xml.dom.minidom.parseString(output) + result = getText(xmlResult.getElementsByTagName("success")[0].childNodes).strip() + if result == "true": + print "%-10s %-20s %-20s %-40s %-20s %-30s "%('Id', 'Address', 'Aggregate', 'Volume', 'Size(GB)', 'snapshotPolicy', ) + for volume in xmlResult.getElementsByTagName("volume"): + aggregatename = getText(volume.getElementsByTagName('aggregatename')[0].childNodes).strip() + id = getText(volume.getElementsByTagName('id')[0].childNodes).strip() + volumeName = getText(volume.getElementsByTagName('volumename')[0].childNodes).strip() + snapshotPolicy = getText(volume.getElementsByTagName('snapshotpolicy')[0].childNodes).strip() + ipaddress = getText(volume.getElementsByTagName('ipaddress')[0].childNodes).strip() + volSize = getText(volume.getElementsByTagName('volsizestr')[0].childNodes).strip() + print "%-10s %-20s %-20s %-40s %-20s %-30s "%(id, ipaddress, aggregatename, volumeName, volSize, snapshotPolicy) + else: + exception = getText(xmlResult.getElementsByTagName("exception")[0].childNodes).strip() + print "Unable to list volume: %s"% (exception) def createlun(options): - validate_parameter(options, createlunParser) + validate_parameter(options, createlunParser) - try: - output = cloudtool.main(['cloud-tool', 'createLunOnFiler', '--poolname=' + options.pool_name, - '--size=' + options.size, "--server=" + CloudStackSvrIP + ":" + str(CloudStackSvrPort)]) - except urllib2.HTTPError, err: - code = err.code - msg = err.read() - print "executing createlun cmd failed, http returning error code: %s" % (code) - httpErrorHandler(code, msg) - sys.exit(1) - except urllib2.URLError, err: - print "executing createlun cmd failed: %s" % (err.reason) - sys.exit(1) + try: + output = cloudtool.main(['cloud-tool', 'createLunOnFiler', '--poolname=' + options.pool_name, + '--size=' + options.size, "--server=" + CloudStackSvrIP + ":" + str(CloudStackSvrPort)]) + except urllib2.HTTPError, err: + code = err.code + msg = err.read() + print "executing createlun cmd failed, http returning error code: %s" % (code) + httpErrorHandler(code, msg) + sys.exit(1) + except urllib2.URLError, err: + print "executing createlun cmd failed: %s" % (err.reason) + sys.exit(1) - xmlResult = xml.dom.minidom.parseString(output) - result = getText(xmlResult.getElementsByTagName("success")[0].childNodes).strip() - if result == "true": - path = getText(xmlResult.getElementsByTagName("path")[0].childNodes).strip() - iqn = getText(xmlResult.getElementsByTagName("iqn")[0].childNodes).strip() - ipAddr = getText(xmlResult.getElementsByTagName('ipaddress')[0].childNodes).strip() - print "%-30s %-30s %-50s "%('LUN Name', 'Address', 'Target IQN') - print "%-30s %-30s %-50s "%(path, ipAddr, iqn) - else: - exception = getText(xmlResult.getElementsByTagName("exception")[0].childNodes).strip() - print "Unable to create lun: %s"% (exception) + xmlResult = xml.dom.minidom.parseString(output) + result = getText(xmlResult.getElementsByTagName("success")[0].childNodes).strip() + if result == "true": + path = getText(xmlResult.getElementsByTagName("path")[0].childNodes).strip() + iqn = getText(xmlResult.getElementsByTagName("iqn")[0].childNodes).strip() + ipAddr = getText(xmlResult.getElementsByTagName('ipaddress')[0].childNodes).strip() + print "%-30s %-30s %-50s "%('LUN Name', 'Address', 'Target IQN') + print "%-30s %-30s %-50s "%(path, ipAddr, iqn) + else: + exception = getText(xmlResult.getElementsByTagName("exception")[0].childNodes).strip() + print "Unable to create lun: %s"% (exception) def listlun(options): - validate_parameter(options, listlunParser) + validate_parameter(options, listlunParser) - args = ["--poolname=" + options.pool_name, "--server=" + CloudStackSvrIP + ":" + str(CloudStackSvrPort)] - try: - output = cloudtool.main(['cloud-tool', 'listLunsOnFiler'] + args) - except urllib2.HTTPError, err: - code = err.code - msg = err.read() - print "executing listlun cmd failed, http returning error code: %s" % (code) - httpErrorHandler(code, msg) - sys.exit(1) - except urllib2.URLError, err: - print "executing listlun cmd failed: %s" % (err.reason) - sys.exit(1) + args = ["--poolname=" + options.pool_name, "--server=" + CloudStackSvrIP + ":" + str(CloudStackSvrPort)] + try: + output = cloudtool.main(['cloud-tool', 'listLunsOnFiler'] + args) + except urllib2.HTTPError, err: + code = err.code + msg = err.read() + print "executing listlun cmd failed, http returning error code: %s" % (code) + httpErrorHandler(code, msg) + sys.exit(1) + except urllib2.URLError, err: + print "executing listlun cmd failed: %s" % (err.reason) + sys.exit(1) - xmlResult = xml.dom.minidom.parseString(output) - result = getText(xmlResult.getElementsByTagName("success")[0].childNodes).strip() - if result == "true": - print "%-10s %-10s %-50s %-30s "%('LUN Id', 'Volume Id', 'Target IQN', 'LUN Name') - for volume in xmlResult.getElementsByTagName("lun"): - uuid = getText(volume.getElementsByTagName('id')[0].childNodes).strip() - path = getText(volume.getElementsByTagName('name')[0].childNodes).strip() - targetiqn = getText(volume.getElementsByTagName('targetiqn')[0].childNodes).strip() - volumeId = getText(volume.getElementsByTagName('volumeid')[0].childNodes).strip() - print "%-10s %-10s %-50s %-30s "%(uuid, volumeId, targetiqn, path) - else: - exception = getText(xmlResult.getElementsByTagName("exception")[0].childNodes).strip() - print "Unable to list lun: %s"% (exception) - + xmlResult = xml.dom.minidom.parseString(output) + result = getText(xmlResult.getElementsByTagName("success")[0].childNodes).strip() + if result == "true": + print "%-10s %-10s %-50s %-30s "%('LUN Id', 'Volume Id', 'Target IQN', 'LUN Name') + for volume in xmlResult.getElementsByTagName("lun"): + uuid = getText(volume.getElementsByTagName('id')[0].childNodes).strip() + path = getText(volume.getElementsByTagName('name')[0].childNodes).strip() + targetiqn = getText(volume.getElementsByTagName('targetiqn')[0].childNodes).strip() + volumeId = getText(volume.getElementsByTagName('volumeid')[0].childNodes).strip() + print "%-10s %-10s %-50s %-30s "%(uuid, volumeId, targetiqn, path) + else: + exception = getText(xmlResult.getElementsByTagName("exception")[0].childNodes).strip() + print "Unable to list lun: %s"% (exception) + def destroylun(options): - validate_parameter(options, destroylunParser) + validate_parameter(options, destroylunParser) - try: - output = cloudtool.main(['cloud-tool', 'destroyLunOnFiler', '--path=' + options.lun_name, - "--server=" + CloudStackSvrIP + ":" + str(CloudStackSvrPort)]) - except urllib2.HTTPError, err: - code = err.code - msg = err.read() - print "executing destroylun cmd failed, http returning error code: %s" % (code) - httpErrorHandler(code, msg) - sys.exit(1) - except urllib2.URLError, err: - print "executing destroylun failed: %s" % (err.reason) - sys.exit(1) + try: + output = cloudtool.main(['cloud-tool', 'destroyLunOnFiler', '--path=' + options.lun_name, + "--server=" + CloudStackSvrIP + ":" + str(CloudStackSvrPort)]) + except urllib2.HTTPError, err: + code = err.code + msg = err.read() + print "executing destroylun cmd failed, http returning error code: %s" % (code) + httpErrorHandler(code, msg) + sys.exit(1) + except urllib2.URLError, err: + print "executing destroylun failed: %s" % (err.reason) + sys.exit(1) - xmlResult = xml.dom.minidom.parseString(output) - result = getText(xmlResult.getElementsByTagName("success")[0].childNodes).strip() - if result == "true": - print "Successfully destroyed LUN" - else: - exception = getText(xmlResult.getElementsByTagName("exception")[0].childNodes).strip() - print "Unable to destroy lun: %s" % (exception) + xmlResult = xml.dom.minidom.parseString(output) + result = getText(xmlResult.getElementsByTagName("success")[0].childNodes).strip() + if result == "true": + print "Successfully destroyed LUN" + else: + exception = getText(xmlResult.getElementsByTagName("exception")[0].childNodes).strip() + print "Unable to destroy lun: %s" % (exception) def assoclun(options): - validate_parameter(options, assocLunParser) + validate_parameter(options, assocLunParser) - try: - output = cloudtool.main(['cloud-tool', 'associateLun', '--name=' + options.lun_name, - '--iqn=' + options.guest_iqn, "--server=" + CloudStackSvrIP + ":" + str(CloudStackSvrPort)]) - except urllib2.HTTPError, err: - code = err.code - msg = err.read() - print "executing assoclun cmd failed, http returning error code: %s" % (code) - httpErrorHandler(code, msg) - sys.exit(1) - except urllib2.URLError, err: - print "executing assoclun failed: %s" % (err.reason) - sys.exit(1) - - xmlResult = xml.dom.minidom.parseString(output) - result = getText(xmlResult.getElementsByTagName("success")[0].childNodes).strip() - if result == "true": - lunid = getText(xmlResult.getElementsByTagName("lunid")[0].childNodes).strip() - iqn = getText(xmlResult.getElementsByTagName("targetiqn")[0].childNodes).strip() - ipAddr = getText(xmlResult.getElementsByTagName('ipaddress')[0].childNodes).strip() - print "%-30s %-30s %-50s "%('LUN Id', 'Address', 'Target IQN') - print "%-30s %-30s %-50s" % (lunid, ipAddr, iqn) - else: - exception = getText(xmlResult.getElementsByTagName("exception")[0].childNodes).strip() - print "Unable to assoclun: %s" % (exception) + try: + output = cloudtool.main(['cloud-tool', 'associateLun', '--name=' + options.lun_name, + '--iqn=' + options.guest_iqn, "--server=" + CloudStackSvrIP + ":" + str(CloudStackSvrPort)]) + except urllib2.HTTPError, err: + code = err.code + msg = err.read() + print "executing assoclun cmd failed, http returning error code: %s" % (code) + httpErrorHandler(code, msg) + sys.exit(1) + except urllib2.URLError, err: + print "executing assoclun failed: %s" % (err.reason) + sys.exit(1) + + xmlResult = xml.dom.minidom.parseString(output) + result = getText(xmlResult.getElementsByTagName("success")[0].childNodes).strip() + if result == "true": + lunid = getText(xmlResult.getElementsByTagName("lunid")[0].childNodes).strip() + iqn = getText(xmlResult.getElementsByTagName("targetiqn")[0].childNodes).strip() + ipAddr = getText(xmlResult.getElementsByTagName('ipaddress')[0].childNodes).strip() + print "%-30s %-30s %-50s "%('LUN Id', 'Address', 'Target IQN') + print "%-30s %-30s %-50s" % (lunid, ipAddr, iqn) + else: + exception = getText(xmlResult.getElementsByTagName("exception")[0].childNodes).strip() + print "Unable to assoclun: %s" % (exception) def disassoclun(options): - validate_parameter(options, disassocLunParser) + validate_parameter(options, disassocLunParser) - try: - output = cloudtool.main(['cloud-tool', 'dissociateLun', '--path=' + options.lun_name, - '--iqn=' + options.guest_iqn, "--server=" + CloudStackSvrIP + ":" + str(CloudStackSvrPort)]) - except urllib2.HTTPError, err: - code = err.code - msg = err.read() - print "executing disassoclun cmd failed, http returning error code: %s" % (code) - httpErrorHandler(code, msg) - sys.exit(1) - except urllib2.URLError, err: - print "executing disassoclun failed: %s" % (err.reason) - sys.exit(1) + try: + output = cloudtool.main(['cloud-tool', 'dissociateLun', '--path=' + options.lun_name, + '--iqn=' + options.guest_iqn, "--server=" + CloudStackSvrIP + ":" + str(CloudStackSvrPort)]) + except urllib2.HTTPError, err: + code = err.code + msg = err.read() + print "executing disassoclun cmd failed, http returning error code: %s" % (code) + httpErrorHandler(code, msg) + sys.exit(1) + except urllib2.URLError, err: + print "executing disassoclun failed: %s" % (err.reason) + sys.exit(1) - xmlResult = xml.dom.minidom.parseString(output) - result = getText(xmlResult.getElementsByTagName("success")[0].childNodes).strip() - if result == "true": - print "Successfully dissociated LUN" - else: - exception = getText(xmlResult.getElementsByTagName("exception")[0].childNodes).strip() - print "Unable to dissociate lun: %s" % (exception) + xmlResult = xml.dom.minidom.parseString(output) + result = getText(xmlResult.getElementsByTagName("success")[0].childNodes).strip() + if result == "true": + print "Successfully dissociated LUN" + else: + exception = getText(xmlResult.getElementsByTagName("exception")[0].childNodes).strip() + print "Unable to dissociate lun: %s" % (exception) def createpool(options): - validate_parameter(options, createPoolParser) + validate_parameter(options, createPoolParser) - if not (options.algorithm == "roundrobin" or options.algorithm == "leastfull"): - print "Only roundrobin or leastfull algorithm is supported" - sys.exit(1) - try: - output = cloudtool.main(['cloud-tool', 'createPool', '--poolname=' + options.pool_name, - '--algorithm=' + options.algorithm, "--server=" + CloudStackSvrIP + ":" + str(CloudStackSvrPort)]) - except urllib2.HTTPError, err: - code = err.code - msg = err.read() - print "executing createpool cmd failed, http returning error code: %s" % (code) - httpErrorHandler(code, msg) - sys.exit(1) - except urllib2.URLError, err: - print "executing createpool failed: %s" % (err.reason) - sys.exit(1) + if not (options.algorithm == "roundrobin" or options.algorithm == "leastfull"): + print "Only roundrobin or leastfull algorithm is supported" + sys.exit(1) + try: + output = cloudtool.main(['cloud-tool', 'createPool', '--poolname=' + options.pool_name, + '--algorithm=' + options.algorithm, "--server=" + CloudStackSvrIP + ":" + str(CloudStackSvrPort)]) + except urllib2.HTTPError, err: + code = err.code + msg = err.read() + print "executing createpool cmd failed, http returning error code: %s" % (code) + httpErrorHandler(code, msg) + sys.exit(1) + except urllib2.URLError, err: + print "executing createpool failed: %s" % (err.reason) + sys.exit(1) - xmlResult = xml.dom.minidom.parseString(output) - result = getText(xmlResult.getElementsByTagName("success")[0].childNodes).strip() - if result == "true": - print "Successfully created pool" - else: - exception = getText(xmlResult.getElementsByTagName("exception")[0].childNodes).strip() - print "Unable to create pool: %s" % (exception) + xmlResult = xml.dom.minidom.parseString(output) + result = getText(xmlResult.getElementsByTagName("success")[0].childNodes).strip() + if result == "true": + print "Successfully created pool" + else: + exception = getText(xmlResult.getElementsByTagName("exception")[0].childNodes).strip() + print "Unable to create pool: %s" % (exception) def listpools(options): - try: - output = cloudtool.main(['cloud-tool', 'listPools', - "--server=" + CloudStackSvrIP + ":" + str(CloudStackSvrPort)]) - except urllib2.HTTPError, err: - code = err.code - msg = err.read() - print "executing listpools cmd failed, http returning error code: %s" % (code) - httpErrorHandler(code, msg) - sys.exit(1) - except urllib2.URLError, err: - print "executing listpools failed, due to: %s" % (err.reason) - sys.exit(1) + try: + output = cloudtool.main(['cloud-tool', 'listPools', + "--server=" + CloudStackSvrIP + ":" + str(CloudStackSvrPort)]) + except urllib2.HTTPError, err: + code = err.code + msg = err.read() + print "executing listpools cmd failed, http returning error code: %s" % (code) + httpErrorHandler(code, msg) + sys.exit(1) + except urllib2.URLError, err: + print "executing listpools failed, due to: %s" % (err.reason) + sys.exit(1) - xmlResult = xml.dom.minidom.parseString(output) - result = getText(xmlResult.getElementsByTagName("success")[0].childNodes).strip() - if result == "true": - print "%-10s %-40s %-10s" %('Id', 'Pool Name', 'Algorithm') - for volume in xmlResult.getElementsByTagName("pool"): - id = getText(volume.getElementsByTagName('id')[0].childNodes).strip() - poolname = getText(volume.getElementsByTagName('poolname')[0].childNodes).strip() - alg = getText(volume.getElementsByTagName('algorithm')[0].childNodes).strip() - print "%-10s %-40s %-10s"%(id, poolname, alg) + xmlResult = xml.dom.minidom.parseString(output) + result = getText(xmlResult.getElementsByTagName("success")[0].childNodes).strip() + if result == "true": + print "%-10s %-40s %-10s" %('Id', 'Pool Name', 'Algorithm') + for volume in xmlResult.getElementsByTagName("pool"): + id = getText(volume.getElementsByTagName('id')[0].childNodes).strip() + poolname = getText(volume.getElementsByTagName('poolname')[0].childNodes).strip() + alg = getText(volume.getElementsByTagName('algorithm')[0].childNodes).strip() + print "%-10s %-40s %-10s"%(id, poolname, alg) - else: - exception = getText(xmlResult.getElementsByTagName("exception")[0].childNodes).strip() - print "Unable to list pool: %s"% (exception) - + else: + exception = getText(xmlResult.getElementsByTagName("exception")[0].childNodes).strip() + print "Unable to list pool: %s"% (exception) + def modifypool(options): - validate_parameter(options, modifyPoolParser) - - try: - output = cloudtool.main(['cloud-tool', 'modifyPool', '--poolname=' + options.pool_name, - '--algorithm=' + options.algorithm, "--server=" + CloudStackSvrIP + ":" + str(CloudStackSvrPort)]) - except urllib2.HTTPError, err: - code = err.code - msg = err.read() - print "executing modifypool cmd failed, http returning error code: %s" % (code) - httpErrorHandler(code, msg) - sys.exit(1) - except urllib2.URLError, err: - print "executing modifypool failed, due to: %s" % (err.reason) - sys.exit(1) + validate_parameter(options, modifyPoolParser) + + try: + output = cloudtool.main(['cloud-tool', 'modifyPool', '--poolname=' + options.pool_name, + '--algorithm=' + options.algorithm, "--server=" + CloudStackSvrIP + ":" + str(CloudStackSvrPort)]) + except urllib2.HTTPError, err: + code = err.code + msg = err.read() + print "executing modifypool cmd failed, http returning error code: %s" % (code) + httpErrorHandler(code, msg) + sys.exit(1) + except urllib2.URLError, err: + print "executing modifypool failed, due to: %s" % (err.reason) + sys.exit(1) - xmlResult = xml.dom.minidom.parseString(output) - result = getText(xmlResult.getElementsByTagName("success")[0].childNodes).strip() - if result == "true": - print "Successfully modified pool" - else: - exception = getText(xmlResult.getElementsByTagName("exception")[0].childNodes).strip() - print "Unable to modify pool: %s" % (exception) + xmlResult = xml.dom.minidom.parseString(output) + result = getText(xmlResult.getElementsByTagName("success")[0].childNodes).strip() + if result == "true": + print "Successfully modified pool" + else: + exception = getText(xmlResult.getElementsByTagName("exception")[0].childNodes).strip() + print "Unable to modify pool: %s" % (exception) def destroypool(options): - validate_parameter(options, destroyPoolParser) + validate_parameter(options, destroyPoolParser) - try: - output = cloudtool.main(['cloud-tool', 'deletePool', '--poolname=' + options.pool_name, - "--server=" + CloudStackSvrIP + ":" + str(CloudStackSvrPort)]) - except urllib2.HTTPError, err: - code = err.code - msg = err.read() - print "executing destroypool cmd failed, http returning error code: %s" % (code) - httpErrorHandler(code, msg) - sys.exit(1) - except urllib2.URLError, err: - print "executing destroypool failed, due to: %s" % (err.reason) - sys.exit(1) + try: + output = cloudtool.main(['cloud-tool', 'deletePool', '--poolname=' + options.pool_name, + "--server=" + CloudStackSvrIP + ":" + str(CloudStackSvrPort)]) + except urllib2.HTTPError, err: + code = err.code + msg = err.read() + print "executing destroypool cmd failed, http returning error code: %s" % (code) + httpErrorHandler(code, msg) + sys.exit(1) + except urllib2.URLError, err: + print "executing destroypool failed, due to: %s" % (err.reason) + sys.exit(1) - xmlResult = xml.dom.minidom.parseString(output) - result = getText(xmlResult.getElementsByTagName("success")[0].childNodes).strip() - if result == "true": - print "Successfully destroyed pool: " + options.pool_name - else: - exception = getText(xmlResult.getElementsByTagName("exception")[0].childNodes).strip() - print "Unable to destroy pool: %s " % (exception) + xmlResult = xml.dom.minidom.parseString(output) + result = getText(xmlResult.getElementsByTagName("success")[0].childNodes).strip() + if result == "true": + print "Successfully destroyed pool: " + options.pool_name + else: + exception = getText(xmlResult.getElementsByTagName("exception")[0].childNodes).strip() + print "Unable to destroy pool: %s " % (exception) def loadCfgFile(): - options = dict() - try: - cfgFile = open(os.environ['HOME'] + "/.cloudvoladmrc") - for line in cfgFile: - option = line.split("=") - if option[0] == "cloudStackMgtSvrIP": - options["cloudStackMgtSvrIP"] = option[1].strip("\n") + options = dict() + try: + cfgFile = open(os.environ['HOME'] + "/.cloudvoladmrc") + for line in cfgFile: + option = line.split("=") + if option[0] == "cloudStackMgtSvrIP": + options["cloudStackMgtSvrIP"] = option[1].strip("\n") - except: - return None + except: + return None - return options - + return options + def getGuestIQN(): - try: - initialFile = open("/etc/iscsi/initiatorname.iscsi") - for line in initialFile: - iqn = line.split("=") - if iqn[0] == "InitiatorName": - return iqn[1].strip("\n") - except: - return None - return None + try: + initialFile = open("/etc/iscsi/initiatorname.iscsi") + for line in initialFile: + iqn = line.split("=") + if iqn[0] == "InitiatorName": + return iqn[1].strip("\n") + except: + return None + return None if __name__ == '__main__': - parser = Help() - (options, args) = parser.parse_args() - - globalCfg = loadCfgFile() + parser = Help() + (options, args) = parser.parse_args() + + globalCfg = loadCfgFile() - NetAppServerIP= options.server_ip + NetAppServerIP= options.server_ip - NetAppUserName = options.username - - NetAppPassword = options.password - - CloudStackSvrIP = options.cloudstackSvr - if CloudStackSvrIP == None: - if globalCfg != None and "cloudStackMgtSvrIP" in globalCfg: - CloudStackSvrIP = globalCfg["cloudStackMgtSvrIP"] - if CloudStackSvrIP == None: - CloudStackSvrIP = "127.0.0.1" + NetAppUserName = options.username + + NetAppPassword = options.password + + CloudStackSvrIP = options.cloudstackSvr + if CloudStackSvrIP == None: + if globalCfg != None and "cloudStackMgtSvrIP" in globalCfg: + CloudStackSvrIP = globalCfg["cloudStackMgtSvrIP"] + if CloudStackSvrIP == None: + CloudStackSvrIP = "127.0.0.1" - if options.guest_iqn == None: - GuestIQN = getGuestIQN() - options.__dict__["guest_iqn"] = GuestIQN + if options.guest_iqn == None: + GuestIQN = getGuestIQN() + options.__dict__["guest_iqn"] = GuestIQN - if len(args) == 0: - sys.exit(1) - cmd = args[0] - if cmd == "createvol": - createvol(options) - elif cmd == "deletevol": - deletevol(options) - elif cmd == "listvol": - listvol(options) - elif cmd == "createlun": - createlun(options) - elif cmd == "listlun": - listlun(options) - elif cmd == "destroylun": - destroylun(options) - elif cmd == "assoclun": - assoclun(options) - elif cmd == "disassoclun": - disassoclun(options) - elif cmd == "createpool": - createpool(options) - elif cmd == "modifypool": - modifypool(options) - elif cmd == "destroypool": - destroypool(options) - elif cmd == "listpools": - listpools(options) - else: - print "Unrecoginzied command" - cmd_help() - sys.exit(1) + if len(args) == 0: + sys.exit(1) + cmd = args[0] + if cmd == "createvol": + createvol(options) + elif cmd == "deletevol": + deletevol(options) + elif cmd == "listvol": + listvol(options) + elif cmd == "createlun": + createlun(options) + elif cmd == "listlun": + listlun(options) + elif cmd == "destroylun": + destroylun(options) + elif cmd == "assoclun": + assoclun(options) + elif cmd == "disassoclun": + disassoclun(options) + elif cmd == "createpool": + createpool(options) + elif cmd == "modifypool": + modifypool(options) + elif cmd == "destroypool": + destroypool(options) + elif cmd == "listpools": + listpools(options) + else: + print "Unrecoginzied command" + cmd_help() + sys.exit(1) diff --git a/deps/manageontap.jar b/deps/manageontap.jar deleted file mode 100644 index 3f2a6712186b8743c0f2b429feee47725beea0f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 55444 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