blob: f9cfa67a04e8fa698ba38b8e5507525c469362a1 [file] [log] [blame]
Brian O'Connor66630c82014-10-02 21:08:19 -07001package org.onlab.onos.net.intent.impl;
2
Brian O'Connora4cab072014-10-03 18:46:39 -07003import static org.onlab.onos.net.flow.DefaultTrafficTreatment.builder;
4
5import java.util.Iterator;
6
Brian O'Connor66630c82014-10-02 21:08:19 -07007import org.apache.felix.scr.annotations.Activate;
8import org.apache.felix.scr.annotations.Component;
9import org.apache.felix.scr.annotations.Deactivate;
10import org.apache.felix.scr.annotations.Reference;
11import org.apache.felix.scr.annotations.ReferenceCardinality;
12import org.onlab.onos.ApplicationId;
13import org.onlab.onos.net.ConnectPoint;
14import org.onlab.onos.net.Link;
15import org.onlab.onos.net.flow.DefaultFlowRule;
16import org.onlab.onos.net.flow.DefaultTrafficSelector;
Brian O'Connor66630c82014-10-02 21:08:19 -070017import org.onlab.onos.net.flow.FlowRule;
18import org.onlab.onos.net.flow.FlowRuleService;
19import org.onlab.onos.net.flow.TrafficSelector;
20import org.onlab.onos.net.flow.TrafficTreatment;
Brian O'Connor66630c82014-10-02 21:08:19 -070021import org.onlab.onos.net.intent.IntentExtensionService;
22import org.onlab.onos.net.intent.IntentInstaller;
23import org.onlab.onos.net.intent.PathIntent;
24
25/**
tom9a693fd2014-10-03 11:32:19 -070026 * Installer for {@link PathIntent path connectivity intents}.
Brian O'Connor66630c82014-10-02 21:08:19 -070027 */
28@Component(immediate = true)
tom9a693fd2014-10-03 11:32:19 -070029public class PathIntentInstaller implements IntentInstaller<PathIntent> {
30
Brian O'Connor66630c82014-10-02 21:08:19 -070031 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
32 protected IntentExtensionService intentManager;
33
34 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
tom9a693fd2014-10-03 11:32:19 -070035 protected FlowRuleService flowRuleService;
Brian O'Connor66630c82014-10-02 21:08:19 -070036
tom9a693fd2014-10-03 11:32:19 -070037 private final ApplicationId appId = ApplicationId.getAppId();
Brian O'Connor66630c82014-10-02 21:08:19 -070038
39 @Activate
40 public void activate() {
41 intentManager.registerInstaller(PathIntent.class, this);
42 }
43
44 @Deactivate
45 public void deactivate() {
46 intentManager.unregisterInstaller(PathIntent.class);
47 }
48
49 @Override
50 public void install(PathIntent intent) {
tom9a693fd2014-10-03 11:32:19 -070051 TrafficSelector.Builder builder =
52 DefaultTrafficSelector.builder(intent.getTrafficSelector());
Brian O'Connor66630c82014-10-02 21:08:19 -070053 Iterator<Link> links = intent.getPath().links().iterator();
54 ConnectPoint prev = links.next().dst();
tomf5c9d922014-10-03 15:22:03 -070055
Brian O'Connor66630c82014-10-02 21:08:19 -070056 while (links.hasNext()) {
57 builder.matchInport(prev.port());
58 Link link = links.next();
tomf5c9d922014-10-03 15:22:03 -070059 TrafficTreatment treatment = builder()
60 .setOutput(link.src().port()).build();
tom9a693fd2014-10-03 11:32:19 -070061 FlowRule rule = new DefaultFlowRule(link.src().deviceId(),
Brian O'Connora4cab072014-10-03 18:46:39 -070062 builder.build(), treatment,
63 123, appId, 600);
tom9a693fd2014-10-03 11:32:19 -070064 flowRuleService.applyFlowRules(rule);
Brian O'Connor66630c82014-10-02 21:08:19 -070065 prev = link.dst();
66 }
67
68 }
69
70 @Override
71 public void uninstall(PathIntent intent) {
Brian O'Connora4cab072014-10-03 18:46:39 -070072 TrafficSelector.Builder builder =
73 DefaultTrafficSelector.builder(intent.getTrafficSelector());
74 Iterator<Link> links = intent.getPath().links().iterator();
75 ConnectPoint prev = links.next().dst();
76
77 while (links.hasNext()) {
78 builder.matchInport(prev.port());
79 Link link = links.next();
80 TrafficTreatment treatment = builder()
81 .setOutput(link.src().port()).build();
82 FlowRule rule = new DefaultFlowRule(link.src().deviceId(),
83 builder.build(), treatment,
84 123, appId, 600);
85 flowRuleService.removeFlowRules(rule);
86 prev = link.dst();
87 }
Brian O'Connor66630c82014-10-02 21:08:19 -070088 }
89}