Assign image keyname and pubkey at vnf level
[ccsdk/apps.git] / sdnr / wireless-transport / code-Carbon-SR1 / ux / mwtnTest / mwtnTest-module / src / main / resources / mwtnTest / mwtnTest.controller.js
1 /*
2  * @copyright 2017 highstreet technologies GmbH and others.  All rights reserved.
3  *
4  * @license 
5  * This program and the accompanying materials are made available under the
6  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
7  * and is available at http://www.eclipse.org/legal/epl-v10.html
8  */
9
10 define(['app/mwtnTest/mwtnTest.module',
11         'app/mwtnTest/mwtnTest.services'],
12         function(mwtnTestApp) {
13
14   mwtnTestApp.register.controller('mwtnTestCtrl', ['$scope', '$rootScope', '$mwtnLog', '$mwtnTest', '$translate', 'OnfNetworkElement', 'LogicalTerminationPoint', 
15     function($scope, $rootScope, $mwtnLog, $mwtnTest, $translate, OnfNetworkElement, LogicalTerminationPoint) {
16
17     var COMPONENT = 'mwtnTestCtrl';
18     $mwtnLog.info({component: COMPONENT, message: 'mwtnTestCtrl started!'});
19     $rootScope.section_logo = 'src/app/mwtnTest/images/mwtnTest.png'; // Add your topbar logo location here such as 'assets/images/logo_topology.gif'
20   
21     var pacTemplate = {
22         'layer-protocol': 'unknown'           
23     };
24
25     // get important infromation from yang modules
26     $mwtnTest.getModules().then(function(success){
27
28       var pacOrder = {
29         'onf-otn-odu-conditional-packages:otn-odu-connection-pac' : 2,
30         'onf-otn-odu-conditional-packages:otn-odu-termination-pac' : 1,
31         'onf-ethernet-conditional-packages:ethernet-pac' : 1,
32         'microwave-model:mw-air-interface-diversity-pac' : 1,
33         'microwave-model:mw-air-interface-hsb-end-point-pac' : 1,
34         'microwave-model:mw-air-interface-hsb-fc-switch-pac' : 2,
35         'onf-core-model-conditional-packages:holder-pac' : 3,
36         'onf-core-model-conditional-packages:connector-pac' : 4,
37         'onf-core-model-conditional-packages:equipment-pac' : 5,
38         'microwave-model:mw-ethernet-container-pac' : 6,
39         'MicrowaveModel-ObjectClasses-EthernetContainer:MW_EthernetContainer_Pac' : 7,
40         'microwave-model:mw-ethernet-container-pac' : 8,
41         'microwave-model:mw-tdm-container-pac': 9,
42         'microwave-model:mw-pure-ethernet-structure-pac': 10,
43         'microwave-model:mw-hybrid-mw-structure-pac': 11,
44         'MicrowaveModel-ObjectClasses-PureEthernetStructure:MW_PureEthernetStructure_Pac' : 12,
45         'microwave-model:mw-air-interface-pac' : 13,
46         'MicrowaveModel-ObjectClasses-AirInterface:MW_AirInterface_Pac' : 14
47       };
48
49       $scope.modules = success;
50       $scope.orderedPacs = [];
51       $scope.parts = [];
52       Object.keys(success).map(function(module){
53         Object.keys(success[module]).filter(function(key){
54           return key.endsWith('-pac') || key.endsWith('_Pac');
55         }).map(function(pacName){
56           $scope.orderedPacs.push([module, pacName].join(':'));
57           // sort 
58           $scope.orderedPacs.sort(function(a, b) {
59             if (!pacOrder[a]) console.warn(a);
60             if (!pacOrder[b]) console.warn(b);
61             if(pacOrder[a] > pacOrder[b]) return 1;
62             if(pacOrder[a] < pacOrder[b]) return -1;
63             return 0;
64           })
65
66           if (pacName === 'mw-air-interface-pac') {
67             $scope.parts = Object.keys(success[module][pacName]).filter(function(conditionalPackage){
68               return success[module][pacName][conditionalPackage]['local-name'];
69             }).map(function(conditionalPackage){
70               return success[module][pacName][conditionalPackage]['local-name'];
71             });
72           }
73         });
74       });
75     }, function(error){
76       $scope.modules = undefined;
77       $scope.orderedPacs = undefined;
78       $scope.parts = undefined;
79     });
80             
81     /**
82      * @function updateNe 
83      * A function, which updates onfNetworkElement by new data.
84      * @param {*} data New data recieved from OpenDaylight via RestConf
85      */
86     var updateNe = function(data) {
87       if (!data) return;
88       // update onfNetworkElement
89       switch ($scope.revision) {
90         case '2016-03-23':
91           $scope.onfNetworkElement = JSON.parse(JSON.stringify(data['network-element'][0]));
92           $scope.onfLtps = data['network-element'][0].ltp;
93           $scope.onfNetworkElement.ltp = undefined;
94           break;
95         case '2016-08-09':
96         case '2016-08-11':
97         case '2017-02-17':
98         case '2017-03-20':
99           // console.log(JSON.stringify(data));        
100           $scope.onfNetworkElement = new OnfNetworkElement(data['network-element']);
101           $scope.onfLtps = $scope.onfNetworkElement.getLogicalTerminationPoints();
102           // $scope.onfNetworkElement.ltp = undefined;
103           break;
104         default:
105           $mwtnLog.info({component: COMPONENT, message: ['The ONF CoreModel revision', $scope.mountpoint.onfCoreModelRevision, ' is not supported (yet)!'].join(' ')});
106           $scope.onfNetworkElement = {};
107           $scope.onfLtps = {};
108       }
109       
110       var order = $mwtnTest.layerProtocolNameOrder;
111       // update onfLTPs
112       $scope.onfLtps.sort(function(a, b){
113         if(order[a.getLayer()] < order[b.getLayer()]) return -1;
114         if(order[a.getLayer()] > order[b.getLayer()]) return 1;
115         if(a.getId() < b.getId()) return -1;
116         if(a.getId() > b.getId()) return 1;
117         return 0;
118       });
119       
120       // calculate conditional packages
121       $scope.pacs = {};
122       $scope.onfLtps.map(function(ltp) {
123         ltp.getLayerProtocols().map(
124           /**
125            * A function processing a layer-protocol object
126            * @param {LayerProtocol} lp A layer-protocol object
127            */
128           function(lp) {
129             var template = JSON.parse(JSON.stringify(pacTemplate));
130             template['layer-protocol'] = lp.getId();
131             var conditionalPackage = lp.getConditionalPackage(true);
132             // console.log(conditionalPackage);
133             if (conditionalPackage !== '') {
134               if ($scope.pacs[conditionalPackage] === undefined) {
135                 // create missing pac array
136                 $scope.pacs[conditionalPackage] = [];
137               }
138               $scope.pacs[conditionalPackage].push(template);
139             } else {
140               $mwtnLog.info({component: COMPONENT, message: 'No conditional package for  ' + ltp.getLabel() });
141             }
142         });
143       });
144       
145       // sort the conditional packages
146       if ($scope.orderedPacs) {
147         $scope.orderedPacs.filter(function(item){
148           return $scope.pacs[item] !== undefined;
149         }).map(function(item){
150           $scope.pacs[item].sort(function(a, b){
151             if(a['layer-protocol'] < b['layer-protocol']) return -1;
152             if(a['layer-protocol'] > b['layer-protocol']) return 1;
153             return 0;
154           });
155         });
156       }
157       data.revision = undefined;
158     };
159
160     var updateNetworkElementCurrentProblems = function(data) {
161       if (!data) return;
162       $scope.neCurrentProblems = data;
163     };
164
165     var updateLtp = function(data) {
166       $scope.onfLtps.map(function(ltp){
167         if (ltp.getData().uuid === data.data.ltp[0].uuid) {
168           ltp = new LogicalTerminationPoint(data.data.ltp[0]);
169         }
170       });
171     };
172
173     /**
174      * @deprecated since all conditaional packages are handle the same way even for
175      *             3rd and 4th PoC model - 2nd PoC model not supported any more.
176      * @param {*} lpId 
177      * @param {*} part 
178      * @param {*} data 
179      */
180     var updateAirInterface = function(lpId, part, data) {
181       // console.log(JSON.stringify(data), lpId);
182       $scope.airinterfaces.map(function(airinterface){
183         // console.log(JSON.stringify(airinterface));
184         if (airinterface['layer-protocol'] === lpId) {
185           if (Object.keys(data)[0].startsWith('air-interface')) {
186             airinterface[part] = data;            
187           } else if (part === 'Capability') {
188             // 2. PoC
189             // console.log(part, JSON.stringify(data));
190             airinterface[part] = data['mw-air-interface-pac'][0]['air-interface-capability-list'];            
191           } else if (part === 'CurrentProblems') {
192             // 2. PoC
193             // console.log(part, JSON.stringify(data));
194             airinterface[part] = data['mw-air-interface-pac'][0]['air-interface-current-problem-list'];            
195           }
196         }
197       });
198       data.revision = undefined;
199     };
200
201     /**
202      * @deprecated since all conditaional packages are handle the same way even for
203      *             3rd and 4th PoC model - 2nd PoC model not supported any more.
204      * @param {*} lpId 
205      * @param {*} part 
206      * @param {*} data 
207      */
208     var updateStructure = function(lpId, part, data) {
209       // console.log(JSON.stringify(data), lpId);
210       $scope.structures.map(function(structure){
211         // console.log(JSON.stringify(structure));
212         if (structure['layer-protocol'] === lpId) {
213           if (Object.keys(data)[0].contains('tructure')) {
214             structure[part] = data;            
215           } else if (part === 'Capability') {
216             // 2. PoC
217             // console.log(part, JSON.stringify(data));
218             structure[part] = data['mw-structure-pac'][0]['structure.capability-list'];            
219           } else if (part === 'CurrentProblems') {
220             // 2. PoC
221             // console.log(part, JSON.stringify(data));
222             structure[part] = data['mw-structure-pac'][0]['structure-current-problem-list'];            
223           }
224         }
225       });
226       data.revision = undefined;
227     };
228
229     /**
230      * @deprecated since all conditaional packages are handle the same way even for
231      *             3rd and 4th PoC model - 2nd PoC model not supported any more.
232      * @param {*} lpId 
233      * @param {*} part 
234      * @param {*} data 
235      */
236     var updateContainer = function(lpId, part, data) {
237       // console.log(JSON.stringify(data), lpId);
238       $scope.containers.map(function(container){
239         // console.log(JSON.stringify(container));
240         if (container['layer-protocol'] === lpId) {
241           if (Object.keys(data)[0].contains('ontainer') ) {
242             container[part] = data;            
243           } else if (part === 'Capability') {
244             // 2. PoC
245             // console.log(part, JSON.stringify(data));
246             container[part] = data['mw-container-pac'][0]['container-capability-list'];            
247           } else if (part === 'CurrentProblems') {
248             // 2. PoC
249             // console.log(part, JSON.stringify(data));
250             container[part] = data['mw-container-pac'][0]['container-current-problem-list'];            
251           }
252         }
253       });
254       data.revision = undefined;
255     };
256
257     /**
258      * Creates a template of a conditional packages with its subclasses
259      * @param {{pacId: string, layerProtocolId: string, partId:string}} spec - Specification object of a conditional package subclass
260      */
261     var initPac = function(spec) {
262       $scope.pacs[spec.pacId].filter(function(conditionalPackage){
263         return conditionalPackage['layer-protocol'] === spec.layerProtocolId;
264       }).map(function(pac){
265         $scope.parts.map(function(localName){
266           pac[localName] = {id:$mwtnTest.getPartGlobalId(spec, localName),localName: localName, data:'No data available'}
267         });
268       });
269     };
270
271     /**
272      * Updates an existing template of a conditional packages with its subclasses
273      * @param {{pacId: string, layerProtocolId: string, partId:string}} spec - Specification object of a conditional package subclass
274      */
275     var updateSubClassData = function(spec, data) {
276       $scope.pacs[spec.pacId].filter(function(conditionalPackage){
277         return conditionalPackage['layer-protocol'] === spec.layerProtocolId;
278       }).map(function(conditionalPackage){
279         conditionalPackage[$mwtnTest.getPartLocalId(spec)].data = data[$mwtnTest.yangify(spec.partId)];
280       });
281     };
282
283     var updatePart = function(spec, data) {
284       switch (spec.pacId) {
285         case 'ne':
286           updateNe(data);
287           break;
288         case 'neCurrentProblems':
289           updateNetworkElementCurrentProblems(data);
290         case 'clock':
291           // console.warn('yea clock', JSON.stringify(data));
292           $scope.clock = data;
293           break;
294         case 'ltp':
295           updateLtp(data);
296           break;
297         case 'airinterface':
298           console.log(JSON.stringify(spec, JSON.stringify(data)));
299           updateAirInterface(spec.layerProtocolId, spec.partId, data);
300           break;
301         case 'structure':
302           console.log(JSON.stringify(data));
303           updateStructure(spec.layerProtocolId, spec.partId, data);
304           break;
305         case 'container':
306           console.log(JSON.stringify(data));
307           updateContainer(spec.layerProtocolId, spec.partId, data);
308           break;  
309         // 3rd Poc
310         case 'MicrowaveModel-ObjectClasses-AirInterface:MW_AirInterface_Pac':
311         case 'MicrowaveModel-ObjectClasses-PureEthernetStructure:MW_PureEthernetStructure_Pac':
312         case 'MicrowaveModel-ObjectClasses-EthernetContainer:MW_EthernetContainer_Pac':
313         // 4th Poc
314         case 'microwave-model:mw-air-interface-pac':
315         case 'microwave-model:mw-air-interface-diversity-pac':
316         case 'microwave-model:mw-pure-ethernet-structure-pac':
317         case 'microwave-model:mw-hybrid-mw-structure-pac':
318         case 'microwave-model:mw-tdm-container-pac':
319         case 'microwave-model:mw-ethernet-container-pac':
320         case 'onf-ethernet-conditional-packages:ethernet-pac':
321         // Poc 4.1
322         case 'onf-otn-odu-conditional-packages:otn-odu-connection-pac':
323         case 'onf-otn-odu-conditional-packages:otn-odu-termination-pac':
324         if (!spec.partId) {
325             initPac(spec);
326           } else {
327             updateSubClassData(spec, data);
328           }
329           break;  
330       }
331     };
332     
333     // events
334     $scope.status = {ne:false};
335     $scope.spinner = {ne:false};
336     $scope.separator = $mwtnTest.separator; //'&nbsp;'
337
338     $scope.myClipboard = {
339       data : {'key': 'value'},
340       supported : true,
341       getJson : function() {
342         return JSON.stringify(this.data, null, ' ');
343       },
344       copyToClipboard : function() {
345         var message = 'Copied to clipboard! ' + this.getJson();
346         $mwtnLog.info({component: COMPONENT, message: message});
347       },
348       error : function(err) {
349         $mwtnLog.error({component: COMPONENT, message: err});
350       }
351     };
352     
353     $scope.$watch('status', function(status, oldValue) {
354       Object.keys(status).filter(function(key){
355         return $scope.networkElementId && status[key] && status[key] !== oldValue[key];
356       }).map(function(key){
357         $scope.spinner[key] = true;
358         var info = key.split($scope.separator);
359         var spec = {
360           nodeId: $scope.networkElementId,
361           revision: $scope.revision,
362           pacId: info[0],
363           layerProtocolId: info[1],
364           partId: info[2]
365         };
366         $mwtnTest.getPacParts(spec).then(function(success){
367           success = $mwtnTest.yangifyObject(success)
368           $scope.myClipboard.data = success; 
369           updatePart(spec, success);
370           $scope.spinner[key] = false;
371         }, function(error){
372           $scope.myClipboard.data = 'Opps!'; 
373           updatePart(spec, error);
374           $scope.spinner[key] = false;
375         });
376         $scope.mountpoint = $scope.mountPoints.filter(function(mountpoint){
377           return mountpoint['node-id'] === $scope.networkElementId;
378         })[0];
379         if (key === 'mountpoint') {
380           $scope.spinner['mountpoint'] = false;
381           $scope.myClipboard.data = $scope.mountpoint;
382         }
383       });
384     }, true);
385
386         // var spec = {
387         //   nodeId: $scope.networkElementId,
388         //   revision: $scope.revision,
389         //   pacId: 'clock'
390         // };
391         // $mwtnTest.getPacParts(spec).then(function(success){
392         //   $scope.collapseAll();
393         //   updatePart(spec, $mwtnTest.yangifyObject(success));
394         // }, function(error){
395         //   $scope.collapseAll();
396         //   updatePart(spec, error);
397         // });
398
399
400     $scope.collapseAll = function() {
401       // close all groups
402       Object.keys($scope.status).map(function(group){
403         $scope.status[group] = false;
404       });
405       Object.keys($scope.spinner).map(function(group){
406         $scope.spinner[group] = false;
407       });
408     };
409     
410     $scope.$watch('networkElement', function(neId, oldValue) {
411       if (neId && neId !== '' && neId !== oldValue) {
412         
413         // clear old data
414         $scope.airinterfaces = [];
415         $scope.structures = [];
416         $scope.containers = [];
417         $scope.onfLtps = [];
418         $scope.clock = undefined;
419
420         $scope.networkElementId = neId;
421         $scope.revision = $scope.mountPoints.filter(function(mountpoint){
422           return mountpoint['node-id'] === neId;
423         }).map(function(mountpoint){
424           return mountpoint.onfCoreModelRevision;
425         })[0];
426
427         // network element alarms
428         var neAlarms = $scope.mountPoints.filter(function(mountpoint){
429           return mountpoint['node-id'] === neId;
430         }).map(function(mountpoint){
431           return mountpoint.onfCapabilities.filter(function(cap){
432             return cap.module === 'MicrowaveModel-NetworkElement-CurrentProblemList' || cap.module === 'onf-core-model-conditional-packages';
433           });
434         });
435         if (neAlarms.length === 1 && neAlarms[0].length === 1 ) {
436           $translate('MWTN_LOADING').then(function (translation) {
437             $scope.neCurrentProblems = translation;
438           });
439         } else {
440           $scope.neCurrentProblems = undefined;
441         }
442         
443         var spec = {
444           nodeId: $scope.networkElementId,
445           revision: $scope.revision,
446           pacId: 'ne'
447         };
448         $mwtnTest.getPacParts(spec).then(function(success){
449           $scope.collapseAll();
450           updatePart(spec, $mwtnTest.yangifyObject(success));
451         }, function(error){
452           $scope.collapseAll();
453           updatePart(spec, error);
454         });
455
456         // ptp-clock
457         var ptpClock = $scope.mountPoints.filter(function(mountpoint){
458           return mountpoint['node-id'] === neId;
459         }).map(function(mountpoint){
460           return mountpoint.onfCapabilities.filter(function(cap){
461             return cap.module === 'onf-ptp-dataset';
462           });
463         });
464         if (ptpClock.length === 1 && ptpClock[0].length === 1 ) {
465           $translate('MWTN_LOADING').then(function (translation) {
466             $scope.clock = translation;
467           });
468         } else {
469           $scope.clock = undefined;
470         }
471         
472       }
473     });
474
475   }]);
476
477 });