From e9a1122b3bbb9e58cb25aaa744fa6f8ca42e10fd Mon Sep 17 00:00:00 2001
From: Daniel Alvarez <dalvarez@redhat.com>
Date: Thu, 21 Dec 2017 13:03:16 +0100
Subject: [PATCH] Add support for DVR in OVN based environments

This patch adds the ability to configure DVR in
networking-ovn setups.

Depends-On: I565a5b9918eaf9df1d315c653f76dc4136953ca9

Change-Id: I14d3411f62b411010ea4bd270746436fe3e3cd3a
Signed-off-by: Daniel Alvarez <dalvarez@redhat.com>
---
 environments/neutron-ml2-ovn-dvr-ha.yaml      | 27 +++++++++++++++++++
 environments/neutron-ml2-ovn-dvr.yaml         | 26 ++++++++++++++++++
 .../services-docker/neutron-ovn-dvr-ha.yaml   | 26 ++++++++++++++++++
 .../services-docker/neutron-ovn-dvr.yaml      | 26 ++++++++++++++++++
 puppet/services/neutron-plugin-ml2-ovn.yaml   |  5 ++++
 5 files changed, 110 insertions(+)
 create mode 100644 environments/neutron-ml2-ovn-dvr-ha.yaml
 create mode 100644 environments/neutron-ml2-ovn-dvr.yaml
 create mode 100644 environments/services-docker/neutron-ovn-dvr-ha.yaml
 create mode 100644 environments/services-docker/neutron-ovn-dvr.yaml

diff --git a/environments/neutron-ml2-ovn-dvr-ha.yaml b/environments/neutron-ml2-ovn-dvr-ha.yaml
new file mode 100644
index 0000000000..c21ba3c89f
--- /dev/null
+++ b/environments/neutron-ml2-ovn-dvr-ha.yaml
@@ -0,0 +1,27 @@
+# A Heat environment file which can be used to enable OVN
+# extensions, configured via puppet
+resource_registry:
+  OS::TripleO::Services::NeutronCorePlugin: OS::TripleO::Services::NeutronCorePluginML2OVN
+  OS::TripleO::Services::OVNController: ../puppet/services/ovn-controller.yaml
+  OS::TripleO::Services::OVNDBs: ../puppet/services/pacemaker/ovn-dbs.yaml
+# Disabling Neutron services that overlap with OVN
+  OS::TripleO::Services::NeutronOvsAgent: OS::Heat::None
+  OS::TripleO::Services::ComputeNeutronOvsAgent: OS::Heat::None
+  OS::TripleO::Services::NeutronL3Agent: OS::Heat::None
+  OS::TripleO::Services::NeutronMetadataAgent: OS::Heat::None
+  OS::TripleO::Services::NeutronDhcpAgent: OS::Heat::None
+  OS::TripleO::Services::ComputeNeutronCorePlugin: OS::Heat::None
+
+parameter_defaults:
+  NeutronMechanismDrivers: ovn
+  OVNVifType: ovs
+  OVNNeutronSyncMode: log
+  OVNQosDriver: ovn-qos
+  OVNTunnelEncapType: geneve
+  NeutronEnableDHCPAgent: false
+  NeutronTypeDrivers: 'geneve,vlan,flat'
+  NeutronNetworkType: 'geneve'
+  NeutronServicePlugins: 'qos,ovn-router,trunk'
+  NeutronVniRanges: ['1:65536', ]
+  NeutronEnableDVR: true
+
diff --git a/environments/neutron-ml2-ovn-dvr.yaml b/environments/neutron-ml2-ovn-dvr.yaml
new file mode 100644
index 0000000000..076d66d770
--- /dev/null
+++ b/environments/neutron-ml2-ovn-dvr.yaml
@@ -0,0 +1,26 @@
+# A Heat environment file which can be used to enable OVN
+# extensions, configured via puppet
+resource_registry:
+  OS::TripleO::Services::NeutronCorePlugin: OS::TripleO::Services::NeutronCorePluginML2OVN
+  OS::TripleO::Services::OVNController: ../puppet/services/ovn-controller.yaml
+  OS::TripleO::Services::OVNDBs: ../puppet/services/ovn-dbs.yaml
+# Disabling Neutron services that overlap with OVN
+  OS::TripleO::Services::NeutronOvsAgent: OS::Heat::None
+  OS::TripleO::Services::ComputeNeutronOvsAgent: OS::Heat::None
+  OS::TripleO::Services::NeutronDhcpAgent: OS::Heat::None
+  OS::TripleO::Services::NeutronL3Agent: OS::Heat::None
+  OS::TripleO::Services::NeutronMetadataAgent: OS::Heat::None
+  OS::TripleO::Services::ComputeNeutronCorePlugin: OS::Heat::None
+
+parameter_defaults:
+  NeutronMechanismDrivers: ovn
+  OVNVifType: ovs
+  OVNNeutronSyncMode: log
+  OVNQosDriver: ovn-qos
+  OVNTunnelEncapType: geneve
+  NeutronEnableDHCPAgent: false
+  NeutronTypeDrivers: 'geneve,vlan,flat'
+  NeutronNetworkType: 'geneve'
+  NeutronServicePlugins: 'qos,ovn-router,trunk'
+  NeutronVniRanges: ['1:65536', ]
+  NeutronEnableDVR: true
diff --git a/environments/services-docker/neutron-ovn-dvr-ha.yaml b/environments/services-docker/neutron-ovn-dvr-ha.yaml
new file mode 100644
index 0000000000..5feeb68c36
--- /dev/null
+++ b/environments/services-docker/neutron-ovn-dvr-ha.yaml
@@ -0,0 +1,26 @@
+# A Heat environment that can be used to deploy OVN services with non HA OVN DB servers.
+resource_registry:
+  OS::TripleO::Docker::NeutronMl2PluginBase: ../../puppet/services/neutron-plugin-ml2-ovn.yaml
+  OS::TripleO::Services::OVNController: ../../docker/services/ovn-controller.yaml
+  OS::TripleO::Services::OVNDBs: ../../docker/services/pacemaker/ovn-dbs.yaml
+# Disabling Neutron services that overlap with OVN
+  OS::TripleO::Services::NeutronOvsAgent: OS::Heat::None
+  OS::TripleO::Services::ComputeNeutronOvsAgent: OS::Heat::None
+  OS::TripleO::Services::NeutronL3Agent: OS::Heat::None
+  OS::TripleO::Services::NeutronMetadataAgent: OS::Heat::None
+  OS::TripleO::Services::NeutronDhcpAgent: OS::Heat::None
+  OS::TripleO::Services::ComputeNeutronCorePlugin: OS::Heat::None
+
+
+parameter_defaults:
+  NeutronMechanismDrivers: ovn
+  OVNVifType: ovs
+  OVNNeutronSyncMode: log
+  OVNQosDriver: ovn-qos
+  OVNTunnelEncapType: geneve
+  NeutronEnableDHCPAgent: false
+  NeutronTypeDrivers: 'geneve,vlan,flat'
+  NeutronNetworkType: 'geneve'
+  NeutronServicePlugins: 'qos,ovn-router,trunk'
+  NeutronVniRanges: ['1:65536', ]
+  NeutronEnableDVR: true
diff --git a/environments/services-docker/neutron-ovn-dvr.yaml b/environments/services-docker/neutron-ovn-dvr.yaml
new file mode 100644
index 0000000000..39bb03258d
--- /dev/null
+++ b/environments/services-docker/neutron-ovn-dvr.yaml
@@ -0,0 +1,26 @@
+# A Heat environment that can be used to deploy OVN services with non HA OVN DB servers.
+resource_registry:
+  OS::TripleO::Docker::NeutronMl2PluginBase: ../../puppet/services/neutron-plugin-ml2-ovn.yaml
+  OS::TripleO::Services::OVNController: ../../docker/services/ovn-controller.yaml
+  OS::TripleO::Services::OVNDBs: ../../docker/services/ovn-dbs.yaml
+# Disabling Neutron services that overlap with OVN
+  OS::TripleO::Services::NeutronOvsAgent: OS::Heat::None
+  OS::TripleO::Services::ComputeNeutronOvsAgent: OS::Heat::None
+  OS::TripleO::Services::NeutronL3Agent: OS::Heat::None
+  OS::TripleO::Services::NeutronMetadataAgent: OS::Heat::None
+  OS::TripleO::Services::NeutronDhcpAgent: OS::Heat::None
+  OS::TripleO::Services::ComputeNeutronCorePlugin: OS::Heat::None
+
+
+parameter_defaults:
+  NeutronMechanismDrivers: ovn
+  OVNVifType: ovs
+  OVNNeutronSyncMode: log
+  OVNQosDriver: ovn-qos
+  OVNTunnelEncapType: geneve
+  NeutronEnableDHCPAgent: false
+  NeutronTypeDrivers: 'geneve,vlan,flat'
+  NeutronNetworkType: 'geneve'
+  NeutronServicePlugins: 'qos,ovn-router,trunk'
+  NeutronVniRanges: ['1:65536', ]
+  NeutronEnableDVR: true
diff --git a/puppet/services/neutron-plugin-ml2-ovn.yaml b/puppet/services/neutron-plugin-ml2-ovn.yaml
index 45a2164f88..1c80d0d5a6 100644
--- a/puppet/services/neutron-plugin-ml2-ovn.yaml
+++ b/puppet/services/neutron-plugin-ml2-ovn.yaml
@@ -63,6 +63,10 @@ parameters:
     description: Geneve encapsulation header size
     type: number
     default: 38
+  NeutronEnableDVR:
+    description: Enable Neutron DVR.
+    default: false
+    type: boolean
 
 resources:
 
@@ -91,5 +95,6 @@ outputs:
             neutron::plugins::ml2::ovn::vif_type: {get_param: OVNVifType}
             neutron::server::qos_notification_drivers: {get_param: OVNQosDriver}
             neutron::plugins::ml2::max_header_size: {get_param: NeutronGeneveMaxHeaderSize}
+            neutron::plugins::ml2::ovn::dvr_enabled: {get_param: NeutronEnableDVR}
       step_config: |
         include ::tripleo::profile::base::neutron::plugins::ml2