2 * @copyright 2017 highstreet technologies GmbH and others. All rights reserved.
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
10 define(['app/mwtnTest/mwtnTest.module',
11 'app/mwtnTest/mwtnTest.services'],
12 function(mwtnTestApp) {
14 mwtnTestApp.register.controller('mwtnTestCtrl', ['$scope', '$rootScope', '$mwtnLog', '$mwtnTest', '$translate', 'OnfNetworkElement', 'LogicalTerminationPoint',
15 function($scope, $rootScope, $mwtnLog, $mwtnTest, $translate, OnfNetworkElement, LogicalTerminationPoint) {
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'
22 'layer-protocol': 'unknown'
25 // get important infromation from yang modules
26 $mwtnTest.getModules().then(function(success){
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
49 $scope.modules = success;
50 $scope.orderedPacs = [];
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(':'));
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;
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'];
76 $scope.modules = undefined;
77 $scope.orderedPacs = undefined;
78 $scope.parts = undefined;
83 * A function, which updates onfNetworkElement by new data.
84 * @param {*} data New data recieved from OpenDaylight via RestConf
86 var updateNe = function(data) {
88 // update onfNetworkElement
89 switch ($scope.revision) {
91 $scope.onfNetworkElement = JSON.parse(JSON.stringify(data['network-element'][0]));
92 $scope.onfLtps = data['network-element'][0].ltp;
93 $scope.onfNetworkElement.ltp = undefined;
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;
105 $mwtnLog.info({component: COMPONENT, message: ['The ONF CoreModel revision', $scope.mountpoint.onfCoreModelRevision, ' is not supported (yet)!'].join(' ')});
106 $scope.onfNetworkElement = {};
110 var order = $mwtnTest.layerProtocolNameOrder;
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;
120 // calculate conditional packages
122 $scope.onfLtps.map(function(ltp) {
123 ltp.getLayerProtocols().map(
125 * A function processing a layer-protocol object
126 * @param {LayerProtocol} lp A layer-protocol object
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] = [];
138 $scope.pacs[conditionalPackage].push(template);
140 $mwtnLog.info({component: COMPONENT, message: 'No conditional package for ' + ltp.getLabel() });
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;
157 data.revision = undefined;
160 var updateNetworkElementCurrentProblems = function(data) {
162 $scope.neCurrentProblems = data;
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]);
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.
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') {
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') {
193 // console.log(part, JSON.stringify(data));
194 airinterface[part] = data['mw-air-interface-pac'][0]['air-interface-current-problem-list'];
198 data.revision = undefined;
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.
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') {
217 // console.log(part, JSON.stringify(data));
218 structure[part] = data['mw-structure-pac'][0]['structure.capability-list'];
219 } else if (part === 'CurrentProblems') {
221 // console.log(part, JSON.stringify(data));
222 structure[part] = data['mw-structure-pac'][0]['structure-current-problem-list'];
226 data.revision = undefined;
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.
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') {
245 // console.log(part, JSON.stringify(data));
246 container[part] = data['mw-container-pac'][0]['container-capability-list'];
247 } else if (part === 'CurrentProblems') {
249 // console.log(part, JSON.stringify(data));
250 container[part] = data['mw-container-pac'][0]['container-current-problem-list'];
254 data.revision = undefined;
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
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'}
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
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)];
283 var updatePart = function(spec, data) {
284 switch (spec.pacId) {
288 case 'neCurrentProblems':
289 updateNetworkElementCurrentProblems(data);
291 // console.warn('yea clock', JSON.stringify(data));
298 console.log(JSON.stringify(spec, JSON.stringify(data)));
299 updateAirInterface(spec.layerProtocolId, spec.partId, data);
302 console.log(JSON.stringify(data));
303 updateStructure(spec.layerProtocolId, spec.partId, data);
306 console.log(JSON.stringify(data));
307 updateContainer(spec.layerProtocolId, spec.partId, data);
310 case 'MicrowaveModel-ObjectClasses-AirInterface:MW_AirInterface_Pac':
311 case 'MicrowaveModel-ObjectClasses-PureEthernetStructure:MW_PureEthernetStructure_Pac':
312 case 'MicrowaveModel-ObjectClasses-EthernetContainer:MW_EthernetContainer_Pac':
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':
322 case 'onf-otn-odu-conditional-packages:otn-odu-connection-pac':
323 case 'onf-otn-odu-conditional-packages:otn-odu-termination-pac':
327 updateSubClassData(spec, data);
334 $scope.status = {ne:false};
335 $scope.spinner = {ne:false};
336 $scope.separator = $mwtnTest.separator; //' '
338 $scope.myClipboard = {
339 data : {'key': 'value'},
341 getJson : function() {
342 return JSON.stringify(this.data, null, ' ');
344 copyToClipboard : function() {
345 var message = 'Copied to clipboard! ' + this.getJson();
346 $mwtnLog.info({component: COMPONENT, message: message});
348 error : function(err) {
349 $mwtnLog.error({component: COMPONENT, message: err});
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);
360 nodeId: $scope.networkElementId,
361 revision: $scope.revision,
363 layerProtocolId: info[1],
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;
372 $scope.myClipboard.data = 'Opps!';
373 updatePart(spec, error);
374 $scope.spinner[key] = false;
376 $scope.mountpoint = $scope.mountPoints.filter(function(mountpoint){
377 return mountpoint['node-id'] === $scope.networkElementId;
379 if (key === 'mountpoint') {
380 $scope.spinner['mountpoint'] = false;
381 $scope.myClipboard.data = $scope.mountpoint;
387 // nodeId: $scope.networkElementId,
388 // revision: $scope.revision,
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);
400 $scope.collapseAll = function() {
402 Object.keys($scope.status).map(function(group){
403 $scope.status[group] = false;
405 Object.keys($scope.spinner).map(function(group){
406 $scope.spinner[group] = false;
410 $scope.$watch('networkElement', function(neId, oldValue) {
411 if (neId && neId !== '' && neId !== oldValue) {
414 $scope.airinterfaces = [];
415 $scope.structures = [];
416 $scope.containers = [];
418 $scope.clock = undefined;
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;
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';
435 if (neAlarms.length === 1 && neAlarms[0].length === 1 ) {
436 $translate('MWTN_LOADING').then(function (translation) {
437 $scope.neCurrentProblems = translation;
440 $scope.neCurrentProblems = undefined;
444 nodeId: $scope.networkElementId,
445 revision: $scope.revision,
448 $mwtnTest.getPacParts(spec).then(function(success){
449 $scope.collapseAll();
450 updatePart(spec, $mwtnTest.yangifyObject(success));
452 $scope.collapseAll();
453 updatePart(spec, error);
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';
464 if (ptpClock.length === 1 && ptpClock[0].length === 1 ) {
465 $translate('MWTN_LOADING').then(function (translation) {
466 $scope.clock = translation;
469 $scope.clock = undefined;