* terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
* and is available at http://www.eclipse.org/legal/epl-v10.html\r
*/\r
-\r
-define(['jquery', 'app/ovsdb/ovsdb.module','app/ovsdb/ovsdb.services'], function($, ovsdb) {\r
+define(['jquery', 'underscore', 'app/ovsdb/ovsdb.module', 'app/ovsdb/OvsCore', 'app/ovsdb/ovsdb.directives', 'app/ovsdb/ovsdb.services', 'app/ovsdb/lib/select2.full.min'], function ($, _, ovsdb, OvsCore) {\r
'use strict';\r
\r
- var RootOvsdbCtrl = function($rootScope) {\r
- $rootScope['section_logo'] = 'logo_ovsdb';\r
- };\r
- RootOvsdbCtrl.$inject = ['$rootScope'];\r
+ var RootOvsdbCtrl = function ($rootScope, cssInjector) {\r
+ // transparent 1px gif picture\r
+ $rootScope['section_logo'] = 'data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=';\r
\r
- var BaseOvsdbCtrl = function($scope) {\r
- $scope['err'] = {\r
- "message": "",\r
- "tag": "",\r
- "type": ""\r
- };\r
+ cssInjector.add('src/app/ovsdb/css/select2.min.css');\r
+ cssInjector.add('src/app/ovsdb/css/toggle-switch.css');\r
\r
- $scope.showError = function() {\r
- $('#errorMessage').fadeIn().delay(3000).fadeOut();\r
- };\r
+ cssInjector.add('src/app/ovsdb/css/ovsdb.css');\r
+ };\r
+ RootOvsdbCtrl.$inject = ['$rootScope', 'cssInjector'];\r
+\r
+ var BaseOvsdbCtrl = function ($scope) {\r
+ $scope.err = {\r
+ "message": "",\r
+ "tag": "",\r
+ "type": ""\r
+ };\r
+ $scope.showError = function () {\r
+ $('#errorMessage').fadeIn().delay(3000).fadeOut();\r
+ };\r
};\r
BaseOvsdbCtrl.$inject = ['$scope'];\r
\r
- var OvsdbCtrl = function($scope, TopologyNetworkSvc) {\r
- BaseOvsdbCtrl.call(this, $scope);\r
+ var OvsdbCtrl = function ($q, $scope, TopologySvc, NeutronSvc, OvsUtil) {\r
+ BaseOvsdbCtrl.call(this, $scope);\r
+ var lgraphDataDefer = $q.defer(),\r
+ physDataDefer = $q.defer(),\r
+ filterTenant = {\r
+ bridgeIds : [''],\r
+ ovsdbIds : ['']\r
+ },\r
+ filterSubnet = {\r
+ bridgeIds : [''],\r
+ ovsdbIds : ['']\r
+ };\r
+\r
+ $scope.dataPromise = physDataDefer.promise;\r
+ $scope.lgraphIsReadyPromise = lgraphDataDefer.promise;\r
+ $scope.canvasWidth = $('#tabs').width();\r
+ $scope.canvasHeight = 580;\r
+\r
+ $scope.dialogData = ['d'];\r
+\r
+ $scope.tenants = [];\r
+ $scope.subnets = [];\r
+ $scope.selectedTenant = '';\r
+ $scope.selectedSubnet = '';\r
+\r
+ $scope.toggleLayer = function () {\r
+ $scope.rotateGraph($scope.opt.layer);\r
+ };\r
+\r
+ $scope.resizeGraph = function () {\r
+ var $row = $('#ovsdb_contain > div.row:first');\r
+ var h = $row.height();\r
+ $row.data('ph', h);\r
+ $row.fadeOut();\r
+ $('#nv_graph > svg').animate({\r
+ height: '+=' + h\r
+ });\r
+ };\r
+\r
+ $scope.minimizeGraph = function () {\r
+ var $row = $('#ovsdb_contain > div.row:first');\r
+ var h = $row.data('ph');\r
+ $row.fadeIn();\r
+ $('#nv_graph > svg').animate({\r
+ height: '-=' + h\r
+ });\r
+ };\r
+\r
+ function applyFilter(inverse) {\r
+ var bridgeIds = _.uniq(filterTenant.bridgeIds.concat(filterSubnet.bridgeIds));\r
+ var ovsdbIds = _.uniq(filterTenant.ovsdbIds.concat(filterSubnet.ovsdbIds));\r
+ $scope.filterNode(bridgeIds, '.bridge');\r
+ $scope.filterNode(ovsdbIds, '.switch');\r
+ $scope.filterLink();\r
+ }\r
+\r
+ function removeFilter() {\r
+ $scope.filterNode([''], '.bridge', false);\r
+ $scope.filterNode([''], '.switch', false);\r
+ $scope.filterLink();\r
+ }\r
+\r
+ $scope.fiterByTenant = function() {\r
+ if ($scope.selectedTenant) {\r
+ var tenant = $scope.selectedTenant;\r
+ OvsUtil.extractLogicalByTenant(tenant.id).then(function(result) {\r
+ var bridgeId = result[0],\r
+ ovsdbId = result[1];\r
+\r
+ filterTenant.bridgeIds = _.uniq(filterTenant.bridgeIds.concat(bridgeId));\r
+ filterTenant.ovsdbIds = _.uniq(filterTenant.ovsdbIds.concat(ovsdbId));\r
+ applyFilter();\r
+ });\r
+ } else {\r
+ filterTenant.bridgeIds = [''];\r
+ filterTenant.ovsdbIds = [''];\r
+ applyFilter();\r
+ }\r
+ };\r
+\r
+ $scope.filterBySubnet = function() {\r
+ if (!_.isEmpty($scope.selectedSubnet)) {\r
+ var subnets = _.map($scope.selectedSubnet, function(d) {\r
+ return d.id;\r
+ });\r
+ OvsUtil.extractLogicalBySubnet(subnets).then(function(result) {\r
+ var bridgeId = result[0],\r
+ ovsdbId = result[1];\r
+ filterSubnet.bridgeIds = _.uniq(filterSubnet.bridgeIds.concat(bridgeId));\r
+ filterSubnet.ovsdbIds = _.uniq(filterSubnet.ovsdbIds.concat(ovsdbId));\r
+ applyFilter();\r
+ });\r
+ } else {\r
+ filterSubnet.bridgeIds = [''];\r
+ filterSubnet.ovsdbIds = [''];\r
+ applyFilter();\r
+ }\r
+ };\r
+\r
+ $scope.onNodeClick = function (d, nodes, links) {\r
+ $scope.pDialogData = d.node.pretty();\r
+ $scope.$apply();\r
+ };\r
+\r
+ $('#tenantSelect').select2({\r
+ width: "200",\r
+ minimumResultsForSearch: Infinity\r
+ }).next().children('span').children('span').css('width', '200'); //hack to have the arrow with the same background\r
+\r
+ $("#tagPicker").select2({\r
+ width: "230",\r
+ });\r
+\r
+ var $tabs = $('#tabs').tabs({selected: 0});\r
+\r
+ $scope.goToPhysicalView = function(d) {\r
+ $tabs.tabs("option", "active", 1);\r
+ $('#tenantSelect').val(d.tenantId).change();\r
+\r
+ if ( d instanceof OvsCore.Neutron.Network) {\r
+ $('#tagPicker').val(d.subnets.map(function(d){return d.id;})).change();\r
+ }\r
+ };\r
+\r
+ OvsUtil.getLogicalTopology().then(function(networks) {\r
+ var tenantList = NeutronSvc.getAllTenants();\r
+ _.each(tenantList, function(t) {\r
+ $scope.tenants.push({id : t, name: t});\r
+ });\r
+ NeutronSvc.getSubNets().then(function(subHash) {\r
+ $scope.subnets = _.values(subHash).map(function(n) { return n[0]; });\r
+ });\r
+\r
+ lgraphDataDefer.resolve(networks);\r
+ });\r
+\r
+ TopologySvc.getTopologies().then(function(d) {\r
+ physDataDefer.resolve(d);\r
+ });\r
\r
};\r
- OvsdbCtrl.$inject = ['$scope', 'TopologyNetworkSvc'];\r
+\r
+ OvsdbCtrl.$inject = ['$q', '$scope', 'TopologySvc', 'NeutronSvc', 'OvsUtil'];\r
OvsdbCtrl.prototype = Object.create(BaseOvsdbCtrl.prototype);\r
\r
ovsdb.register.controller('RootOvsdbCtrl', RootOvsdbCtrl);\r