optical intent module
Change-Id: Ifa405ab1d883b293d349f1b66d26a05a0724691f
diff --git a/apps/optical/src/main/java/org/onlab/onos/optical/provisioner/OpticalPathProvisioner.java b/apps/optical/src/main/java/org/onlab/onos/optical/provisioner/OpticalPathProvisioner.java
index 95b5041..e91235c 100644
--- a/apps/optical/src/main/java/org/onlab/onos/optical/provisioner/OpticalPathProvisioner.java
+++ b/apps/optical/src/main/java/org/onlab/onos/optical/provisioner/OpticalPathProvisioner.java
@@ -1,7 +1,10 @@
package org.onlab.onos.optical.provisioner;
+import java.util.ArrayList;
+import java.util.HashMap;
import java.util.Iterator;
-
+import java.util.Map;
+import java.util.Map.Entry;
import java.util.Set;
import org.apache.felix.scr.annotations.Activate;
@@ -9,25 +12,25 @@
import org.apache.felix.scr.annotations.Deactivate;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.ReferenceCardinality;
-
import org.onlab.onos.ApplicationId;
import org.onlab.onos.CoreService;
import org.onlab.onos.net.ConnectPoint;
-
import org.onlab.onos.net.Link;
+import org.onlab.onos.net.Path;
import org.onlab.onos.net.device.DeviceService;
-
-import org.onlab.onos.net.intent.IdGenerator;
import org.onlab.onos.net.intent.Intent;
-
import org.onlab.onos.net.intent.IntentEvent;
import org.onlab.onos.net.intent.IntentExtensionService;
-import org.onlab.onos.net.intent.IntentId;
import org.onlab.onos.net.intent.IntentListener;
import org.onlab.onos.net.intent.IntentService;
import org.onlab.onos.net.intent.OpticalConnectivityIntent;
import org.onlab.onos.net.intent.PointToPointIntent;
import org.onlab.onos.net.link.LinkService;
+import org.onlab.onos.net.resource.LinkResourceService;
+import org.onlab.onos.net.topology.LinkWeight;
+import org.onlab.onos.net.topology.Topology;
+import org.onlab.onos.net.topology.TopologyEdge;
+import org.onlab.onos.net.topology.TopologyGraph;
import org.onlab.onos.net.topology.TopologyService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -63,12 +66,12 @@
@Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
protected CoreService coreService;
- // protected LinkResourceService resourceService;
+ @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+ protected LinkResourceService resourceService;
private ApplicationId appId;
- private static long intentId = 0x9000000;
- protected IdGenerator<IntentId> intentIdGenerator;
+ //protected <IntentId> intentIdGenerator;
private final InternalOpticalPathProvisioner pathProvisioner = new InternalOpticalPathProvisioner();
@@ -106,7 +109,7 @@
}
private void setuplightpath(Intent intent) {
- // TODO: considering user policies and optical reach, may generate more OpticalConnectivityIntents
+ // TODO: considering user policies and optical reach
if (!intent.equals(PointToPointIntent.class)) {
return;
}
@@ -116,35 +119,103 @@
return;
}
- // Set<Port> port1 = deviceService.getPorts(pktIntent.ingressPoint().deviceId());
+ Topology topology = topologyService.currentTopology();
+ TopologyGraph graph = topologyService.getGraph(topology);
- Set<Link> srcLink = linkService.getLinks(pktIntent.ingressPoint());
- Set<Link> dstLink = linkService.getLinks(pktIntent.egressPoint());
+ LinkWeight weight = new LinkWeight() {
+ @Override
+ public double weight(TopologyEdge edge) {
+ boolean isOptical = false;
+ String t = edge.link().annotations().value("linkType");
+ if (t.equals("WDM")) {
+ isOptical = true;
+ }
+ if (isOptical) {
+ return 1000; // optical links
+ } else {
+ return 10; // packet links
+ }
+ }
+ };
- if (srcLink.isEmpty() || dstLink.isEmpty()) {
+ Set<Path> paths = topologyService.getPaths(topology,
+ pktIntent.ingressPoint().deviceId(),
+ pktIntent.egressPoint().deviceId(),
+ weight);
+
+ if (paths.isEmpty()) {
return;
}
- Iterator<Link> itrSrc = srcLink.iterator();
- Iterator<Link> itrDst = dstLink.iterator();
+ ConnectPoint srcWdmPoint = null;
+ ConnectPoint dstWdmPoint = null;
+ Iterator<Path> itrPath = paths.iterator();
+ Path firstPath = itrPath.next();
+ log.info(firstPath.toString());
- if (!itrSrc.next().annotations().value("linkType").equals("PktOptLink")) {
- return;
- }
- if (!itrDst.next().annotations().value("linkType").equals("PktOptLink")) {
- return;
+ ArrayList<Map<ConnectPoint, ConnectPoint>> connectionList = new ArrayList<>();
+
+ Iterator<Link> itrLink = firstPath.links().iterator();
+ while (itrLink.hasNext()) {
+ Link link1 = itrLink.next();
+ if (!isOpticalLink(link1)) {
+ continue;
+ } else {
+ srcWdmPoint = link1.dst();
+ dstWdmPoint = srcWdmPoint;
+ }
+
+ while (true) {
+
+ if (itrLink.hasNext()) {
+ Link link2 = itrLink.next();
+ dstWdmPoint = link2.src();
+ } else {
+ break;
+ }
+
+ if (itrLink.hasNext()) {
+ Link link3 = itrLink.next();
+ if (!isOpticalLink(link3)) {
+ break;
+ }
+ } else {
+ break;
+ }
+ }
+
+ Map<ConnectPoint, ConnectPoint> pair =
+ new HashMap<ConnectPoint, ConnectPoint>();
+ pair.put(srcWdmPoint, dstWdmPoint);
+
+ connectionList.add(pair);
}
- ConnectPoint srcWdmPoint = itrSrc.next().dst();
- ConnectPoint dstWdmPoint = itrDst.next().dst();
+ for (Map<ConnectPoint, ConnectPoint> map : connectionList) {
+ for (Entry<ConnectPoint, ConnectPoint> entry : map.entrySet()) {
- OpticalConnectivityIntent opticalIntent =
- new OpticalConnectivityIntent(new IntentId(intentId++),
- srcWdmPoint,
- dstWdmPoint);
+ ConnectPoint src = entry.getKey();
+ ConnectPoint dst = entry.getValue();
- log.info(opticalIntent.toString());
- intentService.submit(opticalIntent);
+ Intent opticalIntent = new OpticalConnectivityIntent(appId,
+ srcWdmPoint,
+ dstWdmPoint);
+
+ intentService.submit(opticalIntent);
+
+ log.info(opticalIntent.toString());
+ }
+ }
+
+ }
+
+ private boolean isOpticalLink(Link link) {
+ boolean isOptical = false;
+ String t = link.annotations().value("linkType");
+ if (t.equals("WDM") || t.equals("PktOptLink")) {
+ isOptical = true;
+ }
+ return isOptical;
}
private void teardownLightpath(Intent intent) {