Scale out use case
[vid.git] / vid-app-common / src / main / webapp / app / vid / scripts / modals / new-change-management / new-change-management.controller.js
1 (function () {
2     'use strict';
3
4     appDS2.controller("newChangeManagementModalController", ["$uibModalInstance", "$uibModal",'$q', "AaiService", "changeManagementService", "Upload",
5         "$log", "$scope", "_", "COMPONENT", "VIDCONFIGURATION", newChangeManagementModalController]);
6
7     function newChangeManagementModalController($uibModalInstance, $uibModal,$q, AaiService, changeManagementService, Upload, $log, $scope, _, COMPONENT, VIDCONFIGURATION) {
8
9         var vm = this;
10         vm.configUpdatePatternError = "Invalid file type. Please select a file with a CSV extension.";
11         vm.configUpdateContentError = "Invalid file structure.";
12         vm.controllers = VIDCONFIGURATION.SCALE_OUT_CONTROLLERS;
13         vm.wizardStep = 1;
14         vm.nextStep = function(){
15             vm.wizardStep++;
16             $(".modal-dialog").animate({"width":"1000px"},400,'linear');
17         };
18         vm.prevStep = function(){
19             vm.wizardStep--;
20             $(".modal-dialog").animate({"width":"6000px"},400,'linear');
21         };
22
23         vm.softwareVersionRegex = "[-a-zA-Z0-9\.]+";
24
25         var init = function () {
26             vm.changeManagement = {};
27
28             loadServicesCatalog();
29             registerVNFNamesWatcher();
30             vm.loadSubscribers();
31         };
32
33         var loadServicesCatalog = function () {
34             changeManagementService.getAllSDCServices()
35                 .then(function (response) {
36                     vm.SDCServicesCatalog = response.data;
37                 })
38                 .catch(function (error) {
39                     $log.error(error);
40                 })
41         };
42
43         var registerVNFNamesWatcher = function () {
44             $scope.$watch('vm.changeManagement.vnfNames', function (newVal, oldVal) {
45                 if (!oldVal || newVal && newVal.length > oldVal.length) { //JUST THE LAST ONE ADDED
46                     var newVNFName = _.last(vm.changeManagement.vnfNames);
47                     if (oldVal) {
48                         vm.changeManagement.vnfNames = oldVal;
49                         vm.changeManagement.vnfNames.push(newVNFName);
50                     }
51                     if (newVNFName && newVNFName["service-instance-node"]) {
52                         var availableVersions = [];
53                         var services = _.filter(vm.SDCServicesCatalog.services,
54                             {"invariantUUID": newVNFName["service-instance-node"][0].properties["model-invariant-id"]});
55
56                         _.each(services, function (service) {
57                             changeManagementService.getSDCService(service.uuid)
58                                 .then(function (response) {
59                                     _.each(response.data.vnfs, function (vnf) {
60                                         if (newVNFName["invariant-id"] === vnf.invariantUuid) {
61                                             availableVersions.push(extractVNFModel(vnf, response.data.service, newVNFName));
62                                             newVNFName.vfModules = vnf.vfModules;
63                                         }
64                                     });
65                                     var versions = _.uniqBy(availableVersions, 'modelInfo.modelVersion');
66                                     newVNFName.availableVersions = _.sortBy(_.uniq(versions, response.data.service, true),"modelInfo.modelVersion");
67                                 }).catch(function (error) {
68                                 $log.error(error);
69                             });
70                         });
71                     }
72                 }
73             }, true);
74         };
75
76         var extractVNFModel = function (csarVNF, sdcService, selectionVNF) {
77             var versionCsarData = {
78                 vnfInstanceId: "",
79                 vnfName: csarVNF.name,
80                 modelInfo: {
81                     modelType: "vnf",
82                     modelInvariantId: csarVNF.invariantUuid,
83                     modelVersionId: selectionVNF.modelVersionId,
84                     modelName: csarVNF.name,
85                     modelVersion: csarVNF.version,
86                     modelCustomizationName: csarVNF.modelCustomizationName,
87                     modelCustomizationId: csarVNF.customizationUuid
88                 },
89                 cloudConfiguration: {
90                     lcpCloudRegionId: "mdt1",
91                     tenantId: "88a6ca3ee0394ade9403f075db23167e"
92                 },
93                 requestInfo: {
94                     source: "VID",
95                     suppressRollback: false,
96                     requestorId: "az2016"
97                 },
98                 relatedInstanceList: [
99                     {
100                         relatedInstance: {
101                             instanceId: selectionVNF["service-instance-node"]["0"].properties['service-instance-id'],
102                             modelInfo: {
103                                 modelType: "service",
104                                 modelInvariantId: selectionVNF["service-instance-node"]["0"].properties['model-invariant-id'],
105                                 modelVersionId: selectionVNF.modelVersionId,
106                                 modelName: sdcService.name,
107                                 modelVersion: sdcService.version,
108                                 modelCustomizationName: selectionVNF["service-instance-node"]["0"].properties['model-customization-name'], //TODO: Missing
109                                 modelCustomizationId: selectionVNF["service-instance-node"]["0"].properties['model-customization-id']
110                             }
111                         }
112                     }
113                 ],
114                 requestParameters: {
115                     usePreload: true
116                 }
117             };
118
119             return versionCsarData;
120         };
121
122         vm.close = function () {
123             $uibModalInstance.close();
124         };
125
126         vm.uploadConfigFile = function (file) {
127             var defer = $q.defer();
128             Upload.upload({
129                 url: "change-management/uploadConfigUpdateFile",
130                 file: file,
131                 transformResponse: [function (data) {
132                     return data;
133                 }]
134             })
135             .then(function (configUpdateResponse) {
136                 vm.changeManagement.configUpdateFile = configUpdateResponse && JSON.parse(configUpdateResponse.data).payload;
137                 defer.resolve(true);
138             })
139             .catch(function (error) {
140                 defer.resolve(false);
141             });
142             return defer.promise;
143         };
144
145
146                 /***converting objects to scheduler format (taken from IST) - was altered for Scale out support ***/
147                 function extractChangeManagementCallbackDataStr(changeManagement) {
148                         console.log(changeManagement);
149                         var result = {};
150                         result.requestType = changeManagement.workflow;
151                         var workflowType = changeManagement.workflow;
152                         result.requestDetails = [];
153                         _.forEach(changeManagement.vnfNames, function (vnf) {
154                                 
155                                 try{
156                                 var requestInfoData ={};
157                                 var requestParametersData ={};
158                                 if (vnf.availableVersions && vnf.availableVersions.length!=0){
159                                         
160                                         requestInfoData ={
161                                                 source: vnf.availableVersions[0].requestInfo.source,
162                                                 suppressRollback: vnf.availableVersions[0].requestInfo.suppressRollback,
163                                                 requestorId: vnf.availableVersions[0].requestInfo.requestorId
164                                         }
165                                         
166                                         if(workflowType=='Update'){
167                                                 requestParametersData = {
168                                                         usePreload: vnf.availableVersions[0].requestParameters.usePreload
169                                                 }
170                                         }else if(workflowType=="Replace"){
171                                                 requestParametersData = {
172                                                         rebuildVolumeGroups: vnf.availableVersions[0].requestParameters.usePreload
173                                                 }
174                                         }else if(workflowType=="VNF In Place Software Update"){
175                                                 var payloadObj = {
176                                                         'existing_software_version':changeManagement.existingSoftwareVersion,
177                                                         'new_software_version':changeManagement.newSoftwareVersion,
178                                                         'operations_timeout':changeManagement.operationTimeout
179                                                 };
180                                                 requestParametersData = {
181                                                         payload: JSON.stringify(payloadObj)
182                                                 }
183                                         }else if(workflowType=="VNF Config Update"){
184                                                 requestParametersData = {
185                                                         payload: changeManagement.configUpdateFile
186                                                 }
187                     }else if(workflowType=="VNF Scale Out"){
188                         requestParametersData = {
189                             controllerType: changeManagement.controllerType
190                             //userParams: { ..json.. }
191                             //usePreload: false
192                         }
193                     }
194                                         $log.info('SchedulerWidgetCtrl:extractChangeManagementCallbackDataStr info:: workflowType '+ workflowType);
195                                         $log.info('SchedulerWidgetCtrl:extractChangeManagementCallbackDataStr info:: requestParametersData '+ requestParametersData);
196
197                                 }else if(workflowType=="VNF In Place Software Update"){
198                                         var payloadObj = {
199                                                 'existing_software_version':changeManagement.existingSoftwareVersion,
200                                                 'new_software_version':changeManagement.newSoftwareVersion,
201                                                 'operations_timeout':changeManagement.operationTimeout
202                                         };
203                                         requestParametersData = {
204                                                 payload: JSON.stringify(payloadObj)
205                                         }
206                                 }else if(workflowType=="VNF Config Update"){
207                                         requestParametersData = {
208                                                 payload: changeManagement.configUpdateFile
209                                         }
210                                 }       
211                                 
212                                 var data = {
213                                         vnfName: vnf.name,
214                                         vnfInstanceId: vnf.id,
215                                         modelInfo: {
216                                                 modelType: 'vnf',
217                                                 modelInvariantId: vnf.properties['model-invariant-id'],
218                                                 modelVersionId: vnf.modelVersionId,
219                                                 modelName: vnf.properties['vnf-name'],
220                                                 modelVersion: vnf.version,
221                                                 modelCustomizationName: vnf.properties['model-customization-name'],
222                                                 modelCustomizationId: vnf.properties['model-customization-id']
223                                         },
224                                         cloudConfiguration: vnf.cloudConfiguration,
225                                         requestInfo: requestInfoData,
226                                         relatedInstanceList: [],
227                                         requestParameters:requestParametersData
228                                 };
229
230                                 var serviceInstanceId = '';
231                                 _.forEach(vnf['service-instance-node'], function (instanceNode) {
232                                         if(instanceNode['node-type'] === 'service-instance'){
233                                                 serviceInstanceId = instanceNode.properties['service-instance-id'];
234                                         }
235                                 });
236
237                                 if (vnf.availableVersions && vnf.availableVersions.length!=0){
238                                         _.forEach(vnf.availableVersions[0].relatedInstanceList, function (related) {
239                                                 var rel = related.relatedInstance;
240                                                 var relatedInstance = {
241                                                         instanceId: serviceInstanceId,
242                                                         modelInfo: {
243                                                                 modelType: rel.modelInfo.modelType,
244                                                                 modelInvariantId: rel.modelInfo.modelInvariantId,
245                                                                 modelVersionId: rel.modelInfo.modelVersionId,
246                                                                 modelName: rel.modelInfo.modelName,
247                                                                 modelVersion: rel.modelInfo.modelVersion,
248                                                                 modelCustomizationName: rel.modelInfo.modelCustomizationName,
249                                                                 modelCustomizationId: rel.modelInfo.modelCustomizationId
250                                                         }
251                                                 };
252                                                 if (rel.vnfInstanceId)
253                                                         relatedInstance.instanceId = rel.vnfInstanceId;
254
255                                                 data.relatedInstanceList.push({relatedInstance: relatedInstance});
256                                         });
257                                 }
258                                 }catch(err){
259                                         $log.error('SchedulerCtrl::extractChangeManagementCallbackDataStr error: ' + err);
260                                 }
261
262                                 result.requestDetails.push(data);
263                         });
264                         return JSON.stringify(result);
265                 }
266                 
267         vm.openModal = function () {
268             if(VIDCONFIGURATION.SCHEDULER_PORTAL_URL) { //scheduling supported
269                                 $scope.widgetParameter = ""; // needed by the scheduler?
270
271                                 // properties needed by the scheduler so it knows whether to show
272                                 // policy or sniro related features on the scheduler UI or not.
273                                 vm.changeManagement.policyYN = "Y";
274                                 vm.changeManagement.sniroYN = "Y";
275
276                                 var data = {
277                                         widgetName: 'Portal-Common-Scheduler',
278                                         widgetData: vm.changeManagement,
279                                         widgetParameter: $scope.widgetParameter
280                                 };
281                         
282                                 window.parent.postMessage(data, VIDCONFIGURATION.SCHEDULER_PORTAL_URL);
283                         } else {
284                                 //no scheduling support
285                                 var dataToSo = extractChangeManagementCallbackDataStr(vm.changeManagement);
286                                 //TODO: foreach
287                 var vnfName = vm.changeManagement.vnfNames[0].name;
288                                 changeManagementService.postChangeManagementNow(dataToSo, vnfName);
289                         }
290         };
291
292         vm.loadSubscribers = function () {
293             vm.subscribers = [];
294             AaiService.getSubscribers(function (response) {
295                 vm.subscribers = response;
296             });
297         };
298
299         vm.loadServiceTypes = function () {
300             vm.serviceTypes = [];
301
302             AaiService.getSubscriberServiceTypes(vm.changeManagement.subscriberId)
303                 .then(function (response) {
304                     vm.serviceTypes = response.data;
305                 })
306                 .catch(function (error) {
307                     $log.error(error);
308                 });
309         };
310
311         vm.loadVNFTypes = function () {
312             vm.vnfTypes = [];
313             vm.vnfTypesTemp = [];
314             vm.serviceInstances = [];
315
316             var instances = vm.changeManagement.serviceType["service-instances"]["service-instance"];
317             // var promiseArrOfGetVnfs = preparePromiseArrOfGetVnfs(instances);
318
319             vm.vnfs = [];
320
321             AaiService.getVnfsByCustomerIdAndServiceType(
322                 vm.changeManagement.subscriberId,
323                 vm.changeManagement.serviceType["service-type"]
324             ).then(function (response) {
325                     var vnfsData = response.data.results;
326                     if (vnfsData) {
327                         for (var i = 0; i < vnfsData.length; i++) {
328                             if (vnfsData[i]) {
329                                 const nodeType = vnfsData[i]['node-type'];
330                                 if (nodeType === "generic-vnf") {
331                                     if (_.find(vnfsData[i]['related-to'], function (node) {
332                                             return node['node-type'] === 'vserver'
333                                         }) !== undefined) {
334                                         vm.vnfs.push(vnfsData[i]);
335                                     }
336                                 } else if (nodeType === "service-instance") {
337                                     vm.serviceInstances.push(vnfsData[i]);
338                                 }
339                             }
340                         }
341
342                         vm.vnfs = _.flattenDeep(
343                             _.remove(vm.vnfs, function (vnf) {
344                                 var nfRole = vnf.properties['nf-role'];
345                                 if (nfRole !== undefined) {
346                                     return nfRole !== 'null' && nfRole !== '';
347                                 }
348                             })
349                         );
350
351                         var filteredVnfs = _.uniqBy(vm.vnfs, function (vnf) {
352                             return vnf.properties['nf-role'];
353                         });
354
355                         _.forEach(filteredVnfs, function (vnf) {
356                             vm.vnfTypes.push(vnf.properties['nf-role'])
357                         });
358                     }
359                 }
360             );
361         };
362
363         var fromVNFVersions = [];
364
365         vm.loadVNFVersions = function () {
366             fromVNFVersions = [];
367             vm.serviceInstancesToGetVersions = [];
368             var versions = [];
369             _.forEach(vm.vnfs, function (vnf) {
370                 if (vnf.properties['nf-role'] === vm.changeManagement['vnfType']) {
371
372                     vm.serviceInstancesToGetVersions.push({
373                         "model-invariant-id": vnf.properties["model-invariant-id"],
374                         "model-version-id": vnf.properties["model-version-id"] }
375                     );
376
377                     versions.push(vnf.properties["model-invariant-id"]);
378                 }
379             });
380
381             if (versions.length > 0) {
382                 AaiService.getVnfVersionsByInvariantId(versions).then(function (response) {
383                     if (response.data) {
384
385                         $log.debug("getVnfVersionsByInvariantId: response", response);
386
387                         fromVNFVersions = vm.serviceInstancesToGetVersions
388                             .map(function (serviceInstanceToGetVersion) {
389                                 const model = _.find(response.data.model, {'model-invariant-id': serviceInstanceToGetVersion['model-invariant-id']});
390                                 $log.debug("getVnfVersionsByInvariantId: model for " + serviceInstanceToGetVersion['model-invariant-id'], model);
391
392                                 const modelVer = _.find(model["model-vers"]["model-ver"], {'model-version-id': serviceInstanceToGetVersion['model-version-id']});
393                                 $log.debug("getVnfVersionsByInvariantId: modelVer for " + serviceInstanceToGetVersion['model-version-id'], modelVer);
394
395                                 var modelVersionId = serviceInstanceToGetVersion["model-version-id"];
396                                 var modelVersion = modelVer["model-version"];
397
398                                 return {"key": modelVersionId, "value": modelVersion};
399                             });
400
401                         vm.fromVNFVersions = _.uniqBy(fromVNFVersions, 'value');
402                     }
403                 })
404             }
405         };
406
407
408         function getVnfs(modelInvariantId) {
409             return new Promise(function (resolve, reject) {
410                 AaiService.getVnfVersionsByInvariantId(modelInvariantId)
411                     .then(function (response) {
412                         if (response.data.httpCode !== null &&
413                             response.data.httpCode === 200) {
414                             var vnfsData = response.data.t.results;
415                             for (var i = 0; i < vnfsData.length; i++) {
416                                 if (vnfsData[i]) {
417                                     if (vnfsData[i].nodeType === "generic-vnf") {
418                                         resolve(vnfsData[i]);
419                                     } else if (vnfsData[i].nodeType === "service-instance") {
420                                         vm.serviceInstances.push(vnfsData[i]);
421                                     }
422                                 }
423                             }
424                             resolve(null);
425                         }
426                         resolve(null);
427                     })
428                     .catch(function (error) {
429                         reject(error);
430                     });
431             });
432         }
433
434         var getVersionNameForId = function(versionId) {
435             var version = _.find(fromVNFVersions, {"key": versionId});
436             return version.value;
437         };
438
439         vm.loadVNFNames = function () {
440             vm.vnfNames = [];
441             const vnfs = vm.changeManagement.fromVNFVersion ? vm.vnfs : [];
442             _.forEach(vnfs, function (vnf) {
443
444                 var selectedVersionNumber = getVersionNameForId(vm.changeManagement.fromVNFVersion);
445
446                 if (vnf.properties['nf-role'] === vm.changeManagement.vnfType &&
447                     selectedVersionNumber === getVersionNameForId(vnf.properties["model-version-id"])) {
448                     var vServer = {};
449
450                     _.forEach(vnf['related-to'], function (node) {
451                         if (node['node-type'] === 'vserver') {
452                             vServer = extractLcpRegionIdAndTenantId(node.url);
453                         }
454                     });
455
456                     var serviceInstancesIds =
457                         _.filter(vnf['related-to'], {'node-type': 'service-instance'})
458                             .map(function (serviceInstance) { return serviceInstance.id });
459
460                     var serviceInstances = _.filter(vm.serviceInstances, function(serviceInstance) {
461                         return _.includes(serviceInstancesIds, serviceInstance.id);
462                     });
463
464                     // logging only
465                     if (serviceInstancesIds.length === 0) {
466                         $log.error("loadVNFNames: no serviceInstancesIds for vnf", vnf);
467                     } else {
468                         $log.debug("loadVNFNames: serviceInstancesIds", serviceInstancesIds);
469                         $log.debug("loadVNFNames: serviceInstances", serviceInstances);
470                     }
471
472                     vm.vnfNames.push({
473                         "id": vnf.properties["vnf-id"],
474                         "name": vnf.properties["vnf-name"],
475                         "invariant-id": vnf.properties["model-invariant-id"],
476                         "service-instance-node": serviceInstances,
477                         "modelVersionId": vnf.properties["model-version-id"],
478                         "properties": vnf.properties,
479                         'cloudConfiguration': vServer,
480                         "relatedTo": vnf['related-to']
481                     });
482                 }
483             });
484         };
485
486         function extractLcpRegionIdAndTenantId(url) {
487
488             var cloudConfiguration = {
489                 lcpCloudRegionId: '',
490                 tenantId: ''
491             };
492
493             /*
494              e.g., in both URLs below -
495                - lcpCloudRegionId == 'rdm5b'
496                - tenantId == '0675e0709bd7444a9e13eba8b40edb3c'
497
498              "url": "https://aai-conexus-e2e.ecomp.cci.att.com:8443/aai/v10/cloud-infrastructure/cloud-regions/cloud-region/att-aic/rdm5b/tenants/tenant/0675e0709bd7444a9e13eba8b40edb3c/vservers/vserver/932b330d-733e-427d-a519-14eebd261f70"
499              "url": "/aai/v11/cloud-infrastructure/cloud-regions/cloud-region/att-aic/rdm5b/tenants/tenant/0675e0709bd7444a9e13eba8b40edb3c/vservers/vserver/932b330d-733e-427d-a519-14eebd261f70"
500              */
501
502             var cloudRegionMatch = url.match(/\/cloud-regions\/cloud-region\/[^\/]+\/([^\/]+)/);
503             var tenantMatch = url.match(/\/tenants\/tenant\/([^\/]+)/);
504
505             cloudConfiguration.lcpCloudRegionId = cloudRegionMatch[1];
506             cloudConfiguration.tenantId = tenantMatch[1];
507
508             return cloudConfiguration;
509         };
510
511         vm.loadWorkFlows = function () {
512             changeManagementService.getWorkflows(vm.changeManagement.vnfNames)
513                 .then(function(response) {
514                     vm.workflows = response.data.workflows;
515                 })
516                 .catch(function(error) {
517                     $log.error(error);
518                 });
519         };
520
521         //Must be $scope because we bind to the onchange of the html (cannot attached to vm variable).
522         $scope.selectFileForVNFName = function (fileInput) {
523             if (fileInput && fileInput.id) {
524                 var vnfName = _.filter(vm.changeManagement.vnfNames, {"invariant-id": fileInput.id});
525                 var file = fileInput.files[0];
526                 var fileReader = new FileReader();
527                 fileReader.onload = function (load) {
528                     try {
529                         var lines = load.target.result;
530                         vnfName[0].selectedFile = JSON.parse(lines);
531                     } catch (error) {
532                         $log.error(error);
533                     }
534                 };
535                 fileReader.readAsText(file);
536             }
537         };
538
539         vm.selectVersionForVNFName = function (vnfName) {
540             console.log("Will add version for selected vnf name: " + vnfName.name);
541         };
542
543         vm.isConfigUpdate = function () {
544             return vm.changeManagement.workflow === COMPONENT.WORKFLOWS.vnfConfigUpdate;
545         }
546                 
547         vm.isScaleOut = function () {
548             return vm.changeManagement.workflow === COMPONENT.WORKFLOWS.vnfScaleOut;
549         }
550
551         vm.shouldShowVnfInPlaceFields = function () {
552             return vm.changeManagement.workflow === COMPONENT.WORKFLOWS.vnfInPlace;
553         };
554
555         init();
556     }
557 })();