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)

Reply via email to