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