# 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. """ Base class for all Cloudstack resources -Virtual machine, Volume, Snapshot etc """ import marvin from utils import is_server_ssh_ready, random_gen from marvin.cloudstackAPI import * #Import System modules import time import hashlib import base64 class Domain: """ Domain Life Cycle """ def __init__(self, items): self.__dict__.update(items) @classmethod def create(cls, apiclient, services, name=None, networkdomain=None, parentdomainid=None): """Creates an domain""" cmd = createDomain.createDomainCmd() if name: cmd.name = "-".join([name, random_gen()]) elif "name" in services: cmd.name = "-".join([services["name"], random_gen()]) if networkdomain: cmd.networkdomain = networkdomain elif "networkdomain" in services: cmd.networkdomain = services["networkdomain"] if parentdomainid: cmd.parentdomainid = parentdomainid elif "parentdomainid" in services: cmd.parentdomainid = services["parentdomainid"] return Domain(apiclient.createDomain(cmd).__dict__) def delete(self, apiclient, cleanup=None): """Delete an domain""" cmd = deleteDomain.deleteDomainCmd() cmd.id = self.id if cleanup: cmd.cleanup = cleanup apiclient.deleteDomain(cmd) @classmethod def list(cls, apiclient, **kwargs): """Lists domains""" cmd = listDomains.listDomainsCmd() [setattr(cmd, k, v) for k, v in kwargs.items()] return(apiclient.listDomains(cmd)) class Account: """ Account Life Cycle """ def __init__(self, items): self.__dict__.update(items) @classmethod def create(cls, apiclient, services, admin=False, domainid=None): """Creates an account""" cmd = createAccount.createAccountCmd() #0 - User, 1 - Root Admin, 2 - Domain Admin cmd.accounttype = 2 if (admin and domainid) else int(admin) cmd.email = services["email"] cmd.firstname = services["firstname"] cmd.lastname = services["lastname"] # Password Encoding mdf = hashlib.md5() mdf.update(services["password"]) cmd.password = mdf.hexdigest() cmd.username = "-".join([services["username"], random_gen()]) if domainid: cmd.domainid = domainid account = apiclient.createAccount(cmd) return Account(account.__dict__) def delete(self, apiclient): """Delete an account""" cmd = deleteAccount.deleteAccountCmd() cmd.id = self.account.id apiclient.deleteAccount(cmd) @classmethod def list(cls, apiclient, **kwargs): """Lists accounts and provides detailed account information for listed accounts""" cmd = listAccounts.listAccountsCmd() [setattr(cmd, k, v) for k, v in kwargs.items()] return(apiclient.listAccounts(cmd)) class User: """ User Life Cycle """ def __init__(self, items): self.__dict__.update(items) @classmethod def create(cls, apiclient, services, account, domainid): cmd = createUser.createUserCmd() """Creates an user""" cmd.account = account cmd.domainid = domainid cmd.email = services["email"] cmd.firstname = services["firstname"] cmd.lastname = services["lastname"] # Password Encoding mdf = hashlib.md5() mdf.update(services["password"]) cmd.password = mdf.hexdigest() cmd.username = "-".join([services["username"], random_gen()]) user = apiclient.createUser(cmd) return User(user.__dict__) def delete(self, apiclient): """Delete an account""" cmd = deleteUser.deleteUserCmd() cmd.id = self.id apiclient.deleteUser(cmd) @classmethod def list(cls, apiclient, **kwargs): """Lists users and provides detailed account information for listed users""" cmd = listUsers.listUsersCmd() [setattr(cmd, k, v) for k, v in kwargs.items()] return(apiclient.listUsers(cmd)) class VirtualMachine: """Manage virtual machine lifecycle""" def __init__(self, items, services): self.__dict__.update(items) self.username = services["username"] self.password = services["password"] self.ssh_port = services["ssh_port"] self.ssh_client = None #extract out the ipaddress self.ipaddress = self.nic[0].ipaddress @classmethod def create(cls, apiclient, services, templateid=None, accountid=None, domainid=None, networkids=None, serviceofferingid=None, securitygroupids=None, projectid=None, mode='basic'): """Create the instance""" cmd = deployVirtualMachine.deployVirtualMachineCmd() if serviceofferingid: cmd.serviceofferingid = serviceofferingid elif "serviceoffering" in services: cmd.serviceofferingid = services["serviceoffering"] cmd.zoneid = services["zoneid"] cmd.hypervisor = services["hypervisor"] if accountid: cmd.account = accountid elif "account" in services: cmd.account = services["account"] if domainid: cmd.domainid = domainid elif "domainid" in services: cmd.domainid = services["domainid"] if networkids: cmd.networkids = networkids elif "networkids" in services: cmd.networkids = services["networkids"] if templateid: cmd.templateid = templateid elif "template" in services: cmd.templateid = services["template"] if "diskoffering" in services: cmd.diskofferingid = services["diskoffering"] if securitygroupids: cmd.securitygroupids = [str(sg_id) for sg_id in securitygroupids] if "userdata" in services: cmd.userdata = base64.b64encode(services["userdata"]) if projectid: cmd.projectid = projectid virtual_machine = apiclient.deployVirtualMachine(cmd) # VM should be in Running state after deploy timeout = 10 while True: vm_status = VirtualMachine.list( apiclient, id=virtual_machine.id ) if isinstance(vm_status, list): if vm_status[0].state == 'Running': break elif timeout == 0: raise Exception( "TimeOutException: Failed to start VM (ID: %s)" % virtual_machine.id) time.sleep(10) timeout = timeout - 1 if mode.lower() == 'advanced': public_ip = PublicIPAddress.create( apiclient, virtual_machine.account, virtual_machine.zoneid, virtual_machine.domainid, services ) fw_rule = FireWallRule.create( apiclient, ipaddressid=public_ip.ipaddress.id, protocol='TCP', cidrlist=['0.0.0.0/0'], startport=22, endport=22 ) nat_rule = NATRule.create( apiclient, virtual_machine, services, ipaddressid=public_ip.ipaddress.id ) virtual_machine.ssh_ip = nat_rule.ipaddress virtual_machine.public_ip = nat_rule.ipaddress else: virtual_machine.ssh_ip = virtual_machine.nic[0].ipaddress virtual_machine.public_ip = virtual_machine.nic[0].ipaddress return VirtualMachine(virtual_machine.__dict__, services) def start(self, apiclient): """Start the instance""" cmd = startVirtualMachine.startVirtualMachineCmd() cmd.id = self.id apiclient.startVirtualMachine(cmd) def stop(self, apiclient): """Stop the instance""" cmd = stopVirtualMachine.stopVirtualMachineCmd() cmd.id = self.id apiclient.stopVirtualMachine(cmd) def reboot(self, apiclient): """Reboot the instance""" cmd = rebootVirtualMachine.rebootVirtualMachineCmd() cmd.id = self.id apiclient.rebootVirtualMachine(cmd) def get_ssh_client(self, ipaddress=None, reconnect=False, port=None): """Get SSH object of VM""" # If NAT Rules are not created while VM deployment in Advanced mode # then, IP address must be passed if ipaddress != None: self.ssh_ip = ipaddress if port: self.ssh_port = port if reconnect: self.ssh_client = is_server_ssh_ready( self.ssh_ip, self.ssh_port, self.username, self.password ) self.ssh_client = self.ssh_client or is_server_ssh_ready( self.ssh_ip, self.ssh_port, self.username, self.password ) return self.ssh_client def delete(self, apiclient): """Destroy an Instance""" cmd = destroyVirtualMachine.destroyVirtualMachineCmd() cmd.id = self.id apiclient.destroyVirtualMachine(cmd) def attach_volume(self, apiclient, volume): """Attach volume to instance""" cmd = attachVolume.attachVolumeCmd() cmd.id = volume.id cmd.virtualmachineid = self.id return apiclient.attachVolume(cmd) def detach_volume(self, apiclient, volume): """Detach volume to instance""" cmd = detachVolume.detachVolumeCmd() cmd.id = volume.id return apiclient.detachVolume(cmd) @classmethod def list(cls, apiclient, **kwargs): """List all VMs matching criteria""" cmd = listVirtualMachines.listVirtualMachinesCmd() [setattr(cmd, k, v) for k, v in kwargs.items()] return(apiclient.listVirtualMachines(cmd)) def resetPassword(self, apiclient): """Resets VM password if VM created using password enabled template""" cmd = resetPasswordForVirtualMachine.resetPasswordForVirtualMachineCmd() cmd.id = self.id try: response = apiclient.resetPasswordForVirtualMachine(cmd) print response except Exception as e: raise Exception("Reset Password failed! - %s" % e) print type(response) if isinstance(response, list): return response[0].password class Volume: """Manage Volume Lifecycle """ def __init__(self, items): self.__dict__.update(items) @classmethod def create(cls, apiclient, services, zoneid=None, account=None, domainid=None, diskofferingid=None, projectid=None): """Create Volume""" cmd = createVolume.createVolumeCmd() cmd.name = services["diskname"] if diskofferingid: cmd.diskofferingid = diskofferingid elif "diskofferingid" in services: cmd.diskofferingid = services["diskofferingid"] if zoneid: cmd.zoneid = zoneid elif "zoneid" in services: cmd.zoneid = services["zoneid"] if account: cmd.account = account elif "account" in services: cmd.account = services["account"] if domainid: cmd.domainid = domainid elif "domainid" in services: cmd.domainid = services["domainid"] if projectid: cmd.projectid = projectid return Volume(apiclient.createVolume(cmd).__dict__) @classmethod def create_custom_disk(cls, apiclient, services, account=None, domainid=None): """Create Volume from Custom disk offering""" cmd = createVolume.createVolumeCmd() cmd.name = services["diskname"] cmd.diskofferingid = services["customdiskofferingid"] cmd.size = services["customdisksize"] cmd.zoneid = services["zoneid"] if account: cmd.account = account else: cmd.account = services["account"] if domainid: cmd.domainid = domainid else: cmd.domainid = services["domainid"] return Volume(apiclient.createVolume(cmd).__dict__) @classmethod def create_from_snapshot(cls, apiclient, snapshot_id, services, account=None, domainid=None): """Create Volume from snapshot""" cmd = createVolume.createVolumeCmd() cmd.name = "-".join([services["diskname"], random_gen()]) cmd.snapshotid = snapshot_id cmd.zoneid = services["zoneid"] cmd.size = services["size"] if account: cmd.account = account else: cmd.account = services["account"] if domainid: cmd.domainid = domainid else: cmd.domainid = services["domainid"] return Volume(apiclient.createVolume(cmd).__dict__) def delete(self, apiclient): """Delete Volume""" cmd = deleteVolume.deleteVolumeCmd() cmd.id = self.id apiclient.deleteVolume(cmd) @classmethod def list(cls, apiclient, **kwargs): """List all volumes matching criteria""" cmd = listVolumes.listVolumesCmd() [setattr(cmd, k, v) for k, v in kwargs.items()] return(apiclient.listVolumes(cmd)) class Snapshot: """Manage Snapshot Lifecycle """ def __init__(self, items): self.__dict__.update(items) @classmethod def create(cls, apiclient, volume_id, account=None, domainid=None, projectid=None): """Create Snapshot""" cmd = createSnapshot.createSnapshotCmd() cmd.volumeid = volume_id if account: cmd.account = account if domainid: cmd.domainid = domainid if projectid: cmd.projectid = projectid return Snapshot(apiclient.createSnapshot(cmd).__dict__) def delete(self, apiclient): """Delete Snapshot""" cmd = deleteSnapshot.deleteSnapshotCmd() cmd.id = self.id apiclient.deleteSnapshot(cmd) @classmethod def list(cls, apiclient, **kwargs): """List all snapshots matching criteria""" cmd = listSnapshots.listSnapshotsCmd() [setattr(cmd, k, v) for k, v in kwargs.items()] return(apiclient.listSnapshots(cmd)) class Template: """Manage template life cycle""" def __init__(self, items): self.__dict__.update(items) @classmethod def create(cls, apiclient, services, volumeid=None, account=None, domainid=None, projectid=None): """Create template from Volume""" #Create template from Virtual machine and Volume ID cmd = createTemplate.createTemplateCmd() cmd.displaytext = services["displaytext"] cmd.name = "-".join([services["name"], random_gen()]) cmd.ostypeid = services["ostypeid"] cmd.isfeatured = services["isfeatured"] if "isfeatured" in services else False cmd.ispublic = services["ispublic"] if "ispublic" in services else False cmd.isextractable = services["isextractable"] if "isextractable" in services else False cmd.passwordenabled = services["passwordenabled"] if "passwordenabled" in services else False cmd.passwordenabled = services["passwordenabled"] if "passwordenabled" in services else False if volumeid: cmd.volumeid = volumeid if account: cmd.account = account if domainid: cmd.domainid = domainid if projectid: cmd.projectid = projectid return Template(apiclient.createTemplate(cmd).__dict__) @classmethod def register(cls, apiclient, services, zoneid=None, account=None, domainid=None): """Create template from URL""" #Create template from Virtual machine and Volume ID cmd = registerTemplate.registerTemplateCmd() cmd.displaytext = services["displaytext"] cmd.name = "-".join([services["name"], random_gen()]) cmd.format = services["format"] cmd.hypervisor = services["hypervisor"] cmd.ostypeid = services["ostypeid"] cmd.url = services["url"] if zoneid: cmd.zoneid = zoneid else: cmd.zoneid = services["zoneid"] cmd.isfeatured = services["isfeatured"] if "isfeatured" in services else False cmd.ispublic = services["ispublic"] if "ispublic" in services else False cmd.isextractable = services["isextractable"] if "isextractable" in services else False cmd.passwordenabled = services["passwordenabled"] if "passwordenabled" in services else False if account: cmd.account = account if domainid: cmd.domainid = domainid # Register Template template = apiclient.registerTemplate(cmd) if isinstance(template, list): return Template(template[0].__dict__) @classmethod def create_from_snapshot(cls, apiclient, snapshot, services, random_name=True): """Create Template from snapshot""" #Create template from Virtual machine and Snapshot ID cmd = createTemplate.createTemplateCmd() cmd.displaytext = services["displaytext"] cmd.name = "-".join([ services["name"], random_gen() ]) if random_name else services["name"] cmd.ostypeid = services["ostypeid"] cmd.snapshotid = snapshot.id return Template(apiclient.createTemplate(cmd).__dict__) def delete(self, apiclient): """Delete Template""" cmd = deleteTemplate.deleteTemplateCmd() cmd.id = self.id apiclient.deleteTemplate(cmd) def download(self, apiclient, timeout=5, interval=60): """Download Template""" #Sleep to ensure template is in proper state before download time.sleep(interval) while True: template_response = Template.list( apiclient, id=self.id, zoneid=self.zoneid, templatefilter='self' ) if isinstance(template_response, list): template = template_response[0] # If template is ready, # template.status = Download Complete # Downloading - x% Downloaded # Error - Any other string if template.status == 'Download Complete': break elif 'Downloaded' in template.status: time.sleep(interval) elif 'Installing' not in template.status: raise Exception("ErrorInDownload") elif timeout == 0: break else: time.sleep(interval) timeout = timeout - 1 return def updatePermissions(self, apiclient, **kwargs): """Updates the template permissions""" cmd = updateTemplatePermissions.updateTemplatePermissionsCmd() cmd.id = self.id [setattr(cmd, k, v) for k, v in kwargs.items()] return(apiclient.updateTemplatePermissions(cmd)) @classmethod def list(cls, apiclient, **kwargs): """List all templates matching criteria""" cmd = listTemplates.listTemplatesCmd() [setattr(cmd, k, v) for k, v in kwargs.items()] return(apiclient.listTemplates(cmd)) class Iso: """Manage ISO life cycle""" def __init__(self, items): self.__dict__.update(items) @classmethod def create(cls, apiclient, services, account=None, domainid=None, projectid=None): """Create an ISO""" #Create ISO from URL cmd = registerIso.registerIsoCmd() cmd.displaytext = services["displaytext"] cmd.name = services["name"] cmd.ostypeid = services["ostypeid"] cmd.url = services["url"] cmd.zoneid = services["zoneid"] if "isextractable" in services: cmd.isextractable = services["isextractable"] if "isfeatured" in services: cmd.isfeatured = services["isfeatured"] if "ispublic" in services: cmd.ispublic = services["ispublic"] if account: cmd.account = account if domainid: cmd.domainid = domainid if projectid: cmd.projectid = projectid # Register ISO iso = apiclient.registerIso(cmd) if iso: return Iso(iso[0].__dict__) def delete(self, apiclient): """Delete an ISO""" cmd = deleteIso.deleteIsoCmd() cmd.id = self.id apiclient.deleteIso(cmd) return def download(self, apiclient, timeout=5, interval=60): """Download an ISO""" #Ensuring ISO is successfully downloaded while True: time.sleep(interval) cmd = listIsos.listIsosCmd() cmd.id = self.id iso_response = apiclient.listIsos(cmd) if isinstance(iso_response, list): response = iso_response[0] # Again initialize timeout to avoid listISO failure timeout = 5 print response.status # Check whether download is in progress(for Ex:10% Downloaded) # or ISO is 'Successfully Installed' if response.status == 'Successfully Installed': return elif 'Downloaded' not in response.status and \ 'Installing' not in response.status: raise Exception("ErrorInDownload") elif timeout == 0: raise Exception("TimeoutException") else: timeout = timeout - 1 return @classmethod def list(cls, apiclient, **kwargs): """Lists all available ISO files.""" cmd = listIsos.listIsosCmd() [setattr(cmd, k, v) for k, v in kwargs.items()] return(apiclient.listIsos(cmd)) class PublicIPAddress: """Manage Public IP Addresses""" def __init__(self, items): self.__dict__.update(items) @classmethod def create(cls, apiclient, accountid=None, zoneid=None, domainid=None, services=None, networkid=None, projectid=None): """Associate Public IP address""" cmd = associateIpAddress.associateIpAddressCmd() if accountid: cmd.account = accountid if zoneid: cmd.zoneid = zoneid elif "zoneid" in services: services["zoneid"] if domainid: cmd.domainid = domainid elif "domainid" in services: services["domainid"] if networkid: cmd.networkid = networkid if projectid: cmd.projectid = projectid return PublicIPAddress(apiclient.associateIpAddress(cmd).__dict__) def delete(self, apiclient): """Dissociate Public IP address""" cmd = disassociateIpAddress.disassociateIpAddressCmd() cmd.id = self.ipaddress.id apiclient.disassociateIpAddress(cmd) return @classmethod def list(cls, apiclient, **kwargs): """List all Public IPs matching criteria""" cmd = listPublicIpAddresses.listPublicIpAddressesCmd() [setattr(cmd, k, v) for k, v in kwargs.items()] return(apiclient.listPublicIpAddresses(cmd)) class NATRule: """Manage port forwarding rule""" def __init__(self, items): self.__dict__.update(items) @classmethod def create(cls, apiclient, virtual_machine, services, ipaddressid=None, projectid=None): """Create Port forwarding rule""" cmd = createPortForwardingRule.createPortForwardingRuleCmd() if ipaddressid: cmd.ipaddressid = ipaddressid elif "ipaddressid" in services: cmd.ipaddressid = services["ipaddressid"] cmd.privateport = services["privateport"] cmd.publicport = services["publicport"] cmd.protocol = services["protocol"] cmd.virtualmachineid = virtual_machine.id if projectid: cmd.projectid = projectid return NATRule(apiclient.createPortForwardingRule(cmd).__dict__) def delete(self, apiclient): """Delete port forwarding""" cmd = deletePortForwardingRule.deletePortForwardingRuleCmd() cmd.id = self.id apiclient.deletePortForwardingRule(cmd) return @classmethod def list(cls, apiclient, **kwargs): """List all NAT rules matching criteria""" cmd = listPortForwardingRules.listPortForwardingRulesCmd() [setattr(cmd, k, v) for k, v in kwargs.items()] return(apiclient.listPortForwardingRules(cmd)) class StaticNATRule: """Manage Static NAT rule""" def __init__(self, items): self.__dict__.update(items) @classmethod def create(cls, apiclient, services, ipaddressid=None): """Creates static ip forwarding rule""" cmd = createIpForwardingRule.createIpForwardingRuleCmd() cmd.protocol = services["protocol"] cmd.startport = services["startport"] if "endport" in services: cmd.endport = services["endport"] if "cidrlist" in services: cmd.cidrlist = services["cidrlist"] if ipaddressid: cmd.ipaddressid = ipaddressid elif "ipaddressid" in services: cmd.ipaddressid = services["ipaddressid"] return StaticNATRule(apiclient.createIpForwardingRule(cmd).__dict__) def delete(self, apiclient): """Delete IP forwarding rule""" cmd = deleteIpForwardingRule.deleteIpForwardingRuleCmd() cmd.id = self.id apiclient.deleteIpForwardingRule(cmd) return @classmethod def list(cls, apiclient, **kwargs): """List all IP forwarding rules matching criteria""" cmd = listIpForwardingRules.listIpForwardingRulesCmd() [setattr(cmd, k, v) for k, v in kwargs.items()] return(apiclient.listIpForwardingRules(cmd)) @classmethod def enable(cls, apiclient, ipaddressid, virtualmachineid): """Enables Static NAT rule""" cmd = enableStaticNat.enableStaticNatCmd() cmd.ipaddressid = ipaddressid cmd.virtualmachineid = virtualmachineid apiclient.enableStaticNat(cmd) return @classmethod def disable(cls, apiclient, ipaddressid, virtualmachineid): """Disables Static NAT rule""" cmd = disableStaticNat.disableStaticNatCmd() cmd.ipaddressid = ipaddressid apiclient.disableStaticNat(cmd) return class FireWallRule: """Manage Firewall rule""" def __init__(self, items): self.__dict__.update(items) @classmethod def create(cls, apiclient, ipaddressid, protocol, cidrlist=None, startport=None, endport=None, projectid=None): """Create Firewall Rule""" cmd = createFirewallRule.createFirewallRuleCmd() cmd.ipaddressid = ipaddressid cmd.protocol = protocol if cidrlist: cmd.cidrlist = cidrlist if startport: cmd.startport = startport if endport: cmd.endport = endport if projectid: cmd.projectid = projectid return FireWallRule(apiclient.createFirewallRule(cmd).__dict__) def delete(self, apiclient): """Delete Firewall rule""" cmd = deleteFirewallRule.deleteFirewallRuleCmd() cmd.id = self.id apiclient.deleteFirewallRule(cmd) return @classmethod def list(cls, apiclient, **kwargs): """List all Firewall Rules matching criteria""" cmd = listFirewallRules.listFirewallRulesCmd() [setattr(cmd, k, v) for k, v in kwargs.items()] return(apiclient.listFirewallRules(cmd)) class ServiceOffering: """Manage service offerings cycle""" def __init__(self, items): self.__dict__.update(items) @classmethod def create(cls, apiclient, services, domainid=None, **kwargs): """Create Service offering""" cmd = createServiceOffering.createServiceOfferingCmd() cmd.cpunumber = services["cpunumber"] cmd.cpuspeed = services["cpuspeed"] cmd.displaytext = services["displaytext"] cmd.memory = services["memory"] cmd.name = services["name"] # Service Offering private to that domain if domainid: cmd.domainid = domainid [setattr(cmd, k, v) for k, v in kwargs.items()] return ServiceOffering(apiclient.createServiceOffering(cmd).__dict__) def delete(self, apiclient): """Delete Service offering""" cmd = deleteServiceOffering.deleteServiceOfferingCmd() cmd.id = self.id apiclient.deleteServiceOffering(cmd) return @classmethod def list(cls, apiclient, **kwargs): """Lists all available service offerings.""" cmd = listServiceOfferings.listServiceOfferingsCmd() [setattr(cmd, k, v) for k, v in kwargs.items()] return(apiclient.listServiceOfferings(cmd)) class DiskOffering: """Manage disk offerings cycle""" def __init__(self, items): self.__dict__.update(items) @classmethod def create(cls, apiclient, services, custom=False, domainid=None): """Create Disk offering""" cmd = createDiskOffering.createDiskOfferingCmd() cmd.displaytext = services["displaytext"] cmd.name = services["name"] if custom: cmd.customized = True else: cmd.disksize = services["disksize"] if domainid: cmd.domainid = domainid return DiskOffering(apiclient.createDiskOffering(cmd).__dict__) def delete(self, apiclient): """Delete Disk offering""" cmd = deleteDiskOffering.deleteDiskOfferingCmd() cmd.id = self.id apiclient.deleteDiskOffering(cmd) return @classmethod def list(cls, apiclient, **kwargs): """Lists all available disk offerings.""" cmd = listDiskOfferings.listDiskOfferingsCmd() [setattr(cmd, k, v) for k, v in kwargs.items()] return(apiclient.listDiskOfferings(cmd)) class NetworkOffering: """Manage network offerings cycle""" def __init__(self, items): self.__dict__.update(items) @classmethod def create(cls, apiclient, services, **kwargs): """Create network offering""" cmd = createNetworkOffering.createNetworkOfferingCmd() cmd.displaytext = "-".join([services["displaytext"], random_gen()]) cmd.name = "-".join([services["name"], random_gen()]) cmd.guestiptype = services["guestiptype"] cmd.supportedservices = services["supportedservices"] cmd.traffictype = services["traffictype"] cmd.serviceProviderList = [] for service, provider in services["serviceProviderList"].items(): cmd.serviceProviderList.append({ 'service': service, 'provider': provider }) if "servicecapabilitylist" in services: cmd.servicecapabilitylist = [] for service, capability in services["servicecapabilitylist"].items(): for ctype, value in capability.items(): cmd.servicecapabilitylist.append({ 'service': service, 'capabilitytype': ctype, 'capabilityvalue': value }) if "specifyVlan" in services: cmd.specifyVlan = services["specifyVlan"] if "specifyIpRanges" in services: cmd.specifyIpRanges = services["specifyIpRanges"] [setattr(cmd, k, v) for k, v in kwargs.items()] return NetworkOffering(apiclient.createNetworkOffering(cmd).__dict__) def delete(self, apiclient): """Delete network offering""" cmd = deleteNetworkOffering.deleteNetworkOfferingCmd() cmd.id = self.id apiclient.deleteNetworkOffering(cmd) return def update(self, apiclient, **kwargs): """Lists all available network offerings.""" cmd = updateNetworkOffering.updateNetworkOfferingCmd() cmd.id = self.id [setattr(cmd, k, v) for k, v in kwargs.items()] return(apiclient.updateNetworkOffering(cmd)) @classmethod def list(cls, apiclient, **kwargs): """Lists all available network offerings.""" cmd = listNetworkOfferings.listNetworkOfferingsCmd() [setattr(cmd, k, v) for k, v in kwargs.items()] return(apiclient.listNetworkOfferings(cmd)) class SnapshotPolicy: """Manage snapshot policies""" def __init__(self, items): self.__dict__.update(items) @classmethod def create(cls, apiclient, volumeid, services): """Create Snapshot policy""" cmd = createSnapshotPolicy.createSnapshotPolicyCmd() cmd.intervaltype = services["intervaltype"] cmd.maxsnaps = services["maxsnaps"] cmd.schedule = services["schedule"] cmd.timezone = services["timezone"] cmd.volumeid = volumeid return SnapshotPolicy(apiclient.createSnapshotPolicy(cmd).__dict__) def delete(self, apiclient): """Delete Snapshot policy""" cmd = deleteSnapshotPolicies.deleteSnapshotPoliciesCmd() cmd.id = self.id apiclient.deleteSnapshotPolicies(cmd) return @classmethod def list(cls, apiclient, **kwargs): """Lists snapshot policies.""" cmd = listSnapshotPolicies.listSnapshotPoliciesCmd() [setattr(cmd, k, v) for k, v in kwargs.items()] return(apiclient.listSnapshotPolicies(cmd)) class LoadBalancerRule: """Manage Load Balancer rule""" def __init__(self, items): self.__dict__.update(items) @classmethod def create(cls, apiclient, services, ipaddressid=None, accountid=None, networkid=None, projectid=None, domainid=None): """Create Load balancing Rule""" cmd = createLoadBalancerRule.createLoadBalancerRuleCmd() if ipaddressid: cmd.publicipid = ipaddressid elif "ipaddressid" in services: cmd.publicipid = services["ipaddressid"] if accountid: cmd.account = accountid elif "account" in services: cmd.account = services["account"] if domainid: cmd.domainid = domainid cmd.name = services["name"] cmd.algorithm = services["alg"] cmd.privateport = services["privateport"] cmd.publicport = services["publicport"] if "openfirewall" in services: cmd.openfirewall = services["openfirewall"] if projectid: cmd.projectid = projectid if networkid: cmd.networkid = networkid return LoadBalancerRule(apiclient.createLoadBalancerRule(cmd).__dict__) def delete(self, apiclient): """Delete load balancing rule""" cmd = deleteLoadBalancerRule.deleteLoadBalancerRuleCmd() cmd.id = self.id apiclient.deleteLoadBalancerRule(cmd) return def assign(self, apiclient, vms): """Assign virtual machines to load balancing rule""" cmd = assignToLoadBalancerRule.assignToLoadBalancerRuleCmd() cmd.id = self.id cmd.virtualmachineids = [str(vm.id) for vm in vms] apiclient.assignToLoadBalancerRule(cmd) return def remove(self, apiclient, vms): """Remove virtual machines from load balancing rule""" cmd = removeFromLoadBalancerRule.removeFromLoadBalancerRuleCmd() cmd.id = self.id cmd.virtualmachineids = [str(vm.id) for vm in vms] apiclient.removeFromLoadBalancerRule(cmd) return def update(self, apiclient, algorithm=None, description=None, name=None): """Updates the load balancing rule""" cmd = updateLoadBalancerRule.updateLoadBalancerRuleCmd() cmd.id = self.id if algorithm: cmd.algorithm = algorithm if description: cmd.description = description if name: cmd.name = name return apiclient.updateLoadBalancerRule(cmd) @classmethod def list(cls, apiclient, **kwargs): """List all Load balancing rules matching criteria""" cmd = listLoadBalancerRules.listLoadBalancerRulesCmd() [setattr(cmd, k, v) for k, v in kwargs.items()] return(apiclient.listLoadBalancerRules(cmd)) class Cluster: """Manage Cluster life cycle""" def __init__(self, items): self.__dict__.update(items) @classmethod def create(cls, apiclient, services, zoneid=None, podid=None): """Create Cluster""" cmd = addCluster.addClusterCmd() cmd.clustertype = services["clustertype"] cmd.hypervisor = services["hypervisor"] if zoneid: cmd.zoneid = zoneid else: cmd.zoneid = services["zoneid"] if podid: cmd.podid = podid else: cmd.podid = services["podid"] if "username" in services: cmd.username = services["username"] if "password" in services: cmd.password = services["password"] if "url" in services: cmd.url = services["url"] if "clustername" in services: cmd.clustername = services["clustername"] return Cluster(apiclient.addCluster(cmd)[0].__dict__) def delete(self, apiclient): """Delete Cluster""" cmd = deleteCluster.deleteClusterCmd() cmd.id = self.id apiclient.deleteCluster(cmd) return @classmethod def list(cls, apiclient, **kwargs): """List all Clusters matching criteria""" cmd = listClusters.listClustersCmd() [setattr(cmd, k, v) for k, v in kwargs.items()] return(apiclient.listClusters(cmd)) class Host: """Manage Host life cycle""" def __init__(self, items): self.__dict__.update(items) @classmethod def create(cls, apiclient, cluster, services, zoneid=None, podid=None): """Create Host in cluster""" cmd = addHost.addHostCmd() cmd.hypervisor = services["hypervisor"] cmd.url = services["url"] cmd.clusterid = cluster.id if zoneid: cmd.zoneid = zoneid else: cmd.zoneid = services["zoneid"] if podid: cmd.podid = podid else: cmd.podid = services["podid"] if "clustertype" in services: cmd.clustertype = services["clustertype"] if "username" in services: cmd.username = services["username"] if "password" in services: cmd.password = services["password"] # Add host host = apiclient.addHost(cmd) if isinstance(host, list): return Host(host[0].__dict__) def delete(self, apiclient): """Delete Host""" # Host must be in maintenance mode before deletion cmd = prepareHostForMaintenance.prepareHostForMaintenanceCmd() cmd.id = self.id apiclient.prepareHostForMaintenance(cmd) time.sleep(30) cmd = deleteHost.deleteHostCmd() cmd.id = self.id apiclient.deleteHost(cmd) return def enableMaintenance(self, apiclient): """enables maintainance mode Host""" cmd = prepareHostForMaintenance.prepareHostForMaintenanceCmd() cmd.id = self.id return apiclient.prepareHostForMaintenance(cmd) @classmethod def list(cls, apiclient, **kwargs): """List all Hosts matching criteria""" cmd = listHosts.listHostsCmd() [setattr(cmd, k, v) for k, v in kwargs.items()] return(apiclient.listHosts(cmd)) class StoragePool: """Manage Storage pools (Primary Storage)""" def __init__(self, items): self.__dict__.update(items) @classmethod def create(cls, apiclient, services, clusterid=None, zoneid=None, podid=None): """Create Storage pool (Primary Storage)""" cmd = createStoragePool.createStoragePoolCmd() cmd.name = services["name"] if podid: cmd.podid = podid else: cmd.podid = services["podid"] cmd.url = services["url"] if clusterid: cmd.clusterid = clusterid elif "clusterid" in services: cmd.clusterid = services["clusterid"] if zoneid: cmd.zoneid = zoneid else: cmd.zoneid = services["zoneid"] return StoragePool(apiclient.createStoragePool(cmd).__dict__) def delete(self, apiclient): """Delete Storage pool (Primary Storage)""" # Storage pool must be in maintenance mode before deletion cmd = enableStorageMaintenance.enableStorageMaintenanceCmd() cmd.id = self.id apiclient.enableStorageMaintenance(cmd) time.sleep(30) cmd = deleteStoragePool.deleteStoragePoolCmd() cmd.id = self.id apiclient.deleteStoragePool(cmd) return def enableMaintenance(self, apiclient): """enables maintainance mode Storage pool""" cmd = enableStorageMaintenance.enableStorageMaintenanceCmd() cmd.id = self.id return apiclient.enableStorageMaintenance(cmd) @classmethod def list(cls, apiclient, **kwargs): """List all storage pools matching criteria""" cmd = listStoragePools.listStoragePoolsCmd() [setattr(cmd, k, v) for k, v in kwargs.items()] return(apiclient.listStoragePools(cmd)) class Network: """Manage Network pools""" def __init__(self, items): self.__dict__.update(items) @classmethod def create(cls, apiclient, services, accountid=None, domainid=None, networkofferingid=None, projectid=None, zoneid=None): """Create Network for account""" cmd = createNetwork.createNetworkCmd() cmd.name = services["name"] cmd.displaytext = services["displaytext"] if networkofferingid: cmd.networkofferingid = networkofferingid elif "networkoffering" in services: cmd.networkofferingid = services["networkoffering"] if zoneid: cmd.zoneid = zoneid elif "zoneid" in services: cmd.zoneid = services["zoneid"] if "gateway" in services: cmd.gateway = services["gateway"] if "netmask" in services: cmd.netmask = services["netmask"] if "startip" in services: cmd.startip = services["startip"] if "endip" in services: cmd.endip = services["endip"] if "vlan" in services: cmd.vlan = services["vlan"] if "acltype" in services: cmd.acltype = services["acltype"] if accountid: cmd.account = accountid if domainid: cmd.domainid = domainid if projectid: cmd.projectid = projectid return Network(apiclient.createNetwork(cmd).__dict__) def delete(self, apiclient): """Delete Account""" cmd = deleteNetwork.deleteNetworkCmd() cmd.id = self.id apiclient.deleteNetwork(cmd) def update(self, apiclient, **kwargs): """Updates network with parameters passed""" cmd = updateNetwork.updateNetworkCmd() cmd.id = self.id [setattr(cmd, k, v) for k, v in kwargs.items()] return(apiclient.updateNetwork(cmd)) @classmethod def list(cls, apiclient, **kwargs): """List all Networks matching criteria""" cmd = listNetworks.listNetworksCmd() [setattr(cmd, k, v) for k, v in kwargs.items()] return(apiclient.listNetworks(cmd)) class Vpn: """Manage VPN life cycle""" def __init__(self, items): self.__dict__.update(items) @classmethod def create(cls, apiclient, publicipid, account=None, domainid=None, projectid=None): """Create VPN for Public IP address""" cmd = createRemoteAccessVpn.createRemoteAccessVpnCmd() cmd.publicipid = publicipid if account: cmd.account = account if domainid: cmd.domainid = domainid if projectid: cmd.projectid = projectid return Vpn(apiclient.createRemoteAccessVpn(cmd).__dict__) def delete(self, apiclient): """Delete remote VPN access""" cmd = deleteRemoteAccessVpn.deleteRemoteAccessVpnCmd() cmd.publicipid = self.publicipid apiclient.deleteRemoteAccessVpn(cmd) @classmethod def list(cls, apiclient, **kwargs): """List all VPN matching criteria""" cmd = listRemoteAccessVpns.listRemoteAccessVpnsCmd() [setattr(cmd, k, v) for k, v in kwargs.items()] return(apiclient.listRemoteAccessVpns(cmd)) class VpnUser: """Manage VPN user""" def __init__(self, items): self.__dict__.update(items) @classmethod def create(cls, apiclient, username, password, account=None, domainid=None, projectid=None): """Create VPN user""" cmd = addVpnUser.addVpnUserCmd() cmd.username = username cmd.password = password if account: cmd.account = account if domainid: cmd.domainid = domainid if projectid: cmd.projectid = projectid return VpnUser(apiclient.addVpnUser(cmd).__dict__) def delete(self, apiclient): """Remove VPN user""" cmd = removeVpnUser.removeVpnUserCmd() cmd.username = self.username cmd.account = self.account cmd.domainid = self.domainid apiclient.removeVpnUser(cmd) @classmethod def list(cls, apiclient, **kwargs): """List all VPN Users matching criteria""" cmd = listVpnUsers.listVpnUsersCmd() [setattr(cmd, k, v) for k, v in kwargs.items()] return(apiclient.listVpnUsers(cmd)) class Zone: """Manage Zone""" def __init__(self, items): self.__dict__.update(items) @classmethod def create(cls, apiclient, services, domainid=None): """Create zone""" cmd = createZone.createZoneCmd() cmd.dns1 = services["dns1"] cmd.internaldns1 = services["internaldns1"] cmd.name = services["name"] cmd.networktype = services["networktype"] if "dns2" in services: cmd.dns2 = services["dns2"] if "internaldns2" in services: cmd.internaldns2 = services["internaldns2"] if domainid: cmd.domainid = domainid return Zone(apiclient.createZone(cmd).__dict__) def delete(self, apiclient): """Delete Zone""" cmd = deleteZone.deleteZoneCmd() cmd.id = self.id apiclient.deleteZone(cmd) def update(self, apiclient, **kwargs): """Update the zone""" cmd = updateZone.updateZoneCmd() cmd.id = self.id [setattr(cmd, k, v) for k, v in kwargs.items()] return apiclient.updateZone(cmd) @classmethod def list(cls, apiclient, **kwargs): """List all Zones matching criteria""" cmd = listZones.listZonesCmd() [setattr(cmd, k, v) for k, v in kwargs.items()] return(apiclient.listZones(cmd)) class Pod: """Manage Pod""" def __init__(self, items): self.__dict__.update(items) @classmethod def create(cls, apiclient, services): """Create Pod""" cmd = createPod.createPodCmd() cmd.gateway = services["gateway"] cmd.netmask = services["netmask"] cmd.name = services["name"] cmd.startip = services["startip"] cmd.endip = services["endip"] cmd.zoneid = services["zoneid"] return Pod(apiclient.createPod(cmd).__dict__) def delete(self, apiclient): """Delete Pod""" cmd = deletePod.deletePodCmd() cmd.id = self.id apiclient.deletePod(cmd) @classmethod def list(cls, apiclient, **kwargs): "Returns a default pod for specified zone" cmd = listPods.listPodsCmd() [setattr(cmd, k, v) for k, v in kwargs.items()] return apiclient.listPods(cmd) class PublicIpRange: """Manage VlanIpRange""" def __init__(self, items): self.__dict__.update(items) @classmethod def create(cls, apiclient, services): """Create VlanIpRange""" cmd = createVlanIpRange.createVlanIpRangeCmd() cmd.gateway = services["gateway"] cmd.netmask = services["netmask"] cmd.forvirtualnetwork = services["forvirtualnetwork"] cmd.startip = services["startip"] cmd.endip = services["endip"] cmd.zoneid = services["zoneid"] cmd.podid = services["podid"] cmd.vlan = services["vlan"] return PublicIpRange(apiclient.createVlanIpRange(cmd).__dict__) def delete(self, apiclient): """Delete VlanIpRange""" cmd = deleteVlanIpRange.deleteVlanIpRangeCmd() cmd.id = self.id apiclient.deleteVlanIpRange(cmd) @classmethod def list(cls, apiclient, **kwargs): """Lists all VLAN IP ranges.""" cmd = listVlanIpRanges.listVlanIpRangesCmd() [setattr(cmd, k, v) for k, v in kwargs.items()] return(apiclient.listVlanIpRanges(cmd)) class SecondaryStorage: """Manage Secondary storage""" def __init__(self, items): self.__dict__.update(items) @classmethod def create(cls, apiclient, services): """Create Secondary Storage""" cmd = addSecondaryStorage.addSecondaryStorageCmd() cmd.url = services["url"] if "zoneid" in services: cmd.zoneid = services["zoneid"] return SecondaryStorage(apiclient.addSecondaryStorage(cmd).__dict__) def delete(self, apiclient): """Delete Secondary Storage""" cmd = deleteHost.deleteHostCmd() cmd.id = self.id apiclient.deleteHost(cmd) class PhysicalNetwork: """Manage physical network storage""" def __init__(self, items): self.__dict__.update(items) @classmethod def create(cls, apiclient, services, zoneid, domainid=None): """Create physical network""" cmd = createPhysicalNetwork.createPhysicalNetworkCmd() cmd.name = services["name"] cmd.zoneid = zoneid if domainid: cmd.domainid = domainid return PhysicalNetwork(apiclient.createPhysicalNetwork(cmd).__dict__) def delete(self, apiclient): """Delete Physical Network""" cmd = deletePhysicalNetwork.deletePhysicalNetworkCmd() cmd.id = self.id apiclient.deletePhysicalNetwork(cmd) def update(self, apiclient, **kwargs): """Update Physical network state""" cmd = updatePhysicalNetwork.updatePhysicalNetworkCmd() cmd.id = self.id [setattr(cmd, k, v) for k, v in kwargs.items()] return apiclient.updatePhysicalNetwork(cmd) def addTrafficType(self, apiclient, type): """Add Traffic type to Physical network""" cmd = addTrafficType.addTrafficTypeCmd() cmd.physicalnetworkid = self.id cmd.traffictype = type return apiclient.addTrafficType(cmd) @classmethod def list(cls, apiclient, **kwargs): """Lists all physical networks""" cmd = listPhysicalNetworks.listPhysicalNetworksCmd() [setattr(cmd, k, v) for k, v in kwargs.items()] return(apiclient.listPhysicalNetworks(cmd)) class SecurityGroup: """Manage Security Groups""" def __init__(self, items): self.__dict__.update(items) @classmethod def create(cls, apiclient, services, account=None, domainid=None, description=None, projectid=None): """Create security group""" cmd = createSecurityGroup.createSecurityGroupCmd() cmd.name = services["name"] if account: cmd.account = account if domainid: cmd.domainid = domainid if description: cmd.description = description if projectid: cmd.projectid = projectid return SecurityGroup(apiclient.createSecurityGroup(cmd).__dict__) def delete(self, apiclient): """Delete Security Group""" cmd = deleteSecurityGroup.deleteSecurityGroupCmd() cmd.id = self.id apiclient.deleteSecurityGroup(cmd) def authorize(self, apiclient, services, account=None, domainid=None, projectid=None): """Authorize Ingress Rule""" cmd = authorizeSecurityGroupIngress.authorizeSecurityGroupIngressCmd() if domainid: cmd.domainid = domainid if account: cmd.account = account if projectid: cmd.projectid = projectid cmd.securitygroupid = self.id cmd.protocol = services["protocol"] if services["protocol"] == 'ICMP': cmd.icmptype = -1 cmd.icmpcode = -1 else: cmd.startport = services["startport"] cmd.endport = services["endport"] cmd.cidrlist = services["cidrlist"] return (apiclient.authorizeSecurityGroupIngress(cmd).__dict__) def revoke(self, apiclient, id): """Revoke ingress rule""" cmd = revokeSecurityGroupIngress.revokeSecurityGroupIngressCmd() cmd.id = id return apiclient.revokeSecurityGroupIngress(cmd) def authorizeEgress(self, apiclient, services, account=None, domainid=None, projectid=None, user_secgrp_list={}): """Authorize Egress Rule""" cmd = authorizeSecurityGroupEgress.authorizeSecurityGroupEgressCmd() if domainid: cmd.domainid = domainid if account: cmd.account = account if projectid: cmd.projectid = projectid cmd.securitygroupid = self.id cmd.protocol = services["protocol"] if services["protocol"] == 'ICMP': cmd.icmptype = -1 cmd.icmpcode = -1 else: cmd.startport = services["startport"] cmd.endport = services["endport"] cmd.cidrlist = services["cidrlist"] cmd.usersecuritygrouplist = [] for account, group in user_secgrp_list.items(): cmd.usersecuritygrouplist.append({ 'account': account, 'group': group }) return (apiclient.authorizeSecurityGroupEgress(cmd).__dict__) def revokeEgress(self, apiclient, id): """Revoke Egress rule""" cmd = revokeSecurityGroupEgress.revokeSecurityGroupEgressCmd() cmd.id = id return apiclient.revokeSecurityGroupEgress(cmd) @classmethod def list(cls, apiclient, **kwargs): """Lists all security groups.""" cmd = listSecurityGroups.listSecurityGroupsCmd() [setattr(cmd, k, v) for k, v in kwargs.items()] return(apiclient.listSecurityGroups(cmd)) class Project: """Manage Project life cycle""" def __init__(self, items): self.__dict__.update(items) @classmethod def create(cls, apiclient, services, account=None, domainid=None): """Create project""" cmd = createProject.createProjectCmd() cmd.displaytext = services["displaytext"] cmd.name = "-".join([services["name"], random_gen()]) if account: cmd.account = account if domainid: cmd.domainid = domainid return Project(apiclient.createProject(cmd).__dict__) def delete(self, apiclient): """Delete Project""" cmd = deleteProject.deleteProjectCmd() cmd.id = self.id apiclient.deleteProject(cmd) def update(self, apiclient, **kwargs): """Updates the project""" cmd = updateProject.updateProjectCmd() cmd.id = self.id [setattr(cmd, k, v) for k, v in kwargs.items()] return apiclient.updateProject(cmd) def activate(self, apiclient): """Activates the suspended project""" cmd = activateProject.activateProjectCmd() cmd.id = self.id return apiclient.activateProject(cmd) def suspend(self, apiclient): """Suspend the active project""" cmd = suspendProject.suspendProjectCmd() cmd.id = self.id return apiclient.suspendProject(cmd) def addAccount(self, apiclient, account=None, email=None): """Add account to project""" cmd = addAccountToProject.addAccountToProjectCmd() cmd.projectid = self.id if account: cmd.account = account if email: cmd.email = email return apiclient.addAccountToProject(cmd) def deleteAccount(self, apiclient, account): """Delete account from project""" cmd = deleteAccountFromProject.deleteAccountFromProjectCmd() cmd.projectid = self.id cmd.account = account return apiclient.deleteAccountFromProject(cmd) @classmethod def listAccounts(cls, apiclient, **kwargs): """Lists all accounts associated with projects.""" cmd = listProjectAccounts.listProjectAccountsCmd() [setattr(cmd, k, v) for k, v in kwargs.items()] return(apiclient.listProjectAccounts(cmd)) @classmethod def list(cls, apiclient, **kwargs): """Lists all projects.""" cmd = listProjects.listProjectsCmd() [setattr(cmd, k, v) for k, v in kwargs.items()] return(apiclient.listProjects(cmd)) class ProjectInvitation: """Manage project invitations""" def __init__(self, items): self.__dict__.update(items) @classmethod def update(cls, apiclient, projectid, accept, account=None, token=None): """Updates the project invitation for that account""" cmd = updateProjectInvitation.updateProjectInvitationCmd() cmd.projectid = projectid cmd.accept = accept if account: cmd.account = account if token: cmd.token = token return (apiclient.updateProjectInvitation(cmd).__dict__) def delete(self, apiclient, id): """Deletes the project invitation""" cmd = deleteProjectInvitation.deleteProjectInvitationCmd() cmd.id = id return apiclient.deleteProjectInvitation(cmd) @classmethod def list(cls, apiclient, **kwargs): """Lists project invitations""" cmd = listProjectInvitations.listProjectInvitationsCmd() [setattr(cmd, k, v) for k, v in kwargs.items()] return(apiclient.listProjectInvitations(cmd)) class Configurations: """Manage Configuration""" @classmethod def update(cls, apiclient, name, value=None): """Updates the specified configuration""" cmd = updateConfiguration.updateConfigurationCmd() cmd.name = name cmd.value = value apiclient.updateConfiguration(cmd) @classmethod def list(cls, apiclient, **kwargs): """Lists configurations""" cmd = listConfigurations.listConfigurationsCmd() [setattr(cmd, k, v) for k, v in kwargs.items()] return(apiclient.listConfigurations(cmd)) class NetScaler: """Manage external netscaler device""" def __init__(self, items): self.__dict__.update(items) @classmethod def add(cls, apiclient, services, physicalnetworkid, username=None, password=None): """Add external netscaler device to cloudstack""" cmd = addNetscalerLoadBalancer.addNetscalerLoadBalancerCmd() cmd.physicalnetworkid = physicalnetworkid if username: cmd.username = username else: cmd.username = services["username"] if password: cmd.password = password else: cmd.password = services["password"] cmd.networkdevicetype = services["networkdevicetype"] # Generate the URL url = 'https://' + str(services["ipaddress"]) + '?' url = url + 'publicinterface=' + str(services["publicinterface"]) + '&' url = url + 'privateinterface=' + str(services["privateinterface"]) + '&' url = url + 'numretries=' + str(services["numretries"]) + '&' if not services["lbdevicededicated"] and "lbdevicecapacity" in services: url = url + 'lbdevicecapacity=' + str(services["lbdevicecapacity"]) + '&' url = url + 'lbdevicededicated=' + str(services["lbdevicededicated"]) cmd.url = url return NetScaler(apiclient.addNetscalerLoadBalancer(cmd).__dict__) def delete(self, apiclient): """Deletes a netscaler device from CloudStack""" cmd = deleteNetscalerLoadBalancer.deleteNetscalerLoadBalancerCmd() cmd.lbdeviceid = self.lbdeviceid apiclient.deleteNetscalerLoadBalancer(cmd) return def configure(self, apiclient, **kwargs): """List already registered netscaler devices""" cmd = configureNetscalerLoadBalancer.configureNetscalerLoadBalancerCmd() cmd.lbdeviceid = self.lbdeviceid [setattr(cmd, k, v) for k, v in kwargs.items()] return(apiclient.configureNetscalerLoadBalancer(cmd)) @classmethod def list(cls, apiclient, **kwargs): """List already registered netscaler devices""" cmd = listNetscalerLoadBalancers.listNetscalerLoadBalancersCmd() [setattr(cmd, k, v) for k, v in kwargs.items()] return(apiclient.listNetscalerLoadBalancers(cmd)) class NetworkServiceProvider: """Manage network serivce providers for CloudStack""" def __init__(self, items): self.__dict__.update(items) @classmethod def add(cls, apiclient, name, physicalnetworkid, servicelist): """Adds network service provider""" cmd = addNetworkServiceProvider.addNetworkServiceProviderCmd() cmd.name = name cmd.physicalnetworkid = physicalnetworkid cmd.servicelist = servicelist return NetworkServiceProvider(apiclient.addNetworkServiceProvider(cmd).__dict__) def delete(self, apiclient): """Deletes network service provider""" cmd = deleteNetworkServiceProvider.deleteNetworkServiceProviderCmd() cmd.id = self.id return apiclient.deleteNetworkServiceProvider(cmd) def update(self, apiclient, **kwargs): """Updates network service provider""" cmd = updateNetworkServiceProvider.updateNetworkServiceProviderCmd() cmd.id = self.id [setattr(cmd, k, v) for k, v in kwargs.items()] return apiclient.updateNetworkServiceProvider(cmd) @classmethod def update(cls, apiclient, id, **kwargs): """Updates network service provider""" cmd = updateNetworkServiceProvider.updateNetworkServiceProviderCmd() cmd.id = id [setattr(cmd, k, v) for k, v in kwargs.items()] return apiclient.updateNetworkServiceProvider(cmd) @classmethod def list(cls, apiclient, **kwargs): """List network service providers""" cmd = listNetworkServiceProviders.listNetworkServiceProvidersCmd() [setattr(cmd, k, v) for k, v in kwargs.items()] return(apiclient.listNetworkServiceProviders(cmd))