Updated Branches: refs/heads/trunk dd4df811c -> 16cc10e83
Fix CloudStack drivers _async_request and _sync_request calls Signed-off-by: Tomaz Muraus <[email protected]> Project: http://git-wip-us.apache.org/repos/asf/libcloud/repo Commit: http://git-wip-us.apache.org/repos/asf/libcloud/commit/16cc10e8 Tree: http://git-wip-us.apache.org/repos/asf/libcloud/tree/16cc10e8 Diff: http://git-wip-us.apache.org/repos/asf/libcloud/diff/16cc10e8 Branch: refs/heads/trunk Commit: 16cc10e837d8000acfeb8397c56b56753a81d1b0 Parents: b23d908 Author: Philipp Strube <[email protected]> Authored: Wed Nov 20 14:52:26 2013 +0100 Committer: Tomaz Muraus <[email protected]> Committed: Wed Nov 20 15:13:32 2013 +0100 ---------------------------------------------------------------------- libcloud/compute/drivers/cloudstack.py | 167 ++++++++++++++++------- libcloud/compute/drivers/ktucloud.py | 25 ++-- libcloud/loadbalancer/drivers/cloudstack.py | 53 ++++--- 3 files changed, 160 insertions(+), 85 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/libcloud/blob/16cc10e8/libcloud/compute/drivers/cloudstack.py ---------------------------------------------------------------------- diff --git a/libcloud/compute/drivers/cloudstack.py b/libcloud/compute/drivers/cloudstack.py index b5d14e4..f3cc884 100644 --- a/libcloud/compute/drivers/cloudstack.py +++ b/libcloud/compute/drivers/cloudstack.py @@ -263,7 +263,9 @@ class CloudStackNodeDriver(CloudStackDriverMixIn, NodeDriver): } if location is not None: args['zoneid'] = location.id - imgs = self._sync_request('listTemplates', **args) + imgs = self._sync_request(command='listTemplates', + params=args, + method='GET') images = [] for img in imgs.get('template', []): images.append(NodeImage( @@ -389,7 +391,8 @@ class CloudStackNodeDriver(CloudStackDriverMixIn, NodeDriver): """ :rtype ``list`` of :class:`NodeSize` """ - szs = self._sync_request('listServiceOfferings') + szs = self._sync_request(command='listServiceOfferings', + method='GET') sizes = [] for sz in szs['serviceoffering']: sizes.append(NodeSize(sz['id'], sz['name'], sz['memory'], 0, 0, @@ -420,8 +423,9 @@ class CloudStackNodeDriver(CloudStackDriverMixIn, NodeDriver): server_params = self._create_args_to_params(None, **kwargs) - node = self._async_request('deployVirtualMachine', - **server_params)['virtualmachine'] + node = self._async_request(command='deployVirtualMachine', + params=server_params, + method='GET')['virtualmachine'] public_ips = [] private_ips = [] for nic in node['nic']: @@ -511,7 +515,9 @@ class CloudStackNodeDriver(CloudStackDriverMixIn, NodeDriver): :rtype: ``bool`` """ - self._async_request('destroyVirtualMachine', id=node.id) + self._async_request(command='destroyVirtualMachine', + params={'id': node.id}, + method='GET') return True def reboot_node(self, node): @@ -521,7 +527,9 @@ class CloudStackNodeDriver(CloudStackDriverMixIn, NodeDriver): :rtype: ``bool`` """ - self._async_request('rebootVirtualMachine', id=node.id) + self._async_request(command='rebootVirtualMachine', + params={'id': node.id}, + method='GET') return True def ex_start(self, node): @@ -539,7 +547,9 @@ class CloudStackNodeDriver(CloudStackDriverMixIn, NodeDriver): :rtype ``str`` """ - res = self._async_request('startVirtualMachine', id=node.id) + res = self._async_request(command='startVirtualMachine', + params={'id': node.id}, + method='GET') return res['virtualmachine']['state'] def ex_stop(self, node): @@ -559,7 +569,9 @@ class CloudStackNodeDriver(CloudStackDriverMixIn, NodeDriver): :rtype ``str`` """ - res = self._async_request('stopVirtualMachine', id=node.id) + res = self._async_request(command='stopVirtualMachine', + params={'id': node.id}, + method='GET') return res['virtualmachine']['state'] def ex_list_disk_offerings(self): @@ -571,7 +583,8 @@ class CloudStackNodeDriver(CloudStackDriverMixIn, NodeDriver): diskOfferings = [] - diskOfferResponse = self._sync_request('listDiskOfferings') + diskOfferResponse = self._sync_request(command='listDiskOfferings', + method='GET') for diskOfferDict in diskOfferResponse.get('diskoffering', ()): diskOfferings.append( CloudStackDiskOffering( @@ -589,7 +602,8 @@ class CloudStackNodeDriver(CloudStackDriverMixIn, NodeDriver): :rtype ``list`` of :class:`CloudStackNetwork` """ - nets = self._sync_request('listNetworks')['network'] + nets = self._sync_request(command='listNetworks', + method='GET')['network'] networks = [] for net in nets: @@ -615,18 +629,19 @@ class CloudStackNodeDriver(CloudStackDriverMixIn, NodeDriver): raise LibcloudError( 'Disk offering with size=%s not found' % size) - extraParams = dict() - if diskOffering.customizable: - extraParams['size'] = size - if location is None: location = self.list_locations()[0] - requestResult = self._async_request('createVolume', - name=name, - diskOfferingId=diskOffering.id, - zoneId=location.id, - **extraParams) + params = {'name': name, + 'diskOfferingId': diskOffering.id, + 'zoneId': location.id} + + if diskOffering.customizable: + params['size'] = size + + requestResult = self._async_request(command='createVolume', + params=params, + method='GET') volumeResponse = requestResult['volume'] @@ -640,7 +655,9 @@ class CloudStackNodeDriver(CloudStackDriverMixIn, NodeDriver): """ :rtype: ``bool`` """ - self._sync_request('deleteVolume', id=volume.id) + self._sync_request(command='deleteVolume', + params={'id': volume.id}, + method='GET') return True def attach_volume(self, node, volume, device=None): @@ -651,15 +668,19 @@ class CloudStackNodeDriver(CloudStackDriverMixIn, NodeDriver): :rtype: ``bool`` """ # TODO Add handling for device name - self._async_request('attachVolume', id=volume.id, - virtualMachineId=node.id) + self._async_request(command='attachVolume', + params={'id': volume.id, + 'virtualMachineId': node.id}, + method='GET') return True def detach_volume(self, volume): """ :rtype: ``bool`` """ - self._async_request('detachVolume', id=volume.id) + self._async_request(command='detachVolume', + params={'id': volume.id}, + method='GET') return True def list_volumes(self, node=None): @@ -672,10 +693,12 @@ class CloudStackNodeDriver(CloudStackDriverMixIn, NodeDriver): :rtype: ``list`` of :class:`StorageVolume` """ if node: - volumes = self._sync_request('listVolumes', - virtualmachineid=node.id) + volumes = self._sync_request(command='listVolumes', + params={'virtualmachineid': node.id}, + method='GET') else: - volumes = self._sync_request('listVolumes') + volumes = self._sync_request(command='listVolumes', + method='GET') list_volumes = [] for vol in volumes['volume']: @@ -693,7 +716,8 @@ class CloudStackNodeDriver(CloudStackDriverMixIn, NodeDriver): """ ips = [] - res = self._sync_request('listPublicIpAddresses') + res = self._sync_request(command='listPublicIpAddresses', + method='GET') # Workaround for basic zones if not res: @@ -715,7 +739,9 @@ class CloudStackNodeDriver(CloudStackDriverMixIn, NodeDriver): if location is None: location = self.list_locations()[0] - addr = self._async_request('associateIpAddress', zoneid=location.id) + addr = self._async_request(command='associateIpAddress', + params={'zoneid': location.id}, + method='GET') addr = addr['ipaddress'] addr = CloudStackAddress(addr['id'], addr['ipaddress'], self) return addr @@ -729,7 +755,9 @@ class CloudStackNodeDriver(CloudStackDriverMixIn, NodeDriver): :rtype: ``bool`` """ - res = self._async_request('disassociateIpAddress', id=address.id) + res = self._async_request(command='disassociateIpAddress', + params={'id': address.id}, + method='GET') return res['success'] def ex_list_port_forwarding_rules(self): @@ -739,7 +767,8 @@ class CloudStackNodeDriver(CloudStackDriverMixIn, NodeDriver): :rtype: ``list`` of :class:`CloudStackPortForwardingRule` """ rules = [] - result = self._sync_request('listPortForwardingRules') + result = self._sync_request(command='listPortForwardingRules', + method='GET') if result != {}: public_ips = self.ex_list_public_ips() nodes = self.list_nodes() @@ -798,7 +827,9 @@ class CloudStackNodeDriver(CloudStackDriverMixIn, NodeDriver): if private_end_port: args['privateendport'] = int(private_end_port) - result = self._async_request('createPortForwardingRule', **args) + result = self._async_request(command='createPortForwardingRule', + params=args, + method='GET') rule = CloudStackPortForwardingRule(node, result['portforwardingrule'] ['id'], @@ -827,7 +858,9 @@ class CloudStackNodeDriver(CloudStackDriverMixIn, NodeDriver): node.extra['port_forwarding_rules'].remove(rule) node.public_ips.remove(rule.address.address) - res = self._async_request('deletePortForwardingRule', id=rule.id) + res = self._async_request(command='deletePortForwardingRule', + params={'id': rule.id}, + method='GET') return res['success'] def ex_add_ip_forwarding_rule(self, node, address, protocol, @@ -865,7 +898,9 @@ class CloudStackNodeDriver(CloudStackDriverMixIn, NodeDriver): if end_port is not None: args['endport'] = int(end_port) - result = self._async_request('createIpForwardingRule', **args) + result = self._async_request(command='createIpForwardingRule', + params=args, + method='GET') result = result['ipforwardingrule'] rule = CloudStackIPForwardingRule(node, result['id'], address, protocol, start_port, end_port) @@ -886,7 +921,9 @@ class CloudStackNodeDriver(CloudStackDriverMixIn, NodeDriver): """ node.extra['ip_forwarding_rules'].remove(rule) - self._async_request('deleteIpForwardingRule', id=rule.id) + self._async_request(command='deleteIpForwardingRule', + params={'id': rule.id}, + method='GET') return True def ex_list_keypairs(self, **kwargs): @@ -938,7 +975,9 @@ class CloudStackNodeDriver(CloudStackDriverMixIn, NodeDriver): """ extra_args = kwargs.copy() - res = self._sync_request('listSSHKeyPairs', **extra_args) + res = self._sync_request(command='listSSHKeyPairs', + params=extra_args, + method='GET') keypairs = res.get('sshkeypair', []) return keypairs @@ -971,7 +1010,12 @@ class CloudStackNodeDriver(CloudStackDriverMixIn, NodeDriver): raise LibcloudError('SSH KeyPair with name=%s already exists' % (name)) - res = self._sync_request('createSSHKeyPair', name=name, **extra_args) + params = {'name': name} + params.update(extra_args) + + res = self._sync_request(command='createSSHKeyPair', + params=params, + method='GET') return res['keypair'] def ex_delete_keypair(self, keypair, **kwargs): @@ -996,9 +1040,12 @@ class CloudStackNodeDriver(CloudStackDriverMixIn, NodeDriver): """ extra_args = kwargs.copy() + params = {'name': keypair} + params.update(extra_args) - res = self._sync_request('deleteSSHKeyPair', name=keypair, - **extra_args) + res = self._sync_request(command='deleteSSHKeyPair', + params=params, + method='GET') return res['success'] def ex_import_keypair_from_string(self, name, key_material): @@ -1013,8 +1060,10 @@ class CloudStackNodeDriver(CloudStackDriverMixIn, NodeDriver): :rtype: ``dict`` """ - res = self._sync_request('registerSSHKeyPair', name=name, - publickey=key_material) + res = self._sync_request(command='registerSSHKeyPair', + params={'name': name, + 'publickey': key_material}, + method='GET') return { 'keyName': res['keypair']['name'], 'keyFingerprint': res['keypair']['fingerprint'] @@ -1085,8 +1134,10 @@ class CloudStackNodeDriver(CloudStackDriverMixIn, NodeDriver): :rtype ``list`` """ - extra_args = kwargs - res = self._sync_request('listSecurityGroups', **extra_args) + extra_args = kwargs.copy() + res = self._sync_request(command='listSecurityGroups', + params=extra_args, + method='GET') security_groups = res.get('securitygroup', []) return security_groups @@ -1122,8 +1173,12 @@ class CloudStackNodeDriver(CloudStackDriverMixIn, NodeDriver): if name in sg['name']: raise LibcloudError('This Security Group name already exists') - return self._sync_request('createSecurityGroup', - name=name, **extra_args)['securitygroup'] + params = {'name': name} + params.update(extra_args) + + return self._sync_request(command='createSecurityGroup', + params=params, + method='GET')['securitygroup'] def ex_delete_security_group(self, name): """ @@ -1151,7 +1206,9 @@ class CloudStackNodeDriver(CloudStackDriverMixIn, NodeDriver): :rtype: ``bool`` """ - return self._sync_request('deleteSecurityGroup', name=name)['success'] + return self._sync_request(command='deleteSecurityGroup', + params={'name': name}, + method='GET')['success'] def ex_authorize_security_group_ingress(self, securitygroupname, protocol, cidrlist, startport, @@ -1218,8 +1275,9 @@ class CloudStackNodeDriver(CloudStackDriverMixIn, NodeDriver): if endport is None: args['endport'] = int(startport) - return self._async_request('authorizeSecurityGroupIngress', - **args)['securitygroup'] + return self._async_request(command='authorizeSecurityGroupIngress', + params=args, + method='GET')['securitygroup'] def ex_register_iso(self, name, url, location=None, **kwargs): """ @@ -1239,19 +1297,22 @@ class CloudStackNodeDriver(CloudStackDriverMixIn, NodeDriver): if location is None: location = self.list_locations()[0] - extra_args = {} - extra_args['bootable'] = kwargs.pop('bootable', False) - if extra_args['bootable']: + params = {'name': name, + 'displaytext': name, + 'url': url, + 'zoneid': location.id} + params['bootable'] = kwargs.pop('bootable', False) + if params['bootable']: os_type_id = kwargs.pop('ostypeid', None) if not os_type_id: raise LibcloudError('If bootable=True, ostypeid is required!') - extra_args['ostypeid'] = os_type_id + params['ostypeid'] = os_type_id - return self._sync_request('registerIso', + return self._sync_request(command='registerIso', name=name, displaytext=name, url=url, zoneid=location.id, - **extra_args) + params=params) http://git-wip-us.apache.org/repos/asf/libcloud/blob/16cc10e8/libcloud/compute/drivers/ktucloud.py ---------------------------------------------------------------------- diff --git a/libcloud/compute/drivers/ktucloud.py b/libcloud/compute/drivers/ktucloud.py index c635ed7..1bc8544 100644 --- a/libcloud/compute/drivers/ktucloud.py +++ b/libcloud/compute/drivers/ktucloud.py @@ -33,7 +33,8 @@ class KTUCloudNodeDriver(CloudStackNodeDriver): if location is not None: args['zoneid'] = location.id - imgs = self._sync_request('listAvailableProductTypes') + imgs = self._sync_request(command='listAvailableProductTypes', + method='GET') images = [] for img in imgs['producttypes']: @@ -66,24 +67,24 @@ class KTUCloudNodeDriver(CloudStackNodeDriver): return sizes def create_node(self, name, size, image, location=None, **kwargs): - extra_args = {} + params = {'displayname': name, + 'serviceofferingid': image.id, + 'templateid': str(image.extra['templateid']), + 'zoneid': str(image.extra['zoneid'])} + usageplantype = kwargs.pop('usageplantype', None) if usageplantype is None: - extra_args['usageplantype'] = 'hourly' + params['usageplantype'] = 'hourly' else: - extra_args['usageplantype'] = usageplantype + params['usageplantype'] = usageplantype if size.id != self.EMPTY_DISKOFFERINGID: - extra_args['diskofferingid'] = size.id + params['diskofferingid'] = size.id result = self._async_request( - 'deployVirtualMachine', - displayname=name, - serviceofferingid=image.id, - templateid=str(image.extra['templateid']), - zoneid=str(image.extra['zoneid']), - **extra_args - ) + command='deployVirtualMachine', + params=params, + method='GET') node = result['virtualmachine'] http://git-wip-us.apache.org/repos/asf/libcloud/blob/16cc10e8/libcloud/loadbalancer/drivers/cloudstack.py ---------------------------------------------------------------------- diff --git a/libcloud/loadbalancer/drivers/cloudstack.py b/libcloud/loadbalancer/drivers/cloudstack.py index dcec636..ee88824 100644 --- a/libcloud/loadbalancer/drivers/cloudstack.py +++ b/libcloud/loadbalancer/drivers/cloudstack.py @@ -70,12 +70,15 @@ class CloudStackLBDriver(CloudStackDriverMixIn, Driver): return ['tcp'] def list_balancers(self): - balancers = self._sync_request('listLoadBalancerRules') + balancers = self._sync_request(command='listLoadBalancerRules', + method='GET') balancers = balancers.get('loadbalancerrule', []) return [self._to_balancer(balancer) for balancer in balancers] def get_balancer(self, balancer_id): - balancer = self._sync_request('listLoadBalancerRules', id=balancer_id) + balancer = self._sync_request(command='listLoadBalancerRules', + params={'id': balancer_id}, + method='GET') balancer = balancer.get('loadbalancerrule', []) if not balancer: raise Exception("no such load balancer: " + str(balancer_id)) @@ -94,24 +97,26 @@ class CloudStackLBDriver(CloudStackDriverMixIn, Driver): :type private_port: ``int`` """ if location is None: - locations = self._sync_request('listZones') + locations = self._sync_request(command='listZones', method='GET') location = locations['zone'][0]['id'] else: location = location.id if private_port is None: private_port = port - result = self._async_request('associateIpAddress', zoneid=location) + result = self._async_request(command='associateIpAddress', + params={'zoneid': location}, + method='GET') public_ip = result['ipaddress'] result = self._sync_request( - 'createLoadBalancerRule', - algorithm=self._ALGORITHM_TO_VALUE_MAP[algorithm], - name=name, - privateport=private_port, - publicport=port, - publicipid=public_ip['id'], - ) + command='createLoadBalancerRule', + params={'algorithm': self._ALGORITHM_TO_VALUE_MAP[algorithm], + 'name': name, + 'privateport': private_port, + 'publicport': port, + 'publicipid': public_ip['id']}, + method='GET') balancer = self._to_balancer(result['loadbalancer']) @@ -121,24 +126,32 @@ class CloudStackLBDriver(CloudStackDriverMixIn, Driver): return balancer def destroy_balancer(self, balancer): - self._async_request('deleteLoadBalancerRule', id=balancer.id) - self._async_request('disassociateIpAddress', - id=balancer.ex_public_ip_id) + self._async_request(command='deleteLoadBalancerRule', + params={'id': balancer.id}, + method='GET') + self._async_request(command='disassociateIpAddress', + params={'id': balancer.ex_public_ip_id}, + method='GET') def balancer_attach_member(self, balancer, member): member.port = balancer.ex_private_port - self._async_request('assignToLoadBalancerRule', id=balancer.id, - virtualmachineids=member.id) + self._async_request(command='assignToLoadBalancerRule', + params={'id': balancer.id, + 'virtualmachineids': member.id}, + method='GET') return True def balancer_detach_member(self, balancer, member): - self._async_request('removeFromLoadBalancerRule', id=balancer.id, - virtualmachineids=member.id) + self._async_request(command='removeFromLoadBalancerRule', + params={'id': balancer.id, + 'virtualmachineids': member.id}, + method='GET') return True def balancer_list_members(self, balancer): - members = self._sync_request('listLoadBalancerRuleInstances', - id=balancer.id) + members = self._sync_request(command='listLoadBalancerRuleInstances', + params={'id': balancer.id}, + method='GET') members = members['loadbalancerruleinstance'] return [self._to_member(m, balancer.ex_private_port, balancer) for m in members]
