Brian O'Connor

Fixing FlowRule priority in intent compilers

Change-Id: I13998e88d2a116017e87c019f4829101db6c6b6b
...@@ -24,7 +24,6 @@ import org.apache.felix.scr.annotations.Reference; ...@@ -24,7 +24,6 @@ import org.apache.felix.scr.annotations.Reference;
24 import org.apache.felix.scr.annotations.ReferenceCardinality; 24 import org.apache.felix.scr.annotations.ReferenceCardinality;
25 import org.onosproject.core.ApplicationId; 25 import org.onosproject.core.ApplicationId;
26 import org.onosproject.core.CoreService; 26 import org.onosproject.core.CoreService;
27 -import org.onosproject.core.DefaultGroupId;
28 import org.onosproject.net.ConnectPoint; 27 import org.onosproject.net.ConnectPoint;
29 import org.onosproject.net.DeviceId; 28 import org.onosproject.net.DeviceId;
30 import org.onosproject.net.EdgeLink; 29 import org.onosproject.net.EdgeLink;
...@@ -134,9 +133,14 @@ public class LinkCollectionIntentCompiler implements IntentCompiler<LinkCollecti ...@@ -134,9 +133,14 @@ public class LinkCollectionIntentCompiler implements IntentCompiler<LinkCollecti
134 treatment = defaultTreatment; 133 treatment = defaultTreatment;
135 } 134 }
136 135
137 - DefaultFlowRule rule = new DefaultFlowRule(deviceId, selector, treatment, 123, appId, 136 + FlowRule rule = DefaultFlowRule.builder()
138 - new DefaultGroupId((short) (intent.id().fingerprint() & 0xffff)), 0, true); 137 + .forDevice(deviceId)
139 - 138 + .withSelector(selector)
139 + .withTreatment(treatment)
140 + .withPriority(intent.priority())
141 + .fromApp(appId)
142 + .makePermanent()
143 + .build();
140 rules.add(rule); 144 rules.add(rule);
141 } 145 }
142 146
......
...@@ -188,13 +188,13 @@ public class OpticalCircuitIntentCompiler implements IntentCompiler<OpticalCircu ...@@ -188,13 +188,13 @@ public class OpticalCircuitIntentCompiler implements IntentCompiler<OpticalCircu
188 188
189 // Create optical circuit intent 189 // Create optical circuit intent
190 List<FlowRule> rules = new LinkedList<>(); 190 List<FlowRule> rules = new LinkedList<>();
191 - rules.add(connectPorts(src, connIntent.getSrc())); 191 + rules.add(connectPorts(src, connIntent.getSrc(), intent.priority()));
192 - rules.add(connectPorts(connIntent.getDst(), dst)); 192 + rules.add(connectPorts(connIntent.getDst(), dst, intent.priority()));
193 193
194 // Create flow rules for reverse path 194 // Create flow rules for reverse path
195 if (intent.isBidirectional()) { 195 if (intent.isBidirectional()) {
196 - rules.add(connectPorts(connIntent.getSrc(), src)); 196 + rules.add(connectPorts(connIntent.getSrc(), src, intent.priority()));
197 - rules.add(connectPorts(dst, connIntent.getDst())); 197 + rules.add(connectPorts(dst, connIntent.getDst(), intent.priority()));
198 } 198 }
199 199
200 circuitIntent = new FlowRuleIntent(appId, rules, intent.resources()); 200 circuitIntent = new FlowRuleIntent(appId, rules, intent.resources());
...@@ -348,7 +348,7 @@ public class OpticalCircuitIntentCompiler implements IntentCompiler<OpticalCircu ...@@ -348,7 +348,7 @@ public class OpticalCircuitIntentCompiler implements IntentCompiler<OpticalCircu
348 * @param dst destination port 348 * @param dst destination port
349 * @return flow rules 349 * @return flow rules
350 */ 350 */
351 - private FlowRule connectPorts(ConnectPoint src, ConnectPoint dst) { 351 + private FlowRule connectPorts(ConnectPoint src, ConnectPoint dst, int priority) {
352 checkArgument(src.deviceId().equals(dst.deviceId())); 352 checkArgument(src.deviceId().equals(dst.deviceId()));
353 353
354 TrafficSelector.Builder selectorBuilder = DefaultTrafficSelector.builder(); 354 TrafficSelector.Builder selectorBuilder = DefaultTrafficSelector.builder();
...@@ -363,7 +363,7 @@ public class OpticalCircuitIntentCompiler implements IntentCompiler<OpticalCircu ...@@ -363,7 +363,7 @@ public class OpticalCircuitIntentCompiler implements IntentCompiler<OpticalCircu
363 .forDevice(src.deviceId()) 363 .forDevice(src.deviceId())
364 .withSelector(selectorBuilder.build()) 364 .withSelector(selectorBuilder.build())
365 .withTreatment(treatmentBuilder.build()) 365 .withTreatment(treatmentBuilder.build())
366 - .withPriority(100) 366 + .withPriority(priority)
367 .fromApp(appId) 367 .fromApp(appId)
368 .makePermanent() 368 .makePermanent()
369 .build(); 369 .build();
......
...@@ -111,7 +111,7 @@ public class OpticalPathIntentCompiler implements IntentCompiler<OpticalPathInte ...@@ -111,7 +111,7 @@ public class OpticalPathIntentCompiler implements IntentCompiler<OpticalPathInte
111 .forDevice(current.deviceId()) 111 .forDevice(current.deviceId())
112 .withSelector(selectorBuilder.build()) 112 .withSelector(selectorBuilder.build())
113 .withTreatment(treatmentBuilder.build()) 113 .withTreatment(treatmentBuilder.build())
114 - .withPriority(100) 114 + .withPriority(intent.priority())
115 .fromApp(appId) 115 .fromApp(appId)
116 .makePermanent() 116 .makePermanent()
117 .build(); 117 .build();
...@@ -132,7 +132,7 @@ public class OpticalPathIntentCompiler implements IntentCompiler<OpticalPathInte ...@@ -132,7 +132,7 @@ public class OpticalPathIntentCompiler implements IntentCompiler<OpticalPathInte
132 .forDevice(intent.dst().deviceId()) 132 .forDevice(intent.dst().deviceId())
133 .withSelector(selectorBuilder.build()) 133 .withSelector(selectorBuilder.build())
134 .withTreatment(treatmentLast.build()) 134 .withTreatment(treatmentLast.build())
135 - .withPriority(100) 135 + .withPriority(intent.priority())
136 .fromApp(appId) 136 .fromApp(appId)
137 .makePermanent() 137 .makePermanent()
138 .build(); 138 .build();
...@@ -163,7 +163,7 @@ public class OpticalPathIntentCompiler implements IntentCompiler<OpticalPathInte ...@@ -163,7 +163,7 @@ public class OpticalPathIntentCompiler implements IntentCompiler<OpticalPathInte
163 .forDevice(current.deviceId()) 163 .forDevice(current.deviceId())
164 .withSelector(selectorBuilder.build()) 164 .withSelector(selectorBuilder.build())
165 .withTreatment(treatmentBuilder.build()) 165 .withTreatment(treatmentBuilder.build())
166 - .withPriority(100) 166 + .withPriority(intent.priority())
167 .fromApp(appId) 167 .fromApp(appId)
168 .makePermanent() 168 .makePermanent()
169 .build(); 169 .build();
...@@ -184,7 +184,7 @@ public class OpticalPathIntentCompiler implements IntentCompiler<OpticalPathInte ...@@ -184,7 +184,7 @@ public class OpticalPathIntentCompiler implements IntentCompiler<OpticalPathInte
184 .forDevice(intent.src().deviceId()) 184 .forDevice(intent.src().deviceId())
185 .withSelector(selectorBuilder.build()) 185 .withSelector(selectorBuilder.build())
186 .withTreatment(treatmentLast.build()) 186 .withTreatment(treatmentLast.build())
187 - .withPriority(100) 187 + .withPriority(intent.priority())
188 .fromApp(appId) 188 .fromApp(appId)
189 .makePermanent() 189 .makePermanent()
190 .build(); 190 .build();
......
...@@ -76,7 +76,9 @@ public class PathIntentCompiler implements IntentCompiler<PathIntent> { ...@@ -76,7 +76,9 @@ public class PathIntentCompiler implements IntentCompiler<PathIntent> {
76 for (int i = 0; i < links.size() - 1; i++) { 76 for (int i = 0; i < links.size() - 1; i++) {
77 ConnectPoint ingress = links.get(i).dst(); 77 ConnectPoint ingress = links.get(i).dst();
78 ConnectPoint egress = links.get(i + 1).src(); 78 ConnectPoint egress = links.get(i + 1).src();
79 - FlowRule rule = createFlowRule(intent.selector(), intent.treatment(), ingress, egress, isLast(links, i)); 79 + FlowRule rule = createFlowRule(intent.selector(), intent.treatment(),
80 + ingress, egress, intent.priority(),
81 + isLast(links, i));
80 rules.add(rule); 82 rules.add(rule);
81 } 83 }
82 84
...@@ -84,7 +86,8 @@ public class PathIntentCompiler implements IntentCompiler<PathIntent> { ...@@ -84,7 +86,8 @@ public class PathIntentCompiler implements IntentCompiler<PathIntent> {
84 } 86 }
85 87
86 private FlowRule createFlowRule(TrafficSelector originalSelector, TrafficTreatment originalTreatment, 88 private FlowRule createFlowRule(TrafficSelector originalSelector, TrafficTreatment originalTreatment,
87 - ConnectPoint ingress, ConnectPoint egress, boolean last) { 89 + ConnectPoint ingress, ConnectPoint egress,
90 + int priority, boolean last) {
88 TrafficSelector selector = DefaultTrafficSelector.builder(originalSelector) 91 TrafficSelector selector = DefaultTrafficSelector.builder(originalSelector)
89 .matchInPort(ingress.port()) 92 .matchInPort(ingress.port())
90 .build(); 93 .build();
...@@ -97,7 +100,14 @@ public class PathIntentCompiler implements IntentCompiler<PathIntent> { ...@@ -97,7 +100,14 @@ public class PathIntentCompiler implements IntentCompiler<PathIntent> {
97 } 100 }
98 TrafficTreatment treatment = treatmentBuilder.setOutput(egress.port()).build(); 101 TrafficTreatment treatment = treatmentBuilder.setOutput(egress.port()).build();
99 102
100 - return new DefaultFlowRule(ingress.deviceId(), selector, treatment, 123, appId, 0, true); 103 + return DefaultFlowRule.builder()
104 + .forDevice(ingress.deviceId())
105 + .withSelector(selector)
106 + .withTreatment(treatment)
107 + .withPriority(priority)
108 + .fromApp(appId)
109 + .makePermanent()
110 + .build();
101 } 111 }
102 112
103 private boolean isLast(List<Link> links, int i) { 113 private boolean isLast(List<Link> links, int i) {
......
...@@ -81,7 +81,7 @@ public class LinkCollectionIntentCompilerTest { ...@@ -81,7 +81,7 @@ public class LinkCollectionIntentCompilerTest {
81 private LinkCollectionIntentCompiler sut; 81 private LinkCollectionIntentCompiler sut;
82 82
83 @Before 83 @Before
84 - public void setUP() { 84 + public void setUp() {
85 sut = new LinkCollectionIntentCompiler(); 85 sut = new LinkCollectionIntentCompiler();
86 coreService = createMock(CoreService.class); 86 coreService = createMock(CoreService.class);
87 expect(coreService.registerApplication("org.onosproject.net.intent")) 87 expect(coreService.registerApplication("org.onosproject.net.intent"))
...@@ -132,6 +132,7 @@ public class LinkCollectionIntentCompilerTest { ...@@ -132,6 +132,7 @@ public class LinkCollectionIntentCompilerTest {
132 assertThat(rule1.treatment(), is( 132 assertThat(rule1.treatment(), is(
133 DefaultTrafficTreatment.builder(intent.treatment()).setOutput(d1p1.port()).build() 133 DefaultTrafficTreatment.builder(intent.treatment()).setOutput(d1p1.port()).build()
134 )); 134 ));
135 + assertThat(rule1.priority(), is(intent.priority()));
135 136
136 FlowRule rule2 = rules.stream() 137 FlowRule rule2 = rules.stream()
137 .filter(rule -> rule.deviceId().equals(d2p0.deviceId())) 138 .filter(rule -> rule.deviceId().equals(d2p0.deviceId()))
...@@ -143,6 +144,7 @@ public class LinkCollectionIntentCompilerTest { ...@@ -143,6 +144,7 @@ public class LinkCollectionIntentCompilerTest {
143 assertThat(rule2.treatment(), is( 144 assertThat(rule2.treatment(), is(
144 DefaultTrafficTreatment.builder().setOutput(d2p1.port()).build() 145 DefaultTrafficTreatment.builder().setOutput(d2p1.port()).build()
145 )); 146 ));
147 + assertThat(rule2.priority(), is(intent.priority()));
146 148
147 FlowRule rule3 = rules.stream() 149 FlowRule rule3 = rules.stream()
148 .filter(rule -> rule.deviceId().equals(d3p0.deviceId())) 150 .filter(rule -> rule.deviceId().equals(d3p0.deviceId()))
...@@ -154,6 +156,7 @@ public class LinkCollectionIntentCompilerTest { ...@@ -154,6 +156,7 @@ public class LinkCollectionIntentCompilerTest {
154 assertThat(rule3.treatment(), is( 156 assertThat(rule3.treatment(), is(
155 DefaultTrafficTreatment.builder().setOutput(d3p1.port()).build() 157 DefaultTrafficTreatment.builder().setOutput(d3p1.port()).build()
156 )); 158 ));
159 + assertThat(rule3.priority(), is(intent.priority()));
157 160
158 sut.deactivate(); 161 sut.deactivate();
159 } 162 }
......
...@@ -50,6 +50,7 @@ import static org.easymock.EasyMock.expect; ...@@ -50,6 +50,7 @@ import static org.easymock.EasyMock.expect;
50 import static org.easymock.EasyMock.replay; 50 import static org.easymock.EasyMock.replay;
51 import static org.hamcrest.MatcherAssert.assertThat; 51 import static org.hamcrest.MatcherAssert.assertThat;
52 import static org.hamcrest.Matchers.hasSize; 52 import static org.hamcrest.Matchers.hasSize;
53 +import static org.junit.Assert.assertEquals;
53 import static org.onosproject.net.Link.Type.DIRECT; 54 import static org.onosproject.net.Link.Type.DIRECT;
54 import static org.onosproject.net.NetTestTools.PID; 55 import static org.onosproject.net.NetTestTools.PID;
55 import static org.onosproject.net.NetTestTools.connectPoint; 56 import static org.onosproject.net.NetTestTools.connectPoint;
...@@ -135,7 +136,12 @@ public class OpticalPathIntentCompilerTest { ...@@ -135,7 +136,12 @@ public class OpticalPathIntentCompilerTest {
135 .findFirst() 136 .findFirst()
136 .get(); 137 .get();
137 138
139 + rules.forEach(rule -> assertEquals("FlowRule priority is incorrect",
140 + intent.priority(), rule.priority()));
141 +
138 sut.deactivate(); 142 sut.deactivate();
139 } 143 }
140 144
145 + //TODO test bidirectional optical paths and verify rules
146 +
141 } 147 }
......
...@@ -75,6 +75,7 @@ public class PathIntentCompilerTest { ...@@ -75,6 +75,7 @@ public class PathIntentCompilerTest {
75 private final ConnectPoint d3p1 = connectPoint("s3", 1); 75 private final ConnectPoint d3p1 = connectPoint("s3", 1);
76 private final ConnectPoint d3p0 = connectPoint("s3", 10); 76 private final ConnectPoint d3p0 = connectPoint("s3", 10);
77 private final ConnectPoint d1p0 = connectPoint("s1", 10); 77 private final ConnectPoint d1p0 = connectPoint("s1", 10);
78 + private static final int PRIORITY = 555;
78 79
79 private final List<Link> links = Arrays.asList( 80 private final List<Link> links = Arrays.asList(
80 createEdgeLink(d1p0, true), 81 createEdgeLink(d1p0, true),
...@@ -102,6 +103,7 @@ public class PathIntentCompilerTest { ...@@ -102,6 +103,7 @@ public class PathIntentCompilerTest {
102 .appId(APP_ID) 103 .appId(APP_ID)
103 .selector(selector) 104 .selector(selector)
104 .treatment(treatment) 105 .treatment(treatment)
106 + .priority(PRIORITY)
105 .path(new DefaultPath(pid, links, hops)) 107 .path(new DefaultPath(pid, links, hops))
106 .build(); 108 .build();
107 intentExtensionService = createMock(IntentExtensionService.class); 109 intentExtensionService = createMock(IntentExtensionService.class);
...@@ -141,6 +143,7 @@ public class PathIntentCompilerTest { ...@@ -141,6 +143,7 @@ public class PathIntentCompilerTest {
141 is(DefaultTrafficSelector.builder(selector).matchInPort(d1p0.port()).build())); 143 is(DefaultTrafficSelector.builder(selector).matchInPort(d1p0.port()).build()));
142 assertThat(rule1.treatment(), 144 assertThat(rule1.treatment(),
143 is(DefaultTrafficTreatment.builder().setOutput(d1p1.port()).build())); 145 is(DefaultTrafficTreatment.builder().setOutput(d1p1.port()).build()));
146 + assertThat(rule1.priority(), is(intent.priority()));
144 147
145 FlowRule rule2 = rules.stream() 148 FlowRule rule2 = rules.stream()
146 .filter(x -> x.deviceId().equals(d2p0.deviceId())) 149 .filter(x -> x.deviceId().equals(d2p0.deviceId()))
...@@ -151,6 +154,7 @@ public class PathIntentCompilerTest { ...@@ -151,6 +154,7 @@ public class PathIntentCompilerTest {
151 is(DefaultTrafficSelector.builder(selector).matchInPort(d2p0.port()).build())); 154 is(DefaultTrafficSelector.builder(selector).matchInPort(d2p0.port()).build()));
152 assertThat(rule2.treatment(), 155 assertThat(rule2.treatment(),
153 is(DefaultTrafficTreatment.builder().setOutput(d2p1.port()).build())); 156 is(DefaultTrafficTreatment.builder().setOutput(d2p1.port()).build()));
157 + assertThat(rule2.priority(), is(intent.priority()));
154 158
155 FlowRule rule3 = rules.stream() 159 FlowRule rule3 = rules.stream()
156 .filter(x -> x.deviceId().equals(d3p0.deviceId())) 160 .filter(x -> x.deviceId().equals(d3p0.deviceId()))
...@@ -161,6 +165,7 @@ public class PathIntentCompilerTest { ...@@ -161,6 +165,7 @@ public class PathIntentCompilerTest {
161 is(DefaultTrafficSelector.builder(selector).matchInPort(d3p1.port()).build())); 165 is(DefaultTrafficSelector.builder(selector).matchInPort(d3p1.port()).build()));
162 assertThat(rule3.treatment(), 166 assertThat(rule3.treatment(),
163 is(DefaultTrafficTreatment.builder(treatment).setOutput(d3p0.port()).build())); 167 is(DefaultTrafficTreatment.builder(treatment).setOutput(d3p0.port()).build()));
168 + assertThat(rule3.priority(), is(intent.priority()));
164 169
165 sut.deactivate(); 170 sut.deactivate();
166 } 171 }
......