Merge "Adding files for Queens release"
diff --git a/README.rst b/README.rst
index 3e01825..9cbd45a 100644
--- a/README.rst
+++ b/README.rst
@@ -674,6 +674,33 @@
             ovs:
               driver: openvswitch
 
+Neutron with additional physical networks
+-----------------------------------------
+
+Neutron Server only
+
+.. code-block:: yaml
+
+    neutron:
+      server:
+        version: ocata
+        ...
+        backend:
+          engine: ml2
+          tenant_network_types: "flat,vlan" # Can be mixed flat,vlan,vxlan
+          ...
+          # also need to configure corresponding additional bridge_mappings on
+          # compute and gateway nodes
+          physnets:
+            sriov_net:
+              mtu: 9000 # Optional, defaults to 1500
+              vlan_range: '100:200' # Optional
+            ext_net2:
+              mtu: 1500
+          mechanism:
+            ovs:
+              driver: openvswitch
+
 Advanced Neutron Features (DPDK, SR-IOV)
 ----------------------------------------
 
diff --git a/neutron/files/ocata/ml2_conf.ini b/neutron/files/ocata/ml2_conf.ini
index abff949..300afce 100644
--- a/neutron/files/ocata/ml2_conf.ini
+++ b/neutron/files/ocata/ml2_conf.ini
@@ -175,6 +175,10 @@
 {%- if server.get('ironic_enabled', False) %}
 {%- do physical_network_mtus.append(['physnet3',server.backend.get('ironic_net_mtu', server.backend.get('external_mtu', '1500'))]|join(":")) %}
 {%- endif %}
+
+{%- for physnet, params in server.backend.get('physnets', {}).iteritems() %}
+{%- do physical_network_mtus.append([physnet, params.get('mtu')]|join(":")) if params.get('mtu', False) %}
+{%- endfor %}
 physical_network_mtus = {{ ','.join(physical_network_mtus) }}
 
 # Default network type for external networks when no provider attributes are
@@ -256,6 +260,10 @@
 {%- if server.get('ironic_enabled', False) %}
 {%- do network_vlan_ranges.append(['physnet3',server.backend.get('ironic_vlan_range')]|join(":")) %}
 {%- endif %}
+
+{%- for physnet, params in server.backend.get('physnets', {}).iteritems() %}
+{%- do network_vlan_ranges.append([physnet, params.get('vlan_range')]|join(":") if params.get('vlan_range', False) else physnet) %}
+{%- endfor %}
 network_vlan_ranges = {{ ','.join(network_vlan_ranges) }}
 
 [ml2_type_vxlan]
diff --git a/neutron/files/pike/ml2_conf.ini b/neutron/files/pike/ml2_conf.ini
index a9b8c97..377ecd7 100644
--- a/neutron/files/pike/ml2_conf.ini
+++ b/neutron/files/pike/ml2_conf.ini
@@ -176,6 +176,10 @@
 {%- if server.get('ironic_enabled', False) %}
 {%- do physical_network_mtus.append(['physnet3',server.backend.get('ironic_net_mtu', server.backend.get('external_mtu', '1500'))]|join(":")) %}
 {%- endif %}
+
+{%- for physnet, params in server.backend.get('physnets', {}).iteritems() %}
+{%- do physical_network_mtus.append([physnet, params.get('mtu')]|join(":")) if params.get('mtu', False) %}
+{%- endfor %}
 physical_network_mtus = {{ ','.join(physical_network_mtus) }}
 
 # Default network type for external networks when no provider attributes are
@@ -257,6 +261,10 @@
 {%- if server.get('ironic_enabled', False) %}
 {%- do network_vlan_ranges.append(['physnet3',server.backend.get('ironic_vlan_range')]|join(":")) %}
 {%- endif %}
+
+{%- for physnet, params in server.backend.get('physnets', {}).iteritems() %}
+{%- do network_vlan_ranges.append([physnet, params.get('vlan_range')]|join(":") if params.get('vlan_range', False)) %}
+{%- endfor %}
 network_vlan_ranges = {{ ','.join(network_vlan_ranges) }}
 
 [ml2_type_vxlan]
diff --git a/neutron/files/queens/ml2_conf.ini b/neutron/files/queens/ml2_conf.ini
index e30dad1..836192b 100644
--- a/neutron/files/queens/ml2_conf.ini
+++ b/neutron/files/queens/ml2_conf.ini
@@ -82,6 +82,10 @@
 {%- if server.get('ironic_enabled', False) %}
 {%- do physical_network_mtus.append(['physnet3',server.backend.get('ironic_net_mtu', server.backend.get('external_mtu', '1500'))]|join(":")) %}
 {%- endif %}
+
+{%- for physnet, params in server.backend.get('physnets', {}).iteritems() %}
+{%- do physical_network_mtus.append([physnet, params.get('mtu')]|join(":")) if params.get('mtu', False) %}
+{%- endfor %}
 physical_network_mtus = {{ ','.join(physical_network_mtus) }}
 
 # Default network type for external networks when no provider attributes are
@@ -163,6 +167,10 @@
 {%- if server.get('ironic_enabled', False) %}
 {%- do network_vlan_ranges.append(['physnet3',server.backend.get('ironic_vlan_range')]|join(":")) %}
 {%- endif %}
+
+{%- for physnet, params in server.backend.get('physnets', {}).iteritems() %}
+{%- do network_vlan_ranges.append([physnet, params.get('vlan_range')]|join(":") if params.get('vlan_range', False) else physnet) %}
+{%- endfor %}
 network_vlan_ranges = {{ ','.join(network_vlan_ranges) }}
 
 [ml2_type_vxlan]
diff --git a/tests/pillar/control_single.sls b/tests/pillar/control_single.sls
index 8c7821e..b584d72 100644
--- a/tests/pillar/control_single.sls
+++ b/tests/pillar/control_single.sls
@@ -16,6 +16,12 @@
       password: password
       token: token
       tenant: admin
+      physnets:
+        sriov_net:
+          mtu: 9000 # Optional, defaults to 1500
+          vlan_range: '100:200' # Optional
+        ext_net2:
+          mtu: 1500
     fwaas: false
     dns_domain: novalocal
     tunnel_type: vxlan