Feature: 11055 Support of several node groups in clusters created by OSM

	- Added control plane support in managed post
	- When aws vim account is selected paylaod will get differed
	- Added details page in clusters to view node and ksu for
	  specified cluster
	- Fixed Bug 2402 - Unable to create Ns Config template from Ui
	  bug by chnaging api

Change-Id: I4eb327fd86b0c4a706b05a8ed10524e4d2c5bc95
Signed-off-by: SANDHYA.JS <sandhya.j@tataelxsi.co.in>
diff --git a/src/app/utilities/compose-packages/ComposePackages.html b/src/app/utilities/compose-packages/ComposePackages.html
index 007b0ab..be8081e 100644
--- a/src/app/utilities/compose-packages/ComposePackages.html
+++ b/src/app/utilities/compose-packages/ComposePackages.html
@@ -36,9 +36,12 @@
       <label class="col-sm-12 col-form-label mandatory-label"
         [ngClass]="{'text-danger': packagesForm.invalid === true && submitted === true}">{{'MANDATORYCHECK' |
         translate}}</label>
-      <label class="col-sm-6 col-form-label" *ngIf="!template && !oka">{{'PACKAGE' | translate}} {{'NAME' | translate}}*</label>
-      <label class="col-sm-6 col-form-label" *ngIf="!template && params.page === 'oka-packages'">{{'PACKAGE' | translate}} {{'NAME' | translate}}*</label>
-      <label class="col-sm-6 col-form-label" *ngIf="!template && params.page === 'oka-packages-edit'">{{'PACKAGE' | translate}} {{'NAME' | translate}}</label>
+      <label class="col-sm-6 col-form-label" *ngIf="!template && !oka">{{'PACKAGE' | translate}} {{'NAME' |
+        translate}}*</label>
+      <label class="col-sm-6 col-form-label" *ngIf="!template && params.page === 'oka-packages'">{{'PACKAGE' |
+        translate}} {{'NAME' | translate}}*</label>
+      <label class="col-sm-6 col-form-label" *ngIf="!template && params.page === 'oka-packages-edit'">{{'PACKAGE' |
+        translate}} {{'NAME' | translate}}</label>
       <label class="col-sm-6 col-form-label" *ngIf="template">{{'NAME' | translate}}*</label>
       <div class="col-sm-6">
         <input type="text" class="form-control" placeholder="{{'NAME' | translate}}" formControlName="name" id="name"
@@ -81,7 +84,7 @@
       <label class="col-sm-6 col-form-label">{{'CONFIG' | translate}}*</label>
       <div class="col-sm-6">
         <textarea rows="10" cols="50" class="form-control" placeholder="{{'YAMLCONFIG' | translate}}"
-          formControlName="config" id="config"></textarea>
+          formControlName="config" id="config" [ngClass]="{ 'is-invalid': submitted && f.config.errors }"></textarea>
         <div class="fileupload-text mt-1 mb-1">{{'FILEUPLOADLABEL' | translate}}</div>
         <div class="custom-file">
           <input type="file" #fileInputConfig class="fileupload custom-file-input"
@@ -91,7 +94,8 @@
     </div>
     <div class="form-group row mb-3" *ngIf="oka">
       <label class="col-sm-6 col-form-label" *ngIf="params.page === 'oka-packages'">{{'PACKAGE' | translate}}*</label>
-      <label class="col-sm-6 col-form-label" *ngIf="params.page === 'oka-packages-edit'">{{'PACKAGE' | translate}}</label>
+      <label class="col-sm-6 col-form-label" *ngIf="params.page === 'oka-packages-edit'">{{'PACKAGE' |
+        translate}}</label>
       <div class="col-sm-6">
         <label for="fileInput" class="custom-file-upload" *ngIf="this.params.page === 'oka-packages-edit'">
           <input type="file" #fileInput class="fileupload custom-file-input" formControlName="package"
diff --git a/src/app/utilities/compose-packages/ComposePackages.ts b/src/app/utilities/compose-packages/ComposePackages.ts
index a8114d0..d294f7f 100644
--- a/src/app/utilities/compose-packages/ComposePackages.ts
+++ b/src/app/utilities/compose-packages/ComposePackages.ts
@@ -30,7 +30,6 @@
 import { environment } from 'environment';
 import * as jsyaml from 'js-yaml';
 import { NSConfigData } from 'NSCONFIGTEMPLATEMODEL';
-import { NSDDetails } from 'NSDModel';
 import * as pako from 'pako';
 import { RestService } from 'RestService';
 import { SharedService, isNullOrUndefined } from 'SharedService';
@@ -204,6 +203,7 @@
       this.getNsdPackageDetails();
       this.getFormControl('profile_type').disable();
       this.getFormControl('description').disable();
+      this.getFormControl('package').disable();
     } else if (this.params.page === 'ns-config-template-edit') {
       this.template = true;
       this.oka = false;
@@ -211,6 +211,7 @@
       this.getFormControl('profile_type').disable();
       this.getFormControl('nsdId').disable();
       this.getFormControl('description').disable();
+      this.getFormControl('package').disable();
     } else if (this.params.page === 'oka-packages') {
       this.oka = true;
       this.template = false;
@@ -241,7 +242,7 @@
     this.packagesForm = this.formBuilder.group({
       name: ['', [Validators.required]],
       nsdId: [null, [Validators.required]],
-      config: [null],
+      config: [null, [Validators.required]],
       profile_type: [null],
       description: ['', [Validators.required]],
       package: ['']
@@ -269,7 +270,7 @@
 
   /** Get NSD Package details @public */
   public getNsdPackageDetails(): void {
-    this.restService.getResource(environment.OKAPACKAGES_URL)
+    this.restService.getResource(environment.NSDESCRIPTORSCONTENT_URL)
       .subscribe((nsdPackageData: []): void => {
         nsdPackageData.forEach((nsData: VNFD): void => {
           const names: {} = {
@@ -336,6 +337,12 @@
     };
     this.addNullValueForInvalidFiles();
     this.sharedService.cleanForm(this.packagesForm);
+    if (this.params.page === 'ns-config-template-edit' || this.params.page === 'ns-config-template') {
+      if (this.packagesForm.value.config.trim() === '' || isNullOrUndefined(this.packagesForm.value.config)) {
+        this.packagesForm.controls.config.setErrors({ configIsEmpty: true });
+        this.packagesForm.get('config').setValue(this.packagesForm.get('config').value.trim());
+      }
+    }
     if (!this.packagesForm.invalid) {
       this.isLoadingResults = true;
       if (this.params.page === 'ns-package' || this.params.page === 'vnf-package') {
@@ -443,16 +450,12 @@
       url: urlHeader,
       httpOptions: { headers: this.headers }
     };
-    if (isNullOrUndefined(this.packagesForm.value.config) || this.packagesForm.value.config === '') {
-      delete this.packagesForm.value.config;
+    const validJSON: boolean = this.sharedService.checkJson(this.packagesForm.value.config);
+    if (validJSON) {
+      this.packagesForm.value.config = JSON.parse(this.packagesForm.value.config);
     } else {
-      const validJSON: boolean = this.sharedService.checkJson(this.packagesForm.value.config);
-      if (validJSON) {
-        this.packagesForm.value.config = JSON.parse(this.packagesForm.value.config);
-      } else {
-        const getConfigJson: string = jsyaml.load(this.packagesForm.value.config, { json: true });
-        this.packagesForm.value.config = getConfigJson;
-      }
+      const getConfigJson: string = jsyaml.load(this.packagesForm.value.config, { json: true });
+      this.packagesForm.value.config = getConfigJson;
     }
     this.restService.putResource(apiURLHeader, (this.packagesForm.value)).subscribe((result: {}): void => {
       this.activeModal.close(this.modalData);
diff --git a/src/app/utilities/delete/DeleteComponent.html b/src/app/utilities/delete/DeleteComponent.html
index c7a6c62..7c90b6e 100644
--- a/src/app/utilities/delete/DeleteComponent.html
+++ b/src/app/utilities/delete/DeleteComponent.html
@@ -28,9 +28,14 @@
     <i class="fas fa-times-circle text-danger"></i>
   </button>
 </div>
-<div class="modal-body">
-  <span>{{'DELETECONFIRMPOPUPMESSAGE' | translate}} <b>{{ this.title }}</b> ?</span>
+<div class="modal-body" *ngIf="createdbyosm === 'false'; else Deletemessage">
+  <span>{{'DEREGISTERCONFIRMPOPUPMESSAGE' | translate}} <b>{{ this.title }}</b> ?</span>
 </div>
+<ng-template #Deletemessage>
+  <div class="modal-body">
+    <span>{{'DELETECONFIRMPOPUPMESSAGE' | translate}} <b>{{ this.title }}</b> ?</span>
+  </div>
+</ng-template>
 <div class="modal-footer">
   <button (click)="activeModal.close()" class="btn btn-danger">{{'CANCEL' | translate}}</button>
   <button *ngIf="!isPage; else multiDelete" (click)="deleteData();" class="btn btn-primary">{{'OK' | translate}}</button>
diff --git a/src/app/utilities/delete/DeleteComponent.ts b/src/app/utilities/delete/DeleteComponent.ts
index f65712d..a54b67e 100644
--- a/src/app/utilities/delete/DeleteComponent.ts
+++ b/src/app/utilities/delete/DeleteComponent.ts
@@ -132,7 +132,11 @@
       if (sessionStorage.getItem('clusterType') === 'Registered') {
         this.isRegisterPage = true;
       }
-      this.createdbyosm = data.createdbyosm;
+      if (data.createdbyosm === 'NO' || data.createdbyosm === 'false') {
+        this.createdbyosm = 'false';
+      } else {
+        this.createdbyosm = 'true';
+      }
       this.bootstrap = data.bootstrap;
       this.key = data.key;
       if (!isNullOrUndefined(this.params)) {
@@ -170,6 +174,11 @@
     } else if (data.productName !== undefined) {
       this.title = data.productName;
     }
+    if (data.createdbyosm === 'NO' || data.createdbyosm === 'false') {
+      this.createdbyosm = 'false';
+    } else {
+      this.createdbyosm = 'true';
+    }
   }
   /** Generate Delete url from data @public */
   // eslint-disable-next-line complexity
@@ -184,6 +193,10 @@
       } else if (this.params.page === 'instantiateNS') {
         this.deleteURL = environment.NSINSTANCESTERMINATE_URL;
         this.notifyMessage = 'DELETEDSUCCESSFULLY';
+      } else if (this.params.page === 'card-node') {
+        this.title = this.params.name;
+      } else if (this.params.page === 'card-ksu') {
+        this.title = this.params.name;
       }
     }
     if (data.page === 'ns-package') {
@@ -249,6 +262,8 @@
     } else if (data.page === 'k8-cluster') {
       this.forceDelete = this.params.forceDeleteType;
       this.page = data.page;
+    } else if (data.page === 'k8s-node') {
+      this.deleteURL = environment.K8SCREATECLUSTER_URL + '/' + data.cluster_id + '/node';
     }
   }
   /** Generate Data function @public */
@@ -265,23 +280,26 @@
         }
       }
       deletingURl = this.deleteURL + '/' + this.id + '?FORCE=true';
-      this.notifyMessage = 'DELETEDSUCCESSFULLY';
+      this.notifyMessage =  'DELETELOADMESSAGE';
     } else if (this.page === 'k8-cluster') {
       if (this.createdbyosm === 'true') {
         this.deleteURL = environment.K8SCREATECLUSTER_URL;
         deletingURl = this.deleteURL + '/' + this.id;
       } else {
-        if (this.bootstrap === false && this.key === true) {
+        if (this.key === false) {
+          this.deleteURL = environment.K8SCREATECLUSTER_URL;
+          deletingURl = this.deleteURL + '/' + this.id + '/deregister';
+        } else if (this.key === true) {
           this.deleteURL = environment.K8SCLUSTER_URL;
           deletingURl = this.deleteURL + '/' + this.id;
-        } else if (this.bootstrap === false && this.key === false) {
-          this.deleteURL = environment.K8SCREATECLUSTER_URL;
-          deletingURl = this.deleteURL + '/' + this.id + '/deregister';
         }
-        else if (this.bootstrap === true) {
-          this.deleteURL = environment.K8SCREATECLUSTER_URL;
-          deletingURl = this.deleteURL + '/' + this.id + '/deregister';
-        }
+      }
+    } else if (!isNullOrUndefined(this.params)) {
+      if (this.params.page === 'card-node') {
+        this.createdbyosm = 'true';
+        deletingURl = environment.K8SCREATECLUSTER_URL + '/' + this.params.cluster_id + '/nodegroup' + '/' + this.params.id;
+      } else if (this.params.page === 'card-ksu') {
+        deletingURl = environment.KSU_URL + '/' + this.params.id;
       }
     } else {
       deletingURl = this.deleteURL + '/' + this.id;
diff --git a/src/app/utilities/oka-packages-action/OkaPackagesActionComponent.html b/src/app/utilities/oka-packages-action/OkaPackagesActionComponent.html
index c7627d8..74833a6 100644
--- a/src/app/utilities/oka-packages-action/OkaPackagesActionComponent.html
+++ b/src/app/utilities/oka-packages-action/OkaPackagesActionComponent.html
@@ -16,11 +16,11 @@
 Author: SANDHYA JS (sandhya.j@tataelxsi.co.in)
 -->
 <div class="btn-group list action" role="group">
-  <button type="button" class="btn btn-primary" (click)="deleteoka(false)"
+  <button [disabled]="state != 'READY'" type="button" class="btn btn-primary" (click)="deleteoka(false)"
     placement="top" container="body" ngbTooltip="{{'DELETE' | translate}}">
     <i class="far fa-trash-alt icons"></i>
   </button>
-  <button [disabled]="state != 'CREATED'" type="button" class="btn btn-primary" (click)="okaEdit()" placement="top"
+  <button [disabled]="state != 'READY'" type="button" class="btn btn-primary" (click)="okaEdit()" placement="top"
     container="body" ngbTooltip="{{'EDIT' | translate}}">
     <i class="far fa-edit icons"></i>
   </button>
@@ -29,4 +29,4 @@
     <i class="fas fa-trash-alt icons text-danger" title="delete"></i>
   </button>
 </div>
-<app-loader [waitingMessage]="message" *ngIf="isLoadingDownloadResult"></app-loader>
\ No newline at end of file
+<app-loader [waitingMessage]="message" *ngIf="isLoadingDownloadResult"></app-loader>
diff --git a/src/app/utilities/show-info/ShowInfoComponent.ts b/src/app/utilities/show-info/ShowInfoComponent.ts
index 6c21ac5..b3c0fbe 100644
--- a/src/app/utilities/show-info/ShowInfoComponent.ts
+++ b/src/app/utilities/show-info/ShowInfoComponent.ts
@@ -201,10 +201,10 @@
       } else {
         if (this.params.bootstrap === true) {
           this.url = environment.K8SCREATECLUSTER_URL + '/' + this.params.id;
-        } else if (this.params.bootstrap === false && this.params.key === false) {
-          this.url = environment.K8SCREATECLUSTER_URL + '/' + this.params.id;
-        } else if (this.params.bootstrap === false && this.params.key === true) {
+        } else if (this.params.createdbyosm === 'NO') {
           this.url = environment.K8SCLUSTER_URL + '/' + this.params.id;
+        } else if (this.params.key === true) {
+          this.url = environment.K8SCREATECLUSTER_URL + '/' + this.params.id;
         }
       }
       this.restService.getResource(this.url).subscribe((k8sclusterOpn: {}[]) => {
@@ -215,6 +215,26 @@
       }, () => {
         this.isLoadingResults = false;
       });
+    } else if (this.params.page === 'k8s-node') {
+      this.url = environment.K8SCREATECLUSTER_URL + '/' + this.params.cluster_id + '/nodegroup' + '/' + this.params.id;
+      this.restService.getResource(this.url).subscribe((k8sclusterOpn: {}[]) => {
+        this.defaults['text/json'] = JSON.stringify(k8sclusterOpn, null, '\t');
+      }, (error: ERRORDATA) => {
+        this.isLoadingResults = false;
+        this.restService.handleError(error, 'get');
+      }, () => {
+        this.isLoadingResults = false;
+      });
+    } else if (this.params.page === 'k8s-ksu') {
+      this.url = environment.KSU_URL + '/' + this.params.id;
+      this.restService.getResource(this.url).subscribe((k8sclusterOpn: {}[]) => {
+        this.defaults['text/json'] = JSON.stringify(k8sclusterOpn, null, '\t');
+      }, (error: ERRORDATA) => {
+        this.isLoadingResults = false;
+        this.restService.handleError(error, 'get');
+      }, () => {
+        this.isLoadingResults = false;
+      });
     } else if (this.params.page === 'k8s-repo') {
       this.restService.getResource(environment.K8REPOS_URL + '/' +
         this.params.id).subscribe((k8srepoOpn: {}[]) => {