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