summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTim Rozet <trozet@redhat.com>2016-01-16 22:50:36 -0500
committerTim Rozet <trozet@redhat.com>2016-01-17 23:55:30 -0500
commit668e52b657e134d27dbd03b473dc927daa58dda6 (patch)
tree3d7fe66b42f8df8aea7696b16d94b6b467f5c79d
parent2a937932642f3e8288d338c6fa4a2b6a7a5defc2 (diff)
Adds ODL L3 and external network support on compute nodes
Adds support for ODL L3 which uses DVR (distributed virtual routing). Due to DVR compute nodes must have br-ex. In addition, neutron must force metadata via dhcp agent, since there is no neutron L3 agent running. ODL L3 runs as custom plugin to neutron. Also adds support for configuring IP on public NIC now by default. This is needed for ONOS deployment, and access via public interface. Change-Id: I5df0e49bd903efacf8c87486da27576b01ce5779 Signed-off-by: Tim Rozet <trozet@redhat.com>
-rw-r--r--build/Makefile5
-rwxr-xr-xbuild/instack.sh4
-rw-r--r--build/network-environment.yaml1
-rw-r--r--build/nics/compute.yaml15
-rw-r--r--build/nics/compute_br-ex.yaml108
-rw-r--r--build/nics/compute_private.yaml15
-rw-r--r--build/nics/compute_private_br-ex.yaml114
-rw-r--r--build/nics/compute_private_storage.yaml15
-rw-r--r--build/nics/compute_private_storage_br-ex.yaml121
-rw-r--r--build/nics/compute_storage.yaml15
-rw-r--r--build/nics/compute_storage_br-ex.yaml114
-rw-r--r--build/opnfv-apex-undercloud.spec10
-rw-r--r--build/opnfv-tripleo-heat-templates.patch255
-rw-r--r--build/puppet-neutron-force-metadata.patch50
-rwxr-xr-xci/deploy.sh14
15 files changed, 788 insertions, 68 deletions
diff --git a/build/Makefile b/build/Makefile
index f55d3e7..b0b895a 100644
--- a/build/Makefile
+++ b/build/Makefile
@@ -128,12 +128,17 @@ rpm:
--xform="s:nics/compute_storage.yaml:opnfv-apex-undercloud-$(RPMVERS)/build/nics/compute_storage.yaml:" \
--xform="s:nics/controller_private_storage.yaml:opnfv-apex-undercloud-$(RPMVERS)/build/nics/controller_private_storage.yaml:" \
--xform="s:nics/compute_private_storage.yaml:opnfv-apex-undercloud-$(RPMVERS)/build/nics/compute_private_storage.yaml:" \
+ --xform="s:nics/compute_br-ex.yaml:opnfv-apex-undercloud-$(RPMVERS)/build/nics/compute_br-ex.yaml:" \
+ --xform="s:nics/compute_private_br-ex.yaml:opnfv-apex-undercloud-$(RPMVERS)/build/nics/compute_private_br-ex.yaml:" \
+ --xform="s:nics/compute_storage_br-ex.yaml:opnfv-apex-undercloud-$(RPMVERS)/build/nics/compute_storage_br-ex.yaml:" \
+ --xform="s:nics/compute_private_storage_br-ex.yaml:opnfv-apex-undercloud-$(RPMVERS)/build/nics/compute_private_storage_br-ex.yaml:" \
--xform="s:instackenv-virt.json:opnfv-apex-undercloud-$(RPMVERS)/build/instackenv-virt.json:" \
--xform="s:instackenv.json.example:opnfv-apex-undercloud-$(RPMVERS)/build/instackenv.json.example:" \
stack/instack.qcow2 instack.xml baremetalbrbm_brbm1_brbm2_brbm3_0.xml baremetalbrbm_brbm1_brbm2_brbm3_1.xml \
baremetalbrbm_brbm1_brbm2_brbm3_2.xml baremetalbrbm_brbm1_brbm2_brbm3_3.xml baremetalbrbm_brbm1_brbm2_brbm3_4.xml \
brbm-net.xml brbm1-net.xml brbm2-net.xml brbm3-net.xml default-pool.xml instackenv-virt.json network-environment.yaml \
nics/controller.yaml nics/compute.yaml nics/controller_private.yaml nics/compute_private.yaml \
+ nics/compute_br-ex.yaml nics/compute_private_br-ex.yaml nics/compute_storage_br-ex.yaml nics/compute_private_storage_br-ex.yaml \
nics/controller_storage.yaml nics/compute_storage.yaml nics/controller_private_storage.yaml \
nics/compute_private_storage.yaml instackenv-virt.json instackenv.json.example
rpmbuild -ba opnfv-apex-undercloud.spec -D '_topdir %(echo `pwd`)' -D '_builddir %(echo `pwd`)' -D '_sourcedir %(echo `pwd`)' -D '_rpmdir %(echo `pwd`)' -D '_specdir %(echo `pwd`)' -D '_srcrpmdir %(echo `pwd`)' -D "release $(shell echo $(REVSTATE) | tr -d '_-')"
diff --git a/build/instack.sh b/build/instack.sh
index 52339b1..eb017c2 100755
--- a/build/instack.sh
+++ b/build/instack.sh
@@ -268,6 +268,10 @@ LIBGUESTFS_BACKEND=direct virt-customize --upload ../opnfv-tripleo-heat-template
LIBGUESTFS_BACKEND=direct virt-customize --upload ../opendaylight-puppet-neutron.patch:/tmp \
--run-command "cd /etc/puppet/modules/neutron && patch -Np1 < /tmp/opendaylight-puppet-neutron.patch" \
-a overcloud-full-odl.qcow2
+# REMOVE ME AFTER Brahmaputra
+LIBGUESTFS_BACKEND=direct virt-customize --upload ../puppet-neutron-force-metadata.patch:/tmp \
+ --run-command "cd /etc/puppet/modules/neutron && patch -Np1 < /tmp/puppet-neutron-force-metadata.patch" \
+ -a overcloud-full-odl.qcow2
## END WORK AROUND
popd
diff --git a/build/network-environment.yaml b/build/network-environment.yaml
index 01eb50e..ffe39c9 100644
--- a/build/network-environment.yaml
+++ b/build/network-environment.yaml
@@ -19,6 +19,7 @@ resource_registry:
OS::TripleO::Compute::Ports::InternalApiPort: /usr/share/openstack-tripleo-heat-templates/network/ports/noop.yaml
OS::TripleO::Compute::Ports::StoragePort: /usr/share/openstack-tripleo-heat-templates/network/ports/noop.yaml
OS::TripleO::Compute::Ports::TenantPort: /usr/share/openstack-tripleo-heat-templates/network/ports/noop.yaml
+ OS::TripleO::Compute::Ports::Ports::ExternalPort: /usr/share/openstack-tripleo-heat-templates/network/ports/external.yaml
# Port assignments for service virtual IPs for the controller role
OS::TripleO::Controller::Ports::RedisVipPort: /usr/share/openstack-tripleo-heat-templates/network/ports/noop.yaml
diff --git a/build/nics/compute.yaml b/build/nics/compute.yaml
index 674b250..6978e9e 100644
--- a/build/nics/compute.yaml
+++ b/build/nics/compute.yaml
@@ -48,6 +48,10 @@ parameters:
ControlPlaneDefaultRoute: # Override this via parameter_defaults
description: The subnet CIDR of the control plane network.
type: string
+ ExternalInterfaceDefaultRoute:
+ default: '10.0.0.1'
+ description: default route for the external network
+ type: string
DnsServers: # Override this via parameter_defaults
default: []
description: A list of DNS servers (2 max for some implementations) that will be added to resolv.conf.
@@ -80,6 +84,17 @@ resources:
-
ip_netmask: 169.254.169.254/32
next_hop: {get_param: EC2MetadataIp}
+ -
+ type: interface
+ name: nic3
+ use_dhcp: false
+ addresses:
+ -
+ ip_netmask: {get_param: ExternalIpSubnet}
+ routes:
+ -
+ ip_netmask: 0.0.0.0/0
+ next_hop: {get_param: ExternalInterfaceDefaultRoute}
outputs:
OS::stack_id:
diff --git a/build/nics/compute_br-ex.yaml b/build/nics/compute_br-ex.yaml
new file mode 100644
index 0000000..d187a96
--- /dev/null
+++ b/build/nics/compute_br-ex.yaml
@@ -0,0 +1,108 @@
+heat_template_version: 2015-04-30
+
+description: >
+ Software Config to drive os-net-config to configure multiple interfaces
+ for the compute role.
+
+parameters:
+ ControlPlaneIp:
+ default: ''
+ description: IP address/subnet on the ctlplane network
+ type: string
+ ExternalIpSubnet:
+ default: ''
+ description: IP address/subnet on the external network
+ type: string
+ InternalApiIpSubnet:
+ default: ''
+ description: IP address/subnet on the internal API network
+ type: string
+ StorageIpSubnet:
+ default: ''
+ description: IP address/subnet on the storage network
+ type: string
+ StorageMgmtIpSubnet:
+ default: ''
+ description: IP address/subnet on the storage mgmt network
+ type: string
+ TenantIpSubnet:
+ default: ''
+ description: IP address/subnet on the tenant network
+ type: string
+ InternalApiNetworkVlanID:
+ default: 20
+ description: Vlan ID for the internal_api network traffic.
+ type: number
+ StorageNetworkVlanID:
+ default: 30
+ description: Vlan ID for the storage network traffic.
+ type: number
+ TenantNetworkVlanID:
+ default: 50
+ description: Vlan ID for the tenant network traffic.
+ type: number
+ ControlPlaneSubnetCidr: # Override this via parameter_defaults
+ default: '24'
+ description: The subnet CIDR of the control plane network.
+ type: string
+ ControlPlaneDefaultRoute: # Override this via parameter_defaults
+ description: The subnet CIDR of the control plane network.
+ type: string
+ ExternalInterfaceDefaultRoute:
+ default: '10.0.0.1'
+ description: default route for the external network
+ type: string
+ DnsServers: # Override this via parameter_defaults
+ default: []
+ description: A list of DNS servers (2 max for some implementations) that will be added to resolv.conf.
+ type: json
+ EC2MetadataIp: # Override this via parameter_defaults
+ description: The IP address of the EC2 metadata server.
+ type: string
+
+resources:
+ OsNetConfigImpl:
+ type: OS::Heat::StructuredConfig
+ properties:
+ group: os-apply-config
+ config:
+ os_net_config:
+ network_config:
+ -
+ type: interface
+ name: nic1
+ use_dhcp: false
+ dns_servers: {get_param: DnsServers}
+ addresses:
+ -
+ ip_netmask:
+ list_join:
+ - '/'
+ - - {get_param: ControlPlaneIp}
+ - {get_param: ControlPlaneSubnetCidr}
+ routes:
+ -
+ ip_netmask: 169.254.169.254/32
+ next_hop: {get_param: EC2MetadataIp}
+ -
+ type: ovs_bridge
+ name: {get_input: bridge_name}
+ use_dhcp: false
+ addresses:
+ -
+ ip_netmask: {get_param: ExternalIpSubnet}
+ routes:
+ -
+ ip_netmask: 0.0.0.0/0
+ next_hop: {get_param: ExternalInterfaceDefaultRoute}
+ members:
+ -
+ type: interface
+ name: nic3
+ # force the MAC address of the bridge to this interface
+ primary: true
+
+outputs:
+ OS::stack_id:
+ description: The OsNetConfigImpl resource.
+ value: {get_resource: OsNetConfigImpl}
diff --git a/build/nics/compute_private.yaml b/build/nics/compute_private.yaml
index 746831f..9bc1b69 100644
--- a/build/nics/compute_private.yaml
+++ b/build/nics/compute_private.yaml
@@ -48,6 +48,10 @@ parameters:
ControlPlaneDefaultRoute: # Override this via parameter_defaults
description: The subnet CIDR of the control plane network.
type: string
+ ExternalInterfaceDefaultRoute:
+ default: '10.0.0.1'
+ description: default route for the external network
+ type: string
DnsServers: # Override this via parameter_defaults
default: []
description: A list of DNS servers (2 max for some implementations) that will be added to resolv.conf.
@@ -87,6 +91,17 @@ resources:
addresses:
-
ip_netmask: {get_param: TenantIpSubnet}
+ -
+ type: interface
+ name: nic3
+ use_dhcp: false
+ addresses:
+ -
+ ip_netmask: {get_param: ExternalIpSubnet}
+ routes:
+ -
+ ip_netmask: 0.0.0.0/0
+ next_hop: {get_param: ExternalInterfaceDefaultRoute}
outputs:
OS::stack_id:
description: The OsNetConfigImpl resource.
diff --git a/build/nics/compute_private_br-ex.yaml b/build/nics/compute_private_br-ex.yaml
new file mode 100644
index 0000000..94a39bf
--- /dev/null
+++ b/build/nics/compute_private_br-ex.yaml
@@ -0,0 +1,114 @@
+heat_template_version: 2015-04-30
+
+description: >
+ Software Config to drive os-net-config to configure multiple interfaces
+ for the compute role.
+
+parameters:
+ ControlPlaneIp:
+ default: ''
+ description: IP address/subnet on the ctlplane network
+ type: string
+ ExternalIpSubnet:
+ default: ''
+ description: IP address/subnet on the external network
+ type: string
+ InternalApiIpSubnet:
+ default: ''
+ description: IP address/subnet on the internal API network
+ type: string
+ StorageIpSubnet:
+ default: ''
+ description: IP address/subnet on the storage network
+ type: string
+ StorageMgmtIpSubnet:
+ default: ''
+ description: IP address/subnet on the storage mgmt network
+ type: string
+ TenantIpSubnet:
+ default: ''
+ description: IP address/subnet on the tenant network
+ type: string
+ InternalApiNetworkVlanID:
+ default: 20
+ description: Vlan ID for the internal_api network traffic.
+ type: number
+ StorageNetworkVlanID:
+ default: 30
+ description: Vlan ID for the storage network traffic.
+ type: number
+ TenantNetworkVlanID:
+ default: 50
+ description: Vlan ID for the tenant network traffic.
+ type: number
+ ControlPlaneSubnetCidr: # Override this via parameter_defaults
+ default: '24'
+ description: The subnet CIDR of the control plane network.
+ type: string
+ ControlPlaneDefaultRoute: # Override this via parameter_defaults
+ description: The subnet CIDR of the control plane network.
+ type: string
+ ExternalInterfaceDefaultRoute:
+ default: '10.0.0.1'
+ description: default route for the external network
+ type: string
+ DnsServers: # Override this via parameter_defaults
+ default: []
+ description: A list of DNS servers (2 max for some implementations) that will be added to resolv.conf.
+ type: json
+ EC2MetadataIp: # Override this via parameter_defaults
+ description: The IP address of the EC2 metadata server.
+ type: string
+
+resources:
+ OsNetConfigImpl:
+ type: OS::Heat::StructuredConfig
+ properties:
+ group: os-apply-config
+ config:
+ os_net_config:
+ network_config:
+ -
+ type: interface
+ name: nic1
+ use_dhcp: false
+ dns_servers: {get_param: DnsServers}
+ addresses:
+ -
+ ip_netmask:
+ list_join:
+ - '/'
+ - - {get_param: ControlPlaneIp}
+ - {get_param: ControlPlaneSubnetCidr}
+ routes:
+ -
+ ip_netmask: 169.254.169.254/32
+ next_hop: {get_param: EC2MetadataIp}
+ -
+ type: interface
+ name: nic2
+ use_dhcp: false
+ addresses:
+ -
+ ip_netmask: {get_param: TenantIpSubnet}
+ -
+ type: ovs_bridge
+ name: {get_input: bridge_name}
+ use_dhcp: false
+ addresses:
+ -
+ ip_netmask: {get_param: ExternalIpSubnet}
+ routes:
+ -
+ ip_netmask: 0.0.0.0/0
+ next_hop: {get_param: ExternalInterfaceDefaultRoute}
+ members:
+ -
+ type: interface
+ name: nic3
+ # force the MAC address of the bridge to this interface
+ primary: true
+outputs:
+ OS::stack_id:
+ description: The OsNetConfigImpl resource.
+ value: {get_resource: OsNetConfigImpl}
diff --git a/build/nics/compute_private_storage.yaml b/build/nics/compute_private_storage.yaml
index d140871..fc51cfd 100644
--- a/build/nics/compute_private_storage.yaml
+++ b/build/nics/compute_private_storage.yaml
@@ -48,6 +48,10 @@ parameters:
ControlPlaneDefaultRoute: # Override this via parameter_defaults
description: The subnet CIDR of the control plane network.
type: string
+ ExternalInterfaceDefaultRoute:
+ default: '10.0.0.1'
+ description: default route for the external network
+ type: string
DnsServers: # Override this via parameter_defaults
default: []
description: A list of DNS servers (2 max for some implementations) that will be added to resolv.conf.
@@ -89,6 +93,17 @@ resources:
ip_netmask: {get_param: TenantIpSubnet}
-
type: interface
+ name: nic3
+ use_dhcp: false
+ addresses:
+ -
+ ip_netmask: {get_param: ExternalIpSubnet}
+ routes:
+ -
+ ip_netmask: 0.0.0.0/0
+ next_hop: {get_param: ExternalInterfaceDefaultRoute}
+ -
+ type: interface
name: nic4
use_dhcp: false
addresses:
diff --git a/build/nics/compute_private_storage_br-ex.yaml b/build/nics/compute_private_storage_br-ex.yaml
new file mode 100644
index 0000000..1094bb2
--- /dev/null
+++ b/build/nics/compute_private_storage_br-ex.yaml
@@ -0,0 +1,121 @@
+heat_template_version: 2015-04-30
+
+description: >
+ Software Config to drive os-net-config to configure multiple interfaces
+ for the compute role.
+
+parameters:
+ ControlPlaneIp:
+ default: ''
+ description: IP address/subnet on the ctlplane network
+ type: string
+ ExternalIpSubnet:
+ default: ''
+ description: IP address/subnet on the external network
+ type: string
+ InternalApiIpSubnet:
+ default: ''
+ description: IP address/subnet on the internal API network
+ type: string
+ StorageIpSubnet:
+ default: ''
+ description: IP address/subnet on the storage network
+ type: string
+ StorageMgmtIpSubnet:
+ default: ''
+ description: IP address/subnet on the storage mgmt network
+ type: string
+ TenantIpSubnet:
+ default: ''
+ description: IP address/subnet on the tenant network
+ type: string
+ InternalApiNetworkVlanID:
+ default: 20
+ description: Vlan ID for the internal_api network traffic.
+ type: number
+ StorageNetworkVlanID:
+ default: 30
+ description: Vlan ID for the storage network traffic.
+ type: number
+ TenantNetworkVlanID:
+ default: 50
+ description: Vlan ID for the tenant network traffic.
+ type: number
+ ControlPlaneSubnetCidr: # Override this via parameter_defaults
+ default: '24'
+ description: The subnet CIDR of the control plane network.
+ type: string
+ ControlPlaneDefaultRoute: # Override this via parameter_defaults
+ description: The subnet CIDR of the control plane network.
+ type: string
+ ExternalInterfaceDefaultRoute:
+ default: '10.0.0.1'
+ description: default route for the external network
+ type: string
+ DnsServers: # Override this via parameter_defaults
+ default: []
+ description: A list of DNS servers (2 max for some implementations) that will be added to resolv.conf.
+ type: json
+ EC2MetadataIp: # Override this via parameter_defaults
+ description: The IP address of the EC2 metadata server.
+ type: string
+
+resources:
+ OsNetConfigImpl:
+ type: OS::Heat::StructuredConfig
+ properties:
+ group: os-apply-config
+ config:
+ os_net_config:
+ network_config:
+ -
+ type: interface
+ name: nic1
+ use_dhcp: false
+ dns_servers: {get_param: DnsServers}
+ addresses:
+ -
+ ip_netmask:
+ list_join:
+ - '/'
+ - - {get_param: ControlPlaneIp}
+ - {get_param: ControlPlaneSubnetCidr}
+ routes:
+ -
+ ip_netmask: 169.254.169.254/32
+ next_hop: {get_param: EC2MetadataIp}
+ -
+ type: interface
+ name: nic2
+ use_dhcp: false
+ addresses:
+ -
+ ip_netmask: {get_param: TenantIpSubnet}
+ -
+ type: ovs_bridge
+ name: {get_input: bridge_name}
+ use_dhcp: false
+ addresses:
+ -
+ ip_netmask: {get_param: ExternalIpSubnet}
+ routes:
+ -
+ ip_netmask: 0.0.0.0/0
+ next_hop: {get_param: ExternalInterfaceDefaultRoute}
+ members:
+ -
+ type: interface
+ name: nic3
+ # force the MAC address of the bridge to this interface
+ primary: true
+ -
+ type: interface
+ name: nic4
+ use_dhcp: false
+ addresses:
+ -
+ ip_netmask: {get_param: StorageIpSubnet}
+outputs:
+ OS::stack_id:
+ description: The OsNetConfigImpl resource.
+ value: {get_resource: OsNetConfigImpl}
diff --git a/build/nics/compute_storage.yaml b/build/nics/compute_storage.yaml
index 6d04860..a1f22a3 100644
--- a/build/nics/compute_storage.yaml
+++ b/build/nics/compute_storage.yaml
@@ -48,6 +48,10 @@ parameters:
ControlPlaneDefaultRoute: # Override this via parameter_defaults
description: The subnet CIDR of the control plane network.
type: string
+ ExternalInterfaceDefaultRoute:
+ default: '10.0.0.1'
+ description: default route for the external network
+ type: string
DnsServers: # Override this via parameter_defaults
default: []
description: A list of DNS servers (2 max for some implementations) that will be added to resolv.conf.
@@ -82,6 +86,17 @@ resources:
next_hop: {get_param: EC2MetadataIp}
-
type: interface
+ name: nic3
+ use_dhcp: false
+ addresses:
+ -
+ ip_netmask: {get_param: ExternalIpSubnet}
+ routes:
+ -
+ ip_netmask: 0.0.0.0/0
+ next_hop: {get_param: ExternalInterfaceDefaultRoute}
+ -
+ type: interface
name: nic4
use_dhcp: false
addresses:
diff --git a/build/nics/compute_storage_br-ex.yaml b/build/nics/compute_storage_br-ex.yaml
new file mode 100644
index 0000000..47412a5
--- /dev/null
+++ b/build/nics/compute_storage_br-ex.yaml
@@ -0,0 +1,114 @@
+heat_template_version: 2015-04-30
+
+description: >
+ Software Config to drive os-net-config to configure multiple interfaces
+ for the compute role.
+
+parameters:
+ ControlPlaneIp:
+ default: ''
+ description: IP address/subnet on the ctlplane network
+ type: string
+ ExternalIpSubnet:
+ default: ''
+ description: IP address/subnet on the external network
+ type: string
+ InternalApiIpSubnet:
+ default: ''
+ description: IP address/subnet on the internal API network
+ type: string
+ StorageIpSubnet:
+ default: ''
+ description: IP address/subnet on the storage network
+ type: string
+ StorageMgmtIpSubnet:
+ default: ''
+ description: IP address/subnet on the storage mgmt network
+ type: string
+ TenantIpSubnet:
+ default: ''
+ description: IP address/subnet on the tenant network
+ type: string
+ InternalApiNetworkVlanID:
+ default: 20
+ description: Vlan ID for the internal_api network traffic.
+ type: number
+ StorageNetworkVlanID:
+ default: 30
+ description: Vlan ID for the storage network traffic.
+ type: number
+ TenantNetworkVlanID:
+ default: 50
+ description: Vlan ID for the tenant network traffic.
+ type: number
+ ControlPlaneSubnetCidr: # Override this via parameter_defaults
+ default: '24'
+ description: The subnet CIDR of the control plane network.
+ type: string
+ ControlPlaneDefaultRoute: # Override this via parameter_defaults
+ description: The subnet CIDR of the control plane network.
+ type: string
+ ExternalInterfaceDefaultRoute:
+ default: '10.0.0.1'
+ description: default route for the external network
+ type: string
+ DnsServers: # Override this via parameter_defaults
+ default: []
+ description: A list of DNS servers (2 max for some implementations) that will be added to resolv.conf.
+ type: json
+ EC2MetadataIp: # Override this via parameter_defaults
+ description: The IP address of the EC2 metadata server.
+ type: string
+
+resources:
+ OsNetConfigImpl:
+ type: OS::Heat::StructuredConfig
+ properties:
+ group: os-apply-config
+ config:
+ os_net_config:
+ network_config:
+ -
+ type: interface
+ name: nic1
+ use_dhcp: false
+ dns_servers: {get_param: DnsServers}
+ addresses:
+ -
+ ip_netmask:
+ list_join:
+ - '/'
+ - - {get_param: ControlPlaneIp}
+ - {get_param: ControlPlaneSubnetCidr}
+ routes:
+ -
+ ip_netmask: 169.254.169.254/32
+ next_hop: {get_param: EC2MetadataIp}
+ -
+ type: ovs_bridge
+ name: {get_input: bridge_name}
+ use_dhcp: false
+ addresses:
+ -
+ ip_netmask: {get_param: ExternalIpSubnet}
+ routes:
+ -
+ ip_netmask: 0.0.0.0/0
+ next_hop: {get_param: ExternalInterfaceDefaultRoute}
+ members:
+ -
+ type: interface
+ name: nic3
+ # force the MAC address of the bridge to this interface
+ primary: true
+ -
+ type: interface
+ name: nic4
+ use_dhcp: false
+ addresses:
+ -
+ ip_netmask: {get_param: StorageIpSubnet}
+outputs:
+ OS::stack_id:
+ description: The OsNetConfigImpl resource.
+ value: {get_resource: OsNetConfigImpl}
diff --git a/build/opnfv-apex-undercloud.spec b/build/opnfv-apex-undercloud.spec
index e18ea8f..298ad28 100644
--- a/build/opnfv-apex-undercloud.spec
+++ b/build/opnfv-apex-undercloud.spec
@@ -39,7 +39,11 @@ install build/nics/compute_private.yaml %{buildroot}%{_var}/opt/opnfv/nics/
install build/nics/controller_storage.yaml %{buildroot}%{_var}/opt/opnfv/nics/
install build/nics/compute_storage.yaml %{buildroot}%{_var}/opt/opnfv/nics/
install build/nics/controller_private_storage.yaml %{buildroot}%{_var}/opt/opnfv/nics/
-install build/nics/compute_private_storage.yaml %{buildroot}%{_var}/opt/opnfv/nics
+install build/nics/compute_private_storage.yaml %{buildroot}%{_var}/opt/opnfv/nics/
+install build/nics/compute_br-ex.yaml %{buildroot}%{_var}/opt/opnfv/nics/
+install build/nics/compute_private_br-ex.yaml %{buildroot}%{_var}/opt/opnfv/nics/
+install build/nics/compute_storage_br-ex.yaml %{buildroot}%{_var}/opt/opnfv/nics/
+install build/nics/compute_private_storage_br-ex.yaml %{buildroot}%{_var}/opt/opnfv/nics/
install build/instackenv-virt.json %{buildroot}%{_var}/opt/opnfv/
install build/instackenv.json.example %{buildroot}%{_var}/opt/opnfv/
@@ -62,6 +66,10 @@ install build/instackenv.json.example %{buildroot}%{_var}/opt/opnfv/
%{_var}/opt/opnfv/nics/compute_storage.yaml
%{_var}/opt/opnfv/nics/controller_private_storage.yaml
%{_var}/opt/opnfv/nics/compute_private_storage.yaml
+%{_var}/opt/opnfv/nics/compute_br-ex.yaml
+%{_var}/opt/opnfv/nics/compute_private_br-ex.yaml
+%{_var}/opt/opnfv/nics/compute_storage_br-ex.yaml
+%{_var}/opt/opnfv/nics/compute_private_storage_br-ex.yaml
%{_var}/opt/opnfv/instackenv-virt.json
%{_var}/opt/opnfv/instackenv.json.example
diff --git a/build/opnfv-tripleo-heat-templates.patch b/build/opnfv-tripleo-heat-templates.patch
index be40742..fd1cd0e 100644
--- a/build/opnfv-tripleo-heat-templates.patch
+++ b/build/opnfv-tripleo-heat-templates.patch
@@ -1,31 +1,28 @@
-From 63f8b6412f526ba245d86f40eb6b1ae1ee06485d Mon Sep 17 00:00:00 2001
-From: Dan Radez <dradez@redhat.com>
-Date: Sun, 13 Dec 2015 21:20:40 -0500
-Subject: [PATCH] Adds OpenDaylight support
+From f9cd66d8c353411b8c3b32a45ab765eaaee02fec Mon Sep 17 00:00:00 2001
+From: Tim Rozet <tdrozet@gmail.com>
+Date: Tue, 12 Jan 2016 16:49:57 -0500
+Subject: [PATCH] Adds current opnfv patch with ODL L2/L3 and ONOS support
-To enable OpenDaylight on controllers use environments/opendaylight.yaml
-To enable OpenDaylight on external node use
-environments/opendaylight-external.yaml
-
-Adds onos support
---
environments/onos.yaml | 8 +
environments/opendaylight-external.yaml | 25 ++
environments/opendaylight.yaml | 25 ++
+ environments/opendaylight_l3.yaml | 8 +
overcloud-resource-registry-puppet.yaml | 3 +
- overcloud-without-mergepy.yaml | 62 +++++
+ overcloud-without-mergepy.yaml | 73 +++++
puppet/all-nodes-config.yaml | 6 +
- puppet/compute.yaml | 25 ++
- puppet/controller.yaml | 35 +++
+ puppet/compute.yaml | 35 +++
+ puppet/controller.yaml | 47 ++++
puppet/manifests/overcloud_compute.pp | 33 ++-
- puppet/manifests/overcloud_controller.pp | 80 +++++-
- puppet/manifests/overcloud_controller_pacemaker.pp | 299 +++++++++++++--------
- puppet/manifests/overcloud_opendaylight.pp | 26 ++
- puppet/opendaylight-puppet.yaml | 209 ++++++++++++++
- 13 files changed, 712 insertions(+), 124 deletions(-)
+ puppet/manifests/overcloud_controller.pp | 86 +++++-
+ puppet/manifests/overcloud_controller_pacemaker.pp | 302 +++++++++++++--------
+ puppet/manifests/overcloud_opendaylight.pp | 27 ++
+ puppet/opendaylight-puppet.yaml | 217 +++++++++++++++
+ 14 files changed, 771 insertions(+), 124 deletions(-)
create mode 100644 environments/onos.yaml
create mode 100644 environments/opendaylight-external.yaml
create mode 100644 environments/opendaylight.yaml
+ create mode 100644 environments/opendaylight_l3.yaml
create mode 100644 puppet/manifests/overcloud_opendaylight.pp
create mode 100644 puppet/opendaylight-puppet.yaml
@@ -105,8 +102,22 @@ index 0000000..c8abf75
+ # reduce OpenDaylightCount to 0 if you don't want any
+ # OpenDaylight only nodes
+ opendaylight_install: true
+diff --git a/environments/opendaylight_l3.yaml b/environments/opendaylight_l3.yaml
+new file mode 100644
+index 0000000..be7c2a8
+--- /dev/null
++++ b/environments/opendaylight_l3.yaml
+@@ -0,0 +1,8 @@
++parameters:
++ #NeutronEnableL3Agent: false
++ NeutronEnableForceMetadata: true
++ OpenDaylightEnableL3: true
++ NeutronServicePlugins: "networking_odl.l3.l3_odl.OpenDaylightL3RouterPlugin"
++ ExtraConfig:
++ neutron_mechanism_drivers: ['opendaylight']
++ neutron_tenant_network_type: vxlan
diff --git a/overcloud-resource-registry-puppet.yaml b/overcloud-resource-registry-puppet.yaml
-index c072c29..2413450 100644
+index 4cfed6b..adecc79 100644
--- a/overcloud-resource-registry-puppet.yaml
+++ b/overcloud-resource-registry-puppet.yaml
@@ -27,6 +27,9 @@ resource_registry:
@@ -120,10 +131,21 @@ index c072c29..2413450 100644
# NodeUserData == Cloud-init additional user-data, e.g cloud-config
# ControllerExtraConfigPre == Controller configuration pre service deployment
diff --git a/overcloud-without-mergepy.yaml b/overcloud-without-mergepy.yaml
-index 01c0079..210ec11 100644
+index a532c2f..1aa87ae 100644
--- a/overcloud-without-mergepy.yaml
+++ b/overcloud-without-mergepy.yaml
-@@ -227,6 +227,23 @@ parameters:
+@@ -113,6 +113,10 @@ parameters:
+ default: ''
+ type: string
+ description: Neutron ID for ctlplane network.
++ NeutronEnableForceMetadata:
++ default: 'False'
++ description: If True, DHCP always provides metadata route to VM.
++ type: string
+ NeutronEnableTunnelling:
+ type: string
+ default: "True"
+@@ -227,6 +231,27 @@ parameters:
default: false
description: Should MongoDb journaling be disabled
type: boolean
@@ -131,6 +153,10 @@ index 01c0079..210ec11 100644
+ default: 8081
+ description: Set opendaylight service port
+ type: number
++ OpenDaylightEnableL3:
++ description: Knob to enable/disable ODL L3
++ type: string
++ default: 'no'
+ OpenDaylightInstall:
+ default: false
+ description: Whether to install OpenDaylight on the control nodes.
@@ -147,7 +173,7 @@ index 01c0079..210ec11 100644
PublicVirtualFixedIPs:
default: []
description: >
-@@ -650,6 +667,18 @@ parameters:
+@@ -664,6 +689,18 @@ parameters:
structure as ExtraConfig.
type: json
@@ -166,7 +192,7 @@ index 01c0079..210ec11 100644
# Hostname format for each role
# Note %index% is translated into the index of the node, e.g 0/1/2 etc
# and %stackname% is replaced with OS::stack_name in the template below.
-@@ -674,6 +703,10 @@ parameters:
+@@ -688,6 +725,10 @@ parameters:
type: string
description: Format for CephStorage node hostnames
default: '%stackname%-cephstorage-%index%'
@@ -177,7 +203,7 @@ index 01c0079..210ec11 100644
# Identifiers to trigger tasks on nodes
UpdateIdentifier:
-@@ -756,6 +789,27 @@ resources:
+@@ -770,6 +811,28 @@ resources:
SwiftProxyVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, SwiftProxyNetwork]}]}
PublicVirtualIP: {get_attr: [VipMap, net_ip_map, external]}
@@ -196,6 +222,7 @@ index 01c0079..210ec11 100644
+ OpenDaylightPort: {get_param: OpenDaylightPort}
+ OpenDaylightUsername: {get_param: OpenDaylightUsername}
+ OpenDaylightPassword: {get_param: OpenDaylightPassword}
++ OpenDaylightEnableL3: {get_param: OpenDaylightEnableL3}
+ OpenDaylightHostname:
+ str_replace:
+ template: {get_param: OpenDaylightHostnameFormat}
@@ -205,7 +232,15 @@ index 01c0079..210ec11 100644
Controller:
type: OS::Heat::ResourceGroup
depends_on: Networks
-@@ -839,6 +893,10 @@ resources:
+@@ -832,6 +895,7 @@ resources:
+ NeutronBridgeMappings: {get_param: NeutronBridgeMappings}
+ NeutronExternalNetworkBridge: {get_param: NeutronExternalNetworkBridge}
+ NeutronEnableTunnelling: {get_param: NeutronEnableTunnelling}
++ NeutronEnableForceMetadata: {get_param: NeutronEnableForceMetadata}
+ NeutronNetworkVLANRanges: {get_param: NeutronNetworkVLANRanges}
+ NeutronPublicInterface: {get_param: NeutronPublicInterface}
+ NeutronPublicInterfaceDefaultRoute: {get_param: NeutronPublicInterfaceDefaultRoute}
+@@ -853,6 +917,11 @@ resources:
NovaPassword: {get_param: NovaPassword}
NtpServer: {get_param: NtpServer}
MongoDbNoJournal: {get_param: MongoDbNoJournal}
@@ -213,11 +248,12 @@ index 01c0079..210ec11 100644
+ OpenDaylightInstall: {get_param: OpenDaylightInstall}
+ OpenDaylightUsername: {get_param: OpenDaylightUsername}
+ OpenDaylightPassword: {get_param: OpenDaylightPassword}
++ OpenDaylightEnableL3: {get_param: OpenDaylightEnableL3}
PcsdPassword: {get_resource: PcsdPassword}
PublicVirtualInterface: {get_param: PublicVirtualInterface}
RabbitPassword: {get_param: RabbitPassword}
-@@ -933,6 +991,9 @@ resources:
- NovaPublicIP: {get_attr: [VipMap, net_ip_map, external]}
+@@ -948,6 +1017,9 @@ resources:
+ NovaPublicIP: {get_attr: [PublicVirtualIP, ip_address]}
NovaPassword: {get_param: NovaPassword}
NtpServer: {get_param: NtpServer}
+ OpenDaylightPort: {get_param: OpenDaylightPort}
@@ -226,7 +262,7 @@ index 01c0079..210ec11 100644
RabbitHost: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, RabbitMqNetwork]}]}
RabbitPassword: {get_param: RabbitPassword}
RabbitUserName: {get_param: RabbitUserName}
-@@ -1053,6 +1114,7 @@ resources:
+@@ -1068,6 +1140,7 @@ resources:
compute_hosts: {get_attr: [Compute, hosts_entry]}
controller_hosts: {get_attr: [Controller, hosts_entry]}
controller_ips: {get_attr: [Controller, ip_address]}
@@ -259,7 +295,7 @@ index 2bc519b..98283c2 100644
list_join:
- ','
diff --git a/puppet/compute.yaml b/puppet/compute.yaml
-index e259cff..5527669 100644
+index 70c7403..13fd4f6 100644
--- a/puppet/compute.yaml
+++ b/puppet/compute.yaml
@@ -213,6 +213,23 @@ parameters:
@@ -286,8 +322,36 @@ index e259cff..5527669 100644
RabbitHost:
type: string
default: '' # Has to be here because of the ignored empty value bug
-@@ -415,6 +432,10 @@ resources:
- neutron::rabbit_user: {get_input: rabbit_username}
+@@ -320,6 +337,11 @@ resources:
+ properties:
+ ControlPlaneIP: {get_attr: [NovaCompute, networks, ctlplane, 0]}
+
++ ExternalPort:
++ type: OS::TripleO::Controller::Ports::ExternalPort
++ properties:
++ ControlPlaneIP: {get_attr: [NovaCompute, networks, ctlplane, 0]}
++
+ NetIpMap:
+ type: OS::TripleO::Network::Ports::NetIpMap
+ properties:
+@@ -327,6 +349,7 @@ resources:
+ InternalApiIp: {get_attr: [InternalApiPort, ip_address]}
+ StorageIp: {get_attr: [StoragePort, ip_address]}
+ TenantIp: {get_attr: [TenantPort, ip_address]}
++ ExternalIp: {get_attr: [ExternalPort, ip_address]}
+
+ NetworkConfig:
+ type: OS::TripleO::Compute::Net::SoftwareConfig
+@@ -335,6 +358,7 @@ resources:
+ InternalApiIpSubnet: {get_attr: [InternalApiPort, ip_subnet]}
+ StorageIpSubnet: {get_attr: [StoragePort, ip_subnet]}
+ TenantIpSubnet: {get_attr: [TenantPort, ip_subnet]}
++ ExternalIpSubnet: {get_attr: [ExternalPort, ip_subnet]}
+
+ NetworkDeployment:
+ type: OS::TripleO::SoftwareDeployment
+@@ -406,6 +430,10 @@ resources:
+ neutron::rabbit_user: {get_input: rabbit_user}
neutron::rabbit_use_ssl: {get_input: rabbit_client_use_ssl}
neutron::rabbit_port: {get_input: rabbit_client_port}
+ opendaylight_port: {get_input: opendaylight_port}
@@ -297,7 +361,7 @@ index e259cff..5527669 100644
neutron_flat_networks: {get_input: neutron_flat_networks}
neutron_host: {get_input: neutron_host}
neutron::agents::ml2::ovs::local_ip: {get_input: neutron_local_ip}
-@@ -468,6 +489,10 @@ resources:
+@@ -459,6 +487,10 @@ resources:
snmpd_readonly_user_name: {get_param: SnmpdReadonlyUserName}
snmpd_readonly_user_password: {get_param: SnmpdReadonlyUserPassword}
glance_api_servers: {get_param: [EndpointMap, GlanceInternal, uri]}
@@ -308,11 +372,32 @@ index e259cff..5527669 100644
neutron_flat_networks: {get_param: NeutronFlatNetworks}
neutron_host: {get_param: NeutronHost}
neutron_local_ip: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, NeutronTenantNetwork]}]}
+@@ -570,6 +602,9 @@ outputs:
+ tenant_ip_address:
+ description: IP address of the server in the tenant network
+ value: {get_attr: [TenantPort, ip_address]}
++ external_ip_address:
++ description: IP address of the server in the external network
++ value: {get_attr: [ExternalPort, ip_address]}
+ hostname:
+ description: Hostname of the server
+ value: {get_attr: [NovaCompute, name]}
diff --git a/puppet/controller.yaml b/puppet/controller.yaml
-index fdc1821..865a838 100644
+index ea0b3af..1d52922 100644
--- a/puppet/controller.yaml
+++ b/puppet/controller.yaml
-@@ -443,6 +443,27 @@ parameters:
+@@ -357,6 +357,10 @@ parameters:
+ default: 'True'
+ description: Allow automatic l3-agent failover
+ type: string
++ NeutronEnableForceMetadata:
++ default: 'False'
++ description: If True, DHCP always provides metadata route to VM.
++ type: string
+ NeutronEnableTunnelling:
+ type: string
+ default: "True"
+@@ -443,6 +447,31 @@ parameters:
NtpServer:
type: string
default: ''
@@ -333,6 +418,10 @@ index fdc1821..865a838 100644
+ type: string
+ description: The password for the opendaylight server.
+ hidden: true
++ OpenDaylightEnableL3:
++ description: Knob to enable/disable ODL L3
++ type: string
++ default: 'no'
+ ONOSPort:
+ default: 8181
+ description: Set onos service port
@@ -340,7 +429,15 @@ index fdc1821..865a838 100644
PcsdPassword:
type: string
description: The password for the 'pcsd' user.
-@@ -819,6 +840,11 @@ resources:
+@@ -696,6 +725,7 @@ resources:
+ input_values:
+ bootstack_nodeid: {get_attr: [Controller, name]}
+ neutron_enable_tunneling: {get_param: NeutronEnableTunnelling}
++ neutron_enable_force_metadata: {get_param: NeutronEnableForceMetadata}
+ haproxy_log_address: {get_param: HAProxySyslogAddress}
+ heat.watch_server_url:
+ list_join:
+@@ -805,6 +835,12 @@ resources:
template: tripleo-CLUSTER
params:
CLUSTER: {get_param: MysqlClusterUniquePart}
@@ -348,11 +445,12 @@ index fdc1821..865a838 100644
+ opendaylight_install: {get_param: OpenDaylightInstall}
+ opendaylight_username: {get_param: OpenDaylightUsername}
+ opendaylight_password: {get_param: OpenDaylightPassword}
++ opendaylight_enable_l3: {get_param: OpenDaylightEnableL3}
+ onos_port: {get_param: ONOSPort}
neutron_flat_networks: {get_param: NeutronFlatNetworks}
neutron_metadata_proxy_shared_secret: {get_param: NeutronMetadataProxySharedSecret}
neutron_agent_mode: {get_param: NeutronAgentMode}
-@@ -1151,6 +1177,15 @@ resources:
+@@ -1136,6 +1172,16 @@ resources:
mysql_bind_host: {get_input: mysql_network}
mysql_virtual_ip: {get_input: mysql_virtual_ip}
@@ -361,6 +459,7 @@ index fdc1821..865a838 100644
+ opendaylight_install: {get_input: opendaylight_install}
+ opendaylight_username: {get_input: opendaylight_username}
+ opendaylight_password: {get_input: opendaylight_password}
++ opendaylight_enable_l3: {get_input: opendaylight_enable_l3}
+
+ # ONOS
+ onos_port: {get_input: onos_port}
@@ -368,6 +467,14 @@ index fdc1821..865a838 100644
# Neutron
neutron::bind_host: {get_input: neutron_api_network}
neutron::rabbit_password: {get_input: rabbit_password}
+@@ -1152,6 +1198,7 @@ resources:
+ neutron_flat_networks: {get_input: neutron_flat_networks}
+ neutron::agents::metadata::shared_secret: {get_input: neutron_metadata_proxy_shared_secret}
+ neutron::agents::metadata::metadata_ip: {get_input: neutron_api_network}
++ neutron::agents::dhcp::enable_force_metadata: {get_input: neutron_enable_force_metadata}
+ neutron_agent_mode: {get_input: neutron_agent_mode}
+ neutron_router_distributed: {get_input: neutron_router_distributed}
+ neutron::core_plugin: {get_input: neutron_core_plugin}
diff --git a/puppet/manifests/overcloud_compute.pp b/puppet/manifests/overcloud_compute.pp
index cd41cc7..b8336ee 100644
--- a/puppet/manifests/overcloud_compute.pp
@@ -413,10 +520,10 @@ index cd41cc7..b8336ee 100644
if 'cisco_n1kv' in hiera('neutron_mechanism_drivers') {
diff --git a/puppet/manifests/overcloud_controller.pp b/puppet/manifests/overcloud_controller.pp
-index 1b0429b..d3f3d2d 100644
+index 1f6c2be..7851b45 100644
--- a/puppet/manifests/overcloud_controller.pp
+++ b/puppet/manifests/overcloud_controller.pp
-@@ -30,6 +30,20 @@ if hiera('step') >= 1 {
+@@ -30,6 +30,21 @@ if hiera('step') >= 1 {
if hiera('step') >= 2 {
@@ -424,6 +531,7 @@ index 1b0429b..d3f3d2d 100644
+ class {"opendaylight":
+ extra_features => ['odl-ovsdb-openstack'],
+ odl_rest_port => hiera('opendaylight_port'),
++ enable_l3 => hiera('opendaylight_enable_l3', 'no'),
+ }
+ }
+
@@ -437,7 +545,7 @@ index 1b0429b..d3f3d2d 100644
if count(hiera('ntp::servers')) > 0 {
include ::ntp
}
-@@ -223,9 +237,7 @@
+@@ -223,9 +238,7 @@ if hiera('step') >= 3 {
include ::nova::scheduler
include ::nova::scheduler::filter
@@ -447,7 +555,7 @@ index 1b0429b..d3f3d2d 100644
include ::neutron::agents::dhcp
include ::neutron::agents::metadata
-@@ -238,15 +250,71 @@ if hiera('step') >= 3 {
+@@ -237,15 +250,76 @@ if hiera('step') >= 3 {
require => Package['neutron'],
}
@@ -458,7 +566,11 @@ index 1b0429b..d3f3d2d 100644
+ }
+ } else {
+ include ::neutron
-+ include ::neutron::agents::l3
++ if 'opendaylight' in hiera('neutron_mechanism_drivers') {
++ if ! str2bool(hiera('opendaylight_enable_l3', 'no')) {
++ include ::neutron::agents::l3
++ }
++ }
+ }
+
class { '::neutron::plugins::ml2':
@@ -471,7 +583,9 @@ index 1b0429b..d3f3d2d 100644
- tunnel_types => split(hiera('neutron_tunnel_types'), ','),
+
+ if 'opendaylight' in hiera('neutron_mechanism_drivers') {
-+
++ if ! str2bool(hiera('opendaylight_enable_l3', 'no')) {
++ Service['neutron-server'] -> Service['neutron-l3']
++ }
+ if str2bool(hiera('opendaylight_install', 'false')) {
+ $controller_ips = split(hiera('controller_node_ips'), ',')
+ $opendaylight_controller_ip = $controller_ips[0]
@@ -495,7 +609,6 @@ index 1b0429b..d3f3d2d 100644
+ odl_password => hiera('opendaylight_password'),
+ }
+ }
-+ Service['neutron-server'] -> Service['neutron-l3']
+
+ } elsif 'onos_ml2' in hiera('neutron_mechanism_drivers') {
+ #config ml2_conf.ini with onos url address
@@ -522,7 +635,7 @@ index 1b0429b..d3f3d2d 100644
if 'cisco_n1kv' in hiera('neutron_mechanism_drivers') {
include ::neutron::plugins::ml2::cisco::nexus1000v
-@@ -281,8 +349,6 @@ if hiera('step') >= 3 {
+@@ -280,8 +354,6 @@ if hiera('step') >= 3 {
}
Service['neutron-server'] -> Service['neutron-dhcp-service']
@@ -532,10 +645,10 @@ index 1b0429b..d3f3d2d 100644
include ::cinder
diff --git a/puppet/manifests/overcloud_controller_pacemaker.pp b/puppet/manifests/overcloud_controller_pacemaker.pp
-index 863cc5f..5b1c37a 100644
+index 3fb92f3..9568390 100644
--- a/puppet/manifests/overcloud_controller_pacemaker.pp
+++ b/puppet/manifests/overcloud_controller_pacemaker.pp
-@@ -380,6 +380,20 @@ if hiera('step') >= 2 {
+@@ -380,6 +380,21 @@ if hiera('step') >= 2 {
}
@@ -543,6 +656,7 @@ index 863cc5f..5b1c37a 100644
+ class {"opendaylight":
+ extra_features => ['odl-ovsdb-openstack'],
+ odl_rest_port => hiera('opendaylight_port'),
++ enable_l3 => hiera('opendaylight_enable_l3', 'no'),
+ }
+ }
+
@@ -556,7 +670,7 @@ index 863cc5f..5b1c37a 100644
exec { 'galera-ready' :
command => '/usr/bin/clustercheck >/dev/null',
timeout => 30,
-@@ -584,7 +598,14 @@ if hiera('step') >= 3 {
+@@ -584,7 +599,14 @@ if hiera('step') >= 3 {
include ::nova::network::neutron
# Neutron class definitions
@@ -572,7 +686,7 @@ index 863cc5f..5b1c37a 100644
class { '::neutron::server' :
sync_db => $sync_db,
manage_service => false,
-@@ -595,10 +616,6 @@ if hiera('step') >= 3 {
+@@ -594,10 +616,6 @@ if hiera('step') >= 3 {
manage_service => false,
enabled => false,
}
@@ -583,7 +697,7 @@ index 863cc5f..5b1c37a 100644
class { '::neutron::agents::metadata':
manage_service => false,
enabled => false,
-@@ -610,18 +627,66 @@ if hiera('step') >= 3 {
+@@ -609,18 +627,68 @@ if hiera('step') >= 3 {
notify => Service['neutron-dhcp-service'],
require => Package['neutron'],
}
@@ -616,7 +730,7 @@ index 863cc5f..5b1c37a 100644
+ odl_password => hiera('opendaylight_password'),
+ odl_port => hiera('opendaylight_port'),
+ }
-+
+
+ if str2bool(hiera('opendaylight_install', 'false')) {
+ class { 'neutron::plugins::ovs::opendaylight':
+ odl_controller_ip => $opendaylight_controller_ip,
@@ -626,9 +740,11 @@ index 863cc5f..5b1c37a 100644
+ odl_password => hiera('opendaylight_password'),
+ }
+ }
-+ class { '::neutron::agents::l3' :
-+ manage_service => false,
-+ enabled => false,
++ if ! str2bool(hiera('opendaylight_enable_l3', 'no')) {
++ class { '::neutron::agents::l3' :
++ manage_service => false,
++ enabled => false,
++ }
+ }
+ } elsif 'onos_ml2' in hiera('neutron_mechanism_drivers') {
+ #config ml2_conf.ini with onos url address
@@ -640,7 +756,7 @@ index 863cc5f..5b1c37a 100644
+ 'onos/password': value => 'admin';
+ 'onos/url_path': value => "http://${controller_node_ips[0]}:${onos_port}/onos/vtn";
+ }
-
++
+ } else {
+ class { '::neutron::agents::l3' :
+ manage_service => false,
@@ -656,22 +772,22 @@ index 863cc5f..5b1c37a 100644
if 'cisco_ucsm' in hiera('neutron_mechanism_drivers') {
include ::neutron::plugins::ml2::cisco::ucsm
}
-@@ -646,8 +711,10 @@ if hiera('step') >= 3 {
+@@ -645,8 +713,10 @@ if hiera('step') >= 3 {
if hiera('neutron_enable_bigswitch_ml2', false) {
include ::neutron::plugins::ml2::bigswitch::restproxy
}
- neutron_l3_agent_config {
- 'DEFAULT/ovs_use_veth': value => hiera('neutron_ovs_use_veth', false);
-+ if !('onos_ml2' in hiera('neutron_mechanism_drivers')) {
++ if !('onos_ml2' in hiera('neutron_mechanism_drivers') or str2bool(hiera('opendaylight_enable_l3', 'no'))) {
+ neutron_l3_agent_config {
+ 'DEFAULT/ovs_use_veth': value => hiera('neutron_ovs_use_veth', false);
+ }
}
neutron_dhcp_agent_config {
'DEFAULT/ovs_use_veth': value => hiera('neutron_ovs_use_veth', false);
-@@ -1073,62 +1140,21 @@ if hiera('step') >= 4 {
- require => Pacemaker::Resource::Service[$::keystone::params::service_name]
- }
+@@ -1055,62 +1125,21 @@ if hiera('step') >= 4 {
+ clone_params => 'interleave=true',
+ require => Pacemaker::Resource::Service[$::keystone::params::service_name],
}
- pacemaker::resource::service { $::neutron::params::l3_agent_service:
- clone_params => 'interleave=true',
@@ -736,7 +852,7 @@ index 863cc5f..5b1c37a 100644
pacemaker::constraint::base { 'keystone-to-neutron-server-constraint':
constraint_type => 'order',
first_resource => "${::keystone::params::service_name}-clone",
-@@ -1138,65 +1164,110 @@ if hiera('step') >= 4 {
+@@ -1120,65 +1149,110 @@ if hiera('step') >= 4 {
require => [Pacemaker::Resource::Service[$::keystone::params::service_name],
Pacemaker::Resource::Service[$::neutron::params::server_service]],
}
@@ -865,7 +981,7 @@ index 863cc5f..5b1c37a 100644
- score => 'INFINITY',
- require => [Pacemaker::Resource::Service[$::neutron::params::l3_agent_service],
- Pacemaker::Resource::Service[$::neutron::params::metadata_agent_service]],
-+ if !('onos_ml2' in hiera('neutron_mechanism_drivers')) {
++ if !('onos_ml2' in hiera('neutron_mechanism_drivers') or str2bool(hiera('opendaylight_enable_l3', 'no'))) {
+ pacemaker::constraint::base { 'neutron-dhcp-agent-to-l3-agent-constraint':
+ constraint_type => 'order',
+ first_resource => "${::neutron::params::dhcp_agent_service}-clone",
@@ -897,7 +1013,7 @@ index 863cc5f..5b1c37a 100644
+ score => 'INFINITY',
+ require => [Pacemaker::Resource::Service[$::neutron::params::l3_agent_service],
+ Pacemaker::Resource::Service[$::neutron::params::metadata_agent_service]],
-+ }
++ }
}
-
# Nova
@@ -905,10 +1021,10 @@ index 863cc5f..5b1c37a 100644
clone_params => 'interleave=true',
diff --git a/puppet/manifests/overcloud_opendaylight.pp b/puppet/manifests/overcloud_opendaylight.pp
new file mode 100644
-index 0000000..aea6568
+index 0000000..33f609a
--- /dev/null
+++ b/puppet/manifests/overcloud_opendaylight.pp
-@@ -0,0 +1,26 @@
+@@ -0,0 +1,27 @@
+# Copyright 2015 Red Hat, Inc.
+# All Rights Reserved.
+#
@@ -933,14 +1049,15 @@ index 0000000..aea6568
+class {"opendaylight":
+ extra_features => ['odl-ovsdb-openstack'],
+ odl_rest_port => hiera('opendaylight_port'),
++ enable_l3 => hiera('opendaylight_enable_l3', 'no'),
+}
+
diff --git a/puppet/opendaylight-puppet.yaml b/puppet/opendaylight-puppet.yaml
new file mode 100644
-index 0000000..70f2543
+index 0000000..b876dc7
--- /dev/null
+++ b/puppet/opendaylight-puppet.yaml
-@@ -0,0 +1,209 @@
+@@ -0,0 +1,217 @@
+heat_template_version: 2015-04-30
+
+description: >
@@ -968,6 +1085,10 @@ index 0000000..70f2543
+ description: The admin password for the OpenDaylight node
+ type: string
+ hidden: true
++ OpenDaylightEnableL3:
++ description: Knob to enable/disable ODL L3
++ type: string
++ default: 'no'
+ OpenDaylightPort:
+ default: 8081
+ description: Set OpenDaylight service port
@@ -1066,6 +1187,9 @@ index 0000000..70f2543
+ params:
+ server: {get_param: NtpServer}
+ opendaylight_port: {get_param: OpenDaylightPort}
++ opendaylight_enable_l3: {get_param: OpenDaylightEnableL3}
++ opendaylight_username: {get_param: OpenDaylightUsername}
++ opendaylight_password: {get_param: OpenDaylightPassword}
+
+ OpenDaylightConfig:
+ type: OS::Heat::StructuredConfig
@@ -1090,6 +1214,7 @@ index 0000000..70f2543
+ opendaylight::admin_username: {get_param: OpenDaylightUsername}
+ opendaylight::admin_password: {get_param: OpenDaylightPassword}
+ opendaylight_port: {get_input: opendaylight_port}
++ opendaylight_enable_l3: {get_input: opendaylight_enable_l3}
+ ceph:
+ raw_data: {get_file: hieradata/ceph.yaml}
+
diff --git a/build/puppet-neutron-force-metadata.patch b/build/puppet-neutron-force-metadata.patch
new file mode 100644
index 0000000..df6061b
--- /dev/null
+++ b/build/puppet-neutron-force-metadata.patch
@@ -0,0 +1,50 @@
+From ca931831dbfe876095357acbf39dca17c3d3df71 Mon Sep 17 00:00:00 2001
+From: root <root@overcloud-controller-0.localdomain>
+Date: Sun, 17 Jan 2016 03:07:49 +0000
+Subject: [PATCH] Adds force metadata option
+
+---
+ manifests/agents/dhcp.pp | 10 ++++++++--
+ 1 file changed, 8 insertions(+), 2 deletions(-)
+
+diff --git a/manifests/agents/dhcp.pp b/manifests/agents/dhcp.pp
+index 0c10492..cf772b5 100644
+--- a/manifests/agents/dhcp.pp
++++ b/manifests/agents/dhcp.pp
+@@ -53,6 +53,10 @@
+ # (optional) enable metadata support on isolated networks.
+ # Defaults to false.
+ #
++# [*enable_force_metadata*]
++# (optional) enable metadata support on all networks.
++# Defaults to false.
++#
+ # [*enable_metadata_network*]
+ # (optional) Allows for serving metadata requests coming from a dedicated metadata
+ # access network whose cidr is 169.254.169.254/16 (or larger prefix), and is
+@@ -86,6 +90,7 @@ class neutron::agents::dhcp (
+ $dnsmasq_config_file = undef,
+ $dhcp_delete_namespaces = true,
+ $enable_isolated_metadata = false,
++ $enable_force_metadata = false,
+ $enable_metadata_network = false,
+ $dhcp_broadcast_reply = false,
+ # DEPRECATED PARAMETERS
+@@ -110,11 +115,12 @@ class neutron::agents::dhcp (
+ }
+ }
+
+- if (! $enable_isolated_metadata) and $enable_metadata_network {
+- fail('enable_metadata_network to true requires enable_isolated_metadata also enabled.')
++ if (! ($enable_isolated_metadata or $enable_force_metadata)) and $enable_metadata_network {
++ fail('enable_metadata_network to true requires enable_isolated_metadata or enable_force_metadata also enabled.')
+ } else {
+ neutron_dhcp_agent_config {
+ 'DEFAULT/enable_isolated_metadata': value => $enable_isolated_metadata;
++ 'DEFAULT/force_metadata': value => $enable_force_metadata;
+ 'DEFAULT/enable_metadata_network': value => $enable_metadata_network;
+ }
+ }
+--
+1.8.3.1
+
diff --git a/ci/deploy.sh b/ci/deploy.sh
index 6ac6aff..e99f4b2 100755
--- a/ci/deploy.sh
+++ b/ci/deploy.sh
@@ -651,6 +651,11 @@ function configure_network_environment {
sed -i 's#^.*Compute::Ports::StoragePort:.*$# OS::TripleO::Compute::Ports::StoragePort: '${tht_dir}'/ports/noop.yaml#' $1
fi
+ # check for ODL L3
+ if [ ${deploy_options_array['sdn_l3']} == 'true' ]; then
+ nic_ext+=_br-ex
+ fi
+
# set nics appropriately
sed -i 's#^.*Compute::Net::SoftwareConfig:.*$# OS::TripleO::Compute::Net::SoftwareConfig: nics/compute'${nic_ext}'.yaml#' $1
sed -i 's#^.*Controller::Net::SoftwareConfig:.*$# OS::TripleO::Controller::Net::SoftwareConfig: nics/controller'${nic_ext}'.yaml#' $1
@@ -764,9 +769,12 @@ sleep 15
##preping it for deployment and launch the deploy
##params: none
function undercloud_prep_overcloud_deploy {
- # TODO ADD ODL L3 logic here
if [[ ${#deploy_options_array[@]} -eq 0 || ${deploy_options_array['sdn_controller']} == 'opendaylight' ]]; then
- DEPLOY_OPTIONS+=" -e /usr/share/openstack-tripleo-heat-templates/environments/opendaylight.yaml"
+ if [ ${deploy_options_array['sdn_l3']} == 'true' ]; then
+ DEPLOY_OPTIONS+=" -e /usr/share/openstack-tripleo-heat-templates/environments/opendaylight_l3.yaml"
+ else
+ DEPLOY_OPTIONS+=" -e /usr/share/openstack-tripleo-heat-templates/environments/opendaylight.yaml"
+ fi
elif [ ${deploy_options_array['sdn_controller']} == 'opendaylight-external' ]; then
DEPLOY_OPTIONS+=" -e /usr/share/openstack-tripleo-heat-templates/environments/opendaylight-external.yaml"
elif [ ${deploy_options_array['sdn_controller']} == 'onos' ]; then
@@ -798,6 +806,8 @@ function undercloud_prep_overcloud_deploy {
DEPLOY_OPTIONS+=" --control-flavor control --compute-flavor compute"
fi
+ echo -e "${blue}INFO: Deploy options set:\n${DEPLOY_OPTIONS}${reset}"
+
ssh -T ${SSH_OPTIONS[@]} "stack@$UNDERCLOUD" <<EOI
source stackrc
set -o errexit