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