Add IPv6 Support to Isolated Networks

This change adds a new set of network templates with IPv6 subnets
that can be used instead of the existing IPv4 networks. Each network
can use either the IPv4 or IPv6 template, and the Neutron subnet will
be created with the specified IP version.

The default addresses used for the IPv6 networks use the fd00::/8
prefix for the internal isolated networks (this range is reserved
for private use similar to 10.0.0.0/8), and 2001:db8:fd00:1000::/64
is used as an example default for the External network
(2001:db8::/32 are the documentation addresses [RFC3849]), but this
would ordinarily be a globally addressable subnet. These
parameters may be overridden in an environment file.

This change will require updates to the OpenStack Puppet
Modules to support IPv6 addresses in some of the hieradata values.
Many of the OPM modules already have IPv6 support to support IPv6
deployments in Packstack, but some OPM packages that apply only to
Instack/TripleO deployments need to be updated.

IPv6 addresses used in URLs need to be surrounded by brackets in
order to differentiate IP address from port number. This change
adds a new output to the network/ports resources for
ip_address_uri, which is an IP address with brackets in the case
of IPv6, and a raw IP address without brackets for IPv4 ports.
This change also updates some URLs which are constructed in Heat.

This has been tested and problems were found with Puppet not
accepting IPv6 addresses. This is addressed in the latest Puppet.
Additional changes were required to make this work with Ceph.

IPv6 tunnel endpoints with Open vSwitch are not yet supported
(although support is coming soon), so this review leaves the
Tenant network as an isolated IPv4 network for the time being.

Change-Id: Ie7a742bdf1db533edda2998a53d28528f80ef8e2
This commit is contained in:
Dan Sneddon 2015-10-15 08:10:44 -07:00 committed by Giulio Fidente
parent 07e99fef9b
commit 321e605a0a
39 changed files with 1009 additions and 30 deletions

View File

@ -0,0 +1,49 @@
# Enable the creation of IPv6 Neutron networks for isolated Overcloud
# traffic and configure each role to assign ports (related
# to that role) on these networks.
resource_registry:
OS::TripleO::Network::External: ../network/external_v6.yaml
OS::TripleO::Network::InternalApi: ../network/internal_api_v6.yaml
OS::TripleO::Network::StorageMgmt: ../network/storage_mgmt_v6.yaml
OS::TripleO::Network::Storage: ../network/storage_v6.yaml
# IPv4 until OVS and Neutron support IPv6 tunnel endpoints
OS::TripleO::Network::Tenant: ../network/tenant.yaml
# Port assignments for the VIPs
OS::TripleO::Network::Ports::ExternalVipPort: ../network/ports/external_v6.yaml
OS::TripleO::Network::Ports::InternalApiVipPort: ../network/ports/internal_api_v6.yaml
OS::TripleO::Network::Ports::StorageVipPort: ../network/ports/storage_v6.yaml
OS::TripleO::Network::Ports::StorageMgmtVipPort: ../network/ports/storage_mgmt_v6.yaml
OS::TripleO::Network::Ports::RedisVipPort: ../network/ports/vip_v6.yaml
# Port assignments for the controller role
OS::TripleO::Controller::Ports::ExternalPort: ../network/ports/external_v6.yaml
OS::TripleO::Controller::Ports::InternalApiPort: ../network/ports/internal_api_v6.yaml
OS::TripleO::Controller::Ports::StoragePort: ../network/ports/storage_v6.yaml
OS::TripleO::Controller::Ports::StorageMgmtPort: ../network/ports/storage_mgmt_v6.yaml
OS::TripleO::Controller::Ports::TenantPort: ../network/ports/tenant.yaml
# Port assignments for the compute role
OS::TripleO::Compute::Ports::InternalApiPort: ../network/ports/internal_api_v6.yaml
OS::TripleO::Compute::Ports::StoragePort: ../network/ports/storage_v6.yaml
OS::TripleO::Compute::Ports::TenantPort: ../network/ports/tenant.yaml
# Port assignments for the ceph storage role
OS::TripleO::CephStorage::Ports::StoragePort: ../network/ports/storage_v6.yaml
OS::TripleO::CephStorage::Ports::StorageMgmtPort: ../network/ports/storage_mgmt_v6.yaml
# Port assignments for the swift storage role
OS::TripleO::SwiftStorage::Ports::InternalApiPort: ../network/ports/internal_api_v6.yaml
OS::TripleO::SwiftStorage::Ports::StoragePort: ../network/ports/storage_v6.yaml
OS::TripleO::SwiftStorage::Ports::StorageMgmtPort: ../network/ports/storage_mgmt_v6.yaml
# Port assignments for the block storage role
OS::TripleO::BlockStorage::Ports::InternalApiPort: ../network/ports/internal_api_v6.yaml
OS::TripleO::BlockStorage::Ports::StoragePort: ../network/ports/storage_v6.yaml
OS::TripleO::BlockStorage::Ports::StorageMgmtPort: ../network/ports/storage_mgmt_v6.yaml
parameter_defaults:
# Enable IPv6 for MongoDB. This is required when MongoDB is using an IPv6 IP.
MongoDbIPv6: True
# Enable various IPv6 features in Nova.
NovaIPv6: True

View File

@ -173,7 +173,10 @@ def template_endpoint_items(config):
def generate_endpoint_map_template(config): def generate_endpoint_map_template(config):
return collections.OrderedDict([ return collections.OrderedDict([
('heat_template_version', '2015-04-30'), ('heat_template_version', '2015-04-30'),
('description', 'A map of OpenStack endpoints.'), ('description', 'A map of OpenStack endpoints. Since the endpoints '
'are URLs, we need to have brackets around IPv6 IP addresses. The '
'inputs to these parameters come from net_ip_uri_map, which will '
'include these brackets in IPv6 addresses.'),
('parameters', template_parameters(config)), ('parameters', template_parameters(config)),
('outputs', { ('outputs', {
'endpoint_map': { 'endpoint_map': {

View File

@ -3,7 +3,10 @@
### by the script build_endpoint_map.py ### by the script build_endpoint_map.py
heat_template_version: '2015-04-30' heat_template_version: '2015-04-30'
description: A map of OpenStack endpoints. description: A map of OpenStack endpoints. Since the endpoints are URLs,
we need to have brackets around IPv6 IP addresses. The inputs to these
parameters come from net_ip_uri_map, which will include these brackets
in IPv6 addresses.
parameters: parameters:
AodhApiVirtualIP: {type: string, default: ''} AodhApiVirtualIP: {type: string, default: ''}
CeilometerApiVirtualIP: {type: string, default: ''} CeilometerApiVirtualIP: {type: string, default: ''}

61
network/external_v6.yaml Normal file
View File

@ -0,0 +1,61 @@
heat_template_version: 2015-04-30
description: >
External network. Public traffic, Neutron l3router for floating IPs/SNAT, etc.
parameters:
# the defaults here work for static IP assignment (IPAM) only
ExternalNetCidr:
# OpenStack uses the EUI-64 address format, which requires a /64 prefix
default: '2001:db8:fd00:1000::/64'
description: Cidr for the external network.
type: string
ExternalNetValueSpecs:
default: {'provider:physical_network': 'external', 'provider:network_type': 'flat'}
description: Value specs for the external network.
type: json
ExternalNetAdminStateUp:
default: false
description: This admin state of of the network.
type: boolean
ExternalNetShared:
default: false
description: Whether this network is shared across all tenants.
type: boolean
ExternalNetName:
default: external
description: The name of the external network.
type: string
ExternalSubnetName:
default: external_subnet
description: The name of the external subnet in Neutron.
type: string
ExternalAllocationPools:
default: [{'start': '2001:db8:fd00:1000::10', 'end': '2001:db8:fd00:1000:ffff:ffff:ffff:fffe'}]
description: Ip allocation pool range for the external network.
type: json
resources:
ExternalNetwork:
type: OS::Neutron::Net
properties:
admin_state_up: {get_param: ExternalNetAdminStateUp}
name: {get_param: ExternalNetName}
shared: {get_param: ExternalNetShared}
value_specs: {get_param: ExternalNetValueSpecs}
ExternalSubnet:
type: OS::Neutron::Subnet
properties:
ip_version: 6
ipv6_address_mode: slaac
ipv6_ra_mode: slaac
cidr: {get_param: ExternalNetCidr}
name: {get_param: ExternalSubnetName}
network: {get_resource: ExternalNetwork}
allocation_pools: {get_param: ExternalAllocationPools}
outputs:
OS::stack_id:
description: Neutron external network
value: {get_resource: ExternalNetwork}

View File

@ -0,0 +1,61 @@
heat_template_version: 2015-04-30
description: >
Internal API network. Used for most APIs, Database, RPC.
parameters:
# the defaults here work for static IP assignment (IPAM) only
InternalApiNetCidr:
# OpenStack uses the EUI-64 address format, which requires a /64 prefix
default: 'fd00:fd00:fd00:2000::/64'
description: Cidr for the internal API network.
type: string
InternalApiNetValueSpecs:
default: {'provider:physical_network': 'internal_api', 'provider:network_type': 'flat'}
description: Value specs for the internal API network.
type: json
InternalApiNetAdminStateUp:
default: false
description: This admin state of of the network.
type: boolean
InternalApiNetShared:
default: false
description: Whether this network is shared across all tenants.
type: boolean
InternalApiNetName:
default: internal_api
description: The name of the internal API network.
type: string
InternalApiSubnetName:
default: internal_api_subnet
description: The name of the internal API subnet in Neutron.
type: string
InternalApiAllocationPools:
default: [{'start': 'fd00:fd00:fd00:2000::10', 'end': 'fd00:fd00:fd00:2000:ffff:ffff:ffff:fffe'}]
description: Ip allocation pool range for the internal API network.
type: json
resources:
InternalApiNetwork:
type: OS::Neutron::Net
properties:
admin_state_up: {get_param: InternalApiNetAdminStateUp}
name: {get_param: InternalApiNetName}
shared: {get_param: InternalApiNetShared}
value_specs: {get_param: InternalApiNetValueSpecs}
InternalApiSubnet:
type: OS::Neutron::Subnet
properties:
ip_version: 6
ipv6_address_mode: slaac
ipv6_ra_mode: slaac
cidr: {get_param: InternalApiNetCidr}
name: {get_param: InternalApiSubnetName}
network: {get_resource: InternalApiNetwork}
allocation_pools: {get_param: InternalApiAllocationPools}
outputs:
OS::stack_id:
description: Neutron internal network
value: {get_resource: InternalApiNetwork}

View File

@ -45,6 +45,9 @@ outputs:
ip_address: ip_address:
description: Virtual IP network IP description: Virtual IP network IP
value: {get_attr: [VipPort, fixed_ips, 0, ip_address]} value: {get_attr: [VipPort, fixed_ips, 0, ip_address]}
ip_address_uri:
description: Virtual IP network IP (for compatibility with vip_v6.yaml)
value: {get_attr: [VipPort, fixed_ips, 0, ip_address]}
ip_subnet: ip_subnet:
description: IP/Subnet CIDR for the ctlplane network. description: IP/Subnet CIDR for the ctlplane network.
value: value:

View File

@ -48,6 +48,9 @@ outputs:
ip_address: ip_address:
description: external network IP description: external network IP
value: {get_attr: [ExternalPort, fixed_ips, 0, ip_address]} value: {get_attr: [ExternalPort, fixed_ips, 0, ip_address]}
ip_address_uri:
description: external network IP (for compatibility with external_v6.yaml)
value: {get_attr: [ExternalPort, fixed_ips, 0, ip_address]}
ip_subnet: ip_subnet:
description: IP/Subnet CIDR for the external network IP description: IP/Subnet CIDR for the external network IP
value: value:

View File

@ -33,6 +33,9 @@ outputs:
ip_address: ip_address:
description: external network IP description: external network IP
value: {get_param: [IPPool, {get_param: ExternalNetName}, {get_param: NodeIndex}]} value: {get_param: [IPPool, {get_param: ExternalNetName}, {get_param: NodeIndex}]}
ip_address_uri:
description: external network IP (for compatibility with IPv6)
value: {get_param: [IPPool, {get_param: ExternalNetName}, {get_param: NodeIndex}]}
ip_subnet: ip_subnet:
description: IP/Subnet CIDR for the external network IP description: IP/Subnet CIDR for the external network IP
value: value:

View File

@ -0,0 +1,68 @@
heat_template_version: 2015-04-30
description: >
Creates a port on the external network. The IP address will be chosen
automatically if FixedIPs is empty.
parameters:
ExternalNetName:
description: Name of the external neutron network
default: external
type: string
PortName:
description: Name of the port
default: ''
type: string
ControlPlaneIP: # Here for compatability with noop.yaml
description: IP address on the control plane
default: ''
type: string
ControlPlaneNetwork: # Here for compatibility with ctlplane_vip.yaml
description: The name of the undercloud Neutron control plane
default: ctlplane
type: string
FixedIPs:
description: >
Control the IP allocation for the VIP port. E.g.
[{'ip_address':'1.2.3.4'}]
default: []
type: json
IPPool: # Here for compatibility with from_pool.yaml
default: {}
type: json
NodeIndex: # Here for compatibility with from_pool.yaml
default: 0
type: number
resources:
ExternalPort:
type: OS::Neutron::Port
properties:
network: {get_param: ExternalNetName}
name: {get_param: PortName}
fixed_ips: {get_param: FixedIPs}
replacement_policy: AUTO
outputs:
ip_address:
description: external network IP
value: {get_attr: [ExternalPort, fixed_ips, 0, ip_address]}
ip_address_uri:
description: external network IP with brackets suitable for a URL
value:
list_join:
- ''
- - '['
- {get_attr: [ExternalPort, fixed_ips, 0, ip_address]}
- ']'
ip_subnet:
# FIXME: this assumes a 2 digit subnet CIDR (need more heat functions?)
description: IP/Subnet CIDR for the external network IP
value:
list_join:
- ''
- - {get_attr: [ExternalPort, fixed_ips, 0, ip_address]}
- '/'
- {get_attr: [ExternalPort, subnets, 0, cidr, -2]}
- {get_attr: [ExternalPort, subnets, 0, cidr, -1]}

View File

@ -32,3 +32,6 @@ outputs:
ip_address: ip_address:
description: network IP description: network IP
value: {get_param: [ServiceVips, {get_param: ServiceName}]} value: {get_param: [ServiceVips, {get_param: ServiceName}]}
ip_address_uri:
description: network IP (for compatibility with IPv6)
value: {get_param: [ServiceVips, {get_param: ServiceName}]}

View File

@ -43,6 +43,10 @@ outputs:
ip_address: ip_address:
description: internal API network IP description: internal API network IP
value: {get_attr: [InternalApiPort, fixed_ips, 0, ip_address]} value: {get_attr: [InternalApiPort, fixed_ips, 0, ip_address]}
ip_address_uri:
description: |
internal API network IP (for compatibility with internal_api_v6.yaml)
value: {get_attr: [InternalApiPort, fixed_ips, 0, ip_address]}
ip_subnet: ip_subnet:
description: IP/Subnet CIDR for the internal API network IP description: IP/Subnet CIDR for the internal API network IP
value: value:

View File

@ -33,6 +33,9 @@ outputs:
ip_address: ip_address:
description: internal API network IP description: internal API network IP
value: {get_param: [IPPool, {get_param: InternalApiNetName}, {get_param: NodeIndex}]} value: {get_param: [IPPool, {get_param: InternalApiNetName}, {get_param: NodeIndex}]}
ip_address_uri:
description: internal API network IP (for compatibility with internal_api_v6.yaml)
value: {get_param: [IPPool, {get_param: InternalApiNetName}, {get_param: NodeIndex}]}
ip_subnet: ip_subnet:
description: IP/Subnet CIDR for the internal API network IP description: IP/Subnet CIDR for the internal API network IP
value: value:

View File

@ -0,0 +1,63 @@
heat_template_version: 2015-04-30
description: >
Creates a port on the internal_api network.
parameters:
InternalApiNetName:
description: Name of the internal API neutron network
default: internal_api
type: string
PortName:
description: Name of the port
default: ''
type: string
ControlPlaneIP: # Here for compatability with noop.yaml
description: IP address on the control plane
default: ''
type: string
FixedIPs:
description: >
Control the IP allocation for the VIP port. E.g.
[{'ip_address':'1.2.3.4'}]
default: []
type: json
IPPool: # Here for compatibility with from_pool.yaml
default: {}
type: json
NodeIndex: # Here for compatibility with from_pool.yaml
default: 0
type: number
resources:
InternalApiPort:
type: OS::Neutron::Port
properties:
network: {get_param: InternalApiNetName}
name: {get_param: PortName}
fixed_ips: {get_param: FixedIPs}
replacement_policy: AUTO
outputs:
ip_address:
description: internal API network IP
value: {get_attr: [InternalApiPort, fixed_ips, 0, ip_address]}
ip_address_uri:
description: internal api network IP with brackets suitable for a URL
value:
list_join:
- ''
- - '['
- {get_attr: [InternalApiPort, fixed_ips, 0, ip_address]}
- ']'
ip_subnet:
# FIXME: this assumes a 2 digit subnet CIDR (need more heat functions?)
description: IP/Subnet CIDR for the internal API network IP
value:
list_join:
- ''
- - {get_attr: [InternalApiPort, fixed_ips, 0, ip_address]}
- '/'
- {get_attr: [InternalApiPort, subnets, 0, cidr, -2]}
- {get_attr: [InternalApiPort, subnets, 0, cidr, -1]}

View File

@ -36,6 +36,9 @@ outputs:
ip_address: ip_address:
description: management network IP description: management network IP
value: {get_attr: [ManagementPort, fixed_ips, 0, ip_address]} value: {get_attr: [ManagementPort, fixed_ips, 0, ip_address]}
ip_address_uri:
description: management network IP (for compatibility with management_v6.yaml)
value: {get_attr: [ManagementPort, fixed_ips, 0, ip_address]}
ip_subnet: ip_subnet:
description: IP/Subnet CIDR for the management network IP description: IP/Subnet CIDR for the management network IP
value: value:

View File

@ -33,6 +33,9 @@ outputs:
ip_address: ip_address:
description: management network IP description: management network IP
value: {get_param: [IPPool, {get_param: ManagementNetName}, {get_param: NodeIndex}]} value: {get_param: [IPPool, {get_param: ManagementNetName}, {get_param: NodeIndex}]}
ip_address_uri:
description: management network IP (for compatibility with management_v6.yaml)
value: {get_param: [IPPool, {get_param: ManagementNetName}, {get_param: NodeIndex}]}
ip_subnet: ip_subnet:
description: IP/Subnet CIDR for the management network IP description: IP/Subnet CIDR for the management network IP
value: value:

View File

@ -0,0 +1,54 @@
heat_template_version: 2015-10-15
description: >
Creates a port on the management network. The IP address will be chosen
automatically if FixedIPs is empty.
parameters:
ManagementNetName:
description: Name of the management neutron network
default: management
type: string
PortName:
description: Name of the port
default: ''
type: string
ControlPlaneIP: # Here for compatibility with noop.yaml
description: IP address on the control plane
type: string
IPPool: # Here for compatibility with from_pool.yaml
default: {}
type: json
NodeIndex: # Here for compatibility with from_pool.yaml
default: 0
type: number
resources:
ManagementPort:
type: OS::Neutron::Port
properties:
network: {get_param: ManagementNetName}
name: {get_param: PortName}
replacement_policy: AUTO
outputs:
ip_address:
description: management network IP
value: {get_attr: [ManagementPort, fixed_ips, 0, ip_address]}
ip_address_uri:
description: management network IP with brackets suitable for a URL
value:
list_join:
- ''
- - '['
- {get_attr: [ManagementPort, fixed_ips, 0, ip_address]}
- ']'
ip_subnet:
description: IP/Subnet CIDR for the management network IP
value:
list_join:
- ''
- - {get_attr: [ManagementPort, fixed_ips, 0, ip_address]}
- '/'
- {str_split: ['/', {get_attr: [ManagementPort, subnets, 0, cidr]}, 1]}

View File

@ -7,21 +7,45 @@ parameters:
ExternalIp: ExternalIp:
default: '' default: ''
type: string type: string
ExternalIpUri:
default: ''
type: string
description: IP address with brackets in case of IPv6
InternalApiIp: InternalApiIp:
default: '' default: ''
type: string type: string
InternalApiIpUri:
default: ''
type: string
description: IP address with brackets in case of IPv6
StorageIp: StorageIp:
default: '' default: ''
type: string type: string
StorageIpUri:
default: ''
type: string
description: IP address with brackets in case of IPv6
StorageMgmtIp: StorageMgmtIp:
default: '' default: ''
type: string type: string
StorageMgmtIpUri:
default: ''
type: string
description: IP address with brackets in case of IPv6
TenantIp: TenantIp:
default: '' default: ''
type: string type: string
TenantIpUri:
default: ''
type: string
description: IP address with brackets in case of IPv6
ManagementIp: ManagementIp:
default: '' default: ''
type: string type: string
ManagementIpUri:
default: ''
type: string
description: IP address with brackets in case of IPv6
outputs: outputs:
net_ip_map: net_ip_map:
@ -36,3 +60,15 @@ outputs:
storage_mgmt: {get_param: StorageMgmtIp} storage_mgmt: {get_param: StorageMgmtIp}
tenant: {get_param: TenantIp} tenant: {get_param: TenantIp}
management: {get_param: ManagementIp} management: {get_param: ManagementIp}
net_ip_uri_map:
description: >
A Hash containing a mapping of netowrk names to assigned IPs for a
specific machine with brackets around IPv6 addresses for use in URLs.
value:
ctlplane: {get_param: ControlPlaneIp}
external: {get_param: ExternalIpUri}
internal_api: {get_param: InternalApiIpUri}
storage: {get_param: StorageIpUri}
storage_mgmt: {get_param: StorageMgmtIpUri}
tenant: {get_param: TenantIpUri}
management: {get_param: ManagementIpUri}

View File

@ -24,18 +24,33 @@ parameters:
ExternalIp: ExternalIp:
default: '' default: ''
type: string type: string
ExternalIpUri:
default: ''
type: string
InternalApiIp: InternalApiIp:
default: '' default: ''
type: string type: string
InternalApiIpUri:
default: ''
type: string
StorageIp: StorageIp:
default: '' default: ''
type: string type: string
StorageIpUri:
default: ''
type: string
StorageMgmtIp: StorageMgmtIp:
default: '' default: ''
type: string type: string
StorageMgmtIpUri:
default: ''
type: string
TenantIp: TenantIp:
default: '' default: ''
type: string type: string
TenantIpUri:
default: ''
type: string
outputs: outputs:
net_ip_map: net_ip_map:
@ -48,3 +63,13 @@ outputs:
internal_api: {get_param: InternalApiNetworkVip} internal_api: {get_param: InternalApiNetworkVip}
storage: {get_param: StorageNetworkVip} storage: {get_param: StorageNetworkVip}
storage_mgmt: {get_param: StorageMgmtNetworkVip} storage_mgmt: {get_param: StorageMgmtNetworkVip}
net_ip_uri_map:
description: >
A Hash containing a mapping of netowrk names to assigned IPs for a
specific machine with brackets around IPv6 addresses for use in URLs.
value:
ctlplane: {get_param: ControlPlaneIP}
external: {get_param: ExternalNetworkVip}
internal_api: {get_param: InternalApiNetworkVip}
storage: {get_param: StorageNetworkVip}
storage_mgmt: {get_param: StorageMgmtNetworkVip}

View File

@ -44,6 +44,9 @@ outputs:
ip_address: ip_address:
description: pass thru network IP description: pass thru network IP
value: {get_param: ControlPlaneIP} value: {get_param: ControlPlaneIP}
ip_address_uri:
description: pass thru network IP (for compatibility with vip_v6.yaml)
value: {get_param: ControlPlaneIP}
ip_subnet: ip_subnet:
description: IP/Subnet CIDR for the pass thru network IP description: IP/Subnet CIDR for the pass thru network IP
value: value:

View File

@ -43,6 +43,9 @@ outputs:
ip_address: ip_address:
description: storage network IP description: storage network IP
value: {get_attr: [StoragePort, fixed_ips, 0, ip_address]} value: {get_attr: [StoragePort, fixed_ips, 0, ip_address]}
ip_address_uri:
description: storage network IP (for compatibility with storage_v6.yaml)
value: {get_attr: [StoragePort, fixed_ips, 0, ip_address]}
ip_subnet: ip_subnet:
description: IP/Subnet CIDR for the storage network IP description: IP/Subnet CIDR for the storage network IP
value: value:

View File

@ -33,6 +33,9 @@ outputs:
ip_address: ip_address:
description: storage network IP description: storage network IP
value: {get_param: [IPPool, {get_param: StorageNetName}, {get_param: NodeIndex}]} value: {get_param: [IPPool, {get_param: StorageNetName}, {get_param: NodeIndex}]}
ip_address_uri:
description: storage network IP (for compatibility with storage_v6.yaml)
value: {get_param: [IPPool, {get_param: StorageNetName}, {get_param: NodeIndex}]}
ip_subnet: ip_subnet:
description: IP/Subnet CIDR for the storage network IP description: IP/Subnet CIDR for the storage network IP
value: value:

View File

@ -43,6 +43,10 @@ outputs:
ip_address: ip_address:
description: storage_mgmt network IP description: storage_mgmt network IP
value: {get_attr: [StorageMgmtPort, fixed_ips, 0, ip_address]} value: {get_attr: [StorageMgmtPort, fixed_ips, 0, ip_address]}
ip_address_uri:
description: |
storage_mgmt network IP (for compatibility with storage_mgmt_v6.yaml)
value: {get_attr: [StorageMgmtPort, fixed_ips, 0, ip_address]}
ip_subnet: ip_subnet:
description: IP/Subnet CIDR for the storage_mgmt network IP description: IP/Subnet CIDR for the storage_mgmt network IP
value: value:

View File

@ -33,6 +33,9 @@ outputs:
ip_address: ip_address:
description: storage MGMT network IP description: storage MGMT network IP
value: {get_param: [IPPool, {get_param: StorageMgmtNetName}, {get_param: NodeIndex}]} value: {get_param: [IPPool, {get_param: StorageMgmtNetName}, {get_param: NodeIndex}]}
ip_address_uri:
description: storage MGMT network IP (for compatibility with storage_mgmt_v6.yaml)
value: {get_param: [IPPool, {get_param: StorageMgmtNetName}, {get_param: NodeIndex}]}
ip_subnet: ip_subnet:
description: IP/Subnet CIDR for the storage MGMT network IP description: IP/Subnet CIDR for the storage MGMT network IP
value: value:

View File

@ -0,0 +1,63 @@
heat_template_version: 2015-04-30
description: >
Creates a port on the storage_mgmt API network.
parameters:
StorageMgmtNetName:
description: Name of the storage_mgmt API neutron network
default: storage_mgmt
type: string
PortName:
description: Name of the port
default: ''
type: string
ControlPlaneIP: # Here for compatability with noop.yaml
description: IP address on the control plane
default: ''
type: string
FixedIPs:
description: >
Control the IP allocation for the VIP port. E.g.
[{'ip_address':'1.2.3.4'}]
default: []
type: json
IPPool: # Here for compatibility with from_pool.yaml
default: {}
type: json
NodeIndex: # Here for compatibility with from_pool.yaml
default: 0
type: number
resources:
StorageMgmtPort:
type: OS::Neutron::Port
properties:
network: {get_param: StorageMgmtNetName}
name: {get_param: PortName}
fixed_ips: {get_param: FixedIPs}
replacement_policy: AUTO
outputs:
ip_address:
description: storage_mgmt network IP
value: {get_attr: [StorageMgmtPort, fixed_ips, 0, ip_address]}
ip_address_uri:
description: storage_mgmt network IP with brackets suitable for a URI
value:
list_join:
- ''
- - '['
- {get_attr: [StorageMgmtPort, fixed_ips, 0, ip_address]}
- ']'
ip_subnet:
# FIXME: this assumes a 2 digit subnet CIDR (need more heat functions?)
description: IP/Subnet CIDR for the storage_mgmt network IP
value:
list_join:
- ''
- - {get_attr: [StorageMgmtPort, fixed_ips, 0, ip_address]}
- '/'
- {get_attr: [StorageMgmtPort, subnets, 0, cidr, -2]}
- {get_attr: [StorageMgmtPort, subnets, 0, cidr, -1]}

View File

@ -0,0 +1,63 @@
heat_template_version: 2015-04-30
description: >
Creates a port on the storage network.
parameters:
StorageNetName:
description: Name of the storage neutron network
default: storage
type: string
PortName:
description: Name of the port
default: ''
type: string
ControlPlaneIP: # Here for compatability with noop.yaml
description: IP address on the control plane
default: ''
type: string
FixedIPs:
description: >
Control the IP allocation for the VIP port. E.g.
[{'ip_address':'1.2.3.4'}]
default: []
type: json
IPPool: # Here for compatibility with from_pool.yaml
default: {}
type: json
NodeIndex: # Here for compatibility with from_pool.yaml
default: 0
type: number
resources:
StoragePort:
type: OS::Neutron::Port
properties:
network: {get_param: StorageNetName}
name: {get_param: PortName}
fixed_ips: {get_param: FixedIPs}
replacement_policy: AUTO
outputs:
ip_address:
description: storage network IP
value: {get_attr: [StoragePort, fixed_ips, 0, ip_address]}
ip_address_uri:
description: storage network IP with brackets suitable for a URL
value:
list_join:
- ''
- - '['
- {get_attr: [StoragePort, fixed_ips, 0, ip_address]}
- ']'
ip_subnet:
# FIXME: this assumes a 2 digit subnet CIDR (need more heat functions?)
description: IP/Subnet CIDR for the storage network IP
value:
list_join:
- ''
- - {get_attr: [StoragePort, fixed_ips, 0, ip_address]}
- '/'
- {get_attr: [StoragePort, subnets, 0, cidr, -2]}
- {get_attr: [StoragePort, subnets, 0, cidr, -1]}

View File

@ -43,6 +43,9 @@ outputs:
ip_address: ip_address:
description: tenant network IP description: tenant network IP
value: {get_attr: [TenantPort, fixed_ips, 0, ip_address]} value: {get_attr: [TenantPort, fixed_ips, 0, ip_address]}
ip_address_uri:
description: tenant network IP (for compatibility with tenant_v6.yaml)
value: {get_attr: [TenantPort, fixed_ips, 0, ip_address]}
ip_subnet: ip_subnet:
description: IP/Subnet CIDR for the tenant network IP description: IP/Subnet CIDR for the tenant network IP
value: value:

View File

@ -33,6 +33,9 @@ outputs:
ip_address: ip_address:
description: tenant network IP description: tenant network IP
value: {get_param: [IPPool, {get_param: TenantNetName}, {get_param: NodeIndex}]} value: {get_param: [IPPool, {get_param: TenantNetName}, {get_param: NodeIndex}]}
ip_address_uri:
description: tenant network IP (for compatibility with tenant_v6.yaml)
value: {get_param: [IPPool, {get_param: TenantNetName}, {get_param: NodeIndex}]}
ip_subnet: ip_subnet:
description: IP/Subnet CIDR for the tenant network IP description: IP/Subnet CIDR for the tenant network IP
value: value:

View File

@ -0,0 +1,63 @@
heat_template_version: 2015-04-30
description: >
Creates a port on the tenant network.
parameters:
TenantNetName:
description: Name of the tenant neutron network
default: tenant
type: string
PortName:
description: Name of the port
default: ''
type: string
ControlPlaneIP: # Here for compatability with noop.yaml
description: IP address on the control plane
default: ''
type: string
FixedIPs:
description: >
Control the IP allocation for the VIP port. E.g.
[{'ip_address':'1.2.3.4'}]
default: []
type: json
IPPool: # Here for compatibility with from_pool.yaml
default: {}
type: json
NodeIndex: # Here for compatibility with from_pool.yaml
default: 0
type: number
resources:
TenantPort:
type: OS::Neutron::Port
properties:
network: {get_param: TenantNetName}
name: {get_param: PortName}
fixed_ips: {get_param: FixedIPs}
replacement_policy: AUTO
outputs:
ip_address:
description: tenant network IP
value: {get_attr: [TenantPort, fixed_ips, 0, ip_address]}
ip_address_uri:
description: tenant network IP with brackets suitable for a URL
value:
list_join:
- ''
- - '['
- {get_attr: [TenantPort, fixed_ips, 0, ip_address]}
- ']'
ip_subnet:
# FIXME: this assumes a 2 digit subnet CIDR (need more heat functions?)
description: IP/Subnet CIDR for the tenant network IP
value:
list_join:
- ''
- - {get_attr: [TenantPort, fixed_ips, 0, ip_address]}
- '/'
- {get_attr: [TenantPort, subnets, 0, cidr, -2]}
- {get_attr: [TenantPort, subnets, 0, cidr, -1]}

View File

@ -45,6 +45,9 @@ outputs:
ip_address: ip_address:
description: Virtual IP network IP description: Virtual IP network IP
value: {get_attr: [VipPort, fixed_ips, 0, ip_address]} value: {get_attr: [VipPort, fixed_ips, 0, ip_address]}
ip_address_uri:
description: Virtual IP network IP (for compatibility with vip.yaml)
value: {get_attr: [VipPort, fixed_ips, 0, ip_address]}
ip_subnet: ip_subnet:
description: IP/Subnet CIDR for the network associated with this IP description: IP/Subnet CIDR for the network associated with this IP
value: value:

65
network/ports/vip_v6.yaml Normal file
View File

@ -0,0 +1,65 @@
heat_template_version: 2015-04-30
description: >
Creates a port for a VIP on the isolated network NetworkName.
The IP address will be chosen automatically if FixedIPs is empty.
parameters:
ServiceName: # Here for compatibility with from_service.yaml
description: Name of the service to lookup
default: ''
type: string
NetworkName:
description: Name of the network where the VIP will be created
default: internal_api
type: string
PortName:
description: Name of the port
default: ''
type: string
ControlPlaneIP: # Here for compatability with noop.yaml
description: IP address on the control plane
default: ''
type: string
ControlPlaneNetwork:
description: The name of the undercloud Neutron control plane
default: ctlplane
type: string
FixedIPs:
description: >
Control the IP allocation for the VIP port. E.g.
[{'ip_address':'1.2.3.4'}]
default: []
type: json
resources:
VipPort:
type: OS::Neutron::Port
properties:
network: {get_param: NetworkName}
name: {get_param: PortName}
fixed_ips: {get_param: FixedIPs}
replacement_policy: AUTO
outputs:
ip_address:
description: Virtual IP network IP
value: {get_attr: [VipPort, fixed_ips, 0, ip_address]}
ip_address_uri:
description: Virtual IP with brackets suitable for a URL
value:
list_join:
- ''
- - '['
- {get_attr: [VipPort, fixed_ips, 0, ip_address]}
- ']'
ip_subnet:
# FIXME: this assumes a 2 digit subnet CIDR (need more heat functions?)
description: IP/Subnet CIDR for the network associated with this IP
value:
list_join:
- ''
- - {get_attr: [VipPort, fixed_ips, 0, ip_address]}
- '/'
- {get_attr: [VipPort, subnets, 0, cidr, -2]}
- {get_attr: [VipPort, subnets, 0, cidr, -1]}

View File

@ -0,0 +1,61 @@
heat_template_version: 2015-04-30
description: >
Storage management network. Storage replication, etc.
parameters:
# the defaults here work for static IP assignment (IPAM) only
StorageMgmtNetCidr:
# OpenStack uses the EUI-64 address format, which requires a /64 prefix
default: 'fd00:fd00:fd00:4000::/64'
description: Cidr for the storage management network.
type: string
StorageMgmtNetValueSpecs:
default: {'provider:physical_network': 'storage_mgmt', 'provider:network_type': 'flat'}
description: Value specs for the storage_mgmt network.
type: json
StorageMgmtNetAdminStateUp:
default: false
description: This admin state of of the network.
type: boolean
StorageMgmtNetShared:
default: false
description: Whether this network is shared across all tenants.
type: boolean
StorageMgmtNetName:
default: storage_mgmt
description: The name of the Storage management network.
type: string
StorageMgmtSubnetName:
default: storage_mgmt_subnet
description: The name of the Storage management subnet in Neutron.
type: string
StorageMgmtAllocationPools:
default: [{'start': 'fd00:fd00:fd00:4000::10', 'end': 'fd00:fd00:fd00:4000:ffff:ffff:ffff:fffe'}]
description: Ip allocation pool range for the storage mgmt network.
type: json
resources:
StorageMgmtNetwork:
type: OS::Neutron::Net
properties:
admin_state_up: {get_param: StorageMgmtNetAdminStateUp}
name: {get_param: StorageMgmtNetName}
shared: {get_param: StorageMgmtNetShared}
value_specs: {get_param: StorageMgmtNetValueSpecs}
StorageMgmtSubnet:
type: OS::Neutron::Subnet
properties:
ip_version: 6
ipv6_address_mode: slaac
ipv6_ra_mode: slaac
cidr: {get_param: StorageMgmtNetCidr}
name: {get_param: StorageMgmtSubnetName}
network: {get_resource: StorageMgmtNetwork}
allocation_pools: {get_param: StorageMgmtAllocationPools}
outputs:
OS::stack_id:
description: Neutron storage management network
value: {get_resource: StorageMgmtNetwork}

61
network/storage_v6.yaml Normal file
View File

@ -0,0 +1,61 @@
heat_template_version: 2015-04-30
description: >
Storage network.
parameters:
# the defaults here work for static IP assignment (IPAM) only
StorageNetCidr:
# OpenStack uses the EUI-64 address format, which requires a /64 prefix
default: 'fd00:fd00:fd00:3000::/64'
description: Cidr for the storage network.
type: string
StorageNetValueSpecs:
default: {'provider:physical_network': 'storage', 'provider:network_type': 'flat'}
description: Value specs for the storage network.
type: json
StorageNetAdminStateUp:
default: false
description: This admin state of of the network.
type: boolean
StorageNetShared:
default: false
description: Whether this network is shared across all tenants.
type: boolean
StorageNetName:
default: storage
description: The name of the storage network.
type: string
StorageSubnetName:
default: storage_subnet
description: The name of the storage subnet in Neutron.
type: string
StorageAllocationPools:
default: [{'start': 'fd00:fd00:fd00:3000::10', 'end': 'fd00:fd00:fd00:3000:ffff:ffff:ffff:fffe'}]
description: Ip allocation pool range for the storage network.
type: json
resources:
StorageNetwork:
type: OS::Neutron::Net
properties:
admin_state_up: {get_param: StorageNetAdminStateUp}
name: {get_param: StorageNetName}
shared: {get_param: StorageNetShared}
value_specs: {get_param: StorageNetValueSpecs}
StorageSubnet:
type: OS::Neutron::Subnet
properties:
ip_version: 6
ipv6_address_mode: slaac
ipv6_ra_mode: slaac
cidr: {get_param: StorageNetCidr}
name: {get_param: StorageSubnetName}
network: {get_resource: StorageNetwork}
allocation_pools: {get_param: StorageAllocationPools}
outputs:
OS::stack_id:
description: Neutron storage network
value: {get_resource: StorageNetwork}

61
network/tenant_v6.yaml Normal file
View File

@ -0,0 +1,61 @@
heat_template_version: 2015-04-30
description: >
Tenant IPv6 network.
parameters:
# the defaults here work for static IP assignment (IPAM) only
TenantNetCidr:
# OpenStack uses the EUI-64 address format, which requires a /64 prefix
default: 'fd00:fd00:fd00:5000::/64'
description: Cidr for the tenant network.
type: string
TenantNetValueSpecs:
default: {'provider:physical_network': 'tenant', 'provider:network_type': 'flat'}
description: Value specs for the tenant network.
type: json
TenantNetAdminStateUp:
default: false
description: This admin state of of the network.
type: boolean
TenantNetShared:
default: false
description: Whether this network is shared across all tenants.
type: boolean
TenantNetName:
default: tenant
description: The name of the tenant network.
type: string
TenantSubnetName:
default: tenant_subnet
description: The name of the tenant subnet in Neutron.
type: string
TenantAllocationPools:
default: [{'start': 'fd00:fd00:fd00:5000::10', 'end': 'fd00:fd00:fd00:5000:ffff:ffff:ffff:fffe'}]
description: Ip allocation pool range for the tenant network.
type: json
resources:
TenantNetwork:
type: OS::Neutron::Net
properties:
admin_state_up: {get_param: TenantNetAdminStateUp}
name: {get_param: TenantNetName}
shared: {get_param: TenantNetShared}
value_specs: {get_param: TenantNetValueSpecs}
TenantSubnet:
type: OS::Neutron::Subnet
properties:
ip_version: 6
ipv6_address_mode: slaac
ipv6_ra_mode: slaac
cidr: {get_param: TenantNetCidr}
name: {get_param: TenantSubnetName}
network: {get_resource: TenantNetwork}
allocation_pools: {get_param: TenantAllocationPools}
outputs:
OS::stack_id:
description: Neutron tenant network
value: {get_resource: TenantNetwork}

View File

@ -249,6 +249,10 @@ parameters:
type: number type: number
default: 1 default: 1
description: The number of neutron dhcp agents to schedule per network description: The number of neutron dhcp agents to schedule per network
NovaIPv6:
default: false
description: Enable IPv6 features in Nova
type: boolean
NovaPassword: NovaPassword:
description: The password for the nova service account, used by nova-api. description: The password for the nova service account, used by nova-api.
type: string type: string
@ -261,6 +265,10 @@ parameters:
default: false default: false
description: Should MongoDb journaling be disabled description: Should MongoDb journaling be disabled
type: boolean type: boolean
MongoDbIPv6:
default: false
description: Enable IPv6 if MongoDB VIP is IPv6
type: boolean
PublicVirtualFixedIPs: PublicVirtualFixedIPs:
default: [] default: []
description: > description: >
@ -857,20 +865,20 @@ resources:
type: OS::TripleO::EndpointMap type: OS::TripleO::EndpointMap
properties: properties:
CloudName: {get_param: CloudName} CloudName: {get_param: CloudName}
CeilometerApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, CeilometerApiNetwork]}]} CeilometerApiVirtualIP: {get_attr: [VipMap, net_ip_uri_map, {get_param: [ServiceNetMap, CeilometerApiNetwork]}]}
AodhApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, AodhApiNetwork]}]} AodhApiVirtualIP: {get_attr: [VipMap, net_ip_uri_map, {get_param: [ServiceNetMap, AodhApiNetwork]}]}
CinderApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, CinderApiNetwork]}]} CinderApiVirtualIP: {get_attr: [VipMap, net_ip_uri_map, {get_param: [ServiceNetMap, CinderApiNetwork]}]}
GlanceApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, GlanceApiNetwork]}]} GlanceApiVirtualIP: {get_attr: [VipMap, net_ip_uri_map, {get_param: [ServiceNetMap, GlanceApiNetwork]}]}
GlanceRegistryVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, GlanceRegistryNetwork]}]} GlanceRegistryVirtualIP: {get_attr: [VipMap, net_ip_uri_map, {get_param: [ServiceNetMap, GlanceRegistryNetwork]}]}
HeatApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, HeatApiNetwork]}]} HeatApiVirtualIP: {get_attr: [VipMap, net_ip_uri_map, {get_param: [ServiceNetMap, HeatApiNetwork]}]}
KeystoneAdminApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, KeystoneAdminApiNetwork]}]} KeystoneAdminApiVirtualIP: {get_attr: [VipMap, net_ip_uri_map, {get_param: [ServiceNetMap, KeystoneAdminApiNetwork]}]}
KeystonePublicApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, KeystonePublicApiNetwork]}]} KeystonePublicApiVirtualIP: {get_attr: [VipMap, net_ip_uri_map, {get_param: [ServiceNetMap, KeystonePublicApiNetwork]}]}
MysqlVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, MysqlNetwork]}]} MysqlVirtualIP: {get_attr: [VipMap, net_ip_uri_map, {get_param: [ServiceNetMap, MysqlNetwork]}]}
NeutronApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, NeutronApiNetwork]}]} NeutronApiVirtualIP: {get_attr: [VipMap, net_ip_uri_map, {get_param: [ServiceNetMap, NeutronApiNetwork]}]}
NovaApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, NovaApiNetwork]}]} NovaApiVirtualIP: {get_attr: [VipMap, net_ip_uri_map, {get_param: [ServiceNetMap, NovaApiNetwork]}]}
SaharaApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, SaharaApiNetwork]}]} SaharaApiVirtualIP: {get_attr: [VipMap, net_ip_uri_map, {get_param: [ServiceNetMap, SaharaApiNetwork]}]}
SwiftProxyVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, SwiftProxyNetwork]}]} SwiftProxyVirtualIP: {get_attr: [VipMap, net_ip_uri_map, {get_param: [ServiceNetMap, SwiftProxyNetwork]}]}
PublicVirtualIP: {get_attr: [VipMap, net_ip_map, external]} PublicVirtualIP: {get_attr: [VipMap, net_ip_uri_map, external]}
Controller: Controller:
type: OS::Heat::ResourceGroup type: OS::Heat::ResourceGroup
@ -965,9 +973,11 @@ resources:
NeutronDhcpAgentsPerNetwork: {get_param: NeutronDhcpAgentsPerNetwork} NeutronDhcpAgentsPerNetwork: {get_param: NeutronDhcpAgentsPerNetwork}
NeutronNetworkType: {get_param: NeutronNetworkType} NeutronNetworkType: {get_param: NeutronNetworkType}
NeutronTunnelTypes: {get_param: NeutronTunnelTypes} NeutronTunnelTypes: {get_param: NeutronTunnelTypes}
NovaIPv6: {get_param: NovaIPv6}
NovaPassword: {get_param: NovaPassword} NovaPassword: {get_param: NovaPassword}
NtpServer: {get_param: NtpServer} NtpServer: {get_param: NtpServer}
MongoDbNoJournal: {get_param: MongoDbNoJournal} MongoDbNoJournal: {get_param: MongoDbNoJournal}
MongoDbIPv6: {get_param: MongoDbIPv6}
PcsdPassword: {get_resource: PcsdPassword} PcsdPassword: {get_resource: PcsdPassword}
PublicVirtualInterface: {get_param: PublicVirtualInterface} PublicVirtualInterface: {get_param: PublicVirtualInterface}
RabbitPassword: {get_param: RabbitPassword} RabbitPassword: {get_param: RabbitPassword}
@ -980,6 +990,7 @@ resources:
SnmpdReadonlyUserName: {get_param: SnmpdReadonlyUserName} SnmpdReadonlyUserName: {get_param: SnmpdReadonlyUserName}
SnmpdReadonlyUserPassword: {get_param: SnmpdReadonlyUserPassword} SnmpdReadonlyUserPassword: {get_param: SnmpdReadonlyUserPassword}
RedisVirtualIP: {get_attr: [RedisVirtualIP, ip_address]} RedisVirtualIP: {get_attr: [RedisVirtualIP, ip_address]}
RedisVirtualIPUri: {get_attr: [RedisVirtualIP, ip_address_uri]}
SwiftHashSuffix: {get_param: SwiftHashSuffix} SwiftHashSuffix: {get_param: SwiftHashSuffix}
SwiftMountCheck: {get_param: SwiftMountCheck} SwiftMountCheck: {get_param: SwiftMountCheck}
SwiftMinPartHours: {get_param: SwiftMinPartHours} SwiftMinPartHours: {get_param: SwiftMinPartHours}
@ -995,11 +1006,13 @@ resources:
AodhApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, AodhApiNetwork]}]} AodhApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, AodhApiNetwork]}]}
CinderApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, CinderApiNetwork]}]} CinderApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, CinderApiNetwork]}]}
HeatApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, HeatApiNetwork]}]} HeatApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, HeatApiNetwork]}]}
HeatApiVirtualIPUri: {get_attr: [VipMap, net_ip_uri_map, {get_param: [ServiceNetMap, HeatApiNetwork]}]}
GlanceApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, GlanceApiNetwork]}]} GlanceApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, GlanceApiNetwork]}]}
GlanceRegistryVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, GlanceRegistryNetwork]}]} GlanceRegistryVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, GlanceRegistryNetwork]}]}
NovaApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, NovaApiNetwork]}]} NovaApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, NovaApiNetwork]}]}
SwiftProxyVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, SwiftProxyNetwork]}]} SwiftProxyVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, SwiftProxyNetwork]}]}
MysqlVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, MysqlNetwork]}]} MysqlVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, MysqlNetwork]}]}
MysqlVirtualIPUri: {get_attr: [VipMap, net_ip_uri_map, {get_param: [ServiceNetMap, MysqlNetwork]}]}
KeystoneAdminApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, KeystoneAdminApiNetwork]}]} KeystoneAdminApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, KeystoneAdminApiNetwork]}]}
KeystonePublicApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, KeystonePublicApiNetwork]}]} KeystonePublicApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, KeystonePublicApiNetwork]}]}
NeutronApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, NeutronApiNetwork]}]} NeutronApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, NeutronApiNetwork]}]}
@ -1128,7 +1141,7 @@ resources:
'%stackname%': {get_param: 'OS::stack_name'} '%stackname%': {get_param: 'OS::stack_name'}
ServiceNetMap: {get_param: ServiceNetMap} ServiceNetMap: {get_param: ServiceNetMap}
EndpointMap: {get_attr: [EndpointMap, endpoint_map]} EndpointMap: {get_attr: [EndpointMap, endpoint_map]}
MysqlVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, MysqlNetwork]}]} MysqlVirtualIPUri: {get_attr: [VipMap, net_ip_uri_map, {get_param: [ServiceNetMap, MysqlNetwork]}]}
ExtraConfig: {get_param: ExtraConfig} ExtraConfig: {get_param: ExtraConfig}
BlockStorageExtraConfig: {get_param: BlockStorageExtraConfig} BlockStorageExtraConfig: {get_param: BlockStorageExtraConfig}
CloudDomain: {get_param: CloudDomain} CloudDomain: {get_param: CloudDomain}
@ -1315,9 +1328,13 @@ resources:
properties: properties:
ControlPlaneIp: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]} ControlPlaneIp: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
ExternalIp: {get_attr: [PublicVirtualIP, ip_address]} ExternalIp: {get_attr: [PublicVirtualIP, ip_address]}
ExternalIpUri: {get_attr: [PublicVirtualIP, ip_address_uri]}
InternalApiIp: {get_attr: [InternalApiVirtualIP, ip_address]} InternalApiIp: {get_attr: [InternalApiVirtualIP, ip_address]}
InternalApiIpUri: {get_attr: [InternalApiVirtualIP, ip_address_uri]}
StorageIp: {get_attr: [StorageVirtualIP, ip_address]} StorageIp: {get_attr: [StorageVirtualIP, ip_address]}
StorageIpUri: {get_attr: [StorageVirtualIP, ip_address_uri]}
StorageMgmtIp: {get_attr: [StorageMgmtVirtualIP, ip_address]} StorageMgmtIp: {get_attr: [StorageMgmtVirtualIP, ip_address]}
StorageMgmtIpUri: {get_attr: [StorageMgmtVirtualIP, ip_address_uri]}
# No tenant or management VIP required # No tenant or management VIP required
VipConfig: VipConfig:

View File

@ -177,11 +177,17 @@ resources:
properties: properties:
ControlPlaneIp: {get_attr: [CephStorage, networks, ctlplane, 0]} ControlPlaneIp: {get_attr: [CephStorage, networks, ctlplane, 0]}
ExternalIp: {get_attr: [ExternalPort, ip_address]} ExternalIp: {get_attr: [ExternalPort, ip_address]}
ExternalIpUri: {get_attr: [ExternalPort, ip_address_uri]}
InternalApiIp: {get_attr: [InternalApiPort, ip_address]} InternalApiIp: {get_attr: [InternalApiPort, ip_address]}
InternalApiIpUri: {get_attr: [InternalApiPort, ip_address_uri]}
StorageIp: {get_attr: [StoragePort, ip_address]} StorageIp: {get_attr: [StoragePort, ip_address]}
StorageIpUri: {get_attr: [StoragePort, ip_address_uri]}
StorageMgmtIp: {get_attr: [StorageMgmtPort, ip_address]} StorageMgmtIp: {get_attr: [StorageMgmtPort, ip_address]}
StorageMgmtIpUri: {get_attr: [StorageMgmtPort, ip_address_uri]}
TenantIp: {get_attr: [TenantPort, ip_address]} TenantIp: {get_attr: [TenantPort, ip_address]}
TenantIpUri: {get_attr: [TenantPort, ip_address_uri]}
ManagementIp: {get_attr: [ManagementPort, ip_address]} ManagementIp: {get_attr: [ManagementPort, ip_address]}
ManagementIpUri: {get_attr: [ManagementPort, ip_address_uri]}
NetIpSubnetMap: NetIpSubnetMap:
type: OS::TripleO::Network::Ports::NetIpSubnetMap type: OS::TripleO::Network::Ports::NetIpSubnetMap

View File

@ -110,7 +110,7 @@ parameters:
GlanceApiVirtualIP: GlanceApiVirtualIP:
type: string type: string
default: '' default: ''
MysqlVirtualIP: MysqlVirtualIPUri:
type: string type: string
default: '' default: ''
NetworkDeploymentActions: NetworkDeploymentActions:
@ -229,11 +229,17 @@ resources:
properties: properties:
ControlPlaneIp: {get_attr: [BlockStorage, networks, ctlplane, 0]} ControlPlaneIp: {get_attr: [BlockStorage, networks, ctlplane, 0]}
ExternalIp: {get_attr: [ExternalPort, ip_address]} ExternalIp: {get_attr: [ExternalPort, ip_address]}
ExternalIpUri: {get_attr: [ExternalPort, ip_address_uri]}
InternalApiIp: {get_attr: [InternalApiPort, ip_address]} InternalApiIp: {get_attr: [InternalApiPort, ip_address]}
InternalApiIpUri: {get_attr: [InternalApiPort, ip_address_uri]}
StorageIp: {get_attr: [StoragePort, ip_address]} StorageIp: {get_attr: [StoragePort, ip_address]}
StorageIpUri: {get_attr: [StoragePort, ip_address_uri]}
StorageMgmtIp: {get_attr: [StorageMgmtPort, ip_address]} StorageMgmtIp: {get_attr: [StorageMgmtPort, ip_address]}
StorageMgmtIpUri: {get_attr: [StorageMgmtPort, ip_address_uri]}
TenantIp: {get_attr: [TenantPort, ip_address]} TenantIp: {get_attr: [TenantPort, ip_address]}
TenantIpUri: {get_attr: [TenantPort, ip_address_uri]}
ManagementIp: {get_attr: [ManagementPort, ip_address]} ManagementIp: {get_attr: [ManagementPort, ip_address]}
ManagementIpUri: {get_attr: [ManagementPort, ip_address_uri]}
NetworkDeployment: NetworkDeployment:
type: OS::TripleO::SoftwareDeployment type: OS::TripleO::SoftwareDeployment
@ -252,7 +258,7 @@ resources:
config: {get_resource: BlockStorageConfig} config: {get_resource: BlockStorageConfig}
input_values: input_values:
debug: {get_param: Debug} debug: {get_param: Debug}
cinder_dsn: {list_join: ['', ['mysql+pymysql://cinder:', {get_param: CinderPassword}, '@', {get_param: MysqlVirtualIP} , '/cinder']]} cinder_dsn: {list_join: ['', ['mysql+pymysql://cinder:', {get_param: CinderPassword}, '@', {get_param: MysqlVirtualIPUri} , '/cinder']]}
snmpd_readonly_user_name: {get_param: SnmpdReadonlyUserName} snmpd_readonly_user_name: {get_param: SnmpdReadonlyUserName}
snmpd_readonly_user_password: {get_param: SnmpdReadonlyUserPassword} snmpd_readonly_user_password: {get_param: SnmpdReadonlyUserPassword}
cinder_lvm_loop_device_size: cinder_lvm_loop_device_size:

View File

@ -409,11 +409,17 @@ resources:
properties: properties:
ControlPlaneIp: {get_attr: [NovaCompute, networks, ctlplane, 0]} ControlPlaneIp: {get_attr: [NovaCompute, networks, ctlplane, 0]}
ExternalIp: {get_attr: [ExternalPort, ip_address]} ExternalIp: {get_attr: [ExternalPort, ip_address]}
ExternalIpUri: {get_attr: [ExternalPort, ip_address_uri]}
InternalApiIp: {get_attr: [InternalApiPort, ip_address]} InternalApiIp: {get_attr: [InternalApiPort, ip_address]}
InternalApiIpUri: {get_attr: [InternalApiPort, ip_address_uri]}
StorageIp: {get_attr: [StoragePort, ip_address]} StorageIp: {get_attr: [StoragePort, ip_address]}
StorageIpUri: {get_attr: [StoragePort, ip_address_uri]}
StorageMgmtIp: {get_attr: [StorageMgmtPort, ip_address]} StorageMgmtIp: {get_attr: [StorageMgmtPort, ip_address]}
StorageMgmtIpUri: {get_attr: [StorageMgmtPort, ip_address_uri]}
TenantIp: {get_attr: [TenantPort, ip_address]} TenantIp: {get_attr: [TenantPort, ip_address]}
TenantIpUri: {get_attr: [TenantPort, ip_address_uri]}
ManagementIp: {get_attr: [ManagementPort, ip_address]} ManagementIp: {get_attr: [ManagementPort, ip_address]}
ManagementIpUri: {get_attr: [ManagementPort, ip_address_uri]}
NetworkConfig: NetworkConfig:
type: OS::TripleO::Compute::Net::SoftwareConfig type: OS::TripleO::Compute::Net::SoftwareConfig

View File

@ -553,6 +553,10 @@ parameters:
description: | description: |
Whether to create cron job for purging soft deleted rows in Nova database. Whether to create cron job for purging soft deleted rows in Nova database.
type: boolean type: boolean
NovaIPv6:
default: false
description: Enable IPv6 features in Nova
type: boolean
NovaPassword: NovaPassword:
description: The password for the nova service and db account, used by nova-api. description: The password for the nova service and db account, used by nova-api.
type: string type: string
@ -565,6 +569,10 @@ parameters:
default: false default: false
description: Should MongoDb journaling be disabled description: Should MongoDb journaling be disabled
type: boolean type: boolean
MongoDbIPv6:
default: false
description: Enable IPv6 if Mongo DB VIP is IPv6
type: boolean
NtpServer: NtpServer:
default: '' default: ''
description: Comma-separated list of ntp servers description: Comma-separated list of ntp servers
@ -612,6 +620,10 @@ parameters:
RedisVirtualIP: RedisVirtualIP:
type: string type: string
default: '' # Has to be here because of the ignored empty value bug default: '' # Has to be here because of the ignored empty value bug
RedisVirtualIPUri:
type: string
default: '' # Has to be here because of the ignored empty value bug
description: An IP address which is wrapped in brackets in case of IPv6
SnmpdReadonlyUserName: SnmpdReadonlyUserName:
default: ro_snmp_user default: ro_snmp_user
description: The user name for SNMPd with readonly rights running on all Overcloud nodes description: The user name for SNMPd with readonly rights running on all Overcloud nodes
@ -667,6 +679,9 @@ parameters:
HeatApiVirtualIP: HeatApiVirtualIP:
type: string type: string
default: '' default: ''
HeatApiVirtualIPUri:
type: string
default: ''
GlanceApiVirtualIP: GlanceApiVirtualIP:
type: string type: string
default: '' default: ''
@ -676,6 +691,9 @@ parameters:
MysqlVirtualIP: MysqlVirtualIP:
type: string type: string
default: '' default: ''
MysqlVirtualIPUri:
type: string
default: ''
KeystoneAdminApiVirtualIP: KeystoneAdminApiVirtualIP:
type: string type: string
default: '' default: ''
@ -832,11 +850,17 @@ resources:
properties: properties:
ControlPlaneIp: {get_attr: [Controller, networks, ctlplane, 0]} ControlPlaneIp: {get_attr: [Controller, networks, ctlplane, 0]}
ExternalIp: {get_attr: [ExternalPort, ip_address]} ExternalIp: {get_attr: [ExternalPort, ip_address]}
ExternalIpUri: {get_attr: [ExternalPort, ip_address_uri]}
InternalApiIp: {get_attr: [InternalApiPort, ip_address]} InternalApiIp: {get_attr: [InternalApiPort, ip_address]}
InternalApiIpUri: {get_attr: [InternalApiPort, ip_address_uri]}
StorageIp: {get_attr: [StoragePort, ip_address]} StorageIp: {get_attr: [StoragePort, ip_address]}
StorageIpUri: {get_attr: [StoragePort, ip_address_uri]}
StorageMgmtIp: {get_attr: [StorageMgmtPort, ip_address]} StorageMgmtIp: {get_attr: [StorageMgmtPort, ip_address]}
StorageMgmtIpUri: {get_attr: [StorageMgmtPort, ip_address_uri]}
TenantIp: {get_attr: [TenantPort, ip_address]} TenantIp: {get_attr: [TenantPort, ip_address]}
TenantIpUri: {get_attr: [TenantPort, ip_address_uri]}
ManagementIp: {get_attr: [ManagementPort, ip_address]} ManagementIp: {get_attr: [ManagementPort, ip_address]}
ManagementIpUri: {get_attr: [ManagementPort, ip_address_uri]}
NetIpSubnetMap: NetIpSubnetMap:
type: OS::TripleO::Network::Ports::NetIpSubnetMap type: OS::TripleO::Network::Ports::NetIpSubnetMap
@ -912,19 +936,19 @@ resources:
list_join: list_join:
- '' - ''
- - 'http://' - - 'http://'
- {get_param: HeatApiVirtualIP} - {get_param: HeatApiVirtualIPUri}
- ':8003' - ':8003'
heat.metadata_server_url: heat.metadata_server_url:
list_join: list_join:
- '' - ''
- - 'http://' - - 'http://'
- {get_param: HeatApiVirtualIP} - {get_param: HeatApiVirtualIPUri}
- ':8000' - ':8000'
heat.waitcondition_server_url: heat.waitcondition_server_url:
list_join: list_join:
- '' - ''
- - 'http://' - - 'http://'
- {get_param: HeatApiVirtualIP} - {get_param: HeatApiVirtualIPUri}
- ':8000/v1/waitcondition' - ':8000/v1/waitcondition'
heat_auth_encryption_key: {get_param: HeatAuthEncryptionKey} heat_auth_encryption_key: {get_param: HeatAuthEncryptionKey}
heat_enable_db_purge: {get_param: HeatEnableDBPurge} heat_enable_db_purge: {get_param: HeatEnableDBPurge}
@ -955,7 +979,7 @@ resources:
- - 'mysql+pymysql://cinder:' - - 'mysql+pymysql://cinder:'
- {get_param: CinderPassword} - {get_param: CinderPassword}
- '@' - '@'
- {get_param: MysqlVirtualIP} - {get_param: MysqlVirtualIPUri}
- '/cinder' - '/cinder'
glance_port: {get_param: [EndpointMap, GlanceInternal, port]} glance_port: {get_param: [EndpointMap, GlanceInternal, port]}
glance_password: {get_param: GlancePassword} glance_password: {get_param: GlancePassword}
@ -972,7 +996,7 @@ resources:
- - 'mysql+pymysql://glance:' - - 'mysql+pymysql://glance:'
- {get_param: GlancePassword} - {get_param: GlancePassword}
- '@' - '@'
- {get_param: MysqlVirtualIP} - {get_param: MysqlVirtualIPUri}
- '/glance' - '/glance'
heat_password: {get_param: HeatPassword} heat_password: {get_param: HeatPassword}
heat_stack_domain_admin_password: {get_param: HeatStackDomainAdminPassword} heat_stack_domain_admin_password: {get_param: HeatStackDomainAdminPassword}
@ -982,7 +1006,7 @@ resources:
- - 'mysql+pymysql://heat:' - - 'mysql+pymysql://heat:'
- {get_param: HeatPassword} - {get_param: HeatPassword}
- '@' - '@'
- {get_param: MysqlVirtualIP} - {get_param: MysqlVirtualIPUri}
- '/heat' - '/heat'
keystone_ca_certificate: {get_param: KeystoneCACertificate} keystone_ca_certificate: {get_param: KeystoneCACertificate}
keystone_signing_key: {get_param: KeystoneSigningKey} keystone_signing_key: {get_param: KeystoneSigningKey}
@ -998,7 +1022,7 @@ resources:
- - 'mysql+pymysql://keystone:' - - 'mysql+pymysql://keystone:'
- {get_param: AdminToken} - {get_param: AdminToken}
- '@' - '@'
- {get_param: MysqlVirtualIP} - {get_param: MysqlVirtualIPUri}
- '/keystone' - '/keystone'
keystone_identity_uri: { get_param: [EndpointMap, KeystoneAdmin, uri_no_suffix] } keystone_identity_uri: { get_param: [EndpointMap, KeystoneAdmin, uri_no_suffix] }
keystone_auth_uri: {get_param: [EndpointMap, KeystoneInternal, uri] } keystone_auth_uri: {get_param: [EndpointMap, KeystoneInternal, uri] }
@ -1105,7 +1129,7 @@ resources:
- - 'mysql+pymysql://neutron:' - - 'mysql+pymysql://neutron:'
- {get_param: NeutronPassword} - {get_param: NeutronPassword}
- '@' - '@'
- {get_param: MysqlVirtualIP} - {get_param: MysqlVirtualIPUri}
- '/ovs_neutron?charset=utf8' - '/ovs_neutron?charset=utf8'
neutron_internal_url: { get_param: [ EndpointMap, NeutronInternal, uri ] } neutron_internal_url: { get_param: [ EndpointMap, NeutronInternal, uri ] }
neutron_public_url: { get_param: [ EndpointMap, NeutronPublic, uri ] } neutron_public_url: { get_param: [ EndpointMap, NeutronPublic, uri ] }
@ -1120,7 +1144,7 @@ resources:
list_join: list_join:
- '' - ''
- - 'redis://' - - 'redis://'
- {get_param: RedisVirtualIP} - {get_param: RedisVirtualIPUri}
- ':6379' - ':6379'
ceilometer_dsn: ceilometer_dsn:
list_join: list_join:
@ -1128,11 +1152,12 @@ resources:
- - 'mysql+pymysql://ceilometer:' - - 'mysql+pymysql://ceilometer:'
- {get_param: CeilometerPassword} - {get_param: CeilometerPassword}
- '@' - '@'
- {get_param: MysqlVirtualIP} - {get_param: MysqlVirtualIPUri}
- '/ceilometer' - '/ceilometer'
snmpd_readonly_user_name: {get_param: SnmpdReadonlyUserName} snmpd_readonly_user_name: {get_param: SnmpdReadonlyUserName}
snmpd_readonly_user_password: {get_param: SnmpdReadonlyUserPassword} snmpd_readonly_user_password: {get_param: SnmpdReadonlyUserPassword}
nova_enable_db_purge: {get_param: NovaEnableDBPurge} nova_enable_db_purge: {get_param: NovaEnableDBPurge}
nova_ipv6: {get_param: NovaIPv6}
nova_password: {get_param: NovaPassword} nova_password: {get_param: NovaPassword}
nova_dsn: nova_dsn:
list_join: list_join:
@ -1140,7 +1165,7 @@ resources:
- - 'mysql+pymysql://nova:' - - 'mysql+pymysql://nova:'
- {get_param: NovaPassword} - {get_param: NovaPassword}
- '@' - '@'
- {get_param: MysqlVirtualIP} - {get_param: MysqlVirtualIPUri}
- '/nova' - '/nova'
nova_api_dsn: nova_api_dsn:
list_join: list_join:
@ -1160,6 +1185,7 @@ resources:
rabbit_client_use_ssl: {get_param: RabbitClientUseSSL} rabbit_client_use_ssl: {get_param: RabbitClientUseSSL}
rabbit_client_port: {get_param: RabbitClientPort} rabbit_client_port: {get_param: RabbitClientPort}
mongodb_no_journal: {get_param: MongoDbNoJournal} mongodb_no_journal: {get_param: MongoDbNoJournal}
mongodb_ipv6: {get_param: MongoDbIPv6}
# We need to force this into quotes or hiera will return integer causing # We need to force this into quotes or hiera will return integer causing
# the puppet module validation regexp to fail. # the puppet module validation regexp to fail.
# Remove when: https://github.com/puppetlabs/puppetlabs-rabbitmq/pull/401 # Remove when: https://github.com/puppetlabs/puppetlabs-rabbitmq/pull/401
@ -1412,6 +1438,7 @@ resources:
# MongoDB # MongoDB
mongodb::server::bind_ip: {get_input: mongo_db_network} mongodb::server::bind_ip: {get_input: mongo_db_network}
mongodb::server::nojournal: {get_input: mongodb_no_journal} mongodb::server::nojournal: {get_input: mongodb_no_journal}
mongodb::server::ipv6: {get_input: mongodb_ipv6}
# MySQL # MySQL
admin_password: {get_input: admin_password} admin_password: {get_input: admin_password}
enable_galera: {get_input: enable_galera} enable_galera: {get_input: enable_galera}
@ -1532,6 +1559,7 @@ resources:
nova::rabbit_port: {get_input: rabbit_client_port} nova::rabbit_port: {get_input: rabbit_client_port}
nova::upgrade_level_compute: {get_input: upgrade_level_nova_compute} nova::upgrade_level_compute: {get_input: upgrade_level_nova_compute}
nova::debug: {get_input: debug} nova::debug: {get_input: debug}
nova::use_ipv6: {get_input: nova_ipv6}
nova::api::auth_uri: {get_input: keystone_auth_uri} nova::api::auth_uri: {get_input: keystone_auth_uri}
nova::api::identity_uri: {get_input: keystone_identity_uri} nova::api::identity_uri: {get_input: keystone_identity_uri}
nova::api::api_bind_address: {get_input: nova_api_network} nova::api::api_bind_address: {get_input: nova_api_network}

View File

@ -198,11 +198,17 @@ resources:
properties: properties:
ControlPlaneIp: {get_attr: [SwiftStorage, networks, ctlplane, 0]} ControlPlaneIp: {get_attr: [SwiftStorage, networks, ctlplane, 0]}
ExternalIp: {get_attr: [ExternalPort, ip_address]} ExternalIp: {get_attr: [ExternalPort, ip_address]}
ExternalIpUri: {get_attr: [ExternalPort, ip_address_uri]}
InternalApiIp: {get_attr: [InternalApiPort, ip_address]} InternalApiIp: {get_attr: [InternalApiPort, ip_address]}
InternalApiIpUri: {get_attr: [InternalApiPort, ip_address_uri]}
StorageIp: {get_attr: [StoragePort, ip_address]} StorageIp: {get_attr: [StoragePort, ip_address]}
StorageIpUri: {get_attr: [StoragePort, ip_address_uri]}
StorageMgmtIp: {get_attr: [StorageMgmtPort, ip_address]} StorageMgmtIp: {get_attr: [StorageMgmtPort, ip_address]}
StorageMgmtIpUri: {get_attr: [StorageMgmtPort, ip_address_uri]}
TenantIp: {get_attr: [TenantPort, ip_address]} TenantIp: {get_attr: [TenantPort, ip_address]}
TenantIpUri: {get_attr: [TenantPort, ip_address_uri]}
ManagementIp: {get_attr: [ManagementPort, ip_address]} ManagementIp: {get_attr: [ManagementPort, ip_address]}
ManagementIpUri: {get_attr: [ManagementPort, ip_address_uri]}
NetworkDeployment: NetworkDeployment:
type: OS::TripleO::SoftwareDeployment type: OS::TripleO::SoftwareDeployment