blob: ed3a98107906afae5df4303da4f91b0409b55181 [file] [log] [blame]
Steven Burrows57e24e92016-08-04 18:38:24 +01001/*
2 * Copyright 2016-present 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 ONOS GUI -- Topology Hosts Module.
19 Module that holds the hosts for a region
20 */
21
22(function () {
23 'use strict';
24
Steven Burrowsdfa52b02016-09-02 13:50:43 +010025 var Collection, Model;
Steven Burrows57e24e92016-08-04 18:38:24 +010026
Steven Burrowse1ea27b2017-04-12 09:53:41 -070027 var hostIconDim = 15,
28 hostIconDimMin = 8,
29 hostIconDimMax = 15,
Steven Burrowsbeef9352016-10-21 14:09:50 -050030 remappedDeviceTypes = {};
31
Steven Burrows57e24e92016-08-04 18:38:24 +010032 function createHostCollection(data, region) {
33
34 var HostCollection = Collection.extend({
35 model: Model
36 });
37
38 var hosts = [];
39 data.forEach(function (hostsLayer) {
40 hostsLayer.forEach(function (host) {
41 hosts.push(host);
42 });
43 });
44
45 return new HostCollection(hosts);
46 }
47
48 angular.module('ovTopo2')
Steven Burrowsdfa52b02016-09-02 13:50:43 +010049 .factory('Topo2HostService', [
Steven Burrowsec1f45c2016-08-08 16:14:41 +010050 'Topo2Collection', 'Topo2NodeModel', 'Topo2ViewService',
Steven Burrowsaea509d2017-04-12 14:17:47 -070051 'IconService', 'Topo2ZoomService', 'Topo2HostsPanelService', 'PrefsService',
52 function (_c_, NodeModel, _t2vs_, is, zs, t2hds, ps) {
Steven Burrows57e24e92016-08-04 18:38:24 +010053
Steven Burrowsaf96a212016-12-28 12:57:02 +000054 Collection = _c_;
Steven Burrows57e24e92016-08-04 18:38:24 +010055
Steven Burrowsaf96a212016-12-28 12:57:02 +000056 Model = NodeModel.extend({
Steven Burrows5fa057e2017-03-15 17:07:56 +000057
58 nodeType: 'host',
59 events: {
60 'click': 'onClick'
61 },
Steven Burrows86af4352016-11-16 18:19:12 -060062 initialize: function () {
63 this.super = this.constructor.__super__;
64 this.super.initialize.apply(this, arguments);
65 },
Steven Burrows86af4352016-11-16 18:19:12 -060066 onChange: function () {
67 // Update class names when the model changes
68 if (this.el) {
69 this.el.attr('class', this.svgClassName());
70 }
71 },
Steven Burrows5fa057e2017-03-15 17:07:56 +000072 showDetails: function() {
73 t2hds.displayPanel(this);
Steven Burrows86af4352016-11-16 18:19:12 -060074 },
Steven Burrowsbeef9352016-10-21 14:09:50 -050075 icon: function () {
76 var type = this.get('type');
Steven Burrows1aa4f582016-12-13 15:05:41 -050077 return remappedDeviceTypes[type] || type || 'm_endstation';
Steven Burrowsbeef9352016-10-21 14:09:50 -050078 },
Steven Burrows583f4be2016-11-04 14:06:50 +010079 label: function () {
Steven Burrows474a0fd2017-04-12 09:35:55 -070080 return this.get('ips')[0] || 'unknown';
Steven Burrows583f4be2016-11-04 14:06:50 +010081 },
Steven Burrowsbeef9352016-10-21 14:09:50 -050082 setScale: function () {
83
Steven Burrows8909c5c2017-04-10 09:56:52 -070084 if (!this.el) return;
85
Steven Burrowsbeef9352016-10-21 14:09:50 -050086 var dim = hostIconDim,
87 multipler = 1;
88
89 if (dim * zs.scale() < hostIconDimMin) {
90 multipler = hostIconDimMin / (dim * zs.scale());
91 } else if (dim * zs.scale() > hostIconDimMax) {
92 multipler = hostIconDimMax / (dim * zs.scale());
93 }
94
95 this.el.select('g').selectAll('*')
96 .style('transform', 'scale(' + multipler + ')');
97 },
Steven Burrowsaea509d2017-04-12 14:17:47 -070098 setVisibility: function () {
99 var visible = ps.getPrefs('topo2_prefs')['hosts'];
100 this.el.style('visibility', visible ? 'visible' : 'hidden');
101 },
Steven Burrowsbeef9352016-10-21 14:09:50 -0500102 onEnter: function (el) {
103 var node = d3.select(el),
104 icon = this.icon(),
Steven Burrows583f4be2016-11-04 14:06:50 +0100105 textDy = 5,
106 textDx = (hostIconDim * 2) + 20;
Steven Burrowsbeef9352016-10-21 14:09:50 -0500107
108 this.el = node;
109
110 var g = node.append('g')
111 .attr('class', 'svgIcon hostIcon');
112
113 g.append('circle').attr('r', hostIconDim);
Steven Burrowse1ea27b2017-04-12 09:53:41 -0700114
115 var glyphSize = hostIconDim * 1.5;
Steven Burrowsbeef9352016-10-21 14:09:50 -0500116 g.append('use').attr({
117 'xlink:href': '#' + icon,
Steven Burrowse1ea27b2017-04-12 09:53:41 -0700118 width: glyphSize,
119 height: glyphSize,
120 x: -glyphSize / 2,
121 y: -glyphSize / 2
Steven Burrowsbeef9352016-10-21 14:09:50 -0500122 });
123
Steven Burrows583f4be2016-11-04 14:06:50 +0100124 var labelText = this.label();
125
Steven Burrowsbeef9352016-10-21 14:09:50 -0500126 g.append('text')
Steven Burrows583f4be2016-11-04 14:06:50 +0100127 .text(labelText)
Steven Burrowsbeef9352016-10-21 14:09:50 -0500128 .attr('dy', textDy)
Steven Burrows583f4be2016-11-04 14:06:50 +0100129 .attr('dx', textDx)
Steven Burrowsbeef9352016-10-21 14:09:50 -0500130 .attr('text-anchor', 'middle');
131
132 this.setScale();
Steven Burrows86af4352016-11-16 18:19:12 -0600133 this.setUpEvents();
Steven Burrowsaea509d2017-04-12 14:17:47 -0700134 this.setVisibility();
Steven Burrowsbeef9352016-10-21 14:09:50 -0500135 }
Steven Burrowsec1f45c2016-08-08 16:14:41 +0100136 });
Steven Burrows57e24e92016-08-04 18:38:24 +0100137
Steven Burrowsec1f45c2016-08-08 16:14:41 +0100138 return {
139 createHostCollection: createHostCollection
140 };
141 }
142 ]);
Steven Burrows57e24e92016-08-04 18:38:24 +0100143
144})();