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/mwtnBrowser/mwtnBrowser.module',
11 'app/mwtnBrowser/mwtnBrowser.services'],
12 function(mwtnBrowserApp) {
14 var getControlType = function(type) {
28 var message = 'Check control type for ' + type;
29 $mwtnLog.warning({ component: COMPONENT, message: message });
34 mwtnBrowserApp.register.controller('ptpDefaultDsViewController', ['$scope', '$uibModalInstance', '$mwtnGlobal', '$mwtnCommons', '$mwtnDatabase', '$mwtnLog', 'defaultDs',
35 function ($scope, $uibModalInstance, $mwtnGlobal, $mwtnCommons, $mwtnDatabase, $mwtnLog, defaultDs) {
38 var COMPONENT = 'ptpDefaultDsViewController';
39 $scope.data = defaultDs;
41 $scope.getType = $mwtnGlobal.getType;
44 $mwtnCommons.getPtpDefaultDs(defaultDs).then(function (success) {
46 $scope.configuredData = success;
47 $scope.viewData = $mwtnGlobal.getViewData($scope.configuredData['default-ds']);
49 $mwtnDatabase.getSchema().then(function(schema){
51 var clone = JSON.parse(JSON.stringify($scope.viewData));
52 var keys = Object.keys(clone).map(function(key){
53 if ($mwtnGlobal.getType(key) !== 'string') {
54 console.log('key', key);
57 var item = clone[key];
59 var message = 'No schema information for ' + key;
60 $mwtnLog.warning({ component: COMPONENT, message: message });
61 item['order-number'] = $mwtnCommons.getOrderNumber(97, item);
62 item.description = 'No description available.';
66 if (schema[key].controlType === undefined) {
67 item.controlType = getControlType(item.type);
69 item.controlType = schema[key].controlType;
71 item.unit = schema[key].unit;
72 item['is-read-only'] = schema[key]['is-read-only'];
73 if (schema[key].min) {
74 item.min = schema[key].min;
76 if (schema[key].max) {
77 item.max = schema[key].max;
79 item.unit = schema[key].min + '..' + schema[key].max + ' ' + item.unit;
81 item.unit = schema[key].min + '..' + schema[key].max;
86 item['order-number'] = $mwtnCommons.getOrderNumber(schema[key]['order-number'], item);
87 item.description = schema[key].description;
88 if (item.description === undefined || item.description === '') {
89 item.description = 'No description available.';
91 // hide complex types for now -> TODO
92 if (item.type === 'array' || item.type === 'object') {
96 }).sort(function(a,b){
97 if (clone[a]['order-number'] < clone[b]['order-number']) return -1;
98 if (clone[a]['order-number'] > clone[b]['order-number']) return 1;
100 }).map(function(key){
101 ordered[key] = clone[key];
103 $scope.viewData = ordered;
108 }, function (error) {
109 $scope.configuredData = undefined;
110 $mwtnLog.error({ component: COMPONENT, message: 'Requesting PTP default ds ' + JSON.stringify($scope.data) + ' failed!' });
113 $scope.$watch('viewData', function(newValue, oldValue) {
114 if (oldValue && newValue !== oldValue) {
115 Object.keys(newValue).filter(function(key){
116 return newValue[key]['is-read-only'] !== true && newValue[key].controlType === 'number' ;
117 }).map(function(key){
118 if (newValue[key].value < newValue[key].min) newValue[key].value = newValue[key].min;
119 if (newValue[key].value > newValue[key].max) newValue[key].value = newValue[key].max;
120 if (!newValue[key].value) newValue[key].value = newValue[key].min;
126 $scope.ok = function () {
127 $scope.processing = true;
129 Object.keys($scope.viewData).map(function(key){
130 $scope.newData[key] = $scope.viewData[key].value;
133 $mwtnCommons.setPtpDefaultDs($scope.data, $scope.newData).then(function(success){
134 $scope.applied = {text: 'Applied: ' + new Date().toISOString(), class:'mwtnSuccess'};
135 $scope.processing = false;
137 $scope.applied = {text: 'Error: ' + new Date().toISOString(), class:'mwtnError'};
138 $scope.processing = false;
139 $mwtnLog.error({component: COMPONENT, message: JSON.stringify(error)});
144 $scope.cancel = function () {
145 $uibModalInstance.close($scope.newData);
153 mwtnBrowserApp.register.controller('ptpPortConfigViewController', ['$scope', '$uibModalInstance', '$mwtnGlobal', '$mwtnCommons', '$mwtnDatabase', '$mwtnLog', 'valueData',
154 function ($scope, $uibModalInstance, $mwtnGlobal, $mwtnCommons, $mwtnDatabase, $mwtnLog, data) {
157 var COMPONENT = 'ptpPortConfigViewController';
161 $scope.getType = $mwtnGlobal.getType;
162 console.warn(JSON.stringify(data));
163 $mwtnCommons.getPtpPort(data).then(function (success) {
165 $scope.configuredData = success;
167 $scope.viewData = $mwtnGlobal.getViewData($scope.configuredData['port-ds-list'][0]);
168 $mwtnDatabase.getSchema().then(function(schema){
170 var clone = JSON.parse(JSON.stringify($scope.viewData));
171 var keys = Object.keys(clone).map(function(key){
172 if ($mwtnGlobal.getType(key) !== 'string') {
173 console.log('key', key);
176 var item = clone[key];
178 var message = 'No schema information for ' + key;
179 $mwtnLog.warning({ component: COMPONENT, message: message });
180 item['order-number'] = $mwtnCommons.getOrderNumber(97, item);
181 item.description = 'No description available.';
185 if (schema[key].controlType === undefined) {
186 item.controlType = getControlType(item.type);
188 item.controlType = schema[key].controlType;
190 item.unit = schema[key].unit;
191 console.warn(key, schema[key]['is-read-only']);
192 item['is-read-only'] = schema[key]['is-read-only'];
193 if (schema[key].min) {
194 item.min = schema[key].min;
196 if (schema[key].max) {
197 item.max = schema[key].max;
199 item.unit = schema[key].min + '..' + schema[key].max + ' ' + item.unit;
201 item.unit = schema[key].min + '..' + schema[key].max;
206 item['order-number'] = $mwtnCommons.getOrderNumber(schema[key]['order-number'], item);
207 item.description = schema[key].description;
208 if (item.description === undefined || item.description === '') {
209 item.description = 'No description available.';
211 // hide complex types for now -> TODO
212 if (item.type === 'array' || item.type === 'object') {
213 item.visible = false;
216 }).sort(function(a,b){
217 if (clone[a]['order-number'] < clone[b]['order-number']) return -1;
218 if (clone[a]['order-number'] > clone[b]['order-number']) return 1;
220 }).map(function(key){
221 ordered[key] = clone[key];
223 $scope.viewData = ordered;
228 }, function (error) {
229 $scope.configuredData = undefined;
230 $mwtnLog.error({ component: COMPONENT, message: 'Requesting PTP port ' + JSON.stringify($scope.data) + ' failed!' });
233 $scope.$watch('viewData', function(newValue, oldValue) {
234 if (oldValue && newValue !== oldValue) {
235 Object.keys(newValue).filter(function(key){
236 return newValue[key]['is-read-only'] !== true && newValue[key].controlType === 'number' ;
237 }).map(function(key){
238 if (newValue[key].value < newValue[key].min) newValue[key].value = newValue[key].min;
239 if (newValue[key].value > newValue[key].max) newValue[key].value = newValue[key].max;
240 if (!newValue[key].value) newValue[key].value = newValue[key].min;
246 $scope.ok = function () {
247 $scope.processing = true;
249 Object.keys($scope.viewData).map(function(key){
250 $scope.newData[key] = $scope.viewData[key].value;
253 $mwtnCommons.setPtpPort($scope.data, $scope.newData).then(function(success){
254 $scope.applied = {text: 'Applied: ' + new Date().toISOString(), class:'mwtnSuccess'};
255 $scope.processing = false;
257 $scope.applied = {text: 'Error: ' + new Date().toISOString(), class:'mwtnError'};
258 $scope.processing = false;
259 $mwtnLog.error({component: COMPONENT, message: JSON.stringify(error)});
264 $scope.cancel = function () {
265 $uibModalInstance.close($scope.newData);
273 mwtnBrowserApp.register.controller('mwtnPtpPortsController', ['$scope', '$filter', '$uibModal', '$mwtnGlobal', '$mwtnCommons', '$mwtnLog',
274 function ($scope, $filter, $uibModal, $mwtnGlobal, $mwtnCommons, $mwtnLog) {
276 var COMPONENT = 'mwtnPtpPortsController';
279 var data = JSON.parse(JSON.stringify($scope.data));
281 var message = 'No data to be displayed!";'
282 $mwtnLog.info({ component: COMPONENT, message: message });
283 data = [{'message':message}];
286 if ($mwtnGlobal.getType(data) !== 'array') {
287 var message = 'Data must be of type "array"!';
288 $mwtnLog.info({ component: COMPONENT, message: message });
289 data = [{'message':message}];
292 if (data.length === 0) {
293 var message = 'Data list must have at least one entry!';
294 $mwtnLog.info({ component: COMPONENT, message: message });
295 data = [{'message':message}];
298 if ($mwtnGlobal.getType(data[0]) !== 'object') {
299 data = data.map(function(item){
300 return {value: item};
304 $scope.ptpPorts = [];
306 $scope.gridOptions = JSON.parse(JSON.stringify($mwtnCommons.gridOptions));
307 $scope.gridOptions.data = 'ptpPorts';
308 $scope.highlightFilteredHeader = $mwtnCommons.highlightFilteredHeader;
310 // $scope.getTableHeight = function() {
311 // var rowHeight = 30;
312 // var headerHeight = 40;
313 // var maxCount = 12;
314 // var rowCount = $scope.gridOptions.data.length + 2;
315 // if (rowCount > maxCount) {
317 // height: (maxCount * rowHeight + headerHeight) + 'px'
320 // return {}; // use auto-resize feature
323 var getCellTemplate = function(field) {
324 var object = ['transmission-mode-list', 'performance-data'];
325 if (object.contains(field)) {
326 return ['<div class="ui-grid-cell-contents">',
327 '<i class="fa fa-info-circle pointer" aria-hidden="true"',
328 ' ng-click="grid.appScope.show(grid.getCellValue(row, col))"></i> ',
329 '{{grid.getCellValue(row, col)}}</div>'].join('');
330 } else if (field === 'action') {
332 '<a class="vCenter" ng-class="{attention: grid.appScope.hover, hidden: onfAirInterfaceRevision}" >',
333 ' <i class="fa fa-pencil-square-o pointer" aria-hidden="true" ng-click="grid.appScope.show(row.entity)"></i>',
334 '</a>' ].join('<span> </span>');
336 return '<div class="ui-grid-cell-contents">{{grid.getCellValue(row, col)}}</div>';
340 $scope.show = function(value){
341 var type = $mwtnGlobal.getType(value);
342 // if (type === 'object')
343 var modalInstance = $uibModal.open({
345 ariaLabelledBy: 'modal-title',
346 ariaDescribedBy: 'modal-body',
347 templateUrl: 'src/app/mwtnBrowser/templates/ptpPortConfigView.tpl.html',
348 controller: 'ptpPortConfigViewController',
351 valueData: function () {
352 return {networkElement: $scope.networkElement, value:value};
356 modalInstance.result.then(function(object) {
357 console.warn(JSON.stringify(object));
358 $scope.ptpPorts.map(function(row, index){
359 if (row['port-number'] === object['port-number']) {
360 console.log($scope.ptpPorts[index]['onf-ptp-dataset:master-only']);
361 $scope.ptpPorts[index] = object;
362 console.log($scope.ptpPorts[index]['onf-ptp-dataset:master-only']);
370 var enable = data.length > 10;
371 $scope.gridOptions.columnDefs = Object.keys(data[0]).map(function (field) {
372 var type = $mwtnGlobal.getType(data[0][field]);
373 var labelId = $mwtnGlobal.getLabelId(field);
374 var displayName = $filter('translate')(labelId);
375 var visible = $mwtnGlobal.getVisibilityOf(field);
376 if (labelId.contains('$$') || labelId === 'MWTN_SPEC') {
382 displayName: displayName,
384 enableFiltering: enable,
385 headerCellClass: $scope.highlightFilteredHeader,
386 cellTemplate: getCellTemplate(field),
391 $scope.gridOptions.columnDefs.push({
393 displayName: 'Action',
394 enableSorting: false,
395 enableFiltering: false,
396 headerCellClass: $scope.highlightFilteredHeader,
397 cellTemplate: getCellTemplate('action'),
403 if ($scope.gridOptions.data.length < 10) {
404 $scope.gridOptions.minRowsToShow = data.length; // 10 is default
406 $scope.ptpPorts = data.map(function(item){
410 // .sort(function(a, b){
411 // if (a.type === 'object') return -1;
412 // if (a.type === 'array' ) return -2;
416 $scope.myClipboard = {
419 getJson: function () {
420 return JSON.stringify(this.data, null, ' ');
422 copyToClipboard: function () {
423 var message = 'Copied to clipboard! ' + this.getJson();
424 $mwtnLog.info({ component: COMPONENT, message: message });
426 error: function (err) {
427 $mwtnLog.error({ component: COMPONENT, message: err });
432 mwtnBrowserApp.register.directive('mwtnPtpPorts', function () {
440 controller: 'mwtnPtpPortsController',
442 templateUrl: 'src/app/mwtnBrowser/templates/mwtnPtpPorts.tpl.html'
446 mwtnBrowserApp.register.controller('mwtnPtpClockViewerController', ['$scope', '$timeout', '$uibModal', '$mwtnGlobal', '$mwtnCommons', '$mwtnDatabase', '$mwtnLog', '$mwtnBrowser',
447 function ($scope, $timeout, $uibModal, $mwtnGlobal, $mwtnCommons, $mwtnDatabase, $mwtnLog, $mwtnBrowser) {
449 var COMPONENT = 'mwtnPtpClockViewerController';
451 $scope.replace = false;
452 if ($scope.path && $scope.path.endsWith('-configuration') ) {
453 $scope.replace = true;
455 $scope.viewData = $mwtnGlobal.getViewData($scope.data, $scope.ne);
456 var path = [undefined, undefined, undefined];
458 path = $scope.path.split($mwtnCommons.separator);
461 var processData = function(schema) {
463 var clone = JSON.parse(JSON.stringify($scope.viewData));
464 var keys = Object.keys(clone).map(function(key){
465 if ($mwtnGlobal.getType(key) !== 'string') {
466 console.log('key', key);
469 var item = clone[key];
471 var message = 'No schema information for ' + key;
472 $mwtnLog.warning({ component: COMPONENT, message: message });
473 item['order-number'] = $mwtnCommons.getOrderNumber(97, item);
474 item.description = 'No description available.';
478 item.unit = schema[key].unit;
479 item.description = schema[key].description;
480 item['order-number'] = $mwtnCommons.getOrderNumber(schema[key]['order-number'], item);
481 if (item.description === undefined || item.description === '') {
482 item.description = 'No description available.';
485 }).sort(function(a,b){
486 if (clone[a]['order-number'] < clone[b]['order-number']) return -1;
487 if (clone[a]['order-number'] > clone[b]['order-number']) return 1;
489 }).map(function(key){
490 if ($mwtnGlobal.getType( clone[key].value ) === 'object') {
491 Object.keys(clone[key].value).filter(function(subKey){
492 return subKey.endsWith('-identity');
493 }).map(function(subKey){
494 var clockId = clone[key].value[subKey];
495 if ($mwtnGlobal.getType(clockId) === 'object') {
496 if (clockId['clock-identity']) {
497 var ascii = clockId['clock-identity'].base64ToHex();
498 clone[key].value[subKey]['clock-identity'] = [clone[key].value[subKey]['clock-identity'], '(ascii:', ascii, ')'].join(' ');
501 var ascii = clone[key].value[subKey].base64ToHex();
502 clone[key].value[subKey] = [clone[key].value[subKey], '(ascii:', ascii, ')'].join(' ');
505 ordered[key] = clone[key];
507 ordered[key] = clone[key];
511 if (Object.keys(ordered).length === 0) {
512 $scope.info = 'An empty object is displayed. Please check if the NetConf server has send an empty object.';
518 $mwtnDatabase.getSchema().then(function(schema){
519 $scope.schema = schema;
520 $scope.viewData = processData($scope.schema);
526 $scope.show = function(value){
527 var type = $mwtnGlobal.getType(value);
528 var modalInstance = $uibModal.open({
530 ariaLabelledBy: 'modal-title',
531 ariaDescribedBy: 'modal-body',
532 templateUrl: 'src/app/mwtnBrowser/templates/ptpDefaultDsConfigView.tpl.html',
533 controller: 'ptpDefaultDsViewController',
536 defaultDs: function () {
537 return {networkElement: $scope.networkElement, value:value};
541 modalInstance.result.then(function(object) {
542 $mwtnBrowser.refreshPTP();
549 mwtnBrowserApp.register.directive('mwtnPtpClockViewer', function () {
555 ne: '=', // flag if ne class
558 controller: 'mwtnPtpClockViewerController',
560 templateUrl: 'src/app/mwtnBrowser/templates/mwtnPtpClockViewer.tpl.html'
565 mwtnBrowserApp.register.controller('mwtnBrowserCtrl', ['$scope', '$rootScope', '$mwtnLog', '$mwtnCommons', '$mwtnEthernet', '$mwtnBrowser', '$translate', 'OnfNetworkElement', 'PtpClock', 'LogicalTerminationPoint',
566 function($scope, $rootScope, $mwtnLog, $mwtnCommons, $mwtnEthernet, $mwtnBrowser, $translate, OnfNetworkElement, PtpClock, LogicalTerminationPoint) {
568 var COMPONENT = 'mwtnBrowserCtrl';
569 $mwtnLog.info({component: COMPONENT, message: 'mwtnBrowserCtrl started!'});
570 $rootScope.section_logo = 'src/app/mwtnBrowser/images/mwtnBrowser.png'; // Add your topbar logo location here such as 'assets/images/logo_topology.gif'
573 'layer-protocol': 'unknown'
576 $scope.fcDeletion = {
577 nodeId: $scope.networkElementId,
579 info: 'handle with care, no further warning, qualified user expected ;)'
581 $scope.deleteForwardingConstruct = function() {
582 $scope.fcDeletion.nodeId = $scope.networkElementId;
583 $scope.fcDeletion.info = 'Processing ...';
584 $scope.fcDeletion.error = undefined;
585 if ($scope.fcDeletion.ltp === undefined || $scope.fcDeletion.ltp === '') {
586 $scope.fcDeletion.error = 'Please select a valid LTP#1.!';
589 $mwtnEthernet.deleteForwardingConstruct($scope.fcDeletion).then(function(success){
590 console.log(success);
591 $scope.fcDeletion.info = success;
594 $scope.fcDeletion.error = error;
598 $scope.fcCreation = {
599 nodeId: $scope.networkElementId,
603 info:'handle with care, no further warning, qualified user expected ;)'
605 $scope.createForwardingConstruct = function() {
606 console.warn(JSON.stringify($scope.networkElementId));
607 console.warn(JSON.stringify($scope.networkElement));
608 $scope.fcCreation.nodeId = $scope.networkElementId;
609 $scope.fcCreation.info = 'Processing ...';
610 $scope.fcCreation.error = undefined;
611 if ($scope.fcCreation.ltp1 === undefined || $scope.fcCreation.ltp1 === '') {
612 $scope.fcCreation.error = 'Please select a valid LTP#1!';
615 if ($scope.fcCreation.ltp2 === undefined || $scope.fcCreation.ltp2 === '') {
616 $scope.fcCreation.error = 'Please select a valid LTP#2!';
619 if ($scope.fcCreation.vlan === undefined) {
620 $scope.fcCreation.error = 'Please select a valid vlan-id!';
623 if ($scope.fcCreation.ltp1 === $scope.fcCreation.ltp2) {
624 $scope.fcCreation.error = 'Please select different LTPs. Loopback is not supported yet!';
627 $mwtnEthernet.createForwardingConstruct($scope.fcCreation).then(function(success){
628 console.log(success);
629 $scope.fcCreation.info = success;
632 $scope.fcCreation.error = error;
636 // get important infromation from yang modules
637 console.error('help');
638 $mwtnBrowser.getModules().then(function(success){
641 'onf-otn-odu-conditional-packages:otn-odu-termination-pac',
642 'onf-otn-odu-conditional-packages:otn-odu-connection-pac',
643 'onf-ethernet-conditional-packages:ethernet-pac',
644 'microwave-model:mw-air-interface-diversity-pac',
645 'microwave-model:mw-air-interface-hsb-end-point-pac',
646 'microwave-model:mw-air-interface-hsb-fc-switch-pac',
647 'onf-core-model-conditional-packages:holder-pac',
648 'onf-core-model-conditional-packages:connector-pac',
649 'onf-core-model-conditional-packages:equipment-pac',
650 'microwave-model:mw-ethernet-container-pac',
651 'MicrowaveModel-ObjectClasses-EthernetContainer:MW_EthernetContainer_Pac',
652 'microwave-model:mw-ethernet-container-pac',
653 'microwave-model:mw-tdm-container-pac',
654 'microwave-model:mw-pure-ethernet-structure-pac',
655 'microwave-model:mw-hybrid-mw-structure-pac',
656 'MicrowaveModel-ObjectClasses-PureEthernetStructure:MW_PureEthernetStructure_Pac',
657 'microwave-model:mw-air-interface-pac',
658 'MicrowaveModel-ObjectClasses-AirInterface:MW_AirInterface_Pac'
661 $scope.modules = success;
662 $scope.orderedPacs = [];
664 Object.keys(success).map(function(module){
665 Object.keys(success[module]).filter(function(key){
666 return key.endsWith('-pac') || key.endsWith('_Pac');
667 }).map(function(pacName){
668 $scope.orderedPacs.push([module, pacName].join(':'));
670 $scope.orderedPacs.sort(function(a, b) {
671 if (!pacOrder.indexOf(a)) console.warn(a);
672 if (!pacOrder.indexOf(b)) console.warn(b);
673 if(pacOrder.indexOf(a) > pacOrder.indexOf(b)) return 1;
674 if(pacOrder.indexOf(a) < pacOrder.indexOf(b)) return -1;
678 if (pacName === 'mw-air-interface-pac') {
679 $scope.parts = Object.keys(success[module][pacName]).filter(function(conditionalPackage){
680 return success[module][pacName][conditionalPackage]['local-name'];
681 }).map(function(conditionalPackage){
682 return success[module][pacName][conditionalPackage]['local-name'];
688 $scope.modules = undefined;
689 $scope.orderedPacs = undefined;
690 $scope.parts = undefined;
695 * A function, which updates onfNetworkElement by new data.
696 * @param {*} data New data recieved from OpenDaylight via RestConf
698 var updateNe = function(data) {
700 // update onfNetworkElement
701 switch ($scope.mountpoint.onfCoreModelRevision) {
703 $scope.onfNetworkElement = JSON.parse(JSON.stringify(data['network-element'][0]));
704 $scope.onfLtps = data['network-element'][0].ltp;
705 $scope.onfNetworkElement.ltp = undefined;
712 // console.log(JSON.stringify(data));
713 $scope.onfNetworkElement = new OnfNetworkElement(data['network-element']);
714 var fd = $scope.onfNetworkElement.getForwardingDomain();
715 $scope.forwardingDomain = undefined;
716 $scope.forwardingConstructs = undefined;
717 if (fd && fd.length > 0) {
718 $scope.forwardingDomain = fd[0]; // $mwtnBrowser.getViewData(fd[0]);
719 $scope.forwardingConstructs = [];
721 fd[0].fc.map(function(id){
722 $mwtnBrowser.getForwardingConstruct($scope.networkElement, id).then(function(fc){
725 if (fc['forwarding-construct'] && fc['forwarding-construct'][0]) {
726 var item = fc['forwarding-construct'][0];
727 if (item['fc-port'] &&
728 item['fc-port'][0] && item['fc-port'][0].ltp && item['fc-port'][0].ltp[0] &&
729 item['fc-port'][1] && item['fc-port'][1].ltp && item['fc-port'][1].ltp[0]) {
730 $scope.forwardingConstructs.push( {
732 'fc-port#1': $scope.onfNetworkElement.getLtp( item['fc-port'][0].ltp[0] ).getLabel(),
733 'fc-port#2': $scope.onfNetworkElement.getLtp( item['fc-port'][1].ltp[0] ).getLabel()
741 $scope.onfLtps = $scope.onfNetworkElement.getLogicalTerminationPoints();
742 // $scope.onfNetworkElement.ltp = undefined;
745 $mwtnLog.info({component: COMPONENT, message: ['The ONF CoreModel revision', $scope.mountpoint.onfCoreModelRevision, ' is not supported (yet)!'].join(' ')});
746 $scope.onfNetworkElement = {};
750 var order = $mwtnBrowser.layerProtocolNameOrder;
752 $scope.onfLtps.sort(function(a, b){
753 if(order[a.getLayer()] < order[b.getLayer()]) return -1;
754 if(order[a.getLayer()] > order[b.getLayer()]) return 1;
755 if(a.getId() < b.getId()) return -1;
756 if(a.getId() > b.getId()) return 1;
760 // calculate conditional packages
762 $scope.onfLtps.map(function(ltp) {
763 ltp.getLayerProtocols().map(
765 * A function processing a layer-protocol object
766 * @param {LayerProtocol} lp A layer-protocol object
769 var template = JSON.parse(JSON.stringify(pacTemplate));
770 template['layer-protocol'] = lp.getId();
771 var conditionalPackage = lp.getConditionalPackage(true);
772 // console.log(conditionalPackage);
773 if (conditionalPackage !== '') {
774 if ($scope.pacs[conditionalPackage] === undefined) {
775 // create missing pac array
776 $scope.pacs[conditionalPackage] = [];
778 $scope.pacs[conditionalPackage].push(template);
779 console.error(conditionalPackage, JSON.stringify(template));
781 $mwtnLog.info({component: COMPONENT, message: 'No conditional package for ' + ltp.getLabel() });
786 // sort the conditional packages
787 if ($scope.orderedPacs) {
788 $scope.orderedPacs.filter(function(item){
789 return $scope.pacs[item] !== undefined;
790 }).map(function(item){
791 $scope.pacs[item].sort(function(a, b){
792 if(a['layer-protocol'] < b['layer-protocol']) return -1;
793 if(a['layer-protocol'] > b['layer-protocol']) return 1;
798 data.revision = undefined;
801 var updateNetworkElementCurrentProblems = function(data) {
802 if (data && data['network-element-current-problems'] && data['network-element-current-problems']['current-problem-list'] ) {
803 data.revision = undefined;
804 $scope.neCurrentProblems = data['network-element-current-problems']['current-problem-list'];
806 $scope.neCurrentProblems = [];
810 var updateLtp = function(data) {
811 $scope.onfLtps.map(function(ltp){
812 if (ltp.getData().uuid === data.data.ltp[0].uuid) {
813 ltp = new LogicalTerminationPoint(data.data.ltp[0]);
819 * @deprecated since all conditaional packages are handle the same way even for
820 * 3rd and 4th PoC model - 2nd PoC model not supported any more.
825 var updateAirInterface = function(lpId, part, data) {
826 // console.log(JSON.stringify(data), lpId);
827 $scope.airinterfaces.map(function(airinterface){
828 // console.log(JSON.stringify(airinterface));
829 if (airinterface['layer-protocol'] === lpId) {
830 if (Object.keys(data)[0].startsWith('air-interface')) {
831 airinterface[part] = data;
832 } else if (part === 'Capability') {
834 // console.log(part, JSON.stringify(data));
835 airinterface[part] = data['mw-air-interface-pac'][0]['air-interface-capability-list'];
836 } else if (part === 'CurrentProblems') {
838 // console.log(part, JSON.stringify(data));
839 airinterface[part] = data['mw-air-interface-pac'][0]['air-interface-current-problem-list'];
843 data.revision = undefined;
847 * @deprecated since all conditaional packages are handle the same way even for
848 * 3rd and 4th PoC model - 2nd PoC model not supported any more.
853 var updateStructure = function(lpId, part, data) {
854 // console.log(JSON.stringify(data), lpId);
855 $scope.structures.map(function(structure){
856 // console.log(JSON.stringify(structure));
857 if (structure['layer-protocol'] === lpId) {
858 if (Object.keys(data)[0].contains('tructure')) {
859 structure[part] = data;
860 } else if (part === 'Capability') {
862 // console.log(part, JSON.stringify(data));
863 structure[part] = data['mw-structure-pac'][0]['structure.capability-list'];
864 } else if (part === 'CurrentProblems') {
866 // console.log(part, JSON.stringify(data));
867 structure[part] = data['mw-structure-pac'][0]['structure-current-problem-list'];
871 data.revision = undefined;
875 * @deprecated since all conditaional packages are handle the same way even for
876 * 3rd and 4th PoC model - 2nd PoC model not supported any more.
881 var updateContainer = function(lpId, part, data) {
882 // console.log(JSON.stringify(data), lpId);
883 $scope.containers.map(function(container){
884 // console.log(JSON.stringify(container));
885 if (container['layer-protocol'] === lpId) {
886 if (Object.keys(data)[0].contains('ontainer') ) {
887 container[part] = data;
888 } else if (part === 'Capability') {
890 // console.log(part, JSON.stringify(data));
891 container[part] = data['mw-container-pac'][0]['container-capability-list'];
892 } else if (part === 'CurrentProblems') {
894 // console.log(part, JSON.stringify(data));
895 container[part] = data['mw-container-pac'][0]['container-current-problem-list'];
899 data.revision = undefined;
903 * Creates a template of a conditional packages with its subclasses
904 * @param {{pacId: string, layerProtocolId: string, partId:string}} spec - Specification object of a conditional package subclass
906 var initPac = function(spec) {
907 $scope.pacs[spec.pacId].filter(function(conditionalPackage){
908 return conditionalPackage['layer-protocol'] === spec.layerProtocolId;
909 }).map(function(pac){
910 $scope.parts.map(function(localName){
911 pac[localName] = {id:$mwtnBrowser.getPartGlobalId(spec, localName),localName: localName, data:'No data available'}
917 * Updates an existing template of a conditional packages with its subclasses
918 * @param {{pacId: string, layerProtocolId: string, partId:string}} spec - Specification object of a conditional package subclass
920 var updateSubClassData = function(spec, data) {
921 $scope.pacs[spec.pacId].filter(function(conditionalPackage){
922 return conditionalPackage['layer-protocol'] === spec.layerProtocolId;
923 }).map(function(conditionalPackage){
924 conditionalPackage[$mwtnBrowser.getPartLocalId(spec)].data = data[$mwtnBrowser.yangify(spec.partId)];
928 var updatePart = function(spec, data) {
929 switch (spec.pacId) {
933 case 'forwardingDomain':
934 // TODO $scope.forwardingDomain = new ForwardingDomain(data);
936 case 'neCurrentProblems':
937 updateNetworkElementCurrentProblems(data);
941 $scope.clock = new PtpClock(data);
943 $scope.clock = undefined;
950 console.warn(JSON.stringify(spec, JSON.stringify(data)));
951 updateAirInterface(spec.layerProtocolId, spec.partId, data);
954 console.warn(JSON.stringify(data));
955 updateStructure(spec.layerProtocolId, spec.partId, data);
958 console.warn(JSON.stringify(data));
959 updateContainer(spec.layerProtocolId, spec.partId, data);
962 case 'MicrowaveModel-ObjectClasses-AirInterface:MW_AirInterface_Pac':
963 case 'MicrowaveModel-ObjectClasses-PureEthernetStructure:MW_PureEthernetStructure_Pac':
964 case 'MicrowaveModel-ObjectClasses-EthernetContainer:MW_EthernetContainer_Pac':
966 case 'microwave-model:mw-air-interface-pac':
967 case 'microwave-model:mw-air-interface-diversity-pac':
968 case 'microwave-model:mw-pure-ethernet-structure-pac':
969 case 'microwave-model:mw-hybrid-mw-structure-pac':
970 case 'microwave-model:mw-tdm-container-pac':
971 case 'microwave-model:mw-ethernet-container-pac':
972 case 'onf-ethernet-conditional-packages:ethernet-pac':
976 updateSubClassData(spec, data);
983 $scope.status = {ne:false};
984 $scope.spinner = {ne:false};
985 $scope.separator = $mwtnBrowser.separator; //' '
987 $scope.collapseAll = function() {
989 Object.keys($scope.status).map(function(group){
990 $scope.status[group] = false;
992 Object.keys($scope.spinner).map(function(group){
993 $scope.spinner[group] = false;
997 $scope.$watch('status', function(status, oldValue) {
998 Object.keys(status).filter(function(key){
999 return $scope.networkElementId && status[key] && status[key] !== oldValue[key];
1000 }).map(function(key){
1001 $scope.spinner[key] = true;
1002 var info = key.split($scope.separator);
1004 nodeId: $scope.networkElementId,
1005 revision: $scope.revision,
1007 layerProtocolId: info[1],
1010 $mwtnBrowser.getPacParts(spec).then(function(success){
1011 success = $mwtnBrowser.yangifyObject(success)
1012 updatePart(spec, success);
1013 $scope.spinner[key] = false;
1015 updatePart(spec, error);
1016 $scope.spinner[key] = false;
1021 $scope.$watch('networkElement', function(neId, oldValue) {
1022 if (neId && neId !== '' && neId !== oldValue) {
1024 $scope.collapseAll();
1027 $scope.airinterfaces = [];
1028 $scope.structures = [];
1029 $scope.containers = [];
1030 $scope.onfLtps = [];
1031 $scope.clock = undefined;
1033 $scope.networkElementId = neId;
1034 $scope.revision = $scope.mountPoints.filter(function(mountpoint){
1035 return mountpoint['node-id'] === neId;
1036 }).map(function(mountpoint){
1037 $scope.mountpoint = mountpoint;
1038 return mountpoint.onfCoreModelRevision;
1042 nodeId: $scope.networkElementId,
1043 revision: $scope.revision,
1046 $mwtnBrowser.getPacParts(spec).then(function(success){
1047 updatePart(spec, $mwtnBrowser.yangifyObject(success));
1049 updatePart(spec, error);
1052 // network element alarms
1053 var neAlarms = $scope.mountPoints.filter(function(mountpoint){
1054 return mountpoint['node-id'] === neId;
1055 }).map(function(mountpoint){
1056 return mountpoint.onfCapabilities.filter(function(cap){
1057 return cap.module === 'MicrowaveModel-NetworkElement-CurrentProblemList' || cap.module === 'onf-core-model-conditional-packages';
1061 if (neAlarms.length === 1 && neAlarms[0].length === 1 ) {
1062 $translate('MWTN_LOADING').then(function (translation) {
1063 $scope.neCurrentProblems = translation;
1066 $scope.neCurrentProblems = undefined;
1070 var ptpClock = $scope.mountPoints.filter(function(mountpoint){
1071 return mountpoint['node-id'] === neId;
1072 }).map(function(mountpoint){
1073 return mountpoint.onfCapabilities.filter(function(cap){
1074 return cap.module === 'onf-ptp-dataset';
1077 if (ptpClock.length === 1 && ptpClock[0].length === 1 ) {
1078 $translate('MWTN_LOADING').then(function (translation) {
1079 $scope.clock = {'translation': translation};
1082 $scope.clock = undefined;