Merge "Use underscore for Aodh and Gnocchi's container names"
[apex-tripleo-heat-templates.git] / docker / docker-steps.j2
1 # certain initialization steps (run in a container) will occur
2 # on the role marked as primary controller or the first role listed
3 {%- set primary_role = [roles[0]] -%}
4 {%- for role in roles -%}
5   {%- if 'primary' in role.tags and 'controller' in role.tags -%}
6     {%- set _ = primary_role.pop() -%}
7     {%- set _ = primary_role.append(role) -%}
8   {%- endif -%}
9 {%- endfor -%}
10 {%- set primary_role_name = primary_role[0].name -%}
11 # primary role is: {{primary_role_name}}
12 heat_template_version: ocata
13
14 description: >
15   Post-deploy configuration steps via puppet for all roles,
16   as defined in ../roles_data.yaml
17
18 parameters:
19   servers:
20     type: json
21     description: Mapping of Role name e.g Controller to a list of servers
22   role_data:
23     type: json
24     description: Mapping of Role name e.g Controller to the per-role data
25   DeployIdentifier:
26     default: ''
27     type: string
28     description: >
29       Setting this to a unique value will re-run any deployment tasks which
30       perform configuration on a Heat stack-update.
31   EndpointMap:
32     default: {}
33     description: Mapping of service endpoint -> protocol. Typically set
34                  via parameter_defaults in the resource registry.
35     type: json
36
37 resources:
38
39   # These utility tasks use docker-puppet.py to execute tasks via puppet
40   # We only execute these on the first node in the primary role
41   {{primary_role_name}}DockerPuppetTasks:
42     type: OS::Heat::Value
43     properties:
44       type: json
45       value:
46         yaql:
47           expression:
48             dict($.data.docker_puppet_tasks.where($1 != null).selectMany($.items()).groupBy($[0], $[1]))
49           data:
50             docker_puppet_tasks: {get_param: [role_data, {{primary_role_name}}, docker_puppet_tasks]}
51
52 # BEGIN primary_role_name docker-puppet-tasks (run only on a single node)
53 {% for step in range(1, 6) %}
54
55   {{primary_role_name}}DockerPuppetJsonConfig{{step}}:
56       type: OS::Heat::StructuredConfig
57       properties:
58         group: json-file
59         config:
60           /var/lib/docker-puppet/docker-puppet-tasks{{step}}.json:
61             {get_attr: [{{primary_role_name}}DockerPuppetTasks, value, 'step_{{step}}']}
62
63   {{primary_role_name}}DockerPuppetJsonDeployment{{step}}:
64     type: OS::Heat::SoftwareDeployment
65     properties:
66       server: {get_param: [servers, {{primary_role_name}}, '0']}
67       config: {get_resource: {{primary_role_name}}DockerPuppetJsonConfig{{step}}}
68
69   {{primary_role_name}}DockerPuppetTasksConfig{{step}}:
70     type: OS::Heat::SoftwareConfig
71     properties:
72       group: script
73       config: {get_file: docker-puppet.py}
74       inputs:
75         - name: CONFIG
76         - name: NET_HOST
77         - name: NO_ARCHIVE
78         - name: STEP
79
80   {{primary_role_name}}DockerPuppetTasksDeployment{{step}}:
81     type: OS::Heat::SoftwareDeployment
82     depends_on:
83       {% for dep in roles %}
84       - {{dep.name}}Deployment_Step{{step}}
85       - {{dep.name}}ContainersDeployment_Step{{step}}
86       {% endfor %}
87       - {{primary_role_name}}DockerPuppetJsonDeployment{{step}}
88     properties:
89       name: {{primary_role_name}}DockerPuppetJsonDeployment{{step}}
90       server: {get_param: [servers, {{primary_role_name}}, '0']}
91       config: {get_resource: {{primary_role_name}}DockerPuppetTasksConfig{{step}}}
92       input_values:
93         CONFIG: /var/lib/docker-puppet/docker-puppet-tasks{{step}}.json
94         NET_HOST: 'true'
95         NO_ARCHIVE: 'true'
96         STEP: {{step}}
97
98 {% endfor %}
99 # END primary_role_name docker-puppet-tasks
100
101 {% for role in roles %}
102   # Post deployment steps for all roles
103   # A single config is re-applied with an incrementing step number
104   # {{role.name}} Role steps
105   {{role.name}}ArtifactsConfig:
106     type: ../puppet/deploy-artifacts.yaml
107
108   {{role.name}}ArtifactsDeploy:
109     type: OS::Heat::StructuredDeploymentGroup
110     properties:
111       servers:  {get_param: [servers, {{role.name}}]}
112       config: {get_resource: {{role.name}}ArtifactsConfig}
113
114   {{role.name}}PreConfig:
115     type: OS::TripleO::Tasks::{{role.name}}PreConfig
116     properties:
117       servers: {get_param: [servers, {{role.name}}]}
118       input_values:
119         update_identifier: {get_param: DeployIdentifier}
120
121   {{role.name}}CreateConfigDir:
122     type: OS::Heat::SoftwareConfig
123     properties:
124       group: script
125       config: {get_file: create-config-dir.sh}
126
127   {{role.name}}CreateConfigDirDeployment:
128     type: OS::Heat::SoftwareDeploymentGroup
129     properties:
130       servers: {get_param: [servers, {{role.name}}]}
131       config: {get_resource: {{role.name}}CreateConfigDir}
132
133   {{role.name}}HostPrepAnsible:
134     type: OS::Heat::Value
135     properties:
136       value:
137         str_replace:
138           template: CONFIG
139           params:
140             CONFIG:
141               - hosts: localhost
142                 connection: local
143                 tasks: {get_param: [role_data, {{role.name}}, host_prep_tasks]}
144
145   {{role.name}}HostPrepConfig:
146     type: OS::Heat::SoftwareConfig
147     properties:
148       group: ansible
149       options:
150         modulepath: /usr/share/ansible-modules
151       config: {get_attr: [{{role.name}}HostPrepAnsible, value]}
152
153   {{role.name}}HostPrepDeployment:
154     type: OS::Heat::SoftwareDeploymentGroup
155     properties:
156       servers: {get_param: [servers, {{role.name}}]}
157       config: {get_resource: {{role.name}}HostPrepConfig}
158
159   # this creates a JSON config file for our docker-puppet.py script
160   {{role.name}}GenPuppetConfig:
161     type: OS::Heat::StructuredConfig
162     properties:
163       group: json-file
164       config:
165         /var/lib/docker-puppet/docker-puppet.json:
166           {get_param: [role_data, {{role.name}}, puppet_config]}
167
168   {{role.name}}GenPuppetDeployment:
169     type: OS::Heat::SoftwareDeploymentGroup
170     properties:
171       servers: {get_param: [servers, {{role.name}}]}
172       config: {get_resource: {{role.name}}GenPuppetConfig}
173
174   {{role.name}}GenerateConfig:
175     type: OS::Heat::SoftwareConfig
176     properties:
177       group: script
178       config: {get_file: docker-puppet.py}
179
180   {{role.name}}GenerateConfigDeployment:
181     type: OS::Heat::SoftwareDeploymentGroup
182     depends_on: [{{role.name}}GenPuppetDeployment, {{role.name}}ArtifactsDeploy, {{role.name}}CreateConfigDirDeployment, {{role.name}}HostPrepDeployment]
183     properties:
184       name: {{role.name}}GenerateConfigDeployment
185       servers: {get_param: [servers, {{role.name}}]}
186       config: {get_resource: {{role.name}}GenerateConfig}
187
188   {{role.name}}PuppetStepConfig:
189     type: OS::Heat::Value
190     properties:
191       type: string
192       value:
193         yaql:
194           expression:
195             # select 'step_config' only from services that do not have a docker_config
196             $.data.service_names.zip($.data.step_config, $.data.docker_config).where($[2] = null).where($[1] != null).select($[1]).join("\n")
197           data:
198             service_names: {get_param: [role_data, {{role.name}}, service_names]}
199             step_config: {get_param: [role_data, {{role.name}}, step_config]}
200             docker_config: {get_param: [role_data, {{role.name}}, docker_config]}
201
202   {{role.name}}DockerConfig:
203     type: OS::Heat::Value
204     properties:
205       type: json
206       value:
207         yaql:
208           expression:
209             # select 'docker_config' only from services that have it
210             $.data.service_names.zip($.data.docker_config).where($[1] != null).select($[1]).reduce($1.mergeWith($2), {})
211           data:
212             service_names: {get_param: [role_data, {{role.name}}, service_names]}
213             docker_config: {get_param: [role_data, {{role.name}}, docker_config]}
214
215   # Here we are dumping all the docker container startup configuration data
216   # so that we can have access to how they are started outside of heat
217   # and docker-cmd.  This lets us create command line tools to start and
218   # test these containers.
219   {{role.name}}DockerConfigJsonStartupData:
220     type: OS::Heat::StructuredConfig
221     properties:
222       group: json-file
223       config:
224         /var/lib/docker-container-startup-configs.json:
225           {get_attr: [{{role.name}}DockerConfig, value]}
226
227   {{role.name}}DockerConfigJsonStartupDataDeployment:
228     type: OS::Heat::SoftwareDeploymentGroup
229     properties:
230       config: {get_resource: {{role.name}}DockerConfigJsonStartupData}
231       servers: {get_param: [servers, {{role.name}}]}
232
233   {{role.name}}KollaJsonConfig:
234     type: OS::Heat::StructuredConfig
235     properties:
236       group: json-file
237       config:
238         {get_param: [role_data, {{role.name}}, kolla_config]}
239
240   {{role.name}}KollaJsonDeployment:
241     type: OS::Heat::SoftwareDeploymentGroup
242     properties:
243       name: {{role.name}}KollaJsonDeployment
244       config: {get_resource: {{role.name}}KollaJsonConfig}
245       servers: {get_param: [servers, {{role.name}}]}
246
247   # BEGIN BAREMETAL CONFIG STEPS
248
249   {% if role.name == 'Controller' %}
250   ControllerPrePuppet:
251     type: OS::TripleO::Tasks::ControllerPrePuppet
252     properties:
253       servers: {get_param: [servers, Controller]}
254       input_values:
255         update_identifier: {get_param: DeployIdentifier}
256   {% endif %}
257
258   {{role.name}}Config:
259     type: OS::TripleO::{{role.name}}Config
260     properties:
261       StepConfig: {get_attr: [{{role.name}}PuppetStepConfig, value]}
262
263   {% for step in range(1, 6) %}
264
265   {{role.name}}Deployment_Step{{step}}:
266     type: OS::Heat::StructuredDeploymentGroup
267   {% if step == 1 %}
268     depends_on: [{{role.name}}PreConfig, {{role.name}}ArtifactsDeploy]
269   {% else %}
270     depends_on:
271       {% for dep in roles %}
272       - {{dep.name}}Deployment_Step{{step -1}}
273       - {{dep.name}}ContainersDeployment_Step{{step -1}}
274       {% endfor %}
275       - {{primary_role_name}}DockerPuppetTasksDeployment{{step -1}}
276   {% endif %}
277     properties:
278       name: {{role.name}}Deployment_Step{{step}}
279       servers: {get_param: [servers, {{role.name}}]}
280       config: {get_resource: {{role.name}}Config}
281       input_values:
282         step: {{step}}
283         update_identifier: {get_param: DeployIdentifier}
284
285   {% endfor %}
286   # END BAREMETAL CONFIG STEPS
287
288   # BEGIN CONTAINER CONFIG STEPS
289   {% for step in range(1, 6) %}
290
291   {{role.name}}ContainersConfig_Step{{step}}:
292     type: OS::Heat::StructuredConfig
293     properties:
294       group: docker-cmd
295       config:
296         {get_attr: [{{role.name}}DockerConfig, value, step_{{step}}]}
297
298   {{role.name}}ContainersDeployment_Step{{step}}:
299     type: OS::Heat::StructuredDeploymentGroup
300   {% if step == 1 %}
301     depends_on:
302       - {{role.name}}PreConfig
303       - {{role.name}}KollaJsonDeployment
304       - {{role.name}}GenPuppetDeployment
305       - {{role.name}}GenerateConfigDeployment
306   {% else %}
307     depends_on:
308         {% for dep in roles %}
309         - {{dep.name}}ContainersDeployment_Step{{step -1}}
310         - {{dep.name}}Deployment_Step{{step}} # baremetal steps of the same level run first
311         - {{dep.name}}Deployment_Step{{step -1}}
312         {% endfor %}
313         - {{primary_role_name}}DockerPuppetTasksDeployment{{step -1}}
314   {% endif %}
315     properties:
316       name: {{role.name}}ContainersDeployment_Step{{step}}
317       servers: {get_param: [servers, {{role.name}}]}
318       config: {get_resource: {{role.name}}ContainersConfig_Step{{step}}}
319
320   {% endfor %}
321   # END CONTAINER CONFIG STEPS
322
323   {{role.name}}PostConfig:
324     type: OS::TripleO::Tasks::{{role.name}}PostConfig
325     depends_on:
326   {% for dep in roles %}
327       - {{dep.name}}Deployment_Step5
328       - {{primary_role_name}}DockerPuppetTasksDeployment5
329   {% endfor %}
330     properties:
331       servers:  {get_param: servers}
332       input_values:
333         update_identifier: {get_param: DeployIdentifier}
334
335   # Note, this should come last, so use depends_on to ensure
336   # this is created after any other resources.
337   {{role.name}}ExtraConfigPost:
338     depends_on:
339   {% for dep in roles %}
340       - {{dep.name}}PostConfig
341   {% endfor %}
342     type: OS::TripleO::NodeExtraConfigPost
343     properties:
344         servers: {get_param: [servers, {{role.name}}]}
345
346   {% if role.name == 'Controller' %}
347   ControllerPostPuppet:
348     depends_on:
349       - ControllerExtraConfigPost
350     type: OS::TripleO::Tasks::ControllerPostPuppet
351     properties:
352       servers: {get_param: [servers, Controller]}
353       input_values:
354         update_identifier: {get_param: DeployIdentifier}
355   {% endif %}
356
357 {% endfor %}