diff --git a/releasenotes/notes/deployments-per-server-ea747fcff19c884d.yaml b/releasenotes/notes/deployments-per-server-ea747fcff19c884d.yaml new file mode 100644 index 000000000..4bb7ebc94 --- /dev/null +++ b/releasenotes/notes/deployments-per-server-ea747fcff19c884d.yaml @@ -0,0 +1,7 @@ +--- +fixes: + - The list of pre and post deployment names generated with config-download + are now written per server instead of per role. This change handles the + case where a deployment may apply to only an individual or set of servers + within a role, and not all servers in that role. host_vars are used to set + the variable of deployment names per server instead of group_vars. diff --git a/tripleo_common/templates/group_var_role.j2 b/tripleo_common/templates/group_var_role.j2 index b4821ff64..b8b16f0dc 100644 --- a/tripleo_common/templates/group_var_role.j2 +++ b/tripleo_common/templates/group_var_role.j2 @@ -1,14 +1,3 @@ -{{ role }}_pre_deployments: -{% for deployment in pre_deployments %} - - {{ deployment }} -{% endfor %} - -{{ role }}_post_deployments: {% if not post_deployments %} [] {% endif %} - -{% for deployment in post_deployments %} - - {{ deployment }} -{% endfor %} - {% for k,v in role_group_vars.items() %} {{ k }}: {{ v }} {% endfor %} diff --git a/tripleo_common/templates/host_var_server.j2 b/tripleo_common/templates/host_var_server.j2 new file mode 100644 index 000000000..49c40a00f --- /dev/null +++ b/tripleo_common/templates/host_var_server.j2 @@ -0,0 +1,10 @@ +{{ role }}_pre_deployments: +{% for deployment in pre_deployments %} + - {{ deployment }} +{% endfor %} + +{{ role }}_post_deployments: {% if not post_deployments %} [] {% endif %} + +{% for deployment in post_deployments %} + - {{ deployment }} +{% endfor %} diff --git a/tripleo_common/tests/utils/data/Compute b/tripleo_common/tests/utils/data/Compute index a35e878de..31d60d7d9 100644 --- a/tripleo_common/tests/utils/data/Compute +++ b/tripleo_common/tests/utils/data/Compute @@ -1,10 +1,2 @@ -Compute_pre_deployments: - - ComputeHostEntryDeployment - - NetworkDeployment - - MyExtraConfigPost - - AnsibleDeployment - -Compute_post_deployments: [] - max_fail_percentage: 15 any_errors_fatal: yes diff --git a/tripleo_common/tests/utils/data/Controller b/tripleo_common/tests/utils/data/Controller index 7cb5e9c51..31d60d7d9 100644 --- a/tripleo_common/tests/utils/data/Controller +++ b/tripleo_common/tests/utils/data/Controller @@ -1,10 +1,2 @@ -Controller_pre_deployments: - - ControllerHostEntryDeployment - - NetworkDeployment - - MyPostConfig - - MyExtraConfigPost - -Controller_post_deployments: [] - max_fail_percentage: 15 any_errors_fatal: yes diff --git a/tripleo_common/tests/utils/data/config_data.yaml b/tripleo_common/tests/utils/data/config_data.yaml index 8799a501e..0f92db7c8 100644 --- a/tripleo_common/tests/utils/data/config_data.yaml +++ b/tripleo_common/tests/utils/data/config_data.yaml @@ -52,6 +52,8 @@ deployments: deployment: 5096a321-64f9-4f07-a74c-53f2b029e62e config: 9ccb2f66-7cd8-4e3e-a034-4c1cfafd037e name: MyExtraConfigPost + + # Only applies to overcloud-novacompute-2 - server: 169b46f8-1965-4d90-a7de-f36fb4a830fe deployment: 05c94b5d-59ad-484e-b120-e271c2e100ed config: 391263ba-3d06-43b6-a47e-481808aaff20 diff --git a/tripleo_common/tests/utils/data/host_vars/overcloud-controller-0 b/tripleo_common/tests/utils/data/host_vars/overcloud-controller-0 new file mode 100644 index 000000000..f0a6bbd8c --- /dev/null +++ b/tripleo_common/tests/utils/data/host_vars/overcloud-controller-0 @@ -0,0 +1,7 @@ +Controller_pre_deployments: + - ControllerHostEntryDeployment + - NetworkDeployment + - MyPostConfig + - MyExtraConfigPost + +Controller_post_deployments: [] diff --git a/tripleo_common/tests/utils/data/host_vars/overcloud-novacompute-0 b/tripleo_common/tests/utils/data/host_vars/overcloud-novacompute-0 new file mode 100644 index 000000000..fcadbeeac --- /dev/null +++ b/tripleo_common/tests/utils/data/host_vars/overcloud-novacompute-0 @@ -0,0 +1,6 @@ +Compute_pre_deployments: + - ComputeHostEntryDeployment + - NetworkDeployment + - MyExtraConfigPost + +Compute_post_deployments: [] diff --git a/tripleo_common/tests/utils/data/host_vars/overcloud-novacompute-1 b/tripleo_common/tests/utils/data/host_vars/overcloud-novacompute-1 new file mode 100644 index 000000000..fcadbeeac --- /dev/null +++ b/tripleo_common/tests/utils/data/host_vars/overcloud-novacompute-1 @@ -0,0 +1,6 @@ +Compute_pre_deployments: + - ComputeHostEntryDeployment + - NetworkDeployment + - MyExtraConfigPost + +Compute_post_deployments: [] diff --git a/tripleo_common/tests/utils/data/host_vars/overcloud-novacompute-2 b/tripleo_common/tests/utils/data/host_vars/overcloud-novacompute-2 new file mode 100644 index 000000000..b74d0f6f6 --- /dev/null +++ b/tripleo_common/tests/utils/data/host_vars/overcloud-novacompute-2 @@ -0,0 +1,7 @@ +Compute_pre_deployments: + - ComputeHostEntryDeployment + - NetworkDeployment + - MyExtraConfigPost + - AnsibleDeployment + +Compute_post_deployments: [] diff --git a/tripleo_common/tests/utils/test_config.py b/tripleo_common/tests/utils/test_config.py index c757b7c74..cd52a882b 100644 --- a/tripleo_common/tests/utils/test_config.py +++ b/tripleo_common/tests/utils/test_config.py @@ -300,9 +300,19 @@ class TestConfig(base.TestCase): 'Compute', ]: self.assertEqual( + self._get_yaml_file(f), yaml.safe_load( - open(os.path.join(tmp_path, 'group_vars', f)).read()), - self._get_yaml_file(f)) + open(os.path.join(tmp_path, 'group_vars', f)).read())) + + for f in ['overcloud-controller-0', + 'overcloud-novacompute-0', + 'overcloud-novacompute-1', + 'overcloud-novacompute-2']: + + self.assertEqual( + self._get_yaml_file(os.path.join('host_vars', f)), + yaml.safe_load( + open(os.path.join(tmp_path, 'host_vars', f)).read())) for d in ['ControllerHostEntryDeployment', 'NetworkDeployment', diff --git a/tripleo_common/utils/config.py b/tripleo_common/utils/config.py index 54636a0de..b09acd19d 100644 --- a/tripleo_common/utils/config.py +++ b/tripleo_common/utils/config.py @@ -245,10 +245,10 @@ class Config(object): # server_names is a dict of server id to server_name for easier lookup server_names = self.get_server_names() server_ids = dict([(v, k) for (k, v) in server_names.items()]) - # role_deployment_names is a dict of role names to deployment names for - # that role. The deployment names are further separated in their own - # dict with keys of pre_deployment/post_deployment. - role_deployment_names = {} + # server_deployment_names is a dict of server names to deployment names + # for that role. The deployment names are further separated in their + # own dict with keys of pre_deployment/post_deployment. + server_deployment_names = {} # server_roles is a dict of server name to server role for easier # lookup server_roles = {} @@ -325,10 +325,11 @@ class Config(object): raise Exception(err_msg) role = self.get_role_from_server_id(stack, server_id) - role_deployments = role_deployment_names.setdefault(role, {}) - role_pre_deployments = role_deployments.setdefault( + server_pre_deployments = server_deployment_names.setdefault( + server_names[server_id], {}).setdefault( 'pre_deployments', []) - role_post_deployments = role_deployments.setdefault( + server_post_deployments = server_deployment_names.setdefault( + server_names[server_id], {}).setdefault( 'post_deployments', []) server_roles[server_names[server_id]] = role @@ -339,11 +340,11 @@ class Config(object): # they are consistent interfaces in our templates. if 'ExtraConfigPost' in deployment.physical_resource_id or \ 'PostConfig' in deployment.physical_resource_id: - if deployment_name not in role_post_deployments: - role_post_deployments.append(deployment_name) + if deployment_name not in server_post_deployments: + server_post_deployments.append(deployment_name) else: - if deployment_name not in role_pre_deployments: - role_pre_deployments.append(deployment_name) + if deployment_name not in server_pre_deployments: + server_pre_deployments.append(deployment_name) env, templates_path = self.get_jinja_env(config_dir) @@ -412,19 +413,31 @@ class Config(object): self.validate_config(template_data, deployment_path) f.write(template_data) - for role, deployments in role_deployment_names.items(): + # Render group_vars + for role in set(server_roles.values()): group_var_role_path = os.path.join(group_vars_dir, role) group_var_role_template = env.get_template('group_var_role.j2') with open(group_var_role_path, 'w') as f: template_data = group_var_role_template.render( role=role, - pre_deployments=deployments['pre_deployments'], - post_deployments=deployments['post_deployments'], role_group_vars=role_group_vars[role]) self.validate_config(template_data, group_var_role_path) f.write(template_data) + # Render host_vars + for server, deployments in server_deployment_names.items(): + host_var_server_path = os.path.join(host_vars_dir, server) + host_var_server_template = env.get_template('host_var_server.j2') + + with open(host_var_server_path, 'w') as f: + template_data = host_var_server_template.render( + role=server_roles[server], + pre_deployments=deployments['pre_deployments'], + post_deployments=deployments['post_deployments']) + self.validate_config(template_data, host_var_server_path) + f.write(template_data) + shutil.copyfile( os.path.join(templates_path, 'deployments.yaml'), os.path.join(config_dir, 'deployments.yaml'))