Delivers upgrade scripts where upgrade steps are disabled
[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               params:
76                 SERVICE_PASSWORD: { get_param: NovaPassword }
77                 REGION_NAME: { get_param: KeystoneRegion }
78                 AUTH_URL: { get_param: [EndpointMap, KeystoneAdmin, uri_no_suffix]}
79           - get_file: ../extraconfig/tasks/pacemaker_common_functions.sh
80           - get_file: ../extraconfig/tasks/tripleo_upgrade_node.sh
81
82   {{role.name}}DeliverUpgradeScriptDeployment:
83     type: OS::Heat::SoftwareDeploymentGroup
84     properties:
85       servers:  {get_param: [servers, {{role.name}}]}
86       config: {get_resource: {{role.name}}DeliverUpgradeScriptConfig}
87 {% endfor %}
88
89 # Upgrade Steps for all roles, batched updates
90 # The UpgradeConfig resources could actually be created without
91 # serialization, but the event output is easier to follow if we
92 # do, and there should be minimal performance hit (creating the
93 # config is cheap compared to the time to apply the deployment).
94 {% for step in range(0, batch_upgrade_steps_max) %}
95   # Batch config resources step {{step}}
96   {%- for role in roles %}
97   {{role.name}}UpgradeBatchConfig_Step{{step}}:
98     type: OS::TripleO::UpgradeConfig
99   {%- if step > 0 %}
100     condition: {{role.name}}UpgradeBatchConfigEnabled
101     {% if role.name in enabled_roles %}
102     depends_on:
103       - {{role.name}}UpgradeBatch_Step{{step -1}}
104     {%- endif %}
105   {% else %}
106     {% for role in roles if role.disable_upgrade_deployment|default(false) %}
107       {% if deliver_script.update({'deliver': True}) %} {% endif %}
108     {% endfor %}
109     {% if deliver_script.deliver %}
110     depends_on:
111     {% endif %}
112       {% for dep in roles if dep.disable_upgrade_deployment|default(false) %}
113       - {{dep.name}}DeliverUpgradeScriptDeployment
114       {% endfor %}
115   {% endif %}
116     properties:
117       UpgradeStepConfig: {get_param: [role_data, {{role.name}}, upgrade_batch_tasks]}
118       step: {{step}}
119   {%- endfor %}
120
121   # Batch deployment resources for step {{step}} (only for enabled roles)
122   {%- for role in enabled_roles %}
123   {{role.name}}UpgradeBatch_Step{{step}}:
124     type: OS::Heat::SoftwareDeploymentGroup
125     condition: {{role.name}}UpgradeBatchConfigEnabled
126     {%- if step > 0 %}
127     depends_on:
128       - {{role.name}}UpgradeBatch_Step{{step -1}}
129     {% else %}
130     depends_on:
131       - {{role.name}}UpgradeBatchConfig_Step{{step}}
132     {%- endif %}
133     update_policy:
134       batch_create:
135         max_batch_size: {{role.upgrade_batch_size|default(1)}}
136       rolling_update:
137         max_batch_size: {{role.upgrade_batch_size|default(1)}}
138     properties:
139       name: {{role.name}}UpgradeBatch_Step{{step}}
140       servers: {get_param: [servers, {{role.name}}]}
141       config: {get_resource: {{role.name}}UpgradeBatchConfig_Step{{step}}}
142       input_values:
143         role: {{role.name}}
144         update_identifier: {get_param: UpdateIdentifier}
145   {%- endfor %}
146 {%- endfor %}
147
148 # Upgrade Steps for all roles
149 {%- for step in range(0, upgrade_steps_max) %}
150   # Config resources for step {{step}}
151   {%- for role in roles %}
152   {{role.name}}UpgradeConfig_Step{{step}}:
153     type: OS::TripleO::UpgradeConfig
154   # The UpgradeConfig resources could actually be created without
155   # serialization, but the event output is easier to follow if we
156   # do, and there should be minimal performance hit (creating the
157   # config is cheap compared to the time to apply the deployment).
158   {%- if step > 0 %}
159     condition: {{role.name}}UpgradeConfigEnabled
160     {% if role.name in enabled_roles %}
161     depends_on:
162       - {{role.name}}Upgrade_Step{{step -1}}
163     {% endif %}
164   {%- endif %}
165     properties:
166       UpgradeStepConfig: {get_param: [role_data, {{role.name}}, upgrade_tasks]}
167       step: {{step}}
168   {%- endfor %}
169
170   # Deployment resources for step {{step}} (only for enabled roles)
171   {%- for role in enabled_roles %}
172   {{role.name}}Upgrade_Step{{step}}:
173     type: OS::Heat::SoftwareDeploymentGroup
174     {%- if step > 0 %}
175     condition: {{role.name}}UpgradeConfigEnabled
176     depends_on:
177       - {{role.name}}Upgrade_Step{{step -1}}
178     {%- endif %}
179     properties:
180       name: {{role.name}}Upgrade_Step{{step}}
181       servers: {get_param: [servers, {{role.name}}]}
182       config: {get_resource: {{role.name}}UpgradeConfig_Step{{step}}}
183       input_values:
184         role: {{role.name}}
185         update_identifier: {get_param: UpdateIdentifier}
186   {%- endfor %}
187 {%- endfor %}
188
189   # Post upgrade deployment steps for all roles
190   # This runs the normal configuration (e.g puppet) steps unless upgrade
191   # is disabled for the role
192   AllNodesPostUpgradeSteps:
193     type: OS::TripleO::PostUpgradeSteps
194     depends_on:
195 {%- for dep in enabled_roles %}
196       - {{dep.name}}Upgrade_Step{{upgrade_steps_max - 1}}
197 {%- endfor %}
198     properties:
199       servers: {get_param: servers}
200       role_data: {get_param: role_data}
201
202 outputs:
203   # Output the config for each role, just use Step1 as the config should be
204   # the same for all steps (only the tag provided differs)
205   upgrade_configs:
206     description: The per-role upgrade configuration used
207     value:
208 {% for role in roles %}
209       {{role.name.lower()}}: {get_attr: [{{role.name}}UpgradeConfig_Step1, upgrade_config]}
210 {% endfor %}