Initial Commit - NG UI
[osm/NG-UI.git] / src / app / utilities / edit-packages / EditPackagesComponent.ts
diff --git a/src/app/utilities/edit-packages/EditPackagesComponent.ts b/src/app/utilities/edit-packages/EditPackagesComponent.ts
new file mode 100644 (file)
index 0000000..befafb8
--- /dev/null
@@ -0,0 +1,318 @@
+/*
+ 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 Edit Actions Component
+ */
+import { HttpHeaders } from '@angular/common/http';
+import { Component, Injector, OnInit } from '@angular/core';
+import { ActivatedRoute, Router } from '@angular/router';
+import { TranslateService } from '@ngx-translate/core';
+import { NotifierService } from 'angular-notifier';
+import 'codemirror/addon/dialog/dialog';
+import 'codemirror/addon/display/autorefresh';
+import 'codemirror/addon/display/fullscreen';
+import 'codemirror/addon/edit/closebrackets';
+import 'codemirror/addon/edit/matchbrackets';
+import 'codemirror/addon/fold/brace-fold';
+import 'codemirror/addon/fold/foldcode';
+import 'codemirror/addon/fold/foldgutter';
+import 'codemirror/addon/search/search';
+import 'codemirror/addon/search/searchcursor';
+import 'codemirror/keymap/sublime';
+import 'codemirror/lib/codemirror';
+import 'codemirror/mode/javascript/javascript';
+import 'codemirror/mode/markdown/markdown';
+import 'codemirror/mode/yaml/yaml';
+import { APIURLHEADER, ERRORDATA, GETAPIURLHEADER } from 'CommonModel';
+import { environment } from 'environment';
+import * as HttpStatus from 'http-status-codes';
+import * as jsyaml from 'js-yaml';
+import { NSDDetails } from 'NSDModel';
+import { RestService } from 'RestService';
+import { SharedService } from 'SharedService';
+
+/**
+ * Creating component
+ * @Component takes EditPackagesComponent.html as template url
+ */
+@Component({
+  selector: 'app-edit-packages',
+  templateUrl: './EditPackagesComponent.html',
+  styleUrls: ['./EditPackagesComponent.scss']
+})
+
+/** Exporting a class @exports EditPackagesComponent */
+export class EditPackagesComponent implements OnInit {
+  /** To inject services @public */
+  public injector: Injector;
+
+  /** dataService to pass the data from one component to another @public */
+  public identifier: {} = {};
+
+  /** readOnly @public */
+  public readOnly: boolean = false;
+
+  /** Handle the formate Change @public */
+  public defaults: {} = {
+    'text/x-yaml': '',
+    'text/json': ''
+  };
+
+  /** Get & Update URL VNFD & NSD */
+  public getUpdateURL: string;
+
+  /** Pass the type of VNFD & NSD for fetching text */
+  public getFileContentType: string;
+
+  /** Pass the type of VNFD & NSD for fileUpdate */
+  public updateFileContentType: string;
+
+  /** To Set Mode @public */
+  public mode: string = 'text/x-yaml';
+
+  /** To Set Mode @public */
+  public modeDefault: string = 'yaml';
+
+  /** options @public */
+  public options: {} = {
+    mode: this.modeDefault,
+    showCursorWhenSelecting: true,
+    autofocus: true,
+    autoRefresh: true,
+    lineNumbers: true,
+    lineWrapping: true,
+    foldGutter: true,
+    gutters: ['CodeMirror-linenumbers', 'CodeMirror-foldgutter'],
+    autoCloseBrackets: true,
+    matchBrackets: true,
+    theme: 'neat',
+    keyMap: 'sublime'
+  };
+
+  /** Ymal Url for the VNFD & NSD */
+  public ymalUrl: string;
+
+  /** json Url for the VNFD & NSD */
+  public jsonUrl: string;
+
+  /** Navigation Path for the VNFD & NSD */
+  public navigatePath: string;
+
+  /** Package type */
+  public pacakgeType: string;
+
+  /** variables contains paramsID @public */
+  public paramsID: string;
+
+  /** Controls the File Type List form @public */
+  public fileTypes: { value: string; viewValue: string; }[] = [];
+
+  /** Check the loading results @public */
+  public isLoadingResults: boolean = true;
+
+  /** Give the message for the loading @public */
+  public message: string = 'PLEASEWAIT';
+
+  /** Instance of the rest service @private */
+  private restService: RestService;
+
+  /** Holds teh instance of AuthService class of type AuthService @private */
+  private router: Router;
+
+  /** Holds teh instance of AuthService class of type AuthService @private */
+  private activatedRoute: ActivatedRoute;
+
+  /** Data @private */
+  private data: string = '';
+
+  /** contains http options @private */
+  private httpOptions: HttpHeaders;
+
+  /** Controls the header form @private */
+  private headers: HttpHeaders;
+
+  /** Notifier service to popup notification @private */
+  private notifierService: NotifierService;
+
+  /** Contains tranlsate instance @private */
+  private translateService: TranslateService;
+
+  /** Contains all methods related to shared @private */
+  private sharedService: SharedService;
+
+  constructor(injector: Injector) {
+    this.injector = injector;
+    this.restService = this.injector.get(RestService);
+    this.activatedRoute = this.injector.get(ActivatedRoute);
+    this.router = this.injector.get(Router);
+    this.notifierService = this.injector.get(NotifierService);
+    this.translateService = this.injector.get(TranslateService);
+    this.sharedService = this.injector.get(SharedService);
+  }
+
+  /** Lifecyle Hooks the trigger before component is instantiate @public */
+  public ngOnInit(): void {
+    this.headers = new HttpHeaders({
+      'Content-Type': 'application/json',
+      Accept: 'text/plain',
+      'Cache-Control': 'no-cache, no-store, must-revalidate, max-age=0'
+    });
+    // tslint:disable-next-line: no-backbone-get-set-outside-model
+    this.paramsID = this.activatedRoute.snapshot.paramMap.get('id');
+    // tslint:disable-next-line: no-backbone-get-set-outside-model
+    this.pacakgeType = this.activatedRoute.snapshot.paramMap.get('type');
+    this.generateURLPath();
+  }
+
+  /** generate ymalURL, JSONURL, navigation Path */
+  public generateURLPath(): void {
+    if (this.pacakgeType === 'vnf') {
+      this.getUpdateURL = environment.VNFPACKAGES_URL;
+      this.getFileContentType = 'vnfd';
+      this.updateFileContentType = 'package_content';
+      this.navigatePath = 'vnf';
+      this.fileTypes = [{ value: 'text/x-yaml', viewValue: 'yaml' }, { value: 'text/json', viewValue: 'json' }];
+      this.httpOptions = this.getHeadersWithContentAccept('application/zip', 'application/json');
+      this.getEditFileData();
+    } else if (this.pacakgeType === 'netslice') {
+      this.getUpdateURL = environment.NETWORKSLICETEMPLATE_URL;
+      this.getFileContentType = 'nst';
+      this.updateFileContentType = 'nst_content';
+      this.navigatePath = 'netslice';
+      this.fileTypes = [{ value: 'text/x-yaml', viewValue: 'yaml' }];
+      this.httpOptions = this.getHeadersWithContentAccept('application/yaml', 'application/json');
+      this.getEditFileData();
+    } else {
+      this.getUpdateURL = environment.NSDESCRIPTORS_URL;
+      this.getFileContentType = 'nsd';
+      this.updateFileContentType = 'nsd_content';
+      this.pacakgeType = 'nsd';
+      this.navigatePath = 'ns';
+      this.fileTypes = [{ value: 'text/x-yaml', viewValue: 'yaml' }, { value: 'text/json', viewValue: 'json' }];
+      this.httpOptions = this.getHeadersWithContentAccept('application/zip', 'application/json');
+      this.getEditFileData();
+    }
+  }
+
+  /** Get the headers based on the type @public */
+  public getHeadersWithContentAccept(contentType: string, acceptType: string): HttpHeaders {
+    this.headers = new HttpHeaders({
+      'Content-Type': contentType,
+      Accept: acceptType,
+      'Cache-Control': 'no-cache, no-store, must-revalidate, max-age=0'
+    });
+    return this.headers;
+  }
+
+  /** ChangeMode function @public */
+  public changeMode(): void {
+    if (this.mode === 'text/x-yaml') {
+      this.modeDefault = 'yaml';
+    } else {
+      this.modeDefault = 'javascript';
+    }
+    this.options = {
+      ...this.options,
+      mode: this.modeDefault
+    };
+    this.data = '';
+  }
+
+  /** HandleChange function @public */
+  public handleChange($event: string): void {
+    this.data = $event;
+  }
+
+  /** Update function @public */
+  public update(showgraph: boolean): void {
+    if (this.data === '') {
+      this.notifierService.notify('warning', this.translateService.instant('PAGE.TOPOLOGY.DATAEMPTY'));
+    } else {
+      this.updateCheck(showgraph);
+    }
+  }
+  /** Update the file Data @public */
+  public updateFileData(urlHeader: APIURLHEADER, fileData: string | ArrayBuffer, showgraph: boolean, packageType: string): void {
+    this.restService.putResource(urlHeader, fileData).subscribe(() => {
+      this.isLoadingResults = false;
+      this.notifierService.notify('success', this.translateService.instant(
+        (packageType !== 'netslice') ? 'PAGE.NSPACKAGE.EDITPACKAGES.UPDATEDSUCCESSFULLY' : 'PAGE.NETSLICE.UPDATEDSUCCESSFULLY'));
+      if (showgraph) {
+        if (packageType === 'nsd') {
+          this.router.navigate(['/packages/ns/compose/' + this.paramsID]).catch();
+        } else if (packageType === 'vnf') {
+          this.router.navigate(['/packages/vnf/compose/' + this.paramsID]).catch();
+        }
+      }
+      this.getEditFileData();
+    }, (error: ERRORDATA) => {
+      this.isLoadingResults = false;
+      this.restService.handleError(error, 'put');
+    });
+  }
+  /** Update method for NS, VNF and net-slice template */
+  private updateCheck(showgraph: boolean): void {
+    this.isLoadingResults = true;
+    const apiURLHeader: APIURLHEADER = {
+      url: this.getUpdateURL + '/' + this.paramsID + '/' + this.updateFileContentType,
+      httpOptions: { headers: this.httpOptions }
+    };
+    let descriptorInfo: string = '';
+    if (this.mode === 'text/json') {
+      descriptorInfo = jsyaml.dump(JSON.parse(this.data), {sortKeys: true});
+    } else {
+      descriptorInfo = this.data;
+    }
+    if (this.getFileContentType !== 'nst') {
+      this.sharedService.targzFile({ packageType: this.pacakgeType, id: this.paramsID, descriptor: descriptorInfo })
+        .then((content: ArrayBuffer): void => {
+          this.updateFileData(apiURLHeader, content, showgraph, this.pacakgeType);
+        }).catch((): void => {
+          this.isLoadingResults = false;
+          this.notifierService.notify('error', this.translateService.instant('ERROR'));
+        });
+    } else {
+      this.updateFileData(apiURLHeader, descriptorInfo, showgraph, this.pacakgeType);
+    }
+  }
+  /** Get the YAML content response as a plain/text and convert to JSON Format @private */
+  private getEditFileData(): void {
+    this.isLoadingResults = true;
+    const gethttpOptions: HttpHeaders = this.getHeadersWithContentAccept('application/json', 'text/plain');
+    const httpOptions: GETAPIURLHEADER = {
+      headers: gethttpOptions,
+      responseType: 'text'
+    };
+    this.restService.getResource(this.getUpdateURL + '/' + this.paramsID + '/' + this.getFileContentType, httpOptions)
+      .subscribe((nsData: NSDDetails[]) => {
+        const getJson: string = jsyaml.load(nsData.toString(), { json: true });
+        //tslint:disable-next-line:no-string-literal
+        this.defaults['text/x-yaml'] = nsData.toString();
+        this.defaults['text/json'] = JSON.stringify(getJson, null, '\t');
+        this.isLoadingResults = false;
+      }, (error: ERRORDATA) => {
+        error.error = typeof error.error === 'string' ? jsyaml.load(error.error) : error.error;
+        if (error.error.status === HttpStatus.NOT_FOUND || error.error.status === HttpStatus.UNAUTHORIZED  ) {
+          this.router.navigateByUrl('404', { skipLocationChange: true }).catch();
+        } else {
+          this.restService.handleError(error, 'get');
+        }
+        this.isLoadingResults = false;
+      });
+  }
+}