Allow network configuration for mtu tests

In NFV baremetal deployments, networks settings may be constrained.
This patch allows to configure on create:
 subnet cidr, for provider networks not managed by neutron
 network type, VLAN/VXLAN/GRE/FLAT
 mtu, network mtu for OVS+DPDK bridge/bond mtu settings.

It accommodate network environment in class NetworkWritableMtuTest.
It also allows to test ovs [through ovs+dpdk] jumbo and mtu.

Change-Id: Ia519d3bb7eb32b1f986983c9b74ee3621881172f
diff --git a/neutron_tempest_plugin/config.py b/neutron_tempest_plugin/config.py
index 65282cf..fc07e81 100644
--- a/neutron_tempest_plugin/config.py
+++ b/neutron_tempest_plugin/config.py
@@ -11,7 +11,6 @@
 #    under the License.
 
 from oslo_config import cfg
-
 from tempest import config
 
 
@@ -47,6 +46,17 @@
                help='The agent mode for L3 agents in the deployment. '
                     'Configure this only when the single value is used by '
                     'all agents in the deployment.'),
+    cfg.StrOpt('test_mtu_networks',
+               default='[{"provider:network_type":"vxlan",'
+                       '"mtu":1200, "cidr":"10.100.0.0/16"}'
+                       ','
+                       '{"provider:network_type":"vxlan",'
+                       '"mtu":1300, "cidr":"10.200.0.0/16"}]',
+               help='Configuration for test networks. The format is JSON. '
+                    '"provider:network_type":<TYPE> - string '
+                    '"mtu":<MTU> - integer '
+                    '"cidr"<SUBNET/MASK> - string '
+                    '"provider:segmentation_id":<VLAN_ID> - integer')
 ]
 
 # TODO(amuller): Redo configuration options registration as part of the planned
diff --git a/neutron_tempest_plugin/scenario/test_mtu.py b/neutron_tempest_plugin/scenario/test_mtu.py
index b38d770..0e3afe9 100644
--- a/neutron_tempest_plugin/scenario/test_mtu.py
+++ b/neutron_tempest_plugin/scenario/test_mtu.py
@@ -14,6 +14,7 @@
 #    under the License.
 
 from neutron_lib.api.definitions import provider_net
+from oslo_serialization import jsonutils
 from tempest.common import utils
 from tempest.common import waiters
 from tempest.lib.common.utils import data_utils
@@ -59,6 +60,9 @@
         fip = self.create_and_associate_floatingip(port['id'])
         return server, fip
 
+    def _get_network_params(self):
+        return jsonutils.loads(CONF.neutron_plugin_options.test_mtu_networks)
+
 
 class NetworkMtuTest(NetworkMtuBaseTest):
     credentials = ['primary', 'admin']
@@ -97,13 +101,13 @@
         self.assertNotEqual(self.networks[0]['mtu'], self.networks[1]['mtu'])
         self.networks.sort(key=lambda net: net['mtu'])
         server1, fip1 = self.create_pingable_vm(self.networks[0],
-            self.keypair, self.secgroup)
+                                                self.keypair, self.secgroup)
         server_ssh_client1 = ssh.Client(
             self.floating_ips[0]['floating_ip_address'],
             CONF.validation.image_ssh_user,
             pkey=self.keypair['private_key'])
         server2, fip2 = self.create_pingable_vm(self.networks[1],
-            self.keypair, self.secgroup)
+                                                self.keypair, self.secgroup)
         server_ssh_client2 = ssh.Client(
             self.floating_ips[0]['floating_ip_address'],
             CONF.validation.image_ssh_user,
@@ -150,7 +154,7 @@
     def skip_checks(cls):
         super(NetworkWritableMtuTest, cls).skip_checks()
         if ("vxlan" not in
-            config.CONF.neutron_plugin_options.available_type_drivers):
+                config.CONF.neutron_plugin_options.available_type_drivers):
             raise cls.skipException("VXLAN type_driver is not enabled")
 
     @classmethod
@@ -160,24 +164,24 @@
 
     def _create_setup(self):
         self.admin_client = self.os_admin.network_client
-        net_kwargs = {'tenant_id': self.client.tenant_id,
-                      'provider:network_type': 'vxlan'}
-        for _ in range(2):
-            net_kwargs['name'] = data_utils.rand_name('net')
-            network = self.admin_client.create_network(**net_kwargs)[
+        for test_net in self._get_network_params():
+            test_net['tenant_id'] = self.client.tenant_id
+            test_net['name'] = data_utils.rand_name('net')
+            cidr = None if 'cidr' not in test_net else test_net.pop('cidr')
+            network = self.admin_client.create_network(**test_net)[
                 'network']
             self.networks.append(network)
             self.addCleanup(self.admin_client.delete_network, network['id'])
-            subnet = self.create_subnet(network)
+            subnet = self.create_subnet(network, cidr=cidr)
             self.create_router_interface(self.router['id'], subnet['id'])
             self.addCleanup(self.client.remove_router_interface_with_subnet_id,
                             self.router['id'], subnet['id'])
 
-        # Update network mtu.
+        # update network mtu
         net_mtu = self.admin_client.show_network(
             self.networks[0]['id'])['network']['mtu']
         self.admin_client.update_network(self.networks[0]['id'],
-            mtu=(net_mtu - 1))
+                                         mtu=(net_mtu - 1))
         self.networks[0]['mtu'] = (
             self.admin_client.show_network(
                 self.networks[0]['id'])['network']['mtu'])
@@ -186,13 +190,13 @@
         self.assertNotEqual(self.networks[0]['mtu'], self.networks[1]['mtu'])
         self.networks.sort(key=lambda net: net['mtu'])
         server1, fip1 = self.create_pingable_vm(self.networks[0],
-            self.keypair, self.secgroup)
+                                                self.keypair, self.secgroup)
         server_ssh_client1 = ssh.Client(
             self.floating_ips[0]['floating_ip_address'],
             CONF.validation.image_ssh_user,
             pkey=self.keypair['private_key'])
         server2, fip2 = self.create_pingable_vm(self.networks[1],
-            self.keypair, self.secgroup)
+                                                self.keypair, self.secgroup)
         server_ssh_client2 = ssh.Client(
             self.floating_ips[0]['floating_ip_address'],
             CONF.validation.image_ssh_user,