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