Merge 'profile' into 'capabilities'

The tripleo doc states that it is possible to do
predictable node placement by setting instance
'profile'. This does not work because metalsmith
does not implement it.

This change merges the profile into 'capabilities'
when expanding the baremetal yaml definition so
that metalsmith gets the intended instructions.

Closes-Bug: #1918359
Change-Id: Id4fddf09de6aad3aeecbac36160ad98e731f41be
This commit is contained in:
Harald Jensås 2021-03-10 02:38:25 +01:00
parent cbea60bf05
commit d71eec3269
2 changed files with 60 additions and 37 deletions

View File

@ -186,12 +186,19 @@ def expand(roles, stack_name, expand_provisioned=True, default_image=None,
if default_network_config:
default_network_config = defaults.setdefault('network_config', {})
if 'profile' in defaults:
capabilities = defaults.setdefault('capabilities', {})
capabilities.setdefault('profile', defaults['profile'])
del defaults['profile']
for inst in role.get('instances', []):
merge_networks_defaults(defaults, inst)
merge_network_config_defaults(defaults, inst)
for k, v in defaults.items():
inst.setdefault(k, v)
# Need to use deepcopy here so defaults are not accidentally
# changed by per-instance manipulations
inst.setdefault(k, dcopy(v))
# Set the default hostname now for duplicate hostname
# detection during validation
@ -280,6 +287,11 @@ def expand(roles, stack_name, expand_provisioned=True, default_image=None,
_remove_vif_key(vif_networks)
inst.setdefault('nics', vif_networks)
if 'profile' in inst:
capabilities = inst.setdefault('capabilities', {})
capabilities['profile'] = inst['profile']
del inst['profile']
if unprovisioned_indexes:
parameter_defaults['%sRemovalPolicies' % name] = [{
'resource_list': unprovisioned_indexes

View File

@ -357,23 +357,28 @@ class TestExpandRoles(base.TestCase):
)
self.assertEqual(
[
{'hostname': 'compute-0.example.com', 'profile': 'compute',
{'hostname': 'compute-0.example.com',
'capabilities': {'profile': 'compute'},
'image': {'href': 'overcloud-full'},
'ssh_public_keys': 'aaaa',
'user_name': 'heat-admin'},
{'hostname': 'compute-1.example.com', 'profile': 'compute',
{'hostname': 'compute-1.example.com',
'capabilities': {'profile': 'compute'},
'image': {'href': 'overcloud-full'},
'ssh_public_keys': 'aaaa',
'user_name': 'heat-admin'},
{'hostname': 'controller-0.example.com', 'profile': 'control',
{'hostname': 'controller-0.example.com',
'capabilities': {'profile': 'control'},
'image': {'href': 'overcloud-full'},
'ssh_public_keys': 'aaaa',
'user_name': 'heat-admin'},
{'hostname': 'controller-1.example.com', 'profile': 'control',
{'hostname': 'controller-1.example.com',
'capabilities': {'profile': 'control'},
'image': {'href': 'overcloud-full'},
'ssh_public_keys': 'aaaa',
'user_name': 'heat-admin'},
{'hostname': 'controller-2.example.com', 'profile': 'control',
{'hostname': 'controller-2.example.com',
'capabilities': {'profile': 'control'},
'image': {'href': 'overcloud-full'},
'ssh_public_keys': 'aaaa',
'user_name': 'heat-admin'},
@ -438,18 +443,21 @@ class TestExpandRoles(base.TestCase):
)
self.assertEqual(
[
{'hostname': 'compute-0.example.com', 'profile': 'compute',
{'hostname': 'compute-0.example.com',
'capabilities': {'profile': 'compute'},
'image': {'href': 'overcloud-full'}},
{'hostname': 'compute-1.example.com', 'profile': 'compute',
{'hostname': 'compute-1.example.com',
'capabilities': {'profile': 'compute'},
'image': {'href': 'overcloud-full'}},
{'hostname': 'controller-X.example.com',
'image': {'href': 'overcloud-full'},
'profile': 'control-X',
'capabilities': {'profile': 'control-X'},
'networks': [{'fixed_ip': '10.1.1.1', 'network': 'inst_net'},
{'network': 'foo', 'subnet': 'foo_subnet'}],
},
# Name provides the default for hostname later on.
{'name': 'node-0', 'profile': 'control',
{'name': 'node-0',
'capabilities': {'profile': 'control'},
'hostname': 'node-0',
'networks': [
{'network': 'some_net', 'subnet': 'leaf-2', 'vif': True},
@ -511,26 +519,26 @@ class TestExpandRoles(base.TestCase):
self.assertEqual([
{
'hostname': 'compute-0.example.com',
'profile': 'compute',
'capabilities': {'profile': 'compute'},
'image': {'href': 'overcloud-full'}
}, {
'hostname': 'compute-1.example.com',
'profile': 'compute',
'capabilities': {'profile': 'compute'},
'image': {'href': 'overcloud-full'}
}, {
'hostname': 'controller-X.example.com',
'profile': 'control-X',
'capabilities': {'profile': 'control-X'},
'image': {'href': 'overcloud-full'}
}, {
'hostname': 'node-0',
'name': 'node-0',
'nics': [{'subnet': 'leaf-2'}],
'profile': 'control',
'capabilities': {'profile': 'control'},
'traits': ['CUSTOM_FOO'],
'image': {'href': 'overcloud-full'}
}, {
'hostname': 'overcloud-controller-2',
'profile': 'control',
'capabilities': {'profile': 'control'},
'image': {'href': 'overcloud-full'}
}],
instances)
@ -577,11 +585,11 @@ class TestExpandRoles(base.TestCase):
self.assertEqual([
{
'hostname': 'overcloud-controller-0',
'profile': 'control',
'capabilities': {'profile': 'control'},
'image': {'href': 'overcloud-full'}
}, {
'hostname': 'overcloud-controller-3',
'profile': 'control',
'capabilities': {'profile': 'control'},
'image': {'href': 'overcloud-full'}
}],
instances)
@ -609,11 +617,11 @@ class TestExpandRoles(base.TestCase):
self.assertEqual([
{
'hostname': 'overcloud-controller-1',
'profile': 'control',
'capabilities': {'profile': 'control'},
'image': {'href': 'overcloud-full'}
}, {
'hostname': 'overcloud-controller-2',
'profile': 'control',
'capabilities': {'profile': 'control'},
'image': {'href': 'overcloud-full'}
}],
instances)
@ -643,19 +651,19 @@ class TestExpandRoles(base.TestCase):
self.assertEqual([
{
'hostname': 'overcloud-controller-0',
'profile': 'control',
'capabilities': {'profile': 'control'},
'image': {'href': 'overcloud-full'}
}, {
'hostname': 'overcloud-controller-3',
'profile': 'control',
'capabilities': {'profile': 'control'},
'image': {'href': 'overcloud-full'}
}, {
'hostname': 'overcloud-controller-4',
'profile': 'control',
'capabilities': {'profile': 'control'},
'image': {'href': 'overcloud-full'}
}, {
'hostname': 'overcloud-controller-5',
'profile': 'control',
'capabilities': {'profile': 'control'},
'image': {'href': 'overcloud-full'}
}],
instances)
@ -687,11 +695,11 @@ class TestExpandRoles(base.TestCase):
self.assertEqual([
{
'hostname': 'overcloud-controller-1',
'profile': 'control',
'capabilities': {'profile': 'control'},
'image': {'href': 'overcloud-full'}
}, {
'hostname': 'overcloud-controller-2',
'profile': 'control',
'capabilities': {'profile': 'control'},
'image': {'href': 'overcloud-full'}
}],
instances)
@ -728,12 +736,12 @@ class TestExpandRoles(base.TestCase):
{
'hostname': 'controller-0',
'name': 'node-0',
'profile': 'control',
'capabilities': {'profile': 'control'},
'image': {'href': 'overcloud-full'}
}, {
'hostname': 'controller-3',
'name': 'node-3',
'profile': 'control',
'capabilities': {'profile': 'control'},
'image': {'href': 'overcloud-full'}
}],
instances)
@ -759,12 +767,12 @@ class TestExpandRoles(base.TestCase):
{
'hostname': 'controller-1',
'name': 'node-1',
'profile': 'control',
'capabilities': {'profile': 'control'},
'image': {'href': 'overcloud-full'}
}, {
'hostname': 'controller-2',
'name': 'node-2',
'profile': 'control',
'capabilities': {'profile': 'control'},
'image': {'href': 'overcloud-full'}
}],
instances)
@ -799,12 +807,12 @@ class TestExpandRoles(base.TestCase):
{
'hostname': 'node-0',
'name': 'node-0',
'profile': 'control',
'capabilities': {'profile': 'control'},
'image': {'href': 'overcloud-full'}
}, {
'hostname': 'node-3',
'name': 'node-3',
'profile': 'control',
'capabilities': {'profile': 'control'},
'image': {'href': 'overcloud-full'}
}],
instances)
@ -832,12 +840,12 @@ class TestExpandRoles(base.TestCase):
{
'hostname': 'node-1',
'name': 'node-1',
'profile': 'control',
'capabilities': {'profile': 'control'},
'image': {'href': 'overcloud-full'}
}, {
'hostname': 'node-2',
'name': 'node-2',
'profile': 'control',
'capabilities': {'profile': 'control'},
'image': {'href': 'overcloud-full'}
}],
instances)
@ -905,14 +913,17 @@ class TestExpandRoles(base.TestCase):
)
self.assertEqual(
[
{'hostname': 'compute-0.example.com', 'profile': 'compute',
{'hostname': 'compute-0.example.com',
'capabilities': {'profile': 'compute'},
'image': {'href': 'overcloud-full'}},
{'hostname': 'compute-1.example.com', 'profile': 'compute',
{'hostname': 'compute-1.example.com',
'capabilities': {'profile': 'compute'},
'image': {'href': 'overcloud-full'}},
{'hostname': 'overcloud-controller-0', 'profile': 'control-X',
{'hostname': 'overcloud-controller-0',
'capabilities': {'profile': 'control-X'},
'image': {'href': 'overcloud-full'}},
# Name provides the default for hostname
{'name': 'node-0', 'profile': 'control',
{'name': 'node-0', 'capabilities': {'profile': 'control'},
'hostname': 'node-0',
'image': {'href': 'overcloud-full'},
'traits': ['CUSTOM_FOO'], 'nics': [{'subnet': 'leaf-2'}]},