| /* |
| * 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. |
| */ |
| |
| /* |
| OpenStack Networking UI Service |
| |
| Provides a mechanism to highlight hosts, devices and links according to |
| a virtual network. Also provides trace functionality to prove that |
| flow rules for the specific vm are installed appropriately. |
| */ |
| |
| (function () { |
| 'use strict'; |
| |
| // injected refs |
| var $log, fs, flash, wss, ds; |
| |
| // constants |
| var displayStart = 'openstackNetworkingUiStart', |
| displayUpdate = 'openstackNetworkingUiUpdate', |
| displayStop = 'openstackNetworkingUiStop', |
| flowStatsAddRequest = 'flowStatsAddRequest', |
| flowStatsRemoveRequest = 'flowStatsRemoveRequest', |
| flowTraceRequest = 'flowTraceRequest'; |
| |
| // internal state |
| var currentMode = null; |
| |
| // === --------------------------- |
| // === Helper functions |
| |
| function sendDisplayStart(mode) { |
| wss.sendEvent(displayStart, { |
| mode: mode |
| }); |
| } |
| |
| function sendDisplayUpdate(what) { |
| wss.sendEvent(displayUpdate, { |
| id: what ? what.id : '' |
| }); |
| } |
| |
| function sendDisplayStop() { |
| wss.sendEvent(displayStop); |
| } |
| |
| function sendFlowStatsAddRequest(src, dst) { |
| wss.sendEvent(flowStatsAddRequest, { |
| srcIp: src, |
| dstIp: dst, |
| }); |
| $log.info('FlowStatsAdd request message is sent.'); |
| flash.flash('sendFlowStatsAddRequest called'); |
| } |
| |
| function sendFlowStatsRemoveRequest(src, dst) { |
| wss.sendEvent(flowStatsRemoveRequest, { |
| srcIp: src, |
| dstIp: dst, |
| }); |
| $log.info('FlowStatsRemove request message is sent.'); |
| flash.flash('sendFlowStatsRemoveRequest called'); |
| } |
| |
| function sendFlowTraceRequest(src, dst, srcDeviceId, dstDeviceId) { |
| wss.sendEvent(flowTraceRequest, { |
| srcIp: src, |
| dstIp: dst, |
| srcDeviceId: srcDeviceId, |
| dstDeviceId: dstDeviceId, |
| }); |
| flash.flash('sendFlowTraceRequest called'); |
| } |
| |
| // === --------------------------- |
| // === Main API functions |
| |
| function startDisplay(mode) { |
| if (currentMode === mode) { |
| $log.debug('(in mode', mode, 'already)'); |
| } else { |
| currentMode = mode; |
| sendDisplayStart(mode); |
| |
| flash.flash('Starting Openstack Networking UI mode'); |
| } |
| } |
| |
| function updateDisplay(m) { |
| if (currentMode) { |
| sendDisplayUpdate(m); |
| } |
| } |
| |
| function stopDisplay() { |
| if (currentMode) { |
| currentMode = null; |
| sendDisplayStop(); |
| flash.flash('Canceling Openstack Networking UI Overlay mode'); |
| return true; |
| } |
| return false; |
| } |
| |
| function dOk() { |
| ds.closeDialog(); |
| } |
| |
| function openFlowStatsAddResultDialog(data) { |
| $log.info('Addition Result message: ', data); |
| var flowStatsAddResultDialogId = 'flowStatsAddResultDialogId', |
| flowStatsAddResultDialogOpt = { |
| width: 650, |
| edge: 'left', |
| margin: 20, |
| hideMargin: -20 |
| } |
| var statsSuccess = data.statsSuccess == true ? "SUCCESS" : "FALSE"; |
| ds.openDialog(flowStatsAddResultDialogId, flowStatsAddResultDialogOpt) |
| .setTitle('Flow Stats Addition Result: ' + statsSuccess) |
| .addContent(createStatsAddResultInfoDiv(data)) |
| .addOk(dOk, 'Close') |
| .bindKeys(); |
| } |
| |
| function createStatsAddResultInfoDiv(data) { |
| var texts = ds.createDiv('flowStatsAddResult'); |
| texts.append('p').text('Result of addition: ' + data.statsSuccess); |
| return texts; |
| } |
| |
| function openFlowStatsRemoveResultDialog(data) { |
| $log.info('Removal Result message: ', data); |
| var flowStatsRemoveResultDialogId = 'flowStatsRemoveResultDialogId', |
| flowStatsRemoveResultDialogOpt = { |
| width: 650, |
| edge: 'left', |
| margin: 20, |
| hideMargin: -20 |
| } |
| var statsSuccess = data.statsSuccess == true ? "SUCCESS" : "FALSE"; |
| ds.openDialog(flowStatsRemoveResultDialogId, flowStatsRemoveResultDialogOpt) |
| .setTitle('Flow Stats Removal Result: ' + statsSuccess) |
| .addContent(createStatsRemoveResultInfoDiv(data)) |
| .addOk(dOk, 'Close') |
| .bindKeys(); |
| } |
| |
| function createStatsRemoveResultInfoDiv(data) { |
| var texts = ds.createDiv('flowStatsRemoveResult'); |
| texts.append('p').text('Result of removal: ' + data.statsSuccess); |
| return texts; |
| } |
| |
| function openFlowTraceResultDialog(data) { |
| var flowTraceResultDialogId = 'flowTraceResultDialogId', |
| flowTraceResultDialogOpt = { |
| width: 650, |
| edge: 'left', |
| margin: 20, |
| hideMargin: -20 |
| } |
| var traceSuccess = data.traceSuccess == true ? "SUCCESS" : "FALSE"; |
| ds.openDialog(flowTraceResultDialogId, flowTraceResultDialogOpt) |
| .setTitle('Flow Trace Result: ' + traceSuccess) |
| .addContent(createTraceResultInfoDiv(data)) |
| .addOk(dOk, 'Close') |
| .bindKeys(); |
| } |
| |
| function createTraceResultInfoDiv(data) { |
| var texts = ds.createDiv('flowTraceResult'); |
| |
| texts.append('div').attr("class", "table-header"); |
| texts.append('div').attr("class", "table-body"); |
| |
| texts.select('.table-header').append('table').append('tbody').append('tr'); |
| texts.select('.table-body').append('table').append('tbody'); |
| |
| |
| var theaderSelection = texts.select('.table-header') |
| .select('table').select('tbody').select('tr'); |
| |
| theaderSelection.append('td').text('Node'); |
| theaderSelection.append('td').text('Table Id'); |
| theaderSelection.append('td').text('Priority'); |
| theaderSelection.append('td').text('Selector'); |
| theaderSelection.append('td').text('Action'); |
| |
| var tbodySelection = texts.select('.table-body').select('table').select('tbody'); |
| var rowNum = 1; |
| |
| data.traceResult.forEach(function(result) { |
| result.flowRules.forEach(function(flowRule) { |
| tbodySelection.append('tr'); |
| var tbodyTrSelection = tbodySelection.select('tr:nth-child(' + rowNum + ')'); |
| tbodyTrSelection.append('td').text(result.traceNodeName); |
| tbodyTrSelection.append('td').text(flowRule.table); |
| tbodyTrSelection.append('td').text(flowRule.priority); |
| tbodyTrSelection.append('td').text(flowRule.selector); |
| tbodyTrSelection.append('td').text(flowRule.actions); |
| if (jsonToSring(flowRule.actions).includes("drop")) { |
| tbodyTrSelection.attr("class", "drop"); |
| } |
| rowNum++; |
| }); |
| |
| }); |
| |
| return texts; |
| } |
| |
| function jsonToSring(jsonData) { |
| var result = []; |
| for (var key in jsonData) { |
| result.push(key + ':' + jsonData[key]); |
| } |
| |
| return result.join('/'); |
| |
| } |
| |
| function flowStatsAddResult(data) { |
| flash.flash('flowStatsAddResult called'); |
| $log.debug(data); |
| |
| openFlowStatsAddResultDialog(data) |
| } |
| |
| function flowStatsRemoveResult(data) { |
| flash.flash('flowStatsRemoveResult called'); |
| $log.debug(data); |
| |
| openFlowStatsRemoveResultDialog(data) |
| } |
| |
| |
| function flowTraceResult(data) { |
| flash.flash('flowTraceResult called'); |
| $log.debug(data); |
| |
| openFlowTraceResultDialog(data) |
| } |
| |
| // === --------------------------- |
| // === Module Factory Definition |
| |
| angular.module('ovSonaTopov', []) |
| .factory('SonaTopovService', |
| ['$log', 'FnService', 'FlashService', 'WebSocketService', 'DialogService', |
| |
| function (_$log_, _fs_, _flash_, _wss_, _ds_) { |
| $log = _$log_; |
| fs = _fs_; |
| flash = _flash_; |
| wss = _wss_; |
| ds = _ds_; |
| |
| return { |
| startDisplay: startDisplay, |
| updateDisplay: updateDisplay, |
| stopDisplay: stopDisplay, |
| flowStatsAddResult: flowStatsAddResult, |
| flowStatsRemoveResult: flowStatsRemoveResult, |
| sendFlowStatsAddRequest: sendFlowStatsAddRequest, |
| sendFlowStatsRemoveRequest: sendFlowStatsRemoveRequest, |
| flowTraceResult: flowTraceResult, |
| sendFlowTraceRequest: sendFlowTraceRequest, |
| }; |
| }]); |
| }()); |