From e65363f263628d089f0d6739829f139729543507 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Harald=20Jens=C3=A5s?= Date: Thu, 28 Jan 2021 02:35:50 +0100 Subject: [PATCH] Add network index support in network modules In the module extracting network data from an existing heat stack, use the 'tripleo_net_idx' tag to write out network data file in v2 format using identical network ordering with the network data used to deploy the stack. In the module used to create composable networks pass in the loop index_var in the playbook and set the tripleo_net_idx tag when creating and updating neutron network resources. Partial-Implements: blueprint network-data-v2-ports Change-Id: Ib96e17987ae1dca629e275b0f219ef435af63bb0 --- .../modules/tripleo_composable_network.py | 17 ++++++++++++----- .../tripleo_overcloud_network_extract.py | 13 +++++++++---- .../cli-overcloud-network-provision.yaml | 5 ++++- .../test_tripleo_composable_network.py | 16 +++++++++++----- .../test_tripleo_overcloud_network_extract.py | 19 ++++++++++--------- 5 files changed, 46 insertions(+), 24 deletions(-) diff --git a/tripleo_ansible/ansible_plugins/modules/tripleo_composable_network.py b/tripleo_ansible/ansible_plugins/modules/tripleo_composable_network.py index bb425abae..4d11f0b04 100644 --- a/tripleo_ansible/ansible_plugins/modules/tripleo_composable_network.py +++ b/tripleo_ansible/ansible_plugins/modules/tripleo_composable_network.py @@ -53,6 +53,10 @@ options: description: - Structure describing a TripleO composable network type: dict + idx: + description: + - TripleO network index number + type: int author: - Harald Jensås ''' @@ -96,6 +100,7 @@ EXAMPLES = ''' nexthop: 172.18.1.254 vip: false vlan: 21 + idx: 1 ''' DEFAULT_NETWORK = 'ctlplane' @@ -115,8 +120,9 @@ def get_overcloud_domain_name(conn, default_network): return DEFAULT_DOMAIN -def build_network_tag_field(net_data): - tags = ['='.join(['tripleo_network_name', net_data['name']])] +def build_network_tag_field(net_data, idx): + tags = ['='.join(['tripleo_network_name', net_data['name']]), + '='.join(['tripleo_net_idx', str(idx)])] service_net_map_replace = net_data.get('service_net_map_replace') vip = net_data.get('vip') if service_net_map_replace: @@ -137,7 +143,7 @@ def build_subnet_tag_field(subnet_data): return tags -def create_net_spec(net_data, overcloud_domain_name): +def create_net_spec(net_data, overcloud_domain_name, idx): name_lower = net_data.get('name_lower', net_data['name'].lower()) net_spec = { 'admin_state_up': net_data.get('admin_state_up', DEFAULT_ADMIN_STATE), @@ -152,7 +158,7 @@ def create_net_spec(net_data, overcloud_domain_name): 'provider:network_type': DEFAULT_NETWORK_TYPE, } - net_spec.update({'tags': build_network_tag_field(net_data)}) + net_spec.update({'tags': build_network_tag_field(net_data, idx)}) return net_spec @@ -418,6 +424,7 @@ def run_module(): default_network = module.params.get('default_network', DEFAULT_NETWORK) net_data = module.params['net_data'] + idx = module.params['idx'] error_messages = network_data_v2.validate_json_schema(net_data) if error_messages: module.fail_json(msg='\n\n'.join(error_messages)) @@ -427,7 +434,7 @@ def run_module(): # Create or update the network net_spec = create_net_spec( - net_data, get_overcloud_domain_name(conn, default_network)) + net_data, get_overcloud_domain_name(conn, default_network), idx) changed, network = create_or_update_network(conn, module, net_spec) result['changed'] = changed if changed else result['changed'] 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 9de605db2..6de74f9a9 100644 --- a/tripleo_ansible/ansible_plugins/modules/tripleo_overcloud_network_extract.py +++ b/tripleo_ansible/ansible_plugins/modules/tripleo_overcloud_network_extract.py @@ -160,6 +160,9 @@ def tripleo_resource_tags_to_dict(resource_tags): except ValueError: continue + if key == 'tripleo_net_idx': + value = int(value) + tag_dict.update({key: value}) return tag_dict @@ -211,7 +214,7 @@ def get_network_info(conn, network_id): pop_defaults(net_dict) - return net_dict + return tag_dict['tripleo_net_idx'], net_dict def get_subnet_info(conn, subnet_id): @@ -284,21 +287,23 @@ def get_subnet_info(conn, subnet_id): def parse_net_resources(conn, net_resources): - network_data = list() + indexed_networks = dict() for net in net_resources: name = net.rpartition('Network')[0] net_entry = {'name': name, 'subnets': dict()} for res in net_resources[net]: res_dict = net_resources[net][res] if res_dict['resource_type'] == TYPE_NET: - net_dict = get_network_info(conn, res_dict[RES_ID]) + idx, net_dict = get_network_info(conn, res_dict[RES_ID]) net_entry.update(net_dict) if res_dict['resource_type'] == TYPE_SUBNET: subnet_name, subnet_dict = get_subnet_info(conn, res_dict[RES_ID]) net_entry['subnets'].update({subnet_name: subnet_dict}) - network_data.append(net_entry) + indexed_networks[idx] = net_entry + + network_data = [indexed_networks[i] for i in sorted(indexed_networks)] return network_data diff --git a/tripleo_ansible/playbooks/cli-overcloud-network-provision.yaml b/tripleo_ansible/playbooks/cli-overcloud-network-provision.yaml index f771105de..844f5e41b 100644 --- a/tripleo_ansible/playbooks/cli-overcloud-network-provision.yaml +++ b/tripleo_ansible/playbooks/cli-overcloud-network-provision.yaml @@ -49,10 +49,13 @@ when: - network_data is undefined - - name: Create composable networks + - name: Create/Update composable networks tripleo_composable_network: net_data: "{{ item }}" + idx: "{{ idx }}" loop: "{{ network_data }}" + loop_control: + index_var: idx - name: Populate environment tripleo_network_populate_environment: diff --git a/tripleo_ansible/tests/modules/test_tripleo_composable_network.py b/tripleo_ansible/tests/modules/test_tripleo_composable_network.py index 2954e6ff1..d4a50476b 100644 --- a/tripleo_ansible/tests/modules/test_tripleo_composable_network.py +++ b/tripleo_ansible/tests/modules/test_tripleo_composable_network.py @@ -25,18 +25,22 @@ from tripleo_ansible.tests import stubs class TestTripleoComposableNetwork(tests_base.TestCase): def test_build_network_tag_field(self): + idx = 3 net_data = {'name': 'foo', 'service_net_map_replace': 'replacement', 'vip': True} expected = ['tripleo_network_name=foo', + 'tripleo_net_idx=3', 'tripleo_service_net_map_replace=replacement', 'tripleo_vip=true'] - result = plugin.build_network_tag_field(net_data) + result = plugin.build_network_tag_field(net_data, idx) self.assertEqual(expected, result) + idx = 1 net_data = {'name': 'foo'} - expected = ['tripleo_network_name=foo'] - result = plugin.build_network_tag_field(net_data) + expected = ['tripleo_network_name=foo', + 'tripleo_net_idx=1'] + result = plugin.build_network_tag_field(net_data, idx) self.assertEqual(expected, result) def test_build_subnet_tag_field(self): @@ -52,6 +56,7 @@ class TestTripleoComposableNetwork(tests_base.TestCase): self.assertEqual(expected, result) def test_create_net_spec(self): + idx = 3 net_data = {'name': 'NetName'} overcloud_domain_name = 'example.com.' expected = { @@ -62,10 +67,11 @@ class TestTripleoComposableNetwork(tests_base.TestCase): 'shared': plugin.DEFAULT_SHARED, 'provider:physical_network': 'netname', 'provider:network_type': plugin.DEFAULT_NETWORK_TYPE, - 'tags': ['tripleo_network_name=NetName'], + 'tags': ['tripleo_network_name=NetName', + 'tripleo_net_idx=3'], } - result = plugin.create_net_spec(net_data, overcloud_domain_name) + result = plugin.create_net_spec(net_data, overcloud_domain_name, idx) self.assertEqual(expected, result) def test_validate_network_update(self): 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 46b4fd178..864d9f823 100644 --- a/tripleo_ansible/tests/modules/test_tripleo_overcloud_network_extract.py +++ b/tripleo_ansible/tests/modules/test_tripleo_overcloud_network_extract.py @@ -25,8 +25,10 @@ from tripleo_ansible.tests import stubs class TestTripleoOvercloudNetworkExtract(tests_base.TestCase): def test_tripleo_resource_tags_to_dict(self): - tags = ['foo=bar', 'baz=qux', 'tripleo_foo=bar', 'tripleo_baz=qux'] - expected = {'tripleo_foo': 'bar', 'tripleo_baz': 'qux'} + tags = ['foo=bar', 'baz=qux', 'tripleo_foo=bar', 'tripleo_baz=qux', + 'tripleo_net_idx=3'] + expected = {'tripleo_foo': 'bar', 'tripleo_baz': 'qux', + 'tripleo_net_idx': 3} result = plugin.tripleo_resource_tags_to_dict(tags) self.assertEqual(expected, result) @@ -69,14 +71,13 @@ class TestTripleoOvercloudNetworkExtract(tests_base.TestCase): mtu=1500, is_shared=False, is_admin_state_up=False, - tags=['tripleo_service_net_map_replace=external'] + tags=['tripleo_net_idx=3', + 'tripleo_service_net_map_replace=external'] ) conn_mock.network.get_network.return_value = fake_network - expected = { - 'name_lower': 'public', - 'dns_domain': 'public.localdomain.', - 'service_net_map_replace': 'external', - } + expected = (3, {'name_lower': 'public', + 'dns_domain': 'public.localdomain.', + 'service_net_map_replace': 'external'}) result = plugin.get_network_info( conn_mock, '132f871f-eaec-4fed-9475-0d54465e0f00') self.assertEqual(expected, result) @@ -264,7 +265,7 @@ class TestTripleoOvercloudNetworkExtract(tests_base.TestCase): 'physical_network': 'leaf1', } - mock_get_network.return_value = fake_network + mock_get_network.return_value = (0, fake_network) mock_get_subnet.side_effect = [ ('storage', fake_subnet_storage), ('leaf1', fake_subnet_storage_leaf1)]