|  | #!/usr/bin/env python | 
|  |  | 
|  | # Licensed to the Apache Software Foundation (ASF) under one | 
|  | # or more contributor license agreements.  See the NOTICE file | 
|  | # distributed with this work for additional information | 
|  | # regarding copyright ownership.  The ASF licenses this file | 
|  | # to you under the Apache License, Version 2.0 (the | 
|  | # "License"); you may not use this file except in compliance | 
|  | # with the License.  You may obtain a copy of the License at | 
|  | # | 
|  | #   http://www.apache.org/licenses/LICENSE-2.0 | 
|  | # | 
|  | # Unless required by applicable law or agreed to in writing, | 
|  | # software distributed under the License is distributed on an | 
|  | # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | 
|  | # KIND, either express or implied.  See the License for the | 
|  | # specific language governing permissions and limitations | 
|  | # under the License. | 
|  |  | 
|  | import sys | 
|  | import os | 
|  | import subprocess | 
|  | import cloudtool | 
|  | import urllib2 | 
|  | from optparse import OptionParser, OptionGroup, OptParseError, BadOptionError, OptionError, OptionConflictError, OptionValueError | 
|  | import xml.dom.minidom | 
|  |  | 
|  | NetAppServerIP=None | 
|  | NetAppUserName=None | 
|  | NetAppPassword=None | 
|  | CloudStackSvrIP=None | 
|  | CloudStackSvrPort=8096 | 
|  |  | 
|  |  | 
|  | cmds=["createvol","deletevol", "listvol", "createlun", "listlun", "destroylun", "assoclun", "disassoclun", "createpool", "modifypool", "destroypool", "listpools"] | 
|  | 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." | 
|  |  | 
|  | usage="Volume Manager CLI: add a new volume to a storage pool" | 
|  | addvolParser= OptionParser(usage) | 
|  | addvolParser.add_option("-i", metavar="server ip", dest="server_ip", help="The IP address of the storage server") | 
|  | addvolParser.add_option("-u", metavar="username", dest="username", help="username to access the storage server with") | 
|  | addvolParser.add_option("-w", metavar="password", dest="password", help="the password to access the storage server with") | 
|  | addvolParser.add_option("-p", dest="pool_name", help="the name of the pool to allocate from") | 
|  | addvolParser.add_option("-a", dest="aggregate_name", help="the name of aggregate") | 
|  | addvolParser.add_option("-v", dest="vol_name", help="the name of volume") | 
|  | addvolParser.add_option("-s", dest="size", help="size in GB eg.1") | 
|  | optionalGroup = OptionGroup(addvolParser, "Optional") | 
|  | optionalGroup.add_option("-r", dest="percentage", help="Percentage used for snapshot reserve") | 
|  | optionalGroup.add_option("-S", dest="snapshots", help="Snapshot schedule in <weeks> <days> <hours>@<which-hours> <minutes>@<which-minutes> e.g. \"2 4 5@1,4 6@2,5\"") | 
|  | addvolParser.add_option_group(optionalGroup) | 
|  |  | 
|  | usage="Volume Manager CLI: remove a volume from a pool" | 
|  | delvolParser= OptionParser(usage) | 
|  | delvolParser.add_option("-i", metavar="server ip", dest="server_ip", help="The IP address of the storage server") | 
|  | delvolParser.add_option("-a", dest="aggregate_name", help="The name of aggregate") | 
|  | delvolParser.add_option("-v", dest="vol_name", help="The name of volume") | 
|  |  | 
|  | usage="Volume Manager CLI: list all volumes known to exist in a pool" | 
|  | listvolParser= OptionParser(usage) | 
|  | listvolParser.add_option("-p", dest="pool_name", help="The name of the pool to list volumes from") | 
|  |  | 
|  | usage="Volume Manager CLI: create a LUN on a pool" | 
|  | createlunParser = OptionParser(usage) | 
|  | createlunParser.add_option("-p", dest="pool_name", help="The name of the pool to add the volume to") | 
|  | createlunParser.add_option("-s", dest="size", help="The size in GB e.g. 100") | 
|  |  | 
|  | usage="Volume Manager CLI: list LUN on a pool" | 
|  | listlunParser = OptionParser(usage) | 
|  | listlunParser.add_option("-p", dest="pool_name", help="The pool name") | 
|  |  | 
|  | usage="Volume Manager CLI: destroy a LUN " | 
|  | destroylunParser = OptionParser(usage) | 
|  | destroylunParser.add_option("-l", dest="lun_name", help="The LUN name") | 
|  |  | 
|  | usage="Volume Manager CLI: Add a new pool to the system" | 
|  | createPoolParser = OptionParser(usage) | 
|  | createPoolParser.add_option("-p", dest="pool_name", help="The pool name") | 
|  | createPoolParser.add_option("-A", dest="algorithm", help="roundrobin or leastfull") | 
|  |  | 
|  |  | 
|  | usage="Volume Manager CLI: change the allocation algorithm for a pool" | 
|  | modifyPoolParser = OptionParser(usage) | 
|  | modifyPoolParser.add_option("-p", dest="pool_name", help="The pool name") | 
|  | modifyPoolParser.add_option("-A", dest="algorithm", help="roundrobin or leastfull") | 
|  |  | 
|  | usage="Volume Manager CLI: destroy a pool" | 
|  | destroyPoolParser = OptionParser(usage) | 
|  | destroyPoolParser.add_option("-p", dest="pool_name", help="The pool name") | 
|  |  | 
|  | usage="Volume Manager CLI: list pools" | 
|  | listPoolParser = OptionParser(usage) | 
|  |  | 
|  | usage="Volume Manager CLI: associate a LUN with a guest that uses the stated IQN as client" | 
|  | assocLunParser = OptionParser(usage) | 
|  | assocLunParser.add_option("-g", dest="guest_iqn", help="the guest IQN. By default, it reads from /etc/iscsi/initiatorname.iscsi") | 
|  | assocLunParser.add_option("-l", dest="lun_name", help="The LUN name") | 
|  |  | 
|  | usage="Volume Manager CLI: disassociate a LUN with a guest that uses the stated IQN as client" | 
|  | disassocLunParser = OptionParser(usage) | 
|  | disassocLunParser.add_option("-g", dest="guest_iqn", help="the guest IQN. By default, it reads from /etc/iscsi/initiatorname.iscsi") | 
|  | 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} | 
|  |  | 
|  |  | 
|  | 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"]) | 
|  |  | 
|  | def help_callback(option, opt, value, parser): | 
|  | 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"]) | 
|  |  | 
|  | 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 | 
|  |  | 
|  | def httpErrorHandler(code, msg): | 
|  | try: | 
|  | errtext = xml.dom.minidom.parseString(msg) | 
|  | if errtext.getElementsByTagName("errortext") is not None: | 
|  | err = getText(errtext.getElementsByTagName("errortext")[0].childNodes).strip() | 
|  | print err | 
|  | except: | 
|  | print "Internal Error %s"%msg | 
|  |  | 
|  | def getText(nodelist): | 
|  | 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] | 
|  |  | 
|  | 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"]) | 
|  |  | 
|  | ''' | 
|  | 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), "--stripxml=false"] + args) | 
|  | print "Successfully added volume" | 
|  | 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) | 
|  |  | 
|  |  | 
|  | def deletevol(options): | 
|  | 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), "--stripxml=false"]) | 
|  | print "Successfully deleted volume" | 
|  | 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) | 
|  |  | 
|  | def listvol(options): | 
|  | validate_parameter(options, listvolParser) | 
|  |  | 
|  | try: | 
|  | output = cloudtool.main(['cloud-tool', 'listVolumesOnFiler', '--poolname=' + options.pool_name, "--server=" + CloudStackSvrIP + ":" + str(CloudStackSvrPort), "--stripxml=false"]).strip("\n") | 
|  |  | 
|  | xmlResult = xml.dom.minidom.parseString(output) | 
|  | 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('size')[0].childNodes).strip() | 
|  | print "%-10s %-20s %-20s %-40s %-20s %-30s "%(id, ipaddress, aggregatename, volumeName, volSize, snapshotPolicy) | 
|  | 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) | 
|  |  | 
|  |  | 
|  | def createlun(options): | 
|  | validate_parameter(options, createlunParser) | 
|  |  | 
|  | try: | 
|  | output = cloudtool.main(['cloud-tool', 'createLunOnFiler', '--name=' + options.pool_name, | 
|  | '--size=' + options.size, "--server=" + CloudStackSvrIP + ":" + str(CloudStackSvrPort), "--stripxml=false"]) | 
|  |  | 
|  | xmlResult = xml.dom.minidom.parseString(output.strip("\n")) | 
|  | 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) | 
|  | 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) | 
|  |  | 
|  | def listlun(options): | 
|  | validate_parameter(options, listlunParser) | 
|  |  | 
|  | args = ["--poolname=" + options.pool_name, "--server=" + CloudStackSvrIP + ":" + str(CloudStackSvrPort), "--stripxml=false"] | 
|  | try: | 
|  | output = cloudtool.main(['cloud-tool', 'listLunsOnFiler'] + args).strip("\n") | 
|  | xmlResult = xml.dom.minidom.parseString(output) | 
|  |  | 
|  | 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('iqn')[0].childNodes).strip() | 
|  | volumeId = getText(volume.getElementsByTagName('volumeid')[0].childNodes).strip() | 
|  | print "%-10s %-10s %-50s %-30s "%(uuid, volumeId, targetiqn, path) | 
|  | 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) | 
|  |  | 
|  | def destroylun(options): | 
|  | validate_parameter(options, destroylunParser) | 
|  |  | 
|  | try: | 
|  | output = cloudtool.main(['cloud-tool', 'destroyLunOnFiler', '--path=' + options.lun_name, | 
|  | "--server=" + CloudStackSvrIP + ":" + str(CloudStackSvrPort), "--stripxml=false"]) | 
|  | print "Successfully destroyed LUN" | 
|  | 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) | 
|  |  | 
|  | def assoclun(options): | 
|  | validate_parameter(options, assocLunParser) | 
|  |  | 
|  | try: | 
|  | output = cloudtool.main(['cloud-tool', 'associateLun', '--name=' + options.lun_name, | 
|  | '--iqn=' + options.guest_iqn, "--server=" + CloudStackSvrIP + ":" + str(CloudStackSvrPort), "--stripxml=false"]) | 
|  | xmlResult = xml.dom.minidom.parseString(output.strip("\n")) | 
|  | lunid = getText(xmlResult.getElementsByTagName("id")[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) | 
|  | 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) | 
|  |  | 
|  | def disassoclun(options): | 
|  | validate_parameter(options, disassocLunParser) | 
|  |  | 
|  | try: | 
|  | output = cloudtool.main(['cloud-tool', 'dissociateLun', '--path=' + options.lun_name, | 
|  | '--iqn=' + options.guest_iqn, "--server=" + CloudStackSvrIP + ":" + str(CloudStackSvrPort), "--stripxml=false"]) | 
|  | print "Successfully dissociated LUN" | 
|  | 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) | 
|  |  | 
|  | def createpool(options): | 
|  | 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', '--name=' + options.pool_name, | 
|  | '--algorithm=' + options.algorithm, "--server=" + CloudStackSvrIP + ":" + str(CloudStackSvrPort), "--stripxml=false"]) | 
|  | print "Successfully created pool" | 
|  | except urllib2.HTTPError, err: | 
|  | code = err.code | 
|  | print "executing createpool cmd failed, http returning error code: %s" % (code) | 
|  | httpErrorHandler(code, err.read()) | 
|  | sys.exit(1) | 
|  | except urllib2.URLError, err: | 
|  | print "executing createpool failed: %s" % (err.reason) | 
|  | sys.exit(1) | 
|  |  | 
|  | def listpools(options): | 
|  | try: | 
|  | output = cloudtool.main(['cloud-tool', 'listPools', | 
|  | "--server=" + CloudStackSvrIP + ":" + str(CloudStackSvrPort), "--stripxml=false"]) | 
|  | output = output.strip("\n") | 
|  | xmlResult = xml.dom.minidom.parseString(output) | 
|  | 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('name')[0].childNodes).strip() | 
|  | alg = getText(volume.getElementsByTagName('algorithm')[0].childNodes).strip() | 
|  | print "%-10s %-40s %-10s"%(id, poolname, alg) | 
|  | 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) | 
|  |  | 
|  | 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), "--stripxml=false"]) | 
|  | print "Successfully modified pool" | 
|  | 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) | 
|  |  | 
|  | def destroypool(options): | 
|  | validate_parameter(options, destroyPoolParser) | 
|  |  | 
|  | try: | 
|  | output = cloudtool.main(['cloud-tool', 'deletePool', '--poolname=' + options.pool_name, | 
|  | "--server=" + CloudStackSvrIP + ":" + str(CloudStackSvrPort), "--stripxml=false"]) | 
|  | print "Successfully destroyed pool: " + options.pool_name | 
|  | 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) | 
|  |  | 
|  | 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") | 
|  |  | 
|  | except: | 
|  | return None | 
|  |  | 
|  | 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 | 
|  |  | 
|  | if __name__ == '__main__': | 
|  | parser = Help() | 
|  | (options, args) = parser.parse_args() | 
|  |  | 
|  | globalCfg = loadCfgFile() | 
|  |  | 
|  | 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" | 
|  |  | 
|  | 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) |