blob: a2375baffc48f36c3f3788c2043c39fa585286e9 [file] [log] [blame]
/*
* Copyright 2015-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.
*/
/*
ONOS GUI -- Intent View Module
*/
(function () {
'use strict';
var dialogId = 'remove-intent-dialog',
dialogOpts = {
edge: 'right'
},
dropdown;
angular.module('ovIntent', [])
.controller('OvIntentCtrl',
['$log', '$scope', 'TableBuilderService', 'NavService',
'TopoOverlayService', 'TopoTrafficService', 'DialogService',
function ($log, $scope, tbs, ns, tov, tts, ds) {
$scope.briefTip = 'Switch to brief view';
$scope.detailTip = 'Switch to detailed view';
$scope.brief = true;
$scope.intentState = 'NA';
$scope.fired = false;
$scope.showOverlays = false;
dropdown = d3.select('div.show-intent-btn .dropdown');
function selCb($event, row) {
$log.debug('Got a click on:', row);
var m = /(\d+)\s:\s(.*)/.exec(row.appId),
id = m ? m[1] : null,
name = m ? m[2] : null;
$scope.intentData = ($scope.selId && m) ? {
appId: id,
appName: name,
key: row.key
} : null;
$scope.intentState = row.state;
showDropdown(false);
}
function respCb() {
if ($scope.fired) {
if ($scope.changedData) {
$scope.intentState = $scope.changedData.state;
}
$scope.fired = false;
}
}
tbs.buildTable({
scope: $scope,
tag: 'intent',
selCb: selCb,
respCb: respCb,
idKey: 'key'
});
$scope.topoTip = 'Show selected intent on topology view';
$scope.resubmitTip = 'Resubmit selected intent';
$scope.deactivateTip = 'Remove selected intent';
$scope.purgeTip = 'Purge selected intent';
$scope.purgeAllTip = 'Purge withdrawn intents';
function showDropdown(b) {
dropdown.style('display', b ? 'block' : 'none');
}
$scope.showIntent = function () {
var d = $scope.intentData,
tovData,
ncb;
if (!d) {
// no intent selected - nothing to do
return;
}
function setOvAndNavigate(info) {
d.overlayId = info.id;
ns.navTo('topo', d);
}
function clickMe(data) {
showDropdown(false);
setOvAndNavigate(data);
}
function setUpSelection(tovData) {
dropdown.text(null);
tovData.forEach(function (data) {
var div = dropdown.append('div');
div.classed('overlay-choice', true);
div.text(data.tt);
div.on('click', function () {
clickMe(data);
});
});
showDropdown(true);
}
tovData = tov.listOverlaysThatShowIntents();
ncb = tovData.length;
// NOTE: ncb should be at least 1, (traffic overlay)
if (ncb === 1) {
setOvAndNavigate(tovData[0]);
} else if (ncb > 1) {
// let the user choose which overlay to invoke...
setUpSelection(tovData);
} else {
$log.error('Internal Error - no overlay configured',
'to show selected intent on topology view');
}
};
// TODO: clean up the following code...
$scope.isIntentInstalled = function () {
return $scope.intentState === 'Installed';
};
$scope.isIntentWithdrawn = function () {
return $scope.intentState === 'Withdrawn';
};
$scope.isHavingWithdrawn = function () {
var isWithdrawn = false;
$scope.tableData.forEach(function (intent) {
if (intent.state ==='Withdrawn') {
isWithdrawn = true;
}
});
return isWithdrawn;
};
function executeAction(action) {
var content = ds.createDiv(),
txt,
bPurge = action === 'purge';
$scope.intentData.intentPurge = bPurge;
content.append('p').
text('Are you sure you want to '+ action +
' the selected intent?');
function dOk() {
var d = $scope.intentData;
$log.debug(d);
d && (action === 'resubmit' ? tts.resubmitIntent(d) :
tts.removeIntent(d));
$scope.fired = true;
}
function dCancel() {
ds.closeDialog();
$log.debug('Canceling remove-intent action');
}
ds.openDialog(dialogId, dialogOpts)
.setTitle('Confirm Action')
.addContent(content)
.addOk(dOk)
.addCancel(dCancel)
.bindKeys();
}
function executeActions(action) {
var content = ds.createDiv(),
txt='purgeIntents';
content.append('p').
text('Are you sure you want to purge all the withdrawn intents?');
function dOk() {
tts.removeIntents();
$scope.fired = true;
}
function dCancel() {
ds.closeDialog();
$log.debug('Canceling remove-intents action');
}
ds.openDialog(dialogId, dialogOpts)
.setTitle('Confirm Action')
.addContent(content)
.addOk(dOk)
.addCancel(dCancel)
.bindKeys();
}
$scope.deactivateIntent = function () {
executeAction("withdraw");
};
$scope.resubmitIntent = function () {
executeAction("resubmit");
};
$scope.purgeIntent = function () {
executeAction("purge");
};
$scope.briefToggle = function () {
$scope.brief = !$scope.brief;
};
$scope.$on('$destroy', function () {
ds.closeDialog();
$log.debug('OvIntentCtrl has been destroyed');
});
$scope.purgeIntents = function () {
executeActions("purgeIntents");
};
$log.debug('OvIntentCtrl has been created');
}]);
}());