Hiera optimization: use a new hiera hook
[apex-tripleo-heat-templates.git] / puppet / compute-role.yaml
1 heat_template_version: 2016-10-14
2
3 description: >
4   OpenStack hypervisor node configured via Puppet.
5
6 parameters:
7   ExtraConfig:
8     default: {}
9     description: |
10       Additional hiera configuration to inject into the cluster. Note
11       that NovaComputeExtraConfig takes precedence over ExtraConfig.
12     type: json
13   OvercloudComputeFlavor:
14     description: Flavor for the nova compute node
15     default: baremetal
16     type: string
17     constraints:
18       - custom_constraint: nova.flavor
19   NovaImage:
20     type: string
21     default: overcloud-full
22     constraints:
23       - custom_constraint: glance.image
24   ImageUpdatePolicy:
25     default: 'REBUILD_PRESERVE_EPHEMERAL'
26     description: What policy to use when reconstructing instances. REBUILD for rebuilds, REBUILD_PRESERVE_EPHEMERAL to preserve /mnt.
27     type: string
28   KeyName:
29     description: Name of an existing Nova key pair to enable SSH access to the instances
30     type: string
31     default: default
32     constraints:
33       - custom_constraint: nova.keypair
34   NeutronPhysicalBridge:
35     default: 'br-ex'
36     description: An OVS bridge to create for accessing external networks.
37     type: string
38   NeutronPublicInterface:
39     default: nic1
40     description: A port to add to the NeutronPhysicalBridge.
41     type: string
42   NodeIndex:
43     type: number
44     default: 0
45   NovaComputeExtraConfig:
46     default: {}
47     description: |
48       NovaCompute specific configuration to inject into the cluster. Same
49       structure as ExtraConfig.
50     type: json
51   NovaComputeIPs:
52     default: {}
53     type: json
54   ServiceNetMap:
55     default: {}
56     description: Mapping of service_name -> network name. Typically set
57                  via parameter_defaults in the resource registry.
58     type: json
59   EndpointMap:
60     default: {}
61     description: Mapping of service endpoint -> protocol. Typically set
62                  via parameter_defaults in the resource registry.
63     type: json
64   UpdateIdentifier:
65     default: ''
66     type: string
67     description: >
68       Setting to a previously unused value during stack-update will trigger
69       package update on all nodes
70   Hostname:
71     type: string
72     default: '' # Defaults to Heat created hostname
73   HostnameMap:
74     type: json
75     default: {}
76     description: Optional mapping to override hostnames
77   NetworkDeploymentActions:
78     type: comma_delimited_list
79     description: >
80       Heat action when to apply network configuration changes
81     default: ['CREATE']
82   SoftwareConfigTransport:
83     default: POLL_SERVER_CFN
84     description: |
85       How the server should receive the metadata required for software configuration.
86     type: string
87     constraints:
88     - allowed_values: [POLL_SERVER_CFN, POLL_SERVER_HEAT, POLL_TEMP_URL, ZAQAR_MESSAGE]
89   CloudDomain:
90     default: 'localdomain'
91     type: string
92     description: >
93       The DNS domain used for the hosts. This should match the dhcp_domain
94       configured in the Undercloud neutron. Defaults to localdomain.
95   ServerMetadata:
96     default: {}
97     description: >
98       Extra properties or metadata passed to Nova for the created nodes in
99       the overcloud. It's accessible via the Nova metadata API.
100     type: json
101   NovaComputeSchedulerHints:
102     type: json
103     description: Optional scheduler hints to pass to nova
104     default: {}
105   ServiceConfigSettings:
106     type: json
107     default: {}
108   ServiceNames:
109     type: comma_delimited_list
110     default: []
111   MonitoringSubscriptions:
112     type: comma_delimited_list
113     default: []
114   ConfigCommand:
115     type: string
116     description: Command which will be run whenever configuration data changes
117     default: os-refresh-config --timeout 14400
118
119 resources:
120
121   NovaCompute:
122     type: OS::TripleO::Server
123     metadata:
124       os-collect-config:
125         command: {get_param: ConfigCommand}
126     properties:
127       image: {get_param: NovaImage}
128       image_update_policy:
129         get_param: ImageUpdatePolicy
130       flavor: {get_param: OvercloudComputeFlavor}
131       key_name: {get_param: KeyName}
132       networks:
133         - network: ctlplane
134       user_data_format: SOFTWARE_CONFIG
135       user_data: {get_resource: UserData}
136       name:
137         str_replace:
138             template: {get_param: Hostname}
139             params: {get_param: HostnameMap}
140       software_config_transport: {get_param: SoftwareConfigTransport}
141       metadata: {get_param: ServerMetadata}
142       scheduler_hints: {get_param: NovaComputeSchedulerHints}
143
144   # Combine the NodeAdminUserData and NodeUserData mime archives
145   UserData:
146     type: OS::Heat::MultipartMime
147     properties:
148       parts:
149       - config: {get_resource: NodeAdminUserData}
150         type: multipart
151       - config: {get_resource: NodeUserData}
152         type: multipart
153
154   # Creates the "heat-admin" user if configured via the environment
155   # Should return a OS::Heat::MultipartMime reference via OS::stack_id
156   NodeAdminUserData:
157     type: OS::TripleO::NodeAdminUserData
158
159   # For optional operator additional userdata
160   # Should return a OS::Heat::MultipartMime reference via OS::stack_id
161   NodeUserData:
162     type: OS::TripleO::NodeUserData
163
164   ExternalPort:
165     type: OS::TripleO::Compute::Ports::ExternalPort
166     properties:
167       ControlPlaneIP: {get_attr: [NovaCompute, networks, ctlplane, 0]}
168       IPPool: {get_param: NovaComputeIPs}
169       NodeIndex: {get_param: NodeIndex}
170
171   InternalApiPort:
172     type: OS::TripleO::Compute::Ports::InternalApiPort
173     properties:
174       ControlPlaneIP: {get_attr: [NovaCompute, networks, ctlplane, 0]}
175       IPPool: {get_param: NovaComputeIPs}
176       NodeIndex: {get_param: NodeIndex}
177
178   StoragePort:
179     type: OS::TripleO::Compute::Ports::StoragePort
180     properties:
181       ControlPlaneIP: {get_attr: [NovaCompute, networks, ctlplane, 0]}
182       IPPool: {get_param: NovaComputeIPs}
183       NodeIndex: {get_param: NodeIndex}
184
185   StorageMgmtPort:
186     type: OS::TripleO::Compute::Ports::StorageMgmtPort
187     properties:
188       ControlPlaneIP: {get_attr: [NovaCompute, networks, ctlplane, 0]}
189       IPPool: {get_param: NovaComputeIPs}
190       NodeIndex: {get_param: NodeIndex}
191
192   TenantPort:
193     type: OS::TripleO::Compute::Ports::TenantPort
194     properties:
195       ControlPlaneIP: {get_attr: [NovaCompute, networks, ctlplane, 0]}
196       IPPool: {get_param: NovaComputeIPs}
197       NodeIndex: {get_param: NodeIndex}
198
199   ManagementPort:
200     type: OS::TripleO::Compute::Ports::ManagementPort
201     properties:
202       ControlPlaneIP: {get_attr: [NovaCompute, networks, ctlplane, 0]}
203       IPPool: {get_param: NovaComputeIPs}
204       NodeIndex: {get_param: NodeIndex}
205
206   NetIpMap:
207     type: OS::TripleO::Network::Ports::NetIpMap
208     properties:
209       ControlPlaneIp: {get_attr: [NovaCompute, networks, ctlplane, 0]}
210       ExternalIp: {get_attr: [ExternalPort, ip_address]}
211       ExternalIpSubnet: {get_attr: [ExternalPort, ip_subnet]}
212       ExternalIpUri: {get_attr: [ExternalPort, ip_address_uri]}
213       InternalApiIp: {get_attr: [InternalApiPort, ip_address]}
214       InternalApiIpSubnet: {get_attr: [InternalApiPort, ip_subnet]}
215       InternalApiIpUri: {get_attr: [InternalApiPort, ip_address_uri]}
216       StorageIp: {get_attr: [StoragePort, ip_address]}
217       StorageIpSubnet: {get_attr: [StoragePort, ip_subnet]}
218       StorageIpUri: {get_attr: [StoragePort, ip_address_uri]}
219       StorageMgmtIp: {get_attr: [StorageMgmtPort, ip_address]}
220       StorageMgmtIpSubnet: {get_attr: [StorageMgmtPort, ip_subnet]}
221       StorageMgmtIpUri: {get_attr: [StorageMgmtPort, ip_address_uri]}
222       TenantIp: {get_attr: [TenantPort, ip_address]}
223       TenantIpSubnet: {get_attr: [TenantPort, ip_subnet]}
224       TenantIpUri: {get_attr: [TenantPort, ip_address_uri]}
225       ManagementIp: {get_attr: [ManagementPort, ip_address]}
226       ManagementIpSubnet: {get_attr: [ManagementPort, ip_subnet]}
227       ManagementIpUri: {get_attr: [ManagementPort, ip_address_uri]}
228
229   NetworkConfig:
230     type: OS::TripleO::Compute::Net::SoftwareConfig
231     properties:
232       ControlPlaneIp: {get_attr: [NovaCompute, networks, ctlplane, 0]}
233       ExternalIpSubnet: {get_attr: [ExternalPort, ip_subnet]}
234       InternalApiIpSubnet: {get_attr: [InternalApiPort, ip_subnet]}
235       StorageIpSubnet: {get_attr: [StoragePort, ip_subnet]}
236       StorageMgmtIpSubnet: {get_attr: [StorageMgmtPort, ip_subnet]}
237       TenantIpSubnet: {get_attr: [TenantPort, ip_subnet]}
238       ManagementIpSubnet: {get_attr: [ManagementPort, ip_subnet]}
239
240   NetworkDeployment:
241     type: OS::TripleO::SoftwareDeployment
242     properties:
243       name: NetworkDeployment
244       config: {get_resource: NetworkConfig}
245       server: {get_resource: NovaCompute}
246       actions: {get_param: NetworkDeploymentActions}
247       input_values:
248         bridge_name: {get_param: NeutronPhysicalBridge}
249         interface_name: {get_param: NeutronPublicInterface}
250
251   NovaComputeConfig:
252     type: OS::Heat::StructuredConfig
253     properties:
254       group: hiera
255       config:
256         hierarchy:
257           - '"%{::uuid}"'
258           - heat_config_%{::deploy_config_name}
259           - compute_extraconfig
260           - extraconfig
261           - service_names
262           - service_configs
263           - compute
264           - bootstrap_node # provided by allNodesConfig
265           - all_nodes # provided by allNodesConfig
266           - vip_data # provided by allNodesConfig
267           - '"%{::osfamily}"'
268           - neutron_bigswitch_data # Optionally provided by ComputeExtraConfigPre
269           - cisco_n1kv_data  # Optionally provided by ComputeExtraConfigPre
270           - nova_nuage_data  # Optionally provided by ComputeExtraConfigPre
271           - midonet_data # Optionally provided by AllNodesExtraConfig
272           - neutron_opencontrail_data  # Optionally provided by ComputeExtraConfigPre
273           - cisco_aci_data # Optionally provided by ComputeExtraConfigPre
274         merge_behavior: deeper
275         datafiles:
276           service_names:
277             service_names: {get_param: ServiceNames}
278             sensu::subscriptions: {get_param: MonitoringSubscriptions}
279           service_configs:
280             map_replace:
281               - {get_param: ServiceConfigSettings}
282               - values: {get_attr: [NetIpMap, net_ip_map]}
283           compute_extraconfig: {get_param: NovaComputeExtraConfig}
284           extraconfig: {get_param: ExtraConfig}
285           compute:
286             tripleo::packages::enable_upgrade: {get_input: enable_package_upgrade}
287
288   NovaComputeDeployment:
289     type: OS::TripleO::SoftwareDeployment
290     depends_on: NetworkDeployment
291     properties:
292       name: NovaComputeDeployment
293       config: {get_resource: NovaComputeConfig}
294       server: {get_resource: NovaCompute}
295       input_values:
296         enable_package_upgrade: {get_attr: [UpdateDeployment, update_managed_packages]}
297
298   # Resource for site-specific injection of root certificate
299   NodeTLSCAData:
300     depends_on: NovaComputeDeployment
301     type: OS::TripleO::NodeTLSCAData
302     properties:
303       server: {get_resource: NovaCompute}
304
305   # Hook for site-specific additional pre-deployment config, e.g extra hieradata
306   ComputeExtraConfigPre:
307     depends_on: NovaComputeDeployment
308     type: OS::TripleO::ComputeExtraConfigPre
309     properties:
310         server: {get_resource: NovaCompute}
311
312   # Hook for site-specific additional pre-deployment config,
313   # applying to all nodes, e.g node registration/unregistration
314   NodeExtraConfig:
315     depends_on: [ComputeExtraConfigPre, NodeTLSCAData]
316     type: OS::TripleO::NodeExtraConfig
317     properties:
318         server: {get_resource: NovaCompute}
319
320   UpdateConfig:
321     type: OS::TripleO::Tasks::PackageUpdate
322
323   UpdateDeployment:
324     type: OS::Heat::SoftwareDeployment
325     properties:
326       name: UpdateDeployment
327       config: {get_resource: UpdateConfig}
328       server: {get_resource: NovaCompute}
329       input_values:
330         update_identifier:
331           get_param: UpdateIdentifier
332
333 outputs:
334   ip_address:
335     description: IP address of the server in the ctlplane network
336     value: {get_attr: [NovaCompute, networks, ctlplane, 0]}
337   external_ip_address:
338     description: IP address of the server in the external network
339     value: {get_attr: [ExternalPort, ip_address]}
340   internal_api_ip_address:
341     description: IP address of the server in the internal_api network
342     value: {get_attr: [InternalApiPort, ip_address]}
343   storage_ip_address:
344     description: IP address of the server in the storage network
345     value: {get_attr: [StoragePort, ip_address]}
346   storage_mgmt_ip_address:
347     description: IP address of the server in the storage_mgmt network
348     value: {get_attr: [StorageMgmtPort, ip_address]}
349   tenant_ip_address:
350     description: IP address of the server in the tenant network
351     value: {get_attr: [TenantPort, ip_address]}
352   management_ip_address:
353     description: IP address of the server in the management network
354     value: {get_attr: [ManagementPort, ip_address]}
355   hostname:
356     description: Hostname of the server
357     value: {get_attr: [NovaCompute, name]}
358   hostname_map:
359     description: Mapping of network names to hostnames
360     value:
361       external:
362         list_join:
363         - '.'
364         - - {get_attr: [NovaCompute, name]}
365           - external
366           - {get_param: CloudDomain}
367       internal_api:
368         list_join:
369         - '.'
370         - - {get_attr: [NovaCompute, name]}
371           - internalapi
372           - {get_param: CloudDomain}
373       storage:
374         list_join:
375         - '.'
376         - - {get_attr: [NovaCompute, name]}
377           - storage
378           - {get_param: CloudDomain}
379       storage_mgmt:
380         list_join:
381         - '.'
382         - - {get_attr: [NovaCompute, name]}
383           - storagemgmt
384           - {get_param: CloudDomain}
385       tenant:
386         list_join:
387         - '.'
388         - - {get_attr: [NovaCompute, name]}
389           - tenant
390           - {get_param: CloudDomain}
391       management:
392         list_join:
393         - '.'
394         - - {get_attr: [NovaCompute, name]}
395           - management
396           - {get_param: CloudDomain}
397       ctlplane:
398         list_join:
399         - '.'
400         - - {get_attr: [NovaCompute, name]}
401           - ctlplane
402           - {get_param: CloudDomain}
403   hosts_entry:
404     description: >
405       Server's IP address and hostname in the /etc/hosts format
406     value:
407       str_replace:
408         template: |
409           PRIMARYIP PRIMARYHOST.DOMAIN PRIMARYHOST
410           EXTERNALIP EXTERNALHOST.DOMAIN EXTERNALHOST
411           INTERNAL_APIIP INTERNAL_APIHOST.DOMAIN INTERNAL_APIHOST
412           STORAGEIP STORAGEHOST.DOMAIN STORAGEHOST
413           STORAGE_MGMTIP STORAGE_MGMTHOST.DOMAIN STORAGE_MGMTHOST
414           TENANTIP TENANTHOST.DOMAIN TENANTHOST
415           MANAGEMENTIP MANAGEMENTHOST.DOMAIN MANAGEMENTHOST
416           CTLPLANEIP CTLPLANEHOST.DOMAIN CTLPLANEHOST
417         params:
418           PRIMARYIP: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, ComputeHostnameResolveNetwork]}]}
419           DOMAIN: {get_param: CloudDomain}
420           PRIMARYHOST: {get_attr: [NovaCompute, name]}
421           EXTERNALIP: {get_attr: [ExternalPort, ip_address]}
422           EXTERNALHOST:
423             list_join:
424             - '.'
425             - - {get_attr: [NovaCompute, name]}
426               - external
427           INTERNAL_APIIP: {get_attr: [InternalApiPort, ip_address]}
428           INTERNAL_APIHOST:
429             list_join:
430             - '.'
431             - - {get_attr: [NovaCompute, name]}
432               - internalapi
433           STORAGEIP: {get_attr: [StoragePort, ip_address]}
434           STORAGEHOST:
435             list_join:
436             - '.'
437             - - {get_attr: [NovaCompute, name]}
438               - storage
439           STORAGE_MGMTIP: {get_attr: [StorageMgmtPort, ip_address]}
440           STORAGE_MGMTHOST:
441             list_join:
442             - '.'
443             - - {get_attr: [NovaCompute, name]}
444               - storagemgmt
445           TENANTIP: {get_attr: [TenantPort, ip_address]}
446           TENANTHOST:
447             list_join:
448             - '.'
449             - - {get_attr: [NovaCompute, name]}
450               - tenant
451           MANAGEMENTIP: {get_attr: [ManagementPort, ip_address]}
452           MANAGEMENTHOST:
453             list_join:
454             - '.'
455             - - {get_attr: [NovaCompute, name]}
456               - management
457           CTLPLANEIP: {get_attr: [NovaCompute, networks, ctlplane, 0]}
458           CTLPLANEHOST:
459             list_join:
460             - '.'
461             - - {get_attr: [NovaCompute, name]}
462               - ctlplane
463   nova_server_resource:
464     description: Heat resource handle for the Nova compute server
465     value:
466       {get_resource: NovaCompute}