blob: 9b20eb043530639b3a404fe7ca8c007e52f8de49 [file] [log] [blame]
/*
* Copyright 2018-present Open Networking Foundation
*
* 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 -- Openstack Vtap View Module
*/
(function () {
'use strict';
// injected refs
var $log, tov, ovts, fs, wss, tts, api, gs, ps, ds;
// constants
var pCls = 'topo-p',
idVta = 'topo-p-vtap',
idVDi = 'vtap-dialog',
vtapPanelOpts = {
edge: 'left',
width: 330, // vtap panel width
}
// panels
var vtap;
// selected info
var selectedItem;
// constants
var osvIsActReq = 'openstackVtapIsActivatedRequest',
osvIsActResp = 'openstackVtapIsActivatedResponse',
osvCreateReq = 'openstackVtapCreateRequest',
osvCreateResp = 'openstackVtapCreateResponse';
// function to be replaced by the localization bundle function
var topoLion = function (x) {
return '#ttrafov#' + x + '#';
};
var overlay = {
overlayId: 'vtap-overlay',
glyphId: 'm_details',
tooltip: 'Openstack Vtap Overlay',
activate: function () {
$log.debug("Openstack Vtap topology overlay ACTIVATED");
},
deactivate: function () {
destroyVtapPanel();
$log.debug("Openstack Vtap topology overlay DEACTIVATED");
},
// detail panel button definitions
buttons: {
createHostVtapBtn: {
gid: 'm_details',
tt: 'Create Host-to-Host Vtap',
cb: displayVtap
},
showRelatedTraffic: {
gid: 'm_relatedIntents',
tt: function () { return topoLion('tr_btn_show_related_traffic'); },
cb: function (data) { tts.showRelatedIntents(); },
},
},
hooks: {
multi: function (selectOrder) {
var selectedHost = new Object();
for (var index in selectOrder) {
if (index == 0) {
selectedHost.src = selectOrder[index];
} else if (index == 1) {
selectedHost.dst = selectOrder[index];
}
}
selectedItem = selectedHost;
tov.addDetailButton('showRelatedTraffic');
if(selectOrder.length == 2) {
tov.addDetailButton('createHostVtapBtn');
}
}
}
};
// Panel API
function createTopoPanel(id, opts) {
var p = ps.createPanel(id, opts),
pid = id,
header, body, footer;
p.classed(pCls, true);
function panel() {
return p;
}
function hAppend(x) {
return header.append(x);
}
function bAppend(x) {
return body.append(x);
}
function fAppend(x) {
return footer.append(x);
}
function setup() {
p.empty();
p.append('div').classed('header', true);
p.append('div').classed('body', true);
p.append('div').classed('footer', true);
header = p.el().select('.header');
body = p.el().select('.body');
footer = p.el().select('.footer');
}
function destroy() {
ps.destroyPanel(pid);
}
return {
panel: panel,
setup: setup,
destroy: destroy,
appendHeader: hAppend,
appendBody: bAppend,
appendFooter: fAppend,
};
}
function hideVtapPanel() {
vtap.panel().hide();
}
function destroyVtapPanel() {
if(vtap != null) {
vtap.destroy();
}
vtap = null;
}
function addInput(tbody, type, id, label, value) {
var tr = tbody.append('tr'),
lab;
if (typeof label === 'string') {
lab = label.replace(/_/g, ' ');
} else {
lab = label;
}
tr.append('td').attr('class', 'label').text(lab + ' :');
if (type == 'radio') {
var td = tr.append('td');
for(var index in value) {
if(index == 0) {
td.append('input').classed( type + '-input', true)
.attr('type', type)
.attr('value', value[index])
.attr('name', label)
.attr('id', id)
.attr('checked', 'true');
} else {
td.append('input').classed( type + '-input', true)
.attr('type', type)
.attr('name', label)
.attr('id', id)
.attr('value', value[index]);
}
td.append('span').text(value[index]);
}
} else {
tr.append('td').append('input').classed(type + '-input', true).attr('type', type)
.attr('id', id).attr('value', value);
}
}
function addButton(tr, callback, value) {
tr.append('td').append('input').classed('button-input', true).attr('type', 'button')
.attr('value', value).on('click', callback);
}
function makeButton(callback, text, keyName) {
var cb = fs.isF(callback),
key = fs.isS(keyName);
function invoke() {
cb && cb();
}
return createDiv('vtap-button')
.text(text)
.on('click', invoke);
}
function createDiv(cls) {
var div = d3.select(document.createElement('div'));
if (cls) {
div.classed(cls, true);
}
return div;
}
function addInput(tbody, type, id, label, value) {
var tr = tbody.append('tr'),
lab;
if (typeof label === 'string') {
lab = label.replace(/_/g, ' ');
} else {
lab = label;
}
tr.append('td').attr('class', 'label').text(lab + ' :');
if (type == 'radio') {
var td = tr.append('td');
for(var index in value) {
if(index == 0) {
td.append('input').classed( type + '-input', true)
.attr('type', type)
.attr('value', value[index])
.attr('name', label)
.attr('id', id)
.attr('checked', 'true');
} else {
td.append('input').classed( type + '-input', true)
.attr('type', type)
.attr('name', label)
.attr('id', id)
.attr('value', value[index]);
}
td.append('span').text(value[index]);
}
} else {
tr.append('td').append('input').classed(type + '-input', true).attr('type', type)
.attr('id', id).attr('value', value);
}
}
function addButton(tr, callback, value) {
tr.append('td').append('input').classed('button-input', true).attr('type', 'button')
.attr('value', value).on('click', callback);
}
function makeButton(callback, text, keyName) {
var cb = fs.isF(callback),
key = fs.isS(keyName);
function invoke() {
cb && cb();
}
return createDiv('vtap-button')
.text(text)
.on('click', invoke);
}
function createDiv(cls) {
var div = d3.select(document.createElement('div'));
if (cls) {
div.classed(cls, true);
}
return div;
}
function displayVtap() {
$log.debug("sendEvent openstackVtapIsActivatedRequest: ", selectedItem);
wss.sendEvent(osvIsActReq, selectedItem);
}
function respIsActCb(selected) {
$log.debug("openstackVtapIsActivatedResponse: ", selected);
if(vtap == null) {
vtap = createTopoPanel(idVta, vtapPanelOpts);
}
vtap.setup();
var svg = vtap.appendHeader('div')
.classed('icon', true)
.append('svg'),
title = vtap.appendHeader('h2'),
table = vtap.appendBody('table'),
tbody = table.append('tbody'),
glyphId = 'm_details';
gs.addGlyph(svg, glyphId, 30, 0, [1, 1]);
title.text('Create OpenstackVtap');
addInput(tbody, 'text', 'srcIp', 'Source IP', selected.srcName);
addInput(tbody, 'text', 'dstIp', 'Destination IP', selected.dstName);
addInput(tbody, 'radio', 'ipProto', 'Protocol', selected.ipProtoList);
addInput(tbody, 'number', 'srcPort', 'Source Port', "");
addInput(tbody, 'number', 'dstPort', 'Destination Port', "");
addInput(tbody, 'radio', 'vtapType', 'Type', selected.vtapTypeList);
vtap.appendFooter('hr');
var footTr = vtap.appendFooter('table').append('tbody').append('tr');
addButton(footTr, createVtap, 'Create');
addButton(footTr, hideVtapPanel, 'Cancel');
vtap.panel().show();
}
function createVtap() {
var vtapInfo = {};
vtapInfo.srcIp = document.getElementById('srcIp').value;
vtapInfo.dstIp = document.getElementById('dstIp').value;
vtapInfo.ipProto = document.querySelector('input[name="Protocol"]:checked').value;
vtapInfo.srcPort = document.getElementById('srcPort').value;
vtapInfo.dstPort = document.getElementById('dstPort').value;
vtapInfo.vtapType = document.querySelector('input[name="Type"]:checked').value;
if(vtapInfo.srcPort == ""){
vtapInfo.srcPort = 0;
}
if(vtapInfo.dstPort == ""){
vtapInfo.dstPort = 0;
}
$log.debug("sendEvent openstackVtapCreateRequest: ", vtapInfo);
wss.sendEvent(osvCreateReq, vtapInfo);
hideVtapPanel();
}
function respCreateCb(result) {
$log.debug("respCreateCb: ", result);
function dOK() {
if(result.result == "Failed"){
displayVtap(selectedItem);
} else {
destroyVtapPanel();
}
}
function createContent(value) {
var content = ds.createDiv();
content.append('p').text(value);
return content;
}
ds.openDialog(idVDi, vtapPanelOpts)
.setTitle("Create Vtap " + result.result)
.addContent(createContent(result.value))
.addOk(dOK);
}
// invoke code to register with the overlay service
angular.module('ovOpenstackvtap', [])
.factory('OpenstackVtapTopovService',
['$log', 'FnService', 'WebSocketService', 'GlyphService', 'PanelService', 'DialogService',
function (_$log_, _fs_, _wss_, _gs_, _ps_, _ds_) {
$log = _$log_;
fs = _fs_;
wss = _wss_;
gs = _gs_;
ps = _ps_;
ds = _ds_;
var handlers = {},
vtapOverlay = 'vtap-overlay',
defaultOverlay = 'traffic';
handlers[osvIsActResp] = respIsActCb;
handlers[osvCreateResp] = respCreateCb;
wss.bindHandlers(handlers);
return {
displayVtap: displayVtap
};
}])
.run(['$log', 'TopoOverlayService', 'OpenstackVtapTopovService', 'TopoTrafficService',
function (_$log_, _tov_, _ovts_, _tts_) {
$log = _$log_;
tov = _tov_;
ovts = _ovts_;
tts = _tts_;
tov.register(overlay);
}]
);
}());