diff options
Diffstat (limited to 'src/app/vnfs/build-artifacts/template-holder')
6 files changed, 500 insertions, 573 deletions
diff --git a/src/app/vnfs/build-artifacts/template-holder/param-name-value/param-name-value.component.html b/src/app/vnfs/build-artifacts/template-holder/param-name-value/param-name-value.component.html index 150d5ad..3b1199b 100644 --- a/src/app/vnfs/build-artifacts/template-holder/param-name-value/param-name-value.component.html +++ b/src/app/vnfs/build-artifacts/template-holder/param-name-value/param-name-value.component.html @@ -22,8 +22,7 @@ ECOMP is a trademark and service mark of AT&T Intellectual Property. --> <simple-notifications [options]="options"></simple-notifications> -<ng-progress [positionUsing]="'marginLeft'" [minimum]="0.15" [maximum]="1" [speed]="200" [showSpinner]="false" [direction]="'leftToRightIncreased'" [color]="'#6ab344'" - [trickleSpeed]="250" [thick]="true" [ease]="'linear'"></ng-progress> +<ng-progress [positionUsing]="'marginLeft'" [minimum]="0.15" [maximum]="1" [speed]="200" [showSpinner]="false" [direction]="'leftToRightIncreased'" [color]="'#6ab344'" [trickleSpeed]="250" [thick]="true" [ease]="'linear'"></ng-progress> <tabs> <tab [tabTitle]="'Template Configuration'"> @@ -69,6 +68,9 @@ ECOMP is a trademark and service mark of AT&T Intellectual Property. <div class="col-lg-3 col-sm-6 col-md-3 col-xs-12"> <label>Protocol</label><input class="form-control" type="text" disabled value="{{protocol}}" /> </div> + <div *ngIf="(action === 'ConfigScaleOut')" class="col-lg-3 col-sm-6 col-md-3 col-xs-12"> + <label>Template Identifier</label><input class="form-control" type="text" disabled value="{{identifier}}" /> + </div> </div> </div> </div> @@ -83,8 +85,7 @@ ECOMP is a trademark and service mark of AT&T Intellectual Property. </div> </div> - <input type="file" id="filesparam" style="visibility:hidden;" class="form-control-file" (change)="fileParamChange(myInputParam)" #myInputParam placeholder="Upload file..." - /> + <input type="file" id="filesparam" style="visibility:hidden;" class="form-control-file" (change)="fileParamChange(myInputParam)" #myInputParam placeholder="Upload file..." /> <div class="row" style="margin-bottom: 20px;"> <div class="col-md-12 text-right"> <button type="button" class="mdl-button mdl-js-button mdl-button--raised mdl-js-ripple-effect mdl-button--primary" (click)="retrieveNameValueFromAppc()">Retrieve Name/Value from APPC @@ -95,24 +96,13 @@ ECOMP is a trademark and service mark of AT&T Intellectual Property. </div> </div> <hr> - <!--Commenting out 1712 changes here--> - <!--<div class="col-md-12" [hidden]="!showMappingDownloadDiv"><label>Download Name/Value pair as : </label> - <select class="form-control col-md-3" [(ngModel)]="mapppingDownloadType" (ngModelChange)="onDownloadParameter()"> - <option value="">Select</option> - <option value="Json">JSON</option> - <option value="Xls">XLS</option> - </select> -</div>--> - + <div class="col-md-12"></div> <div><label for="textAreaGeneratedTemplate"> <div class="mdl-card__title-text">Param Name Value List</div> <div><font size="1">(Please click anywhere on the editor to see the synced name value pairs)</font></div> </label> - <!-- <ace-editor [(text)]="this.artifactRequest.paramsContent" [theme]="'chrome'" [mode]="'velocity'" (textChanged)="onParamChanges($event)" [options]="{maxLines: 'Infinity', fontSize: '13pt'}" - style="min-height: 500px; width: fit-content;"></ace-editor> --> - <ace-editor [(text)]="this.artifactRequest.paramsContent" #templateeditor [theme]="'chrome'" [mode]="'velocity'" (textChanged)="onParamChanges($event)" - [options]="{maxLines: 'Infinity', fontSize: '13pt' }" style="min-height: 500px; width: 100%"></ace-editor> + <ace-editor [(text)]="this.artifactRequest.paramsContent" #templateeditor [theme]="'chrome'" [mode]="'velocity'" (textChanged)="onParamChanges($event)" [options]="{maxLines: 'Infinity', fontSize: '13pt' }" style="min-height: 500px; width: 100%"></ace-editor> </div> </tab> diff --git a/src/app/vnfs/build-artifacts/template-holder/param-name-value/param-name-value.component.spec.ts b/src/app/vnfs/build-artifacts/template-holder/param-name-value/param-name-value.component.spec.ts new file mode 100644 index 0000000..991ff45 --- /dev/null +++ b/src/app/vnfs/build-artifacts/template-holder/param-name-value/param-name-value.component.spec.ts @@ -0,0 +1,242 @@ +/* +============LICENSE_START========================================== +=================================================================== +Copyright (C) 2018 AT&T Intellectual Property. All rights reserved. +=================================================================== + +Unless otherwise specified, all software contained herein is licensed +under the Apache License, Version 2.0 (the License); +you may not use this software 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. + +ECOMP is a trademark and service mark of AT&T Intellectual Property. +============LICENSE_END============================================ +*/ + +import { async, ComponentFixture, TestBed, inject } from '@angular/core/testing'; +import { By, BrowserModule } from '@angular/platform-browser'; +import { DebugElement, NO_ERRORS_SCHEMA } from '@angular/core'; +import { Component, OnInit, ViewChild, Input } from '@angular/core'; +import { HttpUtilService } from '../../../../shared/services/httpUtil/http-util.service'; +import { MappingEditorService } from '../../../../shared/services/mapping-editor.service'; +import { ArtifactRequest } from '../../../../shared/models/index'; +import { ActivatedRoute, Router } from "@angular/router"; +import { saveAs } from "file-saver"; +import { NotificationService } from '../../../../shared/services/notification.service'; +import { NotificationsService } from "angular2-notifications" +import { ParamShareService } from '../../../../shared/services/paramShare.service'; +import { DialogService } from "ng2-bootstrap-modal"; +import { ConfirmComponent } from '../../../../shared/confirmModal/confirm.component'; +import { BuildDesignComponent } from '../../build-artifacts.component'; +import { environment } from '../../../../../environments/environment'; +import { ModalComponent } from 'ng2-bs3-modal/ng2-bs3-modal' +import { FormsModule } from '@angular/forms'; +import { RouterTestingModule } from '@angular/router/testing'; +import { HomeComponent } from '../../../../home/home/home.component'; +import { LogoutComponent } from '../../../../shared/components/logout/logout.component'; +import { HelpComponent } from '../../../../shared/components/help/help/help.component'; +import { AboutUsComponent } from '../../../../about-us/aboutus.component'; +import { TestComponent } from '../../../../test/test.component'; +import { HttpModule } from '@angular/http'; +import { AceEditorComponent } from 'ng2-ace-editor'; +import { Ng2Bs3ModalModule } from 'ng2-bs3-modal/ng2-bs3-modal'; +import { SimpleNotificationsModule } from 'angular2-notifications'; +import { GoldenConfigurationMappingComponent } from './param-name-value.component'; +import { Observable } from 'rxjs/Observable'; +import { NgProgress } from 'ngx-progressbar'; +import { BaseRequestOptions, Response, ResponseOptions, Http } from '@angular/http'; +import { MockBackend, MockConnection } from '@angular/http/testing'; + + +describe('GoldenConfigurationMappingComponent', () => { + let component: GoldenConfigurationMappingComponent; + let fixture: ComponentFixture<GoldenConfigurationMappingComponent>; + let buildDesignComponent: BuildDesignComponent; + let paramShareService: ParamShareService; + let dialogService: DialogService; + let notificationService: NotificationService; + let httpUtil: HttpUtilService; + let mappingEditorService: MappingEditorService; + let activeRoutes: ActivatedRoute; + let router: Router; + let nService: NotificationsService + const routes = [ + { + path: 'home', + component: HomeComponent + }, { + path: 'vnfs', + loadChildren: '../../../../vnfs/vnfs.module#VnfsModule' + }, { + path: 'test', + component: TestComponent + }, + { + path: 'help', + component: HelpComponent + }, { + path: 'aboutUs', + component: AboutUsComponent + }, { + path: 'logout', + component: LogoutComponent + }, { + path: '', + redirectTo: '/home', + pathMatch: 'full' + } + ]; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [FormsModule, BrowserModule, RouterTestingModule.withRoutes(routes), HttpModule, Ng2Bs3ModalModule, SimpleNotificationsModule.forRoot()], + declarations: [GoldenConfigurationMappingComponent, HomeComponent, TestComponent, HelpComponent, AboutUsComponent, LogoutComponent, AceEditorComponent], + providers: [BuildDesignComponent, NgProgress, ParamShareService, DialogService, NotificationService,MockBackend, + HttpUtilService, MappingEditorService, NotificationsService, + BaseRequestOptions, + { + provide: Http, + useFactory: (backend: MockBackend, defaultOptions: BaseRequestOptions) => { + return new Http(backend, defaultOptions); + }, + deps: [MockBackend, BaseRequestOptions], + } + + ], + schemas: [NO_ERRORS_SCHEMA], + }) + + }); + + beforeEach(async(() => { + TestBed.compileComponents() + + })); + + it('validate if uploaded file should be only json', () => { + fixture = TestBed.createComponent(GoldenConfigurationMappingComponent); + component = fixture.componentInstance; + expect(component.validateUploadedFile('xls')).toBe(false); + expect(component.validateUploadedFile('json')).toBe(true); + expect(component.validateUploadedFile('xml')).toBe(false); + }); + + + + it('validate initialisation of variables in ngOnit() function', inject([MappingEditorService], (mappingEditorService: MappingEditorService) => { + fixture = TestBed.createComponent(GoldenConfigurationMappingComponent); + component = fixture.componentInstance; + mappingEditorService.latestAction = { "action": "Configure", "action-level": "vnf", "scope": { "vnf-type": "testVnf", "vnfc-type": "" }, "template": "Y", "vm": [], "device-protocol": "CHEF", "user-name": "", "port-number": "", "artifact-list": [{ "artifact-name": "template_Configure_test_0.0.1V.json", "artifact-type": "config_template" }, { "artifact-name": "pd_Configure_test_0.0.1V.yaml", "artifact-type": "parameter_definitions" }], "scopeType": "vnf-type" } + mappingEditorService.fromScreen = 'MappingScreen'; + component.configMappingEditorContent = "<configuration xmlns=\"http://xml.juniper.net/xnm/1.1/xnm\" \n xmlns:a=\"http://xml.juniper.net/junos/15.1X49/junos\" >\n <version>15.1X49-D50.3</version>\n <groups>\n <name>node0</name>\n <system>\n <tacplus-server>\n <name>${sync_auto-pop_name1}</name>\n <source-address>${sync_auto-pop_address1}</source-address>\n </tacplus-server>\n <tacplus-server>\n <name>${node0_tacplus_server_name2}</name>\n <source-address>${sync_auto-pop_address1}</source-address>\n </tacplus-server>\n </system> \n </groups>\n </configuration>"; + expect(component.ngOnInit()); + expect(component.ngAfterViewInit()); + + component.paramsContent = JSON.stringify({ + "sync_auto-pop_name1": "testIp1", + "sync_auto-pop_address1": "", + "node0_tacplus_server_name2": "testIp2" + }); + expect(component.ngOnInit()); + + expect(component.ngAfterViewInit()); + + expect(component.action).toEqual('Configure'); + expect(component.vnfType).toEqual('testVnf'); + expect(component.vnfcType).toEqual(''); + expect(component.protocol).toEqual('CHEF'); + + expect(component.artifactName).toEqual('template_Configure_test_0.0.1V.json'); + + mappingEditorService.latestAction = { "action": "Configure", "action-level": "vnf", "scope": { "vnf-type": "testVnf", "vnfc-type": "testVnfc" }, "template": "Y", "vm": [], "device-protocol": "CHEF", "user-name": "", "port-number": "", "artifact-list": [{ "artifact-name": "template_Configure_test_0.0.1V.json", "artifact-type": "config_template" }, { "artifact-name": "pd_Configure_test_0.0.1V.yaml", "artifact-type": "parameter_definitions" }], "scopeType": "vnf-type" } + expect(component.ngOnInit()); + expect(component.vnfcType).toEqual('testVnfc'); + + + })); + + it('check if variables are empty when reference data object is empty', inject([MappingEditorService], (mappingEditorService: MappingEditorService) => { + fixture = TestBed.createComponent(GoldenConfigurationMappingComponent); + component = fixture.componentInstance; + mappingEditorService.latestAction = undefined; + component.ngOnInit(); + expect(component.ngAfterViewInit()); + expect(component.action).toEqual(''); + expect(component.vnfType).toEqual(''); + expect(component.vnfcType).toEqual(''); + expect(component.artifactName).toEqual(''); + + })); + + it('test whether onparamchanges function is able to set the cache correctly for param name values', () => { + fixture = TestBed.createComponent(GoldenConfigurationMappingComponent); + component = fixture.componentInstance; + var data = JSON.stringify({ + "sync_auto-pop_name1": "testIp1", + "sync_auto-pop_address1": "", + "node0_tacplus_server_name2": "testIp2" + }); + component.onParamChanges(data); + expect(localStorage["paramsContent"]).toBe(data); + }) + + + it('retrieveNameValue function should return response on success and set the localstorage data for param', inject([HttpUtilService, NgProgress, MappingEditorService, MockBackend], (httpUtilService: HttpUtilService, mappingEditorService: MappingEditorService, ngProgress: NgProgress, mockBackend: MockBackend) => { + fixture = TestBed.createComponent(GoldenConfigurationMappingComponent); + component = fixture.componentInstance; + var mockData = { + "output": { + "data": { + "block": "{\"userID\":null,\"designInfo\":null,\"statusInfo\":null,\"artifactInfo\":[{\"artifact-content\":\"[{\\\"node0_tacplus_server_name1\\\":\\\"testIp1\\\",\\\"node0_tacplus_server_source_address1\\\":\\\"testIp2\\\",\\\"node0_tacplus_server_name2\\\":\\\"testIp3\\\"}]\"}]}", + "requestId": "497085412083" + }, + "status": { + "code": "400", + "message": "success" + } + } + }; + + let response = new ResponseOptions({ + body: JSON.stringify(mockData) + }); + const baseResponse = new Response(response); + mockBackend.connections.subscribe( + (c: MockConnection) => c.mockRespond(baseResponse) + ); + + mappingEditorService.latestAction = { "action": "Configure", "action-level": "vnf", "scope": { "vnf-type": "testVnf", "vnfc-type": "" }, "template": "Y", "vm": [], "device-protocol": "CHEF", "user-name": "", "port-number": "", "artifact-list": [{ "artifact-name": "template_Configure_test_0.0.1V.json", "artifact-type": "config_template" }, { "artifact-name": "pd_Configure_test_0.0.1V.yaml", "artifact-type": "parameter_definitions" }], "scopeType": "vnf-type" } + + mappingEditorService.fromScreen = 'MappingScreen'; + component.action = 'Configure'; + component.refObj = mappingEditorService.latestAction; + component.scopeName = "testVnf"; + component.vnfType = "testVnf"; + component.userId = "abc"; + component.item.action = "Configure"; + component.retrieveNameValueFromAppc(); + expect(localStorage["localStorage['paramsContent']"]).not.toBe(null); + + })); + + it('test sync from param value function', inject([ParamShareService], (paramShareService: ParamShareService) => { + fixture = TestBed.createComponent(GoldenConfigurationMappingComponent); + component = fixture.componentInstance; + localStorage['paramsContent'] = JSON.stringify({ + "node0_tacplus_server_name1": "testIp1", "node0_tacplus_server_source_address1": "testIp2", "node0_tacplus_server_name2": "testIp3" + }); + var pdData = [{ "name": "sync_auto-pop_name1", "type": null, "description": null, "required": null, "default": null, "source": "A&AI", "rule-type": "vnfc-oam-ipv4-address-list", "request-keys": [{ "key-name": null, "key-value": null }, { "key-name": null, "key-value": null }, { "key-name": null, "key-value": null }], "response-keys": [{ "key-name": "unique-key-name", "key-value": "parent-name" }, { "key-name": "unique-key-value", "key-value": "vnfc" }, { "key-name": "field-key-name", "key-value": "ipaddress-v4-oam-vip" }, { "key-name": null, "key-value": "vm-number" }, { "key-name": null, "key-value": "test" }], "ruleTypeValues": [null, "vnf-name", "vm-name-list", "vnfc-name-list", "vnf-oam-ipv4-address", "vnfc-oam-ipv4-address-list"], "showFilterFields": true, "enableFilterByValue": true }, { "name": "sync_auto-pop_address1", "type": null, "description": null, "required": null, "default": null, "source": "A&AI", "rule-type": "vm-name-list", "request-keys": [{ "key-name": null, "key-value": null }, { "key-name": null, "key-value": null }, { "key-name": null, "key-value": null }], "response-keys": [{ "key-name": "unique-key-name", "key-value": "parent-name" }, { "key-name": "unique-key-value", "key-value": "vserver" }, { "key-name": "field-key-name", "key-value": "vserver-name" }, { "key-name": null, "key-value": "vnfc-function-code" }, { "key-name": null, "key-value": null }], "ruleTypeValues": [null, "vnf-name", "vm-name-list", "vnfc-name-list", "vnf-oam-ipv4-address", "vnfc-oam-ipv4-address-list"], "showFilterFields": true, "enableFilterByValue": true }, { "name": "node0_tacplus_server_name2", "type": null, "description": null, "required": null, "default": null, "source": "Manual", "rule-type": null, "request-keys": [{ "key-name": null, "key-value": null }, { "key-name": null, "key-value": null }, { "key-name": null, "key-value": null }], "response-keys": [{ "key-name": null, "key-value": null }, { "key-name": null, "key-value": null }, { "key-name": null, "key-value": null }, { "key-name": null, "key-value": null }, { "key-name": null, "key-value": null }], "ruleTypeValues": [null] }]; + paramShareService.setSessionParamData([pdData]); + component.syncParam(); + })); + + +});
\ No newline at end of file diff --git a/src/app/vnfs/build-artifacts/template-holder/param-name-value/param-name-value.component.ts b/src/app/vnfs/build-artifacts/template-holder/param-name-value/param-name-value.component.ts index 9ea95ec..a3c5a8e 100644 --- a/src/app/vnfs/build-artifacts/template-holder/param-name-value/param-name-value.component.ts +++ b/src/app/vnfs/build-artifacts/template-holder/param-name-value/param-name-value.component.ts @@ -40,17 +40,6 @@ import { environment } from '../../../../../environments/environment'; import { NgProgress } from 'ngx-progressbar'; import * as XLSX from 'xlsx'; -type AOA = Array<Array<any>>; - -function s2ab(s: string): ArrayBuffer { - const buf = new ArrayBuffer(s.length); - const view = new Uint8Array(buf); - for (let i = 0; i !== s.length; ++i) { - view[i] = s.charCodeAt(i) & 0xFF; - } - return buf; -} - declare var $: any; @Component({ @@ -62,7 +51,7 @@ export class GoldenConfigurationMappingComponent implements OnInit { enableMappingSave: boolean = false; aceText: string = ''; fileName: string = ''; - actionType: any; + actionType: any=''; modal: any; configMappingEditorContent: any; fileType: any = ''; @@ -80,11 +69,13 @@ export class GoldenConfigurationMappingComponent implements OnInit { enableDownload: boolean = false; showMappingDownloadDiv: boolean = false; mapppingDownloadType: any; - action: any; - artifactName: any; + action: any=''; + artifactName: any=''; enableMerge: boolean = false; apiToken = localStorage['apiToken']; userId = localStorage['userId']; + identifier: any; + public uploadTypes = [ { value: 'Mapping Data', @@ -107,20 +98,9 @@ export class GoldenConfigurationMappingComponent implements OnInit { @ContentChildren(Tab) tabs: QueryList<Tab>; public subscription: any; public item: any = {}; - - public Actions = [ - { action: 'ConfigBackup', value: 'ConfigBackup' }, - { action: 'ConfigModify', value: 'ConfigModify' }, - { action: 'ConfigRestore', value: 'ConfigRestore' }, - { action: 'Configure', value: 'Configure' }, - { action: 'GetRunningConfig', value: 'GetRunningConfig' }, - { action: 'HealthCheck', value: 'HealthCheck' }, - { action: 'StartApplication', value: 'StartApplication' }, - { action: 'StopApplication', value: 'StopApplication' } - ]; - vnfType: any; - vnfcType: any; - protocol: any; + vnfType: any=''; + vnfcType: any=''; + protocol: any=''; refObj: any; public paramsContent = localStorage['paramsContent']; @@ -175,13 +155,12 @@ export class GoldenConfigurationMappingComponent implements OnInit { this.activeRoutes.url.subscribe(UrlSegment => { this.actionType = UrlSegment[0].path; }); - if (this.actionType === 'configureTemplate') { - this.mappingEditorService.fromScreen = 'TemplateScreen'; - } + if (this.actionType === 'myTemplates') { this.mappingEditorService.fromScreen = 'MappingScreen'; } this.mappingEditorService.paramData = []; + this.identifier = this.mappingEditorService.identifier; } @@ -192,11 +171,7 @@ export class GoldenConfigurationMappingComponent implements OnInit { } //========================== End of browseOption() Method============================================ - selectedNavItem(item: any) { - this.item = item; - } - - //========================== End of selectedNavItem() Method============================================ + ngOnDestroy() { this.prepareFileName(); } @@ -221,73 +196,13 @@ export class GoldenConfigurationMappingComponent implements OnInit { } } else { - this.Actions = []; this.enableMappingBrowse = false; } } //========================== End of ngAfterViewInit() Method============================================ - upload(evt: any) { - /* wire up file reader */ - if (evt.target.files[0]) { - const target: DataTransfer = <DataTransfer>(evt.target); - this.myfileName = evt.target.files[0].name; - var fileExtension = this.myfileName.substr(this.myfileName.lastIndexOf('.') + 1); - if (fileExtension.toUpperCase() === 'xls'.toUpperCase()) { - if (target.files.length != 1) { - throw new Error('Cannot upload multiple files on the entry'); - } - const reader = new FileReader(); - reader.onload = (e: any) => { - /* read workbook */ - const bstr = e.target.result; - const wb = XLSX.read(bstr, { type: 'binary' }); - /* grab first sheet */ - const wsname = wb.SheetNames[0]; - const ws = wb.Sheets[wsname]; - /* save data */ - let arrData = (<AOA>(XLSX.utils.sheet_to_json(ws, { header: 1 }))); - var jsonStr = arrData.toString(); - var JsonArr = jsonStr.split(','); - var finalStr = '{\r\n'; - for (var i = 0; i < JsonArr.length; i = i + 2) { - var key = JsonArr[i]; - var value = JsonArr[i + 1]; - finalStr = finalStr + key + ':' + value + ',\r\n'; - } - finalStr = finalStr.substring(0, finalStr.length - 3) + '\r\n}'; - this.artifactRequest.paramsContent = finalStr; - this.initialData = finalStr; - this.enableMappingSave = true; - }; - reader.readAsBinaryString(target.files[0]); - if ('Mapping Data' === this.selectedUploadType) { - this.notificationService.notifySuccessMessage('Configuration Template file successfully uploaded..'); - this.mappingEditorService.setParamContent(this.artifactRequest.paramsContent); - } - } - else { - let reader = new FileReader(); - this.readFile(evt.target.files[0], reader, (result) => { - if ('Mapping Data' === this.selectedUploadType) { - var jsonObject = JSON.parse(result); - this.artifactRequest.paramsContent = JSON.stringify(jsonObject, null, 1); - this.notificationService.notifySuccessMessage('Configuration Template file successfully uploaded..'); - this.mappingEditorService.setParamContent(this.artifactRequest.paramsContent); - } - this.initialData = result; - this.enableMappingSave = true; - }); - } - } - else { - this.notificationService.notifyErrorMessage('Failed to reading file..'); - } - this.myInputParam.nativeElement.value = ''; - } - - //========================== End of upload() Method============================================ - //uncommenting for 1710 + + public fileParamChange(input) { if (input.files && input.files[0]) { this.enableMappingSave = true; @@ -349,75 +264,7 @@ export class GoldenConfigurationMappingComponent implements OnInit { } //========================== End of onParamChanges() Method============================================ - onDownloadParameter() { - let refObj = this.refObj; - if (refObj) { - // refObj = refObj[refObj.length - 1]; - let paramsKeyValueFromEditor: JSON; - this.initialData = this.artifactRequest.paramsContent; - paramsKeyValueFromEditor = JSON.parse(this.artifactRequest.paramsContent); - let theJSON = JSON.stringify(paramsKeyValueFromEditor, null, '\t'); - var blob = new Blob([theJSON], { - type: 'text/json' - }); - this.showVersionDiv = true; - let fileName: any; - fileName = this.updateFileName(refObj.action, this.scopeName, this.versionNo); - saveAs(blob, fileName); - } - else { - this.nService.error('Error', 'Please enter Action and VNF type in Reference Data screen'); - - } - } - - //========================== End of onDownloadParameter() Method============================================ - JSONToCSVConvertor(JSONData, fileName, ShowLabel) { - //If JSONData is not an object then JSON.parse will parse the JSON string in an Object - var arrData = typeof JSONData != 'object' ? JSON.parse(JSONData) : JSONData; - var CSV = ''; - //This condition will generate the Label/Header - if (ShowLabel) { - var testRow = ''; - for (var index in arrData[0]) { - CSV += index + '\t' + arrData[0][index] + '\r\n'; - } - } - if (CSV == '') { - return; - } - //Initialize file format you want csv or xls - var uri = 'data:application/vnd.ms-excel,' + encodeURI(CSV); - var link = document.createElement('a'); - link.href = uri; - link.download = fileName + '.xls'; - //this part will append the anchor tag and remove it after automatic click - document.body.appendChild(link); - link.click(); - document.body.removeChild(link); - } - - //========================== End of JSONToCSVConvertor() Method============================================ - updateFileNameForXls(action: any, scopeName: any, versionNo: any) { - let fileName = 'param_' + action + '_' + scopeName + '_' + versionNo + 'V'; - return fileName; - } - - //========================== End of updateFileNameForXls() Method============================================ - appendSlashes(artifactData) { - let x = artifactData.replace(new RegExp(',"', 'g'), ',\"'); - let y = x.replace(new RegExp('":', 'g'), '\":'); - let z = y.replace(new RegExp('{"', 'g'), '{\"'); - let t = z.replace(new RegExp(':"', 'g'), ':\"'); - let m = t.replace(new RegExp('",', 'g'), '\",'); - let n = y.replace(new RegExp('"}', 'g'), '\"}'); - let nw = n.replace(new RegExp('{"', 'g'), '{\"'); - let nw1 = nw.replace(new RegExp(':"', 'g'), ':\"'); - let nw2 = nw1.replace(new RegExp('",', 'g'), '\",'); - return nw2; - } - - //========================== End of appendSlashes() Method============================================ + updateFileName(action: any, scopeName: any, versionNo: any) { let fileName = 'param_' + action + '_' + scopeName + '_' + versionNo + 'V.json'; this.downloadedFileName = fileName; @@ -431,55 +278,14 @@ export class GoldenConfigurationMappingComponent implements OnInit { } //========================== End of prepareFileName() Method============================================ - openModel(toShow: any, message: any, title: any) { - this.message = message; - this.title = title; - $('#modalButton').trigger('click'); - } - - //========================== End of openModel() Method============================================ - checkSave(selectedAction): void { - if (this.actionType === 'updateTemplate') { - if (!this.buildDesignComponent.isReferenceFound(selectedAction, this.mappingEditorService.getReferenceList())) { - this.nService.error('Error', 'Reference Data not found. Please add Reference Data for Action:' + selectedAction); - } - } - if (this.initialData != this.artifactRequest.paramsContent) { - this.showConfirm(this.initialData); - } - else { - this.initialAction = this.item.action; - } - } - - //========================== End of checkSave() Method============================================ - showConfirm(initialData) { - let disposable = this.dialogService.addDialog(ConfirmComponent, { - title: 'Confirm title', - message: 'Confirm message' - }) - .subscribe((isConfirmed) => { - //We get dialog result - if (isConfirmed) { - this.artifactRequest.paramsContent = initialData; - this.initialAction = this.item.action; - } - else { - this.item.action = this.initialAction; - } - }); - } - - //========================== End of showConfirm() Method============================================ + retrieveNameValueFromAppc() { let refObj = this.refObj; if (refObj && refObj != undefined) { - // console.log("REF OBJECT IN RETRIVE"+JSON.stringify(refObj)); this.enableMerge = true; var scopeName = this.scopeName.replace(/ /g, '').replace(new RegExp('/', "g"), '_').replace(/ /g, ''); let fileName = this.updateFileName(this.item.action, scopeName, this.versionNo); let payload = '{"userID": "' + this.userId + '", "action": "' + this.item.action + '", "vnf-type" : "' + this.vnfType + '", "artifact-type":"APPC-CONFIG", "artifact-name":"' + fileName + '"}'; - // console.log("payload OBJECT IN RETRIVE"+JSON.stringify(payload)); let input = { 'input': { 'design-request': { @@ -531,70 +337,8 @@ export class GoldenConfigurationMappingComponent implements OnInit { } //========================== End of retrieveNameValueFromAppc() Method============================================ - saveNameValueToAppc() { - let refObj = this.refObj; - if (refObj && refObj != undefined) { - // refObj = refObj[refObj.length - 1]; - let paramsKeyValueFromEditor = JSON.parse(this.artifactRequest.paramsContent); - let action = this.item.action; - let fileName = this.updateFileName(refObj.action, this.scopeName, this.versionNo); - let vnfType = this.vnfType; - let Json = [paramsKeyValueFromEditor]; - let slashedPayload = this.appendSlashes(JSON.stringify(Json)); - let newPayload = - { - 'userID': this.userId, - 'vnf-type': this.vnfType, - 'action': action, - 'artifact-name': fileName, - 'artifact-type': 'APPC-CONFIG', - 'artifact-version': this.versionNo, - 'artifact-contents': slashedPayload - }; - let data = - { - 'input': { - 'design-request': { - 'request-id': this.apiToken, - 'action': 'uploadArtifact', - 'payload': JSON.stringify(newPayload) - } - } - }; - this - .httpUtil - .post( - { url: environment.getDesigns, data: data }) - .subscribe(resp => { - if (resp.output.status.code === '400' && resp.output.status.message === 'success') { - this.nService.success('Success', 'Name/value pairs saved successfully to APPC'); - } - if (resp.output.status.code === '401') { - this.nService.error('Error', resp.output.status.message); - } - }, - error => this.nService.error('Error', 'Could not save name value pairs. Error in connecting APPC Server')); - } - setTimeout(() => { - this.ngProgress.done(); - }, 3500); - } - - //========================== End of saveNameValueToAppc() Method============================================ + formatNameValuePairs(namevaluePairs: string) { - //var string = namevaluePairs.substring(2, namevaluePairs.length - 2); - /* var stringArr = string.split(","); - var newStringArr = []; - var resultStr = "{\r\n\""; - for (var index in stringArr) { - newStringArr[index] = stringArr[index] + ",\r\n"; - } - for (var index in newStringArr) { - resultStr = resultStr + newStringArr[index]; - } - resultStr = resultStr.substring(0, resultStr.length - 3) + "\"\r\n}" - return resultStr;*/ - var string = namevaluePairs.substring(1, namevaluePairs.length - 1); var stringArr = string.split(','); var newStringArr = []; @@ -619,7 +363,6 @@ export class GoldenConfigurationMappingComponent implements OnInit { var pdDataArrayForSession = []; try { paramNameValues = JSON.parse(paramNameValuesStr); - console.log('Param Name values array==' + JSON.stringify(paramNameValues)); if (paramNameValues && paramNameValues != undefined) { for (var index in paramNameValues) { var json = { @@ -688,7 +431,7 @@ export class GoldenConfigurationMappingComponent implements OnInit { 'ruleTypeValues': arr2item.ruleTypeValues }; pdDataArrayForSession.splice(i, 1, json); - // console.log("Result array index ==" + JSON.stringify(resultArr[i])) + } }); diff --git a/src/app/vnfs/build-artifacts/template-holder/template-configuration/template-configuration.component.html b/src/app/vnfs/build-artifacts/template-holder/template-configuration/template-configuration.component.html index c1fb030..335b595 100644 --- a/src/app/vnfs/build-artifacts/template-holder/template-configuration/template-configuration.component.html +++ b/src/app/vnfs/build-artifacts/template-holder/template-configuration/template-configuration.component.html @@ -21,8 +21,7 @@ ECOMP is a trademark and service mark of AT&T Intellectual Property. ============LICENSE_END============================================ --> <simple-notifications [options]="options"></simple-notifications> -<ng-progress [positionUsing]="'marginLeft'" [minimum]="0.15" [maximum]="1" [speed]="200" [showSpinner]="false" [direction]="'leftToRightIncreased'" [color]="'#6ab344'" - [trickleSpeed]="250" [thick]="true" [ease]="'linear'"></ng-progress> +<ng-progress [positionUsing]="'marginLeft'" [minimum]="0.15" [maximum]="1" [speed]="200" [showSpinner]="false" [direction]="'leftToRightIncreased'" [color]="'#6ab344'" [trickleSpeed]="250" [thick]="true" [ease]="'linear'"></ng-progress> <div> <div> <div class="card" style="margin-bottom: 23px;"> @@ -43,7 +42,7 @@ ECOMP is a trademark and service mark of AT&T Intellectual Property. <label>Protocol</label><input class="form-control" type="text" disabled value="{{protocol}}" /> </div> <div *ngIf="(action === 'ConfigScaleOut')" class="col-lg-3 col-sm-6 col-md-3 col-xs-12"> - <label>templateIdentifier</label><input class="form-control" type="text" disabled value="{{identifier}}" /> + <label>Template Identifier</label><input class="form-control" type="text" disabled value="{{identifier}}" /> </div> </div> </div> @@ -53,8 +52,7 @@ ECOMP is a trademark and service mark of AT&T Intellectual Property. <div class="input-group"> <input id="inputFile" class="file" #myInput type='file' (change)='fileChange(myInput)'> <input [(ngModel)]="fileName" type="text" class="input-lg" disabled placeholder="Upload template from PC" style="width:80%"> - <button (click)="browseOption($event)" [disabled]="!enableBrowse" class="browse mdl-button mdl-js-button mdl-button--raised mdl-js-ripple-effect mdl-button--primary input-lg" - type="button">Upload Template File + <button (click)="browseOption($event)" [disabled]="!enableBrowse" class="browse mdl-button mdl-js-button mdl-button--raised mdl-js-ripple-effect mdl-button--primary input-lg" type="button">Upload Template File </button> </div> </div> @@ -73,10 +71,7 @@ ECOMP is a trademark and service mark of AT&T Intellectual Property. <div><label for="textAreaGeneratedTemplate"> <div class="mdl-card__title-text">File Editor</div> </label> - <!-- <ace-editor [(text)]="configMappingEditorContent" #templateeditor [theme]="'chrome'" [mode]="'velocity'" [options]="{maxLines: 'Infinity', fontSize: '13pt'}" - style="min-height: 500px; width: fit-content;scroll-snap-coordinate: 3%"></ace-editor> --> - <ace-editor [(text)]="configMappingEditorContent" #templateeditor [theme]="'chrome'" [mode]="'velocity'" [options]="{maxLines: 'Infinity', fontSize: '13pt' }" - style="min-height: 500px; width: 100%"></ace-editor> + <ace-editor [(text)]="configMappingEditorContent" #templateeditor [theme]="'chrome'" [mode]="'velocity'" [options]="{maxLines: 'Infinity', fontSize: '13pt' }" style="min-height: 500px; width: 100%"></ace-editor> </div> <app-modal [title]="'Confirmation'" [isShow]="false" [message]="'Template is saved and ready for creating parameter definition'" #modalComponent> </app-modal> diff --git a/src/app/vnfs/build-artifacts/template-holder/template-configuration/template-configuration.component.spec.ts b/src/app/vnfs/build-artifacts/template-holder/template-configuration/template-configuration.component.spec.ts index f26e5fd..d2412a0 100644 --- a/src/app/vnfs/build-artifacts/template-holder/template-configuration/template-configuration.component.spec.ts +++ b/src/app/vnfs/build-artifacts/template-holder/template-configuration/template-configuration.component.spec.ts @@ -21,12 +21,11 @@ ECOMP is a trademark and service mark of AT&T Intellectual Property. ============LICENSE_END============================================ */ -/* tslint:disable:no-unused-variable */ + import { async, ComponentFixture, TestBed, inject } from '@angular/core/testing'; import { By, BrowserModule } from '@angular/platform-browser'; import { DebugElement, NO_ERRORS_SCHEMA } from '@angular/core'; import { Component, OnInit, ViewChild, Input } from '@angular/core'; -//import { ModalComponent } from '../../modal/modal.component'; import { HttpUtilService } from '../../../../shared/services/httpUtil/http-util.service'; import { MappingEditorService } from '../../../../shared/services/mapping-editor.service'; import { ArtifactRequest } from '../../../../shared/models/index'; @@ -36,8 +35,8 @@ import { NotificationService } from '../../../../shared/services/notification.se import { NotificationsService } from "angular2-notifications" import { ParamShareService } from '../../../../shared/services/paramShare.service'; import { DialogService } from "ng2-bootstrap-modal"; -import {ConfirmComponent} from '../../../../shared/confirmModal/confirm.component'; -import {BuildDesignComponent} from '../../build-artifacts.component'; +import { ConfirmComponent } from '../../../../shared/confirmModal/confirm.component'; +import { BuildDesignComponent } from '../../build-artifacts.component'; import { environment } from '../../../../../environments/environment'; import { ModalComponent } from 'ng2-bs3-modal/ng2-bs3-modal' import { FormsModule } from '@angular/forms'; @@ -53,6 +52,8 @@ import { Ng2Bs3ModalModule } from 'ng2-bs3-modal/ng2-bs3-modal'; import { SimpleNotificationsModule } from 'angular2-notifications'; import { GoldenConfigurationComponent } from './template-configuration.component'; import { NgProgress } from 'ngx-progressbar'; +import { BaseRequestOptions, Response, ResponseOptions, Http } from '@angular/http'; +import { MockBackend, MockConnection } from '@angular/http/testing'; describe('GoldenConfigurationComponent', () => { let component: GoldenConfigurationComponent; @@ -97,7 +98,17 @@ describe('GoldenConfigurationComponent', () => { TestBed.configureTestingModule({ imports: [FormsModule, BrowserModule, RouterTestingModule.withRoutes(routes), HttpModule, Ng2Bs3ModalModule, SimpleNotificationsModule.forRoot()], declarations: [GoldenConfigurationComponent, HomeComponent, TestComponent, HelpComponent, AboutUsComponent, LogoutComponent, AceEditorComponent], - providers: [BuildDesignComponent, NgProgress, ParamShareService, DialogService, NotificationService, HttpUtilService, MappingEditorService, NotificationsService], + providers: [BuildDesignComponent, NgProgress, ParamShareService, DialogService, NotificationService, MockBackend, + BaseRequestOptions, + { + provide: Http, + useFactory: (backend: MockBackend, defaultOptions: BaseRequestOptions) => { + return new Http(backend, defaultOptions); + }, + deps: [MockBackend, BaseRequestOptions], + }, + + HttpUtilService, MappingEditorService, NotificationsService], schemas: [NO_ERRORS_SCHEMA], }) @@ -132,28 +143,28 @@ describe('GoldenConfigurationComponent', () => { expect(component.artifactName).toEqual('template_Configure_test_0.0.1V.json'); - mappingEditorService.latestAction = { "action": "Configure", "action-level": "vnf", "scope": { "vnf-type": "testVnf", "vnfc-type": "testVnfc" }, "template": "Y", "vm": [], "device-protocol": "CHEF", "user-name": "", "port-number": "", "artifact-list": [{ "artifact-name": "template_Configure_test_0.0.1V.json", "artifact-type": "config_template" }, { "artifact-name": "pd_Configure_test_0.0.1V.yaml", "artifact-type": "parameter_definitions" }], "scopeType": "vnf-type" } - expect(component.ngOnInit()); - expect(component.vnfcType).toEqual('testVnfc'); - + mappingEditorService.latestAction = { "action": "Configure", "action-level": "vnf", "scope": { "vnf-type": "testVnf", "vnfc-type": "testVnfc" }, "template": "Y", "vm": [], "device-protocol": "CHEF", "user-name": "", "port-number": "", "artifact-list": [{ "artifact-name": "template_Configure_test_0.0.1V.json", "artifact-type": "config_template" }, { "artifact-name": "pd_Configure_test_0.0.1V.yaml", "artifact-type": "parameter_definitions" }], "scopeType": "vnf-type" } + expect(component.ngOnInit()); + expect(component.vnfcType).toEqual('testVnfc'); + })); it('check if variables are empty when reference data object is empty', inject([MappingEditorService], (mappingEditorService: MappingEditorService) => { fixture = TestBed.createComponent(GoldenConfigurationComponent); component = fixture.componentInstance; - mappingEditorService.latestAction = { "action": "", "scope": { "vnf-type": "", "vnfc-type": "" }, "vm": [], "protocol": "", "download-dg-reference": "", "user-name": "", "port-number": "", "artifact-list": [], "deviceTemplate": "", "scopeType": "" }; - + // mappingEditorService.latestAction = { "action": "", "scope": { "vnf-type": "", "vnfc-type": "" }, "vm": [], "protocol": "", "download-dg-reference": "", "user-name": "", "port-number": "", "artifact-list": [], "deviceTemplate": "", "scopeType": "" }; + mappingEditorService.latestAction = undefined; expect(component.ngAfterViewInit()); expect(component.action).toEqual(''); expect(component.vnfType).toEqual(''); expect(component.vnfcType).toEqual(''); expect(component.protocol).toEqual(''); expect(component.artifactName).toEqual(''); - + })); - it('check if correct notification is fired while initialising if reference data object is undefined',()=>{ + it('check if correct notification is fired while initialising if reference data object is undefined', () => { fixture = TestBed.createComponent(GoldenConfigurationComponent); component = fixture.componentInstance; expect(component.ngAfterViewInit()); @@ -161,39 +172,205 @@ describe('GoldenConfigurationComponent', () => { expect(component.enableBrowse).toBe(false) }); - it('test sync template when template data, param data and pd data are available', inject([MappingEditorService, ParamShareService], (mappingEditorService: MappingEditorService, paramShareService:ParamShareService) => { + it('test sync template when template data, param data and pd data are available', inject([MappingEditorService, ParamShareService], (mappingEditorService: MappingEditorService, paramShareService: ParamShareService) => { fixture = TestBed.createComponent(GoldenConfigurationComponent); component = fixture.componentInstance; mappingEditorService.fromScreen === 'MappingScreen' - component.configMappingEditorContent="<configuration xmlns=\"http://xml.juniper.net/xnm/1.1/xnm\" \n xmlns:a=\"http://xml.juniper.net/junos/15.1X49/junos\" >\n <version>15.1X49-D50.3</version>\n <groups>\n <name>node0</name>\n <system>\n <tacplus-server>\n <name>${sync_auto-pop_name1}</name>\n <source-address>${sync_auto-pop_address1}</source-address>\n </tacplus-server>\n <tacplus-server>\n <name>${node0_tacplus_server_name2}</name>\n <source-address>${sync_auto-pop_address1}</source-address>\n </tacplus-server>\n </system> \n </groups>\n </configuration>" + component.configMappingEditorContent = "<configuration xmlns=\"http://xml.juniper.net/xnm/1.1/xnm\" \n xmlns:a=\"http://xml.juniper.net/junos/15.1X49/junos\" >\n <version>15.1X49-D50.3</version>\n <groups>\n <name>node0</name>\n <system>\n <tacplus-server>\n <name>${sync_auto-pop_name1}</name>\n <source-address>${sync_auto-pop_address1}</source-address>\n </tacplus-server>\n <tacplus-server>\n <name>${node0_tacplus_server_name2}</name>\n <source-address>${sync_auto-pop_address1}</source-address>\n </tacplus-server>\n </system> \n </groups>\n </configuration>" mappingEditorService.initialise(component.templateeditor.getEditor(), component.configMappingEditorContent, component.modal); - - var pdData=[{"name":"sync_auto-pop_name1","type":null,"description":null,"required":null,"default":null,"source":"A&AI","rule-type":"vnfc-oam-ipv4-address-list","request-keys":[{"key-name":null,"key-value":null},{"key-name":null,"key-value":null},{"key-name":null,"key-value":null}],"response-keys":[{"key-name":"unique-key-name","key-value":"parent-name"},{"key-name":"unique-key-value","key-value":"vnfc"},{"key-name":"field-key-name","key-value":"ipaddress-v4-oam-vip"},{"key-name":null,"key-value":"vm-number"},{"key-name":null,"key-value":"test"}],"ruleTypeValues":[null,"vnf-name","vm-name-list","vnfc-name-list","vnf-oam-ipv4-address","vnfc-oam-ipv4-address-list"],"showFilterFields":true,"enableFilterByValue":true},{"name":"sync_auto-pop_address1","type":null,"description":null,"required":null,"default":null,"source":"A&AI","rule-type":"vm-name-list","request-keys":[{"key-name":null,"key-value":null},{"key-name":null,"key-value":null},{"key-name":null,"key-value":null}],"response-keys":[{"key-name":"unique-key-name","key-value":"parent-name"},{"key-name":"unique-key-value","key-value":"vserver"},{"key-name":"field-key-name","key-value":"vserver-name"},{"key-name":null,"key-value":"vnfc-function-code"},{"key-name":null,"key-value":null}],"ruleTypeValues":[null,"vnf-name","vm-name-list","vnfc-name-list","vnf-oam-ipv4-address","vnfc-oam-ipv4-address-list"],"showFilterFields":true,"enableFilterByValue":true},{"name":"node0_tacplus_server_name2","type":null,"description":null,"required":null,"default":null,"source":"Manual","rule-type":null,"request-keys":[{"key-name":null,"key-value":null},{"key-name":null,"key-value":null},{"key-name":null,"key-value":null}],"response-keys":[{"key-name":null,"key-value":null},{"key-name":null,"key-value":null},{"key-name":null,"key-value":null},{"key-name":null,"key-value":null},{"key-name":null,"key-value":null}],"ruleTypeValues":[null]}]; + + var pdData = [{ "name": "sync_auto-pop_name1", "type": null, "description": null, "required": null, "default": null, "source": "A&AI", "rule-type": "vnfc-oam-ipv4-address-list", "request-keys": [{ "key-name": null, "key-value": null }, { "key-name": null, "key-value": null }, { "key-name": null, "key-value": null }], "response-keys": [{ "key-name": "unique-key-name", "key-value": "parent-name" }, { "key-name": "unique-key-value", "key-value": "vnfc" }, { "key-name": "field-key-name", "key-value": "ipaddress-v4-oam-vip" }, { "key-name": null, "key-value": "vm-number" }, { "key-name": null, "key-value": "test" }], "ruleTypeValues": [null, "vnf-name", "vm-name-list", "vnfc-name-list", "vnf-oam-ipv4-address", "vnfc-oam-ipv4-address-list"], "showFilterFields": true, "enableFilterByValue": true }, { "name": "sync_auto-pop_address1", "type": null, "description": null, "required": null, "default": null, "source": "A&AI", "rule-type": "vm-name-list", "request-keys": [{ "key-name": null, "key-value": null }, { "key-name": null, "key-value": null }, { "key-name": null, "key-value": null }], "response-keys": [{ "key-name": "unique-key-name", "key-value": "parent-name" }, { "key-name": "unique-key-value", "key-value": "vserver" }, { "key-name": "field-key-name", "key-value": "vserver-name" }, { "key-name": null, "key-value": "vnfc-function-code" }, { "key-name": null, "key-value": null }], "ruleTypeValues": [null, "vnf-name", "vm-name-list", "vnfc-name-list", "vnf-oam-ipv4-address", "vnfc-oam-ipv4-address-list"], "showFilterFields": true, "enableFilterByValue": true }, { "name": "node0_tacplus_server_name2", "type": null, "description": null, "required": null, "default": null, "source": "Manual", "rule-type": null, "request-keys": [{ "key-name": null, "key-value": null }, { "key-name": null, "key-value": null }, { "key-name": null, "key-value": null }], "response-keys": [{ "key-name": null, "key-value": null }, { "key-name": null, "key-value": null }, { "key-name": null, "key-value": null }, { "key-name": null, "key-value": null }, { "key-name": null, "key-value": null }], "ruleTypeValues": [null] }]; paramShareService.setSessionParamData([pdData]); - localStorage["paramsContent"]={ - "sync_auto-pop_name1":"10.0.1.34", - "sync_auto-pop_address1":"", - "node0_tacplus_server_name2":"192.34.45.5" - }; + localStorage["paramsContent"] = { + "sync_auto-pop_name1": "testIp1", + "sync_auto-pop_address1": "", + "node0_tacplus_server_name2": "testIp2" + }; expect(component.syncTemplate()); - - + + })); - it('test sync template when template data, param data and pd data are not available', inject([MappingEditorService, ParamShareService], (mappingEditorService: MappingEditorService, paramShareService:ParamShareService) => { + it('test sync template when template data, param data and pd data are not available', inject([MappingEditorService, ParamShareService], (mappingEditorService: MappingEditorService, paramShareService: ParamShareService) => { fixture = TestBed.createComponent(GoldenConfigurationComponent); component = fixture.componentInstance; mappingEditorService.fromScreen === 'MappingScreen' - component.configMappingEditorContent="<configuration xmlns=\"http://xml.juniper.net/xnm/1.1/xnm\" \n xmlns:a=\"http://xml.juniper.net/junos/15.1X49/junos\" >\n <version>15.1X49-D50.3</version>\n <groups>\n <name>node0</name>\n <system>\n <tacplus-server>\n <name>${sync_auto-pop_name1}</name>\n <source-address>${sync_auto-pop_address1}</source-address>\n </tacplus-server>\n <tacplus-server>\n <name>${node0_tacplus_server_name2}</name>\n <source-address>${sync_auto-pop_address1}</source-address>\n </tacplus-server>\n </system> \n </groups>\n </configuration>" + component.configMappingEditorContent = "<configuration xmlns=\"http://xml.juniper.net/xnm/1.1/xnm\" \n xmlns:a=\"http://xml.juniper.net/junos/15.1X49/junos\" >\n <version>15.1X49-D50.3</version>\n <groups>\n <name>node0</name>\n <system>\n <tacplus-server>\n <name>${sync_auto-pop_name1}</name>\n <source-address>${sync_auto-pop_address1}</source-address>\n </tacplus-server>\n <tacplus-server>\n <name>${node0_tacplus_server_name2}</name>\n <source-address>${sync_auto-pop_address1}</source-address>\n </tacplus-server>\n </system> \n </groups>\n </configuration>" mappingEditorService.initialise(component.templateeditor.getEditor(), component.configMappingEditorContent, component.modal); - - var pdData=[]; + + var pdData = []; paramShareService.setSessionParamData([pdData]); - localStorage["paramsContent"]={}; + localStorage["paramsContent"] = {}; expect(component.syncTemplate()); - - + + + })); + + it('test whether proper param data and template data are getting set in the appDataObject', inject([MappingEditorService], (mappingEditorService: MappingEditorService) => { + fixture = TestBed.createComponent(GoldenConfigurationComponent); + component = fixture.componentInstance; + mappingEditorService.latestAction = { "action": "Configure", "action-level": "vnf", "scope": { "vnf-type": "testVnf", "vnfc-type": "" }, "template": "Y", "vm": [], "device-protocol": "CHEF", "user-name": "", "port-number": "", "artifact-list": [{ "artifact-name": "template_Configure_test_0.0.1V.json", "artifact-type": "config_template" }, { "artifact-name": "pd_Configure_test_0.0.1V.yaml", "artifact-type": "parameter_definitions" }], "scopeType": "vnf-type" }; + component.ngOnInit(); + component.ngAfterViewInit(); + component.appDataObject = { reference: {}, template: { templateData: {}, nameValueData: {} }, pd: {} }; + component.configMappingEditorContent = "<configuration xmlns=\"http://xml.juniper.net/xnm/1.1/xnm\" \n xmlns:a=\"http://xml.juniper.net/junos/15.1X49/junos\" >\n <version>15.1X49-D50.3</version>\n <groups>\n <name>node0</name>\n <system>\n <tacplus-server>\n <name>${sync_auto-pop_name1}</name>\n <source-address>${sync_auto-pop_address1}</source-address>\n </tacplus-server>\n <tacplus-server>\n <name>${node0_tacplus_server_name2}</name>\n <source-address>${sync_auto-pop_address1}</source-address>\n </tacplus-server>\n </system> \n </groups>\n </configuration>" + mappingEditorService.initialise(component.templateeditor.getEditor(), component.configMappingEditorContent, component.modal); + localStorage["paramsContent"] = JSON.stringify({ "sync_auto-pop_name1": "testIp1", "sync_auto-pop_address1": "", "node0_tacplus_server_name2": "testIp2" }); + + component.userId = "testuser"; + component.apiToken = "87264736473"; + component.prepareAppData(); + var paramData = { "input": ({ "design-request": ({ "request-id": '87264736473', "action": 'uploadArtifact', "payload": '{"userID":"testuser","vnf-type":"testVnf","action":"Configure","artifact-name":"param_Configure_testVnf_0.0.1V.json","artifact-type":"APPC-CONFIG","artifact-version":"0.0.1","artifact-contents":"[{\"sync_auto-pop_name1\":\"10.0.1.34\",\"sync_auto-pop_address1\":\"\",\"node0_tacplus_server_name2\":\"192.34.45.5\"}]"}' }) }) }; + var templateData = { input: ({ "design-request": ({ "request-id": '87264736473', "action": 'uploadArtifact', "payload": '{"userID":"testuser","vnf-type":"testVnf","action":"Configure","artifact-name":"template_Configure_test_0.0.1V.json","artifact-type":"APPC-CONFIG","artifact-version":"0.0.1","artifact-contents":"<configuration xmlns=\"http://xml.juniper.net/xnm/1.1/xnm\" \n xmlns:a=\"http://xml.juniper.net/junos/15.1X49/junos\" >\n<version>15.1X49-D50.3</version>\n <groups>\n <name>node0</name>\n <system>\n <tacplus-server>\n <name>${sync_auto-pop_name1}</name>\n <source-address>${sync_auto-pop_address1}</source-address>\n </tacplus-server>\n <tacplus-server>\n <name>${node0_tacplus_server_name2}</name>\n <source-address>${sync_auto-pop_address1}</source-address>\n </tacplus-server>\n </system> \n </groups>\n </configuration>"}' }) }) }; + expect(component.appDataObject.template.nameValueData["payload"]).toBe(JSON.stringify(paramData["payload"])); + expect(component.appDataObject.template.templateData["payload"]).toBe(JSON.stringify(templateData["payload"])); + })); + + + it('test whether proper param data is getting set in the downloadDataObject', inject([MappingEditorService], (mappingEditorService: MappingEditorService) => { + fixture = TestBed.createComponent(GoldenConfigurationComponent); + component = fixture.componentInstance; + mappingEditorService.latestAction = { "action": "Configure", "action-level": "vnf", "scope": { "vnf-type": "testVnf", "vnfc-type": "" }, "template": "Y", "vm": [], "device-protocol": "CHEF", "user-name": "", "port-number": "", "artifact-list": [{ "artifact-name": "template_Configure_test_0.0.1V.json", "artifact-type": "config_template" }, { "artifact-name": "pd_Configure_test_0.0.1V.yaml", "artifact-type": "parameter_definitions" }], "scopeType": "vnf-type" }; + component.ngOnInit(); + component.ngAfterViewInit(); + component.downloadDataObject = { + reference: {}, + template: { templateData: {}, nameValueData: {}, templateFileName: '', nameValueFileName: '' }, + pd: { pdData: '', pdFileName: '' } + }; + localStorage["paramsContent"] = JSON.stringify({ "sync_auto-pop_name1": "testIp1", "sync_auto-pop_address1": "", "node0_tacplus_server_name2": "testIp2" }); + + component.onDownloadParameter(); + var nameValueData = { + "sync_auto-pop_name1": "testIp1", + "sync_auto-pop_address1": "", + "node0_tacplus_server_name2": "testIp2" + }; + expect(component.downloadDataObject.template.nameValueData).toBe(JSON.stringify(nameValueData, null, "\t")); + expect(component.downloadDataObject.template.nameValueFileName).toBe("param_Configure_testVnf_0.0.1V.json"); + })); + + it('test whether proper template data is getting set in the downloadDataObject', inject([MappingEditorService], (mappingEditorService: MappingEditorService) => { + fixture = TestBed.createComponent(GoldenConfigurationComponent); + component = fixture.componentInstance; + mappingEditorService.latestAction = { "action": "Configure", "action-level": "vnf", "scope": { "vnf-type": "testVnf", "vnfc-type": "" }, "template": "Y", "vm": [], "device-protocol": "CHEF", "user-name": "", "port-number": "", "artifact-list": [{ "artifact-name": "template_Configure_test_0.0.1V.json", "artifact-type": "config_template" }, { "artifact-name": "pd_Configure_test_0.0.1V.yaml", "artifact-type": "parameter_definitions" }], "scopeType": "vnf-type" }; + component.ngOnInit(); + component.ngAfterViewInit(); + component.downloadDataObject = { + reference: {}, + template: { templateData: {}, nameValueData: {}, templateFileName: '', nameValueFileName: '' }, + pd: { pdData: '', pdFileName: '' } + }; + component.configMappingEditorContent = "<configuration xmlns=\"http://xml.juniper.net/xnm/1.1/xnm\" \n xmlns:a=\"http://xml.juniper.net/junos/15.1X49/junos\" >\n <version>15.1X49-D50.3</version>\n <groups>\n <name>node0</name>\n <system>\n <tacplus-server>\n <name>${sync_auto-pop_name1}</name>\n <source-address>${sync_auto-pop_address1}</source-address>\n </tacplus-server>\n <tacplus-server>\n <name>${node0_tacplus_server_name2}</name>\n <source-address>${sync_auto-pop_address1}</source-address>\n </tacplus-server>\n </system> \n </groups>\n </configuration>" + component.fileType = "text/xml" + component.onDownloadTemplate('Template'); + + component.fileType = "text/plain" + component.onDownloadTemplate('Template'); + component.fileType = "text/json" + component.onDownloadTemplate('Template'); + component.tempretrieveFlag = true; + component.fileNameForTempSave = "Configure_testVnf_0.0.1V.json" + component.onDownloadTemplate('Template'); + expect(component.downloadDataObject.template.templateData).toBe(component.configMappingEditorContent.replace(/\(([^()]|(R))*\)=\(/g, '').replace(/\)}/g, '}')); + })); + + + it('test merge status for golden config template and uploaded parameter data', inject([MappingEditorService], (mappingEditorService: MappingEditorService) => { + fixture = TestBed.createComponent(GoldenConfigurationComponent); + component = fixture.componentInstance; + mappingEditorService.latestAction = { "action": "Configure", "action-level": "vnf", "scope": { "vnf-type": "testVnf", "vnfc-type": "" }, "template": "Y", "vm": [], "device-protocol": "CHEF", "user-name": "", "port-number": "", "artifact-list": [{ "artifact-name": "template_Configure_test_0.0.1V.json", "artifact-type": "config_template" }, { "artifact-name": "pd_Configure_test_0.0.1V.yaml", "artifact-type": "parameter_definitions" }], "scopeType": "vnf-type" }; + component.ngOnInit(); + component.ngAfterViewInit(); + component.downloadDataObject = { + reference: {}, + template: { templateData: {}, nameValueData: {}, templateFileName: '', nameValueFileName: '' }, + pd: { pdData: '', pdFileName: '' } + }; + component.configMappingEditorContent = "<configuration xmlns=\"http://xml.juniper.net/xnm/1.1/xnm\" \r\n xmlns:a=\"http://xml.juniper.net/junos/15.1X49/junos\" >\r\n <version>15.1X49-D50.3</version>\r\n <groups>\r\n <name>node0</name>\r\n <system>\r\n <tacplus-server>\r\n <name>testIp1</name>\r\n <source-address>135.144.3.125</source-address>\r\n </tacplus-server>\r\n <tacplus-server>\r\n <name>199.37.184.242</name>\r\n <source-address>testIp2</source-address>\r\n </tacplus-server>\r\n </system> \r\n </groups>\r\n </configuration>"; + mappingEditorService.initialise(component.templateeditor.getEditor(), component.configMappingEditorContent, component.modal); + localStorage["paramsContent"] = JSON.stringify({ + "node0_tacplus_server_name1": "testIp1", + "node0_tacplus_server_source_address1": "675453432", + "node0_tacplus_server_name2": "testIp2" + }); + component.mergeParams(); + expect(component.mergeStatus).toBe(true); + + component.configMappingEditorContent = "<configuration xmlns=\"http://xml.juniper.net/xnm/1.1/xnm\" \n xmlns:a=\"http://xml.juniper.net/junos/15.1X49/junos\" >\n <version>15.1X49-D50.3</version>\n <groups>\n <name>node0</name>\n <system>\n <tacplus-server>\n <name>${sync_auto-pop_name1}</name>\n <source-address>${sync_auto-pop_address1}</source-address>\n </tacplus-server>\n <tacplus-server>\n <name>${node0_tacplus_server_name2}</name>\n <source-address>${sync_auto-pop_address1}</source-address>\n </tacplus-server>\n </system> \n </groups>\n </configuration>" + mappingEditorService.initialise(component.templateeditor.getEditor(), component.configMappingEditorContent, component.modal); + component.mergeParams(); + expect(component.mergeStatus).toBe(false); + + })); + + it('test handleAnnotation method', inject([MappingEditorService], (mappingEditorService: MappingEditorService) => { + fixture = TestBed.createComponent(GoldenConfigurationComponent); + component = fixture.componentInstance; + mappingEditorService.latestAction = { "action": "Configure", "action-level": "vnf", "scope": { "vnf-type": "testVnf", "vnfc-type": "" }, "template": "Y", "vm": [], "device-protocol": "CHEF", "user-name": "", "port-number": "", "artifact-list": [{ "artifact-name": "template_Configure_test_0.0.1V.json", "artifact-type": "config_template" }, { "artifact-name": "pd_Configure_test_0.0.1V.yaml", "artifact-type": "parameter_definitions" }], "scopeType": "vnf-type" }; + component.ngOnInit(); + component.ngAfterViewInit(); + + component.configMappingEditorContent = "<configuration xmlns=\"http://xml.juniper.net/xnm/1.1/xnm\" \r\n xmlns:a=\"http://xml.juniper.net/junos/15.1X49/junos\" >\r\n <version>15.1X49-D50.3</version>\r\n <groups>\r\n <name>node0</name>\r\n <system>\r\n <tacplus-server>\r\n <name>199.37.184.211</name>\r\n <source-address>675453432</source-address>\r\n </tacplus-server>\r\n <tacplus-server>\r\n <name>199.37.184.242</name>\r\n <source-address>675453432</source-address>\r\n </tacplus-server>\r\n </system> \r\n </groups>\r\n </configuration>"; + mappingEditorService.initialise(component.templateeditor.getEditor(), component.configMappingEditorContent, component.modal); + component.selectedWord = "node0"; + expect(component.handleAnnotation(component.modal)); })); + it('test handleAnnotation method', inject([MappingEditorService], (mappingEditorService: MappingEditorService) => { + fixture = TestBed.createComponent(GoldenConfigurationComponent); + component = fixture.componentInstance; + mappingEditorService.latestAction = { "action": "Configure", "action-level": "vnf", "scope": { "vnf-type": "testVnf", "vnfc-type": "" }, "template": "Y", "vm": [], "device-protocol": "CHEF", "user-name": "", "port-number": "", "artifact-list": [{ "artifact-name": "template_Configure_test_0.0.1V.json", "artifact-type": "config_template" }, { "artifact-name": "pd_Configure_test_0.0.1V.yaml", "artifact-type": "parameter_definitions" }], "scopeType": "vnf-type" }; + component.ngOnInit(); + component.ngAfterViewInit(); + + component.configMappingEditorContent = "<configuration xmlns=\"http://xml.juniper.net/xnm/1.1/xnm\" \r\n xmlns:a=\"http://xml.juniper.net/junos/15.1X49/junos\" >\r\n <version>15.1X49-D50.3</version>\r\n <groups>\r\n <name>node0</name>\r\n <system>\r\n <tacplus-server>\r\n <name>{(node1)=(name1)}</name>\r\n <source-address>675453432</source-address>\r\n </tacplus-server>\r\n <tacplus-server>\r\n <name>199.37.184.242</name>\r\n <source-address>675453432</source-address>\r\n </tacplus-server>\r\n </system> \r\n </groups>\r\n </configuration>"; + mappingEditorService.initialise(component.templateeditor.getEditor(), component.configMappingEditorContent, component.modal); + component.selectedWord = "node0"; + component.tempName = "name0"; + component.submitNameValues() + expect(component.replaceWord).toContain("{(node0)=(name0)}"); + component.selectedWord = "{(node1)=(name1)}"; + component.submitNameValues(); + component.tempName = false; + component.submitNameValues(); + })); + + it('retrieveTemplateFromAppc function should return response on success and set the configMappingEditorContent object', inject([HttpUtilService, NgProgress, MappingEditorService, MockBackend], (httpUtilService: HttpUtilService, mappingEditorService: MappingEditorService, ngProgress: NgProgress, mockBackend: MockBackend) => { + fixture = TestBed.createComponent(GoldenConfigurationComponent); + component = fixture.componentInstance; + var mockData = { + "output": { + "data": { + "block": "{\"userID\":null,\"designInfo\":null,\"statusInfo\":null,\"artifactInfo\":[{\"artifact-content\":\" <configuration xmlns=\\\"http://xml.juniper.net/xnm/1.1/xnm\\\" \\n xmlns:a=\\\"http://xml.juniper.net/junos/15.1X49/junos\\\" >\\n <version>15.1X49-D50.3</version>\\n <groups>\\n <name>node0</name>\\n <system>\\n <tacplus-server>\\n <name>${sync_auto-pop_name1}</name>\\n <source-address>${sync_auto-pop_address1}</source-address>\\n </tacplus-server>\\n <tacplus-server>\\n <name>${node0_tacplus_server_name2}</name>\\n <source-address>${sync_auto-pop_address1}</source-address>\\n </tacplus-server>\\n </system> \\n </groups>\\n </configuration>\"}]}", + "requestId": "497085412083" + }, + "status": { + "code": "400", + "message": "success" + } + } + } + let response = new ResponseOptions({ + body: JSON.stringify(mockData) + }); + const baseResponse = new Response(response); + mockBackend.connections.subscribe( + (c: MockConnection) => c.mockRespond(baseResponse) + ); + + mappingEditorService.latestAction = { "action": "Configure", "action-level": "vnf", "scope": { "vnf-type": "testVnf", "vnfc-type": "" }, "template": "Y", "vm": [], "device-protocol": "CHEF", "user-name": "", "port-number": "", "artifact-list": [{ "artifact-name": "template_Configure_test_0.0.1V.json", "artifact-type": "config_template" }, { "artifact-name": "pd_Configure_test_0.0.1V.yaml", "artifact-type": "parameter_definitions" }], "scopeType": "vnf-type" } + + mappingEditorService.fromScreen = 'MappingScreen'; + component.action = 'Configure'; + component.refObj = mappingEditorService.latestAction; + component.scopeName = "testVnf"; + component.vnfType = "testVnf"; + component.userId = "abc"; + component.item.action = "Configure"; + component.retrieveTemplateFromAppc(); + expect(component.configMappingEditorContent).not.toBe(null); + + })); }); diff --git a/src/app/vnfs/build-artifacts/template-holder/template-configuration/template-configuration.component.ts b/src/app/vnfs/build-artifacts/template-holder/template-configuration/template-configuration.component.ts index 8514e24..1d1bc4f 100644 --- a/src/app/vnfs/build-artifacts/template-holder/template-configuration/template-configuration.component.ts +++ b/src/app/vnfs/build-artifacts/template-holder/template-configuration/template-configuration.component.ts @@ -22,7 +22,6 @@ ECOMP is a trademark and service mark of AT&T Intellectual Property. */ import { Component, Input, OnInit, ViewChild } from '@angular/core'; -//import { ModalComponent } from '../../modal/modal.component'; import { HttpUtilService } from '../../../../shared/services/httpUtil/http-util.service'; import { MappingEditorService } from '../../../../shared/services/mapping-editor.service'; import { ArtifactRequest } from '../../../../shared/models/index'; @@ -45,7 +44,6 @@ export class GoldenConfigurationComponent implements OnInit { @Input() configMappingEditorContent: string; @Input() isMappingComp: boolean; @ViewChild('myInput') myInputVariable: any; - // @ViewChild(ModalComponent) modalComponent: ModalComponent; @ViewChild('myModal') modal: ModalComponent; aceText: string = "" fileName: string = "" @@ -96,6 +94,7 @@ export class GoldenConfigurationComponent implements OnInit { clickToClose: true, maxLength: 200 } + public replaceWord; public enableDownloadButtons: boolean = false; constructor(private buildDesignComponent: BuildDesignComponent, private paramShareService: ParamShareService, private dialogService: DialogService, private notificationService: NotificationService, private httpUtil: HttpUtilService, private mappingEditorService: MappingEditorService, private activeRoutes: ActivatedRoute, private router: Router, private nService: NotificationsService, private ngProgress: NgProgress) { this.artifactRequest.action = ''; @@ -131,13 +130,13 @@ export class GoldenConfigurationComponent implements OnInit { enableValidateTemplate: boolean = false;; public selectedUploadType: string = this.uploadTypes[0].value; identifier: any; - //this.mappingeditorservice.referenceNameObjects = object;PLEASE USE THIS OBJECT TO GET TEMPALLDATA - //==================================================== + public tempRetrievalResponse:any; + public mergeStatus:boolean=false; + + //======================================Start of ngOnInit() Method============================================ ngOnInit() { var refObj = this.refObj = this.prepareFileName(); - // console.log("Ref object: " + JSON.stringify(refObj)) if (refObj && refObj != undefined) { - // refObj = refObj[refObj.length - 1]; this.item = refObj; this.vnfType = this.item.scope["vnf-type"]; @@ -160,17 +159,11 @@ export class GoldenConfigurationComponent implements OnInit { this.activeRoutes.url.subscribe(UrlSegment => { this.actionType = UrlSegment[0].path }) - /*if (this.actionType === 'createTemplate') { - this.mappingEditorService.fromScreen = 'TemplateScreen'; - } - if (this.actionType === 'updateTemplate') {*/ this.mappingEditorService.fromScreen = 'MappingScreen'; - // } this.identifier = this.mappingEditorService.identifier; } //========================== End of ngOnInit() Method============================================ ngOnDestroy() { - //console.log("Reference object =="+ JSON.stringify(this.refObj)); if (this.refObj && this.refObj != undefined) { if (this.configMappingEditorContent && this.configMappingEditorContent != undefined) { this.saveTemplate(); @@ -200,13 +193,6 @@ export class GoldenConfigurationComponent implements OnInit { } let self = this; this.templateEditor = self.templateeditor.getEditor(); - /* this.templateeditor.getEditor().commands.addCommand({ - name: 'annotateCommand', - bindKey: { win: 'Ctrl-4', mac: 'Command-4' }, - exec: function (editor) { - self.mappingEditorService.checkMethodCall(this.modal); - } - });*/ this.templateeditor.getEditor().commands.addCommand({ name: 'annotateCommand', bindKey: { win: 'ENTER', mac: 'ENTER' }, @@ -218,10 +204,6 @@ export class GoldenConfigurationComponent implements OnInit { this.configMappingEditorContent = this.mappingEditorService.getTemplateMappingDataFromStore(); this.fileType = sessionStorage.getItem('fileType'); } - /* else if (this.mappingEditorService.fromScreen === 'TemplateScreen') { - this.configMappingEditorContent = this.mappingEditorService.getTemplateDataFromStore(); - this.fileType = sessionStorage.getItem('fileType'); - }*/ if (this.configMappingEditorContent) { this.artifactRequest.templateContent = this.configMappingEditorContent; this.mappingEditorService.initialise(this.templateeditor.getEditor(), this.artifactRequest.templateContent, this.modal); @@ -246,18 +228,6 @@ export class GoldenConfigurationComponent implements OnInit { $("#inputFile").trigger('click'); } //========================== End of browseOption() Method============================================ - /* openFile(event) { - let input = event.target; - this.fileName = event.currentTarget.value.replace(/C:\\fakepath\\/i, ''); - for (let index = 0; index < input.files.length; index++) { - let reader = new FileReader(); - reader.onload = () => { - this.configMappingEditorContent = reader.result; - } - reader.readAsText(input.files[index]); - }; - } - //========================== End of openFile() Method============================================*/ //save to GUI public saveTemplate() { this.saveToGuiCacheFlag = 'true'; @@ -286,46 +256,9 @@ export class GoldenConfigurationComponent implements OnInit { if (this.fileType === '') { sessionStorage.setItem('fileType', ''); } - // paramArr = this.mappingEditorService.paramData; - // this.paramShareService.setTemplateData(paramArr) - } + } } //========================== End of saveTemplate() Method============================================ - /* clearHighlight() { - this.mappingEditorService.removeTheSelectedMarkers(); - } - //========================== End of clearHighlight() Method============================================*/ - /*validateTemplate() { - var fileExtensionArr = this.fileType.split("/"); - let data = { - "input": { - "design-request": { - "request-id": this.apiToken, - "action": "validateTemplate", - "data-type": fileExtensionArr[1].toUpperCase(), - "payload": this.configMappingEditorContent - } - } - }; - let url = environment.validateTemplate; - this - .httpUtil - .post( - { url: url, data: data }) - .subscribe(resp => { - if (resp.output.status.code === '400' && resp.output.status.message === "success") { - this.uploadValidationSuccess = true; - this.nService.success("Success", "Template Validated succesfully"); - return true; - } - else if (resp.output.status.code === '401') { - this.nService.error("Error", resp.output.status.message); - return false; - } - }, - error => this.nService.error("Error", "Unable to validate the uploaded template. Error in connecting APPC Server")); - } - //========================== End of validateTemplate() Method============================================*/ retrieveTemplateFromAppc() { let refObj = this.refObj; if (refObj && refObj != undefined) { @@ -341,7 +274,6 @@ export class GoldenConfigurationComponent implements OnInit { } } }; - // console.log("Retrieve artifact payload=="+ payload); let artifactContent: any; this.ngProgress.start(); this.httpUtil.post({ @@ -350,6 +282,7 @@ export class GoldenConfigurationComponent implements OnInit { }).subscribe(resp => { if (resp.output.status.code === '400' && resp.output.status.message === "success") { this.nService.success("Success", "Template retrieved successfully from APPC"); + this.tempRetrievalResponse=resp; let result = JSON.parse(resp.output.data.block).artifactInfo[0]; result = result['artifact-content']; if ('Generated Template' === this.selectedUploadType) { @@ -371,16 +304,7 @@ export class GoldenConfigurationComponent implements OnInit { } this.ngProgress.done(); }, - /* (error) => { - // this.showUploadErrorStatus = true; - // this.nService.error('Status','Error Connecting to the APPC Network') - //this.notificationService.notifyErrorMessage('Configuration Template file successfully uploaded..') - //this.uploadStatusError = true; - //window.scrollTo(0, 0) - // this. nService.error('Status','Error Connecting to the APPC Network') - this.openModel(true, "Could not retrieve latest template for given action""Error in connecting to APPC database") - });*/ - error => this.nService.error("Error", "Error in connecting to APPC Server")); + error => this.nService.error("Error", "Error in connecting to APPC Server")); setTimeout(() => { this.ngProgress.done(); }, 3500); @@ -389,14 +313,8 @@ export class GoldenConfigurationComponent implements OnInit { //========================== End of retrieveTemplateFromAppc() Method============================================ prepareAppData() { let refObj = this.refObj; - //console.log("Reference object =="+ JSON.stringify(refObj)); if (refObj && refObj != undefined) { - // refObj = refObj[refObj.length - 1]; let paramsKeyValueFromEditor: JSON; - /* if (this.fileExtension.toUpperCase() === "XML") - paramsKeyValueFromEditor = this.mappingEditorService.generateParams(this.templateeditor.getEditor(), this.artifactRequest.templateContent); - else*/ - // paramsKeyValueFromEditor = this.mappingEditorService.generateParams(this.templateeditor.getEditor(), this.artifactRequest.templateContent); try { paramsKeyValueFromEditor = JSON.parse(localStorage["paramsContent"]); } @@ -432,7 +350,7 @@ export class GoldenConfigurationComponent implements OnInit { } } } - this.appDataObject.template.nameValueData = data; + this.appDataObject.template.nameValueData = data; } if (this.configMappingEditorContent) { let actualContent = this.configMappingEditorContent; @@ -452,7 +370,6 @@ export class GoldenConfigurationComponent implements OnInit { fileName = this.fileNameForTempSave; } else { - // fileName = this.updateDownloadTemplateFileName(refObj.action, this.scopeName, versionandFileType); fileName = this.artifactName; } let vnfType = this.vnfType; @@ -464,7 +381,6 @@ export class GoldenConfigurationComponent implements OnInit { "artifact-name": fileName, "artifact-type": "APPC-CONFIG", "artifact-version": this.templateVersionNo, - //"artifact-contents": this.configMappingEditorContent "artifact-contents": this.configMappingEditorContent.replace(/\(([^()]|(R))*\)=\(/g, '').replace(/\)}/g, '}') } @@ -485,51 +401,6 @@ export class GoldenConfigurationComponent implements OnInit { } } //========================== End of prepareAppData() Method============================================ - /*retrieveNameValueFromAppc() { - let refObj: any = this.prepareFileName(); - if (refObj && refObj != undefined) { - let fileName = this.updateParamFileName(this.item.action, this.scopeName, this.templateVersionNo); - let payload = '{"userID": "' + this.userId + '","action": "' + this.item.action + '", "vnf-type" : "' + this.vnfType + '", "artifact-type":"APPC-CONFIG", "artifact-name":"' + fileName + '"}'; - let input = { - "input": { - "design-request": { - "request-id": this.apiToken, - "action": "getArtifact", - "payload": payload - } - } - }; - - let artifactContent: any; - this.httpUtil.post({ - // url:"https://mtanjv9apdb51.aic.cip.att.com:8443/restconf/operations/design-services:dbservice", - url: environment.getDesigns, - data: input - }).subscribe(resp => { - if (resp.output.status.code === '400' && resp.output.status.message === "success") { - this.openModel(true, 'Name/value pairs retrieved successfully from APPC', 'Success'); - let result = JSON.parse(resp.output.data.block).artifactInfo[0]; - result = JSON.parse(result['artifact-content']); - var jsonString = JSON.stringify(result[0]); - var string = jsonString.substring(1, jsonString.length - 1); - var stringArr = string.split(","); - var newStringArr = []; - var resultStr = "{\r\n" - for (var index in stringArr) { - newStringArr[index] = stringArr[index] + ",\r\n"; - } - for (var index in newStringArr) { - resultStr = resultStr + newStringArr[index]; - } - resultStr = resultStr.substring(0, resultStr.length - 3) + "\r\n}" - this.configMappingEditorContent = resultStr; - - } - }, - error => this.openModel(true, "Could not retrieve the name value pairs. Error in connecting to APPC Server", "ERROR")); - } - }*/ - //========================== End of retrieveNameValueFromAppc() Method============================================ prepareFileName(): any { let fileNameObject: any = this.mappingEditorService.latestAction; this.appDataObject = this.mappingEditorService.appDataObject; @@ -541,14 +412,8 @@ export class GoldenConfigurationComponent implements OnInit { onDownloadParameter() { let refObj = this.refObj; if (refObj) { - // refObj = refObj[refObj.length - 1]; let paramsKeyValueFromEditor: JSON; - if (this.fileExtension.toUpperCase() === "XML") - paramsKeyValueFromEditor = this.mappingEditorService.generateParams(this.templateeditor.getEditor(), this.artifactRequest.templateContent); - else - paramsKeyValueFromEditor = this.mappingEditorService.generateParams(this.templateeditor.getEditor(), this.artifactRequest.templateContent); - - try { + try { paramsKeyValueFromEditor = JSON.parse(localStorage["paramsContent"]); } catch (error) { @@ -571,37 +436,6 @@ export class GoldenConfigurationComponent implements OnInit { } //========================== End of onDownloadParameter() Method============================================ - /* JSONToCSVConvertor(JSONData, fileName, ShowLabel) { - //If JSONData is not an object then JSON.parse will parse the JSON string in an Object - var arrData = typeof JSONData != 'object' ? JSON.parse(JSONData) : JSONData; - var CSV = ''; - //This condition will generate the Label/Header - if (ShowLabel) { - var testRow = ""; - for (var index in arrData[0]) { - CSV += index + '\t' + arrData[0][index] + '\r\n'; - } - } - if (CSV == '') { - return; - } - //Initialize file format you want csv or xls - var uri = 'data:application/vnd.ms-excel,' + encodeURI(CSV); - var link = document.createElement("a"); - link.href = uri; - link.download = fileName + ".xls"; - //this part will append the anchor tag and remove it after automatic click - document.body.appendChild(link); - link.click(); - document.body.removeChild(link); - } - //========================== End of JSONToCSVConvertor() Method============================================ - updateParamFileNameForXls(action: any, scopeName: any, versionNo: any) { - let fileName = 'param_' + action + '_' + scopeName + '_' + versionNo + 'V'; - this.downloadedParamFileName = fileName; - return fileName; - } - //========================== End of updateParamFileNameForXls() Method============================================*/ updateParamFileName(action: any, scopeName: any, versionNo: any) { let fileName = 'param_' + action + '_' + scopeName + '_' + versionNo + 'V.json'; this.downloadedParamFileName = fileName; @@ -614,9 +448,7 @@ export class GoldenConfigurationComponent implements OnInit { var config_template_fileName: any let refObj = this.refObj; let versionandFileType: string; - this.mappingEditorService.generateTemplate(this.templateEditor); - if (artifact == 'Template' && this.artifactRequest && this.configMappingEditorContent && refObj) { - // refObj = refObj[refObj.length - 1]; + if (artifact == 'Template' && this.artifactRequest && this.configMappingEditorContent && refObj) { this.showTemplateVersionDiv = true; if (this.fileType === "text/xml") { textToSaveAsBlob = new Blob([this.configMappingEditorContent], { @@ -645,30 +477,15 @@ export class GoldenConfigurationComponent implements OnInit { }); } else { - // config_template_fileName = this.updateDownloadTemplateFileName(refObj.action, this.scopeName, versionandFileType); config_template_fileName = this.artifactName; } - // saveAs(textToSaveAsBlob, config_template_fileName); this.mappingEditorService.initialise(this.templateeditor.getEditor(), actualContent, this.modal); - //this.downloadDataObject.template.templateData = this.configMappingEditorContent; this.downloadDataObject.template.templateData = this.configMappingEditorContent.replace(/\(([^()]|(R))*\)=\(/g, '').replace(/\)}/g, '}'); this.downloadDataObject.template.templateFileName = config_template_fileName; } } //========================== End of onDownloadTemplate() Method============================================ - updateDownloadTemplateFileName(action: any, scopeName: any, versionandFileType: any) { - let fileName = 'template_' + action + '_' + scopeName + '_' + versionandFileType; - this.downloadedTemplateFileName = fileName; - return fileName; - } - //========================== End of updateDownloadTemplateFileName() Method============================================ - /* openModel(toShow: any, message: any, title: any) { - //this.modalComponent.isShow = toShow; - //this.modalComponent.message = message; - //this.modalComponent.title = title; - } - //========================== End of openModel() Method============================================*/ fileChange(input) { let self = this; @@ -676,17 +493,11 @@ export class GoldenConfigurationComponent implements OnInit { this.enableValidateTemplate = true; if (refObj && refObj != undefined) { - // refObj = refObj[refObj.length - 1]; if (input.files && input.files[0]) { - console.log("input files0" + JSON.stringify(input.files[0])) this.myfileName = input.files[0].name; this.fileName = input.files[0].name; this.fileType = input.files[0].type; - // var fileExtension = this.myfileName.substr(this.myfileName.lastIndexOf('.') + 1); - let reader = new FileReader(); - // if(this.validateUploadedFile(fileExtension)) - //{ this.readFile(input.files[0], reader, (result) => { if (this.fileType === 'text/xml') { sessionStorage.setItem('fileType', 'text/xml'); @@ -703,7 +514,6 @@ export class GoldenConfigurationComponent implements OnInit { if ('Generated Template' === this.selectedUploadType) { this.configMappingEditorContent = result this.artifactRequest.templateContent = this.configMappingEditorContent; - console.log("editor content==" + JSON.stringify(this.configMappingEditorContent)) this.notificationService.notifySuccessMessage('Configuration Template file successfully uploaded..'); if (this.artifactRequest.templateContent) { this.mappingEditorService.initialise(this.templateeditor.getEditor(), this.artifactRequest.templateContent, this.modal); @@ -714,12 +524,7 @@ export class GoldenConfigurationComponent implements OnInit { this.saveTemplate(); }); - // } - // else{ - // this.nService.error("Error", "Incorrect File Format") - //this.configMappingEditorContent='' - //} - } + } else { this.nService.error("Error", "Failed to read file"); } @@ -776,22 +581,13 @@ export class GoldenConfigurationComponent implements OnInit { this.saveTemplate(); var templateData = this.mappingEditorService.paramData; //template data array - // this.paramShareService.setTemplateData(templateData); - - //console.log("Template Name value pairs ===" + JSON.stringify(templateData)) var pdData = this.paramShareService.getSessionParamData(); //PD data array - console.log("PD name value pairs===" + JSON.stringify(pdData)) - - var paramsContent = localStorage["paramsContent"]; - console.log("Param content before==" + paramsContent); - + if (paramsContent && paramsContent != undefined) { try { var paramTabData = JSON.parse(paramsContent); - //console.log("Param content after==" + paramsContent); - //console.log("Param tab data after==" + JSON.stringify(paramTabData)) - } + } catch (error) { console.log("error is : " + error) } @@ -812,7 +608,6 @@ export class GoldenConfigurationComponent implements OnInit { templateData.forEach(function (item) { resultParamObj[item.paramName] = item.paramValue; }); - // console.log("pARAM Result array before is " + JSON.stringify(resultParamObj)) if (paramTabData && paramTabData != undefined) { templateData.forEach(function (item) { for (var index in paramTabData) { @@ -836,9 +631,6 @@ export class GoldenConfigurationComponent implements OnInit { } localStorage["paramsContent"] = JSON.stringify(resultParamObj); - //console.log("param content after==" +JSON.stringify(resultParamObj)); - - //removing duplicate elements from the array templateData = Array.from(new Set(templateData.map((itemInArray) => itemInArray.paramName))) //reformatting arr1 to match with PD @@ -883,9 +675,6 @@ export class GoldenConfigurationComponent implements OnInit { }) }); } - //console.log("Result array before is " + JSON.stringify(resultArr)) - // console.log("Length before is: " + resultArr.length) - if (pdData && pdData != undefined) { for (var i = 0; i < resultArr.length; i++) { @@ -905,8 +694,7 @@ export class GoldenConfigurationComponent implements OnInit { "ruleTypeValues": arr2item.ruleTypeValues }; resultArr.splice(i, 1, json) - // console.log("Result array index ==" + JSON.stringify(resultArr[i])) - } + } }); @@ -914,8 +702,6 @@ export class GoldenConfigurationComponent implements OnInit { } this.paramShareService.setSessionParamData(resultArr); - //console.log("Result array after is " + JSON.stringify(resultArr)) - //console.log("Length after is: " + resultArr.length) this.mappingEditorService.paramData = []; //navigate to PD page after sync this @@ -925,8 +711,8 @@ export class GoldenConfigurationComponent implements OnInit { //========================== End of syncTemplate() Method============================================ mergeParams() { - var mergeStatus: boolean = this.mappingEditorService.autoAnnotateDataForParams(this.fileType); - if (mergeStatus) { + this.mergeStatus = this.mappingEditorService.autoAnnotateDataForParams(); + if (this.mergeStatus) { this.nService.success("Success", "Merge Successful"); } else { @@ -937,30 +723,24 @@ export class GoldenConfigurationComponent implements OnInit { //========================== End of mergeParams() Method============================================ public handleAnnotation(modal) { - let selectedWord: string = this.templateeditor.getEditor().session.getTextRange(this.templateeditor.getEditor().selectionRange); - this.selectedWord = selectedWord; + this.selectedWord = this.templateeditor.getEditor().session.getTextRange(this.templateeditor.getEditor().selectionRange); modal.open(); } //========================== End of handleAnnotations() Method============================================ public submitNameValues() { - /*var editor = this.templateeditor.getEditor() - this.editor = editor; - this.editor.session = editor.session; - this.editor.selection.session.$backMarkers = {}; - this.editorContent = this.artifactRequest.templateContent; - this.editor.$blockScrolling = Infinity; - this.editor.$blockSelectEnabled = false;*/ if (this.tempName) { this.checkNameEntered = true; if (this.selectedWord) { if (this.selectedWord.startsWith('${(')) { - var replaceWord: any = this.selectedWord.substring(3, this.selectedWord.indexOf(')=(')) + this.tempName; + var replaceWord: any =this.replaceWord = this.selectedWord.substring(3, this.selectedWord.indexOf(')=(')) + this.tempName; this.templateeditor.getEditor().session.replace(this.templateeditor.getEditor().session.selection.getRange(), replaceWord); + } else { let mappingKey = this.mappingEditorService.getKeysForValues(this.selectedWord); - var replaceWord: any = '${(' + this.selectedWord + ')=(' + this.tempName + ')}'; + var replaceWord: any = this.replaceWord='${(' + this.selectedWord + ')=(' + this.tempName + ')}'; this.templateeditor.getEditor().session.replace(this.templateeditor.getEditor().session.selection.getRange(), replaceWord); + } } this.mappingEditorService.refreshEditor(); |