Merge "Add trigger to setup a LDAP backend as keystone domaine"
[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
36 resources:
37
38 {% for role in roles if role.disable_upgrade_deployment|default(false) %}
39   {{role.name}}DeliverUpgradeScriptConfig:
40     type: OS::Heat::SoftwareConfig
41     properties:
42       group: script
43       config:
44         list_join:
45         - ''
46         - - "#!/bin/bash\n\n"
47           - "set -eu\n\n"
48           - "if hiera -c /etc/puppet/hiera.yaml service_names | grep nova_compute ; then\n\n"
49           - "  crudini --set /etc/nova/nova.conf placement auth_type password\n\n"
50           - "  crudini --set /etc/nova/nova.conf placement username placement\n\n"
51           - "  crudini --set /etc/nova/nova.conf placement project_domain_name Default\n\n"
52           - "  crudini --set /etc/nova/nova.conf placement user_domain_name Default\n\n"
53           - "  crudini --set /etc/nova/nova.conf placement project_name service\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 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     {%- if role in enabled_roles %}
93     depends_on:
94       - {{role.name}}UpgradeBatch_Step{{step -1}}
95     {%- endif %}
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     {% endif %}
103       {% for dep in roles if dep.disable_upgrade_deployment|default(false) %}
104       - {{dep.name}}DeliverUpgradeScriptDeployment
105       {% endfor %}
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     {%- endif %}
122     update_policy:
123       batch_create:
124         max_batch_size: {{role.upgrade_batch_size|default(1)}}
125       rolling_update:
126         max_batch_size: {{role.upgrade_batch_size|default(1)}}
127     properties:
128       name: {{role.name}}UpgradeBatch_Step{{step}}
129       servers: {get_param: [servers, {{role.name}}]}
130       config: {get_resource: {{role.name}}UpgradeBatchConfig_Step{{step}}}
131       input_values:
132         role: {{role.name}}
133         update_identifier: {get_param: UpdateIdentifier}
134   {%- endfor %}
135 {%- endfor %}
136
137 # Dump the puppet manifests to be apply later when disable_upgrade_deployment
138 # is to true
139 {% for role in roles  if role.disable_upgrade_deployment|default(false) %}
140   {{role.name}}DeliverPuppetConfig:
141     type: OS::Heat::SoftwareConfig
142     properties:
143       group: script
144       config:
145         list_join:
146         - ''
147         - - str_replace:
148               template: |
149                 #!/bin/bash
150                 cat > /root/{{role.name}}_puppet_config.pp << ENDOFCAT
151                 PUPPET_CLASSES
152                 ENDOFCAT
153               params:
154                 PUPPET_CLASSES: {get_param: [role_data, {{role.name}}, step_config]}
155
156   {{role.name}}DeliverPuppetDeployment:
157     type: OS::Heat::SoftwareDeploymentGroup
158     properties:
159       servers:  {get_param: [servers, {{role.name}}]}
160       config: {get_resource: {{role.name}}DeliverPuppetConfig}
161 {% endfor %}
162
163 # Upgrade Steps for all roles
164 {%- for step in range(0, upgrade_steps_max) %}
165   # Config resources for step {{step}}
166   {%- for role in roles %}
167   {{role.name}}UpgradeConfig_Step{{step}}:
168     type: OS::TripleO::UpgradeConfig
169   # The UpgradeConfig resources could actually be created without
170   # serialization, but the event output is easier to follow if we
171   # do, and there should be minimal performance hit (creating the
172   # config is cheap compared to the time to apply the deployment).
173   {%- if step > 0 %}
174     {%- if role in enabled_roles %}
175     depends_on:
176       - {{role.name}}Upgrade_Step{{step -1}}
177     {%- endif %}
178   {%- endif %}
179     properties:
180       UpgradeStepConfig: {get_param: [role_data, {{role.name}}, upgrade_tasks]}
181       step: {{step}}
182   {%- endfor %}
183
184   # Deployment resources for step {{step}} (only for enabled roles)
185   {%- for role in enabled_roles %}
186   {{role.name}}Upgrade_Step{{step}}:
187     type: OS::Heat::SoftwareDeploymentGroup
188     {%- if step > 0 %}
189     # Make sure we wait that all roles have finished their own
190     # previous step before going to the next, so we can guarantee
191     # state for each steps.
192     depends_on:
193       {%- for role_inside in enabled_roles %}
194       - {{role_inside.name}}Upgrade_Step{{step -1}}
195       {%- endfor %}
196     {%- else %}
197     depends_on:
198       {%- for role_inside in enabled_roles %}
199       - {{role_inside.name}}UpgradeBatch_Step{{batch_upgrade_steps_max -1}}
200       {%- endfor %}
201     {%- endif %}
202     properties:
203       name: {{role.name}}Upgrade_Step{{step}}
204       servers: {get_param: [servers, {{role.name}}]}
205       config: {get_resource: {{role.name}}UpgradeConfig_Step{{step}}}
206       input_values:
207         role: {{role.name}}
208         update_identifier: {get_param: UpdateIdentifier}
209   {%- endfor %}
210 {%- endfor %}
211
212   # Post upgrade deployment steps for all roles
213   # This runs the normal configuration (e.g puppet) steps unless upgrade
214   # is disabled for the role
215   AllNodesPostUpgradeSteps:
216     type: OS::TripleO::PostUpgradeSteps
217     depends_on:
218 {%- for dep in enabled_roles %}
219       - {{dep.name}}Upgrade_Step{{upgrade_steps_max - 1}}
220 {%- endfor %}
221     properties:
222       servers: {get_param: servers}
223       role_data: {get_param: role_data}
224
225 outputs:
226   # Output the config for each role, just use Step1 as the config should be
227   # the same for all steps (only the tag provided differs)
228   upgrade_configs:
229     description: The per-role upgrade configuration used
230     value:
231 {% for role in roles %}
232       {{role.name.lower()}}: {get_attr: [{{role.name}}UpgradeConfig_Step1, upgrade_config]}
233 {% endfor %}