blob: a0995e4dc92316e41e70e3549def2f3cf73efbbf [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;
alshabib8ca53902014-10-07 13:11:17 -07004import static org.slf4j.LoggerFactory.getLogger;
Brian O'Connora4cab072014-10-03 18:46:39 -07005
6import java.util.Iterator;
7
Brian O'Connor66630c82014-10-02 21:08:19 -07008import org.apache.felix.scr.annotations.Activate;
9import org.apache.felix.scr.annotations.Component;
10import org.apache.felix.scr.annotations.Deactivate;
11import org.apache.felix.scr.annotations.Reference;
12import org.apache.felix.scr.annotations.ReferenceCardinality;
13import org.onlab.onos.ApplicationId;
14import org.onlab.onos.net.ConnectPoint;
15import org.onlab.onos.net.Link;
16import org.onlab.onos.net.flow.DefaultFlowRule;
17import org.onlab.onos.net.flow.DefaultTrafficSelector;
Brian O'Connor66630c82014-10-02 21:08:19 -070018import org.onlab.onos.net.flow.FlowRule;
19import org.onlab.onos.net.flow.FlowRuleService;
20import org.onlab.onos.net.flow.TrafficSelector;
21import org.onlab.onos.net.flow.TrafficTreatment;
Brian O'Connor66630c82014-10-02 21:08:19 -070022import org.onlab.onos.net.intent.IntentExtensionService;
23import org.onlab.onos.net.intent.IntentInstaller;
24import org.onlab.onos.net.intent.PathIntent;
alshabib8ca53902014-10-07 13:11:17 -070025import org.slf4j.Logger;
Brian O'Connor66630c82014-10-02 21:08:19 -070026
27/**
tom9a693fd2014-10-03 11:32:19 -070028 * Installer for {@link PathIntent path connectivity intents}.
Brian O'Connor66630c82014-10-02 21:08:19 -070029 */
30@Component(immediate = true)
tom9a693fd2014-10-03 11:32:19 -070031public class PathIntentInstaller implements IntentInstaller<PathIntent> {
32
alshabib8ca53902014-10-07 13:11:17 -070033 private final Logger log = getLogger(getClass());
34
Brian O'Connor66630c82014-10-02 21:08:19 -070035 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
36 protected IntentExtensionService intentManager;
37
38 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
tom9a693fd2014-10-03 11:32:19 -070039 protected FlowRuleService flowRuleService;
Brian O'Connor66630c82014-10-02 21:08:19 -070040
tom9a693fd2014-10-03 11:32:19 -070041 private final ApplicationId appId = ApplicationId.getAppId();
Brian O'Connor66630c82014-10-02 21:08:19 -070042
43 @Activate
44 public void activate() {
45 intentManager.registerInstaller(PathIntent.class, this);
46 }
47
48 @Deactivate
49 public void deactivate() {
50 intentManager.unregisterInstaller(PathIntent.class);
51 }
52
53 @Override
54 public void install(PathIntent intent) {
tom9a693fd2014-10-03 11:32:19 -070055 TrafficSelector.Builder builder =
tom85258ee2014-10-07 00:10:02 -070056 DefaultTrafficSelector.builder(intent.selector());
57 Iterator<Link> links = intent.path().links().iterator();
Brian O'Connor66630c82014-10-02 21:08:19 -070058 ConnectPoint prev = links.next().dst();
tomf5c9d922014-10-03 15:22:03 -070059
Brian O'Connor66630c82014-10-02 21:08:19 -070060 while (links.hasNext()) {
61 builder.matchInport(prev.port());
62 Link link = links.next();
tomf5c9d922014-10-03 15:22:03 -070063 TrafficTreatment treatment = builder()
64 .setOutput(link.src().port()).build();
tom9a693fd2014-10-03 11:32:19 -070065 FlowRule rule = new DefaultFlowRule(link.src().deviceId(),
Brian O'Connora4cab072014-10-03 18:46:39 -070066 builder.build(), treatment,
67 123, appId, 600);
tom9a693fd2014-10-03 11:32:19 -070068 flowRuleService.applyFlowRules(rule);
Brian O'Connor66630c82014-10-02 21:08:19 -070069 prev = link.dst();
70 }
71
72 }
73
74 @Override
75 public void uninstall(PathIntent intent) {
Brian O'Connora4cab072014-10-03 18:46:39 -070076 TrafficSelector.Builder builder =
tom85258ee2014-10-07 00:10:02 -070077 DefaultTrafficSelector.builder(intent.selector());
78 Iterator<Link> links = intent.path().links().iterator();
Brian O'Connora4cab072014-10-03 18:46:39 -070079 ConnectPoint prev = links.next().dst();
80
81 while (links.hasNext()) {
82 builder.matchInport(prev.port());
83 Link link = links.next();
84 TrafficTreatment treatment = builder()
85 .setOutput(link.src().port()).build();
86 FlowRule rule = new DefaultFlowRule(link.src().deviceId(),
87 builder.build(), treatment,
88 123, appId, 600);
alshabib8ca53902014-10-07 13:11:17 -070089
Brian O'Connora4cab072014-10-03 18:46:39 -070090 flowRuleService.removeFlowRules(rule);
91 prev = link.dst();
92 }
Brian O'Connor66630c82014-10-02 21:08:19 -070093 }
94}