blob: c9d6262f22d3eb5caad81b6013ec5f60d0f564bc [file] [log] [blame]
daniel park128c52c2017-09-04 13:15:51 +09001/*
2 * Copyright 2017-present Open Networking Foundation
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/* OpenStack Networking UI Overlay description */
18(function () {
19 'use strict';
20
21 // injected refs
22 var $log, tov, sts, flash, ds, wss;
23 var traceSrc = null;
24 var traceDst = null;
Daniel Park577b69c2018-07-16 17:29:34 +090025 var srcDeviceId = null;
26 var dstDeviceId = null;
daniel park128c52c2017-09-04 13:15:51 +090027
28 var traceInfoDialogId = 'traceInfoDialogId',
29 traceInfoDialogOpt = {
Daniel Park577b69c2018-07-16 17:29:34 +090030 width: 300,
daniel park128c52c2017-09-04 13:15:51 +090031 edge: 'left',
32 margin: 20,
33 hideMargin: -20
34 }
35
36 var overlay = {
37 // NOTE: this must match the ID defined in AppUiTopovOverlay
38 overlayId: 'sona-overlay',
39 glyphId: '*star4',
40 tooltip: 'OpenstackNetworking UI',
41
42 glyphs: {
43 star4: {
44 vb: '0 0 8 8',
45 d: 'M1,4l2,-1l1,-2l1,2l2,1l-2,1l-1,2l-1,-2z'
46 },
47 banner: {
48 vb: '0 0 6 6',
49 d: 'M1,1v4l2,-2l2,2v-4z'
50 }
51 },
52
53 activate: function () {
54 $log.debug("OpenstackNetworking UI ACTIVATED");
55 },
56 deactivate: function () {
57 sts.stopDisplay();
58 $log.debug("OpenstackNetworking UI DEACTIVATED");
59 },
60
61 // detail panel button definitions
62 buttons: {
63 flowtrace: {
64 gid: 'checkMark',
65 tt: 'Flow Trace',
66 cb: function (data) {
67
68 if (traceSrc == null && data.navPath == 'host') {
Daniel Park577b69c2018-07-16 17:29:34 +090069 traceSrc = data.propValues.ip;
70 srcDeviceId = data.propValues.DeviceId
daniel park128c52c2017-09-04 13:15:51 +090071
72 flash.flash('Src ' + traceSrc + ' selected. Please select the dst');
73 } else if (traceDst == null && data.title != traceSrc && data.navPath == 'host') {
Daniel Park577b69c2018-07-16 17:29:34 +090074 traceDst = data.propValues.ip;
75 dstDeviceId = data.propValues.DeviceId;
daniel park128c52c2017-09-04 13:15:51 +090076 openTraceInfoDialog();
77 flash.flash('Dst ' + traceDst + ' selected. Press Request button');
78 }
79
80 $log.debug('Perform flow trace test between VMs:', data);
81 }
82 },
83
84 reset: {
85 gid: 'xMark',
86 tt: 'Reset',
87 cb: function (data) {
88 flash.flash('Reset flow trace');
89 traceSrc = null;
90 traceDst = null;
91 ds.closeDialog();
92 $log.debug('BAR action invoked with data:', data);
93 }
94 },
95 toGateway: {
96 gid: 'm_switch',
97 tt: 'Trace to Gateway',
98 cb: function (data) {
99 if (traceSrc != null && data.title == traceSrc && data.navPath == 'host') {
100 //Set traceSrc to traceDst in case trace to gateway
101 traceDst = traceSrc;
Daniel Park577b69c2018-07-16 17:29:34 +0900102 dstDeviceId = 'toGateway';
daniel park128c52c2017-09-04 13:15:51 +0900103 openTraceInfoDialog();
104 flash.flash('Trace to Gateway');
105 }
106 }
107 },
108 toExternal: {
109 gid: 'm_cloud',
110 tt: 'Trace to External',
111 cb: function (data) {
112 if (traceSrc != null && data.title == traceSrc && data.navPath == 'host') {
113 //Set traceDst to 8.8.8.8 to check external connection
114 traceDst = '8.8.8.8';
Daniel Park577b69c2018-07-16 17:29:34 +0900115 dstDeviceId = 'toExternal';
daniel park128c52c2017-09-04 13:15:51 +0900116 openTraceInfoDialog();
117 flash.flash('Trace to External')
118 }
119 }
120 }
121 },
122
123 keyBindings: {
124 0: {
125 cb: function () { sts.stopDisplay(); },
126 tt: 'Cancel OpenstackNetworking UI Overlay Mode',
127 gid: 'xMark'
128 },
129 V: {
130 cb: function () {
131 wss.bindHandlers({
132 flowTraceResult: sts,
133 });
134 sts.startDisplay('mouse');
135 },
136 tt: 'Start OpenstackNetworking UI Overlay Mode',
137 gid: 'crown'
138 },
139
140 _keyOrder: [
141 '0', 'V'
142 ]
143 },
144
145 hooks: {
146 // hook for handling escape key
147 // Must return true to consume ESC, false otherwise.
148 escape: function () {
149 // Must return true to consume ESC, false otherwise.
150 return sts.stopDisplay();
151 },
152 mouseover: function (m) {
153 // m has id, class, and type properties
154 $log.debug('mouseover:', m);
155 sts.updateDisplay(m);
156 },
157 mouseout: function () {
158 $log.debug('mouseout');
159 sts.updateDisplay();
160 }
161 }
162 };
163
164 function openTraceInfoDialog() {
165 ds.openDialog(traceInfoDialogId, traceInfoDialogOpt)
166 .setTitle('Flow Trace Information')
167 .addContent(createTraceInfoDiv(traceSrc, traceDst))
168 .addOk(flowTraceResultBtn, 'Request')
169 .bindKeys();
170 }
171
172 function createTraceInfoDiv(src, dst) {
173 var texts = ds.createDiv('traceInfo');
174 texts.append('hr');
175 texts.append('table').append('tbody').append('tr');
176
177 var tBodySelection = texts.select('table').select('tbody').select('tr');
178
179 tBodySelection.append('td').text('Source IP:').attr("class", "label");
180 tBodySelection.append('td').text(src).attr("class", "value");
181
182 texts.select('table').select('tbody').append('tr');
183
184 tBodySelection = texts.select('table').select('tbody').select('tr:nth-child(2)');
185
186 tBodySelection.append('td').text('Destination IP:').attr("class", "label");
187 if (dst == src) {
188 tBodySelection.append('td').text('toGateway').attr("class", "value");
189 } else {
190 tBodySelection.append('td').text(dst).attr("class", "value");
191 }
192
Daniel Park577b69c2018-07-16 17:29:34 +0900193 texts.select('table').select('tbody').append('tr');
194 tBodySelection = texts.select('table').select('tbody').select('tr:nth-child(3)');
195 tBodySelection.append('td').text('SrcDeviceId').attr("class", "label");
196 tBodySelection.append('td').text(srcDeviceId).attr("class", "value");
197
198 texts.select('table').select('tbody').append('tr');
199 tBodySelection = texts.select('table').select('tbody').select('tr:nth-child(4)');
200 tBodySelection.append('td').text('DstDeviceId').attr("class", "label");
201 tBodySelection.append('td').text(dstDeviceId).attr("class", "value");
202
daniel park128c52c2017-09-04 13:15:51 +0900203 texts.append('hr');
204
205 return texts;
206
207 }
208
209 function flowTraceResultBtn() {
Daniel Park577b69c2018-07-16 17:29:34 +0900210 sts.sendFlowTraceRequest(traceSrc, traceDst, srcDeviceId, dstDeviceId);
daniel park128c52c2017-09-04 13:15:51 +0900211 ds.closeDialog();
212 traceSrc = null;
213 traceDst = null;
214 flash.flash('Send Flow Trace Request');
215 }
216
217 function buttonCallback(x) {
218 $log.debug('Toolbar-button callback', x);
219 }
220
221 // invoke code to register with the overlay service
222 angular.module('ovSonaTopov')
223 .run(['$log', 'TopoOverlayService', 'SonaTopovService',
224 'FlashService', 'DialogService', 'WebSocketService',
225
226 function (_$log_, _tov_, _sts_, _flash_, _ds_, _wss_) {
227 $log = _$log_;
228 tov = _tov_;
229 sts = _sts_;
230 flash = _flash_;
231 ds = _ds_;
232 wss = _wss_;
233 tov.register(overlay);
234 }]);
235
236}());