Topo2 - Show the mastership when selecting an instance panel
JIRA Tasks; ONOS-6292

Change-Id: If4e353495138e606c60430547d01f278b062f372
diff --git a/web/gui/src/main/webapp/app/view/topo2/topo2Device.js b/web/gui/src/main/webapp/app/view/topo2/topo2Device.js
index fadcd93..6eb5704 100644
--- a/web/gui/src/main/webapp/app/view/topo2/topo2Device.js
+++ b/web/gui/src/main/webapp/app/view/topo2/topo2Device.js
@@ -81,6 +81,12 @@
                         detailsPanel.updateDetails(id, nodeType);
                         detailsPanel.show();
                     },
+                    displayMastership: function () {
+                        var id = this.mastershipService.mastership(),
+                            suppress = id ? this.get('master') !== id : false;
+
+                        this.set({ mastership: suppress });
+                    },
                     onExit: function () {
                         var node = this.el;
                         node.select('use')
diff --git a/web/gui/src/main/webapp/app/view/topo2/topo2Force.js b/web/gui/src/main/webapp/app/view/topo2/topo2Force.js
index cfc3b71..b18ff32 100644
--- a/web/gui/src/main/webapp/app/view/topo2/topo2Force.js
+++ b/web/gui/src/main/webapp/app/view/topo2/topo2Force.js
@@ -25,7 +25,7 @@
     // injected refs
     var $log, $loc, wss;
 
-    var t2is, t2rs, t2ls, t2vs, t2bcs, t2ss, t2bgs, t2tbs;
+    var t2is, t2rs, t2ls, t2vs, t2bcs, t2ss, t2bgs, t2tbs, t2mss;
     var svg, forceG, uplink, dim, opts, zoomer;
 
     // D3 Selections
@@ -49,6 +49,7 @@
         t2ss.init(svg, zoomer);
         t2ss.region = t2rs;
         t2rs.layout = t2ls;
+        t2mss.region = t2rs;
         t2tbs.init();
         navToBookmarkedRegion($loc.search().regionId);
     }
@@ -120,25 +121,6 @@
 
     // ========================== Main Service Definition
 
-    function showMastershipFor(id) {
-        suppressLayers(true);
-        node.each(function (n) {
-            if (n.master === id) {
-                n.el.classed('suppressedmax', false);
-            }
-        });
-    }
-
-    function supAmt(less) {
-        return less ? 'suppressed' : 'suppressedmax';
-    }
-
-    function suppressLayers(b, less) {
-        var cls = supAmt(less);
-        node.classed(cls, b);
-        // link.classed(cls, b);
-    }
-
     function newDim(_dim_) {
         dim = _dim_;
         t2vs.newDim(dim);
@@ -189,9 +171,9 @@
         '$log', '$location', 'WebSocketService', 'Topo2InstanceService',
         'Topo2RegionService', 'Topo2LayoutService', 'Topo2ViewService',
         'Topo2BreadcrumbService', 'Topo2ZoomService', 'Topo2SelectService',
-        'Topo2BackgroundService', 'Topo2ToolbarService',
+        'Topo2BackgroundService', 'Topo2ToolbarService', 'Topo2MastershipService',
         function (_$log_, _$loc_, _wss_, _t2is_, _t2rs_, _t2ls_,
-            _t2vs_, _t2bcs_, zoomService, _t2ss_, _t2bgs_, _t2tbs_) {
+            _t2vs_, _t2bcs_, zoomService, _t2ss_, _t2bgs_, _t2tbs_, _t2mss_) {
 
             $log = _$log_;
             $loc = _$loc_;
@@ -204,6 +186,7 @@
             t2ss = _t2ss_;
             t2bgs = _t2bgs_;
             t2tbs = _t2tbs_;
+            t2mss = _t2mss_;
 
             var onZoom = function () {
                 if (!t2rs.isLoadComplete()) {
diff --git a/web/gui/src/main/webapp/app/view/topo2/topo2Instance.js b/web/gui/src/main/webapp/app/view/topo2/topo2Instance.js
index 8a3cf20..044e3d6 100644
--- a/web/gui/src/main/webapp/app/view/topo2/topo2Instance.js
+++ b/web/gui/src/main/webapp/app/view/topo2/topo2Instance.js
@@ -2,7 +2,7 @@
     'use strict';
 
     // injected refs
-    var $log, ps, sus, gs, flash, ts;
+    var $log, ps, sus, gs, flash, ts, t2mss;
 
     // api from topo
     var api;
@@ -61,15 +61,14 @@
             .classed('affinity', false);
         el.classed('affinity', true);
 
-        // suppress all elements except nodes whose master is this instance
-        api.showMastership(d.id);
+        t2mss.setMastership(d.id);
     }
 
     function cancelAffinity() {
         d3.selectAll('.onosInst')
             .classed('mastership affinity', false);
 
-        api.showMastership(null);
+        t2mss.setMastership(null);
     }
 
     function attachUiBadge(svg) {
@@ -271,15 +270,16 @@
     angular.module('ovTopo2')
         .factory('Topo2InstanceService', [
             '$log', 'PanelService', 'SvgUtilService', 'GlyphService',
-            'FlashService', 'ThemeService',
+            'FlashService', 'ThemeService', 'Topo2MastershipService',
 
-            function (_$log_, _ps_, _sus_, _gs_, _flash_, _ts_) {
+            function (_$log_, _ps_, _sus_, _gs_, _flash_, _ts_, _t2mss_) {
                 $log = _$log_;
                 ps = _ps_;
                 sus = _sus_;
                 gs = _gs_;
                 flash = _flash_;
                 ts = _ts_;
+                t2mss = _t2mss_;
 
                 return {
                     initInst: initInst,
diff --git a/web/gui/src/main/webapp/app/view/topo2/topo2Link.js b/web/gui/src/main/webapp/app/view/topo2/topo2Link.js
index b4b7d95..f19f2df 100644
--- a/web/gui/src/main/webapp/app/view/topo2/topo2Link.js
+++ b/web/gui/src/main/webapp/app/view/topo2/topo2Link.js
@@ -22,7 +22,7 @@
 (function () {
     'use strict';
 
-    var $log, Collection, Model, ts, sus, t2zs, t2vs, t2lps, fn, ps;
+    var $log, Collection, Model, ts, sus, t2zs, t2vs, t2lps, fn, ps, t2mss;
 
     var linkLabelOffset = '0.35em';
 
@@ -134,7 +134,8 @@
                     this.get('type'),
                     {
                         enhanced: this.get('enhanced'),
-                        selected: this.get('selected')
+                        selected: this.get('selected'),
+                        suppressedmax: this.get('mastership')
                     }
                 );
             },
@@ -346,6 +347,9 @@
                 var visible = ps.getPrefs('topo2_prefs')['hosts'];
                 this.el.style('visibility', visible ? 'visible' : 'hidden');
             },
+            displayMastership: function () {
+                this.set({ mastership: t2mss.mastership() !== null});
+            },
             remove: function () {
 
                 var width = linkScale(widthRatio) / t2zs.scale();
@@ -376,8 +380,9 @@
         '$log', 'Topo2Collection', 'Topo2Model',
         'ThemeService', 'SvgUtilService', 'Topo2ZoomService',
         'Topo2ViewService', 'Topo2LinkPanelService', 'FnService', 'PrefsService',
+        'Topo2MastershipService',
         function (_$log_, _c_, _Model_, _ts_, _sus_,
-            _t2zs_, _t2vs_, _t2lps_, _fn_, _ps_) {
+            _t2zs_, _t2vs_, _t2lps_, _fn_, _ps_, _t2mss_) {
 
             $log = _$log_;
             ts = _ts_;
@@ -389,6 +394,7 @@
             t2lps = _t2lps_;
             fn = _fn_;
             ps = _ps_;
+            t2mss = _t2mss_;
 
             return {
                 createLinkCollection: createLinkCollection
diff --git a/web/gui/src/main/webapp/app/view/topo2/topo2Mastership.js b/web/gui/src/main/webapp/app/view/topo2/topo2Mastership.js
new file mode 100644
index 0000000..7b1735f
--- /dev/null
+++ b/web/gui/src/main/webapp/app/view/topo2/topo2Mastership.js
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2017-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Topology Mastership controller.
+ Controller that handles the state of the selected mastership
+ */
+
+(function () {
+
+    var instance;
+
+    angular.module('ovTopo2')
+        .factory('Topo2MastershipService', [
+
+            function () {
+
+                var MastershipController = function () {
+                    instance = this;
+                    this.region = null;
+                    this.currentMastership = null;
+                };
+
+                MastershipController.prototype = {
+                    displayMastership: function () {
+                        var nodes = this.region.regionNodes(),
+                            links = this.region.regionLinks();
+
+                        _.each(nodes.concat(links), function (n) {
+                            n.displayMastership(this.currentMastership);
+                        });
+                    },
+                    mastership: function () {
+                        return this.currentMastership;
+                    },
+                    setMastership: function (id) {
+                        this.currentMastership = id;
+                        this.displayMastership();
+                    }
+                }
+
+                return instance || new MastershipController();
+            }
+        ]);
+})();
\ No newline at end of file
diff --git a/web/gui/src/main/webapp/app/view/topo2/topo2NodeModel.js b/web/gui/src/main/webapp/app/view/topo2/topo2NodeModel.js
index ccedaff..fb383d2 100644
--- a/web/gui/src/main/webapp/app/view/topo2/topo2NodeModel.js
+++ b/web/gui/src/main/webapp/app/view/topo2/topo2NodeModel.js
@@ -54,9 +54,9 @@
         'Topo2Model', 'FnService', 'Topo2PrefsService',
         'SvgUtilService', 'IconService', 'ThemeService',
         'Topo2MapConfigService', 'Topo2ZoomService', 'Topo2NodePositionService',
-        'Topo2SelectService',
+        'Topo2SelectService', 'Topo2MastershipService',
         function (Model, _fn_, _ps_, _sus_, _is_, _ts_,
-            _t2mcs_, zoomService, _t2nps_, t2ss) {
+            _t2mcs_, zoomService, _t2nps_, t2ss, t2mss) {
 
             ts = _ts_;
             fn = _fn_;
@@ -69,6 +69,7 @@
             return Model.extend({
                 initialize: function () {
                     this.node = this.createNode();
+                    this.mastershipService = t2mss;
                     this._events = {
                         'mouseover': 'mouseoverHandler',
                         'mouseout': 'mouseoutHandler'
@@ -202,7 +203,8 @@
                             online: this.get('online'),
                             selected: this.get('selected'),
                             hovered: this.get('hovered'),
-                            fixed: this.get('fixed')
+                            fixed: this.get('fixed'),
+                            suppressedmax: this.get('mastership')
                         }
                     );
                 },
@@ -213,6 +215,9 @@
                 resetPosition: function () {
                     t2nps.setLongLat(this);
                 },
+                displayMastership: function () {
+                    this.set({ mastership: t2mss.mastership() !== null});
+                },
                 update: function () {
                     this.updateLabel();
                 },
diff --git a/web/gui/src/main/webapp/index.html b/web/gui/src/main/webapp/index.html
index 342f25d..06d5a31 100644
--- a/web/gui/src/main/webapp/index.html
+++ b/web/gui/src/main/webapp/index.html
@@ -153,6 +153,7 @@
     <script src="app/view/topo2/topo2MapCountryFilters.js"></script>
     <script src="app/view/topo2/topo2MapConfig.js"></script>
     <script src="app/view/topo2/topo2MapDialog.js"></script>
+    <script src="app/view/topo2/topo2Mastership.js"></script>
     <script src="app/view/topo2/topo2Model.js"></script>
     <script src="app/view/topo2/topo2NodeModel.js"></script>
     <script src="app/view/topo2/topo2NodePosition.js"></script>