4 appDS2.controller("newChangeManagementModalController", ["$uibModalInstance", "$uibModal",'$q', "AaiService", "changeManagementService", "Upload",
5 "$log", "$scope", "_", "COMPONENT", "VIDCONFIGURATION", newChangeManagementModalController]);
7 function newChangeManagementModalController($uibModalInstance, $uibModal,$q, AaiService, changeManagementService, Upload, $log, $scope, _, COMPONENT, VIDCONFIGURATION) {
10 vm.configUpdatePatternError = "Invalid file type. Please select a file with a CSV extension.";
11 vm.configUpdateContentError = "Invalid file structure.";
13 vm.softwareVersionRegex = "[-a-zA-Z0-9\.]+";
15 var init = function () {
16 vm.changeManagement = {};
18 loadServicesCatalog();
19 registerVNFNamesWatcher();
23 var loadServicesCatalog = function () {
24 changeManagementService.getAllSDCServices()
25 .then(function (response) {
26 vm.SDCServicesCatalog = response.data;
28 .catch(function (error) {
33 var registerVNFNamesWatcher = function () {
34 $scope.$watch('vm.changeManagement.vnfNames', function (newVal, oldVal) {
35 if (!oldVal || newVal && newVal.length > oldVal.length) { //JUST THE LAST ONE ADDED
36 var newVNFName = _.last(vm.changeManagement.vnfNames);
38 vm.changeManagement.vnfNames = oldVal;
39 vm.changeManagement.vnfNames.push(newVNFName);
41 if (newVNFName && newVNFName["service-instance-node"]) {
42 var availableVersions = [];
43 var services = _.filter(vm.SDCServicesCatalog.services,
44 {"invariantUUID": newVNFName["service-instance-node"][0].properties["model-invariant-id"]});
46 _.each(services, function (service) {
47 changeManagementService.getSDCService(service.uuid)
48 .then(function (response) {
49 _.each(response.data.vnfs, function (vnf) {
50 if (newVNFName["invariant-id"] === vnf.invariantUuid) {
51 availableVersions.push(extractVNFModel(vnf, response.data.service, newVNFName));
54 var versions = _.uniqBy(availableVersions, 'modelInfo.modelVersion');
55 newVNFName.availableVersions = _.sortBy(_.uniq(versions, response.data.service, true),"modelInfo.modelVersion");
56 }).catch(function (error) {
65 var extractVNFModel = function (csarVNF, sdcService, selectionVNF) {
66 var versionCsarData = {
68 vnfName: csarVNF.name,
71 modelInvariantId: csarVNF.invariantUuid,
72 modelVersionId: selectionVNF.modelVersionId,
73 modelName: csarVNF.name,
74 modelVersion: csarVNF.version,
75 modelCustomizationName: csarVNF.modelCustomizationName,
76 modelCustomizationId: csarVNF.customizationUuid
79 lcpCloudRegionId: "mdt1",
80 tenantId: "88a6ca3ee0394ade9403f075db23167e"
84 suppressRollback: false,
87 relatedInstanceList: [
90 instanceId: selectionVNF["service-instance-node"]["0"].properties['service-instance-id'],
93 modelInvariantId: selectionVNF["service-instance-node"]["0"].properties['model-invariant-id'],
94 modelVersionId: selectionVNF.modelVersionId,
95 modelName: sdcService.name,
96 modelVersion: sdcService.version,
97 modelCustomizationName: selectionVNF["service-instance-node"]["0"].properties['model-customization-name'], //TODO: Missing
98 modelCustomizationId: selectionVNF["service-instance-node"]["0"].properties['model-customization-id']
108 return versionCsarData;
111 vm.close = function () {
112 $uibModalInstance.close();
115 vm.uploadConfigFile = function (file) {
116 var defer = $q.defer();
118 url: "change-management/uploadConfigUpdateFile",
120 transformResponse: [function (data) {
124 .then(function (configUpdateResponse) {
125 vm.changeManagement.configUpdateFile = configUpdateResponse && JSON.parse(configUpdateResponse.data).payload;
128 .catch(function (error) {
129 defer.resolve(false);
131 return defer.promise;
135 /***converting objects to scheduler format (taken from IST)***/
136 function extractChangeManagementCallbackDataStr(changeManagement) {
137 console.log(changeManagement);
139 result.requestType = changeManagement.workflow;
140 var workflowType = changeManagement.workflow;
141 result.requestDetails = [];
142 _.forEach(changeManagement.vnfNames, function (vnf) {
145 var requestInfoData ={};
146 var requestParametersData ={};
147 if (vnf.availableVersions && vnf.availableVersions.length!=0){
150 source: vnf.availableVersions[0].requestInfo.source,
151 suppressRollback: vnf.availableVersions[0].requestInfo.suppressRollback,
152 requestorId: vnf.availableVersions[0].requestInfo.requestorId
155 if(workflowType=='Update'){
156 requestParametersData = {
157 usePreload: vnf.availableVersions[0].requestParameters.usePreload
159 }else if(workflowType=="Replace"){
160 requestParametersData = {
161 rebuildVolumeGroups: vnf.availableVersions[0].requestParameters.usePreload
163 }else if(workflowType=="VNF In Place Software Update"){
165 'existing_software_version':changeManagement.existingSoftwareVersion,
166 'new_software_version':changeManagement.newSoftwareVersion,
167 'operations_timeout':changeManagement.operationTimeout
169 requestParametersData = {
170 payload: JSON.stringify(payloadObj)
172 }else if(workflowType=="VNF Config Update"){
173 requestParametersData = {
174 payload: changeManagement.configUpdateFile
177 $log.info('SchedulerWidgetCtrl:extractChangeManagementCallbackDataStr info:: workflowType '+ workflowType);
178 $log.info('SchedulerWidgetCtrl:extractChangeManagementCallbackDataStr info:: requestParametersData '+ requestParametersData);
180 }else if(workflowType=="VNF In Place Software Update"){
182 'existing_software_version':changeManagement.existingSoftwareVersion,
183 'new_software_version':changeManagement.newSoftwareVersion,
184 'operations_timeout':changeManagement.operationTimeout
186 requestParametersData = {
187 payload: JSON.stringify(payloadObj)
189 }else if(workflowType=="VNF Config Update"){
190 requestParametersData = {
191 payload: changeManagement.configUpdateFile
197 vnfInstanceId: vnf.id,
200 modelInvariantId: vnf.properties['model-invariant-id'],
201 modelVersionId: vnf.modelVersionId,
202 modelName: vnf.properties['vnf-name'],
203 modelVersion: vnf.version,
204 modelCustomizationName: vnf.properties['model-customization-name'],
205 modelCustomizationId: vnf.properties['model-customization-id']
207 cloudConfiguration: vnf.cloudConfiguration,
208 requestInfo: requestInfoData,
209 relatedInstanceList: [],
210 requestParameters:requestParametersData
213 var serviceInstanceId = '';
214 _.forEach(vnf['service-instance-node'], function (instanceNode) {
215 if(instanceNode['node-type'] === 'service-instance'){
216 serviceInstanceId = instanceNode.properties['service-instance-id'];
220 if (vnf.availableVersions && vnf.availableVersions.length!=0){
221 _.forEach(vnf.availableVersions[0].relatedInstanceList, function (related) {
222 var rel = related.relatedInstance;
223 var relatedInstance = {
224 instanceId: serviceInstanceId,
226 modelType: rel.modelInfo.modelType,
227 modelInvariantId: rel.modelInfo.modelInvariantId,
228 modelVersionId: rel.modelInfo.modelVersionId,
229 modelName: rel.modelInfo.modelName,
230 modelVersion: rel.modelInfo.modelVersion,
231 modelCustomizationName: rel.modelInfo.modelCustomizationName,
232 modelCustomizationId: rel.modelInfo.modelCustomizationId
235 if (rel.vnfInstanceId)
236 relatedInstance.instanceId = rel.vnfInstanceId;
238 data.relatedInstanceList.push({relatedInstance: relatedInstance});
242 $log.error('SchedulerCtrl::extractChangeManagementCallbackDataStr error: ' + err);
245 result.requestDetails.push(data);
247 return JSON.stringify(result);
250 vm.openModal = function () {
251 if(VIDCONFIGURATION.SCHEDULER_PORTAL_URL) { //scheduling supported
252 $scope.widgetParameter = ""; // needed by the scheduler?
254 // properties needed by the scheduler so it knows whether to show
255 // policy or sniro related features on the scheduler UI or not.
256 vm.changeManagement.policyYN = "Y";
257 vm.changeManagement.sniroYN = "Y";
260 widgetName: 'Portal-Common-Scheduler',
261 widgetData: vm.changeManagement,
262 widgetParameter: $scope.widgetParameter
265 window.parent.postMessage(data, VIDCONFIGURATION.SCHEDULER_PORTAL_URL);
267 //no scheduling support
268 var dataToSo = extractChangeManagementCallbackDataStr(vm.changeManagement);
269 var vnfName = vm.changeManagement.vnfNames[0].name;
270 changeManagementService.postChangeManagementNow(dataToSo, vnfName);
274 vm.loadSubscribers = function () {
276 AaiService.getSubscribers(function (response) {
277 vm.subscribers = response;
281 vm.loadServiceTypes = function () {
282 vm.serviceTypes = [];
284 AaiService.getSubscriberServiceTypes(vm.changeManagement.subscriberId)
285 .then(function (response) {
286 vm.serviceTypes = response.data;
288 .catch(function (error) {
293 vm.loadVNFTypes = function () {
295 vm.vnfTypesTemp = [];
296 vm.serviceInstances = [];
298 var instances = vm.changeManagement.serviceType["service-instances"]["service-instance"];
299 // var promiseArrOfGetVnfs = preparePromiseArrOfGetVnfs(instances);
303 AaiService.getVnfsByCustomerIdAndServiceType(
304 vm.changeManagement.subscriberId,
305 vm.changeManagement.serviceType["service-type"]
306 ).then(function (response) {
307 var vnfsData = response.data.results;
309 for (var i = 0; i < vnfsData.length; i++) {
311 const nodeType = vnfsData[i]['node-type'];
312 if (nodeType === "generic-vnf") {
313 if (_.find(vnfsData[i]['related-to'], function (node) {
314 return node['node-type'] === 'vserver'
316 vm.vnfs.push(vnfsData[i]);
318 } else if (nodeType === "service-instance") {
319 vm.serviceInstances.push(vnfsData[i]);
324 vm.vnfs = _.flattenDeep(
325 _.remove(vm.vnfs, function (vnf) {
326 var nfRole = vnf.properties['nf-role'];
327 if (nfRole !== undefined) {
328 return nfRole !== 'null' && nfRole !== '';
333 var filteredVnfs = _.uniqBy(vm.vnfs, function (vnf) {
334 return vnf.properties['nf-role'];
337 _.forEach(filteredVnfs, function (vnf) {
338 vm.vnfTypes.push(vnf.properties['nf-role'])
345 var fromVNFVersions = [];
347 vm.loadVNFVersions = function () {
348 fromVNFVersions = [];
349 vm.serviceInstancesToGetVersions = [];
351 _.forEach(vm.vnfs, function (vnf) {
352 if (vnf.properties['nf-role'] === vm.changeManagement['vnfType']) {
354 vm.serviceInstancesToGetVersions.push({
355 "model-invariant-id": vnf.properties["model-invariant-id"],
356 "model-version-id": vnf.properties["model-version-id"] }
359 versions.push(vnf.properties["model-invariant-id"]);
363 if (versions.length > 0) {
364 AaiService.getVnfVersionsByInvariantId(versions).then(function (response) {
367 $log.debug("getVnfVersionsByInvariantId: response", response);
369 fromVNFVersions = vm.serviceInstancesToGetVersions
370 .map(function (serviceInstanceToGetVersion) {
371 const model = _.find(response.data.model, {'model-invariant-id': serviceInstanceToGetVersion['model-invariant-id']});
372 $log.debug("getVnfVersionsByInvariantId: model for " + serviceInstanceToGetVersion['model-invariant-id'], model);
374 const modelVer = _.find(model["model-vers"]["model-ver"], {'model-version-id': serviceInstanceToGetVersion['model-version-id']});
375 $log.debug("getVnfVersionsByInvariantId: modelVer for " + serviceInstanceToGetVersion['model-version-id'], modelVer);
377 var modelVersionId = serviceInstanceToGetVersion["model-version-id"];
378 var modelVersion = modelVer["model-version"];
380 return {"key": modelVersionId, "value": modelVersion};
383 vm.fromVNFVersions = _.uniqBy(fromVNFVersions, 'value');
390 function getVnfs(modelInvariantId) {
391 return new Promise(function (resolve, reject) {
392 AaiService.getVnfVersionsByInvariantId(modelInvariantId)
393 .then(function (response) {
394 if (response.data.httpCode !== null &&
395 response.data.httpCode === 200) {
396 var vnfsData = response.data.t.results;
397 for (var i = 0; i < vnfsData.length; i++) {
399 if (vnfsData[i].nodeType === "generic-vnf") {
400 resolve(vnfsData[i]);
401 } else if (vnfsData[i].nodeType === "service-instance") {
402 vm.serviceInstances.push(vnfsData[i]);
410 .catch(function (error) {
416 var getVersionNameForId = function(versionId) {
417 var version = _.find(fromVNFVersions, {"key": versionId});
418 return version.value;
421 vm.loadVNFNames = function () {
423 const vnfs = vm.changeManagement.fromVNFVersion ? vm.vnfs : [];
424 _.forEach(vnfs, function (vnf) {
426 var selectedVersionNumber = getVersionNameForId(vm.changeManagement.fromVNFVersion);
428 if (vnf.properties['nf-role'] === vm.changeManagement.vnfType &&
429 selectedVersionNumber === getVersionNameForId(vnf.properties["model-version-id"])) {
432 _.forEach(vnf['related-to'], function (node) {
433 if (node['node-type'] === 'vserver') {
434 vServer = extractLcpRegionIdAndTenantId(node.url);
438 var serviceInstancesIds =
439 _.filter(vnf['related-to'], {'node-type': 'service-instance'})
440 .map(function (serviceInstance) { return serviceInstance.id });
442 var serviceInstances = _.filter(vm.serviceInstances, function(serviceInstance) {
443 return _.includes(serviceInstancesIds, serviceInstance.id);
447 if (serviceInstancesIds.length === 0) {
448 $log.error("loadVNFNames: no serviceInstancesIds for vnf", vnf);
450 $log.debug("loadVNFNames: serviceInstancesIds", serviceInstancesIds);
451 $log.debug("loadVNFNames: serviceInstances", serviceInstances);
455 "id": vnf.properties["vnf-id"],
456 "name": vnf.properties["vnf-name"],
457 "invariant-id": vnf.properties["model-invariant-id"],
458 "service-instance-node": serviceInstances,
459 "modelVersionId": vnf.properties["model-version-id"],
460 "properties": vnf.properties,
461 'cloudConfiguration': vServer,
462 "relatedTo": vnf['related-to']
468 function extractLcpRegionIdAndTenantId(url) {
470 var cloudConfiguration = {
471 lcpCloudRegionId: '',
476 e.g., in both URLs below -
477 - lcpCloudRegionId == 'rdm5b'
478 - tenantId == '0675e0709bd7444a9e13eba8b40edb3c'
480 "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"
481 "url": "/aai/v11/cloud-infrastructure/cloud-regions/cloud-region/att-aic/rdm5b/tenants/tenant/0675e0709bd7444a9e13eba8b40edb3c/vservers/vserver/932b330d-733e-427d-a519-14eebd261f70"
484 var cloudRegionMatch = url.match(/\/cloud-regions\/cloud-region\/[^\/]+\/([^\/]+)/);
485 var tenantMatch = url.match(/\/tenants\/tenant\/([^\/]+)/);
487 cloudConfiguration.lcpCloudRegionId = cloudRegionMatch[1];
488 cloudConfiguration.tenantId = tenantMatch[1];
490 return cloudConfiguration;
493 vm.loadWorkFlows = function () {
494 changeManagementService.getWorkflows(vm.changeManagement.vnfNames)
495 .then(function(response) {
496 vm.workflows = response.data.workflows;
498 .catch(function(error) {
503 //Must be $scope because we bind to the onchange of the html (cannot attached to vm variable).
504 $scope.selectFileForVNFName = function (fileInput) {
505 if (fileInput && fileInput.id) {
506 var vnfName = _.filter(vm.changeManagement.vnfNames, {"invariant-id": fileInput.id});
507 var file = fileInput.files[0];
508 var fileReader = new FileReader();
509 fileReader.onload = function (load) {
511 var lines = load.target.result;
512 vnfName[0].selectedFile = JSON.parse(lines);
517 fileReader.readAsText(file);
521 vm.selectVersionForVNFName = function (vnfName) {
522 console.log("Will add version for selected vnf name: " + vnfName.name);
525 vm.isConfigUpdate = function () {
526 return vm.changeManagement.workflow === COMPONENT.WORKFLOWS.vnfConfigUpdate;
529 vm.shouldShowVnfInPlaceFields = function () {
530 return vm.changeManagement.workflow === COMPONENT.WORKFLOWS.vnfInPlace;