Simon Hunt
Committed by Gerrit Code Review

ONOS-2186 - GUI Topo Overlay - (WIP)

- Cleaned up intent highlighting in TrafficMonitor (deleted deprecated TrafficClass).
- update traffic ESC handler to force cancel traffic.

Change-Id: I9cab752152718c367ff0cbf4dcacc1dff299164b
...@@ -37,10 +37,11 @@ import org.onosproject.net.statistic.Load; ...@@ -37,10 +37,11 @@ import org.onosproject.net.statistic.Load;
37 import org.onosproject.ui.impl.topo.IntentSelection; 37 import org.onosproject.ui.impl.topo.IntentSelection;
38 import org.onosproject.ui.impl.topo.ServicesBundle; 38 import org.onosproject.ui.impl.topo.ServicesBundle;
39 import org.onosproject.ui.impl.topo.TopoIntentFilter; 39 import org.onosproject.ui.impl.topo.TopoIntentFilter;
40 -import org.onosproject.ui.impl.topo.TrafficClass;
41 import org.onosproject.ui.impl.topo.TrafficLink; 40 import org.onosproject.ui.impl.topo.TrafficLink;
41 +import org.onosproject.ui.impl.topo.TrafficLink.StatsType;
42 import org.onosproject.ui.impl.topo.TrafficLinkMap; 42 import org.onosproject.ui.impl.topo.TrafficLinkMap;
43 import org.onosproject.ui.topo.Highlights; 43 import org.onosproject.ui.topo.Highlights;
44 +import org.onosproject.ui.topo.LinkHighlight.Flavor;
44 import org.onosproject.ui.topo.NodeSelection; 45 import org.onosproject.ui.topo.NodeSelection;
45 import org.onosproject.ui.topo.TopoUtils; 46 import org.onosproject.ui.topo.TopoUtils;
46 import org.slf4j.Logger; 47 import org.slf4j.Logger;
...@@ -59,9 +60,8 @@ import java.util.TimerTask; ...@@ -59,9 +60,8 @@ import java.util.TimerTask;
59 60
60 import static org.onosproject.net.DefaultEdgeLink.createEdgeLink; 61 import static org.onosproject.net.DefaultEdgeLink.createEdgeLink;
61 import static org.onosproject.ui.impl.TrafficMonitor.Mode.IDLE; 62 import static org.onosproject.ui.impl.TrafficMonitor.Mode.IDLE;
63 +import static org.onosproject.ui.impl.TrafficMonitor.Mode.RELATED_INTENTS;
62 import static org.onosproject.ui.impl.TrafficMonitor.Mode.SELECTED_INTENT; 64 import static org.onosproject.ui.impl.TrafficMonitor.Mode.SELECTED_INTENT;
63 -import static org.onosproject.ui.topo.LinkHighlight.Flavor.PRIMARY_HIGHLIGHT;
64 -import static org.onosproject.ui.topo.LinkHighlight.Flavor.SECONDARY_HIGHLIGHT;
65 65
66 /** 66 /**
67 * Encapsulates the behavior of monitoring specific traffic patterns. 67 * Encapsulates the behavior of monitoring specific traffic patterns.
...@@ -239,6 +239,9 @@ public class TrafficMonitor { ...@@ -239,6 +239,9 @@ public class TrafficMonitor {
239 if (selectedIntents != null) { 239 if (selectedIntents != null) {
240 selectedIntents.next(); 240 selectedIntents.next();
241 sendSelectedIntents(); 241 sendSelectedIntents();
242 + if (mode == SELECTED_INTENT) {
243 + mode = RELATED_INTENTS;
244 + }
242 } 245 }
243 } 246 }
244 247
...@@ -251,6 +254,9 @@ public class TrafficMonitor { ...@@ -251,6 +254,9 @@ public class TrafficMonitor {
251 if (selectedIntents != null) { 254 if (selectedIntents != null) {
252 selectedIntents.prev(); 255 selectedIntents.prev();
253 sendSelectedIntents(); 256 sendSelectedIntents();
257 + if (mode == SELECTED_INTENT) {
258 + mode = RELATED_INTENTS;
259 + }
254 } 260 }
255 } 261 }
256 262
...@@ -300,7 +306,6 @@ public class TrafficMonitor { ...@@ -300,7 +306,6 @@ public class TrafficMonitor {
300 trafficTask = new TrafficUpdateTask(); 306 trafficTask = new TrafficUpdateTask();
301 timer.schedule(trafficTask, trafficPeriod, trafficPeriod); 307 timer.schedule(trafficTask, trafficPeriod, trafficPeriod);
302 } else { 308 } else {
303 - // TEMPORARY until we are sure this is working correctly
304 log.debug("(traffic task already running)"); 309 log.debug("(traffic task already running)");
305 } 310 }
306 } 311 }
...@@ -314,12 +319,12 @@ public class TrafficMonitor { ...@@ -314,12 +319,12 @@ public class TrafficMonitor {
314 319
315 private void sendAllFlowTraffic() { 320 private void sendAllFlowTraffic() {
316 log.debug("sendAllFlowTraffic"); 321 log.debug("sendAllFlowTraffic");
317 - msgHandler.sendHighlights(trafficSummary(TrafficLink.StatsType.FLOW_STATS)); 322 + msgHandler.sendHighlights(trafficSummary(StatsType.FLOW_STATS));
318 } 323 }
319 324
320 private void sendAllPortTraffic() { 325 private void sendAllPortTraffic() {
321 log.debug("sendAllPortTraffic"); 326 log.debug("sendAllPortTraffic");
322 - msgHandler.sendHighlights(trafficSummary(TrafficLink.StatsType.PORT_STATS)); 327 + msgHandler.sendHighlights(trafficSummary(StatsType.PORT_STATS));
323 } 328 }
324 329
325 private void sendDeviceLinkFlows() { 330 private void sendDeviceLinkFlows() {
...@@ -345,7 +350,7 @@ public class TrafficMonitor { ...@@ -345,7 +350,7 @@ public class TrafficMonitor {
345 // ======================================================================= 350 // =======================================================================
346 // === Generate messages in JSON object node format 351 // === Generate messages in JSON object node format
347 352
348 - private Highlights trafficSummary(TrafficLink.StatsType type) { 353 + private Highlights trafficSummary(StatsType type) {
349 Highlights highlights = new Highlights(); 354 Highlights highlights = new Highlights();
350 355
351 TrafficLinkMap linkMap = new TrafficLinkMap(); 356 TrafficLinkMap linkMap = new TrafficLinkMap();
...@@ -353,9 +358,9 @@ public class TrafficMonitor { ...@@ -353,9 +358,9 @@ public class TrafficMonitor {
353 addEdgeLinks(linkMap); 358 addEdgeLinks(linkMap);
354 359
355 for (TrafficLink tlink : linkMap.biLinks()) { 360 for (TrafficLink tlink : linkMap.biLinks()) {
356 - if (type == TrafficLink.StatsType.FLOW_STATS) { 361 + if (type == StatsType.FLOW_STATS) {
357 attachFlowLoad(tlink); 362 attachFlowLoad(tlink);
358 - } else if (type == TrafficLink.StatsType.PORT_STATS) { 363 + } else if (type == StatsType.PORT_STATS) {
359 attachPortLoad(tlink); 364 attachPortLoad(tlink);
360 } 365 }
361 366
...@@ -385,7 +390,7 @@ public class TrafficMonitor { ...@@ -385,7 +390,7 @@ public class TrafficMonitor {
385 390
386 // now report on our collated links 391 // now report on our collated links
387 for (TrafficLink tlink : linkMap.biLinks()) { 392 for (TrafficLink tlink : linkMap.biLinks()) {
388 - highlights.add(tlink.highlight(TrafficLink.StatsType.FLOW_COUNT)); 393 + highlights.add(tlink.highlight(StatsType.FLOW_COUNT));
389 } 394 }
390 395
391 } 396 }
...@@ -420,10 +425,8 @@ public class TrafficMonitor { ...@@ -420,10 +425,8 @@ public class TrafficMonitor {
420 log.debug("Highlight intent: {} ([{}] of {})", 425 log.debug("Highlight intent: {} ([{}] of {})",
421 current.id(), selectedIntents.index(), count); 426 current.id(), selectedIntents.index(), count);
422 } 427 }
423 - TrafficClass tc1 = new TrafficClass(PRIMARY_HIGHLIGHT, primary); 428 +
424 - TrafficClass tc2 = new TrafficClass(SECONDARY_HIGHLIGHT, secondary); 429 + highlightIntentLinks(highlights, primary, secondary);
425 - // classify primary links after secondary (last man wins)
426 - highlightIntents(highlights, tc2, tc1);
427 } 430 }
428 return highlights; 431 return highlights;
429 } 432 }
...@@ -437,8 +440,8 @@ public class TrafficMonitor { ...@@ -437,8 +440,8 @@ public class TrafficMonitor {
437 primary.add(current); 440 primary.add(current);
438 log.debug("Highlight traffic for intent: {} ([{}] of {})", 441 log.debug("Highlight traffic for intent: {} ([{}] of {})",
439 current.id(), selectedIntents.index(), selectedIntents.size()); 442 current.id(), selectedIntents.index(), selectedIntents.size());
440 - TrafficClass tc1 = new TrafficClass(PRIMARY_HIGHLIGHT, primary, true); 443 +
441 - highlightIntents(highlights, tc1); 444 + highlightIntentLinksWithTraffic(highlights, primary);
442 } 445 }
443 return highlights; 446 return highlights;
444 } 447 }
...@@ -532,27 +535,29 @@ public class TrafficMonitor { ...@@ -532,27 +535,29 @@ public class TrafficMonitor {
532 return count; 535 return count;
533 } 536 }
534 537
535 - private void highlightIntents(Highlights highlights, 538 + private void highlightIntentLinks(Highlights highlights,
536 - TrafficClass... trafficClasses) { 539 + Set<Intent> primary, Set<Intent> secondary) {
537 TrafficLinkMap linkMap = new TrafficLinkMap(); 540 TrafficLinkMap linkMap = new TrafficLinkMap();
541 + // NOTE: highlight secondary first, then primary, so that links shared
542 + // by intents are colored correctly ("last man wins")
543 + createTrafficLinks(linkMap, secondary, Flavor.SECONDARY_HIGHLIGHT, false);
544 + createTrafficLinks(linkMap, primary, Flavor.PRIMARY_HIGHLIGHT, false);
545 + colorLinks(highlights, linkMap);
546 + }
538 547
539 - for (TrafficClass trafficClass : trafficClasses) { 548 + private void highlightIntentLinksWithTraffic(Highlights highlights,
540 - classifyLinkTraffic(linkMap, trafficClass); 549 + Set<Intent> primary) {
541 - } 550 + TrafficLinkMap linkMap = new TrafficLinkMap();
542 - 551 + createTrafficLinks(linkMap, primary, Flavor.PRIMARY_HIGHLIGHT, true);
543 - for (TrafficLink tlink : linkMap.biLinks()) { 552 + colorLinks(highlights, linkMap);
544 - highlights.add(tlink.highlight(TrafficLink.StatsType.TAGGED));
545 - }
546 } 553 }
547 554
548 - private void classifyLinkTraffic(TrafficLinkMap linkMap, 555 + private void createTrafficLinks(TrafficLinkMap linkMap, Set<Intent> intents,
549 - TrafficClass trafficClass) { 556 + Flavor flavor, boolean showTraffic) {
550 - for (Intent intent : trafficClass.intents()) { 557 + for (Intent intent : intents) {
551 - boolean isOptical = intent instanceof OpticalConnectivityIntent;
552 List<Intent> installables = servicesBundle.intentService() 558 List<Intent> installables = servicesBundle.intentService()
553 .getInstallableIntents(intent.key()); 559 .getInstallableIntents(intent.key());
554 Iterable<Link> links = null; 560 Iterable<Link> links = null;
555 -
556 if (installables != null) { 561 if (installables != null) {
557 for (Intent installable : installables) { 562 for (Intent installable : installables) {
558 563
...@@ -566,34 +571,41 @@ public class TrafficMonitor { ...@@ -566,34 +571,41 @@ public class TrafficMonitor {
566 links = ((OpticalPathIntent) installable).path().links(); 571 links = ((OpticalPathIntent) installable).path().links();
567 } 572 }
568 573
569 - classifyLinks(trafficClass, isOptical, linkMap, links); 574 + boolean isOptical = intent instanceof OpticalConnectivityIntent;
575 + processLinks(linkMap, links, flavor, isOptical, showTraffic);
570 } 576 }
571 } 577 }
572 } 578 }
573 } 579 }
574 580
575 - private void classifyLinks(TrafficClass trafficClass, boolean isOptical, 581 + // Extracts links from the specified flow rule intent resources
576 - TrafficLinkMap linkMap, 582 + private Collection<Link> linkResources(Intent installable) {
577 - Iterable<Link> links) { 583 + ImmutableList.Builder<Link> builder = ImmutableList.builder();
584 + installable.resources().stream().filter(r -> r instanceof Link)
585 + .forEach(r -> builder.add((Link) r));
586 + return builder.build();
587 + }
588 +
589 + private void processLinks(TrafficLinkMap linkMap, Iterable<Link> links,
590 + Flavor flavor, boolean isOptical,
591 + boolean showTraffic) {
578 if (links != null) { 592 if (links != null) {
579 for (Link link : links) { 593 for (Link link : links) {
580 TrafficLink tlink = linkMap.add(link); 594 TrafficLink tlink = linkMap.add(link);
581 - if (trafficClass.showTraffic()) { 595 + tlink.tagFlavor(flavor);
596 + tlink.optical(isOptical);
597 + if (showTraffic) {
582 tlink.addLoad(getLinkFlowLoad(link)); 598 tlink.addLoad(getLinkFlowLoad(link));
583 tlink.antMarch(true); 599 tlink.antMarch(true);
584 } 600 }
585 - tlink.optical(isOptical);
586 - tlink.tagFlavor(trafficClass.flavor());
587 } 601 }
588 } 602 }
589 } 603 }
590 604
591 - // Extracts links from the specified flow rule intent resources 605 + private void colorLinks(Highlights highlights, TrafficLinkMap linkMap) {
592 - private Collection<Link> linkResources(Intent installable) { 606 + for (TrafficLink tlink : linkMap.biLinks()) {
593 - ImmutableList.Builder<Link> builder = ImmutableList.builder(); 607 + highlights.add(tlink.highlight(StatsType.TAGGED));
594 - installable.resources().stream().filter(r -> r instanceof Link) 608 + }
595 - .forEach(r -> builder.add((Link) r));
596 - return builder.build();
597 } 609 }
598 610
599 // ======================================================================= 611 // =======================================================================
......
1 -/*
2 - * Copyright 2015 Open Networking Laboratory
3 - *
4 - * Licensed under the Apache License, Version 2.0 (the "License");
5 - * you may not use this file except in compliance with the License.
6 - * You may obtain a copy of the License at
7 - *
8 - * http://www.apache.org/licenses/LICENSE-2.0
9 - *
10 - * Unless required by applicable law or agreed to in writing, software
11 - * distributed under the License is distributed on an "AS IS" BASIS,
12 - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 - * See the License for the specific language governing permissions and
14 - * limitations under the License.
15 - *
16 - */
17 -
18 -package org.onosproject.ui.impl.topo;
19 -
20 -import org.onosproject.net.intent.Intent;
21 -import org.onosproject.ui.topo.LinkHighlight;
22 -
23 -/**
24 - * Auxiliary data carrier for assigning a highlight class to a set of
25 - * intents, for visualization in the topology view.
26 - */
27 -@Deprecated
28 -public class TrafficClass {
29 -
30 - private final LinkHighlight.Flavor flavor;
31 - private final Iterable<Intent> intents;
32 - private final boolean showTraffic;
33 -
34 - public TrafficClass(LinkHighlight.Flavor flavor, Iterable<Intent> intents) {
35 - this(flavor, intents, false);
36 - }
37 -
38 - public TrafficClass(LinkHighlight.Flavor flavor, Iterable<Intent> intents,
39 - boolean showTraffic) {
40 - this.flavor = flavor;
41 - this.intents = intents;
42 - this.showTraffic = showTraffic;
43 - }
44 -
45 - public LinkHighlight.Flavor flavor() {
46 - return flavor;
47 - }
48 -
49 - public Iterable<Intent> intents() {
50 - return intents;
51 - }
52 -
53 - public boolean showTraffic() {
54 - return showTraffic;
55 - }
56 -}
...@@ -119,7 +119,7 @@ ...@@ -119,7 +119,7 @@
119 // hook for handling escape key 119 // hook for handling escape key
120 escape: function () { 120 escape: function () {
121 // Must return true to consume ESC, false otherwise. 121 // Must return true to consume ESC, false otherwise.
122 - return tts.cancelTraffic(); 122 + return tts.cancelTraffic(true);
123 }, 123 },
124 124
125 // hooks for when the selection changes... 125 // hooks for when the selection changes...
......