Repository: libcloud Updated Branches: refs/heads/trunk 0e7454d2f -> 330c2563e
LIBCLOUD-590 - Reduce redundant API calls of CloudStack compute driver's list_nodes method Signed-off-by: Sebastien Goasguen <[email protected]> This closes #641 Project: http://git-wip-us.apache.org/repos/asf/libcloud/repo Commit: http://git-wip-us.apache.org/repos/asf/libcloud/commit/330c2563 Tree: http://git-wip-us.apache.org/repos/asf/libcloud/tree/330c2563 Diff: http://git-wip-us.apache.org/repos/asf/libcloud/diff/330c2563 Branch: refs/heads/trunk Commit: 330c2563e306b501f0fc039d06ccfc7baf198ff5 Parents: 0e7454d Author: Atsushi Sasaki <[email protected]> Authored: Mon Jun 30 23:26:48 2014 +0900 Committer: Sebastien Goasguen <[email protected]> Committed: Wed Nov 25 11:45:10 2015 +0100 ---------------------------------------------------------------------- CHANGES.rst | 4 ++++ libcloud/compute/drivers/cloudstack.py | 22 ++++++++++++-------- .../ktucloud/listIpForwardingRules_default.json | 1 + libcloud/test/compute/test_cloudstack.py | 9 ++++++++ 4 files changed, 27 insertions(+), 9 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/libcloud/blob/330c2563/CHANGES.rst ---------------------------------------------------------------------- diff --git a/CHANGES.rst b/CHANGES.rst index 7d10c12..ac7e14d 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -70,6 +70,10 @@ Compute [LIBCLOUD-771, GITHUB-635] [Joel Reymont] +- Reduce redundant API calls in CloudStack driver + [LIBCLOUD-590, GITHUB-641] + [Atsushi Sasaki] + Storage ~~~~~~~ http://git-wip-us.apache.org/repos/asf/libcloud/blob/330c2563/libcloud/compute/drivers/cloudstack.py ---------------------------------------------------------------------- diff --git a/libcloud/compute/drivers/cloudstack.py b/libcloud/compute/drivers/cloudstack.py index 73c316f..572c21d 100644 --- a/libcloud/compute/drivers/cloudstack.py +++ b/libcloud/compute/drivers/cloudstack.py @@ -1363,6 +1363,8 @@ class CloudStackNodeDriver(CloudStackDriverMixIn, NodeDriver): args['projectid'] = project.id vms = self._sync_request('listVirtualMachines', params=args) addrs = self._sync_request('listPublicIpAddresses', params=args) + port_forwarding_rules = self._sync_request('listPortForwardingRules') + ip_forwarding_rules = self._sync_request('listIpForwardingRules') public_ips_map = {} for addr in addrs.get('publicipaddress', []): @@ -1380,14 +1382,15 @@ class CloudStackNodeDriver(CloudStackDriverMixIn, NodeDriver): public_ips = list(public_ips) node = self._to_node(data=vm, public_ips=public_ips) - addresses = public_ips_map.get(vm['id'], {}).items() - addresses = [CloudStackAddress(node, v, k) for k, v in addresses] + addresses = public_ips_map.get(str(vm['id']), {}).items() + addresses = [CloudStackAddress(id=address_id, address=address, + driver=node.driver) for + address, address_id in addresses] node.extra['ip_addresses'] = addresses rules = [] for addr in addresses: - result = self._sync_request('listIpForwardingRules') - for r in result.get('ipforwardingrule', []): + for r in ip_forwarding_rules.get('ipforwardingrule', []): if str(r['virtualmachineid']) == node.id: rule = CloudStackIPForwardingRule(node, r['id'], addr, @@ -1399,12 +1402,13 @@ class CloudStackNodeDriver(CloudStackDriverMixIn, NodeDriver): node.extra['ip_forwarding_rules'] = rules rules = [] - public_ips = self.ex_list_public_ips() - result = self._sync_request('listPortForwardingRules') - for r in result.get('portforwardingrule', []): + for r in port_forwarding_rules.get('portforwardingrule', []): if str(r['virtualmachineid']) == node.id: - addr = [a for a in public_ips if - a.address == r['ipaddress']] + addr = [CloudStackAddress(id=a['id'], + address=a['ipaddress'], + driver=node.driver) + for a in addrs.get('publicipaddress', []) + if a['ipaddress'] == r['ipaddress']] rule = CloudStackPortForwardingRule(node, r['id'], addr[0], r['protocol'].upper(), http://git-wip-us.apache.org/repos/asf/libcloud/blob/330c2563/libcloud/test/compute/fixtures/ktucloud/listIpForwardingRules_default.json ---------------------------------------------------------------------- diff --git a/libcloud/test/compute/fixtures/ktucloud/listIpForwardingRules_default.json b/libcloud/test/compute/fixtures/ktucloud/listIpForwardingRules_default.json new file mode 100644 index 0000000..20fbc42 --- /dev/null +++ b/libcloud/test/compute/fixtures/ktucloud/listIpForwardingRules_default.json @@ -0,0 +1 @@ +{ "listipforwardingrulesresponse" : { "count":1 ,"ipforwardingrule" : [ {"id":"772fd410-6649-43ed-befa-77be986b8906","protocol":"tcp","virtualmachineid":"2600","virtualmachinename":"test","virtualmachinedisplayname":"test","ipaddressid":34000,"ipaddress":"1.1.1.116","startport":33,"endport":34,"state":"Active"} ] } } http://git-wip-us.apache.org/repos/asf/libcloud/blob/330c2563/libcloud/test/compute/test_cloudstack.py ---------------------------------------------------------------------- diff --git a/libcloud/test/compute/test_cloudstack.py b/libcloud/test/compute/test_cloudstack.py index a0cb898..9f6b939 100644 --- a/libcloud/test/compute/test_cloudstack.py +++ b/libcloud/test/compute/test_cloudstack.py @@ -581,10 +581,19 @@ class CloudStackCommonTestCase(TestCaseMixin): self.assertEqual(2, len(nodes)) self.assertEqual('test', nodes[0].name) self.assertEqual('2600', nodes[0].id) + self.assertEqual(0, len(nodes[0].private_ips)) self.assertEqual([], nodes[0].extra['security_group']) self.assertEqual(None, nodes[0].extra['key_name']) self.assertEqual(1, len(nodes[0].public_ips)) self.assertEqual('1.1.1.116', nodes[0].public_ips[0]) + self.assertEqual(1, len(nodes[0].extra['ip_addresses'])) + self.assertEqual(34000, nodes[0].extra['ip_addresses'][0].id) + self.assertEqual(1, len(nodes[0].extra['ip_forwarding_rules'])) + self.assertEqual('772fd410-6649-43ed-befa-77be986b8906', + nodes[0].extra['ip_forwarding_rules'][0].id) + self.assertEqual(1, len(nodes[0].extra['port_forwarding_rules'])) + self.assertEqual('bc7ea3ee-a2c3-4b86-a53f-01bdaa1b2e32', + nodes[0].extra['port_forwarding_rules'][0].id) def test_ex_get_node(self): node = self.driver.ex_get_node(2600)
