mirror of
				https://github.com/apache/cloudstack.git
				synced 2025-11-04 00:02:37 +01:00 
			
		
		
		
	Applying to the following directories: * api * deamonize * agnet * agent-simulator * cloud-cli
		
			
				
	
	
		
			608 lines
		
	
	
		
			26 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			608 lines
		
	
	
		
			26 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
#!/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)
 |