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 { SharedService } from 'SharedService';
+import { forkJoin, Observable } from 'rxjs';
+import { ScalingComponent } from 'ScalingComponent';
+import { SharedService, isNullOrUndefined } from 'SharedService';
import { ShowInfoComponent } from 'ShowInfoComponent';
+import { StartStopRebuildComponent } from 'StartStopRebuildComponent';
+import { VmMigrationComponent } from 'VmMigrationComponent';
+import { DF, VDU, VNFD } from 'VNFDModel';
/**
* Creating component
* @Component takes NSInstancesActionComponent.html as template url
/** 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;
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;
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',
/** 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.componentInstance.params = {
+ forceDeleteType: forceAction,
+ name: this.value.name,
+ page: 'ns-instance',
+ id: this.instanceID
+ };
+ 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,
- name: this.value.NsdName
+ 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
+ });
+ }
+
+ /** 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);
+ }
}