Merge "Add network index support in network modules"
This commit is contained in:
commit
1dfcb9fdbb
|
@ -53,6 +53,10 @@ options:
|
||||||
description:
|
description:
|
||||||
- Structure describing a TripleO composable network
|
- Structure describing a TripleO composable network
|
||||||
type: dict
|
type: dict
|
||||||
|
idx:
|
||||||
|
description:
|
||||||
|
- TripleO network index number
|
||||||
|
type: int
|
||||||
author:
|
author:
|
||||||
- Harald Jensås <hjensas@redhat.com>
|
- Harald Jensås <hjensas@redhat.com>
|
||||||
'''
|
'''
|
||||||
|
@ -96,6 +100,7 @@ EXAMPLES = '''
|
||||||
nexthop: 172.18.1.254
|
nexthop: 172.18.1.254
|
||||||
vip: false
|
vip: false
|
||||||
vlan: 21
|
vlan: 21
|
||||||
|
idx: 1
|
||||||
'''
|
'''
|
||||||
|
|
||||||
DEFAULT_NETWORK = 'ctlplane'
|
DEFAULT_NETWORK = 'ctlplane'
|
||||||
|
@ -115,8 +120,9 @@ def get_overcloud_domain_name(conn, default_network):
|
||||||
return DEFAULT_DOMAIN
|
return DEFAULT_DOMAIN
|
||||||
|
|
||||||
|
|
||||||
def build_network_tag_field(net_data):
|
def build_network_tag_field(net_data, idx):
|
||||||
tags = ['='.join(['tripleo_network_name', net_data['name']])]
|
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')
|
service_net_map_replace = net_data.get('service_net_map_replace')
|
||||||
vip = net_data.get('vip')
|
vip = net_data.get('vip')
|
||||||
if service_net_map_replace:
|
if service_net_map_replace:
|
||||||
|
@ -137,7 +143,7 @@ def build_subnet_tag_field(subnet_data):
|
||||||
return tags
|
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())
|
name_lower = net_data.get('name_lower', net_data['name'].lower())
|
||||||
net_spec = {
|
net_spec = {
|
||||||
'admin_state_up': net_data.get('admin_state_up', DEFAULT_ADMIN_STATE),
|
'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,
|
'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
|
return net_spec
|
||||||
|
|
||||||
|
@ -418,6 +424,7 @@ def run_module():
|
||||||
|
|
||||||
default_network = module.params.get('default_network', DEFAULT_NETWORK)
|
default_network = module.params.get('default_network', DEFAULT_NETWORK)
|
||||||
net_data = module.params['net_data']
|
net_data = module.params['net_data']
|
||||||
|
idx = module.params['idx']
|
||||||
error_messages = network_data_v2.validate_json_schema(net_data)
|
error_messages = network_data_v2.validate_json_schema(net_data)
|
||||||
if error_messages:
|
if error_messages:
|
||||||
module.fail_json(msg='\n\n'.join(error_messages))
|
module.fail_json(msg='\n\n'.join(error_messages))
|
||||||
|
@ -427,7 +434,7 @@ def run_module():
|
||||||
|
|
||||||
# Create or update the network
|
# Create or update the network
|
||||||
net_spec = create_net_spec(
|
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)
|
changed, network = create_or_update_network(conn, module, net_spec)
|
||||||
result['changed'] = changed if changed else result['changed']
|
result['changed'] = changed if changed else result['changed']
|
||||||
|
|
||||||
|
|
|
@ -160,6 +160,9 @@ def tripleo_resource_tags_to_dict(resource_tags):
|
||||||
except ValueError:
|
except ValueError:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
if key == 'tripleo_net_idx':
|
||||||
|
value = int(value)
|
||||||
|
|
||||||
tag_dict.update({key: value})
|
tag_dict.update({key: value})
|
||||||
|
|
||||||
return tag_dict
|
return tag_dict
|
||||||
|
@ -211,7 +214,7 @@ def get_network_info(conn, network_id):
|
||||||
|
|
||||||
pop_defaults(net_dict)
|
pop_defaults(net_dict)
|
||||||
|
|
||||||
return net_dict
|
return tag_dict['tripleo_net_idx'], net_dict
|
||||||
|
|
||||||
|
|
||||||
def get_subnet_info(conn, subnet_id):
|
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):
|
def parse_net_resources(conn, net_resources):
|
||||||
network_data = list()
|
indexed_networks = dict()
|
||||||
for net in net_resources:
|
for net in net_resources:
|
||||||
name = net.rpartition('Network')[0]
|
name = net.rpartition('Network')[0]
|
||||||
net_entry = {'name': name, 'subnets': dict()}
|
net_entry = {'name': name, 'subnets': dict()}
|
||||||
for res in net_resources[net]:
|
for res in net_resources[net]:
|
||||||
res_dict = net_resources[net][res]
|
res_dict = net_resources[net][res]
|
||||||
if res_dict['resource_type'] == TYPE_NET:
|
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)
|
net_entry.update(net_dict)
|
||||||
if res_dict['resource_type'] == TYPE_SUBNET:
|
if res_dict['resource_type'] == TYPE_SUBNET:
|
||||||
subnet_name, subnet_dict = get_subnet_info(conn,
|
subnet_name, subnet_dict = get_subnet_info(conn,
|
||||||
res_dict[RES_ID])
|
res_dict[RES_ID])
|
||||||
net_entry['subnets'].update({subnet_name: subnet_dict})
|
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
|
return network_data
|
||||||
|
|
||||||
|
|
|
@ -49,10 +49,13 @@
|
||||||
when:
|
when:
|
||||||
- network_data is undefined
|
- network_data is undefined
|
||||||
|
|
||||||
- name: Create composable networks
|
- name: Create/Update composable networks
|
||||||
tripleo_composable_network:
|
tripleo_composable_network:
|
||||||
net_data: "{{ item }}"
|
net_data: "{{ item }}"
|
||||||
|
idx: "{{ idx }}"
|
||||||
loop: "{{ network_data }}"
|
loop: "{{ network_data }}"
|
||||||
|
loop_control:
|
||||||
|
index_var: idx
|
||||||
|
|
||||||
- name: Populate environment
|
- name: Populate environment
|
||||||
tripleo_network_populate_environment:
|
tripleo_network_populate_environment:
|
||||||
|
|
|
@ -25,18 +25,22 @@ from tripleo_ansible.tests import stubs
|
||||||
class TestTripleoComposableNetwork(tests_base.TestCase):
|
class TestTripleoComposableNetwork(tests_base.TestCase):
|
||||||
|
|
||||||
def test_build_network_tag_field(self):
|
def test_build_network_tag_field(self):
|
||||||
|
idx = 3
|
||||||
net_data = {'name': 'foo',
|
net_data = {'name': 'foo',
|
||||||
'service_net_map_replace': 'replacement',
|
'service_net_map_replace': 'replacement',
|
||||||
'vip': True}
|
'vip': True}
|
||||||
expected = ['tripleo_network_name=foo',
|
expected = ['tripleo_network_name=foo',
|
||||||
|
'tripleo_net_idx=3',
|
||||||
'tripleo_service_net_map_replace=replacement',
|
'tripleo_service_net_map_replace=replacement',
|
||||||
'tripleo_vip=true']
|
'tripleo_vip=true']
|
||||||
result = plugin.build_network_tag_field(net_data)
|
result = plugin.build_network_tag_field(net_data, idx)
|
||||||
self.assertEqual(expected, result)
|
self.assertEqual(expected, result)
|
||||||
|
|
||||||
|
idx = 1
|
||||||
net_data = {'name': 'foo'}
|
net_data = {'name': 'foo'}
|
||||||
expected = ['tripleo_network_name=foo']
|
expected = ['tripleo_network_name=foo',
|
||||||
result = plugin.build_network_tag_field(net_data)
|
'tripleo_net_idx=1']
|
||||||
|
result = plugin.build_network_tag_field(net_data, idx)
|
||||||
self.assertEqual(expected, result)
|
self.assertEqual(expected, result)
|
||||||
|
|
||||||
def test_build_subnet_tag_field(self):
|
def test_build_subnet_tag_field(self):
|
||||||
|
@ -52,6 +56,7 @@ class TestTripleoComposableNetwork(tests_base.TestCase):
|
||||||
self.assertEqual(expected, result)
|
self.assertEqual(expected, result)
|
||||||
|
|
||||||
def test_create_net_spec(self):
|
def test_create_net_spec(self):
|
||||||
|
idx = 3
|
||||||
net_data = {'name': 'NetName'}
|
net_data = {'name': 'NetName'}
|
||||||
overcloud_domain_name = 'example.com.'
|
overcloud_domain_name = 'example.com.'
|
||||||
expected = {
|
expected = {
|
||||||
|
@ -62,10 +67,11 @@ class TestTripleoComposableNetwork(tests_base.TestCase):
|
||||||
'shared': plugin.DEFAULT_SHARED,
|
'shared': plugin.DEFAULT_SHARED,
|
||||||
'provider:physical_network': 'netname',
|
'provider:physical_network': 'netname',
|
||||||
'provider:network_type': plugin.DEFAULT_NETWORK_TYPE,
|
'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)
|
self.assertEqual(expected, result)
|
||||||
|
|
||||||
def test_validate_network_update(self):
|
def test_validate_network_update(self):
|
||||||
|
|
|
@ -25,8 +25,10 @@ from tripleo_ansible.tests import stubs
|
||||||
class TestTripleoOvercloudNetworkExtract(tests_base.TestCase):
|
class TestTripleoOvercloudNetworkExtract(tests_base.TestCase):
|
||||||
|
|
||||||
def test_tripleo_resource_tags_to_dict(self):
|
def test_tripleo_resource_tags_to_dict(self):
|
||||||
tags = ['foo=bar', 'baz=qux', 'tripleo_foo=bar', 'tripleo_baz=qux']
|
tags = ['foo=bar', 'baz=qux', 'tripleo_foo=bar', 'tripleo_baz=qux',
|
||||||
expected = {'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)
|
result = plugin.tripleo_resource_tags_to_dict(tags)
|
||||||
self.assertEqual(expected, result)
|
self.assertEqual(expected, result)
|
||||||
|
|
||||||
|
@ -69,14 +71,13 @@ class TestTripleoOvercloudNetworkExtract(tests_base.TestCase):
|
||||||
mtu=1500,
|
mtu=1500,
|
||||||
is_shared=False,
|
is_shared=False,
|
||||||
is_admin_state_up=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
|
conn_mock.network.get_network.return_value = fake_network
|
||||||
expected = {
|
expected = (3, {'name_lower': 'public',
|
||||||
'name_lower': 'public',
|
'dns_domain': 'public.localdomain.',
|
||||||
'dns_domain': 'public.localdomain.',
|
'service_net_map_replace': 'external'})
|
||||||
'service_net_map_replace': 'external',
|
|
||||||
}
|
|
||||||
result = plugin.get_network_info(
|
result = plugin.get_network_info(
|
||||||
conn_mock, '132f871f-eaec-4fed-9475-0d54465e0f00')
|
conn_mock, '132f871f-eaec-4fed-9475-0d54465e0f00')
|
||||||
self.assertEqual(expected, result)
|
self.assertEqual(expected, result)
|
||||||
|
@ -264,7 +265,7 @@ class TestTripleoOvercloudNetworkExtract(tests_base.TestCase):
|
||||||
'physical_network': 'leaf1',
|
'physical_network': 'leaf1',
|
||||||
}
|
}
|
||||||
|
|
||||||
mock_get_network.return_value = fake_network
|
mock_get_network.return_value = (0, fake_network)
|
||||||
mock_get_subnet.side_effect = [
|
mock_get_subnet.side_effect = [
|
||||||
('storage', fake_subnet_storage),
|
('storage', fake_subnet_storage),
|
||||||
('leaf1', fake_subnet_storage_leaf1)]
|
('leaf1', fake_subnet_storage_leaf1)]
|
||||||
|
|
Loading…
Reference in New Issue