From 340a9ec434ac376d0c852155a2edd4ca6ad85fc6 Mon Sep 17 00:00:00 2001
From: Pete Birley <pete@port.direct>
Date: Sun, 25 Feb 2018 00:11:36 -0500
Subject: [PATCH] Networking: dynamic backend support

This PS allows the neutron and nova charts to dynamicly adapt to
various backends.

Depends-On: I0ec13f45fd4561fec59d08b08eb78390a3866156

Change-Id: I1891af4b0e49237e229ff5e61e907dc3e413cf87
---
 .zuul.yaml                                    | 46 +++++++++++--
 .../templates/utils/_dependency_resolver.tpl  | 28 ++++++++
 ...tron-linuxbridge-agent-init-modules.sh.tpl |  1 +
 neutron/templates/configmap-etc.yaml          | 36 ++++++++++
 neutron/templates/daemonset-dhcp-agent.yaml   |  4 +-
 neutron/templates/daemonset-l3-agent.yaml     |  4 +-
 neutron/templates/daemonset-lb-agent.yaml     |  6 +-
 .../templates/daemonset-metadata-agent.yaml   |  4 +-
 neutron/templates/daemonset-ovs-agent.yaml    |  6 +-
 neutron/templates/deployment-server.yaml      |  4 +-
 neutron/values.yaml                           | 59 +++++++++++------
 nova/templates/daemonset-compute.yaml         |  5 +-
 nova/values.yaml                              | 13 +++-
 tools/deployment/common/memcached.sh          |  4 +-
 tools/deployment/developer/ceph/040-ceph.sh   |  4 +-
 .../developer/ceph/045-ceph-ns-activate.sh    |  4 +-
 .../developer/ceph/110-ceph-radosgateway.sh   |  4 +-
 tools/deployment/developer/ceph/120-glance.sh |  4 +-
 tools/deployment/developer/ceph/130-cinder.sh |  4 +-
 .../deployment/developer/ceph/150-libvirt.sh  |  4 +-
 .../developer/ceph/160-compute-kit.sh         | 13 ++--
 .../developer/common/030-ingress.sh           |  4 +-
 .../developer/common/050-mariadb.sh           |  4 +-
 .../developer/common/060-rabbitmq.sh          |  4 +-
 .../developer/common/080-keystone.sh          |  4 +-
 tools/deployment/developer/common/090-heat.sh |  4 +-
 .../developer/common/100-horizon.sh           |  4 +-
 .../developer/common/140-openvswitch.sh       |  4 +-
 tools/deployment/developer/nfs/120-glance.sh  |  4 +-
 tools/deployment/developer/nfs/150-libvirt.sh |  4 +-
 .../developer/nfs/160-compute-kit.sh          | 13 +++-
 tools/gate/playbooks/dev-deploy-ceph.yaml     | 55 +++++++++++++++-
 tools/gate/playbooks/dev-deploy-nfs.yaml      | 50 ++++++++++++++
 tools/gate/playbooks/kolla-deploy-ceph.yaml   | 38 +++++------
 .../backends/networking/linuxbridge.yaml      | 21 ++++++
 .../example/keystone_domain_config.yaml       |  5 --
 tools/overrides/mvp/README.rst                | 15 -----
 tools/overrides/mvp/neutron-linuxbridge.yaml  | 65 -------------------
 38 files changed, 375 insertions(+), 180 deletions(-)
 create mode 100644 helm-toolkit/templates/utils/_dependency_resolver.tpl
 create mode 100644 tools/overrides/backends/networking/linuxbridge.yaml
 delete mode 100644 tools/overrides/mvp/README.rst
 delete mode 100644 tools/overrides/mvp/neutron-linuxbridge.yaml

diff --git a/.zuul.yaml b/.zuul.yaml
index db39e96738..b8bc74384d 100644
--- a/.zuul.yaml
+++ b/.zuul.yaml
@@ -16,12 +16,24 @@
     check:
       jobs:
         - openstack-helm-linter
-        - openstack-helm-dev-deploy-ceph:
+        - openstack-helm-dev-deploy-ceph-ovs:
             irrelevant-files:
               - ^.*\.rst$
               - ^doc/.*$
               - ^releasenotes/.*$
-        - openstack-helm-dev-deploy-nfs:
+        - openstack-helm-dev-deploy-nfs-ovs:
+            irrelevant-files:
+              - ^.*\.rst$
+              - ^doc/.*$
+              - ^releasenotes/.*$
+        - openstack-helm-dev-deploy-ceph-lb:
+            voting: false
+            irrelevant-files:
+              - ^.*\.rst$
+              - ^doc/.*$
+              - ^releasenotes/.*$
+        - openstack-helm-dev-deploy-nfs-lb:
+            voting: false
             irrelevant-files:
               - ^.*\.rst$
               - ^doc/.*$
@@ -69,12 +81,12 @@
               - ^.*\.rst$
               - ^doc/.*$
               - ^releasenotes/.*$
-        - openstack-helm-dev-deploy-ceph:
+        - openstack-helm-dev-deploy-ceph-ovs:
             irrelevant-files:
               - ^.*\.rst$
               - ^doc/.*$
               - ^releasenotes/.*$
-        - openstack-helm-dev-deploy-nfs:
+        - openstack-helm-dev-deploy-nfs-ovs:
             irrelevant-files:
               - ^.*\.rst$
               - ^doc/.*$
@@ -108,12 +120,34 @@
     nodeset: openstack-helm-single-node
 
 - job:
-    name: openstack-helm-dev-deploy-ceph
+    name: openstack-helm-dev-deploy-ceph-ovs
+    vars:
+      osh_neutron_backend: openvswitch
     parent: openstack-helm-dev-deploy
     run: tools/gate/playbooks/dev-deploy-ceph.yaml
 
 - job:
-    name: openstack-helm-dev-deploy-nfs
+    name: openstack-helm-dev-deploy-nfs-ovs
+    vars:
+      osh_neutron_backend: openvswitch
+    parent: openstack-helm-dev-deploy
+    run: tools/gate/playbooks/dev-deploy-nfs.yaml
+
+- job:
+    name: openstack-helm-dev-deploy-ceph-lb
+    vars:
+      osh_neutron_backend: linuxbridge
+      zuul_osh_infra_relative_path: ../openstack-helm-infra/
+      zuul_osh_extra_helm_args_relative_path: --values=./tools/overrides/backends/networking/linuxbridge.yaml
+    parent: openstack-helm-dev-deploy
+    run: tools/gate/playbooks/dev-deploy-ceph.yaml
+
+- job:
+    name: openstack-helm-dev-deploy-nfs-lb
+    vars:
+      osh_neutron_backend: linuxbridge
+      zuul_osh_infra_relative_path: ../openstack-helm-infra/
+      zuul_osh_extra_helm_args_relative_path: --values=./tools/overrides/backends/networking/linuxbridge.yaml
     parent: openstack-helm-dev-deploy
     run: tools/gate/playbooks/dev-deploy-nfs.yaml
 
diff --git a/helm-toolkit/templates/utils/_dependency_resolver.tpl b/helm-toolkit/templates/utils/_dependency_resolver.tpl
new file mode 100644
index 0000000000..45a74fe836
--- /dev/null
+++ b/helm-toolkit/templates/utils/_dependency_resolver.tpl
@@ -0,0 +1,28 @@
+{{/*
+Copyright 2017 The Openstack-Helm Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/}}
+
+{{- define "helm-toolkit.utils.dependency_resolver" }}
+{{- $envAll := index . "envAll" -}}
+{{- $dependencyMixinParam := index . "dependencyMixinParam" -}}
+{{- $dependencyKey := index . "dependencyKey" -}}
+{{- if $dependencyMixinParam -}}
+{{- $_ := set $envAll.Values "pod_dependency" dict -}}
+{{- $_ := include "helm-toolkit.utils.merge" (tuple $envAll.Values.pod_dependency ( index $envAll.Values.dependencies.static $dependencyKey ) ( index $envAll.Values.dependencies.dynamic.targeted $dependencyMixinParam $dependencyKey ) ) -}}
+{{- else -}}
+{{- $_ := set $envAll.Values "pod_dependency" ( index $envAll.Values.dependencies.static $dependencyKey ) -}}
+{{- end -}}
+{{ $envAll.Values.pod_dependency | toYaml }}
+{{- end }}
diff --git a/neutron/templates/bin/_neutron-linuxbridge-agent-init-modules.sh.tpl b/neutron/templates/bin/_neutron-linuxbridge-agent-init-modules.sh.tpl
index 7926dbd711..b235325335 100644
--- a/neutron/templates/bin/_neutron-linuxbridge-agent-init-modules.sh.tpl
+++ b/neutron/templates/bin/_neutron-linuxbridge-agent-init-modules.sh.tpl
@@ -17,5 +17,6 @@ limitations under the License.
 */}}
 
 set -ex
+chroot /mnt/host-rootfs modprobe bridge
 chroot /mnt/host-rootfs modprobe ip6_tables
 chroot /mnt/host-rootfs modprobe ebtables
diff --git a/neutron/templates/configmap-etc.yaml b/neutron/templates/configmap-etc.yaml
index 07c8a64f87..069599e3a3 100644
--- a/neutron/templates/configmap-etc.yaml
+++ b/neutron/templates/configmap-etc.yaml
@@ -92,6 +92,42 @@ limitations under the License.
 {{- tuple "oslo_cache" "internal" "memcache" . | include "helm-toolkit.endpoints.host_and_port_endpoint_uri_lookup" | set .Values.conf.metadata_agent.cache "memcache_servers" | quote | trunc 0 -}}
 {{- end -}}
 
+{{- if empty .Values.conf.neutron.DEFAULT.interface_driver -}}
+{{- if eq .Values.network.backend "ovs" -}}
+{{- set .Values.conf.neutron.DEFAULT "interface_driver" "openvswitch" | quote | trunc 0 -}}
+{{- end -}}
+{{- if eq .Values.network.backend "linuxbridge" -}}
+{{- set .Values.conf.neutron.DEFAULT "interface_driver" "linuxbridge" | quote | trunc 0 -}}
+{{- end -}}
+{{- end -}}
+
+{{- if empty .Values.conf.dhcp_agent.DEFAULT.interface_driver -}}
+{{- if eq .Values.network.backend "ovs" -}}
+{{- set .Values.conf.dhcp_agent.DEFAULT "interface_driver" "openvswitch" | quote | trunc 0 -}}
+{{- end -}}
+{{- if eq .Values.network.backend "linuxbridge" -}}
+{{- set .Values.conf.dhcp_agent.DEFAULT "interface_driver" "linuxbridge" | quote | trunc 0 -}}
+{{- end -}}
+{{- end -}}
+
+{{- if empty .Values.conf.l3_agent.DEFAULT.interface_driver -}}
+{{- if eq .Values.network.backend "ovs" -}}
+{{- set .Values.conf.l3_agent.DEFAULT "interface_driver" "openvswitch" | quote | trunc 0 -}}
+{{- end -}}
+{{- if eq .Values.network.backend "linuxbridge" -}}
+{{- set .Values.conf.l3_agent.DEFAULT "interface_driver" "linuxbridge" | quote | trunc 0 -}}
+{{- end -}}
+{{- end -}}
+
+{{- if empty .Values.conf.plugins.ml2_conf.ml2.mechanism_drivers -}}
+{{- if eq .Values.network.backend "ovs" -}}
+{{- set .Values.conf.plugins.ml2_conf.ml2 "mechanism_drivers" "openvswitch,l2population" | quote | trunc 0 -}}
+{{- end -}}
+{{- if eq .Values.network.backend "linuxbridge" -}}
+{{- set .Values.conf.plugins.ml2_conf.ml2 "mechanism_drivers" "linuxbridge,l2population" | quote | trunc 0 -}}
+{{- end -}}
+{{- end -}}
+
 ---
 apiVersion: v1
 kind: ConfigMap
diff --git a/neutron/templates/daemonset-dhcp-agent.yaml b/neutron/templates/daemonset-dhcp-agent.yaml
index 7117ceb187..97b73d4536 100644
--- a/neutron/templates/daemonset-dhcp-agent.yaml
+++ b/neutron/templates/daemonset-dhcp-agent.yaml
@@ -16,7 +16,9 @@ limitations under the License.
 
 {{- if .Values.manifests.daemonset_dhcp_agent }}
 {{- $envAll := . }}
-{{- $dependencies := .Values.dependencies.static.dhcp }}
+
+{{- $dependencyOpts := dict "envAll" $envAll "dependencyMixinParam" $envAll.Values.network.backend "dependencyKey" "dhcp" -}}
+{{- $dependencies := include "helm-toolkit.utils.dependency_resolver" $dependencyOpts | toString | fromYaml }}
 
 {{- $mounts_neutron_dhcp_agent := .Values.pod.mounts.neutron_dhcp_agent.neutron_dhcp_agent }}
 {{- $mounts_neutron_dhcp_agent_init := .Values.pod.mounts.neutron_dhcp_agent.init_container }}
diff --git a/neutron/templates/daemonset-l3-agent.yaml b/neutron/templates/daemonset-l3-agent.yaml
index 86d303571d..2c6afc7ac8 100644
--- a/neutron/templates/daemonset-l3-agent.yaml
+++ b/neutron/templates/daemonset-l3-agent.yaml
@@ -16,7 +16,9 @@ limitations under the License.
 
 {{- if .Values.manifests.daemonset_l3_agent }}
 {{- $envAll := . }}
-{{- $dependencies := .Values.dependencies.static.l3 }}
+
+{{- $dependencyOpts := dict "envAll" $envAll "dependencyMixinParam" $envAll.Values.network.backend "dependencyKey" "l3" -}}
+{{- $dependencies := include "helm-toolkit.utils.dependency_resolver" $dependencyOpts | toString | fromYaml }}
 
 {{- $mounts_neutron_l3_agent := .Values.pod.mounts.neutron_l3_agent.neutron_l3_agent }}
 {{- $mounts_neutron_l3_agent_init := .Values.pod.mounts.neutron_l3_agent.init_container }}
diff --git a/neutron/templates/daemonset-lb-agent.yaml b/neutron/templates/daemonset-lb-agent.yaml
index 65b174cef7..3461add711 100644
--- a/neutron/templates/daemonset-lb-agent.yaml
+++ b/neutron/templates/daemonset-lb-agent.yaml
@@ -14,9 +14,11 @@ See the License for the specific language governing permissions and
 limitations under the License.
 */}}
 
-{{- if .Values.manifests.daemonset_lb_agent }}
+{{- if and .Values.manifests.daemonset_lb_agent ( eq .Values.network.backend "linuxbridge" ) }}
 {{- $envAll := . }}
-{{- $dependencies := .Values.dependencies.static.lb_agent }}
+
+{{- $dependencyOpts := dict "envAll" $envAll "dependencyMixinParam" $envAll.Values.network.backend "dependencyKey" "lb_agent" -}}
+{{- $dependencies := include "helm-toolkit.utils.dependency_resolver" $dependencyOpts | toString | fromYaml }}
 
 {{- $mounts_neutron_lb_agent := .Values.pod.mounts.neutron_lb_agent.neutron_lb_agent }}
 {{- $mounts_neutron_lb_agent_init := .Values.pod.mounts.neutron_lb_agent.init_container }}
diff --git a/neutron/templates/daemonset-metadata-agent.yaml b/neutron/templates/daemonset-metadata-agent.yaml
index bdfe394bdc..c37098801c 100644
--- a/neutron/templates/daemonset-metadata-agent.yaml
+++ b/neutron/templates/daemonset-metadata-agent.yaml
@@ -16,7 +16,9 @@ limitations under the License.
 
 {{- if .Values.manifests.daemonset_metadata_agent }}
 {{- $envAll := . }}
-{{- $dependencies := .Values.dependencies.static.metadata }}
+
+{{- $dependencyOpts := dict "envAll" $envAll "dependencyMixinParam" $envAll.Values.network.backend "dependencyKey" "metadata" -}}
+{{- $dependencies := include "helm-toolkit.utils.dependency_resolver" $dependencyOpts | toString | fromYaml }}
 
 {{- $mounts_neutron_metadata_agent := .Values.pod.mounts.neutron_metadata_agent.neutron_metadata_agent }}
 {{- $mounts_neutron_metadata_agent_init := .Values.pod.mounts.neutron_metadata_agent.init_container }}
diff --git a/neutron/templates/daemonset-ovs-agent.yaml b/neutron/templates/daemonset-ovs-agent.yaml
index b8944e0cdc..f1f69927fe 100644
--- a/neutron/templates/daemonset-ovs-agent.yaml
+++ b/neutron/templates/daemonset-ovs-agent.yaml
@@ -14,9 +14,11 @@ See the License for the specific language governing permissions and
 limitations under the License.
 */}}
 
-{{- if .Values.manifests.daemonset_ovs_agent }}
+{{- if and .Values.manifests.daemonset_ovs_agent ( eq .Values.network.backend "ovs" ) }}
 {{- $envAll := . }}
-{{- $dependencies := .Values.dependencies.static.ovs_agent }}
+
+{{- $dependencyOpts := dict "envAll" $envAll "dependencyMixinParam" $envAll.Values.network.backend "dependencyKey" "ovs_agent" -}}
+{{- $dependencies := include "helm-toolkit.utils.dependency_resolver" $dependencyOpts | toString | fromYaml }}
 
 {{- $mounts_neutron_ovs_agent := .Values.pod.mounts.neutron_ovs_agent.neutron_ovs_agent }}
 {{- $mounts_neutron_ovs_agent_init := .Values.pod.mounts.neutron_ovs_agent.init_container }}
diff --git a/neutron/templates/deployment-server.yaml b/neutron/templates/deployment-server.yaml
index 8ca5b00915..76749ba3a7 100644
--- a/neutron/templates/deployment-server.yaml
+++ b/neutron/templates/deployment-server.yaml
@@ -16,7 +16,9 @@ limitations under the License.
 
 {{- if .Values.manifests.deployment_server }}
 {{- $envAll := . }}
-{{- $dependencies := .Values.dependencies.static.server }}
+
+{{- $dependencyOpts := dict "envAll" $envAll "dependencyMixinParam" $envAll.Values.network.backend "dependencyKey" "server" -}}
+{{- $dependencies := include "helm-toolkit.utils.dependency_resolver" $dependencyOpts | toString | fromYaml }}
 
 {{- $mounts_neutron_server := .Values.pod.mounts.neutron_server.neutron_server }}
 {{- $mounts_neutron_server_init := .Values.pod.mounts.neutron_server.init_container }}
diff --git a/neutron/values.yaml b/neutron/values.yaml
index 00a209b476..9523a58114 100644
--- a/neutron/values.yaml
+++ b/neutron/values.yaml
@@ -112,6 +112,28 @@ bootstrap:
     openstack token issue
 
 dependencies:
+  dynamic:
+    targeted:
+      ovs:
+        dhcp:
+          daemonset:
+            - neutron-ovs-agent
+        l3:
+          daemonset:
+            - neutron-ovs-agent
+        metadata:
+          daemonset:
+            - neutron-ovs-agent
+      linuxbridge:
+        dhcp:
+          daemonset:
+            - neutron-lb-agent
+        l3:
+          daemonset:
+            - neutron-lb-agent
+        metadata:
+          daemonset:
+            - neutron-lb-agent
   static:
     bootstrap:
       services:
@@ -134,9 +156,7 @@ dependencies:
         - endpoint: internal
           service: oslo_db
     dhcp:
-      daemonset:
-        # this should be set to corresponding neutron L2 agent
-        - neutron-ovs-agent
+      daemonset: null
       services:
         - endpoint: internal
           service: oslo_messaging
@@ -159,9 +179,7 @@ dependencies:
         - endpoint: internal
           service: identity
     l3:
-      daemonset:
-        # this should be set to corresponding neutron L2 agent
-        - neutron-ovs-agent
+      daemonset: null
       services:
         - endpoint: internal
           service: oslo_messaging
@@ -176,9 +194,7 @@ dependencies:
         - endpoint: internal
           service: network
     metadata:
-      daemonset:
-        # this should be set to corresponding neutron L2 agent
-        - neutron-ovs-agent
+      daemonset: null
       services:
         - endpoint: internal
           service: oslo_messaging
@@ -928,8 +944,9 @@ conf:
       dhcp_agents_per_network: 3
       network_auto_schedule: True
       router_auto_schedule: True
-      # we can define here, which driver we are using: openvswitch or linuxbridge
-      interface_driver: openvswitch
+      #(NOTE)portdirect: if unset this is populated dyanmicly from the value in
+      # 'network.backend' to sane defaults.
+      interface_driver: null
     oslo_concurrency:
       lock_path: /var/lib/neutron/tmp
     database:
@@ -949,9 +966,9 @@ conf:
     ml2_conf:
       ml2:
         extension_drivers: port_security
-        # mechnism_drivers can be: openvswitch, linuxbridge,
-        # opendaylight, ovn
-        mechanism_drivers: openvswitch,l2population
+        #(NOTE)portdirect: if unset this is populated dyanmicly from the value
+        # in 'network.backend' to sane defaults.
+        mechanism_drivers: null
         type_drivers: flat,vlan,vxlan
         tenant_network_types: vxlan
       ml2_type_vxlan:
@@ -992,16 +1009,16 @@ conf:
     sriov_agent: null
   dhcp_agent:
     DEFAULT:
-      # we can define here, which driver we are using:
-      # openvswitch or linuxbridge
-      interface_driver: openvswitch
+      #(NOTE)portdirect: if unset this is populated dyanmicly from the value in
+      # 'network.backend' to sane defaults.
+      interface_driver: null
       dnsmasq_config_file: /etc/neutron/dnsmasq.conf
       force_metadata: True
   l3_agent:
     DEFAULT:
-      # we can define here, which driver we are using:
-      # openvswitch or linuxbridge
-      interface_driver: openvswitch
+      #(NOTE)portdirect: if unset this is populated dyanmicly from the value in
+      # 'network.backend' to sane defaults.
+      interface_driver: null
       agent_mode: legacy
   metering_agent: null
   metadata_agent:
@@ -1168,7 +1185,7 @@ manifests:
   configmap_etc: true
   daemonset_dhcp_agent: true
   daemonset_l3_agent: true
-  daemonset_lb_agent: false
+  daemonset_lb_agent: true
   daemonset_metadata_agent: true
   daemonset_ovs_agent: true
   deployment_server: true
diff --git a/nova/templates/daemonset-compute.yaml b/nova/templates/daemonset-compute.yaml
index e82a25c474..5d9a09b650 100644
--- a/nova/templates/daemonset-compute.yaml
+++ b/nova/templates/daemonset-compute.yaml
@@ -296,11 +296,14 @@ spec:
 {{ if $mounts_nova_compute.volumes }}{{ toYaml $mounts_nova_compute.volumes | indent 8 }}{{ end }}
 {{- end }}
 {{- end }}
+
 {{- if .Values.manifests.daemonset_compute }}
+{{- $envAll := . }}
 {{- $daemonset := "compute" }}
 {{- $configMapName := "nova-etc" }}
 {{- $serviceAccountName := "nova-compute" }}
-{{- $dependencies := .Values.dependencies.static.compute }}
+{{- $dependencyOpts := dict "envAll" $envAll "dependencyMixinParam" $envAll.Values.network.backend "dependencyKey" "compute" -}}
+{{- $dependencies := include "helm-toolkit.utils.dependency_resolver" $dependencyOpts | toString | fromYaml }}
 {{ tuple . $dependencies $serviceAccountName | include "helm-toolkit.snippets.kubernetes_pod_rbac_serviceaccount" }}
 {{- $daemonset_yaml := list $daemonset $configMapName $serviceAccountName $dependencies . | include "nova.compute.daemonset" | toString | fromYaml }}
 {{- $configmap_yaml := "nova.configmap.etc" }}
diff --git a/nova/values.yaml b/nova/values.yaml
index 3180fc23a2..88fe543f4c 100644
--- a/nova/values.yaml
+++ b/nova/values.yaml
@@ -124,6 +124,7 @@ bootstrap:
             vcpus: 8
 
 network:
+  backend: ovs
   osapi:
     port: 8774
     ingress:
@@ -182,6 +183,16 @@ ceph:
   secret_uuid: 457eb676-33da-42ec-9a8c-9293d545c337
 
 dependencies:
+  dynamic:
+    targeted:
+      ovs:
+        compute:
+          daemonset:
+            - neutron-ovs-agent
+      linuxbridge:
+        compute:
+          daemonset:
+            - neutron-lb-agent
   static:
     api:
       jobs:
@@ -218,8 +229,6 @@ dependencies:
     compute:
       daemonset:
         - libvirt
-        # this should be set to corresponding neutron L2 agent
-        - neutron-ovs-agent
       jobs:
         - nova-db-sync
       services:
diff --git a/tools/deployment/common/memcached.sh b/tools/deployment/common/memcached.sh
index 9a3e6c8465..f52db9dfd1 100755
--- a/tools/deployment/common/memcached.sh
+++ b/tools/deployment/common/memcached.sh
@@ -20,10 +20,10 @@ set -xe
 make pull-images memcached
 
 #NOTE: Deploy command
-: ${EXTRA_CONFIG:=""}
+: ${OSH_EXTRA_HELM_ARGS:=""}
 helm upgrade --install memcached ./memcached \
     --namespace=openstack \
-    ${EXTRA_CONFIG}
+    ${OSH_EXTRA_HELM_ARGS}
 
 #NOTE: Wait for deploy
 ./tools/deployment/common/wait-for-pods.sh openstack
diff --git a/tools/deployment/developer/ceph/040-ceph.sh b/tools/deployment/developer/ceph/040-ceph.sh
index bd138892c5..6518ee80ce 100755
--- a/tools/deployment/developer/ceph/040-ceph.sh
+++ b/tools/deployment/developer/ceph/040-ceph.sh
@@ -20,7 +20,7 @@ set -xe
 make pull-images ceph
 
 #NOTE: Deploy command
-: ${EXTRA_CONFIG:=""}
+: ${OSH_EXTRA_HELM_ARGS:=""}
 uuidgen > /tmp/ceph-fs-uuid.txt
 CEPH_FS_ID="$(cat /tmp/ceph-fs-uuid.txt)"
 #NOTE(portdirect): to use RBD devices with Ubuntu kernels < 4.5 this
@@ -157,7 +157,7 @@ EOF
 helm upgrade --install ceph ./ceph \
   --namespace=ceph \
   --values=/tmp/ceph.yaml \
-  ${EXTRA_CONFIG}
+  ${OSH_EXTRA_HELM_ARGS}
 
 #NOTE: Wait for deploy
 ./tools/deployment/common/wait-for-pods.sh ceph
diff --git a/tools/deployment/developer/ceph/045-ceph-ns-activate.sh b/tools/deployment/developer/ceph/045-ceph-ns-activate.sh
index 982112b60e..0455c87b97 100755
--- a/tools/deployment/developer/ceph/045-ceph-ns-activate.sh
+++ b/tools/deployment/developer/ceph/045-ceph-ns-activate.sh
@@ -20,7 +20,7 @@ set -xe
 make pull-images ceph
 
 #NOTE: Deploy command
-: ${EXTRA_CONFIG:=""}
+: ${OSH_EXTRA_HELM_ARGS:=""}
 CEPH_FS_ID="$(cat /tmp/ceph-fs-uuid.txt)"
 tee /tmp/ceph-openstack-config.yaml <<EOF
 endpoints:
@@ -52,7 +52,7 @@ EOF
 helm upgrade --install ceph-openstack-config ./ceph \
   --namespace=openstack \
   --values=/tmp/ceph-openstack-config.yaml \
-  ${EXTRA_CONFIG}
+  ${OSH_EXTRA_HELM_ARGS}
 
 #NOTE: Wait for deploy
 ./tools/deployment/common/wait-for-pods.sh openstack
diff --git a/tools/deployment/developer/ceph/110-ceph-radosgateway.sh b/tools/deployment/developer/ceph/110-ceph-radosgateway.sh
index aead0d4e9a..07e95a9bbb 100755
--- a/tools/deployment/developer/ceph/110-ceph-radosgateway.sh
+++ b/tools/deployment/developer/ceph/110-ceph-radosgateway.sh
@@ -20,7 +20,7 @@ set -xe
 make pull-images ceph
 
 #NOTE: Deploy command
-: ${EXTRA_CONFIG:=""}
+: ${OSH_EXTRA_HELM_ARGS:=""}
 CEPH_FS_ID="$(cat /tmp/ceph-fs-uuid.txt)"
 tee /tmp/radosgw-openstack.yaml <<EOF
 endpoints:
@@ -52,7 +52,7 @@ EOF
 helm upgrade --install radosgw-openstack ./ceph \
   --namespace=openstack \
   --values=/tmp/radosgw-openstack.yaml \
-  ${EXTRA_CONFIG}
+  ${OSH_EXTRA_HELM_ARGS}
 
 #NOTE: Wait for deploy
 ./tools/deployment/common/wait-for-pods.sh openstack
diff --git a/tools/deployment/developer/ceph/120-glance.sh b/tools/deployment/developer/ceph/120-glance.sh
index b63f479e2e..fa2e37982b 100755
--- a/tools/deployment/developer/ceph/120-glance.sh
+++ b/tools/deployment/developer/ceph/120-glance.sh
@@ -20,12 +20,12 @@ set -xe
 make pull-images glance
 
 #NOTE: Deploy command
-: ${EXTRA_CONFIG:=""}
+: ${OSH_EXTRA_HELM_ARGS:=""}
 GLANCE_BACKEND="radosgw" # NOTE(portdirect), this could be: radosgw, rbd, swift or pvc
 helm upgrade --install glance ./glance \
   --namespace=openstack \
   --set storage=${GLANCE_BACKEND} \
-  ${EXTRA_CONFIG}
+  ${OSH_EXTRA_HELM_ARGS}
 
 #NOTE: Wait for deploy
 ./tools/deployment/common/wait-for-pods.sh openstack
diff --git a/tools/deployment/developer/ceph/130-cinder.sh b/tools/deployment/developer/ceph/130-cinder.sh
index abd1f1397e..329c4b3744 100755
--- a/tools/deployment/developer/ceph/130-cinder.sh
+++ b/tools/deployment/developer/ceph/130-cinder.sh
@@ -19,10 +19,10 @@ set -xe
 make pull-images cinder
 
 #NOTE: Deploy command
-: ${EXTRA_CONFIG:=""}
+: ${OSH_EXTRA_HELM_ARGS:=""}
 helm upgrade --install cinder ./cinder \
   --namespace=openstack \
-  ${EXTRA_CONFIG}
+  ${OSH_EXTRA_HELM_ARGS}
 
 #NOTE: Wait for deploy
 ./tools/deployment/common/wait-for-pods.sh openstack
diff --git a/tools/deployment/developer/ceph/150-libvirt.sh b/tools/deployment/developer/ceph/150-libvirt.sh
index 0da3e2fb0a..ba5fa347bc 100755
--- a/tools/deployment/developer/ceph/150-libvirt.sh
+++ b/tools/deployment/developer/ceph/150-libvirt.sh
@@ -19,10 +19,10 @@ set -xe
 make pull-images libvirt
 
 #NOTE: Deploy command
-: ${EXTRA_CONFIG:=""}
+: ${OSH_EXTRA_HELM_ARGS:=""}
 helm upgrade --install libvirt ./libvirt \
   --namespace=openstack \
-  ${EXTRA_CONFIG}
+  ${OSH_EXTRA_HELM_ARGS}
 
 #NOTE: Wait for deploy
 ./tools/deployment/common/wait-for-pods.sh openstack
diff --git a/tools/deployment/developer/ceph/160-compute-kit.sh b/tools/deployment/developer/ceph/160-compute-kit.sh
index d43e29affa..8815dc1e05 100755
--- a/tools/deployment/developer/ceph/160-compute-kit.sh
+++ b/tools/deployment/developer/ceph/160-compute-kit.sh
@@ -20,18 +20,18 @@ make pull-images nova
 make pull-images neutron
 
 #NOTE: Deploy nova
-: ${EXTRA_CONFIG:=""}
+: ${OSH_EXTRA_HELM_ARGS:=""}
 if [ "x$(systemd-detect-virt)" == "xnone" ]; then
   echo 'OSH is not being deployed in virtualized environment'
   helm upgrade --install nova ./nova \
       --namespace=openstack \
-      ${EXTRA_CONFIG}
+      ${OSH_EXTRA_HELM_ARGS}
 else
   echo 'OSH is being deployed in virtualized environment, using qemu for nova'
   helm upgrade --install nova ./nova \
       --namespace=openstack \
       --set conf.nova.libvirt.virt_type=qemu \
-      ${EXTRA_CONFIG}
+      ${OSH_EXTRA_HELM_ARGS}
 fi
 
 #NOTE: Deploy neutron
@@ -51,16 +51,21 @@ conf:
     ml2_conf:
       ml2_type_flat:
         flat_networks: public
+    #NOTE(portdirect): for clarity we include options for all the neutron
+    # backends here.
     openvswitch_agent:
       agent:
         tunnel_types: vxlan
       ovs:
         bridge_mappings: public:br-ex
+    linuxbridge_agent:
+      linux_bridge:
+        bridge_mappings: public:br-ex
 EOF
 helm upgrade --install neutron ./neutron \
     --namespace=openstack \
     --values=/tmp/neutron.yaml \
-    ${EXTRA_CONFIG}
+    ${OSH_EXTRA_HELM_ARGS}
 
 #NOTE: Wait for deploy
 ./tools/deployment/common/wait-for-pods.sh openstack
diff --git a/tools/deployment/developer/common/030-ingress.sh b/tools/deployment/developer/common/030-ingress.sh
index cef8dfe53d..378485b3a2 100755
--- a/tools/deployment/developer/common/030-ingress.sh
+++ b/tools/deployment/developer/common/030-ingress.sh
@@ -20,7 +20,7 @@ set -xe
 make pull-images ingress
 
 #NOTE: Deploy command
-: ${EXTRA_CONFIG:=""}
+: ${OSH_EXTRA_HELM_ARGS:=""}
 tee /tmp/ingress-kube-system.yaml << EOF
 deployment:
   mode: cluster
@@ -31,7 +31,7 @@ EOF
 helm upgrade --install ingress-kube-system ./ingress \
   --namespace=kube-system \
   --values=/tmp/ingress-kube-system.yaml \
-  ${EXTRA_CONFIG}
+  ${OSH_EXTRA_HELM_ARGS}
 
 #NOTE: Deploy namespace ingress
 helm upgrade --install ingress-openstack ./ingress \
diff --git a/tools/deployment/developer/common/050-mariadb.sh b/tools/deployment/developer/common/050-mariadb.sh
index 56596f7783..d6cca99b84 100755
--- a/tools/deployment/developer/common/050-mariadb.sh
+++ b/tools/deployment/developer/common/050-mariadb.sh
@@ -20,11 +20,11 @@ set -xe
 make pull-images mariadb
 
 #NOTE: Deploy command
-: ${EXTRA_CONFIG:=""}
+: ${OSH_EXTRA_HELM_ARGS:=""}
 helm upgrade --install mariadb ./mariadb \
     --namespace=openstack \
     --set pod.replicas.server=1 \
-    ${EXTRA_CONFIG}
+    ${OSH_EXTRA_HELM_ARGS}
 
 #NOTE: Wait for deploy
 ./tools/deployment/common/wait-for-pods.sh openstack
diff --git a/tools/deployment/developer/common/060-rabbitmq.sh b/tools/deployment/developer/common/060-rabbitmq.sh
index 4013b46634..643b02d2ad 100755
--- a/tools/deployment/developer/common/060-rabbitmq.sh
+++ b/tools/deployment/developer/common/060-rabbitmq.sh
@@ -20,11 +20,11 @@ set -xe
 make pull-images rabbitmq
 
 #NOTE: Deploy command
-: ${EXTRA_CONFIG:=""}
+: ${OSH_EXTRA_HELM_ARGS:=""}
 helm upgrade --install rabbitmq ./rabbitmq \
     --namespace=openstack \
     --set pod.replicas.server=1 \
-    ${EXTRA_CONFIG}
+    ${OSH_EXTRA_HELM_ARGS}
 
 #NOTE: Wait for deploy
 ./tools/deployment/common/wait-for-pods.sh openstack
diff --git a/tools/deployment/developer/common/080-keystone.sh b/tools/deployment/developer/common/080-keystone.sh
index e4b24c09e0..e1de8d19ee 100755
--- a/tools/deployment/developer/common/080-keystone.sh
+++ b/tools/deployment/developer/common/080-keystone.sh
@@ -20,10 +20,10 @@ set -xe
 make pull-images keystone
 
 #NOTE: Deploy command
-: ${EXTRA_CONFIG:=""}
+: ${OSH_EXTRA_HELM_ARGS:=""}
 helm upgrade --install keystone ./keystone \
     --namespace=openstack \
-    ${EXTRA_CONFIG}
+    ${OSH_EXTRA_HELM_ARGS}
 
 #NOTE: Wait for deploy
 ./tools/deployment/common/wait-for-pods.sh openstack
diff --git a/tools/deployment/developer/common/090-heat.sh b/tools/deployment/developer/common/090-heat.sh
index 978bf098cb..8de7bafb32 100755
--- a/tools/deployment/developer/common/090-heat.sh
+++ b/tools/deployment/developer/common/090-heat.sh
@@ -19,10 +19,10 @@ set -xe
 make pull-images heat
 
 #NOTE: Deploy command
-: ${EXTRA_CONFIG:=""}
+: ${OSH_EXTRA_HELM_ARGS:=""}
 helm upgrade --install heat ./heat \
   --namespace=openstack \
-  ${EXTRA_CONFIG}
+  ${OSH_EXTRA_HELM_ARGS}
 
 #NOTE: Wait for deploy
 ./tools/deployment/common/wait-for-pods.sh openstack
diff --git a/tools/deployment/developer/common/100-horizon.sh b/tools/deployment/developer/common/100-horizon.sh
index 241f52428b..241fcdf9ad 100755
--- a/tools/deployment/developer/common/100-horizon.sh
+++ b/tools/deployment/developer/common/100-horizon.sh
@@ -20,12 +20,12 @@ set -xe
 make pull-images horizon
 
 #NOTE: Deploy command
-: ${EXTRA_CONFIG:=""}
+: ${OSH_EXTRA_HELM_ARGS:=""}
 helm upgrade --install horizon ./horizon \
     --namespace=openstack \
     --set network.node_port.enabled=true \
     --set network.node_port.port=31000 \
-    ${EXTRA_CONFIG}
+    ${OSH_EXTRA_HELM_ARGS}
 
 #NOTE: Wait for deploy
 ./tools/deployment/common/wait-for-pods.sh openstack
diff --git a/tools/deployment/developer/common/140-openvswitch.sh b/tools/deployment/developer/common/140-openvswitch.sh
index 623955e1fa..64175e50b1 100755
--- a/tools/deployment/developer/common/140-openvswitch.sh
+++ b/tools/deployment/developer/common/140-openvswitch.sh
@@ -19,10 +19,10 @@ set -xe
 make pull-images openvswitch
 
 #NOTE: Deploy command
-: ${EXTRA_CONFIG:=""}
+: ${OSH_EXTRA_HELM_ARGS:=""}
 helm upgrade --install openvswitch ./openvswitch \
   --namespace=openstack \
-  ${EXTRA_CONFIG}
+  ${OSH_EXTRA_HELM_ARGS}
 
 #NOTE: Wait for deploy
 ./tools/deployment/common/wait-for-pods.sh openstack
diff --git a/tools/deployment/developer/nfs/120-glance.sh b/tools/deployment/developer/nfs/120-glance.sh
index dad43177d3..35cb78a0ff 100755
--- a/tools/deployment/developer/nfs/120-glance.sh
+++ b/tools/deployment/developer/nfs/120-glance.sh
@@ -20,9 +20,11 @@ set -xe
 make pull-images glance
 
 #NOTE: Deploy command
+: ${OSH_EXTRA_HELM_ARGS:=""}
 helm upgrade --install glance ./glance \
   --namespace=openstack \
-  --set storage=pvc
+  --set storage=pvc \
+  ${OSH_EXTRA_HELM_ARGS}
 
 #NOTE: Wait for deploy
 ./tools/deployment/common/wait-for-pods.sh openstack
diff --git a/tools/deployment/developer/nfs/150-libvirt.sh b/tools/deployment/developer/nfs/150-libvirt.sh
index 0b12cf8ecf..f18bbabf8e 100755
--- a/tools/deployment/developer/nfs/150-libvirt.sh
+++ b/tools/deployment/developer/nfs/150-libvirt.sh
@@ -19,9 +19,11 @@ set -xe
 make pull-images libvirt
 
 #NOTE: Deploy command
+: ${OSH_EXTRA_HELM_ARGS:=""}
 helm upgrade --install libvirt ./libvirt \
   --namespace=openstack \
-  --set ceph.enabled=false
+  --set ceph.enabled=false \
+  ${OSH_EXTRA_HELM_ARGS}
 
 #NOTE: Wait for deploy
 ./tools/deployment/common/wait-for-pods.sh openstack
diff --git a/tools/deployment/developer/nfs/160-compute-kit.sh b/tools/deployment/developer/nfs/160-compute-kit.sh
index 81a8b83aee..e72f775336 100755
--- a/tools/deployment/developer/nfs/160-compute-kit.sh
+++ b/tools/deployment/developer/nfs/160-compute-kit.sh
@@ -20,17 +20,20 @@ make pull-images nova
 make pull-images neutron
 
 #NOTE: Deploy nova
+: ${OSH_EXTRA_HELM_ARGS:=""}
 if [ "x$(systemd-detect-virt)" == "xnone" ]; then
   echo 'OSH is not being deployed in virtualized environment'
   helm upgrade --install nova ./nova \
       --namespace=openstack \
-      --set ceph.enabled=false
+      --set ceph.enabled=false \
+      ${OSH_EXTRA_HELM_ARGS}
 else
   echo 'OSH is being deployed in virtualized environment, using qemu for nova'
   helm upgrade --install nova ./nova \
       --namespace=openstack \
       --set ceph.enabled=false \
-      --set conf.nova.libvirt.virt_type=qemu
+      --set conf.nova.libvirt.virt_type=qemu \
+      ${OSH_EXTRA_HELM_ARGS}
 fi
 
 #NOTE: Deploy neutron
@@ -55,10 +58,14 @@ conf:
         tunnel_types: vxlan
       ovs:
         bridge_mappings: public:br-ex
+    linuxbridge_agent:
+      linux_bridge:
+        bridge_mappings: public:br-ex
 EOF
 helm upgrade --install neutron ./neutron \
     --namespace=openstack \
-    --values=/tmp/neutron.yaml
+    --values=/tmp/neutron.yaml \
+    ${OSH_EXTRA_HELM_ARGS}
 
 #NOTE: Wait for deploy
 ./tools/deployment/common/wait-for-pods.sh openstack
diff --git a/tools/gate/playbooks/dev-deploy-ceph.yaml b/tools/gate/playbooks/dev-deploy-ceph.yaml
index 86274e2012..02536797a4 100644
--- a/tools/gate/playbooks/dev-deploy-ceph.yaml
+++ b/tools/gate/playbooks/dev-deploy-ceph.yaml
@@ -18,13 +18,17 @@
       shell: |
         set -xe;
         ./tools/deployment/developer/ceph/000-install-packages.sh
+      environment:
+        OSH_EXTRA_HELM_ARGS: "{{ zuul_osh_extra_helm_args_relative_path | default('') }}"
+        OSH_INFRA_PATH: "{{ zuul_osh_infra_relative_path | default('') }}"
       args:
         chdir: "{{ zuul.project.src_dir }}"
     - name: Deploy Required packages
       shell: |
         set -xe;
         ./tools/deployment/developer/ceph/010-deploy-k8s.sh
-      vars:
+      environment:
+        OSH_EXTRA_HELM_ARGS: "{{ zuul_osh_extra_helm_args_relative_path | default('') }}"
         OSH_INFRA_PATH: "{{ zuul_osh_infra_relative_path | default('') }}"
       args:
         chdir: "{{ zuul.project.src_dir }}"
@@ -32,54 +36,81 @@
       shell: |
         set -xe;
         ./tools/deployment/developer/ceph/020-setup-client.sh
+      environment:
+        OSH_EXTRA_HELM_ARGS: "{{ zuul_osh_extra_helm_args_relative_path | default('') }}"
+        OSH_INFRA_PATH: "{{ zuul_osh_infra_relative_path | default('') }}"
       args:
         chdir: "{{ zuul.project.src_dir }}"
     - name: Deploy Ingress
       shell: |
         set -xe;
         ./tools/deployment/developer/ceph/030-ingress.sh
+      environment:
+        OSH_EXTRA_HELM_ARGS: "{{ zuul_osh_extra_helm_args_relative_path | default('') }}"
+        OSH_INFRA_PATH: "{{ zuul_osh_infra_relative_path | default('') }}"
       args:
         chdir: "{{ zuul.project.src_dir }}"
     - name: Deploy Ceph
       shell: |
         set -xe;
         ./tools/deployment/developer/ceph/040-ceph.sh
+      environment:
+        OSH_EXTRA_HELM_ARGS: "{{ zuul_osh_extra_helm_args_relative_path | default('') }}"
+        OSH_INFRA_PATH: "{{ zuul_osh_infra_relative_path | default('') }}"
       args:
         chdir: "{{ zuul.project.src_dir }}"
     - name: Deploy Ceph NS Activate
       shell: |
         set -xe;
         ./tools/deployment/developer/ceph/045-ceph-ns-activate.sh
+      environment:
+        OSH_EXTRA_HELM_ARGS: "{{ zuul_osh_extra_helm_args_relative_path | default('') }}"
+        OSH_INFRA_PATH: "{{ zuul_osh_infra_relative_path | default('') }}"
       args:
         chdir: "{{ zuul.project.src_dir }}"
     - name: Deploy Mariadb
       shell: |
         set -xe;
         ./tools/deployment/developer/ceph/050-mariadb.sh
+      environment:
+        OSH_EXTRA_HELM_ARGS: "{{ zuul_osh_extra_helm_args_relative_path | default('') }}"
+        OSH_INFRA_PATH: "{{ zuul_osh_infra_relative_path | default('') }}"
       args:
         chdir: "{{ zuul.project.src_dir }}"
     - name: Deploy RabbitMQ
       shell: |
         set -xe;
         ./tools/deployment/developer/ceph/060-rabbitmq.sh
+      environment:
+        OSH_EXTRA_HELM_ARGS: "{{ zuul_osh_extra_helm_args_relative_path | default('') }}"
+        OSH_INFRA_PATH: "{{ zuul_osh_infra_relative_path | default('') }}"
       args:
         chdir: "{{ zuul.project.src_dir }}"
     - name: Deploy Memcached
       shell: |
         set -xe;
         ./tools/deployment/developer/ceph/070-memcached.sh
+      environment:
+        OSH_EXTRA_HELM_ARGS: "{{ zuul_osh_extra_helm_args_relative_path | default('') }}"
+        OSH_INFRA_PATH: "{{ zuul_osh_infra_relative_path | default('') }}"
       args:
         chdir: "{{ zuul.project.src_dir }}"
     - name: Deploy Keystone
       shell: |
         set -xe;
         ./tools/deployment/developer/ceph/080-keystone.sh
+      environment:
+        OSH_EXTRA_HELM_ARGS: "{{ zuul_osh_extra_helm_args_relative_path | default('') }}"
+        OSH_INFRA_PATH: "{{ zuul_osh_infra_relative_path | default('') }}"
       args:
         chdir: "{{ zuul.project.src_dir }}"
     - name: Deploy Heat
       shell: |
         set -xe;
         ./tools/deployment/developer/ceph/090-heat.sh
+      environment:
+        OSH_EXTRA_HELM_ARGS: "{{ zuul_osh_extra_helm_args_relative_path | default('') }}"
+        OSH_INFRA_PATH: "{{ zuul_osh_infra_relative_path | default('') }}"
       args:
         chdir: "{{ zuul.project.src_dir }}"
     # - name: Deploy Horizon
@@ -92,12 +123,18 @@
       shell: |
         set -xe;
         ./tools/deployment/developer/ceph/110-ceph-radosgateway.sh
+      environment:
+        OSH_EXTRA_HELM_ARGS: "{{ zuul_osh_extra_helm_args_relative_path | default('') }}"
+        OSH_INFRA_PATH: "{{ zuul_osh_infra_relative_path | default('') }}"
       args:
         chdir: "{{ zuul.project.src_dir }}"
     - name: Deploy Glance
       shell: |
         set -xe;
         ./tools/deployment/developer/ceph/120-glance.sh
+      environment:
+        OSH_EXTRA_HELM_ARGS: "{{ zuul_osh_extra_helm_args_relative_path | default('') }}"
+        OSH_INFRA_PATH: "{{ zuul_osh_infra_relative_path | default('') }}"
       args:
         chdir: "{{ zuul.project.src_dir }}"
     # - name: Deploy Cinder
@@ -107,32 +144,48 @@
     #   args:
     #     chdir: "{{ zuul.project.src_dir }}"
     - name: Deploy OpenvSwitch
+      when: osh_neutron_backend == 'openvswitch'
       shell: |
         set -xe;
         ./tools/deployment/developer/ceph/140-openvswitch.sh
+      environment:
+        OSH_EXTRA_HELM_ARGS: "{{ zuul_osh_extra_helm_args_relative_path | default('') }}"
+        OSH_INFRA_PATH: "{{ zuul_osh_infra_relative_path | default('') }}"
       args:
         chdir: "{{ zuul.project.src_dir }}"
     - name: Deploy Libvirt
       shell: |
         set -xe;
         ./tools/deployment/developer/ceph/150-libvirt.sh
+      environment:
+        OSH_EXTRA_HELM_ARGS: "{{ zuul_osh_extra_helm_args_relative_path | default('') }}"
+        OSH_INFRA_PATH: "{{ zuul_osh_infra_relative_path | default('') }}"
       args:
         chdir: "{{ zuul.project.src_dir }}"
     - name: Deploy VM Compute Kit
       shell: |
         set -xe;
         ./tools/deployment/developer/ceph/160-compute-kit.sh
+      environment:
+        OSH_EXTRA_HELM_ARGS: "{{ zuul_osh_extra_helm_args_relative_path | default('') }}"
+        OSH_INFRA_PATH: "{{ zuul_osh_infra_relative_path | default('') }}"
       args:
         chdir: "{{ zuul.project.src_dir }}"
     - name: Setup Gateway
       shell: |
         set -xe;
         ./tools/deployment/developer/ceph/170-setup-gateway.sh
+      environment:
+        OSH_EXTRA_HELM_ARGS: "{{ zuul_osh_extra_helm_args_relative_path | default('') }}"
+        OSH_INFRA_PATH: "{{ zuul_osh_infra_relative_path | default('') }}"
       args:
         chdir: "{{ zuul.project.src_dir }}"
     - name: Deploy use the cloud
       shell: |
         set -xe;
         ./tools/deployment/developer/ceph/900-use-it.sh
+      environment:
+        OSH_EXTRA_HELM_ARGS: "{{ zuul_osh_extra_helm_args_relative_path | default('') }}"
+        OSH_INFRA_PATH: "{{ zuul_osh_infra_relative_path | default('') }}"
       args:
         chdir: "{{ zuul.project.src_dir }}"
diff --git a/tools/gate/playbooks/dev-deploy-nfs.yaml b/tools/gate/playbooks/dev-deploy-nfs.yaml
index 62e5774bd9..27719a42c6 100644
--- a/tools/gate/playbooks/dev-deploy-nfs.yaml
+++ b/tools/gate/playbooks/dev-deploy-nfs.yaml
@@ -18,6 +18,9 @@
       shell: |
         set -xe;
         ./tools/deployment/developer/nfs/000-install-packages.sh
+      environment:
+        OSH_EXTRA_HELM_ARGS: "{{ zuul_osh_extra_helm_args_relative_path | default('') }}"
+        OSH_INFRA_PATH: "{{ zuul_osh_infra_relative_path | default('') }}"
       args:
         chdir: "{{ zuul.project.src_dir }}"
     - name: Deploy Required packages
@@ -25,6 +28,7 @@
         set -xe;
         ./tools/deployment/developer/nfs/010-deploy-k8s.sh
       environment:
+        OSH_EXTRA_HELM_ARGS: "{{ zuul_osh_extra_helm_args_relative_path | default('') }}"
         OSH_INFRA_PATH: "{{ zuul_osh_infra_relative_path | default('') }}"
       args:
         chdir: "{{ zuul.project.src_dir }}"
@@ -32,89 +36,135 @@
       shell: |
         set -xe;
         ./tools/deployment/developer/nfs/020-setup-client.sh
+      environment:
+        OSH_EXTRA_HELM_ARGS: "{{ zuul_osh_extra_helm_args_relative_path | default('') }}"
+        OSH_INFRA_PATH: "{{ zuul_osh_infra_relative_path | default('') }}"
       args:
         chdir: "{{ zuul.project.src_dir }}"
     - name: Deploy Ingress
       shell: |
         set -xe;
         ./tools/deployment/developer/nfs/030-ingress.sh
+      environment:
+        OSH_EXTRA_HELM_ARGS: "{{ zuul_osh_extra_helm_args_relative_path | default('') }}"
+        OSH_INFRA_PATH: "{{ zuul_osh_infra_relative_path | default('') }}"
       args:
         chdir: "{{ zuul.project.src_dir }}"
     - name: Deploy NFS
       shell: |
         set -xe;
         ./tools/deployment/developer/nfs/040-nfs-provisioner.sh
+      environment:
+        OSH_EXTRA_HELM_ARGS: "{{ zuul_osh_extra_helm_args_relative_path | default('') }}"
+        OSH_INFRA_PATH: "{{ zuul_osh_infra_relative_path | default('') }}"
       args:
         chdir: "{{ zuul.project.src_dir }}"
     - name: Deploy Mariadb
       shell: |
         set -xe;
         ./tools/deployment/developer/nfs/050-mariadb.sh
+      environment:
+        OSH_EXTRA_HELM_ARGS: "{{ zuul_osh_extra_helm_args_relative_path | default('') }}"
+        OSH_INFRA_PATH: "{{ zuul_osh_infra_relative_path | default('') }}"
       args:
         chdir: "{{ zuul.project.src_dir }}"
     - name: Deploy RabbitMQ
       shell: |
         set -xe;
         ./tools/deployment/developer/nfs/060-rabbitmq.sh
+      environment:
+        OSH_EXTRA_HELM_ARGS: "{{ zuul_osh_extra_helm_args_relative_path | default('') }}"
+        OSH_INFRA_PATH: "{{ zuul_osh_infra_relative_path | default('') }}"
       args:
         chdir: "{{ zuul.project.src_dir }}"
     - name: Deploy Memcached
       shell: |
         set -xe;
         ./tools/deployment/developer/nfs/070-memcached.sh
+      environment:
+        OSH_EXTRA_HELM_ARGS: "{{ zuul_osh_extra_helm_args_relative_path | default('') }}"
+        OSH_INFRA_PATH: "{{ zuul_osh_infra_relative_path | default('') }}"
       args:
         chdir: "{{ zuul.project.src_dir }}"
     - name: Deploy Keystone
       shell: |
         set -xe;
         ./tools/deployment/developer/nfs/080-keystone.sh
+      environment:
+        OSH_EXTRA_HELM_ARGS: "{{ zuul_osh_extra_helm_args_relative_path | default('') }}"
+        OSH_INFRA_PATH: "{{ zuul_osh_infra_relative_path | default('') }}"
       args:
         chdir: "{{ zuul.project.src_dir }}"
     - name: Deploy Heat
       shell: |
         set -xe;
         ./tools/deployment/developer/nfs/090-heat.sh
+      environment:
+        OSH_EXTRA_HELM_ARGS: "{{ zuul_osh_extra_helm_args_relative_path | default('') }}"
+        OSH_INFRA_PATH: "{{ zuul_osh_infra_relative_path | default('') }}"
       args:
         chdir: "{{ zuul.project.src_dir }}"
     - name: Deploy Horizon
       shell: |
         set -xe;
         ./tools/deployment/developer/nfs/100-horizon.sh
+      environment:
+        OSH_EXTRA_HELM_ARGS: "{{ zuul_osh_extra_helm_args_relative_path | default('') }}"
+        OSH_INFRA_PATH: "{{ zuul_osh_infra_relative_path | default('') }}"
       args:
         chdir: "{{ zuul.project.src_dir }}"
     - name: Deploy Glance
       shell: |
         set -xe;
         ./tools/deployment/developer/nfs/120-glance.sh
+      environment:
+        OSH_EXTRA_HELM_ARGS: "{{ zuul_osh_extra_helm_args_relative_path | default('') }}"
+        OSH_INFRA_PATH: "{{ zuul_osh_infra_relative_path | default('') }}"
       args:
         chdir: "{{ zuul.project.src_dir }}"
     - name: Deploy OpenvSwitch
+      when: osh_neutron_backend == 'openvswitch'
       shell: |
         set -xe;
         ./tools/deployment/developer/nfs/140-openvswitch.sh
+      environment:
+        OSH_EXTRA_HELM_ARGS: "{{ zuul_osh_extra_helm_args_relative_path | default('') }}"
+        OSH_INFRA_PATH: "{{ zuul_osh_infra_relative_path | default('') }}"
       args:
         chdir: "{{ zuul.project.src_dir }}"
     - name: Deploy Libvirt
       shell: |
         set -xe;
         ./tools/deployment/developer/nfs/150-libvirt.sh
+      environment:
+        OSH_EXTRA_HELM_ARGS: "{{ zuul_osh_extra_helm_args_relative_path | default('') }}"
+        OSH_INFRA_PATH: "{{ zuul_osh_infra_relative_path | default('') }}"
       args:
         chdir: "{{ zuul.project.src_dir }}"
     - name: Deploy VM Compute Kit
       shell: |
         set -xe;
         ./tools/deployment/developer/nfs/160-compute-kit.sh
+      environment:
+        OSH_EXTRA_HELM_ARGS: "{{ zuul_osh_extra_helm_args_relative_path | default('') }}"
+        OSH_INFRA_PATH: "{{ zuul_osh_infra_relative_path | default('') }}"
       args:
         chdir: "{{ zuul.project.src_dir }}"
     - name: Setup Gateway
       shell: |
         set -xe;
         ./tools/deployment/developer/nfs/170-setup-gateway.sh
+      environment:
+        OSH_EXTRA_HELM_ARGS: "{{ zuul_osh_extra_helm_args_relative_path | default('') }}"
+        OSH_INFRA_PATH: "{{ zuul_osh_infra_relative_path | default('') }}"
       args:
         chdir: "{{ zuul.project.src_dir }}"
     - name: Deploy use the cloud
       shell: |
         set -xe;
         ./tools/deployment/developer/nfs/900-use-it.sh
+      environment:
+        OSH_EXTRA_HELM_ARGS: "{{ zuul_osh_extra_helm_args_relative_path | default('') }}"
+        OSH_INFRA_PATH: "{{ zuul_osh_infra_relative_path | default('') }}"
       args:
         chdir: "{{ zuul.project.src_dir }}"
diff --git a/tools/gate/playbooks/kolla-deploy-ceph.yaml b/tools/gate/playbooks/kolla-deploy-ceph.yaml
index 7589c3f2db..18b619d02b 100644
--- a/tools/gate/playbooks/kolla-deploy-ceph.yaml
+++ b/tools/gate/playbooks/kolla-deploy-ceph.yaml
@@ -19,7 +19,7 @@
         set -xe;
         ./tools/deployment/developer/ceph/000-install-packages.sh
       environment:
-        EXTRA_CONFIG: "--values=./tools/overrides/releases/newton/kolla.yaml"
+        OSH_EXTRA_HELM_ARGS: "--values=./tools/overrides/releases/newton/kolla.yaml"
       args:
         chdir: "{{ zuul.project.src_dir }}"
     - name: Deploy Required packages
@@ -27,7 +27,7 @@
         set -xe;
         ./tools/deployment/developer/ceph/010-deploy-k8s.sh
       environment:
-        EXTRA_CONFIG: "--values=./tools/overrides/releases/newton/kolla.yaml"
+        OSH_EXTRA_HELM_ARGS: "--values=./tools/overrides/releases/newton/kolla.yaml"
         OSH_INFRA_PATH: "{{ zuul_osh_infra_relative_path | default('') }}"
       args:
         chdir: "{{ zuul.project.src_dir }}"
@@ -36,7 +36,7 @@
         set -xe;
         ./tools/deployment/developer/ceph/020-setup-client.sh
       environment:
-        EXTRA_CONFIG: "--values=./tools/overrides/releases/newton/kolla.yaml"
+        OSH_EXTRA_HELM_ARGS: "--values=./tools/overrides/releases/newton/kolla.yaml"
       args:
         chdir: "{{ zuul.project.src_dir }}"
     - name: Deploy Ingress
@@ -44,7 +44,7 @@
         set -xe;
         ./tools/deployment/developer/ceph/030-ingress.sh
       environment:
-        EXTRA_CONFIG: "--values=./tools/overrides/releases/newton/kolla.yaml"
+        OSH_EXTRA_HELM_ARGS: "--values=./tools/overrides/releases/newton/kolla.yaml"
       args:
         chdir: "{{ zuul.project.src_dir }}"
     - name: Deploy Ceph
@@ -52,7 +52,7 @@
         set -xe;
         ./tools/deployment/developer/ceph/040-ceph.sh
       environment:
-        EXTRA_CONFIG: "--values=./tools/overrides/releases/newton/kolla.yaml"
+        OSH_EXTRA_HELM_ARGS: "--values=./tools/overrides/releases/newton/kolla.yaml"
       args:
         chdir: "{{ zuul.project.src_dir }}"
     - name: Deploy Ceph NS Activate
@@ -60,7 +60,7 @@
         set -xe;
         ./tools/deployment/developer/ceph/045-ceph-ns-activate.sh
       environment:
-        EXTRA_CONFIG: "--values=./tools/overrides/releases/newton/kolla.yaml"
+        OSH_EXTRA_HELM_ARGS: "--values=./tools/overrides/releases/newton/kolla.yaml"
       args:
         chdir: "{{ zuul.project.src_dir }}"
     - name: Deploy Mariadb
@@ -68,7 +68,7 @@
         set -xe;
         ./tools/deployment/developer/ceph/050-mariadb.sh
       environment:
-        EXTRA_CONFIG: "--values=./tools/overrides/releases/newton/kolla.yaml"
+        OSH_EXTRA_HELM_ARGS: "--values=./tools/overrides/releases/newton/kolla.yaml"
       args:
         chdir: "{{ zuul.project.src_dir }}"
     - name: Deploy RabbitMQ
@@ -76,7 +76,7 @@
         set -xe;
         ./tools/deployment/developer/ceph/060-rabbitmq.sh
       environment:
-        EXTRA_CONFIG: "--values=./tools/overrides/releases/newton/kolla.yaml"
+        OSH_EXTRA_HELM_ARGS: "--values=./tools/overrides/releases/newton/kolla.yaml"
       args:
         chdir: "{{ zuul.project.src_dir }}"
     - name: Deploy Memcached
@@ -84,7 +84,7 @@
         set -xe;
         ./tools/deployment/developer/ceph/070-memcached.sh
       environment:
-        EXTRA_CONFIG: "--values=./tools/overrides/releases/newton/kolla.yaml"
+        OSH_EXTRA_HELM_ARGS: "--values=./tools/overrides/releases/newton/kolla.yaml"
       args:
         chdir: "{{ zuul.project.src_dir }}"
     - name: Deploy Keystone
@@ -92,7 +92,7 @@
         set -xe;
         ./tools/deployment/developer/ceph/080-keystone.sh
       environment:
-        EXTRA_CONFIG: "--values=./tools/overrides/releases/newton/kolla.yaml"
+        OSH_EXTRA_HELM_ARGS: "--values=./tools/overrides/releases/newton/kolla.yaml"
       args:
         chdir: "{{ zuul.project.src_dir }}"
     - name: Deploy Heat
@@ -100,7 +100,7 @@
         set -xe;
         ./tools/deployment/developer/ceph/090-heat.sh
       environment:
-        EXTRA_CONFIG: "--values=./tools/overrides/releases/newton/kolla.yaml"
+        OSH_EXTRA_HELM_ARGS: "--values=./tools/overrides/releases/newton/kolla.yaml"
       args:
         chdir: "{{ zuul.project.src_dir }}"
     # - name: Deploy Horizon
@@ -114,7 +114,7 @@
         set -xe;
         ./tools/deployment/developer/ceph/110-ceph-radosgateway.sh
       environment:
-        EXTRA_CONFIG: "--values=./tools/overrides/releases/newton/kolla.yaml"
+        OSH_EXTRA_HELM_ARGS: "--values=./tools/overrides/releases/newton/kolla.yaml"
       args:
         chdir: "{{ zuul.project.src_dir }}"
     - name: Deploy Glance
@@ -122,7 +122,7 @@
         set -xe;
         ./tools/deployment/developer/ceph/120-glance.sh
       environment:
-        EXTRA_CONFIG: "--values=./tools/overrides/releases/newton/kolla.yaml"
+        OSH_EXTRA_HELM_ARGS: "--values=./tools/overrides/releases/newton/kolla.yaml"
       args:
         chdir: "{{ zuul.project.src_dir }}"
     # - name: Deploy Cinder
@@ -130,7 +130,7 @@
     #     set -xe;
     #     ./tools/deployment/developer/ceph/130-cinder.sh
     #    environment:
-    #      EXTRA_CONFIG: "--values=./tools/overrides/releases/newton/kolla.yaml"
+    #      OSH_EXTRA_HELM_ARGS: "--values=./tools/overrides/releases/newton/kolla.yaml"
     #   args:
     #     chdir: "{{ zuul.project.src_dir }}"
     - name: Deploy OpenvSwitch
@@ -138,7 +138,7 @@
         set -xe;
         ./tools/deployment/developer/ceph/140-openvswitch.sh
       environment:
-        EXTRA_CONFIG: "--values=./tools/overrides/releases/newton/kolla.yaml"
+        OSH_EXTRA_HELM_ARGS: "--values=./tools/overrides/releases/newton/kolla.yaml"
       args:
         chdir: "{{ zuul.project.src_dir }}"
     - name: Deploy Libvirt
@@ -146,7 +146,7 @@
         set -xe;
         ./tools/deployment/developer/ceph/150-libvirt.sh
       environment:
-        EXTRA_CONFIG: "--values=./tools/overrides/releases/newton/kolla.yaml"
+        OSH_EXTRA_HELM_ARGS: "--values=./tools/overrides/releases/newton/kolla.yaml"
       args:
         chdir: "{{ zuul.project.src_dir }}"
     - name: Deploy VM Compute Kit
@@ -154,7 +154,7 @@
         set -xe;
         ./tools/deployment/developer/ceph/160-compute-kit.sh
       environment:
-        EXTRA_CONFIG: "--values=./tools/overrides/releases/newton/kolla.yaml"
+        OSH_EXTRA_HELM_ARGS: "--values=./tools/overrides/releases/newton/kolla.yaml"
       args:
         chdir: "{{ zuul.project.src_dir }}"
     - name: Setup Gateway
@@ -162,7 +162,7 @@
         set -xe;
         ./tools/deployment/developer/ceph/170-setup-gateway.sh
       environment:
-        EXTRA_CONFIG: "--values=./tools/overrides/releases/newton/kolla.yaml"
+        OSH_EXTRA_HELM_ARGS: "--values=./tools/overrides/releases/newton/kolla.yaml"
       args:
         chdir: "{{ zuul.project.src_dir }}"
     - name: Deploy use the cloud
@@ -170,6 +170,6 @@
         set -xe;
         ./tools/deployment/developer/ceph/900-use-it.sh
       environment:
-        EXTRA_CONFIG: "--values=./tools/overrides/releases/newton/kolla.yaml"
+        OSH_EXTRA_HELM_ARGS: "--values=./tools/overrides/releases/newton/kolla.yaml"
       args:
         chdir: "{{ zuul.project.src_dir }}"
diff --git a/tools/overrides/backends/networking/linuxbridge.yaml b/tools/overrides/backends/networking/linuxbridge.yaml
new file mode 100644
index 0000000000..31828eda00
--- /dev/null
+++ b/tools/overrides/backends/networking/linuxbridge.yaml
@@ -0,0 +1,21 @@
+# Copyright 2017 The Openstack-Helm Authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Values for neutron using Linux Bridge.
+# This file contains overrides to launch a MVP deployment of neutron and nova
+# using Linux Bridge for the OpenStack-Helm gates, and local development use.
+# It should be kept to the bare minimum required for this purpose.
+
+network:
+  backend: linuxbridge
diff --git a/tools/overrides/example/keystone_domain_config.yaml b/tools/overrides/example/keystone_domain_config.yaml
index 3672990fbe..4d63f8e531 100644
--- a/tools/overrides/example/keystone_domain_config.yaml
+++ b/tools/overrides/example/keystone_domain_config.yaml
@@ -12,11 +12,6 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-# MVP values for neutron using Linux Bridge.
-# This file contains overrides to launch a MVP deployment of neutron using
-# Linux Bridge for the OpenStack-Helm gates, and local development use.
-# It should be kept to the bare minimum required for this purpose.
-
 # This example sets the default domain to be LDAP based, and adds in a new
 # dbdomain that is SQL-backed.  Note that for this to work, you need to set
 # an admin (env: OS_USERNAME and OS_PASSWORD) that is valid in the LDAP.
diff --git a/tools/overrides/mvp/README.rst b/tools/overrides/mvp/README.rst
deleted file mode 100644
index 0a49120659..0000000000
--- a/tools/overrides/mvp/README.rst
+++ /dev/null
@@ -1,15 +0,0 @@
-============================
-OpenStack-Helm MVP Overrides
-============================
-
-The project specific overrides in this directory allow you to reduce the default
-resilience of OpenStack-Helm, by turning off HA of the Neutron Agents.
-Additionally the default distributed storage backend, Ceph, is disabled and
-replaced by local storage for OpenStack components.
-
-These changed are made to achieve these goals:
- * Demonstrating how values can be set and defined within OpenStack-Helm
- * Allowing OpenStack-Helm to run on a single node for:
-  * Development
-  * Demonstration
-  * Basic integration pipelines in a CI System
diff --git a/tools/overrides/mvp/neutron-linuxbridge.yaml b/tools/overrides/mvp/neutron-linuxbridge.yaml
deleted file mode 100644
index 2440dc738c..0000000000
--- a/tools/overrides/mvp/neutron-linuxbridge.yaml
+++ /dev/null
@@ -1,65 +0,0 @@
-# Copyright 2017 The Openstack-Helm Authors.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# MVP values for neutron using Linux Bridge.
-# This file contains overrides to launch a MVP deployment of neutron using
-# Linux Bridge for the OpenStack-Helm gates, and local development use.
-# It should be kept to the bare minimum required for this purpose.
-
-network:
-  backend: linuxbridge
-  interface:
-    tunnel: docker0
-
-manifests:
-  daemonset_lb_agent: true
-  daemonset_ovs_agent: false
-  daemonset_ovs_db: false
-  daemonset_ovs_vswitchd: false
-
-dependencies:
-  dhcp:
-    daemonset:
-      - neutron-lb-agent
-  l3:
-    daemonset:
-      - neutron-lb-agent
-  metadata:
-    daemonset:
-      - neutron-lb-agent
-
-conf:
-  neutron:
-    DEFAULT:
-      interface_driver: linuxbridge
-      l3_ha: False
-      min_l3_agents_per_router: 1
-      max_l3_agents_per_router: 1
-      l3_ha_network_type: vxlan
-      dhcp_agents_per_network: 1
-  dhcp_agent:
-    DEFAULT:
-      interface_driver: linuxbridge
-  l3_agent:
-    DEFAULT:
-      interface_driver: linuxbridge
-  plugins:
-    ml2_conf:
-      ml2:
-        mechanism_drivers: linuxbridge, l2population
-      ml2_type_flat:
-        flat_networks: public
-    linuxbridge_agent:
-      linux_bridge:
-        bridge_mappings: "public:br-ex"