Enable DPDK on boot using PreNetworkConfig
[apex-tripleo-heat-templates.git] / puppet / blockstorage-role.yaml
1 heat_template_version: pike
2 description: 'OpenStack cinder storage configured by Puppet'
3 parameters:
4   BlockStorageImage:
5     default: overcloud-full
6     type: string
7     constraints:
8       - custom_constraint: glance.image
9   ExtraConfig:
10     default: {}
11     description: |
12       Additional hiera configuration to inject into the cluster. Note
13       that BlockStorageExtraConfig takes precedence over ExtraConfig.
14     type: json
15   BlockStorageExtraConfig:
16     default: {}
17     description: |
18       Role specific additional hiera configuration to inject into the cluster.
19     type: json
20   BlockStorageIPs:
21     default: {}
22     type: json
23   OvercloudBlockStorageFlavor:
24     description: Flavor for block storage nodes to request when deploying.
25     type: string
26     default: baremetal
27     constraints:
28       - custom_constraint: nova.flavor
29   KeyName:
30     default: default
31     description: Name of an existing Nova key pair to enable SSH access to the instances
32     type: string
33   UpdateIdentifier:
34     default: ''
35     type: string
36     description: >
37       Setting to a previously unused value during stack-update will trigger
38       package update on all nodes
39   Hostname:
40     type: string
41     default: '' # Defaults to Heat created hostname
42   HostnameMap:
43     type: json
44     default: {}
45     description: Optional mapping to override hostnames
46   ServiceNetMap:
47     default: {}
48     description: Mapping of service_name -> network name. Typically set
49                  via parameter_defaults in the resource registry.
50     type: json
51   EndpointMap:
52     default: {}
53     description: Mapping of service endpoint -> protocol. Typically set
54                  via parameter_defaults in the resource registry.
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 must match the
73       overcloud_domain_name configured on the undercloud.
74   BlockStorageServerMetadata:
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   BlockStorageSchedulerHints:
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   ServiceMetadataSettings:
106     type: json
107     default: {}
108   ConfigCommand:
109     type: string
110     description: Command which will be run whenever configuration data changes
111     default: os-refresh-config --timeout 14400
112   ConfigCollectSplay:
113     type: number
114     default: 30
115     description: |
116       Maximum amount of time to possibly to delay configuation collection
117       polling. Defaults to 30 seconds. Set to 0 to disable it which will cause
118       the configuration collection to occur as soon as the collection process
119       starts.  This setting is used to prevent the configuration collection
120       processes from polling all at the exact same time.
121   UpgradeInitCommand:
122     type: string
123     description: |
124       Command or script snippet to run on all overcloud nodes to
125       initialize the upgrade process. E.g. a repository switch.
126     default: ''
127   UpgradeInitCommonCommand:
128     type: string
129     description: |
130       Common commands required by the upgrades process. This should not
131       normally be modified by the operator and is set and unset in the
132       major-upgrade-composable-steps.yaml and major-upgrade-converge.yaml
133       environment files.
134     default: ''
135   DeploymentServerBlacklistDict:
136     default: {}
137     type: json
138     description: >
139       Map of server hostnames to blacklist from any triggered
140       deployments. If the value is 1, the server will be blacklisted. This
141       parameter is generated from the parent template.
142   RoleParameters:
143     type: json
144     description: Role Specific Parameters
145     default: {}
146
147 conditions:
148   server_not_blacklisted:
149     not:
150       equals:
151         - {get_param: [DeploymentServerBlacklistDict, {get_param: Hostname}]}
152         - 1
153
154 resources:
155   BlockStorage:
156     type: OS::TripleO::BlockStorageServer
157     metadata:
158       os-collect-config:
159         command: {get_param: ConfigCommand}
160         splay: {get_param: ConfigCollectSplay}
161     properties:
162       image:
163         {get_param: BlockStorageImage}
164       flavor: {get_param: OvercloudBlockStorageFlavor}
165       key_name: {get_param: KeyName}
166       networks:
167         - network: ctlplane
168       user_data_format: SOFTWARE_CONFIG
169       user_data: {get_resource: UserData}
170       name:
171         str_replace:
172             template: {get_param: Hostname}
173             params: {get_param: HostnameMap}
174       software_config_transport: {get_param: SoftwareConfigTransport}
175       metadata:
176         map_merge:
177           - {get_param: ServerMetadata}
178           - {get_param: BlockStorageServerMetadata}
179           - {get_param: ServiceMetadataSettings}
180       scheduler_hints: {get_param: BlockStorageSchedulerHints}
181
182   # Combine the NodeAdminUserData and NodeUserData mime archives
183   UserData:
184     type: OS::Heat::MultipartMime
185     properties:
186       parts:
187       - config: {get_resource: NodeAdminUserData}
188         type: multipart
189       - config: {get_resource: NodeUserData}
190         type: multipart
191       - config: {get_resource: RoleUserData}
192         type: multipart
193
194   # Creates the "heat-admin" user if configured via the environment
195   # Should return a OS::Heat::MultipartMime reference via OS::stack_id
196   NodeAdminUserData:
197     type: OS::TripleO::NodeAdminUserData
198
199   # For optional operator additional userdata
200   # Should return a OS::Heat::MultipartMime reference via OS::stack_id
201   NodeUserData:
202     type: OS::TripleO::NodeUserData
203
204   # For optional operator role-specific userdata
205   # Should return a OS::Heat::MultipartMime reference via OS::stack_id
206   RoleUserData:
207     type: OS::TripleO::BlockStorage::NodeUserData
208
209   ExternalPort:
210     type: OS::TripleO::BlockStorage::Ports::ExternalPort
211     properties:
212       ControlPlaneIP: {get_attr: [BlockStorage, networks, ctlplane, 0]}
213       IPPool: {get_param: BlockStorageIPs}
214       NodeIndex: {get_param: NodeIndex}
215
216   InternalApiPort:
217     type: OS::TripleO::BlockStorage::Ports::InternalApiPort
218     properties:
219       ControlPlaneIP: {get_attr: [BlockStorage, networks, ctlplane, 0]}
220       IPPool: {get_param: BlockStorageIPs}
221       NodeIndex: {get_param: NodeIndex}
222
223   StoragePort:
224     type: OS::TripleO::BlockStorage::Ports::StoragePort
225     properties:
226       ControlPlaneIP: {get_attr: [BlockStorage, networks, ctlplane, 0]}
227       IPPool: {get_param: BlockStorageIPs}
228       NodeIndex: {get_param: NodeIndex}
229
230   StorageMgmtPort:
231     type: OS::TripleO::BlockStorage::Ports::StorageMgmtPort
232     properties:
233       ControlPlaneIP: {get_attr: [BlockStorage, networks, ctlplane, 0]}
234       IPPool: {get_param: BlockStorageIPs}
235       NodeIndex: {get_param: NodeIndex}
236
237   TenantPort:
238     type: OS::TripleO::BlockStorage::Ports::TenantPort
239     properties:
240       ControlPlaneIP: {get_attr: [BlockStorage, networks, ctlplane, 0]}
241       IPPool: {get_param: BlockStorageIPs}
242       NodeIndex: {get_param: NodeIndex}
243
244   ManagementPort:
245     type: OS::TripleO::BlockStorage::Ports::ManagementPort
246     properties:
247       ControlPlaneIP: {get_attr: [BlockStorage, networks, ctlplane, 0]}
248       IPPool: {get_param: BlockStorageIPs}
249       NodeIndex: {get_param: NodeIndex}
250
251   NetworkConfig:
252     type: OS::TripleO::BlockStorage::Net::SoftwareConfig
253     properties:
254       ControlPlaneIp: {get_attr: [BlockStorage, networks, ctlplane, 0]}
255       ExternalIpSubnet: {get_attr: [ExternalPort, ip_subnet]}
256       InternalApiIpSubnet: {get_attr: [InternalApiPort, ip_subnet]}
257       StorageIpSubnet: {get_attr: [StoragePort, ip_subnet]}
258       StorageMgmtIpSubnet: {get_attr: [StorageMgmtPort, ip_subnet]}
259       TenantIpSubnet: {get_attr: [TenantPort, ip_subnet]}
260       ManagementIpSubnet: {get_attr: [ManagementPort, ip_subnet]}
261
262   NetIpMap:
263     type: OS::TripleO::Network::Ports::NetIpMap
264     properties:
265       ControlPlaneIp: {get_attr: [BlockStorage, networks, ctlplane, 0]}
266       ExternalIp: {get_attr: [ExternalPort, ip_address]}
267       ExternalIpSubnet: {get_attr: [ExternalPort, ip_subnet]}
268       ExternalIpUri: {get_attr: [ExternalPort, ip_address_uri]}
269       InternalApiIp: {get_attr: [InternalApiPort, ip_address]}
270       InternalApiIpSubnet: {get_attr: [InternalApiPort, ip_subnet]}
271       InternalApiIpUri: {get_attr: [InternalApiPort, ip_address_uri]}
272       StorageIp: {get_attr: [StoragePort, ip_address]}
273       StorageIpSubnet: {get_attr: [StoragePort, ip_subnet]}
274       StorageIpUri: {get_attr: [StoragePort, ip_address_uri]}
275       StorageMgmtIp: {get_attr: [StorageMgmtPort, ip_address]}
276       StorageMgmtIpSubnet: {get_attr: [StorageMgmtPort, ip_subnet]}
277       StorageMgmtIpUri: {get_attr: [StorageMgmtPort, ip_address_uri]}
278       TenantIp: {get_attr: [TenantPort, ip_address]}
279       TenantIpSubnet: {get_attr: [TenantPort, ip_subnet]}
280       TenantIpUri: {get_attr: [TenantPort, ip_address_uri]}
281       ManagementIp: {get_attr: [ManagementPort, ip_address]}
282       ManagementIpSubnet: {get_attr: [ManagementPort, ip_subnet]}
283       ManagementIpUri: {get_attr: [ManagementPort, ip_address_uri]}
284
285   NetHostMap:
286     type: OS::Heat::Value
287     properties:
288       type: json
289       value:
290         external:
291           fqdn:
292             list_join:
293             - '.'
294             - - {get_attr: [BlockStorage, name]}
295               - external
296               - {get_param: CloudDomain}
297           short:
298             list_join:
299             - '.'
300             - - {get_attr: [BlockStorage, name]}
301               - external
302         internal_api:
303           fqdn:
304             list_join:
305             - '.'
306             - - {get_attr: [BlockStorage, name]}
307               - internalapi
308               - {get_param: CloudDomain}
309           short:
310             list_join:
311             - '.'
312             - - {get_attr: [BlockStorage, name]}
313               - internalapi
314         storage:
315           fqdn:
316             list_join:
317             - '.'
318             - - {get_attr: [BlockStorage, name]}
319               - storage
320               - {get_param: CloudDomain}
321           short:
322             list_join:
323             - '.'
324             - - {get_attr: [BlockStorage, name]}
325               - storage
326         storage_mgmt:
327           fqdn:
328             list_join:
329             - '.'
330             - - {get_attr: [BlockStorage, name]}
331               - storagemgmt
332               - {get_param: CloudDomain}
333           short:
334             list_join:
335             - '.'
336             - - {get_attr: [BlockStorage, name]}
337               - storagemgmt
338         tenant:
339           fqdn:
340             list_join:
341             - '.'
342             - - {get_attr: [BlockStorage, name]}
343               - tenant
344               - {get_param: CloudDomain}
345           short:
346             list_join:
347             - '.'
348             - - {get_attr: [BlockStorage, name]}
349               - tenant
350         management:
351           fqdn:
352             list_join:
353             - '.'
354             - - {get_attr: [BlockStorage, name]}
355               - management
356               - {get_param: CloudDomain}
357           short:
358             list_join:
359             - '.'
360             - - {get_attr: [BlockStorage, name]}
361               - management
362         ctlplane:
363           fqdn:
364             list_join:
365             - '.'
366             - - {get_attr: [BlockStorage, name]}
367               - ctlplane
368               - {get_param: CloudDomain}
369           short:
370             list_join:
371             - '.'
372             - - {get_attr: [BlockStorage, name]}
373               - ctlplane
374
375   PreNetworkConfig:
376     type: OS::TripleO::BlockStorage::PreNetworkConfig
377     properties:
378       server: {get_resource: BlockStorage}
379       RoleParameters: {get_param: RoleParameters}
380       ServiceNames: {get_param: ServiceNames}
381
382   NetworkDeployment:
383     type: OS::TripleO::SoftwareDeployment
384     depends_on: PreNetworkConfig
385     properties:
386       name: NetworkDeployment
387       config: {get_resource: NetworkConfig}
388       server: {get_resource: BlockStorage}
389       actions:
390         if:
391           - server_not_blacklisted
392           - {get_param: NetworkDeploymentActions}
393           - []
394
395   BlockStorageUpgradeInitConfig:
396     type: OS::Heat::SoftwareConfig
397     properties:
398       group: script
399       config:
400         list_join:
401         - ''
402         - - "#!/bin/bash\n\n"
403           - "if [[ -f /etc/resolv.conf.save ]] ; then rm /etc/resolv.conf.save; fi\n\n"
404           - get_param: UpgradeInitCommand
405           - get_param: UpgradeInitCommonCommand
406
407   # Note we may be able to make this conditional on UpgradeInitCommandNotEmpty
408   # but https://bugs.launchpad.net/heat/+bug/1649900 needs fixing first
409   BlockStorageUpgradeInitDeployment:
410     type: OS::Heat::SoftwareDeployment
411     depends_on: NetworkDeployment
412     properties:
413       name: BlockStorageUpgradeInitDeployment
414       server: {get_resource: BlockStorage}
415       config: {get_resource: BlockStorageUpgradeInitConfig}
416       actions:
417         if:
418           - server_not_blacklisted
419           - ['CREATE', 'UPDATE']
420           - []
421
422   BlockStorageDeployment:
423     type: OS::Heat::StructuredDeployment
424     depends_on: BlockStorageUpgradeInitDeployment
425     properties:
426       name: BlockStorageDeployment
427       server: {get_resource: BlockStorage}
428       config: {get_resource: BlockStorageConfig}
429       input_values:
430         enable_package_upgrade: {get_attr: [UpdateDeployment, update_managed_packages]}
431       actions:
432         if:
433           - server_not_blacklisted
434           - ['CREATE', 'UPDATE']
435           - []
436
437   # Map heat metadata into hiera datafiles
438   BlockStorageConfig:
439     type: OS::Heat::StructuredConfig
440     properties:
441       group: hiera
442       config:
443         hierarchy:
444           - '"%{::uuid}"'
445           - heat_config_%{::deploy_config_name}
446           - config_step
447           - volume_extraconfig
448           - extraconfig
449           - service_names
450           - service_configs
451           - volume
452           - bootstrap_node # provided by allNodesConfig
453           - all_nodes # provided by allNodesConfig
454           - vip_data # provided by allNodesConfig
455           - '"%{::osfamily}"'
456         merge_behavior: deeper
457         datafiles:
458           service_names:
459             service_names: {get_param: ServiceNames}
460             sensu::subscriptions: {get_param: MonitoringSubscriptions}
461           service_configs:
462             map_replace:
463               - {get_param: ServiceConfigSettings}
464               - values: {get_attr: [NetIpMap, net_ip_map]}
465           volume_extraconfig: {get_param: BlockStorageExtraConfig}
466           extraconfig: {get_param: ExtraConfig}
467           volume:
468             tripleo::packages::enable_upgrade: {get_input: enable_package_upgrade}
469             fqdn_internal_api: {get_attr: [NetHostMap, value, internal_api, fqdn]}
470             fqdn_storage: {get_attr: [NetHostMap, value, storage, fqdn]}
471             fqdn_storage_mgmt: {get_attr: [NetHostMap, value, storage_mgmt, fqdn]}
472             fqdn_tenant: {get_attr: [NetHostMap, value, tenant, fqdn]}
473             fqdn_management: {get_attr: [NetHostMap, value, management, fqdn]}
474             fqdn_ctlplane: {get_attr: [NetHostMap, value, ctlplane, fqdn]}
475             fqdn_external: {get_attr: [NetHostMap, value, external, fqdn]}
476
477   # Resource for site-specific injection of root certificate
478   NodeTLSCAData:
479     depends_on: BlockStorageDeployment
480     type: OS::TripleO::NodeTLSCAData
481     properties:
482       server: {get_resource: BlockStorage}
483
484   # Hook for site-specific additional pre-deployment config,
485   # applying to all nodes, e.g node registration/unregistration
486   NodeExtraConfig:
487     depends_on: NodeTLSCAData
488     type: OS::TripleO::NodeExtraConfig
489     properties:
490         server: {get_resource: BlockStorage}
491
492   UpdateConfig:
493     type: OS::TripleO::Tasks::PackageUpdate
494
495   UpdateDeployment:
496     type: OS::Heat::SoftwareDeployment
497     depends_on: NetworkDeployment
498     properties:
499       name: UpdateDeployment
500       config: {get_resource: UpdateConfig}
501       server: {get_resource: BlockStorage}
502       input_values:
503         update_identifier:
504           get_param: UpdateIdentifier
505       actions:
506         if:
507           - server_not_blacklisted
508           - ['CREATE', 'UPDATE']
509           - []
510
511   SshHostPubKey:
512     type: OS::TripleO::Ssh::HostPubKey
513     depends_on: BlockStorageDeployment
514     properties:
515         server: {get_resource: BlockStorage}
516
517 outputs:
518   ip_address:
519     description: IP address of the server in the ctlplane network
520     value: {get_attr: [BlockStorage, networks, ctlplane, 0]}
521   hostname:
522     description: Hostname of the server
523     value: {get_attr: [BlockStorage, name]}
524   hostname_map:
525     description: Mapping of network names to hostnames
526     value:
527       external: {get_attr: [NetHostMap, value, external, fqdn]}
528       internal_api: {get_attr: [NetHostMap, value, internal_api, fqdn]}
529       storage: {get_attr: [NetHostMap, value, storage, fqdn]}
530       storage_mgmt: {get_attr: [NetHostMap, value, storage_mgmt, fqdn]}
531       tenant: {get_attr: [NetHostMap, value, tenant, fqdn]}
532       management: {get_attr: [NetHostMap, value, management, fqdn]}
533       ctlplane: {get_attr: [NetHostMap, value, ctlplane, fqdn]}
534   hosts_entry:
535     value:
536       str_replace:
537         template: |
538           PRIMARYIP PRIMARYHOST.DOMAIN PRIMARYHOST
539           EXTERNALIP EXTERNALHOST.DOMAIN EXTERNALHOST
540           INTERNAL_APIIP INTERNAL_APIHOST.DOMAIN INTERNAL_APIHOST
541           STORAGEIP STORAGEHOST.DOMAIN STORAGEHOST
542           STORAGE_MGMTIP STORAGE_MGMTHOST.DOMAIN STORAGE_MGMTHOST
543           TENANTIP TENANTHOST.DOMAIN TENANTHOST
544           MANAGEMENTIP MANAGEMENTHOST.DOMAIN MANAGEMENTHOST
545           CTLPLANEIP CTLPLANEHOST.DOMAIN CTLPLANEHOST
546         params:
547           PRIMARYIP: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, BlockStorageHostnameResolveNetwork]}]}
548           DOMAIN: {get_param: CloudDomain}
549           PRIMARYHOST: {get_attr: [BlockStorage, name]}
550           EXTERNALIP: {get_attr: [ExternalPort, ip_address]}
551           EXTERNALHOST: {get_attr: [NetHostMap, value, external, short]}
552           INTERNAL_APIIP: {get_attr: [InternalApiPort, ip_address]}
553           INTERNAL_APIHOST: {get_attr: [NetHostMap, value, internal_api, short]}
554           STORAGEIP: {get_attr: [StoragePort, ip_address]}
555           STORAGEHOST: {get_attr: [NetHostMap, value, storage, short]}
556           STORAGE_MGMTIP: {get_attr: [StorageMgmtPort, ip_address]}
557           STORAGE_MGMTHOST: {get_attr: [NetHostMap, value, storage_mgmt, short]}
558           TENANTIP: {get_attr: [TenantPort, ip_address]}
559           TENANTHOST: {get_attr: [NetHostMap, value, tenant, short]}
560           MANAGEMENTIP: {get_attr: [ManagementPort, ip_address]}
561           MANAGEMENTHOST: {get_attr: [NetHostMap, value, management, short]}
562           CTLPLANEIP: {get_attr: [BlockStorage, networks, ctlplane, 0]}
563           CTLPLANEHOST: {get_attr: [NetHostMap, value, ctlplane, short]}
564   known_hosts_entry:
565     description: Entry for ssh known hosts
566     value:
567       str_replace:
568         template: "PRIMARYIP,PRIMARYHOST.DOMAIN,PRIMARYHOST,\
569 EXTERNALIP,EXTERNALHOST.DOMAIN,EXTERNALHOST,\
570 INTERNAL_APIIP,INTERNAL_APIHOST.DOMAIN,INTERNAL_APIHOST,\
571 STORAGEIP,STORAGEHOST.DOMAIN,STORAGEHOST,\
572 STORAGE_MGMTIP,STORAGE_MGMTHOST.DOMAIN,STORAGE_MGMTHOST,\
573 TENANTIP,TENANTHOST.DOMAIN,TENANTHOST,\
574 MANAGEMENTIP,MANAGEMENTHOST.DOMAIN,MANAGEMENTHOST,\
575 CTLPLANEIP,CTLPLANEHOST.DOMAIN,CTLPLANEHOST HOSTSSHPUBKEY"
576         params:
577           PRIMARYIP: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, BlockStorageHostnameResolveNetwork]}]}
578           DOMAIN: {get_param: CloudDomain}
579           PRIMARYHOST: {get_attr: [BlockStorage, name]}
580           EXTERNALIP: {get_attr: [ExternalPort, ip_address]}
581           EXTERNALHOST: {get_attr: [NetHostMap, value, external, short]}
582           INTERNAL_APIIP: {get_attr: [InternalApiPort, ip_address]}
583           INTERNAL_APIHOST: {get_attr: [NetHostMap, value, internal_api, short]}
584           STORAGEIP: {get_attr: [StoragePort, ip_address]}
585           STORAGEHOST: {get_attr: [NetHostMap, value, storage, short]}
586           STORAGE_MGMTIP: {get_attr: [StorageMgmtPort, ip_address]}
587           STORAGE_MGMTHOST: {get_attr: [NetHostMap, value, storage_mgmt, short]}
588           TENANTIP: {get_attr: [TenantPort, ip_address]}
589           TENANTHOST: {get_attr: [NetHostMap, value, tenant, short]}
590           MANAGEMENTIP: {get_attr: [ManagementPort, ip_address]}
591           MANAGEMENTHOST: {get_attr: [NetHostMap, value, management, short]}
592           CTLPLANEIP: {get_attr: [BlockStorage, networks, ctlplane, 0]}
593           CTLPLANEHOST: {get_attr: [NetHostMap, value, ctlplane, short]}
594           HOSTSSHPUBKEY: {get_attr: [SshHostPubKey, ecdsa]}
595   nova_server_resource:
596     description: Heat resource handle for the block storage server
597     value:
598       {get_resource: BlockStorage}
599     condition: server_not_blacklisted
600   external_ip_address:
601     description: IP address of the server in the external network
602     value: {get_attr: [ExternalPort, ip_address]}
603   internal_api_ip_address:
604     description: IP address of the server in the internal_api network
605     value: {get_attr: [InternalApiPort, ip_address]}
606   storage_ip_address:
607     description: IP address of the server in the storage network
608     value: {get_attr: [StoragePort, ip_address]}
609   storage_mgmt_ip_address:
610     description: IP address of the server in the storage_mgmt network
611     value: {get_attr: [StorageMgmtPort, ip_address]}
612   tenant_ip_address:
613     description: IP address of the server in the tenant network
614     value: {get_attr: [TenantPort, ip_address]}
615   management_ip_address:
616     description: IP address of the server in the management network
617     value: {get_attr: [ManagementPort, ip_address]}