Merge "Add all existing parameter mismatches to exclusion list"
[apex-tripleo-heat-templates.git] / puppet / major_upgrade_steps.j2.yaml
1 {% set enabled_roles = roles|rejectattr('disable_upgrade_deployment')|list -%}
2 {% set batch_upgrade_steps_max = 3 -%}
3 {% set upgrade_steps_max = 6 -%}
4 {% set deliver_script = {'deliver': False} -%}
5 heat_template_version: pike
6 description: 'Upgrade steps for all roles'
7
8 parameters:
9   servers:
10     type: json
11   stack_name:
12     type: string
13     description: Name of the topmost stack
14   role_data:
15     type: json
16     description: Mapping of Role name e.g Controller to the per-role data
17   ctlplane_service_ips:
18     type: json
19   UpdateIdentifier:
20     type: string
21     description: >
22       Setting to a previously unused value during stack-update will trigger
23       the Upgrade resources to re-run on all roles.
24   EndpointMap:
25     default: {}
26     description: Mapping of service endpoint -> protocol. Typically set
27                  via parameter_defaults in the resource registry.
28     type: json
29   KeystoneRegion:
30     type: string
31     default: 'regionOne'
32     description: Keystone region for endpoint
33   NovaPassword:
34     description: The password for the nova service and db account, used by nova-api.
35     type: string
36     hidden: true
37
38 resources:
39
40 {% for role in roles if role.disable_upgrade_deployment|default(false) %}
41   {{role.name}}DeliverUpgradeScriptConfig:
42     type: OS::Heat::SoftwareConfig
43     properties:
44       group: script
45       config:
46         list_join:
47         - ''
48         - - "#!/bin/bash\n\n"
49           - "set -eu\n\n"
50           - str_replace:
51               template: |
52                 ROLE='ROLE_NAME'
53               params:
54                 ROLE_NAME: {{role.name}}
55           - get_file: ../extraconfig/tasks/pacemaker_common_functions.sh
56           - get_file: ../extraconfig/tasks/run_puppet.sh
57           - get_file: ../extraconfig/tasks/tripleo_upgrade_node.sh
58
59   {{role.name}}DeliverUpgradeScriptDeployment:
60     type: OS::Heat::SoftwareDeploymentGroup
61     properties:
62       servers:  {get_param: [servers, {{role.name}}]}
63       config: {get_resource: {{role.name}}DeliverUpgradeScriptConfig}
64 {% endfor %}
65
66 # Upgrade Steps for all roles, batched updates
67 # The UpgradeConfig resources could actually be created without
68 # serialization, but the event output is easier to follow if we
69 # do, and there should be minimal performance hit (creating the
70 # config is cheap compared to the time to apply the deployment).
71 {% for step in range(0, batch_upgrade_steps_max) %}
72   # Batch config resources step {{step}}
73   {%- for role in roles %}
74   {{role.name}}UpgradeBatchConfig_Step{{step}}:
75     type: OS::TripleO::UpgradeConfig
76     {%- if step > 0 %}
77     depends_on:
78       {%- for role_inside in enabled_roles %}
79       - {{role_inside.name}}UpgradeBatch_Step{{step -1}}
80       {%- endfor %}
81     {% else %}
82     {% for role in roles if role.disable_upgrade_deployment|default(false) %}
83       {% if deliver_script.update({'deliver': True}) %} {% endif %}
84     {% endfor %}
85     {% if deliver_script.deliver %}
86     depends_on:
87       {% for dep in roles if dep.disable_upgrade_deployment|default(false) %}
88       - {{dep.name}}DeliverUpgradeScriptDeployment
89       {% endfor %}
90     {% endif %}
91     {% endif %}
92     properties:
93       UpgradeStepConfig: {get_param: [role_data, {{role.name}}, upgrade_batch_tasks]}
94       step: {{step}}
95   {%- endfor %}
96
97   # Batch deployment resources for step {{step}} (only for enabled roles)
98   {%- for role in enabled_roles %}
99   {{role.name}}UpgradeBatch_Step{{step}}:
100     type: OS::Heat::SoftwareDeploymentGroup
101     {%- if step > 0 %}
102     depends_on:
103       {%- for role_inside in enabled_roles %}
104       - {{role_inside.name}}UpgradeBatch_Step{{step -1}}
105       {%- endfor %}
106     {% else %}
107     {% for role in roles if role.disable_upgrade_deployment|default(false) %}
108       {% if deliver_script.update({'deliver': True}) %} {% endif %}
109     {% endfor %}
110     {% if deliver_script.deliver %}
111     depends_on:
112       {% for dep in roles if dep.disable_upgrade_deployment|default(false) %}
113       - {{dep.name}}DeliverUpgradeScriptDeployment
114       {% endfor %}
115     {% endif %}
116     {% endif %}
117     update_policy:
118       batch_create:
119         max_batch_size: {{role.upgrade_batch_size|default(1)}}
120       rolling_update:
121         max_batch_size: {{role.upgrade_batch_size|default(1)}}
122     properties:
123       servers: {get_param: [servers, {{role.name}}]}
124       config: {get_resource: {{role.name}}UpgradeBatchConfig_Step{{step}}}
125       input_values:
126         role: {{role.name}}
127         update_identifier: {get_param: UpdateIdentifier}
128   {%- endfor %}
129 {%- endfor %}
130
131 # Dump the puppet manifests to be apply later when disable_upgrade_deployment
132 # is to true
133 {% for role in roles  if role.disable_upgrade_deployment|default(false) %}
134   {{role.name}}DeliverPuppetConfig:
135     type: OS::Heat::SoftwareConfig
136     properties:
137       group: script
138       config:
139         list_join:
140         - ''
141         - - str_replace:
142               template: |
143                 #!/bin/bash
144                 cat > /root/{{role.name}}_puppet_config.pp << ENDOFCAT
145                 PUPPET_CLASSES
146                 ENDOFCAT
147               params:
148                 PUPPET_CLASSES: {get_param: [role_data, {{role.name}}, step_config]}
149
150   {{role.name}}DeliverPuppetDeployment:
151     type: OS::Heat::SoftwareDeploymentGroup
152     properties:
153       servers:  {get_param: [servers, {{role.name}}]}
154       config: {get_resource: {{role.name}}DeliverPuppetConfig}
155 {% endfor %}
156
157 # Upgrade Steps for all roles
158 {%- for step in range(0, upgrade_steps_max) %}
159   # Config resources for step {{step}}
160   {%- for role in roles %}
161   {{role.name}}UpgradeConfig_Step{{step}}:
162     type: OS::TripleO::UpgradeConfig
163     # The UpgradeConfig resources could actually be created without
164     # serialization, but the event output is easier to follow if we
165     # do, and there should be minimal performance hit (creating the
166     # config is cheap compared to the time to apply the deployment).
167     depends_on:
168       {%- for role_inside in enabled_roles %}
169       {%- if step > 0 %}
170       - {{role_inside.name}}Upgrade_Step{{step -1}}
171       {%- else %}
172       - {{role_inside.name}}UpgradeBatch_Step{{batch_upgrade_steps_max -1}}
173       {%- endif %}
174       {%- endfor %}
175     properties:
176       UpgradeStepConfig: {get_param: [role_data, {{role.name}}, upgrade_tasks]}
177       step: {{step}}
178   {%- endfor %}
179
180   # Deployment resources for step {{step}} (only for enabled roles)
181   {%- for role in enabled_roles %}
182   {{role.name}}Upgrade_Step{{step}}:
183     type: OS::Heat::SoftwareDeploymentGroup
184     depends_on:
185       {%- for role_inside in enabled_roles %}
186       {%- if step > 0 %}
187       - {{role_inside.name}}Upgrade_Step{{step -1}}
188       {%- else %}
189       - {{role_inside.name}}UpgradeBatch_Step{{batch_upgrade_steps_max -1}}
190       {%- endif %}
191       {%- endfor %}
192     properties:
193       servers: {get_param: [servers, {{role.name}}]}
194       config: {get_resource: {{role.name}}UpgradeConfig_Step{{step}}}
195       input_values:
196         role: {{role.name}}
197         update_identifier: {get_param: UpdateIdentifier}
198   {%- endfor %}
199 {%- endfor %}
200
201   # Post upgrade deployment steps for all roles
202   # This runs the normal configuration (e.g puppet) steps unless upgrade
203   # is disabled for the role
204   AllNodesPostUpgradeSteps:
205     type: OS::TripleO::PostUpgradeSteps
206     depends_on:
207 {%- for dep in enabled_roles %}
208       - {{dep.name}}Upgrade_Step{{upgrade_steps_max - 1}}
209 {%- endfor %}
210     properties:
211       servers: {get_param: servers}
212       stack_name: {get_param: stack_name}
213       role_data: {get_param: role_data}
214       ctlplane_service_ips: {get_param: ctlplane_service_ips}
215
216 outputs:
217   # Output the config for each role, just use Step1 as the config should be
218   # the same for all steps (only the tag provided differs)
219   upgrade_configs:
220     description: The per-role upgrade configuration used
221     value:
222 {% for role in roles %}
223       {{role.name.lower()}}: {get_attr: [{{role.name}}UpgradeConfig_Step1, upgrade_config]}
224 {% endfor %}