AAI Query optimization for VID
[vid.git] / vid-app-common / src / main / webapp / app / vid / scripts / controller / aaiSubscriberController.js
1 /*-\r
2  * ============LICENSE_START=======================================================\r
3  * VID\r
4  * ================================================================================\r
5  * Copyright (C) 2017 - 2019 AT&T Intellectual Property. All rights reserved.\r
6  * Modifications Copyright (C) 2019 IBM.\r
7  * ================================================================================\r
8  * Licensed under the Apache License, Version 2.0 (the "License");\r
9  * you may not use this file except in compliance with the License.\r
10  * You may obtain a copy of the License at\r
11  * \r
12  *      http://www.apache.org/licenses/LICENSE-2.0\r
13  * \r
14  * Unless required by applicable law or agreed to in writing, software\r
15  * distributed under the License is distributed on an "AS IS" BASIS,\r
16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
17  * See the License for the specific language governing permissions and\r
18  * limitations under the License.\r
19  * ============LICENSE_END=========================================================\r
20  */\r
21 \r
22 "use strict";\r
23 \r
24 appDS2.controller("aaiSubscriberController", ["COMPONENT", "FIELD", "PARAMETER", "DataService", "PropertyService", "$scope", "$http", "$timeout", "$location", "$log", "$route", "$uibModal", "VIDCONFIGURATION", "UtilityService", "vidService", "AaiService", "MsoService", "OwningEntityService", "AsdcService","featureFlags", "$q", "_",\r
25     function (COMPONENT, FIELD, PARAMETER, DataService, PropertyService, $scope, $http, $timeout, $location, $log, $route, $uibModal, VIDCONFIGURATION, UtilityService, vidService, AaiService, MsoService, OwningEntityService, AsdcService, featureFlags, $q, _) {\r
26 \r
27         $scope.showReportWindow = function() {\r
28             let GuiMessage;\r
29 \r
30             if ($scope.errorMsg !== undefined && $scope.errorMsg !== null) {\r
31                 GuiMessage = $scope.errorMsg;\r
32             } else {\r
33                 GuiMessage = $scope.status;\r
34             }\r
35 \r
36             const modalWindow = $uibModal.open({\r
37                 templateUrl: 'app/vid/scripts/modals/report-modal/report-modal.html',\r
38                 controller: 'reportModalController',\r
39                 controllerAs: 'vm',\r
40                 resolve: {\r
41                     errorMsg: function () {\r
42                         return GuiMessage;\r
43                     }\r
44                 }\r
45             });\r
46         };\r
47 \r
48         $scope.showVnfDetails = function (vnf) {\r
49             console.log("showVnfDetails");\r
50             DataService.setVnfInstanceId(COMPONENT.VNF_INSTANCE_ID);\r
51             DataService\r
52                 .setInventoryItem(aaiResult[FIELD.ID.INVENTORY_RESPONSE_ITEMS][FIELD.ID.INVENTORY_RESPONSE_ITEM][0]);\r
53 \r
54             $scope.$broadcast(COMPONENT.SHOW_COMPONENT_DETAILS, {\r
55                 componentId: COMPONENT.VNF,\r
56                 callbackFunction: callbackFunction\r
57             });\r
58         };\r
59         $scope.popup = new Object();\r
60 \r
61 \r
62         $scope.isPopupVisible = false;\r
63         $scope.defaultBaseUrl = "";\r
64         $scope.responseTimeoutMsec = 60000;\r
65 \r
66         $scope.serviceTypes = [FIELD.PROMPT.SELECT_SERVICE, COMPONENT.UCPE_VMS, COMPONENT.SDN_L3_BONDING, COMPONENT.SDN_ETHERNET_INTERNET];\r
67         $scope.defaultSubscriberName = [FIELD.PROMPT.SELECT_SUB];\r
68 \r
69         $scope.verifyButtonEnabled = true;\r
70 \r
71         var callbackFunction = function (response) {\r
72             alert(response);\r
73         };\r
74 \r
75         $scope.getSubs = function () {\r
76             $scope.init();\r
77             $scope.fetchSubs(FIELD.PROMPT.FETCHING_SUBS);\r
78             $scope.fetchServices();\r
79         };\r
80 \r
81         $scope.cancelCreateSI = function () {\r
82 \r
83             window.location.href = COMPONENT.WELCOME_PATH;\r
84         };\r
85 \r
86         $scope.getServiceTypes = function (globalCustomerId) {\r
87             DataService.setGlobalCustomerId(globalCustomerId);\r
88             DataService.setServiceIdList($scope.customerList);\r
89 \r
90             if (globalCustomerId !== "" && globalCustomerId !== undefined) {\r
91                 window.location.href = COMPONENT.SERVICE_TYPE_LIST_PATH + $scope.serviceTypeList;\r
92             }\r
93         };\r
94 \r
95         $scope.refreshServiceTypes = function (globalCustomerId) {\r
96             DataService.setGlobalCustomerId(globalCustomerId);\r
97 \r
98             $scope.getServiceTypesList();\r
99         };\r
100 \r
101         $scope.subId = "";\r
102         $scope.createSubscriberName = "";\r
103         $scope.serviceTypeList = {};\r
104         $scope.custSubList = [];\r
105         $scope.getServiceTypesList = function () {\r
106             var notFound = true;\r
107             var globalCustomerId = DataService.getGlobalCustomerId();\r
108             $scope.custSubList = DataService.getServiceIdList();\r
109             if (globalCustomerId !== "" && globalCustomerId !== undefined) {\r
110                 $scope.subId = globalCustomerId;\r
111                 $scope.init();\r
112                 $scope.status = FIELD.PROMPT.FETCHING_SERVICE_TYPES;\r
113                 DataService.setGlobalCustomerId(globalCustomerId);\r
114 \r
115                 AaiService.getSubscriptionServiceTypeList(DataService\r
116                     .getGlobalCustomerId(), function (response) {\r
117                     notFound = false;\r
118                     $scope.setProgress(100); // done\r
119                     $scope.status = FIELD.STATUS.DONE;\r
120                     $scope.isSpinnerVisible = false;\r
121                     $scope.serviceTypeList = response;\r
122                     for (var i = 0; i < $scope.custSubList.length; i++) {\r
123                         if (globalCustomerId === $scope.custSubList[i].globalCustomerId) {\r
124                             $scope.createSubscriberName = $scope.custSubList[i].subscriberName;\r
125                         }\r
126                     }\r
127                 }, function (response) { // failure\r
128                     $scope.showError(FIELD.ERROR.AAI);\r
129                     $scope.errorMsg = FIELD.ERROR.FETCHING_SERVICE_TYPES + response.status;\r
130                     $scope.errorDetails = response.data;\r
131                 });\r
132             } else {\r
133                 alert(FIELD.ERROR.SELECT);\r
134             }\r
135 \r
136         };\r
137 \r
138         $scope.subList = [];\r
139         $scope.getAaiServiceModels = function (selectedServicetype, subName) {\r
140             DataService.setGlobalCustomerId(selectedServicetype);\r
141             DataService.setServiceIdList($scope.serviceTypeList);\r
142             DataService.setSubscriberName(subName);\r
143 \r
144             DataService.setSubscribers($scope.custSubList);\r
145 \r
146             if (selectedServicetype !== "" && selectedServicetype !== 'undefined'&& selectedServicetype !== undefined) {\r
147                 $location.path(COMPONENT.CREATE_INSTANCE_PATH);\r
148             }\r
149         };\r
150 \r
151         $scope.serviceTypeName = "";\r
152         $scope.getAaiServiceModelsList = function () {\r
153             var globalCustomerId = "";\r
154             var serviceTypeId = DataService.getGlobalCustomerId();\r
155             $scope.serviceTypeList = DataService.getServiceIdList();\r
156             $scope.createSubscriberName = DataService.getSubscriberName();\r
157             $scope.status = FIELD.STATUS.FETCHING_SERVICE_CATALOG;\r
158             $scope.custSubList = DataService.getSubscribers();\r
159             for (var i = 0; i < $scope.serviceTypeList.length; i++) {\r
160                 if (parseInt(serviceTypeId) === i) {\r
161                     $scope.serviceTypeName = $scope.serviceTypeList[i].name;\r
162                 }\r
163             }\r
164             ;\r
165             for (var i = 0; i < $scope.custSubList.length; i++) {\r
166                 if ($scope.createSubscriberName === $scope.custSubList[i].subscriberName) {\r
167                     globalCustomerId = $scope.custSubList[i].globalCustomerId;\r
168                     globalCustId = globalCustomerId;\r
169                 }\r
170             }\r
171             ;\r
172             var pathQuery = "";\r
173 \r
174             if (null !== globalCustomerId && "" !== globalCustomerId && undefined !== globalCustomerId\r
175                 && null !== serviceTypeId && "" !== serviceTypeId && undefined !== serviceTypeId) {\r
176                 pathQuery = COMPONENT.SERVICES_PATH + globalCustomerId + "/" + $scope.serviceTypeName;\r
177             }\r
178 \r
179             var namedQueryId = '6e806bc2-8f9b-4534-bb68-be91267ff6c8';\r
180             AaiService.getServiceModelsByServiceType(namedQueryId, globalCustomerId, $scope.serviceTypeName, function (response) { // success\r
181                 $scope.services = [];\r
182                 if (angular.isArray(response.data['inventory-response-item']) && response.data['inventory-response-item'].length > 0 && response.data['inventory-response-item'][0]['inventory-response-items']) {\r
183                     wholeData = response.data['inventory-response-item'][0]['inventory-response-items']['inventory-response-item'];\r
184                     $scope.services = $scope.filterDataWithHigerVersion(response.data['inventory-response-item'][0]['inventory-response-items']['inventory-response-item']);\r
185                     $scope.serviceType = response.data['inventory-response-item'][0]['service-subscription']['service-type'];\r
186                     $scope.viewPerPage = 10;\r
187                     $scope.totalPage = $scope.services.length / $scope.viewPerPage;\r
188                     $scope.sortBy = "name";\r
189                     $scope.scrollViewPerPage = 2;\r
190                     $scope.currentPage = 1;\r
191                     $scope.searchCategory;\r
192                     $scope.searchString = "";\r
193                     $scope.currentPageNum = 1;\r
194                     $scope.isSpinnerVisible = false;\r
195                     $scope.isProgressVisible = false;\r
196                 } else {\r
197                     $scope.status = "Failed to get service models from SDC.";\r
198                     $scope.error = true;\r
199                     $scope.isSpinnerVisible = false;\r
200                 }\r
201                 DataService.setServiceIdList(response);\r
202             }, function (response) { // failure\r
203                 $scope.showError(FIELD.ERROR.AAI);\r
204                 $scope.errorMsg = FIELD.ERROR.FETCHING_SERVICES + response.status;\r
205                 $scope.errorDetails = response.data;\r
206             });\r
207 \r
208         };\r
209 \r
210         var globalCustId;// This value will be assigned only on create new service instance screen-macro\r
211         $scope.createType = "a la carte";\r
212         $scope.deployService = function (service, hideServiceFields) {\r
213             hideServiceFields = hideServiceFields || false;\r
214             var temp = service;\r
215             service.uuid = service['service-instance']['model-version-id'];\r
216 \r
217             console.log("Instantiating ASDC service " + service.uuid);\r
218 \r
219             $http.get('rest/models/services/' + service.uuid)\r
220                 .then(function (getServiceResponse) {\r
221                     getServiceResponse.data['service'].serviceTypeName = $scope.serviceTypeName;\r
222                     getServiceResponse.data['service'].createSubscriberName = $scope.createSubscriberName;\r
223                     var serviceModel = getServiceResponse.data;\r
224                     DataService.setServiceName(serviceModel.service.name);\r
225 \r
226                     DataService.setModelInfo(COMPONENT.SERVICE, {\r
227                         "modelInvariantId": serviceModel.service.invariantUuid,\r
228                         "modelVersion": serviceModel.service.version,\r
229                         "modelNameVersionId": serviceModel.service.uuid,\r
230                         "modelName": serviceModel.service.name,\r
231                         "description": serviceModel.service.description,\r
232                         "serviceType": serviceModel.service.serviceType,\r
233                         "serviceRole": serviceModel.service.serviceRole,\r
234                         "category": serviceModel.service.category,\r
235                         "serviceTypeName": serviceModel.service.serviceTypeName,\r
236                         "createSubscriberName": serviceModel.service.createSubscriberName\r
237                     });\r
238                     DataService.setHideServiceFields(hideServiceFields);\r
239                     if (hideServiceFields) {\r
240                         DataService.setServiceType($scope.serviceTypeName);\r
241                         DataService.setGlobalCustomerId(globalCustId);\r
242                     }\r
243 \r
244                     DataService.setALaCarte(true);\r
245                     $scope.createType = "a la carte";\r
246                     var broadcastType = "createComponent";\r
247 \r
248                     DataService.setShouldIncludeInAsyncInstantiationFlow(AsdcService.shouldTakeTheAsyncInstantiationFlow(serviceModel));\r
249 \r
250                     if (AsdcService.isMacro(serviceModel)) {\r
251                         DataService.setALaCarte(false);\r
252                         $scope.createType = "Macro";\r
253                         var convertedAsdcModel = UtilityService.convertModel(serviceModel);\r
254 \r
255                         //console.log ("display inputs ");\r
256                         //console.log (JSON.stringify ( convertedAsdcModel.completeDisplayInputs));\r
257 \r
258                         DataService.setModelInfo(COMPONENT.SERVICE, {\r
259                             "modelInvariantId": serviceModel.service.invariantUuid,\r
260                             "modelVersion": serviceModel.service.version,\r
261                             "modelNameVersionId": serviceModel.service.uuid,\r
262                             "modelName": serviceModel.service.name,\r
263                             "description": serviceModel.service.description,\r
264                             "category": serviceModel.service.category,\r
265                             "serviceEcompNaming": serviceModel.service.serviceEcompNaming,\r
266                             "inputs": serviceModel.service.inputs,\r
267                             "displayInputs": convertedAsdcModel.completeDisplayInputs,\r
268                             "serviceTypeName": serviceModel.service.serviceTypeName,\r
269                             "createSubscriberName": serviceModel.service.createSubscriberName,\r
270                             "serviceType": serviceModel.service.serviceType,\r
271                             "serviceRole": serviceModel.service.serviceRole\r
272                         });\r
273                     }\r
274 \r
275                     $scope.$broadcast(broadcastType, {\r
276                         componentId: COMPONENT.SERVICE,\r
277                         callbackFunction: function (response) {\r
278                             if (response.isSuccessful) {\r
279                                 vidService.setModel(serviceModel);\r
280 \r
281                                 var subscriberId = "Not Found";\r
282                                 var serviceType = "Not Found";\r
283 \r
284                                 var serviceInstanceId = response.instanceId;\r
285 \r
286                                 for (var i = 0; i < response.control.length; i++) {\r
287                                     if (response.control[i].id == "subscriberName") {\r
288                                         subscriberId = response.control[i].value;\r
289                                     } else if (response.control[i].id == "serviceType") {\r
290                                         serviceType = response.control[i].value;\r
291                                     }\r
292                                 }\r
293 \r
294 \r
295                                 $scope.refreshSubs(subscriberId, serviceType, serviceInstanceId);\r
296 \r
297                             }\r
298                         }\r
299                     });\r
300 \r
301                 }, function (response) {\r
302                     $log.error("Error: ", response);\r
303                 });\r
304         };\r
305 \r
306         var wholeData=[];\r
307         //extract all models from service instances properties and filter by the higher model version\r
308         $scope.filterDataWithHigerVersion = function(serviceData){\r
309 \r
310             //get all service instances & models collected into array. key = model invariant id\r
311             var servicesByModelInvariant = _.reduce(serviceData, function(result, item) {\r
312                 if (item['extra-properties']['extra-property']) {\r
313                     var invariantId = item['extra-properties']['extra-property'][4];\r
314                     if (invariantId) {\r
315                         (result[invariantId["property-value"]] || (result[invariantId["property-value"]] = [])).push(item);\r
316                     }\r
317                 }\r
318                 return result;\r
319             }, {});\r
320 \r
321             //iterate over the array and get the highest model version for each group of services\r
322             var filterDataServicesByVersion = [];\r
323             _.forEach(servicesByModelInvariant, function(items) {\r
324                 var maxVersionItem = _.maxBy(items, function(item) { return parseFloat(item['extra-properties']['extra-property'][6]["property-value"]); });\r
325                 filterDataServicesByVersion.push(maxVersionItem);\r
326             });\r
327 \r
328             return filterDataServicesByVersion;\r
329         };\r
330 \r
331         $scope.tableData = [];\r
332         var oldData = [];\r
333         $scope.loadPreviousVersionData = function (version, invariantUUID) {\r
334             $scope.tableData = [];\r
335             oldData = [];\r
336             for (var i = 0; i < wholeData.length; i++) {\r
337                 if (wholeData[i]['extra-properties']['extra-property'] && wholeData[i]['extra-properties']['extra-property'][4]['property-value'] == invariantUUID && version != wholeData[i]['extra-properties']['extra-property'][6]['property-value']) {\r
338                     oldData.push(wholeData[i]);\r
339                 }\r
340             }\r
341             $scope.tableData = oldData;\r
342             $scope.createType = "Previous Version";\r
343             var broadcastType = "createTableComponent";\r
344             $scope.componentName = invariantUUID;\r
345             $scope.$broadcast(broadcastType, {\r
346                 componentId: COMPONENT.OLDVERSION,\r
347                 callbackFunction: function (response) {\r
348                 }\r
349             });\r
350         };\r
351         $scope.cancelCreateSIType = function () {\r
352 \r
353             window.location.href = COMPONENT.SERVICE_MODLES_INSTANCES_SUBSCRIBERS_PATH;\r
354 \r
355         };\r
356 \r
357         $scope.fetchServices = function () {\r
358             var serviceIdList = [];\r
359 \r
360             AaiService.getServices2(function (response) { // success\r
361                 DataService.setServiceIdList(response);\r
362             }, function (response) { // failure\r
363                 $scope.showError(FIELD.ERROR.AAI);\r
364                 $scope.errorMsg = FIELD.ERROR.FETCHING_SERVICES + response.status;\r
365                 $scope.errorDetails = response.data;\r
366             });\r
367         };\r
368 \r
369         $scope.refreshSubs = function () {\r
370             $scope.init();\r
371             $scope.fetchSubs(FIELD.PROMPT.REFRESH_SUB_LIST);\r
372             $scope.fetchServices();\r
373         };\r
374 \r
375         $scope.loadOwningEntity = function () {\r
376             OwningEntityService.getOwningEntityProperties(function (response) {\r
377                 $scope.owningEntities = response.owningEntity;\r
378                 $scope.projects = response.project;\r
379 \r
380                 // working project name: owning-entity-id-val-cp8128\r
381                 // working owning entity name: owning-entity-id-val-cp8128\r
382             });\r
383         };\r
384 \r
385         $scope.fetchSubs = function (status) {\r
386             $scope.status = status;\r
387 \r
388             AaiService.getSubList(function (response) {\r
389                 $scope.setProgress(100); // done\r
390                 $scope.status = FIELD.STATUS.DONE;\r
391                 $scope.isSpinnerVisible = false;\r
392                 $scope.customerList = response;\r
393             }, function (response) { // failure\r
394                 $scope.showError(FIELD.ERROR.AAI);\r
395                 $scope.errorMsg = FIELD.ERROR.AAI_FETCHING_CUST_DATA + response.status;\r
396                 $scope.errorDetails = response.data;\r
397             });\r
398         };\r
399 \r
400         $scope.getPermitted = function (item) {\r
401             return item.isPermitted || item[FIELD.ID.IS_PERMITTED];\r
402 \r
403         };\r
404 \r
405 \r
406         $scope.getSubDetails = function () {\r
407 \r
408             $scope.init();\r
409             //$scope.selectedSubscriber = $location.search().selectedSubscriber;\r
410             // $scope.selectedServiceInstance = $location.search().selectedServiceInstance;\r
411             $scope.status = FIELD.STATUS.FETCHING_SUB_DETAILS + $scope.selectedSubscriber;\r
412             var query = $location.url().replace($location.path(),'');\r
413 \r
414             $scope.displayData = [];\r
415             AaiService.searchServiceInstances(query).then(function (response) {\r
416                 $scope.displayData = response.displayData;\r
417                 if (response.displayData.length)\r
418                 {\r
419                     var first = response.displayData[0];\r
420                     $scope.selectedSubscriberId = first.globalCustomerId;\r
421                     $scope.selectedSubscriberName = first.subscriberName;\r
422                 }\r
423                 $scope.viewPerPage = 10;\r
424                 $scope.totalPage = $scope.displayData.length / $scope.viewPerPage;\r
425                 $scope.scrollViewPerPage = 2;\r
426                 $scope.currentPage = 1;\r
427                 $scope.searchCategory;\r
428                 $scope.searchString = "";\r
429                 $scope.currentPageNum = 1;\r
430                 $scope.defaultSort = COMPONENT.SUBSCRIBER_NAME;\r
431                 $scope.setProgress(100); // done\r
432                 $scope.status = FIELD.STATUS.DONE;\r
433                 $scope.isSpinnerVisible = false;\r
434 \r
435             }).catch(function (response) {\r
436                 $scope.showError(FIELD.ERROR.AAI);\r
437                 $scope.errorMsg = FIELD.ERROR.AAI_FETCHING_CUST_DATA + response.status;\r
438                 $scope.errorDetails = response.data;\r
439             });\r
440         };\r
441 \r
442 \r
443         $scope.$on(COMPONENT.MSO_DELETE_REQ, function (event, request) {\r
444             // $log.debug("deleteInstance: request:");\r
445             // $log.debug(request);\r
446             $scope.init();\r
447 \r
448             $http.post($scope.baseUrl + request.url, {\r
449                 requestDetails: request.requestDetails\r
450             }, {\r
451                 timeout: $scope.responseTimeoutMsec\r
452             }).then($scope.handleInitialResponse)\r
453                 ["catch"]($scope.handleServerError);\r
454         });\r
455 \r
456         $scope.init = function () {\r
457             //PropertyService.setAaiBaseUrl("testaai");\r
458             //PropertyService.setAsdcBaseUrl("testasdc");\r
459 \r
460             // takes a default value, retrieves the prop value from the file system and sets it\r
461             var msecs = PropertyService.retrieveMsoMaxPollingIntervalMsec();\r
462             PropertyService.setMsoMaxPollingIntervalMsec(msecs);\r
463 \r
464             // takes a default value, retrieves the prop value from the file system and sets it\r
465             var polls = PropertyService.retrieveMsoMaxPolls();\r
466             PropertyService.setMsoMaxPolls(polls);\r
467 \r
468             /*\r
469              * Common parameters that would typically be set when the page is\r
470              * displayed for a specific service instance id.\r
471              */\r
472 \r
473             $scope.baseUrl = $scope.defaultBaseUrl;\r
474 \r
475             $scope.isSpinnerVisible = true;\r
476             $scope.isProgressVisible = true;\r
477             $scope.isPopupVisible = true;\r
478             $scope.requestId = "";\r
479             $scope.error = "";\r
480             $scope.pollAttempts = 0;\r
481             $scope.log = "";\r
482             $scope.enableCloseButton(false);\r
483             $scope.resetProgress();\r
484             $scope.setProgress(2); // Show "a little" progress\r
485         };\r
486 \r
487         function getRelatedInstanceGroupsByVnfId(genericVnf) {\r
488             var model = vidService.getModel();\r
489             if (model && model.vnfs && !_.isEmpty(model.vnfs)) {\r
490                 Object.keys(model.vnfs).forEach(function (key) {\r
491                     var vnf = model.vnfs[key];\r
492                     if (vnf.vfcInstanceGroups && !_.isEmpty(vnf.vfcInstanceGroups) && vnf.uuid === genericVnf.modelVersionId) {\r
493                             AaiService.getInstanceGroupsByVNFInstanceId(genericVnf.nodeId,\r
494                                 function (response) { //success\r
495                                     handleGetRelatedInstanceGroupsResponseForVnf(response, genericVnf);\r
496                                 },\r
497                                 function (response) { //failure\r
498                                     $scope.showError(FIELD.ERROR.AAI);\r
499                                     $scope.errorMsg = FIELD.ERROR.FETCHING_SERVICE_INSTANCE_DATA + response.status;\r
500                                     $scope.errorDetails = response.data;\r
501                                 }\r
502                             )\r
503                         }\r
504                 });\r
505             }\r
506         }\r
507 \r
508         function resolveModelDataIfMissing(modelVersionId) {\r
509             var model = vidService.getModel();\r
510             if (model && model.service && model.service.uuid === modelVersionId) {\r
511                 return $q.resolve(); // no need to resolve anything\r
512             } else {\r
513                 // resolve model and value of isPermitted\r
514                 return resolveIfIsPermitted()\r
515                     .then(function() {\r
516                         return getAsdcModelByVersionId(modelVersionId);\r
517                     });\r
518             }\r
519         }\r
520 \r
521         function resolveIfIsPermitted() {\r
522             var deferred = $q.defer();\r
523             AaiService.searchServiceInstances(\r
524                 '?subscriberId=' + $location.search().subscriberId +\r
525                 '&serviceInstanceIdentifier=' + $location.search().serviceInstanceId + '&serviceInstanceIdentifierType=Service Instance Id')\r
526                 .then(function (response) {\r
527                     if (response.displayData && response.displayData.length) {\r
528                         var first = response.displayData[0];\r
529                         $scope.isPermitted = first.isPermitted;\r
530                         deferred.resolve(first.isPermitted);\r
531                     } else {\r
532                         deferred.reject("some error while resolveIfIsPermitted");\r
533                     }\r
534                 });\r
535 \r
536             return deferred.promise;\r
537         }\r
538 \r
539         var serviceNetworkVlans = [];\r
540         var vnfNetworksAndVlans = [];\r
541 \r
542         function fetchServiceIfMissing() {\r
543             if (_.isEmpty(DataService.getServiceIdList())) {\r
544                 $scope.fetchServices();\r
545             }\r
546         }\r
547 \r
548         $scope.getComponentList = function (event, request) {\r
549 \r
550             $scope.isSpinnerVisible = true;\r
551             $scope.isProgressVisible = true;\r
552             $scope.isPopupVisible = true;\r
553             $scope.requestId = "";\r
554             $scope.error = "";\r
555             $scope.pollAttempts = 0;\r
556             $scope.log = "";\r
557 \r
558             $scope.resetProgress();\r
559             $scope.setProgress(2); // Show "a little" progress\r
560 \r
561             $scope.globalCustomerId = $location.search().subscriberId;\r
562             $scope.serviceType = $location.search().serviceType;\r
563             $scope.serviceInstanceId = $location.search().serviceInstanceId;\r
564             $scope.subscriberName = $location.search().subscriberName;\r
565 \r
566             //$scope.getAsdcModel($location.search().modelUuid);\r
567 \r
568             //make sure view/edit don't open new deploy service popup\r
569             DataService.setShouldIncludeInAsyncInstantiationFlow(false);\r
570 \r
571             return getModelVersionIdForServiceInstance({\r
572                 globalCustomerId: $location.search().subscriberId,\r
573                 serviceInstanceId: $location.search().serviceInstanceId,\r
574                 aaiModelVersionId: $location.search().aaiModelVersionId\r
575             })\r
576                 .then(resolveModelDataIfMissing)\r
577                 .then($scope.prepareScopeWithModel)\r
578                 .then(fetchServiceIfMissing)\r
579                 .then(function () {\r
580                     return AaiService.getVlansByNetworksMapping($scope.globalCustomerId, $scope.serviceType, $scope.serviceInstanceId, $scope.service.model.service.uuid);\r
581                 })\r
582                 .then(function (vlanByNetwork) {\r
583                     serviceNetworkVlans = vlanByNetwork.serviceNetworks ? vlanByNetwork.serviceNetworks : [];\r
584                     vnfNetworksAndVlans =  vlanByNetwork.vnfNetworks ? vlanByNetwork.vnfNetworks : [];\r
585                     $log.debug('vlanByNetwork', vlanByNetwork);\r
586                     $scope.namedQueryId = VIDCONFIGURATION.COMPONENT_LIST_NAMED_QUERY_ID;\r
587                     $scope.status = FIELD.STATUS.FETCHING_SERVICE_INST_DATA + $scope.serviceInstanceId;\r
588 \r
589                     $scope.hasFabricConfigurations = !UtilityService.isObjectEmpty($scope.service.model.fabricConfigurations);\r
590                     return AaiService.runNamedQuery($scope.namedQueryId, $scope.globalCustomerId, $scope.serviceType, $scope.serviceInstanceId,\r
591                         function (response) { //success\r
592                             try {\r
593                                 $log.debug("Getting inventory reponse items from Named Query with AAI query optimization - Before ");\r
594                                 $scope.handleInitialResponseInventoryItemsOptimized(response);\r
595                                 $log.debug("Getting inventory reponse items from Named Query with AAI query optimization - After ");\r
596                             }catch (error) {\r
597                                 $log.error("Exception: Fallback to original method of getting subscriber name and SI orch status.");\r
598                                 $scope.handleInitialResponseInventoryItems(response);\r
599                             }\r
600                             $scope.setProgress(100); // done\r
601                             $scope.status = FIELD.STATUS.DONE;\r
602                             $scope.isSpinnerVisible = false;\r
603                             //TODO\r
604                         },\r
605                         function (response) { //failure\r
606                             $scope.showError(FIELD.ERROR.AAI);\r
607                             $scope.errorMsg = FIELD.ERROR.FETCHING_SERVICE_INSTANCE_DATA + response.status;\r
608                             $scope.errorDetails = response.data;\r
609                         }\r
610                     );\r
611                 });\r
612         };\r
613 \r
614         $scope.handleServerError = function (response, status) {\r
615             alert(response.statusText);\r
616         };\r
617 \r
618         function handleGetRelatedInstanceGroupsResponseForVnf(response, genericVnf) {\r
619             _.forEach(response.data, function (instanceGroup) {\r
620                 var newInstanceGroup = {\r
621                     name: instanceGroup.name,\r
622                     type: instanceGroup.type\r
623                 };\r
624                 genericVnf.instanceGroups.push(newInstanceGroup);\r
625             });\r
626         }\r
627 \r
628 \r
629 \r
630         function getModelVersionIdForServiceInstance(instance) {\r
631             if (UtilityService.hasContents(instance.aaiModelVersionId)) {\r
632                 return $q.resolve(instance.aaiModelVersionId);\r
633             } else if ($scope.modelVersionIdForServiceInstance\r
634                 && $scope.modelVersionIdForServiceInstance.globalCustomerId === instance.globalCustomerId\r
635                 && $scope.modelVersionIdForServiceInstance.serviceInstanceId === instance.serviceInstanceId\r
636             ) {\r
637                 return $q.resolve($scope.modelVersionIdForServiceInstance.aaiModelVersionId);\r
638             } else {\r
639                 $scope.status = FIELD.STATUS.FETCHING_SERVICE_INST_DATA + $scope.serviceInstanceId;\r
640                 return AaiService.getModelVersionId(instance.globalCustomerId, instance.serviceInstanceId, 'Service Instance Id')\r
641                     .then(function (aaiModelVersionId) {\r
642                         $scope.modelVersionIdForServiceInstance = {\r
643                             globalCustomerId: instance.globalCustomerId,\r
644                             serviceInstanceId: instance.serviceInstanceId,\r
645                             aaiModelVersionId: aaiModelVersionId\r
646                         };\r
647                         return $q.resolve(aaiModelVersionId);\r
648                     });\r
649             }\r
650         }\r
651 \r
652         $scope.onViewEditClick = function (disData) {\r
653             $log.debug("disData", disData, null, 4);\r
654 \r
655             getModelVersionIdForServiceInstance(disData)\r
656                 .then(getAsdcModelByVersionId, handleErrorGettingModelVersion)\r
657                 .then(navigateToViewEditPage);\r
658 \r
659 \r
660             function navigateToViewEditPage() {\r
661                 window.location.href = AsdcService.shouldTakeTheDrawingBoardViewEdit(vidService.getModel()) ?\r
662                     drawingBoardViewEditUrl() : oldViewEditUrl();\r
663             }\r
664 \r
665             function oldViewEditUrl() {\r
666                 return COMPONENT.INSTANTIATE_ROOT_PATH + disData.globalCustomerId +\r
667                     COMPONENT.SUBSCRIBERNAME_SUB_PATH + disData.subscriberName +\r
668                     COMPONENT.SERVICETYPE_SUB_PATH + disData.serviceType +\r
669                     COMPONENT.SERVICEINSTANCEID_SUB_PATH + disData.serviceInstanceId +\r
670                     COMPONENT.MODELVERSIONID_SUB_PATH + disData.aaiModelVersionId +\r
671                     COMPONENT.IS_PERMITTED_SUB_PATH + disData.isPermitted;\r
672             }\r
673 \r
674             function drawingBoardViewEditUrl() {\r
675                 return 'serviceModels.htm#/servicePlanning/EDIT?' +\r
676                 'serviceModelId=' +     disData.aaiModelVersionId +\r
677                 '&subscriberId=' +      disData.globalCustomerId  +\r
678                 '&serviceType=' +       disData.serviceType      +\r
679                 '&serviceInstanceId=' + disData.serviceInstanceId;\r
680             }\r
681         };\r
682 \r
683         function handleErrorGettingModelVersion(err) {\r
684             $log.error("aaiSubscriber getModelVersionIdForServiceInstance - " + err);\r
685             $scope.errorMsg = err;\r
686             alert($scope.errorMsg);\r
687             return $q.reject();\r
688         }\r
689 \r
690         function getAsdcModelByVersionId(aaiModelVersionId) {\r
691             // aaiModelVersionId is the model uuid\r
692             var pathQuery = COMPONENT.SERVICES_PATH + aaiModelVersionId;\r
693             return $http({\r
694                 method: 'GET',\r
695                 url: pathQuery\r
696             }).then(function (response) {\r
697                 if (response.headers()['content-type'].includes('json')) {\r
698                     vidService.setModel(response.data);\r
699                     console.log("aaiSubscriber getAsdcModel DONE!!!!");\r
700                 } else {\r
701                     // the response is erroneous\r
702                     console.log("aaiSubscriber getAsdcModel BAD RESPONSE");\r
703                     errorCallback(response);\r
704                     return $q.reject();\r
705                 }\r
706             }, errorCallback);\r
707 \r
708             function errorCallback(response) {\r
709                 $log.error("aaiSubscriber getAsdcModel - " + FIELD.ERROR.NO_MATCHING_MODEL_AAI + aaiModelVersionId);\r
710                 $scope.errorMsg = FIELD.ERROR.NO_MATCHING_MODEL_AAI + aaiModelVersionId;\r
711                 alert($scope.errorMsg);\r
712             }\r
713         }\r
714 \r
715         function returnMatchingServiceSubscription(serviceSubs, serviceId){\r
716             var orchStatus;\r
717             serviceSubs.forEach(function(item){\r
718                 if (item[FIELD.ID.SERVICE_INSTANCES] != null) {\r
719                     item[FIELD.ID.SERVICE_INSTANCES][FIELD.ID.SERVICE_INSTANCE].forEach(function (service) {\r
720                         if (service[FIELD.ID.SERVICE_INSTANCE_ID] === serviceId) {\r
721                             orchStatus = service['orchestration-status'];\r
722                         }\r
723                     });\r
724                 }\r
725             });\r
726             return orchStatus;\r
727         }\r
728 \r
729         $scope.getTenants = function (globalCustomerId) {\r
730             $http.get(FIELD.ID.AAI_GET_TENTANTS + globalCustomerId)\r
731                 .then(function (response) {\r
732                     return response.data;\r
733                     //$location.path("/instantiate");\r
734                 }, function (response) {\r
735                     //TODO\r
736                 });\r
737         };\r
738 \r
739         $scope.isConfigurationDataAvailiable = function (configuration) {\r
740             $log.debug(configuration);\r
741             return configuration.configData && (!configuration.configData.errorDescription);\r
742         };\r
743 \r
744         $scope.allowConfigurationActions = function (configuration) {\r
745             $log.debug(configuration);\r
746             return configuration.nodeStatus &&\r
747                 _.some(\r
748                     [FIELD.STATUS.AAI_ACTIVE, FIELD.STATUS.AAI_INACTIVE, FIELD.STATUS.AAI_CREATED],\r
749                     function (s) {\r
750                         return s.toLowerCase() === configuration.nodeStatus.toLowerCase();\r
751                     });\r
752         };\r
753 \r
754         $scope.isActivateDeactivateEnabled = function(btnType) {\r
755             if ($scope.serviceOrchestrationStatus) {\r
756                 var status = $scope.serviceOrchestrationStatus.toLowerCase();\r
757                 switch (btnType) {\r
758                     case "activate":\r
759                         return _.includes(COMPONENT.ACTIVATE_SERVICE_STATUSES, status);\r
760                         break;\r
761                     case "deactivate":\r
762                         return status === 'active';\r
763                         break;\r
764                 }\r
765             }\r
766 \r
767             return false;\r
768         };\r
769 \r
770         $scope.isShowVerifyService = function () {\r
771             return featureFlags.isOn(COMPONENT.FEATURE_FLAGS.FLAG_SHOW_VERIFY_SERVICE);\r
772         }\r
773 \r
774         $scope.isShowErrorReport = function() {\r
775             return featureFlags.isOn(COMPONENT.FEATURE_FLAGS.FLAG_CREATE_ERROR_REPORTS);\r
776         }\r
777 \r
778         $scope.isEnableVerifyService = function () {\r
779             //Button should only be enabled when the service type is A la carte\r
780             if (DataService.getALaCarte()) {\r
781                 return $scope.verifyButtonEnabled;\r
782             }\r
783             return false;\r
784         };\r
785 \r
786         $scope.activateVerifyService = function () {\r
787             $scope.verifyButtonEnabled = false;\r
788             let url = COMPONENT.VERIFY_SERVICE_URL;\r
789 \r
790             let config = {\r
791                 headers: {\r
792                     'Content-Type': 'application/json'\r
793                 }\r
794             };\r
795 \r
796             let data = {\r
797                 "serviceInstanceList": [\r
798                     {\r
799                         "serviceInstanceId": $scope.serviceInstanceId,\r
800                         "modelVersionId": $scope.service.model.service.uuid,\r
801                         "modelInvariantId": $scope.service.model.service.invariantUuid,\r
802                         "customerId": $scope.globalCustomerId,\r
803                         "serviceType": $scope.service.instance.serviceType,\r
804                     }\r
805                 ]\r
806             };\r
807             AaiService.postPOMBAverificationRequest(url, data, config);\r
808 \r
809         };\r
810 \r
811         $scope.isShowAssignmentsEnabled = function () {\r
812             if (featureFlags.isOn(COMPONENT.FEATURE_FLAGS.FLAG_SHOW_ASSIGNMENTS) && $scope.serviceOrchestrationStatus) {\r
813                     return $scope.serviceOrchestrationStatus.toLowerCase() === 'assigned';\r
814                 }\r
815             return false;\r
816         };\r
817 \r
818         $scope.isActivateFabricConfiguration = function () {\r
819 \r
820             if (featureFlags.isOn(COMPONENT.FEATURE_FLAGS.FLAG_FABRIC_CONFIGURATION_ASSIGNMENTS) && $scope.hasFabricConfigurations) {\r
821                 if ($scope.serviceOrchestrationStatus) {\r
822                     return $scope.serviceOrchestrationStatus.toLowerCase() === 'assigned';\r
823                 }\r
824             }\r
825             return false;\r
826         };\r
827 \r
828         $scope.isResumeShown = function (status) {\r
829             var vfModuleStatus = status.toLowerCase();\r
830             var vfModuleStatusHasAllowedResume = ['pendingactivation', 'assigned'];\r
831             if (featureFlags.isOn(COMPONENT.FEATURE_FLAGS.FLAG_VF_MODULE_RESUME_STATUS_CREATE)) {\r
832                 vfModuleStatusHasAllowedResume.push('created');\r
833             }\r
834             return _.includes(vfModuleStatusHasAllowedResume, vfModuleStatus) && !$scope.isActivateDeactivateEnabled("activate");\r
835         };\r
836 \r
837         $scope.handleInitialResponseInventoryItemsOptimized = function (response) {\r
838 \r
839             $scope.inventoryResponseItemList = response.data[FIELD.ID.INVENTORY_RESPONSE_ITEM]; // get data from json\r
840             $log.debug($scope.inventoryResponseItemList);\r
841 \r
842             $scope.displayData = [];\r
843             $scope.vnfs = [];\r
844 \r
845             $scope.counter = 100;\r
846 \r
847             $scope.subscriberName = $location.search().subscriberName;\r
848 \r
849             $scope.allConfigurationsAssigned = true;\r
850             // look up the subscriber name and service orchestration status from A&AI here...\r
851             AaiService.getSubscriberNameAndServiceInstanceInfo( $scope.globalCustomerId,\r
852                 $scope.serviceInstanceId,\r
853                 'Service Instance Id',$scope.subscriberName, function (response) {\r
854                     $scope.subscriberName = response['subscriberName'];\r
855                     DataService.setSubscriberName($scope.subscriberName);\r
856                     $scope.serviceOrchestrationStatus = response['orchestrationStatus'];\r
857                     if ($scope.serviceOrchestrationStatus.toLowerCase() !== FIELD.STATUS.ASSIGNED.toLowerCase()) {\r
858                         $scope.allConfigurationsAssigned = false;\r
859                     }\r
860                     angular.forEach($scope.inventoryResponseItemList, function (inventoryResponseItem, key) {\r
861 \r
862                         $scope.inventoryResponseItem = inventoryResponseItem;\r
863 \r
864                         $scope.service.instance = {\r
865                             "name": $scope.inventoryResponseItem[FIELD.ID.SERVICE_INSTANCE][FIELD.ID.SERVICE_INSTANCE_NAME],\r
866                             "serviceInstanceId": $scope.serviceInstanceId,\r
867                             "serviceType": $scope.serviceType,\r
868                             "globalCustomerId": $scope.globalCustomerId,\r
869                             "subscriberName": $scope.subscriberName,\r
870                             "id": $scope.serviceInstanceId,\r
871                             "inputs": {\r
872                                 "a": {\r
873                                     "type": PARAMETER.STRING,\r
874                                     "description": FIELD.PROMPT.VAR_DESCRIPTION_A,\r
875                                     "default": FIELD.PROMPT.DEFAULT_A\r
876                                 },\r
877                                 "b": {\r
878                                     "type": PARAMETER.STRING,\r
879                                     "description": FIELD.PROMPT.VAR_DESCRIPTION_B,\r
880                                     "default": FIELD.PROMPT.DEFAULT_B\r
881                                 }\r
882                             },\r
883                             "object": $scope.inventoryResponseItem[FIELD.ID.SERVICE_INSTANCE],\r
884                             "vnfs": [],\r
885                             "networks": [],\r
886                             "configurations": []\r
887                         };\r
888 \r
889                         var portMirroringConfigurationIds = [];\r
890                         if (inventoryResponseItem[FIELD.ID.INVENTORY_RESPONSE_ITEMS] != null) {\r
891 \r
892                             angular.forEach(inventoryResponseItem[FIELD.ID.INVENTORY_RESPONSE_ITEMS][FIELD.ID.INVENTORY_RESPONSE_ITEM], function (subInventoryResponseItem, key) {\r
893                                 // i expect to find vnfs now\r
894 \r
895                                 if (subInventoryResponseItem[FIELD.ID.L3_NETWORK] != null) {\r
896                                     var l3NetworkObject = subInventoryResponseItem[FIELD.ID.L3_NETWORK];\r
897                                     var l3Network = {\r
898                                         "id": $scope.counter++,\r
899                                         "name": l3NetworkObject[FIELD.ID.NETWORK_NAME],\r
900                                         "itemType": FIELD.ID.L3_NETWORK,\r
901                                         "nodeId": l3NetworkObject[FIELD.ID.NETWORK_ID],\r
902                                         "nodeType": l3NetworkObject[FIELD.ID.NETWORK_TYPE],\r
903                                         "nodeStatus": l3NetworkObject[FIELD.ID.ORCHESTRATION_STATUS],\r
904                                         "object": l3NetworkObject,\r
905                                         "nodes": [],\r
906                                         "subnets": [],\r
907                                         "vlans": []\r
908                                     };\r
909                                     if (subInventoryResponseItem[FIELD.ID.INVENTORY_RESPONSE_ITEMS] != null) {\r
910                                         //console.log ("subInventoryResponseItem[FIELD.ID.INVENTORY_RESPONSE_ITEMS]=");\r
911                                         //console.log (JSON.stringify (subInventoryResponseItem[FIELD.ID.INVENTORY_RESPONSE_ITEMS], null, 4 ));\r
912                                         angular.forEach(subInventoryResponseItem[FIELD.ID.INVENTORY_RESPONSE_ITEMS][FIELD.ID.INVENTORY_RESPONSE_ITEM], function (subSubInventoryResponseItem, key) {\r
913                                             //console.log (JSON.stringify (subSubInventoryResponseItem, null, 4 ));\r
914                                             var subnet = {};\r
915                                             var subnetObject;\r
916                                             if (subSubInventoryResponseItem[FIELD.ID.SUB_NET] != null) {\r
917                                                 subnetObject = subSubInventoryResponseItem[FIELD.ID.SUB_NET];\r
918                                                 subnet = {\r
919                                                     "subnet-id": subnetObject[FIELD.ID.SUBNET_ID],\r
920                                                     "subnet-name": subnetObject[FIELD.ID.SUBNET_NAME],\r
921                                                     "gateway-address": subnetObject[FIELD.ID.GATEWAY_ADDRESS],\r
922                                                     "network-start-address": subnetObject[FIELD.ID.NETWORK_START_ADDRESS],\r
923                                                     "cidr-mask": subnetObject[FIELD.ID.CIDR_MASK]\r
924                                                 };\r
925                                                 l3Network.subnets.push(subnet);\r
926                                             }\r
927                                         });\r
928                                     }\r
929 \r
930 \r
931                                     var networkObj = _.find(serviceNetworkVlans, { 'networkId': l3Network.nodeId});\r
932                                     if (networkObj !== undefined && networkObj.vlans !== undefined) {\r
933                                         l3Network["vlans"] = networkObj.vlans;\r
934                                     }\r
935                                     $scope.service.instance[FIELD.ID.NETWORKS].push(l3Network);\r
936                                 }\r
937 \r
938                                 if (subInventoryResponseItem[FIELD.ID.GENERIC_VNF] != null) {\r
939                                     var genericVnfObject = subInventoryResponseItem[FIELD.ID.GENERIC_VNF];\r
940 \r
941                                     var genericVnf = {\r
942                                         "name": genericVnfObject[FIELD.ID.VNF_NAME],\r
943                                         "id": $scope.counter++,\r
944                                         "itemType": COMPONENT.VNF,\r
945                                         "nodeType": genericVnfObject[FIELD.ID.VNF_TYPE],\r
946                                         "nodeId": genericVnfObject[FIELD.ID.VNF_ID],\r
947                                         "nodeStatus": genericVnfObject[FIELD.ID.ORCHESTRATION_STATUS],\r
948                                         "modelVersionId" : genericVnfObject[FIELD.ID.MODEL_VERSION_ID],\r
949                                         "object": genericVnfObject,\r
950                                         "vfModules": [],\r
951                                         "volumeGroups": [],\r
952                                         "instanceGroups": [],\r
953                                         "availableVolumeGroups": [],\r
954                                         "networks": []\r
955                                     };\r
956 \r
957                                     var vnfNetworkObj = _.find(vnfNetworksAndVlans, { 'vnfId': genericVnf.nodeId});\r
958                                     if (vnfNetworkObj !== undefined && vnfNetworkObj.networks !== undefined) {\r
959                                         genericVnf["networks"] = vnfNetworkObj.networks;\r
960                                     }\r
961 \r
962                                     $scope.service.instance[FIELD.ID.VNFS].push(genericVnf);\r
963                                     getRelatedInstanceGroupsByVnfId(genericVnf);\r
964 \r
965 \r
966 \r
967                                     // look for volume-groups\r
968                                     if (subInventoryResponseItem[FIELD.ID.INVENTORY_RESPONSE_ITEMS] != null) {\r
969                                         angular.forEach(subInventoryResponseItem[FIELD.ID.INVENTORY_RESPONSE_ITEMS][FIELD.ID.INVENTORY_RESPONSE_ITEM], function (vfmodules, key) {\r
970 \r
971                                             if (vfmodules[FIELD.ID.VOLUME_GROUP] != null) {\r
972                                                 var volumeGroupObject = vfmodules[FIELD.ID.VOLUME_GROUP];\r
973                                                 var volumeGroup = {\r
974                                                     "id": $scope.counter++,\r
975                                                     "name": volumeGroupObject[FIELD.ID.VOLUME_GROUP_NAME],\r
976                                                     "itemType": FIELD.ID.VOLUME_GROUP,\r
977                                                     "nodeId": volumeGroupObject[FIELD.ID.VOLUME_GROUP_ID],\r
978                                                     "nodeType": volumeGroupObject[FIELD.ID.VNF_TYPE],\r
979                                                     "nodeStatus": volumeGroupObject[FIELD.ID.ORCHESTRATION_STATUS],\r
980                                                     "object": volumeGroupObject,\r
981                                                     "nodes": []\r
982                                                 };\r
983                                                 genericVnf[FIELD.ID.VOLUMEGROUPS].push(volumeGroup);\r
984                                                 genericVnf[FIELD.ID.AVAILABLEVOLUMEGROUPS].push(volumeGroup);\r
985                                             }\r
986                                         });\r
987                                     }\r
988                                     // now we've loaded up the availableVolumeGroups, we can use it\r
989                                     if (subInventoryResponseItem[FIELD.ID.INVENTORY_RESPONSE_ITEMS] != null) {\r
990                                         angular.forEach(subInventoryResponseItem[FIELD.ID.INVENTORY_RESPONSE_ITEMS][FIELD.ID.INVENTORY_RESPONSE_ITEM], function (vfmodules, key) {\r
991 \r
992                                             if (vfmodules[FIELD.ID.VF_MODULE] != null) {\r
993                                                 var vfModuleObject = vfmodules[FIELD.ID.VF_MODULE];\r
994                                                 var vfModule = {\r
995                                                     "id": $scope.counter++,\r
996                                                     "name": vfModuleObject[FIELD.ID.VF_MODULE_NAME],\r
997                                                     "itemType": FIELD.ID.VF_MODULE,\r
998                                                     "nodeType": FIELD.ID.VF_MODULE,\r
999                                                     "nodeStatus": vfModuleObject[FIELD.ID.ORCHESTRATION_STATUS],\r
1000                                                     "volumeGroups": [],\r
1001                                                     "object": vfModuleObject,\r
1002                                                     "networks": []\r
1003                                                 };\r
1004                                                 genericVnf[FIELD.ID.VF_MODULES].push(vfModule);\r
1005                                                 if (vfmodules[FIELD.ID.INVENTORY_RESPONSE_ITEMS] != null) {\r
1006                                                     angular.forEach(vfmodules[FIELD.ID.INVENTORY_RESPONSE_ITEMS][FIELD.ID.INVENTORY_RESPONSE_ITEM], function (networks, key) {\r
1007                                                         if (networks[FIELD.ID.L3_NETWORK] != null) {\r
1008                                                             var l3NetworkObject = networks[FIELD.ID.L3_NETWORK];\r
1009                                                             var l3Network = {\r
1010                                                                 "id": $scope.counter++,\r
1011                                                                 "name": l3NetworkObject[FIELD.ID.NETWORK_NAME],\r
1012                                                                 "itemType": FIELD.ID.L3_NETWORK,\r
1013                                                                 "nodeId": l3NetworkObject[FIELD.ID.NETWORK_ID],\r
1014                                                                 "nodeType": l3NetworkObject[FIELD.ID.NETWORK_TYPE],\r
1015                                                                 "nodeStatus": l3NetworkObject[FIELD.ID.ORCHESTRATION_STATUS],\r
1016                                                                 "object": l3NetworkObject,\r
1017                                                                 "nodes": []\r
1018                                                             };\r
1019                                                             vfModule[FIELD.ID.NETWORKS].push(l3Network);\r
1020                                                         }\r
1021                                                         if (networks[FIELD.ID.VOLUME_GROUP] != null) {\r
1022                                                             var volumeGroupObject = networks[FIELD.ID.VOLUME_GROUP];\r
1023 \r
1024                                                             var volumeGroup = {\r
1025                                                                 "id": $scope.counter++,\r
1026                                                                 "name": volumeGroupObject[FIELD.ID.VOLUME_GROUP_NAME],\r
1027                                                                 "itemType": FIELD.ID.VOLUME_GROUP,\r
1028                                                                 "nodeId": volumeGroupObject[FIELD.ID.VOLUME_GROUP_ID],\r
1029                                                                 "nodeType": volumeGroupObject[FIELD.ID.VNF_TYPE],\r
1030                                                                 "nodeStatus": volumeGroupObject[FIELD.ID.ORCHESTRATION_STATUS],\r
1031                                                                 "object": volumeGroupObject,\r
1032                                                                 "nodes": []\r
1033                                                             };\r
1034                                                             var tmpVolGroup = [];\r
1035 \r
1036                                                             angular.forEach(genericVnf[FIELD.ID.AVAILABLEVOLUMEGROUPS], function (avgroup, key) {\r
1037                                                                 if (avgroup.name != volumeGroup.name) {\r
1038                                                                     tmpVolGroup.push(avgroup);\r
1039                                                                 }\r
1040                                                             });\r
1041 \r
1042                                                             genericVnf[FIELD.ID.AVAILABLEVOLUMEGROUPS] = tmpVolGroup;\r
1043 \r
1044                                                             vfModule[FIELD.ID.VOLUMEGROUPS].push(volumeGroup);\r
1045                                                         }\r
1046 \r
1047                                                     });\r
1048                                                 }\r
1049                                             }\r
1050                                         });\r
1051                                     }\r
1052                                 }\r
1053 \r
1054 \r
1055                                 if (subInventoryResponseItem[FIELD.ID.GENERIC_CONFIGURATION] != null) {\r
1056                                     var configObject = subInventoryResponseItem[FIELD.ID.GENERIC_CONFIGURATION];\r
1057                                     var config = {\r
1058                                         "id": $scope.counter++,\r
1059                                         "name": configObject[FIELD.ID.CONFIGURATION_NAME],\r
1060                                         "itemType": FIELD.ID.CONFIGURATION,\r
1061                                         "nodeId": configObject[FIELD.ID.CONFIGURATION_ID],\r
1062                                         "nodeType": configObject[FIELD.ID.CONFIGURATION_TYPE],\r
1063                                         "nodeStatus": configObject[FIELD.ID.ORCHESTRATION_STATUS],\r
1064                                         "modelInvariantId": configObject[FIELD.ID.MODEL_INVAR_ID],\r
1065                                         "modelVersionId": configObject[FIELD.ID.MODEL_VERSION_ID],\r
1066                                         "modelCustomizationId": configObject[FIELD.ID.MODEL_CUSTOMIZATION_ID],\r
1067                                         "object": configObject,\r
1068                                         "ports": [],\r
1069                                         "configData" : null\r
1070                                     };\r
1071                                     if( !$scope.hasFabricConfigurations ) {\r
1072                                         portMirroringConfigurationIds.push(configObject[FIELD.ID.CONFIGURATION_ID]);\r
1073                                         $scope.service.instance[FIELD.ID.CONFIGURATIONS].push(config);\r
1074                                     } else {\r
1075                                         if (config.nodeStatus.toLowerCase() !== FIELD.STATUS.ASSIGNED.toLowerCase()) {\r
1076                                             $scope.allConfigurationsAssigned = false;\r
1077                                             if ($scope.isActivateFabricConfiguration()) {\r
1078                                                 $scope.errorMsg = "Activate fabric configuration button is not available as some of the configuration objects are not in Assigned status. Check MSO logs for the reasons for this abnormal case.";\r
1079                                             }\r
1080                                         }\r
1081                                     }\r
1082                                 }\r
1083 \r
1084                             });\r
1085 \r
1086                             AaiService.getPortMirroringData(portMirroringConfigurationIds).then(function(result){\r
1087                                 angular.forEach($scope.service.instance[FIELD.ID.CONFIGURATIONS], function(config){\r
1088                                     config['configData'] = result.data[config['nodeId']];\r
1089 \r
1090                                     if (config.configData && config.configData.errorDescription) {\r
1091                                         $scope.errorMsg = ($scope.errorMsg ? $scope.errorMsg + "\n" : "") +\r
1092                                             "Cannot read cloud-region for configuration \"" + config.name + "\": " +\r
1093                                             config.configData.errorDescription;\r
1094                                     }\r
1095                                 });\r
1096                             });\r
1097 \r
1098                             AaiService.getPortMirroringSourcePorts(portMirroringConfigurationIds).then(function(result){\r
1099                                 angular.forEach($scope.service.instance[FIELD.ID.CONFIGURATIONS], function(config){\r
1100                                     angular.forEach(result.data[config['nodeId']], function(port){\r
1101                                         if (port.errorDescription) {\r
1102                                             $scope.errorMsg = ($scope.errorMsg ? $scope.errorMsg + "\n" : "") +\r
1103                                                 "Cannot read a source port for configuration \"" + config.name + "\": " +\r
1104                                                 port.errorDescription;\r
1105                                         } else {\r
1106                                             config.ports.push({\r
1107                                                 "portId": port[FIELD.ID.PORT_ID],\r
1108                                                 "portName": port[FIELD.ID.PORT_NAME],\r
1109                                                 "portStatus": port[FIELD.ID.PORT_MIRRORED] === true ? FIELD.STATUS.AAI_ENABLED : FIELD.STATUS.AAI_DISABLED\r
1110                                             });\r
1111                                         }\r
1112                                     });\r
1113                                 });\r
1114                             });\r
1115 \r
1116                         }\r
1117                     });\r
1118 \r
1119                     var aaiNetworkIds = _.map(serviceNetworkVlans, 'networkId');\r
1120                     var serviceInstanceNetworkIds = _.map($scope.service.instance[FIELD.ID.NETWORKS], 'nodeId');\r
1121                     var isContains = aaiNetworkIds.every(function(val) { return serviceInstanceNetworkIds.indexOf(val) >= 0; });\r
1122                     if (aaiNetworkIds.length && !isContains)  {\r
1123                         $log.error("vlansByNetworks contain network that not found in service instance", aaiNetworkIds, serviceInstanceNetworkIds);\r
1124                     }\r
1125 \r
1126                 });\r
1127         };\r
1128 \r
1129         $scope.handleInitialResponseInventoryItems = function (response) {\r
1130 \r
1131             $scope.inventoryResponseItemList = response.data[FIELD.ID.INVENTORY_RESPONSE_ITEM]; // get data from json\r
1132             $log.debug($scope.inventoryResponseItemList);\r
1133 \r
1134             $scope.displayData = [];\r
1135             $scope.vnfs = [];\r
1136 \r
1137             $scope.counter = 100;\r
1138 \r
1139             $scope.subscriberName = "";\r
1140 \r
1141             $scope.allConfigurationsAssigned = true;\r
1142             // just look up the subscriber name in A&AI here...\r
1143             AaiService.getSubscriberName($scope.globalCustomerId, function (response) {\r
1144                 $scope.subscriberName = response.subscriberName;\r
1145                 DataService.setSubscriberName($scope.subscriberName);\r
1146                 $scope.serviceOrchestrationStatus = returnMatchingServiceSubscription(response.serviceSubscriptions[FIELD.ID.SERVICE_SUBSCRIPTION], $scope.serviceInstanceId);\r
1147                 if ($scope.serviceOrchestrationStatus.toLowerCase() !== FIELD.STATUS.ASSIGNED.toLowerCase()) {\r
1148                     $scope.allConfigurationsAssigned = false;\r
1149                 }\r
1150                 angular.forEach($scope.inventoryResponseItemList, function (inventoryResponseItem, key) {\r
1151 \r
1152                     $scope.inventoryResponseItem = inventoryResponseItem;\r
1153 \r
1154                     $scope.service.instance = {\r
1155                         "name": $scope.inventoryResponseItem[FIELD.ID.SERVICE_INSTANCE][FIELD.ID.SERVICE_INSTANCE_NAME],\r
1156                         "serviceInstanceId": $scope.serviceInstanceId,\r
1157                         "serviceType": $scope.serviceType,\r
1158                         "globalCustomerId": $scope.globalCustomerId,\r
1159                         "subscriberName": $scope.subscriberName,\r
1160                         "id": $scope.serviceInstanceId,\r
1161                         "inputs": {\r
1162                             "a": {\r
1163                                 "type": PARAMETER.STRING,\r
1164                                 "description": FIELD.PROMPT.VAR_DESCRIPTION_A,\r
1165                                 "default": FIELD.PROMPT.DEFAULT_A\r
1166                             },\r
1167                             "b": {\r
1168                                 "type": PARAMETER.STRING,\r
1169                                 "description": FIELD.PROMPT.VAR_DESCRIPTION_B,\r
1170                                 "default": FIELD.PROMPT.DEFAULT_B\r
1171                             }\r
1172                         },\r
1173                         "object": $scope.inventoryResponseItem[FIELD.ID.SERVICE_INSTANCE],\r
1174                         "vnfs": [],\r
1175                         "networks": [],\r
1176                         "configurations": []\r
1177                     };\r
1178 \r
1179                     var portMirroringConfigurationIds = [];\r
1180                     if (inventoryResponseItem[FIELD.ID.INVENTORY_RESPONSE_ITEMS] != null) {\r
1181 \r
1182                         angular.forEach(inventoryResponseItem[FIELD.ID.INVENTORY_RESPONSE_ITEMS][FIELD.ID.INVENTORY_RESPONSE_ITEM], function (subInventoryResponseItem, key) {\r
1183                             // i expect to find vnfs now\r
1184 \r
1185                             if (subInventoryResponseItem[FIELD.ID.L3_NETWORK] != null) {\r
1186                                 var l3NetworkObject = subInventoryResponseItem[FIELD.ID.L3_NETWORK];\r
1187                                 var l3Network = {\r
1188                                     "id": $scope.counter++,\r
1189                                     "name": l3NetworkObject[FIELD.ID.NETWORK_NAME],\r
1190                                     "itemType": FIELD.ID.L3_NETWORK,\r
1191                                     "nodeId": l3NetworkObject[FIELD.ID.NETWORK_ID],\r
1192                                     "nodeType": l3NetworkObject[FIELD.ID.NETWORK_TYPE],\r
1193                                     "nodeStatus": l3NetworkObject[FIELD.ID.ORCHESTRATION_STATUS],\r
1194                                     "object": l3NetworkObject,\r
1195                                     "nodes": [],\r
1196                                     "subnets": [],\r
1197                                     "vlans": []\r
1198                                 };\r
1199                                 if (subInventoryResponseItem[FIELD.ID.INVENTORY_RESPONSE_ITEMS] != null) {\r
1200                                     //console.log ("subInventoryResponseItem[FIELD.ID.INVENTORY_RESPONSE_ITEMS]=");\r
1201                                     //console.log (JSON.stringify (subInventoryResponseItem[FIELD.ID.INVENTORY_RESPONSE_ITEMS], null, 4 ));\r
1202                                     angular.forEach(subInventoryResponseItem[FIELD.ID.INVENTORY_RESPONSE_ITEMS][FIELD.ID.INVENTORY_RESPONSE_ITEM], function (subSubInventoryResponseItem, key) {\r
1203                                         //console.log (JSON.stringify (subSubInventoryResponseItem, null, 4 ));\r
1204                                         var subnet = {};\r
1205                                         var subnetObject;\r
1206                                         if (subSubInventoryResponseItem[FIELD.ID.SUB_NET] != null) {\r
1207                                             subnetObject = subSubInventoryResponseItem[FIELD.ID.SUB_NET];\r
1208                                             subnet = {\r
1209                                                 "subnet-id": subnetObject[FIELD.ID.SUBNET_ID],\r
1210                                                 "subnet-name": subnetObject[FIELD.ID.SUBNET_NAME],\r
1211                                                 "gateway-address": subnetObject[FIELD.ID.GATEWAY_ADDRESS],\r
1212                                                 "network-start-address": subnetObject[FIELD.ID.NETWORK_START_ADDRESS],\r
1213                                                 "cidr-mask": subnetObject[FIELD.ID.CIDR_MASK]\r
1214                                             };\r
1215                                             l3Network.subnets.push(subnet);\r
1216                                         }\r
1217                                     });\r
1218                                 }\r
1219 \r
1220                                 \r
1221                                 var networkObj = _.find(serviceNetworkVlans, { 'networkId': l3Network.nodeId});\r
1222                                 if (networkObj !== undefined && networkObj.vlans !== undefined) {\r
1223                                     l3Network["vlans"] = networkObj.vlans;\r
1224                                 }\r
1225                                 $scope.service.instance[FIELD.ID.NETWORKS].push(l3Network);\r
1226                             }\r
1227 \r
1228                             if (subInventoryResponseItem[FIELD.ID.GENERIC_VNF] != null) {\r
1229                                 var genericVnfObject = subInventoryResponseItem[FIELD.ID.GENERIC_VNF];\r
1230 \r
1231                                 var genericVnf = {\r
1232                                     "name": genericVnfObject[FIELD.ID.VNF_NAME],\r
1233                                     "id": $scope.counter++,\r
1234                                     "itemType": COMPONENT.VNF,\r
1235                                     "nodeType": genericVnfObject[FIELD.ID.VNF_TYPE],\r
1236                                     "nodeId": genericVnfObject[FIELD.ID.VNF_ID],\r
1237                                     "nodeStatus": genericVnfObject[FIELD.ID.ORCHESTRATION_STATUS],\r
1238                                     "modelVersionId" : genericVnfObject[FIELD.ID.MODEL_VERSION_ID],\r
1239                                     "object": genericVnfObject,\r
1240                                     "vfModules": [],\r
1241                                     "volumeGroups": [],\r
1242                                     "instanceGroups": [],\r
1243                                     "availableVolumeGroups": [],\r
1244                                     "networks": []\r
1245                                 };\r
1246 \r
1247                                 var vnfNetworkObj = _.find(vnfNetworksAndVlans, { 'vnfId': genericVnf.nodeId});\r
1248                                 if (vnfNetworkObj !== undefined && vnfNetworkObj.networks !== undefined) {\r
1249                                     genericVnf["networks"] = vnfNetworkObj.networks;\r
1250                                 }\r
1251 \r
1252                                 $scope.service.instance[FIELD.ID.VNFS].push(genericVnf);\r
1253                                 getRelatedInstanceGroupsByVnfId(genericVnf);\r
1254 \r
1255 \r
1256 \r
1257                                 // look for volume-groups\r
1258                                 if (subInventoryResponseItem[FIELD.ID.INVENTORY_RESPONSE_ITEMS] != null) {\r
1259                                     angular.forEach(subInventoryResponseItem[FIELD.ID.INVENTORY_RESPONSE_ITEMS][FIELD.ID.INVENTORY_RESPONSE_ITEM], function (vfmodules, key) {\r
1260 \r
1261                                         if (vfmodules[FIELD.ID.VOLUME_GROUP] != null) {\r
1262                                             var volumeGroupObject = vfmodules[FIELD.ID.VOLUME_GROUP];\r
1263                                             var volumeGroup = {\r
1264                                                 "id": $scope.counter++,\r
1265                                                 "name": volumeGroupObject[FIELD.ID.VOLUME_GROUP_NAME],\r
1266                                                 "itemType": FIELD.ID.VOLUME_GROUP,\r
1267                                                 "nodeId": volumeGroupObject[FIELD.ID.VOLUME_GROUP_ID],\r
1268                                                 "nodeType": volumeGroupObject[FIELD.ID.VNF_TYPE],\r
1269                                                 "nodeStatus": volumeGroupObject[FIELD.ID.ORCHESTRATION_STATUS],\r
1270                                                 "object": volumeGroupObject,\r
1271                                                 "nodes": []\r
1272                                             };\r
1273                                             genericVnf[FIELD.ID.VOLUMEGROUPS].push(volumeGroup);\r
1274                                             genericVnf[FIELD.ID.AVAILABLEVOLUMEGROUPS].push(volumeGroup);\r
1275                                         }\r
1276                                     });\r
1277                                 }\r
1278                                 // now we've loaded up the availableVolumeGroups, we can use it\r
1279                                 if (subInventoryResponseItem[FIELD.ID.INVENTORY_RESPONSE_ITEMS] != null) {\r
1280                                     angular.forEach(subInventoryResponseItem[FIELD.ID.INVENTORY_RESPONSE_ITEMS][FIELD.ID.INVENTORY_RESPONSE_ITEM], function (vfmodules, key) {\r
1281 \r
1282                                         if (vfmodules[FIELD.ID.VF_MODULE] != null) {\r
1283                                             var vfModuleObject = vfmodules[FIELD.ID.VF_MODULE];\r
1284                                             var vfModule = {\r
1285                                                 "id": $scope.counter++,\r
1286                                                 "name": vfModuleObject[FIELD.ID.VF_MODULE_NAME],\r
1287                                                 "itemType": FIELD.ID.VF_MODULE,\r
1288                                                 "nodeType": FIELD.ID.VF_MODULE,\r
1289                                                 "nodeStatus": vfModuleObject[FIELD.ID.ORCHESTRATION_STATUS],\r
1290                                                 "volumeGroups": [],\r
1291                                                 "object": vfModuleObject,\r
1292                                                 "networks": []\r
1293                                             };\r
1294                                             genericVnf[FIELD.ID.VF_MODULES].push(vfModule);\r
1295                                             if (vfmodules[FIELD.ID.INVENTORY_RESPONSE_ITEMS] != null) {\r
1296                                                 angular.forEach(vfmodules[FIELD.ID.INVENTORY_RESPONSE_ITEMS][FIELD.ID.INVENTORY_RESPONSE_ITEM], function (networks, key) {\r
1297                                                     if (networks[FIELD.ID.L3_NETWORK] != null) {\r
1298                                                         var l3NetworkObject = networks[FIELD.ID.L3_NETWORK];\r
1299                                                         var l3Network = {\r
1300                                                             "id": $scope.counter++,\r
1301                                                             "name": l3NetworkObject[FIELD.ID.NETWORK_NAME],\r
1302                                                             "itemType": FIELD.ID.L3_NETWORK,\r
1303                                                             "nodeId": l3NetworkObject[FIELD.ID.NETWORK_ID],\r
1304                                                             "nodeType": l3NetworkObject[FIELD.ID.NETWORK_TYPE],\r
1305                                                             "nodeStatus": l3NetworkObject[FIELD.ID.ORCHESTRATION_STATUS],\r
1306                                                             "object": l3NetworkObject,\r
1307                                                             "nodes": []\r
1308                                                         };\r
1309                                                         vfModule[FIELD.ID.NETWORKS].push(l3Network);\r
1310                                                     }\r
1311                                                     if (networks[FIELD.ID.VOLUME_GROUP] != null) {\r
1312                                                         var volumeGroupObject = networks[FIELD.ID.VOLUME_GROUP];\r
1313 \r
1314                                                         var volumeGroup = {\r
1315                                                             "id": $scope.counter++,\r
1316                                                             "name": volumeGroupObject[FIELD.ID.VOLUME_GROUP_NAME],\r
1317                                                             "itemType": FIELD.ID.VOLUME_GROUP,\r
1318                                                             "nodeId": volumeGroupObject[FIELD.ID.VOLUME_GROUP_ID],\r
1319                                                             "nodeType": volumeGroupObject[FIELD.ID.VNF_TYPE],\r
1320                                                             "nodeStatus": volumeGroupObject[FIELD.ID.ORCHESTRATION_STATUS],\r
1321                                                             "object": volumeGroupObject,\r
1322                                                             "nodes": []\r
1323                                                         };\r
1324                                                         var tmpVolGroup = [];\r
1325 \r
1326                                                         angular.forEach(genericVnf[FIELD.ID.AVAILABLEVOLUMEGROUPS], function (avgroup, key) {\r
1327                                                             if (avgroup.name != volumeGroup.name) {\r
1328                                                                 tmpVolGroup.push(avgroup);\r
1329                                                             }\r
1330                                                         });\r
1331 \r
1332                                                         genericVnf[FIELD.ID.AVAILABLEVOLUMEGROUPS] = tmpVolGroup;\r
1333 \r
1334                                                         vfModule[FIELD.ID.VOLUMEGROUPS].push(volumeGroup);\r
1335                                                     }\r
1336 \r
1337                                                 });\r
1338                                             }\r
1339                                         }\r
1340                                     });\r
1341                                 }\r
1342                             }\r
1343 \r
1344 \r
1345                             if (subInventoryResponseItem[FIELD.ID.GENERIC_CONFIGURATION] != null) {\r
1346                                 var configObject = subInventoryResponseItem[FIELD.ID.GENERIC_CONFIGURATION];\r
1347                                 var config = {\r
1348                                     "id": $scope.counter++,\r
1349                                     "name": configObject[FIELD.ID.CONFIGURATION_NAME],\r
1350                                     "itemType": FIELD.ID.CONFIGURATION,\r
1351                                     "nodeId": configObject[FIELD.ID.CONFIGURATION_ID],\r
1352                                     "nodeType": configObject[FIELD.ID.CONFIGURATION_TYPE],\r
1353                                     "nodeStatus": configObject[FIELD.ID.ORCHESTRATION_STATUS],\r
1354                                     "modelInvariantId": configObject[FIELD.ID.MODEL_INVAR_ID],\r
1355                                     "modelVersionId": configObject[FIELD.ID.MODEL_VERSION_ID],\r
1356                                     "modelCustomizationId": configObject[FIELD.ID.MODEL_CUSTOMIZATION_ID],\r
1357                                     "object": configObject,\r
1358                                     "ports": [],\r
1359                                     "configData" : null\r
1360                                 };\r
1361                                 if( !$scope.hasFabricConfigurations ) {\r
1362                                 portMirroringConfigurationIds.push(configObject[FIELD.ID.CONFIGURATION_ID]);\r
1363                                     $scope.service.instance[FIELD.ID.CONFIGURATIONS].push(config);\r
1364                                 } else {\r
1365                                    if (config.nodeStatus.toLowerCase() !== FIELD.STATUS.ASSIGNED.toLowerCase()) {\r
1366                                        $scope.allConfigurationsAssigned = false;\r
1367                                        if ($scope.isActivateFabricConfiguration()) {\r
1368                                             $scope.errorMsg = "Activate fabric configuration button is not available as some of the configuration objects are not in Assigned status. Check MSO logs for the reasons for this abnormal case.";\r
1369                                        }\r
1370                                    }\r
1371                                }\r
1372                             }\r
1373 \r
1374                         });\r
1375 \r
1376                         AaiService.getPortMirroringData(portMirroringConfigurationIds).then(function(result){\r
1377                            angular.forEach($scope.service.instance[FIELD.ID.CONFIGURATIONS], function(config){\r
1378                                 config['configData'] = result.data[config['nodeId']];\r
1379 \r
1380                                if (config.configData && config.configData.errorDescription) {\r
1381                                    $scope.errorMsg = ($scope.errorMsg ? $scope.errorMsg + "\n" : "") +\r
1382                                        "Cannot read cloud-region for configuration \"" + config.name + "\": " +\r
1383                                        config.configData.errorDescription;\r
1384                                }\r
1385                            });\r
1386                         });\r
1387 \r
1388                         AaiService.getPortMirroringSourcePorts(portMirroringConfigurationIds).then(function(result){\r
1389                            angular.forEach($scope.service.instance[FIELD.ID.CONFIGURATIONS], function(config){\r
1390                                 angular.forEach(result.data[config['nodeId']], function(port){\r
1391                                    if (port.errorDescription) {\r
1392                                        $scope.errorMsg = ($scope.errorMsg ? $scope.errorMsg + "\n" : "") +\r
1393                                            "Cannot read a source port for configuration \"" + config.name + "\": " +\r
1394                                            port.errorDescription;\r
1395                                    } else {\r
1396                                        config.ports.push({\r
1397                                            "portId": port[FIELD.ID.PORT_ID],\r
1398                                            "portName": port[FIELD.ID.PORT_NAME],\r
1399                                            "portStatus": port[FIELD.ID.PORT_MIRRORED] === true ? FIELD.STATUS.AAI_ENABLED : FIELD.STATUS.AAI_DISABLED\r
1400                                        });\r
1401                                    }\r
1402                                });\r
1403                            });\r
1404                         });\r
1405 \r
1406                     }\r
1407                 });\r
1408 \r
1409                 var aaiNetworkIds = _.map(serviceNetworkVlans, 'networkId');\r
1410                 var serviceInstanceNetworkIds = _.map($scope.service.instance[FIELD.ID.NETWORKS], 'nodeId');\r
1411                 var isContains = aaiNetworkIds.every(function(val) { return serviceInstanceNetworkIds.indexOf(val) >= 0; });\r
1412                 if (aaiNetworkIds.length && !isContains)  {\r
1413                     $log.error("vlansByNetworks contain network that not found in service instance", aaiNetworkIds, serviceInstanceNetworkIds);\r
1414                 }\r
1415 \r
1416             });\r
1417         };\r
1418 \r
1419 \r
1420 \r
1421 \r
1422         $scope.handleInitialResponse = function (response) {\r
1423             try {\r
1424                 $scope.enableCloseButton(true);\r
1425                 $scope.updateLog(response);\r
1426                 if (response.data.status < 200 || response.data.status > 202) {\r
1427                     $scope.showError(FIELD.ERROR.MSO);\r
1428                     $scope.status = FIELD.ERROR.AAI_FETCHING_CUST_DATA + response.data.status;\r
1429 \r
1430                     return;\r
1431                 }\r
1432 \r
1433                 $scope.setProgress(100); // done\r
1434                 $scope.status = FIELD.STATUS.DONE;\r
1435                 $scope.isSpinnerVisible = false;\r
1436 \r
1437                 $scope.customer = response.data.customer; // get data from json\r
1438 \r
1439                 $scope.customerList = [];\r
1440 \r
1441                 angular.forEach($scope.customer, function (subVal, subKey) {\r
1442                     var cust = {\r
1443                         "globalCustomerId": subVal[FIELD.ID.GLOBAL_CUSTOMER_ID],\r
1444                         "subscriberName": subVal[FIELD.ID.SUBNAME],\r
1445                         "isPermitted": subVal[FIELD.ID.IS_PERMITTED]\r
1446                     };\r
1447 \r
1448                     $scope.customerList.push(cust);\r
1449                 });\r
1450 \r
1451             } catch (error) {\r
1452                 $scope.showContentError(error);\r
1453             }\r
1454         }\r
1455 \r
1456         $scope.autoGetSubs = function () {\r
1457             /*\r
1458              * Optionally comment in / out one of these method calls (or add a similar\r
1459              * entry) to auto-invoke an entry when the test screen is redrawn.\r
1460              */\r
1461             $scope.getSubs();\r
1462 \r
1463         }\r
1464 \r
1465         $scope.updateLog = function (response) {\r
1466 //              $scope.log = UtilityService.getCurrentTime() + " HTTP Status: " + \r
1467 //              UtilityService.getHttpStatusText(response.data.status) + "\n" +\r
1468 //              angular.toJson(response.data.entity, true) + "\n\n" + $scope.log;\r
1469 //              UtilityService.checkUndefined("entity", response.data.entity);\r
1470 //              UtilityService.checkUndefined("status", response.data.status);                          \r
1471         }\r
1472 \r
1473         $scope.handleServerError = function (response, status) {\r
1474             $scope.enableCloseButton(true);\r
1475             var message = UtilityService.getHttpErrorMessage(response);\r
1476             if (message != "") {\r
1477                 message = " (" + message + ")";\r
1478             }\r
1479             $scope.showError(FIELD.ERROR.SYSTEM_ERROR + message);\r
1480         }\r
1481 \r
1482         $scope.showContentError = function (message) {\r
1483             // $log.debug(message);\r
1484             console.log(message);\r
1485             if (UtilityService.hasContents(message)) {\r
1486                 $scope.showError("System failure (" + message + ")");\r
1487             } else {\r
1488                 $scope.showError(FIELD.ERROR.SYSTEM_ERROR);\r
1489             }\r
1490         }\r
1491 \r
1492         $scope.showError = function (message) {\r
1493             $scope.isSpinnerVisible = false;\r
1494             $scope.isProgressVisible = false;\r
1495             $scope.error = message;\r
1496             $scope.status = FIELD.STATUS.ERROR;\r
1497         }\r
1498 \r
1499         $scope.close = function () {\r
1500             if ($scope.timer != undefined) {\r
1501                 $timeout.cancel($scope.timer);\r
1502             }\r
1503             $scope.isPopupVisible = false;\r
1504         }\r
1505 \r
1506 \r
1507         /*\r
1508          * Consider converting the progress bar mechanism, the disabled button handling\r
1509          * and the following methods to generic Angular directive(s) and/or approach.\r
1510          */\r
1511 \r
1512         $scope.enableCloseButton = function (isEnabled) {\r
1513             var selector = FIELD.STYLE.MSO_CTRL_BTN;\r
1514 \r
1515             $scope.isCloseEnabled = isEnabled;\r
1516 \r
1517             if (isEnabled) {\r
1518                 $(selector).addClass(FIELD.STYLE.BTN_PRIMARY).removeClass(FIELD.STYLE.BTN_INACTIVE).attr(FIELD.STYLE.BTN_TYPE, FIELD.STYLE.PRIMARY);\r
1519             } else {\r
1520                 $(selector).removeClass(FIELD.STYLE.BTN_PRIMARY).addClass(FIELD.STYLE.BTN_INACTIVE).attr(FIELD.STYLE.BTN_TYPE, FIELD.STYLE.DISABLED);\r
1521             }\r
1522         }\r
1523 \r
1524         $scope.resetProgress = function () {\r
1525             $scope.percentProgress = 0;\r
1526             $scope.progressClass = FIELD.STYLE.PROGRESS_BAR_INFO;\r
1527         }\r
1528 \r
1529         $scope.setProgress = function (percentProgress) {\r
1530             percentProgress = parseInt(percentProgress);\r
1531             if (percentProgress >= 100) {\r
1532                 $scope.progressClass = FIELD.STYLE.PROGRESS_BAR_SUCCESS;\r
1533             }\r
1534 \r
1535             if (percentProgress < $scope.percentProgress) {\r
1536                 return;\r
1537             }\r
1538 \r
1539             $scope.percentProgress = percentProgress;\r
1540             $scope.progressWidth = {width: percentProgress + "%"};\r
1541             if (percentProgress >= 5) {\r
1542                 $scope.progressText = percentProgress + " %";\r
1543             } else {\r
1544                 // Hidden since color combination is barely visible when progress portion is narrow.\r
1545                 $scope.progressText = "";\r
1546             }\r
1547         }\r
1548 \r
1549         $scope.reloadRoute = function () {\r
1550             $route.reload();\r
1551         }\r
1552 \r
1553         $scope.prevPage = function () {\r
1554             $scope.currentPage--;\r
1555         }\r
1556 \r
1557         var getAicZoneAndSendToMso = function (msoType, requestParams) {\r
1558             AaiService.getAicZoneForPNF(\r
1559                 $scope.service.instance.globalCustomerId,\r
1560                 $scope.service.instance.serviceType,\r
1561                 $scope.service.instance.serviceInstanceId, function (aicZone) {\r
1562 \r
1563                     requestParams.aicZone = aicZone;\r
1564 \r
1565                     openMsoModal(msoType, requestParams);\r
1566                 });\r
1567         };\r
1568 \r
1569         var activateDeactivateServiceInstance = function (msoType) {\r
1570             var requestParams = {\r
1571                 model: $scope.service.model,\r
1572                 instance: $scope.service.instance\r
1573             };\r
1574 \r
1575             if (DataService.getLoggedInUserId()) {\r
1576                 requestParams.userId = DataService.getLoggedInUserId();\r
1577                 getAicZoneAndSendToMso(msoType, requestParams)\r
1578             } else {\r
1579                 AaiService.getLoggedInUserID(function (response) {\r
1580                     var userID = response.data;\r
1581                     DataService.setLoggedInUserId(userID);\r
1582                     requestParams.userId = userID;\r
1583 \r
1584                     getAicZoneAndSendToMso(msoType, requestParams);\r
1585                 });\r
1586             }\r
1587         };\r
1588 \r
1589 \r
1590         var activateFabricConfigurationInstance = function (msoType) {\r
1591             var requestParams = {\r
1592                 model: $scope.service.model,\r
1593                 service: $scope.service,\r
1594                 serviceInstanceId: $scope.serviceInstanceId\r
1595             };\r
1596 \r
1597             if (DataService.getLoggedInUserId()) {\r
1598                 requestParams.userId = DataService.getLoggedInUserId();\r
1599                 openMsoModal(COMPONENT.MSO_ACTIVATE_FABRIC_CONFIGURATION_REQ, requestParams);\r
1600             } else {\r
1601                 AaiService.getLoggedInUserID(function (response) {\r
1602                     var userID = response.data;\r
1603                     DataService.setLoggedInUserId(userID);\r
1604                     requestParams.userId = userID;\r
1605                     openMsoModal(COMPONENT.MSO_ACTIVATE_FABRIC_CONFIGURATION_REQ, requestParams);\r
1606                 });\r
1607             }\r
1608         };\r
1609 \r
1610         $scope.showAssignmentsSDNC = function () {\r
1611 \r
1612             if ($scope.service && $scope.service.instance) {\r
1613                 return VIDCONFIGURATION.SDNC_SHOW_ASSIGNMENTS_URL.replace("<SERVICE_INSTANCE_ID>" , $scope.service.instance.id);\r
1614             }\r
1615             return null;\r
1616         };\r
1617 \r
1618         $scope.activateFabricConfigurationMSO = function () {\r
1619             activateFabricConfigurationInstance(COMPONENT.MSO_ACTIVATE_FABRIC_CONFIGURATION_REQ);\r
1620         };\r
1621 \r
1622         $scope.activateMSOInstance = function () {\r
1623 \r
1624             activateDeactivateServiceInstance(COMPONENT.MSO_ACTIVATE_SERVICE_REQ);\r
1625         };\r
1626 \r
1627         $scope.deactivateMSOInstance = function () {\r
1628 \r
1629             activateDeactivateServiceInstance(COMPONENT.MSO_DEACTIVATE_SERVICE_REQ);\r
1630         };\r
1631 \r
1632 \r
1633         $scope.deleteConfiguration = function (serviceObject, configuration) {\r
1634             AaiService.getLoggedInUserID(function (response) {\r
1635                 DataService.setLoggedInUserId(response.data);\r
1636                 var requestParams = {\r
1637                     serviceModel: {\r
1638                         "modelType": "configuration",\r
1639                         "modelInvariantId": serviceObject.model.service.invariantUuid,\r
1640                         "modelVersionId": serviceObject.model.service.uuid,\r
1641                         "modelName": serviceObject.model.service.name,\r
1642                         "modelVersion": serviceObject.model.service.version\r
1643                     },\r
1644                     configurationModel: {\r
1645                         "modelType": "configuration",\r
1646                         "modelInvariantId": configuration.modelInvariantId,\r
1647                         "modelVersionId": configuration.modelVersionId,\r
1648                         "modelCustomizationId": configuration.modelCustomizationId\r
1649                     },\r
1650                     serviceInstanceId: serviceObject.instance.serviceInstanceId,\r
1651                     configurationId: configuration.nodeId,\r
1652                     configStatus: configuration.DELETE,\r
1653                     userId: DataService.getLoggedInUserId()\r
1654                 };\r
1655 \r
1656                 openMsoModal(COMPONENT.MSO_DELETE_CONFIGURATION_REQ, requestParams, configuration);\r
1657             });\r
1658 \r
1659         };\r
1660 \r
1661         $scope.toggleConfigurationStatus = function (serviceObject, configuration) {\r
1662             AaiService.getLoggedInUserID(function (response) {\r
1663                 DataService.setLoggedInUserId(response.data);\r
1664                 var requestParams = {\r
1665                     serviceModel: {\r
1666                         "modelType": "service",\r
1667                         "modelInvariantId": serviceObject.model.service.invariantUuid,\r
1668                         "modelVersionId": serviceObject.model.service.uuid,\r
1669                         "modelName": serviceObject.model.service.name,\r
1670                         "modelVersion": serviceObject.model.service.version\r
1671                     },\r
1672                     configurationModel: {\r
1673                         "modelType": "configuration",\r
1674                         "modelInvariantId": configuration.modelInvariantId,\r
1675                         "modelVersionId": configuration.modelVersionId,\r
1676                         "modelCustomizationId": configuration.modelCustomizationId\r
1677                     },\r
1678                     serviceInstanceId: serviceObject.instance.serviceInstanceId,\r
1679                     configurationId: configuration.nodeId,\r
1680                     configStatus: configuration.nodeStatus,\r
1681                     userId: DataService.getLoggedInUserId()\r
1682                 };\r
1683 \r
1684                 openMsoModal(COMPONENT.MSO_CHANGE_CONFIG_STATUS_REQ, requestParams, configuration);\r
1685             });\r
1686 \r
1687         };\r
1688 \r
1689         $scope.togglePortStatus = function (serviceObject, configuration, port) {\r
1690             AaiService.getLoggedInUserID(function (response) {\r
1691                 DataService.setLoggedInUserId(response.data);\r
1692 \r
1693                 var requestParams = {\r
1694                     serviceInstanceId: serviceObject.instance.serviceInstanceId,\r
1695                     configurationId: configuration.nodeId,\r
1696                     portId: port.portId,\r
1697                     portStatus: port.portStatus,\r
1698                     serviceModel: {\r
1699                         "modelType": "service",\r
1700                         "modelInvariantId": serviceObject.model.service.invariantUuid,\r
1701                         "modelVersionId": serviceObject.model.service.uuid,\r
1702                         "modelName": serviceObject.model.service.name,\r
1703                         "modelVersion": serviceObject.model.service.version\r
1704                     },\r
1705                     configurationModel: {\r
1706                         "modelType": "configuration",\r
1707                         "modelInvariantId": configuration.modelInvariantId,\r
1708                         "modelVersionId": configuration.modelVersionId,\r
1709                         "modelCustomizationId": configuration.modelCustomizationId\r
1710                     },\r
1711                     userId: DataService.getLoggedInUserId()\r
1712                 };\r
1713 \r
1714                 openMsoModal(COMPONENT.MSO_CHANGE_PORT_STATUS_REQ, requestParams, configuration);\r
1715             });\r
1716         };\r
1717 \r
1718         $scope.dissociatePnf = function (pnfName) {\r
1719 \r
1720             var jobInfo = {\r
1721                 status: "confirm",\r
1722                 message: "Are you sure you would like to dissociate " + pnfName + " from the service instance?"\r
1723             };\r
1724 \r
1725             var modalInstance = $uibModal.open({\r
1726                 templateUrl: 'app/vid/scripts/modals/alert-modal/alert-modal.html',\r
1727                 controller: 'alertModalController',\r
1728                 controllerAs: 'vm',\r
1729                 appendTo: angular.element("#pnfs-tree"),\r
1730                 resolve: {\r
1731                     jobInfo: function () {\r
1732                         return jobInfo;\r
1733                     }\r
1734                 }\r
1735             });\r
1736 \r
1737             modalInstance.result.then(function (result) {\r
1738                 console.log("This is the result of the alert modal.", result);\r
1739 \r
1740                 if (result) {\r
1741                     var requestParams = {\r
1742                         pnf: pnfName,\r
1743                         serviceModelInfo: {\r
1744                             invariantUuid: $scope.service.model.service.invariantUuid,\r
1745                             uuid: $scope.service.model.service.uuid,\r
1746                             version: $scope.service.model.service.version,\r
1747                             name: $scope.service.model.service.name\r
1748                         },\r
1749                         serviceInstanceId: $scope.service.instance.serviceInstanceId\r
1750                     };\r
1751 \r
1752                     if (DataService.getLoggedInUserId()) {\r
1753                         requestParams.userId = DataService.getLoggedInUserId();\r
1754                         requestParams.attuuid = DataService.getLoggedInUserId();\r
1755                         openMsoModal(COMPONENT.MSO_REMOVE_RELATIONSHIP, requestParams);\r
1756                     } else {\r
1757                         AaiService.getLoggedInUserID(function (response) {\r
1758                             DataService.setLoggedInUserId(response.data);\r
1759 \r
1760                             requestParams.userId = response.data;\r
1761                             requestParams.attuuid = response.data;\r
1762                             openMsoModal(COMPONENT.MSO_REMOVE_RELATIONSHIP, requestParams);\r
1763                         });\r
1764                     }\r
1765                 }\r
1766             });\r
1767 \r
1768 \r
1769         };\r
1770 \r
1771         var openMsoModal = function (msoType, requestParams, configuration) {\r
1772             var modalInstance = $uibModal.open({\r
1773                 templateUrl: 'app/vid/scripts/modals/mso-commit/mso-commit.html',\r
1774                 controller: "msoCommitModalController",\r
1775                 backdrop: false,\r
1776                 resolve: {\r
1777                     msoType: function () {\r
1778                         return msoType;\r
1779                     },\r
1780                     requestParams: function () {\r
1781                         requestParams.callbackFunction = updateViewCallbackFunction;\r
1782                         return requestParams;\r
1783                     },\r
1784                     configuration: function () {\r
1785                         return configuration;\r
1786                     }\r
1787                 }\r
1788             });\r
1789         };\r
1790 \r
1791         var updateViewCallbackFunction = function (response) {\r
1792             $scope.callbackResults = "";\r
1793             var color = FIELD.ID.COLOR_NONE;\r
1794             $scope.callbackStyle = {\r
1795                 "background-color": color\r
1796             };\r
1797 \r
1798             /*\r
1799              * This 1/2 delay was only added to visually highlight the status\r
1800              * change. Probably not needed in the real application code.\r
1801              */\r
1802             $timeout(function () {\r
1803                 $scope.callbackResults = UtilityService.getCurrentTime()\r
1804                     + FIELD.STATUS.IS_SUCCESSFUL + response.isSuccessful;\r
1805                 if (response.isSuccessful) {\r
1806                     color = FIELD.ID.COLOR_8F8;\r
1807                     $scope.reloadRoute();\r
1808                 } else {\r
1809                     color = FIELD.ID.COLOR_F88;\r
1810                 }\r
1811                 $scope.callbackStyle = {\r
1812                     "background-color": color\r
1813                 };\r
1814             }, 500);\r
1815         };\r
1816 \r
1817         $scope.nextPage = function () {\r
1818             $scope.currentPage++;\r
1819         };\r
1820 \r
1821         $scope.serviceInstanceses = [{"sinstance": FIELD.NAME.SERVICE_INSTANCE_Id}, {"sinstance": FIELD.NAME.SERVICE_INSTANCE_NAME}];\r
1822 \r
1823         function navigateToSearchResultsPage(globalCustomerId, selectedServiceInstance, selectedProjects, selectedOwningEntities, selectedInstanceIdentifierType) {\r
1824             var projectQuery = AaiService.getMultipleValueParamQueryString(_.map(selectedProjects, 'id'), COMPONENT.PROJECT_SUB_PATH);\r
1825             var owningEntityQuery = AaiService.getMultipleValueParamQueryString(_.map(selectedOwningEntities, 'id'), COMPONENT.OWNING_ENTITY_SUB_PATH);\r
1826             var globalCustomerIdQuery = globalCustomerId ? COMPONENT.SELECTED_SUBSCRIBER_SUB_PATH + globalCustomerId : null;\r
1827             var serviceInstanceQuery = selectedServiceInstance ? COMPONENT.SELECTED_SERVICE_INSTANCE_SUB_PATH + selectedServiceInstance : null;\r
1828             var serviceInstanceTypeQuery = selectedInstanceIdentifierType ? COMPONENT.SELECTED_SERVICE_INSTANCE_TYPE_SUB_PATH + selectedInstanceIdentifierType : null;\r
1829             var query = AaiService.getJoinedQueryString([projectQuery, owningEntityQuery, globalCustomerIdQuery, serviceInstanceQuery, serviceInstanceTypeQuery]);\r
1830 \r
1831             window.location.href = COMPONENT.SELECTED_SERVICE_SUB_PATH + query;\r
1832         }\r
1833 \r
1834         $scope.getServiceInstancesSearchResults =\r
1835             function (selectedCustomer, selectedInstanceIdentifierType, selectedServiceInstance, selectedProject, selectedOwningEntity) {\r
1836                 var isSelectionValid = UtilityService.hasContents(selectedCustomer) || UtilityService.hasContents(selectedProject)\r
1837                     || UtilityService.hasContents(selectedOwningEntity) || UtilityService.hasContents(selectedServiceInstance);\r
1838 \r
1839                 if (isSelectionValid) {\r
1840                     if (UtilityService.hasContents(selectedServiceInstance)) {\r
1841                         AaiService\r
1842                             .getGlobalCustomerIdByInstanceIdentifier(selectedServiceInstance, selectedInstanceIdentifierType)\r
1843                             .then(handleCustomerIdResponse);\r
1844                     } else {\r
1845                         navigateToSearchResultsPage(selectedCustomer, null, selectedProject, selectedOwningEntity, selectedInstanceIdentifierType);\r
1846                     }\r
1847                 } else {\r
1848                     alert(FIELD.ERROR.SELECT);\r
1849                 }\r
1850 \r
1851                 function handleCustomerIdResponse(globalCustomerId) {\r
1852                     if (UtilityService.hasContents(globalCustomerId)) {\r
1853                         navigateToSearchResultsPage(globalCustomerId, selectedServiceInstance, selectedProject, selectedOwningEntity, selectedInstanceIdentifierType);\r
1854                     } else {\r
1855                         alert(FIELD.ERROR.SERVICE_INST_DNE);\r
1856                     }\r
1857                 }\r
1858             };\r
1859     }\r
1860 ]).directive('restrictInput', function () {\r
1861 \r
1862     return {\r
1863 \r
1864         restrict: 'A',\r
1865         require: 'ngModel',\r
1866         link: function ($scope, element, attr, ctrl) {\r
1867             ctrl.$parsers.unshift(function (viewValue) {\r
1868 \r
1869                 var types = $scope.$eval(attr.restrictInput);\r
1870                 if (!types.regex && types.type) {\r
1871 \r
1872                     switch (types.type) {\r
1873                         case 'Service Instance Name' :\r
1874                             types.regex = '^[a-zA-Z0-9-_]*$';\r
1875                             break;\r
1876                         default:\r
1877                             types.regex = '';\r
1878                     }\r
1879                 }\r
1880                 var reg = new RegExp(types.regex);\r
1881                 if (reg.test(viewValue)) {\r
1882                     return viewValue;\r
1883                 } else {\r
1884                     var overrideValue = (reg.test(viewValue) ? viewValue : '');\r
1885                     element.val(overrideValue);\r
1886                     return overrideValue;\r
1887                 }\r
1888             });\r
1889         }\r
1890     };\r
1891 \r
1892 });\r
1893 appDS2.controller('TreeCtrl', ['$scope', function ($scope) {\r
1894     $scope.remove = function (scope) {\r
1895         scope.remove();\r
1896     };\r
1897 \r
1898     $scope.toggle = function (scope) {\r
1899         scope.toggle();\r
1900     };\r
1901 \r
1902     $scope.moveLastToTheBeginning = function () {\r
1903         var a = $scope.data.pop();\r
1904         $scope.data.splice(0, 0, a);\r
1905     };\r
1906 \r
1907     $scope.newSubItem = function (scope) {\r
1908         var nodeData = scope.$modelValue;\r
1909         nodeData.nodes.push({\r
1910             id: nodeData.id * 10 + nodeData.nodes.length,\r
1911             title: nodeData.title + '.' + (nodeData.nodes.length + 1),\r
1912             nodes: []\r
1913         });\r
1914     };\r
1915 \r
1916     $scope.collapseAll = function () {\r
1917         $scope.$broadcast(FIELD.ID.ANGULAR_UI_TREE_COLLAPSEALL);\r
1918     };\r
1919 \r
1920     $scope.expandAll = function () {\r
1921         $scope.$broadcast(FIELD.ID.ANGULAR_UI_TREE_EXPANDALL);\r
1922     };\r
1923 \r
1924 }]);\r
1925 \r
1926 \r
1927 \r