Merge "Increase cluster sync timeout for M->N major upgrades"
[apex-tripleo-heat-templates.git] / puppet / cinder-storage.yaml
1 heat_template_version: 2015-04-30
2 description: 'OpenStack cinder storage configured by Puppet'
3 parameters:
4   Image:
5     default: overcloud-cinder-volume
6     type: string
7   ExtraConfig:
8     default: {}
9     description: |
10       Additional hiera configuration to inject into the cluster. Note
11       that BlockStorageExtraConfig takes precedence over ExtraConfig.
12     type: json
13   BlockStorageExtraConfig:
14     default: {}
15     description: |
16       Role specific additional hiera configuration to inject into the cluster.
17     type: json
18   BlockStorageIPs:
19     default: {}
20     type: json
21   Flavor:
22     description: Flavor for block storage nodes to request when deploying.
23     type: string
24     constraints:
25       - custom_constraint: nova.flavor
26   KeyName:
27     default: default
28     description: Name of an existing Nova key pair to enable SSH access to the instances
29     type: string
30   SnmpdReadonlyUserName:
31     default: ro_snmp_user
32     description: The user name for SNMPd with readonly rights running on all Overcloud nodes
33     type: string
34   SnmpdReadonlyUserPassword:
35     description: The user password for SNMPd with readonly rights running on all Overcloud nodes
36     type: string
37     hidden: true
38   NtpServer:
39     default: ''
40     description: Comma-separated list of ntp servers
41     type: comma_delimited_list
42   EnablePackageInstall:
43     default: 'false'
44     description: Set to true to enable package installation via Puppet
45     type: boolean
46   UpdateIdentifier:
47     default: ''
48     type: string
49     description: >
50       Setting to a previously unused value during stack-update will trigger
51       package update on all nodes
52   Hostname:
53     type: string
54     default: '' # Defaults to Heat created hostname
55   HostnameMap:
56     type: json
57     default: {}
58     description: Optional mapping to override hostnames
59   ServiceNetMap:
60     default: {}
61     description: Mapping of service_name -> network name. Typically set
62                  via parameter_defaults in the resource registry.
63     type: json
64   TimeZone:
65     default: 'UTC'
66     description: The timezone to be set on Cinder nodes.
67     type: string
68   NetworkDeploymentActions:
69     type: comma_delimited_list
70     description: >
71       Heat action when to apply network configuration changes
72     default: ['CREATE']
73   SoftwareConfigTransport:
74     default: POLL_SERVER_CFN
75     description: |
76       How the server should receive the metadata required for software configuration.
77     type: string
78     constraints:
79     - allowed_values: [POLL_SERVER_CFN, POLL_SERVER_HEAT, POLL_TEMP_URL, ZAQAR_MESSAGE]
80   CloudDomain:
81     default: ''
82     type: string
83     description: >
84       The DNS domain used for the hosts. This should match the dhcp_domain
85       configured in the Undercloud neutron. Defaults to localdomain.
86   ServerMetadata:
87     default: {}
88     description: >
89       Extra properties or metadata passed to Nova for the created nodes in
90       the overcloud. It's accessible via the Nova metadata API.
91     type: json
92   SchedulerHints:
93     type: json
94     description: Optional scheduler hints to pass to nova
95     default: {}
96   NodeIndex:
97     type: number
98     default: 0
99   ServiceConfigSettings:
100     type: json
101     default: {}
102
103 resources:
104   BlockStorage:
105     type: OS::Nova::Server
106     properties:
107       image:
108         {get_param: Image}
109       flavor: {get_param: Flavor}
110       key_name: {get_param: KeyName}
111       networks:
112         - network: ctlplane
113       user_data_format: SOFTWARE_CONFIG
114       user_data: {get_resource: UserData}
115       name:
116         str_replace:
117             template: {get_param: Hostname}
118             params: {get_param: HostnameMap}
119       software_config_transport: {get_param: SoftwareConfigTransport}
120       metadata: {get_param: ServerMetadata}
121       scheduler_hints: {get_param: SchedulerHints}
122
123   # Combine the NodeAdminUserData and NodeUserData mime archives
124   UserData:
125     type: OS::Heat::MultipartMime
126     properties:
127       parts:
128       - config: {get_resource: NodeAdminUserData}
129         type: multipart
130       - config: {get_resource: NodeUserData}
131         type: multipart
132
133   # Creates the "heat-admin" user if configured via the environment
134   # Should return a OS::Heat::MultipartMime reference via OS::stack_id
135   NodeAdminUserData:
136     type: OS::TripleO::NodeAdminUserData
137
138   # For optional operator additional userdata
139   # Should return a OS::Heat::MultipartMime reference via OS::stack_id
140   NodeUserData:
141     type: OS::TripleO::NodeUserData
142
143   ExternalPort:
144     type: OS::TripleO::BlockStorage::Ports::ExternalPort
145     properties:
146       ControlPlaneIP: {get_attr: [BlockStorage, networks, ctlplane, 0]}
147       IPPool: {get_param: BlockStorageIPs}
148       NodeIndex: {get_param: NodeIndex}
149
150   InternalApiPort:
151     type: OS::TripleO::BlockStorage::Ports::InternalApiPort
152     properties:
153       ControlPlaneIP: {get_attr: [BlockStorage, networks, ctlplane, 0]}
154       IPPool: {get_param: BlockStorageIPs}
155       NodeIndex: {get_param: NodeIndex}
156
157   StoragePort:
158     type: OS::TripleO::BlockStorage::Ports::StoragePort
159     properties:
160       ControlPlaneIP: {get_attr: [BlockStorage, networks, ctlplane, 0]}
161       IPPool: {get_param: BlockStorageIPs}
162       NodeIndex: {get_param: NodeIndex}
163
164   StorageMgmtPort:
165     type: OS::TripleO::BlockStorage::Ports::StorageMgmtPort
166     properties:
167       ControlPlaneIP: {get_attr: [BlockStorage, networks, ctlplane, 0]}
168       IPPool: {get_param: BlockStorageIPs}
169       NodeIndex: {get_param: NodeIndex}
170
171   TenantPort:
172     type: OS::TripleO::BlockStorage::Ports::TenantPort
173     properties:
174       ControlPlaneIP: {get_attr: [BlockStorage, networks, ctlplane, 0]}
175       IPPool: {get_param: BlockStorageIPs}
176       NodeIndex: {get_param: NodeIndex}
177
178   ManagementPort:
179     type: OS::TripleO::BlockStorage::Ports::ManagementPort
180     properties:
181       ControlPlaneIP: {get_attr: [BlockStorage, networks, ctlplane, 0]}
182       IPPool: {get_param: BlockStorageIPs}
183       NodeIndex: {get_param: NodeIndex}
184
185   NetworkConfig:
186     type: OS::TripleO::BlockStorage::Net::SoftwareConfig
187     properties:
188       ControlPlaneIp: {get_attr: [BlockStorage, networks, ctlplane, 0]}
189       ExternalIpSubnet: {get_attr: [ExternalPort, ip_subnet]}
190       InternalApiIpSubnet: {get_attr: [InternalApiPort, ip_subnet]}
191       StorageIpSubnet: {get_attr: [StoragePort, ip_subnet]}
192       StorageMgmtIpSubnet: {get_attr: [StorageMgmtPort, ip_subnet]}
193       TenantIpSubnet: {get_attr: [TenantPort, ip_subnet]}
194       ManagementIpSubnet: {get_attr: [ManagementPort, ip_subnet]}
195
196   NetIpMap:
197     type: OS::TripleO::Network::Ports::NetIpMap
198     properties:
199       ControlPlaneIp: {get_attr: [BlockStorage, networks, ctlplane, 0]}
200       ExternalIp: {get_attr: [ExternalPort, ip_address]}
201       ExternalIpSubnet: {get_attr: [ExternalPort, ip_subnet]}
202       ExternalIpUri: {get_attr: [ExternalPort, ip_address_uri]}
203       InternalApiIp: {get_attr: [InternalApiPort, ip_address]}
204       InternalApiIpSubnet: {get_attr: [InternalApiPort, ip_subnet]}
205       InternalApiIpUri: {get_attr: [InternalApiPort, ip_address_uri]}
206       StorageIp: {get_attr: [StoragePort, ip_address]}
207       StorageIpSubnet: {get_attr: [StoragePort, ip_subnet]}
208       StorageIpUri: {get_attr: [StoragePort, ip_address_uri]}
209       StorageMgmtIp: {get_attr: [StorageMgmtPort, ip_address]}
210       StorageMgmtIpSubnet: {get_attr: [StorageMgmtPort, ip_subnet]}
211       StorageMgmtIpUri: {get_attr: [StorageMgmtPort, ip_address_uri]}
212       TenantIp: {get_attr: [TenantPort, ip_address]}
213       TenantIpSubnet: {get_attr: [TenantPort, ip_subnet]}
214       TenantIpUri: {get_attr: [TenantPort, ip_address_uri]}
215       ManagementIp: {get_attr: [ManagementPort, ip_address]}
216       ManagementIpSubnet: {get_attr: [ManagementPort, ip_subnet]}
217       ManagementIpUri: {get_attr: [ManagementPort, ip_address_uri]}
218
219   NetworkDeployment:
220     type: OS::TripleO::SoftwareDeployment
221     properties:
222       name: NetworkDeployment
223       config: {get_resource: NetworkConfig}
224       server: {get_resource: BlockStorage}
225       actions: {get_param: NetworkDeploymentActions}
226
227   BlockStorageDeployment:
228     type: OS::Heat::StructuredDeployment
229     depends_on: NetworkDeployment
230     properties:
231       name: BlockStorageDeployment
232       server: {get_resource: BlockStorage}
233       config: {get_resource: BlockStorageConfig}
234       input_values:
235         snmpd_readonly_user_name: {get_param: SnmpdReadonlyUserName}
236         snmpd_readonly_user_password: {get_param: SnmpdReadonlyUserPassword}
237         cinder_iscsi_ip_address:
238           str_replace:
239             template: "'IP'"
240             params:
241               IP: {get_attr: [NetIpMap, net_ip_uri_map, {get_param: [ServiceNetMap, CinderIscsiNetwork]}]}
242         ntp_servers: {get_param: NtpServer}
243         timezone: {get_param: TimeZone}
244         enable_package_install: {get_param: EnablePackageInstall}
245         enable_package_upgrade: {get_attr: [UpdateDeployment, update_managed_packages]}
246
247   # Map heat metadata into hiera datafiles
248   BlockStorageConfig:
249     type: OS::Heat::StructuredConfig
250     properties:
251       group: os-apply-config
252       config:
253         hiera:
254           hierarchy:
255             - '"%{::uuid}"'
256             - heat_config_%{::deploy_config_name}
257             - volume_extraconfig
258             - extraconfig
259             - service_configs
260             - volume
261             - all_nodes # provided by allNodesConfig
262             - '"%{::osfamily}"'
263             - common
264             - network
265           merge_behavior: deeper
266           datafiles:
267             service_configs:
268               mapped_data: {get_param: ServiceConfigSettings}
269             common:
270               raw_data: {get_file: hieradata/common.yaml}
271             network:
272               mapped_data:
273                 net_ip_map: {get_attr: [NetIpMap, net_ip_map]}
274                 net_ip_subnet_map: {get_attr: [NetIpMap, net_ip_subnet_map]}
275                 net_ip_uri_map: {get_attr: [NetIpMap, net_ip_uri_map]}
276             volume_extraconfig:
277               mapped_data: {get_param: BlockStorageExtraConfig}
278             extraconfig:
279               mapped_data: {get_param: ExtraConfig}
280             volume:
281               raw_data: {get_file: hieradata/volume.yaml}
282               mapped_data:
283                 # Cinder
284                 tripleo::profile::base::cinder::volume::iscsi::cinder_iscsi_ip_address: {get_input: cinder_iscsi_ip_address}
285                 ntp::servers: {get_input: ntp_servers}
286                 timezone::timezone: {get_input: timezone}
287                 tripleo::packages::enable_install: {get_input: enable_package_install}
288                 tripleo::packages::enable_upgrade: {get_input: enable_package_upgrade}
289                 snmpd_readonly_user_name: {get_input: snmpd_readonly_user_name}
290                 snmpd_readonly_user_password: {get_input: snmpd_readonly_user_password}
291
292   # Resource for site-specific injection of root certificate
293   NodeTLSCAData:
294     depends_on: BlockStorageDeployment
295     type: OS::TripleO::NodeTLSCAData
296     properties:
297       server: {get_resource: BlockStorage}
298
299   # Hook for site-specific additional pre-deployment config,
300   # applying to all nodes, e.g node registration/unregistration
301   NodeExtraConfig:
302     depends_on: NodeTLSCAData
303     type: OS::TripleO::NodeExtraConfig
304     properties:
305         server: {get_resource: BlockStorage}
306
307   UpdateConfig:
308     type: OS::TripleO::Tasks::PackageUpdate
309
310   UpdateDeployment:
311     type: OS::Heat::SoftwareDeployment
312     properties:
313       name: UpdateDeployment
314       config: {get_resource: UpdateConfig}
315       server: {get_resource: BlockStorage}
316       input_values:
317         update_identifier:
318           get_param: UpdateIdentifier
319
320 outputs:
321   hosts_entry:
322     value:
323       str_replace:
324         template: |
325           PRIMARYIP PRIMARYHOST.DOMAIN PRIMARYHOST
326           EXTERNALIP EXTERNALHOST.DOMAIN EXTERNALHOST
327           INTERNAL_APIIP INTERNAL_APIHOST.DOMAIN INTERNAL_APIHOST
328           STORAGEIP STORAGEHOST.DOMAIN STORAGEHOST
329           STORAGE_MGMTIP STORAGE_MGMTHOST.DOMAIN STORAGE_MGMTHOST
330           TENANTIP TENANTHOST.DOMAIN TENANTHOST
331           MANAGEMENTIP MANAGEMENTHOST.DOMAIN MANAGEMENTHOST
332         params:
333           PRIMARYIP: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, BlockStorageHostnameResolveNetwork]}]}
334           DOMAIN: {get_param: CloudDomain}
335           PRIMARYHOST: {get_attr: [BlockStorage, name]}
336           EXTERNALIP: {get_attr: [ExternalPort, ip_address]}
337           EXTERNALHOST:
338             list_join:
339             - '.'
340             - - {get_attr: [BlockStorage, name]}
341               - external
342           INTERNAL_APIIP: {get_attr: [InternalApiPort, ip_address]}
343           INTERNAL_APIHOST:
344             list_join:
345             - '.'
346             - - {get_attr: [BlockStorage, name]}
347               - internalapi
348           STORAGEIP: {get_attr: [StoragePort, ip_address]}
349           STORAGEHOST:
350             list_join:
351             - '.'
352             - - {get_attr: [BlockStorage, name]}
353               - storage
354           STORAGE_MGMTIP: {get_attr: [StorageMgmtPort, ip_address]}
355           STORAGE_MGMTHOST:
356             list_join:
357             - '.'
358             - - {get_attr: [BlockStorage, name]}
359               - storagemgmt
360           TENANTIP: {get_attr: [TenantPort, ip_address]}
361           TENANTHOST:
362             list_join:
363             - '.'
364             - - {get_attr: [BlockStorage, name]}
365               - tenant
366           MANAGEMENTIP: {get_attr: [ManagementPort, ip_address]}
367           MANAGEMENTHOST:
368             list_join:
369             - '.'
370             - - {get_attr: [BlockStorage, name]}
371               - management
372   nova_server_resource:
373     description: Heat resource handle for the block storage server
374     value:
375       {get_resource: BlockStorage}
376   external_ip_address:
377     description: IP address of the server in the external network
378     value: {get_attr: [ExternalPort, ip_address]}
379   internal_api_ip_address:
380     description: IP address of the server in the internal_api network
381     value: {get_attr: [InternalApiPort, ip_address]}
382   storage_ip_address:
383     description: IP address of the server in the storage network
384     value: {get_attr: [StoragePort, ip_address]}
385   storage_mgmt_ip_address:
386     description: IP address of the server in the storage_mgmt network
387     value: {get_attr: [StorageMgmtPort, ip_address]}
388   tenant_ip_address:
389     description: IP address of the server in the tenant network
390     value: {get_attr: [TenantPort, ip_address]}
391   management_ip_address:
392     description: IP address of the server in the management network
393     value: {get_attr: [ManagementPort, ip_address]}
394   config_identifier:
395     description: identifier which changes if the node configuration may need re-applying
396     value:
397       list_join:
398         - ''
399         - - {get_attr: [BlockStorageDeployment, deploy_stdout]}
400           - {get_attr: [NodeTLSCAData, deploy_stdout]}
401           - {get_param: UpdateIdentifier}