weibit

optical intent

Change-Id: I23714985a2fe1e3bbc59deff2d267007750d0420
......@@ -30,7 +30,7 @@ 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;
......@@ -120,7 +120,6 @@ public class OpticalPathProvisioner {
}
Topology topology = topologyService.currentTopology();
TopologyGraph graph = topologyService.getGraph(topology);
LinkWeight weight = new LinkWeight() {
@Override
......
......@@ -13,8 +13,8 @@ import com.google.common.base.MoreObjects;
public class OpticalPathIntent extends OpticalConnectivityIntent {
private final Path path;
private final TrafficSelector opticalMatch;
private final TrafficTreatment opticalAction;
// private final TrafficSelector opticalMatch;
// private final TrafficTreatment opticalAction;
public OpticalPathIntent(ApplicationId appId,
ConnectPoint src,
......@@ -23,29 +23,29 @@ public class OpticalPathIntent extends OpticalConnectivityIntent {
TrafficTreatment action,
Path path) {
super(appId, src, dst);
this.opticalMatch = match;
this.opticalAction = action;
// this.opticalMatch = match;
// this.opticalAction = action;
this.path = path;
}
public OpticalPathIntent() {
this.opticalMatch = null;
this.opticalAction = null;
protected OpticalPathIntent() {
// this.opticalMatch = null;
// this.opticalAction = null;
this.path = null;
}
public Path path() {
return path;
}
/*
public TrafficSelector selector() {
return opticalMatch;
// return opticalMatch;
}
public TrafficTreatment treatment() {
return opticalAction;
// return opticalAction;
}
*/
@Override
public boolean isInstallable() {
return true;
......@@ -55,8 +55,8 @@ public class OpticalPathIntent extends OpticalConnectivityIntent {
public String toString() {
return MoreObjects.toStringHelper(getClass())
.add("id", id())
.add("match", opticalMatch)
.add("action", opticalAction)
//.add("match", opticalMatch)
//.add("action", opticalAction)
.add("ingressPort", this.getSrcConnectPoint())
.add("egressPort", this.getDst())
.add("path", path)
......
......@@ -14,7 +14,7 @@ import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.ReferenceCardinality;
import org.onlab.onos.CoreService;
import org.onlab.onos.net.ConnectPoint;
import org.onlab.onos.net.DefaultEdgeLink;
import org.onlab.onos.net.Link;
import org.onlab.onos.net.Path;
import org.onlab.onos.net.flow.TrafficSelector;
......@@ -84,9 +84,9 @@ public class OpticalConnectivityIntentCompiler implements IntentCompiler<Optical
}
List<Link> links = new ArrayList<>();
links.add(DefaultEdgeLink.createEdgeLink(intent.getSrcConnectPoint(), true));
// links.add(DefaultEdgeLink.createEdgeLink(intent.getSrcConnectPoint(), true));
links.addAll(path.links());
links.add(DefaultEdgeLink.createEdgeLink(intent.getDst(), false));
//links.add(DefaultEdgeLink.createEdgeLink(intent.getDst(), false));
TrafficSelector opticalSelector = null;
TrafficTreatment opticalTreatment = null;
......
......@@ -3,9 +3,8 @@ package org.onlab.onos.net.intent.impl;
import static org.onlab.onos.net.flow.DefaultTrafficTreatment.builder;
import static org.slf4j.LoggerFactory.getLogger;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.Future;
import org.apache.felix.scr.annotations.Activate;
import org.apache.felix.scr.annotations.Component;
......@@ -16,7 +15,6 @@ 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.flow.CompletedBatchOperation;
import org.onlab.onos.net.flow.DefaultFlowRule;
import org.onlab.onos.net.flow.DefaultTrafficSelector;
import org.onlab.onos.net.flow.DefaultTrafficTreatment;
......@@ -30,11 +28,14 @@ import org.onlab.onos.net.flow.FlowRuleBatchEntry.FlowRuleOperation;
import org.onlab.onos.net.intent.IntentExtensionService;
import org.onlab.onos.net.intent.IntentInstaller;
import org.onlab.onos.net.intent.OpticalPathIntent;
import org.onlab.onos.net.resource.DefaultLinkResourceRequest;
import org.onlab.onos.net.resource.Lambda;
import org.onlab.onos.net.resource.LambdaResourceAllocation;
import org.onlab.onos.net.resource.LinkResourceAllocations;
import org.onlab.onos.net.resource.LinkResourceRequest;
import org.onlab.onos.net.resource.LinkResourceService;
import org.onlab.onos.net.resource.ResourceRequest;
import org.onlab.onos.net.resource.ResourceAllocation;
import org.onlab.onos.net.resource.ResourceType;
import org.onlab.onos.net.topology.TopologyService;
import org.slf4j.Logger;
......@@ -67,7 +68,7 @@ public class OpticalPathIntentInstaller implements IntentInstaller<OpticalPathIn
private ApplicationId appId;
final static short WAVELENGTH = 80;
//final short WAVELENGTH = 80;
@Activate
public void activate() {
......@@ -82,44 +83,72 @@ public class OpticalPathIntentInstaller implements IntentInstaller<OpticalPathIn
@Override
public List<FlowRuleBatchOperation> install(OpticalPathIntent intent) {
Lambda la = assignWavelength(intent.path().links());
if (la == null) {
return null;
}
// resourceService.requestResources(la);
// la.toInt();
//intent.selector().criteria();
//TrafficSelector.Builder builder = DefaultTrafficSelector.builder();
//builder.matchLambdaType(la.toInt())
// .matchInport(intent.getSrcConnectPoint().port());
TrafficSelector.Builder builder =
DefaultTrafficSelector.builder(intent.selector());
Iterator<Link> links = intent.path().links().iterator();
ConnectPoint prev = links.next().dst();
LinkResourceAllocations allocations = assignWavelength(intent);
TrafficSelector.Builder selectorBuilder = DefaultTrafficSelector.builder();
selectorBuilder.matchInport(intent.getSrcConnectPoint().port());
TrafficTreatment.Builder treatmentBuilder = DefaultTrafficTreatment.builder();
List<FlowRuleBatchEntry> rules = Lists.newLinkedList();
// TODO Generate multiple batches
while (links.hasNext()) {
builder.matchInport(prev.port());
Link link = links.next();
TrafficTreatment treatment = builder()
.setOutput(link.src().port()).build();
FlowRule rule = new DefaultFlowRule(link.src().deviceId(),
builder.build(),
treatment,
ConnectPoint prev = intent.getSrcConnectPoint();
//TODO throw exception if the lambda was not assigned successfully
for (Link link : intent.path().links()) {
Lambda la = null;
for (ResourceAllocation allocation : allocations.getResourceAllocation(link)) {
if (allocation.type() == ResourceType.LAMBDA) {
la = ((LambdaResourceAllocation) allocation).lambda();
break;
}
}
if (la == null) {
log.info("Lambda was not assigned successfully");
return null;
}
treatmentBuilder.setOutput(link.src().port());
//treatmentBuilder.setLambda(la.toInt());
FlowRule rule = new DefaultFlowRule(prev.deviceId(),
selectorBuilder.build(),
treatmentBuilder.build(),
100,
appId,
100,
true);
rules.add(new FlowRuleBatchEntry(FlowRuleOperation.ADD, rule));
prev = link.dst();
selectorBuilder.matchInport(link.dst().port());
//selectorBuilder.setLambda(la.toInt());
}
// build the last T port rule
TrafficTreatment treatmentLast = builder()
.setOutput(intent.getDst().port()).build();
FlowRule rule = new DefaultFlowRule(intent.getDst().deviceId(),
selectorBuilder.build(),
treatmentLast,
100,
appId,
100,
true);
rules.add(new FlowRuleBatchEntry(FlowRuleOperation.ADD, rule));
return Lists.newArrayList(new FlowRuleBatchOperation(rules));
}
private Lambda assignWavelength(List<Link> links) {
private LinkResourceAllocations assignWavelength(OpticalPathIntent intent) {
LinkResourceRequest.Builder request = DefaultLinkResourceRequest.builder(intent.id(),
intent.path().links())
.addLambdaRequest();
LinkResourceAllocations retLambda = resourceService.requestResources(request.build());
return retLambda;
}
/*private Lambda assignWavelength(List<Link> links) {
// TODO More wavelength assignment algorithm
int wavenum = 0;
Iterator<Link> itrlink = links.iterator();
......@@ -154,31 +183,64 @@ public class OpticalPathIntentInstaller implements IntentInstaller<OpticalPathIn
//}
}
return false;
}
}*/
@Override
public List<FlowRuleBatchOperation> uninstall(OpticalPathIntent intent) {
TrafficSelector.Builder builder =
DefaultTrafficSelector.builder(intent.selector());
Iterator<Link> links = intent.path().links().iterator();
ConnectPoint prev = links.next().dst();
LinkResourceAllocations allocations = resourceService.getAllocation(intent.id());
TrafficSelector.Builder selectorBuilder = DefaultTrafficSelector.builder();
selectorBuilder.matchInport(intent.getSrcConnectPoint().port());
TrafficTreatment.Builder treatmentBuilder = DefaultTrafficTreatment.builder();
List<FlowRuleBatchEntry> rules = Lists.newLinkedList();
// TODO Generate multiple batches
while (links.hasNext()) {
builder.matchInport(prev.port());
Link link = links.next();
TrafficTreatment treatment = builder()
.setOutput(link.src().port()).build();
FlowRule rule = new DefaultFlowRule(link.src().deviceId(),
builder.build(),
treatment,
ConnectPoint prev = intent.getSrcConnectPoint();
//TODO throw exception if the lambda was not retrieved successfully
for (Link link : intent.path().links()) {
Lambda la = null;
for (ResourceAllocation allocation : allocations.getResourceAllocation(link)) {
if (allocation.type() == ResourceType.LAMBDA) {
la = ((LambdaResourceAllocation) allocation).lambda();
break;
}
}
if (la == null) {
log.info("Lambda was not retrieved successfully");
return null;
}
treatmentBuilder.setOutput(link.src().port());
//treatmentBuilder.setLambda(la.toInt());
FlowRule rule = new DefaultFlowRule(prev.deviceId(),
selectorBuilder.build(),
treatmentBuilder.build(),
100,
appId,
100,
true);
rules.add(new FlowRuleBatchEntry(FlowRuleOperation.REMOVE, rule));
prev = link.dst();
selectorBuilder.matchInport(link.dst().port());
//selectorBuilder.setLambda(la.toInt());
}
// build the last T port rule
TrafficTreatment treatmentLast = builder()
.setOutput(intent.getDst().port()).build();
FlowRule rule = new DefaultFlowRule(intent.getDst().deviceId(),
selectorBuilder.build(),
treatmentLast,
100,
appId,
100,
true);
rules.add(new FlowRuleBatchEntry(FlowRuleOperation.REMOVE, rule));
return Lists.newArrayList(new FlowRuleBatchOperation(rules));
}
......