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;
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);
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
@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;
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);
+ }
}
}
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;
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() {
void createNetwork(final String name) {
NetworkProviderExtension networkProviderExtension = new NetworkProviderExtensionBuilder()
- .setNetworkType(NetworkTypeVxlan.class)
+ .setNetworkType(netType)
.setSegmentationId(segId)
+ .setPhysicalNetwork(providerNet)
.build();
network = new NetworkBuilder()