Merge "Add missing tag to nova-placement docker image"
[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
36 resources:
37
38 {% for role in roles if role.disable_upgrade_deployment|default(false) %}
39   {{role.name}}DeliverUpgradeScriptConfig:
40     type: OS::Heat::SoftwareConfig
41     properties:
42       group: script
43       config:
44         list_join:
45         - ''
46         - - "#!/bin/bash\n\n"
47           - "set -eu\n\n"
48           - "if hiera -c /etc/puppet/hiera.yaml service_names | grep nova_compute ; then\n\n"
49           - "  crudini --set /etc/nova/nova.conf placement auth_type password\n\n"
50           - "  crudini --set /etc/nova/nova.conf placement username placement\n\n"
51           - "  crudini --set /etc/nova/nova.conf placement project_domain_name Default\n\n"
52           - "  crudini --set /etc/nova/nova.conf placement user_domain_name Default\n\n"
53           - "  crudini --set /etc/nova/nova.conf placement project_name service\n\n"
54           - "  crudini --set /etc/nova/nova.conf placement os_interface internal\n\n"
55           - str_replace:
56               template: |
57                 crudini --set /etc/nova/nova.conf placement password 'SERVICE_PASSWORD'
58                 crudini --set /etc/nova/nova.conf placement os_region_name 'REGION_NAME'
59                 crudini --set /etc/nova/nova.conf placement auth_url 'AUTH_URL'
60               params:
61                 SERVICE_PASSWORD: { get_param: NovaPassword }
62                 REGION_NAME: { get_param: KeystoneRegion }
63                 AUTH_URL: { get_param: [EndpointMap, KeystoneAdmin, uri_no_suffix]}
64           - "  systemctl restart openstack-nova-compute\n\n"
65           - "fi\n\n"
66           - str_replace:
67               template: |
68                 ROLE='ROLE_NAME'
69               params:
70                 ROLE_NAME: {{role.name}}
71           - get_file: ../extraconfig/tasks/pacemaker_common_functions.sh
72           - get_file: ../extraconfig/tasks/run_puppet.sh
73           - get_file: ../extraconfig/tasks/tripleo_upgrade_node.sh
74
75   {{role.name}}DeliverUpgradeScriptDeployment:
76     type: OS::Heat::SoftwareDeploymentGroup
77     properties:
78       servers:  {get_param: [servers, {{role.name}}]}
79       config: {get_resource: {{role.name}}DeliverUpgradeScriptConfig}
80 {% endfor %}
81
82 # Upgrade Steps for all roles, batched updates
83 # The UpgradeConfig resources could actually be created without
84 # serialization, but the event output is easier to follow if we
85 # do, and there should be minimal performance hit (creating the
86 # config is cheap compared to the time to apply the deployment).
87 {% for step in range(0, batch_upgrade_steps_max) %}
88   # Batch config resources step {{step}}
89   {%- for role in roles %}
90   {{role.name}}UpgradeBatchConfig_Step{{step}}:
91     type: OS::TripleO::UpgradeConfig
92   {%- if step > 0 %}
93     {%- if role in enabled_roles %}
94     depends_on:
95       - {{role.name}}UpgradeBatch_Step{{step -1}}
96     {%- endif %}
97   {%- else %}
98     {% for role in roles if role.disable_upgrade_deployment|default(false) %}
99       {% if deliver_script.update({'deliver': True}) %} {% endif %}
100     {% endfor %}
101     {% if deliver_script.deliver %}
102     depends_on:
103     {% endif %}
104       {% for dep in roles if dep.disable_upgrade_deployment|default(false) %}
105       - {{dep.name}}DeliverUpgradeScriptDeployment
106       {% endfor %}
107   {% endif %}
108     properties:
109       UpgradeStepConfig: {get_param: [role_data, {{role.name}}, upgrade_batch_tasks]}
110       step: {{step}}
111   {%- endfor %}
112
113   # Batch deployment resources for step {{step}} (only for enabled roles)
114   {%- for role in enabled_roles %}
115   {{role.name}}UpgradeBatch_Step{{step}}:
116     type: OS::Heat::SoftwareDeploymentGroup
117     {%- if step > 0 %}
118     depends_on:
119       {%- for role_inside in enabled_roles %}
120       - {{role_inside.name}}UpgradeBatch_Step{{step -1}}
121       {%- endfor %}
122     {%- endif %}
123     update_policy:
124       batch_create:
125         max_batch_size: {{role.upgrade_batch_size|default(1)}}
126       rolling_update:
127         max_batch_size: {{role.upgrade_batch_size|default(1)}}
128     properties:
129       name: {{role.name}}UpgradeBatch_Step{{step}}
130       servers: {get_param: [servers, {{role.name}}]}
131       config: {get_resource: {{role.name}}UpgradeBatchConfig_Step{{step}}}
132       input_values:
133         role: {{role.name}}
134         update_identifier: {get_param: UpdateIdentifier}
135   {%- endfor %}
136 {%- endfor %}
137
138 # Dump the puppet manifests to be apply later when disable_upgrade_deployment
139 # is to true
140 {% for role in roles  if role.disable_upgrade_deployment|default(false) %}
141   {{role.name}}DeliverPuppetConfig:
142     type: OS::Heat::SoftwareConfig
143     properties:
144       group: script
145       config:
146         list_join:
147         - ''
148         - - str_replace:
149               template: |
150                 #!/bin/bash
151                 cat > /root/{{role.name}}_puppet_config.pp << ENDOFCAT
152                 PUPPET_CLASSES
153                 ENDOFCAT
154               params:
155                 PUPPET_CLASSES: {get_param: [role_data, {{role.name}}, step_config]}
156
157   {{role.name}}DeliverPuppetDeployment:
158     type: OS::Heat::SoftwareDeploymentGroup
159     properties:
160       servers:  {get_param: [servers, {{role.name}}]}
161       config: {get_resource: {{role.name}}DeliverPuppetConfig}
162 {% endfor %}
163
164 # Upgrade Steps for all roles
165 {%- for step in range(0, upgrade_steps_max) %}
166   # Config resources for step {{step}}
167   {%- for role in roles %}
168   {{role.name}}UpgradeConfig_Step{{step}}:
169     type: OS::TripleO::UpgradeConfig
170   # The UpgradeConfig resources could actually be created without
171   # serialization, but the event output is easier to follow if we
172   # do, and there should be minimal performance hit (creating the
173   # config is cheap compared to the time to apply the deployment).
174   {%- if step > 0 %}
175     {%- if role in enabled_roles %}
176     depends_on:
177       - {{role.name}}Upgrade_Step{{step -1}}
178     {%- endif %}
179   {%- endif %}
180     properties:
181       UpgradeStepConfig: {get_param: [role_data, {{role.name}}, upgrade_tasks]}
182       step: {{step}}
183   {%- endfor %}
184
185   # Deployment resources for step {{step}} (only for enabled roles)
186   {%- for role in enabled_roles %}
187   {{role.name}}Upgrade_Step{{step}}:
188     type: OS::Heat::SoftwareDeploymentGroup
189     {%- if step > 0 %}
190     # Make sure we wait that all roles have finished their own
191     # previous step before going to the next, so we can guarantee
192     # state for each steps.
193     depends_on:
194       {%- for role_inside in enabled_roles %}
195       - {{role_inside.name}}Upgrade_Step{{step -1}}
196       {%- endfor %}
197     {%- else %}
198     depends_on:
199       {%- for role_inside in enabled_roles %}
200       - {{role_inside.name}}UpgradeBatch_Step{{batch_upgrade_steps_max -1}}
201       {%- endfor %}
202     {%- endif %}
203     properties:
204       name: {{role.name}}Upgrade_Step{{step}}
205       servers: {get_param: [servers, {{role.name}}]}
206       config: {get_resource: {{role.name}}UpgradeConfig_Step{{step}}}
207       input_values:
208         role: {{role.name}}
209         update_identifier: {get_param: UpdateIdentifier}
210   {%- endfor %}
211 {%- endfor %}
212
213   # Post upgrade deployment steps for all roles
214   # This runs the normal configuration (e.g puppet) steps unless upgrade
215   # is disabled for the role
216   AllNodesPostUpgradeSteps:
217     type: OS::TripleO::PostUpgradeSteps
218     depends_on:
219 {%- for dep in enabled_roles %}
220       - {{dep.name}}Upgrade_Step{{upgrade_steps_max - 1}}
221 {%- endfor %}
222     properties:
223       servers: {get_param: servers}
224       role_data: {get_param: role_data}
225
226 outputs:
227   # Output the config for each role, just use Step1 as the config should be
228   # the same for all steps (only the tag provided differs)
229   upgrade_configs:
230     description: The per-role upgrade configuration used
231     value:
232 {% for role in roles %}
233       {{role.name.lower()}}: {get_attr: [{{role.name}}UpgradeConfig_Step1, upgrade_config]}
234 {% endfor %}