From df2b366593eb78e6eb08f8d9634c3902f691b0fe Mon Sep 17 00:00:00 2001 From: Gary Kotton Date: Thu, 30 Mar 2017 02:39:08 +0300 Subject: [PATCH] NSX|V: be able to deal with more than 256 edges Ensure that the admin utility can work when there are more than 256 edges deifned. The NSX api returns details that enable us to work with pagination. Change-Id: I1083875193d9d893d725c48d7c1434f064fef5b6 --- .../nsx_v/vshield/edge_appliance_driver.py | 17 ---------------- vmware_nsx/plugins/nsx_v/vshield/vcns.py | 20 +++++++++++++++++-- .../admin/plugins/nsxv/resources/utils.py | 3 +-- .../tests/unit/nsx_v/vshield/fake_vcns.py | 10 +--------- .../unit/nsx_v/vshield/test_vcns_driver.py | 10 ---------- 5 files changed, 20 insertions(+), 40 deletions(-) diff --git a/vmware_nsx/plugins/nsx_v/vshield/edge_appliance_driver.py b/vmware_nsx/plugins/nsx_v/vshield/edge_appliance_driver.py index 5c753e7c98..b37cf9681f 100644 --- a/vmware_nsx/plugins/nsx_v/vshield/edge_appliance_driver.py +++ b/vmware_nsx/plugins/nsx_v/vshield/edge_appliance_driver.py @@ -262,16 +262,6 @@ class EdgeApplianceDriver(object): return status_level - def get_edges_statuses(self): - edges_status_level = {} - edges = self._get_edges() - for edge in edges['edgePage'].get('data', []): - edge_id = edge['id'] - status = edge['edgeStatus'] - edges_status_level[edge_id] = self._edge_status_to_level(status) - - return edges_status_level - def get_interface(self, edge_id, vnic_index): # get vnic interface address groups try: @@ -372,13 +362,6 @@ class EdgeApplianceDriver(object): LOG.debug("Deletion complete vnic %(vnic_index)s: on edge %(edge_id)s", {'vnic_index': index, 'edge_id': edge_id}) - def _get_edges(self): - try: - return self.vcns.get_edges()[1] - except exceptions.VcnsApiException as e: - LOG.exception("VCNS: Failed to get edges:\n%s", e.response) - raise e - def deploy_edge(self, context, router_id, name, internal_network, dist=False, loadbalancer_enable=True, appliance_size=nsxv_constants.LARGE, diff --git a/vmware_nsx/plugins/nsx_v/vshield/vcns.py b/vmware_nsx/plugins/nsx_v/vshield/vcns.py index 82f91f634f..78c3293289 100644 --- a/vmware_nsx/plugins/nsx_v/vshield/vcns.py +++ b/vmware_nsx/plugins/nsx_v/vshield/vcns.py @@ -236,10 +236,26 @@ class Vcns(object): uri = "%s/%s" % (URI_PREFIX, edge_id) return self.do_request(HTTP_GET, uri, decode=True) - def get_edges(self): - uri = URI_PREFIX + def _get_edges(self, startindex=0): + uri = '%s?startIndex=%d' % (URI_PREFIX, startindex) return self.do_request(HTTP_GET, uri, decode=True) + def get_edges(self): + edges = [] + h, d = self._get_edges() + edges.extend(d['edgePage']['data']) + paging_info = d['edgePage']['pagingInfo'] + page_size = int(paging_info['pageSize']) + count = int(paging_info['totalCount']) + LOG.debug("There are total %s edges and page size is %s", + count, page_size) + pages = count / page_size + 1 + for i in range(1, pages): + start_index = page_size * i + h, d = self._get_edges(start_index) + edges.extend(d['edgePage']['data']) + return edges + def get_edge_syslog(self, edge_id): uri = "%s/%s/syslog/config" % (URI_PREFIX, edge_id) return self.do_request(HTTP_GET, uri, decode=True) diff --git a/vmware_nsx/shell/admin/plugins/nsxv/resources/utils.py b/vmware_nsx/shell/admin/plugins/nsxv/resources/utils.py index f57f7b6c22..450146c090 100644 --- a/vmware_nsx/shell/admin/plugins/nsxv/resources/utils.py +++ b/vmware_nsx/shell/admin/plugins/nsxv/resources/utils.py @@ -101,8 +101,7 @@ def get_nsxv_backend_edges(): """Get a list of all the backend edges and some of their attributes """ nsxv = get_nsxv_client() - edges = nsxv.get_edges()[1] - edges = edges['edgePage'].get('data', []) + edges = nsxv.get_edges() backend_edges = [] for edge in edges: # get all the relevant backend information for this edge diff --git a/vmware_nsx/tests/unit/nsx_v/vshield/fake_vcns.py b/vmware_nsx/tests/unit/nsx_v/vshield/fake_vcns.py index 10af0ab117..ef62873dfd 100644 --- a/vmware_nsx/tests/unit/nsx_v/vshield/fake_vcns.py +++ b/vmware_nsx/tests/unit/nsx_v/vshield/fake_vcns.py @@ -411,9 +411,6 @@ class FakeVcns(object): return (header, response) def get_edges(self): - header = { - 'status': 200 - } edges = [] for edge_id in self._edges: edges.append({ @@ -421,12 +418,7 @@ class FakeVcns(object): 'edgeStatus': 'GREEN', 'name': self._edges[edge_id]['name'] }) - response = { - 'edgePage': { - 'data': edges - } - } - return (header, response) + return edges def get_vdn_switch(self, dvs_id): header = { diff --git a/vmware_nsx/tests/unit/nsx_v/vshield/test_vcns_driver.py b/vmware_nsx/tests/unit/nsx_v/vshield/test_vcns_driver.py index 264ed45560..1fad47cfe0 100644 --- a/vmware_nsx/tests/unit/nsx_v/vshield/test_vcns_driver.py +++ b/vmware_nsx/tests/unit/nsx_v/vshield/test_vcns_driver.py @@ -380,16 +380,6 @@ class VcnsDriverTestCase(base.BaseTestCase): status = self.vcns_driver.get_edge_status(self.edge_id) self.assertEqual(vcns_const.RouterStatus.ROUTER_STATUS_ACTIVE, status) - def test_get_edges(self): - self._deploy_edge() - edges = self.vcns_driver.get_edges_statuses() - found = False - for edge_id, status in six.iteritems(edges): - if edge_id == self.edge_id: - found = True - break - self.assertTrue(found) - def test_update_nat_rules(self): self._deploy_edge() snats = [{