From 9f99a1a2e8c9156fa4652bd0d860a31c356bd3e3 Mon Sep 17 00:00:00 2001 From: James Slagle Date: Thu, 3 Dec 2020 21:05:49 -0500 Subject: [PATCH] Only add gateway IP if defined during network extract If the gateway IP was not a subnet (IPv4 or IPv6), the network extract command was generating a network_data.yaml file that had an entry for gateway_ip set to null. Example: - dns_domain: storagemgmt.tripleodomain. mtu: 1400 name: StorageMgmt name_lower: storage_mgmt subnets: storage_mgmt_subnet: allocation_pools: - end: 172.16.3.250 start: 172.16.3.4 gateway_ip: null ip_subnet: 172.16.3.0/24 physical_network: storage_mgmt routes: [] vlan: 40 vip: true During "openstack overcloud network provision", the yaml was then failing validation since null is not a valid string value for gateway_ip as defined in the schema. This patch updates the tripleo_overcloud_network_extract module to only add the gateway_ip[v6] key to the subnet info if it's actually defined on the subnet object. Change-Id: I9701064c33c2e319617d90da99db00d10ad68a0f Signed-off-by: James Slagle --- .../tripleo_overcloud_network_extract.py | 12 +++- .../test_tripleo_overcloud_network_extract.py | 68 +++++++++++++++++++ 2 files changed, 78 insertions(+), 2 deletions(-) diff --git a/tripleo_ansible/ansible_plugins/modules/tripleo_overcloud_network_extract.py b/tripleo_ansible/ansible_plugins/modules/tripleo_overcloud_network_extract.py index 7bc66b9cb..9de605db2 100644 --- a/tripleo_ansible/ansible_plugins/modules/tripleo_overcloud_network_extract.py +++ b/tripleo_ansible/ansible_plugins/modules/tripleo_overcloud_network_extract.py @@ -256,20 +256,28 @@ def get_subnet_info(conn, subnet_id): subnet_dict.update({ 'ip_subnet': subnet.cidr, 'allocation_pools': subnet.allocation_pools, - 'gateway_ip': subnet.gateway_ip, 'routes': subnet.host_routes, }) + if subnet.gateway_ip: + subnet_dict.update({ + 'gateway_ip': subnet.gateway_ip, + }) + if subnet.ip_version == 6: subnet_dict.update({ 'ipv6_subnet': subnet.cidr, 'ipv6_allocation_pools': subnet.allocation_pools, - 'gateway_ipv6': subnet.gateway_ip, 'routes_ipv6': subnet.host_routes, 'ipv6_address_mode': subnet.ipv6_address_mode, 'ipv6_ra_mode': subnet.ipv6_ra_mode, }) + if subnet.gateway_ip: + subnet_dict.update({ + 'gateway_ipv6': subnet.gateway_ip, + }) + pop_defaults(subnet_dict) return subnet_name, subnet_dict diff --git a/tripleo_ansible/tests/modules/test_tripleo_overcloud_network_extract.py b/tripleo_ansible/tests/modules/test_tripleo_overcloud_network_extract.py index 9cc04d8f3..46b4fd178 100644 --- a/tripleo_ansible/tests/modules/test_tripleo_overcloud_network_extract.py +++ b/tripleo_ansible/tests/modules/test_tripleo_overcloud_network_extract.py @@ -114,6 +114,38 @@ class TestTripleoOvercloudNetworkExtract(tests_base.TestCase): self.assertEqual(name, 'public_subnet') self.assertEqual(expected, subnet) + @mock.patch.object(openstack.connection, 'Connection', autospec=True) + def test_get_subnet_info_ipv4_no_gateway_ip(self, conn_mock): + fake_subnet = stubs.FakeNeutronSubnet( + name='public_subnet', + is_dhcp_enabled=False, + tags=['tripleo_vlan_id=100'], + ip_version=4, + cidr='10.0.0.0/24', + allocation_pools=[{'start': '10.0.0.10', 'end': '10.0.0.150'}], + gateway_ip=None, + host_routes=[{'destination': '172.17.1.0/24', + 'nexthop': '10.0.0.1'}], + ) + fake_segment = stubs.FakeNeutronSegment( + name='public_subnet', + network_type='flat', + physical_network='public_subnet' + ) + conn_mock.network.get_subnet.return_value = fake_subnet + conn_mock.network.get_segment.return_value = fake_segment + expected = { + 'vlan': 100, + 'ip_subnet': '10.0.0.0/24', + 'allocation_pools': [{'start': '10.0.0.10', 'end': '10.0.0.150'}], + 'routes': [{'destination': '172.17.1.0/24', + 'nexthop': '10.0.0.1'}], + 'physical_network': 'public_subnet', + } + name, subnet = plugin.get_subnet_info(conn_mock, mock.Mock()) + self.assertEqual(name, 'public_subnet') + self.assertEqual(expected, subnet) + @mock.patch.object(openstack.connection, 'Connection', autospec=True) def test_get_subnet_info_ipv6(self, conn_mock): fake_subnet = stubs.FakeNeutronSubnet( @@ -151,6 +183,42 @@ class TestTripleoOvercloudNetworkExtract(tests_base.TestCase): self.assertEqual(name, 'public_subnet') self.assertEqual(expected, subnet) + @mock.patch.object(openstack.connection, 'Connection', autospec=True) + def test_get_subnet_info_ipv6_no_gateway_ip(self, conn_mock): + fake_subnet = stubs.FakeNeutronSubnet( + name='public_subnet', + is_dhcp_enabled=False, + tags=['tripleo_vlan_id=200'], + ip_version=6, + cidr='2001:db8:a::/64', + allocation_pools=[{'start': '2001:db8:a::0010', + 'end': '2001:db8:a::fff9'}], + gateway_ip=None, + host_routes=[{'destination': '2001:db8:b::/64', + 'nexthop': '2001:db8:a::1'}], + ipv6_address_mode=None, + ipv6_ra_mode=None, + ) + fake_segment = stubs.FakeNeutronSegment( + name='public_subnet', + network_type='flat', + physical_network='public_subnet' + ) + conn_mock.network.get_subnet.return_value = fake_subnet + conn_mock.network.get_segment.return_value = fake_segment + expected = { + 'vlan': 200, + 'ipv6_subnet': '2001:db8:a::/64', + 'ipv6_allocation_pools': [{'start': '2001:db8:a::0010', + 'end': '2001:db8:a::fff9'}], + 'routes_ipv6': [{'destination': '2001:db8:b::/64', + 'nexthop': '2001:db8:a::1'}], + 'physical_network': 'public_subnet', + } + name, subnet = plugin.get_subnet_info(conn_mock, mock.Mock()) + self.assertEqual(name, 'public_subnet') + self.assertEqual(expected, subnet) + @mock.patch.object(plugin, 'get_subnet_info', auto_spec=True) @mock.patch.object(plugin, 'get_network_info', auto_spec=True) @mock.patch.object(openstack.connection, 'Connection', autospec=True)