1f3ab7314d34dd2a612c9c3c0370c2c662436cfd
[dlux.git] / src / app / yangui / yangui.js
1 /*\r
2  * Copyright (c) 2014 Cisco Systems, Inc. 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 \r
9 \r
10 angular.module('console.yangui', ['common.yangUtils'])\r
11 \r
12     \r
13 \r
14 .config(function ($stateProvider) {\r
15     var access = routingConfig.accessLevels;\r
16     $stateProvider.state('yangui', {\r
17         url: '/yangui',\r
18         abstract: true,\r
19         templateUrl: 'yangui/root.tpl.html'\r
20     });\r
21 \r
22     $stateProvider.state('yangui.index', {\r
23         url: '/index',\r
24         access: access.admin,\r
25         views: {\r
26             '': {\r
27                 controller: 'yanguiCtrl',\r
28                 templateUrl: 'yangui/index.tpl.html'\r
29             }\r
30         }\r
31     });\r
32 })\r
33 \r
34 .controller('yanguiCtrl', ['$scope', '$http', '$timeout', 'Restangular', 'yangUtils', function ($scope, $http, $timeout, Restangular, yangUtils) {\r
35     $scope.currentPath = './assets/views/yangui';\r
36     $scope.host = '127.0.0.1';\r
37     $scope.port = '9999';\r
38     $scope.status = {\r
39         type: 'noreq',\r
40         msg: null\r
41     };\r
42 \r
43     var requestWorkingCallback = function() {\r
44         $scope.status = {\r
45             isWorking: true,\r
46             type: 'warning',\r
47             msg: 'SEND_OPER_WAIT'\r
48         };\r
49     };\r
50 \r
51     var requestOperErrorCallback = function() {\r
52         $scope.status = {\r
53             type: 'danger',\r
54             msg: 'SEND_OPER_ERROR'\r
55         };\r
56     };\r
57 \r
58     var requestSuccessCallback = function() {\r
59         $scope.status = {\r
60             type: 'success',\r
61             msg: 'SEND_SUCCESS'\r
62         };\r
63     };\r
64 \r
65     var requestErrorCallback = function() {\r
66         $scope.status = {\r
67             type: 'danger',\r
68             msg: 'SEND_ERROR'\r
69         };\r
70     };\r
71 \r
72     var loadModules = function() {\r
73         $scope.nodeModules = [];\r
74         Restangular.all('modules').getList().then(function(modulesRawData) {\r
75             // console.info('modules raw:',modulesRawData);\r
76             yangUtils.processModules(modulesRawData.modules, function(node) {\r
77                 $scope.nodeModules.push(node);\r
78             });\r
79         });\r
80     };\r
81 \r
82     var loadNodes = function loadNodes() {\r
83         //TODO change when module discovery will be implemented\r
84         $scope.devices = [];\r
85         Restangular.all('operational').all('opendaylight-inventory:nodes').getList().then(function(inventoryRawData) {\r
86             $scope.devices = yangUtils.processNodes(inventoryRawData.nodes);\r
87         });\r
88     };\r
89 \r
90     var loadFlows = function loadFlows() {\r
91         $scope.flows = [];\r
92         if($scope.selDevice) { \r
93             //TODO change when module discovery will be implemented\r
94             Restangular.all('config').all('opendaylight-inventory:nodes').one('node', $scope.selDevice).get().then(function(nodeRawData) {\r
95                 $scope.flows = yangUtils.processFlows(nodeRawData.node[0]);\r
96             });\r
97         }\r
98     };\r
99 \r
100     var sendFlow = function sendFlow() {\r
101         if($scope.selDevice && $scope.selModule) {\r
102             var requestData = yangUtils.buildRequest($scope.selModule),\r
103                 flowId = requestData.flow[0].id,\r
104                 tableId = requestData.flow[0].table_id;\r
105 \r
106             if(requestData) {\r
107                 //TODO change when module discovery will be implemented\r
108                 var request = Restangular.all('config').all('opendaylight-inventory:nodes').one('node',$scope.selDevice).one('table',tableId).one('flow',flowId);\r
109 \r
110                 request.customPUT(requestData).then(function() {\r
111                     requestWorkingCallback();\r
112                     yangUtils.checkOperational($scope.selDevice, requestData.flow[0], requestSuccessCallback, requestOperErrorCallback);\r
113                 }, function() {\r
114                     requestErrorCallback();\r
115                 });\r
116             }\r
117         }\r
118     };\r
119 \r
120     var deleteFlow = function deleteFlow() {\r
121         if($scope.selDevice && $scope.selFlow) {\r
122             var flowId = $scope.selFlow.flow,\r
123                 tableId = $scope.selFlow.table,\r
124                 //TODO change when module discovery will be implemented\r
125                 request = Restangular.all('config').all('opendaylight-inventory:nodes').one('node',$scope.selDevice).one('table',tableId).one('flow',flowId);\r
126 \r
127             request.remove().then(function() {\r
128                 $scope.selFlow = null;\r
129                 requestSuccessCallback();\r
130             }, function() {\r
131                 requestErrorCallback();\r
132             });\r
133         }\r
134     };\r
135 \r
136     $scope.dismissStatus = function() {\r
137         $scope.status = {};\r
138     };\r
139 \r
140     $scope.loadController = function() {\r
141         $scope.nodeModules = [];\r
142         $scope.flows = [];\r
143         $scope.devices = [];\r
144         $scope.showPreview = true;\r
145         $scope.previewValue = '';\r
146 \r
147         loadModules();\r
148         loadNodes();\r
149     };\r
150 \r
151     $scope.getAPIs = function() {\r
152         //TODO load api when cross domain issue with Restconf API explorer will be closed\r
153 \r
154         // Restangular.all('config').all('opendaylight-inventory:nodes').one('node', 'openflow:1').one('table', '1').one('flow', '1').get().then(function(flowData) {\r
155         //     console.info('flowData:',flowData);\r
156         // });\r
157         console.info(yangUtils.exportModulesLocales($scope.nodeModules));\r
158     };\r
159 \r
160     $scope.getData = function() {\r
161         loadFlows();\r
162     };\r
163 \r
164     $scope.fill = function() {\r
165         if($scope.selFlow && $scope.selModule) {\r
166             //TODO when rest api explorer will be available do it by it\r
167             var data = {'flow-node-inventory:flow': [$scope.selFlow.data]},\r
168                 name = 'flow-node-inventory:flows';\r
169             \r
170             $scope.selModule.clear();\r
171             $scope.selModule.fill(name, data); \r
172             $scope.preview();\r
173         }\r
174     };\r
175 \r
176     $scope.delete = function() {\r
177         deleteFlow();\r
178         // loadFlows();\r
179         $scope.preview();\r
180     };\r
181 \r
182     $scope.clear = function() {\r
183         if($scope.selModule) {\r
184             $scope.selModule.clear();\r
185             $scope.preview();\r
186         }\r
187     };\r
188 \r
189     $scope.send = function() {\r
190         sendFlow();\r
191         // loadFlows();\r
192     };\r
193 \r
194     $scope.preview = function() {\r
195         if($scope.showPreview && $scope.selModule) {\r
196             $scope.previewValue = yangUtils.getRequestString($scope.selModule);\r
197         } else {\r
198             $scope.previewValue = '';\r
199         }\r
200 \r
201         $scope.previewVisible = ($scope.showPreview && $scope.previewValue);\r
202     };\r
203 \r
204     $scope.__test = {\r
205         loadModules: loadModules,\r
206         loadNodes: loadNodes,\r
207         loadFlows: loadFlows,\r
208         sendFlow: sendFlow,\r
209         deleteFlow: deleteFlow\r
210     };\r
211 \r
212     $scope.loadController();\r
213 }])\r
214 \r
215 .controller('leafCtrl', function ($scope) {\r
216     $scope.parentNode = $scope.node;\r
217 \r
218     $scope.changed = function() {\r
219         $scope.preview();\r
220     };\r
221 })\r
222 \r
223 .controller('containerCtrl', function ($scope) {\r
224     $scope.parentNode = $scope.node;\r
225     var node = $scope.node;\r
226     $scope.toggleExpanded = function() {\r
227         node.expanded = !node.expanded;\r
228     };\r
229 })\r
230 \r
231 .controller('caseCtrl', function ($scope) {\r
232     $scope.parentNode = $scope.node;\r
233     var node = $scope.node;\r
234     $scope.empty = (node.children.length === 0 || (node.children.length === 1 && node.children[0].children.length ===0));\r
235 })\r
236 \r
237 .controller('choiceCtrl', function ($scope) {\r
238     $scope.parentNode = $scope.node;\r
239 \r
240 })\r
241 \r
242 \r
243 .controller('listCtrl', function ($scope) {\r
244     $scope.parentNode = $scope.node;\r
245     $scope.actElement = null;\r
246     var node = $scope.node;\r
247     \r
248     $scope.setActElement = function setActElement(elem) {\r
249         $scope.parentNode.actElement = elem;\r
250     };\r
251 \r
252     $scope.addListElem = function addListElem() {\r
253         node.addListElem();\r
254     };\r
255 \r
256     $scope.removeListElem = function removeListElem(elem) {\r
257         node.removeListElem(elem);\r
258         // $scope.preview();\r
259     };\r
260 \r
261     $scope.isElemActive = function isElemActive(elem) {\r
262         var match = (elem === $scope.parentNode.actElement);\r
263         return (match ? 'active' : '');\r
264     };\r
265 });