First pass for ovsdb-ui
[ovsdb.git] / ovsdb-ui / module / src / main / resources / ovsdb / ovsdb.controller.js
1 /*\r
2  * Copyright (c) 2015 Inocybe Technologies and others.  All rights reserved.\r
3  *\r
4  * This program and the accompanying materials are made available under the\r
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
6  * and is available at http://www.eclipse.org/legal/epl-v10.html\r
7  */\r
8 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
9   'use strict';\r
10 \r
11   var RootOvsdbCtrl = function ($rootScope, cssInjector) {\r
12     $rootScope['section_logo'] = 'logo_ovsdb';\r
13     cssInjector.add('src/app/ovsdb/css/select2.min.css');\r
14     cssInjector.add('src/app/ovsdb/css/toggle-switch.css');\r
15 \r
16     cssInjector.add('src/app/ovsdb/css/ovsdb.css');\r
17   };\r
18   RootOvsdbCtrl.$inject = ['$rootScope', 'cssInjector'];\r
19 \r
20   var BaseOvsdbCtrl = function ($scope) {\r
21     $scope.err = {\r
22       "message": "",\r
23       "tag": "",\r
24       "type": ""\r
25     };\r
26     $scope.showError = function () {\r
27       $('#errorMessage').fadeIn().delay(3000).fadeOut();\r
28     };\r
29   };\r
30   BaseOvsdbCtrl.$inject = ['$scope'];\r
31 \r
32   var OvsdbCtrl = function ($q, $scope, TopologySvc, NeutronSvc, OvsUtil) {\r
33     BaseOvsdbCtrl.call(this, $scope);\r
34     var lgraphDataDefer = $q.defer(),\r
35       physDataDefer = $q.defer(),\r
36       filterTenant = {\r
37         bridgeIds : [''],\r
38         ovsdbIds : ['']\r
39       },\r
40       filterSubnet = {\r
41         bridgeIds : [''],\r
42         ovsdbIds : ['']\r
43       };\r
44 \r
45     $scope.dataPromise = physDataDefer.promise;\r
46     $scope.lgraphIsReadyPromise = lgraphDataDefer.promise;\r
47     $scope.canvasWidth = $('#tabs').width();\r
48     $scope.canvasHeight = 580;\r
49 \r
50     $scope.dialogData = ['d'];\r
51 \r
52     $scope.tenants = [];\r
53     $scope.subnets = [];\r
54     $scope.selectedTenant = '';\r
55     $scope.selectedSubnet = '';\r
56 \r
57     $scope.toggleLayer = function () {\r
58       $scope.rotateGraph($scope.opt.layer);\r
59     };\r
60 \r
61     $scope.resizeGraph = function () {\r
62       var $row = $('#ovsdb_contain > div.row:first');\r
63       var h = $row.height();\r
64       $row.data('ph', h);\r
65       $row.fadeOut();\r
66       $('#nv_graph > svg').animate({\r
67         height: '+=' + h\r
68       });\r
69     };\r
70 \r
71     $scope.minimizeGraph = function () {\r
72       var $row = $('#ovsdb_contain > div.row:first');\r
73       var h = $row.data('ph');\r
74       $row.fadeIn();\r
75       $('#nv_graph > svg').animate({\r
76         height: '-=' + h\r
77       });\r
78     };\r
79 \r
80     function applyFilter(inverse) {\r
81       var bridgeIds = _.uniq(filterTenant.bridgeIds.concat(filterSubnet.bridgeIds));\r
82       var ovsdbIds = _.uniq(filterTenant.ovsdbIds.concat(filterSubnet.ovsdbIds));\r
83       $scope.filterNode(bridgeIds, '.bridge');\r
84       $scope.filterNode(ovsdbIds, '.switch');\r
85       $scope.filterLink();\r
86     }\r
87 \r
88     function removeFilter() {\r
89       $scope.filterNode([''], '.bridge', false);\r
90       $scope.filterNode([''], '.switch', false);\r
91       $scope.filterLink();\r
92     }\r
93 \r
94     $scope.fiterByTenant = function() {\r
95       if ($scope.selectedTenant) {\r
96         var tenant = $scope.selectedTenant;\r
97         OvsUtil.extractLogicalByTenant(tenant.id).then(function(result) {\r
98           var bridgeId = result[0],\r
99             ovsdbId = result[1];\r
100 \r
101           filterTenant.bridgeIds = _.uniq(filterTenant.bridgeIds.concat(bridgeId));\r
102           filterTenant.ovsdbIds = _.uniq(filterTenant.ovsdbIds.concat(ovsdbId));\r
103           applyFilter();\r
104         });\r
105       } else {\r
106         filterTenant.bridgeIds = [''];\r
107         filterTenant.ovsdbIds = [''];\r
108         applyFilter();\r
109       }\r
110     };\r
111 \r
112     $scope.filterBySubnet = function() {\r
113       if (!_.isEmpty($scope.selectedSubnet)) {\r
114         var subnets = _.map($scope.selectedSubnet, function(d) {\r
115           return d.id;\r
116         });\r
117         OvsUtil.extractLogicalBySubnet(subnets).then(function(result) {\r
118           var bridgeId = result[0],\r
119             ovsdbId = result[1];\r
120             filterSubnet.bridgeIds = _.uniq(filterSubnet.bridgeIds.concat(bridgeId));\r
121             filterSubnet.ovsdbIds = _.uniq(filterSubnet.ovsdbIds.concat(ovsdbId));\r
122             applyFilter();\r
123         });\r
124       } else {\r
125         filterSubnet.bridgeIds = [''];\r
126         filterSubnet.ovsdbIds = [''];\r
127         applyFilter();\r
128       }\r
129     };\r
130 \r
131     $scope.onNodeClick = function (d, nodes, links) {\r
132       $scope.pDialogData = d.node.pretty();\r
133       $scope.$apply();\r
134     };\r
135 \r
136     $('#tenantSelect').select2({\r
137       width: "200",\r
138       minimumResultsForSearch: Infinity\r
139     }).next().children('span').children('span').css('width', '200'); //hack to have the arrow with the same background\r
140 \r
141     $("#tagPicker").select2({\r
142       width: "230",\r
143     });\r
144 \r
145     var $tabs = $('#tabs').tabs({selected: 0});\r
146 \r
147     $scope.goToPhysicalView = function(d) {\r
148       $tabs.tabs("option", "active", 1);\r
149       $('#tenantSelect').val(d.tenantId).change();\r
150 \r
151       if ( d instanceof OvsCore.Neutron.Network) {\r
152         $('#tagPicker').val(d.subnets.map(function(d){return d.id;})).change();\r
153       }\r
154     };\r
155 \r
156     OvsUtil.getLogicalTopology().then(function(networks) {\r
157       var tenantList = NeutronSvc.getAllTenants();\r
158       _.each(tenantList, function(t) {\r
159         $scope.tenants.push({id : t, name: t});\r
160       });\r
161       NeutronSvc.getSubNets().then(function(subHash) {\r
162         $scope.subnets = _.values(subHash).map(function(n) { return n[0]; });\r
163       });\r
164 \r
165       lgraphDataDefer.resolve(networks);\r
166     });\r
167 \r
168     TopologySvc.getTopologies().then(function(d) {\r
169       physDataDefer.resolve(d);\r
170     });\r
171 \r
172   };\r
173 \r
174   OvsdbCtrl.$inject = ['$q', '$scope', 'TopologySvc', 'NeutronSvc', 'OvsUtil'];\r
175   OvsdbCtrl.prototype = Object.create(BaseOvsdbCtrl.prototype);\r
176 \r
177   ovsdb.register.controller('RootOvsdbCtrl', RootOvsdbCtrl);\r
178   ovsdb.register.controller('OvsdbCtrl', OvsdbCtrl);\r
179 });\r