Add IPv6 Support to Isolated Networks
authorDan Sneddon <dsneddon@redhat.com>
Thu, 15 Oct 2015 15:10:44 +0000 (08:10 -0700)
committerGiulio Fidente <gfidente@redhat.com>
Fri, 4 Mar 2016 13:34:59 +0000 (14:34 +0100)
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

39 files changed:
environments/network-isolation-v6.yaml [new file with mode: 0644]
network/endpoints/build_endpoint_map.py
network/endpoints/endpoint_map.yaml
network/external_v6.yaml [new file with mode: 0644]
network/internal_api_v6.yaml [new file with mode: 0644]
network/ports/ctlplane_vip.yaml
network/ports/external.yaml
network/ports/external_from_pool.yaml
network/ports/external_v6.yaml [new file with mode: 0644]
network/ports/from_service.yaml
network/ports/internal_api.yaml
network/ports/internal_api_from_pool.yaml
network/ports/internal_api_v6.yaml [new file with mode: 0644]
network/ports/management.yaml
network/ports/management_from_pool.yaml
network/ports/management_v6.yaml [new file with mode: 0644]
network/ports/net_ip_map.yaml
network/ports/net_vip_map_external.yaml
network/ports/noop.yaml
network/ports/storage.yaml
network/ports/storage_from_pool.yaml
network/ports/storage_mgmt.yaml
network/ports/storage_mgmt_from_pool.yaml
network/ports/storage_mgmt_v6.yaml [new file with mode: 0644]
network/ports/storage_v6.yaml [new file with mode: 0644]
network/ports/tenant.yaml
network/ports/tenant_from_pool.yaml
network/ports/tenant_v6.yaml [new file with mode: 0644]
network/ports/vip.yaml
network/ports/vip_v6.yaml [new file with mode: 0644]
network/storage_mgmt_v6.yaml [new file with mode: 0644]
network/storage_v6.yaml [new file with mode: 0644]
network/tenant_v6.yaml [new file with mode: 0644]
overcloud.yaml
puppet/ceph-storage.yaml
puppet/cinder-storage.yaml
puppet/compute.yaml
puppet/controller.yaml
puppet/swift-storage.yaml

diff --git a/environments/network-isolation-v6.yaml b/environments/network-isolation-v6.yaml
new file mode 100644 (file)
index 0000000..8a3d806
--- /dev/null
@@ -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
index 056d688..d8cdee3 100755 (executable)
@@ -173,7 +173,10 @@ def template_endpoint_items(config):
 def generate_endpoint_map_template(config):
     return collections.OrderedDict([
         ('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)),
         ('outputs', {
             'endpoint_map': {
index bb0413a..0382533 100644 (file)
@@ -3,7 +3,10 @@
 ### by the script build_endpoint_map.py
 
 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:
   AodhApiVirtualIP: {type: string, default: ''}
   CeilometerApiVirtualIP: {type: string, default: ''}
diff --git a/network/external_v6.yaml b/network/external_v6.yaml
new file mode 100644 (file)
index 0000000..cfbe94c
--- /dev/null
@@ -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}
diff --git a/network/internal_api_v6.yaml b/network/internal_api_v6.yaml
new file mode 100644 (file)
index 0000000..9f5c68b
--- /dev/null
@@ -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}
index 1d8b291..5ac7d34 100644 (file)
@@ -45,6 +45,9 @@ outputs:
   ip_address:
     description: Virtual IP network IP
     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:
     description: IP/Subnet CIDR for the ctlplane network.
     value:
index df12cc8..c4f815f 100644 (file)
@@ -48,6 +48,9 @@ outputs:
   ip_address:
     description: external network IP
     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:
     description: IP/Subnet CIDR for the external network IP
     value:
index 5e61683..98f2aa3 100644 (file)
@@ -33,6 +33,9 @@ outputs:
   ip_address:
     description: external network IP
     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:
     description: IP/Subnet CIDR for the external network IP
     value:
diff --git a/network/ports/external_v6.yaml b/network/ports/external_v6.yaml
new file mode 100644 (file)
index 0000000..522caaa
--- /dev/null
@@ -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]}
index 6b669f4..359d77a 100644 (file)
@@ -32,3 +32,6 @@ outputs:
   ip_address:
     description: network IP
     value: {get_param: [ServiceVips, {get_param: ServiceName}]}
+  ip_address_uri:
+    description: network IP (for compatibility with IPv6)
+    value: {get_param: [ServiceVips, {get_param: ServiceName}]}
index 4039f9d..1d521a8 100644 (file)
@@ -43,6 +43,10 @@ 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 (for compatibility with internal_api_v6.yaml)
+    value: {get_attr: [InternalApiPort, fixed_ips, 0, ip_address]}
   ip_subnet:
     description: IP/Subnet CIDR for the internal API network IP
     value:
index 18ccd2b..c7b0484 100644 (file)
@@ -33,6 +33,9 @@ outputs:
   ip_address:
     description: internal API network IP
     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:
     description: IP/Subnet CIDR for the internal API network IP
     value:
diff --git a/network/ports/internal_api_v6.yaml b/network/ports/internal_api_v6.yaml
new file mode 100644 (file)
index 0000000..279e6bd
--- /dev/null
@@ -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]}
index 8ad2eb4..967b66e 100644 (file)
@@ -36,6 +36,9 @@ outputs:
   ip_address:
     description: management network IP
     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:
     description: IP/Subnet CIDR for the management network IP
     value:
index bbd62f5..fc87e39 100644 (file)
@@ -33,6 +33,9 @@ outputs:
   ip_address:
     description: management network IP
     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:
     description: IP/Subnet CIDR for the management network IP
     value:
diff --git a/network/ports/management_v6.yaml b/network/ports/management_v6.yaml
new file mode 100644 (file)
index 0000000..a94ebc7
--- /dev/null
@@ -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]}
index c638602..6bb4557 100644 (file)
@@ -7,21 +7,45 @@ parameters:
   ExternalIp:
     default: ''
     type: string
+  ExternalIpUri:
+    default: ''
+    type: string
+    description: IP address with brackets in case of IPv6
   InternalApiIp:
     default: ''
     type: string
+  InternalApiIpUri:
+    default: ''
+    type: string
+    description: IP address with brackets in case of IPv6
   StorageIp:
     default: ''
     type: string
+  StorageIpUri:
+    default: ''
+    type: string
+    description: IP address with brackets in case of IPv6
   StorageMgmtIp:
     default: ''
     type: string
+  StorageMgmtIpUri:
+    default: ''
+    type: string
+    description: IP address with brackets in case of IPv6
   TenantIp:
     default: ''
     type: string
+  TenantIpUri:
+    default: ''
+    type: string
+    description: IP address with brackets in case of IPv6
   ManagementIp:
     default: ''
     type: string
+  ManagementIpUri:
+    default: ''
+    type: string
+    description: IP address with brackets in case of IPv6
 
 outputs:
   net_ip_map:
@@ -36,3 +60,15 @@ outputs:
       storage_mgmt: {get_param: StorageMgmtIp}
       tenant: {get_param: TenantIp}
       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}
index 23e1f99..a40a0bf 100644 (file)
@@ -24,18 +24,33 @@ parameters:
   ExternalIp:
     default: ''
     type: string
+  ExternalIpUri:
+    default: ''
+    type: string
   InternalApiIp:
     default: ''
     type: string
+  InternalApiIpUri:
+    default: ''
+    type: string
   StorageIp:
     default: ''
     type: string
+  StorageIpUri:
+    default: ''
+    type: string
   StorageMgmtIp:
     default: ''
     type: string
+  StorageMgmtIpUri:
+    default: ''
+    type: string
   TenantIp:
     default: ''
     type: string
+  TenantIpUri:
+    default: ''
+    type: string
 
 outputs:
   net_ip_map:
@@ -48,3 +63,13 @@ outputs:
       internal_api: {get_param: InternalApiNetworkVip}
       storage: {get_param: StorageNetworkVip}
       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}
index ac946cd..96c461e 100644 (file)
@@ -44,6 +44,9 @@ outputs:
   ip_address:
     description: pass thru network IP
     value: {get_param: ControlPlaneIP}
+  ip_address_uri:
+    description: pass thru network IP (for compatibility with vip_v6.yaml)
+    value: {get_param: ControlPlaneIP}
   ip_subnet:
     description: IP/Subnet CIDR for the pass thru network IP
     value:
index 579554f..1ed5cca 100644 (file)
@@ -43,6 +43,9 @@ outputs:
   ip_address:
     description: storage network IP
     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:
     description: IP/Subnet CIDR for the storage network IP
     value:
index 13c16c1..dfc9e75 100644 (file)
@@ -33,6 +33,9 @@ outputs:
   ip_address:
     description: storage network IP
     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:
     description: IP/Subnet CIDR for the storage network IP
     value:
index f97e337..548d226 100644 (file)
@@ -43,6 +43,10 @@ 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 (for compatibility with storage_mgmt_v6.yaml)
+    value: {get_attr: [StorageMgmtPort, fixed_ips, 0, ip_address]}
   ip_subnet:
     description: IP/Subnet CIDR for the storage_mgmt network IP
     value:
index 7c033eb..9c757a6 100644 (file)
@@ -33,6 +33,9 @@ outputs:
   ip_address:
     description: storage MGMT network IP
     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:
     description: IP/Subnet CIDR for the storage MGMT network IP
     value:
diff --git a/network/ports/storage_mgmt_v6.yaml b/network/ports/storage_mgmt_v6.yaml
new file mode 100644 (file)
index 0000000..61956be
--- /dev/null
@@ -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]}
diff --git a/network/ports/storage_v6.yaml b/network/ports/storage_v6.yaml
new file mode 100644 (file)
index 0000000..13b6227
--- /dev/null
@@ -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]}
index cc0771e..d8f78c4 100644 (file)
@@ -43,6 +43,9 @@ outputs:
   ip_address:
     description: tenant network IP
     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:
     description: IP/Subnet CIDR for the tenant network IP
     value:
index 17e4ac8..d5f3156 100644 (file)
@@ -33,6 +33,9 @@ outputs:
   ip_address:
     description: tenant network IP
     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:
     description: IP/Subnet CIDR for the tenant network IP
     value:
diff --git a/network/ports/tenant_v6.yaml b/network/ports/tenant_v6.yaml
new file mode 100644 (file)
index 0000000..6ca3754
--- /dev/null
@@ -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]}
index fb25199..3832290 100644 (file)
@@ -45,6 +45,9 @@ outputs:
   ip_address:
     description: Virtual IP network IP
     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:
     description: IP/Subnet CIDR for the network associated with this IP
     value:
diff --git a/network/ports/vip_v6.yaml b/network/ports/vip_v6.yaml
new file mode 100644 (file)
index 0000000..de92709
--- /dev/null
@@ -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]}
diff --git a/network/storage_mgmt_v6.yaml b/network/storage_mgmt_v6.yaml
new file mode 100644 (file)
index 0000000..cde7865
--- /dev/null
@@ -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}
diff --git a/network/storage_v6.yaml b/network/storage_v6.yaml
new file mode 100644 (file)
index 0000000..4ea7341
--- /dev/null
@@ -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}
diff --git a/network/tenant_v6.yaml b/network/tenant_v6.yaml
new file mode 100644 (file)
index 0000000..b20c952
--- /dev/null
@@ -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}
index d6048de..c91d2e1 100644 (file)
@@ -249,6 +249,10 @@ parameters:
     type: number
     default: 1
     description: The number of neutron dhcp agents to schedule per network
+  NovaIPv6:
+    default: false
+    description: Enable IPv6 features in Nova
+    type: boolean
   NovaPassword:
     description: The password for the nova service account, used by nova-api.
     type: string
@@ -261,6 +265,10 @@ parameters:
     default: false
     description: Should MongoDb journaling be disabled
     type: boolean
+  MongoDbIPv6:
+    default: false
+    description: Enable IPv6 if MongoDB VIP is IPv6
+    type: boolean
   PublicVirtualFixedIPs:
     default: []
     description: >
@@ -857,20 +865,20 @@ resources:
     type: OS::TripleO::EndpointMap
     properties:
       CloudName: {get_param: CloudName}
-      CeilometerApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, CeilometerApiNetwork]}]}
-      AodhApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, AodhApiNetwork]}]}
-      CinderApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, CinderApiNetwork]}]}
-      GlanceApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, GlanceApiNetwork]}]}
-      GlanceRegistryVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, GlanceRegistryNetwork]}]}
-      HeatApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, HeatApiNetwork]}]}
-      KeystoneAdminApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, KeystoneAdminApiNetwork]}]}
-      KeystonePublicApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, KeystonePublicApiNetwork]}]}
-      MysqlVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, MysqlNetwork]}]}
-      NeutronApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, NeutronApiNetwork]}]}
-      NovaApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, NovaApiNetwork]}]}
-      SaharaApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, SaharaApiNetwork]}]}
-      SwiftProxyVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, SwiftProxyNetwork]}]}
-      PublicVirtualIP: {get_attr: [VipMap, net_ip_map, external]}
+      CeilometerApiVirtualIP: {get_attr: [VipMap, net_ip_uri_map, {get_param: [ServiceNetMap, CeilometerApiNetwork]}]}
+      AodhApiVirtualIP: {get_attr: [VipMap, net_ip_uri_map, {get_param: [ServiceNetMap, AodhApiNetwork]}]}
+      CinderApiVirtualIP: {get_attr: [VipMap, net_ip_uri_map, {get_param: [ServiceNetMap, CinderApiNetwork]}]}
+      GlanceApiVirtualIP: {get_attr: [VipMap, net_ip_uri_map, {get_param: [ServiceNetMap, GlanceApiNetwork]}]}
+      GlanceRegistryVirtualIP: {get_attr: [VipMap, net_ip_uri_map, {get_param: [ServiceNetMap, GlanceRegistryNetwork]}]}
+      HeatApiVirtualIP: {get_attr: [VipMap, net_ip_uri_map, {get_param: [ServiceNetMap, HeatApiNetwork]}]}
+      KeystoneAdminApiVirtualIP: {get_attr: [VipMap, net_ip_uri_map, {get_param: [ServiceNetMap, KeystoneAdminApiNetwork]}]}
+      KeystonePublicApiVirtualIP: {get_attr: [VipMap, net_ip_uri_map, {get_param: [ServiceNetMap, KeystonePublicApiNetwork]}]}
+      MysqlVirtualIP: {get_attr: [VipMap, net_ip_uri_map, {get_param: [ServiceNetMap, MysqlNetwork]}]}
+      NeutronApiVirtualIP: {get_attr: [VipMap, net_ip_uri_map, {get_param: [ServiceNetMap, NeutronApiNetwork]}]}
+      NovaApiVirtualIP: {get_attr: [VipMap, net_ip_uri_map, {get_param: [ServiceNetMap, NovaApiNetwork]}]}
+      SaharaApiVirtualIP: {get_attr: [VipMap, net_ip_uri_map, {get_param: [ServiceNetMap, SaharaApiNetwork]}]}
+      SwiftProxyVirtualIP: {get_attr: [VipMap, net_ip_uri_map, {get_param: [ServiceNetMap, SwiftProxyNetwork]}]}
+      PublicVirtualIP: {get_attr: [VipMap, net_ip_uri_map, external]}
 
   Controller:
     type: OS::Heat::ResourceGroup
@@ -965,9 +973,11 @@ resources:
           NeutronDhcpAgentsPerNetwork: {get_param: NeutronDhcpAgentsPerNetwork}
           NeutronNetworkType: {get_param: NeutronNetworkType}
           NeutronTunnelTypes: {get_param: NeutronTunnelTypes}
+          NovaIPv6: {get_param: NovaIPv6}
           NovaPassword: {get_param: NovaPassword}
           NtpServer: {get_param: NtpServer}
           MongoDbNoJournal: {get_param: MongoDbNoJournal}
+          MongoDbIPv6: {get_param: MongoDbIPv6}
           PcsdPassword: {get_resource: PcsdPassword}
           PublicVirtualInterface: {get_param: PublicVirtualInterface}
           RabbitPassword: {get_param: RabbitPassword}
@@ -980,6 +990,7 @@ resources:
           SnmpdReadonlyUserName: {get_param: SnmpdReadonlyUserName}
           SnmpdReadonlyUserPassword: {get_param: SnmpdReadonlyUserPassword}
           RedisVirtualIP: {get_attr: [RedisVirtualIP, ip_address]}
+          RedisVirtualIPUri: {get_attr: [RedisVirtualIP, ip_address_uri]}
           SwiftHashSuffix: {get_param: SwiftHashSuffix}
           SwiftMountCheck: {get_param: SwiftMountCheck}
           SwiftMinPartHours: {get_param: SwiftMinPartHours}
@@ -995,11 +1006,13 @@ resources:
           AodhApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, AodhApiNetwork]}]}
           CinderApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, CinderApiNetwork]}]}
           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]}]}
           GlanceRegistryVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, GlanceRegistryNetwork]}]}
           NovaApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, NovaApiNetwork]}]}
           SwiftProxyVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, SwiftProxyNetwork]}]}
           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]}]}
           KeystonePublicApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, KeystonePublicApiNetwork]}]}
           NeutronApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, NeutronApiNetwork]}]}
@@ -1128,7 +1141,7 @@ resources:
                 '%stackname%': {get_param: 'OS::stack_name'}
           ServiceNetMap: {get_param: ServiceNetMap}
           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}
           BlockStorageExtraConfig: {get_param: BlockStorageExtraConfig}
           CloudDomain: {get_param: CloudDomain}
@@ -1315,9 +1328,13 @@ resources:
     properties:
       ControlPlaneIp: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
       ExternalIp: {get_attr: [PublicVirtualIP, ip_address]}
+      ExternalIpUri: {get_attr: [PublicVirtualIP, ip_address_uri]}
       InternalApiIp: {get_attr: [InternalApiVirtualIP, ip_address]}
+      InternalApiIpUri: {get_attr: [InternalApiVirtualIP, ip_address_uri]}
       StorageIp: {get_attr: [StorageVirtualIP, ip_address]}
+      StorageIpUri: {get_attr: [StorageVirtualIP, ip_address_uri]}
       StorageMgmtIp: {get_attr: [StorageMgmtVirtualIP, ip_address]}
+      StorageMgmtIpUri: {get_attr: [StorageMgmtVirtualIP, ip_address_uri]}
       # No tenant or management VIP required
 
   VipConfig:
index d38f3f2..88120b9 100644 (file)
@@ -177,11 +177,17 @@ resources:
     properties:
       ControlPlaneIp: {get_attr: [CephStorage, networks, ctlplane, 0]}
       ExternalIp: {get_attr: [ExternalPort, ip_address]}
+      ExternalIpUri: {get_attr: [ExternalPort, ip_address_uri]}
       InternalApiIp: {get_attr: [InternalApiPort, ip_address]}
+      InternalApiIpUri: {get_attr: [InternalApiPort, ip_address_uri]}
       StorageIp: {get_attr: [StoragePort, ip_address]}
+      StorageIpUri: {get_attr: [StoragePort, ip_address_uri]}
       StorageMgmtIp: {get_attr: [StorageMgmtPort, ip_address]}
+      StorageMgmtIpUri: {get_attr: [StorageMgmtPort, ip_address_uri]}
       TenantIp: {get_attr: [TenantPort, ip_address]}
+      TenantIpUri: {get_attr: [TenantPort, ip_address_uri]}
       ManagementIp: {get_attr: [ManagementPort, ip_address]}
+      ManagementIpUri: {get_attr: [ManagementPort, ip_address_uri]}
 
   NetIpSubnetMap:
     type: OS::TripleO::Network::Ports::NetIpSubnetMap
index 440c2fd..09c4d3e 100644 (file)
@@ -110,7 +110,7 @@ parameters:
   GlanceApiVirtualIP:
     type: string
     default: ''
-  MysqlVirtualIP:
+  MysqlVirtualIPUri:
     type: string
     default: ''
   NetworkDeploymentActions:
@@ -229,11 +229,17 @@ resources:
     properties:
       ControlPlaneIp: {get_attr: [BlockStorage, networks, ctlplane, 0]}
       ExternalIp: {get_attr: [ExternalPort, ip_address]}
+      ExternalIpUri: {get_attr: [ExternalPort, ip_address_uri]}
       InternalApiIp: {get_attr: [InternalApiPort, ip_address]}
+      InternalApiIpUri: {get_attr: [InternalApiPort, ip_address_uri]}
       StorageIp: {get_attr: [StoragePort, ip_address]}
+      StorageIpUri: {get_attr: [StoragePort, ip_address_uri]}
       StorageMgmtIp: {get_attr: [StorageMgmtPort, ip_address]}
+      StorageMgmtIpUri: {get_attr: [StorageMgmtPort, ip_address_uri]}
       TenantIp: {get_attr: [TenantPort, ip_address]}
+      TenantIpUri: {get_attr: [TenantPort, ip_address_uri]}
       ManagementIp: {get_attr: [ManagementPort, ip_address]}
+      ManagementIpUri: {get_attr: [ManagementPort, ip_address_uri]}
 
   NetworkDeployment:
     type: OS::TripleO::SoftwareDeployment
@@ -252,7 +258,7 @@ resources:
       config: {get_resource: BlockStorageConfig}
       input_values:
         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_password: {get_param: SnmpdReadonlyUserPassword}
         cinder_lvm_loop_device_size:
index deaf798..58ca71e 100644 (file)
@@ -409,11 +409,17 @@ resources:
     properties:
       ControlPlaneIp: {get_attr: [NovaCompute, networks, ctlplane, 0]}
       ExternalIp: {get_attr: [ExternalPort, ip_address]}
+      ExternalIpUri: {get_attr: [ExternalPort, ip_address_uri]}
       InternalApiIp: {get_attr: [InternalApiPort, ip_address]}
+      InternalApiIpUri: {get_attr: [InternalApiPort, ip_address_uri]}
       StorageIp: {get_attr: [StoragePort, ip_address]}
+      StorageIpUri: {get_attr: [StoragePort, ip_address_uri]}
       StorageMgmtIp: {get_attr: [StorageMgmtPort, ip_address]}
+      StorageMgmtIpUri: {get_attr: [StorageMgmtPort, ip_address_uri]}
       TenantIp: {get_attr: [TenantPort, ip_address]}
+      TenantIpUri: {get_attr: [TenantPort, ip_address_uri]}
       ManagementIp: {get_attr: [ManagementPort, ip_address]}
+      ManagementIpUri: {get_attr: [ManagementPort, ip_address_uri]}
 
   NetworkConfig:
     type: OS::TripleO::Compute::Net::SoftwareConfig
index 688e417..733a9d7 100644 (file)
@@ -553,6 +553,10 @@ parameters:
     description: |
         Whether to create cron job for purging soft deleted rows in Nova database.
     type: boolean
+  NovaIPv6:
+    default: false
+    description: Enable IPv6 features in Nova
+    type: boolean
   NovaPassword:
     description: The password for the nova service and db account, used by nova-api.
     type: string
@@ -565,6 +569,10 @@ parameters:
     default: false
     description: Should MongoDb journaling be disabled
     type: boolean
+  MongoDbIPv6:
+    default: false
+    description: Enable IPv6 if Mongo DB VIP is IPv6
+    type: boolean
   NtpServer:
     default: ''
     description: Comma-separated list of ntp servers
@@ -612,6 +620,10 @@ parameters:
   RedisVirtualIP:
     type: string
     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:
     default: ro_snmp_user
     description: The user name for SNMPd with readonly rights running on all Overcloud nodes
@@ -667,6 +679,9 @@ parameters:
   HeatApiVirtualIP:
     type: string
     default: ''
+  HeatApiVirtualIPUri:
+    type: string
+    default: ''
   GlanceApiVirtualIP:
     type: string
     default: ''
@@ -676,6 +691,9 @@ parameters:
   MysqlVirtualIP:
     type: string
     default: ''
+  MysqlVirtualIPUri:
+    type: string
+    default: ''
   KeystoneAdminApiVirtualIP:
     type: string
     default: ''
@@ -832,11 +850,17 @@ resources:
     properties:
       ControlPlaneIp: {get_attr: [Controller, networks, ctlplane, 0]}
       ExternalIp: {get_attr: [ExternalPort, ip_address]}
+      ExternalIpUri: {get_attr: [ExternalPort, ip_address_uri]}
       InternalApiIp: {get_attr: [InternalApiPort, ip_address]}
+      InternalApiIpUri: {get_attr: [InternalApiPort, ip_address_uri]}
       StorageIp: {get_attr: [StoragePort, ip_address]}
+      StorageIpUri: {get_attr: [StoragePort, ip_address_uri]}
       StorageMgmtIp: {get_attr: [StorageMgmtPort, ip_address]}
+      StorageMgmtIpUri: {get_attr: [StorageMgmtPort, ip_address_uri]}
       TenantIp: {get_attr: [TenantPort, ip_address]}
+      TenantIpUri: {get_attr: [TenantPort, ip_address_uri]}
       ManagementIp: {get_attr: [ManagementPort, ip_address]}
+      ManagementIpUri: {get_attr: [ManagementPort, ip_address_uri]}
 
   NetIpSubnetMap:
     type: OS::TripleO::Network::Ports::NetIpSubnetMap
@@ -912,19 +936,19 @@ resources:
           list_join:
             - ''
             - - 'http://'
-              - {get_param: HeatApiVirtualIP}
+              - {get_param: HeatApiVirtualIPUri}
               - ':8003'
         heat.metadata_server_url:
           list_join:
             - ''
             - - 'http://'
-              - {get_param: HeatApiVirtualIP}
+              - {get_param: HeatApiVirtualIPUri}
               - ':8000'
         heat.waitcondition_server_url:
           list_join:
             - ''
             - - 'http://'
-              - {get_param: HeatApiVirtualIP}
+              - {get_param: HeatApiVirtualIPUri}
               - ':8000/v1/waitcondition'
         heat_auth_encryption_key: {get_param: HeatAuthEncryptionKey}
         heat_enable_db_purge: {get_param: HeatEnableDBPurge}
@@ -955,7 +979,7 @@ resources:
             - - 'mysql+pymysql://cinder:'
               - {get_param: CinderPassword}
               - '@'
-              - {get_param: MysqlVirtualIP}
+              - {get_param: MysqlVirtualIPUri}
               - '/cinder'
         glance_port: {get_param: [EndpointMap, GlanceInternal, port]}
         glance_password: {get_param: GlancePassword}
@@ -972,7 +996,7 @@ resources:
             - - 'mysql+pymysql://glance:'
               - {get_param: GlancePassword}
               - '@'
-              - {get_param: MysqlVirtualIP}
+              - {get_param: MysqlVirtualIPUri}
               - '/glance'
         heat_password: {get_param: HeatPassword}
         heat_stack_domain_admin_password: {get_param: HeatStackDomainAdminPassword}
@@ -982,7 +1006,7 @@ resources:
             - - 'mysql+pymysql://heat:'
               - {get_param: HeatPassword}
               - '@'
-              - {get_param: MysqlVirtualIP}
+              - {get_param: MysqlVirtualIPUri}
               - '/heat'
         keystone_ca_certificate: {get_param: KeystoneCACertificate}
         keystone_signing_key: {get_param: KeystoneSigningKey}
@@ -998,7 +1022,7 @@ resources:
             - - 'mysql+pymysql://keystone:'
               - {get_param: AdminToken}
               - '@'
-              - {get_param: MysqlVirtualIP}
+              - {get_param: MysqlVirtualIPUri}
               - '/keystone'
         keystone_identity_uri: { get_param: [EndpointMap, KeystoneAdmin, uri_no_suffix] }
         keystone_auth_uri: {get_param: [EndpointMap, KeystoneInternal, uri] }
@@ -1105,7 +1129,7 @@ resources:
             - - 'mysql+pymysql://neutron:'
               - {get_param: NeutronPassword}
               - '@'
-              - {get_param: MysqlVirtualIP}
+              - {get_param: MysqlVirtualIPUri}
               - '/ovs_neutron?charset=utf8'
         neutron_internal_url: { get_param: [ EndpointMap, NeutronInternal, uri ] }
         neutron_public_url: { get_param: [ EndpointMap, NeutronPublic, uri ] }
@@ -1120,7 +1144,7 @@ resources:
           list_join:
             - ''
             - - 'redis://'
-              - {get_param: RedisVirtualIP}
+              - {get_param: RedisVirtualIPUri}
               - ':6379'
         ceilometer_dsn:
           list_join:
@@ -1128,11 +1152,12 @@ resources:
             - - 'mysql+pymysql://ceilometer:'
               - {get_param: CeilometerPassword}
               - '@'
-              - {get_param: MysqlVirtualIP}
+              - {get_param: MysqlVirtualIPUri}
               - '/ceilometer'
         snmpd_readonly_user_name: {get_param: SnmpdReadonlyUserName}
         snmpd_readonly_user_password: {get_param: SnmpdReadonlyUserPassword}
         nova_enable_db_purge: {get_param: NovaEnableDBPurge}
+        nova_ipv6: {get_param: NovaIPv6}
         nova_password: {get_param: NovaPassword}
         nova_dsn:
           list_join:
@@ -1140,7 +1165,7 @@ resources:
             - - 'mysql+pymysql://nova:'
               - {get_param: NovaPassword}
               - '@'
-              - {get_param: MysqlVirtualIP}
+              - {get_param: MysqlVirtualIPUri}
               - '/nova'
         nova_api_dsn:
           list_join:
@@ -1160,6 +1185,7 @@ resources:
         rabbit_client_use_ssl: {get_param: RabbitClientUseSSL}
         rabbit_client_port: {get_param: RabbitClientPort}
         mongodb_no_journal: {get_param: MongoDbNoJournal}
+        mongodb_ipv6: {get_param: MongoDbIPv6}
         # We need to force this into quotes or hiera will return integer causing
         # the puppet module validation regexp to fail.
         # Remove when: https://github.com/puppetlabs/puppetlabs-rabbitmq/pull/401
@@ -1412,6 +1438,7 @@ resources:
                 # MongoDB
                 mongodb::server::bind_ip: {get_input: mongo_db_network}
                 mongodb::server::nojournal: {get_input: mongodb_no_journal}
+                mongodb::server::ipv6: {get_input: mongodb_ipv6}
                 # MySQL
                 admin_password: {get_input: admin_password}
                 enable_galera: {get_input: enable_galera}
@@ -1532,6 +1559,7 @@ resources:
                 nova::rabbit_port: {get_input: rabbit_client_port}
                 nova::upgrade_level_compute: {get_input: upgrade_level_nova_compute}
                 nova::debug: {get_input: debug}
+                nova::use_ipv6: {get_input: nova_ipv6}
                 nova::api::auth_uri: {get_input: keystone_auth_uri}
                 nova::api::identity_uri: {get_input: keystone_identity_uri}
                 nova::api::api_bind_address: {get_input: nova_api_network}
index e77a25f..15a5474 100644 (file)
@@ -198,11 +198,17 @@ resources:
     properties:
       ControlPlaneIp: {get_attr: [SwiftStorage, networks, ctlplane, 0]}
       ExternalIp: {get_attr: [ExternalPort, ip_address]}
+      ExternalIpUri: {get_attr: [ExternalPort, ip_address_uri]}
       InternalApiIp: {get_attr: [InternalApiPort, ip_address]}
+      InternalApiIpUri: {get_attr: [InternalApiPort, ip_address_uri]}
       StorageIp: {get_attr: [StoragePort, ip_address]}
+      StorageIpUri: {get_attr: [StoragePort, ip_address_uri]}
       StorageMgmtIp: {get_attr: [StorageMgmtPort, ip_address]}
+      StorageMgmtIpUri: {get_attr: [StorageMgmtPort, ip_address_uri]}
       TenantIp: {get_attr: [TenantPort, ip_address]}
+      TenantIpUri: {get_attr: [TenantPort, ip_address_uri]}
       ManagementIp: {get_attr: [ManagementPort, ip_address]}
+      ManagementIpUri: {get_attr: [ManagementPort, ip_address_uri]}
 
   NetworkDeployment:
     type: OS::TripleO::SoftwareDeployment