From 0589e16f9b1c6caf962fb17876a2f124cfe87ea4 Mon Sep 17 00:00:00 2001 From: Hongbin Lu Date: Sun, 20 Jan 2019 00:04:22 +0000 Subject: [PATCH] Refactor the port update code Introduce a port_update method in kuryr_network.py. This method allows caller to pass an admin context to construct the neutorn client. Change-Id: I40349fb65bf49b3ffa80ab2da9c803bbcd2d2a1e --- zun/network/kuryr_network.py | 30 ++++++++------------ zun/network/neutron.py | 21 ++++++++++++-- zun/tests/unit/network/test_kuryr_network.py | 5 ++-- 3 files changed, 33 insertions(+), 23 deletions(-) diff --git a/zun/network/kuryr_network.py b/zun/network/kuryr_network.py index 41b9e8be1..04a4b9d99 100644 --- a/zun/network/kuryr_network.py +++ b/zun/network/kuryr_network.py @@ -19,7 +19,6 @@ from neutronclient.common import exceptions from oslo_log import log as logging from oslo_utils import excutils -from zun.common import context as zun_context from zun.common import exception from zun.common.i18n import _ import zun.conf @@ -223,9 +222,8 @@ class KuryrNetwork(network.Network): # NOTE(hongbin): Use admin context here because non-admin # context might not be able to update some attributes # (i.e. binding:profile). - admin_context = zun_context.get_admin_context() - neutron_api = neutron.NeutronAPI(admin_context) - neutron_api.update_port(neutron_port_id, port_req_body) + self.neutron_api.update_port(neutron_port_id, port_req_body, + admin=True) else: network = self.inspect_network(network_name) neutron_net_id = network['Options']['neutron.net.uuid'] @@ -313,9 +311,8 @@ class KuryrNetwork(network.Network): try: # Requires admin creds to set port bindings - admin_context = zun_context.get_admin_context() - neutron_api = neutron.NeutronAPI(admin_context) - neutron_api.update_port(port_id, port_req_body) + self.neutron_api.update_port(port_id, port_req_body, + admin=True) except exception.PortNotFound: LOG.debug('Unable to unbind port %s as it no longer ' 'exists.', port_id) @@ -396,9 +393,8 @@ class KuryrNetwork(network.Network): try: # Requires admin creds to set port bindings - admin_context = zun_context.get_admin_context() - neutron_api = neutron.NeutronAPI(admin_context) - neutron_api.update_port(port_id, port_req_body) + self.neutron_api.update_port(port_id, port_req_body, + admin=True) except exception.PortNotFound: LOG.debug('Unable to unbind port %s as it no longer ' 'exists.', port_id) @@ -431,10 +427,9 @@ class KuryrNetwork(network.Network): "to port %(port_id)s", {'security_group_ids': security_group_ids, 'port_id': port['id']}) - admin_context = zun_context.get_admin_context() - neutron_api = neutron.NeutronAPI(admin_context) - neutron_api.update_port(port['id'], - {'port': updated_port}) + self.neutron_api.update_port(port['id'], + {'port': updated_port}, + admin=True) except exceptions.NeutronClientException as e: exc_info = sys.exc_info() if e.status_code == 400: @@ -469,10 +464,9 @@ class KuryrNetwork(network.Network): "from port %(port_id)s", {'security_group_ids': security_group_ids, 'port_id': port['id']}) - admin_context = zun_context.get_admin_context() - neutron_api = neutron.NeutronAPI(admin_context) - neutron_api.update_port(port['id'], - {'port': updated_port}) + self.neutron_api.update_port(port['id'], + {'port': updated_port}, + admin=True) except exceptions.NeutronClientException as e: exc_info = sys.exc_info() if e.status_code == 400: diff --git a/zun/network/neutron.py b/zun/network/neutron.py index 709025d84..a461acaee 100644 --- a/zun/network/neutron.py +++ b/zun/network/neutron.py @@ -17,6 +17,7 @@ from oslo_log import log as logging from oslo_utils import uuidutils from zun.common import clients +from zun.common import context as zun_context from zun.common import exception from zun.common.i18n import _ @@ -28,15 +29,29 @@ class NeutronAPI(object): def __init__(self, context): self.context = context - self.neutron = clients.OpenStackClients(self.context).neutron() + self.client = clients.OpenStackClients(self.context).neutron() + self.admin_client = None def __getattr__(self, key): - return getattr(self.neutron, key) + return getattr(self.client, key) + + def _get_admin_client(self): + if self.admin_client is None: + context = zun_context.get_admin_context() + self.admin_client = clients.OpenStackClients(context).neutron() + return self.admin_client + + def update_port(self, port, body=None, admin=False): + if admin: + client = self._get_admin_client() + else: + client = self.client + return client.update_port(port, body) def find_resourceid_by_name_or_id(self, resource, name_or_id, project_id=None): return neutronv20.find_resourceid_by_name_or_id( - self.neutron, resource, name_or_id, project_id) + self.client, resource, name_or_id, project_id) def get_available_network(self): search_opts = {'tenant_id': self.context.project_id, 'shared': False} diff --git a/zun/tests/unit/network/test_kuryr_network.py b/zun/tests/unit/network/test_kuryr_network.py index ff3d1243d..d6d05907c 100644 --- a/zun/tests/unit/network/test_kuryr_network.py +++ b/zun/tests/unit/network/test_kuryr_network.py @@ -69,7 +69,7 @@ class FakeNeutronClient(object): self.ports.append(port_data) return port - def update_port(self, port_id, port): + def update_port(self, port_id, port, **kwargs): port_data = copy.deepcopy(port['port']) for port in self.ports: if port['id'] == port_id: @@ -339,4 +339,5 @@ class KuryrNetworkTestCase(base.TestCase): mock_update_port.assert_called_once_with( 'fake-port-id', - {'port': {'security_groups': ['sg1', 'sg2']}}) + {'port': {'security_groups': ['sg1', 'sg2']}}, + admin=True)