Adding posibility to add extra bridge_mappings to neutron OVS agent.

Change-Id: I039eccb094bd8531f67b22fad9502567f063ce60
Related-Prod: PROD-17094
diff --git a/README.rst b/README.rst
index 9e37b32..215d855 100644
--- a/README.rst
+++ b/README.rst
@@ -292,6 +292,35 @@
         external_access: false
 
 
+Add additional bridge mappings for OVS bridges
+----------------------------------------------
+
+By default we have external access turned on, so among any physnets in
+your reclass there would be additional one: physnet1, which is mapped to
+br-floating
+
+If you need to add extra non-default bridge mappings they can be defined
+separately for both gateways and compute nodes:
+
+gateways:
+
+.. code-block:: yaml
+
+    neutron:
+      gateway:
+        bridge_mappings:
+          physnet4: br-floating-internet
+
+compute nodes:
+
+.. code-block:: yaml
+
+    neutron:
+      compute:
+        bridge_mappings:
+          physnet4: br-floating-internet
+
+
 Specify different mtu values for different physnets
 ---------------------------------------------------
 
diff --git a/neutron/files/mitaka/openvswitch_agent.ini b/neutron/files/mitaka/openvswitch_agent.ini
index 25ecbbd..50ba830 100644
--- a/neutron/files/mitaka/openvswitch_agent.ini
+++ b/neutron/files/mitaka/openvswitch_agent.ini
@@ -190,9 +190,15 @@
 # bridges on each agent. Note: If you remove a bridge from this mapping, make sure to disconnect it from the integration bridge as it won't
 # be managed by the agent anymore. Deprecated for ofagent. (list value)
 {% set bridge_mappings=[] %}
-{%- if neutron.get('external_access', True) %}{% do bridge_mappings.append('physnet1:br-floating') %}{%- endif %}
-{%- if "vlan" in neutron.backend.tenant_network_types %}{% do bridge_mappings.append('physnet2:br-prv') %}{%- endif %}
-{%- if neutron.get('ironic_enabled', False) %}{% do bridge_mappings.append('physnet3:br-baremetal') %}{%- endif %}
+{%- if neutron.bridge_mappings is defined %}
+{%- for physnet,bridge in neutron.bridge_mappings.iteritems() %}{%- do bridge_mappings.append(physnet+':'+bridge) %}{%- endfor %}
+{%- endif %}
+{%- if 'br-floating' not in neutron.get('bridge_mappings', {}).values() %}{%- if neutron.get('external_access', True) %}
+{%- do bridge_mappings.append('physnet1:br-floating') %}{%- endif %}{%- endif %}
+{%- if 'br-prv' not in neutron.get('bridge_mappings', {}).values() %}{%- if "vlan" in neutron.backend.tenant_network_types %}
+{%- do bridge_mappings.append('physnet2:br-prv') %}{%- endif %}{%- endif %}
+{%- if 'br-baremetal' not in neutron.get('bridge_mappings', {}).values() %}{%- if neutron.get('ironic_enabled', False) %}
+{%- do bridge_mappings.append('physnet3:br-baremetal') %}{%- endif %}{%- endif %}
 {%- if bridge_mappings %}
 bridge_mappings = {{ ','.join(bridge_mappings) }}
 {%- else %}
diff --git a/neutron/files/newton/openvswitch_agent.ini b/neutron/files/newton/openvswitch_agent.ini
index 25ecbbd..50ba830 100644
--- a/neutron/files/newton/openvswitch_agent.ini
+++ b/neutron/files/newton/openvswitch_agent.ini
@@ -190,9 +190,15 @@
 # bridges on each agent. Note: If you remove a bridge from this mapping, make sure to disconnect it from the integration bridge as it won't
 # be managed by the agent anymore. Deprecated for ofagent. (list value)
 {% set bridge_mappings=[] %}
-{%- if neutron.get('external_access', True) %}{% do bridge_mappings.append('physnet1:br-floating') %}{%- endif %}
-{%- if "vlan" in neutron.backend.tenant_network_types %}{% do bridge_mappings.append('physnet2:br-prv') %}{%- endif %}
-{%- if neutron.get('ironic_enabled', False) %}{% do bridge_mappings.append('physnet3:br-baremetal') %}{%- endif %}
+{%- if neutron.bridge_mappings is defined %}
+{%- for physnet,bridge in neutron.bridge_mappings.iteritems() %}{%- do bridge_mappings.append(physnet+':'+bridge) %}{%- endfor %}
+{%- endif %}
+{%- if 'br-floating' not in neutron.get('bridge_mappings', {}).values() %}{%- if neutron.get('external_access', True) %}
+{%- do bridge_mappings.append('physnet1:br-floating') %}{%- endif %}{%- endif %}
+{%- if 'br-prv' not in neutron.get('bridge_mappings', {}).values() %}{%- if "vlan" in neutron.backend.tenant_network_types %}
+{%- do bridge_mappings.append('physnet2:br-prv') %}{%- endif %}{%- endif %}
+{%- if 'br-baremetal' not in neutron.get('bridge_mappings', {}).values() %}{%- if neutron.get('ironic_enabled', False) %}
+{%- do bridge_mappings.append('physnet3:br-baremetal') %}{%- endif %}{%- endif %}
 {%- if bridge_mappings %}
 bridge_mappings = {{ ','.join(bridge_mappings) }}
 {%- else %}
diff --git a/neutron/files/ocata/openvswitch_agent.ini b/neutron/files/ocata/openvswitch_agent.ini
index a8ae0d2..fa94c21 100644
--- a/neutron/files/ocata/openvswitch_agent.ini
+++ b/neutron/files/ocata/openvswitch_agent.ini
@@ -247,9 +247,15 @@
 # bridge from this mapping, make sure to disconnect it from the integration
 # bridge as it won't be managed by the agent anymore. (list value)
 {% set bridge_mappings=[] %}
-{%- if neutron.get('external_access', True) %}{% do bridge_mappings.append('physnet1:br-floating') %}{%- endif %}
-{%- if "vlan" in neutron.backend.tenant_network_types %}{% do bridge_mappings.append('physnet2:br-prv') %}{%- endif %}
-{%- if neutron.get('ironic_enabled', False) %}{% do bridge_mappings.append('physnet3:br-baremetal') %}{%- endif %}
+{%- if neutron.bridge_mappings is defined %}
+{%- for physnet,bridge in neutron.bridge_mappings.iteritems() %}{%- do bridge_mappings.append(physnet+':'+bridge) %}{%- endfor %}
+{%- endif %}
+{%- if 'br-floating' not in neutron.get('bridge_mappings', {}).values() %}{%- if neutron.get('external_access', True) %}
+{%- do bridge_mappings.append('physnet1:br-floating') %}{%- endif %}{%- endif %}
+{%- if 'br-prv' not in neutron.get('bridge_mappings', {}).values() %}{%- if "vlan" in neutron.backend.tenant_network_types %}
+{%- do bridge_mappings.append('physnet2:br-prv') %}{%- endif %}{%- endif %}
+{%- if 'br-baremetal' not in neutron.get('bridge_mappings', {}).values() %}{%- if neutron.get('ironic_enabled', False) %}
+{%- do bridge_mappings.append('physnet3:br-baremetal') %}{%- endif %}{%- endif %}
 {%- if bridge_mappings %}
 bridge_mappings = {{ ','.join(bridge_mappings) }}
 {%- else %}
diff --git a/neutron/files/pike/openvswitch_agent.ini b/neutron/files/pike/openvswitch_agent.ini
index a8ae0d2..fa94c21 100644
--- a/neutron/files/pike/openvswitch_agent.ini
+++ b/neutron/files/pike/openvswitch_agent.ini
@@ -247,9 +247,15 @@
 # bridge from this mapping, make sure to disconnect it from the integration
 # bridge as it won't be managed by the agent anymore. (list value)
 {% set bridge_mappings=[] %}
-{%- if neutron.get('external_access', True) %}{% do bridge_mappings.append('physnet1:br-floating') %}{%- endif %}
-{%- if "vlan" in neutron.backend.tenant_network_types %}{% do bridge_mappings.append('physnet2:br-prv') %}{%- endif %}
-{%- if neutron.get('ironic_enabled', False) %}{% do bridge_mappings.append('physnet3:br-baremetal') %}{%- endif %}
+{%- if neutron.bridge_mappings is defined %}
+{%- for physnet,bridge in neutron.bridge_mappings.iteritems() %}{%- do bridge_mappings.append(physnet+':'+bridge) %}{%- endfor %}
+{%- endif %}
+{%- if 'br-floating' not in neutron.get('bridge_mappings', {}).values() %}{%- if neutron.get('external_access', True) %}
+{%- do bridge_mappings.append('physnet1:br-floating') %}{%- endif %}{%- endif %}
+{%- if 'br-prv' not in neutron.get('bridge_mappings', {}).values() %}{%- if "vlan" in neutron.backend.tenant_network_types %}
+{%- do bridge_mappings.append('physnet2:br-prv') %}{%- endif %}{%- endif %}
+{%- if 'br-baremetal' not in neutron.get('bridge_mappings', {}).values() %}{%- if neutron.get('ironic_enabled', False) %}
+{%- do bridge_mappings.append('physnet3:br-baremetal') %}{%- endif %}{%- endif %}
 {%- if bridge_mappings %}
 bridge_mappings = {{ ','.join(bridge_mappings) }}
 {%- else %}