Initial Commit - NG UI
[osm/NG-UI.git] / src / app / utilities / clone-package / ClonePackageComponent.ts
diff --git a/src/app/utilities/clone-package/ClonePackageComponent.ts b/src/app/utilities/clone-package/ClonePackageComponent.ts
new file mode 100644 (file)
index 0000000..94e0920
--- /dev/null
@@ -0,0 +1,180 @@
+/*
+ Copyright 2020 TATA ELXSI
+
+ Licensed under the Apache License, Version 2.0 (the 'License');
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ 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)
+ */
+/**
+ * @file Clone Package  Model
+ */
+import { HttpHeaders } from '@angular/common/http';
+import { Component, Injector, Input, OnInit } from '@angular/core';
+import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';
+import { TranslateService } from '@ngx-translate/core';
+import { NotifierService } from 'angular-notifier';
+import { APIURLHEADER, ERRORDATA, GETAPIURLHEADER, MODALCLOSERESPONSEDATA, URLPARAMS } from 'CommonModel';
+import { environment } from 'environment';
+import * as jsyaml from 'js-yaml';
+import { NSDDetails } from 'NSDModel';
+import { RestService } from 'RestService';
+import { SharedService } from 'SharedService';
+
+/**
+ * Creating component
+ * @Component takes ClonePackageComponent.html as template url
+ */
+
+@Component({
+  selector: 'app-clone-package',
+  templateUrl: './ClonePackageComponent.html',
+  styleUrls: ['./ClonePackageComponent.scss']
+})
+/** Exporting a class @exports ClonePackageComponent */
+export class ClonePackageComponent implements OnInit {
+  /** To inject services @public */
+  public injector: Injector;
+
+  /** Instance for active modal service @public */
+  public activeModal: NgbActiveModal;
+
+  /** Input contains component objects @public */
+  @Input() public params: URLPARAMS;
+
+  /** To handle loader status for API call @public */
+  public isLoadingResults: boolean = false;
+
+  /** Give the message for the loading @public */
+  public message: string = 'PLEASEWAIT';
+
+  /** Contains all methods related to shared @private */
+  private sharedService: SharedService;
+
+  /** Instance of the rest service @private */
+  private restService: RestService;
+
+  /** Notifier service to popup notification @private */
+  private notifierService: NotifierService;
+
+  /** Contains tranlsate instance @private */
+  private translateService: TranslateService;
+
+  /** Contains cloned package name instance @private */
+  private packageName: string = '';
+
+  /** Contains API end point for package creation @private */
+  private endPoint: string;
+
+  constructor(injector: Injector) {
+    this.injector = injector;
+    this.restService = this.injector.get(RestService);
+    this.sharedService = this.injector.get(SharedService);
+    this.activeModal = this.injector.get(NgbActiveModal);
+    this.notifierService = this.injector.get(NotifierService);
+    this.translateService = this.injector.get(TranslateService);
+  }
+  /**
+   * Lifecyle Hooks the trigger before component is instantiate
+   */
+  public ngOnInit(): void {
+    // Empty Block
+  }
+  /**
+   * Get package information based on type
+   */
+  public clonePackageInfo(): void {
+    let apiUrl: string = '';
+    const httpOptions: GETAPIURLHEADER = this.getHttpoptions();
+    apiUrl = this.params.page === 'nsd' ? apiUrl = environment.NSDESCRIPTORS_URL + '/' + this.params.id + '/nsd' :
+      apiUrl = environment.VNFPACKAGES_URL + '/' + this.params.id + '/vnfd';
+    this.isLoadingResults = true;
+    this.restService.getResource(apiUrl, httpOptions)
+      .subscribe((nsData: NSDDetails[]) => {
+        this.modifyContent(nsData);
+      }, (error: ERRORDATA) => {
+        this.isLoadingResults = false;
+        error.error = typeof error.error === 'string' ? jsyaml.load(error.error) : error.error;
+        this.restService.handleError(error, 'get');
+      });
+  }
+  /**
+   * Get HTTP header options
+   */
+  private getHttpoptions(): GETAPIURLHEADER {
+    const apiHeaders: HttpHeaders = new HttpHeaders({
+      'Content-Type': 'application/json',
+      Accept: 'text/plain',
+      'Cache-Control': 'no-cache, no-store, must-revalidate, max-age=0'
+    });
+    return {
+      headers: apiHeaders,
+      responseType: 'text'
+    };
+  }
+  /**
+   * Get and modify package information based on type
+   */
+  private modifyContent(packageInfo: NSDDetails[]): void {
+    const packageContent: string = jsyaml.load(packageInfo.toString());
+    if (this.params.page === 'nsd') {
+      this.packageName = 'clone_' + packageContent['nsd:nsd-catalog'].nsd[0].name;
+      this.endPoint = environment.NSDESCRIPTORSCONTENT_URL;
+      packageContent['nsd:nsd-catalog'].nsd.forEach((nsd: NSDDetails) => {
+        nsd.id = 'clone_' + nsd.id;
+        nsd.name = 'clone_' + nsd.name;
+        nsd['short-name'] = 'clone_' + nsd['short-name'];
+      });
+    } else {
+      this.packageName = 'clone_' + packageContent['vnfd:vnfd-catalog'].vnfd[0].name;
+      this.endPoint = environment.VNFPACKAGESCONTENT_URL;
+      packageContent['vnfd:vnfd-catalog'].vnfd.forEach((vnfd: NSDDetails) => {
+        vnfd.id = 'clone_' + vnfd.id;
+        vnfd.name = 'clone_' + vnfd.name;
+        vnfd['short-name'] = 'clone_' + vnfd['short-name'];
+      });
+    }
+    this.clonePackage(packageContent);
+  }
+  /**
+   * Create clone package and upload as TAR.GZ file
+   */
+  private clonePackage(packageContent: string): void {
+    const descriptorInfo: string = jsyaml.dump(packageContent);
+    const apiHeader: HttpHeaders = new HttpHeaders({
+      'Content-Type': 'application/gzip',
+      Accept: 'application/json',
+      'Cache-Control': 'no-cache, no-store, must-revalidate, max-age=0'
+    });
+    const modalData: MODALCLOSERESPONSEDATA = {
+      message: 'Done'
+    };
+    this.sharedService.targzFile({ packageType: this.params.page, id: this.params.id, descriptor: descriptorInfo })
+      .then((content: ArrayBuffer): void => {
+        const apiURLHeader: APIURLHEADER = {
+          url: this.endPoint,
+          httpOptions: { headers: apiHeader }
+        };
+        this.restService.postResource(apiURLHeader, content).subscribe((result: { id: string }) => {
+          this.activeModal.close(modalData);
+          this.isLoadingResults = false;
+          this.notifierService.notify('success', this.translateService.instant('CLONESUCCESSFULLY'));
+        }, (error: ERRORDATA) => {
+          this.isLoadingResults = false;
+          this.restService.handleError(error, 'post');
+        });
+      }).catch((): void => {
+        this.isLoadingResults = false;
+        this.notifierService.notify('error', this.translateService.instant('ERROR'));
+      });
+  }
+}