diff --git a/unit_tests/charm_tests/test_neutron.py b/unit_tests/charm_tests/test_neutron.py new file mode 100644 index 000000000..78e88c9e8 --- /dev/null +++ b/unit_tests/charm_tests/test_neutron.py @@ -0,0 +1,50 @@ +# Copyright 2022 Canonical Ltd. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import unittest + +import zaza.openstack.charm_tests.neutron.tests as neutron_tests + + +class FakeInstance: + def __init__(self): + self.addresses = { + "foo_admin_net": [ + {"addr": "10.5.1.2", + "OS-EXT-IPS:type": "fixed"}, + {"addr": "10.245.166.188", + "OS-EXT-IPS:type": "floating"}, + ] + } + + +class TestNeutron(unittest.TestCase): + def test_network_name_from_instance(self): + instance = FakeInstance() + + self.assertEqual('foo_admin_net', + neutron_tests.network_name_from_instance(instance)) + + instance.addresses = {} + self.assertEqual(None, + neutron_tests.network_name_from_instance(instance)) + + def test_ips_from_instance(self): + instance = FakeInstance() + self.assertEqual(["10.245.166.188"], + neutron_tests.ips_from_instance(instance, "floating")) + self.assertEqual(["10.5.1.2"], + neutron_tests.ips_from_instance(instance, "fixed")) + instance.addresses = {} + self.assertEqual([], + neutron_tests.ips_from_instance(instance, "floating")) diff --git a/zaza/openstack/charm_tests/neutron/tests.py b/zaza/openstack/charm_tests/neutron/tests.py index cf925b0d9..5ab16f971 100644 --- a/zaza/openstack/charm_tests/neutron/tests.py +++ b/zaza/openstack/charm_tests/neutron/tests.py @@ -1076,7 +1076,10 @@ def network_name_from_instance(instance): :returns: Name of primary network the instance is attached to. :rtype: str """ - return next(iter(instance.addresses)) + try: + return next(iter(instance.addresses)) + except StopIteration: + return None def ips_from_instance(instance, ip_type): @@ -1095,10 +1098,14 @@ def ips_from_instance(instance, ip_type): raise RuntimeError( "Only 'floating' and 'fixed' are valid IP types to search for" ) - return list([ - ip['addr'] for ip in instance.addresses[ - network_name_from_instance(instance)] - if ip['OS-EXT-IPS:type'] == ip_type]) + net_name = network_name_from_instance(instance) + if net_name: + return list([ + ip['addr'] for ip in instance.addresses[net_name] + if ip['OS-EXT-IPS:type'] == ip_type]) + else: + # the instance is not attached to a network. + return [] class NeutronNetworkingTest(NeutronNetworkingBase):