Advanced Cluster Management Enhancements

	- Chnaged cluster page design from switch to single page
	- Added bootstrap option in creation and registration
	- Added horizontal scaling, vertical scaling and upgrade in
	  cluster action
	- In cluster page, for list combined two apis to show list done
	  temporary fix from UI

Change-Id: Ie4d30f5db28025ec92398cc60fc50ab7030f8f9b
Signed-off-by: SANDHYA.JS <sandhya.j@tataelxsi.co.in>
diff --git a/src/app/k8s/k8s-add-cluster/K8sAddClusterComponent.html b/src/app/k8s/k8s-add-cluster/K8sAddClusterComponent.html
index a8d5820..3d623ae 100644
--- a/src/app/k8s/k8s-add-cluster/K8sAddClusterComponent.html
+++ b/src/app/k8s/k8s-add-cluster/K8sAddClusterComponent.html
@@ -17,19 +17,39 @@
 -->
 <form [formGroup]="k8sclusterForm" (ngSubmit)="k8sAddClusterSubmit();">
   <div class="modal-header">
-    <h4 *ngIf="profileType === 'Register'" class="modal-title" id="modal-basic-title">{{'PAGE.K8S.REGISTERCLUSTER' | translate}}
+    <h4 *ngIf="profileType === 'Register'" class="modal-title" id="modal-basic-title">{{'PAGE.K8S.REGISTERCLUSTER' |
+      translate}}
     </h4>
-    <h4 *ngIf="profileType === 'Manage'" class="modal-title" id="modal-basic-title">{{'PAGE.K8S.CREATECLUSTER' | translate}}
+    <h4 *ngIf="profileType === 'Manage'" class="modal-title" id="modal-basic-title">{{'PAGE.K8S.CREATECLUSTER' |
+      translate}}
     </h4>
-    <h4 *ngIf="profileType === 'upgrade'" class="modal-title" id="modal-basic-title">{{'PAGE.K8S.UPGRADECLUSTER' | translate}}
+    <h4 *ngIf="profileType === 'upgrade'" class="modal-title" id="modal-basic-title">{{'PAGE.K8S.UPGRADECLUSTER' |
+      translate}}
     </h4>
-    <h4 *ngIf="profileType === 'scale'" class="modal-title" id="modal-basic-title">{{'PAGE.K8S.SCALECLUSTER' | translate}}</h4>
+    <h4 *ngIf="profileType === 'vertical'" class="modal-title" id="modal-basic-title">{{'PAGE.K8S.VERTICALSCALING' |
+      translate}}
+    </h4>
+    <h4 *ngIf="profileType === 'horizontal'" class="modal-title" id="modal-basic-title">{{'PAGE.K8S.HORIZONTALSCALING' |
+      translate}}
+    </h4>
     <button class="button-xs" type="button" class="close" aria-label="Close" (click)="activeModal.close()">
       <i class="fas fa-times-circle text-danger"></i>
     </button>
   </div>
   <div class="modal-body modal-body-custom-height">
     <div class="form-group row mb-3" *ngIf="profileType === 'Manage' || profileType === 'Register'">
+      <div class="col-sm-12">
+        <label class="form-check-label">
+          <input class="quotacheck form-check-input" (click)=getValue($event) type="checkbox"
+            formControlName="bootstrap" id="quotacheck">
+          <label class="form-check-label" for="quotaCheck">&nbsp;<b>{{ 'PAGE.K8S.BOOTSTRAP' | translate }}</b> </label>
+          <i class="fas fa-info-circle tooltip-icon">
+            &nbsp;<span class="tooltip-text">{{ 'PAGE.K8S.BOOTSTRAPINFO' | translate }}</span>
+          </i>
+        </label>
+      </div>
+    </div>
+    <div class="form-group row mb-3" *ngIf="profileType === 'Manage' || profileType === 'Register' || !isChecked">
       <label class="col-sm-12 col-form-label mandatory-label"
         [ngClass]="{'text-danger': k8sclusterForm.invalid === true && submitted === true}">{{'MANDATORYCHECK' |
         translate}}</label>
@@ -39,8 +59,7 @@
           formControlName="name" id="name" [ngClass]="{ 'is-invalid': submitted && f.name.errors }" required>
       </div>
     </div>
-    <div class="form-group row mb-3"
-      *ngIf="profileType === 'Manage' || profileType === 'Register'|| profileType === 'upgrade'">
+    <div class="form-group row mb-3" *ngIf="profileType === 'Manage'|| !isChecked">
       <label class="col-sm-4 col-form-label" for="k8s_version">{{'PAGE.K8S.K8SVERSION' | translate}}*</label>
       <div class="col-sm-8">
         <input autocomplete="off" class="form-control" placeholder="{{'PAGE.K8S.K8SVERSION' | translate}}" type="text"
@@ -48,7 +67,7 @@
           required>
       </div>
     </div>
-    <div class="form-group row mb-3" *ngIf="profileType === 'Manage' || profileType === 'Register'">
+    <div class="form-group row mb-3" *ngIf="profileType === 'Manage' || profileType === 'Register' || !isChecked">
       <label class="col-sm-4 col-form-label" for="vim_account">{{'PAGE.K8S.VIMACCOUNT' | translate}}*</label>
       <div class="col-sm-8">
         <ng-select (change)="getDetailsvim($event)"
@@ -58,7 +77,7 @@
         </ng-select>
       </div>
     </div>
-    <div class="form-group row mb-3" *ngIf="profileType === 'Register'">
+    <div class="form-group row mb-3" *ngIf="!isChecked && profileType === 'Register'">
       <label class="col-sm-4 col-form-label" for="deployment_methods">{{'PAGE.K8S.DEPLOYMENTMETHODS' |
         translate}}*</label>
       <div class="col-sm-8">
@@ -69,27 +88,27 @@
         </ng-select>
       </div>
     </div>
-    <div class="form-group row mb-3" *ngIf="profileType === 'Manage' || profileType === 'Register'">
-      <label class="col-sm-4 col-form-label" for="description">{{'PAGE.K8S.DESCRIPTION' | translate}}*</label>
+    <div class="form-group row mb-3" *ngIf="profileType === 'Manage' || profileType === 'Register' || !isChecked">
+      <label class="col-sm-4 col-form-label" for="description">{{'PAGE.K8S.DESCRIPTION' | translate}}</label>
       <div class="col-sm-8">
         <textarea class="form-control" placeholder="{{'PAGE.K8S.DESCRIPTION' | translate}}" type="text"
-          formControlName="description" id="description" [ngClass]="{ 'is-invalid': submitted && f.description.errors }"
-          required></textarea>
+          formControlName="description" id="description"
+          [ngClass]="{ 'is-invalid': submitted && f.description.errors }"></textarea>
       </div>
     </div>
-    <div class="form-group row mb-3" *ngIf="profileType === 'Register'">
+    <div class="form-group row mb-3" *ngIf="!isChecked && profileType === 'Register'">
       <label class="col-sm-4 col-form-label" for="nets">{{'PAGE.K8S.NETS' | translate}}*</label>
       <div class="col-sm-8">
         <textarea rows="5" cols="50" class="form-control" placeholder="{{'PAGE.K8S.NETSPLACEHOLDER' | translate}}"
           formControlName="nets" id="nets" [ngClass]="{ 'is-invalid': submitted && f.nets.errors }" required></textarea>
         <div class="fileupload-text mt-1 mb-1">{{'FILEUPLOADLABEL' | translate}}</div>
         <div class="custom-file">
-          <input type="file" #fileInputNets class="fileupload custom-file-input" (change)="netsFile($event.target.files)"
-            id="customFileNets">
+          <input type="file" #fileInputNets class="fileupload custom-file-input"
+            (change)="netsFile($event.target.files)" id="customFileNets">
         </div>
       </div>
     </div>
-    <div class="form-group row mb-3" *ngIf="profileType === 'Register'">
+    <div class="form-group row mb-3" *ngIf="profileType === 'Register'|| (profileType === 'Register' && !isChecked)">
       <label class="col-sm-4 col-form-label" for="credentials">{{'PAGE.K8S.CREDENTIALS' | translate}}*</label>
       <div class="col-sm-8">
         <textarea rows="5" cols="50" class="form-control" placeholder="{{'YAMLCONFIG' | translate}}"
@@ -113,12 +132,12 @@
     <div class="form-group row mb-3" *ngIf="profileType === 'Manage'">
       <label class="col-sm-4 col-form-label" for="k8s_version">{{'PAGE.K8S.RESOURCEGROUP' | translate}}</label>
       <div class="col-sm-8">
-        <input autocomplete="off" class="form-control" placeholder="{{'PAGE.K8S.RESOURCEGROUP' | translate}}" type="text"
-          formControlName="resource_group" id="k8s_version"
+        <input autocomplete="off" class="form-control" placeholder="{{'PAGE.K8S.RESOURCEGROUP' | translate}}"
+          type="text" formControlName="resource_group" id="k8s_version"
           [ngClass]="{ 'is-invalid': submitted && f.resource_group.errors }">
       </div>
     </div>
-    <div class="form-group row mb-3" *ngIf="profileType === 'Manage' || profileType === 'scale'">
+    <div class="form-group row mb-3" *ngIf="profileType === 'Manage'">
       <label class="col-sm-4 col-form-label" for="node_count">{{'PAGE.K8S.NODECOUNT' | translate}}*</label>
       <div class="col-sm-8">
         <input autocomplete="off" class="form-control" placeholder="{{'PAGE.K8S.NODECOUNT' | translate}}" type="text"
@@ -134,12 +153,34 @@
           required>
       </div>
     </div>
+    <div class="form-group row mb-3" *ngIf="profileType === 'horizontal'">
+      <label class="col-sm-4 col-form-label" for="node_count">{{'PAGE.K8S.NODECOUNT' | translate}}</label>
+      <div class="col-sm-8">
+        <input autocomplete="off" class="form-control" placeholder="{{'PAGE.K8S.NODECOUNT' | translate}}" type="text"
+          formControlName="nodeCount" id="node_count" [ngClass]="{ 'is-invalid': submitted && f.nodeCount.errors }">
+      </div>
+    </div>
+    <div class="form-group row mb-3" *ngIf="profileType === 'vertical'">
+      <label class="col-sm-4 col-form-label" for="k8s_version">{{'PAGE.K8S.NODESIZE' | translate}}</label>
+      <div class="col-sm-8">
+        <input autocomplete="off" class="form-control" placeholder="{{'PAGE.K8S.NODESIZE' | translate}}" type="text"
+          formControlName="nodeSize" id="k8s_version" [ngClass]="{ 'is-invalid': submitted && f.nodeSize.errors }">
+      </div>
+    </div>
+    <div class="form-group row mb-3" *ngIf="profileType === 'upgrade'">
+      <label class="col-sm-4 col-form-label" for="k8s_version">{{'PAGE.K8S.K8SVERSION' | translate}}</label>
+      <div class="col-sm-8">
+        <input autocomplete="off" class="form-control" placeholder="{{'PAGE.K8S.K8SVERSION' | translate}}" type="text"
+          formControlName="k8sVersion" id="k8s_version" [ngClass]="{ 'is-invalid': submitted && f.k8sVersion.errors }">
+      </div>
+    </div>
   </div>
   <div class="modal-footer">
     <button type="button" class="btn btn-danger" (click)="activeModal.close()">{{'CANCEL' | translate}}</button>
-    <button *ngIf="profileType === 'Manage' || profileType === 'Register'" type="submit"
-      class="btn btn-primary">{{'CREATE' | translate}}</button>
-    <button *ngIf="profileType === 'upgrade' || profileType === 'scale'" type="submit" class="btn btn-primary">{{'APPLY'
+    <button *ngIf="profileType === 'Manage'" type="submit" class="btn btn-primary">{{'CREATE' | translate}}</button>
+    <button *ngIf="profileType === 'Register'" type="submit" class="btn btn-primary">{{'REGISTER' | translate}}</button>
+    <button *ngIf="profileType === 'upgrade' || profileType === 'vertical' || profileType === 'horizontal'"
+      type="submit" class="btn btn-primary">{{'APPLY'
       | translate}}</button>
   </div>
 </form>
diff --git a/src/app/k8s/k8s-add-cluster/K8sAddClusterComponent.scss b/src/app/k8s/k8s-add-cluster/K8sAddClusterComponent.scss
index 021d205..8885be8 100644
--- a/src/app/k8s/k8s-add-cluster/K8sAddClusterComponent.scss
+++ b/src/app/k8s/k8s-add-cluster/K8sAddClusterComponent.scss
@@ -14,4 +14,46 @@
  limitations under the License.
 
  Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.in), BARATH KUMAR R (barath.r@tataelxsi.co.in)
-*/
\ No newline at end of file
+*/
+@import "../../../assets/scss/variable.scss";
+@import "../../../assets/scss/mixins/mixin";
+.quotacheck {
+   box-shadow: none;
+   border-radius: 2px;
+   border-color: $gray-600;
+}
+.form-check {
+   padding-left: 30px;
+}
+.quotaCheck-label {
+   position: absolute;
+   left: 26px;
+}
+.tooltip-icon {
+   position: relative;
+   margin-left: 5px;
+   cursor: pointer;
+ }
+ 
+ .tooltip-icon .tooltip-text {
+   visibility: hidden;
+   width: 200px;
+   background-color: #fff;
+   color: #555;
+   text-align: center;
+   padding: 5px 10px;
+   border-radius: 4px;
+   @include border(all, 1, solid, $gray-300);
+   z-index: 1;
+   bottom: 125%;
+   left: 50%;
+   transform: translateX(-50%);
+   opacity: 0;
+   transition: opacity 0.3s;
+ }
+ 
+ .tooltip-icon:hover .tooltip-text {
+   visibility: visible;
+   opacity: 1;
+ }
+ 
\ No newline at end of file
diff --git a/src/app/k8s/k8s-add-cluster/K8sAddClusterComponent.ts b/src/app/k8s/k8s-add-cluster/K8sAddClusterComponent.ts
index bb5dcfa..cf03f0f 100644
--- a/src/app/k8s/k8s-add-cluster/K8sAddClusterComponent.ts
+++ b/src/app/k8s/k8s-add-cluster/K8sAddClusterComponent.ts
@@ -29,7 +29,7 @@
 import * as jsyaml from 'js-yaml';
 import { K8SPayload } from 'K8sModel';
 import { RestService } from 'RestService';
-import { SharedService } from 'SharedService';
+import { isNullOrUndefined, SharedService } from 'SharedService';
 import { VimAccountDetails } from 'VimAccountModel';
 /**
  * Creating Component
@@ -81,6 +81,9 @@
   /** contains payload */
   public payload: K8SPayload;
 
+  /** Check the checkbox status */
+  public isChecked: boolean = true;
+
   /** Check the loading results @public */
   public isLoadingResults: boolean = false;
 
@@ -154,14 +157,18 @@
       name: ['', [Validators.required]],
       k8s_version: ['', [Validators.required]],
       vim_account: [null, [Validators.required]],
-      description: ['', [Validators.required]],
+      description: [''],
       nets: ['', [Validators.required]],
       deployment_methods: ['', [Validators.required]],
       credentials: ['', [Validators.required]],
       region_name: [''],
       resource_group: [''],
       node_count: ['', [Validators.required]],
-      node_size: ['', [Validators.required]]
+      node_size: ['', [Validators.required]],
+      bootstrap: [true],
+      k8sVersion: ['', [Validators.required]],
+      nodeCount: ['', [Validators.required]],
+      nodeSize: ['', [Validators.required]]
     });
   }
 
@@ -180,6 +187,11 @@
     });
   }
 
+  /** Call the event when checkbox is checked @public */
+  public getValue(event: Event): void {
+    this.isChecked = (event.target as HTMLInputElement).checked;
+  }
+
 
   /** Contain selected vimAccount details @public */
   public getDetailsvim(event: VimAccountDetails): void {
@@ -192,45 +204,64 @@
       this.getFormControl('nets').disable();
       this.getFormControl('credentials').disable();
       this.getFormControl('deployment_methods').disable();
+      this.getFormControl('k8sVersion').disable();
+      this.getFormControl('nodeSize').disable();
+      this.getFormControl('nodeCount').disable();
       this.manageCluster();
-    } else if (this.profileType === 'Register') {
+    } else if (this.profileType === 'Register' && this.isChecked === true) {
       this.clusterUrl = environment.K8SCREATECLUSTER_URL + '/register';
       this.getFormControl('region_name').disable();
       this.getFormControl('resource_group').disable();
-      this.getFormControl('node_count').disable();
-      this.getFormControl('node_size').disable();
-      this.registerCluster();
-    } else if (this.profileType === 'upgrade') {
-      this.clusterUrl = environment.K8SCREATECLUSTER_URL + '/' + this.profileID + '/' + 'upgrade';
-      this.getFormControl('region_name').disable();
-      this.getFormControl('resource_group').disable();
-      this.getFormControl('node_count').disable();
-      this.getFormControl('node_size').disable();
-      this.getFormControl('nets').disable();
-      this.getFormControl('credentials').disable();
-      this.getFormControl('deployment_methods').disable();
-      this.getFormControl('name').disable();
-      this.getFormControl('vim_account').disable();
-      this.getFormControl('description').disable();
-      this.updateCluster();
-    } else if (this.profileType === 'scale') {
-      this.clusterUrl = environment.K8SCREATECLUSTER_URL + '/' + this.profileID + '/' + 'scale';
-      this.getFormControl('region_name').disable();
-      this.getFormControl('resource_group').disable();
       this.getFormControl('k8s_version').disable();
       this.getFormControl('node_size').disable();
+      this.getFormControl('node_count').disable();
+      this.getFormControl('nets').disable();
+      this.getFormControl('deployment_methods').disable();
+      this.getFormControl('k8sVersion').disable();
+      this.getFormControl('nodeSize').disable();
+      this.getFormControl('nodeCount').disable();
+      this.registerCluster();
+    } if (this.isChecked === false && this.profileType === 'Register') {
+      this.clusterUrl = environment.K8SCLUSTER_URL;
+      this.getFormControl('bootstrap').disable();
+      this.getFormControl('region_name').disable();
+      this.getFormControl('resource_group').disable();
+      this.getFormControl('node_count').disable();
+      this.getFormControl('node_size').disable();
+      this.getFormControl('k8sVersion').disable();
+      this.getFormControl('nodeSize').disable();
+      this.getFormControl('nodeCount').disable();
+      this.oldregisterCluster();
+    } else if (this.profileType === 'upgrade' || this.profileType === 'horizontal' || this.profileType === 'vertical') {
+      this.clusterUrl = environment.K8SCREATECLUSTER_URL + '/' + this.profileID + '/' + 'update';
+      this.getFormControl('region_name').disable();
+      this.getFormControl('resource_group').disable();
       this.getFormControl('nets').disable();
       this.getFormControl('credentials').disable();
       this.getFormControl('deployment_methods').disable();
       this.getFormControl('name').disable();
       this.getFormControl('vim_account').disable();
       this.getFormControl('description').disable();
+      this.getFormControl('bootstrap').disable();
+      this.getFormControl('node_count').disable();
+      this.getFormControl('node_size').disable();
+      this.getFormControl('k8s_version').disable();
+      if (this.profileType === 'upgrade') {
+        this.getFormControl('nodeCount').disable();
+        this.getFormControl('nodeSize').disable();
+      } else if (this.profileType === 'vertical') {
+        this.getFormControl('nodeCount').disable();
+        this.getFormControl('k8sVersion').disable();
+      } else if (this.profileType === 'horizontal') {
+        this.getFormControl('nodeSize').disable();
+        this.getFormControl('k8sVersion').disable();
+      }
       this.updateCluster();
     }
   }
 
-  /** Register cluster @public */
-  public registerCluster(): void {
+  /** Old Register cluster flow @public */
+  public oldregisterCluster(): void {
     this.submitted = true;
     this.sharedService.cleanForm(this.k8sclusterForm);
     if (this.k8sclusterForm.invalid) {
@@ -275,6 +306,49 @@
 
     this.k8sclusterForm.value.vim_account = this.vimAccountId;
 
+    if (this.k8sclusterForm.value.description === '') {
+      delete this.k8sclusterForm.value.description;
+    }
+
+    const apiURLHeader: APIURLHEADER = {
+      url: this.clusterUrl,
+      httpOptions: { headers: this.headers }
+    };
+
+    this.isLoadingResults = true;
+    this.restService.postResource(apiURLHeader, this.k8sclusterForm.value).subscribe((result: {}) => {
+      this.activeModal.close(modalData);
+      this.isLoadingResults = false;
+      this.notifierService.notify('success', this.k8sclusterForm.value.name +
+        this.translateService.instant('PAGE.K8S.REGISTEREDSUCCESSFULLY'));
+    }, (error: ERRORDATA) => {
+      this.restService.handleError(error, 'post');
+      this.isLoadingResults = false;
+    });
+  }
+
+  /** New Register cluster flow @public */
+  public registerCluster(): void {
+    this.submitted = true;
+    this.sharedService.cleanForm(this.k8sclusterForm);
+    if (this.k8sclusterForm.invalid) {
+      return;
+    }
+    const modalData: MODALCLOSERESPONSEDATA = {
+      message: 'Done'
+    };
+    const validJSONCredentails: boolean = this.sharedService.checkJson(this.k8sclusterForm.value.credentials);
+    if (validJSONCredentails) {
+      this.k8sclusterForm.value.credentials = jsyaml.load(this.k8sclusterForm.value.credentials.toString(), { json: true });
+    } else {
+      this.notifierService.notify('error', this.translateService.instant('INVALIDCONFIG'));
+      return;
+    }
+
+    if (this.k8sclusterForm.value.description === '') {
+      delete this.k8sclusterForm.value.description;
+    }
+
     const apiURLHeader: APIURLHEADER = {
       url: this.clusterUrl,
       httpOptions: { headers: this.headers }
@@ -317,16 +391,20 @@
       k8s_version: this.k8sclusterForm.value.k8s_version,
       node_size: this.k8sclusterForm.value.node_size,
       node_count: Number(this.k8sclusterForm.value.node_count),
-      description: this.k8sclusterForm.value.description
+      description: this.k8sclusterForm.value.description,
+      bootstrap: Boolean(this.k8sclusterForm.value.bootstrap)
     };
     if (this.k8sclusterForm.value.region_name === '') {
       delete payload.region_name;
     } else if (this.k8sclusterForm.value.resource_group === '') {
       delete payload.resource_group;
+    } else if (this.k8sclusterForm.value.description === '') {
+      delete payload.description;
     }
-    if (this.k8sclusterForm.value.region_name === '' && this.k8sclusterForm.value.resource_group === '') {
+    if (this.k8sclusterForm.value.region_name === '' && this.k8sclusterForm.value.resource_group === '' && this.k8sclusterForm.value.description === '') {
       delete payload.region_name;
       delete payload.resource_group;
+      delete payload.description;
     }
     this.restService.postResource(apiURLHeader, payload).subscribe((result: {}) => {
       this.activeModal.close(modalData);
@@ -353,17 +431,20 @@
       url: this.clusterUrl,
       httpOptions: { headers: this.headers }
     };
-
-    this.isLoadingResults = true;
     if (this.profileType === 'upgrade') {
       this.payload = {
-        k8s_version: this.k8sclusterForm.value.k8s_version
+        k8s_version: this.k8sclusterForm.value.k8sVersion
       };
-    } else if (this.profileType === 'scale') {
+    } else if (this.profileType === 'vertical') {
       this.payload = {
-        node_count: this.k8sclusterForm.value.node_count
+        node_size: (this.k8sclusterForm.value.nodeSize)
+      };
+    } else if (this.profileType === 'horizontal') {
+      this.payload = {
+        node_count: Number(this.k8sclusterForm.value.nodeCount)
       };
     }
+    this.isLoadingResults = true;
     this.restService.postResource(apiURLHeader, this.payload).subscribe((result: {}) => {
       this.activeModal.close(modalData);
       this.isLoadingResults = false;