Allow override default physnets

Some customers want to be able to specify list of physnets
(provider nets) explicitly, and not having default physnet1/2/3.
We already allow override 'bridge_mappings' on computes so
this is logical continuation.

Change-Id: Iff9657c5261b3b2f715a8b1fbd7dd925187a7857
Related-Prod: PROD-21121
diff --git a/README.rst b/README.rst
index 9ee240f..a5f8e8a 100644
--- a/README.rst
+++ b/README.rst
@@ -678,8 +678,8 @@
             ovs:
               driver: openvswitch
 
-Neutron with additional physical networks
------------------------------------------
+Neutron with explicit physical networks
+---------------------------------------
 
 Neutron Server only
 
@@ -693,9 +693,11 @@
           engine: ml2
           tenant_network_types: "flat,vlan" # Can be mixed flat,vlan,vxlan
           ...
-          # also need to configure corresponding additional bridge_mappings on
+          # also need to configure corresponding bridge_mappings on
           # compute and gateway nodes
-          physnets:
+          physnets: # only listed physnets will be configured (overrides physnet1/2/3)
+            external:
+              mtu: 1500
             sriov_net:
               mtu: 9000 # Optional, defaults to 1500
               vlan_range: '100:200' # Optional
diff --git a/neutron/files/ocata/ml2_conf.ini b/neutron/files/ocata/ml2_conf.ini
index 300afce..6f2df28 100644
--- a/neutron/files/ocata/ml2_conf.ini
+++ b/neutron/files/ocata/ml2_conf.ini
@@ -166,6 +166,13 @@
 # (list value)
 #physical_network_mtus =
 {%- set physical_network_mtus = [] %}
+
+{%- 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 %}
+
+{%- if not physical_network_mtus %}
+
 {%- if server.get('external_access', True) %}
 {%- do physical_network_mtus.append(['physnet1',server.backend.get('external_mtu', '1500')]|join(":")) %}
 {%- endif %}
@@ -176,9 +183,8 @@
 {%- 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 %}
+{%- endif %}
+
 physical_network_mtus = {{ ','.join(physical_network_mtus) }}
 
 # Default network type for external networks when no provider attributes are
@@ -251,6 +257,13 @@
 # tenant networks. (list value)
 #network_vlan_ranges =
 {%- set network_vlan_ranges = [] %}
+
+{%- 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 %}
+
+{%- if not network_vlan_ranges %}
+
 {%- if server.backend.external_vlan_range is defined %}
 {%- do network_vlan_ranges.append(['physnet1',server.backend.get('external_vlan_range')]|join(":")) %}
 {%- endif %}
@@ -261,9 +274,8 @@
 {%- 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 %}
+{%- endif %}
+
 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 88c4c8e..aaee0b0 100644
--- a/neutron/files/pike/ml2_conf.ini
+++ b/neutron/files/pike/ml2_conf.ini
@@ -170,6 +170,13 @@
 # (list value)
 #physical_network_mtus =
 {%- set physical_network_mtus = [] %}
+
+{%- 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 %}
+
+{%- if not physical_network_mtus %}
+
 {%- if server.get('external_access', True) %}
 {%- do physical_network_mtus.append(['physnet1',server.backend.get('external_mtu', '1500')]|join(":")) %}
 {%- endif %}
@@ -180,9 +187,8 @@
 {%- 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 %}
+{%- endif %}
+
 physical_network_mtus = {{ ','.join(physical_network_mtus) }}
 
 # Default network type for external networks when no provider attributes are
@@ -253,8 +259,14 @@
 # specifying physical_network names usable for VLAN provider and tenant
 # networks, as well as ranges of VLAN tags on each available for allocation to
 # tenant networks. (list value)
-#network_vlan_ranges =
 {%- set network_vlan_ranges = [] %}
+
+{%- 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 %}
+
+{%- if not network_vlan_ranges %}
+
 {%- if server.backend.external_vlan_range is defined %}
 {%- do network_vlan_ranges.append(['physnet1',server.backend.get('external_vlan_range')]|join(":")) %}
 {%- endif %}
@@ -265,9 +277,8 @@
 {%- 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 %}
+{%- endif %}
+
 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 45e8708..d6cefbe 100644
--- a/neutron/files/queens/ml2_conf.ini
+++ b/neutron/files/queens/ml2_conf.ini
@@ -76,6 +76,13 @@
 # (list value)
 #physical_network_mtus =
 {%- set physical_network_mtus = [] %}
+
+{%- 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 %}
+
+{%- if not physical_network_mtus %}
+
 {%- if server.get('external_access', True) %}
 {%- do physical_network_mtus.append(['physnet1',server.backend.get('external_mtu', '1500')]|join(":")) %}
 {%- endif %}
@@ -86,9 +93,8 @@
 {%- 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 %}
+{%- endif %}
+
 physical_network_mtus = {{ ','.join(physical_network_mtus) }}
 
 # Default network type for external networks when no provider attributes are
@@ -161,6 +167,13 @@
 # tenant networks. (list value)
 #network_vlan_ranges =
 {%- set network_vlan_ranges = [] %}
+
+{%- 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 %}
+
+{%- if not network_vlan_ranges %}
+
 {%- if server.backend.external_vlan_range is defined %}
 {%- do network_vlan_ranges.append(['physnet1',server.backend.get('external_vlan_range')]|join(":")) %}
 {%- endif %}
@@ -171,9 +184,8 @@
 {%- 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 %}
+{%- endif %}
+
 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 445806c..79894f7 100644
--- a/tests/pillar/control_single.sls
+++ b/tests/pillar/control_single.sls
@@ -18,6 +18,8 @@
       token: token
       tenant: admin
       physnets:
+        external:
+          mtu: 1500
         sriov_net:
           mtu: 9000 # Optional, defaults to 1500
           vlan_range: '100:200' # Optional