X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;f=src%2Fapp%2Futilities%2Fns-instances-action%2FNSInstancesActionComponent.ts;h=08e5e97272e8d4479100d591b9a3997af03f5c2c;hb=319d328d0bbb1e156ac767851c8c33acb518dc94;hp=8bf43cee5807a3a3626a8e3bea799fdde1ed48af;hpb=3b4814aa2d3dec621dadb52f058ba95a3dc3a86a;p=osm%2FNG-UI.git diff --git a/src/app/utilities/ns-instances-action/NSInstancesActionComponent.ts b/src/app/utilities/ns-instances-action/NSInstancesActionComponent.ts index 8bf43ce..08e5e97 100644 --- a/src/app/utilities/ns-instances-action/NSInstancesActionComponent.ts +++ b/src/app/utilities/ns-instances-action/NSInstancesActionComponent.ts @@ -18,6 +18,7 @@ /** * @file NS InstancesAction Component */ +import { isNullOrUndefined } from 'util'; import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Injector } from '@angular/core'; import { Router } from '@angular/router'; import { NgbModal, NgbModalRef } from '@ng-bootstrap/ng-bootstrap'; @@ -26,12 +27,20 @@ import { NotifierService } from 'angular-notifier'; import { ERRORDATA, MODALCLOSERESPONSEDATA } from 'CommonModel'; import { DeleteComponent } from 'DeleteComponent'; import { environment } from 'environment'; +import { HealingComponent } from 'HealingComponent'; import { NSDDetails } from 'NSDModel'; import { NSDInstanceData } from 'NSInstanceModel'; import { NSPrimitiveComponent } from 'NSPrimitiveComponent'; +import { NsUpdateComponent } from 'NsUpdateComponent'; import { RestService } from 'RestService'; +import { forkJoin, Observable } from 'rxjs'; +import { ScalingComponent } from 'ScalingComponent'; import { SharedService } from 'SharedService'; import { ShowInfoComponent } from 'ShowInfoComponent'; +import { StartStopRebuildComponent } from 'StartStopRebuildComponent'; +import { VerticalScalingComponent } from 'VerticalScalingComponent'; +import { VmMigrationComponent } from 'VmMigrationComponent'; +import { DF, VDU, VNFD } from 'VNFDModel'; /** * Creating component * @Component takes NSInstancesActionComponent.html as template url @@ -58,21 +67,36 @@ export class NSInstancesActionComponent { /** Operational Status Check @public */ public operationalStatus: string; + /** CNF Status Check @public */ + public k8sStatus: boolean = false; + + /** get Admin Details @public */ + public getAdminDetails: {}; + + /** Scaling is accepted @public */ + public isScalingPresent: boolean = false; + /** Check the loading results for loader status @public */ - public isLoadingMetricsResult: boolean = false; + public isLoadingNSInstanceAction: boolean = false; /** Give the message for the loading @public */ public message: string = 'PLEASEWAIT'; + /** Assign the VNF Details @public */ + public vnfDetails: VNFD[] = []; + + /** Contains instance ID @public */ + public instanceID: string; + + /** Contains operational dashboard view @public */ + public isShowOperationalDashboard: boolean = false; + /** Instance of the modal service @private */ private modalService: NgbModal; /** Holds teh instance of AuthService class of type AuthService @private */ private router: Router; - /** Contains instance ID @private */ - private instanceID: string; - /** Contains all methods related to shared @private */ private sharedService: SharedService; @@ -86,7 +110,8 @@ export class NSInstancesActionComponent { private cd: ChangeDetectorRef; /** Set timeout @private */ - private timeOut: number = 1000; + // eslint-disable-next-line @typescript-eslint/no-magic-numbers + private timeOut: number = 100; constructor(injector: Injector) { this.injector = injector; @@ -106,10 +131,28 @@ export class NSInstancesActionComponent { this.configStatus = this.value.ConfigStatus; this.operationalStatus = this.value.OperationalStatus; this.instanceID = this.value.identifier; + this.getAdminDetails = this.value.adminDetails; + for (const key of Object.keys(this.getAdminDetails)) { + if (key === 'deployed') { + // eslint-disable-next-line security/detect-object-injection + const adminData: {} = this.getAdminDetails[key]; + for (const k8sData of Object.keys(adminData)) { + if (k8sData === 'K8s') { + // eslint-disable-next-line security/detect-object-injection + if (adminData[k8sData].length !== 0) { + this.k8sStatus = true; + } + } + } + } + } + this.isShowOperationalDashboard = !isNullOrUndefined(this.value.vcaStatus) ? + Object.keys(this.value.vcaStatus).length === 0 && typeof this.value.vcaStatus === 'object' : true; } /** Shows information using modalservice @public */ public infoNs(): void { + // eslint-disable-next-line security/detect-non-literal-fs-filename this.modalService.open(ShowInfoComponent, { backdrop: 'static' }).componentInstance.params = { id: this.instanceID, page: 'ns-instance', @@ -119,63 +162,227 @@ export class NSInstancesActionComponent { /** Delete NS Instanace @public */ public deleteNSInstance(forceAction: boolean): void { + // eslint-disable-next-line security/detect-non-literal-fs-filename const modalRef: NgbModalRef = this.modalService.open(DeleteComponent, { backdrop: 'static' }); modalRef.componentInstance.params = { forceDeleteType: forceAction }; - modalRef.result.then((result: MODALCLOSERESPONSEDATA) => { + modalRef.result.then((result: MODALCLOSERESPONSEDATA): void => { if (result) { this.sharedService.callData(); } - }).catch(); + }).catch((): void => { + // Catch Navigation Error + }); } /** History of operations for an Instanace @public */ public historyOfOperations(): void { - this.router.navigate(['/instances/ns/history-operations/', this.instanceID]).catch(() => { + this.router.navigate(['/instances/ns/history-operations/', this.instanceID]).catch((): void => { // Catch Navigation Error }); } /** NS Topology */ public nsTopology(): void { - this.router.navigate(['/instances/ns/', this.instanceID]).catch(() => { + this.router.navigate(['/instances/ns/', this.instanceID]).catch((): void => { // Catch Navigation Error }); } /** Exec NS Primitive @public */ public execNSPrimitiveModal(): void { - this.modalService.open(NSPrimitiveComponent).componentInstance.params = { + // eslint-disable-next-line security/detect-non-literal-fs-filename + this.modalService.open(NSPrimitiveComponent, { backdrop: 'static' }).componentInstance.params = { memberIndex: this.value.memberIndex, - nsConfig: this.value.nsConfig + nsConfig: this.value.nsConfig, + name: this.value.NsdName, + id: this.value.constituent }; } /** Redirect to Grafana Metrics @public */ public metrics(): void { - this.isLoadingMetricsResult = true; - this.restService.getResource(environment.NSDINSTANCES_URL + '/' + this.instanceID).subscribe((nsData: NSDDetails[]) => { - nsData['vnfd-id'].forEach((vnfdID: string[]) => { + this.isLoadingNSInstanceAction = true; + this.restService.getResource(environment.NSDINSTANCES_URL + '/' + this.instanceID).subscribe((nsData: NSDDetails[]): void => { + nsData['vnfd-id'].forEach((vnfdID: string[]): void => { this.restService.getResource(environment.VNFPACKAGES_URL + '/' + vnfdID) - .subscribe((vnfd: {}[]) => { - if (vnfd['monitoring-param'] !== undefined && vnfd['monitoring-param'].length > 0) { - this.isLoadingMetricsResult = false; - const location: string = environment.GRAFANA_URL + '/' + this.instanceID + '/osm-ns-metrics-metrics'; - window.open(location); - } else { - this.isLoadingMetricsResult = false; - this.notifierService.notify('error', this.translateService.instant('GRAFANA.METRICSERROR')); - } - setTimeout(() => { - this.cd.detectChanges(); - }, this.timeOut); - }, (error: ERRORDATA) => { + .subscribe((vnfd: VNFD): void => { + vnfd.vdu.forEach((vduData: VDU): void => { + if (vduData['monitoring-parameter'] !== undefined && vduData['monitoring-parameter'].length > 0) { + this.isLoadingNSInstanceAction = false; + const location: string = environment.GRAFANA_URL + '/' + this.instanceID + '/osm-ns-metrics-metrics'; + // eslint-disable-next-line security/detect-non-literal-fs-filename + window.open(location); + } else { + this.isLoadingNSInstanceAction = false; + this.notifierService.notify('error', this.translateService.instant('PAGE.NSMETRIC.METRICERROR')); + } + }); + this.doChanges(); + }, (error: ERRORDATA): void => { this.restService.handleError(error, 'get'); - this.isLoadingMetricsResult = false; + this.isLoadingNSInstanceAction = false; }); }); - }, (error: ERRORDATA) => { + }, (error: ERRORDATA): void => { this.restService.handleError(error, 'get'); - this.isLoadingMetricsResult = false; + this.isLoadingNSInstanceAction = false; + }); + } + + /** + * Do the manual scaling + * Here we are going to get a list of VNFD ID used in the instances + * and have this in array with URL created then pass to checkscaling method for forkjoin to get the data @public + */ + public manualScaling(): void { + this.isLoadingNSInstanceAction = true; + const tempURL: Observable<{}>[] = []; + this.value.vnfID.forEach((id: string): void => { + const apiUrl: string = environment.VNFPACKAGESCONTENT_URL + '/' + id; + tempURL.push(this.restService.getResource(apiUrl)); + }); + this.checkScaling(tempURL); + } + + /** + * Used to forkjoin to all the request to send parallely, get the data and check 'scaling-aspect' key is present @public + */ + public checkScaling(URLS: Observable<{}>[]): void { + forkJoin(URLS).subscribe((data: VNFD[]): void => { + this.vnfDetails = data; + if (this.vnfDetails.length > 0) { + this.vnfDetails.forEach((vnfdData: VNFD): void => { + vnfdData.df.forEach((dfData: DF): void => { + if (!isNullOrUndefined(dfData['scaling-aspect']) && dfData['scaling-aspect'].length > 0) { + this.isScalingPresent = true; + } + }); + }); + } + this.isLoadingNSInstanceAction = false; + if (this.isScalingPresent) { + this.openScaling(); + } else { + this.notifierService.notify('error', this.translateService.instant('SCALINGNOTFOUND')); + } + this.doChanges(); + }); + } + + /** Open the scaling pop-up @public */ + public openScaling(): void { + // eslint-disable-next-line security/detect-non-literal-fs-filename + const modalRef: NgbModalRef = this.modalService.open(ScalingComponent, { backdrop: 'static' }); + modalRef.componentInstance.params = { + id: this.instanceID, + vnfID: this.value.vnfID, + nsID: this.value['nsd-id'], + nsd: this.value.nsd, + data: this.vnfDetails + }; + modalRef.result.then((result: MODALCLOSERESPONSEDATA): void => { + if (result) { + this.sharedService.callData(); + } + }).catch((): void => { + // Catch Navigation Error }); } + + /** To open VM Migration in NS Instances */ + public openVmMigration(): void { + // eslint-disable-next-line security/detect-non-literal-fs-filename + const modalRef: NgbModalRef = this.modalService.open(VmMigrationComponent, { backdrop: 'static' }); + modalRef.componentInstance.params = { + id: this.instanceID + }; + modalRef.result.then((result: MODALCLOSERESPONSEDATA): void => { + if (result) { + this.sharedService.callData(); + } + }).catch((): void => { + // Catch Navigation Error + }); + } + + /** To open the Ns Update pop-up */ + public openNsUpdate(): void { + // eslint-disable-next-line security/detect-non-literal-fs-filename + const modalRef: NgbModalRef = this.modalService.open(NsUpdateComponent, { backdrop: 'static' }); + modalRef.componentInstance.params = { + id: this.instanceID + }; + modalRef.result.then((result: MODALCLOSERESPONSEDATA): void => { + if (result) { + this.sharedService.callData(); + } + }).catch((): void => { + // Catch Navigation Error + }); + } + + /** To open the Start, Stop & Rebuild pop-up */ + public openStart(actionType: string): void { + // eslint-disable-next-line security/detect-non-literal-fs-filename + const modalRef: NgbModalRef = this.modalService.open(StartStopRebuildComponent, { backdrop: 'static' }); + modalRef.componentInstance.params = { + id: this.instanceID + }; + if (actionType === 'start') { + modalRef.componentInstance.instanceTitle = this.translateService.instant('START'); + } else if (actionType === 'stop') { + modalRef.componentInstance.instanceTitle = this.translateService.instant('STOP'); + } else { + modalRef.componentInstance.instanceTitle = this.translateService.instant('REBUILD'); + } + modalRef.componentInstance.instanceType = actionType; + modalRef.result.then((result: MODALCLOSERESPONSEDATA): void => { + if (result) { + this.sharedService.callData(); + } + }).catch((): void => { + // Catch Navigation Error + }); + } + + /** To open the vertical Scaling pop-up */ + public openVerticalScaling(): void { + // eslint-disable-next-line security/detect-non-literal-fs-filename + const modalRef: NgbModalRef = this.modalService.open(VerticalScalingComponent, { backdrop: 'static' }); + modalRef.componentInstance.params = { + id: this.instanceID + }; + modalRef.result.then((result: MODALCLOSERESPONSEDATA): void => { + if (result) { + this.sharedService.callData(); + } + }).catch((): void => { + // Catch Navigation Error + }); + } + + /** Open the Healing pop-up @public */ + public openHealing(): void { + // eslint-disable-next-line security/detect-non-literal-fs-filename + const modalRef: NgbModalRef = this.modalService.open(HealingComponent, { backdrop: 'static' }); + modalRef.componentInstance.params = { + id: this.instanceID + }; + modalRef.result.then((result: MODALCLOSERESPONSEDATA): void => { + if (result) { + this.sharedService.callData(); + } + }).catch((): void => { + // Catch Navigation Error + }); + } + + /** + * Check any changes in the child component @public + */ + public doChanges(): void { + setTimeout((): void => { + this.cd.detectChanges(); + }, this.timeOut); + } }