From 4d13a3def468bdf620034a65f4f90ea51dde95af Mon Sep 17 00:00:00 2001
From: Takashi Kajinami <tkajinam@redhat.com>
Date: Fri, 4 Feb 2022 17:28:05 +0900
Subject: [PATCH] Allow managing ovs bridges separately

This change introduces capability to manage ovs bridges by external
manifests or external tooling, to allow more flexible configuration
which is not available by current interface in ovn::controller.

Change-Id: I7d9be48f99e4f66a08e5dc578cd734c2eaff7eb2
---
 manifests/controller.pp                       | 23 ++++++++++++-------
 .../manage_ovs_bridge-a44d87218958e680.yaml   |  6 +++++
 spec/classes/ovn_controller_spec.rb           | 13 +++++++++++
 3 files changed, 34 insertions(+), 8 deletions(-)
 create mode 100644 releasenotes/notes/manage_ovs_bridge-a44d87218958e680.yaml

diff --git a/manifests/controller.pp b/manifests/controller.pp
index ded64ce..43cbc47 100644
--- a/manifests/controller.pp
+++ b/manifests/controller.pp
@@ -87,6 +87,10 @@
 #  monitor the records that is needed in the current chassis.
 #  Default to false (keep the original behavior)
 #
+# [*manage_ovs_bridge*]
+#  (optional) Create ovs bridges according to ovn_bridge_mappings.
+#  Defaults to true
+#
 class ovn::controller(
   $ovn_remote,
   $ovn_encap_ip,
@@ -104,6 +108,7 @@ class ovn::controller(
   $enable_ovn_match_northd     = false,
   $ovn_chassis_mac_map         = [],
   $ovn_monitor_all             = false,
+  $manage_ovs_bridge           = true
 ) {
 
   include ovn::params
@@ -168,13 +173,15 @@ class ovn::controller(
       'external_ids:ovn-bridge-mappings' => { 'value' => join(any2array($ovn_bridge_mappings), ',') }
     }
 
-    ovn::controller::bridge { $ovn_bridge_mappings:
-      before  => Service['controller'],
-      require => Service['openvswitch']
-    }
-    ovn::controller::port { $bridge_interface_mappings:
-      before  => Service['controller'],
-      require => Service['openvswitch']
+    if $manage_ovs_bridge {
+      ovn::controller::bridge { $ovn_bridge_mappings:
+        before  => Service['controller'],
+        require => Service['openvswitch']
+      }
+      ovn::controller::port { $bridge_interface_mappings:
+        before  => Service['controller'],
+        require => Service['openvswitch']
+      }
     }
   } else {
     $bridge_items = {
@@ -214,7 +221,7 @@ class ovn::controller(
     $ovn_bridge_mappings.each |String $mappings| {
       $mapping = split($mappings, ':')
       $br = $mapping[1]
-      if !empty($br) {
+      if !empty($br) and $manage_ovs_bridge {
         # TODO(numans): Right now puppet-vswitch's vs_bridge doesn't support
         # setting the column 'other-config' for the Bridge table.
         # Switch to using vs_bridge once the support is available.
diff --git a/releasenotes/notes/manage_ovs_bridge-a44d87218958e680.yaml b/releasenotes/notes/manage_ovs_bridge-a44d87218958e680.yaml
new file mode 100644
index 0000000..1645048
--- /dev/null
+++ b/releasenotes/notes/manage_ovs_bridge-a44d87218958e680.yaml
@@ -0,0 +1,6 @@
+---
+features:
+  - |
+    The new ``ovn::controller::manage_ovs_bridge`` parameter has been added.
+    Setting this parameter to ``false``, the ``ovn::controller`` does not
+    manage ovs bridges and ports associated with bridges.
diff --git a/spec/classes/ovn_controller_spec.rb b/spec/classes/ovn_controller_spec.rb
index 6d10341..c249cfb 100644
--- a/spec/classes/ovn_controller_spec.rb
+++ b/spec/classes/ovn_controller_spec.rb
@@ -150,6 +150,19 @@ describe 'ovn::controller' do
         )
       end
     end
+
+    context 'when manage_ovs_bridge is false' do
+      before :each do
+        params.merge!({
+          :manage_ovs_bridge => false,
+        })
+      end
+
+      it 'does not manage ovs bridge' do
+        is_expected.to_not contain_ovn__controller__bridge(params[:ovn_bridge_mappings].join(','))
+        is_expected.to_not contain_ovn__controller__port(params[:bridge_interface_mappings].join(','))
+      end
+    end
   end
 
   on_supported_os({