Merge "docker: new hybrid deployment architecture and configuration"
[apex-tripleo-heat-templates.git] / docker / post.j2.yaml
1 # certain initialization steps (run in a container) will occur
2 # on the first role listed in the roles file
3 {% set primary_role_name = roles[0].name -%}
4
5 heat_template_version: ocata
6
7 description: >
8   Post-deploy configuration steps via puppet for all roles,
9   as defined in ../roles_data.yaml
10
11 parameters:
12   servers:
13     type: json
14     description: Mapping of Role name e.g Controller to a list of servers
15   role_data:
16     type: json
17     description: Mapping of Role name e.g Controller to the per-role data
18   DeployIdentifier:
19     default: ''
20     type: string
21     description: >
22       Setting this to a unique value will re-run any deployment tasks which
23       perform configuration on a Heat stack-update.
24   EndpointMap:
25     default: {}
26     description: Mapping of service endpoint -> protocol. Typically set
27                  via parameter_defaults in the resource registry.
28     type: json
29
30 resources:
31
32 {% for role in roles %}
33   # Post deployment steps for all roles
34   # A single config is re-applied with an incrementing step number
35   # {{role.name}} Role steps
36   {{role.name}}ArtifactsConfig:
37     type: ../puppet/deploy-artifacts.yaml
38
39   {{role.name}}ArtifactsDeploy:
40     type: OS::Heat::StructuredDeploymentGroup
41     properties:
42       servers:  {get_param: [servers, {{role.name}}]}
43       config: {get_resource: {{role.name}}ArtifactsConfig}
44
45   {{role.name}}PreConfig:
46     type: OS::TripleO::Tasks::{{role.name}}PreConfig
47     properties:
48       servers: {get_param: [servers, {{role.name}}]}
49       input_values:
50         update_identifier: {get_param: DeployIdentifier}
51
52   {{role.name}}CreateConfigDir:
53     type: OS::Heat::SoftwareConfig
54     properties:
55       group: script
56       config: {get_file: create-config-dir.sh}
57
58   {{role.name}}CreateConfigDirDeployment:
59     type: OS::Heat::SoftwareDeploymentGroup
60     properties:
61       servers: {get_param: [servers, {{role.name}}]}
62       config: {get_resource: {{role.name}}CreateConfigDir}
63
64   # this creates a JSON config file for our docker-puppet.py script
65   {{role.name}}GenPuppetConfig:
66     type: OS::Heat::StructuredConfig
67     properties:
68       group: json-file
69       config:
70         /var/lib/docker-puppet/docker-puppet.json:
71           yaql:
72             # select only services that have a non-null config_image with
73             # a step_config as well
74             expression:
75               $.data.config_volume.zip($.data.puppet_tags, $.data.step_config, $.data.config_image).where($[3] != null and $[1] != null)
76             data:
77               config_volume: {get_param: [role_data, {{role.name}}, config_volume]}
78               step_config: {get_param: [role_data, {{role.name}}, step_config]}
79               puppet_tags: {get_param: [role_data, {{role.name}}, puppet_tags]}
80               config_image: {get_param: [role_data, {{role.name}}, config_image]}
81
82   {{role.name}}GenPuppetDeployment:
83     type: OS::Heat::SoftwareDeploymentGroup
84     properties:
85       servers: {get_param: [servers, {{role.name}}]}
86       config: {get_resource: {{role.name}}GenPuppetConfig}
87
88   {{role.name}}GenerateConfig:
89     type: OS::Heat::SoftwareConfig
90     properties:
91       group: script
92       config: {get_file: docker-puppet.py}
93
94   {{role.name}}GenerateConfigDeployment:
95     type: OS::Heat::SoftwareDeploymentGroup
96     depends_on: [{{role.name}}GenPuppetDeployment, {{role.name}}ArtifactsDeploy, {{role.name}}CreateConfigDirDeployment]
97     properties:
98       name: {{role.name}}GenerateConfigDeployment
99       servers: {get_param: [servers, {{role.name}}]}
100       config: {get_resource: {{role.name}}GenerateConfig}
101
102   {{role.name}}PuppetStepConfig:
103     type: OS::Heat::Value
104     properties:
105       type: string
106       value:
107         yaql:
108           expression:
109             # select 'step_config' only from services that do not have a docker_image
110             $.data.service_names.zip($.data.step_config, $.data.docker_image).where($[2] = null).where($[1] != null).select($[1]).join("\n")
111           data:
112             service_names: {get_param: [role_data, {{role.name}}, service_names]}
113             step_config: {get_param: [role_data, {{role.name}}, step_config]}
114             docker_image: {get_param: [role_data, {{role.name}}, docker_image]}
115
116   {{role.name}}DockerConfig:
117     type: OS::Heat::Value
118     properties:
119       type: json
120       value:
121         yaql:
122           expression:
123             # select 'docker_config' only from services that have a docker_image
124             $.data.service_names.zip($.data.docker_config, $.data.docker_image).where($[2] != null).select($[1]).reduce($1.mergeWith($2), {})
125           data:
126             service_names: {get_param: [role_data, {{role.name}}, service_names]}
127             docker_config: {get_param: [role_data, {{role.name}}, docker_config]}
128             docker_image: {get_param: [role_data, {{role.name}}, docker_image]}
129
130   {{role.name}}KollaJsonConfig:
131     type: OS::Heat::StructuredConfig
132     properties:
133       group: json-file
134       config:
135         {get_param: [role_data, {{role.name}}, kolla_config]}
136
137   {{role.name}}KollaJsonDeployment:
138     type: OS::Heat::SoftwareDeploymentGroup
139     properties:
140       name: {{role.name}}KollaJsonDeployment
141       config: {get_resource: {{role.name}}KollaJsonConfig}
142       servers: {get_param: [servers, {{role.name}}]}
143
144   # BEGIN BAREMETAL CONFIG STEPS
145
146   {% if role.name == 'Controller' %}
147   ControllerPrePuppet:
148     type: OS::TripleO::Tasks::ControllerPrePuppet
149     properties:
150       servers: {get_param: [servers, Controller]}
151       input_values:
152         update_identifier: {get_param: DeployIdentifier}
153   {% endif %}
154
155   {{role.name}}Config:
156     type: OS::TripleO::{{role.name}}Config
157     properties:
158       StepConfig: {get_attr: [{{role.name}}PuppetStepConfig, value]}
159
160   {% for step in range(1, 6) %}
161
162   {{role.name}}Deployment_Step{{step}}:
163     type: OS::Heat::StructuredDeploymentGroup
164   {% if step == 1 %}
165     depends_on: [{{role.name}}PreConfig, {{role.name}}ArtifactsDeploy]
166   {% else %}
167     depends_on:
168     {% for dep in roles %}
169       - {{dep.name}}Deployment_Step{{step -1}}
170       - {{dep.name}}ContainersDeployment_Step{{step -1}}
171     {% endfor %}
172   {% endif %}
173     properties:
174       name: {{role.name}}Deployment_Step{{step}}
175       servers: {get_param: [servers, {{role.name}}]}
176       config: {get_resource: {{role.name}}Config}
177       input_values:
178         step: {{step}}
179         update_identifier: {get_param: DeployIdentifier}
180
181   {% endfor %}
182   # END BAREMETAL CONFIG STEPS
183
184   # BEGIN CONTAINER CONFIG STEPS
185   {% for step in range(1, 6) %}
186
187   {{role.name}}ContainersConfig_Step{{step}}:
188     type: OS::Heat::StructuredConfig
189     properties:
190       group: docker-cmd
191       config:
192         {get_attr: [{{role.name}}DockerConfig, value, step_{{step}}]}
193
194   {{role.name}}ContainersDeployment_Step{{step}}:
195     type: OS::Heat::StructuredDeploymentGroup
196   {% if step == 1 %}
197     depends_on:
198       - {{role.name}}PreConfig
199       - {{role.name}}KollaJsonDeployment
200       - {{role.name}}GenPuppetDeployment
201       - {{role.name}}GenerateConfigDeployment
202   {% else %}
203     depends_on:
204       {% for dep in roles %}
205         - {{dep.name}}ContainersDeployment_Step{{step -1}}
206         - {{dep.name}}Deployment_Step{{step}} # baremetal steps of the same level run first
207         - {{dep.name}}Deployment_Step{{step -1}}
208       {% endfor %}
209   {% endif %}
210     properties:
211       name: {{role.name}}ContainersDeployment_Step{{step}}
212       servers: {get_param: [servers, {{role.name}}]}
213       config: {get_resource: {{role.name}}ContainersConfig_Step{{step}}}
214
215   {% endfor %}
216   # END CONTAINER CONFIG STEPS
217
218   {{role.name}}PostConfig:
219     type: OS::TripleO::Tasks::{{role.name}}PostConfig
220     depends_on:
221   {% for dep in roles %}
222       - {{dep.name}}Deployment_Step5
223   {% endfor %}
224     properties:
225       servers:  {get_param: servers}
226       input_values:
227         update_identifier: {get_param: DeployIdentifier}
228
229   # Note, this should come last, so use depends_on to ensure
230   # this is created after any other resources.
231   {{role.name}}ExtraConfigPost:
232     depends_on:
233   {% for dep in roles %}
234       - {{dep.name}}PostConfig
235   {% endfor %}
236     type: OS::TripleO::NodeExtraConfigPost
237     properties:
238         servers: {get_param: [servers, {{role.name}}]}
239
240   {% if role.name == 'Controller' %}
241   ControllerPostPuppet:
242     depends_on:
243       - ControllerExtraConfigPost
244     type: OS::TripleO::Tasks::ControllerPostPuppet
245     properties:
246       servers: {get_param: [servers, Controller]}
247       input_values:
248         update_identifier: {get_param: DeployIdentifier}
249   {% endif %}
250
251 {% endfor %}