ONOS-3633 - Implementation of virtual network point to point intent provider.
Change-Id: Ie2c1e5ac278bc0dd6259479c44dd92b9b625e90b
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 ca0c311..f4eedc4 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
@@ -134,9 +134,9 @@
.register(DefaultVirtualPort.class)
.register(DeviceId.class)
.register(Device.class)
- .register(TunnelId.class)
.register(DefaultDevice.class)
.register(DefaultPort.class)
+ .register(TunnelId.class)
.nextId(KryoNamespaces.BEGIN_USER_CUSTOM_ID).build());
/**
@@ -349,22 +349,51 @@
if (virtualLinkSet == null) {
virtualLinkSet = new HashSet<>();
}
- VirtualLink virtualLink = new DefaultVirtualLink(networkId, src, dst, realizedBy);
+ // validate that the link does not already exist in this network
+ checkState(getLink(networkId, src, dst) == null, "The virtual link already exists");
+
+ VirtualLink virtualLink = DefaultVirtualLink.builder()
+ .networkId(networkId)
+ .src(src)
+ .dst(dst)
+ .tunnelId(realizedBy)
+ .build();
+
virtualLinkSet.add(virtualLink);
networkIdVirtualLinkSetMap.put(networkId, virtualLinkSet);
return virtualLink;
}
@Override
- public void removeLink(NetworkId networkId, ConnectPoint src, ConnectPoint dst) {
+ public void updateLink(VirtualLink virtualLink, TunnelId tunnelId) {
+ checkState(networkExists(virtualLink.networkId()), "The network has not been added.");
+ Set<VirtualLink> virtualLinkSet = networkIdVirtualLinkSetMap.get(virtualLink.networkId());
+ if (virtualLinkSet == null) {
+ virtualLinkSet = new HashSet<>();
+ }
+ virtualLinkSet.remove(virtualLink);
+
+ VirtualLink newVirtualLink = DefaultVirtualLink.builder()
+ .networkId(virtualLink.networkId())
+ .src(virtualLink.src())
+ .dst(virtualLink.dst())
+ .tunnelId(tunnelId)
+ .build();
+
+ virtualLinkSet.add(newVirtualLink);
+ networkIdVirtualLinkSetMap.put(newVirtualLink.networkId(), virtualLinkSet);
+ }
+
+ @Override
+ public VirtualLink removeLink(NetworkId networkId, ConnectPoint src, ConnectPoint dst) {
checkState(networkExists(networkId), "The network has not been added.");
+ final VirtualLink virtualLink = getLink(networkId, src, dst);
+ if (virtualLink == null) {
+ return null;
+ }
Set<VirtualLink> virtualLinkSet = new HashSet<>();
- networkIdVirtualLinkSetMap.get(networkId).forEach(link -> {
- if (link.src().equals(src) && link.dst().equals(dst)) {
- virtualLinkSet.add(link);
- }
- });
+ virtualLinkSet.add(virtualLink);
if (virtualLinkSet != null) {
networkIdVirtualLinkSetMap.compute(networkId, (id, existingVirtualLinks) -> {
@@ -375,6 +404,7 @@
}
});
}
+ return virtualLink;
}
@Override
@@ -445,6 +475,31 @@
return ImmutableSet.copyOf(virtualLinkSet);
}
+ /**
+ * Returns the virtual link matching the network identifier, source connect point,
+ * and destination connect point.
+ *
+ * @param networkId network identifier
+ * @param src source connect point
+ * @param dst destination connect point
+ * @return virtual link
+ */
+ private VirtualLink getLink(NetworkId networkId, ConnectPoint src, ConnectPoint dst) {
+ Set<VirtualLink> virtualLinkSet = networkIdVirtualLinkSetMap.get(networkId);
+ if (virtualLinkSet == null) {
+ return null;
+ }
+
+ VirtualLink virtualLink = null;
+ for (VirtualLink link : virtualLinkSet) {
+ if (link.src().equals(src) && link.dst().equals(dst)) {
+ virtualLink = link;
+ break;
+ }
+ }
+ return virtualLink;
+ }
+
@Override
public Set<VirtualPort> getPorts(NetworkId networkId, DeviceId deviceId) {
checkState(networkExists(networkId), "The network has not been added.");