#!/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)
