IT for provider network 58/47758/7
authorJosh <jhershbe@redhat.com>
Sun, 30 Oct 2016 15:10:06 +0000 (17:10 +0200)
committerSam Hague <shague@redhat.com>
Mon, 14 Nov 2016 17:39:26 +0000 (17:39 +0000)
Ping between ports on different nodes
Uses a docker image that:
a) expects two networks, one for mgmt traffic and one for the provider
network
b) binds ovsdb-server to the mgmt nic only
c) sets the provider nic in provider_mappings

Details about the image can be found here:
https://github.com/jhershberg/docker-centos-ovs/tree/two-nics

This commit depends on:
https://git.opendaylight.org/gerrit/#/c/47757/

Change-Id: Ia912dd12ed44769df3c94708712ddeda3f59d669
Signed-off-by: Josh <jhershbe@redhat.com>
vpnservice/it/impl/src/test/java/org/opendaylight/netvirt/it/AbstractNetOvs.java
vpnservice/it/impl/src/test/java/org/opendaylight/netvirt/it/NetOvs.java
vpnservice/it/impl/src/test/java/org/opendaylight/netvirt/it/NetvirtIT.java
vpnservice/it/impl/src/test/java/org/opendaylight/netvirt/it/NeutronNetwork.java

index e80d21b8c6c44788be2213c09ae19695531f15e6..f48ee94f08fd833dbed5f2500d1a7f101cc298c5 100644 (file)
@@ -17,6 +17,9 @@ import org.opendaylight.ovsdb.utils.mdsal.utils.MdsalUtils;
 import org.opendaylight.ovsdb.utils.ovsdb.it.utils.DockerOvs;
 import org.opendaylight.ovsdb.utils.southbound.utils.SouthboundUtils;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.NetworkTypeBase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.NetworkTypeFlat;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.NetworkTypeVxlan;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.ports.attributes.Ports;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.ports.attributes.ports.Port;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.ports.attributes.ports.PortBuilder;
@@ -46,14 +49,25 @@ public class AbstractNetOvs implements NetOvs {
                 getClass().getSimpleName(), isUserSpace, dockerOvs.usingExternalDocker());
     }
 
+    @Override
     public String createNetwork(String networkName, String segId, String ipPfx) {
-        NeutronNetwork neutronNetwork = new NeutronNetwork(mdsalUtils, segId, ipPfx);
+        return createNetwork(networkName, segId, ipPfx, NetworkTypeVxlan.class, null);
+    }
+
+    private String createNetwork(String networkName, String segId, String ipPfx,
+                                 Class<? extends NetworkTypeBase> netType, String physNet) {
+        NeutronNetwork neutronNetwork = new NeutronNetwork(mdsalUtils, segId, ipPfx, netType, physNet);
         neutronNetwork.createNetwork(networkName);
         neutronNetwork.createSubnet(networkName + "subnet");
         putNeutronNetwork(networkName, neutronNetwork);
         return networkName;
     }
 
+    @Override
+    public String createFlatNetwork(String networkName, String segId, String ipPfx, String providerNet) {
+        return createNetwork(networkName, segId, ipPfx, NetworkTypeFlat.class, providerNet);
+    }
+
     @Override
     public String createRouter(String routerName) {
         NeutronRouter neutronRouter = new NeutronRouter(mdsalUtils);
index 720d05df2b7d8d07db8a60e6f3171ce2b935b8be..c0702d8a131b433838365d9e085d1f35b95bc1f3 100644 (file)
@@ -15,6 +15,8 @@ import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.
 public interface NetOvs {
     String createNetwork(String networkName, String segId, String ipPfx);
 
+    String createFlatNetwork(String networkName, String segId, String ipPfx, String physNet);
+
     String createRouter(String routerName);
 
     String createPort(int ovsInstance, Node bridgeNode, String networkName, List<Uuid> securityGroupList) throws
index 4bf4c1506694668f7ac7d694388dd2b75490c53f..57bc2d7f8db96551bac5e45bb02eea7b177c17b3 100644 (file)
@@ -78,6 +78,7 @@ import org.slf4j.LoggerFactory;
 @ExamReactorStrategy(PerClass.class)
 public class NetvirtIT extends AbstractMdsalTestBase {
     private static final Logger LOG = LoggerFactory.getLogger(NetvirtIT.class);
+    private static final String PHYSNET = "physnet";
     private static OvsdbItUtils itUtils;
     private static MdsalUtils mdsalUtils = null;
     private static SouthboundUtils southboundUtils;
@@ -433,8 +434,61 @@ public class NetvirtIT extends AbstractMdsalTestBase {
             disconnectOvs(nodeInfo);
             disconnectOvs(nodeInfo2);
         } catch (Exception e) {
-            LOG.error("testNeutronNet: Exception thrown by OvsDocker.OvsDocker()", e);
-            fail("testNeutronNet: Exception thrown by OvsDocker.OvsDocker() : " + e.getMessage());
+            LOG.error("testNeutronNetTwoNodes: Exception thrown by OvsDocker.OvsDocker()", e);
+            fail("testNeutronNetTwoNodes: Exception thrown by OvsDocker.OvsDocker() : " + e.getMessage());
+        }
+    }
+
+    @Test
+    @SuppressWarnings("checkstyle:IllegalCatch")
+    public void testProviderNetTwoNodes() throws InterruptedException {
+        int ovs1 = 1;
+        int ovs2 = 2;
+        Properties props = System.getProperties();
+        props.setProperty(ItConstants.DOCKER_COMPOSE_FILE_NAME, "two_ovs-2.5.1-dual-nic.yml");
+        props.setProperty(ItConstants.DOCKER_WAIT_FOR_PING_SECS, "20");
+
+        //Remove the ovsdb.controller.ipaddress to force DockerOvs to create it's own network
+        //since that is the only way this docker compose file works (it uses the "odl" network)
+        //We reset the env. in the finally clause
+        String controllerIpAddress = props.getProperty(ItConstants.CONTROLLER_IPADDRESS);
+        props.remove(ItConstants.CONTROLLER_IPADDRESS);
+        try (DockerOvs ovs = new DockerOvs()) {
+            if (ovs.usingExternalDocker()) {
+                LOG.debug("testProviderNetTwoNodes - Not configured to run docker, skipping this test");
+                return;
+            }
+            Boolean isUserSpace = userSpaceEnabled.equals("yes");
+            LOG.info("isUserSpace: {}, usingExternalDocker: {}", isUserSpace, ovs.usingExternalDocker());
+
+            NetOvs netOvs = getNetOvs(ovs, isUserSpace);
+
+            NodeInfo nodeInfo = connectOvs(netOvs, ovs1, ovs);
+            NodeInfo nodeInfo2 = connectOvs(netOvs, ovs2, ovs);
+
+            netOvs.createFlatNetwork(NETWORK1_NAME, NETWORK1_SEGID, NETWORK1_IPPFX, PHYSNET);
+
+            String port1 = addPort(netOvs, nodeInfo, ovs1, NETWORK1_NAME, null);
+            String port2 = addPort(netOvs, nodeInfo2, ovs2, NETWORK1_NAME, null);
+
+            int rc = netOvs.ping(port1, port2);
+            LOG.info("Ping status rc: {}, ignored for isUserSpace: {}", rc, isUserSpace);
+            netOvs.logState(ovs1, "node 1 after ping");
+            netOvs.logState(ovs2, "node 2 after ping");
+            if (!isUserSpace) {
+                LOG.info("Ping status rc: {}", rc);
+            }
+
+            destroyOvs(netOvs);
+            disconnectOvs(nodeInfo);
+            disconnectOvs(nodeInfo2);
+        } catch (Exception e) {
+            LOG.error("testProviderNet: Exception thrown by OvsDocker.OvsDocker()", e);
+            fail("testProviderNet: Exception thrown by OvsDocker.OvsDocker() : " + e.getMessage());
+        } finally {
+            if (controllerIpAddress != null) {
+                props.setProperty(ItConstants.CONTROLLER_IPADDRESS, controllerIpAddress);
+            }
         }
     }
 
index 2442bc27a15e1f94046494d5e946fa52ae50c15a..a060d44e32cbce85a5d0dd26bf979ca7a54ad389 100644 (file)
@@ -15,6 +15,7 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.constants.rev150712.IpVersionV4;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.NetworkTypeBase;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.NetworkTypeVxlan;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.networks.attributes.Networks;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.networks.attributes.networks.Network;
@@ -33,16 +34,25 @@ public class NeutronNetwork {
     private final String tenantId;
     private final String networkId;
     private final String subnetId;
+    private final Class<? extends NetworkTypeBase> netType;
+    private final String providerNet;
     private Network network;
     private Subnet subnet;
 
     NeutronNetwork(final MdsalUtils mdsalUtils, final String segId, final String ipPfx) {
+        this(mdsalUtils, segId, ipPfx, NetworkTypeVxlan.class, null);
+    }
+
+    NeutronNetwork(final MdsalUtils mdsalUtils, final String segId, final String ipPfx,
+                                                    Class<? extends NetworkTypeBase> netType, String providerNet) {
         this.mdsalUtils = mdsalUtils;
         this.segId = segId;
         this.ipPfx = ipPfx;
         tenantId = UUID.randomUUID().toString();
         networkId = UUID.randomUUID().toString();
         subnetId = UUID.randomUUID().toString();
+        this.netType = netType;
+        this.providerNet = providerNet;
     }
 
     String getNetworkId() {
@@ -59,8 +69,9 @@ public class NeutronNetwork {
 
     void createNetwork(final String name) {
         NetworkProviderExtension networkProviderExtension = new NetworkProviderExtensionBuilder()
-                .setNetworkType(NetworkTypeVxlan.class)
+                .setNetworkType(netType)
                 .setSegmentationId(segId)
+                .setPhysicalNetwork(providerNet)
                 .build();
 
         network = new NetworkBuilder()