ONOS-4076 - Virtual Network CLI commands and bug fixes in
DistributedVirtualNetworkStore.
Change-Id: I7bf67527bccb598385f15ad70091e3f8458d35d3
diff --git a/incubator/net/src/test/java/org/onosproject/incubator/net/virtual/impl/VirtualNetworkManagerTest.java b/incubator/net/src/test/java/org/onosproject/incubator/net/virtual/impl/VirtualNetworkManagerTest.java
index 8976a7e..f2ce5c4 100644
--- a/incubator/net/src/test/java/org/onosproject/incubator/net/virtual/impl/VirtualNetworkManagerTest.java
+++ b/incubator/net/src/test/java/org/onosproject/incubator/net/virtual/impl/VirtualNetworkManagerTest.java
@@ -146,17 +146,30 @@
assertNotNull("The virtual network set should not be null", virtualNetworks);
assertEquals("The virtual network set size did not match.", 2, virtualNetworks.size());
+ int remaining = virtualNetworks.size();
for (VirtualNetwork virtualNetwork : virtualNetworks) {
manager.removeVirtualNetwork(virtualNetwork.id());
+ assertEquals("The expected virtual network size does not match",
+ --remaining, manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1)).size());
// attempt to remove the same virtual network again.
manager.removeVirtualNetwork(virtualNetwork.id());
+ assertEquals("The expected virtual network size does not match",
+ remaining, manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1)).size());
}
virtualNetworks = manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1));
assertTrue("The virtual network set should be empty.", virtualNetworks.isEmpty());
+ // Create/remove a virtual network.
+ VirtualNetwork virtualNetwork = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
+ manager.removeVirtualNetwork(virtualNetwork.id());
+
+ virtualNetworks = manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1));
+ assertTrue("The virtual network set should be empty.", virtualNetworks.isEmpty());
+
// Validate that the events were all received in the correct order.
validateEvents(VirtualNetworkEvent.Type.TENANT_REGISTERED, VirtualNetworkEvent.Type.NETWORK_ADDED,
VirtualNetworkEvent.Type.NETWORK_ADDED, VirtualNetworkEvent.Type.NETWORK_REMOVED,
+ VirtualNetworkEvent.Type.NETWORK_REMOVED, VirtualNetworkEvent.Type.NETWORK_ADDED,
VirtualNetworkEvent.Type.NETWORK_REMOVED);
}
@@ -209,6 +222,13 @@
virtualDevices1 = manager.getVirtualDevices(virtualNetwork1.id());
assertTrue("The virtual device set should be empty.", virtualDevices1.isEmpty());
+ // Add/remove the virtual device again.
+ VirtualDevice virtualDevice = manager.createVirtualDevice(virtualNetwork1.id(),
+ DeviceId.deviceId(deviceIdValue1));
+ manager.removeVirtualDevice(virtualDevice.networkId(), virtualDevice.id());
+ virtualDevices1 = manager.getVirtualDevices(virtualNetwork1.id());
+ assertTrue("The virtual device set should be empty.", virtualDevices1.isEmpty());
+
// Validate that the events were all received in the correct order.
validateEvents(VirtualNetworkEvent.Type.TENANT_REGISTERED, VirtualNetworkEvent.Type.NETWORK_ADDED,
VirtualNetworkEvent.Type.NETWORK_ADDED);
@@ -241,6 +261,12 @@
}
virtualLinks = manager.getVirtualLinks(virtualNetwork1.id());
assertTrue("The virtual link set should be empty.", virtualLinks.isEmpty());
+
+ // Add/remove the virtual link again.
+ VirtualLink virtualLink = manager.createVirtualLink(virtualNetwork1.id(), src, dst, TunnelId.valueOf(0));
+ manager.removeVirtualLink(virtualLink.networkId(), virtualLink.src(), virtualLink.dst());
+ virtualLinks = manager.getVirtualLinks(virtualNetwork1.id());
+ assertTrue("The virtual link set should be empty.", virtualLinks.isEmpty());
}
/**
@@ -250,19 +276,18 @@
public void testAddRemoveVirtualPort() {
manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
VirtualNetwork virtualNetwork1 = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
- VirtualDevice srcVirtualDevice =
+ VirtualDevice virtualDevice =
manager.createVirtualDevice(virtualNetwork1.id(), DeviceId.deviceId(deviceIdValue1));
- VirtualDevice dstVirtualDevice =
- manager.createVirtualDevice(virtualNetwork1.id(), DeviceId.deviceId(deviceIdValue2));
- Port port = new DefaultPort(srcVirtualDevice, PortNumber.portNumber(1), true);
+ Port port = new DefaultPort(virtualDevice, PortNumber.portNumber(1), true);
- manager.createVirtualPort(virtualNetwork1.id(), srcVirtualDevice.id(), PortNumber.portNumber(1), port);
- manager.createVirtualPort(virtualNetwork1.id(), dstVirtualDevice.id(), PortNumber.portNumber(1), port);
+ manager.createVirtualPort(virtualNetwork1.id(), virtualDevice.id(), PortNumber.portNumber(1), port);
+ manager.createVirtualPort(virtualNetwork1.id(), virtualDevice.id(), PortNumber.portNumber(2), port);
- Set<VirtualPort> virtualPorts = manager.getVirtualPorts(virtualNetwork1.id(), srcVirtualDevice.id());
+ Set<VirtualPort> virtualPorts = manager.getVirtualPorts(virtualNetwork1.id(), virtualDevice.id());
assertNotNull("The virtual port set should not be null", virtualPorts);
assertEquals("The virtual port set size did not match.", 2, virtualPorts.size());
+
for (VirtualPort virtualPort : virtualPorts) {
manager.removeVirtualPort(virtualNetwork1.id(),
(DeviceId) virtualPort.element().id(), virtualPort.number());
@@ -270,7 +295,14 @@
manager.removeVirtualPort(virtualNetwork1.id(),
(DeviceId) virtualPort.element().id(), virtualPort.number());
}
- virtualPorts = manager.getVirtualPorts(virtualNetwork1.id(), srcVirtualDevice.id());
+ virtualPorts = manager.getVirtualPorts(virtualNetwork1.id(), virtualDevice.id());
+ assertTrue("The virtual port set should be empty.", virtualPorts.isEmpty());
+
+ // Add/remove the virtual port again.
+ VirtualPort virtualPort = manager.createVirtualPort(virtualNetwork1.id(), virtualDevice.id(),
+ PortNumber.portNumber(1), port);
+ manager.removeVirtualPort(virtualNetwork1.id(), (DeviceId) virtualPort.element().id(), virtualPort.number());
+ virtualPorts = manager.getVirtualPorts(virtualNetwork1.id(), virtualDevice.id());
assertTrue("The virtual port set should be empty.", virtualPorts.isEmpty());
}
@@ -306,6 +338,9 @@
}
+ /**
+ * Core service test class.
+ */
private class TestCoreService extends CoreServiceAdapter {
@Override
diff --git a/incubator/store/src/main/java/org/onosproject/incubator/store/virtual/impl/DistributedVirtualNetworkStore.java b/incubator/store/src/main/java/org/onosproject/incubator/store/virtual/impl/DistributedVirtualNetworkStore.java
index 65cee11..d4461a4 100644
--- a/incubator/store/src/main/java/org/onosproject/incubator/store/virtual/impl/DistributedVirtualNetworkStore.java
+++ b/incubator/store/src/main/java/org/onosproject/incubator/store/virtual/impl/DistributedVirtualNetworkStore.java
@@ -42,6 +42,8 @@
import org.onosproject.incubator.net.virtual.VirtualNetworkStoreDelegate;
import org.onosproject.incubator.net.virtual.VirtualPort;
import org.onosproject.net.ConnectPoint;
+import org.onosproject.net.DefaultDevice;
+import org.onosproject.net.DefaultPort;
import org.onosproject.net.Device;
import org.onosproject.net.DeviceId;
import org.onosproject.net.Port;
@@ -123,11 +125,18 @@
.register(TenantId.class)
.register(NetworkId.class).register(DeviceId.class)
.register(VirtualNetwork.class)
+ .register(DefaultVirtualNetwork.class)
.register(VirtualDevice.class)
+ .register(DefaultVirtualDevice.class)
.register(VirtualLink.class)
+ .register(DefaultVirtualLink.class)
.register(VirtualPort.class)
+ .register(DefaultVirtualPort.class)
.register(DeviceId.class)
.register(Device.class)
+ .register(TunnelId.class)
+ .register(DefaultDevice.class)
+ .register(DefaultPort.class)
.nextId(KryoNamespaces.BEGIN_USER_CUSTOM_ID).build());
/**
@@ -233,12 +242,14 @@
VirtualNetwork virtualNetwork = new DefaultVirtualNetwork(genNetworkId(), tenantId);
//TODO update both maps in one transaction.
networkIdVirtualNetworkMap.put(virtualNetwork.id(), virtualNetwork);
- Set<NetworkId> virtualNetworkSet = tenantIdNetworkIdSetMap.get(tenantId);
- if (virtualNetworkSet == null) {
- virtualNetworkSet = new HashSet<>();
+
+ Set<NetworkId> networkIdSet = tenantIdNetworkIdSetMap.get(tenantId);
+ if (networkIdSet == null) {
+ networkIdSet = new HashSet<>();
}
- virtualNetworkSet.add(virtualNetwork.id());
- tenantIdNetworkIdSetMap.put(tenantId, virtualNetworkSet);
+ networkIdSet.add(virtualNetwork.id());
+ tenantIdNetworkIdSetMap.put(tenantId, networkIdSet);
+
return virtualNetwork;
}
@@ -256,24 +267,26 @@
public void removeNetwork(NetworkId networkId) {
// Make sure that the virtual network exists before attempting to remove it.
if (networkExists(networkId)) {
- VirtualNetwork virtualNetwork = networkIdVirtualNetworkMap.get(networkId);
+ //TODO update both maps in one transaction.
+
+ VirtualNetwork virtualNetwork = networkIdVirtualNetworkMap.remove(networkId);
if (virtualNetwork == null) {
return;
}
- //TODO update both maps in one transaction.
TenantId tenantId = virtualNetwork.tenantId();
- networkIdVirtualNetworkMap.compute(networkId, (id, existingVirtualNetwork) -> null);
+ Set<NetworkId> networkIdSet = new HashSet<>();
+ tenantIdNetworkIdSetMap.get(tenantId).forEach(networkId1 -> {
+ if (networkId1.id().equals(networkId.id())) {
+ networkIdSet.add(networkId1);
+ }
+ });
- Set<NetworkId> virtualNetworkSet = tenantIdNetworkIdSetMap.get(tenantId);
tenantIdNetworkIdSetMap.compute(virtualNetwork.tenantId(), (id, existingNetworkIds) -> {
if (existingNetworkIds == null || existingNetworkIds.isEmpty()) {
- return ImmutableSet.of();
+ return new HashSet<NetworkId>();
} else {
- return ImmutableSet.<NetworkId>builder()
- .addAll(Sets.difference(existingNetworkIds,
- ImmutableSet.copyOf(virtualNetworkSet)))
- .build();
+ return new HashSet<NetworkId>(Sets.difference(existingNetworkIds, networkIdSet));
}
});
}
@@ -308,22 +321,24 @@
public void removeDevice(NetworkId networkId, DeviceId deviceId) {
checkState(networkExists(networkId), "The network has not been added.");
//TODO update both maps in one transaction.
- Set<DeviceId> deviceIdSet = networkIdDeviceIdSetMap.get(networkId);
+
+ Set<DeviceId> deviceIdSet = new HashSet<>();
+ networkIdDeviceIdSetMap.get(networkId).forEach(deviceId1 -> {
+ if (deviceId1.equals(deviceId)) {
+ deviceIdSet.add(deviceId1);
+ }
+ });
+
if (deviceIdSet != null) {
networkIdDeviceIdSetMap.compute(networkId, (id, existingDeviceIds) -> {
if (existingDeviceIds == null || existingDeviceIds.isEmpty()) {
- return ImmutableSet.of();
+ return new HashSet<DeviceId>();
} else {
- return ImmutableSet.<DeviceId>builder()
- .addAll(Sets.difference(existingDeviceIds,
- ImmutableSet.copyOf(deviceIdSet)))
- .build();
+ return new HashSet<DeviceId>(Sets.difference(existingDeviceIds, deviceIdSet));
}
});
- deviceIdVirtualDeviceMap.compute(deviceId, (id, existingVirtualDevice) -> null);
-
- log.info("The deviceIdVirtualDeviceMap size is: " + getDevices(networkId));
+ deviceIdVirtualDeviceMap.remove(deviceId);
}
}
@@ -343,16 +358,20 @@
@Override
public void removeLink(NetworkId networkId, ConnectPoint src, ConnectPoint dst) {
checkState(networkExists(networkId), "The network has not been added.");
- Set<VirtualLink> virtualLinkSet = networkIdVirtualLinkSetMap.get(networkId);
+
+ Set<VirtualLink> virtualLinkSet = new HashSet<>();
+ networkIdVirtualLinkSetMap.get(networkId).forEach(link -> {
+ if (link.src().equals(src) && link.dst().equals(dst)) {
+ virtualLinkSet.add(link);
+ }
+ });
+
if (virtualLinkSet != null) {
networkIdVirtualLinkSetMap.compute(networkId, (id, existingVirtualLinks) -> {
if (existingVirtualLinks == null || existingVirtualLinks.isEmpty()) {
- return ImmutableSet.of();
+ return new HashSet<VirtualLink>();
} else {
- return ImmutableSet.<VirtualLink>builder()
- .addAll(Sets.difference(existingVirtualLinks,
- ImmutableSet.copyOf(virtualLinkSet)))
- .build();
+ return new HashSet<VirtualLink>(Sets.difference(existingVirtualLinks, virtualLinkSet));
}
});
}
@@ -376,16 +395,20 @@
@Override
public void removePort(NetworkId networkId, DeviceId deviceId, PortNumber portNumber) {
checkState(networkExists(networkId), "The network has not been added.");
- Set<VirtualPort> virtualPortSet = networkIdVirtualPortSetMap.get(networkId);
+
+ Set<VirtualPort> virtualPortSet = new HashSet<>();
+ networkIdVirtualPortSetMap.get(networkId).forEach(port -> {
+ if (port.element().id().equals(deviceId) && port.number().equals(portNumber)) {
+ virtualPortSet.add(port);
+ }
+ });
+
if (virtualPortSet != null) {
networkIdVirtualPortSetMap.compute(networkId, (id, existingVirtualPorts) -> {
if (existingVirtualPorts == null || existingVirtualPorts.isEmpty()) {
- return ImmutableSet.of();
+ return new HashSet<VirtualPort>();
} else {
- return ImmutableSet.<VirtualPort>builder()
- .addAll(Sets.difference(existingVirtualPorts,
- ImmutableSet.copyOf(virtualPortSet)))
- .build();
+ return new HashSet<VirtualPort>(Sets.difference(existingVirtualPorts, virtualPortSet));
}
});
}
@@ -415,17 +438,28 @@
@Override
public Set<VirtualLink> getLinks(NetworkId networkId) {
checkState(networkExists(networkId), "The network has not been added.");
- Set<VirtualLink> virtualLinkSet = new HashSet<>();
- virtualLinkSet.addAll(networkIdVirtualLinkSetMap.get(networkId));
+ Set<VirtualLink> virtualLinkSet = networkIdVirtualLinkSetMap.get(networkId);
+ if (virtualLinkSet == null) {
+ virtualLinkSet = new HashSet<>();
+ }
return ImmutableSet.copyOf(virtualLinkSet);
}
@Override
public Set<VirtualPort> getPorts(NetworkId networkId, DeviceId deviceId) {
checkState(networkExists(networkId), "The network has not been added.");
- Set<VirtualPort> virtualPortSet = new HashSet<>();
- virtualPortSet.addAll(networkIdVirtualPortSetMap.get(networkId));
- return ImmutableSet.copyOf(virtualPortSet);
+ Set<VirtualPort> virtualPortSet = networkIdVirtualPortSetMap.get(networkId);
+ if (virtualPortSet == null) {
+ virtualPortSet = new HashSet<>();
+ }
+
+ Set<VirtualPort> portSet = new HashSet<>();
+ virtualPortSet.forEach(virtualPort -> {
+ if (virtualPort.element().id().equals(deviceId)) {
+ portSet.add(virtualPort);
+ }
+ });
+ return ImmutableSet.copyOf(portSet);
}
/**