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