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