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)]