From 4fd543a0fe3f37f234845b40182355509980b536 Mon Sep 17 00:00:00 2001 From: David Ames Date: Fri, 6 Dec 2019 12:01:38 -0800 Subject: [PATCH 1/7] Hanlde new StopIteration for iterators --- zaza/openstack/utilities/juju.py | 2 +- zaza/openstack/utilities/openstack.py | 52 ++++++++++++++------------- 2 files changed, 29 insertions(+), 25 deletions(-) diff --git a/zaza/openstack/utilities/juju.py b/zaza/openstack/utilities/juju.py index fd7abc1..9eb38d5 100644 --- a/zaza/openstack/utilities/juju.py +++ b/zaza/openstack/utilities/juju.py @@ -92,7 +92,7 @@ def get_machines_for_application(application, model_name=None): """ status = get_application_status(application, model_name=model_name) if not status: - raise StopIteration + return # libjuju juju status no longer has units for subordinate charms # Use the application it is subordinate-to to find machines diff --git a/zaza/openstack/utilities/openstack.py b/zaza/openstack/utilities/openstack.py index 1776296..81c61f7 100644 --- a/zaza/openstack/utilities/openstack.py +++ b/zaza/openstack/utilities/openstack.py @@ -674,31 +674,35 @@ def configure_gateway_ext_port(novaclient, neutronclient, net_id=None, if not net_id: net_id = get_admin_net(neutronclient)['id'] - for uuid in uuids: - server = novaclient.servers.get(uuid) - ext_port_name = "{}_ext-port".format(server.name) - for port in neutronclient.list_ports(device_id=server.id)['ports']: - if port['name'] == ext_port_name: - logging.warning('Neutron Gateway already has additional port') - break - else: - logging.info('Attaching additional port to instance, ' - 'connected to net id: {}'.format(net_id)) - body_value = { - "port": { - "admin_state_up": True, - "name": ext_port_name, - "network_id": net_id, - "port_security_enabled": False, + try: + for uuid in uuids: + server = novaclient.servers.get(uuid) + ext_port_name = "{}_ext-port".format(server.name) + for port in neutronclient.list_ports(device_id=server.id)['ports']: + if port['name'] == ext_port_name: + logging.warning( + 'Neutron Gateway already has additional port') + break + else: + logging.info('Attaching additional port to instance, ' + 'connected to net id: {}'.format(net_id)) + body_value = { + "port": { + "admin_state_up": True, + "name": ext_port_name, + "network_id": net_id, + "port_security_enabled": False, + } } - } - port = neutronclient.create_port(body=body_value) - server.interface_attach(port_id=port['port']['id'], - net_id=None, fixed_ip=None) - if add_dataport_to_netplan: - mac_address = get_mac_from_port(port, neutronclient) - add_interface_to_netplan(server.name, - mac_address=mac_address) + port = neutronclient.create_port(body=body_value) + server.interface_attach(port_id=port['port']['id'], + net_id=None, fixed_ip=None) + if add_dataport_to_netplan: + mac_address = get_mac_from_port(port, neutronclient) + add_interface_to_netplan(server.name, + mac_address=mac_address) + except StopIteration: + pass ext_br_macs = [] for port in neutronclient.list_ports(network_id=net_id)['ports']: if 'ext-port' in port['name']: From 1314c6af2f9f1cb91846643aa45ce590986223fc Mon Sep 17 00:00:00 2001 From: David Ames Date: Fri, 6 Dec 2019 13:42:09 -0800 Subject: [PATCH 2/7] Don't use StopIteration --- zaza/openstack/utilities/openstack.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/zaza/openstack/utilities/openstack.py b/zaza/openstack/utilities/openstack.py index 81c61f7..3291e58 100644 --- a/zaza/openstack/utilities/openstack.py +++ b/zaza/openstack/utilities/openstack.py @@ -649,9 +649,9 @@ def configure_gateway_ext_port(novaclient, neutronclient, net_id=None, application_names = ['neutron-openvswitch'] try: ngw = 'neutron-gateway' - next(juju_utils.get_machine_uuids_for_application(ngw)) + model.get_application(ngw) application_names.append(ngw) - except StopIteration: + except KeyError: # neutron-gateway not in deployment pass elif ovn_present(): @@ -659,9 +659,9 @@ def configure_gateway_ext_port(novaclient, neutronclient, net_id=None, application_names = ['ovn-chassis'] try: ovn_dc_name = 'ovn-dedicated-chassis' - next(juju_utils.get_machine_uuids_for_application(ovn_dc_name)) + model.get_application(ngw) application_names.append(ovn_dc_name) - except StopIteration: + except KeyError: # ovn-dedicated-chassis not in deployment pass port_config_key = 'interface-bridge-mappings' @@ -1450,8 +1450,8 @@ def get_current_os_release_pair(application='keystone'): :raises: exceptions.OSVersionNotFound """ try: - machine = next(juju_utils.get_machines_for_application(application)) - except StopIteration: + machine = juju_utils.get_machines_for_application(application) + except KeyError: raise exceptions.ApplicationNotFound(application) series = juju_utils.get_machine_series(machine) From ad9eecc49e1bbf26dcab24664b3be68fee49acbf Mon Sep 17 00:00:00 2001 From: David Ames Date: Fri, 6 Dec 2019 14:35:37 -0800 Subject: [PATCH 3/7] Pick just one machine --- zaza/openstack/utilities/openstack.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zaza/openstack/utilities/openstack.py b/zaza/openstack/utilities/openstack.py index 3291e58..5c8719b 100644 --- a/zaza/openstack/utilities/openstack.py +++ b/zaza/openstack/utilities/openstack.py @@ -1450,7 +1450,7 @@ def get_current_os_release_pair(application='keystone'): :raises: exceptions.OSVersionNotFound """ try: - machine = juju_utils.get_machines_for_application(application) + machine = list(juju_utils.get_machines_for_application(application))[0] except KeyError: raise exceptions.ApplicationNotFound(application) From 1a4e02e98c4f6506fd66852775a13847f1cba52d Mon Sep 17 00:00:00 2001 From: David Ames Date: Fri, 6 Dec 2019 15:02:57 -0800 Subject: [PATCH 4/7] Fix bug --- zaza/openstack/utilities/openstack.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zaza/openstack/utilities/openstack.py b/zaza/openstack/utilities/openstack.py index 5c8719b..ffcfc23 100644 --- a/zaza/openstack/utilities/openstack.py +++ b/zaza/openstack/utilities/openstack.py @@ -659,7 +659,7 @@ def configure_gateway_ext_port(novaclient, neutronclient, net_id=None, application_names = ['ovn-chassis'] try: ovn_dc_name = 'ovn-dedicated-chassis' - model.get_application(ngw) + model.get_application(ovn_dc_name) application_names.append(ovn_dc_name) except KeyError: # ovn-dedicated-chassis not in deployment From c109abbe259578073c8f970155ed24004ccf7c7f Mon Sep 17 00:00:00 2001 From: David Ames Date: Mon, 9 Dec 2019 09:22:01 -0800 Subject: [PATCH 5/7] Fix unit test --- unit_tests/utilities/test_zaza_utilities_openstack.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/unit_tests/utilities/test_zaza_utilities_openstack.py b/unit_tests/utilities/test_zaza_utilities_openstack.py index 7e9a57d..8519318 100644 --- a/unit_tests/utilities/test_zaza_utilities_openstack.py +++ b/unit_tests/utilities/test_zaza_utilities_openstack.py @@ -15,7 +15,6 @@ import copy import datetime import io -import itertools import mock import tenacity @@ -814,14 +813,16 @@ class TestOpenStackUtils(ut_utils.BaseTestCase): name='_get_machine_series' ) + _machine = mock.MagicMock() + # No machine returned - self._get_machines.side_effect = StopIteration + self._get_machines.side_effect = KeyError with self.assertRaises(exceptions.ApplicationNotFound): openstack_utils.get_current_os_release_pair() self._get_machines.side_effect = None # No series returned - self._get_machines.return_value = itertools.repeat('6') + self._get_machines.return_value = [_machine] self._get_machine_series.return_value = None with self.assertRaises(exceptions.SeriesNotFound): openstack_utils.get_current_os_release_pair() From 40e9c86df4209082eba3ab82a4f24fdfd5e4cbab Mon Sep 17 00:00:00 2001 From: David Ames Date: Tue, 10 Dec 2019 08:36:22 -0800 Subject: [PATCH 6/7] Test the condition not the implementation --- unit_tests/utilities/test_zaza_utilities_openstack.py | 2 +- zaza/openstack/utilities/openstack.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/unit_tests/utilities/test_zaza_utilities_openstack.py b/unit_tests/utilities/test_zaza_utilities_openstack.py index 8519318..915d661 100644 --- a/unit_tests/utilities/test_zaza_utilities_openstack.py +++ b/unit_tests/utilities/test_zaza_utilities_openstack.py @@ -816,7 +816,7 @@ class TestOpenStackUtils(ut_utils.BaseTestCase): _machine = mock.MagicMock() # No machine returned - self._get_machines.side_effect = KeyError + self._get_machines.return_value = [] with self.assertRaises(exceptions.ApplicationNotFound): openstack_utils.get_current_os_release_pair() self._get_machines.side_effect = None diff --git a/zaza/openstack/utilities/openstack.py b/zaza/openstack/utilities/openstack.py index ffcfc23..efcdd26 100644 --- a/zaza/openstack/utilities/openstack.py +++ b/zaza/openstack/utilities/openstack.py @@ -1451,7 +1451,7 @@ def get_current_os_release_pair(application='keystone'): """ try: machine = list(juju_utils.get_machines_for_application(application))[0] - except KeyError: + except IndexError: raise exceptions.ApplicationNotFound(application) series = juju_utils.get_machine_series(machine) From 23e0dd5325a9ed23f905358198e1ce69dfcf7fcf Mon Sep 17 00:00:00 2001 From: David Ames Date: Tue, 10 Dec 2019 10:29:57 -0800 Subject: [PATCH 7/7] Catching StopIteration is not necessary --- zaza/openstack/utilities/openstack.py | 53 +++++++++++++-------------- 1 file changed, 25 insertions(+), 28 deletions(-) diff --git a/zaza/openstack/utilities/openstack.py b/zaza/openstack/utilities/openstack.py index efcdd26..5582a89 100644 --- a/zaza/openstack/utilities/openstack.py +++ b/zaza/openstack/utilities/openstack.py @@ -674,35 +674,32 @@ def configure_gateway_ext_port(novaclient, neutronclient, net_id=None, if not net_id: net_id = get_admin_net(neutronclient)['id'] - try: - for uuid in uuids: - server = novaclient.servers.get(uuid) - ext_port_name = "{}_ext-port".format(server.name) - for port in neutronclient.list_ports(device_id=server.id)['ports']: - if port['name'] == ext_port_name: - logging.warning( - 'Neutron Gateway already has additional port') - break - else: - logging.info('Attaching additional port to instance, ' - 'connected to net id: {}'.format(net_id)) - body_value = { - "port": { - "admin_state_up": True, - "name": ext_port_name, - "network_id": net_id, - "port_security_enabled": False, - } + for uuid in uuids: + server = novaclient.servers.get(uuid) + ext_port_name = "{}_ext-port".format(server.name) + for port in neutronclient.list_ports(device_id=server.id)['ports']: + if port['name'] == ext_port_name: + logging.warning( + 'Neutron Gateway already has additional port') + break + else: + logging.info('Attaching additional port to instance, ' + 'connected to net id: {}'.format(net_id)) + body_value = { + "port": { + "admin_state_up": True, + "name": ext_port_name, + "network_id": net_id, + "port_security_enabled": False, } - port = neutronclient.create_port(body=body_value) - server.interface_attach(port_id=port['port']['id'], - net_id=None, fixed_ip=None) - if add_dataport_to_netplan: - mac_address = get_mac_from_port(port, neutronclient) - add_interface_to_netplan(server.name, - mac_address=mac_address) - except StopIteration: - pass + } + port = neutronclient.create_port(body=body_value) + server.interface_attach(port_id=port['port']['id'], + net_id=None, fixed_ip=None) + if add_dataport_to_netplan: + mac_address = get_mac_from_port(port, neutronclient) + add_interface_to_netplan(server.name, + mac_address=mac_address) ext_br_macs = [] for port in neutronclient.list_ports(network_id=net_id)['ports']: if 'ext-port' in port['name']: