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