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