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