Advanced Cluster Management - NGUI

	- Added new OKA packages module under packages
	- Added Profiless, KSU under k8s section
	- Feature 11020. 11022, 11023, 11024, 11025, 11026

Change-Id: Ibddeb4d5693ce24d80e378277693405c810f6e04
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 707d8d6..a8d5820 100644
--- a/src/app/k8s/k8s-add-cluster/K8sAddClusterComponent.html
+++ b/src/app/k8s/k8s-add-cluster/K8sAddClusterComponent.html
@@ -17,22 +17,30 @@
 -->
 <form [formGroup]="k8sclusterForm" (ngSubmit)="k8sAddClusterSubmit();">
   <div class="modal-header">
-    <h4 class="modal-title" id="modal-basic-title">{{'PAGE.K8S.NEWK8SCLUSTER' | translate}}</h4>
+    <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>
+    <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>
     <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">
+    <div class="form-group row mb-3" *ngIf="profileType === 'Manage' || profileType === 'Register'">
       <label class="col-sm-12 col-form-label mandatory-label"
-        [ngClass]="{'text-danger': k8sclusterForm.invalid === true && submitted === true}">{{'MANDATORYCHECK' | translate}}</label>
+        [ngClass]="{'text-danger': k8sclusterForm.invalid === true && submitted === true}">{{'MANDATORYCHECK' |
+        translate}}</label>
       <label class="col-sm-4 col-form-label" for="name">{{'PAGE.K8S.NAME' | translate}}*</label>
       <div class="col-sm-8">
         <input autocomplete="off" class="form-control" placeholder="{{'PAGE.K8S.NAME' | translate}}" type="text"
           formControlName="name" id="name" [ngClass]="{ 'is-invalid': submitted && f.name.errors }" required>
       </div>
     </div>
-    <div class="form-group row mb-3">
+    <div class="form-group row mb-3"
+      *ngIf="profileType === 'Manage' || profileType === 'Register'|| 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"
@@ -40,28 +48,28 @@
           required>
       </div>
     </div>
-    <div class="form-group row mb-3">
+    <div class="form-group row mb-3" *ngIf="profileType === 'Manage' || profileType === 'Register'">
       <label class="col-sm-4 col-form-label" for="vim_account">{{'PAGE.K8S.VIMACCOUNT' | translate}}*</label>
       <div class="col-sm-8">
-        <ng-select placeholder="{{'SELECT' | translate}} {{'PAGE.K8S.VIMACCOUNT' | translate}}"
-          [items]="vimAccountSelect" bindLabel="name" bindValue="_id" formControlName="vim_account" id="vimAccountId"
+        <ng-select (change)="getDetailsvim($event)"
+          placeholder="{{'SELECT' | translate}} {{'PAGE.K8S.VIMACCOUNT' | translate}}" [items]="vimAccountSelect"
+          bindLabel="name" bindValue="name" formControlName="vim_account" id="vimAccountId"
           [ngClass]="{ 'is-invalid': submitted && f.vim_account.errors }" required>
         </ng-select>
       </div>
     </div>
-    <div class="form-group row mb-3">
-      <label class="col-sm-4 col-form-label" for="deployment_methods">{{'PAGE.K8S.DEPLOYMENTMETHODS' | translate}}*</label>
+    <div class="form-group row mb-3" *ngIf="profileType === 'Register'">
+      <label class="col-sm-4 col-form-label" for="deployment_methods">{{'PAGE.K8S.DEPLOYMENTMETHODS' |
+        translate}}*</label>
       <div class="col-sm-8">
-        <ng-select placeholder="{{'SELECT' | translate}} {{'PAGE.K8S.DEPLOYMENTMETHODS' | translate}}"
-                   multiple="true"
-                   [items]="deploymentMethodsSelect" bindLabel="title" bindValue="value" formControlName="deployment_methods" id="deploymentMethodsId"
-                   [ngClass]="{ 'is-invalid': submitted && f.deployment_methods.errors }"
-                   [(ngModel)]="selectedDeploymentMethods"
-                   required>
+        <ng-select placeholder="{{'SELECT' | translate}} {{'PAGE.K8S.DEPLOYMENTMETHODS' | translate}}" multiple="true"
+          [items]="deploymentMethodsSelect" bindLabel="title" bindValue="value" formControlName="deployment_methods"
+          id="deploymentMethodsId" [ngClass]="{ 'is-invalid': submitted && f.deployment_methods.errors }"
+          [(ngModel)]="selectedDeploymentMethods" required>
         </ng-select>
       </div>
     </div>
-    <div class="form-group row mb-3">
+    <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="col-sm-8">
         <textarea class="form-control" placeholder="{{'PAGE.K8S.DESCRIPTION' | translate}}" type="text"
@@ -69,7 +77,7 @@
           required></textarea>
       </div>
     </div>
-    <div class="form-group row mb-3">
+    <div class="form-group row mb-3" *ngIf="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}}"
@@ -81,22 +89,58 @@
         </div>
       </div>
     </div>
-    <div class="form-group row mb-3">
+    <div class="form-group row mb-3" *ngIf="profileType === 'Register'">
       <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}}" formControlName="credentials"
-          id="credentials" [ngClass]="{ 'is-invalid': submitted && f.credentials.errors }" required></textarea>
+        <textarea rows="5" cols="50" class="form-control" placeholder="{{'YAMLCONFIG' | translate}}"
+          formControlName="credentials" id="credentials" [ngClass]="{ 'is-invalid': submitted && f.credentials.errors }"
+          required></textarea>
         <div class="fileupload-text mt-1 mb-1">{{'FILEUPLOADLABEL' | translate}}</div>
         <div class="custom-file">
-          <input type="file" #fileInputCredentials class="fileupload custom-file-input" (change)="credentialsFile($event.target.files)"
-            id="customFileCredentials">
+          <input type="file" #fileInputCredentials class="fileupload custom-file-input"
+            (change)="credentialsFile($event.target.files)" id="customFileCredentials">
         </div>
       </div>
     </div>
+    <div class="form-group row mb-3" *ngIf="profileType === 'Manage'">
+      <label class="col-sm-4 col-form-label" for="k8s_version">{{'PAGE.K8S.REGIONNAME' | translate}}</label>
+      <div class="col-sm-8">
+        <input autocomplete="off" class="form-control" placeholder="{{'PAGE.K8S.REGIONNAME' | translate}}" type="text"
+          formControlName="region_name" id="k8s_version"
+          [ngClass]="{ 'is-invalid': submitted && f.region_name.errors }">
+      </div>
+    </div>
+    <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"
+          [ngClass]="{ 'is-invalid': submitted && f.resource_group.errors }">
+      </div>
+    </div>
+    <div class="form-group row mb-3" *ngIf="profileType === 'Manage' || profileType === 'scale'">
+      <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="node_count" id="node_count" [ngClass]="{ 'is-invalid': submitted && f.node_count.errors }"
+          required>
+      </div>
+    </div>
+    <div class="form-group row mb-3" *ngIf="profileType === 'Manage'">
+      <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="node_size" id="k8s_version" [ngClass]="{ 'is-invalid': submitted && f.node_size.errors }"
+          required>
+      </div>
+    </div>
   </div>
   <div class="modal-footer">
     <button type="button" class="btn btn-danger" (click)="activeModal.close()">{{'CANCEL' | translate}}</button>
-    <button type="submit" class="btn btn-primary">{{'CREATE' | 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'
+      | translate}}</button>
   </div>
 </form>
 <app-loader [waitingMessage]="message" *ngIf="isLoadingResults"></app-loader>
\ 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 8115b6f..bb5dcfa 100644
--- a/src/app/k8s/k8s-add-cluster/K8sAddClusterComponent.ts
+++ b/src/app/k8s/k8s-add-cluster/K8sAddClusterComponent.ts
@@ -19,16 +19,17 @@
  * @file K8sAddClusterComponent.ts.
  */
 import { HttpHeaders } from '@angular/common/http';
-import { Component, ElementRef, Injector, OnInit, ViewChild } from '@angular/core';
-import { FormBuilder, FormGroup, Validators } from '@angular/forms';
+import { Component, ElementRef, Injector, Input, OnInit, ViewChild } from '@angular/core';
+import { AbstractControl, FormBuilder, FormGroup, Validators } from '@angular/forms';
 import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';
 import { TranslateService } from '@ngx-translate/core';
 import { NotifierService } from 'angular-notifier';
 import { APIURLHEADER, ERRORDATA, MODALCLOSERESPONSEDATA, TYPESECTION } from 'CommonModel';
 import { environment } from 'environment';
 import * as jsyaml from 'js-yaml';
+import { K8SPayload } from 'K8sModel';
 import { RestService } from 'RestService';
-import { SharedService, isNullOrUndefined } from 'SharedService';
+import { SharedService } from 'SharedService';
 import { VimAccountDetails } from 'VimAccountModel';
 /**
  * Creating Component
@@ -50,6 +51,12 @@
   /** Contains all vim account collections */
   public vimAccountSelect: VimAccountDetails;
 
+  /** Input contains Modal dialog component Instance @public */
+  @Input() public profileType: string;
+
+  /** Input contains Modal dialog component Instance @public */
+  @Input() public profileID: string;
+
   /** Contains all deployment methods */
   public deploymentMethodsSelect: TYPESECTION[] = [];
 
@@ -57,7 +64,7 @@
   public deploymentMethodsSubmit: Map<string, boolean>;
 
   /** Contains all deployment methods selected */
-  public selectedDeploymentMethods: string[] = ['helm-chart', 'helm-chart-v3', 'juju-bundle'];
+  public selectedDeploymentMethods: string[] = ['helm-chart-v3', 'juju-bundle'];
 
   /** Instance for active modal service @public */
   public activeModal: NgbActiveModal;
@@ -65,9 +72,15 @@
   /** Variable set for twoway bindng @public  */
   public vimAccountId: string;
 
+  /** contains url @public  */
+  public clusterUrl: string;
+
   /** Form submission Add */
   public submitted: boolean = false;
 
+  /** contains payload */
+  public payload: K8SPayload;
+
   /** Check the loading results @public */
   public isLoadingResults: boolean = false;
 
@@ -114,10 +127,6 @@
     this.sharedService = this.injector.get(SharedService);
     this.deploymentMethodsSelect = [
       {
-        title: 'Helm v2',
-        value: 'helm-chart'
-      },
-      {
         title: 'Helm v3',
         value: 'helm-chart-v3'
       },
@@ -148,7 +157,11 @@
       description: ['', [Validators.required]],
       nets: ['', [Validators.required]],
       deployment_methods: ['', [Validators.required]],
-      credentials: ['', [Validators.required]]
+      credentials: ['', [Validators.required]],
+      region_name: [''],
+      resource_group: [''],
+      node_count: ['', [Validators.required]],
+      node_size: ['', [Validators.required]]
     });
   }
 
@@ -167,8 +180,57 @@
     });
   }
 
+
+  /** Contain selected vimAccount details @public */
+  public getDetailsvim(event: VimAccountDetails): void {
+    this.vimAccountId = event._id;
+  }
+
   /** On modal submit k8sAddClusterSubmit will called @public */
   public k8sAddClusterSubmit(): void {
+    if (this.profileType === 'Manage') {
+      this.getFormControl('nets').disable();
+      this.getFormControl('credentials').disable();
+      this.getFormControl('deployment_methods').disable();
+      this.manageCluster();
+    } else if (this.profileType === 'Register') {
+      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('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();
+    }
+  }
+
+  /** Register cluster @public */
+  public registerCluster(): void {
     this.submitted = true;
     this.sharedService.cleanForm(this.k8sclusterForm);
     if (this.k8sclusterForm.invalid) {
@@ -177,10 +239,6 @@
     const modalData: MODALCLOSERESPONSEDATA = {
       message: 'Done'
     };
-    const apiURLHeader: APIURLHEADER = {
-      url: environment.K8SCLUSTER_URL,
-      httpOptions: { headers: this.headers }
-    };
     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 });
@@ -215,11 +273,65 @@
     // Transform values to json
     this.k8sclusterForm.value.deployment_methods = jsonDMObject;
 
+    this.k8sclusterForm.value.vim_account = this.vimAccountId;
+
+    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;
+    });
+  }
+
+  /** Manage cluster @public */
+  public manageCluster(): void {
+    this.submitted = true;
+    this.sharedService.cleanForm(this.k8sclusterForm);
+    if (this.k8sclusterForm.invalid) {
+      return;
+    }
+    const modalData: MODALCLOSERESPONSEDATA = {
+      message: 'Done'
+    };
+    const apiURLHeader: APIURLHEADER = {
+      url: environment.K8SCREATECLUSTER_URL,
+      httpOptions: { headers: this.headers }
+    };
+
+    this.isLoadingResults = true;
+    const payload: K8SPayload = {
+      name: this.k8sclusterForm.value.name,
+      vim_account: this.k8sclusterForm.value.vim_account,
+      location: this.k8sclusterForm.value.location,
+      region_name: this.k8sclusterForm.value.region_name,
+      resource_group: this.k8sclusterForm.value.resource_group,
+      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
+    };
+    if (this.k8sclusterForm.value.region_name === '') {
+      delete payload.region_name;
+    } else if (this.k8sclusterForm.value.resource_group === '') {
+      delete payload.resource_group;
+    }
+    if (this.k8sclusterForm.value.region_name === '' && this.k8sclusterForm.value.resource_group === '') {
+      delete payload.region_name;
+      delete payload.resource_group;
+    }
+    this.restService.postResource(apiURLHeader, payload).subscribe((result: {}) => {
+      this.activeModal.close(modalData);
+      this.isLoadingResults = false;
+      this.notifierService.notify('success', this.k8sclusterForm.value.name +
         this.translateService.instant('PAGE.K8S.CREATEDSUCCESSFULLY'));
     }, (error: ERRORDATA) => {
       this.restService.handleError(error, 'post');
@@ -227,6 +339,42 @@
     });
   }
 
+  /** Update cluster @public */
+  public updateCluster(): void {
+    this.submitted = true;
+    this.sharedService.cleanForm(this.k8sclusterForm);
+    if (this.k8sclusterForm.invalid) {
+      return;
+    }
+    const modalData: MODALCLOSERESPONSEDATA = {
+      message: 'Done'
+    };
+    const apiURLHeader: APIURLHEADER = {
+      url: this.clusterUrl,
+      httpOptions: { headers: this.headers }
+    };
+
+    this.isLoadingResults = true;
+    if (this.profileType === 'upgrade') {
+      this.payload = {
+        k8s_version: this.k8sclusterForm.value.k8s_version
+      };
+    } else if (this.profileType === 'scale') {
+      this.payload = {
+        node_count: this.k8sclusterForm.value.node_count
+      };
+    }
+    this.restService.postResource(apiURLHeader, this.payload).subscribe((result: {}) => {
+      this.activeModal.close(modalData);
+      this.isLoadingResults = false;
+      this.notifierService.notify('success',
+        this.translateService.instant('PAGE.K8S.UPDATEDSUCCESSFULLY'));
+    }, (error: ERRORDATA) => {
+      this.restService.handleError(error, 'post');
+      this.isLoadingResults = false;
+    });
+  }
+
   /** Nets file process @private */
   public netsFile(files: FileList): void {
     if (files && files.length === 1) {
@@ -270,4 +418,10 @@
     this.fileInputCredentialsLabel.nativeElement.innerText = files[0].name;
     this.fileInputCredentials.nativeElement.value = null;
   }
+
+  /** Used to get the AbstractControl of controlName passed @private */
+  private getFormControl(controlName: string): AbstractControl {
+    // eslint-disable-next-line security/detect-object-injection
+    return this.k8sclusterForm.controls[controlName];
+  }
 }