Srikanth Vavilapalli
Committed by Gerrit Code Review

ONOS-1951: Segment Routing multi-instance instability: Plugging Objective contex…

…t to monitor any errors

Change-Id: Ic710a756b7fec411a52a356409639c3f96c3129d
...@@ -35,7 +35,10 @@ import org.onosproject.net.flowobjective.DefaultFilteringObjective; ...@@ -35,7 +35,10 @@ import org.onosproject.net.flowobjective.DefaultFilteringObjective;
35 import org.onosproject.net.flowobjective.DefaultForwardingObjective; 35 import org.onosproject.net.flowobjective.DefaultForwardingObjective;
36 import org.onosproject.net.flowobjective.FilteringObjective; 36 import org.onosproject.net.flowobjective.FilteringObjective;
37 import org.onosproject.net.flowobjective.ForwardingObjective; 37 import org.onosproject.net.flowobjective.ForwardingObjective;
38 +import org.onosproject.net.flowobjective.Objective;
39 +import org.onosproject.net.flowobjective.ObjectiveError;
38 import org.onosproject.net.flowobjective.ForwardingObjective.Builder; 40 import org.onosproject.net.flowobjective.ForwardingObjective.Builder;
41 +import org.onosproject.net.flowobjective.ObjectiveContext;
39 import org.slf4j.Logger; 42 import org.slf4j.Logger;
40 import org.slf4j.LoggerFactory; 43 import org.slf4j.LoggerFactory;
41 44
...@@ -113,7 +116,11 @@ public class RoutingRulePopulator { ...@@ -113,7 +116,11 @@ public class RoutingRulePopulator {
113 116
114 log.debug("Installing IPv4 forwarding objective " 117 log.debug("Installing IPv4 forwarding objective "
115 + "for host {} in switch {}", hostIp, deviceId); 118 + "for host {} in switch {}", hostIp, deviceId);
116 - srManager.flowObjectiveService.forward(deviceId, fwdBuilder.add()); 119 + srManager.flowObjectiveService.
120 + forward(deviceId,
121 + fwdBuilder.
122 + add(new SRObjectiveContext(deviceId,
123 + SRObjectiveContext.ObjectiveType.FORWARDING)));
117 rulePopulationCounter.incrementAndGet(); 124 rulePopulationCounter.incrementAndGet();
118 } 125 }
119 126
...@@ -192,7 +199,11 @@ public class RoutingRulePopulator { ...@@ -192,7 +199,11 @@ public class RoutingRulePopulator {
192 + "for router IP/subnet {} in switch {}", 199 + "for router IP/subnet {} in switch {}",
193 ipPrefix, 200 ipPrefix,
194 deviceId); 201 deviceId);
195 - srManager.flowObjectiveService.forward(deviceId, fwdBuilder.add()); 202 + srManager.flowObjectiveService.
203 + forward(deviceId,
204 + fwdBuilder.
205 + add(new SRObjectiveContext(deviceId,
206 + SRObjectiveContext.ObjectiveType.FORWARDING)));
196 rulePopulationCounter.incrementAndGet(); 207 rulePopulationCounter.incrementAndGet();
197 208
198 return true; 209 return true;
...@@ -275,8 +286,11 @@ public class RoutingRulePopulator { ...@@ -275,8 +286,11 @@ public class RoutingRulePopulator {
275 .makePermanent()).withSelector(selector) 286 .makePermanent()).withSelector(selector)
276 .withPriority(100)) 287 .withPriority(100))
277 .withFlag(ForwardingObjective.Flag.SPECIFIC); 288 .withFlag(ForwardingObjective.Flag.SPECIFIC);
278 - srManager.flowObjectiveService.forward(deviceId, 289 + srManager.flowObjectiveService.
279 - fwdObjBuilder.add()); 290 + forward(deviceId,
291 + fwdObjBuilder.
292 + add(new SRObjectiveContext(deviceId,
293 + SRObjectiveContext.ObjectiveType.FORWARDING)));
280 rulePopulationCounter.incrementAndGet(); 294 rulePopulationCounter.incrementAndGet();
281 } 295 }
282 296
...@@ -346,7 +360,10 @@ public class RoutingRulePopulator { ...@@ -346,7 +360,10 @@ public class RoutingRulePopulator {
346 .addCondition(Criteria.matchVlanId(VlanId.NONE)); 360 .addCondition(Criteria.matchVlanId(VlanId.NONE));
347 fob.permit().fromApp(srManager.appId); 361 fob.permit().fromApp(srManager.appId);
348 log.debug("populateTableVlan: Installing filtering objective for untagged packets"); 362 log.debug("populateTableVlan: Installing filtering objective for untagged packets");
349 - srManager.flowObjectiveService.filter(deviceId, fob.add()); 363 + srManager.flowObjectiveService.
364 + filter(deviceId,
365 + fob.add(new SRObjectiveContext(deviceId,
366 + SRObjectiveContext.ObjectiveType.FILTER)));
350 } 367 }
351 368
352 /** 369 /**
...@@ -363,7 +380,10 @@ public class RoutingRulePopulator { ...@@ -363,7 +380,10 @@ public class RoutingRulePopulator {
363 .getDeviceMac(deviceId))); 380 .getDeviceMac(deviceId)));
364 fob.permit().fromApp(srManager.appId); 381 fob.permit().fromApp(srManager.appId);
365 log.debug("populateTableVlan: Installing filtering objective for router mac"); 382 log.debug("populateTableVlan: Installing filtering objective for router mac");
366 - srManager.flowObjectiveService.filter(deviceId, fob.add()); 383 + srManager.flowObjectiveService.
384 + filter(deviceId,
385 + fob.add(new SRObjectiveContext(deviceId,
386 + SRObjectiveContext.ObjectiveType.FILTER)));
367 } 387 }
368 388
369 private PortNumber selectOnePort(DeviceId srcId, Set<DeviceId> destIds) { 389 private PortNumber selectOnePort(DeviceId srcId, Set<DeviceId> destIds) {
...@@ -382,4 +402,29 @@ public class RoutingRulePopulator { ...@@ -382,4 +402,29 @@ public class RoutingRulePopulator {
382 return null; 402 return null;
383 } 403 }
384 404
405 + private static class SRObjectiveContext implements ObjectiveContext {
406 + enum ObjectiveType {
407 + FILTER,
408 + FORWARDING
409 + }
410 + final DeviceId deviceId;
411 + final ObjectiveType type;
412 +
413 + SRObjectiveContext(DeviceId deviceId, ObjectiveType type) {
414 + this.deviceId = deviceId;
415 + this.type = type;
416 + }
417 + @Override
418 + public void onSuccess(Objective objective) {
419 + log.debug("{} objective operation successful in device {}",
420 + type.name(), deviceId);
421 + }
422 +
423 + @Override
424 + public void onError(Objective objective, ObjectiveError error) {
425 + log.warn("{} objective {} operation failed with error: {} in device {}",
426 + type.name(), objective, error, deviceId);
427 + }
428 + }
429 +
385 } 430 }
......
...@@ -41,6 +41,9 @@ import org.onosproject.net.flow.TrafficTreatment; ...@@ -41,6 +41,9 @@ import org.onosproject.net.flow.TrafficTreatment;
41 import org.onosproject.net.flowobjective.DefaultNextObjective; 41 import org.onosproject.net.flowobjective.DefaultNextObjective;
42 import org.onosproject.net.flowobjective.FlowObjectiveService; 42 import org.onosproject.net.flowobjective.FlowObjectiveService;
43 import org.onosproject.net.flowobjective.NextObjective; 43 import org.onosproject.net.flowobjective.NextObjective;
44 +import org.onosproject.net.flowobjective.Objective;
45 +import org.onosproject.net.flowobjective.ObjectiveContext;
46 +import org.onosproject.net.flowobjective.ObjectiveError;
44 import org.onosproject.net.group.DefaultGroupKey; 47 import org.onosproject.net.group.DefaultGroupKey;
45 import org.onosproject.net.group.GroupKey; 48 import org.onosproject.net.group.GroupKey;
46 import org.onosproject.net.link.LinkService; 49 import org.onosproject.net.link.LinkService;
...@@ -53,7 +56,7 @@ import org.slf4j.Logger; ...@@ -53,7 +56,7 @@ import org.slf4j.Logger;
53 * whether the current device is an edge device or a transit device. 56 * whether the current device is an edge device or a transit device.
54 */ 57 */
55 public class DefaultGroupHandler { 58 public class DefaultGroupHandler {
56 - protected final Logger log = getLogger(getClass()); 59 + protected static final Logger log = getLogger(DefaultGroupHandler.class);
57 60
58 protected final DeviceId deviceId; 61 protected final DeviceId deviceId;
59 protected final ApplicationId appId; 62 protected final ApplicationId appId;
...@@ -211,7 +214,8 @@ public class DefaultGroupHandler { ...@@ -211,7 +214,8 @@ public class DefaultGroupHandler {
211 deviceId, 214 deviceId,
212 newLink.src().port(), 215 newLink.src().port(),
213 nextId); 216 nextId);
214 - NextObjective nextObjective = nextObjBuilder.add(); 217 + NextObjective nextObjective = nextObjBuilder.
218 + add(new SRNextObjectiveContext(deviceId));
215 flowObjectiveService.next(deviceId, nextObjective); 219 flowObjectiveService.next(deviceId, nextObjective);
216 } 220 }
217 } 221 }
...@@ -268,7 +272,8 @@ public class DefaultGroupHandler { ...@@ -268,7 +272,8 @@ public class DefaultGroupHandler {
268 deviceId, 272 deviceId,
269 port, 273 port,
270 nextId); 274 nextId);
271 - NextObjective nextObjective = nextObjBuilder.remove(); 275 + NextObjective nextObjective = nextObjBuilder.
276 + remove(new SRNextObjectiveContext(deviceId));
272 277
273 flowObjectiveService.next(deviceId, nextObjective); 278 flowObjectiveService.next(deviceId, nextObjective);
274 } 279 }
...@@ -470,7 +475,8 @@ public class DefaultGroupHandler { ...@@ -470,7 +475,8 @@ public class DefaultGroupHandler {
470 } 475 }
471 } 476 }
472 477
473 - NextObjective nextObj = nextObjBuilder.add(); 478 + NextObjective nextObj = nextObjBuilder.
479 + add(new SRNextObjectiveContext(deviceId));
474 flowObjectiveService.next(deviceId, nextObj); 480 flowObjectiveService.next(deviceId, nextObj);
475 log.debug("createGroupsFromNeighborsets: Submited " 481 log.debug("createGroupsFromNeighborsets: Submited "
476 + "next objective {} in device {}", 482 + "next objective {} in device {}",
...@@ -496,7 +502,8 @@ public class DefaultGroupHandler { ...@@ -496,7 +502,8 @@ public class DefaultGroupHandler {
496 NextObjective.Builder nextObjBuilder = DefaultNextObjective 502 NextObjective.Builder nextObjBuilder = DefaultNextObjective
497 .builder().withId(objectiveId) 503 .builder().withId(objectiveId)
498 .withType(NextObjective.Type.HASHED).fromApp(appId); 504 .withType(NextObjective.Type.HASHED).fromApp(appId);
499 - NextObjective nextObjective = nextObjBuilder.remove(); 505 + NextObjective nextObjective = nextObjBuilder.
506 + remove(new SRNextObjectiveContext(deviceId));
500 flowObjectiveService.next(deviceId, nextObjective); 507 flowObjectiveService.next(deviceId, nextObjective);
501 508
502 for (Map.Entry<NeighborSetNextObjectiveStoreKey, Integer> entry: nsNextObjStore.entrySet()) { 509 for (Map.Entry<NeighborSetNextObjectiveStoreKey, Integer> entry: nsNextObjStore.entrySet()) {
...@@ -510,4 +517,23 @@ public class DefaultGroupHandler { ...@@ -510,4 +517,23 @@ public class DefaultGroupHandler {
510 517
511 return false; 518 return false;
512 } 519 }
520 +
521 + protected static class SRNextObjectiveContext implements ObjectiveContext {
522 + final DeviceId deviceId;
523 +
524 + SRNextObjectiveContext(DeviceId deviceId) {
525 + this.deviceId = deviceId;
526 + }
527 + @Override
528 + public void onSuccess(Objective objective) {
529 + log.debug("Next objective operation successful in device {}",
530 + deviceId);
531 + }
532 +
533 + @Override
534 + public void onError(Objective objective, ObjectiveError error) {
535 + log.warn("Next objective {} operation failed with error: {} in device {}",
536 + objective, error, deviceId);
537 + }
538 + }
513 } 539 }
......