blob: b7c3ea6829107149ec97edcec4a46adf032d6bcf [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 Links Module.
19 Module that holds the links for a region
20 */
21
22(function () {
23 'use strict';
24
Steven Burrows6deb4ce2016-08-26 16:06:23 +010025 var $log;
Steven Burrowsec1f45c2016-08-08 16:14:41 +010026 var Collection, Model, region, ts;
Steven Burrows57e24e92016-08-04 18:38:24 +010027
Steven Burrowsec1f45c2016-08-08 16:14:41 +010028 var widthRatio = 1.4,
29 linkScale = d3.scale.linear()
30 .domain([1, 12])
31 .range([widthRatio, 12 * widthRatio])
32 .clamp(true),
33 allLinkTypes = 'direct indirect optical tunnel UiDeviceLink',
34 allLinkSubTypes = 'inactive not-permitted';
35
36 // configuration
37 var linkConfig = {
38 light: {
39 baseColor: '#939598',
40 inColor: '#66f',
41 outColor: '#f00'
42 },
43 dark: {
44 // TODO : theme
45 baseColor: '#939598',
46 inColor: '#66f',
47 outColor: '#f00'
48 },
49 inWidth: 12,
50 outWidth: 10
51 };
52
53 var defaultLinkType = 'direct',
54 nearDist = 15;
55
56 function createLink() {
57
58 var linkPoints = this.linkEndPoints(this.get('epA'), this.get('epB'));
Steven Burrowsec1f45c2016-08-08 16:14:41 +010059
60 var attrs = angular.extend({}, linkPoints, {
61 key: this.get('id'),
62 class: 'link',
63 weight: 1,
64 srcPort: this.get('srcPort'),
65 tgtPort: this.get('dstPort'),
66 position: {
67 x1: 0,
68 y1: 0,
69 x2: 0,
70 y2: 0
71 }
72 // functions to aggregate dual link state
73// extra: link.extra
74 });
75
76 this.set(attrs);
77 }
78
79 function linkEndPoints(srcId, dstId) {
80
Steven Burrows6deb4ce2016-08-26 16:06:23 +010081 var sourceNode = this.region.findNodeById(srcId)
82 var targetNode = this.region.findNodeById(dstId)
Steven Burrowsec1f45c2016-08-08 16:14:41 +010083
Steven Burrows6deb4ce2016-08-26 16:06:23 +010084 if (!sourceNode || !targetNode) {
85 $log.error('Node(s) not on map for link:' + srcId + ':' + dstId);
86 //logicError('Node(s) not on map for link:\n' + sMiss + dMiss);
87 return null;
88 }
Steven Burrowsec1f45c2016-08-08 16:14:41 +010089
90 this.source = sourceNode.toJSON();
91 this.target = targetNode.toJSON();
92
93 return {
94 source: sourceNode,
95 target: targetNode
96 };
97 }
98
99 function createLinkCollection(data, _region) {
100
101 var LinkModel = Model.extend({
102 region: _region,
103 createLink: createLink,
104 linkEndPoints: linkEndPoints,
105 type: function () {
106 return this.get('type');
107 },
108 expected: function () {
109 //TODO: original code is: (s && s.expected) && (t && t.expected);
110 return true;
111 },
112 online: function () {
113 return true;
114 return both && (s && s.online) && (t && t.online);
115 },
Steven Burrowsec1f45c2016-08-08 16:14:41 +0100116 restyleLinkElement: function (immediate) {
117 // this fn's job is to look at raw links and decide what svg classes
118 // need to be applied to the line element in the DOM
119 var th = ts.theme(),
120 el = this.el,
121 type = this.get('type'),
Steven Burrowsec1f45c2016-08-08 16:14:41 +0100122 online = this.online(),
123 modeCls = this.expected() ? 'inactive' : 'not-permitted',
Steven Burrows6deb4ce2016-08-26 16:06:23 +0100124 lw = 1.2,
Steven Burrowsec1f45c2016-08-08 16:14:41 +0100125 delay = immediate ? 0 : 1000;
126
Steven Burrowsec1f45c2016-08-08 16:14:41 +0100127 // NOTE: understand why el is sometimes undefined on addLink events...
128 // Investigated:
129 // el is undefined when it's a reverse link that is being added.
130 // updateLinks (which sets ldata.el) isn't called before this is called.
131 // Calling _updateLinks in addLinkUpdate fixes it, but there might be
132 // a more efficient way to fix it.
133 if (el && !el.empty()) {
134 el.classed('link', true);
135 el.classed(allLinkSubTypes, false);
136 el.classed(modeCls, !online);
137 el.classed(allLinkTypes, false);
138 if (type) {
139 el.classed(type, true);
140 }
141 el.transition()
142 .duration(delay)
143 .attr('stroke-width', linkScale(lw))
144 .attr('stroke', linkConfig[th].baseColor);
145 }
146 },
147
148 onEnter: function (el) {
149 var link = d3.select(el);
150 this.el = link;
151
152 this.restyleLinkElement();
153
154 if (this.get('type') === 'hostLink') {
155 sus.visible(link, api.showHosts());
156 }
157 }
158 });
Steven Burrows57e24e92016-08-04 18:38:24 +0100159
160 var LinkCollection = Collection.extend({
Steven Burrowsec1f45c2016-08-08 16:14:41 +0100161 model: LinkModel,
Steven Burrows57e24e92016-08-04 18:38:24 +0100162 });
163
164 return new LinkCollection(data);
165 }
166
167 angular.module('ovTopo2')
168 .factory('Topo2LinkService',
Steven Burrows6deb4ce2016-08-26 16:06:23 +0100169 ['$log', 'Topo2Collection', 'Topo2Model', 'ThemeService',
Steven Burrows57e24e92016-08-04 18:38:24 +0100170
Steven Burrows6deb4ce2016-08-26 16:06:23 +0100171 function (_$log_, _Collection_, _Model_, _ts_) {
Steven Burrows57e24e92016-08-04 18:38:24 +0100172
Steven Burrows6deb4ce2016-08-26 16:06:23 +0100173 $log = _$log_;
Steven Burrowsec1f45c2016-08-08 16:14:41 +0100174 ts = _ts_;
Steven Burrows57e24e92016-08-04 18:38:24 +0100175 Collection = _Collection_;
Steven Burrowsec1f45c2016-08-08 16:14:41 +0100176 Model = _Model_;
Steven Burrows57e24e92016-08-04 18:38:24 +0100177
178 return {
179 createLinkCollection: createLinkCollection
180 };
181 }
182 ]);
183
184})();