diff options
author | Ittay Stern <ittay.stern@att.com> | 2018-08-29 17:01:32 +0300 |
---|---|---|
committer | Ittay Stern <ittay.stern@att.com> | 2019-02-18 18:35:30 +0200 |
commit | 6f900cc45d7dd7f97430812b86b5c1d1693c8ae3 (patch) | |
tree | 936005c364dc5a7264d6304d4777c3d83494db22 /vid-webpack-master/src/app | |
parent | 67d99f816cc583643c35193197594cf78d8ce60a (diff) |
merge from ecomp a88f0072 - Modern UI
Issue-ID: VID-378
Change-Id: Ibcb23dd27f550cf32ce2fe0239f0f496ae014ff6
Signed-off-by: Ittay Stern <ittay.stern@att.com>
Diffstat (limited to 'vid-webpack-master/src/app')
397 files changed, 58550 insertions, 6921 deletions
diff --git a/vid-webpack-master/src/app/angular-tree-component.scss b/vid-webpack-master/src/app/angular-tree-component.scss new file mode 100644 index 000000000..40333b9d1 --- /dev/null +++ b/vid-webpack-master/src/app/angular-tree-component.scss @@ -0,0 +1,83 @@ +.tree-children.tree-children-no-padding { padding-left: 0 } +.tree-children { padding-left: 20px; overflow: hidden } +.node-drop-slot { display: block; height: 2px } +.node-drop-slot.is-dragging-over { background: #ddffee; height: 20px; border: 2px dotted #888; } +.toggle-children-wrapper-expanded .toggle-children { transform: rotate(90deg) } +.toggle-children-wrapper-collapsed .toggle-children { transform: rotate(0); } +.toggle-children-wrapper { + padding: 2px 3px 5px 1px; +} +/* tslint:disable */ +.toggle-children { + background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAASCAYAAABSO15qAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAABAhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMDY3IDc5LjE1Nzc0NywgMjAxNS8wMy8zMC0yMzo0MDo0MiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ1dWlkOjY1RTYzOTA2ODZDRjExREJBNkUyRDg4N0NFQUNCNDA3IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkYzRkRFQjcxODUzNTExRTU4RTQwRkQwODFEOUZEMEE3IiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkYzRkRFQjcwODUzNTExRTU4RTQwRkQwODFEOUZEMEE3IiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE1IChNYWNpbnRvc2gpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MTk5NzA1OGEtZDI3OC00NDZkLWE4ODgtNGM4MGQ4YWI1NzNmIiBzdFJlZjpkb2N1bWVudElEPSJhZG9iZTpkb2NpZDpwaG90b3Nob3A6YzRkZmQxMGMtY2NlNS0xMTc4LWE5OGQtY2NkZmM5ODk5YWYwIi8+IDxkYzp0aXRsZT4gPHJkZjpBbHQ+IDxyZGY6bGkgeG1sOmxhbmc9IngtZGVmYXVsdCI+Z2x5cGhpY29uczwvcmRmOmxpPiA8L3JkZjpBbHQ+IDwvZGM6dGl0bGU+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+5iogFwAAAGhJREFUeNpiYGBgKABigf///zOQg0EARH4A4gZyDIIZ8B/JoAJKDIDhB0CcQIkBRBtEyABkgxwoMQCGD6AbRKoBGAYxQgXIBRuZGKgAKPIC3QLxArnRSHZCIjspk52ZKMrOFBUoAAEGAKnq593MQAZtAAAAAElFTkSuQmCC'); + height: 8px; + width: 9px; + background-size: contain; + display: inline-block; + position: relative; + top: 1px; + background-repeat: no-repeat; + background-position: center; +} +.toggle-children-placeholder { + display: inline-block; + height: 10px; + width: 10px; + position: relative; + top: 1px; + padding-right: 3px; +} +.node-content-wrapper { + display: inline-block; + padding: 2px 5px; + border-radius: 2px; + transition: background-color .15s,box-shadow .15s; +} +.node-wrapper {display: flex; align-items: flex-start;} +.node-content-wrapper-active, +.node-content-wrapper.node-content-wrapper-active:hover, +.node-content-wrapper-active.node-content-wrapper-focused { + background: #beebff; +} +.node-content-wrapper-focused { background: #e7f4f9 } +.node-content-wrapper:hover { background: #f7fbff } +.node-content-wrapper-active, .node-content-wrapper-focused, .node-content-wrapper:hover { + box-shadow: inset 0 0 1px #999; +} +.node-content-wrapper.is-dragging-over { background: #ddffee; box-shadow: inset 0 0 1px #999; } +.node-content-wrapper.is-dragging-over-disabled { opacity: 0.5 } + +tree-viewport { + height: 100%; + overflow: auto; + display: block; +} +.tree-children { padding-left: 20px } +.empty-tree-drop-slot .node-drop-slot { height: 20px; min-width: 100px } +.angular-tree-component { + width: 100%; + position:relative; + display: inline-block; + cursor: pointer; + -webkit-touch-callout: none; /* iOS Safari */ + -webkit-user-select: none; /* Chrome/Safari/Opera */ + -khtml-user-select: none; /* Konqueror */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE/Edge */ + user-select: none; /* non-prefixed version, currently not supported by any browser */ +} + +tree-root .angular-tree-component-rtl { + direction: rtl; +} +tree-root .angular-tree-component-rtl .toggle-children-wrapper-collapsed .toggle-children { + transform: rotate(180deg) !important; +} +tree-root .angular-tree-component-rtl .tree-children { + padding-right: 20px; + padding-left: 0; +} + +tree-node-checkbox { + padding: 1px; +} diff --git a/vid-webpack-master/src/app/app.component.html b/vid-webpack-master/src/app/app.component.html index 3768d0c53..a247e2f5f 100644 --- a/vid-webpack-master/src/app/app.component.html +++ b/vid-webpack-master/src/app/app.component.html @@ -1,6 +1,7 @@ <main> <router-outlet> <message-box></message-box> + <audit-info-modal></audit-info-modal> <spinner-component></spinner-component> </router-outlet> </main> diff --git a/vid-webpack-master/src/app/app.component.ts b/vid-webpack-master/src/app/app.component.ts index 528c7d7a4..dc4bc88c9 100644 --- a/vid-webpack-master/src/app/app.component.ts +++ b/vid-webpack-master/src/app/app.component.ts @@ -1,28 +1,17 @@ -import {Component, Inject} from '@angular/core'; - -import { ApiService } from './shared'; - -import '../style/app.scss'; +import {Component} from '@angular/core'; import {NgRedux} from "@angular-redux/store"; -import {AppState} from "./store/reducers"; -import { LogService } from './shared/utils/log/log.service'; +import {AppState} from "./shared/store/reducers"; +import '../style/app.scss'; @Component({ - selector: 'vid-app', // <vid-app></vid-app> + selector: 'vid-app', templateUrl: './app.component.html', styleUrls: ['./app.component.scss'], }) export class AppComponent { - url = 'https://github.com/preboot/angular2-webpack'; - title: string; - - - constructor(private api: ApiService, private store: NgRedux<AppState>, private _logService : LogService) { - this.title = this.api.title; + constructor(private store: NgRedux<AppState>) { store.subscribe(()=>{ sessionStorage.setItem('reduxState', JSON.stringify(store.getState())); }); - - this._logService.info("testing new log service"); } } diff --git a/vid-webpack-master/src/app/app.module.ts b/vid-webpack-master/src/app/app.module.ts index a87ffb5b7..ce9b7da3b 100644 --- a/vid-webpack-master/src/app/app.module.ts +++ b/vid-webpack-master/src/app/app.module.ts @@ -1,26 +1,26 @@ -import { ApplicationRef, NgModule } from '@angular/core'; -import { BrowserModule } from '@angular/platform-browser'; -import { HTTP_INTERCEPTORS, HttpClientModule } from '@angular/common/http'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { AppComponent } from './app.component'; -import { HomeComponent } from './home/home.component'; -import { ApiService } from './shared'; -import { routing } from './app.routing'; -import { createNewHosts, removeNgStyles } from '@angularclass/hmr'; -import { BrowseSdcModule } from './browseSdc/browseSdc.module'; -import { VlanTaggingModule } from './vlanTagging/vlan-tagging.module' -import { BootstrapModalModule } from 'ng2-bootstrap-modal'; -import { HashLocationStrategy, LocationStrategy } from "@angular/common"; -import { InstantiationStatusModule } from './instantiationStatus/InstantiationStatus.module'; -import { SharedModule } from './shared/shared.module'; -import { AngularSvgIconModule } from 'angular-svg-icon'; -import { NgReduxModule } from '@angular-redux/store'; -import { StoreModule } from "./store/module"; -import { HttpInterceptorService } from './shared/utils/httpInterceptor/httpInterceptor.service'; -import { DrawingBoardModule } from './drawingBoard/drawingBoard.module'; -import { HealthStatusComponent } from './healthStatus/health-status.component'; -import { ScrollToModule } from '@nicky-lenaers/ngx-scroll-to'; -import { LogService } from './shared/utils/log/log.service'; +import {ApplicationRef, NgModule} from '@angular/core'; +import {BrowserModule} from '@angular/platform-browser'; +import {HTTP_INTERCEPTORS, HttpClientModule} from '@angular/common/http'; +import {FormsModule, ReactiveFormsModule} from '@angular/forms'; +import {AppComponent} from './app.component'; +import {routing} from './app.routing'; +import {VlanTaggingModule} from './vlanTagging/vlan-tagging.module' +import {BootstrapModalModule} from 'ng2-bootstrap-modal'; +import {HashLocationStrategy, LocationStrategy} from "@angular/common"; +import {InstantiationStatusModule} from './instantiationStatus/InstantiationStatus.module'; +import {SharedModule} from './shared/shared.module'; +import {AngularSvgIconModule} from 'angular-svg-icon'; +import {NgReduxModule} from '@angular-redux/store'; +import {StoreModule} from "./shared/store/module"; +import {HttpInterceptorService} from './shared/utils/httpInterceptor/httpInterceptor.service'; +import {DrawingBoardModule} from './drawingBoard/drawingBoard.module'; +import {ScrollToModule} from '@nicky-lenaers/ngx-scroll-to'; +import {LogService} from './shared/utils/log/log.service'; +import {FeatureFlagsService} from "./shared/services/featureFlag/feature-flags.service"; +import {SupportComponent} from "./support/support.component"; +import {DrawingBoardGuard} from "./drawingBoard/guards/servicePlanningGuard/drawingBoardGuard"; +import {MsoService} from "./shared/services/msoService/mso.service"; +import {HealthStatusModule} from "./healthStatus/health-status.module"; @NgModule({ imports: [ @@ -31,11 +31,10 @@ import { LogService } from './shared/utils/log/log.service'; SharedModule.forRoot(), ScrollToModule.forRoot(), DrawingBoardModule, + HealthStatusModule, VlanTaggingModule, InstantiationStatusModule, - BrowseSdcModule, BootstrapModalModule, - BrowseSdcModule, AngularSvgIconModule, ReactiveFormsModule, NgReduxModule, @@ -43,37 +42,22 @@ import { LogService } from './shared/utils/log/log.service'; ], declarations: [ AppComponent, - HomeComponent, - HealthStatusComponent + SupportComponent, ], providers: [ - ApiService, LogService, + FeatureFlagsService, + DrawingBoardGuard, + MsoService, { provide: LocationStrategy, useClass: HashLocationStrategy }, { provide: HTTP_INTERCEPTORS, useClass: HttpInterceptorService, multi: true } ], bootstrap: [AppComponent] }) + export class AppModule { - private static CustomLoader: any; constructor(public appRef: ApplicationRef) { - //for ng2-bootstrap-modal in angualar 5 Object.defineProperty(appRef, '_rootComponents', { get: () => appRef['components'] }); } - hmrOnInit(store) { - console.log('HMR store', store); - } - hmrOnDestroy(store) { - let cmpLocation = this.appRef.components.map(cmp => cmp.location.nativeElement); - // recreate elements - store.disposeOldHosts = createNewHosts(cmpLocation); - // remove styles - removeNgStyles(); - } - hmrAfterDestroy(store) { - // display new elements - store.disposeOldHosts(); - delete store.disposeOldHosts; - } } diff --git a/vid-webpack-master/src/app/app.routing.ts b/vid-webpack-master/src/app/app.routing.ts index e6f42f9ed..779d17e3c 100644 --- a/vid-webpack-master/src/app/app.routing.ts +++ b/vid-webpack-master/src/app/app.routing.ts @@ -1,40 +1,23 @@ import {RouterModule, Routes} from '@angular/router'; - -import {HomeComponent} from './home/home.component'; -import {BrowseSdcComponent} from './browseSdc/browseSdc.component'; -import {ServicePlanningComponent, ServicePlanningEmptyComponent} from './drawingBoard/service-planning/service-planning.component'; -import {VlanTaggingComponent} from './vlanTagging/vlan-tagging.component'; -import {ServicePopupComponent} from './components/service-popup/service-popup.component'; -import { InstantiationStatusComponent } from './instantiationStatus/instantiationStatus.component'; -import {HealthStatusComponent} from "./healthStatus/health-status.component"; -import {FlagsResolve} from "./services/flags.resolve"; - +import {FlagsResolve} from "./shared/resolvers/flag/flag.resolver"; +import {DrawingBoardRoutes} from "./drawingBoard/drawingBoard.routing"; +import {GenericFormPopupComponent} from "./shared/components/genericFormPopup/generic-form-popup.component"; +import {SupportComponent} from "./support/support.component"; +import {HealthStatusRoutes} from "./healthStatus/health-status.routing"; +import {VlanTaggingRoutes} from "./vlanTagging/vlan-tagging.routing"; +import {InstantiationStatusRoutes} from "./instantiationStatus/InstantiationStatus.routing"; const routes: Routes = [ - { path: '', component: HomeComponent, pathMatch: 'full' ,resolve : { - flags : FlagsResolve, - }}, - { path: 'browseSdc', component: BrowseSdcComponent, resolve : { - flags : FlagsResolve, - }}, - { path: 'servicePlanning', component: ServicePlanningComponent, resolve : { - flags : FlagsResolve, - }}, - { path: 'servicePlanningEmpty', component: ServicePlanningEmptyComponent, resolve : { - flags : FlagsResolve, - }}, - { path: 'servicePopup', component: ServicePopupComponent, resolve : { - flags : FlagsResolve, - }}, - { path :'vlan', component : VlanTaggingComponent, resolve : { - flags : FlagsResolve, - }}, - { path: 'instantiationStatus', component: InstantiationStatusComponent, resolve : { - flags : FlagsResolve, - }}, - { path: 'healthStatus', component: HealthStatusComponent, resolve : { - flags : FlagsResolve, - }} - + ...DrawingBoardRoutes, + ...HealthStatusRoutes, + ...VlanTaggingRoutes, + ...InstantiationStatusRoutes, + { + path: 'servicePopup', + component: GenericFormPopupComponent, + resolve: { + flags: FlagsResolve + } + }, + {path: 'support', component: SupportComponent}, ]; - export const routing = RouterModule.forRoot(routes); diff --git a/vid-webpack-master/src/app/browseSdc/browseSdc.component.html b/vid-webpack-master/src/app/browseSdc/browseSdc.component.html deleted file mode 100644 index 7ffd7931c..000000000 --- a/vid-webpack-master/src/app/browseSdc/browseSdc.component.html +++ /dev/null @@ -1,26 +0,0 @@ -<div> - - <span class="statusLine" [hidden]="!isSpinnerVisible"> - <img src="./img/spinner.gif"/> - </span> - <span class="statusLine" [hidden]="!isProgressVisible"> - <label>Status:</label><span class="status"><span [hidden]="!error"><font color='red'><b>Error: </b></font></span>{{status}}</span> - </span> - <br><br> - <div> - <input class="form-control search-query" placeholder="Filter..." data-tests-id="browseFilter" type="text" [(ngModel)]="filterQuery" size="20" style="width: 250px;"> - </div> - - <h1 class="heading1" style="margin-top:20px;">Browse SDC Service Models</h1> - <div style="margin-top:30px"> - <button (click)="deploy()">deploy</button> - <vid-table - [options]="tableOptions" - [filterQuery]="filterQuery" - (clickEvent)="clickAction($event)"> - Loading table... - </vid-table> - </div> -</div> - - diff --git a/vid-webpack-master/src/app/browseSdc/browseSdc.component.scss b/vid-webpack-master/src/app/browseSdc/browseSdc.component.scss deleted file mode 100644 index 0d1678a94..000000000 --- a/vid-webpack-master/src/app/browseSdc/browseSdc.component.scss +++ /dev/null @@ -1,59 +0,0 @@ -div[ng-controller=ServiceModelController] .popupContents { - text-align: left; -} - -div[ng-controller=ServiceModelController] .statusLine { - vertical-align: center; -} - -div[ng-controller=ServiceModelController] .statusLine img { - width: 20px; - margin: 10px; -} - -div[ng-controller=ServiceModelController] .status { - margin-left: 5px; -} - -div[ng-controller=ServiceModelController] .feedback { - height: 35px; - vertical-align: center; -} - -div[ng-controller=ServiceModelController] .progress { - margin: 0px 10px; - font-weight: bold; -} - -div[ng-controller=ServiceModelController] .error { - width: 630px; - font-weight: bold; - font-size: 16px; - color: red; - margin: 0px 10px 0px 45px; -} - -div[ng-controller=ServiceModelController] .error img { - width: 25px; - margin: 0px 10px; -} - -div[ng-controller=ServiceModelController] .buttonRow { - text-align: center; - margin-bottom: 10px; -} - -div[ng-controller=ServiceModelController] .log { - width: 700px; - height: 500px; - border: solid black 1px; - text-align: left !important; - margin: 10px; - padding: 10px; - overflow: auto; -} - - -.previous-versions-button { - width: 113px; -} diff --git a/vid-webpack-master/src/app/browseSdc/browseSdc.component.ts b/vid-webpack-master/src/app/browseSdc/browseSdc.component.ts deleted file mode 100644 index 46f37dc2e..000000000 --- a/vid-webpack-master/src/app/browseSdc/browseSdc.component.ts +++ /dev/null @@ -1,176 +0,0 @@ -import {Component, Input, OnInit} from '@angular/core'; -import * as _ from 'lodash'; -import {SdcService} from '../services/sdc.service'; -import {DialogService} from 'ng2-bootstrap-modal'; -import {Constants} from '../shared/utils/constants'; -import {CustomTableColumnDefinition, CustomTableOptions} from './vid-table/vid-table.component'; -import {ServicePopupComponent} from "../components/service-popup/service-popup.component"; -import { PreviousVersionsComponent } from './previous-versions/previous-versions.component'; - -@Component({ - selector: 'browse-sdc', - templateUrl: './browseSdc.component.html', - styleUrls: ['./browseSdc.component.scss'] -}) - - -export class BrowseSdcComponent implements OnInit { - - isSpinnerVisible = false; - isProgressVisible = false; - error: boolean; - status: string; - // table - - private basicColumns: CustomTableColumnDefinition[]; - @Input () filterQuery = ''; - tableOptions: CustomTableOptions; - private wholeData: any[]; - - constructor(private _sdcService: SdcService, private dialogService: DialogService) {} - - initTableOptions() { - this.basicColumns = [ - { displayName: 'Action', key: 'action', type: 'button' , text: 'deploy', action: 'deploy' }, - { displayName: 'UUID', key: 'uuid', filter: 'text'}, - { displayName: 'invariantUUID', key: 'invariantUUID', filter: 'text'}, - { displayName: 'Name', key: 'name', filter: 'text'}, - { displayName: 'Version', key: 'version', filter: 'text'}, - { displayName: 'Category', key: 'category', filter: 'text'}, - { displayName: 'Distribution Status', key: 'distributionStatus', filter: 'text'}, - { displayName: 'Last Updated By', key: 'lastUpdaterUserId', filter: 'text'}, - { displayName: 'Tosca Model', key: 'toscaModelUrl', filter: 'text'} - ]; - - let columns: CustomTableColumnDefinition[] = this.basicColumns.concat( - {displayName: 'Action', key: 'actions', type: 'button', text: 'Previous Versions', - showCondition: 'hasPreviousVersion', action: 'loadPreviousData' } - ); - - this.tableOptions = { - data: [], - columns: columns, - config: { - sortBy: 'name', - sortOrder: 'asc', - pageSize: 10, - pageNumber: 1, - totalCount: 0, - totalPages: 0, - maxSize: 10, - showSelectCheckbox: true, - showSelectAll: true, - showSort: true, - clientSort: true, - clientPaging: true, - // displayPager: true, - // displayPageSize: true, - stickyHeader: true, - stickyHeaderOffset: 0, - stickyContainer: '.table1-container' - }, - }; - } - private deploy(service: any): void { - if (service) { - console.log('this row uuid:' + service.uuid); - } - - this.dialogService.addDialog(ServicePopupComponent, { - }) - } - - private filterDataWithHigherVersion(serviceData) { - let delimiter = '$$'; - let filterDataServices = {}; - for (let i = 0; i < serviceData.length; i++) { - let index = serviceData[i].invariantUUID.trim() + delimiter + serviceData[i].name.trim(); - if (!filterDataServices[index]) { - filterDataServices[index] = { - service: serviceData[i], - hasPreviousVersion: false - }; - } else { - filterDataServices[index].hasPreviousVersion = true; - if (parseFloat(serviceData[i].version.trim()) > parseFloat(filterDataServices[index].service.version.trim())) { - filterDataServices[index].service = serviceData[i]; - } - } - } - return Object.keys(filterDataServices).map(function (key) { - let service = filterDataServices[key].service; - service.hasPreviousVersion = filterDataServices[key].hasPreviousVersion; - return service; - }); - } - - private initData() { - this.isProgressVisible = true; - this.isSpinnerVisible = true; - console.log('getServicesModels: '); - this._sdcService.getServicesModels().subscribe( - // onNext() function - value => this.getServiceCallback(value), - // onError() function - error => this.getServiceOnError(error), - // onComplete() function - () => console.log('completed') - ); - } - - private getServiceCallback(responseBody: any): void { - console.log('response is ' , responseBody); - this.wholeData = responseBody.services; - this.tableOptions.data = this.filterDataWithHigherVersion(responseBody.services); - this.isSpinnerVisible = false; - this.isProgressVisible = false; - } - private getServiceOnError(error: any): void { - console.log('error is ' , error); - this.status = Constants.Status.FAILED_SERVICE_MODELS_ASDC; - this.error = true; - this.isSpinnerVisible = false; - } - - private loadPreviousVersionData(service): void { - let previousVersionData: any[] = _.filter(this.wholeData, function(item) { - return item.invariantUUID === service.invariantUUID && item.name === service.name && service.version !== item.version; - }); - - let modalTableOptions: CustomTableOptions = { - data: previousVersionData, - columns: this.basicColumns, - config: { - sortBy: 'version', - sortOrder: 'desc'} - }; - // open modal - this.dialogService.addDialog(PreviousVersionsComponent, { - title: service.name + ' - Previous Version', - tableOptions: modalTableOptions - }) - .subscribe( service => { - if (service) { - this.deploy(service); - } - }); - } - - - public clickAction(row) { - switch (row.actionName) { - case 'loadPreviousData': - this.loadPreviousVersionData(row); - break; - case 'deploy': - this.deploy(row); - break; - } - } - - ngOnInit() { - console.log('Browse SDC Service Models'); - this.initTableOptions(); - this.initData(); - } -} diff --git a/vid-webpack-master/src/app/browseSdc/browseSdc.module.ts b/vid-webpack-master/src/app/browseSdc/browseSdc.module.ts deleted file mode 100644 index b7dd78e54..000000000 --- a/vid-webpack-master/src/app/browseSdc/browseSdc.module.ts +++ /dev/null @@ -1,35 +0,0 @@ - -import { NgModule } from '@angular/core'; -import {BrowseSdcComponent} from './browseSdc.component'; -import {VidTableComponent} from './vid-table/vid-table.component'; -import {SdcService} from '../services/sdc.service'; -import {CommonModule} from '@angular/common'; -import {FormsModule, ReactiveFormsModule} from '@angular/forms'; -import {DataTableModule} from 'angular2-datatable'; -import {BootstrapModalModule} from 'ng2-bootstrap-modal'; -import {PreviousVersionsComponent} from './previous-versions/previous-versions.component'; -import {ServicePopupComponent} from '../components/service-popup/service-popup.component'; -import {ServiceInstanceDetailsComponent} from "../components/service-popup/service-instance-details/service-instance-details.component"; -import {TooltipModule} from 'ngx-tooltip'; -import {InputsModule} from "../modules/inputs.module"; -import {VnfPopupComponent} from "../components/vnf-popup/vnf-popup.components"; -import {VnfInstanceDetailsComponent} from "../components/vnf-popup/vnf-instance-details/vnf-instance-details.component"; -import { VnfInstanceDetailsService } from '../components/vnf-popup/vnf-instance-details/vnf-instance-details.service'; -import { SharedModule } from '../shared/shared.module'; -import { ServiceInstanceDetailsService } from '../components/service-popup/service-instance-details/service-instance-details.service'; -import { ServicePopupService } from '../components/service-popup/service-popup.service'; -import { DataFilterPipe } from '../shared/pipes/data-filter.pipe'; - - -@NgModule({ - imports: [CommonModule, FormsModule, ReactiveFormsModule, BootstrapModalModule, DataTableModule, TooltipModule, InputsModule, SharedModule.forRoot()], - providers: [SdcService, VnfInstanceDetailsService, ServiceInstanceDetailsService, ServicePopupService], - declarations: [BrowseSdcComponent, VidTableComponent, DataFilterPipe, PreviousVersionsComponent, - ServicePopupComponent, ServiceInstanceDetailsComponent, VnfPopupComponent, VnfInstanceDetailsComponent - ], - entryComponents: [BrowseSdcComponent, PreviousVersionsComponent, ServicePopupComponent, VnfPopupComponent], - exports: [ ] - -}) - -export class BrowseSdcModule { } diff --git a/vid-webpack-master/src/app/browseSdc/previous-versions/previous-versions.component.ts b/vid-webpack-master/src/app/browseSdc/previous-versions/previous-versions.component.ts deleted file mode 100644 index 8faf04d6c..000000000 --- a/vid-webpack-master/src/app/browseSdc/previous-versions/previous-versions.component.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { Component } from '@angular/core'; -import { DialogComponent, DialogService } from 'ng2-bootstrap-modal'; -import { CustomTableOptions } from '../vid-table/vid-table.component'; - -export interface PreviousVersionsModel { - - title: string; - tableOptions: CustomTableOptions; -} - -@Component({ - selector: 'previous-versions', - templateUrl: 'previous-versions.html', - styleUrls: ['previous-versions.css'] -}) -export class PreviousVersionsComponent extends DialogComponent<PreviousVersionsModel, boolean> implements PreviousVersionsModel { - - title: string; - tableOptions: CustomTableOptions; - - constructor(dialogService: DialogService) { - super(dialogService); - } - - public deploy(row) { - this.result = row; - this.close(); - } -} diff --git a/vid-webpack-master/src/app/browseSdc/previous-versions/previous-versions.css b/vid-webpack-master/src/app/browseSdc/previous-versions/previous-versions.css deleted file mode 100644 index 92bcbd100..000000000 --- a/vid-webpack-master/src/app/browseSdc/previous-versions/previous-versions.css +++ /dev/null @@ -1,4 +0,0 @@ -.modal-dialog { - width: 1145px; - font-size: 11px; -} diff --git a/vid-webpack-master/src/app/browseSdc/previous-versions/previous-versions.html b/vid-webpack-master/src/app/browseSdc/previous-versions/previous-versions.html deleted file mode 100644 index 68209b8e8..000000000 --- a/vid-webpack-master/src/app/browseSdc/previous-versions/previous-versions.html +++ /dev/null @@ -1,18 +0,0 @@ -<div class="modal-dialog"> - <div class="modal-content"> - <div class="modal-header"> - <button type="button" class="close" (click)="close()" >×</button> - <h4 class="modal-title">{{title}}</h4> - </div> - <div class="modal-body"> - <vid-table - [options]="tableOptions" - (clickEvent)="deploy($event)"> - Loading table... - </vid-table> - </div> - <div class="modal-footer"> - <button type="button" class="btn btn-default" (click)="close()" >Cancel</button> - </div> - </div> -</div> diff --git a/vid-webpack-master/src/app/browseSdc/vid-table/vid-table.component.html b/vid-webpack-master/src/app/browseSdc/vid-table/vid-table.component.html deleted file mode 100644 index 5650e5d35..000000000 --- a/vid-webpack-master/src/app/browseSdc/vid-table/vid-table.component.html +++ /dev/null @@ -1,26 +0,0 @@ -<table class="table table-hover table-striped table-sortable" [mfData]="options.data | dataFilter : filterQuery" #mf="mfDataTable" [(mfSortBy)]="options.config.sortBy" [(mfSortOrder)]="options.config.sortOrder" [mfRowsOnPage]="10"> - <thead> - <tr> - <th *ngFor="let column of options.columns"> - <mfDefaultSorter by="{{column.key}}"> {{column.displayName}}</mfDefaultSorter> - </th> - </tr> - </thead> - <tbody> - <tr *ngFor="let row of mf.data"> - <td *ngFor="let column of options.columns" > - <button class="btn btn-primary" *ngIf="column.type==='button' && (!column.showCondition || row[column.showCondition])" title="{{column.text}}" (click)="clickBtn(row, column.action)"> - {{column.text}} - </button> - {{row[column.key]}} - </td> - </tr> - </tbody> - <tfoot> - <tr> - <td colspan="5"> - <mfBootstrapPaginator [rowsOnPageSet]="[10,15,20]"></mfBootstrapPaginator> - </td> - </tr> - </tfoot> -</table> diff --git a/vid-webpack-master/src/app/browseSdc/vid-table/vid-table.component.scss b/vid-webpack-master/src/app/browseSdc/vid-table/vid-table.component.scss deleted file mode 100644 index f34887987..000000000 --- a/vid-webpack-master/src/app/browseSdc/vid-table/vid-table.component.scss +++ /dev/null @@ -1,40 +0,0 @@ -table > thead > tr > th { - cursor: pointer; - position: relative; - background-image: none; - color: #fff; - background-color: #666; - a{ - color: #fff; - } -} - -.table-sortable > thead > tr > th:after, -.table-sortable > thead > tr > th.sort-false:after, -.table-sortable > thead > tr > th.sort-true:after { - font-family: FontAwesome; - padding-left: 5px; -} - -.table-sortable > thead > tr > th:after { - content: "\f0dc"; - color: #ddd; -} -.table-sortable > thead > tr > th.sort-false:after { - content: "\f0de"; - color: #767676; -} -.table-sortable > thead > tr > th.sort-true:after { - content: "\f0dd"; - color: #767676; -} -//.table-sortable > tbody > td > -.table-sortable { - tbody{ - td{ - .btn-primary{ - min-width: 100px; - } - } - } -} diff --git a/vid-webpack-master/src/app/browseSdc/vid-table/vid-table.component.ts b/vid-webpack-master/src/app/browseSdc/vid-table/vid-table.component.ts deleted file mode 100644 index aa2030908..000000000 --- a/vid-webpack-master/src/app/browseSdc/vid-table/vid-table.component.ts +++ /dev/null @@ -1,59 +0,0 @@ -/** - * Created by cp2122 on 1/2/2018. - */ -import { Component, Input, EventEmitter, Output } from '@angular/core'; -export class CustomTableColumnDefinition { - public displayName = ''; - public key = ''; - public type? = 'text'; - public text? = ''; // for button - public action? = ''; // for button - callback - public showCondition? = ''; // for button - // public binding = ''; - public filter? = ''; - // public computedClass: any; - // public isComputed = false; - // public isAnchor = false; - // public srefBinding = ''; -} - -export class CustomTableConfig { - public sortBy = ''; - public sortOrder = 'desc'; - public pageSize? = 10; - public pageNumber? = 1; - public totalCount? = 0; - public totalPages? = 0; - public maxSize? = 10; - public showSelectCheckbox? = false; - public showSelectAll? = true; - public showSort? = true; - public clientSort? = true; - public clientPaging? = true; - public stickyHeader? = true; - public stickyHeaderOffset? = 0; - public stickyContainer? = ''; -} - -export class CustomTableOptions { - public data: any[]; - public columns: Array<CustomTableColumnDefinition>; - public config: CustomTableConfig; - // public callbacks: any; -} -@Component({ - selector: 'vid-table', - styleUrls: ['./vid-table.component.scss'], - templateUrl: './vid-table.component.html' -}) - -export class VidTableComponent { - @Input() options: CustomTableOptions; - @Input() filterQuery = ''; - - @Output() clickEvent = new EventEmitter<any>(); - clickBtn(row, actionName) { - row.actionName = actionName; - this.clickEvent.emit(row); - } -} diff --git a/vid-webpack-master/src/app/components/instance-popup/instance-popup.components.ts b/vid-webpack-master/src/app/components/instance-popup/instance-popup.components.ts deleted file mode 100644 index b8ce613d4..000000000 --- a/vid-webpack-master/src/app/components/instance-popup/instance-popup.components.ts +++ /dev/null @@ -1,9 +0,0 @@ -import {ModelInformationItem} from "../../shared/components/model-information/model-information.component"; - - -export interface InstancePopup { - onCancelClick():void; - createModelInformationItems(): Array<ModelInformationItem>; - getModelName():string; -} - diff --git a/vid-webpack-master/src/app/components/service-popup/service-instance-details/service-instance-details.component.ts b/vid-webpack-master/src/app/components/service-popup/service-instance-details/service-instance-details.component.ts deleted file mode 100644 index b6a2e3967..000000000 --- a/vid-webpack-master/src/app/components/service-popup/service-instance-details/service-instance-details.component.ts +++ /dev/null @@ -1,238 +0,0 @@ -import {Component, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChanges, ViewChild} from '@angular/core'; -import {FormControl, FormGroup, Validators} from "@angular/forms"; -import {ServicePopupDataModel} from './servicePopupDataModel'; -import {AaiService} from '../../../services/aaiService/aai.service'; -import {updateServiceInstance} from "../../../service.actions"; -import * as _ from 'lodash'; -import {ServiceModel} from "../../../shared/models/serviceModel"; -import {ModelInfo} from "../../../shared/models/modelInfo"; -import {loadProductFamiliesAction} from "../../../services/aaiService/aai.actions"; -import {Observable} from "rxjs/Observable"; -import {SelectOptionInterface} from "../../../shared/models/selectOption"; -import {NgRedux, select} from "@angular-redux/store"; -import {AppState} from "../../../store/reducers"; -import {isNullOrUndefined} from 'util'; -import {ServiceInstanceDetailsService} from './service-instance-details.service'; -import {NumbersLettersUnderscoreValidator} from '../../../shared/components/validators/numbersLettersUnderscore/numbersLettersUnderscore.validator'; -import {DefaultDataGeneratorService} from '../../../shared/services/defaultDataServiceGenerator/default.data.generator.service'; - - -@Component({ - selector: 'service-instance-details', - templateUrl: 'service-instance-details.html', - styleUrls: ['service-instance-details.scss'], - providers: [AaiService] -}) - -export class ServiceInstanceDetailsComponent implements OnInit, OnChanges { - ngOnChanges(changes: SimpleChanges): void { - if (changes["serviceInstance"] !== undefined && changes["serviceInstance"].currentValue !== changes["serviceInstance"].previousValue && changes["serviceInstance"].currentValue !== null) { - this.oldServiceInstance = Object.assign({}, this.serviceInstance); - } - } - _serviceModel: ServiceModel; - @Input () serviceInstance: any; - @Input () dynamicInputs; - @Input () servicesQty: number; - @Input () - set serviceModel(serviceModel: ServiceModel) { - this._serviceModel = serviceModel; - this.updateFormGroupControlsWithServiceModel(serviceModel); - } - @ViewChild('serviceForm') serviceForm: 'ServiceForm'; - @Output() closePopup : EventEmitter<any> = new EventEmitter<any>(); - @Output() onDataChanged: EventEmitter<any> = new EventEmitter<any>(); - oldServiceInstance = {}; - - //todo: implement Epics and use @select to fetch the rest of the form's data as done with productFamilies. - //that way we can loose the updateFormData function and the subscription to store in the constructor. - @select(['service','productFamilies']) - readonly productFamilies : Observable<SelectOptionInterface[]>; - serviceDetails:any = { - - }; - servicePopupDataModel: ServicePopupDataModel = new ServicePopupDataModel(); - serviceInstanceDetailsFormGroup: FormGroup; - serviceInstanceDetailsService : ServiceInstanceDetailsService; - - constructor(private _aaiService: AaiService, private store: NgRedux<AppState>, private _serviceInstanceDetailsService : ServiceInstanceDetailsService, private _defaultDataGeneratorService : DefaultDataGeneratorService) { - this.store.subscribe(() => {this.updateFormData()}); - this.serviceInstanceDetailsService = this._serviceInstanceDetailsService; - this.serviceInstanceDetailsFormGroup = this.createFormGroup(); - - this.serviceInstanceDetailsFormGroup.valueChanges.subscribe(()=> { - this.onDataChanged.next(); - }) - } - - ngOnInit() { - this.subscribeToFormChanges(); - this._aaiService.getSubscribers().subscribe(); - this._aaiService.getCategoryParameters(null).subscribe(); - this._aaiService.getAicZones().subscribe(); - this.store.dispatch(loadProductFamiliesAction()); - } - - - createFormGroup(): FormGroup { - const formGroup = new FormGroup({ - globalSubscriberId: new FormControl( - Validators.compose([Validators.required]) - ), - productFamilyId: new FormControl(), - subscriptionServiceType: new FormControl({value: null, disabled: true}, Validators.compose([Validators.required])), - lcpCloudRegionId: new FormControl({value: null, disabled: true}, Validators.compose([Validators.required])), - tenantId: new FormControl({value: null, disabled: true}, Validators.compose([Validators.required])), - aicZoneId: new FormControl(), - projectName: new FormControl(), - owningEntityId: new FormControl(Validators.compose([Validators.required])), - rollbackOnFailure: new FormControl(null, Validators.required), - }); - - return formGroup; - } - - updateFormGroupControlsWithServiceModel(serviceModel: ServiceModel) { - this.serviceInstanceDetailsFormGroup.markAsUntouched(); - - if (serviceModel) { - this.serviceDetails.isUserProvidedNaming = serviceModel.isUserProvidedNaming; - if (serviceModel.isUserProvidedNaming) { - this.serviceInstanceDetailsFormGroup.addControl('instanceName', new FormControl('', Validators.compose([Validators.required, NumbersLettersUnderscoreValidator.valid]))) - }else{ - this.serviceInstanceDetailsFormGroup.removeControl('instanceName'); - } - - if (serviceModel.isMultiStepDesign) { - this.serviceInstanceDetailsFormGroup.addControl('pause', new FormControl(true)); - }else{ - this.serviceInstanceDetailsFormGroup.removeControl('pause'); - } - } - } - - updateFormData() { - let service = this.store.getState().service; - this.servicePopupDataModel.subscribers = service.subscribers; - this.servicePopupDataModel.serviceTypes = service.serviceTypes[this.servicePopupDataModel.globalCustomerId]; - this.servicePopupDataModel.lcpRegions = service.lcpRegionsAndTenants.lcpRegionList; - if (this.serviceInstance) { - this.servicePopupDataModel.tenants = service.lcpRegionsAndTenants.lcpRegionsTenantsMap[this.serviceInstance.lcpCloudRegionId]; - } - this.servicePopupDataModel.aicZones = service.aicZones; - this.servicePopupDataModel.owningEntities = _.get(service.categoryParameters, 'owningEntityList'); - this.servicePopupDataModel.projects = _.get(service.categoryParameters, 'projectList'); - this.onDataChanged.next(); - } - - subscribeToFormChanges(): void { - this.serviceInstanceDetailsFormGroup.get('globalSubscriberId').valueChanges.subscribe(val => { - this.updateServiceTypes(val); - this.setDisabledState(val, 'subscriptionServiceType'); - - }); - this.serviceInstanceDetailsFormGroup.get('subscriptionServiceType').valueChanges.subscribe(val => { - this.getTenants(val); - this.setDisabledState(val, 'lcpCloudRegionId'); - - }); - this.serviceInstanceDetailsFormGroup.get('lcpCloudRegionId').valueChanges.subscribe(val => { - this.setDisabledState(val, 'tenantId'); - this.updateTenantList(val); - - }); - - this.serviceInstanceDetailsFormGroup.get('tenantId').valueChanges.subscribe(val => { - this.serviceDetails.tenantName = this.getNameFromListById(this.servicePopupDataModel.tenants, val); - this.onDataChanged.next(); - }); - - this.serviceInstanceDetailsFormGroup.get('aicZoneId').valueChanges.subscribe(val => { - this.serviceDetails.aicZoneName = this.getNameFromListById(this.servicePopupDataModel.aicZones, val); - this.onDataChanged.next(); - }); - } - - getNameFromListById(list, id:string ) { - if(list && id) { - let filterItem = list.filter(item => { - return item.id == id; - }) - return filterItem && filterItem[0].name; - } - return null; - } - - setDisabledState(val, field: string): void { - if(val) { - this.serviceInstanceDetailsFormGroup.controls[field].enable(); - } else { - this.serviceInstanceDetailsFormGroup.controls[field].disable(); - } - } - - isShowingNotificationArea(): boolean { - return this.servicesQty > 1; - } - - updateServiceTypes(subscriberId) { - if (subscriberId) { - this.servicePopupDataModel.globalCustomerId = subscriberId; - this._aaiService.getServiceTypes(subscriberId).subscribe(() => { - this.updateFormData(); - this.onDataChanged.next(); - }, (error) => { - - }); - } - } - - updateTenantList(cloudRegionId) { - this.servicePopupDataModel.tenants = this.store.getState().service.lcpRegionsAndTenants.lcpRegionsTenantsMap[cloudRegionId]; - this.onDataChanged.next(); - } - - getTenants(serviceType) { - if (serviceType) { - this._aaiService.getLcpRegionsAndTenants(this.servicePopupDataModel.globalCustomerId, serviceType).subscribe(()=>{ - this.onDataChanged.next(); - }); - } - } - - onSubmit(formValues): void { - formValues.bulkSize = this.servicesQty; - let dynamicFields: { [dynamicField: string] : string; }; - dynamicFields = {}; - this.dynamicInputs.map(function (x) { - let dynamicField: string = x.id; - dynamicFields[dynamicField] = formValues[dynamicField]; - delete formValues[dynamicField]; - }); - formValues.instanceParams = []; - formValues.instanceParams.push(dynamicFields); - formValues.modelInfo = new ModelInfo(this._serviceModel); - Object.assign(formValues, this.serviceDetails); - this.store.dispatch(updateServiceInstance(formValues, this._serviceModel.uuid)); - if (this.store.getState().global.flags['FLAG_SETTING_DEFAULTS_IN_DRAWING_BOARD']){ - this._defaultDataGeneratorService.updateReduxOnFirstSet(this._serviceModel.uuid,formValues); - } - window.parent.postMessage( { - eventId: 'submitIframe', - data: { - serviceModelId: this._serviceModel.uuid - } - }, "*"); - this.closePopup.emit(this._serviceModel.uuid); - } - - hasApiError(controlName : string, data : Array<any>){ - if(!isNullOrUndefined(this.servicePopupDataModel) && !isNullOrUndefined(data)){ - if(!this.serviceInstanceDetailsFormGroup.controls[controlName].disabled && data.length === 0){ - return true; - } - } - return false; - } - -} diff --git a/vid-webpack-master/src/app/components/service-popup/service-instance-details/service-instance-details.html b/vid-webpack-master/src/app/components/service-popup/service-instance-details/service-instance-details.html deleted file mode 100644 index 3d632bd89..000000000 --- a/vid-webpack-master/src/app/components/service-popup/service-instance-details/service-instance-details.html +++ /dev/null @@ -1,168 +0,0 @@ - -<div id="service-instance-details"> - <form id="serviceForm" #serviceForm="ngForm" (ngSubmit)="onSubmit(serviceForm.value)" [formGroup]="serviceInstanceDetailsFormGroup"> - <!--We can't use [hidden] since bootstrap.css label has display: inline-block. --> - <!--see https://stackoverflow.com/questions/34650410/angular-2-hidden-does-not-seem-to-be-working--> - <label id="notification-area" *ngIf="isShowingNotificationArea()">Data entered will apply to all service instances</label> - - <div class="details-item" *ngIf="serviceInstanceDetailsFormGroup.get('instanceName')"> - <label class="required">Instance name:</label> - <input patternInput - pattern="^[a-zA-Z0-9_]*$" - [attr.data-tests-id]="'instanceName'" - id="instance-name" - name="instance-name" - [ngClass]="{'error-style' :(serviceInstance?.instanceName != '' && serviceInstanceDetailsFormGroup.controls['instanceName']?.touched && serviceInstanceDetailsFormGroup.controls['instanceName']?.errors?.pattern !== null)}" - [formControlName]="'instanceName'" - class="form-control input-text" - placeholder="Type Instance Name" - type="text" - [(ngModel)]="serviceInstance.instanceName" required> - <form-control-error - *ngIf="serviceInstance?.instanceName != '' && serviceInstanceDetailsFormGroup.controls['instanceName']?.touched && serviceInstanceDetailsFormGroup.controls['instanceName']?.errors?.pattern !== null" - [message]="'Instance name may include only alphanumeric characters and underscore.'"></form-control-error> - - </div> - - <div class="details-item"> - <label class="required">Subscriber name:</label> - <select class="subscriber form-control input-text" id="subscriber-name-select" data-tests-id="subscriberName" - name="subscriber-name-select" [formControlName]="'globalSubscriberId'" - [ngClass]="{'error-style' :serviceInstanceDetailsService.hasApiError('globalSubscriberId',servicePopupDataModel?.subscribers, serviceInstanceDetailsFormGroup)}" - [(ngModel)]="serviceInstance.globalSubscriberId" - required> - <option [value]="undefined" disabled>Select Subscriber Name</option> - <option class="subscriberNameOption" *ngFor="let subscriber of servicePopupDataModel.subscribers" - [value]="subscriber.id" [disabled]="!subscriber.isPermitted">{{subscriber.name}}</option> - </select> - <form-control-error *ngIf="serviceInstanceDetailsService.hasApiError('globalSubscriberId',servicePopupDataModel?.subscribers, serviceInstanceDetailsFormGroup)" [message]="'No results for this request. Please change criteria.'"></form-control-error> - - </div> - - <div class="details-item"> - <label class="required">Service type:</label> - <select class="form-control input-text" - [(ngModel)]="serviceInstance.subscriptionServiceType" - [formControlName]="'subscriptionServiceType'" - [ngClass]="{'error-style' :serviceInstanceDetailsService.hasApiError('subscriptionServiceType',servicePopupDataModel?.serviceTypes, serviceInstanceDetailsFormGroup)}" - data-tests-id="serviceType" id="service-type-select" - name="service-type" required> - <option [value]="undefined" disabled>Select Service Type</option> - <option *ngFor="let serviceType of servicePopupDataModel.serviceTypes" class="serviceTypeOption" [value]="serviceType.name" [disabled]="!serviceType.isPermitted">{{serviceType.name}}</option> - </select> - <form-control-error *ngIf="serviceInstanceDetailsService.hasApiError('subscriptionServiceType',servicePopupDataModel?.serviceTypes, serviceInstanceDetailsFormGroup)" [message]="'No results for this request. Please change criteria.'"></form-control-error> - </div> - - <div class="details-item"> - <label class="required">Product family:</label> - <select class="form-control input-text" - data-tests-id="productFamily" - id="product-family-select" - [ngClass]="{'error-style' :serviceInstanceDetailsService.hasApiError('productFamilyId',productFamilies, serviceInstanceDetailsFormGroup)}" - [formControlName]="'productFamilyId'" - [(ngModel)]="serviceInstance.productFamilyId" - name="product-family-select" required> - <option [value]="undefined" disabled>Select Product Family</option> - <option *ngFor="let productFamily of productFamilies | async" [value]="productFamily.id" - [disabled]="!productFamily.isPermitted">{{productFamily.name}}</option> - </select> - <form-control-error *ngIf="serviceInstanceDetailsService.hasApiError('productFamilyId',productFamilies, serviceInstanceDetailsFormGroup)" [message]="'No results for this request. Please change criteria.'"></form-control-error> - </div> - - <div class="details-item"> - <label class="required">LCP region:</label> - <select - class="form-control input-text" - [formControlName]="'lcpCloudRegionId'" - [(ngModel)]="serviceInstance.lcpCloudRegionId" - [ngClass]="{'error-style ' : serviceInstanceDetailsService.hasApiError('lcpCloudRegionId', servicePopupDataModel?.lcpRegions, serviceInstanceDetailsFormGroup)}" - name="lcpRegion" - id="lcpRegion-select" - data-tests-id="lcpRegion" - required> - <option [value]="undefined" disabled>Select LCP Region</option> - <option *ngFor="let lcpRegion of servicePopupDataModel.lcpRegions" [value]="lcpRegion.id" [disabled]="!lcpRegion.isPermitted" class="lcpRegionOption">{{lcpRegion.id}}</option> - </select> - <form-control-error *ngIf="serviceInstanceDetailsService.hasApiError('lcpCloudRegionId', servicePopupDataModel?.lcpRegions, serviceInstanceDetailsFormGroup)" [message]="'No results for this request. Please change criteria.'"></form-control-error> - </div> - - <div class="details-item"> - <label class="required">Tenant:</label> - <select class="form-control input-text" - [formControlName]="'tenantId'" - [(ngModel)]="serviceInstance.tenantId" - name="tenant" id="tenant-select" - [ngClass]="{'error-style ' : serviceInstanceDetailsService.hasApiError('tenantId',servicePopupDataModel?.tenants ,serviceInstanceDetailsFormGroup)}" - data-tests-id="tenant" required> - <option [value]="undefined" disabled>Select Tenant</option> - <option *ngFor="let tenant of servicePopupDataModel.tenants" [value]="tenant.id" [disabled]="!tenant.isPermitted">{{tenant.name}}</option> - </select> - <form-control-error *ngIf="serviceInstanceDetailsService.hasApiError('tenantId',servicePopupDataModel?.tenants ,serviceInstanceDetailsFormGroup)" [message]="'No results for this request. Please change criteria.'"></form-control-error> - </div> - - <div class="details-item"> - <label>AIC Zone:</label> - <select - class="form-control input-text" - name="aicZone" id="aicZone-select" - data-tests-id="aic_zone" - [formControlName]="'aicZoneId'" - [ngClass]="{'error-style ' : servicePopupDataModel?.aicZones?.length == 0 && serviceInstanceDetailsFormGroup.controls['aicZoneId'].disabled == false}" - [(ngModel)]="serviceInstance.aicZoneId" > - <option [value]="undefined" disabled>Select AIC Zone</option> - <option class="aicZoneOption" *ngFor="let aicZone of servicePopupDataModel.aicZones" [value]="aicZone.id">{{aicZone.name}}</option> - </select> - <form-control-error *ngIf="serviceInstanceDetailsService.hasApiError('aicZoneId',servicePopupDataModel?.aicZones ,serviceInstanceDetailsFormGroup)" [message]="'No results for this request. Please change criteria.'"></form-control-error> - - </div> - - <div class="details-item"> - <label>Project:</label> - <select - [attr.data-tests-id]="'project'" - class="form-control input-text" - [ngClass]="{'error-style ' : servicePopupDataModel?.projects?.length == 0 && serviceInstanceDetailsFormGroup.controls['projectName'].disabled == false}" - name="project" id="project" - [formControlName]="'projectName'" - [(ngModel)]="serviceInstance.projectName" > - <option [value]="undefined" disabled>Select Project</option> - <option *ngFor="let project of servicePopupDataModel.projects" [value]="project.id">{{project.name}}</option> - </select> - <form-control-error *ngIf="serviceInstanceDetailsService.hasApiError('projectName',servicePopupDataModel?.projects ,serviceInstanceDetailsFormGroup)" [message]="'No results for this request. Please change criteria.'"></form-control-error> - - </div> - - <div class="details-item"> - <label class="required">Owning entity:</label> - <select [attr.data-tests-id]="'owningEntity'" - class="form-control input-text" - [formControlName]="'owningEntityId'" - [(ngModel)]="serviceInstance.owningEntityId" - name="owningEntity" id="owningEntity" - [ngClass]="{'error-style ' : servicePopupDataModel?.owningEntities?.length == 0 && serviceInstanceDetailsFormGroup.controls['owningEntityId'].disabled == false}" - required> - <option [value]="undefined" disabled>Select Owning Entity</option> - <option *ngFor="let owningEntity of servicePopupDataModel.owningEntities" [value]="owningEntity.id">{{owningEntity.name}}</option> - </select> - <form-control-error *ngIf="serviceInstanceDetailsService.hasApiError('owningEntityId',servicePopupDataModel?.owningEntities ,serviceInstanceDetailsFormGroup)" [message]="'No results for this request. Please change criteria.'"></form-control-error> - </div> - <div class="details-item"> - <label class="required">Rollback On Failure:</label> - <select [attr.data-tests-id]="'rollback'" - [ngClass]="{'error-style' :serviceInstanceDetailsService.hasApiError('rollbackOnFailure',servicePopupDataModel?.rollbackOnFailure, serviceInstanceDetailsFormGroup)}" - class="form-control input-text" - [(ngModel)]="serviceInstance.rollbackOnFailure" - [formControlName]="'rollbackOnFailure'" name="rollbackOnFailure" id="rollbackOnFailure"> - <option *ngFor="let option of servicePopupDataModel.rollbackOnFailure" [value]="option.id">{{option.name}}</option> - </select> - <form-control-error *ngIf="serviceInstanceDetailsService.hasApiError('rollbackOnFailure',servicePopupDataModel?.rollbackOnFailure, serviceInstanceDetailsFormGroup)" [message]="'No results for this request. Please change criteria.'"></form-control-error> - </div> - <div class="details-item" *ngIf="serviceInstanceDetailsFormGroup.get('pause')"> - <input #pause id="pause" [formControlName]="'pause'" [(ngModel)]="serviceInstance.pause" type="checkbox" name="pause" data-toggle="toggle"> - <label class="checkbox-label" for="pause">Pause on pause points:</label> - </div> - - - <dynamic-inputs *ngIf="dynamicInputs != undefined && dynamicInputs.length>0" [group]="serviceInstanceDetailsFormGroup" [list]="dynamicInputs"></dynamic-inputs> - </form> -</div> diff --git a/vid-webpack-master/src/app/components/service-popup/service-instance-details/service-instance-details.service.spec.ts b/vid-webpack-master/src/app/components/service-popup/service-instance-details/service-instance-details.service.spec.ts deleted file mode 100644 index 605653bd0..000000000 --- a/vid-webpack-master/src/app/components/service-popup/service-instance-details/service-instance-details.service.spec.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { getTestBed, TestBed } from '@angular/core/testing'; -import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing'; -import { ServiceInstanceDetailsService } from './service-instance-details.service'; -import { NgRedux } from '@angular-redux/store'; - -export class MockAppStore<T> {} - -describe('Service instance details service', () => { - let injector; - let service: ServiceInstanceDetailsService; - let httpMock: HttpTestingController; - - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [HttpClientTestingModule], - providers: [ServiceInstanceDetailsService, - {provide: NgRedux, useClass: MockAppStore}] - }); - - injector = getTestBed(); - service = injector.get(ServiceInstanceDetailsService); - httpMock = injector.get(HttpTestingController); - }); -}); - - diff --git a/vid-webpack-master/src/app/components/service-popup/service-instance-details/service-instance-details.service.ts b/vid-webpack-master/src/app/components/service-popup/service-instance-details/service-instance-details.service.ts deleted file mode 100644 index 99b390d2f..000000000 --- a/vid-webpack-master/src/app/components/service-popup/service-instance-details/service-instance-details.service.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { Injectable } from '@angular/core'; -import { isNullOrUndefined } from 'util'; -import { FormGroup } from '@angular/forms'; -import * as _ from 'lodash'; -import { createVFModuleInstance, updateVFModuleInstance, updateVNFInstance } from '../../../service.actions'; -import { NgRedux } from '@angular-redux/store'; -import { AppState } from '../../../store/reducers'; - -@Injectable() -export class ServiceInstanceDetailsService { - static controlsFieldsStatus = {}; - - constructor(private store: NgRedux<AppState>) { } - hasApiError(controlName: string, data: Array<any>, serviceInstanceDetailsFormGroup: FormGroup) { - if (!isNullOrUndefined(data)) { - if (!serviceInstanceDetailsFormGroup.controls[controlName].disabled && data.length === 0) { - return true; - } - } - return false; - } -} diff --git a/vid-webpack-master/src/app/components/service-popup/service-instance-details/servicePopupDataModel.ts b/vid-webpack-master/src/app/components/service-popup/service-instance-details/servicePopupDataModel.ts deleted file mode 100644 index c7894e2cd..000000000 --- a/vid-webpack-master/src/app/components/service-popup/service-instance-details/servicePopupDataModel.ts +++ /dev/null @@ -1,32 +0,0 @@ -import {SelectOption, SelectOptionInterface} from "../../../shared/models/selectOption"; - -export class ServicePopupDataModel { - subscribers: SelectOptionInterface[]; - serviceTypes: SelectOptionInterface[]; - aicZones: SelectOptionInterface[]; - lcpRegions: SelectOptionInterface[]; - productFamilies: SelectOptionInterface[]; - lcpRegionsTenantsMap: object; - tenants: SelectOptionInterface[]; - projects: SelectOptionInterface[]; - owningEntities: SelectOptionInterface[]; - globalCustomerId: string; - rollbackOnFailure: SelectOptionInterface[]; - - - constructor(){ - this.subscribers = null; - this.serviceTypes = null; - this.aicZones = null; - this.lcpRegions = null; - this.lcpRegionsTenantsMap = {}; - this.tenants = null; - this.productFamilies = null; - this.projects = null; - this.owningEntities = null; - this.rollbackOnFailure = [ - new SelectOption({id: 'true', name: 'Rollback'}), - new SelectOption({id: 'false', name: 'Don\'t Rollback'}) - ]; - } -} diff --git a/vid-webpack-master/src/app/components/service-popup/service-popup.component.ts b/vid-webpack-master/src/app/components/service-popup/service-popup.component.ts deleted file mode 100644 index 908ae4adf..000000000 --- a/vid-webpack-master/src/app/components/service-popup/service-popup.component.ts +++ /dev/null @@ -1,144 +0,0 @@ -import {Component, ViewChild} from '@angular/core'; -import {DialogComponent, DialogService} from 'ng2-bootstrap-modal'; -import {ServiceModel} from '../../shared/models/serviceModel'; -import {Constants} from '../../shared/utils/constants'; -import {ServiceInstanceDetailsComponent} from './service-instance-details/service-instance-details.component'; -import {ActivatedRoute} from "@angular/router"; -import {AaiService} from "../../services/aaiService/aai.service"; -import {Utils} from "../../utils/utils"; -import {ServicePlanningService} from "../../services/service-planning.service"; -import * as _ from 'lodash'; -import {ModelInformationItem} from '../../shared/components/model-information/model-information.component'; -import {deleteServiceInstance} from '../../service.actions'; - -import {InstancePopup} from "../instance-popup/instance-popup.components"; -import {NgRedux} from "@angular-redux/store"; -import {AppState} from "../../store/reducers"; -import {ServicePopupService} from './service-popup.service'; -import {IframeService} from "../../shared/utils/iframe.service"; - -export interface ServicePopupModel { - serviceModel: ServiceModel -} - -@Component({ - selector: 'service-popup', - templateUrl: 'service-popup.html', - styleUrls: ['service-popup.scss'], - providers: [AaiService, ServicePopupService] -}) - -export class ServicePopupComponent extends DialogComponent<ServicePopupModel, boolean> - implements ServicePopupModel, InstancePopup{ - @ViewChild(ServiceInstanceDetailsComponent) serviceInstanceDetails: ServiceInstanceDetailsComponent; - - serviceModel: ServiceModel; - serviceModelId: string; - serviceInstance: any = { - 'rollbackOnFailure' : 'false' - }; - title: string = Constants.ServicePopup.TITLE; - dynamicInputs: any[] = null; - - maxServiceQty:number = 50; - minServiceQty:number = 1; - servicesQty = 1; //default - quantityOptions = this.getQuantityOptions(); - - modelInformationItems: Array<ModelInformationItem> = []; - hasGeneralApiError : boolean = false; - parentElementClassName = 'content'; - - constructor(dialogService: DialogService, private route: ActivatedRoute, private _aaiService: AaiService, - private _iframeService : IframeService, - private _servicePlanningService: ServicePlanningService, private store: NgRedux<AppState>, private _servicePopupService : ServicePopupService) { - super(dialogService); - this.title = Constants.ServicePopup.TITLE; - } - - updateGeneralErrorSection() : void { - this.hasGeneralApiError = this._servicePopupService.onControlError(this.serviceInstanceDetails, this.serviceInstanceDetails.serviceInstanceDetailsFormGroup); - } - - - ngOnInit() { - this.route - .queryParams - .subscribe(params => { - this.serviceModelId = params['serviceModelId']; - if(params['isCreate']=="true") { - this.store.dispatch(deleteServiceInstance(this.serviceModelId)); - } - this.updateServiceModelById(this.serviceModelId); - this.updateInstanceFromStore(); - }); - } - - updateInstanceFromStore() { - let serviceInstance; - if (_.has(this.store.getState().service.serviceInstance, this.serviceModelId)) { - serviceInstance = Object.assign({}, this.store.getState().service.serviceInstance[this.serviceModelId]); - } - - this.serviceInstance = serviceInstance ? serviceInstance : this.serviceInstance; - this.servicesQty = serviceInstance ? serviceInstance.bulkSize : 1; - if (serviceInstance && serviceInstance.instanceParams && serviceInstance.instanceParams[0]) { - this.dynamicInputs = this.dynamicInputs.map(function (x) { - x.value = (serviceInstance.instanceParams[0][x.id]) ? serviceInstance.instanceParams[0][x.id] : x.value; - return x; - }); - } - } - - updateServiceModelById(serviceModelId) { - this._aaiService.getServiceModelById(serviceModelId).subscribe( - value => { - const convertedModel = Utils.convertModel(value); - this.serviceModel = new ServiceModel(convertedModel); - let displayInputs = Object.assign({},convertedModel.service.inputs); - this.dynamicInputs = _.isEmpty(displayInputs)? [] : this._servicePlanningService.getArbitraryInputs(displayInputs); - this.modelInformationItems = this.createModelInformationItems(); - }, - error => {console.log('error is ', error)}, - () => {console.log('completed')} - ); - } - - createModelInformationItems() : Array<ModelInformationItem> { - return [ - new ModelInformationItem("Model version", "modelVersion", [this.serviceModel.version], "", true), - new ModelInformationItem("Description", "description", [this.serviceModel.description]), - new ModelInformationItem("Category", "category", [this.serviceModel.category]), - new ModelInformationItem("UUID", "uuid", [this.serviceModel.uuid], Constants.ServicePopup.TOOLTIP_UUID, true), - new ModelInformationItem("Invariant UUID", "invariantUuid", [this.serviceModel.invariantUuid], Constants.ServicePopup.TOOLTIP_INVARIANT_UUID, true), - new ModelInformationItem("Service type", "serviceType", [this.serviceModel.serviceType]), - new ModelInformationItem("Service role", "serviceRole", [this.serviceModel.serviceRole]) - ]; - } - - onCancelClick() { - this._iframeService.removeClassCloseModal(this.parentElementClassName); - this.dialogService.removeDialog(this); - this.serviceInstance = this.serviceInstanceDetails.oldServiceInstance; - - this._servicePopupService.resetDynamicInputs(this.serviceInstanceDetails, this.dynamicInputs); - // Delaying the iframe close in few milliseconds. - // This should workaround a problem in Selenium tests' that - // blocks after click because the iframe goes out before - // the driver understands it was clicked. Similar bug is - // described here: - // - https://github.com/mozilla/geckodriver/issues/611 - // - https://bugzilla.mozilla.org/show_bug.cgi?id=1223277 - setTimeout(() => { - window.parent.postMessage("closeIframe", "*"); - }, 15); - } - - getModelName(): string { - return (this.serviceModel && this.serviceModel.name) || ""; - } - - getQuantityOptions(){ - return _.range(this.minServiceQty, this.maxServiceQty + 1); - } -} diff --git a/vid-webpack-master/src/app/components/service-popup/service-popup.html b/vid-webpack-master/src/app/components/service-popup/service-popup.html deleted file mode 100644 index e967daa3b..000000000 --- a/vid-webpack-master/src/app/components/service-popup/service-popup.html +++ /dev/null @@ -1,52 +0,0 @@ -<div id="service-popup" class="modal-dialog"> - <div class="modal-content"> - <div class="modal-header"> - <button type="button" class="close" (click)="onCancelClick()" >×</button> - <span [attr.data-tests-id]="'create-modal-title'" class="modal-title">{{title}}</span> - </div> - <div class="modal-body popup-content"> - - <div class="header-left"> - <div>SERVICE MODEL: <span>"{{getModelName()}}"</span></div> - </div> - - <div class="header-right"> - Service Instance Details - </div> - - <label class="quantity-label">Qty:</label> - <div class="quantity"> - <select class="quantity-select" [(ngModel)]="servicesQty" name="quantity" id="quantity-select" required> - <option *ngFor="let qty of quantityOptions" [value]="qty">{{qty}}</option> - </select> - </div> - - <div class="service-model"> - - <model-information [modelInformationItems]="modelInformationItems"></model-information> - </div> - - <div class="service-instance"> - <service-instance-details [dynamicInputs]="dynamicInputs" - [serviceInstance]="serviceInstance" - [serviceModel]="serviceModel" - [servicesQty]="servicesQty" - (onDataChanged)="updateGeneralErrorSection()" - (closePopup)="onCancelClick($event)"></service-instance-details> - </div> - - </div> - <div class="modal-footer row" style="padding: 0"> - <div class="col-md-6"> - <div *ngIf="hasGeneralApiError == true"> - <form-general-error [message]="'Page contains errors. Please see details next to the relevant fields.'"></form-general-error> - </div> - </div> - <div class="col-md-6" style="padding: 15px;padding-right: 35px;"> - <button [attr.data-tests-id]="'cancelButton'" type="button" class="btn btn-default cancel" (click)="onCancelClick()"><span>Cancel</span></button> - <input type="submit" value="Set" form="serviceForm" data-tests-id="service-form-set" - class="btn btn-success submit" [disabled]="!serviceInstanceDetails?.serviceForm?.valid"> - </div> - </div> - </div> -</div> diff --git a/vid-webpack-master/src/app/components/service-popup/service-popup.scss b/vid-webpack-master/src/app/components/service-popup/service-popup.scss deleted file mode 100644 index aa4552d2f..000000000 --- a/vid-webpack-master/src/app/components/service-popup/service-popup.scss +++ /dev/null @@ -1,185 +0,0 @@ -$grid-border: 1px #d2d2d2 solid; - -#service-popup { - color: #191919; - - .left-panel { - background: #f2f2f2; - border-right: $grid-border; - } - - .header-common { - height: 100%; - align-items: center; - display: flex; - font-family: OpenSans-Semibold; - font-size: 12px; - } - - .header-text { - padding-left: 30px; - @extend .header-common; - } - - .header-left { - grid-area: header-left; - @extend .header-text; - @extend .left-panel; - border-bottom: $grid-border; - - span { - font-family: OpenSans-Regular; - font-size: 14px; - }; - } - - .header-right { - grid-area: header-right; - - @extend .header-text; - border-bottom: $grid-border; - } - - .quantity-label { - grid-area: quantity-label; - @extend .header-common; - border-bottom: $grid-border; - height: 100%; - font-family: OpenSans-Regular; - } - - .quantity { - grid-area: quantity; - border-left: $grid-border; - border-bottom: $grid-border; - border-top-style: none; - font-family: OpenSans-Semibold; - text-align: start; - text-indent: 10px; - } - - .quantity-select { - width: 78px; - height: 100%; - border: 0; - background: white; - outline: none; - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; - background: url('../../../assets/img/chevron.svg') 0 0 no-repeat; - background-size: 24px; - background-position-x: right; - background-position-y: center; - } - input[type="number"]:hover::-webkit-inner-spin-button { - height: 20px; - } - - .service-model { - grid-area: service-model; - - padding: 30px; - overflow: auto; - @extend .left-panel; - } - - .service-instance { - grid-area: service-instance; - } - - .popup-content { - display: grid; - grid-template-columns: 400px auto 30px 93px; - grid-template-rows: 50px calc(100vh - 180px); - grid-template-areas: - "header-left header-right quantity-label quantity" - "service-model service-instance service-instance service-instance"; - padding: 0; - } -} - -.modal { - background-color: #191919; - opacity: 0.8; -} - -.modal-dialog { - position: relative; - width: auto; - margin: 0; -} -@media (min-width: 1150px) { - .popup-content { - grid-template-rows: 30px 680px; - } -} - -.modal-content { - border-radius: 0; - box-shadow: none; - border: none; -} - -.modal-footer { - .cancel { - width: 120px; - height: 36px; - background: #ffffff; - border: 1px solid #009fdb; - border-radius: 2px; - span { - font-family: OpenSans-Regular; - font-size: 14px; - color: #009fdb; - line-height: 16px; - } - } - - .submit { - width: 120px; - height: 36px; - background: #009fdb; - border-radius: 2px; - border-color: #009fdb; - span { - font-family: OpenSans-Regular; - font-size: 14px; - color: #FFFFFF; - line-height: 16px; - } - } -} - -.modal-header { - background-color: #009fdb; - - padding-bottom: 13px; - padding-top: 13px; - padding-left: 29px; - padding-right: 21px; - - .close { - font-size: 32px; - font-weight: 200; - color: #d8d8d8; - text-shadow: none; - filter: none; - opacity: 1; - } - - .modal-title { - font-family: OpenSans-Regular; - font-size: 24px; - color: #fff; - line-height: 34px; - } -} -// -//@media (min-width: 1200px) { -// .service-model, -// .service-instance { -// width: 1050px; -// margin: 30px auto; -// } -//} diff --git a/vid-webpack-master/src/app/components/service-popup/service-popup.service.spec.ts b/vid-webpack-master/src/app/components/service-popup/service-popup.service.spec.ts deleted file mode 100644 index cddc6400a..000000000 --- a/vid-webpack-master/src/app/components/service-popup/service-popup.service.spec.ts +++ /dev/null @@ -1,138 +0,0 @@ - -import { TestBed, getTestBed} from '@angular/core/testing'; -import { - HttpClientTestingModule, - HttpTestingController -} from '@angular/common/http/testing'; -import { ServicePopupService } from './service-popup.service'; -import { FormControl, FormGroup, Validators } from '@angular/forms'; -import { NumbersLettersUnderscoreValidator } from '../../shared/components/validators/numbersLettersUnderscore/numbersLettersUnderscore.validator'; - -describe('Service Popup Service', () => { - let injector; - let service: ServicePopupService; - let httpMock: HttpTestingController; - let form : FormGroup; - let servicePopupDataModel; - - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [HttpClientTestingModule], - providers: [ServicePopupService] - }); - - injector = getTestBed(); - service = injector.get(ServicePopupService); - httpMock = injector.get(HttpTestingController); - - form = generateFormGroup(); - servicePopupDataModel = generateServicePopupDataModel(); - }); - - describe('#resetDynamicInputs', () => { - it('resetDynamicInputs should reset dymanic fields',(done: DoneFn) => { - const dynamicInputs = generateDynamicInputs(); - let serviceForm = generateFormGroup(); - serviceForm.addControl(dynamicInputs[0].name, new FormControl({value: dynamicInputs[0].value, disabled: false})); - - serviceForm.controls[dynamicInputs[0].name].setValue("diffValue"); - service.resetDynamicInputs({ - serviceInstanceDetailsFormGroup : serviceForm, - dynamicInputs : dynamicInputs - }, dynamicInputs); - - expect(serviceForm.controls[dynamicInputs[0].name].value).toEqual(dynamicInputs[0].value); - done(); - }) - }); - - describe('#onControlError', () => { - - it('should return true if instanceName is illegal', (done: DoneFn) => { - form.controls['instanceName'].setValue("illegal - illegal"); - - let result : boolean = service.onControlError(<any>servicePopupDataModel, form); - expect(result).toBeTruthy(); - done(); - }); - - it('should return false if instanceName is legal', (done: DoneFn) => { - - form.controls['instanceName'].setValue("legal"); - let result = service.onControlError(<any>servicePopupDataModel, form); - expect(result).toBeFalsy(); - done(); - }); - - it('should return false if lcpRegions is empty and is disabled', (done: DoneFn) => { - servicePopupDataModel.servicePopupDataModel['lcpRegions'] = []; - let result = service.onControlError(<any>servicePopupDataModel, form); - expect(result).toBeFalsy(); - done(); - }); - - it('should return true if lcpRegions is empty', (done: DoneFn) => { - servicePopupDataModel.servicePopupDataModel['lcpRegions'] = []; - form.controls['lcpCloudRegionId'].enable(); - let result = service.onControlError(<any>servicePopupDataModel, form); - expect(result).toBeTruthy(); - done() - }); - }); - - - function generateDynamicInputs(){ - return JSON.parse('[{"id":"2017488_adiodvpe0_ASN","type":"string","name":"2017488_adiodvpe0_ASN","value":"AV_vPE","isRequired":true,"description":"AV/PE"}]'); - } - - - function generateServicePopupDataModel() { - return { - "servicePopupDataModel" : JSON.parse('{"subscribers":[{"id":"a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb","name":"Mobility","isPermitted":false},{"id":"a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fc","name":"PACKET CORE","isPermitted":false},{"id":"e433710f-9217-458d-a79d-1c7aff376d89","name":"USP VOICE","isPermitted":true}],"serviceTypes":[{"id":"0","name":"vFlowLogic","isPermitted":false},{"id":"1","name":"VIRTUAL USP","isPermitted":true},{"id":"2","name":"Mobility","isPermitted":false},{"id":"3","name":"vBNG","isPermitted":false},{"id":"4","name":"vVoiceMail","isPermitted":false},{"id":"5","name":"Nimbus","isPermitted":false},{"id":"6","name":"vSEGW","isPermitted":false},{"id":"7","name":"vVM","isPermitted":false},{"id":"8","name":"vOTA","isPermitted":false},{"id":"9","name":"vMME","isPermitted":false},{"id":"10","name":"vMNS","isPermitted":false},{"id":"11","name":"vSCP","isPermitted":false},{"id":"12","name":"VPMS","isPermitted":false},{"id":"13","name":"vMMSC","isPermitted":false},{"id":"14","name":"SSD","isPermitted":false},{"id":"15","name":"vMOG","isPermitted":false},{"id":"16","name":"FIRSTNET","isPermitted":false},{"id":"17","name":"ACTIVE_CHARGE","isPermitted":false},{"id":"18","name":"vHSS","isPermitted":false}],"aicZones":[{"id":"NFT1","name":"NFTJSSSS-NFT1"},{"id":"JAG1","name":"YUDFJULP-JAG1"},{"id":"YYY1","name":"UUUAIAAI-YYY1"},{"id":"BAN1","name":"VSDKYUTP-BAN1"},{"id":"DKJ1","name":"DKJSJDKA-DKJ1"},{"id":"MCS1","name":"ASACMAMS-MCS1"},{"id":"UIO1","name":"uioclli1-UIO1"},{"id":"RAJ1","name":"YGBIJNLQ-RAJ1"},{"id":"OPA1","name":"opaclli1-OPA1"},{"id":"SDE1","name":"ZXCVBNMA-SDE1"},{"id":"VEN2","name":"FGHJUHIL-VEN2"},{"id":"ORL1","name":"ORLDFLMA-ORL1"},{"id":"JAD1","name":"JADECLLI-JAD1"},{"id":"ZXL1","name":"LWLWCANN-ZXL1"},{"id":"CKL1","name":"CLKSKCKK-CKL1"},{"id":"SDF1","name":"sdfclli1-SDF1"},{"id":"RAD1","name":"RADICAL1-RAD1"},{"id":"KIT1","name":"BHYJFGLN-KIT1"},{"id":"REL1","name":"INGERFGT-REL1"},{"id":"JNL1","name":"CJALSDAC-JNL1"},{"id":"OLK1","name":"OLKOLKLS-OLK1"},{"id":"CHI1","name":"CHILLIWE-CHI1"},{"id":"UUU4","name":"UUUAAAUU-UUU4"},{"id":"TUF1","name":"TUFCLLI1-TUF1"},{"id":"KJN1","name":"CKALDKSA-KJN1"},{"id":"SAM1","name":"SNDGCA64-SAN1"},{"id":"SCK1","name":"SCKSCKSK-SCK1"},{"id":"HJH1","name":"AOEEQQQD-HJH1"},{"id":"HGD1","name":"SDFQWHGD-HGD1"},{"id":"KOR1","name":"HYFLNBVT-KOR1"},{"id":"ATL43","name":"AICLOCID-ATL43"},{"id":"ATL54","name":"AICFTAAI-ATL54"},{"id":"ATL66","name":"CLLIAAII-ATL66"},{"id":"VEL1","name":"BNMLKUIK-VEL1"},{"id":"ICC1","name":"SANJITAT-ICC1"},{"id":"MNT11","name":"WSXEFBTH-MNT11"},{"id":"DEF2","name":"WSBHGTYL-DEF2"},{"id":"MAD11","name":"SDFQWGKL-MAD11"},{"id":"OLG1","name":"OLHOLHOL-OLG1"},{"id":"GAR1","name":"NGFVSJKO-GAR1"},{"id":"SAN22","name":"GNVLSCTL-SAN22"},{"id":"HRG1","name":"HRGHRGGS-HRG1"},{"id":"JCS1","name":"JCSJSCJS-JCS1"},{"id":"DHA12","name":"WSXEDECF-DHA12"},{"id":"HJE1","name":"AOEEWWWD-HJE1"},{"id":"NCA1","name":"NCANCANN-NCA1"},{"id":"IOP1","name":"iopclli1-IOP1"},{"id":"RTY1","name":"rtyclli1-RTY1"},{"id":"KAP1","name":"HIOUYTRQ-KAP1"},{"id":"ZEN1","name":"ZENCLLI1-ZEN1"},{"id":"HKA1","name":"JAKHLASS-HKA1"},{"id":"CQK1","name":"CQKSCAKK-CQK1"},{"id":"SAI1","name":"UBEKQLPD-SAI1"},{"id":"ERT1","name":"ertclli1-ERT1"},{"id":"IBB1","name":"PLMKOIJU-IBB1"},{"id":"TIR2","name":"PLKINHYI-TIR2"},{"id":"HSD1","name":"CHASKCDS-HSD1"},{"id":"SLF78","name":"SDCTLFN1-SLF78"},{"id":"SEE78","name":"SDCTEEE4-SEE78"},{"id":"SAN13","name":"TOKYJPFA-SAN13"},{"id":"SAA78","name":"SDCTAAA1-SAA78"},{"id":"LUC1","name":"ATLDFGYC-LUC1"},{"id":"AMD13","name":"MEMATLAN-AMD13"},{"id":"TOR1","name":"TOROONXN-TOR1"},{"id":"QWE1","name":"QWECLLI1-QWE1"},{"id":"ZOG1","name":"ZOGASTRO-ZOG1"},{"id":"CAL33","name":"CALIFORN-CAL33"},{"id":"SHH78","name":"SDIT1HHH-SHH78"},{"id":"DSA1","name":"LKJHGFDS-DSA1"},{"id":"CLG1","name":"CLGRABAD-CLG1"},{"id":"BNA1","name":"BNARAGBK-BNA1"},{"id":"ATL84","name":"CANTTCOC-ATL84"},{"id":"APP1","name":"WBHGTYUI-APP1"},{"id":"RJN1","name":"RJNRBZAW-RJN1"},{"id":"EHH78","name":"SDCSHHH5-EHH78"},{"id":"mac10","name":"PKGTESTF-mac10"},{"id":"SXB78","name":"SDCTGXB1-SXB78"},{"id":"SAX78","name":"SDCTAXG1-SAX78"},{"id":"SYD1","name":"SYDNAUBV-SYD1"},{"id":"TOK1","name":"TOKYJPFA-TOK1"},{"id":"KGM2","name":"KGMTNC20-KGM2"},{"id":"DCC1b","name":"POIUYTGH-DCC1b"},{"id":"SKK78","name":"SDCTKKK1-SKK78"},{"id":"SGG78","name":"SDCTGGG1-SGG78"},{"id":"SJJ78","name":"SDCTJJJ1-SJJ78"},{"id":"SBX78","name":"SDCTBXG1-SBX78"},{"id":"LAG1","name":"LARGIZON-LAG1"},{"id":"IAA1","name":"QAZXSWED-IAA1"},{"id":"POI1","name":"PLMNJKIU-POI1"},{"id":"LAG1a","name":"LARGIZON-LAG1a"},{"id":"PBL1","name":"PBLAPBAI-PBL1"},{"id":"LAG45","name":"LARGIZON-LAG1a"},{"id":"MAR1","name":"MNBVCXZM-MAR1"},{"id":"HST70","name":"HSTNTX70-HST70"},{"id":"DCC1a","name":"POIUYTGH-DCC1a"},{"id":"TOL1","name":"TOLDOH21-TOL1"},{"id":"LON1","name":"LONEENCO-LON1"},{"id":"SJU78","name":"SDIT1JUB-SJU78"},{"id":"STN27","name":"HSTNTX01-STN27"},{"id":"SSW56","name":"ss8126GT-SSW56"},{"id":"SBB78","name":"SDIT1BBB-SBB78"},{"id":"DCC3","name":"POIUYTGH-DCC3"},{"id":"GNV1","name":"GNVLSCTL-GNV1"},{"id":"WAS1","name":"WASHDCSW-WAS1"},{"id":"TOY1","name":"TORYONNZ-TOY1"},{"id":"STT1","name":"STTLWA02-STT1"},{"id":"STG1","name":"STTGGE62-STG1"},{"id":"SLL78","name":"SDCTLLL1-SLL78"},{"id":"SBU78","name":"SDIT1BUB-SBU78"},{"id":"ATL2","name":"ATLNGANW-ATL2"},{"id":"BOT1","name":"BOTHWAKY-BOT1"},{"id":"SNG1","name":"SNGPSIAU-SNG1"},{"id":"NYC1","name":"NYCMNY54-NYC1"},{"id":"LAG1b","name":"LARGIZON-LAG1b"},{"id":"AMD15","name":"AMDFAA01-AMD15"},{"id":"SNA1","name":"SNANTXCA-SNA1"},{"id":"PLT1","name":"PLTNCA60-PLT1"},{"id":"TLP1","name":"TLPNXM18-TLP1"},{"id":"SDD81","name":"SAIT1DD6-SDD81"},{"id":"DCC1","name":"POIUYTGH-DCC1"},{"id":"DCC2","name":"POIUYTGH-DCC2"},{"id":"OKC1","name":"OKCBOK55-OKC1"},{"id":"PAR1","name":"PARSFRCG-PAR1"},{"id":"TES36","name":"ABCEETES-TES36"},{"id":"COM1","name":"PLMKOPIU-COM1"},{"id":"ANI1","name":"ATLNGTRE-ANI1"},{"id":"SDG78","name":"SDIT1BDG-SDG78"},{"id":"mac20","name":"PKGTESTF-mac20"},{"id":"DSF45","name":"DSFBG123-DSF45"},{"id":"HST25","name":"HSTNTX01-HST25"},{"id":"AMD18","name":"AUDIMA01-AMD18"},{"id":"SAA80","name":"SAIT9AA3-SAA80"},{"id":"SSA56","name":"SSIT2AA7-SSA56"},{"id":"SDD82","name":"SAIT1DD9-SDD82"},{"id":"JCV1","name":"JCVLFLBW-JCV1"},{"id":"SUL2","name":"WERTYUJK-SUL2"},{"id":"PUR1","name":"purelyde-PUR1"},{"id":"FDE55","name":"FDERT555-FDE55"},{"id":"SITE","name":"LONEENCO-SITE"},{"id":"ATL1","name":"ATLNGAMA-ATL1"},{"id":"JUL1","name":"ZXCVBNMM-JUL1"},{"id":"TAT34","name":"TESAAISB-TAT34"},{"id":"XCP12","name":"CHKGH123-XCP12"},{"id":"RAI1","name":"poiuytre-RAI1"},{"id":"HPO1","name":"ATLNGAUP-HPO1"},{"id":"KJF12","name":"KJFDH123-KJF12"},{"id":"SCC80","name":"SAIT9CC3-SCC80"},{"id":"SAA12","name":"SAIT9AF8-SAA12"},{"id":"SAA14","name":"SAIT1AA9-SAA14"},{"id":"ATL35","name":"TTESSAAI-ATL35"},{"id":"CWY1","name":"CWYMOWBS-CWY1"},{"id":"ATL76","name":"TELEPAAI-ATL76"},{"id":"DSL12","name":"DSLFK242-DSL12"},{"id":"ATL53","name":"AAIATLTE-ATL53"},{"id":"SAA11","name":"SAIT9AA2-SAA11"},{"id":"ATL62","name":"TESSASCH-ATL62"},{"id":"AUG1","name":"ASDFGHJK-AUG1"},{"id":"POI22","name":"POIUY123-POI22"},{"id":"SAA13","name":"SAIT1AA9-SAA13"},{"id":"BHY17","name":"BHYTFRF3-BHY17"},{"id":"LIS1","name":"HOSTPROF-LIS1"},{"id":"SIP1","name":"ZXCVBNMK-SIP1"},{"id":"ATL99","name":"TEESTAAI-ATL43"},{"id":"ATL64","name":"FORLOAAJ-ATL64"},{"id":"TAT33","name":"TESAAISA-TAT33"},{"id":"RAD10","name":"INDIPUNE-RAD10"},{"id":"RTW5","name":"BHYTFRY4-RTW5"},{"id":"JGS1","name":"KSJKKKKK-JGS1"},{"id":"ATL98","name":"TEESTAAI-ATL43"},{"id":"WAN1","name":"LEIWANGW-WAN1"},{"id":"ATL44","name":"ATLSANAB-ATL44"},{"id":"RTD2","name":"BHYTFRk4-RTD2"},{"id":"NIR1","name":"ORFLMANA-NIR1"},{"id":"ATL75","name":"SANAAIRE-ATL75"},{"id":"NUM1","name":"QWERTYUI-NUM1"},{"id":"MTN32","name":"MDTWNJ21-MTN32"},{"id":"RTZ4","name":"BHYTFRZ6-RTZ4"},{"id":"ATL56","name":"ATLSANAC-ATL56"},{"id":"AMS1","name":"AMSTNLBW-AMS1"},{"id":"RCT1","name":"AMSTERNL-RCT1"},{"id":"JAN1","name":"ORFLMATT-JAN1"},{"id":"ABC14","name":"TESAAISA-ABC14"},{"id":"TAT37","name":"TESAAISD-TAT37"},{"id":"MIC54","name":"MICHIGAN-MIC54"},{"id":"ABC11","name":"ATLSANAI-ABC11"},{"id":"AMF11","name":"AMDOCS01-AMF11"},{"id":"ATL63","name":"ATLSANEW-ATL63"},{"id":"ABC12","name":"ATLSECIA-ABC12"},{"id":"MTN20","name":"MDTWNJ21-MTN20"},{"id":"ABC15","name":"AAITESAN-ABC15"},{"id":"AVT1","name":"AVTRFLHD-AVT1"},{"id":"ATL34","name":"ATLSANAI-ATL34"}],"lcpRegions":[{"id":"AAIAIC25","name":"AAIAIC25","isPermitted":true},{"id":"mtn6","name":"mtn6","isPermitted":true}],"lcpRegionsTenantsMap":{},"tenants":[{"id":"bae71557c5bb4d5aac6743a4e5f1d054","name":"AIN Web Tool-15-D-testgamma","isPermitted":true},{"id":"229bcdc6eaeb4ca59d55221141d01f8e","name":"AIN Web Tool-15-D-STTest2","isPermitted":true},{"id":"1178612d2b394be4834ad77f567c0af2","name":"AIN Web Tool-15-D-SSPtestcustome","isPermitted":true},{"id":"19c5ade915eb461e8af52fb2fd8cd1f2","name":"AIN Web Tool-15-D-UncheckedEcopm","isPermitted":true},{"id":"de007636e25249238447264a988a927b","name":"AIN Web Tool-15-D-dfsdf","isPermitted":true},{"id":"62f29b3613634ca6a3065cbe0e020c44","name":"AIN/SMS-16-D-Multiservices1","isPermitted":true},{"id":"649289e30d3244e0b48098114d63c2aa","name":"AIN Web Tool-15-D-SSPST66","isPermitted":true},{"id":"3f21eeea6c2c486bba31dab816c05a32","name":"AIN Web Tool-15-D-ASSPST47","isPermitted":true},{"id":"f60ce21d3ee6427586cff0d22b03b773","name":"CESAR-100-D-sspjg67246","isPermitted":true},{"id":"8774659e425f479895ae091bb5d46560","name":"CESAR-100-D-sspjg68359","isPermitted":true},{"id":"624eb554b0d147c19ff8885341760481","name":"AINWebTool-15-D-iftach","isPermitted":true},{"id":"214f55f5fc414c678059c383b03e4962","name":"CESAR-100-D-sspjg612401","isPermitted":true},{"id":"c90666c291664841bb98e4d981ff1db5","name":"CESAR-100-D-sspjg621340","isPermitted":true},{"id":"ce5b6bc5c7b348e1bf4b91ac9a174278","name":"sspjg621351cloned","isPermitted":true},{"id":"b386b768a3f24c8e953abbe0b3488c02","name":"AINWebTool-15-D-eteancomp","isPermitted":true},{"id":"dc6c4dbfd225474e9deaadd34968646c","name":"AINWebTool-15-T-SPFET","isPermitted":true},{"id":"02cb5030e9914aa4be120bd9ed1e19eb","name":"AINWebTool-15-X-eeweww","isPermitted":true},{"id":"f2f3830e4c984d45bcd00e1a04158a79","name":"CESAR-100-D-spjg61909","isPermitted":true},{"id":"05b91bd5137f4929878edd965755c06d","name":"CESAR-100-D-sspjg621512cloned","isPermitted":true},{"id":"7002fbe8482d4a989ddf445b1ce336e0","name":"AINWebTool-15-X-vdr","isPermitted":true},{"id":"4008522be43741dcb1f5422022a2aa0b","name":"AINWebTool-15-D-ssasa","isPermitted":true},{"id":"f44e2e96a1b6476abfda2fa407b00169","name":"AINWebTool-15-D-PFNPT","isPermitted":true},{"id":"b69a52bec8a84669a37a1e8b72708be7","name":"AINWebTool-15-X-vdre","isPermitted":true},{"id":"fac7d9fd56154caeb9332202dcf2969f","name":"AINWebTool-15-X-NONPODECOMP","isPermitted":true},{"id":"2d34d8396e194eb49969fd61ffbff961","name":"DN5242-Nov16-T5","isPermitted":true},{"id":"cb42a77ff45b48a8b8deb83bb64acc74","name":"ro-T11","isPermitted":true},{"id":"fa45ca53c80b492fa8be5477cd84fc2b","name":"ro-T112","isPermitted":true},{"id":"4914ab0ab3a743e58f0eefdacc1dde77","name":"DN5242-Nov21-T1","isPermitted":true},{"id":"d0a3e3f2964542259d155a81c41aadc3","name":"test-mtn6-09","isPermitted":true},{"id":"cbb99fe4ada84631b7baf046b6fd2044","name":"DN5242-Nov16-T3","isPermitted":true}],"productFamilies":null,"projects":[{"id":"DFW","name":"DFW"},{"id":"x1","name":"x1"},{"id":"yyy1","name":"yyy1"}],"owningEntities":[{"id":"aaa1","name":"aaa1"},{"id":"d61e6f2d-12fa-4cc2-91df-7c244011d6fc","name":"MetroPacketCore"},{"id":"Wireline","name":"Wireline"}],"globalCustomerId":"e433710f-9217-458d-a79d-1c7aff376d89"}')} - } - - function generateFormGroup(){ - return new FormGroup({ - globalSubscriberId: new FormControl( - Validators.compose([Validators.required]) - ), - productFamilyId: new FormControl(), - subscriptionServiceType: new FormControl({value: null, disabled: true}, Validators.compose([Validators.required])), - lcpCloudRegionId: new FormControl({value: null, disabled: true}, Validators.compose([Validators.required])), - tenantId: new FormControl({value: null, disabled: true}, Validators.compose([Validators.required])), - aicZoneId: new FormControl(), - projectName: new FormControl(), - owningEntityId: new FormControl(Validators.compose([Validators.required])), - instanceName : new FormControl({value: null}, Validators.compose([Validators.required, NumbersLettersUnderscoreValidator.valid])) - }); - } - - - function generateServiceInstanceDetails(){ - return { - servicePopupDataModel : { - "productFamilies" : [] - }, - serviceInstanceDetailsFormGroup : { - controls : { - productFamilyId : { - disabled : false - } - } - } - } - } - - function generateLegalServiceInstance(){ - return { - instanceName : "legalInstanceName" - } - } - - function generateIllegalServiceInstance(){ - return { - instanceName : "illegalInstanceName" - } - } - -}); diff --git a/vid-webpack-master/src/app/components/service-popup/service-popup.service.ts b/vid-webpack-master/src/app/components/service-popup/service-popup.service.ts deleted file mode 100644 index f6efd353b..000000000 --- a/vid-webpack-master/src/app/components/service-popup/service-popup.service.ts +++ /dev/null @@ -1,33 +0,0 @@ -import {Injectable} from '@angular/core'; -import {isNullOrUndefined} from "util"; -import {NumbersLettersUnderscoreValidator} from '../../shared/components/validators/numbersLettersUnderscore/numbersLettersUnderscore.validator'; -import {ServiceInstanceDetailsComponent} from './service-instance-details/service-instance-details.component'; -import {FormGroup} from '@angular/forms'; -import * as _ from "lodash"; - -@Injectable() -export class ServicePopupService { - onControlError(serviceInstanceDetails : ServiceInstanceDetailsComponent, serviceInstanceDetailsFormGroup : FormGroup) : boolean{ - if(!isNullOrUndefined(serviceInstanceDetailsFormGroup) && !isNullOrUndefined(serviceInstanceDetailsFormGroup.controls['instanceName']) && NumbersLettersUnderscoreValidator.valid(serviceInstanceDetailsFormGroup.controls['instanceName'].value) && serviceInstanceDetailsFormGroup.controls['instanceName'].value != null && serviceInstanceDetailsFormGroup.controls['instanceName'].value.length > 0){ - return true; - } - - const controlName : Array<string> = ['productFamilyId', 'lcpCloudRegionId', 'tenantId', 'owningEntityId', 'projectName', 'aicZoneId', 'subscriptionServiceType', 'globalSubscriberId', 'rollbackOnFailure']; - const selectDataName : Array<string> = ['productFamilies', 'lcpRegions', 'tenants', 'owningEntities', 'projects', 'aicZones', 'serviceTypes', 'subscribers', 'rollbackOnFailure']; - for(let i = 0 ; i < controlName.length ; i++){ - if (!isNullOrUndefined(serviceInstanceDetails.servicePopupDataModel) && !isNullOrUndefined(serviceInstanceDetails.servicePopupDataModel[selectDataName[i]])) { - if (!serviceInstanceDetailsFormGroup.controls[controlName[i]].disabled && serviceInstanceDetails.servicePopupDataModel[selectDataName[i]].length === 0) { - return true; - } - } - } - return false; - } - - resetDynamicInputs(serviceInstance : any, defaultDynamicInputs : any) : void { - for(let dynamicInput of serviceInstance.dynamicInputs){ - const defaultDymanicInput = _.find(defaultDynamicInputs, {name:dynamicInput.name}); - serviceInstance.serviceInstanceDetailsFormGroup.controls[dynamicInput.name].setValue(defaultDymanicInput.value); - } - } -} diff --git a/vid-webpack-master/src/app/components/vnf-popup/vnf-instance-details/vnf-instance-details.component.ts b/vid-webpack-master/src/app/components/vnf-popup/vnf-instance-details/vnf-instance-details.component.ts deleted file mode 100644 index 725e44293..000000000 --- a/vid-webpack-master/src/app/components/vnf-popup/vnf-instance-details/vnf-instance-details.component.ts +++ /dev/null @@ -1,275 +0,0 @@ -import {Component, EventEmitter, Input, OnInit, Output, ViewChild} from '@angular/core'; -import {FormControl, FormGroup, Validators} from "@angular/forms"; -import {VNFPopupDataModel} from './vnfPopupDataModel'; -import {AaiService} from '../../../services/aaiService/aai.service'; -import { createVFModuleInstance, updateVFModuleInstance, updateVNFInstance } from '../../../service.actions'; -import {VnfInstance} from "../../../shared/models/vnfInstance"; -import {ServiceInstance} from "../../../shared/models/serviceInstance"; -import {VNFModel} from "../../../shared/models/vnfModel"; -import {InputType} from "../../../shared/models/inputTypes"; -import {ModelInfo} from "../../../shared/models/modelInfo"; -import {VfModuleInstance} from "../../../shared/models/vfModuleInstance"; -import {NgRedux, select} from "@angular-redux/store"; -import {AppState} from "../../../store/reducers"; -import {SelectOptionInterface} from "../../../shared/models/selectOption"; -import {Observable} from "rxjs/Observable"; -import {loadProductFamiliesAction} from "../../../services/aaiService/aai.actions"; -import {VnfInstanceDetailsService} from "./vnf-instance-details.service"; -import {isNullOrUndefined} from 'util'; -import {NumbersLettersUnderscoreValidator} from '../../../shared/components/validators/numbersLettersUnderscore/numbersLettersUnderscore.validator'; -import * as _ from "lodash"; -import {ServiceNodeTypes} from "../../../shared/models/ServiceNodeTypes"; - -@Component({ - selector: 'vnf-instance-details', - templateUrl: 'vnf-instance-details.html', - styleUrls: ['vnf-instance-details.scss'], - providers: [AaiService] -}) - -export class VnfInstanceDetailsComponent implements OnInit { - @ViewChild('vnfForm') vnfForm: 'VnfForm'; - _vnfModel: VNFModel; - @Input () - set vnfModel(vnfModel: VNFModel) { - this._vnfModel = vnfModel; - this.updateFormGroupControlsFromVNFModel(); - } - @Input() vnfInstance: any; - @Input() serviceInstance: ServiceInstance; - @Input() dynamicInputs; - @Input() modelName: string; - @Input() serviceUuid: string; - @Input() userProvidedNaming: boolean; - _modelType: string; - @Input() - set modelType(modelType: string) { - this._modelType = modelType; - this.updateFormGroupControlsFromVNFModel(); - } - - @Input() parentModelName: string; - @Input() isNewVfModule : boolean; - - - @Output() onSubmitClick: EventEmitter<any> = new EventEmitter<any>(); - @Output() onServiceInstanceNameChanged : EventEmitter<boolean> = new EventEmitter<boolean>(); - @Output() onVolumeGroupNameChanged : EventEmitter<boolean> = new EventEmitter<boolean>(); - -@Output() onDataChanged: EventEmitter<any> = new EventEmitter<any>(); - @select(['service','productFamilies']) - readonly productFamilies : Observable<SelectOptionInterface[]>; - - vnfPopupDataModel: VNFPopupDataModel = new VNFPopupDataModel(); - lcpRegionsThatEnableLegacyRegionField = ['AAIAIC25', 'rdm3', 'rdm5a']; - shouldShowLegacyRegion: boolean; - instanceFormGroup: FormGroup = null; - inputType = InputType; - isNotUniqueInstanceName : boolean = false; - isNotUniqueVolumeGroupName : boolean = false; - - constructor(private _aaiService: AaiService, private store: NgRedux<AppState>, - private _vnfInstanceDetailsService : VnfInstanceDetailsService) { - this.store.subscribe(() => { - this.updateFormData() - }); - } - - ngOnInit() { - this.updateFormGroup(); - this.subscribeToFormChanges(); - this._aaiService.getCategoryParameters(null).subscribe(); - this._aaiService.getLcpRegionsAndTenants(this.serviceInstance.globalSubscriberId, this.serviceInstance.subscriptionServiceType).subscribe(); - this.updateLegacyRegionVisibility(); - this.store.dispatch(loadProductFamiliesAction()); - } - - isInputShouldBeShown(inputType: any) { - let vnfInputs = [InputType.LCP_REGION, InputType.LOB, InputType.TENANT, InputType.PRODUCT_FAMILY, InputType.PLATFORM, InputType.ROLLBACK]; - let vfInputs = [InputType.VG]; - let exist = false; - if (this._modelType === 'VF') { - exist = vnfInputs.indexOf(inputType) > -1; - } - else { - exist = vfInputs.indexOf(inputType) > -1; - } - return exist; - } - - updateFormGroupControlsFromVNFModel() { - if (this._vnfModel && this._modelType) { - if (this._modelType === ServiceNodeTypes.VF) { - const vnfInstance = <VnfInstance>this.vnfInstance; - if (this.instanceFormGroup && this.userProvidedNaming - && !this.instanceFormGroup.get('instanceName')) { - const initialInstanceName = vnfInstance.instanceName || (!isNullOrUndefined(this._vnfModel.name) ? this._vnfModel.name.replace(/[-]/g, "") : this._vnfModel.name); - this.instanceFormGroup.addControl('instanceName', new FormControl(initialInstanceName, Validators.compose([Validators.required, NumbersLettersUnderscoreValidator.valid]))) - } - } - else if (this._modelType === ServiceNodeTypes.VFmodule) { - const vfInstance = <VfModuleInstance>this.vnfInstance; - if (this.instanceFormGroup && this.userProvidedNaming && !this.instanceFormGroup.get('instanceName')) { - this.instanceFormGroup.addControl('instanceName', new FormControl(vfInstance.instanceName, Validators.required)); - - let vfModule = this.extractVfAccordingToVfModuleUuid(this.store.getState(), this._vnfModel.uuid); - if (vfModule.volumeGroupAllowed && !this.instanceFormGroup.get('volumeGroupName')) { - this.instanceFormGroup.addControl('volumeGroupName', new FormControl(vfInstance.volumeGroupName)); - } - } - } - } - } - - updateFormGroup() { - const tenantDisabled = !this.vnfInstance.lcpCloudRegionId; - - if (this._modelType === ServiceNodeTypes.VF) { - const vnfInstance = <VnfInstance>this.vnfInstance; - this.instanceFormGroup = new FormGroup({ - productFamilyId: new FormControl(vnfInstance.productFamilyId), - lcpCloudRegionId: new FormControl(vnfInstance.lcpCloudRegionId, Validators.required), - tenantId: new FormControl({value: vnfInstance.tenantId, disabled: tenantDisabled}, Validators.required), - legacyRegion: new FormControl(vnfInstance.legacyRegion), - lineOfBusiness: new FormControl(vnfInstance.lineOfBusiness), - platformName: new FormControl(vnfInstance.platformName, Validators.required), - }); - } - else if (this._modelType === ServiceNodeTypes.VFmodule) { - const vfInstance = <VfModuleInstance>this.vnfInstance; - this.instanceFormGroup = new FormGroup({ - }); - } - - this.instanceFormGroup.valueChanges.subscribe(()=> { - this.checkForUniqueInstanceName(); - this.onDataChanged.next(); - }); - - this.updateFormGroupControlsFromVNFModel(); - } - - private getParentVnfModel(): VNFModel { - const rawModel = _.get(this.store.getState().service.serviceHierarchy[this.serviceUuid], ['vnfs', this.parentModelName]); - return new VNFModel(rawModel); - } - - extractVfAccordingToVfModuleUuid(state : any,vfModuleUuid : string) { - const vnfs = this.store.getState().service.serviceHierarchy[this.serviceUuid].vnfs; - const vnfsArray = Object.values(vnfs); - for (let i = 0; i<vnfsArray.length;i++){ - let vfModules = Object.values(vnfsArray[i].vfModules); - for (let j = 0; j<vfModules.length;j++){ - if (vfModules[j].uuid === vfModuleUuid){ - return vfModules[j]; - } - } - } - } - - updateFormData() { - let service = this.store.getState().service; - this.vnfPopupDataModel.lcpRegions = service.lcpRegionsAndTenants.lcpRegionList; - if (this.vnfInstance && this.vnfInstance.lcpCloudRegionId) { - this.vnfPopupDataModel.tenants = service.lcpRegionsAndTenants.lcpRegionsTenantsMap[this.vnfInstance.lcpCloudRegionId]; - console.log('setting vnf instances tenant: ' + JSON.stringify(this.vnfPopupDataModel.tenants)); - } - this.vnfPopupDataModel.platforms = service.categoryParameters.platformList; - this.vnfPopupDataModel.lineOfBusinesses = service.categoryParameters.lineOfBusinessList; - this.onDataChanged.next(); - } - - subscribeToFormChanges(): void { - if (this.instanceFormGroup.get('lcpCloudRegionId') !== null) { - this.instanceFormGroup.get('lcpCloudRegionId').valueChanges.subscribe(val => { - this.setDisabledState(val, 'tenantId'); - this.updateTenantList(val); - this.updateLegacyRegionVisibility(); - this.onDataChanged.next(); - }); - } - } - - setDisabledState(val, field: string): void { - if (val) { - this.instanceFormGroup.controls[field].enable(); - } - } - - updateLegacyRegionVisibility() { - if (this.instanceFormGroup.get('lcpCloudRegionId') !== null) { - this.shouldShowLegacyRegion = this.lcpRegionsThatEnableLegacyRegionField.indexOf(this.instanceFormGroup.get('lcpCloudRegionId').value) > -1; - if (!this.shouldShowLegacyRegion) { - this.instanceFormGroup.controls.legacyRegion.setValue(undefined); - } - } - } - - updateTenantList(cloudRegionId) { - this.resetTenantSelection(); - const tenantsForCloudRegionId = this.store.getState().service.lcpRegionsAndTenants.lcpRegionsTenantsMap[cloudRegionId]; - console.log('tenants for selected cloud region id: ' + JSON.stringify(tenantsForCloudRegionId)); - this.vnfPopupDataModel.tenants = tenantsForCloudRegionId; - } - - resetTenantSelection() { - this.instanceFormGroup.controls.tenantId.setValue(undefined); - } - - checkForUniqueInstanceName() { - let currentName = !isNullOrUndefined(this.instanceFormGroup.get('instanceName')) ? this.instanceFormGroup.get('instanceName').value : null; - - if(currentName && !this._vnfInstanceDetailsService.isUnique(this.store.getState().service.serviceInstance, this.serviceUuid, currentName, currentName === this.serviceInstance.instanceName) && this.userProvidedNaming){ - this.isNotUniqueInstanceName = true; - this.onServiceInstanceNameChanged.emit(true); - }else { - this.isNotUniqueInstanceName = false; - this.onServiceInstanceNameChanged.emit(false); - } - } - - checkForUniqueGroupName(){ - let currentName = this.instanceFormGroup.get('volumeGroupName').value; - if( !this._vnfInstanceDetailsService.isUnique(this.store.getState().service.serviceInstance, this.serviceUuid, currentName, currentName === this.serviceInstance['volumeGroupName'])){ - this.isNotUniqueVolumeGroupName = true; - this.onVolumeGroupNameChanged.emit(true); - }else { - this.isNotUniqueVolumeGroupName = false; - this.onVolumeGroupNameChanged.emit(false); - } - } - - onSubmit(formValues): void { - formValues.modelInfo = new ModelInfo(this._vnfModel); - if (this._modelType === 'VFmodule') { - let dynamicFields: { [dynamicField: string]: string; }; - dynamicFields = {}; - if(!_.isEmpty(this.dynamicInputs)) { - this.dynamicInputs.map(function (x) { - let dynamicField: string = x.id; - dynamicFields[dynamicField] = formValues[dynamicField]; - delete formValues[dynamicField]; - }); - } - formValues.instanceParams = []; - formValues.instanceParams.push(dynamicFields); - if(this.isNewVfModule){ - this.store.dispatch(createVFModuleInstance(formValues, this.modelName, this.serviceUuid)); - }else { - this.store.dispatch(updateVFModuleInstance(formValues, this.modelName, this.serviceUuid)); - } - - } - else { - formValues.isUserProvidedNaming = this.userProvidedNaming; - this.store.dispatch(updateVNFInstance(formValues, this.modelName, this.serviceUuid)); - } - window.parent.postMessage({ - eventId: 'submitIframe', - data: { - serviceModelId: this.serviceUuid - } - }, "*"); - this.onSubmitClick.emit(this.serviceUuid); - } -} diff --git a/vid-webpack-master/src/app/components/vnf-popup/vnf-instance-details/vnf-instance-details.html b/vid-webpack-master/src/app/components/vnf-popup/vnf-instance-details/vnf-instance-details.html deleted file mode 100644 index ccdaac53b..000000000 --- a/vid-webpack-master/src/app/components/vnf-popup/vnf-instance-details/vnf-instance-details.html +++ /dev/null @@ -1,114 +0,0 @@ - -<div id="vnf-instance-details"> - <form id="vnfForm" #vnfForm="ngForm" (ngSubmit)="onSubmit(vnfForm.value)" [formGroup]="instanceFormGroup"> - - <div class="details-item" *ngIf="instanceFormGroup.get('instanceName')"> - <label class="required">Instance name:</label> - <input patternInput - pattern="^[a-zA-Z0-9_]*$" - [attr.data-tests-id]="'instanceName'" - [ngClass]="{'error-style' : _vnfInstanceDetailsService.hasInstanceNameError(instanceFormGroup) || _vnfInstanceDetailsService.hasUniqueError(isNotUniqueInstanceName)}" - id="instance-name" name="instance-name" - [formControlName]="'instanceName'" - class="form-control input-text" - placeholder="Type Instance Name" - type="text" - (blur)="checkForUniqueInstanceName()"> - <form-control-error *ngIf="_vnfInstanceDetailsService.hasUniqueError(isNotUniqueInstanceName)" [message]="'Instance name is already in use, please pick another name.'"></form-control-error> - <form-control-error *ngIf="_vnfInstanceDetailsService.hasInstanceNameError(instanceFormGroup)" [message]="'Instance name may include only alphanumeric characters and underscore.'"></form-control-error> - </div> - - <div *ngIf="isInputShouldBeShown(inputType.PRODUCT_FAMILY)" class="details-item"> - <label>Product family:</label> - <select class="form-control input-text" - [ngClass]="{'error-style' :_vnfInstanceDetailsService.hasApiError('productFamilyId',productFamilies, instanceFormGroup)}" - data-tests-id="productFamily" - id="product-family-select" - [formControlName]="'productFamilyId'" - name="product-family-select" > - <option [value]="null" disabled>Select Product Family</option> - <option *ngFor="let productFamily of productFamilies | async" [value]="productFamily.id" - [disabled]="!productFamily.isPermitted">{{productFamily.name}}</option> - </select> - <form-control-error *ngIf="_vnfInstanceDetailsService.hasApiError('productFamilyId',productFamilies, instanceFormGroup)" [message]="'No results for this request. Please change criteria.'"></form-control-error> - </div> - - <div *ngIf="isInputShouldBeShown(inputType.LCP_REGION)" class="details-item"> - <label class="required">LCP region:</label> - <select - [ngClass]="{'error-style' :_vnfInstanceDetailsService.hasApiError('lcpCloudRegionId',vnfPopupDataModel?.lcpRegions, instanceFormGroup)}" - class="form-control input-text" - [formControlName]="'lcpCloudRegionId'" - name="lcpRegion" id="lcpRegion-select" - data-tests-id="lcpRegion"> - <option [value]="null" disabled>Select LCP Region</option> - <option *ngFor="let lcpRegion of vnfPopupDataModel.lcpRegions" [value]="lcpRegion.id" [disabled]="!lcpRegion.isPermitted" class="lcpRegionOption">{{lcpRegion.id}}</option> - </select> - <form-control-error *ngIf="_vnfInstanceDetailsService.hasApiError('lcpCloudRegionId',vnfPopupDataModel?.lcpRegions, instanceFormGroup)" [message]="'No results for this request. Please change criteria.'"></form-control-error> - </div> - - <div class="details-item" *ngIf="shouldShowLegacyRegion"> - <label>Legacy Region:</label> - <input - [attr.data-tests-id]="'lcpRegionText'" - id="legacy-region" - name="legacy-region" - [formControlName]="'legacyRegion'" - class="form-control input-text" - placeholder="Type Legacy Region" type="text"> - </div> - - <div *ngIf="isInputShouldBeShown(inputType.TENANT)" class="details-item"> - <label class="required">Tenant:</label> - <select class="form-control input-text" - [ngClass]="{'error-style' :_vnfInstanceDetailsService.hasApiError('tenantId',vnfPopupDataModel?.tenants, instanceFormGroup)}" - [formControlName]="'tenantId'" - name="tenant" id="tenant-select" data-tests-id="tenant"> - <option [value]="undefined" disabled>Select Tenant</option> - <option *ngFor="let tenant of vnfPopupDataModel.tenants" [value]="tenant.id" [disabled]="!tenant.isPermitted">{{tenant.name}}</option> - </select> - <form-control-error *ngIf="_vnfInstanceDetailsService.hasApiError('tenantId',vnfPopupDataModel?.tenants, instanceFormGroup)" [message]="'No results for this request. Please change criteria.'"></form-control-error> - </div> - - <div *ngIf="isInputShouldBeShown(inputType.LOB)" class="details-item"> - <label>Line of business:</label> - <select [attr.data-tests-id]="'lineOfBusiness'" - class="form-control input-text" - [ngClass]="{'error-style' :_vnfInstanceDetailsService.hasApiError('lineOfBusiness',vnfPopupDataModel?.lineOfBusinesses, instanceFormGroup)}" - name="lineOfBusiness" id="lineOfBusiness" - [formControlName]="'lineOfBusiness'"> - <option [value]="null" disabled>Select Line Of Business</option> - <option *ngFor="let project of vnfPopupDataModel.lineOfBusinesses" [value]="project.id">{{project.name}}</option> - </select> - <form-control-error *ngIf="_vnfInstanceDetailsService.hasApiError('lineOfBusiness',vnfPopupDataModel?.lineOfBusinesses, instanceFormGroup)" [message]="'No results for this request. Please change criteria.'"></form-control-error> - </div> - - <div *ngIf="isInputShouldBeShown(inputType.PLATFORM)" class="details-item"> - <label class="required">Platform:</label> - <select - [attr.data-tests-id]="'platform'" - [ngClass]="{'error-style' :_vnfInstanceDetailsService.hasApiError('platformName',vnfPopupDataModel?.platforms, instanceFormGroup)}" - class="form-control input-text" - [formControlName]="'platformName'" - name="platform" id="platform"> - <option [value]="null" disabled>Select Platform</option> - <option *ngFor="let platform of vnfPopupDataModel.platforms" [value]="platform.id">{{platform.name}}</option> - </select> - <form-control-error *ngIf="_vnfInstanceDetailsService.hasApiError('platformName',vnfPopupDataModel?.platforms, instanceFormGroup)" [message]="'No results for this request. Please change criteria.'"></form-control-error> - </div> - - - <div *ngIf="isInputShouldBeShown(inputType.VG) && instanceFormGroup.get('volumeGroupName')" class="details-item" > - <label class="required">Volume Group Name:</label> - <input [attr.data-tests-id]="'volumeGroupName'" - id="vgName" name="vgName" - [ngClass]="{'error-style' :isNotUniqueVolumeGroupName}" - [formControlName]="'volumeGroupName'" - class="form-control input-text" - placeholder="Type Instance Name" type="text" (blur)="checkForUniqueGroupName()"> - <form-control-error *ngIf="isNotUniqueVolumeGroupName" [message]="'Volume Group instance name is already in use, please pick another name.'"></form-control-error> - </div> - - <dynamic-inputs *ngIf="dynamicInputs != undefined && dynamicInputs.length>0" [group]="instanceFormGroup" [list]="dynamicInputs"></dynamic-inputs> - </form> -</div> diff --git a/vid-webpack-master/src/app/components/vnf-popup/vnf-instance-details/vnf-instance-details.scss b/vid-webpack-master/src/app/components/vnf-popup/vnf-instance-details/vnf-instance-details.scss deleted file mode 100644 index 080540a57..000000000 --- a/vid-webpack-master/src/app/components/vnf-popup/vnf-instance-details/vnf-instance-details.scss +++ /dev/null @@ -1,64 +0,0 @@ -#vnf-instance-details { - position: relative; - - #notification-area { - color: #959595; - font-size: 12px; - position: absolute; - top: 3px; - left: 30px; - } - - height: 100%; - overflow: auto; - padding: 30px; - - /deep/ { - .form-control { - border-radius: 2px; - box-shadow: none; - border-color: #D2D2D2; - } - - label { - font-family: OpenSans-Semibold; - font-size: 12px; - } - - select { - @extend .form-control; - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; - background: url('../../../../assets/img/chevron.svg') 0 0 no-repeat; - background-size: 24px; - background-position-x: right; - background-position-y: center; - font-family: OpenSans-Italic; - font-size: 14px; - color: #959595; - height: 38px; - } - - input:not([type='checkbox']) { - @extend .form-control; - height: 38px; - } - - .form-control[disabled], fieldset[disabled] .form-control { - opacity: 0.5; - } - .input-text { - border: 1px solid #D2D2D2; - border-radius: 2px; - } - - .details-item { - margin-bottom: 20px; - } - } - - .checkbox-label { - font-family: OpenSans-Regular; - } -} diff --git a/vid-webpack-master/src/app/components/vnf-popup/vnf-instance-details/vnf-instance-details.service.spec.ts b/vid-webpack-master/src/app/components/vnf-popup/vnf-instance-details/vnf-instance-details.service.spec.ts deleted file mode 100644 index 41ddb4372..000000000 --- a/vid-webpack-master/src/app/components/vnf-popup/vnf-instance-details/vnf-instance-details.service.spec.ts +++ /dev/null @@ -1,241 +0,0 @@ -import { TestBed, getTestBed } from '@angular/core/testing'; -import { - HttpClientTestingModule, - HttpTestingController -} from '@angular/common/http/testing'; -import { VnfInstanceDetailsService } from './vnf-instance-details.service'; -import { FormControl, FormGroup, Validators } from '@angular/forms'; -import { NumbersLettersUnderscoreValidator } from '../../../shared/components/validators/numbersLettersUnderscore/numbersLettersUnderscore.validator'; - -describe('Vnf Instance Details Service', () => { - let injector; - let service: VnfInstanceDetailsService; - let httpMock: HttpTestingController; - - let SERVICE_ID: string = '1a80c596-27e5-4ca9-b5bb-e03a7fd4c0fd'; - let serviceHierarchy; - - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [HttpClientTestingModule], - providers: [VnfInstanceDetailsService] - }); - - injector = getTestBed(); - service = injector.get(VnfInstanceDetailsService); - httpMock = injector.get(HttpTestingController); - serviceHierarchy = getServiceServiceHierarchy(); - }); - - - describe('#hasInstanceNameError', ()=> { - it('hasInstanceNameError should return true if instanceName is illegal and enabled', (done: DoneFn) => { - let form = generateFormGroup(); - form.controls['instanceName'].setValue('----'); - form.controls['instanceName'].setErrors({ - pattern : true - }); - form.controls['instanceName'].markAsTouched(); - let result = service.hasInstanceNameError(form); - expect(result).toBeTruthy(); - done(); - }); - - it('hasInstanceNameError should return false if instanceName is illegal and enabled and pattern is ok', (done: DoneFn) => { - let form = generateFormGroup(); - form.controls['instanceName'].setValue('----'); - form.controls['instanceName'].setErrors({ - otherError : true - }); - form.controls['instanceName'].markAsTouched(); - let result = service.hasInstanceNameError(form); - expect(result).toBeFalsy(); - done(); - }); - }); - - describe('#isUnique', () => { - it('Create Mode: should return false if instanceName exist', (done: DoneFn) => { - serviceHierarchy = getServiceServiceHierarchy(); - let result = service.isUnique(serviceHierarchy, SERVICE_ID, 'uniqueInstanceName', false); - expect(result).toBeFalsy(); - done(); - }); - - it('Update Mode: should return true if instanceName exist once', (done: DoneFn) => { - let result = service.isUnique(serviceHierarchy, SERVICE_ID, 'uniqueInstanceName', true); - expect(result).toBeTruthy() - done(); - }); - - it('Create Mode: should return true if instanceName not exist', (done: DoneFn) => { - let result = service.isUnique(serviceHierarchy, SERVICE_ID, 'uniqueInstanceNameNotExist', false); - expect(result).toBeTruthy(); - done(); - }); - - it('Create Mode: should return false if instanceName exist inside vf modules', (done: DoneFn) => { - let result = service.isUnique(serviceHierarchy, SERVICE_ID, 'uniqueInstanceNameVfModule', false); - expect(result).toBeFalsy(); - done(); - }); - - it('Update Mode: should return true if instanceName exist once inside vf modules', (done: DoneFn) => { - let result = service.isUnique(serviceHierarchy, SERVICE_ID, 'uniqueInstanceNameVfModule', true); - expect(result).toBeTruthy(); - done(); - }); - - it('Create Mode: should return true if instanceName is not exist at vf modules and vnfs', (done: DoneFn) => { - let result = service.isUnique(serviceHierarchy, SERVICE_ID, 'uniqueInstanceNameVfModuleNotExist', false); - expect(result).toBeTruthy(); - done(); - }); - - it('Create Mode: should return false if instanceName exist service name', (done: DoneFn) => { - let result = service.isUnique(serviceHierarchy, SERVICE_ID, 'Instance-Name', false); - expect(result).toBeFalsy(); - done(); - }); - - it('Create Mode: should return false if volumeGroupName exist service name', (done: DoneFn) => { - let result = service.isUnique(serviceHierarchy, SERVICE_ID, 'volumeGroupNameExist', false); - expect(result).toBeFalsy(); - done(); - }); - - it('Create Mode: should return true if volumeGroupName not exist service name', (done: DoneFn) => { - let result = service.isUnique(serviceHierarchy, SERVICE_ID, 'volumeGroupNameNotExist', false); - expect(result).toBeTruthy(); - done(); - }); - }); - - function getServiceServiceHierarchy() { - return JSON.parse(JSON.stringify( - { - "1a80c596-27e5-4ca9-b5bb-e03a7fd4c0fd": { - "vnfs": { - "2017-388_ADIOD-vPE 1": { - "rollbackOnFailure": "true", - "vfModules": {}, - "instanceParams": [ - {} - ], - "productFamilyId": "a4f6f2ae-9bf5-4ed7-b904-06b2099c4bd7", - "lcpCloudRegionId": "AAIAIC25", - "tenantId": "092eb9e8e4b7412e8787dd091bc58e86", - "lineOfBusiness": "zzz1", - "platformName": "platform", - "instanceName": "uniqueInstanceName", - "modelInfo": { - "modelInvariantId": "00beb8f9-6d39-452f-816d-c709b9cbb87d", - "modelVersionId": "0903e1c0-8e03-4936-b5c2-260653b96413", - "modelName": "2017-388_ADIOD-vPE", - "modelVersion": "1.0", - "modelCustomizationId": "280dec31-f16d-488b-9668-4aae55d6648a", - "modelCustomizationName": "2017-388_ADIOD-vPE 1" - }, - "isUserProvidedNaming": true - }, - "2017-388_ADIOD-vPE 0": { - "rollbackOnFailure": "true", - "vfModules": {}, - "instanceParams": [ - {} - ], - "productFamilyId": null, - "lcpCloudRegionId": "mtn6", - "tenantId": "1178612d2b394be4834ad77f567c0af2", - "lineOfBusiness": "ECOMP", - "platformName": "xxx1", - "instanceName": "blaaa", - "modelInfo": { - "modelInvariantId": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8", - "modelVersionId": "afacccf6-397d-45d6-b5ae-94c39734b168", - "modelName": "2017-388_ADIOD-vPE", - "modelVersion": "4.0", - "modelCustomizationId": "b3c76f73-eeb5-4fb6-9d31-72a889f1811c", - "modelCustomizationName": "2017-388_ADIOD-vPE 0" - }, - "isUserProvidedNaming": true - }, - "2017488_ADIODvPE 0": { - "rollbackOnFailure": "true", - "vfModules": { - "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": { - "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": { - "rollbackOnFailure": "true", - "instanceName": "uniqueInstanceNameVfModule", - "volumeGroupName": "volumeGroupNameExist", - "modelInfo": { - "modelInvariantId": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1", - "modelVersionId": "25284168-24bb-4698-8cb4-3f509146eca5", - "modelName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", - "modelVersion": "6" - } - } - } - }, - "instanceParams": [ - {} - ], - "productFamilyId": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034", - "lcpCloudRegionId": "mtn6", - "tenantId": "19c5ade915eb461e8af52fb2fd8cd1f2", - "lineOfBusiness": "zzz1", - "platformName": "platform", - "instanceName": "2017488_ADIODvPE", - "modelInfo": { - "modelInvariantId": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8", - "modelVersionId": "69e09f68-8b63-4cc9-b9ff-860960b5db09", - "modelName": "2017488_ADIODvPE", - "modelVersion": "5.0", - "modelCustomizationId": "1da7b585-5e61-4993-b95e-8e6606c81e45", - "modelCustomizationName": "2017488_ADIODvPE 0" - }, - "isUserProvidedNaming": true - } - }, - "instanceParams": [ - {} - ], - "globalSubscriberId": "e433710f-9217-458d-a79d-1c7aff376d89", - "productFamilyId": "17cc1042-527b-11e6-beb8-9e71128cae77", - "subscriptionServiceType": "VIRTUAL USP", - "lcpCloudRegionId": "AAIAIC25", - "tenantId": "092eb9e8e4b7412e8787dd091bc58e86", - "aicZoneId": "DKJ1", - "projectName": "DFW", - "owningEntityId": "aaa1", - "instanceName": "Instance-Name", - "bulkSize": 1, - "modelInfo": { - "modelInvariantId": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0", - "modelVersionId": "1a80c596-27e5-4ca9-b5bb-e03a7fd4c0fd", - "modelName": "action-data", - "modelVersion": "1.0" - }, - "tenantName": "USP-SIP-IC-24335-T-01", - "aicZoneName": "DKJSJDKA-DKJ1", - "isUserProvidedNaming": true - } - } - )); - } - - function generateFormGroup() { - return new FormGroup({ - productFamilyId: new FormControl(), - lcpCloudRegionId: new FormControl(Validators.required), - tenantId: new FormControl({value: null, disabled: false}, Validators.required), - legacyRegion: new FormControl(), - lineOfBusiness: new FormControl(), - platformName: new FormControl(Validators.required), - rollbackOnFailure: new FormControl(Validators.required), - instanceName: new FormControl({value: null}, Validators.compose([Validators.required, NumbersLettersUnderscoreValidator.valid])) - - }); - } - -}); diff --git a/vid-webpack-master/src/app/components/vnf-popup/vnf-instance-details/vnf-instance-details.service.ts b/vid-webpack-master/src/app/components/vnf-popup/vnf-instance-details/vnf-instance-details.service.ts deleted file mode 100644 index 677895e72..000000000 --- a/vid-webpack-master/src/app/components/vnf-popup/vnf-instance-details/vnf-instance-details.service.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { Injectable } from '@angular/core'; -import { isNullOrUndefined } from "util"; -import { FormGroup } from '@angular/forms'; -@Injectable() -export class VnfInstanceDetailsService { - isUnique(serviceInstance : any, serviceId : string, name: string, isEqualToOriginalInstanceName : boolean) : boolean { - const service = serviceInstance[serviceId]; - let countInstanceName = 0; - let countVolumeGroupName = 0; - if(service){ - if(service.instanceName === name) return false; - if(service.vnfs){ - for(let key in service.vnfs){ - if(service.vnfs[key].instanceName === name) { - countInstanceName++; - if((isEqualToOriginalInstanceName && countInstanceName > 1) || (!isEqualToOriginalInstanceName)) return false; - } - if(service.vnfs[key].vfModules){ - for(let vfModule in service.vnfs[key].vfModules){ - if(service.vnfs[key].vfModules[vfModule]) { - for(let module in service.vnfs[key].vfModules[vfModule]){ - if(service.vnfs[key].vfModules[vfModule][module].instanceName === name ) { - countInstanceName++; - if((isEqualToOriginalInstanceName && countInstanceName > 1) || (!isEqualToOriginalInstanceName)) return false; - } - - if(service.vnfs[key].vfModules[vfModule][module].volumeGroupName === name ) { - countVolumeGroupName++; - if((isEqualToOriginalInstanceName && countVolumeGroupName > 1) || (!isEqualToOriginalInstanceName)) return false; - } - } - } - } - } - - } - } - } - return true; - } - - hasApiError(controlName: string, data: Array<any>, form: FormGroup) { - if (!isNullOrUndefined(data)) { - if (!form.controls[controlName].disabled && data.length === 0) { - return true; - } - } - return false; - } - - hasInstanceNameError(form : FormGroup) : boolean { - if(!isNullOrUndefined(form) && !isNullOrUndefined(form.controls['instanceName'])){ - if (form.controls['instanceName'].touched && form.controls['instanceName'].errors && form.controls['instanceName'].errors.pattern) { - return true; - } - } - return false; - } - - hasUniqueError(isNotUniqueInstanceName) : boolean { - return isNotUniqueInstanceName; - } - -} diff --git a/vid-webpack-master/src/app/components/vnf-popup/vnf-instance-details/vnfPopupDataModel.ts b/vid-webpack-master/src/app/components/vnf-popup/vnf-instance-details/vnfPopupDataModel.ts deleted file mode 100644 index 9a2694c70..000000000 --- a/vid-webpack-master/src/app/components/vnf-popup/vnf-instance-details/vnfPopupDataModel.ts +++ /dev/null @@ -1,26 +0,0 @@ -import {Project} from "../../../shared/models/project"; -import {LcpRegion} from "../../../shared/models/lcpRegion"; -import {Tenant} from "../../../shared/models/tenant"; -import {ProductFamily} from "../../../shared/models/productFamily"; -import {SelectOption, SelectOptionInterface} from "../../../shared/models/selectOption"; - -export class VNFPopupDataModel { - productFamilies: ProductFamily[]; - lcpRegions: LcpRegion[]; - lcpRegionsTenantsMap: any; - tenants: Tenant[]; - projects: Project[]; - lineOfBusinesses: SelectOption[]; - platforms: SelectOptionInterface[]; - globalCustomerId: string; - - - constructor(){ - this.lcpRegions = []; - this.lcpRegionsTenantsMap = {}; - this.tenants = []; - this.productFamilies = []; - this.lineOfBusinesses = []; - this.platforms = []; - } -} diff --git a/vid-webpack-master/src/app/components/vnf-popup/vnf-popup-service.ts b/vid-webpack-master/src/app/components/vnf-popup/vnf-popup-service.ts deleted file mode 100644 index 7dbe9b11b..000000000 --- a/vid-webpack-master/src/app/components/vnf-popup/vnf-popup-service.ts +++ /dev/null @@ -1,55 +0,0 @@ -import {Injectable} from "@angular/core"; -import {ServiceNodeTypeToModelKeyMapper} from "../../shared/models/serviceNodeTypeToModelKeyMapper"; -import {ServiceNodeTypes} from "../../shared/models/ServiceNodeTypes"; -import {VfModule} from "../../shared/models/vfModule"; -import {ServicePlanningService} from "../../services/service-planning.service"; -import {VNFModel} from "../../shared/models/vnfModel"; -import * as _ from 'lodash'; -import {isNullOrUndefined} from "util"; -import {NumbersLettersUnderscoreValidator} from '../../shared/components/validators/numbersLettersUnderscore/numbersLettersUnderscore.validator'; -import {FormGroup} from '@angular/forms'; -import {VnfInstanceDetailsComponent} from './vnf-instance-details/vnf-instance-details.component'; -import {VnfInstanceDetailsService} from './vnf-instance-details/vnf-instance-details.service'; - -@Injectable() -export class VnfPopupService { - - constructor(private _servicePlanningService : ServicePlanningService, private _vnfInstanceDetailsService : VnfInstanceDetailsService) { - } - - public getModelFromResponse(result : any, modelType : string, modelName:string) { - let model = null; - let rawModel = _.get(result, [ServiceNodeTypeToModelKeyMapper[modelType], modelName]); - if (!rawModel) return; - - if (modelType === ServiceNodeTypes.VFmodule) { - model = new VfModule(rawModel); - } - else { - model = new VNFModel(rawModel); - } - return model; - } - - onControlError(servicePopupDataModel : VnfInstanceDetailsComponent, serviceInstanceDetailsFormGroup : FormGroup, isNotUniqueInstanceName : boolean, isNotUniqueVolumeGroupName : boolean) : boolean{ - if(this._vnfInstanceDetailsService.hasUniqueError(isNotUniqueInstanceName) || isNotUniqueVolumeGroupName){ - return true; - } - if(!isNullOrUndefined(serviceInstanceDetailsFormGroup.controls['instanceName']) && NumbersLettersUnderscoreValidator.valid(serviceInstanceDetailsFormGroup.controls['instanceName'].value) && serviceInstanceDetailsFormGroup.controls['instanceName'].value != null && serviceInstanceDetailsFormGroup.controls['instanceName'].value.length > 0){ - return true; - } - - const controlName : Array<string> = ['lcpCloudRegionId', 'tenantId', 'lineOfBusiness', 'platformName']; - const selectDataName : Array<string> = ['lcpRegions', 'tenants', 'lineOfBusinesses', 'platforms', 'projects']; - - for(let i = 0 ; i < controlName.length ; i++){ - if (!isNullOrUndefined(servicePopupDataModel.vnfPopupDataModel) && !isNullOrUndefined(servicePopupDataModel.vnfPopupDataModel[selectDataName[i]])) { - if (!isNullOrUndefined(serviceInstanceDetailsFormGroup.controls[controlName[i]]) && !serviceInstanceDetailsFormGroup.controls[controlName[i]].disabled && servicePopupDataModel.vnfPopupDataModel[selectDataName[i]].length === 0) { - return true; - } - } - } - return false; - } - -} diff --git a/vid-webpack-master/src/app/components/vnf-popup/vnf-popup.components.ts b/vid-webpack-master/src/app/components/vnf-popup/vnf-popup.components.ts deleted file mode 100644 index 26e667d4c..000000000 --- a/vid-webpack-master/src/app/components/vnf-popup/vnf-popup.components.ts +++ /dev/null @@ -1,190 +0,0 @@ -import {Component, OnInit, ViewChild} from "@angular/core"; -import {AaiService} from "../../services/aaiService/aai.service"; -import {ModelInformationItem} from "../../shared/components/model-information/model-information.component"; -import {ActivatedRoute} from "@angular/router"; -import {DialogComponent, DialogService} from "ng2-bootstrap-modal"; -import {InstancePopup} from "../instance-popup/instance-popup.components"; -import {ServiceModel} from "../../shared/models/serviceModel"; -import {Constants} from "../../shared/utils/constants"; -import * as _ from "lodash"; -import {VnfInstance} from "../../shared/models/vnfInstance"; -import {ServiceInstance} from "../../shared/models/serviceInstance"; -import {VnfInstanceDetailsComponent} from "./vnf-instance-details/vnf-instance-details.component"; -import {Subscriber} from "../../shared/models/subscriber"; -import {ServiceNodeTypes} from "../../shared/models/ServiceNodeTypes"; -import {AppState} from "../../store/reducers"; -import {NgRedux} from "@angular-redux/store"; -import {VfModuleInstance} from "../../shared/models/vfModuleInstance"; -import {VnfPopupService} from './vnf-popup-service'; -import {IframeService} from "../../shared/utils/iframe.service"; - -export interface VnfPopupModel { - serviceModelId: string; - modelName: string; - parentModelName: string; - modelType: string; - dynamicInputs: any; - userProvidedNaming: boolean; - isNewVfModule : boolean; -} - -@Component({ - selector: 'vnf-popup', - templateUrl: 'vnf-popup.html', - styleUrls: ['vnf-popup.scss'], - providers: [AaiService, VnfPopupService] -}) - -export class VnfPopupComponent extends DialogComponent<VnfPopupModel, boolean> implements VnfPopupModel, InstancePopup, OnInit { - - @ViewChild(VnfInstanceDetailsComponent) vnfInstanceDetails: VnfInstanceDetailsComponent; - - serviceModelId: string; - modelName: string; - parentModelName: string; - modelType: string; - isNewVfModule : boolean; - model: any; - serviceModel: ServiceModel; - popupTypeName: string; - serviceInstance: ServiceInstance; - vnfInstance: VnfInstance; - dynamicInputs; - userProvidedNaming: boolean; - typeMapperForTitle = { - VF: "VNF", - VFmodule: "Module (Heat stack)" - }; - - modelInformationItems: Array<ModelInformationItem> = []; - isNotUniqueInstanceName : boolean = false; - isNotUniqueVolumeGroupName : boolean = false; - hasGeneralApiError : boolean = false; - - parentElementClassName = 'content'; - - constructor(dialogService: DialogService, protected route: ActivatedRoute, protected _aaiService: AaiService, - private store: NgRedux<AppState>, - private _iframeService : IframeService, - private _vnfPopupService: VnfPopupService) { - super(dialogService); - this.vnfInstance = new VnfInstance(); - } - - updateGeneralErrorSection() : void { - this.hasGeneralApiError = this._vnfPopupService.onControlError( - this.vnfInstanceDetails, - this.vnfInstanceDetails.instanceFormGroup, - this.vnfInstanceDetails.isNotUniqueInstanceName, - this.vnfInstanceDetails.isNotUniqueVolumeGroupName); - } - - ngOnInit(): void { - this.updateServiceModelById(); - this.popupTypeName = this.getModelTypeForPopupTitle(); - this.updateServiceModelById(); - this.updateInstanceFromStore(); - } - - onCancelClick() { - this._iframeService.removeClassCloseModal(this.parentElementClassName); - super.close(); - } - - onServiceInstanceNameChanged(isNotUniqueInstanceName: boolean) : void { - this.isNotUniqueInstanceName = isNotUniqueInstanceName; - } - - onVolumeGroupNameChanged(isNotUniqueVolumeGroupName: boolean) : void { - this.isNotUniqueVolumeGroupName = isNotUniqueVolumeGroupName; - } - - onSetClick() { - this._iframeService.removeClassCloseModal(this.parentElementClassName); - this.result = true; - super.close(); - } - - updateServiceModelById() { - this._aaiService.getServiceModelById(this.serviceModelId).subscribe( - result => { - this.serviceModel = new ServiceModel(result); - this.model = this._vnfPopupService.getModelFromResponse(result, this.modelType, this.modelName); - this.modelInformationItems = this.createModelInformationItems(); - }, - error => { - console.log('error is ', error) - } - ); - } - - updateInstanceFromStore() { - let instance; - const serviceInstance = this.store.getState().service.serviceInstance[this.serviceModelId]; - if (this.modelType === ServiceNodeTypes.VF) { - instance = serviceInstance.vnfs[this.modelName] || new VnfInstance(); - } else { - instance = new VfModuleInstance(); - } - - if (instance.instanceParams && instance.instanceParams[0]) { - this.dynamicInputs = this.dynamicInputs.map(x => { - x.value = (instance.instanceParams[0][x.id]) ? instance.instanceParams[0][x.id] : x.value; - return x; - }); - } - this.vnfInstance = instance; - } - - getModelName(): string { - return this.modelName; - } - - getModelTypeForPopupTitle(): string { - if (_.has(this.typeMapperForTitle, this.modelType)) { - return this.typeMapperForTitle[this.modelType]; - } - return this.modelType; - } - - extractSubscriberNameBySubscriberId(subsriberId: string) { - var result: string = null; - var filteredArray: any = _.filter(this.store.getState().service.subscribers, function (o: Subscriber) { - return o.id === subsriberId - }) - if (filteredArray.length > 0) { - result = filteredArray[0].name; - } - return result; - } - - createModelInformationItems(): Array<ModelInformationItem> { - var serviceInstance = this.store.getState().service.serviceInstance[this.serviceModelId]; - - let items = [ - new ModelInformationItem("Subscriber Name", "subscriberName", [this.extractSubscriberNameBySubscriberId(serviceInstance.globalSubscriberId)], "", true), - new ModelInformationItem("Service Name", "serviceModelName", [this.serviceModel.name], "", true), - - new ModelInformationItem("Service Instance Name", "serviceName", [serviceInstance.instanceName], "", false), - new ModelInformationItem("Model Name", "modelName", [this.model.name], "", true), - new ModelInformationItem("Model version", "modelVersion", [this.model.version], "", true), - new ModelInformationItem("Description", "description", [this.model.description]), - new ModelInformationItem("Category", "category", [this.model.category]), - new ModelInformationItem("Sub Category", "subCategory",[this.model.subCategory]), - new ModelInformationItem("UUID", "uuid", [this.model.uuid], Constants.ServicePopup.TOOLTIP_UUID, true), - new ModelInformationItem("Invariant UUID", "invariantUuid", [this.model.invariantUuid], Constants.ServicePopup.TOOLTIP_INVARIANT_UUID, true), - new ModelInformationItem("Service type", "serviceType", [this.serviceModel.serviceType]), - new ModelInformationItem("Service role", "serviceRole", [this.serviceModel.serviceRole]), - - - ]; - if (this.modelType === 'VFmodule') { - items.push(new ModelInformationItem("Minimum to instantiate", "min", [this.model.min], "", true), - new ModelInformationItem("Maximum to instantiate", "max", this.model.max == undefined ? [1] : [this.model.max], "", true), - new ModelInformationItem("Recommended to instantiate", "initial", [this.model.initial])); - - } - - return items; - } -} diff --git a/vid-webpack-master/src/app/components/vnf-popup/vnf-popup.html b/vid-webpack-master/src/app/components/vnf-popup/vnf-popup.html deleted file mode 100644 index d2e043b18..000000000 --- a/vid-webpack-master/src/app/components/vnf-popup/vnf-popup.html +++ /dev/null @@ -1,54 +0,0 @@ -<div id="instance-popup" class="modal-dialog"> - <div class="modal-content"> - <div class="modal-header"> - <button type="button" class="close" (click)="onCancelClick()" >×</button> - <span [attr.data-tests-id]="'create-modal-title'" class="modal-title">Set a new {{popupTypeName}}</span> - </div> - <div class="modal-body popup-content"> - - <div class="header-left"> - <div>MODEL: <span>"{{popupTypeName}}"</span></div> - </div> - - <div class="header-right"> - {{getModelTypeForPopupTitle()}} Instance Details - </div> - - <div class="model-information"> - <model-information [modelInformationItems]="modelInformationItems"></model-information> - </div> - - <div class="instance-form"> - <vnf-instance-details [dynamicInputs]="dynamicInputs" - [vnfModel]="model" - [modelType]="modelType" - [modelName]="modelName" - [parentModelName]="parentModelName" - [isNewVfModule]="isNewVfModule" - [serviceInstance]="vnfInstance" - [vnfInstance]="vnfInstance" - [serviceUuid]="serviceModelId" - [userProvidedNaming]="userProvidedNaming" - (onSubmitClick)="onSetClick($event)" - (onDataChanged)="updateGeneralErrorSection()" - (onServiceInstanceNameChanged)="onServiceInstanceNameChanged($event)" - (onVolumeGroupNameChanged)="onVolumeGroupNameChanged($event)" - - ></vnf-instance-details> - </div> - - </div> - <div class="modal-footer row" style="padding: 0"> - <div class="col-md-6"> - <div *ngIf="hasGeneralApiError == true"> - <form-general-error [message]="'Page contains errors. Please see details next to the relevant fields.'"></form-general-error> - </div> - </div> - <div class="col-md-6" style="padding: 15px;padding-right: 35px;"> - <button [attr.data-tests-id]="'cancelButton'" type="button" class="btn btn-default cancel" (click)="onCancelClick()"><span>Cancel</span></button> - <input type="submit" value="Set" form="vnfForm" data-tests-id="vnf-form-set" - class="btn btn-success submit" [disabled]="!vnfInstanceDetails?.vnfForm?.valid || isNotUniqueInstanceName || isNotUniqueVolumeGroupName"> - </div> - </div> - </div> -</div> diff --git a/vid-webpack-master/src/app/configuration/vid.configuration.ts b/vid-webpack-master/src/app/configuration/vid.configuration.ts deleted file mode 100644 index 2430d3ba5..000000000 --- a/vid-webpack-master/src/app/configuration/vid.configuration.ts +++ /dev/null @@ -1,98 +0,0 @@ -export class VidConfiguration { - - public static VNF_STATUS_CHECK_ENABLED = false; - - /* - * UPLOAD_SUPPLEMENTARY_STATUS_CHECK_ENABLED: Determines the Property to Govern Presence of - * Upload Supplementary File on Volume Group Screen. - * Set to false, to disable the check. - */ - public static UPLOAD_SUPPLEMENTARY_STATUS_CHECK_ENABLED = false; - - /* - * List of valid VNF status combinations - */ - public static VNF_VALID_STATUS_LIST = [ - { - 'provStatus': 'preprov', - 'orchestrationStatus': 'pending-create', - 'inMaint': false, - 'operationalStatus': null - }, - { - 'provStatus': 'preprov', - 'orchestrationStatus': 'created', - 'inMaint': false, - 'operationalStatus': null - }, - { - 'provStatus': 'preprov', - 'orchestrationStatus': 'active', - 'inMaint': false, - 'operationalStatus': null - }, - { - 'provStatus': 'nvtprov', - 'orchestrationStatus': 'active', - 'inMaint': false, - 'operationalStatus': null - }, - { - 'provStatus': 'prov', - 'orchestrationStatus': 'active', - 'inMaint': false, - 'operationalStatus': 'out-of-service-path' - }, - { - 'provStatus': 'prov', - 'orchestrationStatus': 'activated', - 'inMaint': false, - 'operationalStatus': 'out-of-service-path' - } - ]; - - /* - * The model status VID uses to query SDC for a list of models. The possible values are: - * DISTRIBUTION_NOT_APPROVED, - * DISTRIBUTION_APPROVED, - * DISTRIBUTED, - * DISTRIBUTION_REJECTED, - * ALL, - * In the production env, this should always be set to DISTRIBUTED - */ - public static ASDC_MODEL_STATUS = 'DISTRIBUTED'; - - /* - * Max number of times that VID will poll MSO for a given request status - */ - public static MSO_MAX_POLLS = 10; - - /* - * Number of msecs that VID will wait between MSO polls. - */ - public static MSO_POLLING_INTERVAL_MSECS = 10000; - - public static SCHEDULER_POLLING_INTERVAL_MSECS = 10000; - - public static SCHEDULER_MAX_POLLS = 10; - - public static COMPONENT_LIST_NAMED_QUERY_ID = '0367193e-c785-4d5f-9cb8-7bc89dc9ddb7'; - - /* - * List of all service model invariant UUIDs that need macro instantiation. - * Example: - * MACRO_SERVICES : ['3cf30cbb-5fe7-4fb3-b049-559a4997b221', 'b135a703-bab5-4295-a37f-580a4f2d0961'] - * - */ - public static MACRO_SERVICES = ['c9514b73-3dfe-4d7e-9146-b318d48655d9', '93150ffa-00c6-4ea0-85f2-3536ca46ebd2', - '2b54297f-72e7-4a94-b451-72df88d0be0b', - 'd27e42cf-087e-4d31-88ac-6c4b7585f800', - 'ec0c4bab-c272-4dab-b087-875031bb0c9f', '0311f998-9268-4fd6-bbba-afff15087b72', - '43596836-ae36-4608-a987-6608ede10dac', '306caa85-74c7-48a9-aa22-7e3a564b957a', - 'e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0']; - - public static SCHEDULER_CALLBACK_URL = 'https://vid-web-ete.ecomp.cci.att.com:8000/vid/change-management/workflow/'; - - public static SCHEDULER_PORTAL_URL = 'http://www.ecomp.att.com'; - -} diff --git a/vid-webpack-master/src/app/drawingBoard/available-models-tree/available-models-tree.component.html b/vid-webpack-master/src/app/drawingBoard/available-models-tree/available-models-tree.component.html deleted file mode 100644 index 5eb977325..000000000 --- a/vid-webpack-master/src/app/drawingBoard/available-models-tree/available-models-tree.component.html +++ /dev/null @@ -1,35 +0,0 @@ -<div class="available-models-tree"> - <h5> - <span>SERVICE MODEL:</span> - <span id="service-model-name">{{service | serviceInfo: _store: serviceModelId : 'name'}}</span> - </h5> - <div class="available-models-content-wrapper"> - <div class="search-container"> - <input [attr.data-tests-id]="'search-left-tree'" #filter (keyup)="searchTree(filter.value, $event)" placeholder="Filter..."/> - <span class="icon-search"></span> - </div> - - <tree-root #tree [attr.data-tests-id]="'available-models-tree'" [nodes]="nodes" [options]="options"> - <ng-template #treeNodeTemplate let-node let-index="index"> - <div [attr.data-tests-id]="'node-'+node.data.name" (click)="selectNode(node)" [ngClass]="{'selected': index , 'isParent': node.data.type !== 'VFmodule' , 'isChild': node.data.type === 'VFmodule' }"> - <span class="vf-type">{{node.data.type.substring(0,1)}}</span> - <span class="span-name" [innerHTML]=" isFilterEnabled ? (node.data.name | highlight : filter.value) : (node.data.name)"></span> - <span class="actions"> - <span class="number-button" *ngIf="isShowNodeCount(node)"> - <span>{{getNodeCount(node)}}</span> - </span> - <span class="icon-v" *ngIf="isShowIconV(node)"> - <span ></span> - </span> - <span class="icon-plus" *ngIf="isShowIconAdd(node)"> - <span tooltip="Add" [attr.data-tests-id]="'node-'+node.data.name+'-add-btn'" (click)="onClickAdd($event,node)"> - <i class="fa fa-plus-circle" aria-hidden="true"></i> - </span> - </span> - </span> - </div> - </ng-template> - </tree-root> - - </div> -</div> diff --git a/vid-webpack-master/src/app/drawingBoard/available-models-tree/available-models-tree.component.scss b/vid-webpack-master/src/app/drawingBoard/available-models-tree/available-models-tree.component.scss deleted file mode 100644 index 44f94109a..000000000 --- a/vid-webpack-master/src/app/drawingBoard/available-models-tree/available-models-tree.component.scss +++ /dev/null @@ -1,398 +0,0 @@ -available-models-tree { - .available-models-tree { - height: 100%; - display: flex; - flex-direction: column; - line-height: 14px; - border-right: #D2D2D2 1.5px solid; - min-width: 340px; - h5 { - font-family: OpenSans-Semibold; - color: #5A5A5A; - background-color: #F2F2F2; - margin: 0; - padding: 15px; - padding-left: 20px; - span { - vertical-align: middle; - &:first-child { - font-size: 12px; - color: #191919; - } - } - } - .available-models-content-wrapper { - flex: 1; - display: flex; - flex-direction: column; - padding: 20px; - background-color: #F2F2F2; - .search-container { - margin-bottom: 30px; - width: 100%; - display: flex; - background: #FFFFFF; - border: 1px solid #D2D2D2; - border-radius: 2px; - height: 40px; - min-width: 40px; - font-family: OpenSans-Italic; - color: #959595; - input { - flex: 1; - border: 0; - padding-left: 10px; - outline: 0; - } - .icon-search { - display: flex; - width: 40px; - &:after { - content: "\e92e"; - cursor: pointer; - font-size: 20px; - font-weight: 600; - text-align: center; - display: inline-block; - flex: auto; - align-self: center; - } - } - } - tree-root { - flex: 1; - display: flex; - } - tree-viewport { - flex: 1; - height: auto; - overflow: auto; - padding-top: 5px; - .tree-node { - color: #5A5A5A; - font-size: 13px; - white-space: normal; - word-break: break-all; - tree-node-drop-slot { - .node-drop-slot { - display: none; - } - } - &.tree-node-disabled { - color: #D2D2D2; - cursor: default; - pointer-events: none; - } - &:not(.tree-node-disabled) { - >tree-node-wrapper { - .node-wrapper:hover { - color: #009FDB; - .node-content-wrapper { - tree-node-content { - > div { - span.actions { - .number-button { - span { - //background-color: #009FDB; - } - } - .icon-plus span:before { - display: inline-block; - color: #5A5A5A; - } - } - } - } - } - } - } - } - &.tree-node-focused:not(.tree-node-disabled) { - & > tree-node-wrapper { - .node-wrapper { - color: #009FDB; - .node-content-wrapper-focused, - .node-content-wrapper:hover { - background: none; - box-shadow: none; - tree-node-content { - > div { - span.actions { - .number-button { - span { - //background-color: #009FDB; - } - } - } - } - } - } - } - } - } - tree-node-wrapper { - .node-wrapper { - height: 36px; - tree-node-expander { - font-family: 'icomoon' !important; - height: 100%; - .toggle-children-wrapper { - padding: 0; - display: block; - height: 100%; - span.toggle-children { - display: flex; - width: 20px; - top: 0; - height: inherit; - background-image: none; - &:before { - content: "\e900"; - font-weight: 600; - text-align: center; - display: inline-block; - flex: auto; - align-self: center; - font-size: 20px; - } - } - } - .toggle-children-wrapper-expanded { - span.toggle-children { - transform: none; - &:before { - content: "\e930"; - } - } - } - .toggle-children-placeholder { - width: 20px; - } - } - .node-content-wrapper { - padding: 0; - background: none; - box-shadow: none; - height: 100%; - flex: 1; - min-width: 0; - border-left: 1px solid #D2D2D2; - tree-node-content { - > div { - height: 100%; - display: flex; - align-items: center; - justify-content: space-between; - padding-left: 10px; - span { - &.actions { - height: 100%; - display: flex; - justify-content: space-between; - align-items: center; - >span { - width: 45px; - max-width: 45px; - text-align: center; - } - .number-button { - width: 30px; - padding-left: 0; - text-align: center; - span { - display: block; - font-size: 11px; - } - } - .icon-v { - width: 45px; - span:before { - content: "\e932"; - color: #5A5A5A; - font-size: 16px; - text-align: center; - display: inline-block; - vertical-align: baseline; - } - } - .icon-plus { - width: 45px; - span { - &:before { - //content: "\e901"; - //fill:#009FDB; - //color: #009FDB; - //font-size: 16px; - //text-align: center; - //display: none; - //vertical-align: baseline; - } - &:hover:before { - //color: #009FDB !important; - - } - } - } - } - } - } - } - } - - } - } - tree-node-children { - .tree-children { - padding-left: 20px; - } - } - } - } - - } - } -} -.highlight { - background-color: #9DD9EF; -} - -#drawing-board-tree{ - .tree-node.tree-node-expanded.tree-node-focused { - border: 1px solid #009FDB; - } - -} - -available-models-tree { - - .tree-root { - margin-top: 35px; - } - - tree-node-expander { - background: #FFFFFF; - border: 1px solid #D2D2D2; - border-right: none; - width: 45px; - padding-left: 12px; - } - - .node-content-wrapper { - border: none; - } - - tree-node-wrapper tree-node-expander{ - background: none !important; - border: none !important; - } - - tree-node-content div { - background: white; - } - - .node-wrapper { - height: 45px !important; - background: #FFFFFF; - border: 1px solid #D2D2D2; - } - - tree-node-collection div { - margin-top: 0px; - } - - .tree-node-leaf .node-wrapper tree-node-expander { - display: none; - } - - .tree-children { - padding: 20px; - } - - .tree-node.tree-node-expanded.tree-node-focused { - border: 1px solid #009FDB; - } - - .tree-node.tree-node-expanded { - border: 1px solid rgba(128, 128, 128, 0.72); - margin-bottom: 10px; - } - - .tree-children { - padding-left: 0; - } - - tree-node-content .actions .number-button { - height: 45px; - padding-top: 14px; - border: 1px solid #D2D2D2; - padding-left: 0; - span { - background: none; - font-size: 11px; - color: #5A5A5A; - } - } - - - - .node-content-wrapper.node-content-wrapper-focused tree-node-content div{ - background: #009FDB !important; - color: white; - - .isParent { - border-left: 1px solid #009FDB; - } - - .number-button span{ - color: white !important; - } - - .icon-v span:before{ - color: white !important; - } - } - - .vf-type { - width: 20px; - height: 45px; - padding-top: 16px; - border-right: 1px solid #D2D2D2; - - } - - .isParent { - width: 100%; - padding-left: 5px; - } - - .tree-node-expanded .isChild .vf-type { - display: none; - } - - .isParent .span-name { - width: 100%; - padding-left: 10px; - } - - .toggle-children-wrapper.toggle-children-wrapper-expanded { - .toggle-children:before { - color: #009FDB; - } - } - - .tree-node.tree-node-expanded .tree-children { - border: 1px solid rgba(128, 128, 128, 0.72); - } - - .tree-node.tree-node-expanded.tree-node-focused .tree-children { - border: 1px solid #009fdb; - } - - .tree-node-leaf .node-wrapper{ - margin-left: 45px; - border-left: none; - } -} - - - diff --git a/vid-webpack-master/src/app/drawingBoard/available-models-tree/available-models-tree.component.ts b/vid-webpack-master/src/app/drawingBoard/available-models-tree/available-models-tree.component.ts deleted file mode 100644 index 4e5819e4c..000000000 --- a/vid-webpack-master/src/app/drawingBoard/available-models-tree/available-models-tree.component.ts +++ /dev/null @@ -1,166 +0,0 @@ -import {Component, EventEmitter, Output, ViewChild} from '@angular/core'; -import {ITreeOptions, TreeComponent} from 'angular-tree-component'; -import '../../../../node_modules/angular-tree-component/dist/angular-tree-component.css'; -import {IDType, ITreeNode} from 'angular-tree-component/dist/defs/api'; -import {DialogService} from 'ng2-bootstrap-modal'; -import {AvailableModelsTreeService} from './available-models-tree.service'; -import {NgRedux} from "@angular-redux/store"; -import {ActivatedRoute} from '@angular/router'; -import {AppState} from '../../store/reducers'; -import {AaiService} from '../../services/aaiService/aai.service'; -import {ServicePlanningService} from '../../services/service-planning.service'; -import {VnfPopupComponent} from '../../components/vnf-popup/vnf-popup.components'; -import {ServiceNodeTypes} from '../../shared/models/ServiceNodeTypes'; -import {VfModuleMap} from '../../shared/models/vfModulesMap'; -import {IframeService} from "../../shared/utils/iframe.service"; -import {createVFModuleInstance} from "../../service.actions"; -import {DefaultDataGeneratorService} from "../../shared/services/defaultDataServiceGenerator/default.data.generator.service"; - - -@Component({ - selector: 'available-models-tree', - templateUrl: './available-models-tree.component.html', - styleUrls: ['./available-models-tree.component.scss'] -}) - - -export class AvailableModelsTreeComponent{ - - serviceModelId: string; - serviceHierarchy; - parentElementClassName = 'content'; - _store : NgRedux<AppState>; - constructor(private _servicePlanningService: ServicePlanningService, - private _iframeService: IframeService, - private _aaiService: AaiService, - private route: ActivatedRoute, - private dialogService: DialogService, - private _availableModelsTreeService: AvailableModelsTreeService, - private _defaultDataGeneratorService: DefaultDataGeneratorService, - private store: NgRedux<AppState>) { - this._store = store; - this.route - .queryParams - .subscribe(params => { - this.serviceModelId = params['serviceModelId']; - this._aaiService.getServiceModelById(this.serviceModelId).subscribe( - value => { - this.serviceHierarchy = value; - this.nodes = this._servicePlanningService.convertServiceModelToTreeNodes(this.serviceHierarchy); - }, - error => { - console.log('error is ', error) - } - ); - }); - - } - - @Output() - highlightInstances: EventEmitter<number> = new EventEmitter<number>(); - @ViewChild('tree') tree: TreeComponent; - - nodes = []; - service = {name: ''}; - isFilterEnabled: boolean = false; - - options: ITreeOptions = { - nodeHeight: 36, - dropSlotHeight: 0, - nodeClass: (node: ITreeNode) => { - if(node.data.type === ServiceNodeTypes.VFmodule && !this.getNodeCount(node.parent)) - { - node.data.disabled = true; - return 'tree-node tree-node-disabled'; - } - node.data.disabled = false; - return 'tree-node'; - } - }; - - expandParentByNodeId(id: IDType): void { - this.tree.treeModel.getNodeById(id).parent.expand(); - } - - searchTree(searchText: string, event: KeyboardEvent): void { - if (searchText === '') { - return; - } - this.isFilterEnabled = event.key === 'Delete' || event.key === 'Backspace' || searchText.length > 1; - if (this.isFilterEnabled) { - let __this = this; - let results: ITreeNode[] = []; - this.nodes.forEach(function (node) { - __this.searchTreeNode(node, searchText, results); - }); - results.forEach(function (result) { - __this.expandParentByNodeId(result.id) - }); - } - } - - searchTreeNode(node, searchText: string, results): void { - if (node.name.toLowerCase().indexOf(searchText.toLowerCase()) != -1) { - results.push(node); - } - if (node.children != null) { - for (let i = 0; i < node.children.length; i++) { - this.searchTreeNode(node.children[i], searchText, results); - } - } - } - - selectNode(node: ITreeNode): void { - node.expand(); - this.highlightInstances.emit(node.data.id); - } - - onClickAdd(e: MouseEvent, node: ITreeNode): void { - let data = node.data; - let dynamicInputs = data.dynamicInputs; - let userProvidedNaming:boolean = data.userProvidedNaming; - let type:string = data.type; - if(!this.store.getState().global.flags['FLAG_SETTING_DEFAULTS_IN_DRAWING_BOARD']|| node.data.type === ServiceNodeTypes.VF || this._availableModelsTreeService.shouldOpenDialog(type, dynamicInputs, userProvidedNaming)) { - this._iframeService.addClassOpenModal(this.parentElementClassName); - this.dialogService.addDialog(VnfPopupComponent, { - serviceModelId: this.serviceModelId, - parentModelName: node.parent && node.parent.data.name, - modelName: data.name, - modelType: type, - dynamicInputs: dynamicInputs, - userProvidedNaming: userProvidedNaming, - isNewVfModule : true - }); - } - else { - let vfModule = this._defaultDataGeneratorService.generateVFModule(this.serviceHierarchy, node.parent.data.name, node.data.name); - this.store.dispatch(createVFModuleInstance(vfModule, node.data.name, this.serviceModelId)); - } - e.preventDefault(); - e.stopPropagation(); - } - - getNodeCount(node: ITreeNode): number { - let modelName: string = node.data.name; - if (ServicePlanningService.isVfModule(node)) { - let parentVnfModelName = node.parent.data.name; - let vfModuleMap: VfModuleMap = this._servicePlanningService.getVfModuleMap(this.serviceModelId, parentVnfModelName, modelName); - return vfModuleMap ? Object.keys(vfModuleMap).length : 0; - } else if (ServicePlanningService.isVnf(node)) { - let vnfInstance = this._servicePlanningService.getVnfInstance(this.serviceModelId, modelName); - return vnfInstance ? 1 : 0; - } - } - - isShowIconV(node: ITreeNode): boolean { - return this.getNodeCount(node) > 0; - } - - isShowNodeCount(node: ITreeNode): boolean { - return this.getNodeCount(node) > 0; - } - - isShowIconAdd(node: ITreeNode): boolean { - return this._availableModelsTreeService.shouldShowAddIcon(node, this.store.getState().service.serviceHierarchy, this.serviceModelId, this.getNodeCount(node)); - } -} diff --git a/vid-webpack-master/src/app/drawingBoard/available-models-tree/available-models-tree.service.ts b/vid-webpack-master/src/app/drawingBoard/available-models-tree/available-models-tree.service.ts deleted file mode 100644 index 57dc4b409..000000000 --- a/vid-webpack-master/src/app/drawingBoard/available-models-tree/available-models-tree.service.ts +++ /dev/null @@ -1,36 +0,0 @@ -import {Injectable} from '@angular/core'; -import * as _ from "lodash"; -import {ServicePlanningService} from "../../services/service-planning.service"; - -@Injectable() -export class AvailableModelsTreeService { - constructor(private _servicePlanningService: ServicePlanningService) { - } - - shouldShowAddIcon(node: any, serviceHierarchy: any, serviceModelId: string, currentNodeCount: number): boolean { - let maxNodes: number = 1; - if (node.data.children !== null && node.data.children.length == 0) { - let vnfModules = serviceHierarchy[serviceModelId].vfModules; - if (vnfModules[node.data.name]) { - maxNodes = vnfModules[node.data.name].properties.maxCountInstances || 1; - } - } - return !node.data.disabled && currentNodeCount < maxNodes - } - - shouldOpenDialog(type: string, dynamicInputs: any, userProvidedNaming: boolean): boolean { - if (userProvidedNaming || this._servicePlanningService.requiredFields[type].length > 0) { - return true; - } - - if (dynamicInputs) { - for(let input of dynamicInputs) { - if (input.isRequired && _.isEmpty(input.value)) { - return true; - } - } - } - return false; - } - -} diff --git a/vid-webpack-master/src/app/drawingBoard/drawing-board-header/drawing-board-header.component.html b/vid-webpack-master/src/app/drawingBoard/drawing-board-header/drawing-board-header.component.html deleted file mode 100644 index 7d0f7f456..000000000 --- a/vid-webpack-master/src/app/drawingBoard/drawing-board-header/drawing-board-header.component.html +++ /dev/null @@ -1,33 +0,0 @@ -<div class="drawing-board-header"> - <div class="left-header"> - <span [attr.data-tests-id]="'backBtn'" class="icon-back" (click)="closePage()"></span> - <span [attr.data-tests-id]="'serviceInstance'" class="service-instance-label">Service instance:</span> - <span [attr.data-tests-id]="'serviceName'" class="service-instance-name">{{serviceName}}</span> - <span class="quantity-container" style=" padding: 10px;font-size: 13px;" tooltip="Number of services to instantiate including all their objects as defined below"> - <span [attr.data-tests-id]="'quantityLabel'" class="quantity-label" >Scale Times:</span> - <span [attr.data-tests-id]="'servicesQuantity'" class="quantity" style="font-family: OpenSans-Semibold;font-size: 14px;"> {{numServicesToDeploy}} </span> - </span> - <span class="service-instance-label">status:</span> - <span [attr.data-tests-id]="'serviceStatus'" class="status">{{status}}</span> - </div> - <div class="right-header"> - <span class="menu-container"> - <span [attr.data-tests-id]="'openMenuBtn'" class="icon-browse" (click)="onContextMenu($event)"></span> - <context-menu> - <ng-template contextMenuItem (execute)="editService()"> - <div [attr.data-tests-id]="'context-menu-header-edit-item'"> - <span class="icon-edit"></span> - Edit - </div> - </ng-template> - <ng-template contextMenuItem (execute)="closePage()"> - <div [attr.data-tests-id]="'context-menu-header-delete-item'"> - <span class="icon-trash"></span> - Delete - </div> - </ng-template> - </context-menu> - </span> - <button [disabled]="false" [attr.data-tests-id]="'deployBtn'" (click)="deployMacroservice()" class="deploy-btn">DEPLOY</button> - </div> -</div> diff --git a/vid-webpack-master/src/app/drawingBoard/drawing-board-header/drawing-board-header.component.scss b/vid-webpack-master/src/app/drawingBoard/drawing-board-header/drawing-board-header.component.scss deleted file mode 100644 index 29b7711bc..000000000 --- a/vid-webpack-master/src/app/drawingBoard/drawing-board-header/drawing-board-header.component.scss +++ /dev/null @@ -1,95 +0,0 @@ -.drawing-board-header { - height: 56px; - margin-bottom: 4px; - position: relative; - font-family: OpenSans-Regular; - display: flex; - justify-content: space-between; - font-size: 14px; - box-shadow: 2px 2px 6px #D2D2D2; - color: #191919; - [class^="icon-"] { - height: 56px; - width: 56px; - display: flex; - align-items: center; - text-align: center; - color: #5A5A5A; - cursor: pointer; - &:before { - font-size: 18px; - width: 100%; - } - &:hover:before { - color: #009FDB; - } - } - .left-header { - display: flex; - align-items: center; - .icon-back { - border-right: 1px solid #EAEAEA; - &:before { - content: "\e906"; - font-size: 24px; - } - } - .service-instance-label { - padding: 0 5px; - font-family: OpenSans-Regular; - font-size: 13px; - color: #191919; - } - .service-instance-name { - padding-right: 20px; - color: #191919; - font-family: OpenSans-Semibold; - background-color: white; - font-size: 16px - } - .status { - font-family: OpenSans-Semibold; - line-height: 14px; - font-size: 14px; - } - } - .right-header { - display: flex; - align-items: center; - .quantity-container { - .quantity-label { - padding-left: 10px; - font-family: OpenSans-Semibold; - font-size: 12px; - } - .quantity { - padding: 5px 10px 5px 0; - font-family: OpenSans-Semibold; - font-size: 18px; - } - } - [class^="icon-"] { - border-left: 1px solid #EAEAEA; - } - .menu-container { - height: 100%; - display: flex; - background: none; - border: none; - padding: 0; - outline: none; - } - .icon-browse:before { - content: '\e924'; - display: inline-block; - font-size: 24px; - } - .deploy-btn { - color: #FFFFFF ; - background: #009fdb; - width: 128px; - height: 100%; - border: none; - } - } -} diff --git a/vid-webpack-master/src/app/drawingBoard/drawing-board-header/drawing-board-header.component.ts b/vid-webpack-master/src/app/drawingBoard/drawing-board-header/drawing-board-header.component.ts deleted file mode 100644 index 38284e214..000000000 --- a/vid-webpack-master/src/app/drawingBoard/drawing-board-header/drawing-board-header.component.ts +++ /dev/null @@ -1,119 +0,0 @@ -import {Component, ViewChild} from '@angular/core'; -import {ContextMenuComponent, ContextMenuService} from 'ngx-contextmenu'; -import {DialogService} from 'ng2-bootstrap-modal'; -import {ServicePopupComponent} from '../../components/service-popup/service-popup.component'; -import {MsoService} from '../../services/msoService/mso.service' -import * as _ from 'lodash'; -import {ActivatedRoute} from '@angular/router'; -import {ServiceInstance} from "../../shared/models/serviceInstance"; -import {OwningEntity} from "../../shared/models/owningEntity"; -import {MessageBoxData, ModalSize, ModalType} from "../../shared/components/messageBox/messageBox.data"; -import {MessageBoxService} from "../../shared/components/messageBox/messageBox.service"; -import {NgRedux} from "@angular-redux/store"; -import {AppState} from "../../store/reducers"; -import {IframeService} from "../../shared/utils/iframe.service"; - -@Component({ - selector: 'drawing-board-header', - providers: [MsoService], - templateUrl: './drawing-board-header.component.html', - styleUrls: ['./drawing-board-header.component.scss'] -}) - -export class DrawingBoardHeader { - serviceName: string; - numServicesToDeploy: number; - status: string = 'Designing a new service'; - serviceModelId: string; - parentElementClassName = 'content'; - - constructor(private _contextMenuService: ContextMenuService, private dialogService: DialogService, - private _iframeService : IframeService, - private route: ActivatedRoute, private msoService: MsoService, - private store: NgRedux<AppState>) { - this.route - .queryParams - .subscribe(params => { - this.serviceModelId = params['serviceModelId']; - if (_.has(this.store.getState().service.serviceHierarchy, this.serviceModelId)) { - this.setValuesFromStore(); - this.store.subscribe(() => { - this.setValuesFromStore(); - }); - } - }); - } - - - @ViewChild(ContextMenuComponent) public contextMenu: ContextMenuComponent; - - public onContextMenu($event: MouseEvent, item: any): void { - this._contextMenuService.show.next({ - contextMenu: this.contextMenu, - event: $event, - item: item, - }); - $event.preventDefault(); - $event.stopPropagation(); - } - - private setValuesFromStore() { - const serviceInstance = this.store.getState().service.serviceInstance[this.serviceModelId]; - this.numServicesToDeploy = serviceInstance.bulkSize; - this.serviceName = serviceInstance.instanceName || '<Automatically Assigned>'; - - } - - public editService(): void { - this._iframeService.addClassOpenModal(this.parentElementClassName); - this.dialogService.addDialog(ServicePopupComponent, {}) - - } - - - extractOwningEntityNameAccordingtoId(id:String): string { - let owningEntityName; - _.forEach(this.store.getState().service.categoryParameters.owningEntityList,function(owningEntity: OwningEntity) { - if (owningEntity.id === id) { - owningEntityName = owningEntity.name; - - }}) - - return owningEntityName; - } - - extractServiceFields(): any { - let instanceFields : ServiceInstance; - instanceFields = this.store.getState().service.serviceInstance[Object.keys(this.store.getState().service.serviceInstance)[0]]; - instanceFields.subscriberName = this.store.getState().service.subscribers.find(sub => sub.id === instanceFields.globalSubscriberId).name; - instanceFields.owningEntityName = this.extractOwningEntityNameAccordingtoId(instanceFields.owningEntityId); - return instanceFields; - } - - public deployMacroservice(): void { - var instanceFields = this.extractServiceFields(); - instanceFields.rollbackOnFailure = instanceFields.rollbackOnFailure === 'true'; - this.msoService.submitMsoTask(instanceFields).subscribe((result) => { - window.parent.postMessage("navigateToInstantiationStatus", '*'); - }) - } - - closePage() { - let messageBoxData : MessageBoxData = new MessageBoxData( - "Delete Instantiation", // modal title - "You are about to stop the instantiation process of this service. \nAll data will be lost. Are you sure you want to stop?", - - ModalType.alert, - ModalSize.medium, - [ - {text:"Stop Instantiation", size:"large", callback: this.navigate.bind(this), closeModal:true}, - {text:"Cancel", size:"medium", closeModal:true} - ]); - - MessageBoxService.openModal.next(messageBoxData); - } - - navigate(){ - window.parent.postMessage("navigateTo", "*"); - } -} diff --git a/vid-webpack-master/src/app/drawingBoard/drawing-board-tree/drawing-board-tree.component.ts b/vid-webpack-master/src/app/drawingBoard/drawing-board-tree/drawing-board-tree.component.ts deleted file mode 100644 index 6b717a930..000000000 --- a/vid-webpack-master/src/app/drawingBoard/drawing-board-tree/drawing-board-tree.component.ts +++ /dev/null @@ -1,133 +0,0 @@ -import {AfterViewInit, Component, EventEmitter, OnInit, Output, ViewChild} from '@angular/core'; -import { ContextMenuService } from 'ngx-contextmenu'; -import { Constants } from '../../shared/utils/constants'; -import {ServicePlanningService} from "../../services/service-planning.service"; -import {ITreeNode} from "angular-tree-component/dist/defs/api"; -import {ITreeOptions, TreeComponent} from "angular-tree-component"; -import {VnfPopupComponent} from "../../components/vnf-popup/vnf-popup.components"; -import {DialogService} from "ng2-bootstrap-modal"; -import {ActivatedRoute} from "@angular/router"; -import {NgRedux} from "@angular-redux/store"; -import {AppState} from "../../store/reducers"; -import { MessageBoxData, ModalSize, ModalType } from '../../shared/components/messageBox/messageBox.data'; -import { MessageBoxService } from '../../shared/components/messageBox/messageBox.service'; -import { deleteVnfInstance, deleteVfModuleInstance } from '../../service.actions'; -import { isNullOrUndefined } from 'util'; -import {IframeService} from "../../shared/utils/iframe.service"; - - -@Component({ - selector: 'drawing-board-tree', - templateUrl: './drawing-board-tree.html', - styleUrls : ['./drawing-board-tree.scss'] -}) - - -export class DrawingBoardTreeComponent implements OnInit, AfterViewInit { - constructor(private _contextMenuService: ContextMenuService, - private _servicePlanningService: ServicePlanningService, - private _iframeService : IframeService, - private dialogService: DialogService, - private store: NgRedux<AppState>, - private route: ActivatedRoute) { - this.route - .queryParams - .subscribe(params => { - this.serviceModelId = params['serviceModelId']; - }); - } - - @Output() - highlightNode : EventEmitter<number> = new EventEmitter<number>(); - - @ViewChild('tree') tree: TreeComponent; - missingDataTooltip: string = Constants.Error.MISSING_VNF_DETAILS; - currentNode: ITreeNode = null; // - nodes = []; - serviceModelId: string; - options: ITreeOptions = { - nodeHeight: 45, - dropSlotHeight: 1 - }; - parentElementClassName = 'content'; - - ngOnInit(): void { - this.store.subscribe(() => {this.updateTree()}); - this.updateTree() - } - - updateTree() { - const serviceInstance = this.store.getState().service.serviceInstance[this.serviceModelId]; - this.nodes = this._servicePlanningService.convertServiceInstanceToTreeData(serviceInstance, this.serviceModelId); - } - - ngAfterViewInit():void { - // Expand drawing tree on init. - this.tree.treeModel.expandAll(); - } - - public onContextMenu($event: MouseEvent, node: ITreeNode): void { - this.currentNode = node; - node.focus(); - node.setActiveAndVisible(false); - this.selectNode(node); - this._contextMenuService.show.next({ - event: <any>$event, - item: node, - }); - $event.preventDefault(); - $event.stopPropagation(); - } - - public editItem(node: ITreeNode): void { - node = this.currentNode; - this._iframeService.addClassOpenModal(this.parentElementClassName); - this.dialogService.addDialog(VnfPopupComponent, { - serviceModelId: this.serviceModelId, - modelName: node.data.modelName, - modelType: node.data.type, - parentModelName: node.parent.data.modelName, - isNewVfModule : false - }) - } - - public deleteItem(node: ITreeNode): void { - if(this.currentNode.data.type === 'VF'){ - if(!isNullOrUndefined(this.currentNode.data.children) && this.currentNode.data.children.length === 0){ - this.store.dispatch(deleteVnfInstance(this.currentNode.data.modelName, this.serviceModelId)); - }else { - let messageBoxData : MessageBoxData = new MessageBoxData( - "Remove VNF", // modal title - "You are about to remove this VNF and all its children from this service. Are you sure you want to remove it?", - - ModalType.alert, - ModalSize.medium, - [ - {text:"Remove VNF", size:"large", callback: this.removeVnf.bind(this), closeModal:true}, - {text:"Don’t Remove", size:"medium", closeModal:true} - ]); - - MessageBoxService.openModal.next(messageBoxData); - } - }else { - this.store.dispatch(deleteVfModuleInstance(this.currentNode.data.modelName, this.serviceModelId, node.parent.data.modelName)); - } - } - - removeVnf() { - this.store.dispatch(deleteVnfInstance(this.currentNode.data.modelName, this.serviceModelId)); - } - - public selectNode(node: ITreeNode): void { - node.expand(); - this.highlightNode.emit(node.data.modelId); - } - - isDataMissing(node: ITreeNode) { - //todo: currently not showing the alert icon. will be implemented in upcoming story. - return false; - } - -} - - diff --git a/vid-webpack-master/src/app/drawingBoard/drawing-board-tree/drawing-board-tree.html b/vid-webpack-master/src/app/drawingBoard/drawing-board-tree/drawing-board-tree.html deleted file mode 100644 index c4061db9e..000000000 --- a/vid-webpack-master/src/app/drawingBoard/drawing-board-tree/drawing-board-tree.html +++ /dev/null @@ -1,42 +0,0 @@ -<div class="drawing-board-tree"> - <div *ngIf="nodes?.length == 0" style="text-align: center; margin-top: 50px;"> - <no-content-message-and-icon class="span-over" - data-title="Please add objects (VNFs, network, modules etc.) from the left tree to design the service instance" - subtitle="Once done, click Deploy to start instantiation" - iconPath="./assets/img/UPLOAD.svg" - iconClass="upload-icon-service-planing"></no-content-message-and-icon> - </div> - <tree-root [attr.data-tests-id]="'drawing-board-tree'" #tree [nodes]="nodes" [options]="options" id="drawing-board-tree"> - <ng-template #treeNodeTemplate let-node let-index="index"> - <div [attr.data-tests-id]="'node-'+node.data.modelId +'-' +node.data.modelName" (click)="selectNode(node)"> - <div class="model-info"> - <span> - <span class="property-name">{{node.data.type}}{{node.data.name ? ': ': ''}}<span class="auto-name">{{node.data.name? node.data.name: ''}}</span></span> - </span> - </div> - <div class="model-actions"> - <span class="icon-browse" [attr.data-tests-id]="'node-'+node.data.modelId +'-' +node.data.modelName+'-menu-btn'" (click)="onContextMenu($event, node)" > - <context-menu> - <ng-template contextMenuItem (execute)="editItem(node)"> - <div [attr.data-tests-id]="'context-menu-item'"> - <span class="icon-edit"></span> - Edit - </div> - </ng-template> - <ng-template contextMenuItem (execute)="deleteItem(node)"> - <div> - <span class="icon-trash"></span> - Remove - </div> - </ng-template> - </context-menu> - </span> - <span *ngIf="isDataMissing(node)" class="icon-alert" tooltip="{{ missingDataTooltip }}" tooltipPlacement="left" [attr.data-tests-id]="'node-'+node.data.modelId +'-' +node.data.modelName+'-alert-icon'"></span> - </div> - </div> - - </ng-template> - </tree-root> -</div> - - diff --git a/vid-webpack-master/src/app/drawingBoard/drawingBoard.module.ts b/vid-webpack-master/src/app/drawingBoard/drawingBoard.module.ts index 41efbe0e8..6a3574f23 100644 --- a/vid-webpack-master/src/app/drawingBoard/drawingBoard.module.ts +++ b/vid-webpack-master/src/app/drawingBoard/drawingBoard.module.ts @@ -1,41 +1,86 @@ -import { AvailableModelsTreeService } from './available-models-tree/available-models-tree.service'; -import { NgModule } from '@angular/core'; -import { HighlightPipe } from '../shared/pipes/highlight-filter.pipe'; -import { TreeModule } from 'angular-tree-component'; -import { BrowserModule } from '@angular/platform-browser'; -import { TooltipModule } from 'ngx-tooltip'; -import { AvailableModelsTreeComponent } from './available-models-tree/available-models-tree.component'; -import { ServicePlanningService } from '../services/service-planning.service'; -import { AaiService } from '../services/aaiService/aai.service'; -import { DrawingBoardTreeComponent } from './drawing-board-tree/drawing-board-tree.component'; -import { SharedModule } from '../shared/shared.module'; -import { ContextMenuModule, ContextMenuService } from 'ngx-contextmenu'; -import { CommonModule } from '@angular/common'; -import { DrawingBoardHeader } from './drawing-board-header/drawing-board-header.component'; -import { ServicePlanningComponent, ServicePlanningEmptyComponent } from './service-planning/service-planning.component'; +import {AvailableModelsTreeService} from './service-planning/available-models-tree/available-models-tree.service'; +import {HighlightPipe} from '../shared/pipes/highlight/highlight-filter.pipe'; +import {TreeModule} from 'angular-tree-component'; +import {BrowserModule} from '@angular/platform-browser'; +import {TooltipModule} from 'ngx-tooltip'; +import {AvailableModelsTreeComponent} from './service-planning/available-models-tree/available-models-tree.component'; +import {AaiService} from '../shared/services/aaiService/aai.service'; +import {DrawingBoardTreeComponent} from './service-planning/drawing-board-tree/drawing-board-tree.component'; +import {SharedModule} from '../shared/shared.module'; +import {ContextMenuModule, ContextMenuService} from 'ngx-contextmenu'; +import {CommonModule} from '@angular/common'; +import {DrawingBoardHeader} from './service-planning/drawing-board-header/drawing-board-header.component'; +import {ServicePlanningComponent, ServicePlanningEmptyComponent} from './service-planning/service-planning.component'; +import {DuplicateVnfComponent} from './service-planning/duplicate/duplicate-vnf.component'; +import {DuplicateService} from './service-planning/duplicate/duplicate.service'; +import {FormsModule} from '@angular/forms'; +import {DrawingBoardTreeService} from "./service-planning/drawing-board-tree/drawing-board-tree.service"; +import {DrawingBoardHeaderService} from "./service-planning/drawing-board-header/drawing-board-header.service"; +import {TreeNodeHeaderPropertiesComponent} from "./service-planning/drawing-board-tree/tree-node-header-properties/tree-node-header-properties.component"; +import {SafePipe} from "../shared/pipes/safe/safe.pipe"; +import {FeatureFlagModule} from "../featureFlag/featureFlag.module"; +import {DynamicInputsService} from "./service-planning/objectsToTree/dynamicInputs.service"; +import {InstanceTreeGenerator} from "./service-planning/drawing-board-tree/instance.tree.generator"; +import {SharedTreeService} from "./service-planning/objectsToTree/shared.tree.service"; +import {ObjectToModelTreeService} from "./service-planning/objectsToTree/objectToModelTree/objectToModelTree.service"; +import {ObjectToInstanceTreeService} from "./service-planning/objectsToTree/objectToInstanceTree/objectToInstanceTree.service"; +import {ObjectToTreeService} from "./service-planning/objectsToTree/objectToTree.service"; +import {SearchComponent} from "./service-planning/search/search.component"; +import {SdcUiComponentsModule} from "onap-ui-angular"; +import {DrawingBoardPermissions} from "./guards/servicePlanningGuard/drawingBoardGuard"; +import {NgModule} from '@angular/core'; +import {DragAndDropService} from "./service-planning/drawing-board-tree/dragAndDrop/dragAndDrop.service"; +import {SdcUiServices} from "onap-ui-angular/dist"; +import {CreateDynamicComponentService} from "onap-ui-angular/dist/utils/create-dynamic-component.service"; +import {ComponentInfoComponent} from './service-planning/component-info/component-info.component'; +import {ComponentInfoService} from "./service-planning/component-info/component-info.service"; + @NgModule({ imports: [ TreeModule, BrowserModule, ContextMenuModule, + FormsModule, TooltipModule, CommonModule, - SharedModule.forRoot()], + SdcUiComponentsModule, + SharedModule.forRoot(), + FeatureFlagModule.forRoot()], providers: [ - ServicePlanningService, AaiService, - AvailableModelsTreeService , + ObjectToTreeService, + AvailableModelsTreeService, ContextMenuService, - ServicePlanningService], + DuplicateService, + DrawingBoardTreeService, + DrawingBoardHeaderService, + DrawingBoardPermissions, + SafePipe, + ObjectToInstanceTreeService, + ObjectToModelTreeService, + DynamicInputsService, + InstanceTreeGenerator, + SharedTreeService, + SdcUiServices.ModalService, + SdcUiServices.LoaderService, + CreateDynamicComponentService, + ComponentInfoService, + DragAndDropService], declarations: [ AvailableModelsTreeComponent, HighlightPipe, DrawingBoardTreeComponent, DrawingBoardHeader, ServicePlanningComponent, - ServicePlanningEmptyComponent], - exports: [ AvailableModelsTreeComponent, DrawingBoardTreeComponent, DrawingBoardHeader] + ServicePlanningEmptyComponent, + DuplicateVnfComponent, + TreeNodeHeaderPropertiesComponent, + SearchComponent, + ComponentInfoComponent], + entryComponents: [DuplicateVnfComponent], + exports: [AvailableModelsTreeComponent, DrawingBoardTreeComponent, DrawingBoardHeader, TreeNodeHeaderPropertiesComponent, SearchComponent] }) -export class DrawingBoardModule { } +export class DrawingBoardModule { +} diff --git a/vid-webpack-master/src/app/drawingBoard/drawingBoard.routing.ts b/vid-webpack-master/src/app/drawingBoard/drawingBoard.routing.ts new file mode 100644 index 000000000..0c1fa700c --- /dev/null +++ b/vid-webpack-master/src/app/drawingBoard/drawingBoard.routing.ts @@ -0,0 +1,63 @@ +import {Route} from '@angular/router'; +import {ServicePlanningComponent, ServicePlanningEmptyComponent} from "./service-planning/service-planning.component"; +import {FlagsResolve} from "../shared/resolvers/flag/flag.resolver"; +import {ViewEditResolver} from "../shared/resolvers/viewEdit/viewEdit.resolver"; +import {DrawingBoardGuard} from "./guards/servicePlanningGuard/drawingBoardGuard"; +import {RetryResolver} from "../shared/resolvers/retry/retry.resolver"; + +export const DrawingBoardRoutes: Route[] = [ + { + path: 'servicePlanning', + children: [ + { + path: 'EDIT', + component: ServicePlanningComponent, + resolve: { + flags: FlagsResolve, + viewEditResolver: ViewEditResolver + }, + canActivate: [DrawingBoardGuard] + }, + { + path: 'VIEW', + component: ServicePlanningComponent, + resolve: { + flags: FlagsResolve, + viewEditResolver: ViewEditResolver + } + }, + { + path: 'RETRY_EDIT', + component: ServicePlanningComponent, + resolve: { + flags: FlagsResolve, + viewEditResolver: RetryResolver + }, + canActivate: [DrawingBoardGuard] + }, + { + path: 'RETRY', + component: ServicePlanningComponent, + resolve: { + flags: FlagsResolve, + viewEditResolver: RetryResolver + } + }, + { + path: '', + component: ServicePlanningComponent, + resolve: { + flags: FlagsResolve + }, + } + ] + }, + { + path: 'servicePlanningEmpty', + component: ServicePlanningEmptyComponent, + resolve: { + flags: FlagsResolve, + } + }, +]; + diff --git a/vid-webpack-master/src/app/drawingBoard/guards/servicePlanningGuard/drawingBoardGuard.ts b/vid-webpack-master/src/app/drawingBoard/guards/servicePlanningGuard/drawingBoardGuard.ts new file mode 100644 index 000000000..4a305b193 --- /dev/null +++ b/vid-webpack-master/src/app/drawingBoard/guards/servicePlanningGuard/drawingBoardGuard.ts @@ -0,0 +1,56 @@ +import {Injectable} from "@angular/core"; +import {CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot, Router} from "@angular/router"; +import {NgRedux} from "@angular-redux/store"; +import {Observable} from "rxjs"; +import {HttpClient} from "@angular/common/http"; +import {AppState} from "../../../shared/store/reducers"; +import {updateDrawingBoardStatus} from "../../../shared/storeUtil/utils/global/global.actions"; +import {DrawingBoardModes} from "../../service-planning/drawing-board.modes"; +import {of} from "rxjs"; + +@Injectable() +export class DrawingBoardGuard implements CanActivate { + constructor(private store: NgRedux<AppState>, private _http: HttpClient, private _router : Router) { } + canActivate(next: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> { + let url : string = `/vid/roles/service_permissions?subscriberId=${next.queryParams['subscriberId']}&serviceType=${next.queryParams['serviceType']}`; + const viewMode = state.url.includes(DrawingBoardModes.RETRY_EDIT)? DrawingBoardModes.RETRY: DrawingBoardModes.VIEW; + return this._http.get(url) + .map((result : DrawingBoardPermissions) => { + if(!result.isEditPermitted){ + this.navigateToNewViewEdit(next.queryParams, viewMode); + return false; + }else { + return true; + } + }).catch(err => { + this.navigateToNewViewEdit(next.queryParams, viewMode); + return of(false); + }); + } + + navigateToNewViewEdit(queryParams: any, mode: DrawingBoardModes): void{ + this.store.dispatch(updateDrawingBoardStatus(mode)); + const viewEditUrlTree = this.getNewViewEditUrlTree(queryParams, mode); + this._router.navigateByUrl(viewEditUrlTree); + window.parent.location.assign('../../serviceModels.htm#'+viewEditUrlTree.toString()); + } + + getNewViewEditUrlTree(queryParams: any, mode: DrawingBoardModes) { + return this._router.createUrlTree( + ['/servicePlanning/' + mode], + { + queryParams: + { + serviceModelId: queryParams['serviceModelId'], + serviceInstanceId: queryParams['serviceInstanceId'], + serviceType : queryParams['serviceType'], + subscriberId : queryParams['subscriberId'], + jobId : queryParams['jobId'], + } + }); + } +} + +export class DrawingBoardPermissions { + isEditPermitted : boolean +} diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/available-models-tree/available-models-tree.component.html b/vid-webpack-master/src/app/drawingBoard/service-planning/available-models-tree/available-models-tree.component.html new file mode 100644 index 000000000..91acca0d1 --- /dev/null +++ b/vid-webpack-master/src/app/drawingBoard/service-planning/available-models-tree/available-models-tree.component.html @@ -0,0 +1,47 @@ +<div class="available-models-tree" style="height: calc(100vh - 55px);"> + <div class="models-tree-header"> + <h5> + <span class="main" >MODEL <span class="sub-title">(from SDC)</span>:</span> + <span id="service-model-name">{{service | serviceInfo: _store: serviceModelId : 'name'}}</span> + </h5> + <search-component (updateNodes)="updateNodes($event)" + [nodes]="nodes" [tree]="tree? tree: {}" + [inputTestId]="'search-left-tree'" + *ngIf="nodes?.length > 0"></search-component> + </div> + <div class="available-models-content-wrapper" *ngIf="nodes?.length > 0" > + <tree-root #tree [attr.data-tests-id]="'available-models-tree'" [nodes]="nodes" [options]="options" id="available-models-tree"> + <ng-template #treeNodeTemplate let-node let-index="index"> + <div [attr.data-tests-id]="'node-'+node.data.name" (click)="selectNode(node)" [ngClass]="{'selected': index , 'isParent': node.data.type !== 'VFmodule' , 'isChild': node.data.type === 'VFmodule' }"> + <span class="vf-type" title="{{node.data.type}}" [attr.data-tests-id]="'node-type-indicator'" >{{node?.data?.typeName}}</span> + <div class="model-info"> + <span class="header-info"> + <span class="property-name"> + <span class="auto-name" + [innerHtml]="getNodeName(node, filterValue) | safe : 'html'" + [attr.data-tests-id]="'node-name'" + ></span> + </span> + </span> + </div> + <span class="actions"> + <span class="number-button" *ngIf="node.data.getNodeCount(node, serviceModelId) > 0"> + <span [attr.data-tests-id]="'numberButton'">{{node.data.getNodeCount(node, this.serviceModelId)}}</span> + </span> + <span class="icon-v" *ngIf="node?.data?.showNodeIcons(node, serviceModelId)?.vIcon"> + <svg-icon + [mode]="'secondary'" + [name]="'maximum'"> + </svg-icon> + </span> + <span class="icon-plus" *ngIf="node?.data?.showNodeIcons(node, serviceModelId)?.addIcon"> + <span tooltip="Add" [attr.data-tests-id]="'node-'+node.data.name+'-add-btn'" (click)="onClickAdd(node, serviceModelId)"> + <i class="fa fa-plus-circle" aria-hidden="true"></i> + </span> + </span> + </span> + </div> + </ng-template> + </tree-root> + </div> +</div> diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/available-models-tree/available-models-tree.component.scss b/vid-webpack-master/src/app/drawingBoard/service-planning/available-models-tree/available-models-tree.component.scss new file mode 100644 index 000000000..90c2cd878 --- /dev/null +++ b/vid-webpack-master/src/app/drawingBoard/service-planning/available-models-tree/available-models-tree.component.scss @@ -0,0 +1,506 @@ +.tree-children.tree-children-no-padding { padding-left: 0 } +.tree-children { padding-left: 20px; overflow: hidden } +.node-drop-slot { display: block; height: 2px } +.node-drop-slot.is-dragging-over { background: #ddffee; height: 20px; border: 2px dotted #888; } +.toggle-children-wrapper-expanded .toggle-children { transform: rotate(90deg) } +.toggle-children-wrapper-collapsed .toggle-children { transform: rotate(0); } +.toggle-children-wrapper { + padding: 2px 3px 5px 1px; +} +/* tslint:disable */ +.toggle-children { + background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAASCAYAAABSO15qAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAABAhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMDY3IDc5LjE1Nzc0NywgMjAxNS8wMy8zMC0yMzo0MDo0MiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ1dWlkOjY1RTYzOTA2ODZDRjExREJBNkUyRDg4N0NFQUNCNDA3IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkYzRkRFQjcxODUzNTExRTU4RTQwRkQwODFEOUZEMEE3IiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkYzRkRFQjcwODUzNTExRTU4RTQwRkQwODFEOUZEMEE3IiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE1IChNYWNpbnRvc2gpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MTk5NzA1OGEtZDI3OC00NDZkLWE4ODgtNGM4MGQ4YWI1NzNmIiBzdFJlZjpkb2N1bWVudElEPSJhZG9iZTpkb2NpZDpwaG90b3Nob3A6YzRkZmQxMGMtY2NlNS0xMTc4LWE5OGQtY2NkZmM5ODk5YWYwIi8+IDxkYzp0aXRsZT4gPHJkZjpBbHQ+IDxyZGY6bGkgeG1sOmxhbmc9IngtZGVmYXVsdCI+Z2x5cGhpY29uczwvcmRmOmxpPiA8L3JkZjpBbHQ+IDwvZGM6dGl0bGU+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+5iogFwAAAGhJREFUeNpiYGBgKABigf///zOQg0EARH4A4gZyDIIZ8B/JoAJKDIDhB0CcQIkBRBtEyABkgxwoMQCGD6AbRKoBGAYxQgXIBRuZGKgAKPIC3QLxArnRSHZCIjspk52ZKMrOFBUoAAEGAKnq593MQAZtAAAAAElFTkSuQmCC'); + height: 8px; + width: 9px; + background-size: contain; + display: inline-block; + position: relative; + top: 1px; + background-repeat: no-repeat; + background-position: center; +} +.toggle-children-placeholder { + display: inline-block; + height: 10px; + width: 10px; + position: relative; + top: 1px; + padding-right: 3px; +} +.node-content-wrapper { + display: inline-block; + padding: 2px 5px; + border-radius: 2px; + transition: background-color .15s,box-shadow .15s; +} +.node-wrapper {display: flex; align-items: flex-start;} +.node-content-wrapper-active, +.node-content-wrapper.node-content-wrapper-active:hover, +.node-content-wrapper-active.node-content-wrapper-focused { + background: #beebff; +} +.node-content-wrapper-focused { background: #e7f4f9 } +.node-content-wrapper:hover { background: #f7fbff } +.node-content-wrapper-active, .node-content-wrapper-focused, .node-content-wrapper:hover { + box-shadow: inset 0 0 1px #999; +} +.node-content-wrapper.is-dragging-over { background: #ddffee; box-shadow: inset 0 0 1px #999; } +.node-content-wrapper.is-dragging-over-disabled { opacity: 0.5 } + +tree-viewport { + height: 100%; + overflow: auto; + display: block; +} +.tree-children { padding-left: 20px } +.empty-tree-drop-slot .node-drop-slot { height: 20px; min-width: 100px } +.angular-tree-component { + width: 100%; + position:relative; + display: inline-block; + cursor: pointer; + -webkit-touch-callout: none; /* iOS Safari */ + -webkit-user-select: none; /* Chrome/Safari/Opera */ + -khtml-user-select: none; /* Konqueror */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE/Edge */ + user-select: none; /* non-prefixed version, currently not supported by any browser */ +} + +tree-root .angular-tree-component-rtl { + direction: rtl; +} +tree-root .angular-tree-component-rtl .toggle-children-wrapper-collapsed .toggle-children { + transform: rotate(180deg) !important; +} +tree-root .angular-tree-component-rtl .tree-children { + padding-right: 20px; + padding-left: 0; +} + +tree-node-checkbox { + padding: 1px; +} + + +available-models-tree { + height: 100%; + &.left-side{ + background: #F2F2F2; + padding: 0; + border-right: #D2D2D2 1px solid; + max-width: 690px; + } + + .available-models-tree { + display: flex; + flex-direction: column; + line-height: 14px; + min-width: 340px; + padding: 30px; + height: 100%; + .models-tree-header { + display: flex; + justify-content: space-between; + + h5 { + margin: 0; + font-family: OpenSans-Semibold; + color: #191919; + font-size: 16px; + + span { + vertical-align: middle; + display: inline-block; + font-size: 16px; + color: #191919; + line-height: 16px; + &.sub-title { + font-family: OpenSans-Regular; + font-size: 14px; + color: #0D0D0D; + } + } + + #service-model-name { + padding-top: 5px; + display: block; + font-size: 14px; + } + } + + .search-container { + width: 275px; + } + } + .available-models-content-wrapper { + flex: 1; + display: flex; + flex-direction: column; + margin-top: 20px; + + + tree-root { + flex: 1; + display: flex; + } + tree-viewport { + flex: 1; + .tree-node { + color: #5A5A5A; + font-size: 13px; + white-space: normal; + word-break: break-all; + tree-node-drop-slot { + .node-drop-slot { + display: none; + } + } + &.tree-node-disabled { + color: #D2D2D2; + cursor: default; + pointer-events: none; + } + &:not(.tree-node-disabled) { + >tree-node-wrapper { + .node-wrapper:hover { + color: #191919; + .node-content-wrapper.node-content-wrapper-focused { + tree-node-content { + > div { + background: #009FDB; + color: white; + } + } + } + .node-content-wrapper { + tree-node-content { + > div { + background: #F2F2F2; + &.tree-node-focused:not(.tree-node-disabled) { + background: #009FDB; + color: white; + } + span.actions { + .icon-plus{ + display: block; + color: #009FDB; + span:before { + display: inline-block; + color: #5A5A5A; + } + } + } + } + } + } + } + } + } + &.tree-node-focused:not(.tree-node-disabled) { + & > tree-node-wrapper { + .node-wrapper { + border-color: #1EB9F3; + .node-content-wrapper{ + background: #009FDB; + border-color: #1EB9F3; + } + .node-content-wrapper-focused{ + box-shadow: none; + tree-node-content { + + .vf-type{ + color: #ffffff; + border-color: #1EB9F3; + } + > div { + span.actions { + .icon-plus { + color: #ffffff; + } + } + } + } + } + } + } + } + tree-node-wrapper { + .node-wrapper { + height: 36px; + tree-node-expander { + font-family: 'icomoon' !important; + height: 100%; + .toggle-children-wrapper { + padding: 0; + display: block; + height: 100%; + span.toggle-children { + display: flex; + width: 20px; + top: 0; + height: inherit; + background-image: none; + &:before { + content: "\e900"; + font-weight: 600; + text-align: center; + display: inline-block; + flex: auto; + align-self: center; + font-size: 20px; + } + } + } + .toggle-children-wrapper-expanded { + span.toggle-children { + transform: none; + &:before { + content: "\e930"; + } + } + } + .toggle-children-placeholder { + width: 20px; + } + } + .node-content-wrapper { + padding: 0; + background: none; + box-shadow: none; + height: 100%; + flex: 1; + min-width: 0; + border-left: 1px solid #D2D2D2; + tree-node-content { + > div { + height: 100%; + display: flex; + align-items: center; + justify-content: space-between; + span { + &.actions { + height: 100%; + display: flex; + justify-content: space-between; + align-items: center; + >span { + width: 45px; + max-width: 45px; + text-align: center; + } + .number-button { + width: 30px; + padding-left: 0; + text-align: center; + span { + display: block; + font-family: OpenSans-SemiBold; + font-size: 13px; + color: #5A5A5A; + line-height: 16px; + } + } + .icon-plus { + display: none; + width: 45px; + font-size: 22px; + } + } + } + } + } + } + + } + } + } + & > tree-node-collection > tree-node > .node-wrapper{ + //border-top: 1px solid #D2D2D2; + } + } + + } + } +} +.highlight { + background-color: #9DD9EF; +} + +#drawing-board-tree{ + .tree-node.tree-node-expanded.tree-node-focused { + } +} + +available-models-tree { + + .tree-root { + margin-top: 35px; + } + + tree-node-expander { + background: #FFFFFF; + border: 1px solid #D2D2D2; + border-right: none; + width: 45px; + padding-left: 12px; + } + + .node-content-wrapper { + border: none; + } + + tree-node-wrapper tree-node-expander{ + background: none !important; + border: none !important; + } + + + .node-wrapper { + height: 45px !important; + background: #FFFFFF; + border: 1px solid #D2D2D2; + } + + tree-node-collection div { + margin-top: 0px; + } + + .tree-node-leaf .node-wrapper tree-node-expander { + display: none; + } + + .tree-node.tree-node-expanded { + margin-bottom: 10px; + } + .tree-node-collapsed { + margin-bottom: 10px; + } + .tree-children { + padding-left: 0; + } + + tree-node-content .actions .number-button { + height: 45px; + padding-top: 14px; + border-right: 1px solid #D2D2D2; + border-left: 1px solid #D2D2D2; + padding-left: 0; + span { + background: none; + font-size: 11px; + color: #5A5A5A; + } + } + + .node-content-wrapper.node-content-wrapper-focused{ + border-color:#1EB9F3 ; + tree-node-content > div{ + .vf-type,.model-info,.model-info .property-name { + color: white; + } + .number-button{ + border-color: #1EB9F3 ; + span{ + color: white !important; + } + } + + } + } + + + + .vf-type { + width: 40px; + height: 45px; + padding-top: 16px; + border-right: 1px solid #D2D2D2; + color: #959595; + font-size: 13px; + font-family: OpenSans-SemiBold; + text-transform: uppercase; + text-align: center; + flex-basis: 40px; + flex-grow: 0; + flex-shrink: 0; + } + + .isParent { + width: 100%; + padding-left: 0 !important; + } + .model-info { + padding-left: 16px; + width: 100%; + .property-name { + font-family: OpenSans-Regular; + font-size: 12px; + line-height: 12px; + color: #191919; + //text-transform: capitalize; problematic with search + .auto-name{ + display: inline-flex;//required for search more then one sub highlight + } + } + + tree-node-header-properties { + display: none; + } + } + + .span-name { + margin-right: auto; + padding-left: 10px; + } + + .toggle-children-wrapper.toggle-children-wrapper-expanded { + .toggle-children:before { + color: #009FDB; + } + } + + .tree-node.tree-node-expanded .tree-children { + } + + .tree-node.tree-node-expanded.tree-node-focused .tree-children { + + } + + .tree-node.tree-node-expanded > tree-node-wrapper{ + box-shadow: 0 2px 2px 0 rgba(0,0,0,.1); + position: relative; + z-index: 1; + display: block; + } + + .tree-node-leaf .node-wrapper{ + margin-left: 46px; + border-left: none; + } + .tree-children .tree-node-leaf .node-wrapper{ + margin-left: 86px; + } +} + +@media (max-width: 992px) { + available-models-tree{ + //width: 40%; + max-width: 690px; + } + drawing-board-tree{ + //width: 60%; + } +} + +@media (min-width: 992px) { + available-models-tree{ + //width: 50%; + max-width: 650px; + } + drawing-board-tree{ + //width: 50%; + } +} + + diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/available-models-tree/available-models-tree.component.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/available-models-tree/available-models-tree.component.ts new file mode 100644 index 000000000..31d7b03b8 --- /dev/null +++ b/vid-webpack-master/src/app/drawingBoard/service-planning/available-models-tree/available-models-tree.component.ts @@ -0,0 +1,167 @@ +import {Component, EventEmitter, Output, ViewChild} from '@angular/core'; +import {ITreeOptions, TreeComponent} from 'angular-tree-component'; +import {IDType, ITreeNode} from 'angular-tree-component/dist/defs/api'; +import {DialogService} from 'ng2-bootstrap-modal'; +import {AvailableModelsTreeService} from './available-models-tree.service'; +import {NgRedux} from "@angular-redux/store"; +import {ActivatedRoute} from '@angular/router'; +import {AppState} from '../../../shared/store/reducers'; +import {AaiService} from '../../../shared/services/aaiService/aai.service'; +import {ServiceNodeTypes} from '../../../shared/models/ServiceNodeTypes'; +import {IframeService} from "../../../shared/utils/iframe.service"; +import {DefaultDataGeneratorService} from "../../../shared/services/defaultDataServiceGenerator/default.data.generator.service"; +import {VfModulePopuopService} from "../../../shared/components/genericFormPopup/genericFormServices/vfModule/vfModule.popuop.service"; +import {NetworkPopupService} from "../../../shared/components/genericFormPopup/genericFormServices/network/network.popup.service"; +import {createVFModuleInstance} from "../../../shared/storeUtil/utils/vfModule/vfModule.actions"; +import {VnfPopupService} from "../../../shared/components/genericFormPopup/genericFormServices/vnf/vnf.popup.service"; +import {DrawingBoardModes} from "../drawing-board.modes"; +import {DrawingBoardTreeService} from "../drawing-board-tree/drawing-board-tree.service"; +import {ObjectToModelTreeService} from "../objectsToTree/objectToModelTree/objectToModelTree.service"; +import {VnfGroupPopupService} from "../../../shared/components/genericFormPopup/genericFormServices/vnfGroup/vnfGroup.popup.service"; +import {SharedTreeService} from "../objectsToTree/shared.tree.service"; +import {changeInstanceCounter} from "../../../shared/storeUtil/utils/general/general.actions"; +import {createVnfGroupInstance} from "../../../shared/storeUtil/utils/vnfGroup/vnfGroup.actions"; +import {VnfGroupControlGenerator} from "../../../shared/components/genericForm/formControlsServices/vnfGroupGenerator/vnfGroup.control.generator"; +import {HighlightPipe} from "../../../shared/pipes/highlight/highlight-filter.pipe"; +import * as _ from 'lodash'; +import {DrawingBoardTreeComponent} from "../drawing-board-tree/drawing-board-tree.component"; + + +@Component({ + selector: 'available-models-tree', + templateUrl: './available-models-tree.component.html', + styleUrls: ['./available-models-tree.component.scss'], + providers : [HighlightPipe] +}) + +export class AvailableModelsTreeComponent { + filterValue : string = ''; + serviceModelId: string; + serviceHierarchy; + parentElementClassName = 'content'; + _store: NgRedux<AppState>; + isNewObject: boolean; + availableModelsTreeService: AvailableModelsTreeService; + drawingBoardTreeService: DrawingBoardTreeService; + + constructor(private _iframeService: IframeService, + private _aaiService: AaiService, + private route: ActivatedRoute, + private dialogService: DialogService, + private _availableModelsTreeService: AvailableModelsTreeService, + private _drawingBoardTreeService: DrawingBoardTreeService, + private _defaultDataGeneratorService: DefaultDataGeneratorService, + private _vnfGroupControlGenerator: VnfGroupControlGenerator, + private _vfModulePopuopService: VfModulePopuopService, + private _vnfGroupPopupService: VnfGroupPopupService, + private _vnfPopupService: VnfPopupService, + private _networkPopupService: NetworkPopupService, + private store: NgRedux<AppState>, + private _objectToModelTreeService : ObjectToModelTreeService, + private _sharedTreeService : SharedTreeService, + private _highlightPipe : HighlightPipe) { + this.availableModelsTreeService = _availableModelsTreeService; + this.drawingBoardTreeService = _drawingBoardTreeService; + + this._store = store; + this.route + .queryParams + .subscribe(params => { + this.serviceModelId = params['serviceModelId']; + this._aaiService.getServiceModelById(this.serviceModelId).subscribe( + value => { + this.serviceHierarchy = value; + this.nodes = this._objectToModelTreeService.convertServiceHierarchyModelToTreeNodes(this.serviceHierarchy); + }, + error => { + console.log('error is ', error) + } + ); + }); + + } + + @Output() + highlightInstances: EventEmitter<number> = new EventEmitter<number>(); + @ViewChild('tree') tree: TreeComponent; + + nodes = []; + service = {name: ''}; + + options: ITreeOptions = { + nodeHeight: 36, + dropSlotHeight: 0, + nodeClass: (node: ITreeNode) => { + if (node.data.type === ServiceNodeTypes.VFmodule && ! node.parent.data['getNodeCount'](node.parent, this.serviceModelId) && this.store.getState().global.drawingBoardStatus !== DrawingBoardModes.VIEW) { + node.data.disabled = true; + return 'tree-node tree-node-disabled'; + } + node.data.disabled = false; + return 'tree-node'; + } + }; + + + getNodeName(node : ITreeNode, filter : string) { + return this._highlightPipe.transform(node.data.name ,filter ? filter : ''); + } + + expandParentByNodeId(id: IDType): void { + this.tree.treeModel.getNodeById(id).parent.expand(); + } + + updateNodes(updateData : {nodes : any, filterValue : string}) : void { + this.nodes = updateData.nodes; + this.filterValue = updateData.filterValue; + } + + selectNode(node: ITreeNode): void { + node.expand(); + this._sharedTreeService.setSelectedVNF(null); + this.highlightInstances.emit(node.data.modelUniqueId); + } + + + + onClickAdd(node: ITreeNode, serviceId: string , isNewObject: boolean = false): void { + this.isNewObject = isNewObject; + let data = node.data; + let dynamicInputs = data.dynamicInputs; + let isAlaCarte: boolean = this.serviceHierarchy.service.instantiationType == "A-La-Carte"; + let isEcompGeneratedNaming: boolean = data.isEcompGeneratedNaming; + let type: string = data.type; + if (!this.store.getState().global.flags['FLAG_SETTING_DEFAULTS_IN_DRAWING_BOARD'] || node.data.type === ServiceNodeTypes.VF || + this._availableModelsTreeService.shouldOpenDialog(type, dynamicInputs, isEcompGeneratedNaming)) { + this._iframeService.addClassOpenModal(this.parentElementClassName); + node.data.onAddClick(node, serviceId); + } else { + if (node.data.type === ServiceNodeTypes.VnfGroup) { + let instanceName = this._vnfGroupControlGenerator.getDefaultInstanceName(null, serviceId, node.data.name); + let vnfGroup = this._defaultDataGeneratorService.generateVnfGroupInstance(this.serviceHierarchy.vnfGroups[node.data.name], isEcompGeneratedNaming, isAlaCarte, instanceName); + this._store.dispatch(changeInstanceCounter(node.data.modelUniqueId, serviceId, 1 , <any> {data: {type: 'VnfGroup'}})); + this._store.dispatch(createVnfGroupInstance(vnfGroup, node.data.name, serviceId, node.data.name)); + DrawingBoardTreeComponent.triggerreCalculateIsDirty.next(this.serviceModelId); + } else { + let vfModule = this._defaultDataGeneratorService.generateVFModule(this.serviceHierarchy.vnfs[node.parent.data.name].vfModules[node.data.name], dynamicInputs, isEcompGeneratedNaming, isAlaCarte); + if (this._sharedTreeService.selectedVNF) { + this.store.dispatch(createVFModuleInstance(vfModule, node.data.name, this.serviceModelId, null, this._sharedTreeService.selectedVNF)); + DrawingBoardTreeComponent.triggerreCalculateIsDirty.next(this.serviceModelId); + } else if (this._availableModelsTreeService.getOptionalVNFs(this.serviceModelId, node.parent.data.name).length === 1) { + let existVnf = this._store.getState().service.serviceInstance[this.serviceModelId].vnfs; + if(!_.isNil(existVnf)){ + for(let vnfKey in existVnf){ + if(existVnf[vnfKey]['modelInfo'].modelUniqueId === node.parent.data.id){ + this.store.dispatch(createVFModuleInstance(vfModule, node.data.name, this.serviceModelId, null, vnfKey)); + DrawingBoardTreeComponent.triggerreCalculateIsDirty.next(this.serviceModelId); + } + } + } + + + } else { + this._availableModelsTreeService.addingAlertAddingNewVfModuleModal(); + } + } + } + } +} diff --git a/vid-webpack-master/src/app/drawingBoard/available-models-tree/available-models-tree.service.spec.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/available-models-tree/available-models-tree.service.spec.ts index 10cbb0d8f..cf9d04aae 100644 --- a/vid-webpack-master/src/app/drawingBoard/available-models-tree/available-models-tree.service.spec.ts +++ b/vid-webpack-master/src/app/drawingBoard/service-planning/available-models-tree/available-models-tree.service.spec.ts @@ -3,85 +3,62 @@ import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing'; -import {AvailableModelsTreeService} from './available-models-tree.service'; -import {ServicePlanningService} from "../../services/service-planning.service"; -import {ServiceNodeTypes} from "../../shared/models/ServiceNodeTypes"; -import {NgRedux} from "@angular-redux/store"; -import {MockAppStore} from "../../services/service-planning.service.spec"; +import {AvailableModelsTreeService, AvailableNodeIcons} from './available-models-tree.service'; +import {ServiceNodeTypes} from "../../../shared/models/ServiceNodeTypes"; +import {DefaultDataGeneratorService} from "../../../shared/services/defaultDataServiceGenerator/default.data.generator.service"; +import {MessageBoxService} from "../../../shared/components/messageBox/messageBox.service"; +import {MessageBoxData} from "../../../shared/components/messageBox/messageBox.data"; +import {SdcUiCommon} from "onap-ui-angular"; +import {MockNgRedux, NgReduxTestingModule} from "@angular-redux/store/testing"; +import {SharedTreeService} from "../objectsToTree/shared.tree.service"; describe('Available Models Tree Service', () => { + let injector; let service: AvailableModelsTreeService; let httpMock: HttpTestingController; - beforeEach(() => { - + beforeAll(done => (async () => { TestBed.configureTestingModule({ - imports: [HttpClientTestingModule], + imports: [HttpClientTestingModule, NgReduxTestingModule], providers: [AvailableModelsTreeService, - ServicePlanningService, - {provide: NgRedux, useClass: MockAppStore}] + DefaultDataGeneratorService, + SharedTreeService, + MockNgRedux] }); + await TestBed.compileComponents(); + injector = getTestBed(); + service = injector.get(AvailableModelsTreeService); + httpMock = injector.get(HttpTestingController); + })().then(done).catch(done.fail)); - injector = getTestBed(); - service = injector.get(AvailableModelsTreeService); - httpMock = injector.get(HttpTestingController); - }); - - describe('#shouldShowAddIcon', () => { - it('should return true if number of current vnf modules is under the max', (done: DoneFn) => { - let treeNode = { - data: { - children: [], - name: 'vf_vmee0..VfVmee..base_vmme..module-0' - } - }; - let serviceHierarchy = getSericeServiceHierarchy(); - let result = service.shouldShowAddIcon(treeNode, serviceHierarchy, '6e59c5de-f052-46fa-aa7e-2fca9d674c44', 0); - expect(result).toBeTruthy(); - done(); - }); - - it('should return false if number of current vnf modules are more than max', (done: DoneFn) => { - let treeNode = { - data: { - children: [], - name: 'vf_vmee0..VfVmee..base_vmme..module-0' - } - }; + test('addingAlertAddingNewVfModuleModal should open message modal', () => { + jest.spyOn(MessageBoxService.openModal, 'next'); + service.addingAlertAddingNewVfModuleModal(); - let serviceHierarchy = getSericeServiceHierarchy(); - let result = service.shouldShowAddIcon(treeNode, serviceHierarchy, '6e59c5de-f052-46fa-aa7e-2fca9d674c44', 2); - expect(result).toBeFalsy(); - done(); - }); + expect(MessageBoxService.openModal.next).toHaveBeenCalledWith(new MessageBoxData( + "Select a parent", // modal title + "There are multiple instances on the right side that can contain this vf-module Please select the VNF instance, to add this vf-module to, on the right side and then click the + sign", + SdcUiCommon.ModalType.warning, + SdcUiCommon.ModalSize.medium, + [ + {text: "Close", size: "medium", closeModal: true} + ])); + }); - it('should return true if number of current vnf modules are more than max and max is null', (done: DoneFn) => { - let treeNode = { - data: { - children: [], - name: 'vf_vmee0..VfVmee..base_vmme..module-0' - } - }; - let serviceHierarchy = getSericeServiceHierarchy(); - let result = service.shouldShowAddIcon(treeNode, serviceHierarchy, '6e59c5de-f052-46fa-aa7e-2fca9d674c44', 0); - expect(result).toBeTruthy(); - done(); - }); - }); describe('#shouldOpenModalDialogOnAddInstance', () => { - let serviceHierarchy = getSericeServiceHierarchy(); + let serviceHierarchy = getServiceServiceHierarchy(); - it('should open popup on add instance', (done: DoneFn) => { + test('should open popup on add instance', () => { // add vnf should return true - let result = service.shouldOpenDialog(ServiceNodeTypes.VF, [], false); + let result = service.shouldOpenDialog(ServiceNodeTypes.VF, [], true); expect(result).toBeTruthy(); // add vfModule with user provided naming should return true - result = service.shouldOpenDialog(ServiceNodeTypes.VFmodule, [], true); + result = service.shouldOpenDialog(ServiceNodeTypes.VFmodule, [], false); expect(result).toBeTruthy(); // add vfModule with dynamicInputs without defaultValues should return true @@ -91,7 +68,7 @@ describe('Available Models Tree Service', () => { name: '2017488_adiodvpe0_vnf_config_template_version', isRequired: true, description: 'VPE Software Version' - }], false); + }], true); expect(result).toBeTruthy(); // add vfModule with dynamicInputs with defaultValues should return false @@ -102,13 +79,12 @@ describe('Available Models Tree Service', () => { value: '17.2', isRequired: true, description: 'VPE Software Version' - }], false); + }], true); expect(result).toBeFalsy(); - done(); }); }); - function getSericeServiceHierarchy() { + function getServiceServiceHierarchy() { return JSON.parse(JSON.stringify( { '6e59c5de-f052-46fa-aa7e-2fca9d674c44': { @@ -118,7 +94,7 @@ describe('Available Models Tree Service', () => { 'name': 'ComplexService', 'version': '1.0', 'toscaModelURL': null, - 'category': 'Mobility', + 'category': 'Emanuel', 'serviceType': '', 'serviceRole': '', 'description': 'ComplexService', @@ -137,7 +113,9 @@ describe('Available Models Tree Service', () => { 'inputs': {}, 'commands': {}, 'properties': { - 'gpb2_Internal2_mac': '00:80:37:0E:02:22', + 'max_instances': '3', + 'min_instances': '1', + 'gpb2_Internal2_mac': '00:11:22:EF:AC:DF', 'sctp-b-ipv6-egress_src_start_port': '0', 'sctp-a-ipv6-egress_rule_application': 'any', 'Internal2_allow_transit': 'true', @@ -145,9 +123,9 @@ describe('Available Models Tree Service', () => { 'sctp-a-egress_rule_application': 'any', 'sctp-b-ingress_action': 'pass', 'sctp-b-ingress_rule_protocol': 'icmp', - 'ncb2_Internal1_mac': '00:80:37:0E:0F:12', + 'ncb2_Internal1_mac': '00:11:22:EF:AC:DF', 'sctp-b-ipv6-ingress-src_start_port': '0.0', - 'ncb1_Internal2_mac': '00:80:37:0E:09:12', + 'ncb1_Internal2_mac': '00:11:22:EF:AC:DF', 'fsb_volume_size_0': '320.0', 'sctp-b-egress_src_addresses': 'local', 'sctp-a-ipv6-ingress_ethertype': 'IPv4', @@ -166,12 +144,12 @@ describe('Available Models Tree Service', () => { 'sctp-a-ipv6-ingress_src_subnet_prefix': '0.0.0.0', 'sctp-b-egress-dst_start_port': '0.0', 'ncb_flavor_name': 'nv.c20r64d1', - 'gpb1_Internal1_mac': '00:80:37:0E:01:22', + 'gpb1_Internal1_mac': '00:11:22:EF:AC:DF', 'sctp-b-egress_dst_subnet_prefix_len': '0.0', - 'Internal2_net_cidr': '169.255.0.0', + 'Internal2_net_cidr': '10.0.0.10', 'sctp-a-ingress-dst_start_port': '0.0', 'sctp-a-egress-dst_start_port': '0.0', - 'fsb1_Internal2_mac': '00:80:37:0E:0B:12', + 'fsb1_Internal2_mac': '00:11:22:EF:AC:DF', 'sctp-a-egress_ethertype': 'IPv4', 'vlc_st_service_mode': 'in-network-nat', 'sctp-a-ipv6-egress_ethertype': 'IPv4', @@ -181,17 +159,17 @@ describe('Available Models Tree Service', () => { 'sctp-a-ingress-src_subnet_prefix_len': '0.0', 'sctp-b-ipv6-ingress-src_end_port': '65535.0', 'sctp-b-name': 'epc-sctp-b-ipv4v6-sec-group', - 'fsb2_Internal1_mac': '00:80:37:0E:0D:12', + 'fsb2_Internal1_mac': '00:11:22:EF:AC:DF', 'sctp-a-ipv6-ingress-src_start_port': '0.0', 'sctp-b-ipv6-egress_ethertype': 'IPv4', - 'Internal1_net_cidr': '169.253.0.0', + 'Internal1_net_cidr': '10.0.0.10', 'sctp-a-egress_dst_subnet_prefix': '0.0.0.0', 'fsb_flavor_name': 'nv.c20r64d1', 'sctp_rule_protocol': '132', 'sctp-b-ipv6-ingress_src_subnet_prefix_len': '0', 'sctp-a-ipv6-ingress_rule_application': 'any', 'sctp-a-IPv6_ethertype': 'IPv6', - 'vlc2_Internal1_mac': '00:80:37:0E:02:12', + 'vlc2_Internal1_mac': '00:11:22:EF:AC:DF', 'vlc_st_virtualization_type': 'virtual-machine', 'sctp-b-ingress-dst_start_port': '0.0', 'sctp-b-ingress-dst_end_port': '65535.0', @@ -209,7 +187,7 @@ describe('Available Models Tree Service', () => { 'Internal2_shared': 'false', 'sctp-a-ipv6-egress_dst_subnet_prefix_len': '0', 'Internal2_rpf': 'disable', - 'vlc1_Internal1_mac': '00:80:37:0E:01:12', + 'vlc1_Internal1_mac': '00:11:22:EF:AC:DF', 'sctp-b-ipv6-egress_src_end_port': '65535', 'sctp-a-ipv6-egress_src_addresses': 'local', 'sctp-a-ingress-dst_end_port': '65535.0', @@ -219,41 +197,41 @@ describe('Available Models Tree Service', () => { 'sctp-a-dst_subnet_prefix_v6': '::', 'pxe_image_name': 'MME_PXE-Boot_16ACP04_GA.qcow2', 'vlc_st_interface_type_gtp': 'other0', - 'ncb1_Internal1_mac': '00:80:37:0E:09:12', + 'ncb1_Internal1_mac': '00:11:22:EF:AC:DF', 'sctp-b-src_subnet_prefix_v6': '::', 'sctp-a-egress_dst_subnet_prefix_len': '0.0', 'int1_sec_group_name': 'int1-sec-group', 'Internal1_dhcp': 'false', 'sctp-a-ipv6-egress_dst_end_port': '65535', 'Internal2_forwarding_mode': 'l2', - 'fsb2_Internal2_mac': '00:80:37:0E:0D:12', + 'fsb2_Internal2_mac': '00:11:22:EF:AC:DF', 'sctp-b-egress_dst_subnet_prefix': '0.0.0.0', 'Internal1_net_cidr_len': '17', - 'gpb2_Internal1_mac': '00:80:37:0E:02:22', + 'gpb2_Internal1_mac': '00:11:22:EF:AC:DF', 'sctp-b-ingress-src_subnet_prefix_len': '0.0', 'sctp-a-ingress_dst_addresses': 'local', 'sctp-a-egress_action': 'pass', 'fsb_volume_type_0': 'SF-Default-SSD', - 'ncb2_Internal2_mac': '00:80:37:0E:0F:12', + 'ncb2_Internal2_mac': '00:11:22:EF:AC:DF', 'vlc_st_interface_type_sctp_a': 'left', 'vlc_st_interface_type_sctp_b': 'right', 'sctp-a-src_subnet_prefix_v6': '::', 'vlc_st_version': '2', 'sctp-b-egress_ethertype': 'IPv4', 'sctp-a-ingress_rule_application': 'any', - 'gpb1_Internal2_mac': '00:80:37:0E:01:22', + 'gpb1_Internal2_mac': '00:11:22:EF:AC:DF', 'instance_ip_family_v6': 'v6', 'sctp-a-ipv6-egress_src_start_port': '0', 'sctp-b-ingress-src_start_port': '0.0', 'sctp-b-ingress_dst_addresses': 'local', - 'fsb1_Internal1_mac': '00:80:37:0E:0B:12', + 'fsb1_Internal1_mac': '00:11:22:EF:AC:DF', 'vlc_st_interface_type_oam': 'management', 'multi_stage_design': 'false', 'oam_sec_group_name': 'oam-sec-group', - 'Internal2_net_gateway': '169.255.0.3', + 'Internal2_net_gateway': '10.0.0.10', 'sctp-a-ipv6-ingress-dst_end_port': '65535', 'sctp-b-ipv6-egress-dst_start_port': '0', - 'Internal1_net_gateway': '169.253.0.3', + 'Internal1_net_gateway': '10.0.0.10', 'sctp-b-ipv6-egress_rule_protocol': 'any', 'gtp_sec_group_name': 'gtp-sec-group', 'sctp-a-ipv6-egress_dst_subnet_prefix': '0.0.0.0', @@ -275,7 +253,7 @@ describe('Available Models Tree Service', () => { 'vlc_st_service_type': 'firewall', 'sctp-b-ipv6-egress_dst_end_port': '65535', 'sctp-b-ipv6-ingress-dst_start_port': '0', - 'vlc2_Internal2_mac': '00:80:37:0E:02:12', + 'vlc2_Internal2_mac': '00:11:22:EF:AC:DF', 'vlc_st_availability_zone': 'true', 'fsb_volume_image_name_1': 'MME_FSB2_16ACP04_GA.qcow2', 'sctp-b-ingress-src_subnet_prefix': '0.0.0.0', @@ -287,7 +265,7 @@ describe('Available Models Tree Service', () => { 'sctp-b-ipv6-ingress_dst_addresses': 'local', 'sctp-b-ipv6-egress_dst_subnet_prefix': '0.0.0.0', 'sctp-b-ipv6-ingress_ethertype': 'IPv4', - 'vlc1_Internal2_mac': '00:80:37:0E:01:12', + 'vlc1_Internal2_mac': '00:11:22:EF:AC:DF', 'sctp-a-ingress-src_subnet_prefix': '0.0.0.0', 'sctp-a-ipv6-ingress_action': 'pass', 'Internal1_rpf': 'disable', @@ -446,5 +424,4 @@ describe('Available Models Tree Service', () => { } )); } - }); diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/available-models-tree/available-models-tree.service.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/available-models-tree/available-models-tree.service.ts new file mode 100644 index 000000000..dc72f8f12 --- /dev/null +++ b/vid-webpack-master/src/app/drawingBoard/service-planning/available-models-tree/available-models-tree.service.ts @@ -0,0 +1,76 @@ +import {Injectable} from '@angular/core'; +import {DefaultDataGeneratorService} from "../../../shared/services/defaultDataServiceGenerator/default.data.generator.service"; +import {NgRedux} from "@angular-redux/store"; +import {AppState} from "../../../shared/store/reducers"; +import {MessageBoxData} from "../../../shared/components/messageBox/messageBox.data"; +import {MessageBoxService} from "../../../shared/components/messageBox/messageBox.service"; +import * as _ from "lodash"; +import { SdcUiCommon} from "onap-ui-angular"; +import {SharedTreeService} from "../objectsToTree/shared.tree.service"; + +export class AvailableNodeIcons { + addIcon: boolean; + vIcon: boolean; + + constructor(addIcon: boolean, vIcon: boolean) { + this.addIcon = addIcon; + this.vIcon = vIcon; + } +} + +@Injectable() +export class AvailableModelsTreeService { + constructor(private _defaultDataGeneratorService: DefaultDataGeneratorService, + private store: NgRedux<AppState>, + public _shareTreeService : SharedTreeService) { + } + + + + shouldOpenDialog(type: string, dynamicInputs: any, isEcompGeneratedNaming: boolean): boolean { + if (!isEcompGeneratedNaming || this._defaultDataGeneratorService.requiredFields[type].length > 0) { + return true; + } + + if (dynamicInputs) { + for(let input of dynamicInputs) { + if (input.isRequired && _.isEmpty(input.value)) { + return true; + } + } + } + return false; + } + + getOptionalVNFs(serviceUUID: string, vnfOriginalModelName : string) : any[] { + let result = []; + if(!_.isNil(this.store.getState().service.serviceInstance) && !_.isNil(this.store.getState().service.serviceInstance[serviceUUID])){ + const serviceVNFsInstances = this.store.getState().service.serviceInstance[serviceUUID].vnfs; + for(let vnfKey in serviceVNFsInstances){ + if(serviceVNFsInstances[vnfKey].originalName === vnfOriginalModelName){ + serviceVNFsInstances[vnfKey].vnfStoreKey = vnfKey; + result.push(serviceVNFsInstances[vnfKey]); + } + } + } + + + return result; + } + + + + addingAlertAddingNewVfModuleModal() : void { + let messageBoxData : MessageBoxData = new MessageBoxData( + "Select a parent", // modal title + "There are multiple instances on the right side that can contain this vf-module Please select the VNF instance, to add this vf-module to, on the right side and then click the + sign", + SdcUiCommon.ModalType.warning, + SdcUiCommon.ModalSize.medium, + [ + {text:"Close", size:"medium", closeModal:true} + ]); + + MessageBoxService.openModal.next(messageBoxData); + } + +} diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/component-info/component-info-model.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/component-info/component-info-model.ts new file mode 100644 index 000000000..4c5bf6747 --- /dev/null +++ b/vid-webpack-master/src/app/drawingBoard/service-planning/component-info/component-info-model.ts @@ -0,0 +1,26 @@ +import {ModelInformationItem} from "../../../shared/components/model-information/model-information.component"; + +export class ComponentInfoModel { + type: ComponentInfoType; + modelInfoItems: ModelInformationItem[]; + additionalInfoItems: ModelInformationItem[]; + title: string; + + + constructor(type: ComponentInfoType, modelInfoItems: ModelInformationItem[], additionalInfoItems: ModelInformationItem[], isInstance:boolean=true) { + this.type = type; + this.modelInfoItems = modelInfoItems; + this.additionalInfoItems = additionalInfoItems; + this.title=this.type+(isInstance ? " Instance" : ""); + } +} + + +export enum ComponentInfoType { + SERVICE = "Service", + VNF = "VNF", + NETWORK = "Network", + VFMODULE = "VFModule", + VNFGROUP = "Group", + VNFMEMBER = "VNF" +} diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/component-info/component-info.component.html b/vid-webpack-master/src/app/drawingBoard/service-planning/component-info/component-info.component.html new file mode 100644 index 000000000..8f08de076 --- /dev/null +++ b/vid-webpack-master/src/app/drawingBoard/service-planning/component-info/component-info.component.html @@ -0,0 +1,20 @@ +<div *ngIf="componentInfoModel"> + <div class="component-info-wrapper" [attr.data-tests-id]="'component-info-wrapper'"> + <div class="component-info-section" [attr.data-tests-id]="'component-info-section'"> + <div class="title" [attr.data-tests-id]="'component-info-section-title'">{{componentInfoModel?.title}} INFO</div> + <div class="component-info-list" [attr.data-tests-id]="'component-info-section-list'"> + <model-information [modelInformationItems]="componentInfoModel?.modelInfoItems" [itemClass]="'componentInfoItem'"></model-information> + </div> + </div> + </div> + <!-- commented out till we will have a data to show in additional info + <div class="component-info-wrapper" [attr.data-tests-id]="'additional-info-wrapper'">--> + <!--<div class="component-info-section" [attr.data-tests-id]="'additional-info-section'">--> + <!--<div class="title" [attr.data-tests-id]="'additional-info-section-title'">ADDITIONAL INFO</div>--> + <!--<div class="component-info-list" [attr.data-tests-id]="'additional-info-section-title'">--> + <!--<model-information [modelInformationItems]="componentInfoModel.additionalInfoItems" [itemClass]="'componentInfoItem'"></model-information>--> + <!--</div>--> + <!--</div>--> + <!--</div> + --> +</div> diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/component-info/component-info.component.scss b/vid-webpack-master/src/app/drawingBoard/service-planning/component-info/component-info.component.scss new file mode 100644 index 000000000..2d7735678 --- /dev/null +++ b/vid-webpack-master/src/app/drawingBoard/service-planning/component-info/component-info.component.scss @@ -0,0 +1,40 @@ +.component-info-wrapper { + + &:first-child { + border-bottom: 1px solid #D2D2D2; + } + .component-info-section { + margin: 15px 25px 0 25px; + + .title { + font-family: OpenSans-SemiBold; + font-size: 14px; + color: #191919; + text-transform: uppercase; + margin-bottom: 15px; + } + } + +} + +:host ::ng-deep .componentInfoItem { + border-top: 1px solid #D2D2D2; + padding-top: 10px; + margin-bottom: 10px; + + label { + font-family: OpenSans-Regular; + font-size: 12px; + color: #5A5A5A; + text-transform: capitalize; + } + + .model-item-value { + font-family: OpenSans-SemiBold; + font-size: 14px; + color: #191919; + line-height: 16px; + } +} + + diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/component-info/component-info.component.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/component-info/component-info.component.ts new file mode 100644 index 000000000..c69ab52e1 --- /dev/null +++ b/vid-webpack-master/src/app/drawingBoard/service-planning/component-info/component-info.component.ts @@ -0,0 +1,40 @@ +import {ChangeDetectionStrategy, Component, OnInit} from '@angular/core'; +import {ComponentInfoService} from "./component-info.service"; +import {ComponentInfoModel, ComponentInfoType} from "./component-info-model"; +import {ActivatedRoute} from "@angular/router"; + + +@Component({ + selector: 'component-info', + templateUrl: './component-info.component.html', + styleUrls: ['./component-info.component.scss'], + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class ComponentInfoComponent implements OnInit { + componentInfoModel: ComponentInfoModel = null; + + constructor(private _componentInfoService:ComponentInfoService, private route: ActivatedRoute) {} + + ngOnInit() { + ComponentInfoService.triggerComponentInfoChange.subscribe((input : ComponentInfoModel) => { + if(input.type === ComponentInfoType.SERVICE){ + this.getServiceInformation(); + }else { + this.componentInfoModel = input; + } + }); + + this.getServiceInformation(); + } + + + + getServiceInformation() : void { + this.route + .queryParams + .subscribe(params => { + let serviceModelId = params['serviceModelId']; + this.componentInfoModel = this._componentInfoService.getInfoForService(serviceModelId); + }); + } +} diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/component-info/component-info.service.spec.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/component-info/component-info.service.spec.ts new file mode 100644 index 000000000..8b0da409b --- /dev/null +++ b/vid-webpack-master/src/app/drawingBoard/service-planning/component-info/component-info.service.spec.ts @@ -0,0 +1,93 @@ +import {ComponentInfoService} from './component-info.service'; +import {getTestBed, TestBed} from '@angular/core/testing'; +import {MockNgRedux, NgReduxTestingModule} from '@angular-redux/store/testing'; +import {NgRedux} from '@angular-redux/store'; +import {AaiService} from '../../../shared/services/aaiService/aai.service'; +import {HttpClient, HttpHandler} from '@angular/common/http'; +import {FeatureFlagsService} from '../../../shared/services/featureFlag/feature-flags.service'; +import {ModelInformationItem} from "../../../shared/components/model-information/model-information.component"; +import {ComponentInfoModel, ComponentInfoType} from "./component-info-model"; + +class MockAppStore<T> { + getState() { + return { + global: { + }, + service : { + serviceHierarchy : { + '1a80c596-27e5-4ca9-b5bb-e03a7fd4c0fd' : { + service:{ + serviceRole: 'Testing', + serviceType: 'pnf', + uuid: '1a80c596-27e5-4ca9-b5bb-e03a7fd4c0fd', + version: '1.0', + customizationUuid: '' + } + } + }, + serviceInstance : { + '1a80c596-27e5-4ca9-b5bb-e03a7fd4c0fd' : { + globalSubscriberId: 'e433710f-9217-458d-a79d-1c7aff376d89', + subscriptionServiceType:'TYLER SILVIA', + instanceId: '2f7130e8-27d6-4c01-8988-60ca67e8dae4' + } + }, + subscribers: [ + { + 'id': 'CAR_2020_ER', + 'name': 'CAR_2020_ER', + 'isPermitted': true + }, + { + 'id': 'e433710f-9217-458d-a79d-1c7aff376d89', + 'name': 'SILVIA ROBBINS', + 'isPermitted': true + } + ] + } + } + } +} + +beforeAll(done => (async () => { + TestBed.configureTestingModule({ + imports: [NgReduxTestingModule], + providers: [ + AaiService, + HttpClient, + HttpHandler, + FeatureFlagsService, + ComponentInfoService, + {provide: NgRedux, useClass: MockAppStore}, + MockNgRedux] + }); + await TestBed.compileComponents(); + let injector = getTestBed(); + service = injector.get(ComponentInfoService); + })().then(done).catch(done.fail)); + +let service: ComponentInfoService; +describe('Service Info Data', () => { + + test('ComponentInfoService should be defined', () => { + expect(service).toBeDefined(); + }); + + test('Info for service should be correct', () => { + let actualServiceInfo = service.getInfoForService('1a80c596-27e5-4ca9-b5bb-e03a7fd4c0fd'); + let expectedServiceInfo = [ + ModelInformationItem.createInstance('Type', 'pnf'), + ModelInformationItem.createInstance('Model Version', '1.0'), + ModelInformationItem.createInstance('Model Customization ID', ''), + ModelInformationItem.createInstance('Instance ID', '2f7130e8-27d6-4c01-8988-60ca67e8dae4'), + ModelInformationItem.createInstance('Subscriber Name', 'SILVIA ROBBINS'), + ModelInformationItem.createInstance('Service Type', 'TYLER SILVIA'), + ModelInformationItem.createInstance('Service Role', 'Testing'), + ]; + expect(actualServiceInfo).toEqual(new ComponentInfoModel(ComponentInfoType.SERVICE, expectedServiceInfo, [])); + + + }); + +}); + diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/component-info/component-info.service.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/component-info/component-info.service.ts new file mode 100644 index 000000000..9318b3aa7 --- /dev/null +++ b/vid-webpack-master/src/app/drawingBoard/service-planning/component-info/component-info.service.ts @@ -0,0 +1,41 @@ +import {Injectable} from "@angular/core"; +import {NgRedux} from "@angular-redux/store"; +import {AppState} from "../../../shared/store/reducers"; +import {AaiService} from "../../../shared/services/aaiService/aai.service"; +import {Subject} from "rxjs"; +import {ComponentInfoModel, ComponentInfoType} from "./component-info-model"; +import {ModelInformationItem} from "../../../shared/components/model-information/model-information.component"; +import * as _ from 'lodash'; +@Injectable() +export class ComponentInfoService { + static triggerComponentInfoChange: Subject<ComponentInfoModel> = new Subject<ComponentInfoModel>(); + constructor( private _store: NgRedux<AppState>, private _aaiService : AaiService){ } + + getInfoForService(serviceModelId):ComponentInfoModel { + if(_.isNil(this._store.getState().service.serviceHierarchy[serviceModelId])) return null; + + let serviceHierarchy = this._store.getState().service.serviceHierarchy[serviceModelId].service; + const serviceInstance = this._store.getState().service.serviceInstance[serviceModelId]; + const modelInfoItems: ModelInformationItem[] = [ + ModelInformationItem.createInstance("Subscriber Name",this._aaiService.extractSubscriberNameBySubscriberId(serviceInstance.globalSubscriberId)), + ModelInformationItem.createInstance("Service Type",serviceInstance.subscriptionServiceType), + ModelInformationItem.createInstance("Service Role",serviceHierarchy.serviceRole), + ]; + serviceHierarchy.type = serviceHierarchy.serviceType; + return this.addGeneralInfoItems(modelInfoItems, ComponentInfoType.SERVICE, serviceHierarchy, serviceInstance ); + } + + + addGeneralInfoItems(modelInfoSpecificItems: ModelInformationItem[], type: ComponentInfoType, model, instance) { + let modelInfoItems: ModelInformationItem[] = [ + ModelInformationItem.createInstance("Type", (model && model.type) ? model.type : ((instance && instance.modelInfo) ? instance.modelInfo.modelType : null)), + ModelInformationItem.createInstance("Model Version", model ? model.version : null), + ModelInformationItem.createInstance("Model Customization ID", model ? model.customizationUuid : null), + ModelInformationItem.createInstance("Instance ID", instance ? instance.instanceId : null), + ModelInformationItem.createInstance("In Maintenance", instance? instance.inMaint : null), + ]; + modelInfoItems = modelInfoItems.concat(modelInfoSpecificItems); + const modelInfoItemsWithoutEmpty = _.filter(modelInfoItems, function(item){ return !item.values.every(_.isNil)}); + return new ComponentInfoModel(type, modelInfoItemsWithoutEmpty, []); + } +} diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-header/drawing-board-header.component.html b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-header/drawing-board-header.component.html new file mode 100644 index 000000000..f02ed6293 --- /dev/null +++ b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-header/drawing-board-header.component.html @@ -0,0 +1,78 @@ +<div class="drawing-board-header"> + <div class="left-header"> + <span class="vid-logo-small"></span> + <span class="icon-back"> + <svg-icon + (click)="closePage()" + [testId]="'backBtn'" + [size]="'large'" + [name]="'navigation-arrow-back'"> + </svg-icon> + </span> + + <div class="header-col middleDetails" style="padding-top: 5px;padding-left: 13px;line-height: 100%;" *ngIf="isServiceFailed"> + <custom-popover class="failed-popover-wrap" [value]= "serviceStatusMessage" [placement]="'bottom'" [popoverType]="'error'"> + <span [attr.data-tests-id]="'service-failed-msg'" class="failed-msg labelPosition" >Failed</span> + </custom-popover> + </div> + <div class="header-col middleDetails" style="padding-top: 0px;padding-left: 13px;line-height: 100%;padding-right: 50px;"> + <span [attr.data-tests-id]="'serviceInstance'" class="service-instance-label labelPosition">Service instance:</span> + <span [attr.data-tests-id]="'serviceName'" [ngClass]="{'deleted' : isDeleted}" class="service-instance-name">{{serviceName}}</span> + </div> + <div class="header-col middleDetails notShowOnCreateMode" + style="padding-top: 0px;padding-left: 13px;line-height: 100%;"> + <span [attr.data-tests-id]="'orchStatusLabel'" class="service-instance-label labelPosition">Orch Status:</span> + <span [attr.data-tests-id]="'orchStatusValue'" class="orch-status-value">{{serviceOrchStatus}}</span> + </div> + <div class="quantity-container header-col middleDetails" + style="padding-top: 0px;padding-left: 13px;line-height: 100%;" + tooltip="Number of services to instantiate including all their objects as defined below"> + <span [attr.data-tests-id]="'quantityLabel'" class="quantity-instance-label labelPosition">Scale Times:</span> + <span [attr.data-tests-id]="'servicesQuantity'" class="scale-value" + style="font-family: OpenSans-Semibold;font-size: 13px;"> {{numServicesToDeploy}} </span> + </div> + + <span [attr.data-tests-id]="'serviceStatus'" class="status" tooltip="{{status}}"></span> + <span [attr.data-tests-id]="'isViewOnly-status-test'" class="service-instance-label purple">{{getModeName()}}</span> + </div> + + + <div class="right-header"> + <span class="menu-container notShowOnViewMode notShowOnRetryMode"> + <span [attr.data-tests-id]="'openMenuBtn'" class="icon-browse" (click)="onContextMenu($event)"></span> + <context-menu> + <ng-template *ngIf="drawingBoardHeaderService?.showEditService(mode, serviceModelId)" contextMenuItem (execute)="editService()"> + <div [attr.data-tests-id]="'context-menu-header-edit-item'"> + <span class="icon-edit"></span>Edit</div> + </ng-template> + <ng-template *ngIf="mode === 'EDIT'" contextMenuItem + (execute)="isDeleted=!isDeleted; drawingBoardHeaderService.deleteService(serviceModelId,isDeleted)"> + <div [attr.data-tests-id]="'context-menu-header-delete-item'"><span class="icon-trash"></span>{{isDeleted ? 'Undo delete': 'Delete'}}</div> + </ng-template> + <ng-template *ngIf="mode !== 'CREATE'" contextMenuItem + (execute)="drawingBoardHeaderService.showAuditInfo(serviceModelId)"> + <div [attr.data-tests-id]="'context-menu-header-audit-item'" style="float: left;margin-top: 8px;"> + <svg-icon + [ngClass]="'eye-o'" + class="eye-o" + [size]="'small'" + [name]="'eye-o'"> + </svg-icon></div> + <div style="padding-left: 12px;">Show Audit Info</div> + </ng-template> + </context-menu> + </span> + <button [disabled]="drawingBoardHeaderService?.deployShouldBeDisabled(serviceModelId, mode)" + *ngIf="mode !== 'VIEW' && mode !== 'RETRY'; else viewEditButton" + [attr.data-tests-id]="'deployBtn'" + (click)="deployService()" + class="deploy-btn">{{drawingBoardHeaderService?.getModeButton(mode)}}</button> + <ng-template #viewEditButton> + <button [disabled]="!isPermitted()" + [attr.data-tests-id]="'editBtn'" + (click)="editViewEdit()" + class="deploy-btn">{{drawingBoardHeaderService?.getButtonText(mode)}} + </button> + </ng-template> + </div> +</div> diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-header/drawing-board-header.component.scss b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-header/drawing-board-header.component.scss new file mode 100644 index 000000000..1242f9429 --- /dev/null +++ b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-header/drawing-board-header.component.scss @@ -0,0 +1,176 @@ +.drawing-board-header { + height: 60px; + font-family: OpenSans-Regular; + display: flex; + justify-content: space-between; + font-size: 14px; + box-shadow: 2px 2px 6px #D2D2D2; + color: #191919; + z-index: 1; + position: relative; + [class^="icon-"] { + height: 60px; + width: 60px; + display: flex; + align-items: center; + text-align: center; + color: #5A5A5A; + cursor: pointer; + &:before { + font-size: 18px; + width: 100%; + } + &:hover:before { + color: #009FDB; + } + } + .left-header { + display: flex; + align-items: center; + .icon-back { + justify-content: center; + border-right: 1px solid #EAEAEA; + } + .vid-logo-small{ + background: url('../../../../assets/img/vid-logo.jpg') no-repeat; + width: 60px; + height: 60px; + } + .status{ + background: url('../../../../assets/img/indesign.svg') no-repeat center; + width: 24px; + height: 24px; + margin-left: 20px; + } + .header-col { + border-right: 1px solid #d2d2d2; + padding-right: 15px; + margin-left: 15px; + span{ + display: block; + } + &:after{ + content: ""; + background: #D2D2D2; + height: 35px; + width: 1px; + } + } + .service-instance-label { + font-family: OpenSans-Semibold; + font-size: 13px; + color: #5A5A5A; + } + .quantity-instance-label { + font-family: OpenSans-Regular; + font-size: 13px; + color: #5A5A5A; + } + + .labelPosition { + margin-top: 4px; + margin-bottom: 6px; + font-size: 12px; + } + .service-instance-name { + font-family: OpenSans-Semibold; + color: #191919; + background-color: white; + font-size: 14px; + &.deleted{ + text-decoration: line-through; + } + } + .orch-status-value { + font-family: OpenSans-Regular; + font-size: 14px; + color: #191919; + } + .scale-value { + font-family: OpenSans-Regular; + font-size: 14px; + color: #191919; + } + .status { + font-family: OpenSans-Semibold; + line-height: 14px; + font-size: 14px; + text-align: center; + width: 30px; + margin-left: 13px; + margin-right: 3px; + } + + .purple { + color: #9063CD; + } + + .middleDetails { + border-right: 1px solid #EAEAEA; + margin-left: 0; + height: 45px; + } + } + .right-header { + display: flex; + align-items: center; + .quantity-container { + .quantity-label { + padding-left: 10px; + font-family: OpenSans-Semibold; + font-size: 12px; + } + .quantity { + padding: 5px 10px 5px 0; + font-family: OpenSans-Semibold; + font-size: 18px; + } + } + .scale-container { + .scale-label { + padding-left: 10px; + font-family: OpenSans-Semibold; + font-size: 12px; + } + .scale { + padding: 5px 10px 5px 0; + font-family: OpenSans-Semibold; + font-size: 18px; + } + } + [class^="icon-"] { + border-left: 1px solid #EAEAEA; + } + .menu-container { + height: 100%; + display: flex; + background: none; + border: none; + padding: 0; + outline: none; + justify-content: center; + flex-direction: column; + text-align: center; + cursor: pointer; + } + .icon-browse:before { + content: '\e924'; + display: inline-block; + font-size: 24px; + } + .deploy-btn { + color: #FFFFFF ; + background: #009fdb; + width: 128px; + height: 100%; + border: none; + &[disabled] { + cursor: not-allowed; + opacity: .65; + color: #99d6ec; + } + } + } + } + + diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-header/drawing-board-header.component.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-header/drawing-board-header.component.ts new file mode 100644 index 000000000..6e4391572 --- /dev/null +++ b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-header/drawing-board-header.component.ts @@ -0,0 +1,187 @@ +import {Component, ViewChild} from '@angular/core'; +import {ContextMenuComponent, ContextMenuService} from 'ngx-contextmenu'; +import {DialogService} from 'ng2-bootstrap-modal'; +import {MsoService} from '../../../shared/services/msoService/mso.service' +import * as _ from 'lodash'; +import {ActivatedRoute} from '@angular/router'; +import {ServiceInstance} from "../../../shared/models/serviceInstance"; +import {OwningEntity} from "../../../shared/models/owningEntity"; +import {MessageBoxData} from "../../../shared/components/messageBox/messageBox.data"; +import {NgRedux} from "@angular-redux/store"; +import {AppState} from "../../../shared/store/reducers"; +import {IframeService} from "../../../shared/utils/iframe.service"; +import { + GenericFormPopupComponent, + PopupType +} from "../../../shared/components/genericFormPopup/generic-form-popup.component"; +import {ServicePopupService} from "../../../shared/components/genericFormPopup/genericFormServices/service/service.popup.service"; +import {SdcUiCommon} from "onap-ui-angular"; +import {DrawingBoardModes} from "../drawing-board.modes"; +import {DrawingBoardHeaderService} from "./drawing-board-header.service"; +import {ServiceInstanceActions} from "../../../shared/models/serviceInstanceActions"; +import {DrawingBoardPermissions} from "../../guards/servicePlanningGuard/drawingBoardGuard"; +import {MessageBoxService} from "../../../shared/components/messageBox/messageBox.service"; + +@Component({ + selector: 'drawing-board-header', + providers: [MsoService], + templateUrl: './drawing-board-header.component.html', + styleUrls: ['./drawing-board-header.component.scss'] +}) + +export class DrawingBoardHeader { + serviceName: string; + numServicesToDeploy: number; + status: string = 'Designing a new service'; + serviceModelId: string; + jobId: string; + parentElementClassName = 'content'; + mode : DrawingBoardModes = DrawingBoardModes.CREATE; + serviceOrchStatus: string; + isDeleted: boolean = false; + store : NgRedux<AppState>; + drawingBoardPermissions : DrawingBoardPermissions; + drawingBoardHeaderService : DrawingBoardHeaderService; + isServiceFailed: boolean; + serviceStatusMessage: string; + constructor(private _contextMenuService: ContextMenuService, private dialogService: DialogService, + private _iframeService : IframeService, + private route: ActivatedRoute, private msoService: MsoService, + private _servicePopupService : ServicePopupService, + private _drawingBoardHeaderService : DrawingBoardHeaderService, + private _store: NgRedux<AppState>, + private _drawingBoardPermissions : DrawingBoardPermissions) { + this.store = _store; + this.drawingBoardPermissions = _drawingBoardPermissions; + this.drawingBoardHeaderService = _drawingBoardHeaderService; + this.mode = (!_.isNil(this.route.routeConfig.path) && this.route.routeConfig.path !== "") ? this.route.routeConfig.path as DrawingBoardModes : DrawingBoardModes.CREATE; + this.route + .queryParams + .subscribe((params) => { + this.serviceModelId = params['serviceModelId']; + this.jobId = params['jobId']; + if (_.has(this.store.getState().service.serviceHierarchy, this.serviceModelId)) { + this.setValuesFromStore(); + this.store.subscribe(() => { + this.setValuesFromStore(); + }); + } + }); + } + + + @ViewChild(ContextMenuComponent) public contextMenu: ContextMenuComponent; + + editViewEdit(): void { + window.parent.location.assign(this._drawingBoardHeaderService.generateOldViewEditPath()); + } + + isPermitted() : boolean { + return this.drawingBoardPermissions.isEditPermitted; +} + + getModeName():string { + switch (this.mode) { + case DrawingBoardModes.CREATE: + return 'IN DESIGN'; + case DrawingBoardModes.VIEW: + case DrawingBoardModes.RETRY: + return 'VIEW ONLY'; + case DrawingBoardModes.EDIT: + case DrawingBoardModes.RETRY_EDIT: + return 'IN EDITING'; + default: + return 'IN DESIGN'; + } + + } + public onContextMenu($event: MouseEvent, item: any): void { + this._contextMenuService.show.next({ + contextMenu: this.contextMenu, + event: $event, + item: item, + }); + $event.preventDefault(); + $event.stopPropagation(); + } + + private setValuesFromStore() { + if(!_.isNil(this.store.getState().service.serviceInstance) && !_.isNil(this.store.getState().service.serviceInstance[this.serviceModelId])){ + const serviceInstance = this.store.getState().service.serviceInstance[this.serviceModelId]; + this.numServicesToDeploy = serviceInstance.bulkSize; + this.serviceName = serviceInstance.instanceName || '<Automatically Assigned>'; + this.serviceOrchStatus = serviceInstance.orchStatus || ""; + this.isServiceFailed = serviceInstance.isFailed; + this.serviceStatusMessage = serviceInstance.statusMessage; + } + } + + public editService(): void { + this._iframeService.addClassOpenModal(this.parentElementClassName); + this.dialogService.addDialog(GenericFormPopupComponent, { + type: PopupType.SERVICE, + uuidData: <any>{ + type : PopupType.SERVICE, + isMacro : this.store.getState().service.serviceHierarchy[this.serviceModelId].service.instantiationType === 'Macro', + serviceId: this.serviceModelId, + popupService: this._servicePopupService + }, + isUpdateMode: true + }); + } + + extractOwningEntityNameAccordingtoId(id:String): string { + let owningEntityName; + _.forEach(this.store.getState().service.categoryParameters.owningEntityList,(owningEntity: OwningEntity) => { + if (owningEntity.id === id) { + owningEntityName = owningEntity.name; + + }}); + return owningEntityName; + } + + extractServiceFields(): any { + let instanceFields : ServiceInstance; + instanceFields = this.store.getState().service.serviceInstance[this.serviceModelId]; + if (instanceFields.action === ServiceInstanceActions.Create) { + instanceFields.subscriberName = this.store.getState().service.subscribers.find(sub => sub.id === instanceFields.globalSubscriberId).name; + instanceFields.owningEntityName = this.extractOwningEntityNameAccordingtoId(instanceFields.owningEntityId); + } + return _.omit(instanceFields,'optionalGroupMembersMap'); + } + + + public deployService(): void { + let instanceFields = this.extractServiceFields(); + if (this.mode !== DrawingBoardModes.RETRY_EDIT) { + instanceFields.rollbackOnFailure = instanceFields.rollbackOnFailure === 'true'; + this.msoService.submitMsoTask(instanceFields).subscribe((result) => { + window.parent.postMessage("navigateToInstantiationStatus", '*'); + }); + } else { + this.msoService.retryBulkMsoTask(this.jobId, instanceFields).subscribe((result) => { + window.parent.postMessage("navigateToInstantiationStatus", '*'); + }); + } + } + + closePage() { + let messageBoxData : MessageBoxData = new MessageBoxData( + "Delete Instantiation", // modal title + "You are about to stop the instantiation process of this service. \nAll data will be lost. Are you sure you want to stop?", + SdcUiCommon.ModalType.warning, + SdcUiCommon.ModalSize.medium, + [ + {text:"Stop Instantiation", size:"large", callback: this.navigate.bind(this), closeModal:true}, + {text:"Cancel", size:"medium", closeModal:true} + ]); + + MessageBoxService.openModal.next(messageBoxData); + } + + + + navigate(){ + window.parent.postMessage("navigateTo", "*"); + } +} diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-header/drawing-board-header.service.spec.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-header/drawing-board-header.service.spec.ts new file mode 100644 index 000000000..bcf6753b9 --- /dev/null +++ b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-header/drawing-board-header.service.spec.ts @@ -0,0 +1,184 @@ +import {getTestBed, TestBed} from '@angular/core/testing'; +import {HttpClientTestingModule, HttpTestingController} from '@angular/common/http/testing'; +import {DefaultDataGeneratorService} from "../../../shared/services/defaultDataServiceGenerator/default.data.generator.service"; +import {MockNgRedux, NgReduxTestingModule} from "@angular-redux/store/testing"; +import {DrawingBoardHeaderService} from "./drawing-board-header.service"; +import {ActivatedRoute} from '@angular/router'; +import {ServiceInstanceActions} from "../../../shared/models/serviceInstanceActions"; +import {AppState} from "../../../shared/store/reducers"; +import {NgRedux} from "@angular-redux/store"; +import {addServiceAction} from "../../../shared/storeUtil/utils/service/service.actions"; +import {ErrorMsgService} from "../../../shared/components/error-msg/error-msg.service"; +import {DrawingBoardModes} from "../drawing-board.modes"; +import each from "jest-each"; + +class MockAppStore<T>{ + getState() { + return { + service : { + serviceInstance : { + "serviceInstanceId" : { + action: 'None' + } + } + } + } + } +} + +describe('Generate path to old View/Edit ', () => { + let injector; + let service: DrawingBoardHeaderService; + let httpMock: HttpTestingController; + let store : NgRedux<AppState>; + + beforeAll(done => (async () => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule, NgReduxTestingModule], + providers: [ + DrawingBoardHeaderService, + DefaultDataGeneratorService, + MockNgRedux, + ErrorMsgService, + { + provide: ActivatedRoute, + useValue: { + snapshot : { + queryParams:{ + 'subscriberId' : 'subscriberId', + 'subscriberName' : 'subscriberName', + 'serviceType' : 'serviceType', + 'serviceInstanceId' : 'serviceInstanceId' + } + } + }, + }] + }); + await TestBed.compileComponents(); + + injector = getTestBed(); + service = injector.get(DrawingBoardHeaderService); + httpMock = injector.get(HttpTestingController); + store = injector.get(NgRedux); + + })().then(done).catch(done.fail)); + + + test('should generate url to old view/edit ', () => { + const query: string = 'subscriberId=subscriberId&subscriberName=subscriberName&serviceType=serviceType&serviceInstanceId=serviceInstanceId'; + const path = '../../serviceModels.htm#/instantiate?' + query; + let result = service.generateOldViewEditPath(); + expect(result).toEqual(path); + }); + + test('should call update action for Delete',()=>{ + + jest.spyOn(store, 'dispatch'); + service.deleteService("serviceInstanceId", true); + expect(store.dispatch).toHaveBeenCalledWith(addServiceAction("serviceInstanceId", ServiceInstanceActions.Delete)); + }); + + test('should call update action for undo delete',()=>{ + jest.spyOn(store, 'dispatch'); + service.deleteService("serviceInstanceId", false); + expect(store.dispatch).toHaveBeenCalledWith(addServiceAction("serviceInstanceId", ServiceInstanceActions.None)); + }); + + test('deployShouldBeDisabled with validationCounter greater then 0',()=>{ + jest.spyOn(store, 'getState').mockReturnValue({ + service: { + serviceInstance : { + 'serviceInstanceId' : { + validationCounter : 1 + } + } + } + }); + let result = service.deployShouldBeDisabled("serviceInstanceId"); + expect(result).toBeTruthy(); + }); + + test('deployShouldBeDisabled with validationCounter is 0 and not dirty',()=>{ + jest.spyOn(store, 'getState').mockReturnValue({ + service: { + serviceInstance : { + 'serviceInstanceId' : { + validationCounter : 0, + isDirty : false + } + } + } + }); + let result = service.deployShouldBeDisabled("serviceInstanceId"); + expect(result).toBeFalsy(); + }); + + test('deployShouldBeDisabled with validationCounter is 0 and dirty',()=>{ + jest.spyOn(store, 'getState').mockReturnValue({ + service: { + serviceInstance : { + 'serviceInstanceId' : { + validationCounter : 0, + action : 'None', + isDirty : true + } + } + } + }); + let result = service.deployShouldBeDisabled("serviceInstanceId"); + expect(result).not.toBeTruthy(); + }); + + test('deployShouldBeDisabled with validationCounter is 0 and not and action is None and dirty',()=>{ + jest.spyOn(store, 'getState').mockReturnValue({ + service: { + serviceInstance : { + 'serviceInstanceId' : { + validationCounter : 0, + action : ServiceInstanceActions.None, + isDirty : true + } + } + } + }); + let result = service.deployShouldBeDisabled("serviceInstanceId"); + expect(result).not.toBeTruthy(); + }); + + + test('getModeButton',()=>{ + let result : string = service.getModeButton("EDIT"); + expect(result).toEqual('UPDATE'); + + result = service.getModeButton(""); + expect(result).toEqual('DEPLOY'); + + result = service.getModeButton("RETRY_EDIT"); + expect(result).toEqual('REDEPLOY'); + }); + test('getButtonText',()=>{ + expect(service.getButtonText("VIEW")).toEqual('EDIT'); + expect(service.getButtonText("RETRY")).toEqual('REDEPLOY'); + + }); + const showEditServiceDataProvider = [ + ['Create action CREATE mode', DrawingBoardModes.CREATE ,ServiceInstanceActions.Create, true], + ['Create action RETRY_EDIT mode',DrawingBoardModes.RETRY_EDIT, ServiceInstanceActions.Create, true], + ['Create action EDIT mode',DrawingBoardModes.EDIT, ServiceInstanceActions.Create, true], + ['Create action RETRY mode',DrawingBoardModes.RETRY, ServiceInstanceActions.Create, false], + ['None action EDIT mode',DrawingBoardModes.EDIT, ServiceInstanceActions.None, false], + ['None action RETRY_EDIT mode', DrawingBoardModes.RETRY_EDIT, ServiceInstanceActions.None, false]]; + each(showEditServiceDataProvider).test('showEditService service with %s', (description, mode, action, enabled) => { + jest.spyOn(store, 'getState').mockReturnValue({ + service: { + serviceInstance : { + 'serviceInstanceId' : { + action : action + } + } + } + }); + expect(service.showEditService(mode, 'serviceInstanceId')).toBe(enabled); + + }); +}); diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-header/drawing-board-header.service.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-header/drawing-board-header.service.ts new file mode 100644 index 000000000..946c5cab5 --- /dev/null +++ b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-header/drawing-board-header.service.ts @@ -0,0 +1,86 @@ +import {Injectable} from "@angular/core"; +import {ActivatedRoute} from "@angular/router"; +import {addServiceAction} from "../../../shared/storeUtil/utils/service/service.actions"; +import {ServiceInstanceActions} from "../../../shared/models/serviceInstanceActions"; +import {AppState} from "../../../shared/store/reducers"; +import {DrawingBoardTreeComponent} from "../drawing-board-tree/drawing-board-tree.component"; +import {AuditInfoModalComponent} from "../../../shared/components/auditInfoModal/auditInfoModal.component"; +import {ServiceModel} from "../../../shared/models/serviceModel"; +import {NgRedux} from "@angular-redux/store"; +import * as _ from 'lodash'; +import {ErrorMsgService} from "../../../shared/components/error-msg/error-msg.service"; +import {DrawingBoardModes} from "../drawing-board.modes"; +import {ServiceInstance} from "../../../shared/models/serviceInstance"; + +@Injectable() +export class DrawingBoardHeaderService{ + + constructor(private route: ActivatedRoute, private store: NgRedux<AppState>, private errorMsgService: ErrorMsgService){} + generateOldViewEditPath(): string{ + let query: string = + `subscriberId=${this.route.snapshot.queryParams['subscriberId']}&` + + `subscriberName=${this.route.snapshot.queryParams['subscriberName']}&` + + `serviceType=${this.route.snapshot.queryParams['serviceType']}&` + + `serviceInstanceId=${this.route.snapshot.queryParams['serviceInstanceId']}`; + return '../../serviceModels.htm#/instantiate?' + query; + } + + deleteService(serviceModelId: string, isDeleted: boolean ) { + if(isDeleted){ + this.store.dispatch(addServiceAction(serviceModelId, ServiceInstanceActions.Delete)); + DrawingBoardTreeComponent.triggerDeleteActionService.next(serviceModelId); + } else{ + this.store.dispatch(addServiceAction(serviceModelId, ServiceInstanceActions.None)); + DrawingBoardTreeComponent.triggerUndoDeleteActionService.next(serviceModelId); + } + } + + showAuditInfo(serviceModelId) : void { + let instance: ServiceInstance = this.store.getState().service.serviceInstance[serviceModelId]; + let model = new ServiceModel(this.store.getState().service.serviceHierarchy[serviceModelId]); + AuditInfoModalComponent.openInstanceAuditInfoModal.next({instanceId : serviceModelId , type : 'SERVICE', model : model , instance : instance, trackById: instance.trackById}); + } + + + /************************************************* + should return true if deploy should be disabled + *************************************************/ + deployShouldBeDisabled(serviceInstanceId: string, mode : string) : boolean { + const serviceInstance = this.store.getState().service.serviceInstance[serviceInstanceId]; + if(!_.isNil(serviceInstance)){ + const validationCounter = serviceInstance.validationCounter; + if (!_.isNil(this.errorMsgService.errorMsgObject)&& mode !== DrawingBoardModes.RETRY_EDIT) return true; + if(validationCounter > 0) return true; + if(serviceInstance.action !== ServiceInstanceActions.None) return false; + if(mode === DrawingBoardModes.RETRY_EDIT) return false; + return !serviceInstance.isDirty; + } + return true; + } + + getModeButton(mode : string) : string { + switch (mode) { + case DrawingBoardModes.EDIT: + return 'UPDATE'; + case DrawingBoardModes.RETRY_EDIT: + return 'REDEPLOY'; + default: return 'DEPLOY'; + } + } + getButtonText(mode : DrawingBoardModes) : string { + switch (mode) { + case DrawingBoardModes.EDIT: + case DrawingBoardModes.VIEW: + return 'EDIT'; + case DrawingBoardModes.RETRY_EDIT: + case DrawingBoardModes.RETRY: + return 'REDEPLOY'; + } + } + + showEditService(mode: DrawingBoardModes, serviceModelId: string): boolean{ + const serviceInstance = this.store.getState().service.serviceInstance; + return mode === DrawingBoardModes.CREATE || ((mode === DrawingBoardModes.RETRY_EDIT || mode === DrawingBoardModes.EDIT)&& + !_.isNil(serviceInstance) && !_.isNil(serviceInstance[serviceModelId])&& serviceInstance[serviceModelId].action === ServiceInstanceActions.Create); + } +} diff --git a/vid-webpack-master/src/app/drawingBoard/drawing-board-header/tmp_instansiate_request.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-header/tmp_instansiate_request.ts index 7accc3a9c..d57e0202f 100644 --- a/vid-webpack-master/src/app/drawingBoard/drawing-board-header/tmp_instansiate_request.ts +++ b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-header/tmp_instansiate_request.ts @@ -8,7 +8,7 @@ export default "modelVersion": "10.0" }, "owningEntityId": "038d99af-0427-42c2-9d15-971b99b9b489", - "owningEntityName": "PACKET CORE", + "owningEntityName": "JULIO ERICKSON", "projectName": "{some project name}", "globalSubscriberId": "{some subscriber id}", "productFamilyId": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb", diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/dragAndDrop/dragAndDrop.model.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/dragAndDrop/dragAndDrop.model.ts new file mode 100644 index 000000000..a8e9b435a --- /dev/null +++ b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/dragAndDrop/dragAndDrop.model.ts @@ -0,0 +1,15 @@ +/****************************************** + type - node type + isFirstLevel : node is first level + ******************************************/ + +export class DragAndDropModel { + type : string; + isFirstLevel : boolean; + + constructor(type : string, isFirstLevel : boolean){ + this.type = type; + this.isFirstLevel = isFirstLevel; + } + +} diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/dragAndDrop/dragAndDrop.service.spec.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/dragAndDrop/dragAndDrop.service.spec.ts new file mode 100644 index 000000000..1221cef5f --- /dev/null +++ b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/dragAndDrop/dragAndDrop.service.spec.ts @@ -0,0 +1,227 @@ +import {TestBed, getTestBed} from '@angular/core/testing'; +import { + HttpClientTestingModule, + HttpTestingController +} from '@angular/common/http/testing'; +import {NgRedux} from "@angular-redux/store"; +import {DragAndDropService} from "./dragAndDrop.service"; +import {AppState} from "../../../../shared/store/reducers"; + +class MockAppStore<T> { + dispatch(){ + + } + getState() { + return { + global: { + flags: { + "DRAG_AND_DROP_OPERATION" : true + } + }, + service: { + serviceInstance: { + "serviceInstanceId": { + vnfs: { + "vnfStoreKey": { + isMissingData: true, + vfModules: { + "vfModulesName": { + "vfModulesName": { + isMissingData: true + } + } + } + }, + + "vnfStoreKey1": { + isMissingData: false, + vfModules: { + "vfModulesName": { + "vfModulesName": { + isMissingData: false + } + } + } + } + } + } + } + } + } + } +} + +describe('Drag and drop service', () => { + let injector; + let service: DragAndDropService; + let httpMock: HttpTestingController; + let store: NgRedux<AppState>; + + beforeAll(done => (async () => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + providers: [ + DragAndDropService, + {provide: NgRedux, useClass: MockAppStore}] + }); + await TestBed.compileComponents(); + + injector = getTestBed(); + service = injector.get(DragAndDropService); + httpMock = injector.get(HttpTestingController); + store = injector.get(NgRedux); + })().then(done).catch(done.fail)); + + + test('drag should move element position', () => { + let nodes = [{ + "modelCustomizationId": "91415b44-753d-494c-926a-456a9172bbb9", + "modelId": "d6557200-ecf2-4641-8094-5393ae3aae60", + "modelUniqueId": "91415b44-753d-494c-926a-456a9172bbb9", + "missingData": false, + "id": "tjjongy92jn", + "action": "Create", + "inMaint": false, + "name": "yoav2_001", + "modelName": "VF_vMee 0", + "type": "VF", + "isEcompGeneratedNaming": true, + "networkStoreKey": "VF_vMee 0:0001", + "vnfStoreKey": "VF_vMee 0:0001", + "typeName": "VNF", + "menuActions": {"edit": {}, "showAuditInfo": {}, "duplicate": {}, "remove": {}, "delete": {}, "undoDelete": {}}, + "isFailed": false, + "statusProperties": [{"key": "Prov Status:", "testId": "provStatus"}, { + "key": "Orch Status:", + "testId": "orchStatus" + }], + "trackById": "di9khuolht", + "parentType": "", + "position": 0, + "children": [{ + "modelCustomizationId": "f8c040f1-7e51-4a11-aca8-acf256cfd861", + "modelId": "a27f5cfc-7f12-4f99-af08-0af9c3885c87", + "modelUniqueId": "f8c040f1-7e51-4a11-aca8-acf256cfd861", + "missingData": false, + "id": 6654971919519, + "action": "Create", + "name": "VFModule1", + "modelName": "vf_vmee0..VfVmee..base_vmme..module-0", + "type": "VFmodule", + "isEcompGeneratedNaming": true, + "dynamicInputs": [], + "dynamicModelName": "vf_vmee0..VfVmee..base_vmme..module-0bykqx", + "typeName": "M", + "menuActions": {"edit": {}, "showAuditInfo": {}, "remove": {}, "delete": {}, "undoDelete": {}}, + "isFailed": false, + "statusProperties": [{"key": "Prov Status:", "testId": "provStatus"}, { + "key": "Orch Status:", + "testId": "orchStatus" + }], + "trackById": "5pfyfah820h", + "parentType": "VNF", + "position": 0, + "errors": {} + }, { + "modelCustomizationId": "6add59e0-7fe1-4bc4-af48-f8812422ae7c", + "modelId": "41708296-e443-4c71-953f-d9a010f059e1", + "modelUniqueId": "6add59e0-7fe1-4bc4-af48-f8812422ae7c", + "missingData": false, + "id": 987761655742, + "action": "Create", + "name": "VNFModule3", + "modelName": "vf_vmee0..VfVmee..vmme_gpb..module-2", + "type": "VFmodule", + "isEcompGeneratedNaming": true, + "dynamicInputs": [], + "dynamicModelName": "vf_vmee0..VfVmee..vmme_gpb..module-2fjrrc", + "typeName": "M", + "menuActions": {"edit": {}, "showAuditInfo": {}, "remove": {}, "delete": {}, "undoDelete": {}}, + "isFailed": false, + "statusProperties": [{"key": "Prov Status:", "testId": "provStatus"}, { + "key": "Orch Status:", + "testId": "orchStatus" + }], + "trackById": "i3dllio31bb", + "parentType": "VNF", + "position": 1, + "errors": {} + }, { + "modelCustomizationId": "55b1be94-671a-403e-a26c-667e9c47d091", + "modelId": "522159d5-d6e0-4c2a-aa44-5a542a12a830", + "modelUniqueId": "55b1be94-671a-403e-a26c-667e9c47d091", + "missingData": false, + "id": 873798901625, + "action": "Create", + "name": "VFModule2", + "modelName": "vf_vmee0..VfVmee..vmme_vlc..module-1", + "type": "VFmodule", + "isEcompGeneratedNaming": true, + "dynamicInputs": [], + "dynamicModelName": "vf_vmee0..VfVmee..vmme_vlc..module-1djjni", + "typeName": "M", + "menuActions": {"edit": {}, "showAuditInfo": {}, "remove": {}, "delete": {}, "undoDelete": {}}, + "isFailed": false, + "statusProperties": [{"key": "Prov Status:", "testId": "provStatus"}, { + "key": "Orch Status:", + "testId": "orchStatus" + }], + "trackById": "w7bvw1nh47s", + "parentType": "VNF", + "position": 2, + "errors": {} + }], + "errors": {} + }, { + "modelCustomizationId": "91415b44-753d-494c-926a-456a9172bbb9", + "modelId": "d6557200-ecf2-4641-8094-5393ae3aae60", + "modelUniqueId": "91415b44-753d-494c-926a-456a9172bbb9", + "missingData": false, + "id": "dywch8hkomi", + "action": "Create", + "inMaint": false, + "name": "yoav2", + "modelName": "VF_vMee 0", + "type": "VF", + "isEcompGeneratedNaming": true, + "networkStoreKey": "VF_vMee 0", + "vnfStoreKey": "VF_vMee 0", + "typeName": "VNF", + "menuActions": {"edit": {}, "showAuditInfo": {}, "duplicate": {}, "remove": {}, "delete": {}, "undoDelete": {}}, + "isFailed": false, + "statusProperties": [{"key": "Prov Status:", "testId": "provStatus"}, { + "key": "Orch Status:", + "testId": "orchStatus" + }], + "trackById": "fjczf1urdqo", + "parentType": "", + "position": 1, + "children": [], + "errors": {} + }]; + let from = { + data: { + type: 'VF', + index: 1 + } + }; + + let to = { + parent: { + data: { + type: 'VF', + index: 0 + } + } + }; + jest.spyOn(service, 'array_move'); + + service.drag(store, "serviceInstanceId", nodes, {from, to}); + + + expect(service.array_move).toHaveBeenCalled(); + + }); + + +}); diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/dragAndDrop/dragAndDrop.service.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/dragAndDrop/dragAndDrop.service.ts new file mode 100644 index 000000000..01763c685 --- /dev/null +++ b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/dragAndDrop/dragAndDrop.service.ts @@ -0,0 +1,78 @@ +import {Injectable} from "@angular/core"; +import {NgRedux} from "@angular-redux/store"; +import {AppState} from "../../../../shared/store/reducers"; +import {DragAndDropModel} from "./dragAndDrop.model"; +import {FeatureFlagsService, Features} from "../../../../shared/services/featureFlag/feature-flags.service"; +import * as _ from 'lodash'; + +@Injectable() +export class DragAndDropService { + + constructor(private store: NgRedux<AppState>){} + + isAllow(): boolean { + return FeatureFlagsService.getFlagState(Features.DRAG_AND_DROP_OPERATION, this.store); + } + /******************************************************************** + * manage drawing-board drag and drop operation + * @param nodes - array with elements data. + * @param tree - tree instance + * @param node - element information + * @param from - element from information + * @param to - element to information + ************************************************************/ + + drag(store, instanceId : string , nodes, {from, to}) :void{ + if (!store.getState().global.flags["DRAG_AND_DROP_OPERATION"]) return; + + let firstLevelNames : DragAndDropModel[] = [ + new DragAndDropModel('VF',true), + new DragAndDropModel('VL',true), + new DragAndDropModel('VFmodule',false) + ]; + + const fromObject = _.find(firstLevelNames, ['type', from.data.type]); + const toObject = _.find(firstLevelNames, ['type', to.parent.data.type]); + + /*********************************************************************************************** + if the type are the same and there in same level + same parent -> then change element position + ***********************************************************************************************/ + if(fromObject.isFirstLevel === toObject.isFirstLevel){ // moving element in the same level and in the first level + if(fromObject.isFirstLevel){ + this.array_move(nodes, from.index , to.parent.index, instanceId); + } else if(fromObject.isFirstLevel === toObject.isFirstLevel){ + /* check if they have the same parent */ + if(from.parent.data.trackById === to.parent.parent.data.trackById){ + let vfModules = nodes.find((parents)=> { + return parents.trackById === to.parent.parent.data.trackById; + }).children; + this.array_move(vfModules, from.index , to.parent.index, instanceId, to.parent.parent.data.vnfStoreKey); + } + } + } + } + + + /******************************************************************** + * move element inside array with elements position + * @param arr - array with elements data. + * @param originalPosition - element original position + * @param destPosition - element dest position + * @param destPinstanceIdosition - instance id + ******************************************************************/ + array_move(arr, originalPosition, destPosition, instanceId : string, parentStoreKey?) { + if (destPosition >= arr.length) { + let k = destPosition - arr.length + 1; + while (k--) { + arr.push(undefined); + } + } + arr.splice(destPosition, 0, arr.splice(originalPosition, 1)[0]); + arr.forEach((item, index) => { + if(item.position !== index){ + item.position = index; + item.updatePoistionFunction(this, item, instanceId, parentStoreKey); + } + }); + }; +} diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/drawing-board-tree.component.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/drawing-board-tree.component.ts new file mode 100644 index 000000000..d0715982c --- /dev/null +++ b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/drawing-board-tree.component.ts @@ -0,0 +1,207 @@ +import {AfterViewInit, Component, EventEmitter, OnInit, Output, ViewChild,} from '@angular/core'; +import {ContextMenuComponent, ContextMenuService} from 'ngx-contextmenu'; +import {Constants} from '../../../shared/utils/constants'; +import {IDType, ITreeNode} from "angular-tree-component/dist/defs/api"; +import {TreeComponent, TreeModel, TreeNode} from "angular-tree-component"; +import {DialogService} from "ng2-bootstrap-modal"; +import {ActivatedRoute} from "@angular/router"; +import {NgRedux} from "@angular-redux/store"; +import {AppState} from "../../../shared/store/reducers"; +import {IframeService} from "../../../shared/utils/iframe.service"; +import {DuplicateService} from '../duplicate/duplicate.service'; +import {DrawingBoardTreeService, TreeNodeContextMenuModel} from "./drawing-board-tree.service"; +import {NetworkPopupService} from "../../../shared/components/genericFormPopup/genericFormServices/network/network.popup.service"; +import {VfModulePopuopService} from "../../../shared/components/genericFormPopup/genericFormServices/vfModule/vfModule.popuop.service"; +import {VnfPopupService} from "../../../shared/components/genericFormPopup/genericFormServices/vnf/vnf.popup.service"; +import {SdcUiServices} from "onap-ui-angular"; +import {HighlightPipe} from "../../../shared/pipes/highlight/highlight-filter.pipe"; +import {VnfGroupPopupService} from "../../../shared/components/genericFormPopup/genericFormServices/vnfGroup/vnfGroup.popup.service"; +import {ObjectToInstanceTreeService} from "../objectsToTree/objectToInstanceTree/objectToInstanceTree.service"; +import {SharedTreeService} from "../objectsToTree/shared.tree.service"; +import {Subject} from "rxjs/Subject"; +import {changeServiceIsDirty} from "../../../shared/storeUtil/utils/service/service.actions"; +import * as _ from 'lodash'; +import {ErrorMsgService} from "../../../shared/components/error-msg/error-msg.service"; +import {DragAndDropService} from "./dragAndDrop/dragAndDrop.service"; +import {FeatureFlagsService, Features} from "../../../shared/services/featureFlag/feature-flags.service"; +import {PopoverPlacement} from "../../../shared/components/popover/popover.component"; + +@Component({ + selector: 'drawing-board-tree', + templateUrl: './drawing-board-tree.html', + styleUrls: ['./drawing-board-tree.scss'], + providers: [HighlightPipe] +}) + +export class DrawingBoardTreeComponent implements OnInit, AfterViewInit { + _store: NgRedux<AppState>; + duplicateService: DuplicateService; + drawingBoardTreeService: DrawingBoardTreeService; + errorMsgService: ErrorMsgService; + isFilterEnabled: boolean = false; + filterValue: string = ''; + contextMenuOptions: TreeNodeContextMenuModel[]; + static triggerDeleteActionService: Subject<string> = new Subject<string>(); + static triggerUndoDeleteActionService: Subject<string> = new Subject<string>(); + static triggerreCalculateIsDirty: Subject<string> = new Subject<string>(); + @ViewChild(ContextMenuComponent) public contextMenu: ContextMenuComponent; + + constructor(private _contextMenuService: ContextMenuService, + private _iframeService: IframeService, + private dialogService: DialogService, + private store: NgRedux<AppState>, + private route: ActivatedRoute, + private _duplicateService: DuplicateService, + private modalService: SdcUiServices.ModalService, + private _drawingBoardTreeService: DrawingBoardTreeService, + private _networkPopupService: NetworkPopupService, + private _vfModulePopuopService: VfModulePopuopService, + private _vnfPopupService: VnfPopupService, + private _vnfGroupPopupService: VnfGroupPopupService, + private _errorMsgService: ErrorMsgService, + private _highlightPipe: HighlightPipe, + private _objectToInstanceTreeService: ObjectToInstanceTreeService, + private _sharedTreeService: SharedTreeService, + private _dragAndDropService : DragAndDropService) { + + this.errorMsgService = _errorMsgService; + this.duplicateService = _duplicateService; + this.drawingBoardTreeService = _drawingBoardTreeService; + this.contextMenuOptions = _drawingBoardTreeService.generateContextMenuOptions(); + + DrawingBoardTreeComponent.triggerDeleteActionService.subscribe((serviceModelId) => { + this._sharedTreeService.shouldShowDeleteInstanceWithChildrenModal(this.nodes, serviceModelId, (node, serviceModelId)=>{ + this.drawingBoardTreeService.deleteActionService(this.nodes, serviceModelId); + this.store.dispatch(changeServiceIsDirty(this.nodes, serviceModelId)); + }); + }); + + DrawingBoardTreeComponent.triggerUndoDeleteActionService.subscribe((serviceModelId) => { + this.drawingBoardTreeService.undoDeleteActionService(this.nodes, serviceModelId); + this.store.dispatch(changeServiceIsDirty(this.nodes, serviceModelId)); + }); + + DrawingBoardTreeComponent.triggerreCalculateIsDirty.subscribe((serviceModelId) => { + this.store.dispatch(changeServiceIsDirty(this.nodes, serviceModelId)); + }); + + this._store = store; + this.route + .queryParams + .subscribe(params => { + this.serviceModelId = params['serviceModelId']; + }); + } + + getNodeId(node: ITreeNode): string { + return (node.data.parentType !== "" ? (node.data.parentType + "_") : "") + node.data.typeName; + } + + updateNodes(updateData: { nodes: any, filterValue: string }): void { + this.nodes = updateData.nodes; + this.filterValue = updateData.filterValue; + } + + @Output() + highlightNode: EventEmitter<number> = new EventEmitter<number>(); + + @ViewChild('tree') tree: TreeComponent; + missingDataTooltip: string = Constants.Error.MISSING_VNF_DETAILS; + currentNode: ITreeNode = null; + flags: any; + nodes = []; + serviceModelId: string; + options = { + allowDrag: this._dragAndDropService.isAllow(), + actionMapping: { + mouse: { + drop: (tree:TreeModel, node:TreeNode, $event:any, {from, to}) => { + this._dragAndDropService.drag(this.store, this.serviceModelId, this.nodes, {from, to}); + } + } + }, + nodeHeight: 45, + dropSlotHeight: 1 + }; + parentElementClassName = 'content'; + + ngOnInit(): void { + this.store.subscribe(() => { + this.updateTree(); + }); + this.updateTree() + } + + getNodeName(node: ITreeNode, filter: string) { + return this._highlightPipe.transform(node.data.name, filter ? filter : ''); + } + + updateTree() { + const serviceInstance = this.store.getState().service.serviceInstance[this.serviceModelId]; + this.nodes = this._objectToInstanceTreeService.convertServiceInstanceToTreeData(serviceInstance, this.store.getState().service.serviceHierarchy[this.serviceModelId]); + console.log('right nodes', this.nodes); + + } + + + ngAfterViewInit(): void { + this.tree.treeModel.expandAll(); + } + + public onContextMenu($event: MouseEvent, node: ITreeNode): void { + this.flags = this.store.getState().global.flags; + + this.currentNode = node; + node.focus(); + node.setActiveAndVisible(false); + this.selectNode(node); + setTimeout(() => { + this._contextMenuService.show.next({ + contextMenu: this.contextMenu, + event: <any>$event, + item: node, + }); + $event.preventDefault(); + $event.stopPropagation(); + }, 250); + + } + + + executeMenuAction(methodName: string): void { + if (!_.isNil(this.currentNode.data.menuActions) && !_.isNil(this.currentNode.data.menuActions[methodName])) { + this.currentNode.data.menuActions[methodName]['method'](this.currentNode, this.serviceModelId); + this.store.dispatch(changeServiceIsDirty(this.nodes, this.serviceModelId)); + } + } + + isEnabled(node: ITreeNode, serviceModelId: string, methodName: string): boolean { + if (!_.isNil(this.currentNode) && !_.isNil(this.currentNode.data.menuActions) && !_.isNil(this.currentNode.data.menuActions[methodName])) { + return this.currentNode.data.menuActions[methodName]['enable'](this.currentNode, this.serviceModelId); + } + return false; + } + + isVisible(node: ITreeNode, methodName: string): boolean { + if (!_.isNil(this.currentNode) && !_.isNil(this.currentNode.data.menuActions) && !_.isNil(this.currentNode.data.menuActions[methodName])) { + return this.currentNode.data.menuActions[methodName]['visible'](this.currentNode, this.serviceModelId); + } + return false; + } + + public selectNode(node: ITreeNode): void { + node.expand(); + this._sharedTreeService.setSelectedVNF(node); + this.highlightNode.emit(node.data.modelUniqueId); + if (FeatureFlagsService.getFlagState(Features.FLAG_1906_COMPONENT_INFO, this.store)) { + node.data.onSelectedNode(node); + } + } + + expandParentByNodeId(id: IDType): void { + this.tree.treeModel.getNodeById(id).parent.expand(); + } + +} + + diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/drawing-board-tree.html b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/drawing-board-tree.html new file mode 100644 index 000000000..8af909ffc --- /dev/null +++ b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/drawing-board-tree.html @@ -0,0 +1,96 @@ +<error-msg></error-msg> +<div class="drawing-board-tree" style="height: calc(100vh - 55px);"> + <div *ngIf="nodes?.length == 0" style="text-align: center; margin-top: 50px;"> + <no-content-message-and-icon class="span-over" + data-title="Please add objects (VNFs, network, modules etc.)" + title2="from the left tree to design the service instance" + subtitle="Once done, click Deploy to start instantiation" + iconPath="./assets/img/UPLOAD.svg" + iconClass="upload-icon-service-planing"></no-content-message-and-icon> + </div> + <div class="tree-header" *ngIf="nodes?.length > 0"> + <div class="title-tree">Instance:</div> + <search-component (updateNodes)="updateNodes($event)" + [nodes]="nodes" [tree]="tree" + [inputTestId]="'search-right-tree'" + *ngIf="drawingBoardTreeService.isViewEditFlagTrue()"></search-component> + </div> + <tree-root [attr.data-tests-id]="'drawing-board-tree'" #tree [nodes]="nodes" [options]="options" + id="drawing-board-tree"> + + <ng-template #treeNodeTemplate let-node let-index="index" > + <div [attr.id]="getNodeId(node)" [attr.data-tests-id]="'node-'+node.data.modelId +'-' +node.data.modelName" (click)="selectNode(node)" > + <custom-popover class="failed-popover-wrap" *ngIf= "node?.data?.isFailed" [value]= "node?.data?.statusMessage" [placement]="'left'" [popoverType]="'error'"> + <div class="failed-msg" [attr.data-tests-id]="'failed-error-message'" *ngIf= "node?.data?.isFailed">Failed</div> + </custom-popover> + <div class="instance-type" style="position: relative;"> + <div *ngIf="node?.data?.action == 'Create'" class="notShowOnViewMode notShowOnCreateMode newIcon"></div> + <div><span title="{{node.data.type}}" [attr.data-tests-id]="'node-type-indicator'">{{node?.data?.typeName}}</span></div> + </div> + <div class="model-info"> + <span class="header-info"> + <span class="property-name"> + <span class="auto-name" + [ngClass]="{'text_decoration' : drawingBoardTreeService.isTextDecoration(node)}" + [innerHtml]="getNodeName(node, filterValue) | safe : 'html'" + [attr.data-tests-id]="'node-name'" + ></span> + </span> + </span> + <tree-node-header-properties + *ngIf="(node?.data?.action !== 'Create' || node?.data?.parentType === 'VnfGroup') && !node?.data?.isFailed" + [properties]="node.data.statusProperties"></tree-node-header-properties> + </div> + <div class="scaling invalid" *ngIf="node?.data?.errors?.scalingError" [attr.data-tests-id]="'scaling-policy'"> + <span>Limit</span><span>{{node?.data?.limitMembers}}</span> + </div> + <div class="model-actions notShowOnViewMode"> + <span class="icon-browse" + [attr.data-tests-id]="'node-'+node.data.modelId +'-' +node.data.modelName+'-menu-btn'" + (click)="onContextMenu($event, node)"> + <context-menu> + <ng-template *ngFor="let contextMenuOption of contextMenuOptions" + contextMenuItem (execute)="executeMenuAction(contextMenuOption.methodName)" + [visible]="isVisible(currentNode, contextMenuOption.methodName)" + [enabled]="isEnabled(currentNode, serviceModelId, contextMenuOption.methodName)"> + <div [attr.data-tests-id]="contextMenuOption.dataTestId"> + <div style="float: left;margin-top: 3px;"> + <svg-icon + [ngClass]="contextMenuOption.iconClass" + class="icon-edit" + [size]="'small'" + [name]="contextMenuOption.iconClass"> + </svg-icon></div> + <div style="padding-left: 25px;">{{contextMenuOption.label}}</div> + </div> + </ng-template> + </context-menu> + </span> + <span + *ngIf="drawingBoardTreeService.isVNFMissingData(node, serviceModelId)" + tooltip="{{ missingDataTooltip }}" + tooltipPlacement="left" + [attr.data-tests-id]="'node-'+node.data.modelId +'-' +node.data.modelName+'-alert-icon'" + class="icon-alert" > + <svg-icon + [mode]="'warning'" + [testId]="'icon-alert'" + [size]="'medium'" + [name]="'alert-triangle-o'"> + </svg-icon> + </span> + + <!--<span *ngIf="drawingBoardTreeService.isVNFMissingData(node, serviceModelId)" class="icon-alert"--> + <!--tooltip="{{ missingDataTooltip }}" tooltipPlacement="left"--> + <!--[attr.data-tests-id]="'node-'+node.data.modelId +'-' +node.data.modelName+'-alert-icon'"></span>--> + <span *ngIf="drawingBoardTreeService.isVFModuleMissingData(node, serviceModelId)" class="icon-alert" + tooltip="{{ missingDataTooltip }}" tooltipPlacement="left" + [attr.data-tests-id]="'node-'+node.data.modelId +'-' +node.data.modelName+'-alert-icon'"></span> + </div> + </div > + </ng-template> + </tree-root> +</div> + + + diff --git a/vid-webpack-master/src/app/drawingBoard/drawing-board-tree/drawing-board-tree.scss b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/drawing-board-tree.scss index fed9ead10..be9f9f2d4 100644 --- a/vid-webpack-master/src/app/drawingBoard/drawing-board-tree/drawing-board-tree.scss +++ b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/drawing-board-tree.scss @@ -11,11 +11,19 @@ span.toggle-children { @include highlight(white, #009FDB); border-right: none; + .isFailed { + left: 0px !important; + } } } + } } +#VNF > node-content-wrapper { + border: 1px dashed #D2D2D2 !important; +} + @mixin highlight-tree-node-content { tree-node-content { > div { @@ -28,23 +36,55 @@ } } +#RETRY_EDIT drawing-board-tree tree-node-collection > div, +#RETRY drawing-board-tree tree-node-collection > div { + margin-top: 0px; + width: calc(100% - 50px); + margin-left: auto; + } + drawing-board-tree { + flex: 1; + color: #5A5A5A; + line-height: 14px; + flex-direction:column; + + &.col-md-6,&.col-md-5{ + padding: 0; + } + .tree-header { + display: flex; + justify-content: space-between; + .title-tree { + font-family: OpenSans-SemiBold; + font-size: 16px; + color: #191919; + text-align: left; + text-transform: uppercase; + padding-bottom: 48px; + } + .search-container { + width: 275px; + } + } + .highlight { + background-color: #9DD9EF; + } .toggle-children-wrapper.toggle-children-wrapper-expanded { .toggle-children:before { color: #009FDB; } } - - overflow: auto; - flex: 1; - color: #5A5A5A; - line-height: 14px; .drawing-board-tree { width: 100%; + padding: 30px 45px; + } + + .tree-node-level-1 { + margin-bottom: 10px; } tree-viewport { - padding: 50px 3.5% 1% 6%; tree-node { tree-node-drop-slot { .node-drop-slot { @@ -57,14 +97,17 @@ drawing-board-tree { .node-wrapper { @include highlight-toggle-children; .node-content-wrapper-focused, - .node-content-wrapper-active - { + .node-content-wrapper-active { + @include highlight-toggle-children; @include highlight(#E6F6FB, #009FDB); - .property-name { - color: #009FDB; + .property-name,.instance-type { + color: #009FDB !important; + position: relative; } - .auto-name { - font-family: OpenSans-Regular !important; + .status-properties { + .status-property-value,.status-property-name { + color: #009FDB; + } } .icon-browse:before { color: #5A5A5A; @@ -81,30 +124,29 @@ drawing-board-tree { } .tree-node-active .tree-children { - border: 1px solid #009FDB; - padding: 20px; + //border: 1px solid #009FDB; + padding-left: 45px; } - - .tree-node.tree-node-active.tree-node-expanded { - border: 1px solid #009FDB; } - .tree-node-leaf .node-wrapper{ - margin-left: -45px; + .tree-children .tree-node-leaf .node-wrapper{ + margin-left: -5px; } + .tree-node.tree-node-expanded > tree-node-wrapper{ + box-shadow: 0 2px 2px 0 rgba(0,0,0,.1); + position: relative; + z-index: 1; + display: block; + } tree-node-wrapper { .node-wrapper { height: 45px; &:hover { - @include highlight-toggle-children; - .node-content-wrapper { - @include highlight(#E6F6FB, #009FDB); - .property-name { - color: #009FDB; - } + .node-content-wrapper:not(.node-content-wrapper-focused) { + background: #F2F2F2; .icon-browse:before { color: #5A5A5A; } @@ -114,6 +156,9 @@ drawing-board-tree { tree-node-expander { font-family: 'icomoon' !important; height: 100%; + .failed-msg { + + } .toggle-children-wrapper { padding: 0; display: block; @@ -151,6 +196,7 @@ drawing-board-tree { width:45px; } } + .node-content-wrapper { padding: 0; background: none; @@ -159,33 +205,93 @@ drawing-board-tree { border: 1px solid #D2D2D2; height: 100%; flex: 1; + .resourceGroup { + border: 1px dashed #D2D2D2 !important; + } tree-node-content { > div { height: 100%; display: flex; align-items: center; - justify-content: space-between; - .model-info { + + .instance-type { + width: 40px; + height: 100%; + padding-top: 16px; + text-transform: uppercase; + text-align: center; + border-right: 1px solid #D2D2D2; + word-break: break-all; + color: #959595; + font-size: 13px; + font-family: OpenSans-SemiBold; + .newIcon { + background: #45B16D; + position: absolute; + top: 5%; + width: 90%; + left: 5%; + right: 5%; + border-radius: 2px; + height: 5px; + } + span { + width: 40px; + display: block; + } + } > span { flex: 1; - display: flex; - justify-content: space-between; - align-items: center; - padding-left: 8px; - > span { - flex: 1; - padding: 0 8px; - span:nth-child(2) { - display: block; + display: block; + + span:nth-child(2) { + display: block; + } + } + .model-info { + padding-left: 16px; + width: 100%; + .property-name { + font-family: OpenSans-SemiBold; + font-size: 13px; + color: #191919; + //text-transform: capitalize; problematic with search + .auto-name{ + display: inline-flex;//required for search more then one sub highlight, + font-size: 13px; + } + .text_decoration{ + text-decoration: line-through; + } + + .text_decoration:after { + height: 10px; } } + tree-node-header-properties{ + display: block; + } + } + .scaling { + background: #4ca90c; + padding: 5px; + border-radius: 3px; + font-family: OpenSans-SemiBold; + font-size: 12px; + color: #FFF9F9; + &.invalid{ + background: #cf2a2a; + } + span:first-child{ + margin-right: 3px; + } } .model-actions { display: flex; align-items: center; - padding-right: 12px; .icon-browse { padding: 0; width: 30px; + height: 24px; &:before { content: "\e924"; font-size: 24px; @@ -201,31 +307,17 @@ drawing-board-tree { } .icon-alert { - padding-left: 10px; - &:before { - content: "\e904"; - font-size: 16px; - color: #ffb81c; - } + padding-right: 10px; } } } } - .property-name { - font-family: OpenSans-Semibold; - font-size: 12px; - line-height: 12px; - color: #191919; - text-transform: capitalize; - } } - - } } tree-node-children { .tree-children { - padding: 20px; + padding-left: 45px; .model-info span:first-child { flex: 1.1 !important; } @@ -234,6 +326,44 @@ drawing-board-tree { } } } + + +.tree-node-level-1.tree-node.tree-node-expanded { + .failed-popover-wrap { + left: -50px !important; + position: absolute; + } +} +.tree-node-level-1 { + .failed-popover-wrap { + left: 45px !important; + position: absolute; + } +} + +.tree-node-level-2.tree-node.tree-node-leaf { + .failed-popover-wrap { + left: 135px !important; + position: absolute; + } +} + +.tree-node-level-1.tree-node.tree-node-collapsed { + .failed-popover-wrap{ + left: 0px !important; + position: absolute; + } +} + +.failed-msg{ + background: #cf2a2a; + padding: 5px; + border-radius: 3px; + font-family: OpenSans-SemiBold; + font-size: 12px; + color: #FFF9F9; +} + .cdk-overlay-pane.ngx-contextmenu { ul.dropdown-menu { width: 200px; @@ -272,3 +402,4 @@ drawing-board-tree { } } + diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/drawing-board-tree.service.spec.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/drawing-board-tree.service.spec.ts new file mode 100644 index 000000000..1b913cfe9 --- /dev/null +++ b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/drawing-board-tree.service.spec.ts @@ -0,0 +1,147 @@ +import {TestBed, getTestBed} from '@angular/core/testing'; +import { + HttpClientTestingModule, + HttpTestingController +} from '@angular/common/http/testing'; +import {NgRedux} from "@angular-redux/store"; +import {DrawingBoardTreeService, TreeNodeContextMenuModel} from "./drawing-board-tree.service"; +import {ITreeNode} from "angular-tree-component/dist/defs/api"; + + class MockAppStore<T>{ + getState() { + return { + service : { + serviceInstance : { + "serviceInstanceId" : { + vnfs : { + "vnfStoreKey" : { + isMissingData : true, + vfModules : { + "vfModulesName" : { + "vfModulesName" : { + isMissingData : true + } + } + } + }, + + "vnfStoreKey1" : { + isMissingData : false, + vfModules : { + "vfModulesName" : { + "vfModulesName" : { + isMissingData : false + } + } + } + } + } + } + } + } + } + } +} + +describe('Drawing board tree Service', () => { + let injector; + let service: DrawingBoardTreeService; + let httpMock: HttpTestingController; + + + beforeAll(done => (async () => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + providers: [ + DrawingBoardTreeService, + {provide: NgRedux, useClass: MockAppStore}] + }); + await TestBed.compileComponents(); + + injector = getTestBed(); + service = injector.get(DrawingBoardTreeService); + httpMock = injector.get(HttpTestingController); + + })().then(done).catch(done.fail)); + + + + + test('generateContextMenuOptions should return list of optional context menu', () => { + const options : TreeNodeContextMenuModel[] = service.generateContextMenuOptions(); + const expected : TreeNodeContextMenuModel[] = [ + new TreeNodeContextMenuModel('edit', 'context-menu-edit', 'Edit', 'edit-file-o'), + new TreeNodeContextMenuModel('duplicate', 'context-menu-duplicate', 'Duplicate', 'copy-o'), + new TreeNodeContextMenuModel('showAuditInfo', 'context-menu-showAuditInfo', 'Show audit info', 'eye-o'), + new TreeNodeContextMenuModel('addGroupMember', 'context-menu-addGroupMember', 'Add group members', 'plus'), + new TreeNodeContextMenuModel('delete', 'context-menu-delete', 'Delete', 'trash-o'), + new TreeNodeContextMenuModel('remove', 'context-menu-remove', 'Remove', 'trash-o'), + new TreeNodeContextMenuModel('undoDelete', 'context-menu-undoDelete', 'Undo Delete', 'undo-delete') + ]; + expect(options.length).toEqual(7); + expect(options).toEqual(expected); + }); + + test('isVNFMissingData should return true if vnf isMissingData = true', () => { + let node : ITreeNode = <any>{ + data : { + type : 'VF', + vnfStoreKey : "vnfStoreKey" + } + }; + let result : boolean = service.isVNFMissingData(node, "serviceInstanceId"); + expect(result).toBeTruthy(); + }); + + + test('isVNFMissingData should return false if vnf has isMissingData = false', () => { + let node : ITreeNode = <any>{ + data : { + type : 'VFModule', + modelName : "vfModulesName", + dynamicModelName : "vfModulesName", + parent : { + vnfStoreKey : "vnfStoreKey1", + type : 'VF' + } + } + }; + let result : boolean = service.isVNFMissingData(node, "serviceInstanceId"); + expect(result).toBeFalsy(); + }); + + + test('isVFModuleMissingData should return true if vnfModule has isMissingData = true', () => { + let node : ITreeNode = <any>{ + data : { + type : 'VFModule', + modelName : "vfModulesName", + dynamicModelName : "vfModulesName", + parent : { + vnfStoreKey : "vnfStoreKey", + type : 'VF' + } + } + }; + let result : boolean = service.isVFModuleMissingData(node, "serviceInstanceId"); + expect(result).toBeFalsy(); + }); + + + test('isVFModuleMissingData should return false if vnfModule has isMissingData = false', () => { + let node : ITreeNode = <any>{ + data : { + type : 'VFModule', + modelName : "vfModulesName", + dynamicModelName : "vfModulesName", + parent : { + vnfStoreKey : "vnfStoreKey1", + type : 'VF' + } + } + }; + let result : boolean = service.isVFModuleMissingData(node, "serviceInstanceId"); + expect(result).toBeFalsy(); + }); + +}); diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/drawing-board-tree.service.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/drawing-board-tree.service.ts new file mode 100644 index 000000000..17f761c41 --- /dev/null +++ b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/drawing-board-tree.service.ts @@ -0,0 +1,129 @@ +import {Injectable} from "@angular/core"; +import {ITreeNode} from "angular-tree-component/dist/defs/api"; +import * as _ from 'lodash'; +import {NgRedux} from "@angular-redux/store"; +import {AppState} from "../../../shared/store/reducers"; +import {FeatureFlagsService, Features} from "../../../shared/services/featureFlag/feature-flags.service"; +import {ServiceInstanceActions} from "../../../shared/models/serviceInstanceActions"; + +@Injectable() +export class DrawingBoardTreeService { + constructor(private store: NgRedux<AppState>){} + isVFModuleMissingData(node: ITreeNode, serviceModelId : string): boolean { + if(node.data.type === 'VFmodule' &&!_.isNil(this.store.getState().service.serviceInstance[serviceModelId].vnfs) && !_.isNil(this.store.getState().service.serviceInstance[serviceModelId].vnfs[node.parent.data.vnfStoreKey])){ + if(!_.isNil(this.store.getState().service.serviceInstance[serviceModelId].vnfs[node.parent.data.vnfStoreKey].vfModules) + && !_.isNil(this.store.getState().service.serviceInstance[serviceModelId].vnfs[node.parent.data.vnfStoreKey].vfModules[node.data.modelName]) + && !_.isNil(this.store.getState().service.serviceInstance[serviceModelId].vnfs[node.parent.data.vnfStoreKey].vfModules[node.data.modelName][node.data.dynamicModelName])){ + + return this.store.getState().service.serviceInstance[serviceModelId].vnfs[node.parent.data.vnfStoreKey].vfModules[node.data.modelName][node.data.dynamicModelName].isMissingData; + } + } + return false; + } + + isVNFMissingData(node : ITreeNode, serviceModelId : string) : boolean { + if(node.data.type == 'VF' && !_.isNil(this.store.getState().service.serviceInstance[serviceModelId].vnfs[node.data.vnfStoreKey])){ + return this.store.getState().service.serviceInstance[serviceModelId].vnfs[node.data.vnfStoreKey].isMissingData; + } + } + + isViewEditFlagTrue():boolean{ + return FeatureFlagsService.getFlagState(Features.FLAG_1902_NEW_VIEW_EDIT, this.store); + } + + /********************************************** + return all drawing board context menu options + ***********************************************/ + generateContextMenuOptions() : TreeNodeContextMenuModel[]{ + return [ + new TreeNodeContextMenuModel('edit', 'context-menu-edit', 'Edit', 'edit-file-o'), + new TreeNodeContextMenuModel('duplicate', 'context-menu-duplicate', 'Duplicate', 'copy-o'), + new TreeNodeContextMenuModel('showAuditInfo', 'context-menu-showAuditInfo', 'Show audit info', 'eye-o'), + new TreeNodeContextMenuModel('addGroupMember', 'context-menu-addGroupMember', 'Add group members', 'plus'), + new TreeNodeContextMenuModel('delete', 'context-menu-delete', 'Delete', 'trash-o'), + new TreeNodeContextMenuModel('remove', 'context-menu-remove', 'Remove', 'trash-o'), + new TreeNodeContextMenuModel('undoDelete', 'context-menu-undoDelete', 'Undo Delete', 'undo-delete') + ]; + } + + + /******************************************************************* + delete or remove all service child's on delete existing service + *******************************************************************/ + deleteActionService(nodes : ITreeNode[], serviceModelId : string){ + if(!_.isNil(nodes)){ + for(let node of nodes){ + node.data = node; + if(!_.isNil(node.children)){ + node.children.map((child)=>{ + child.data = child; + child.parent = node; + }); + } + + let menuActionsName : string = node.data.action === ServiceInstanceActions.Create ? 'remove' : 'delete'; + if(!_.isNil(node.data.menuActions) && !_.isNil(node.data.menuActions[menuActionsName])){ + node.data.menuActions[menuActionsName]['method'](node, serviceModelId) + } + + } + } + } + /******************************************************************* + undo delete all service child's on undo delete existing service + *******************************************************************/ + undoDeleteActionService(nodes : ITreeNode[], serviceModelId : string){ + if(!_.isNil(nodes)){ + for(let node of nodes){ + node.data = node; + if(!_.isNil(node.children)){ + node.children.map((child)=>{ + child.data = child; + child.parent = node; + }); + } + + if(!_.isNil(node.data.menuActions) && !_.isNil(node.data.menuActions['undoDelete'])){ + node.data.menuActions['undoDelete']['method'](node, serviceModelId) + } + } + } + } + + /*********************************************************** + return true if should add line hover the instance name + ***********************************************************/ + isTextDecoration(node) : boolean{ + return !_.isNil(node.data) && !_.isNil(node.data.action) && node.data.action.split('_').pop() === 'Delete'; + } + + + /****************************************** + should create object of instances action + ******************************************/ + generateServiceActionObject(nodes){ + let obj = {}; + let index = 0; + for(let node of nodes){ + obj[index] = {}; + index++; + } + } +} + +export class TreeNodeContextMenuModel { + methodName: string; + dataTestId: string; + label: string; + iconClass: string; + + constructor(methodName: string, + dataTestId: string, + label: string, + iconClass: string) { + this.methodName = methodName; + this.dataTestId = dataTestId; + this.label = label; + this.iconClass = iconClass; + } +} diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/instance.tree.generator.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/instance.tree.generator.ts new file mode 100644 index 000000000..188feaaba --- /dev/null +++ b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/instance.tree.generator.ts @@ -0,0 +1,8 @@ +import {Injectable} from "@angular/core"; + +@Injectable() +export class InstanceTreeGenerator { + convertServiceInstanceToTreeData(serviceInstance, serviceModelId : string) { + + } +} diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/tree-node-header-properties/tree-node-header-properties.component.html b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/tree-node-header-properties/tree-node-header-properties.component.html new file mode 100644 index 000000000..dae6762e0 --- /dev/null +++ b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/tree-node-header-properties/tree-node-header-properties.component.html @@ -0,0 +1,5 @@ +<div class="status-properties" *ngFor="let prop of properties"> + <span class="status-property-name" [ngClass]="{'mark': prop.key=='In-maintenance'}">{{ prop.key }}</span> + <span class="status-property-value" [attr.data-tests-id]="'status-property-'+prop?.testId" >{{ prop.value }}</span> + <span class="separator">|</span> +</div> diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/tree-node-header-properties/tree-node-header-properties.component.scss b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/tree-node-header-properties/tree-node-header-properties.component.scss new file mode 100644 index 000000000..305de8cd7 --- /dev/null +++ b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/tree-node-header-properties/tree-node-header-properties.component.scss @@ -0,0 +1,24 @@ +.status-properties{ + display: inline-block; + font-family: OpenSans-Regular; + font-size: 12px; + padding-top: 3px; + .status-property-name{ + color: #5A5A5A; + &.mark{ + background-color: #959595; + color: #ffffff; + } + } + .status-property-value{ + color: #191919; + } + .separator{ + padding: 0 8px; + } + &:last-child .separator{ + display: none; + } + +} + diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/tree-node-header-properties/tree-node-header-properties.component.spec.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/tree-node-header-properties/tree-node-header-properties.component.spec.ts new file mode 100644 index 000000000..047f2e89d --- /dev/null +++ b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/tree-node-header-properties/tree-node-header-properties.component.spec.ts @@ -0,0 +1,25 @@ +import {ComponentFixture, TestBed } from '@angular/core/testing'; +import { TreeNodeHeaderPropertiesComponent } from './tree-node-header-properties.component'; + +describe('TreeNodeHeaderPropertiesComponent', () => { + let component: TreeNodeHeaderPropertiesComponent; + let fixture: ComponentFixture<TreeNodeHeaderPropertiesComponent>; + + + beforeAll(done => (async () => { + TestBed.configureTestingModule({ + declarations: [ TreeNodeHeaderPropertiesComponent ] + }); + await TestBed.compileComponents(); + + fixture = TestBed.createComponent(TreeNodeHeaderPropertiesComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + + })().then(done).catch(done.fail)); + + + test('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/tree-node-header-properties/tree-node-header-properties.component.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/tree-node-header-properties/tree-node-header-properties.component.ts new file mode 100644 index 000000000..535d7ea52 --- /dev/null +++ b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/tree-node-header-properties/tree-node-header-properties.component.ts @@ -0,0 +1,10 @@ +import {Component, Input} from '@angular/core'; + +@Component({ + selector: 'tree-node-header-properties', + templateUrl: './tree-node-header-properties.component.html', + styleUrls: ['./tree-node-header-properties.component.scss'] +}) +export class TreeNodeHeaderPropertiesComponent { + @Input() properties : object[] = []; +} diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board.modes.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board.modes.ts new file mode 100644 index 000000000..452666f91 --- /dev/null +++ b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board.modes.ts @@ -0,0 +1,8 @@ +export enum DrawingBoardModes { + RETRY = 'RETRY', + RETRY_EDIT = 'RETRY_EDIT', + VIEW = 'VIEW', + EDIT = 'EDIT', + OLD_VIEW_EDIT = 'OLD_VIEW_EDIT', + CREATE = 'CREATE' +} diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/duplicate/duplicate-vnf.component.html b/vid-webpack-master/src/app/drawingBoard/service-planning/duplicate/duplicate-vnf.component.html new file mode 100644 index 000000000..c5f43b9c8 --- /dev/null +++ b/vid-webpack-master/src/app/drawingBoard/service-planning/duplicate/duplicate-vnf.component.html @@ -0,0 +1,19 @@ +<div> + <div> + <span style="font-weight: bold;"> + Please select the number of additional instances you want to add of this node. + </span> + </div> + <div> + <span style="font-weight: bold;"> + Important: VID will duplicate this node including its children. + </span> + </div> + + <div class="duplicate-number"> + <select class="quantity-select" [(ngModel)]="duplicateNumber" name="duplicate" [attr.data-tests-id]="'duplicate-amount-vfmodules'" id="duplicate-select" (change)="onDuplicateNumberChange()"> + <option *ngFor="let item of duplicateOptions" [value]="item">{{item}}</option> + </select> + </div> + <!--TODO max --> +</div> diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/duplicate/duplicate-vnf.component.scss b/vid-webpack-master/src/app/drawingBoard/service-planning/duplicate/duplicate-vnf.component.scss new file mode 100644 index 000000000..f5b566d0b --- /dev/null +++ b/vid-webpack-master/src/app/drawingBoard/service-planning/duplicate/duplicate-vnf.component.scss @@ -0,0 +1,9 @@ +.quantity-select { + width: 100%; + font-family: inherit; + font-size: inherit; + border: 1px solid #009FDB; + margin-top: 10px; + padding-left: 7px; + height: 30px; +} diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/duplicate/duplicate-vnf.component.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/duplicate/duplicate-vnf.component.ts new file mode 100644 index 000000000..e1c5d7296 --- /dev/null +++ b/vid-webpack-master/src/app/drawingBoard/service-planning/duplicate/duplicate-vnf.component.ts @@ -0,0 +1,25 @@ +import { Component } from '@angular/core'; +import * as _ from 'lodash'; +import {DuplicateService} from "./duplicate.service"; + +@Component({ + selector: 'duplicate-vnf', + templateUrl : './duplicate-vnf.component.html', + styleUrls : ['./duplicate-vnf.component.scss'] +}) +export class DuplicateVnfComponent { + duplicateNumber : number = 1; + duplicateOptions : number[] = []; + duplicateService:DuplicateService; + constructor( private _duplicateService: DuplicateService ){ + this.duplicateService = _duplicateService; + this.duplicateOptions = _.range(1, this._duplicateService.maxNumberOfDuplicate + 1); + this.onDuplicateNumberChange(); + } + + onDuplicateNumberChange() { + this.duplicateService.setNumberOfDuplicates(+this.duplicateNumber); + } + + +} diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/duplicate/duplicate.service.spec.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/duplicate/duplicate.service.spec.ts new file mode 100644 index 000000000..81251cb1a --- /dev/null +++ b/vid-webpack-master/src/app/drawingBoard/service-planning/duplicate/duplicate.service.spec.ts @@ -0,0 +1,449 @@ +import { DuplicateService } from './duplicate.service'; +import { LogService } from '../../../shared/utils/log/log.service'; +import { NgRedux } from '@angular-redux/store'; +import {ITreeNode} from "angular-tree-component/dist/defs/api"; +import { SdcUiServices} from "onap-ui-angular"; +import {IModalConfig} from "onap-ui-angular/dist/components/common"; +import {AppState} from "../../../shared/store/reducers"; +import {getTestBed, TestBed} from "@angular/core/testing"; + +class MockAppStore<T> { + getState(){ + return { + getState() { + return { + service : { + serviceHierarchy: { + "serviceId" : { + vnfs : { + "vnfModelName" : { + properties : { + max_instances : 2 + } + }, + "vnfModelName2" : { + properties : { + max_instances : 2 + } + }, + "vnfModelName3" : { + properties : { + } + } + } + } + }, + serviceInstance : { + "serviceId" : { + existingVNFCounterMap : { + "vnfModelId" : 1, + "vnfModelId2" : 2, + "vnfModelId3" : 0 + } + } + + } + } + } + } + } + } +} + +class MockModalService<T> {} + +describe('Drawing board tree service', () => { + let injector; + let service: DuplicateService; + let store : NgRedux<AppState>; + beforeAll(done => (async () => { + TestBed.configureTestingModule({ + providers : [ + DuplicateService, + LogService, + {provide: NgRedux, useClass: MockAppStore}, + {provide: SdcUiServices.ModalService, useClass: MockModalService} + ] + }); + await TestBed.compileComponents(); + + injector = getTestBed(); + service = injector.get(DuplicateService); + store = injector.get(NgRedux); + + })().then(done).catch(done.fail)); + + + test('setNumberOfDuplicates should set number of duplicates', ()=>{ + service.setNumberOfDuplicates(10); + expect(service.numberOfDuplicates).toEqual(10); + }); + + test('isEnabled should return false if type is VNF and has missing data', ()=>{ + let node = { + data : { + type : 'VF', + menuActions : { + duplicate : () => { + + } + } + } + }; + spyOn(node.data.menuActions, 'duplicate').and.returnValue(true); + spyOn(service, 'hasMissingData').and.returnValue(true); + let result : boolean = service.isEnabled(<any>node, null, null); + expect(result).toBeFalsy(); + }); + + test('openDuplicateModal', ()=>{ + spyOn(service, 'getRemainsInstance').and.returnValue(1); + let result : IModalConfig = service.openDuplicateModal( + 'currentServiceId', + 'currentServiceId', + 'currentId', + 'storeKey', + 2, + null,null); + expect(result.title).toEqual('Duplicate Node'); + }); + + test('openDuplicateModal should call getRemainsInstance with correct parameters', ()=>{ + spyOn(service, 'getRemainsInstance'); + service.openDuplicateModal( + 'currentServiceId', + 'currentServiceId', + 'currentId', + 'storeKey', + 2, + null,null); + expect(service.getRemainsInstance).toHaveBeenCalledWith('currentServiceId', 'currentId', 'currentServiceId', null, null); + }); + + test('canDuplicate VNF should return true', () => { + sessionStorage.setItem('reduxState' , JSON.stringify({global : { flags : {FLAG_DUPLICATE_VNF : true}}})); + let node : ITreeNode = <any> {data : {type : 'VF'}}; + + let result = service.canDuplicate(node); + expect(result).toBeTruthy(); + }); + + test('canDuplicate Network should return true', () => { + sessionStorage.setItem('reduxState' , JSON.stringify({global : { flags : {FLAG_DUPLICATE_VNF : true}}})); + let node : ITreeNode = <any> {data : {type : 'VL'}}; + + let result = service.canDuplicate(node); + expect(result).toBeTruthy(); + }); + + test('canDuplicate VFModule should return false', () => { + sessionStorage.setItem('reduxState' , JSON.stringify({global : { flags : {FLAG_DUPLICATE_VNF : true}}})); + let node : ITreeNode = <any> {data : {type : 'VFModule'}}; + + let result = service.canDuplicate(node); + expect(result).toBeFalsy(); + }); + + test('Drawing board tree service should be defined', () => { + expect(service).toBeDefined(); + }); + + test('DrawingBoardDuplicateService should be defined', () => { + expect(service).toBeDefined(); + }); + + test('Duplicate multi vnfs should save multi vnfs in redux', () => { + service.existingNames = { + "2017488_adiodvpe": "", + "rrr": "", + "ttt": "" + }; + let newVnfs = service.cloneVnf(<any>{ + "vfModules": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2mtlfi": { + "instanceName": "rrr", + "volumeGroupName": "ttt" + } + } + }, + "originalName": null, + "trackById": "pfs1f0len3", + "instanceName": "2017488_ADIODvPE" + }, "2017-488_ADIOD-vPE 0"); + + expect(newVnfs.instanceName).toBe("2017488_ADIODvPE_001"); + expect(newVnfs.vfModules['2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2']['2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2mtlfi'].instanceName).toBe("rrr_001"); + expect(newVnfs.vfModules['2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2']['2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2mtlfi'].volumeGroupName).toBe("ttt_001"); + + newVnfs = service.cloneVnf(<any>{ + "vfModules": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2mtlfi": { + "instanceName": "rrr", + "volumeGroupName": "ttt" + } + } + }, + "originalName": null, + "trackById": "pfs1f0len3", + "instanceName": "2017488_ADIODvPE" + }, "2017-488_ADIOD-vPE 0"); + + expect(newVnfs.instanceName).toBe("2017488_ADIODvPE_002"); + expect(newVnfs.vfModules['2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2']['2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2mtlfi'].instanceName).toBe("rrr_002"); + expect(newVnfs.vfModules['2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2']['2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2mtlfi'].volumeGroupName).toBe("ttt_002"); + }); + + test('ensure name is unique - send new name - shouldn\'t change name', () => { + service.existingNames = { + "2017488_adiodvpe": "", + "uniqueinstancename": "" + }; + const name = "uniqueInstanceName-1"; + let uniqueName: string = service.ensureUniqueNameOrGenerateOne(name); + expect(uniqueName).toEqual(name); + }); + + test('ensure name is unique send existing name should change name', () => { + service.existingNames = { + "2017488_adiodvpe": "", + "uniqueinstancename-1": "" + }; + const name = "uniqueInstanceName-1"; + let uniqueName: string = service.ensureUniqueNameOrGenerateOne(name); + expect(uniqueName).toEqual(name + "_001"); + }); + + test('isAlreadyExist - send new name should return false', () => { + service.existingNames = { + "2017488_adiodvpe": "", + "uniqueinstancename": "" + }; + const name = "uniqueinstancename-1"; + let isExist: boolean = service.isAlreadyExists(name, service.existingNames); + expect(isExist).toBeFalsy(); + }); + + test('isAlreadyExist - send existing name should return true', () => { + service.existingNames = { + "2017488_adiodvpe": "", + "uniqueinstancename-1": "" + }; + const name = "uniqueinstancename-1"; + let isExist: boolean = service.isAlreadyExists(name, service.existingNames); + expect(isExist).toBeTruthy(); + }); + + test('isAlreadyExist - send existing name case insensitive should return true', () => { + service.existingNames = { + "2017488_adiodvpe": "", + "uniqueinstancename-1": "" + }; + const name = "uniqueInstanceName-1"; + let isExist: boolean = service.isAlreadyExists(name, service.existingNames); + expect(isExist).toBeTruthy(); + }); + + test('getNumberAsPaddingString should return 001 if padding is 000 and val is 1 string', () => { + let paddingNumber: string = service.getNumberAsPaddingString(1, '0000'); + expect(paddingNumber).toEqual('0001'); + }); + + test('getNumberAsPaddingString should return 010 if padding is 000 and val is 10 string', () => { + let paddingNumber: string = service.getNumberAsPaddingString(10, '0000'); + expect(paddingNumber).toEqual('0010'); + }); + + test('generateVNFUniqueName should return the next free number', () => { + const vnfName: string = "VF_vMee 0"; + let result: string = service.generateUniqueStoreKey( + "6e59c5de-f052-46fa-aa7e-2fca9d674c44", + vnfName, + getExistingVNFs(), + {} + ); + + expect(result).toEqual(vnfName + ":0003"); + }); + + test('generateVNFUniqueName on duplicate multi vnfs should return the next free number', () => { + spyOn(service, 'openDuplicateModal'); + service.openDuplicateModal(null, null, null,null, 2, null, null); + + expect(service.openDuplicateModal).toHaveBeenCalledWith(null, null, null,null, 2, null, null); + }); + + + test('isEnabled should return false if node has missing data', () => { + let node = { + data : { + missingData: true, + menuActions : { + duplicate : () => { + + } + } + } + }; + let result : boolean = service.isEnabled(<any>node, null, null); + expect(result).toBeFalsy(); + }); + + test('isEnabled should return true if not reach to max', () => { + let node = { + data : { + missingData: false, modelName : "vnfModelName" , modelId : "vnfModelId", type : "VF", children: [], modelCustomizationId : "vnfModelId",modelUniqueId: "vnfModelId", + menuActions : { + duplicate : () => { + + } + } + } + }; + let result : boolean = service.isEnabled(<any>node, <any>getStoreState(), "serviceId"); + expect(result).toBeTruthy(); + }); + + test('isEnabled should return false if reach to max', () => { + let node = { + data : { + missingData: false, modelName : "vnfModelName2" , modelId : "vnfModelId2", type : "VF" ,children: [], + menuActions : { + duplicate : () => { + + } + } + } + }; + let result : boolean = service.isEnabled(<any>node, <any>getStoreState(), "serviceId"); + expect(result).toBeFalsy(); + }); + + test('isEnabled should return true if max is null', () => { + let node = { + data : { + missingData: false, modelName : "vnfModelName3" , modelId : "vnfModelId3",type : "VF", children: [], modelUniqueId: "vnfModelId3", + menuActions : { + duplicate : () => { + + } + } + } + }; + let result : boolean = service.isEnabled(<any>node, <any>getStoreState(), "serviceId"); + expect(result).toBeTruthy(); + }); + + test('isEnabled should return false if type is vf module', () => { + let node = { + data : { + missingData: false, modelName : "vnfModelName3" , modelId : "vnfModelId3",type : "VFModule", children: [], + menuActions : { + } + } + }; + let result : boolean = service.isEnabled(<any>node, <any>getStoreState(), "serviceId"); + expect(result).toBeFalsy(); + }); + + test('getRemainsVNFinstance should return the remains 1 VNF', () => { + let result : number = service.getRemainsInstance("vnfModelId", "vnfModelName" , "serviceId" , <any>getStoreState(), <any>{data : {type : 'VF'}}); + expect(result).toBe(1); + }); + + test('getRemainsVNFinstance should return the remains 0 VNF', () => { + let result : number = service.getRemainsInstance("vnfModelId2", "vnfModelName2" , "serviceId" , <any>getStoreState(),<any>{data : {type : 'VF'}}); + expect(result).toBe(0); + }); + + test('isVNFChildrensHasMissingData should return true if vnf missing data = true', () => { + let result : boolean = service.hasMissingData(<any>getTreeNode(true,false)); + expect(result).toBeTruthy(); + }); + + test('isVNFChildrensHasMissingData return should false if vnf missing data = false', () => { + let result : boolean = service.hasMissingData(<any>getTreeNode(false,false)); + expect(result).toBeFalsy(); + }); + + test('isVNFChildrensHasMissingData should return true if vfModule missing data = true', () => { + let result : boolean = service.hasMissingData(<any>getTreeNode(false,true)); + expect(result).toBeTruthy(); + }); + + test('isVNFChildrensHasMissingData should return false if no children and vfModule missing data = false', () => { + let node = <any>getTreeNode(false,false); + node.data.children = []; + let result : boolean = service.hasMissingData(node); + expect(result).toBeFalsy(); + }); + + function getExistingVNFs(){ + return {"VF_vMee 0":{"rollbackOnFailure":"true","vfModules":{"vf_vmee0..VfVmee..vmme_vlc..module-1":{"vf_vmee0..VfVmee..vmme_vlc..module-1dgbxq":{"modelInfo":{"modelInvariantId":"98a7c88b-b577-476a-90e4-e25a5871e02b","modelVersionId":"522159d5-d6e0-4c2a-aa44-5a542a12a830","modelName":"VfVmee..vmme_vlc..module-1","modelVersion":"2","modelCustomizationId":"55b1be94-671a-403e-a26c-667e9c47d091","modelCustomizationName":"VfVmee..vmme_vlc..module-1"},"instanceParams":[{}]}}},"productFamilyId":"17cc1042-527b-11e6-beb8-9e71128cae77","lcpCloudRegionId":"hvf6","tenantId":"bae71557c5bb4d5aac6743a4e5f1d054","lineOfBusiness":"ONAP","platformName":"platform","modelInfo":{"modelInvariantId":"4160458e-f648-4b30-a176-43881ffffe9e","modelVersionId":"d6557200-ecf2-4641-8094-5393ae3aae60","modelName":"VF_vMee","modelVersion":"2.0","modelCustomizationId":"91415b44-753d-494c-926a-456a9172bbb9","modelCustomizationName":"VF_vMee 0"}},"VF_vMee 0:0001":{"rollbackOnFailure":"true","vfModules":{"vf_vmee0..VfVmee..vmme_vlc..module-1":{"vf_vmee0..VfVmee..vmme_vlc..module-1dgbxq":{"modelInfo":{"modelInvariantId":"98a7c88b-b577-476a-90e4-e25a5871e02b","modelVersionId":"522159d5-d6e0-4c2a-aa44-5a542a12a830","modelName":"VfVmee..vmme_vlc..module-1","modelVersion":"2","modelCustomizationId":"55b1be94-671a-403e-a26c-667e9c47d091","modelCustomizationName":"VfVmee..vmme_vlc..module-1"},"instanceParams":[{}]}}},"productFamilyId":"17cc1042-527b-11e6-beb8-9e71128cae77","lcpCloudRegionId":"hvf6","tenantId":"bae71557c5bb4d5aac6743a4e5f1d054","lineOfBusiness":"ONAP","platformName":"platform","modelInfo":{"modelInvariantId":"4160458e-f648-4b30-a176-43881ffffe9e","modelVersionId":"d6557200-ecf2-4641-8094-5393ae3aae60","modelName":"VF_vMee","modelVersion":"2.0","modelCustomizationId":"91415b44-753d-494c-926a-456a9172bbb9","modelCustomizationName":"VF_vMee 0"},"originalName":"VF_vMee 0"},"VF_vMee 0:0002":{"rollbackOnFailure":"true","vfModules":{"vf_vmee0..VfVmee..vmme_vlc..module-1":{"vf_vmee0..VfVmee..vmme_vlc..module-1dgbxq":{"modelInfo":{"modelInvariantId":"98a7c88b-b577-476a-90e4-e25a5871e02b","modelVersionId":"522159d5-d6e0-4c2a-aa44-5a542a12a830","modelName":"VfVmee..vmme_vlc..module-1","modelVersion":"2","modelCustomizationId":"55b1be94-671a-403e-a26c-667e9c47d091","modelCustomizationName":"VfVmee..vmme_vlc..module-1"},"instanceParams":[{}]}}},"productFamilyId":"17cc1042-527b-11e6-beb8-9e71128cae77","lcpCloudRegionId":"hvf6","tenantId":"bae71557c5bb4d5aac6743a4e5f1d054","lineOfBusiness":"ONAP","platformName":"platform","modelInfo":{"modelInvariantId":"4160458e-f648-4b30-a176-43881ffffe9e","modelVersionId":"d6557200-ecf2-4641-8094-5393ae3aae60","modelName":"VF_vMee","modelVersion":"2.0","modelCustomizationId":"91415b44-753d-494c-926a-456a9172bbb9","modelCustomizationName":"VF_vMee 0"},"originalName":"VF_vMee 0"}} + } + + function getStoreState(){ + return { + getState() { + return { + service : { + serviceHierarchy: { + "serviceId" : { + vnfs : { + "vnfModelName" : { + properties : { + ecomp_generated_naming: "false", + max_instances : 2 + } + }, + "vnfModelName2" : { + properties : { + ecomp_generated_naming: "false", + max_instances : 2 + } + }, + "vnfModelName3" : { + properties : { + ecomp_generated_naming: "false", + } + } + } + } + }, + serviceInstance : { + "serviceId" : { + existingVNFCounterMap : { + "vnfModelId" : 1, + "vnfModelId2" : 2, + "vnfModelId3" : 0 + } + } + + } + } + } + } + } + } + + + function getTreeNode(VNfMissingData : boolean, vfModuleMissingData : boolean){ + return { + data : { + children : vfModuleMissingData ? + [{ + missingData : true + }] : + [{ + missingData : false + } + ], + missingData : VNfMissingData + } + } + } +}); + + + diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/duplicate/duplicate.service.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/duplicate/duplicate.service.ts new file mode 100644 index 000000000..e695edf86 --- /dev/null +++ b/vid-webpack-master/src/app/drawingBoard/service-planning/duplicate/duplicate.service.ts @@ -0,0 +1,189 @@ +import { Injectable } from '@angular/core'; +import { ITreeNode } from 'angular-tree-component/dist/defs/api'; +import { AppState } from '../../../shared/store/reducers'; +import { LogService } from '../../../shared/utils/log/log.service'; +import { NgRedux } from '@angular-redux/store'; +import {VnfInstance} from "../../../shared/models/vnfInstance"; +import {VfModuleMap} from "../../../shared/models/vfModulesMap"; +import * as _ from "lodash"; +import {DefaultDataGeneratorService} from "../../../shared/services/defaultDataServiceGenerator/default.data.generator.service"; +import {TypeNodeInformation} from "../typeNodeInformation.model"; +import { SdcUiServices} from "onap-ui-angular"; +import { SdcUiCommon} from "onap-ui-angular"; +import {changeInstanceCounter, duplicateBulkInstances} from "../../../shared/storeUtil/utils/general/general.actions"; +import {IModalConfig} from "onap-ui-angular/dist/modals/models/modal-config"; + +@Injectable() +export class DuplicateService { + + constructor(private _logService : LogService, private _store: NgRedux<AppState>, modalService: SdcUiServices.ModalService) { + this.modalService = modalService; + } + + numberOfDuplicates:number; + setNumberOfDuplicates(numberOfDuplicates: number) { + this.numberOfDuplicates = numberOfDuplicates; + } + + currentInstanceId: string = null; + currentServiceId: string = null; + maxNumberOfDuplicate: number = 0; + storeKey: string = null; + padding = '0000'; + modalService: SdcUiServices.ModalService; + store : NgRedux<AppState>; + existingNames : {[key: string] : any}; + currentNode : ITreeNode = null; + + + + canDuplicate(node: ITreeNode): boolean { + let reduxState = <AppState>JSON.parse(sessionStorage.getItem('reduxState')); + return reduxState.global.flags['FLAG_DUPLICATE_VNF'] && (node.data.type === 'VF' || node.data.type === 'VL'); + } + + isEnabled(node: ITreeNode, store: NgRedux<AppState>, serviceId : string): boolean { + if(!_.isNil(node) && !_.isNil(node.data.menuActions['duplicate'])){ + if(this.hasMissingData(node)) return false; + const typeNodeInformation : TypeNodeInformation = new TypeNodeInformation(node); + const max : number = store.getState().service.serviceHierarchy[serviceId][typeNodeInformation.hierarchyName][node.data.modelName].properties['max_instances'] || 1; + const currentExisting: number = store.getState().service.serviceInstance[serviceId][typeNodeInformation.existingMappingCounterName][node.data.modelUniqueId]; + + return max - currentExisting > 0; + }else { + return false; + } + } + + hasMissingData(node : ITreeNode): boolean { + if(!_.isNil(node)){ + if(node.data.missingData) return true; + if(!_.isNil(node.data.children)){ + for(let child of node.data.children) { + if(child.missingData){ + return true; + } + } + } + + } + return false; + } + + getRemainsInstance(modelId : string, modelName : string, serviceId : string, store: NgRedux<AppState>, node : ITreeNode) : number { + const typeNodeInformation : TypeNodeInformation = new TypeNodeInformation(node); + const properties = store.getState().service.serviceHierarchy[serviceId][typeNodeInformation.hierarchyName][modelName].properties; + const currentExisting : number = store.getState().service.serviceInstance[serviceId][typeNodeInformation.existingMappingCounterName][modelId]; + return (!_.isNil(properties) && !_.isNil(properties['max_instances'])) ? properties['max_instances'] - currentExisting : null; + } + + + + openDuplicateModal(currentServiceId: string, currentUuid: string, currentId: string, storeKey : string, numberOfDuplicate: number, _store : NgRedux<AppState>, node: ITreeNode): IModalConfig { + this.currentInstanceId = currentId; + this.currentServiceId = currentServiceId; + this.maxNumberOfDuplicate = this.getRemainsInstance(currentUuid, currentId, currentServiceId, _store, node); + this.storeKey = storeKey; + this.store = _store; + this.currentNode = node; + + + return { + size: SdcUiCommon.ModalSize.medium, + title: 'Duplicate Node', + type: SdcUiCommon.ModalType.custom, + buttons: [ + {text: 'Duplicate', callback: this.duplicate.bind(this, this.currentNode), closeModal: true}, + {text: 'Cancel', closeModal: true} + ] + }; + } + + duplicate(node : ITreeNode): void { + const typeNodeInformation : TypeNodeInformation = new TypeNodeInformation(node); + this.existingNames = this.store.getState().service.serviceInstance[this.currentServiceId].existingNames; + const toClone = this.store.getState().service.serviceInstance[this.currentServiceId][typeNodeInformation.hierarchyName][this.storeKey]; + let newObjects = {}; + for(let i = 0; i < this.numberOfDuplicates; i++) { + const uniqueStoreKey = this.generateUniqueStoreKey(this.currentServiceId, this.currentInstanceId, this.store.getState().service.serviceInstance[this.currentServiceId][typeNodeInformation.hierarchyName], newObjects); + const clone = this.cloneVnf(toClone, this.currentInstanceId); + newObjects[uniqueStoreKey] = clone; + } + this.store.dispatch(duplicateBulkInstances(this.currentServiceId, newObjects, this.existingNames, node)); + this.store.dispatch(changeInstanceCounter(toClone.modelInfo.modelUniqueId, this.currentServiceId, this.numberOfDuplicates, node)); + this._logService.info("Duplicate " + this.storeKey + " serviceId: " + this.currentServiceId + "number of duplicate: " + this.numberOfDuplicates, toClone); + } + + + cloneVnf(vnf : VnfInstance, originalName: string): VnfInstance { + let newUniqueVnf : VnfInstance = _.cloneDeep(vnf); + + newUniqueVnf.originalName = originalName; + newUniqueVnf.trackById = DefaultDataGeneratorService.createRandomTrackById(); + if (!_.isNil(vnf.instanceName)){ + newUniqueVnf.instanceName = this.ensureUniqueNameOrGenerateOne(vnf.instanceName); + } + + for (let vf_module_model_name in vnf.vfModules) { + const vfModuleModel: VfModuleMap = vnf.vfModules[vf_module_model_name]; + for (let vfModule in vfModuleModel) { + newUniqueVnf.vfModules[vf_module_model_name][vfModule].trackById = DefaultDataGeneratorService.createRandomTrackById(); + if (!_.isNil(vfModuleModel[vfModule].instanceName)){ + newUniqueVnf.vfModules[vf_module_model_name][vfModule].instanceName = this.ensureUniqueNameOrGenerateOne(vfModuleModel[vfModule].instanceName); + } + if (!_.isNil(vfModuleModel[vfModule].volumeGroupName)){ + newUniqueVnf.vfModules[vf_module_model_name][vfModule].volumeGroupName = this.ensureUniqueNameOrGenerateOne(vfModuleModel[vfModule].volumeGroupName); + } + } + } + return newUniqueVnf; + } + + ensureUniqueNameOrGenerateOne(instanceName){ + let uniqueInstanceName = instanceName; + if (this.isAlreadyExists(instanceName, this.existingNames)) { + uniqueInstanceName = this.generateNextUniqueName(instanceName, this.existingNames); + this.existingNames[uniqueInstanceName.toLowerCase()] = ""; + } + return uniqueInstanceName; + } + + + isAlreadyExists(name : string, existingNames : {[key: string] : any}){ + return _.has(existingNames, name.toLowerCase()); + } + + generateNextUniqueName(name : string, existingNames : {[key: string] : any}) :string{ + let suffix = "000"; + let counter = 1; + if (name.match(/^.*_[\d]{3}$/)){ + name = name.substring(0, name.length - 4); + } + + while(true){ + let paddingNumber : string = this.getNumberAsPaddingString(counter, suffix); + let candidateUniqueName = name + '_' + paddingNumber; + if(!this.isAlreadyExists(candidateUniqueName, existingNames)){ + return candidateUniqueName; + } + counter++; + } + } + + generateUniqueStoreKey(serviceId : string, objectName : string, existing : any, newObjects: any) : string { + let counter = 1; + while(true){ + let paddingNumber : string = this.getNumberAsPaddingString(counter, this.padding); + const name = objectName + ':' + paddingNumber; + if(_.isNil(existing[name]) && _.isNil(newObjects[name])){ + return name; + } + counter++; + } + } + + getNumberAsPaddingString(val: number, padding: string): string { + const str = "" + val; + return padding.substring(0, padding.length - str.length) + str; + } +} diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/dynamicInputs.service.spec.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/dynamicInputs.service.spec.ts new file mode 100644 index 000000000..56bf94f48 --- /dev/null +++ b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/dynamicInputs.service.spec.ts @@ -0,0 +1,24 @@ +import {DynamicInputsService} from "./dynamicInputs.service"; +import {HttpClientTestingModule} from "@angular/common/http/testing"; +import {getTestBed, TestBed} from "@angular/core/testing"; +import {NgReduxTestingModule} from "@angular-redux/store/testing"; +describe('DynamicInputs service', () => { + let injector; + let service: DynamicInputsService; + + beforeAll(done => (async () => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule, NgReduxTestingModule], + providers: [ + DynamicInputsService + ] + }); + await TestBed.compileComponents(); + injector = getTestBed(); + service = injector.get(DynamicInputsService); + })().then(done).catch(done.fail)); + + test('DynamicInputs should be defined', () => { + expect(service).toBeDefined(); + }); +}); diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/dynamicInputs.service.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/dynamicInputs.service.ts new file mode 100644 index 000000000..cb0e7cf5d --- /dev/null +++ b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/dynamicInputs.service.ts @@ -0,0 +1,143 @@ +import {Injectable} from "@angular/core"; +import {Utils} from "../../../shared/utils/utils"; +import {Constants} from "../../../shared/utils/constants"; +import Parameter = Constants.Parameter; + +@Injectable() +export class DynamicInputsService { + public getArbitraryInputs(inputs) { + let parameter; + let parameterList = []; + for (let key in inputs) { + parameter = { + id: key, + type: Parameter.STRING, + name: key, + value: inputs[key][Parameter.DEFAULT], + isRequired: inputs[key][Parameter.REQUIRED], + description: inputs[key][Parameter.DESCRIPTION] + }; + switch (inputs[key][Parameter.TYPE]) { + case Parameter.INTEGER: + parameter.type = Parameter.NUMBER; + break; + case Parameter.BOOLEAN: + parameter.type = Parameter.BOOLEAN; + break; + case Parameter.RANGE: + break; + case Parameter.LIST: + parameter.type = Parameter.LIST; + break; + case Parameter.MAP: + parameter.type = Parameter.MAP; + break; + } + if (Utils.hasContents(inputs[key][Parameter.CONSTRAINTS]) + && ( inputs[key][Parameter.CONSTRAINTS].length > 0 )) { + let constraintsArray = inputs[key][Parameter.CONSTRAINTS]; + this.addConstraintParameters(parameterList, constraintsArray, key, inputs, parameter); + } + else { + + parameterList.push(parameter); + } + } + return parameterList; + } + + private addConstraintParameters(parameterList, constraintsArray, key, inputs, parameter) { + // If there are constraints and the operator is "valid_values", + // use a select parameter type. + let i: number = constraintsArray.length; + let parameterPushed: boolean = false; + if (i > 0) { + while ((i--) && (!parameterPushed)) { + let keys = Object.keys(constraintsArray[i]); + for (let operator in keys) { + switch (keys[operator]) { + case Parameter.VALID_VALUES: + let j: number = constraintsArray[i][Parameter.VALID_VALUES].length; + if (j > 0) { + let oList = []; + let option; + while (j--) { + option = { + name: constraintsArray[i][Parameter.VALID_VALUES][j], + isDefault: false + }; + if ((Utils.hasContents(inputs[key][Parameter.DEFAULT]) ) + && (inputs[key][Parameter.DEFAULT] === constraintsArray[i][Parameter.VALID_VALUES][j] )) { + option = { + name: constraintsArray[i][Parameter.VALID_VALUES][j], + isDefault: true + } + } + oList.push(option); + } + parameter.type = Parameter.SELECT; + parameter.optionList = oList; + parameterList.push(parameter); + parameterPushed = true; + } + break; + + case Parameter.EQUAL: + if (constraintsArray[i][Parameter.EQUAL] != null) { + parameter.type = Parameter.STRING; + parameter.isReadOnly = true; + parameter.value = constraintsArray[i][Parameter.EQUAL]; + parameterList.push(parameter); + parameterPushed = true; + } + break; + + case Parameter.LENGTH: + if (constraintsArray[i][Parameter.LENGTH] != null) { + parameter.minLength = constraintsArray[i][Parameter.LENGTH]; + parameter.maxLength = constraintsArray[i][Parameter.LENGTH]; + parameterList.push(parameter); + parameterPushed = true; + } + break; + case Parameter.MAX_LENGTH: + if (constraintsArray[i][Parameter.MAX_LENGTH] != null) { + parameter.maxLength = constraintsArray[i][Parameter.MAX_LENGTH]; + parameterList.push(parameter); + parameterPushed = true; + } + break; + case Parameter.MIN_LENGTH: + if (constraintsArray[i][Parameter.MIN_LENGTH] != null) { + parameter.minLength = constraintsArray[i][Parameter.MIN_LENGTH]; + parameterList.push(parameter); + parameterPushed = true; + } + break; + case Parameter.IN_RANGE: + if (constraintsArray[i][Parameter.IN_RANGE] != null) { + if (constraintsArray[i][Parameter.IN_RANGE].length > 1) { + parameter.min = constraintsArray[i][Parameter.IN_RANGE][0]; + parameter.max = constraintsArray[i][Parameter.IN_RANGE][1]; + parameter.type = Parameter.NUMBER; + parameter.value = inputs[key][Parameter.DEFAULT]; + parameterList.push(parameter); + parameterPushed = true; + } + } + break; + case Parameter.GREATER_THAN: + if (constraintsArray[i][Parameter.GREATER_THAN] != null) { + parameter.type = Parameter.NUMBER; + parameter.min = constraintsArray[i][Parameter.GREATER_THAN]; + parameter.value = inputs[key][Parameter.DEFAULT]; + parameterList.push(parameter); + parameterPushed = true; + } + break; + } + } + } + } + }; +} diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/basic.model.info.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/basic.model.info.ts new file mode 100644 index 000000000..51b6cfacb --- /dev/null +++ b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/basic.model.info.ts @@ -0,0 +1,121 @@ +import {ITreeNode} from "angular-tree-component/dist/defs/api"; +import {AvailableNodeIcons} from "../../available-models-tree/available-models-tree.service"; + +export interface ILevelNodeInfo { + /** Name of the key inside the serviceHierarchy object **/ + name: string; + + /** Type of the object**/ + type: string; + + /** Child name inside the of the serviceHierarchy object (if exist) **/ + childName?: string; + + /** Child type the of object (if exist) **/ + childType?: string; + + /** model type name **/ + typeName?: string; + + /** is instance failed **/ + isFailed?: boolean; + + /** number of failed **/ + numberOfFailed?: number; + + /*********************************************************** + * return node position + * @param instance - instance + ************************************************************/ + getNodePosition(instance, deepNodeName? : string) : number; + + /*********************************************************** + * return if user should provide instance name or not + * @param currentModel - The model of current object + * @param parentModel - The parent model of current object. + ************************************************************/ + isEcompGeneratedNaming(currentModel, parentModel?): boolean; + + + /*********************** + * update node position + ***********************/ + updatePosition(node, that, instanceId, parentStoreKey?) : void; + + /*********************************************************** + * return object instance + * @param modelId - The model id + * @param serviceHierarchy - The serviceHierarchy store + * @param instance - existing instance details + ************************************************************/ + getModel(modelId: string, instance: any, serviceHierarchy): any; + + /*********************************************************** + * return dynamic inputs of current model + * @param currentModel - The model of current object + ************************************************************/ + updateDynamicInputsDataFromModel(currentModel): any; + + /*********************************************************** + * return tree node instance + * @param instance - The model of current object + * @param model - The model of current object + * @param parentModel + * @param storeKey - instance storeKey if exist (for duplicate) + ************************************************************/ + createInstanceTreeNode(instance: any, model: any, parentModel: any, storeKey: string): any + + /*********************************************************** + * return if instance has some missing data + * @param instance - The instance of current object + * @param dynamicInputs + * @param isEcompGeneratedNaming - boolean + ************************************************************/ + hasMissingData(instance, dynamicInputs: any, isEcompGeneratedNaming: boolean): boolean; + + /************************ + * return object tooltip + ************************/ + getTooltip(): string; + + /************************ + * return object type + ************************/ + getType(): string; + + /************************************ + * return child model option object + ***********************************/ + getNextLevelObject(): any; + + /*********************************************************** + * open popup + * @param node - current ITrees node + * @param serviceModelId - service id + ************************************************************/ + onClickAdd(node: ITreeNode, serviceModelId: string): void; + + /*********************************************************** + * get number of existing node instance + * @param node - current ITrees node + * @param serviceModelId - service id + ************************************************************/ + getNodeCount(node: ITreeNode, serviceModelId: string): number; + + /*********************************************************** + * should show node icon + * @param node - current ITrees node + * @param serviceModelId - service id + ************************************************************/ + showNodeIcons(node: ITreeNode, serviceModelId: string): AvailableNodeIcons; + + /*********************************************************** + * should return list of actions and there methods + * @param node - current ITrees node + * @param serviceModelId + ************************************************************/ + getMenuAction(node: ITreeNode, serviceModelId: string): { [methodName: string]: { method: Function, visible: Function, enable: Function } }; + + + onSelectedNode(node : ITreeNode): void +} diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/configuration/configuration.model.info.spec.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/configuration/configuration.model.info.spec.ts new file mode 100644 index 000000000..d99ec3bc6 --- /dev/null +++ b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/configuration/configuration.model.info.spec.ts @@ -0,0 +1,1500 @@ +import {HttpClientTestingModule} from "@angular/common/http/testing"; +import {TestBed} from "@angular/core/testing"; +import {MockNgRedux, NgReduxTestingModule} from "@angular-redux/store/testing"; +import {DynamicInputsService} from "../../dynamicInputs.service"; +import {ConfigurationModelInfo} from "./configuration.model.info"; +import {SharedTreeService} from "../../shared.tree.service"; + +describe('Vnf Model Info', () => { + let _dynamicInputsService : DynamicInputsService; + let _sharedTreeService : SharedTreeService; + + beforeAll(done => (async () => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule, NgReduxTestingModule], + providers: [ + MockNgRedux, + SharedTreeService, + DynamicInputsService] + }); + await TestBed.compileComponents(); + })().then(done).catch(done.fail)); + + test('ConfigurationModelInfo should be defined', () => { + expect(ConfigurationModelInfo).toBeDefined(); + }); + + test('ConfigurationModelInfo should defined extra details', () => { + let configurationModelInfo: ConfigurationModelInfo = new ConfigurationModelInfo(_dynamicInputsService, _sharedTreeService); + expect(configurationModelInfo.name).toEqual('configurations'); + expect(configurationModelInfo.type).toEqual('Configuration'); + }); + + test('isEcompGeneratedNaming should return false', () => { + let configurationModelInfo: ConfigurationModelInfo = new ConfigurationModelInfo(_dynamicInputsService, _sharedTreeService); + let isEcompGeneratedNaming: boolean = configurationModelInfo.isEcompGeneratedNaming(); + expect(isEcompGeneratedNaming).toBeTruthy(); + }); + + test('getTooltip should return "Configuration"', () => { + let configurationModelInfo: ConfigurationModelInfo = new ConfigurationModelInfo(_dynamicInputsService, _sharedTreeService); + let tooltip: string = configurationModelInfo.getTooltip(); + expect(tooltip).toEqual('Configuration'); + }); + + test('getType should return "Configuration"', () => { + let configurationModelInfo: ConfigurationModelInfo = new ConfigurationModelInfo(_dynamicInputsService, _sharedTreeService); + let tooltip: string = configurationModelInfo.getType(); + expect(tooltip).toEqual('Configuration'); + }); + + test('getModel should return Configuration model', () => { + let configurationModelInfo: ConfigurationModelInfo = new ConfigurationModelInfo(_dynamicInputsService, _sharedTreeService); + let model = configurationModelInfo.getModel('2017-388_ADIOD-vPE 1__configuration', getServiceHierarchy()); + expect(model.uuid).toEqual('0903e1c0-8e03-4936-b5c2-260653b96413'); + }); + + + function getServiceHierarchy(){ + return { + "service": { + "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450", + "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0", + "name": "action-data", + "version": "1.0", + "toscaModelURL": null, + "category": "", + "serviceType": "", + "serviceRole": "", + "description": "", + "serviceEcompNaming": "false", + "instantiationType": "Macro", + "inputs": { + "2017488_adiodvpe0_ASN": { + "type": "string", + "description": "AV/PE", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "AV_vPE" + } + }, + "vidNotions": { + "instantiationUI": "legacy", + "modelCategory": "other" + } + }, + "vnfs": { + "2017-388_ADIOD-vPE 1": { + "uuid": "0903e1c0-8e03-4936-b5c2-260653b96413", + "invariantUuid": "00beb8f9-6d39-452f-816d-c709b9cbb87d", + "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM", + "name": "2017-388_ADIOD-vPE", + "version": "1.0", + "customizationUuid": "280dec31-f16d-488b-9668-4aae55d6648a", + "inputs": { + "vnf_config_template_version": { + "type": "string", + "description": "VPE Software Version", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "17.2" + }, + "bandwidth_units": { + "type": "string", + "description": "Units of bandwidth", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "Gbps" + }, + "bandwidth": { + "type": "string", + "description": "Requested VPE bandwidth", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "10" + }, + "AIC_CLLI": { + "type": "string", + "description": "AIC Site CLLI", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "ATLMY8GA" + }, + "ASN": { + "type": "string", + "description": "AV/PE", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "AV_vPE" + }, + "vnf_instance_name": { + "type": "string", + "description": "The hostname assigned to the vpe.", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "mtnj309me6" + } + }, + "commands": { + "vnf_config_template_version": { + "displayName": "vnf_config_template_version", + "command": "get_input", + "inputName": "2017488_adiodvpe0_vnf_config_template_version" + }, + "bandwidth_units": { + "displayName": "bandwidth_units", + "command": "get_input", + "inputName": "adiodvpe0_bandwidth_units" + }, + "bandwidth": { + "displayName": "bandwidth", + "command": "get_input", + "inputName": "adiodvpe0_bandwidth" + }, + "AIC_CLLI": { + "displayName": "AIC_CLLI", + "command": "get_input", + "inputName": "2017488_adiodvpe0_AIC_CLLI" + }, + "ASN": { + "displayName": "ASN", + "command": "get_input", + "inputName": "2017488_adiodvpe0_ASN" + }, + "vnf_instance_name": { + "displayName": "vnf_instance_name", + "command": "get_input", + "inputName": "2017488_adiodvpe0_vnf_instance_name" + } + }, + "properties": { + "vmxvre_retype": "RE-VMX", + "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version", + "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d", + "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9", + "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF", + "int_ctl_net_name": "VMX-INTXI", + "vmx_int_ctl_prefix": "10.0.0.10", + "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5", + "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279", + "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a", + "nf_type": "vPE", + "vmxvpfe_int_ctl_ip_1": "10.0.0.10", + "is_AVPN_service": "false", + "vmx_RSG_name": "vREXI-affinity", + "vmx_int_ctl_forwarding": "l2", + "vmxvre_oam_ip_0": "10.0.0.10", + "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvpfe_sriov41_0_port_vlanstrip": "false", + "vmxvpfe_sriov42_0_port_vlanfilter": "4001", + "vmxvpfe_sriov44_0_port_unknownunicastallow": "true", + "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2", + "vmxvre_instance": "0", + "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvre_flavor_name": "ns.c1r16d32.v5", + "vmxvpfe_volume_size_0": "40.0", + "vmxvpfe_sriov43_0_port_vlanfilter": "4001", + "nf_naming": "{ecomp_generated_naming=false}", + "nf_naming_code": "Navneet", + "vmxvre_name_0": "vREXI", + "vmxvpfe_sriov42_0_port_vlanstrip": "false", + "vmxvpfe_volume_name_0": "vPFEXI_FBVolume", + "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141", + "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2", + "vmxvpfe_sriov43_0_port_unknownunicastallow": "true", + "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true", + "vmxvre_console": "vidconsole", + "vmxvpfe_sriov44_0_port_vlanfilter": "4001", + "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3", + "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true", + "vmxvpfe_sriov44_0_port_vlanstrip": "false", + "vf_module_id": "123", + "nf_function": "JAI", + "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true", + "vmxvre_int_ctl_ip_0": "10.0.0.10", + "ecomp_generated_naming": "false", + "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI", + "vnf_name": "mtnj309me6vre", + "vmxvpfe_sriov41_0_port_unknownunicastallow": "true", + "vmxvre_volume_type_1": "HITACHI", + "vmxvpfe_sriov44_0_port_broadcastallow": "true", + "vmxvre_volume_type_0": "HITACHI", + "vmxvpfe_volume_type_0": "HITACHI", + "vmxvpfe_sriov43_0_port_broadcastallow": "true", + "bandwidth_units": "get_input:adiodvpe0_bandwidth_units", + "vnf_id": "123", + "vmxvre_oam_prefix": "24", + "availability_zone_0": "mtpocfo-kvm-az01", + "ASN": "get_input:2017488_adiodvpe0_ASN", + "vmxvre_chassis_i2cid": "161", + "vmxvpfe_name_0": "vPFEXI", + "bandwidth": "get_input:adiodvpe0_bandwidth", + "availability_zone_max_count": "1", + "vmxvre_volume_size_0": "45.0", + "vmxvre_volume_size_1": "50.0", + "vmxvpfe_sriov42_0_port_broadcastallow": "true", + "vmxvre_oam_gateway": "10.0.0.10", + "vmxvre_volume_name_1": "vREXI_FAVolume", + "vmxvre_ore_present": "0", + "vmxvre_volume_name_0": "vREXI_FBVolume", + "vmxvre_type": "0", + "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name", + "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true", + "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429", + "vmx_int_ctl_len": "24", + "vmxvpfe_sriov43_0_port_vlanstrip": "false", + "vmxvpfe_sriov41_0_port_broadcastallow": "true", + "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d", + "vmxvpfe_sriov41_0_port_vlanfilter": "4001", + "nf_role": "Testing", + "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a", + "vmxvpfe_sriov42_0_port_unknownunicastallow": "true", + "vmxvpfe_flavor_name": "ns.c20r16d25.v5" + }, + "type": "VF", + "modelCustomizationName": "2017-388_ADIOD-vPE 1", + "vfModules": {}, + "volumeGroups": {}, + "vfcInstanceGroups": {} + }, + "2017-388_ADIOD-vPE 0": { + "uuid": "afacccf6-397d-45d6-b5ae-94c39734b168", + "invariantUuid": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8", + "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM", + "name": "2017-388_ADIOD-vPE", + "version": "4.0", + "customizationUuid": "b3c76f73-eeb5-4fb6-9d31-72a889f1811c", + "inputs": { + "vnf_config_template_version": { + "type": "string", + "description": "VPE Software Version", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "17.2" + }, + "bandwidth_units": { + "type": "string", + "description": "Units of bandwidth", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "Gbps" + }, + "bandwidth": { + "type": "string", + "description": "Requested VPE bandwidth", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "10" + }, + "AIC_CLLI": { + "type": "string", + "description": "AIC Site CLLI", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "ATLMY8GA" + }, + "ASN": { + "type": "string", + "description": "AV/PE", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "AV_vPE" + }, + "vnf_instance_name": { + "type": "string", + "description": "The hostname assigned to the vpe.", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "mtnj309me6" + } + }, + "commands": { + "vnf_config_template_version": { + "displayName": "vnf_config_template_version", + "command": "get_input", + "inputName": "2017488_adiodvpe0_vnf_config_template_version" + }, + "bandwidth_units": { + "displayName": "bandwidth_units", + "command": "get_input", + "inputName": "adiodvpe0_bandwidth_units" + }, + "bandwidth": { + "displayName": "bandwidth", + "command": "get_input", + "inputName": "adiodvpe0_bandwidth" + }, + "AIC_CLLI": { + "displayName": "AIC_CLLI", + "command": "get_input", + "inputName": "2017488_adiodvpe0_AIC_CLLI" + }, + "ASN": { + "displayName": "ASN", + "command": "get_input", + "inputName": "2017488_adiodvpe0_ASN" + }, + "vnf_instance_name": { + "displayName": "vnf_instance_name", + "command": "get_input", + "inputName": "2017488_adiodvpe0_vnf_instance_name" + } + }, + "properties": { + "vmxvre_retype": "RE-VMX", + "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version", + "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d", + "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9", + "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF", + "int_ctl_net_name": "VMX-INTXI", + "vmx_int_ctl_prefix": "10.0.0.10", + "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5", + "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279", + "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a", + "nf_type": "vPE", + "vmxvpfe_int_ctl_ip_1": "10.0.0.10", + "is_AVPN_service": "false", + "vmx_RSG_name": "vREXI-affinity", + "vmx_int_ctl_forwarding": "l2", + "vmxvre_oam_ip_0": "10.0.0.10", + "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvpfe_sriov41_0_port_vlanstrip": "false", + "vmxvpfe_sriov42_0_port_vlanfilter": "4001", + "vmxvpfe_sriov44_0_port_unknownunicastallow": "true", + "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2", + "vmxvre_instance": "0", + "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvre_flavor_name": "ns.c1r16d32.v5", + "vmxvpfe_volume_size_0": "40.0", + "vmxvpfe_sriov43_0_port_vlanfilter": "4001", + "nf_naming": "{ecomp_generated_naming=false}", + "nf_naming_code": "Navneet", + "vmxvre_name_0": "vREXI", + "vmxvpfe_sriov42_0_port_vlanstrip": "false", + "vmxvpfe_volume_name_0": "vPFEXI_FBVolume", + "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141", + "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2", + "vmxvpfe_sriov43_0_port_unknownunicastallow": "true", + "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true", + "vmxvre_console": "vidconsole", + "vmxvpfe_sriov44_0_port_vlanfilter": "4001", + "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3", + "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true", + "min_instances": "1", + "vmxvpfe_sriov44_0_port_vlanstrip": "false", + "vf_module_id": "123", + "nf_function": "JAI", + "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true", + "vmxvre_int_ctl_ip_0": "10.0.0.10", + "ecomp_generated_naming": "false", + "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI", + "vnf_name": "mtnj309me6vre", + "vmxvpfe_sriov41_0_port_unknownunicastallow": "true", + "vmxvre_volume_type_1": "HITACHI", + "vmxvpfe_sriov44_0_port_broadcastallow": "true", + "vmxvre_volume_type_0": "HITACHI", + "vmxvpfe_volume_type_0": "HITACHI", + "vmxvpfe_sriov43_0_port_broadcastallow": "true", + "bandwidth_units": "get_input:adiodvpe0_bandwidth_units", + "vnf_id": "123", + "vmxvre_oam_prefix": "24", + "availability_zone_0": "mtpocfo-kvm-az01", + "ASN": "get_input:2017488_adiodvpe0_ASN", + "vmxvre_chassis_i2cid": "161", + "vmxvpfe_name_0": "vPFEXI", + "bandwidth": "get_input:adiodvpe0_bandwidth", + "availability_zone_max_count": "1", + "vmxvre_volume_size_0": "45.0", + "vmxvre_volume_size_1": "50.0", + "vmxvpfe_sriov42_0_port_broadcastallow": "true", + "vmxvre_oam_gateway": "10.0.0.10", + "vmxvre_volume_name_1": "vREXI_FAVolume", + "vmxvre_ore_present": "0", + "vmxvre_volume_name_0": "vREXI_FBVolume", + "vmxvre_type": "0", + "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name", + "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true", + "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429", + "vmx_int_ctl_len": "24", + "vmxvpfe_sriov43_0_port_vlanstrip": "false", + "vmxvpfe_sriov41_0_port_broadcastallow": "true", + "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d", + "vmxvpfe_sriov41_0_port_vlanfilter": "4001", + "nf_role": "Testing", + "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a", + "vmxvpfe_sriov42_0_port_unknownunicastallow": "true", + "vmxvpfe_flavor_name": "ns.c20r16d25.v5" + }, + "type": "VF", + "modelCustomizationName": "2017-388_ADIOD-vPE 0", + "vfModules": {}, + "volumeGroups": {}, + "vfcInstanceGroups": {} + }, + "2017-488_ADIOD-vPE 0": { + "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09", + "invariantUuid": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8", + "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM", + "name": "2017-488_ADIOD-vPE", + "version": "5.0", + "customizationUuid": "1da7b585-5e61-4993-b95e-8e6606c81e45", + "inputs": { + "vnf_config_template_version": { + "type": "string", + "description": "VPE Software Version", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "17.2" + }, + "bandwidth_units": { + "type": "string", + "description": "Units of bandwidth", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "Gbps" + }, + "bandwidth": { + "type": "string", + "description": "Requested VPE bandwidth", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "10" + }, + "AIC_CLLI": { + "type": "string", + "description": "AIC Site CLLI", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "ATLMY8GA" + }, + "ASN": { + "type": "string", + "description": "AV/PE", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "AV_vPE" + }, + "vnf_instance_name": { + "type": "string", + "description": "The hostname assigned to the vpe.", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "mtnj309me6" + } + }, + "commands": { + "vnf_config_template_version": { + "displayName": "vnf_config_template_version", + "command": "get_input", + "inputName": "2017488_adiodvpe0_vnf_config_template_version" + }, + "bandwidth_units": { + "displayName": "bandwidth_units", + "command": "get_input", + "inputName": "adiodvpe0_bandwidth_units" + }, + "bandwidth": { + "displayName": "bandwidth", + "command": "get_input", + "inputName": "adiodvpe0_bandwidth" + }, + "AIC_CLLI": { + "displayName": "AIC_CLLI", + "command": "get_input", + "inputName": "2017488_adiodvpe0_AIC_CLLI" + }, + "ASN": { + "displayName": "ASN", + "command": "get_input", + "inputName": "2017488_adiodvpe0_ASN" + }, + "vnf_instance_name": { + "displayName": "vnf_instance_name", + "command": "get_input", + "inputName": "2017488_adiodvpe0_vnf_instance_name" + } + }, + "properties": { + "vmxvre_retype": "RE-VMX", + "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version", + "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d", + "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9", + "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF", + "int_ctl_net_name": "VMX-INTXI", + "vmx_int_ctl_prefix": "10.0.0.10", + "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5", + "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279", + "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a", + "nf_type": "vPE", + "vmxvpfe_int_ctl_ip_1": "10.0.0.10", + "is_AVPN_service": "false", + "vmx_RSG_name": "vREXI-affinity", + "vmx_int_ctl_forwarding": "l2", + "vmxvre_oam_ip_0": "10.0.0.10", + "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvpfe_sriov41_0_port_vlanstrip": "false", + "vmxvpfe_sriov42_0_port_vlanfilter": "4001", + "vmxvpfe_sriov44_0_port_unknownunicastallow": "true", + "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2", + "vmxvre_instance": "0", + "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvre_flavor_name": "ns.c1r16d32.v5", + "vmxvpfe_volume_size_0": "40.0", + "vmxvpfe_sriov43_0_port_vlanfilter": "4001", + "nf_naming": "{ecomp_generated_naming=false}", + "nf_naming_code": "Navneet", + "vmxvre_name_0": "vREXI", + "vmxvpfe_sriov42_0_port_vlanstrip": "false", + "vmxvpfe_volume_name_0": "vPFEXI_FBVolume", + "max_instances": "3", + "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141", + "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2", + "vmxvpfe_sriov43_0_port_unknownunicastallow": "true", + "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true", + "vmxvre_console": "vidconsole", + "vmxvpfe_sriov44_0_port_vlanfilter": "4001", + "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3", + "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true", + "min_instances": "1", + "vmxvpfe_sriov44_0_port_vlanstrip": "false", + "vf_module_id": "123", + "nf_function": "JAI", + "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true", + "vmxvre_int_ctl_ip_0": "10.0.0.10", + "ecomp_generated_naming": "false", + "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI", + "vnf_name": "mtnj309me6vre", + "vmxvpfe_sriov41_0_port_unknownunicastallow": "true", + "vmxvre_volume_type_1": "HITACHI", + "vmxvpfe_sriov44_0_port_broadcastallow": "true", + "vmxvre_volume_type_0": "HITACHI", + "vmxvpfe_volume_type_0": "HITACHI", + "vmxvpfe_sriov43_0_port_broadcastallow": "true", + "bandwidth_units": "get_input:adiodvpe0_bandwidth_units", + "vnf_id": "123", + "vmxvre_oam_prefix": "24", + "availability_zone_0": "mtpocfo-kvm-az01", + "ASN": "get_input:2017488_adiodvpe0_ASN", + "vmxvre_chassis_i2cid": "161", + "vmxvpfe_name_0": "vPFEXI", + "bandwidth": "get_input:adiodvpe0_bandwidth", + "availability_zone_max_count": "1", + "vmxvre_volume_size_0": "45.0", + "vmxvre_volume_size_1": "50.0", + "vmxvpfe_sriov42_0_port_broadcastallow": "true", + "vmxvre_oam_gateway": "10.0.0.10", + "vmxvre_volume_name_1": "vREXI_FAVolume", + "vmxvre_ore_present": "0", + "vmxvre_volume_name_0": "vREXI_FBVolume", + "vmxvre_type": "0", + "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name", + "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true", + "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429", + "vmx_int_ctl_len": "24", + "vmxvpfe_sriov43_0_port_vlanstrip": "false", + "vmxvpfe_sriov41_0_port_broadcastallow": "true", + "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d", + "vmxvpfe_sriov41_0_port_vlanfilter": "4001", + "nf_role": "Testing", + "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a", + "vmxvpfe_sriov42_0_port_unknownunicastallow": "true", + "vmxvpfe_flavor_name": "ns.c20r16d25.v5" + }, + "type": "VF", + "modelCustomizationName": "2017-488_ADIOD-vPE 0", + "vfModules": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": { + "uuid": "25284168-24bb-4698-8cb4-3f509146eca5", + "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1", + "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vRE_BV", + "baseModule": false + }, + "inputs": { + "vnf_config_template_version": { + "type": "string", + "description": "VPE Software Version", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "vnf_config_template_version" + }, + "fromInputName": "2017488_adiodvpe0_vnf_config_template_version", + "constraints": null, + "required": true, + "default": "17.2" + }, + "bandwidth_units": { + "type": "string", + "description": "Units of bandwidth", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "bandwidth_units" + }, + "fromInputName": "adiodvpe0_bandwidth_units", + "constraints": null, + "required": true, + "default": "Gbps" + }, + "bandwidth": { + "type": "string", + "description": "Requested VPE bandwidth", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "bandwidth" + }, + "fromInputName": "adiodvpe0_bandwidth", + "constraints": null, + "required": true, + "default": "10" + }, + "AIC_CLLI": { + "type": "string", + "description": "AIC Site CLLI", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "AIC_CLLI" + }, + "fromInputName": "2017488_adiodvpe0_AIC_CLLI", + "constraints": null, + "required": true, + "default": "ATLMY8GA" + }, + "vnf_instance_name": { + "type": "string", + "description": "The hostname assigned to the vpe.", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "vnf_instance_name" + }, + "fromInputName": "2017488_adiodvpe0_vnf_instance_name", + "constraints": null, + "required": true, + "default": "mtnj309me6" + } + }, + "volumeGroupAllowed": true + }, + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": { + "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db", + "invariantUuid": "b34833bb-6aa9-4ad6-a831-70b06367a091", + "customizationUuid": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3", + "description": null, + "name": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0", + "version": "5", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0", + "properties": { + "minCountInstances": 1, + "maxCountInstances": 1, + "initialCount": 1, + "vfModuleLabel": "ADIOD_base_vPE_BV", + "baseModule": true + }, + "inputs": {}, + "volumeGroupAllowed": false + }, + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": { + "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a", + "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339", + "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vPFE_BV", + "baseModule": false + }, + "inputs": {}, + "volumeGroupAllowed": true + } + }, + "volumeGroups": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": { + "uuid": "25284168-24bb-4698-8cb4-3f509146eca5", + "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1", + "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vRE_BV", + "baseModule": false + }, + "inputs": { + "vnf_config_template_version": { + "type": "string", + "description": "VPE Software Version", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "vnf_config_template_version" + }, + "fromInputName": "2017488_adiodvpe0_vnf_config_template_version", + "constraints": null, + "required": true, + "default": "17.2" + }, + "bandwidth_units": { + "type": "string", + "description": "Units of bandwidth", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "bandwidth_units" + }, + "fromInputName": "adiodvpe0_bandwidth_units", + "constraints": null, + "required": true, + "default": "Gbps" + }, + "bandwidth": { + "type": "string", + "description": "Requested VPE bandwidth", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "bandwidth" + }, + "fromInputName": "adiodvpe0_bandwidth", + "constraints": null, + "required": true, + "default": "10" + }, + "AIC_CLLI": { + "type": "string", + "description": "AIC Site CLLI", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "AIC_CLLI" + }, + "fromInputName": "2017488_adiodvpe0_AIC_CLLI", + "constraints": null, + "required": true, + "default": "ATLMY8GA" + }, + "vnf_instance_name": { + "type": "string", + "description": "The hostname assigned to the vpe.", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "vnf_instance_name" + }, + "fromInputName": "2017488_adiodvpe0_vnf_instance_name", + "constraints": null, + "required": true, + "default": "mtnj309me6" + } + } + }, + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": { + "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a", + "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339", + "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vPFE_BV", + "baseModule": false + }, + "inputs": {} + } + }, + "vfcInstanceGroups": {} + } + }, + "networks": { + "2017-388_ADIOD-vPE 1": { + "uuid": "0903e1c0-8e03-4936-b5c2-260653b96413", + "invariantUuid": "00beb8f9-6d39-452f-816d-c709b9cbb87d", + "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM", + "name": "2017-388_ADIOD-vPE", + "version": "1.0", + "customizationUuid": "280dec31-f16d-488b-9668-4aae55d6648a", + "inputs": { + "vnf_config_template_version": { + "type": "string", + "description": "VPE Software Version", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "17.2" + }, + "bandwidth_units": { + "type": "string", + "description": "Units of bandwidth", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "Gbps" + }, + "bandwidth": { + "type": "string", + "description": "Requested VPE bandwidth", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "10" + }, + "AIC_CLLI": { + "type": "string", + "description": "AIC Site CLLI", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "ATLMY8GA" + }, + "ASN": { + "type": "string", + "description": "AV/PE", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "AV_vPE" + }, + "vnf_instance_name": { + "type": "string", + "description": "The hostname assigned to the vpe.", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "mtnj309me6" + } + }, + "commands": { + "vnf_config_template_version": { + "displayName": "vnf_config_template_version", + "command": "get_input", + "inputName": "2017488_adiodvpe0_vnf_config_template_version" + }, + "bandwidth_units": { + "displayName": "bandwidth_units", + "command": "get_input", + "inputName": "adiodvpe0_bandwidth_units" + }, + "bandwidth": { + "displayName": "bandwidth", + "command": "get_input", + "inputName": "adiodvpe0_bandwidth" + }, + "AIC_CLLI": { + "displayName": "AIC_CLLI", + "command": "get_input", + "inputName": "2017488_adiodvpe0_AIC_CLLI" + }, + "ASN": { + "displayName": "ASN", + "command": "get_input", + "inputName": "2017488_adiodvpe0_ASN" + }, + "vnf_instance_name": { + "displayName": "vnf_instance_name", + "command": "get_input", + "inputName": "2017488_adiodvpe0_vnf_instance_name" + } + }, + "properties": { + "vmxvre_retype": "RE-VMX", + "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version", + "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d", + "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9", + "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF", + "int_ctl_net_name": "VMX-INTXI", + "vmx_int_ctl_prefix": "10.0.0.10", + "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5", + "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279", + "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a", + "nf_type": "vPE", + "vmxvpfe_int_ctl_ip_1": "10.0.0.10", + "is_AVPN_service": "false", + "vmx_RSG_name": "vREXI-affinity", + "vmx_int_ctl_forwarding": "l2", + "vmxvre_oam_ip_0": "10.0.0.10", + "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvpfe_sriov41_0_port_vlanstrip": "false", + "vmxvpfe_sriov42_0_port_vlanfilter": "4001", + "vmxvpfe_sriov44_0_port_unknownunicastallow": "true", + "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2", + "vmxvre_instance": "0", + "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvre_flavor_name": "ns.c1r16d32.v5", + "vmxvpfe_volume_size_0": "40.0", + "vmxvpfe_sriov43_0_port_vlanfilter": "4001", + "nf_naming": "{ecomp_generated_naming=false}", + "nf_naming_code": "Navneet", + "vmxvre_name_0": "vREXI", + "vmxvpfe_sriov42_0_port_vlanstrip": "false", + "vmxvpfe_volume_name_0": "vPFEXI_FBVolume", + "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141", + "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2", + "vmxvpfe_sriov43_0_port_unknownunicastallow": "true", + "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true", + "vmxvre_console": "vidconsole", + "vmxvpfe_sriov44_0_port_vlanfilter": "4001", + "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3", + "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true", + "vmxvpfe_sriov44_0_port_vlanstrip": "false", + "vf_module_id": "123", + "nf_function": "JAI", + "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true", + "vmxvre_int_ctl_ip_0": "10.0.0.10", + "ecomp_generated_naming": "false", + "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI", + "vnf_name": "mtnj309me6vre", + "vmxvpfe_sriov41_0_port_unknownunicastallow": "true", + "vmxvre_volume_type_1": "HITACHI", + "vmxvpfe_sriov44_0_port_broadcastallow": "true", + "vmxvre_volume_type_0": "HITACHI", + "vmxvpfe_volume_type_0": "HITACHI", + "vmxvpfe_sriov43_0_port_broadcastallow": "true", + "bandwidth_units": "get_input:adiodvpe0_bandwidth_units", + "vnf_id": "123", + "vmxvre_oam_prefix": "24", + "availability_zone_0": "mtpocfo-kvm-az01", + "ASN": "get_input:2017488_adiodvpe0_ASN", + "vmxvre_chassis_i2cid": "161", + "vmxvpfe_name_0": "vPFEXI", + "bandwidth": "get_input:adiodvpe0_bandwidth", + "availability_zone_max_count": "1", + "vmxvre_volume_size_0": "45.0", + "vmxvre_volume_size_1": "50.0", + "vmxvpfe_sriov42_0_port_broadcastallow": "true", + "vmxvre_oam_gateway": "10.0.0.10", + "vmxvre_volume_name_1": "vREXI_FAVolume", + "vmxvre_ore_present": "0", + "vmxvre_volume_name_0": "vREXI_FBVolume", + "vmxvre_type": "0", + "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name", + "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true", + "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429", + "vmx_int_ctl_len": "24", + "vmxvpfe_sriov43_0_port_vlanstrip": "false", + "vmxvpfe_sriov41_0_port_broadcastallow": "true", + "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d", + "vmxvpfe_sriov41_0_port_vlanfilter": "4001", + "nf_role": "Testing", + "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a", + "vmxvpfe_sriov42_0_port_unknownunicastallow": "true", + "vmxvpfe_flavor_name": "ns.c20r16d25.v5" + }, + "type": "VF", + "modelCustomizationName": "2017-388_ADIOD-vPE 1", + "vfModules": {}, + "volumeGroups": {}, + "vfcInstanceGroups": {} + } + }, + "collectionResource": {}, + "configurations": { + "2017-388_ADIOD-vPE 1__configuration": { + "uuid": "0903e1c0-8e03-4936-b5c2-260653b96413", + "invariantUuid": "00beb8f9-6d39-452f-816d-c709b9cbb87d", + "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM", + "name": "2017-388_ADIOD-vPE", + "version": "1.0", + "customizationUuid": "280dec31-f16d-488b-9668-4aae55d6648a", + "inputs": { + "vnf_config_template_version": { + "type": "string", + "description": "VPE Software Version", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "17.2" + }, + "bandwidth_units": { + "type": "string", + "description": "Units of bandwidth", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "Gbps" + }, + "bandwidth": { + "type": "string", + "description": "Requested VPE bandwidth", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "10" + }, + "AIC_CLLI": { + "type": "string", + "description": "AIC Site CLLI", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "ATLMY8GA" + }, + "ASN": { + "type": "string", + "description": "AV/PE", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "AV_vPE" + }, + "vnf_instance_name": { + "type": "string", + "description": "The hostname assigned to the vpe.", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "mtnj309me6" + } + }, + "commands": { + "vnf_config_template_version": { + "displayName": "vnf_config_template_version", + "command": "get_input", + "inputName": "2017488_adiodvpe0_vnf_config_template_version" + }, + "bandwidth_units": { + "displayName": "bandwidth_units", + "command": "get_input", + "inputName": "adiodvpe0_bandwidth_units" + }, + "bandwidth": { + "displayName": "bandwidth", + "command": "get_input", + "inputName": "adiodvpe0_bandwidth" + }, + "AIC_CLLI": { + "displayName": "AIC_CLLI", + "command": "get_input", + "inputName": "2017488_adiodvpe0_AIC_CLLI" + }, + "ASN": { + "displayName": "ASN", + "command": "get_input", + "inputName": "2017488_adiodvpe0_ASN" + }, + "vnf_instance_name": { + "displayName": "vnf_instance_name", + "command": "get_input", + "inputName": "2017488_adiodvpe0_vnf_instance_name" + } + }, + "properties": { + "vmxvre_retype": "RE-VMX", + "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version", + "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d", + "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9", + "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF", + "int_ctl_net_name": "VMX-INTXI", + "vmx_int_ctl_prefix": "10.0.0.10", + "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5", + "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279", + "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a", + "nf_type": "vPE", + "vmxvpfe_int_ctl_ip_1": "10.0.0.10", + "is_AVPN_service": "false", + "vmx_RSG_name": "vREXI-affinity", + "vmx_int_ctl_forwarding": "l2", + "vmxvre_oam_ip_0": "10.0.0.10", + "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvpfe_sriov41_0_port_vlanstrip": "false", + "vmxvpfe_sriov42_0_port_vlanfilter": "4001", + "vmxvpfe_sriov44_0_port_unknownunicastallow": "true", + "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2", + "vmxvre_instance": "0", + "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvre_flavor_name": "ns.c1r16d32.v5", + "vmxvpfe_volume_size_0": "40.0", + "vmxvpfe_sriov43_0_port_vlanfilter": "4001", + "nf_naming": "{ecomp_generated_naming=false}", + "nf_naming_code": "Navneet", + "vmxvre_name_0": "vREXI", + "vmxvpfe_sriov42_0_port_vlanstrip": "false", + "vmxvpfe_volume_name_0": "vPFEXI_FBVolume", + "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141", + "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2", + "vmxvpfe_sriov43_0_port_unknownunicastallow": "true", + "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true", + "vmxvre_console": "vidconsole", + "vmxvpfe_sriov44_0_port_vlanfilter": "4001", + "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3", + "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true", + "vmxvpfe_sriov44_0_port_vlanstrip": "false", + "vf_module_id": "123", + "nf_function": "JAI", + "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true", + "vmxvre_int_ctl_ip_0": "10.0.0.10", + "ecomp_generated_naming": "false", + "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI", + "vnf_name": "mtnj309me6vre", + "vmxvpfe_sriov41_0_port_unknownunicastallow": "true", + "vmxvre_volume_type_1": "HITACHI", + "vmxvpfe_sriov44_0_port_broadcastallow": "true", + "vmxvre_volume_type_0": "HITACHI", + "vmxvpfe_volume_type_0": "HITACHI", + "vmxvpfe_sriov43_0_port_broadcastallow": "true", + "bandwidth_units": "get_input:adiodvpe0_bandwidth_units", + "vnf_id": "123", + "vmxvre_oam_prefix": "24", + "availability_zone_0": "mtpocfo-kvm-az01", + "ASN": "get_input:2017488_adiodvpe0_ASN", + "vmxvre_chassis_i2cid": "161", + "vmxvpfe_name_0": "vPFEXI", + "bandwidth": "get_input:adiodvpe0_bandwidth", + "availability_zone_max_count": "1", + "vmxvre_volume_size_0": "45.0", + "vmxvre_volume_size_1": "50.0", + "vmxvpfe_sriov42_0_port_broadcastallow": "true", + "vmxvre_oam_gateway": "10.0.0.10", + "vmxvre_volume_name_1": "vREXI_FAVolume", + "vmxvre_ore_present": "0", + "vmxvre_volume_name_0": "vREXI_FBVolume", + "vmxvre_type": "0", + "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name", + "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true", + "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429", + "vmx_int_ctl_len": "24", + "vmxvpfe_sriov43_0_port_vlanstrip": "false", + "vmxvpfe_sriov41_0_port_broadcastallow": "true", + "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d", + "vmxvpfe_sriov41_0_port_vlanfilter": "4001", + "nf_role": "Testing", + "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a", + "vmxvpfe_sriov42_0_port_unknownunicastallow": "true", + "vmxvpfe_flavor_name": "ns.c20r16d25.v5" + }, + "type": "VF", + "modelCustomizationName": "2017-388_ADIOD-vPE 1", + "vfModules": {}, + "volumeGroups": {}, + "vfcInstanceGroups": {} + } + + }, + "fabricConfigurations": {}, + "serviceProxies": {}, + "vfModules": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": { + "uuid": "25284168-24bb-4698-8cb4-3f509146eca5", + "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1", + "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vRE_BV", + "baseModule": false + }, + "inputs": { + "vnf_config_template_version": { + "type": "string", + "description": "VPE Software Version", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "vnf_config_template_version" + }, + "fromInputName": "2017488_adiodvpe0_vnf_config_template_version", + "constraints": null, + "required": true, + "default": "17.2" + }, + "bandwidth_units": { + "type": "string", + "description": "Units of bandwidth", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "bandwidth_units" + }, + "fromInputName": "adiodvpe0_bandwidth_units", + "constraints": null, + "required": true, + "default": "Gbps" + }, + "bandwidth": { + "type": "string", + "description": "Requested VPE bandwidth", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "bandwidth" + }, + "fromInputName": "adiodvpe0_bandwidth", + "constraints": null, + "required": true, + "default": "10" + }, + "AIC_CLLI": { + "type": "string", + "description": "AIC Site CLLI", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "AIC_CLLI" + }, + "fromInputName": "2017488_adiodvpe0_AIC_CLLI", + "constraints": null, + "required": true, + "default": "ATLMY8GA" + }, + "vnf_instance_name": { + "type": "string", + "description": "The hostname assigned to the vpe.", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "vnf_instance_name" + }, + "fromInputName": "2017488_adiodvpe0_vnf_instance_name", + "constraints": null, + "required": true, + "default": "mtnj309me6" + } + }, + "volumeGroupAllowed": true + }, + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": { + "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db", + "invariantUuid": "b34833bb-6aa9-4ad6-a831-70b06367a091", + "customizationUuid": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3", + "description": null, + "name": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0", + "version": "5", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0", + "properties": { + "minCountInstances": 1, + "maxCountInstances": 1, + "initialCount": 1, + "vfModuleLabel": "ADIOD_base_vPE_BV", + "baseModule": true + }, + "inputs": {}, + "volumeGroupAllowed": false + }, + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": { + "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a", + "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339", + "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vPFE_BV", + "baseModule": false + }, + "inputs": {}, + "volumeGroupAllowed": true + } + }, + "volumeGroups": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": { + "uuid": "25284168-24bb-4698-8cb4-3f509146eca5", + "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1", + "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vRE_BV", + "baseModule": false + }, + "inputs": { + "vnf_config_template_version": { + "type": "string", + "description": "VPE Software Version", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "vnf_config_template_version" + }, + "fromInputName": "2017488_adiodvpe0_vnf_config_template_version", + "constraints": null, + "required": true, + "default": "17.2" + }, + "bandwidth_units": { + "type": "string", + "description": "Units of bandwidth", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "bandwidth_units" + }, + "fromInputName": "adiodvpe0_bandwidth_units", + "constraints": null, + "required": true, + "default": "Gbps" + }, + "bandwidth": { + "type": "string", + "description": "Requested VPE bandwidth", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "bandwidth" + }, + "fromInputName": "adiodvpe0_bandwidth", + "constraints": null, + "required": true, + "default": "10" + }, + "AIC_CLLI": { + "type": "string", + "description": "AIC Site CLLI", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "AIC_CLLI" + }, + "fromInputName": "2017488_adiodvpe0_AIC_CLLI", + "constraints": null, + "required": true, + "default": "ATLMY8GA" + }, + "vnf_instance_name": { + "type": "string", + "description": "The hostname assigned to the vpe.", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "vnf_instance_name" + }, + "fromInputName": "2017488_adiodvpe0_vnf_instance_name", + "constraints": null, + "required": true, + "default": "mtnj309me6" + } + } + }, + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": { + "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a", + "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339", + "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vPFE_BV", + "baseModule": false + }, + "inputs": {} + } + }, + "pnfs": {} + } + } +}); diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/configuration/configuration.model.info.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/configuration/configuration.model.info.ts new file mode 100644 index 000000000..dd85ea110 --- /dev/null +++ b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/configuration/configuration.model.info.ts @@ -0,0 +1,87 @@ +import {ILevelNodeInfo} from "../basic.model.info"; +import {DynamicInputsService} from "../../dynamicInputs.service"; +import * as _ from 'lodash'; +import {SharedTreeService} from "../../shared.tree.service"; +import {ITreeNode} from "angular-tree-component/dist/defs/api"; +import {AvailableNodeIcons} from "../../../available-models-tree/available-models-tree.service"; + +export class ConfigurationModelInfo implements ILevelNodeInfo{ + constructor(private _dynamicInputsService : DynamicInputsService, + private _sharedTreeService : SharedTreeService){} + name: string = 'configurations'; + type : string = 'Configuration'; + typeName : string = 'C'; + + isEcompGeneratedNaming = () : boolean => true; + + updateDynamicInputsDataFromModel = () : any => []; + + getNextLevelObject = (): any => null; + + getTooltip = () : string => 'Configuration'; + + getType = () : string => "Configuration"; + + /*********************************************************** + * return configuration model + * @param configurationModelId - current Model id + * @param serviceHierarchy - serviceHierarchy + ************************************************************/ + getModel = (configurationModelId : string, serviceHierarchy) : any =>{ + if(!_.isNil(serviceHierarchy)){ + if(!_.isNil(serviceHierarchy[this.name]) && !_.isNil(serviceHierarchy[this.name][configurationModelId])){ + return serviceHierarchy[this.name][configurationModelId]; + } + } + return {}; + }; + + createInstanceTreeNode(instance: any, model: any, storeKey: string): any {return null;} + + childName: string; + childType: string; + + /*********************************************************** + * return if instance has missing data + * @param instance - vnf instance + * @param dynamicInputs + * @param isEcompGeneratedNaming + ************************************************************/ + hasMissingData(instance, dynamicInputs: any, isEcompGeneratedNaming: boolean): boolean { + return this._sharedTreeService.hasMissingData(instance, dynamicInputs, isEcompGeneratedNaming, []); + } + + onClickAdd(node: ITreeNode, serviceModelId: string): void { + } + + getNodeCount(node: ITreeNode, serviceModelId: string): number { + return 0; + } + + /*********************************************************** + * should show node icon + * @param node - current ITrees node + * @param serviceModelId - service id + ************************************************************/ + showNodeIcons(node: ITreeNode, serviceModelId: string): AvailableNodeIcons { + return null; + } + + getMenuAction(node: ITreeNode, serviceModelId : string){ + return { + + } + } + + updatePosition(that , node, instanceId): void { + // TODO + } + + getNodePosition(instance): number { + return null; + } + + onSelectedNode(node: ITreeNode): void { + } + +} diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/network/network.model.info.spec.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/network/network.model.info.spec.ts new file mode 100644 index 000000000..206adb6d1 --- /dev/null +++ b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/network/network.model.info.spec.ts @@ -0,0 +1,1553 @@ +import {HttpClientTestingModule, HttpTestingController} from "@angular/common/http/testing"; +import {getTestBed, TestBed} from "@angular/core/testing"; +import {MockNgRedux, NgReduxTestingModule} from "@angular-redux/store/testing"; +import {NetworkModelInfo} from "./network.model.info"; +import {DynamicInputsService} from "../../dynamicInputs.service"; +import {SharedTreeService} from "../../shared.tree.service"; +import {NgRedux} from "@angular-redux/store"; +import {NetworkPopupService} from "../../../../../shared/components/genericFormPopup/genericFormServices/network/network.popup.service"; +import {DialogService} from "ng2-bootstrap-modal"; +import {AvailableNodeIcons} from "../../../available-models-tree/available-models-tree.service"; +import {DrawingBoardModes} from "../../../drawing-board.modes"; +import {IframeService} from "../../../../../shared/utils/iframe.service"; +import {DuplicateService} from "../../../duplicate/duplicate.service"; +class MockAppStore<T> { + getState() { + return { + global: { + 'drawingBoardStatus': DrawingBoardModes.CREATE + }, + service : { + serviceHierarchy : { + 'servicedId' : { + 'networks' : { + 'networkName' : { + 'properties' : { + 'max_instances' : 1 + } + } + } + } + }, + serviceInstance : { + 'servicedId' : { + 'existingNetworksCounterMap' : { + 'networkId' : 1 + }, + 'networks' : { + 'networkName' :{ + 'action': 'Create', + 'originalName' : 'networkName' + } + } + } + } + } + } + } +} +describe('Network Model Info', () => { + let injector; + let _dynamicInputsService : DynamicInputsService; + let _sharedTreeService : SharedTreeService; + let networkModel: NetworkModelInfo; + let _dialogService : DialogService; + let _networkPopupService : NetworkPopupService; + let _duplicateService : DuplicateService; + let _iframeService : IframeService; + + beforeAll(done => (async () => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule, NgReduxTestingModule], + providers: [ + DynamicInputsService, + SharedTreeService, + DialogService, + NetworkPopupService, + IframeService, + DuplicateService, + {provide: NgRedux, useClass: MockAppStore}, + MockNgRedux] + }); + await TestBed.compileComponents(); + + injector = getTestBed(); + _sharedTreeService = injector.get(SharedTreeService); + networkModel = new NetworkModelInfo(_dynamicInputsService, _sharedTreeService, _dialogService, _networkPopupService, _duplicateService, null, _iframeService, MockNgRedux.getInstance()); + })().then(done).catch(done.fail)); + + test('NetworkModelInfo should be defined', () => { + expect(NetworkModelInfo).toBeDefined(); + }); + + test('NetworkModelInfo should defined extra details', () => { + expect(networkModel.name).toEqual('networks'); + expect(networkModel.type).toEqual('Network'); + }); + + test('isEcompGeneratedNaming should return true if = isEcompGeneratedNaming is "true" ', () => { + let isEcompGeneratedNaming: boolean = networkModel.isEcompGeneratedNaming({ + properties: { + ecomp_generated_naming: 'true' + } + }); + expect(isEcompGeneratedNaming).toBeTruthy(); + }); + + test('isEcompGeneratedNaming should return false if isEcompGeneratedNaming is "false"', () => { + let isEcompGeneratedNaming: boolean = networkModel.isEcompGeneratedNaming({ + properties: { + ecomp_generated_naming: 'false' + } + }); + expect(isEcompGeneratedNaming).toBeFalsy(); + }); + + test('isEcompGeneratedNaming should return false if isEcompGeneratedNaming is not defined', () => { + let isEcompGeneratedNaming: boolean = networkModel.isEcompGeneratedNaming({ + properties: {} + }); + expect(isEcompGeneratedNaming).toBeFalsy(); + }); + + test('getTooltip should return "VF"', () => { + let tooltip: string = networkModel.getTooltip(); + expect(tooltip).toEqual('Network'); + }); + + test('getType should return "VF"', () => { + let tooltip: string = networkModel.getType(); + expect(tooltip).toEqual('Network'); + }); + + test('getNextLevelObject should return null', () => { + let nextLevel = networkModel.getNextLevelObject(); + expect(nextLevel).toBeNull(); + }); + + test('updateDynamicInputsDataFromModel should return empty array', () => { + let dynamicInputs = networkModel.updateDynamicInputsDataFromModel({}); + expect(dynamicInputs).toEqual([]); + }); + + test('getModel should return Network model', () => { + let model = networkModel.getModel('2017-388_ADIOD-vPE 1_1', <any>{}, getServiceHierarchy()); + expect(model.type).toEqual('VL'); + }); + + test('showNodeIcons should return false if reachLimit of max', ()=>{ + let serviceId : string = 'servicedId'; + let node = { + data : { + id : 'networkId', + name : 'networkName', + modelCustomizationId : 'modelCustomizationId' + } + }; + jest.spyOn(_sharedTreeService, 'getExistingInstancesWithDeleteMode').mockReturnValue(0); + jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({ + global : {}, + service : { + serviceHierarchy : { + 'servicedId' : { + 'networks' : { + 'networkName' : { + 'properties' : { + 'max_instances' : 1 + } + } + } + } + }, + serviceInstance : { + 'servicedId' : { + 'existingNetworksCounterMap' : { + 'modelCustomizationId' : 1 + }, + 'networks' : { + 'networkName' :{ + + } + } + } + } + } + }); + + let result = networkModel.showNodeIcons(<any>node, serviceId); + expect(result).toEqual(new AvailableNodeIcons(true , false)); + }); + + test('showNodeIcons should return true if not reachLimit of max', ()=>{ + let serviceId : string = 'servicedId'; + let node = { + data : { + id : 'networkId', + name : 'networkName' + } + }; + jest.spyOn(_sharedTreeService, 'getExistingInstancesWithDeleteMode').mockReturnValue(0); + jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({ + global : {}, + service : { + serviceHierarchy : { + 'servicedId' : { + 'networks' : { + 'networkName' : { + 'properties' : { + 'max_instances' : 2 + } + } + } + } + }, + serviceInstance : { + 'servicedId' : { + 'existingNetworksCounterMap' : { + 'networkId' : 1 + }, + 'networks' : { + 'networkName' :{ + + } + } + } + } + } + }); + + let result = networkModel.showNodeIcons(<any>node, serviceId); + expect(result).toEqual(new AvailableNodeIcons(true , false)); + }); + + test('getNodeCount should return number of nodes', ()=>{ + let serviceId : string = 'servicedId'; + jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({ + global : {}, + service : { + serviceHierarchy : { + 'servicedId' : { + 'networks' : { + 'networkName' : { + 'properties' : { + 'max_instances' : 1 + } + } + } + } + }, + serviceInstance : { + 'servicedId' : { + 'existingNetworksCounterMap' : { + 'modelCustomizationId' : 1 + }, + 'networks' : { + 'networkName' :{ + 'action': 'Create', + 'originalName' : 'networkName' + } + } + } + } + } + }); + + let node = { + data : { + id : 'networkId', + name : 'networkName', + action: 'Create', + modelCustomizationId : "modelCustomizationId", + modelUniqueId: "modelCustomizationId" + } + }; + let result = networkModel.getNodeCount(<any>node , serviceId); + expect(result).toEqual(1); + + node.data.modelCustomizationId = 'networkId_notExist'; + node.data.modelUniqueId = 'networkId_notExist'; + result = networkModel.getNodeCount(<any>node , serviceId); + expect(result).toEqual(0); + }); + + test('getMenuAction: showAuditInfoNetwork', ()=>{ + + jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({ + global: { + "drawingBoardStatus": DrawingBoardModes.RETRY + } + }); + jest.spyOn(_sharedTreeService, 'isRetryMode').mockReturnValue(true); + let node = { + data : { + "modelId": "6b528779-44a3-4472-bdff-9cd15ec93450", + "action": "Create", + "isFailed": true, + } + }; + let serviceModelId = "6b528779-44a3-4472-bdff-9cd15ec93450"; + let result = networkModel.getMenuAction(<any>node, serviceModelId); + spyOn(result['showAuditInfo'], 'method'); + expect(result['showAuditInfo']).toBeDefined(); + expect(result['showAuditInfo'].visible(node)).toBeTruthy(); + expect(result['showAuditInfo'].enable(node)).toBeTruthy(); + result['showAuditInfo']['method'](node, serviceModelId); + expect(result['showAuditInfo']['method']).toHaveBeenCalledWith(node, serviceModelId); + }); + + + function getServiceHierarchy(){ + return { + "service": { + "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450", + "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0", + "name": "action-data", + "version": "1.0", + "toscaModelURL": null, + "category": "", + "serviceType": "", + "serviceRole": "", + "description": "", + "serviceEcompNaming": "false", + "instantiationType": "Macro", + "inputs": { + "2017488_adiodvpe0_ASN": { + "type": "string", + "description": "AV/PE", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "AV_vPE" + } + }, + "vidNotions": { + "instantiationUI": "legacy", + "modelCategory": "other" + } + }, + "vnfs": { + "2017-388_ADIOD-vPE 1": { + "uuid": "0903e1c0-8e03-4936-b5c2-260653b96413", + "invariantUuid": "00beb8f9-6d39-452f-816d-c709b9cbb87d", + "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM", + "name": "2017-388_ADIOD-vPE", + "version": "1.0", + "customizationUuid": "280dec31-f16d-488b-9668-4aae55d6648a", + "inputs": { + "vnf_config_template_version": { + "type": "string", + "description": "VPE Software Version", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "17.2" + }, + "bandwidth_units": { + "type": "string", + "description": "Units of bandwidth", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "Gbps" + }, + "bandwidth": { + "type": "string", + "description": "Requested VPE bandwidth", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "10" + }, + "AIC_CLLI": { + "type": "string", + "description": "AIC Site CLLI", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "ATLMY8GA" + }, + "ASN": { + "type": "string", + "description": "AV/PE", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "AV_vPE" + }, + "vnf_instance_name": { + "type": "string", + "description": "The hostname assigned to the vpe.", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "mtnj309me6" + } + }, + "commands": { + "vnf_config_template_version": { + "displayName": "vnf_config_template_version", + "command": "get_input", + "inputName": "2017488_adiodvpe0_vnf_config_template_version" + }, + "bandwidth_units": { + "displayName": "bandwidth_units", + "command": "get_input", + "inputName": "adiodvpe0_bandwidth_units" + }, + "bandwidth": { + "displayName": "bandwidth", + "command": "get_input", + "inputName": "adiodvpe0_bandwidth" + }, + "AIC_CLLI": { + "displayName": "AIC_CLLI", + "command": "get_input", + "inputName": "2017488_adiodvpe0_AIC_CLLI" + }, + "ASN": { + "displayName": "ASN", + "command": "get_input", + "inputName": "2017488_adiodvpe0_ASN" + }, + "vnf_instance_name": { + "displayName": "vnf_instance_name", + "command": "get_input", + "inputName": "2017488_adiodvpe0_vnf_instance_name" + } + }, + "properties": { + "vmxvre_retype": "RE-VMX", + "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version", + "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d", + "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9", + "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF", + "int_ctl_net_name": "VMX-INTXI", + "vmx_int_ctl_prefix": "10.0.0.10", + "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5", + "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279", + "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a", + "nf_type": "vPE", + "vmxvpfe_int_ctl_ip_1": "10.0.0.10", + "is_AVPN_service": "false", + "vmx_RSG_name": "vREXI-affinity", + "vmx_int_ctl_forwarding": "l2", + "vmxvre_oam_ip_0": "10.0.0.10", + "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvpfe_sriov41_0_port_vlanstrip": "false", + "vmxvpfe_sriov42_0_port_vlanfilter": "4001", + "vmxvpfe_sriov44_0_port_unknownunicastallow": "true", + "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2", + "vmxvre_instance": "0", + "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvre_flavor_name": "ns.c1r16d32.v5", + "vmxvpfe_volume_size_0": "40.0", + "vmxvpfe_sriov43_0_port_vlanfilter": "4001", + "nf_naming": "{ecomp_generated_naming=false}", + "nf_naming_code": "Navneet", + "vmxvre_name_0": "vREXI", + "vmxvpfe_sriov42_0_port_vlanstrip": "false", + "vmxvpfe_volume_name_0": "vPFEXI_FBVolume", + "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141", + "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2", + "vmxvpfe_sriov43_0_port_unknownunicastallow": "true", + "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true", + "vmxvre_console": "vidconsole", + "vmxvpfe_sriov44_0_port_vlanfilter": "4001", + "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3", + "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true", + "vmxvpfe_sriov44_0_port_vlanstrip": "false", + "vf_module_id": "123", + "nf_function": "JAI", + "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true", + "vmxvre_int_ctl_ip_0": "10.0.0.10", + "ecomp_generated_naming": "false", + "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI", + "vnf_name": "mtnj309me6vre", + "vmxvpfe_sriov41_0_port_unknownunicastallow": "true", + "vmxvre_volume_type_1": "HITACHI", + "vmxvpfe_sriov44_0_port_broadcastallow": "true", + "vmxvre_volume_type_0": "HITACHI", + "vmxvpfe_volume_type_0": "HITACHI", + "vmxvpfe_sriov43_0_port_broadcastallow": "true", + "bandwidth_units": "get_input:adiodvpe0_bandwidth_units", + "vnf_id": "123", + "vmxvre_oam_prefix": "24", + "availability_zone_0": "mtpocfo-kvm-az01", + "ASN": "get_input:2017488_adiodvpe0_ASN", + "vmxvre_chassis_i2cid": "161", + "vmxvpfe_name_0": "vPFEXI", + "bandwidth": "get_input:adiodvpe0_bandwidth", + "availability_zone_max_count": "1", + "vmxvre_volume_size_0": "45.0", + "vmxvre_volume_size_1": "50.0", + "vmxvpfe_sriov42_0_port_broadcastallow": "true", + "vmxvre_oam_gateway": "10.0.0.10", + "vmxvre_volume_name_1": "vREXI_FAVolume", + "vmxvre_ore_present": "0", + "vmxvre_volume_name_0": "vREXI_FBVolume", + "vmxvre_type": "0", + "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name", + "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true", + "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429", + "vmx_int_ctl_len": "24", + "vmxvpfe_sriov43_0_port_vlanstrip": "false", + "vmxvpfe_sriov41_0_port_broadcastallow": "true", + "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d", + "vmxvpfe_sriov41_0_port_vlanfilter": "4001", + "nf_role": "Testing", + "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a", + "vmxvpfe_sriov42_0_port_unknownunicastallow": "true", + "vmxvpfe_flavor_name": "ns.c20r16d25.v5" + }, + "type": "VF", + "modelCustomizationName": "2017-388_ADIOD-vPE 1", + "vfModules": {}, + "volumeGroups": {}, + "vfcInstanceGroups": {} + }, + "2017-388_ADIOD-vPE 0": { + "uuid": "afacccf6-397d-45d6-b5ae-94c39734b168", + "invariantUuid": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8", + "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM", + "name": "2017-388_ADIOD-vPE", + "version": "4.0", + "customizationUuid": "b3c76f73-eeb5-4fb6-9d31-72a889f1811c", + "inputs": { + "vnf_config_template_version": { + "type": "string", + "description": "VPE Software Version", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "17.2" + }, + "bandwidth_units": { + "type": "string", + "description": "Units of bandwidth", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "Gbps" + }, + "bandwidth": { + "type": "string", + "description": "Requested VPE bandwidth", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "10" + }, + "AIC_CLLI": { + "type": "string", + "description": "AIC Site CLLI", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "ATLMY8GA" + }, + "ASN": { + "type": "string", + "description": "AV/PE", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "AV_vPE" + }, + "vnf_instance_name": { + "type": "string", + "description": "The hostname assigned to the vpe.", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "mtnj309me6" + } + }, + "commands": { + "vnf_config_template_version": { + "displayName": "vnf_config_template_version", + "command": "get_input", + "inputName": "2017488_adiodvpe0_vnf_config_template_version" + }, + "bandwidth_units": { + "displayName": "bandwidth_units", + "command": "get_input", + "inputName": "adiodvpe0_bandwidth_units" + }, + "bandwidth": { + "displayName": "bandwidth", + "command": "get_input", + "inputName": "adiodvpe0_bandwidth" + }, + "AIC_CLLI": { + "displayName": "AIC_CLLI", + "command": "get_input", + "inputName": "2017488_adiodvpe0_AIC_CLLI" + }, + "ASN": { + "displayName": "ASN", + "command": "get_input", + "inputName": "2017488_adiodvpe0_ASN" + }, + "vnf_instance_name": { + "displayName": "vnf_instance_name", + "command": "get_input", + "inputName": "2017488_adiodvpe0_vnf_instance_name" + } + }, + "properties": { + "vmxvre_retype": "RE-VMX", + "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version", + "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d", + "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9", + "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF", + "int_ctl_net_name": "VMX-INTXI", + "vmx_int_ctl_prefix": "10.0.0.10", + "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5", + "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279", + "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a", + "nf_type": "vPE", + "vmxvpfe_int_ctl_ip_1": "10.0.0.10", + "is_AVPN_service": "false", + "vmx_RSG_name": "vREXI-affinity", + "vmx_int_ctl_forwarding": "l2", + "vmxvre_oam_ip_0": "10.0.0.10", + "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvpfe_sriov41_0_port_vlanstrip": "false", + "vmxvpfe_sriov42_0_port_vlanfilter": "4001", + "vmxvpfe_sriov44_0_port_unknownunicastallow": "true", + "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2", + "vmxvre_instance": "0", + "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvre_flavor_name": "ns.c1r16d32.v5", + "vmxvpfe_volume_size_0": "40.0", + "vmxvpfe_sriov43_0_port_vlanfilter": "4001", + "nf_naming": "{ecomp_generated_naming=false}", + "nf_naming_code": "Navneet", + "vmxvre_name_0": "vREXI", + "vmxvpfe_sriov42_0_port_vlanstrip": "false", + "vmxvpfe_volume_name_0": "vPFEXI_FBVolume", + "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141", + "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2", + "vmxvpfe_sriov43_0_port_unknownunicastallow": "true", + "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true", + "vmxvre_console": "vidconsole", + "vmxvpfe_sriov44_0_port_vlanfilter": "4001", + "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3", + "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true", + "min_instances": "1", + "vmxvpfe_sriov44_0_port_vlanstrip": "false", + "vf_module_id": "123", + "nf_function": "JAI", + "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true", + "vmxvre_int_ctl_ip_0": "10.0.0.10", + "ecomp_generated_naming": "false", + "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI", + "vnf_name": "mtnj309me6vre", + "vmxvpfe_sriov41_0_port_unknownunicastallow": "true", + "vmxvre_volume_type_1": "HITACHI", + "vmxvpfe_sriov44_0_port_broadcastallow": "true", + "vmxvre_volume_type_0": "HITACHI", + "vmxvpfe_volume_type_0": "HITACHI", + "vmxvpfe_sriov43_0_port_broadcastallow": "true", + "bandwidth_units": "get_input:adiodvpe0_bandwidth_units", + "vnf_id": "123", + "vmxvre_oam_prefix": "24", + "availability_zone_0": "mtpocfo-kvm-az01", + "ASN": "get_input:2017488_adiodvpe0_ASN", + "vmxvre_chassis_i2cid": "161", + "vmxvpfe_name_0": "vPFEXI", + "bandwidth": "get_input:adiodvpe0_bandwidth", + "availability_zone_max_count": "1", + "vmxvre_volume_size_0": "45.0", + "vmxvre_volume_size_1": "50.0", + "vmxvpfe_sriov42_0_port_broadcastallow": "true", + "vmxvre_oam_gateway": "10.0.0.10", + "vmxvre_volume_name_1": "vREXI_FAVolume", + "vmxvre_ore_present": "0", + "vmxvre_volume_name_0": "vREXI_FBVolume", + "vmxvre_type": "0", + "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name", + "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true", + "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429", + "vmx_int_ctl_len": "24", + "vmxvpfe_sriov43_0_port_vlanstrip": "false", + "vmxvpfe_sriov41_0_port_broadcastallow": "true", + "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d", + "vmxvpfe_sriov41_0_port_vlanfilter": "4001", + "nf_role": "Testing", + "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a", + "vmxvpfe_sriov42_0_port_unknownunicastallow": "true", + "vmxvpfe_flavor_name": "ns.c20r16d25.v5" + }, + "type": "VF", + "modelCustomizationName": "2017-388_ADIOD-vPE 0", + "vfModules": {}, + "volumeGroups": {}, + "vfcInstanceGroups": {} + }, + "2017-488_ADIOD-vPE 0": { + "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09", + "invariantUuid": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8", + "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM", + "name": "2017-488_ADIOD-vPE", + "version": "5.0", + "customizationUuid": "1da7b585-5e61-4993-b95e-8e6606c81e45", + "inputs": { + "vnf_config_template_version": { + "type": "string", + "description": "VPE Software Version", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "17.2" + }, + "bandwidth_units": { + "type": "string", + "description": "Units of bandwidth", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "Gbps" + }, + "bandwidth": { + "type": "string", + "description": "Requested VPE bandwidth", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "10" + }, + "AIC_CLLI": { + "type": "string", + "description": "AIC Site CLLI", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "ATLMY8GA" + }, + "ASN": { + "type": "string", + "description": "AV/PE", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "AV_vPE" + }, + "vnf_instance_name": { + "type": "string", + "description": "The hostname assigned to the vpe.", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "mtnj309me6" + } + }, + "commands": { + "vnf_config_template_version": { + "displayName": "vnf_config_template_version", + "command": "get_input", + "inputName": "2017488_adiodvpe0_vnf_config_template_version" + }, + "bandwidth_units": { + "displayName": "bandwidth_units", + "command": "get_input", + "inputName": "adiodvpe0_bandwidth_units" + }, + "bandwidth": { + "displayName": "bandwidth", + "command": "get_input", + "inputName": "adiodvpe0_bandwidth" + }, + "AIC_CLLI": { + "displayName": "AIC_CLLI", + "command": "get_input", + "inputName": "2017488_adiodvpe0_AIC_CLLI" + }, + "ASN": { + "displayName": "ASN", + "command": "get_input", + "inputName": "2017488_adiodvpe0_ASN" + }, + "vnf_instance_name": { + "displayName": "vnf_instance_name", + "command": "get_input", + "inputName": "2017488_adiodvpe0_vnf_instance_name" + } + }, + "properties": { + "vmxvre_retype": "RE-VMX", + "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version", + "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d", + "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9", + "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF", + "int_ctl_net_name": "VMX-INTXI", + "vmx_int_ctl_prefix": "10.0.0.10", + "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5", + "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279", + "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a", + "nf_type": "vPE", + "vmxvpfe_int_ctl_ip_1": "10.0.0.10", + "is_AVPN_service": "false", + "vmx_RSG_name": "vREXI-affinity", + "vmx_int_ctl_forwarding": "l2", + "vmxvre_oam_ip_0": "10.0.0.10", + "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvpfe_sriov41_0_port_vlanstrip": "false", + "vmxvpfe_sriov42_0_port_vlanfilter": "4001", + "vmxvpfe_sriov44_0_port_unknownunicastallow": "true", + "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2", + "vmxvre_instance": "0", + "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvre_flavor_name": "ns.c1r16d32.v5", + "vmxvpfe_volume_size_0": "40.0", + "vmxvpfe_sriov43_0_port_vlanfilter": "4001", + "nf_naming": "{ecomp_generated_naming=false}", + "nf_naming_code": "Navneet", + "vmxvre_name_0": "vREXI", + "vmxvpfe_sriov42_0_port_vlanstrip": "false", + "vmxvpfe_volume_name_0": "vPFEXI_FBVolume", + "max_instances": "3", + "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141", + "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2", + "vmxvpfe_sriov43_0_port_unknownunicastallow": "true", + "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true", + "vmxvre_console": "vidconsole", + "vmxvpfe_sriov44_0_port_vlanfilter": "4001", + "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3", + "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true", + "min_instances": "1", + "vmxvpfe_sriov44_0_port_vlanstrip": "false", + "vf_module_id": "123", + "nf_function": "JAI", + "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true", + "vmxvre_int_ctl_ip_0": "10.0.0.10", + "ecomp_generated_naming": "false", + "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI", + "vnf_name": "mtnj309me6vre", + "vmxvpfe_sriov41_0_port_unknownunicastallow": "true", + "vmxvre_volume_type_1": "HITACHI", + "vmxvpfe_sriov44_0_port_broadcastallow": "true", + "vmxvre_volume_type_0": "HITACHI", + "vmxvpfe_volume_type_0": "HITACHI", + "vmxvpfe_sriov43_0_port_broadcastallow": "true", + "bandwidth_units": "get_input:adiodvpe0_bandwidth_units", + "vnf_id": "123", + "vmxvre_oam_prefix": "24", + "availability_zone_0": "mtpocfo-kvm-az01", + "ASN": "get_input:2017488_adiodvpe0_ASN", + "vmxvre_chassis_i2cid": "161", + "vmxvpfe_name_0": "vPFEXI", + "bandwidth": "get_input:adiodvpe0_bandwidth", + "availability_zone_max_count": "1", + "vmxvre_volume_size_0": "45.0", + "vmxvre_volume_size_1": "50.0", + "vmxvpfe_sriov42_0_port_broadcastallow": "true", + "vmxvre_oam_gateway": "10.0.0.10", + "vmxvre_volume_name_1": "vREXI_FAVolume", + "vmxvre_ore_present": "0", + "vmxvre_volume_name_0": "vREXI_FBVolume", + "vmxvre_type": "0", + "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name", + "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true", + "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429", + "vmx_int_ctl_len": "24", + "vmxvpfe_sriov43_0_port_vlanstrip": "false", + "vmxvpfe_sriov41_0_port_broadcastallow": "true", + "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d", + "vmxvpfe_sriov41_0_port_vlanfilter": "4001", + "nf_role": "Testing", + "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a", + "vmxvpfe_sriov42_0_port_unknownunicastallow": "true", + "vmxvpfe_flavor_name": "ns.c20r16d25.v5" + }, + "type": "VF", + "modelCustomizationName": "2017-488_ADIOD-vPE 0", + "vfModules": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": { + "uuid": "25284168-24bb-4698-8cb4-3f509146eca5", + "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1", + "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vRE_BV", + "baseModule": false + }, + "inputs": { + "vnf_config_template_version": { + "type": "string", + "description": "VPE Software Version", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "vnf_config_template_version" + }, + "fromInputName": "2017488_adiodvpe0_vnf_config_template_version", + "constraints": null, + "required": true, + "default": "17.2" + }, + "bandwidth_units": { + "type": "string", + "description": "Units of bandwidth", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "bandwidth_units" + }, + "fromInputName": "adiodvpe0_bandwidth_units", + "constraints": null, + "required": true, + "default": "Gbps" + }, + "bandwidth": { + "type": "string", + "description": "Requested VPE bandwidth", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "bandwidth" + }, + "fromInputName": "adiodvpe0_bandwidth", + "constraints": null, + "required": true, + "default": "10" + }, + "AIC_CLLI": { + "type": "string", + "description": "AIC Site CLLI", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "AIC_CLLI" + }, + "fromInputName": "2017488_adiodvpe0_AIC_CLLI", + "constraints": null, + "required": true, + "default": "ATLMY8GA" + }, + "vnf_instance_name": { + "type": "string", + "description": "The hostname assigned to the vpe.", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "vnf_instance_name" + }, + "fromInputName": "2017488_adiodvpe0_vnf_instance_name", + "constraints": null, + "required": true, + "default": "mtnj309me6" + } + }, + "volumeGroupAllowed": true + }, + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": { + "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db", + "invariantUuid": "b34833bb-6aa9-4ad6-a831-70b06367a091", + "customizationUuid": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3", + "description": null, + "name": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0", + "version": "5", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0", + "properties": { + "minCountInstances": 1, + "maxCountInstances": 1, + "initialCount": 1, + "vfModuleLabel": "ADIOD_base_vPE_BV", + "baseModule": true + }, + "inputs": {}, + "volumeGroupAllowed": false + }, + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": { + "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a", + "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339", + "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vPFE_BV", + "baseModule": false + }, + "inputs": {}, + "volumeGroupAllowed": true + } + }, + "volumeGroups": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": { + "uuid": "25284168-24bb-4698-8cb4-3f509146eca5", + "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1", + "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vRE_BV", + "baseModule": false + }, + "inputs": { + "vnf_config_template_version": { + "type": "string", + "description": "VPE Software Version", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "vnf_config_template_version" + }, + "fromInputName": "2017488_adiodvpe0_vnf_config_template_version", + "constraints": null, + "required": true, + "default": "17.2" + }, + "bandwidth_units": { + "type": "string", + "description": "Units of bandwidth", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "bandwidth_units" + }, + "fromInputName": "adiodvpe0_bandwidth_units", + "constraints": null, + "required": true, + "default": "Gbps" + }, + "bandwidth": { + "type": "string", + "description": "Requested VPE bandwidth", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "bandwidth" + }, + "fromInputName": "adiodvpe0_bandwidth", + "constraints": null, + "required": true, + "default": "10" + }, + "AIC_CLLI": { + "type": "string", + "description": "AIC Site CLLI", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "AIC_CLLI" + }, + "fromInputName": "2017488_adiodvpe0_AIC_CLLI", + "constraints": null, + "required": true, + "default": "ATLMY8GA" + }, + "vnf_instance_name": { + "type": "string", + "description": "The hostname assigned to the vpe.", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "vnf_instance_name" + }, + "fromInputName": "2017488_adiodvpe0_vnf_instance_name", + "constraints": null, + "required": true, + "default": "mtnj309me6" + } + } + }, + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": { + "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a", + "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339", + "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vPFE_BV", + "baseModule": false + }, + "inputs": {} + } + }, + "vfcInstanceGroups": {} + } + }, + "networks": { + "2017-388_ADIOD-vPE 1_1": { + "uuid": "0903e1c0-8e03-4936-b5c2-260653b96413", + "invariantUuid": "00beb8f9-6d39-452f-816d-c709b9cbb87d", + "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM", + "name": "2017-388_ADIOD-vPE", + "version": "1.0", + "customizationUuid": "280dec31-f16d-488b-9668-4aae55d6648a", + "inputs": { + "vnf_config_template_version": { + "type": "string", + "description": "VPE Software Version", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "17.2" + }, + "bandwidth_units": { + "type": "string", + "description": "Units of bandwidth", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "Gbps" + }, + "bandwidth": { + "type": "string", + "description": "Requested VPE bandwidth", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "10" + }, + "AIC_CLLI": { + "type": "string", + "description": "AIC Site CLLI", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "ATLMY8GA" + }, + "ASN": { + "type": "string", + "description": "AV/PE", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "AV_vPE" + }, + "vnf_instance_name": { + "type": "string", + "description": "The hostname assigned to the vpe.", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "mtnj309me6" + } + }, + "commands": { + "vnf_config_template_version": { + "displayName": "vnf_config_template_version", + "command": "get_input", + "inputName": "2017488_adiodvpe0_vnf_config_template_version" + }, + "bandwidth_units": { + "displayName": "bandwidth_units", + "command": "get_input", + "inputName": "adiodvpe0_bandwidth_units" + }, + "bandwidth": { + "displayName": "bandwidth", + "command": "get_input", + "inputName": "adiodvpe0_bandwidth" + }, + "AIC_CLLI": { + "displayName": "AIC_CLLI", + "command": "get_input", + "inputName": "2017488_adiodvpe0_AIC_CLLI" + }, + "ASN": { + "displayName": "ASN", + "command": "get_input", + "inputName": "2017488_adiodvpe0_ASN" + }, + "vnf_instance_name": { + "displayName": "vnf_instance_name", + "command": "get_input", + "inputName": "2017488_adiodvpe0_vnf_instance_name" + } + }, + "properties": { + "vmxvre_retype": "RE-VMX", + "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version", + "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d", + "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9", + "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF", + "int_ctl_net_name": "VMX-INTXI", + "vmx_int_ctl_prefix": "10.0.0.10", + "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5", + "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279", + "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a", + "nf_type": "vPE", + "vmxvpfe_int_ctl_ip_1": "10.0.0.10", + "is_AVPN_service": "false", + "vmx_RSG_name": "vREXI-affinity", + "vmx_int_ctl_forwarding": "l2", + "vmxvre_oam_ip_0": "10.0.0.10", + "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvpfe_sriov41_0_port_vlanstrip": "false", + "vmxvpfe_sriov42_0_port_vlanfilter": "4001", + "vmxvpfe_sriov44_0_port_unknownunicastallow": "true", + "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2", + "vmxvre_instance": "0", + "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvre_flavor_name": "ns.c1r16d32.v5", + "vmxvpfe_volume_size_0": "40.0", + "vmxvpfe_sriov43_0_port_vlanfilter": "4001", + "nf_naming": "{ecomp_generated_naming=false}", + "nf_naming_code": "Navneet", + "vmxvre_name_0": "vREXI", + "vmxvpfe_sriov42_0_port_vlanstrip": "false", + "vmxvpfe_volume_name_0": "vPFEXI_FBVolume", + "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141", + "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2", + "vmxvpfe_sriov43_0_port_unknownunicastallow": "true", + "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true", + "vmxvre_console": "vidconsole", + "vmxvpfe_sriov44_0_port_vlanfilter": "4001", + "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3", + "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true", + "vmxvpfe_sriov44_0_port_vlanstrip": "false", + "vf_module_id": "123", + "nf_function": "JAI", + "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true", + "vmxvre_int_ctl_ip_0": "10.0.0.10", + "ecomp_generated_naming": "false", + "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI", + "vnf_name": "mtnj309me6vre", + "vmxvpfe_sriov41_0_port_unknownunicastallow": "true", + "vmxvre_volume_type_1": "HITACHI", + "vmxvpfe_sriov44_0_port_broadcastallow": "true", + "vmxvre_volume_type_0": "HITACHI", + "vmxvpfe_volume_type_0": "HITACHI", + "vmxvpfe_sriov43_0_port_broadcastallow": "true", + "bandwidth_units": "get_input:adiodvpe0_bandwidth_units", + "vnf_id": "123", + "vmxvre_oam_prefix": "24", + "availability_zone_0": "mtpocfo-kvm-az01", + "ASN": "get_input:2017488_adiodvpe0_ASN", + "vmxvre_chassis_i2cid": "161", + "vmxvpfe_name_0": "vPFEXI", + "bandwidth": "get_input:adiodvpe0_bandwidth", + "availability_zone_max_count": "1", + "vmxvre_volume_size_0": "45.0", + "vmxvre_volume_size_1": "50.0", + "vmxvpfe_sriov42_0_port_broadcastallow": "true", + "vmxvre_oam_gateway": "10.0.0.10", + "vmxvre_volume_name_1": "vREXI_FAVolume", + "vmxvre_ore_present": "0", + "vmxvre_volume_name_0": "vREXI_FBVolume", + "vmxvre_type": "0", + "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name", + "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true", + "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429", + "vmx_int_ctl_len": "24", + "vmxvpfe_sriov43_0_port_vlanstrip": "false", + "vmxvpfe_sriov41_0_port_broadcastallow": "true", + "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d", + "vmxvpfe_sriov41_0_port_vlanfilter": "4001", + "nf_role": "Testing", + "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a", + "vmxvpfe_sriov42_0_port_unknownunicastallow": "true", + "vmxvpfe_flavor_name": "ns.c20r16d25.v5" + }, + "type": "VL", + "modelCustomizationName": "2017-388_ADIOD-vPE 1", + "vfModules": {}, + "volumeGroups": {}, + "vfcInstanceGroups": {} + } + }, + "collectionResource": {}, + "configurations": {}, + "fabricConfigurations": {}, + "serviceProxies": {}, + "vfModules": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": { + "uuid": "25284168-24bb-4698-8cb4-3f509146eca5", + "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1", + "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vRE_BV", + "baseModule": false + }, + "inputs": { + "vnf_config_template_version": { + "type": "string", + "description": "VPE Software Version", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "vnf_config_template_version" + }, + "fromInputName": "2017488_adiodvpe0_vnf_config_template_version", + "constraints": null, + "required": true, + "default": "17.2" + }, + "bandwidth_units": { + "type": "string", + "description": "Units of bandwidth", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "bandwidth_units" + }, + "fromInputName": "adiodvpe0_bandwidth_units", + "constraints": null, + "required": true, + "default": "Gbps" + }, + "bandwidth": { + "type": "string", + "description": "Requested VPE bandwidth", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "bandwidth" + }, + "fromInputName": "adiodvpe0_bandwidth", + "constraints": null, + "required": true, + "default": "10" + }, + "AIC_CLLI": { + "type": "string", + "description": "AIC Site CLLI", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "AIC_CLLI" + }, + "fromInputName": "2017488_adiodvpe0_AIC_CLLI", + "constraints": null, + "required": true, + "default": "ATLMY8GA" + }, + "vnf_instance_name": { + "type": "string", + "description": "The hostname assigned to the vpe.", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "vnf_instance_name" + }, + "fromInputName": "2017488_adiodvpe0_vnf_instance_name", + "constraints": null, + "required": true, + "default": "mtnj309me6" + } + }, + "volumeGroupAllowed": true + }, + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": { + "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db", + "invariantUuid": "b34833bb-6aa9-4ad6-a831-70b06367a091", + "customizationUuid": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3", + "description": null, + "name": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0", + "version": "5", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0", + "properties": { + "minCountInstances": 1, + "maxCountInstances": 1, + "initialCount": 1, + "vfModuleLabel": "ADIOD_base_vPE_BV", + "baseModule": true + }, + "inputs": {}, + "volumeGroupAllowed": false + }, + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": { + "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a", + "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339", + "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vPFE_BV", + "baseModule": false + }, + "inputs": {}, + "volumeGroupAllowed": true + } + }, + "volumeGroups": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": { + "uuid": "25284168-24bb-4698-8cb4-3f509146eca5", + "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1", + "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vRE_BV", + "baseModule": false + }, + "inputs": { + "vnf_config_template_version": { + "type": "string", + "description": "VPE Software Version", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "vnf_config_template_version" + }, + "fromInputName": "2017488_adiodvpe0_vnf_config_template_version", + "constraints": null, + "required": true, + "default": "17.2" + }, + "bandwidth_units": { + "type": "string", + "description": "Units of bandwidth", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "bandwidth_units" + }, + "fromInputName": "adiodvpe0_bandwidth_units", + "constraints": null, + "required": true, + "default": "Gbps" + }, + "bandwidth": { + "type": "string", + "description": "Requested VPE bandwidth", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "bandwidth" + }, + "fromInputName": "adiodvpe0_bandwidth", + "constraints": null, + "required": true, + "default": "10" + }, + "AIC_CLLI": { + "type": "string", + "description": "AIC Site CLLI", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "AIC_CLLI" + }, + "fromInputName": "2017488_adiodvpe0_AIC_CLLI", + "constraints": null, + "required": true, + "default": "ATLMY8GA" + }, + "vnf_instance_name": { + "type": "string", + "description": "The hostname assigned to the vpe.", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "vnf_instance_name" + }, + "fromInputName": "2017488_adiodvpe0_vnf_instance_name", + "constraints": null, + "required": true, + "default": "mtnj309me6" + } + } + }, + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": { + "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a", + "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339", + "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vPFE_BV", + "baseModule": false + }, + "inputs": {} + } + }, + "pnfs": {} + } + } +}); diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/network/network.model.info.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/network/network.model.info.ts new file mode 100644 index 000000000..3d99750ae --- /dev/null +++ b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/network/network.model.info.ts @@ -0,0 +1,264 @@ +import {DynamicInputsService} from "../../dynamicInputs.service"; +import {ILevelNodeInfo} from "../basic.model.info"; +import {NetworkInstance} from "../../../../../shared/models/networkInstance"; +import {NetworkModel} from "../../../../../shared/models/networkModel"; +import {NetworkTreeNode} from "../../../../../shared/models/networkTreeNode"; +import {SharedTreeService} from "../../shared.tree.service"; +import {InputType} from "../../../../../shared/models/inputTypes"; +import {NgRedux} from "@angular-redux/store"; +import {AppState} from "../../../../../shared/store/reducers"; +import { + GenericFormPopupComponent, + PopupType +} from "../../../../../shared/components/genericFormPopup/generic-form-popup.component"; +import {DialogService} from "ng2-bootstrap-modal"; +import {NetworkPopupService} from "../../../../../shared/components/genericFormPopup/genericFormServices/network/network.popup.service"; +import * as _ from "lodash"; +import {ITreeNode} from "angular-tree-component/dist/defs/api"; +import {AvailableNodeIcons} from "../../../available-models-tree/available-models-tree.service"; +import {DuplicateVnfComponent} from "../../../duplicate/duplicate-vnf.component"; +import {changeInstanceCounter, removeInstance} from "../../../../../shared/storeUtil/utils/general/general.actions"; +import {IframeService} from "../../../../../shared/utils/iframe.service"; +import {SdcUiServices} from "onap-ui-angular"; +import {DuplicateService} from "../../../duplicate/duplicate.service"; +import {ServiceInstanceActions} from "../../../../../shared/models/serviceInstanceActions"; +import { + deleteActionNetworkInstance, + undoDeleteActionNetworkInstance, + updateNetworkPosition +} from "../../../../../shared/storeUtil/utils/network/network.actions"; +import {IModalConfig} from "onap-ui-angular/dist/modals/models/modal-config"; + +export class NetworkModelInfo implements ILevelNodeInfo { + constructor(private _dynamicInputsService: DynamicInputsService, + private _sharedTreeService: SharedTreeService, + private _dialogService: DialogService, + private _networkPopupService: NetworkPopupService, + private _duplicateService: DuplicateService, + private modalService: SdcUiServices.ModalService, + private _iframeService: IframeService, + private _store: NgRedux<AppState>) { + } + + name: string = 'networks'; + type: string = 'Network'; + typeName: string = 'N'; + + /*********************************************************** + * return model dynamic inputs + * @param currentModel - current Model object + ************************************************************/ + isEcompGeneratedNaming(currentModel): boolean { + const ecompGeneratedNaming = currentModel.properties.ecomp_generated_naming; + return ecompGeneratedNaming === "true"; + } + + updateDynamicInputsDataFromModel = (currentModel): any => { + let displayInputs; + return _.isEmpty(displayInputs) ? [] : this._dynamicInputsService.getArbitraryInputs(displayInputs); + }; + + /*********************************************************** + * return network model + * @param networkModelId - current Model id + * @param instance + * @param serviceHierarchy - serviceHierarchy + ************************************************************/ + getModel = (networkModelId: string, instance: NetworkInstance, serviceHierarchy): NetworkModel => { + const originalModelName = instance.originalName ? instance.originalName : networkModelId; + return new NetworkModel(serviceHierarchy[this.name][originalModelName]); + }; + + + /*********************************************************** + * return network instance tree node + * @param instance - network instance + * @param model - network model + * @param parentModel + * @param storeKey - store key if exist + ************************************************************/ + createInstanceTreeNode = (instance: NetworkInstance, model: NetworkModel, parentModel, storeKey: string): NetworkTreeNode => { + let node = new NetworkTreeNode(instance, model, storeKey); + node.missingData = this.hasMissingData(instance, node, model.isEcompGeneratedNaming); + node.typeName = this.typeName; + node.menuActions = this.getMenuAction(<any>node, model.uuid); + node.isFailed = _.isNil(instance.isFailed) ? false : instance.isFailed; + node.statusMessage = !_.isNil(instance.statusMessage) ? instance.statusMessage: ""; + node = this._sharedTreeService.addingStatusProperty(node); + return node; + }; + + /*********************************************************** + * return next level object (null because is last level) + ************************************************************/ + getNextLevelObject(): any { + return null; + } + + getTooltip = (): string => 'Network'; + + getType = (): string => 'Network'; + + /*********************************************************** + * return if instance has missing data + * @param instance - vnf instance + * @param dynamicInputs + * @param isEcompGeneratedNaming + ************************************************************/ + hasMissingData(instance, dynamicInputs: any, isEcompGeneratedNaming: boolean): boolean { + return this._sharedTreeService.hasMissingData(instance, dynamicInputs, isEcompGeneratedNaming, [InputType.LCP_REGION, InputType.TENANT, InputType.PLATFORM]); + } + + + /*********************************************************** + * return if instance has missing data + * @param node - Network node + * @param serviceModelId - current service id + ************************************************************/ + onClickAdd(node, serviceModelId: string): void { + this._dialogService.addDialog(GenericFormPopupComponent, <any>{ + type: PopupType.NETWORK, + uuidData: { + serviceId: serviceModelId, + networkId: node.data.name, + networkStoreKey: null, + type: 'VL', + popupService: this._networkPopupService + }, + node: node, + isUpdateMode: false + }); + } + + /*********************************************************** + * return number of existing instances + * @param node - Network node + * @param serviceModelId - current service id + ************************************************************/ + getNodeCount(node: ITreeNode, serviceModelId: string): number { + let map = null; + if (!_.isNil(this._store.getState().service.serviceInstance[serviceModelId])) { + map = this._store.getState().service.serviceInstance[serviceModelId].existingNetworksCounterMap || 0; + if (!_.isNil(map)) { + let count = map[node.data.modelUniqueId] || 0; + count -= this._sharedTreeService.getExistingInstancesWithDeleteMode(node, serviceModelId , 'networks'); + return count; + } + } + return 0; + } + + /*********************************************************** + * should show node icon + * @param node - current ITrees node + * @param serviceModelId - service id + ************************************************************/ + showNodeIcons(node: ITreeNode, serviceModelId: string): AvailableNodeIcons { + let counter: number = !_.isNil(this._store.getState().service.serviceInstance[serviceModelId]) ? + (this._store.getState().service.serviceInstance[serviceModelId].existingNetworksCounterMap[node.data.modelUniqueId] || 0) : 0; + + counter -= this._sharedTreeService.getExistingInstancesWithDeleteMode(node, serviceModelId , 'networks'); + + const properties = this._store.getState().service.serviceHierarchy[serviceModelId].networks[node.data.name].properties; + const maxInstances: number = !_.isNil(properties) ? (properties.max_instances || 1) : 1; + const isReachedLimit = !(maxInstances > counter); + const showAddIcon = this._sharedTreeService.shouldShowAddIcon() && !isReachedLimit; + + return new AvailableNodeIcons(showAddIcon, isReachedLimit) + } + + getMenuAction(node: ITreeNode, serviceModelId: string): { [methodName: string]: { method: Function, visible: Function, enable: Function }} { + const mode = this._store.getState().global.drawingBoardStatus; + return { + edit: { + method: (node, serviceModelId) => { + this._iframeService.addClassOpenModal('content'); + this._dialogService.addDialog(GenericFormPopupComponent, { + type: PopupType.NETWORK, + uuidData: <any>{ + serviceId: serviceModelId, + networkId: node.data.modelName, + networkStoreKey: node.data.networkStoreKey, + type: node.data.type, + popupService: this._networkPopupService + }, + node: node, + isUpdateMode: true + }); + }, + visible: (node) => this._sharedTreeService.shouldShowRemoveAndEdit(node), + enable: (node) => this._sharedTreeService.shouldShowRemoveAndEdit(node) + }, + showAuditInfo: { + method: (node, serviceModelId) => { + let instance = this._store.getState().service.serviceInstance[serviceModelId].networks[node.data.networkStoreKey]; + this._sharedTreeService.openAuditInfoModal(node, serviceModelId, instance, 'NETWORK', this); + }, + visible: (node) => this._sharedTreeService.shouldShowAuditInfo(node), + enable: (node) => this._sharedTreeService.shouldShowAuditInfo(node) + }, + duplicate: { + method: (node, serviceModelId) => { + if (this._store.getState().global.flags['FLAG_DUPLICATE_VNF']) { + const storeKey = node.data.networkStoreKey; + let modalConfig: IModalConfig = this._duplicateService.openDuplicateModal(serviceModelId, node.data.modelUniqueId, node.data.modelName, storeKey, 1, this._store, node); + this.modalService.openCustomModal(modalConfig, DuplicateVnfComponent); + } + }, + visible: (node) => this._sharedTreeService.shouldShowDuplicate(node) && !_.isNil(node.data) && !_.isNil(node.data.action) && node.data.action === ServiceInstanceActions.Create && this._duplicateService.canDuplicate(node), + enable: (node, serviceModelId) => this._duplicateService.isEnabled(node, this._store, serviceModelId) + }, + remove: { + method: (node, serviceModelId) => { + let storeKey: string = node.data.networkStoreKey; + this._store.dispatch(removeInstance(node.data.networkStoreKey, serviceModelId, storeKey, node)); + this._store.dispatch(changeInstanceCounter(node.data.modelUniqueId , serviceModelId, -1, node)); + this._sharedTreeService.selectedVNF = null; + }, + visible: (node) => this._sharedTreeService.shouldShowRemoveAndEdit(node), + enable: (node) => this._sharedTreeService.shouldShowRemoveAndEdit(node), + }, + delete : { + method : (node, serviceModelId) => { + if ((!_.isNil(node.data.children) && node.data.children.length === 0) || _.isNil(node.data.children)) { + this._store.dispatch(deleteActionNetworkInstance(node.data.networkStoreKey, serviceModelId)); + }else { + this._sharedTreeService.removeDeleteAllChild(node, serviceModelId, (node, serviceModelId)=>{ + this._store.dispatch(deleteActionNetworkInstance(node.data.networkStoreKey, serviceModelId)); + }); + } + }, + visible: (node) => this._sharedTreeService.shouldShowDelete(node), + enable: (node) => this._sharedTreeService.shouldShowDelete(node) + }, + undoDelete : { + method : (node, serviceModelId) => { + if ((!_.isNil(node.data.children) && node.data.children.length === 0) || _.isNil(node.data.children)) { + this._store.dispatch(undoDeleteActionNetworkInstance(node.data.networkStoreKey, serviceModelId)); + }else { + this._sharedTreeService.undoDeleteAllChild(node, serviceModelId, (node, serviceModelId)=>{ + this._store.dispatch(undoDeleteActionNetworkInstance(node.data.networkStoreKey, serviceModelId)); + }); + } + }, + visible: (node) => this._sharedTreeService.shouldShowUndoDelete(node), + enable: (node, serviceModelId) => this._sharedTreeService.shouldShowUndoDelete(node) && !this._sharedTreeService.isServiceOnDeleteMode(serviceModelId) + } + }; + } + + /*********************************************************** + * should update node position inside the tree + * @param node - current ITrees node + ************************************************************/ + updatePosition(that , node, instanceId): void { + that.store.dispatch(updateNetworkPosition(node)); + } + + getNodePosition(instance): number { + return !_.isNil(instance) ? instance.position : null; + } + + onSelectedNode(node: ITreeNode): void { + } +} diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/relatedVnfMember/relatedVnfMember.info.model.spec.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/relatedVnfMember/relatedVnfMember.info.model.spec.ts new file mode 100644 index 000000000..dcf25f579 --- /dev/null +++ b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/relatedVnfMember/relatedVnfMember.info.model.spec.ts @@ -0,0 +1,1211 @@ +import {HttpClientTestingModule, HttpTestingController} from "@angular/common/http/testing"; +import {getTestBed, TestBed} from "@angular/core/testing"; +import {MockNgRedux, NgReduxTestingModule} from "@angular-redux/store/testing"; +import {DynamicInputsService} from "../../dynamicInputs.service"; +import {VNFModel} from "../../../../../shared/models/vnfModel"; +import {SharedTreeService} from "../../shared.tree.service"; +import {NgRedux} from "@angular-redux/store"; +import {AppState} from "../../../../../shared/store/reducers"; +import {DefaultDataGeneratorService} from "../../../../../shared/services/defaultDataServiceGenerator/default.data.generator.service"; +import {DialogService} from "ng2-bootstrap-modal"; +import {VfModulePopuopService} from "../../../../../shared/components/genericFormPopup/genericFormServices/vfModule/vfModule.popuop.service"; +import {VnfPopupService} from "../../../../../shared/components/genericFormPopup/genericFormServices/vnf/vnf.popup.service"; +import {DuplicateService} from "../../../duplicate/duplicate.service"; +import {IframeService} from "../../../../../shared/utils/iframe.service"; +import {RelatedVnfMemberInfoModel} from "./relatedVnfMember.info.model"; + + +class MockAppStore<T> { + getState() { + return {} + } +} + + +describe('Related Vnf member Model Info', () => { + let injector; + let httpMock: HttpTestingController; + let _dynamicInputsService : DynamicInputsService; + let _sharedTreeService : SharedTreeService; + + let _store : NgRedux<AppState>; + let relatedVnfMemeber: RelatedVnfMemberInfoModel; + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule, NgReduxTestingModule], + providers: [ + MockNgRedux, + DynamicInputsService, + DialogService, + VfModulePopuopService, + VnfPopupService, + DefaultDataGeneratorService, + SharedTreeService, + DuplicateService, + IframeService] + }).compileComponents(); + + injector = getTestBed(); + _sharedTreeService = injector.get(SharedTreeService); + _store = injector.get(NgRedux); + + relatedVnfMemeber = new RelatedVnfMemberInfoModel( + _sharedTreeService, + _dynamicInputsService, + _store); + }); + + test('relatedVnfMemeber should be defined', () => { + expect(relatedVnfMemeber).toBeDefined(); + }); + + test('RelatedVnfMemeber should defined extra details', () => { + expect(relatedVnfMemeber.name).toEqual('vnfs'); + expect(relatedVnfMemeber.type).toEqual('relatedVnfMember'); + }); + + test('isEcompGeneratedNaming should return true if isEcompGeneratedNaming is "true" ', () => { + let isEcompGeneratedNaming: boolean = relatedVnfMemeber.isEcompGeneratedNaming(<any>{ + properties: { + ecomp_generated_naming: 'true' + } + }); + expect(isEcompGeneratedNaming).toBeTruthy(); + }); + + test('isEcompGeneratedNaming should return false if isEcompGeneratedNaming is "false"', () => { + let isEcompGeneratedNaming: boolean = relatedVnfMemeber.isEcompGeneratedNaming({ + properties: { + ecomp_generated_naming: 'false' + } + }); + expect(isEcompGeneratedNaming).toBeFalsy(); + }); + + test('isEcompGeneratedNaming should return false if isEcompGeneratedNaming is not defined', () => { + let isEcompGeneratedNaming: boolean = relatedVnfMemeber.isEcompGeneratedNaming({ + properties: { + } + }); + expect(isEcompGeneratedNaming).toBeFalsy(); + }); + + + test('getTooltip should return "VF"', () => { + let tooltip: string = relatedVnfMemeber.getTooltip(); + expect(tooltip).toEqual('VF'); + }); + + test('getType should return "VF"', () => { + let tooltip: string = relatedVnfMemeber.getType(); + expect(tooltip).toEqual('VF'); + }); + + test('getNextLevelObject should be null', () => { + let nextLevel = relatedVnfMemeber.getNextLevelObject(); + expect(nextLevel).toBeNull(); + }); + + test('getModel should return VNF model', () => { + let model: VNFModel = relatedVnfMemeber.getModel('2017-388_ADIOD-vPE 1', <any>{ + originalName : '2017-388_ADIOD-vPE 1' + }, getServiceHierarchy()); + expect(model.type).toEqual('VF'); + }); + + + test('getMenuAction: delete', ()=>{ + let node = {"modelId":"d6557200-ecf2-4641-8094-5393ae3aae60","missingData":true,"action":"None","inMaint":true,"name":"jlfBwIks283yKlCD8","modelName":"VF_vMee 0","type":"VF","isEcompGeneratedNaming":true,"networkStoreKey":"VF_vMee 0:004","vnfStoreKey":"VF_vMee 0:004","typeName":"VNF"}; + let serviceModelId = "d6557200-ecf2-4641-8094-5393ae3aae60"; + let result = relatedVnfMemeber.getMenuAction(<any>node, serviceModelId); + spyOn(result['delete'], 'method'); + expect(result['delete']).toBeDefined(); + expect(result['delete'].visible).toBeTruthy(); + expect(result['delete'].enable).toBeTruthy(); + result['delete']['method'](node, serviceModelId); + expect(result['delete']['method']).toHaveBeenCalledWith(node, serviceModelId); + }); + + + test('getMenuAction: undoDelete', ()=>{ + let node = {"modelId":"d6557200-ecf2-4641-8094-5393ae3aae60","missingData":true,"action":"None","inMaint":true,"name":"jlfBwIks283yKlCD8","modelName":"VF_vMee 0","type":"VF","isEcompGeneratedNaming":true,"networkStoreKey":"VF_vMee 0:004","vnfStoreKey":"VF_vMee 0:004","typeName":"VNF"}; + let serviceModelId = "d6557200-ecf2-4641-8094-5393ae3aae60"; + let result = relatedVnfMemeber.getMenuAction(<any>node, serviceModelId); + spyOn(result['undoDelete'], 'method'); + expect(result['undoDelete']).toBeDefined(); + expect(result['undoDelete'].visible).toBeDefined(); + expect(result['undoDelete'].enable).toBeDefined(); + result['undoDelete']['method'](node, serviceModelId); + expect(result['undoDelete']['method']).toHaveBeenCalledWith(node, serviceModelId); + }); + + + + function getServiceHierarchy(){ + return { + "service": { + "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450", + "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0", + "name": "action-data", + "version": "1.0", + "toscaModelURL": null, + "category": "", + "serviceType": "", + "serviceRole": "", + "description": "", + "serviceEcompNaming": "false", + "instantiationType": "Macro", + "inputs": { + "2017488_adiodvpe0_ASN": { + "type": "string", + "description": "AV/PE", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "AV_vPE" + } + }, + "vidNotions": { + "instantiationUI": "legacy", + "modelCategory": "other" + } + }, + "vnfs": { + "2017-388_ADIOD-vPE 1": { + "uuid": "0903e1c0-8e03-4936-b5c2-260653b96413", + "invariantUuid": "00beb8f9-6d39-452f-816d-c709b9cbb87d", + "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM", + "name": "2017-388_ADIOD-vPE", + "version": "1.0", + "customizationUuid": "280dec31-f16d-488b-9668-4aae55d6648a", + "inputs": { + "vnf_config_template_version": { + "type": "string", + "description": "VPE Software Version", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "17.2" + }, + "bandwidth_units": { + "type": "string", + "description": "Units of bandwidth", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "Gbps" + }, + "bandwidth": { + "type": "string", + "description": "Requested VPE bandwidth", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "10" + }, + "AIC_CLLI": { + "type": "string", + "description": "AIC Site CLLI", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "ATLMY8GA" + }, + "ASN": { + "type": "string", + "description": "AV/PE", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "AV_vPE" + }, + "vnf_instance_name": { + "type": "string", + "description": "The hostname assigned to the vpe.", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "mtnj309me6" + } + }, + "commands": { + "vnf_config_template_version": { + "displayName": "vnf_config_template_version", + "command": "get_input", + "inputName": "2017488_adiodvpe0_vnf_config_template_version" + }, + "bandwidth_units": { + "displayName": "bandwidth_units", + "command": "get_input", + "inputName": "adiodvpe0_bandwidth_units" + }, + "bandwidth": { + "displayName": "bandwidth", + "command": "get_input", + "inputName": "adiodvpe0_bandwidth" + }, + "AIC_CLLI": { + "displayName": "AIC_CLLI", + "command": "get_input", + "inputName": "2017488_adiodvpe0_AIC_CLLI" + }, + "ASN": { + "displayName": "ASN", + "command": "get_input", + "inputName": "2017488_adiodvpe0_ASN" + }, + "vnf_instance_name": { + "displayName": "vnf_instance_name", + "command": "get_input", + "inputName": "2017488_adiodvpe0_vnf_instance_name" + } + }, + "properties": { + "vmxvre_retype": "RE-VMX", + "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version", + "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d", + "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9", + "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF", + "int_ctl_net_name": "VMX-INTXI", + "vmx_int_ctl_prefix": "10.0.0.10", + "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5", + "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279", + "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a", + "nf_type": "vPE", + "vmxvpfe_int_ctl_ip_1": "10.0.0.10", + "is_AVPN_service": "false", + "vmx_RSG_name": "vREXI-affinity", + "vmx_int_ctl_forwarding": "l2", + "vmxvre_oam_ip_0": "10.0.0.10", + "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvpfe_sriov41_0_port_vlanstrip": "false", + "vmxvpfe_sriov42_0_port_vlanfilter": "4001", + "vmxvpfe_sriov44_0_port_unknownunicastallow": "true", + "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2", + "vmxvre_instance": "0", + "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvre_flavor_name": "ns.c1r16d32.v5", + "vmxvpfe_volume_size_0": "40.0", + "vmxvpfe_sriov43_0_port_vlanfilter": "4001", + "nf_naming": "{ecomp_generated_naming=false}", + "nf_naming_code": "Navneet", + "vmxvre_name_0": "vREXI", + "vmxvpfe_sriov42_0_port_vlanstrip": "false", + "vmxvpfe_volume_name_0": "vPFEXI_FBVolume", + "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141", + "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2", + "vmxvpfe_sriov43_0_port_unknownunicastallow": "true", + "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true", + "vmxvre_console": "vidconsole", + "vmxvpfe_sriov44_0_port_vlanfilter": "4001", + "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3", + "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true", + "vmxvpfe_sriov44_0_port_vlanstrip": "false", + "vf_module_id": "123", + "nf_function": "JAI", + "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true", + "vmxvre_int_ctl_ip_0": "10.0.0.10", + "ecomp_generated_naming": "false", + "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI", + "vnf_name": "mtnj309me6vre", + "vmxvpfe_sriov41_0_port_unknownunicastallow": "true", + "vmxvre_volume_type_1": "HITACHI", + "vmxvpfe_sriov44_0_port_broadcastallow": "true", + "vmxvre_volume_type_0": "HITACHI", + "vmxvpfe_volume_type_0": "HITACHI", + "vmxvpfe_sriov43_0_port_broadcastallow": "true", + "bandwidth_units": "get_input:adiodvpe0_bandwidth_units", + "vnf_id": "123", + "vmxvre_oam_prefix": "24", + "availability_zone_0": "mtpocfo-kvm-az01", + "ASN": "get_input:2017488_adiodvpe0_ASN", + "vmxvre_chassis_i2cid": "161", + "vmxvpfe_name_0": "vPFEXI", + "bandwidth": "get_input:adiodvpe0_bandwidth", + "availability_zone_max_count": "1", + "vmxvre_volume_size_0": "45.0", + "vmxvre_volume_size_1": "50.0", + "vmxvpfe_sriov42_0_port_broadcastallow": "true", + "vmxvre_oam_gateway": "10.0.0.10", + "vmxvre_volume_name_1": "vREXI_FAVolume", + "vmxvre_ore_present": "0", + "vmxvre_volume_name_0": "vREXI_FBVolume", + "vmxvre_type": "0", + "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name", + "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true", + "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429", + "vmx_int_ctl_len": "24", + "vmxvpfe_sriov43_0_port_vlanstrip": "false", + "vmxvpfe_sriov41_0_port_broadcastallow": "true", + "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d", + "vmxvpfe_sriov41_0_port_vlanfilter": "4001", + "nf_role": "Testing", + "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a", + "vmxvpfe_sriov42_0_port_unknownunicastallow": "true", + "vmxvpfe_flavor_name": "ns.c20r16d25.v5" + }, + "type": "VF", + "modelCustomizationName": "2017-388_ADIOD-vPE 1", + "vfModules": {}, + "volumeGroups": {}, + "vfcInstanceGroups": {} + }, + "2017-388_ADIOD-vPE 0": { + "uuid": "afacccf6-397d-45d6-b5ae-94c39734b168", + "invariantUuid": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8", + "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM", + "name": "2017-388_ADIOD-vPE", + "version": "4.0", + "customizationUuid": "b3c76f73-eeb5-4fb6-9d31-72a889f1811c", + "inputs": { + "vnf_config_template_version": { + "type": "string", + "description": "VPE Software Version", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "17.2" + }, + "bandwidth_units": { + "type": "string", + "description": "Units of bandwidth", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "Gbps" + }, + "bandwidth": { + "type": "string", + "description": "Requested VPE bandwidth", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "10" + }, + "AIC_CLLI": { + "type": "string", + "description": "AIC Site CLLI", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "ATLMY8GA" + }, + "ASN": { + "type": "string", + "description": "AV/PE", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "AV_vPE" + }, + "vnf_instance_name": { + "type": "string", + "description": "The hostname assigned to the vpe.", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "mtnj309me6" + } + }, + "commands": { + "vnf_config_template_version": { + "displayName": "vnf_config_template_version", + "command": "get_input", + "inputName": "2017488_adiodvpe0_vnf_config_template_version" + }, + "bandwidth_units": { + "displayName": "bandwidth_units", + "command": "get_input", + "inputName": "adiodvpe0_bandwidth_units" + }, + "bandwidth": { + "displayName": "bandwidth", + "command": "get_input", + "inputName": "adiodvpe0_bandwidth" + }, + "AIC_CLLI": { + "displayName": "AIC_CLLI", + "command": "get_input", + "inputName": "2017488_adiodvpe0_AIC_CLLI" + }, + "ASN": { + "displayName": "ASN", + "command": "get_input", + "inputName": "2017488_adiodvpe0_ASN" + }, + "vnf_instance_name": { + "displayName": "vnf_instance_name", + "command": "get_input", + "inputName": "2017488_adiodvpe0_vnf_instance_name" + } + }, + "properties": { + "vmxvre_retype": "RE-VMX", + "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version", + "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d", + "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9", + "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF", + "int_ctl_net_name": "VMX-INTXI", + "vmx_int_ctl_prefix": "10.0.0.10", + "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5", + "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279", + "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a", + "nf_type": "vPE", + "vmxvpfe_int_ctl_ip_1": "10.0.0.10", + "is_AVPN_service": "false", + "vmx_RSG_name": "vREXI-affinity", + "vmx_int_ctl_forwarding": "l2", + "vmxvre_oam_ip_0": "10.0.0.10", + "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvpfe_sriov41_0_port_vlanstrip": "false", + "vmxvpfe_sriov42_0_port_vlanfilter": "4001", + "vmxvpfe_sriov44_0_port_unknownunicastallow": "true", + "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2", + "vmxvre_instance": "0", + "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvre_flavor_name": "ns.c1r16d32.v5", + "vmxvpfe_volume_size_0": "40.0", + "vmxvpfe_sriov43_0_port_vlanfilter": "4001", + "nf_naming": "{ecomp_generated_naming=false}", + "nf_naming_code": "Navneet", + "vmxvre_name_0": "vREXI", + "vmxvpfe_sriov42_0_port_vlanstrip": "false", + "vmxvpfe_volume_name_0": "vPFEXI_FBVolume", + "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141", + "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2", + "vmxvpfe_sriov43_0_port_unknownunicastallow": "true", + "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true", + "vmxvre_console": "vidconsole", + "vmxvpfe_sriov44_0_port_vlanfilter": "4001", + "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3", + "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true", + "min_instances": "1", + "vmxvpfe_sriov44_0_port_vlanstrip": "false", + "vf_module_id": "123", + "nf_function": "JAI", + "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true", + "vmxvre_int_ctl_ip_0": "10.0.0.10", + "ecomp_generated_naming": "false", + "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI", + "vnf_name": "mtnj309me6vre", + "vmxvpfe_sriov41_0_port_unknownunicastallow": "true", + "vmxvre_volume_type_1": "HITACHI", + "vmxvpfe_sriov44_0_port_broadcastallow": "true", + "vmxvre_volume_type_0": "HITACHI", + "vmxvpfe_volume_type_0": "HITACHI", + "vmxvpfe_sriov43_0_port_broadcastallow": "true", + "bandwidth_units": "get_input:adiodvpe0_bandwidth_units", + "vnf_id": "123", + "vmxvre_oam_prefix": "24", + "availability_zone_0": "mtpocfo-kvm-az01", + "ASN": "get_input:2017488_adiodvpe0_ASN", + "vmxvre_chassis_i2cid": "161", + "vmxvpfe_name_0": "vPFEXI", + "bandwidth": "get_input:adiodvpe0_bandwidth", + "availability_zone_max_count": "1", + "vmxvre_volume_size_0": "45.0", + "vmxvre_volume_size_1": "50.0", + "vmxvpfe_sriov42_0_port_broadcastallow": "true", + "vmxvre_oam_gateway": "10.0.0.10", + "vmxvre_volume_name_1": "vREXI_FAVolume", + "vmxvre_ore_present": "0", + "vmxvre_volume_name_0": "vREXI_FBVolume", + "vmxvre_type": "0", + "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name", + "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true", + "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429", + "vmx_int_ctl_len": "24", + "vmxvpfe_sriov43_0_port_vlanstrip": "false", + "vmxvpfe_sriov41_0_port_broadcastallow": "true", + "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d", + "vmxvpfe_sriov41_0_port_vlanfilter": "4001", + "nf_role": "Testing", + "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a", + "vmxvpfe_sriov42_0_port_unknownunicastallow": "true", + "vmxvpfe_flavor_name": "ns.c20r16d25.v5" + }, + "type": "VF", + "modelCustomizationName": "2017-388_ADIOD-vPE 0", + "vfModules": {}, + "volumeGroups": {}, + "vfcInstanceGroups": {} + }, + "2017-488_ADIOD-vPE 0": { + "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09", + "invariantUuid": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8", + "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM", + "name": "2017-488_ADIOD-vPE", + "version": "5.0", + "customizationUuid": "1da7b585-5e61-4993-b95e-8e6606c81e45", + "inputs": { + "vnf_config_template_version": { + "type": "string", + "description": "VPE Software Version", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "17.2" + }, + "bandwidth_units": { + "type": "string", + "description": "Units of bandwidth", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "Gbps" + }, + "bandwidth": { + "type": "string", + "description": "Requested VPE bandwidth", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "10" + }, + "AIC_CLLI": { + "type": "string", + "description": "AIC Site CLLI", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "ATLMY8GA" + }, + "ASN": { + "type": "string", + "description": "AV/PE", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "AV_vPE" + }, + "vnf_instance_name": { + "type": "string", + "description": "The hostname assigned to the vpe.", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "mtnj309me6" + } + }, + "commands": { + "vnf_config_template_version": { + "displayName": "vnf_config_template_version", + "command": "get_input", + "inputName": "2017488_adiodvpe0_vnf_config_template_version" + }, + "bandwidth_units": { + "displayName": "bandwidth_units", + "command": "get_input", + "inputName": "adiodvpe0_bandwidth_units" + }, + "bandwidth": { + "displayName": "bandwidth", + "command": "get_input", + "inputName": "adiodvpe0_bandwidth" + }, + "AIC_CLLI": { + "displayName": "AIC_CLLI", + "command": "get_input", + "inputName": "2017488_adiodvpe0_AIC_CLLI" + }, + "ASN": { + "displayName": "ASN", + "command": "get_input", + "inputName": "2017488_adiodvpe0_ASN" + }, + "vnf_instance_name": { + "displayName": "vnf_instance_name", + "command": "get_input", + "inputName": "2017488_adiodvpe0_vnf_instance_name" + } + }, + "properties": { + "vmxvre_retype": "RE-VMX", + "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version", + "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d", + "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9", + "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF", + "int_ctl_net_name": "VMX-INTXI", + "vmx_int_ctl_prefix": "10.0.0.10", + "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5", + "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279", + "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a", + "nf_type": "vPE", + "vmxvpfe_int_ctl_ip_1": "10.0.0.10", + "is_AVPN_service": "false", + "vmx_RSG_name": "vREXI-affinity", + "vmx_int_ctl_forwarding": "l2", + "vmxvre_oam_ip_0": "10.0.0.10", + "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvpfe_sriov41_0_port_vlanstrip": "false", + "vmxvpfe_sriov42_0_port_vlanfilter": "4001", + "vmxvpfe_sriov44_0_port_unknownunicastallow": "true", + "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2", + "vmxvre_instance": "0", + "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvre_flavor_name": "ns.c1r16d32.v5", + "vmxvpfe_volume_size_0": "40.0", + "vmxvpfe_sriov43_0_port_vlanfilter": "4001", + "nf_naming": "{ecomp_generated_naming=false}", + "nf_naming_code": "Navneet", + "vmxvre_name_0": "vREXI", + "vmxvpfe_sriov42_0_port_vlanstrip": "false", + "vmxvpfe_volume_name_0": "vPFEXI_FBVolume", + "max_instances": "3", + "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141", + "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2", + "vmxvpfe_sriov43_0_port_unknownunicastallow": "true", + "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true", + "vmxvre_console": "vidconsole", + "vmxvpfe_sriov44_0_port_vlanfilter": "4001", + "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3", + "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true", + "min_instances": "1", + "vmxvpfe_sriov44_0_port_vlanstrip": "false", + "vf_module_id": "123", + "nf_function": "JAI", + "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true", + "vmxvre_int_ctl_ip_0": "10.0.0.10", + "ecomp_generated_naming": "false", + "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI", + "vnf_name": "mtnj309me6vre", + "vmxvpfe_sriov41_0_port_unknownunicastallow": "true", + "vmxvre_volume_type_1": "HITACHI", + "vmxvpfe_sriov44_0_port_broadcastallow": "true", + "vmxvre_volume_type_0": "HITACHI", + "vmxvpfe_volume_type_0": "HITACHI", + "vmxvpfe_sriov43_0_port_broadcastallow": "true", + "bandwidth_units": "get_input:adiodvpe0_bandwidth_units", + "vnf_id": "123", + "vmxvre_oam_prefix": "24", + "availability_zone_0": "mtpocfo-kvm-az01", + "ASN": "get_input:2017488_adiodvpe0_ASN", + "vmxvre_chassis_i2cid": "161", + "vmxvpfe_name_0": "vPFEXI", + "bandwidth": "get_input:adiodvpe0_bandwidth", + "availability_zone_max_count": "1", + "vmxvre_volume_size_0": "45.0", + "vmxvre_volume_size_1": "50.0", + "vmxvpfe_sriov42_0_port_broadcastallow": "true", + "vmxvre_oam_gateway": "10.0.0.10", + "vmxvre_volume_name_1": "vREXI_FAVolume", + "vmxvre_ore_present": "0", + "vmxvre_volume_name_0": "vREXI_FBVolume", + "vmxvre_type": "0", + "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name", + "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true", + "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429", + "vmx_int_ctl_len": "24", + "vmxvpfe_sriov43_0_port_vlanstrip": "false", + "vmxvpfe_sriov41_0_port_broadcastallow": "true", + "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d", + "vmxvpfe_sriov41_0_port_vlanfilter": "4001", + "nf_role": "Testing", + "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a", + "vmxvpfe_sriov42_0_port_unknownunicastallow": "true", + "vmxvpfe_flavor_name": "ns.c20r16d25.v5" + }, + "type": "VF", + "modelCustomizationName": "2017-488_ADIOD-vPE 0", + "vfModules": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": { + "uuid": "25284168-24bb-4698-8cb4-3f509146eca5", + "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1", + "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vRE_BV", + "baseModule": false + }, + "inputs": { + "vnf_config_template_version": { + "type": "string", + "description": "VPE Software Version", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "vnf_config_template_version" + }, + "fromInputName": "2017488_adiodvpe0_vnf_config_template_version", + "constraints": null, + "required": true, + "default": "17.2" + }, + "bandwidth_units": { + "type": "string", + "description": "Units of bandwidth", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "bandwidth_units" + }, + "fromInputName": "adiodvpe0_bandwidth_units", + "constraints": null, + "required": true, + "default": "Gbps" + }, + "bandwidth": { + "type": "string", + "description": "Requested VPE bandwidth", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "bandwidth" + }, + "fromInputName": "adiodvpe0_bandwidth", + "constraints": null, + "required": true, + "default": "10" + }, + "AIC_CLLI": { + "type": "string", + "description": "AIC Site CLLI", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "AIC_CLLI" + }, + "fromInputName": "2017488_adiodvpe0_AIC_CLLI", + "constraints": null, + "required": true, + "default": "ATLMY8GA" + }, + "vnf_instance_name": { + "type": "string", + "description": "The hostname assigned to the vpe.", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "vnf_instance_name" + }, + "fromInputName": "2017488_adiodvpe0_vnf_instance_name", + "constraints": null, + "required": true, + "default": "mtnj309me6" + } + }, + "volumeGroupAllowed": true + }, + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": { + "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db", + "invariantUuid": "b34833bb-6aa9-4ad6-a831-70b06367a091", + "customizationUuid": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3", + "description": null, + "name": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0", + "version": "5", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0", + "properties": { + "minCountInstances": 1, + "maxCountInstances": 1, + "initialCount": 1, + "vfModuleLabel": "ADIOD_base_vPE_BV", + "baseModule": true + }, + "inputs": {}, + "volumeGroupAllowed": false + }, + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": { + "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a", + "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339", + "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vPFE_BV", + "baseModule": false + }, + "inputs": {}, + "volumeGroupAllowed": true + } + }, + "volumeGroups": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": { + "uuid": "25284168-24bb-4698-8cb4-3f509146eca5", + "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1", + "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vRE_BV", + "baseModule": false + }, + "inputs": { + "vnf_config_template_version": { + "type": "string", + "description": "VPE Software Version", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "vnf_config_template_version" + }, + "fromInputName": "2017488_adiodvpe0_vnf_config_template_version", + "constraints": null, + "required": true, + "default": "17.2" + }, + "bandwidth_units": { + "type": "string", + "description": "Units of bandwidth", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "bandwidth_units" + }, + "fromInputName": "adiodvpe0_bandwidth_units", + "constraints": null, + "required": true, + "default": "Gbps" + }, + "bandwidth": { + "type": "string", + "description": "Requested VPE bandwidth", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "bandwidth" + }, + "fromInputName": "adiodvpe0_bandwidth", + "constraints": null, + "required": true, + "default": "10" + }, + "AIC_CLLI": { + "type": "string", + "description": "AIC Site CLLI", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "AIC_CLLI" + }, + "fromInputName": "2017488_adiodvpe0_AIC_CLLI", + "constraints": null, + "required": true, + "default": "ATLMY8GA" + }, + "vnf_instance_name": { + "type": "string", + "description": "The hostname assigned to the vpe.", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "vnf_instance_name" + }, + "fromInputName": "2017488_adiodvpe0_vnf_instance_name", + "constraints": null, + "required": true, + "default": "mtnj309me6" + } + } + }, + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": { + "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a", + "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339", + "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vPFE_BV", + "baseModule": false + }, + "inputs": {} + } + }, + "vfcInstanceGroups": {} + } + }, + "networks": {}, + "collectionResource": {}, + "configurations": {}, + "fabricConfigurations": {}, + "serviceProxies": {}, + "vfModules": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": { + "uuid": "25284168-24bb-4698-8cb4-3f509146eca5", + "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1", + "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vRE_BV", + "baseModule": false + }, + "inputs": { + "vnf_config_template_version": { + "type": "string", + "description": "VPE Software Version", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "vnf_config_template_version" + }, + "fromInputName": "2017488_adiodvpe0_vnf_config_template_version", + "constraints": null, + "required": true, + "default": "17.2" + }, + "bandwidth_units": { + "type": "string", + "description": "Units of bandwidth", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "bandwidth_units" + }, + "fromInputName": "adiodvpe0_bandwidth_units", + "constraints": null, + "required": true, + "default": "Gbps" + }, + "bandwidth": { + "type": "string", + "description": "Requested VPE bandwidth", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "bandwidth" + }, + "fromInputName": "adiodvpe0_bandwidth", + "constraints": null, + "required": true, + "default": "10" + }, + "AIC_CLLI": { + "type": "string", + "description": "AIC Site CLLI", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "AIC_CLLI" + }, + "fromInputName": "2017488_adiodvpe0_AIC_CLLI", + "constraints": null, + "required": true, + "default": "ATLMY8GA" + }, + "vnf_instance_name": { + "type": "string", + "description": "The hostname assigned to the vpe.", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "vnf_instance_name" + }, + "fromInputName": "2017488_adiodvpe0_vnf_instance_name", + "constraints": null, + "required": true, + "default": "mtnj309me6" + } + }, + "volumeGroupAllowed": true + }, + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": { + "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db", + "invariantUuid": "b34833bb-6aa9-4ad6-a831-70b06367a091", + "customizationUuid": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3", + "description": null, + "name": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0", + "version": "5", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0", + "properties": { + "minCountInstances": 1, + "maxCountInstances": 1, + "initialCount": 1, + "vfModuleLabel": "ADIOD_base_vPE_BV", + "baseModule": true + }, + "inputs": {}, + "volumeGroupAllowed": false + }, + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": { + "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a", + "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339", + "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vPFE_BV", + "baseModule": false + }, + "inputs": {}, + "volumeGroupAllowed": true + } + }, + "volumeGroups": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": { + "uuid": "25284168-24bb-4698-8cb4-3f509146eca5", + "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1", + "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vRE_BV", + "baseModule": false + }, + "inputs": { + "vnf_config_template_version": { + "type": "string", + "description": "VPE Software Version", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "vnf_config_template_version" + }, + "fromInputName": "2017488_adiodvpe0_vnf_config_template_version", + "constraints": null, + "required": true, + "default": "17.2" + }, + "bandwidth_units": { + "type": "string", + "description": "Units of bandwidth", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "bandwidth_units" + }, + "fromInputName": "adiodvpe0_bandwidth_units", + "constraints": null, + "required": true, + "default": "Gbps" + }, + "bandwidth": { + "type": "string", + "description": "Requested VPE bandwidth", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "bandwidth" + }, + "fromInputName": "adiodvpe0_bandwidth", + "constraints": null, + "required": true, + "default": "10" + }, + "AIC_CLLI": { + "type": "string", + "description": "AIC Site CLLI", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "AIC_CLLI" + }, + "fromInputName": "2017488_adiodvpe0_AIC_CLLI", + "constraints": null, + "required": true, + "default": "ATLMY8GA" + }, + "vnf_instance_name": { + "type": "string", + "description": "The hostname assigned to the vpe.", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "vnf_instance_name" + }, + "fromInputName": "2017488_adiodvpe0_vnf_instance_name", + "constraints": null, + "required": true, + "default": "mtnj309me6" + } + } + }, + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": { + "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a", + "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339", + "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vPFE_BV", + "baseModule": false + }, + "inputs": {} + } + }, + "pnfs": {} + } + } +}); diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/relatedVnfMember/relatedVnfMember.info.model.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/relatedVnfMember/relatedVnfMember.info.model.ts new file mode 100644 index 000000000..b1eb10937 --- /dev/null +++ b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/relatedVnfMember/relatedVnfMember.info.model.ts @@ -0,0 +1,158 @@ +import {ILevelNodeInfo} from "../basic.model.info"; +import {SharedTreeService} from "../../shared.tree.service"; +import {NgRedux} from "@angular-redux/store"; +import {AppState} from "../../../../../shared/store/reducers"; +import * as _ from "lodash"; +import {ITreeNode} from "angular-tree-component/dist/defs/api"; +import {AvailableNodeIcons} from "../../../available-models-tree/available-models-tree.service"; +import {DynamicInputsService} from "../../dynamicInputs.service"; +import { + deleteActionRelatedVnfMemberInstance, + removeRelatedVnfMemberInstance, + undoDeleteActionRelatedVnfMemberInstance +} from "../../../../../shared/storeUtil/utils/relatedVnfMember/relatedVnfMember.actions"; +import {VnfInstance} from "../../../../../shared/models/vnfInstance"; +import {VNFModel} from "../../../../../shared/models/vnfModel"; +import {VnfTreeNode} from "../../../../../shared/models/vnfTreeNode"; +import {InputType} from "../../../../../shared/models/inputTypes"; + +export class RelatedVnfMemberInfoModel implements ILevelNodeInfo { + constructor(private _sharedTreeService: SharedTreeService, + private _dynamicInputsService : DynamicInputsService, + private _store: NgRedux<AppState>) { + } + + name: string = 'vnfs'; + type: string = 'relatedVnfMember'; + typeName: string = 'VNF'; + + /*********************************************************** + * return if user should provide instance name or not. + * @param currentModel - current Model object + ************************************************************/ + isUserProvidedNaming = (currentModel): boolean => { + const ecompGeneratedNaming = currentModel.properties.ecomp_generated_naming; + return ecompGeneratedNaming !== undefined && ecompGeneratedNaming === "false"; + }; + + /*********************************************************** + * return model dynamic inputs + * @param currentModel - current Model object + ************************************************************/ + updateDynamicInputsDataFromModel = (currentModel): any => { + let displayInputs; + return _.isEmpty(displayInputs) ? [] : this._dynamicInputsService.getArbitraryInputs(displayInputs); + }; + + /*********************************************************** + * return vnf model + * @param vnfModelId - current Model id + * @param instance - vnf instance + * @param serviceHierarchy - serviceHierarchy + ************************************************************/ + getModel = (vnfModelId: string, instance: VnfInstance, serviceHierarchy): VNFModel => { + const originalModelName = instance.originalName ? instance.originalName : vnfModelId; + return new VNFModel(serviceHierarchy[this.name][originalModelName]); + }; + + + /*********************************************************** + * return vnf instance tree node + * @param instance - vnf instance + * @param model - vnf model + * @param parentModel + * @param storeKey - store key if exist + ************************************************************/ + createInstanceTreeNode = (instance: VnfInstance, model: VNFModel, parentModel, storeKey: string): VnfTreeNode => { + let node = new VnfTreeNode(instance, model, storeKey); + node.missingData = this.hasMissingData(instance, node, model.isEcompGeneratedNaming); + node.typeName = this.typeName; + node.menuActions = this.getMenuAction(<any>node, model.uuid); + node.isFailed = _.isNil(instance.isFailed) ? false : instance.isFailed; + node.statusMessage = !_.isNil(instance.statusMessage) ? instance.statusMessage: ""; + node = this._sharedTreeService.addingStatusProperty(node); + return node; + }; + + /*********************************************************** + * return next level object (null because is last level) + ************************************************************/ + getNextLevelObject(): any { + return null; + } + + /*********************************************************** + * return if instance has missing data + * @param instance - vnf instance + * @param dynamicInputs + * @param isUserProvidedNaming + ************************************************************/ + hasMissingData(instance, dynamicInputs: any, isUserProvidedNaming: boolean): boolean { + return this._sharedTreeService.hasMissingData(instance, dynamicInputs, isUserProvidedNaming, [InputType.LCP_REGION, InputType.TENANT, InputType.PLATFORM]); + } + + getTooltip = (): string => 'VF'; + + getType = (): string => 'VF'; + + /*********************************************************** + * doesn't have option from DrawingBoard model tree + ************************************************************/ + onClickAdd(node, serviceModelId: string): void {} + + /*********************************************************** + * doesn't have option from DrawingBoard model tree + ************************************************************/ + getNodeCount(node: ITreeNode, serviceModelId: string): number {return 0;} + + /*********************************************************** + * doesn't have option from DrawingBoard model tree + ************************************************************/ + showNodeIcons(node: ITreeNode, serviceModelId: string): AvailableNodeIcons { + return new AvailableNodeIcons(false, false); + } + + getMenuAction(node: ITreeNode, serviceModelId: string): { [methodName: string]: { method: Function, visible: Function, enable: Function }} { + return <any>{ + remove: { + method: (node, serviceModelId) => { + this._store.dispatch(removeRelatedVnfMemberInstance(node.parent.data.vnfGroupStoreKey, node.data.vnfStoreKey, serviceModelId)); + }, + visible: (node) => this._sharedTreeService.shouldShowRemoveAndEdit(node), + enable: (node) => this._sharedTreeService.shouldShowRemoveAndEdit(node) + }, + delete : { + method : (node, serviceModelId) => { + this._store.dispatch(deleteActionRelatedVnfMemberInstance(node.parent.data.vnfGroupStoreKey, node.data.vnfStoreKey, serviceModelId)); + }, + visible: (node) => this._sharedTreeService.shouldShowDelete(node), + enable: (node) => this._sharedTreeService.shouldShowDelete(node) + }, + undoDelete : { + method : (node, serviceModelId) => { + this._store.dispatch(undoDeleteActionRelatedVnfMemberInstance(node.parent.data.vnfGroupStoreKey , node.data.vnfStoreKey, serviceModelId)); + + }, + visible: (node) => this._sharedTreeService.shouldShowUndoDelete(node), + enable: (node, serviceModelId) => this._sharedTreeService.shouldShowUndoDelete(node) && this._sharedTreeService.shouldShowDelete(node.parent) && !this._sharedTreeService.isServiceOnDeleteMode(serviceModelId) + } + } + } + + isEcompGeneratedNaming = (currentModel): boolean => { + const ecompGeneratedNaming = currentModel.properties.ecomp_generated_naming; + return ecompGeneratedNaming === "true"; + }; + + + updatePosition(that , node, instanceId): void { + // TODO + } + + getNodePosition(instance): number { + return null; + } + + onSelectedNode(node: ITreeNode): void { + } +} diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/vfModule/vfModule.model.info.spec.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/vfModule/vfModule.model.info.spec.ts new file mode 100644 index 000000000..dc7452516 --- /dev/null +++ b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/vfModule/vfModule.model.info.spec.ts @@ -0,0 +1,1596 @@ + +import {HttpClientTestingModule, HttpTestingController} from "@angular/common/http/testing"; +import {getTestBed, TestBed} from "@angular/core/testing"; +import {MockNgRedux, NgReduxTestingModule} from "@angular-redux/store/testing"; +import {VFModuleModelInfo} from "./vfModule.model.info"; +import {DynamicInputsService} from "../../dynamicInputs.service"; +import {SharedTreeService} from "../../shared.tree.service"; +import {VfModulePopuopService} from "../../../../../shared/components/genericFormPopup/genericFormServices/vfModule/vfModule.popuop.service"; +import {DialogService} from "ng2-bootstrap-modal"; +import {NgRedux} from "@angular-redux/store"; +import {AppState} from "../../../../../shared/store/reducers"; +import {AvailableNodeIcons} from "../../../available-models-tree/available-models-tree.service"; +import {MessageBoxService} from "../../../../../shared/components/messageBox/messageBox.service"; +import {DrawingBoardModes} from "../../../drawing-board.modes"; +import {IframeService} from "../../../../../shared/utils/iframe.service"; +import {ComponentInfoService} from "../../../component-info/component-info.service"; +import {ModelInformationItem} from "../../../../../shared/components/model-information/model-information.component"; +import {ComponentInfoModel, ComponentInfoType} from "../../../component-info/component-info-model"; +import {AaiService} from "../../../../../shared/services/aaiService/aai.service"; +import {HttpClient, HttpHandler} from "@angular/common/http"; +import {FeatureFlagsService} from "../../../../../shared/services/featureFlag/feature-flags.service"; +class MockAppStore<T> { + getState() { + return { + global: { + 'drawingBoardStatus': DrawingBoardModes.CREATE + } + } + } +} + +describe('VFModule Model Info', () => { + let injector; + let _dynamicInputsService : DynamicInputsService; + let _sharedTreeService : SharedTreeService; + let vfModuleModel: VFModuleModelInfo; + let _dialogService : DialogService; + let _vfModulePopupService : VfModulePopuopService; + let _iframeService : IframeService; + let _componentInfoService : ComponentInfoService; + + beforeAll(done => (async () => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule, NgReduxTestingModule], + providers: [ + DynamicInputsService, + DialogService, + VfModulePopuopService, + SharedTreeService, + IframeService, + {provide: NgRedux, useClass: MockAppStore}, + MockNgRedux, + AaiService, + HttpClient, + HttpHandler, + FeatureFlagsService, + ComponentInfoService + ] + }); + await TestBed.compileComponents(); + + injector = getTestBed(); + _sharedTreeService = injector.get(SharedTreeService); + _componentInfoService = injector.get(ComponentInfoService) + vfModuleModel = new VFModuleModelInfo(_dynamicInputsService, _sharedTreeService, _dialogService, _vfModulePopupService, _iframeService, MockNgRedux.getInstance(),_componentInfoService); + + })().then(done).catch(done.fail)); + + + + test('VFModuleModelInfo should be defined', () => { + expect(VFModuleModelInfo).toBeDefined(); + }); + + test('VnfModelInfo should defined extra details', () => { + expect(vfModuleModel.name).toEqual('vfModules'); + expect(vfModuleModel.type).toEqual('Module'); + }); + + test('isEcompGeneratedNaming should return true if vnf has isEcompGeneratedNaming is "true" ', () => { + let isEcompGeneratedNaming : boolean = vfModuleModel.isEcompGeneratedNaming({}, { + properties: { + ecomp_generated_naming: 'true' + } + }); + expect(isEcompGeneratedNaming).toBeTruthy(); + }); + + test('isEcompGeneratedNaming should return false if isEcompGeneratedNaming is "false"', () => { + let isEcompGeneratedNaming : boolean = vfModuleModel.isEcompGeneratedNaming({}, { + properties: { + ecomp_generated_naming: 'false' + } + }); + expect(isEcompGeneratedNaming).toBeFalsy(); + }); + + test('isEcompGeneratedNaming should return false if isEcompGeneratedNaming is not defined', () => { + let isEcompGeneratedNaming : boolean = vfModuleModel.isEcompGeneratedNaming({}, { + properties: { + } + }); + expect(isEcompGeneratedNaming).toBeFalsy(); + }); + + + test('getTooltip should return "VFModule"', () => { + let tooltip: string = vfModuleModel.getTooltip(); + expect(tooltip).toEqual('VFmodule'); + }); + + test('getType should return "VFModule"', () => { + let tooltip: string = vfModuleModel.getType(); + expect(tooltip).toEqual('VFmodule'); + }); + + test('getNextLevelObject should return null', () => { + let nextLevel = vfModuleModel.getNextLevelObject(); + expect(nextLevel).toBeNull(); + }); + + test('getModel should return Module model', () => { + let model = vfModuleModel.getModel('2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1',{}, getServiceHierarchy()); + expect(model.uuid).toEqual('25284168-24bb-4698-8cb4-3f509146eca5'); + }); + + test('showNodeIcons should return false false if reachLimit of max', ()=>{ + let serviceId : string = 'servicedId'; + let node = { + parent : { + data : { + id : 'vnfId', + name : 'vnfName' + } + }, + data : { + id : 'vnfId', + name : 'vnfName' + } + }; + _sharedTreeService.setSelectedVNF({ + data : { + id : 'vfModuleId', + name : 'VfModuleName' + } + }); + jest.spyOn(vfModuleModel, 'getOptionalVNFs').mockReturnValue([]); + jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({ + global : {}, + service : { + serviceHierarchy : { + 'servicedId' : { + 'vnfs' : { + 'vnfName' : { + 'properties' : { + 'max_instances' : 1 + } + } + } + } + }, + serviceInstance : { + 'servicedId' : { + 'existingVNFCounterMap' : { + 'vnfId' : 1 + }, + 'vnfs' : { + 'vnfName' :{ + + } + } + } + } + } + }); + + let result = vfModuleModel.showNodeIcons(<any>node, serviceId); + expect(result).toEqual(new AvailableNodeIcons(false , false)); + }); + + test('showNodeIcons should return true, false if reachLimit of max', ()=>{ + let serviceId : string = 'servicedId'; + let node = { + data : { + id : 'vfModuleId', + name : 'vfModuleName' + }, + parent : { + data : { + id : 'vnfId', + name : 'vnfName' + } + } + }; + jest.spyOn(_sharedTreeService, 'getSelectedVNF').mockReturnValue('vnfName'); + jest.spyOn(vfModuleModel, 'getOptionalVNFs').mockReturnValue(['vnfName']); + jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({ + global : {}, + service : { + serviceHierarchy : { + 'servicedId' : { + 'vnfs' : { + 'vnfName' : { + 'properties' : { + 'max_instances' : 1 + } + } + }, + 'vfModules' : { + 'vfModuleName' : { + 'properties' : { + maxCountInstances : 1 + } + } + } + } + }, + serviceInstance : { + 'servicedId' : { + 'existingVNFCounterMap' : { + 'vnfId' : 1 + }, + 'vnfs' : { + 'vnfName' :{ + 'originalName' : 'vnfName', + 'vfModules' : { + 'vfModuleName' : { + + } + } + } + } + } + } + } + }); + + let result = vfModuleModel.showNodeIcons(<any>node, 'servicedId'); + expect(result).toEqual(new AvailableNodeIcons(true , false)); + }); + + + test('showNodeIcons should return false, true if reachLimit of max', ()=>{ + let serviceId : string = 'servicedId'; + let node = { + data : { + id : 'vfModuleId', + name : 'vfModuleName' + }, + parent : { + data : { + id : 'vnfId', + name : 'vnfName' + } + } + }; + jest.spyOn(_sharedTreeService, 'getSelectedVNF').mockReturnValue('vnfName'); + jest.spyOn(vfModuleModel, 'getOptionalVNFs').mockReturnValue(['vnfName']); + jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({ + global : {}, + service : { + serviceHierarchy : { + 'servicedId' : { + 'vnfs' : { + 'vnfName' : { + 'properties' : { + 'max_instances' : 1 + } + } + }, + 'vfModules' : { + 'vfModuleName' : { + 'properties' : { + maxCountInstances : 2 + } + } + } + } + }, + serviceInstance : { + 'servicedId' : { + 'existingVNFCounterMap' : { + 'vnfId' : 1 + }, + 'vnfs' : { + 'vnfName' :{ + 'originalName' : 'vnfName', + 'vfModules' : { + 'vfModuleName' : { + + } + } + } + } + } + } + } + }); + + let result = vfModuleModel.showNodeIcons(<any>node, 'servicedId'); + expect(result).toEqual(new AvailableNodeIcons(true , false)); + }); + + + test('getOptionalVNFs should instance if exist', ()=>{ + let serviceId : string = 'servicedId'; + jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({ + global : {}, + service : { + serviceHierarchy : { + 'servicedId' : { + 'vnfs' : { + 'vnfName' : { + 'properties' : { + 'max_instances' : 1 + } + } + }, + 'vfModules' : { + 'vfModuleName' : { + 'properties' : { + maxCountInstances : 2 + } + } + } + } + }, + serviceInstance : { + 'servicedId' : { + 'existingVNFCounterMap' : { + 'vnfId' : 1 + }, + 'vnfs' : { + 'vnfName' :{ + 'originalName' : 'vnfName', + 'vfModules' : { + 'vfModuleName' : { + + } + } + } + } + } + } + } + }); + + let node = { + data : { + id : 'vfModuleId', + name : 'vfModuleName' + }, + parent : { + data : { + id : 'vnfId', + name : 'vnfName' + } + } + }; + let result = vfModuleModel.getOptionalVNFs(serviceId , 'vnfName'); + expect(result.length).toEqual(1); + }); + + test('getNodeCount should return number of nodes', ()=>{ + let serviceId : string = 'servicedId'; + jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({ + global : {}, + service : { + serviceHierarchy : { + 'servicedId' : { + 'vnfs' : { + 'vnfName' : { + 'properties' : { + 'max_instances' : 1 + } + } + }, + 'vfModules' : { + 'vfModuleName' : { + 'properties' : { + maxCountInstances : 2 + } + } + } + } + }, + serviceInstance : { + 'servicedId' : { + 'existingVNFCounterMap' : { + 'vnfId' : 1 + }, + 'vnfs' : { + 'vnfName' :{ + 'action': 'Create', + 'originalName' : 'vnfName', + 'vfModules' : { + 'vfModuleName' : { + 'vnfModuleName_111': { + 'action': 'Create', + 'modelInfo' : { + modelVersionId : 'vfModuleId' + } + } + } + } + } + } + } + } + } + }); + + let node = { + data : { + id : 'vfModuleId', + name : 'vfModuleName', + 'action': 'Create', + }, + parent : { + data : { + id : 'vnfId', + name : 'vnfName', + 'action': 'Create', + } + } + }; + let result = vfModuleModel.getNodeCount(<any>node , serviceId); + expect(result).toEqual(1); + }); + + + test('onClickAdd should open message box if no vnfStoreKey', ()=>{ + jest.spyOn(_sharedTreeService, 'getSelectedVNF').mockReturnValue(null); + jest.spyOn(vfModuleModel, 'getDefaultVNF').mockReturnValue(null); + jest.spyOn(MessageBoxService.openModal, 'next'); + vfModuleModel.onClickAdd(<any>{}, 'serviceId'); + expect(MessageBoxService.openModal.next).toHaveBeenCalled(); + }); + + test('getMenuAction: showAuditInfoVfModule', ()=>{ + jest.spyOn(_sharedTreeService, 'isRetryMode').mockReturnValue(true); + + let node = { + data : { + "modelId": "6b528779-44a3-4472-bdff-9cd15ec93450", + "action": "Create", + "isFailed": true, + } + }; + let serviceModelId = "6b528779-44a3-4472-bdff-9cd15ec93450"; + let result = vfModuleModel.getMenuAction(<any>node, serviceModelId); + spyOn(result['showAuditInfo'], 'method'); + expect(result['showAuditInfo']).toBeDefined(); + expect(result['showAuditInfo'].visible(node)).toBeTruthy(); + expect(result['showAuditInfo'].enable(node)).toBeTruthy(); + result['showAuditInfo']['method'](node, serviceModelId); + expect(result['showAuditInfo']['method']).toHaveBeenCalledWith(node, serviceModelId); + }); + + test('Info for vfModule should be correct', () => { + const model = getVFModule(); + const instance = getVFModuleInstance(); + let actualVNFInfo = vfModuleModel.getInfoForVFModule(model,instance); + let expectedVNFInfo = [ + ModelInformationItem.createInstance('Type', 'vfModule'), + ModelInformationItem.createInstance('Model Version', '2'), + ModelInformationItem.createInstance('Model Customization ID','55b1be94-671a-403e-a26c-667e9c47d091'), + ModelInformationItem.createInstance('Instance ID', '2c1ca484-cbc2-408b-ab86-25a2c15ce280'), + ModelInformationItem.createInstance('In Maintenance', true), + ModelInformationItem.createInstance('Base Module', false), + ModelInformationItem.createInstance('Min Instances', 0), + ModelInformationItem.createInstance('Initial Instances Count',0) + ]; + expect(actualVNFInfo).toEqual(new ComponentInfoModel(ComponentInfoType.VFMODULE, expectedVNFInfo, [])); + }); + + function getVFModule(){ + return { + "uuid":"522159d5-d6e0-4c2a-aa44-5a542a12a830", + "invariantUuid":"98a7c88b-b577-476a-90e4-e25a5871e02b", + "customizationUuid":"55b1be94-671a-403e-a26c-667e9c47d091", + "description":null, + "name":"VfVmee..vmme_vlc..module-1", + "version":"2", + "modelCustomizationName":"VfVmee..vmme_vlc..module-1", + "properties":{ + "minCountInstances":0, + "maxCountInstances":null, + "initialCount":0, + "vfModuleLabel":"vmme_vlc", + "baseModule":false + }, + "inputs":{}, + "volumeGroupAllowed":false + }; + } + + function getVFModuleInstance() { + return { + "action":"None", + "instanceName":"ss820f_0918_db", + "instanceId":"2c1ca484-cbc2-408b-ab86-25a2c15ce280", + "orchStatus":"deleted", + "productFamilyId":null, + "lcpCloudRegionId":null, + "tenantId":null, + "modelInfo":{ + "modelCustomizationName":"VfVmee..vmme_vlc..module-1", + "modelCustomizationId":"b200727a-1bf9-4e7c-bd06-b5f4c9d920b9", + "modelInvariantId":"09edc9ef-85d0-4b26-80de-1f569d49e750", + "modelVersionId":"522159d5-d6e0-4c2a-aa44-5a542a12a830", + "modelType":"vfModule" + }, + "instanceType":null, + "provStatus":null, + "inMaint":true, + "uuid":"522159d5-d6e0-4c2a-aa44-5a542a12a830", + "originalName":"VfVmee..vmme_vlc..module-1", + "legacyRegion":null, + "lineOfBusiness":null, + "platformName":null, + "trackById":"vf_vmee0..VfVmee..vmme_vlc..module-1:008", + "isBase":false, + "volumeGroupName":null + }; + } + + + function getServiceHierarchy(){ + return { + "service": { + "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450", + "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0", + "name": "action-data", + "version": "1.0", + "toscaModelURL": null, + "category": "", + "serviceType": "", + "serviceRole": "", + "description": "", + "serviceEcompNaming": "false", + "instantiationType": "Macro", + "inputs": { + "2017488_adiodvpe0_ASN": { + "type": "string", + "description": "AV/PE", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "AV_vPE" + } + }, + "vidNotions": { + "instantiationUI": "legacy", + "modelCategory": "other" + } + }, + "vnfs": { + "2017-388_ADIOD-vPE 1": { + "uuid": "0903e1c0-8e03-4936-b5c2-260653b96413", + "invariantUuid": "00beb8f9-6d39-452f-816d-c709b9cbb87d", + "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM", + "name": "2017-388_ADIOD-vPE", + "version": "1.0", + "customizationUuid": "280dec31-f16d-488b-9668-4aae55d6648a", + "inputs": { + "vnf_config_template_version": { + "type": "string", + "description": "VPE Software Version", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "17.2" + }, + "bandwidth_units": { + "type": "string", + "description": "Units of bandwidth", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "Gbps" + }, + "bandwidth": { + "type": "string", + "description": "Requested VPE bandwidth", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "10" + }, + "AIC_CLLI": { + "type": "string", + "description": "AIC Site CLLI", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "ATLMY8GA" + }, + "ASN": { + "type": "string", + "description": "AV/PE", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "AV_vPE" + }, + "vnf_instance_name": { + "type": "string", + "description": "The hostname assigned to the vpe.", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "mtnj309me6" + } + }, + "commands": { + "vnf_config_template_version": { + "displayName": "vnf_config_template_version", + "command": "get_input", + "inputName": "2017488_adiodvpe0_vnf_config_template_version" + }, + "bandwidth_units": { + "displayName": "bandwidth_units", + "command": "get_input", + "inputName": "adiodvpe0_bandwidth_units" + }, + "bandwidth": { + "displayName": "bandwidth", + "command": "get_input", + "inputName": "adiodvpe0_bandwidth" + }, + "AIC_CLLI": { + "displayName": "AIC_CLLI", + "command": "get_input", + "inputName": "2017488_adiodvpe0_AIC_CLLI" + }, + "ASN": { + "displayName": "ASN", + "command": "get_input", + "inputName": "2017488_adiodvpe0_ASN" + }, + "vnf_instance_name": { + "displayName": "vnf_instance_name", + "command": "get_input", + "inputName": "2017488_adiodvpe0_vnf_instance_name" + } + }, + "properties": { + "vmxvre_retype": "RE-VMX", + "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version", + "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d", + "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9", + "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF", + "int_ctl_net_name": "VMX-INTXI", + "vmx_int_ctl_prefix": "10.0.0.10", + "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5", + "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279", + "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a", + "nf_type": "vPE", + "vmxvpfe_int_ctl_ip_1": "10.0.0.10", + "is_AVPN_service": "false", + "vmx_RSG_name": "vREXI-affinity", + "vmx_int_ctl_forwarding": "l2", + "vmxvre_oam_ip_0": "10.0.0.10", + "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvpfe_sriov41_0_port_vlanstrip": "false", + "vmxvpfe_sriov42_0_port_vlanfilter": "4001", + "vmxvpfe_sriov44_0_port_unknownunicastallow": "true", + "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2", + "vmxvre_instance": "0", + "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvre_flavor_name": "ns.c1r16d32.v5", + "vmxvpfe_volume_size_0": "40.0", + "vmxvpfe_sriov43_0_port_vlanfilter": "4001", + "nf_naming": "{ecomp_generated_naming=false}", + "nf_naming_code": "Navneet", + "vmxvre_name_0": "vREXI", + "vmxvpfe_sriov42_0_port_vlanstrip": "false", + "vmxvpfe_volume_name_0": "vPFEXI_FBVolume", + "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141", + "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2", + "vmxvpfe_sriov43_0_port_unknownunicastallow": "true", + "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true", + "vmxvre_console": "vidconsole", + "vmxvpfe_sriov44_0_port_vlanfilter": "4001", + "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3", + "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true", + "vmxvpfe_sriov44_0_port_vlanstrip": "false", + "vf_module_id": "123", + "nf_function": "JAI", + "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true", + "vmxvre_int_ctl_ip_0": "10.0.0.10", + "ecomp_generated_naming": "false", + "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI", + "vnf_name": "mtnj309me6vre", + "vmxvpfe_sriov41_0_port_unknownunicastallow": "true", + "vmxvre_volume_type_1": "HITACHI", + "vmxvpfe_sriov44_0_port_broadcastallow": "true", + "vmxvre_volume_type_0": "HITACHI", + "vmxvpfe_volume_type_0": "HITACHI", + "vmxvpfe_sriov43_0_port_broadcastallow": "true", + "bandwidth_units": "get_input:adiodvpe0_bandwidth_units", + "vnf_id": "123", + "vmxvre_oam_prefix": "24", + "availability_zone_0": "mtpocfo-kvm-az01", + "ASN": "get_input:2017488_adiodvpe0_ASN", + "vmxvre_chassis_i2cid": "161", + "vmxvpfe_name_0": "vPFEXI", + "bandwidth": "get_input:adiodvpe0_bandwidth", + "availability_zone_max_count": "1", + "vmxvre_volume_size_0": "45.0", + "vmxvre_volume_size_1": "50.0", + "vmxvpfe_sriov42_0_port_broadcastallow": "true", + "vmxvre_oam_gateway": "10.0.0.10", + "vmxvre_volume_name_1": "vREXI_FAVolume", + "vmxvre_ore_present": "0", + "vmxvre_volume_name_0": "vREXI_FBVolume", + "vmxvre_type": "0", + "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name", + "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true", + "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429", + "vmx_int_ctl_len": "24", + "vmxvpfe_sriov43_0_port_vlanstrip": "false", + "vmxvpfe_sriov41_0_port_broadcastallow": "true", + "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d", + "vmxvpfe_sriov41_0_port_vlanfilter": "4001", + "nf_role": "Testing", + "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a", + "vmxvpfe_sriov42_0_port_unknownunicastallow": "true", + "vmxvpfe_flavor_name": "ns.c20r16d25.v5" + }, + "type": "VF", + "modelCustomizationName": "2017-388_ADIOD-vPE 1", + "vfModules": {}, + "volumeGroups": {}, + "vfcInstanceGroups": {} + }, + "2017-388_ADIOD-vPE 0": { + "uuid": "afacccf6-397d-45d6-b5ae-94c39734b168", + "invariantUuid": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8", + "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM", + "name": "2017-388_ADIOD-vPE", + "version": "4.0", + "customizationUuid": "b3c76f73-eeb5-4fb6-9d31-72a889f1811c", + "inputs": { + "vnf_config_template_version": { + "type": "string", + "description": "VPE Software Version", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "17.2" + }, + "bandwidth_units": { + "type": "string", + "description": "Units of bandwidth", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "Gbps" + }, + "bandwidth": { + "type": "string", + "description": "Requested VPE bandwidth", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "10" + }, + "AIC_CLLI": { + "type": "string", + "description": "AIC Site CLLI", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "ATLMY8GA" + }, + "ASN": { + "type": "string", + "description": "AV/PE", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "AV_vPE" + }, + "vnf_instance_name": { + "type": "string", + "description": "The hostname assigned to the vpe.", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "mtnj309me6" + } + }, + "commands": { + "vnf_config_template_version": { + "displayName": "vnf_config_template_version", + "command": "get_input", + "inputName": "2017488_adiodvpe0_vnf_config_template_version" + }, + "bandwidth_units": { + "displayName": "bandwidth_units", + "command": "get_input", + "inputName": "adiodvpe0_bandwidth_units" + }, + "bandwidth": { + "displayName": "bandwidth", + "command": "get_input", + "inputName": "adiodvpe0_bandwidth" + }, + "AIC_CLLI": { + "displayName": "AIC_CLLI", + "command": "get_input", + "inputName": "2017488_adiodvpe0_AIC_CLLI" + }, + "ASN": { + "displayName": "ASN", + "command": "get_input", + "inputName": "2017488_adiodvpe0_ASN" + }, + "vnf_instance_name": { + "displayName": "vnf_instance_name", + "command": "get_input", + "inputName": "2017488_adiodvpe0_vnf_instance_name" + } + }, + "properties": { + "vmxvre_retype": "RE-VMX", + "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version", + "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d", + "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9", + "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF", + "int_ctl_net_name": "VMX-INTXI", + "vmx_int_ctl_prefix": "10.0.0.10", + "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5", + "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279", + "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a", + "nf_type": "vPE", + "vmxvpfe_int_ctl_ip_1": "10.0.0.10", + "is_AVPN_service": "false", + "vmx_RSG_name": "vREXI-affinity", + "vmx_int_ctl_forwarding": "l2", + "vmxvre_oam_ip_0": "10.0.0.10", + "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvpfe_sriov41_0_port_vlanstrip": "false", + "vmxvpfe_sriov42_0_port_vlanfilter": "4001", + "vmxvpfe_sriov44_0_port_unknownunicastallow": "true", + "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2", + "vmxvre_instance": "0", + "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvre_flavor_name": "ns.c1r16d32.v5", + "vmxvpfe_volume_size_0": "40.0", + "vmxvpfe_sriov43_0_port_vlanfilter": "4001", + "nf_naming": "{ecomp_generated_naming=false}", + "nf_naming_code": "Navneet", + "vmxvre_name_0": "vREXI", + "vmxvpfe_sriov42_0_port_vlanstrip": "false", + "vmxvpfe_volume_name_0": "vPFEXI_FBVolume", + "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141", + "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2", + "vmxvpfe_sriov43_0_port_unknownunicastallow": "true", + "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true", + "vmxvre_console": "vidconsole", + "vmxvpfe_sriov44_0_port_vlanfilter": "4001", + "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3", + "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true", + "min_instances": "1", + "vmxvpfe_sriov44_0_port_vlanstrip": "false", + "vf_module_id": "123", + "nf_function": "JAI", + "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true", + "vmxvre_int_ctl_ip_0": "10.0.0.10", + "ecomp_generated_naming": "false", + "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI", + "vnf_name": "mtnj309me6vre", + "vmxvpfe_sriov41_0_port_unknownunicastallow": "true", + "vmxvre_volume_type_1": "HITACHI", + "vmxvpfe_sriov44_0_port_broadcastallow": "true", + "vmxvre_volume_type_0": "HITACHI", + "vmxvpfe_volume_type_0": "HITACHI", + "vmxvpfe_sriov43_0_port_broadcastallow": "true", + "bandwidth_units": "get_input:adiodvpe0_bandwidth_units", + "vnf_id": "123", + "vmxvre_oam_prefix": "24", + "availability_zone_0": "mtpocfo-kvm-az01", + "ASN": "get_input:2017488_adiodvpe0_ASN", + "vmxvre_chassis_i2cid": "161", + "vmxvpfe_name_0": "vPFEXI", + "bandwidth": "get_input:adiodvpe0_bandwidth", + "availability_zone_max_count": "1", + "vmxvre_volume_size_0": "45.0", + "vmxvre_volume_size_1": "50.0", + "vmxvpfe_sriov42_0_port_broadcastallow": "true", + "vmxvre_oam_gateway": "10.0.0.10", + "vmxvre_volume_name_1": "vREXI_FAVolume", + "vmxvre_ore_present": "0", + "vmxvre_volume_name_0": "vREXI_FBVolume", + "vmxvre_type": "0", + "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name", + "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true", + "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429", + "vmx_int_ctl_len": "24", + "vmxvpfe_sriov43_0_port_vlanstrip": "false", + "vmxvpfe_sriov41_0_port_broadcastallow": "true", + "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d", + "vmxvpfe_sriov41_0_port_vlanfilter": "4001", + "nf_role": "Testing", + "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a", + "vmxvpfe_sriov42_0_port_unknownunicastallow": "true", + "vmxvpfe_flavor_name": "ns.c20r16d25.v5" + }, + "type": "VF", + "modelCustomizationName": "2017-388_ADIOD-vPE 0", + "vfModules": {}, + "volumeGroups": {}, + "vfcInstanceGroups": {} + }, + "2017-488_ADIOD-vPE 0": { + "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09", + "invariantUuid": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8", + "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM", + "name": "2017-488_ADIOD-vPE", + "version": "5.0", + "customizationUuid": "1da7b585-5e61-4993-b95e-8e6606c81e45", + "inputs": { + "vnf_config_template_version": { + "type": "string", + "description": "VPE Software Version", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "17.2" + }, + "bandwidth_units": { + "type": "string", + "description": "Units of bandwidth", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "Gbps" + }, + "bandwidth": { + "type": "string", + "description": "Requested VPE bandwidth", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "10" + }, + "AIC_CLLI": { + "type": "string", + "description": "AIC Site CLLI", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "ATLMY8GA" + }, + "ASN": { + "type": "string", + "description": "AV/PE", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "AV_vPE" + }, + "vnf_instance_name": { + "type": "string", + "description": "The hostname assigned to the vpe.", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "mtnj309me6" + } + }, + "commands": { + "vnf_config_template_version": { + "displayName": "vnf_config_template_version", + "command": "get_input", + "inputName": "2017488_adiodvpe0_vnf_config_template_version" + }, + "bandwidth_units": { + "displayName": "bandwidth_units", + "command": "get_input", + "inputName": "adiodvpe0_bandwidth_units" + }, + "bandwidth": { + "displayName": "bandwidth", + "command": "get_input", + "inputName": "adiodvpe0_bandwidth" + }, + "AIC_CLLI": { + "displayName": "AIC_CLLI", + "command": "get_input", + "inputName": "2017488_adiodvpe0_AIC_CLLI" + }, + "ASN": { + "displayName": "ASN", + "command": "get_input", + "inputName": "2017488_adiodvpe0_ASN" + }, + "vnf_instance_name": { + "displayName": "vnf_instance_name", + "command": "get_input", + "inputName": "2017488_adiodvpe0_vnf_instance_name" + } + }, + "properties": { + "vmxvre_retype": "RE-VMX", + "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version", + "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d", + "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9", + "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF", + "int_ctl_net_name": "VMX-INTXI", + "vmx_int_ctl_prefix": "10.0.0.10", + "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5", + "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279", + "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a", + "nf_type": "vPE", + "vmxvpfe_int_ctl_ip_1": "10.0.0.10", + "is_AVPN_service": "false", + "vmx_RSG_name": "vREXI-affinity", + "vmx_int_ctl_forwarding": "l2", + "vmxvre_oam_ip_0": "10.0.0.10", + "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvpfe_sriov41_0_port_vlanstrip": "false", + "vmxvpfe_sriov42_0_port_vlanfilter": "4001", + "vmxvpfe_sriov44_0_port_unknownunicastallow": "true", + "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2", + "vmxvre_instance": "0", + "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvre_flavor_name": "ns.c1r16d32.v5", + "vmxvpfe_volume_size_0": "40.0", + "vmxvpfe_sriov43_0_port_vlanfilter": "4001", + "nf_naming": "{ecomp_generated_naming=false}", + "nf_naming_code": "Navneet", + "vmxvre_name_0": "vREXI", + "vmxvpfe_sriov42_0_port_vlanstrip": "false", + "vmxvpfe_volume_name_0": "vPFEXI_FBVolume", + "max_instances": "3", + "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141", + "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2", + "vmxvpfe_sriov43_0_port_unknownunicastallow": "true", + "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true", + "vmxvre_console": "vidconsole", + "vmxvpfe_sriov44_0_port_vlanfilter": "4001", + "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3", + "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true", + "min_instances": "1", + "vmxvpfe_sriov44_0_port_vlanstrip": "false", + "vf_module_id": "123", + "nf_function": "JAI", + "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true", + "vmxvre_int_ctl_ip_0": "10.0.0.10", + "ecomp_generated_naming": "false", + "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI", + "vnf_name": "mtnj309me6vre", + "vmxvpfe_sriov41_0_port_unknownunicastallow": "true", + "vmxvre_volume_type_1": "HITACHI", + "vmxvpfe_sriov44_0_port_broadcastallow": "true", + "vmxvre_volume_type_0": "HITACHI", + "vmxvpfe_volume_type_0": "HITACHI", + "vmxvpfe_sriov43_0_port_broadcastallow": "true", + "bandwidth_units": "get_input:adiodvpe0_bandwidth_units", + "vnf_id": "123", + "vmxvre_oam_prefix": "24", + "availability_zone_0": "mtpocfo-kvm-az01", + "ASN": "get_input:2017488_adiodvpe0_ASN", + "vmxvre_chassis_i2cid": "161", + "vmxvpfe_name_0": "vPFEXI", + "bandwidth": "get_input:adiodvpe0_bandwidth", + "availability_zone_max_count": "1", + "vmxvre_volume_size_0": "45.0", + "vmxvre_volume_size_1": "50.0", + "vmxvpfe_sriov42_0_port_broadcastallow": "true", + "vmxvre_oam_gateway": "10.0.0.10", + "vmxvre_volume_name_1": "vREXI_FAVolume", + "vmxvre_ore_present": "0", + "vmxvre_volume_name_0": "vREXI_FBVolume", + "vmxvre_type": "0", + "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name", + "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true", + "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429", + "vmx_int_ctl_len": "24", + "vmxvpfe_sriov43_0_port_vlanstrip": "false", + "vmxvpfe_sriov41_0_port_broadcastallow": "true", + "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d", + "vmxvpfe_sriov41_0_port_vlanfilter": "4001", + "nf_role": "Testing", + "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a", + "vmxvpfe_sriov42_0_port_unknownunicastallow": "true", + "vmxvpfe_flavor_name": "ns.c20r16d25.v5" + }, + "type": "VF", + "modelCustomizationName": "2017-488_ADIOD-vPE 0", + "vfModules": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": { + "uuid": "25284168-24bb-4698-8cb4-3f509146eca5", + "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1", + "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vRE_BV", + "baseModule": false + }, + "inputs": { + "vnf_config_template_version": { + "type": "string", + "description": "VPE Software Version", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "vnf_config_template_version" + }, + "fromInputName": "2017488_adiodvpe0_vnf_config_template_version", + "constraints": null, + "required": true, + "default": "17.2" + }, + "bandwidth_units": { + "type": "string", + "description": "Units of bandwidth", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "bandwidth_units" + }, + "fromInputName": "adiodvpe0_bandwidth_units", + "constraints": null, + "required": true, + "default": "Gbps" + }, + "bandwidth": { + "type": "string", + "description": "Requested VPE bandwidth", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "bandwidth" + }, + "fromInputName": "adiodvpe0_bandwidth", + "constraints": null, + "required": true, + "default": "10" + }, + "AIC_CLLI": { + "type": "string", + "description": "AIC Site CLLI", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "AIC_CLLI" + }, + "fromInputName": "2017488_adiodvpe0_AIC_CLLI", + "constraints": null, + "required": true, + "default": "ATLMY8GA" + }, + "vnf_instance_name": { + "type": "string", + "description": "The hostname assigned to the vpe.", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "vnf_instance_name" + }, + "fromInputName": "2017488_adiodvpe0_vnf_instance_name", + "constraints": null, + "required": true, + "default": "mtnj309me6" + } + }, + "volumeGroupAllowed": true + }, + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": { + "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db", + "invariantUuid": "b34833bb-6aa9-4ad6-a831-70b06367a091", + "customizationUuid": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3", + "description": null, + "name": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0", + "version": "5", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0", + "properties": { + "minCountInstances": 1, + "maxCountInstances": 1, + "initialCount": 1, + "vfModuleLabel": "ADIOD_base_vPE_BV", + "baseModule": true + }, + "inputs": {}, + "volumeGroupAllowed": false + }, + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": { + "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a", + "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339", + "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vPFE_BV", + "baseModule": false + }, + "inputs": {}, + "volumeGroupAllowed": true + } + }, + "volumeGroups": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": { + "uuid": "25284168-24bb-4698-8cb4-3f509146eca5", + "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1", + "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vRE_BV", + "baseModule": false + }, + "inputs": { + "vnf_config_template_version": { + "type": "string", + "description": "VPE Software Version", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "vnf_config_template_version" + }, + "fromInputName": "2017488_adiodvpe0_vnf_config_template_version", + "constraints": null, + "required": true, + "default": "17.2" + }, + "bandwidth_units": { + "type": "string", + "description": "Units of bandwidth", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "bandwidth_units" + }, + "fromInputName": "adiodvpe0_bandwidth_units", + "constraints": null, + "required": true, + "default": "Gbps" + }, + "bandwidth": { + "type": "string", + "description": "Requested VPE bandwidth", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "bandwidth" + }, + "fromInputName": "adiodvpe0_bandwidth", + "constraints": null, + "required": true, + "default": "10" + }, + "AIC_CLLI": { + "type": "string", + "description": "AIC Site CLLI", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "AIC_CLLI" + }, + "fromInputName": "2017488_adiodvpe0_AIC_CLLI", + "constraints": null, + "required": true, + "default": "ATLMY8GA" + }, + "vnf_instance_name": { + "type": "string", + "description": "The hostname assigned to the vpe.", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "vnf_instance_name" + }, + "fromInputName": "2017488_adiodvpe0_vnf_instance_name", + "constraints": null, + "required": true, + "default": "mtnj309me6" + } + } + }, + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": { + "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a", + "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339", + "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vPFE_BV", + "baseModule": false + }, + "inputs": {} + } + }, + "vfcInstanceGroups": {} + } + }, + "networks": {}, + "collectionResource": {}, + "configurations": {}, + "fabricConfigurations": {}, + "serviceProxies": {}, + "vfModules": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": { + "uuid": "25284168-24bb-4698-8cb4-3f509146eca5", + "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1", + "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vRE_BV", + "baseModule": false + }, + "inputs": { + "vnf_config_template_version": { + "type": "string", + "description": "VPE Software Version", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "vnf_config_template_version" + }, + "fromInputName": "2017488_adiodvpe0_vnf_config_template_version", + "constraints": null, + "required": true, + "default": "17.2" + }, + "bandwidth_units": { + "type": "string", + "description": "Units of bandwidth", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "bandwidth_units" + }, + "fromInputName": "adiodvpe0_bandwidth_units", + "constraints": null, + "required": true, + "default": "Gbps" + }, + "bandwidth": { + "type": "string", + "description": "Requested VPE bandwidth", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "bandwidth" + }, + "fromInputName": "adiodvpe0_bandwidth", + "constraints": null, + "required": true, + "default": "10" + }, + "AIC_CLLI": { + "type": "string", + "description": "AIC Site CLLI", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "AIC_CLLI" + }, + "fromInputName": "2017488_adiodvpe0_AIC_CLLI", + "constraints": null, + "required": true, + "default": "ATLMY8GA" + }, + "vnf_instance_name": { + "type": "string", + "description": "The hostname assigned to the vpe.", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "vnf_instance_name" + }, + "fromInputName": "2017488_adiodvpe0_vnf_instance_name", + "constraints": null, + "required": true, + "default": "mtnj309me6" + } + }, + "volumeGroupAllowed": true + }, + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": { + "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db", + "invariantUuid": "b34833bb-6aa9-4ad6-a831-70b06367a091", + "customizationUuid": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3", + "description": null, + "name": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0", + "version": "5", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0", + "properties": { + "minCountInstances": 1, + "maxCountInstances": 1, + "initialCount": 1, + "vfModuleLabel": "ADIOD_base_vPE_BV", + "baseModule": true + }, + "inputs": {}, + "volumeGroupAllowed": false + }, + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": { + "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a", + "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339", + "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vPFE_BV", + "baseModule": false + }, + "inputs": {}, + "volumeGroupAllowed": true + } + }, + "volumeGroups": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": { + "uuid": "25284168-24bb-4698-8cb4-3f509146eca5", + "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1", + "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vRE_BV", + "baseModule": false + }, + "inputs": { + "vnf_config_template_version": { + "type": "string", + "description": "VPE Software Version", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "vnf_config_template_version" + }, + "fromInputName": "2017488_adiodvpe0_vnf_config_template_version", + "constraints": null, + "required": true, + "default": "17.2" + }, + "bandwidth_units": { + "type": "string", + "description": "Units of bandwidth", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "bandwidth_units" + }, + "fromInputName": "adiodvpe0_bandwidth_units", + "constraints": null, + "required": true, + "default": "Gbps" + }, + "bandwidth": { + "type": "string", + "description": "Requested VPE bandwidth", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "bandwidth" + }, + "fromInputName": "adiodvpe0_bandwidth", + "constraints": null, + "required": true, + "default": "10" + }, + "AIC_CLLI": { + "type": "string", + "description": "AIC Site CLLI", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "AIC_CLLI" + }, + "fromInputName": "2017488_adiodvpe0_AIC_CLLI", + "constraints": null, + "required": true, + "default": "ATLMY8GA" + }, + "vnf_instance_name": { + "type": "string", + "description": "The hostname assigned to the vpe.", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "vnf_instance_name" + }, + "fromInputName": "2017488_adiodvpe0_vnf_instance_name", + "constraints": null, + "required": true, + "default": "mtnj309me6" + } + } + }, + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": { + "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a", + "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339", + "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vPFE_BV", + "baseModule": false + }, + "inputs": {} + } + }, + "pnfs": {} + } + } +}); diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/vfModule/vfModule.model.info.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/vfModule/vfModule.model.info.ts new file mode 100644 index 000000000..7db3d906e --- /dev/null +++ b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/vfModule/vfModule.model.info.ts @@ -0,0 +1,388 @@ +import {DynamicInputsService} from "../../dynamicInputs.service"; +import {ILevelNodeInfo} from "../basic.model.info"; +import * as _ from "lodash"; +import {VNFModel} from "../../../../../shared/models/vnfModel"; +import {SharedTreeService} from "../../shared.tree.service"; +import {VfModuleTreeNode} from "../../../../../shared/models/vfModuleTreeNode"; +import {VfModuleInstance} from "../../../../../shared/models/vfModuleInstance"; +import {VfModule} from "../../../../../shared/models/vfModule"; +import {NgRedux} from "@angular-redux/store"; +import {ITreeNode} from "angular-tree-component/dist/defs/api"; +import { + GenericFormPopupComponent, + PopupType +} from "../../../../../shared/components/genericFormPopup/generic-form-popup.component"; +import {DialogService} from "ng2-bootstrap-modal"; +import {VfModulePopuopService} from "../../../../../shared/components/genericFormPopup/genericFormServices/vfModule/vfModule.popuop.service"; +import {AppState} from "../../../../../shared/store/reducers"; +import {MessageBoxData} from "../../../../../shared/components/messageBox/messageBox.data"; +import {MessageBoxService} from "../../../../../shared/components/messageBox/messageBox.service"; +import {AvailableNodeIcons} from "../../../available-models-tree/available-models-tree.service"; +import {IframeService} from "../../../../../shared/utils/iframe.service"; +import { + deleteActionVfModuleInstance, + removeVfModuleInstance, + undoDeleteVfModuleInstance, + updateVFModulePosition +} from "../../../../../shared/storeUtil/utils/vfModule/vfModule.actions"; +import {ComponentInfoService} from "../../../component-info/component-info.service"; +import {ComponentInfoModel, ComponentInfoType} from "../../../component-info/component-info-model"; +import {ModelInformationItem} from "../../../../../shared/components/model-information/model-information.component"; + +export class VFModuleModelInfo implements ILevelNodeInfo { + constructor(private _dynamicInputsService: DynamicInputsService, + private _sharedTreeService: SharedTreeService, + private _dialogService: DialogService, + private _vfModulePopupService: VfModulePopuopService, + private _iframeService: IframeService, + private _store: NgRedux<AppState>, + private _componentInfoService: ComponentInfoService) { + } + + name: string = 'vfModules'; + type: string = 'Module'; + typeName: string = 'M'; + + /*********************************************************** + * return if user should provide instance name or not. + * get info from parent (VNF) + * @param currentModel - current Model object + * @param parentModel - current parent Model object + ************************************************************/ + isEcompGeneratedNaming(currentModel, parentModel): boolean { + const ecompGeneratedNaming = !_.isNil(parentModel.properties) ? parentModel.properties.ecomp_generated_naming : undefined; + return ecompGeneratedNaming === "true"; + } + + /*********************************************************** + * return model dynamic inputs + * @param currentModel - current Model object + ************************************************************/ + updateDynamicInputsDataFromModel = (currentModel): any => { + let displayInputs = _.isNil(currentModel) ? [] : currentModel.inputs; + return _.isEmpty(displayInputs) ? [] : this._dynamicInputsService.getArbitraryInputs(displayInputs); + }; + + /*********************************************************** + * return vfModule model + * @param vfModuleModelId - current Model id + * @param instance + * @param serviceHierarchy - serviceHierarchy + ************************************************************/ + getModel = (vfModuleModelId: string, instance, serviceHierarchy): any => { + if (!_.isNil(serviceHierarchy)) { + if (!_.isNil(serviceHierarchy[this.name]) && !_.isNil(serviceHierarchy[this.name][vfModuleModelId])) { + return serviceHierarchy[this.name][vfModuleModelId]; + } + } + return {}; + }; + + createNode(instance: VfModuleInstance, currentModel: VfModule, parentModel: VNFModel, modelName: string, index: number): VfModuleTreeNode { + let dynamicModelName = Object.keys(instance)[index]; + instance = instance[Object.keys(instance)[index]]; + const isEcompGeneratedNaming: boolean = this.isEcompGeneratedNaming(currentModel, parentModel); + + const dynamicInputs = this.updateDynamicInputsDataFromModel(currentModel); + let newVfModule: VfModuleTreeNode = new VfModuleTreeNode(instance, currentModel, modelName, dynamicInputs, isEcompGeneratedNaming, dynamicModelName); + + newVfModule.missingData = this._sharedTreeService.hasMissingData(instance, newVfModule.dynamicInputs, isEcompGeneratedNaming, []); + newVfModule.typeName = this.typeName; + newVfModule.menuActions = this.getMenuAction(<any>newVfModule, currentModel.uuid); + newVfModule.isFailed = _.isNil(instance.isFailed) ? false : instance.isFailed; + newVfModule.statusMessage = !_.isNil(instance.statusMessage) ? instance.statusMessage: ""; + + newVfModule = this._sharedTreeService.addingStatusProperty(newVfModule); + return newVfModule; + } + + createInstanceTreeNode(instance: VfModuleInstance, currentModel: VfModule, parentModel: VNFModel, modelName: string): VfModuleTreeNode | VfModuleTreeNode[] { + let numberOfChilds = Object.keys(instance).length; + if (numberOfChilds > 1) { + let result: VfModuleTreeNode[] = []; + for (let i = 0; i < numberOfChilds; i++) { + result.push(this.createNode(instance, currentModel, parentModel, modelName, i)); + } + return result; + } else { + return this.createNode(instance, currentModel, parentModel, modelName, 0); + } + } + + /*********************************************************** + * return next level object (null because is last level) + ************************************************************/ + getNextLevelObject(): any { + return null; + } + + getTooltip = (): string => 'VFmodule'; + + getType = (): string => 'VFmodule'; + + /*********************************************************** + * return if instance has missing data + * @param instance - vnf instance + * @param dynamicInputs + * @param isEcompGeneratedNaming + ************************************************************/ + hasMissingData(instance, dynamicInputs: any, isEcompGeneratedNaming: boolean): boolean { + return this._sharedTreeService.hasMissingData(instance, dynamicInputs, isEcompGeneratedNaming, []); + } + + + /*********************************************************** + * return if instance has missing data + * @param node - VFModule node + * @param serviceModelId - current service id + ************************************************************/ + onClickAdd(node: ITreeNode, serviceModelId: string): void { + const vnfStoreKey = this._sharedTreeService.getSelectedVNF() || this.getDefaultVNF(node.parent, serviceModelId); + if (vnfStoreKey) { + this._dialogService.addDialog(GenericFormPopupComponent, { + type: PopupType.VF_MODULE, + uuidData: <any>{ + serviceId: serviceModelId, + modelName: node.data.name, + vFModuleStoreKey: null, + vnfStoreKey: vnfStoreKey, + modelId: node.data.modelId, + type: node.data.type, + popupService: this._vfModulePopupService + }, + node: node, + isUpdateMode: false + }); + } else { + let messageBoxData: MessageBoxData = new MessageBoxData( + "Select a parent", // modal title + "There are multiple instances on the right side that can contain this vf-module Please select the VNF instance, to add this vf-module to, on the right side and then click the + sign", + <any>"warning", + <any>"md", + [ + {text: "Close", size: "medium", closeModal: true} + ]); + MessageBoxService.openModal.next(messageBoxData); + } + } + + getDefaultVNF(node: ITreeNode, serviceModelId: string): string { + let keys = _.keys(_.pickBy(this._store.getState().service.serviceInstance[serviceModelId].vnfs, vnf => { + return (vnf.originalName == node.data.name); + })); + return keys.length === 1 ? this._store.getState().service.serviceInstance[serviceModelId].vnfs[keys[0]].vnfStoreKey : null; + } + + /*********************************************************** + * return number of existing instances (in all VNF's) + * @param node - VfModule node + * @param serviceModelId - current service id + ************************************************************/ + getNodeCount(node: ITreeNode, serviceModelId: string): number { + let count: number = 0; + if (!_.isNil(this._store.getState().service.serviceInstance) && !_.isNil(this._store.getState().service.serviceInstance[serviceModelId])) { + const vnfs = this._store.getState().service.serviceInstance[serviceModelId].vnfs; + + for (let vnfKey in vnfs) { + count += this.countNumberOfVFModule(vnfs[vnfKey], node); + } + return count; + } + return count; + } + + + countNumberOfVFModule(vnf, node): number { + let count = 0; + for (let vfModuleKey in vnf['vfModules']) { + for (let vfModule in vnf['vfModules'][vfModuleKey]) { + if (vnf['vfModules'][vfModuleKey][vfModule]['modelInfo'].modelCustomizationId === node.data.modelUniqueId) { + const vfModuleObj = vnf['vfModules'][vfModuleKey][vfModule]; + if (!(!_.isNil(vfModuleObj) && !_.isNil(vfModuleObj.action) && vfModuleObj.action.split('_').pop() === 'Delete')) count++; + } + } + } + return count; + } + + getCountVFModuleOfSelectedVNF(node: ITreeNode, vnfStoreKey: string, serviceModelId: string): number { + let count: number = 0; + if (!_.isNil(this._store.getState().service.serviceInstance) && !_.isNil(this._store.getState().service.serviceInstance[serviceModelId])) { + const vnfs = this._store.getState().service.serviceInstance[serviceModelId].vnfs; + + for (let vnfKey in vnfs) { + count += this.countNumberOfVFModule(vnfs[vnfKey], node); + } + return count; + } + return count; + } + + + /*********************************************************** + * should show node icon + * @param node - current ITrees node + * @param serviceModelId - service id + ************************************************************/ + showNodeIcons(node: ITreeNode, serviceModelId: string): AvailableNodeIcons { + const selectedVNF: string = this._sharedTreeService.getSelectedVNF(); + if (selectedVNF) { + return this.showVFModuleOnSelectedVNF(node, selectedVNF, serviceModelId); + } else { + const optionalSelected = this.getOptionalVNFs(serviceModelId, node.parent.data.name); + if (optionalSelected.length === 1) { + return this.showVFModuleOnSelectedVNF(node, optionalSelected[0].vnfStoreKey, serviceModelId); + } else { + return new AvailableNodeIcons(false, false); + } + } + } + + + showVFModuleOnSelectedVNF(node: ITreeNode, selectedVNF: string, serviceModelId: string): AvailableNodeIcons { + + if (!_.isNil(this._store.getState().service.serviceInstance[serviceModelId].vnfs[selectedVNF]) && node.parent.data.name === this._store.getState().service.serviceInstance[serviceModelId].vnfs[selectedVNF].originalName) { + const existingVFModules = this.getCountVFModuleOfSelectedVNF(node, selectedVNF, serviceModelId); + const reachedLimit = this.isVFModuleReachedLimit(node, this._store.getState().service.serviceHierarchy, serviceModelId, existingVFModules); + const showAddIcon = this._sharedTreeService.shouldShowAddIcon()&& !reachedLimit; + return new AvailableNodeIcons(showAddIcon, reachedLimit); + } + return new AvailableNodeIcons(false, false); + + } + + getOptionalVNFs(serviceUUID: string, vnfOriginalModelName: string): any[] { + let result = []; + if (!_.isNil(this._store.getState().service.serviceInstance) && !_.isNil(this._store.getState().service.serviceInstance[serviceUUID])) { + const serviceVNFsInstances = this._store.getState().service.serviceInstance[serviceUUID].vnfs; + for (let vnfKey in serviceVNFsInstances) { + if (serviceVNFsInstances[vnfKey].originalName === vnfOriginalModelName) { + serviceVNFsInstances[vnfKey].vnfStoreKey = vnfKey; + result.push(serviceVNFsInstances[vnfKey]); + } + } + } + return result; + } + + + /************************************************ + return number of instances with action Delete + @type: vnfs networks, vngGroups (only vfModule) + @node : node model from the left tree + ************************************************/ + getExistingInstancesWithDeleteMode(node, serviceModelId: string, selectedVNF: string): number { + const existingInstances = this._store.getState().service.serviceInstance[serviceModelId].vnfs[selectedVNF].vfModules; + let counter = 0; + const modelUuid = node.data.uuid; + + if (!_.isNil(existingInstances)) { + for (let instanceKey in existingInstances) { + let size = Object.keys(existingInstances[instanceKey]).length; + for (let i = 0; i < size; i++) { + let vfModuleDynamicKey = Object.keys(existingInstances[instanceKey])[i]; + if (!_.isNil(existingInstances[instanceKey][vfModuleDynamicKey].action)) { + if (existingInstances[instanceKey][vfModuleDynamicKey]['uuid'] === modelUuid && existingInstances[instanceKey][vfModuleDynamicKey].action.split('_').pop() === 'Delete') { + counter++; + } + } + } + + } + } + return counter; + } + + isVFModuleReachedLimit(node: any, serviceHierarchy: any, serviceModelId: string, currentNodeCount: number): boolean { + let maxNodes: number = 1; + let vnfModules = serviceHierarchy[serviceModelId].vfModules; + if (vnfModules[node.data.name]) { + maxNodes = vnfModules[node.data.name].properties.maxCountInstances || 1; + } + return !(maxNodes > currentNodeCount); + + } + + getMenuAction(node: ITreeNode, serviceModelId: string): { [methodName: string]: { method: Function, visible: Function, enable: Function } } { + return { + edit: { + method: (node, serviceModelId) => { + this._iframeService.addClassOpenModal('content'); + this._dialogService.addDialog(GenericFormPopupComponent, { + type: PopupType.VF_MODULE, + uuidData: <any>{ + serviceId: serviceModelId, + modelName: node.data.modelName, + vFModuleStoreKey: node.data.dynamicModelName, + vnfStoreKey: node.parent.data.vnfStoreKey, + modelId: node.data.modelId, + type: node.data.type, + popupService: this._vfModulePopupService + }, + node: node, + isUpdateMode: true + }); + }, + visible: (node) => this._sharedTreeService.shouldShowRemoveAndEdit(node), + enable: (node) => this._sharedTreeService.shouldShowRemoveAndEdit(node), + }, + showAuditInfo: { + method: (node, serviceModelId) => { + let instance = this._store.getState().service.serviceInstance[serviceModelId].vnfs[node.parent.data.vnfStoreKey].vfModules[node.data.modelName][node.data.modelVersionId]; + this._sharedTreeService.openAuditInfoModal(node, serviceModelId, instance, 'VFMODULE', this); + }, + visible: (node) => this._sharedTreeService.shouldShowAuditInfo(node), + enable: (node) => this._sharedTreeService.shouldShowAuditInfo(node) + }, + remove: { + method: (node, serviceModelId) => this._store.dispatch(removeVfModuleInstance(node.data.modelName, serviceModelId, node.parent.data.modelName, node.parent.data.vnfStoreKey, node.data.dynamicModelName)), + visible: (node) => this._sharedTreeService.shouldShowRemoveAndEdit(node), + enable: (node) => this._sharedTreeService.shouldShowRemoveAndEdit(node), + }, + delete: { + method: (node, serviceModelId) => { + this._store.dispatch(deleteActionVfModuleInstance(node.data.dynamicModelName, node.parent.data.vnfStoreKey, serviceModelId)) + }, + visible: (node) => this._sharedTreeService.shouldShowDelete(node), + enable: (node) => this._sharedTreeService.shouldShowDelete(node) + }, + undoDelete: { + method: (node, serviceModelId) => { + this._store.dispatch(undoDeleteVfModuleInstance(node.data.dynamicModelName, node.parent.data.vnfStoreKey, serviceModelId)) + }, + visible: (node) => this._sharedTreeService.shouldShowUndoDelete(node), + enable: (node, serviceModelId) => this._sharedTreeService.shouldShowUndoDelete(node) && this._sharedTreeService.shouldShowDelete(node.parent) && !this._sharedTreeService.isServiceOnDeleteMode(serviceModelId) + } + }; + + + } + + updatePosition(that , node, instanceId, parentStoreKey): void { + that.store.dispatch(updateVFModulePosition(node, instanceId, parentStoreKey)); + } + + + getNodePosition(instance, deepDynamicName): number { + return (!_.isNil(instance) && !_.isNil(instance[deepDynamicName])) ? instance[deepDynamicName].position : null; + } + + onSelectedNode(node: ITreeNode): void { + } + + getInfoForVFModule(model, instance): ComponentInfoModel { + let modelInfoItems: ModelInformationItem[] = []; + if (model && !_.isNil(model.properties)) + { + modelInfoItems = [ + ModelInformationItem.createInstance("Base Module", model.properties.baseModule), + ModelInformationItem.createInstance("Min Instances", model.properties.minCountInstances), + ModelInformationItem.createInstance("Max Instances", model.properties.maxCountInstances), + ModelInformationItem.createInstance("Initial Instances Count", model.properties.initialCount) + ]; + } + return this._componentInfoService.addGeneralInfoItems(modelInfoItems, ComponentInfoType.VFMODULE, model, instance); + } + + +} diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/vnf/vnf.model.info.spec.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/vnf/vnf.model.info.spec.ts new file mode 100644 index 000000000..10c8e399c --- /dev/null +++ b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/vnf/vnf.model.info.spec.ts @@ -0,0 +1,1671 @@ +import {HttpClientTestingModule, HttpTestingController} from "@angular/common/http/testing"; +import {getTestBed, TestBed} from "@angular/core/testing"; +import {MockNgRedux, NgReduxTestingModule} from "@angular-redux/store/testing"; +import {VnfModelInfo} from "./vnf.model.info"; +import {DynamicInputsService} from "../../dynamicInputs.service"; +import {VFModuleModelInfo} from "../vfModule/vfModule.model.info"; +import {VNFModel} from "../../../../../shared/models/vnfModel"; +import {SharedTreeService} from "../../shared.tree.service"; +import {NgRedux} from "@angular-redux/store"; +import {AppState} from "../../../../../shared/store/reducers"; +import {DefaultDataGeneratorService} from "../../../../../shared/services/defaultDataServiceGenerator/default.data.generator.service"; +import {DialogService} from "ng2-bootstrap-modal"; +import {VfModulePopuopService} from "../../../../../shared/components/genericFormPopup/genericFormServices/vfModule/vfModule.popuop.service"; +import {VnfPopupService} from "../../../../../shared/components/genericFormPopup/genericFormServices/vnf/vnf.popup.service"; +import {AvailableNodeIcons} from "../../../available-models-tree/available-models-tree.service"; +import {DuplicateService} from "../../../duplicate/duplicate.service"; +import {IframeService} from "../../../../../shared/utils/iframe.service"; +import {ServiceInfoService} from "../../../../../shared/server/serviceInfo/serviceInfo.service"; +import {AuditInfoModalComponent} from "../../../../../shared/components/auditInfoModal/auditInfoModal.component"; +import {ModelInformationItem} from "../../../../../shared/components/model-information/model-information.component"; +import {ComponentInfoModel, ComponentInfoType} from "../../../component-info/component-info-model"; +import {ComponentInfoService} from "../../../component-info/component-info.service"; +import {AaiService} from "../../../../../shared/services/aaiService/aai.service"; +import {HttpClient, HttpHandler} from "@angular/common/http"; +import {FeatureFlagsService} from "../../../../../shared/services/featureFlag/feature-flags.service"; + +describe('Vnf Model Info', () => { + let injector; + let httpMock: HttpTestingController; + let _dynamicInputsService : DynamicInputsService; + let _sharedTreeService : SharedTreeService; + let _serviceInfoService: ServiceInfoService; + let _defaultDataGeneratorService : DefaultDataGeneratorService; + let _dialogService : DialogService; + let _vfModulePopupService : VfModulePopuopService; + let _vnfPopupService : VnfPopupService; + let _duplicateService : DuplicateService; + let _iframeService : IframeService; + let _componentInfoService : ComponentInfoService; + + let _store : NgRedux<AppState>; + let vnfModel: VnfModelInfo; + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule, NgReduxTestingModule], + providers: [ + MockNgRedux, + DynamicInputsService, + DialogService, + VfModulePopuopService, + VnfPopupService, + DefaultDataGeneratorService, + SharedTreeService, + DuplicateService, + AaiService, + HttpClient, + HttpHandler, + FeatureFlagsService, + ComponentInfoService, + IframeService] + }).compileComponents(); + + injector = getTestBed(); + _sharedTreeService = injector.get(SharedTreeService); + _store = injector.get(NgRedux); + _componentInfoService = injector.get(ComponentInfoService); + + vnfModel = new VnfModelInfo( + _dynamicInputsService, + _sharedTreeService, + _defaultDataGeneratorService, + _dialogService, + _vnfPopupService, + _vfModulePopupService, + _duplicateService, + null, + _iframeService, + _componentInfoService, + _store); + + + }); + + test('VnfModelInfo should be defined', () => { + expect(VnfModelInfo).toBeDefined(); + }); + + test('VnfModelInfo should defined extra details', () => { + expect(vnfModel.name).toEqual('vnfs'); + expect(vnfModel.type).toEqual('VNF'); + expect(vnfModel.childName).toEqual('vfModules'); + expect(vnfModel.childType).toEqual('VFModuleModelInfo'); + }); + + test('isEcompGeneratedNaming should return true if isEcompGeneratedNaming is "true" ', () => { + let isEcompGeneratedNaming: boolean = vnfModel.isEcompGeneratedNaming(<any>{ + properties: { + ecomp_generated_naming: 'true' + } + }); + expect(isEcompGeneratedNaming).toBeTruthy(); + }); + + test('isEcompGeneratedNaming should return false if isEcompGeneratedNaming is "false"', () => { + let isEcompGeneratedNaming: boolean = vnfModel.isEcompGeneratedNaming({ + properties: { + ecomp_generated_naming: 'false' + } + }); + expect(isEcompGeneratedNaming).toBeFalsy(); + }); + + test('isEcompGeneratedNaming should return false if isEcompGeneratedNaming is not defined', () => { + let isEcompGeneratedNaming: boolean = vnfModel.isEcompGeneratedNaming({ + properties: { + } + }); + expect(isEcompGeneratedNaming).toBeFalsy(); + }); + + + test('getTooltip should return "VF"', () => { + let tooltip: string = vnfModel.getTooltip(); + expect(tooltip).toEqual('VF'); + }); + + test('getType should return "VF"', () => { + let tooltip: string = vnfModel.getType(); + expect(tooltip).toEqual('VF'); + }); + + test('getNextLevelObject should vfModule level object', () => { + let nextLevel: VFModuleModelInfo = vnfModel.getNextLevelObject(); + expect(nextLevel.type).toEqual('Module'); + }); + + test('getModel should return VNF model', () => { + let model: VNFModel = vnfModel.getModel('2017-388_ADIOD-vPE 1', <any>{ + originalName : '2017-388_ADIOD-vPE 1' + }, getServiceHierarchy()); + expect(model.type).toEqual('VF'); + }); + + test('showNodeIcons should return false if reachLimit of max', ()=>{ + let serviceId : string = 'servicedId'; + let node = { + data : { + id : 'vnfId', + name : 'vnfName', + modelCustomizationId : "modelCustomizationId", + modelUniqueId: "modelCustomizationId" + } + }; + jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({ + global:{}, + service : { + serviceHierarchy : { + 'servicedId' : { + 'vnfs' : { + modelCustomizationId : "modelCustomizationId", + 'modelInfo': { + modelCustomizationId : "modelCustomizationId" + }, + 'vnfName' : { + 'properties' : { + 'max_instances' : 1 + } + } + } + } + }, + serviceInstance : { + 'servicedId' : { + 'existingVNFCounterMap' : { + 'modelCustomizationId' : 1 + }, + 'vnfs' : { + 'vnfName' :{ + + } + } + } + } + } + }); + + let result = vnfModel.showNodeIcons(<any>node, serviceId); + expect(result).toEqual(new AvailableNodeIcons(false , true)); + }); + + test('showNodeIcons should return true if not reachLimit of max', ()=>{ + let serviceId : string = 'servicedId'; + let node = { + data : { + id : 'vnfId', + name : 'vnfName' + } + }; + jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({ + global:{ + drawingBoardStatus: "EDIT" + }, + service : { + serviceHierarchy : { + 'servicedId' : { + 'vnfs' : { + 'vnfName' : { + 'properties' : { + 'max_instances' : 2 + } + } + } + } + }, + serviceInstance : { + 'servicedId' : { + 'existingVNFCounterMap' : { + 'vnfId' : 1 + }, + 'vnfs' : { + 'vnfName' :{ + + } + } + } + } + } + }); + + let result = vnfModel.showNodeIcons(<any>node, serviceId); + expect(result).toEqual(new AvailableNodeIcons(true , false)); + }); + + test('getNodeCount should return number of nodes', ()=>{ + let serviceId : string = 'servicedId'; + jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({ + global : {}, + service : { + serviceHierarchy : { + 'servicedId' : { + 'vnfs' : { + 'vnfName' : { + 'properties' : { + 'max_instances' : 1 + } + } + } + } + }, + serviceInstance : { + 'servicedId' : { + 'existingVNFCounterMap' : { + 'modelCustomizationId' : 1 + }, + 'vnfs' : { + 'vnfName' :{ + 'originalName' : 'vnfName' + } + } + } + } + } + }); + + let node = { + data : { + id : 'vnfId', + name : 'vnfName', + modelCustomizationId : "modelCustomizationId", + modelUniqueId: "modelCustomizationId" + } + }; + let result = vnfModel.getNodeCount(<any>node , serviceId); + expect(result).toEqual(1); + + node.data.modelCustomizationId = 'vnfId_notExist'; + node.data.modelUniqueId = 'vnfId_notExist'; + result = vnfModel.getNodeCount(<any>node , serviceId); + expect(result).toEqual(0); + + result = vnfModel.getNodeCount(<any>node , serviceId + '_notExist'); + expect(result).toEqual(0); + }); + + test('getMenuAction: edit', ()=>{ + let node = {"modelId":"d6557200-ecf2-4641-8094-5393ae3aae60","missingData":true,"action":"None","inMaint":true,"name":"jlfBwIks283yKlCD8","modelName":"VF_vMee 0","type":"VF","isEcompGeneratedNaming":true,"networkStoreKey":"VF_vMee 0:004","vnfStoreKey":"VF_vMee 0:004","typeName":"VNF"}; + let serviceModelId = "d6557200-ecf2-4641-8094-5393ae3aae60"; + let result = vnfModel.getMenuAction(<any>node, serviceModelId); + spyOn(result['edit'], 'method'); + expect(result['edit']).toBeDefined(); + expect(result['edit'].visible).toBeTruthy(); + expect(result['edit'].enable).toBeTruthy(); + result['edit']['method'](node, serviceModelId); + expect(result['edit']['method']).toHaveBeenCalledWith(node, serviceModelId); + }); + + test('member should defined edit method', () => { + let node = { + data : { + "modelId": "d6557200-ecf2-4641-8094-5393ae3aae60", + "missingData": true, + "action": "None", + "inMaint": true, + "name": "jlfBwIks283yKlCD8", + "modelName": "VF_vMee 0", + "type": "VF", + "userProvidedNaming": false, + "networkStoreKey": "VF_vMee 0:004", + "vnfStoreKey": "VF_vMee 0:004", + "typeName": "VNF" + }, + type : 'VNF' + + }; + let serviceModelId = "d6557200-ecf2-4641-8094-5393ae3aae60"; + + let menuActions = vnfModel.getMenuAction(<any>node, serviceModelId); + spyOn(menuActions['edit'], 'method'); + expect(menuActions['edit']).toBeDefined(); + expect(menuActions['edit'].visible(node)).toBeFalsy(); + menuActions['edit']['method'](node, serviceModelId); + expect(menuActions['edit']['method']).toHaveBeenCalledWith(node, serviceModelId); + }); + + test('getMenuAction: duplicate', ()=>{ + jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({ + "global": { + "name": null, + "type": "UPDATE_DRAWING_BOARD_STATUS", + "drawingBoardStatus": "CREATE" + } + }); + let node = { + data : { + "modelId": "d6557200-ecf2-4641-8094-5393ae3aae60", + "missingData": true, + "action": "None", + "inMaint": true, + "name": "jlfBwIks283yKlCD8", + "modelName": "VF_vMee 0", + "type": "VF", + "isEcompGeneratedNaming":true, + "networkStoreKey": "VF_vMee 0:004", + "vnfStoreKey": "VF_vMee 0:004", + "typeName": "VNF" + }, + type : 'VNF' + + }; + let serviceModelId = "d6557200-ecf2-4641-8094-5393ae3aae60"; + let menuActions = vnfModel.getMenuAction(<any>node, serviceModelId); + spyOn(menuActions['duplicate'], 'method'); + expect(menuActions['duplicate']).toBeDefined(); + expect(menuActions['duplicate'].visible(node)).toBeFalsy(); + menuActions['duplicate']['method'](node, serviceModelId); + expect(menuActions['duplicate']['method']).toHaveBeenCalledWith(node, serviceModelId); + }); + + test('getMenuAction: remove', ()=>{ + let node = { + data : { + "modelId": "d6557200-ecf2-4641-8094-5393ae3aae60", + "missingData": true, + "action": "None", + "inMaint": true, + "name": "jlfBwIks283yKlCD8", + "modelName": "VF_vMee 0", + "type": "VF", + "isEcompGeneratedNaming":true, + "networkStoreKey": "VF_vMee 0:004", + "vnfStoreKey": "VF_vMee 0:004", + "typeName": "VNF" + }, + type : 'VNF' + + }; + let serviceModelId = "d6557200-ecf2-4641-8094-5393ae3aae60"; + + let menuActions = vnfModel.getMenuAction(<any>node, serviceModelId); + spyOn(menuActions['remove'], 'method'); + expect(menuActions['remove']).toBeDefined(); + expect(menuActions['remove'].visible(node)).toBeFalsy(); + menuActions['remove']['method'](node, serviceModelId); + expect(menuActions['remove']['method']).toHaveBeenCalledWith(node, serviceModelId); + }); + + test('getMenuAction: delete', ()=>{ + let node = {"modelId":"d6557200-ecf2-4641-8094-5393ae3aae60","missingData":true,"action":"None","inMaint":true,"name":"jlfBwIks283yKlCD8","modelName":"VF_vMee 0","type":"VF","isEcompGeneratedNaming":true,"networkStoreKey":"VF_vMee 0:004","vnfStoreKey":"VF_vMee 0:004","typeName":"VNF"}; + let serviceModelId = "d6557200-ecf2-4641-8094-5393ae3aae60"; + let result = vnfModel.getMenuAction(<any>node, serviceModelId); + spyOn(result['delete'], 'method'); + expect(result['delete']).toBeDefined(); + expect(result['delete'].visible).toBeTruthy(); + expect(result['delete'].enable).toBeTruthy(); + result['delete']['method'](node, serviceModelId); + expect(result['delete']['method']).toHaveBeenCalledWith(node, serviceModelId); + }); + + + test('getMenuAction: undoDelete', ()=>{ + let node = {"modelId":"d6557200-ecf2-4641-8094-5393ae3aae60","missingData":true,"action":"None","inMaint":true,"name":"jlfBwIks283yKlCD8","modelName":"VF_vMee 0","type":"VF","isEcompGeneratedNaming":true,"networkStoreKey":"VF_vMee 0:004","vnfStoreKey":"VF_vMee 0:004","typeName":"VNF"}; + let serviceModelId = "d6557200-ecf2-4641-8094-5393ae3aae60"; + let result = vnfModel.getMenuAction(<any>node, serviceModelId); + spyOn(result['undoDelete'], 'method'); + expect(result['undoDelete']).toBeDefined(); + expect(result['undoDelete'].visible).toBeDefined(); + expect(result['undoDelete'].enable).toBeDefined(); + result['undoDelete']['method'](node, serviceModelId); + expect(result['undoDelete']['method']).toHaveBeenCalledWith(node, serviceModelId); + }); + + test('getMenuAction: showAuditInfo', ()=>{ + jest.spyOn(_sharedTreeService, 'isRetryMode').mockReturnValue(true); + + jest.spyOn(AuditInfoModalComponent.openInstanceAuditInfoModal, 'next'); + let node = { + data : { + "modelId": "6b528779-44a3-4472-bdff-9cd15ec93450", + "action": "Create", + "type": "VF", + "vnfStoreKey": "MSOTEST103a", + "typeName": "VNF", + "isFailed": true, + }, + type : 'VNF' + + }; + let serviceModelId = "6b528779-44a3-4472-bdff-9cd15ec93450"; + let result = vnfModel.getMenuAction(<any>node, serviceModelId); + spyOn(result['showAuditInfo'], 'method'); + expect(result['showAuditInfo']).toBeDefined(); + expect(result['showAuditInfo'].visible(node)).toBeTruthy(); + expect(result['showAuditInfo'].enable(node)).toBeTruthy(); + result['showAuditInfo']['method'](node, serviceModelId); + + // expect(AuditInfoModalComponent.openInstanceAuditInfoModal.next).toBeCalled(); + // expect(result['showAuditInfo'].method) + + }); + + test('Info for vnf should be correct', () => { + const model = getVNFModel(); + const instance = getVNFInstance(); + let actualVNFInfo = vnfModel.getInfoForVnf(model,instance); + let expectedVNFInfo = [ + ModelInformationItem.createInstance('Type', 'VF'), + ModelInformationItem.createInstance('Model Version', '2.0'), + ModelInformationItem.createInstance('Model Customization ID','91415b44-753d-494c-926a-456a9172bbb9'), + ModelInformationItem.createInstance('Instance ID', '66cbb3b5-c823-470c-9520-4e0b85112250'), + ModelInformationItem.createInstance('In Maintenance', true), + ModelInformationItem.createInstance('Min Instances', 0), + ModelInformationItem.createInstance('Max Instances',1) + ]; + expect(actualVNFInfo).toEqual(new ComponentInfoModel(ComponentInfoType.VNF, expectedVNFInfo, [])); + }); + + test('Info for vnf in left side - model only - should be correct', () => { + const model = getVNFModel(); + let actualVNFInfo = vnfModel.getInfoForVnf(model,null); + let expectedVNFInfo = [ + ModelInformationItem.createInstance('Type', 'VF'), + ModelInformationItem.createInstance('Model Version', '2.0'), + ModelInformationItem.createInstance('Model Customization ID','91415b44-753d-494c-926a-456a9172bbb9'), + ModelInformationItem.createInstance('Min Instances', 0), + ModelInformationItem.createInstance('Max Instances',1) + ]; + expect(actualVNFInfo).toEqual(new ComponentInfoModel(ComponentInfoType.VNF, expectedVNFInfo, [])); + }); + + function getVNFModel(){ + return { + "name":"VF_vMee", + "version":"2.0", + "description":"VSP_vMee", + "uuid":"d6557200-ecf2-4641-8094-5393ae3aae60", + "invariantUuid":"4160458e-f648-4b30-a176-43881ffffe9e", + "max":1, + "min":0, + "customizationUuid":"91415b44-753d-494c-926a-456a9172bbb9", + "isEcompGeneratedNaming":true, + "type":"VF", + "modelCustomizationName":"VF_vMee 0", + "vfcInstanceGroups":{}, + "properties":{ + "gpb2_Internal2_mac":"00:11:22:EF:AC:DF", + "sctp-a-ipv6-egress_rule_application":"any", + "sctp-b-ipv6-egress_src_start_port":"0", + "Internal2_allow_transit":"true", + "sctp-b-IPv6_ethertype":"IPv6", + "ncb2_Internal1_mac":"00:11:22:EF:AC:DF", + "sctp-b-ingress_rule_protocol":"icmp","sctp-b-ingress_action":"pass", + "sctp-a-egress_rule_application":"any", + "sctp-b-ipv6-ingress-src_start_port":"0.0", + "ncb1_Internal2_mac":"00:11:22:EF:AC:DF","sctp-b-egress_src_addresses":"local", + "fsb_volume_size_0":"320.0", + "sctp-a-ipv6-ingress-dst_start_port":"0", + "sctp-a-ipv6-ingress_ethertype":"IPv4","sctp-b-ipv6-ingress_rule_application":"any", + "domain_name":"default-domain", + "sctp-a-egress_src_addresses":"local", + "sctp-b-egress-src_start_port":"0.0", + "sctp-a-ingress_rule_protocol":"icmp", + "sctp-b-display_name":"epc-sctp-b-ipv4v6-sec-group", + "sctp-b-ipv6-ingress-dst_end_port":"65535", + "sctp-a-ingress_ethertype":"IPv4", + "sctp-a-egress-src_start_port":"0.0", + "sctp-b-dst_subnet_prefix_v6":"::", + "nf_naming":"{ecomp_generated_naming=true}", + "sctp-a-ipv6-ingress_src_subnet_prefix":"0.0.0.0" + } + }; + + } + + function getVNFInstance(){ + return { + "action":"None", + "instanceName":"4O61SmpFAdCm1oVEs", + "instanceId":"66cbb3b5-c823-470c-9520-4e0b85112250", + "orchStatus":null, + "productFamilyId":null, + "lcpCloudRegionId":null, + "tenantId":null, + "modelInfo":{ + "modelCustomizationName":"VF_vMee 0", + "modelInvariantId":"vnf-instance-model-invariant-id", + "modelVersionId":"d6557200-ecf2-4641-8094-5393ae3aae60", + "modelType":"vnf" + }, + "instanceType":"7538ifdSoTccmbEkr", + "provStatus":null, + "inMaint":true, + "uuid":"d6557200-ecf2-4641-8094-5393ae3aae60", + "originalName":"VF_vMee 0", + "legacyRegion":null, + "lineOfBusiness":null, + "platformName":null, + "trackById":"VF_vMee 0:004", + "vfModules":{ + "vf_vmee0..VfVmee..vmme_vlc..module-1":{ + "vf_vmee0..VfVmee..vmme_vlc..module-1:008":{ + "action":"None", + "instanceName":"ss820f_0918_db", + "instanceId":"2c1ca484-cbc2-408b-ab86-25a2c15ce280", + "orchStatus":"deleted", + "productFamilyId":null, + "lcpCloudRegionId":null, + "tenantId":null, + "modelInfo":{ + "modelCustomizationName":"VfVmee..vmme_vlc..module-1", + "modelCustomizationId":"b200727a-1bf9-4e7c-bd06-b5f4c9d920b9", + "modelInvariantId":"09edc9ef-85d0-4b26-80de-1f569d49e750", + "modelVersionId":"522159d5-d6e0-4c2a-aa44-5a542a12a830", + "modelType":"vfModule" + }, + "instanceType":null, + "provStatus":null, + "inMaint":true, + "uuid":"522159d5-d6e0-4c2a-aa44-5a542a12a830", + "originalName":"VfVmee..vmme_vlc..module-1", + "legacyRegion":null, + "lineOfBusiness":null, + "platformName":null, + "trackById":"vf_vmee0..VfVmee..vmme_vlc..module-1:008", + "isBase":false, + "volumeGroupName":null + } + }, + "dc229cd8-c132-4455-8517-5c1787c18b14":{ + "dc229cd8-c132-4455-8517-5c1787c18b14:009":{ + "action":"None", + "instanceName":"ss820f_0918_base", + "instanceId":"3ef042c4-259f-45e0-9aba-0989bd8d1cc5", + "orchStatus":"Assigned", + "productFamilyId":null, + "lcpCloudRegionId":null, + "tenantId":null, + "modelInfo":{ + "modelCustomizationId":"8ad8670b-0541-4499-8101-275bbd0e8b6a", + "modelInvariantId":"1e463c9c-404d-4056-ba56-28fd102608de", + "modelVersionId":"dc229cd8-c132-4455-8517-5c1787c18b14", + "modelType":"vfModule" + }, + "instanceType":null, + "provStatus":null, + "inMaint":false, + "uuid":"dc229cd8-c132-4455-8517-5c1787c18b14", + "originalName":null, + "legacyRegion":null, + "lineOfBusiness":null, + "platformName":null, + "trackById":"dc229cd8-c132-4455-8517-5c1787c18b14:009", + "isBase":true, + "volumeGroupName":null + } + } + }, + "networks":{ + + } + }; + } + + function getServiceHierarchy(){ + return { + "service": { + "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450", + "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0", + "name": "action-data", + "version": "1.0", + "toscaModelURL": null, + "category": "", + "serviceType": "", + "serviceRole": "", + "description": "", + "serviceEcompNaming": "false", + "instantiationType": "Macro", + "inputs": { + "2017488_adiodvpe0_ASN": { + "type": "string", + "description": "AV/PE", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "AV_vPE" + } + }, + "vidNotions": { + "instantiationUI": "legacy", + "modelCategory": "other" + } + }, + "vnfs": { + "2017-388_ADIOD-vPE 1": { + "uuid": "0903e1c0-8e03-4936-b5c2-260653b96413", + "invariantUuid": "00beb8f9-6d39-452f-816d-c709b9cbb87d", + "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM", + "name": "2017-388_ADIOD-vPE", + "version": "1.0", + "customizationUuid": "280dec31-f16d-488b-9668-4aae55d6648a", + "inputs": { + "vnf_config_template_version": { + "type": "string", + "description": "VPE Software Version", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "17.2" + }, + "bandwidth_units": { + "type": "string", + "description": "Units of bandwidth", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "Gbps" + }, + "bandwidth": { + "type": "string", + "description": "Requested VPE bandwidth", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "10" + }, + "AIC_CLLI": { + "type": "string", + "description": "AIC Site CLLI", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "ATLMY8GA" + }, + "ASN": { + "type": "string", + "description": "AV/PE", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "AV_vPE" + }, + "vnf_instance_name": { + "type": "string", + "description": "The hostname assigned to the vpe.", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "mtnj309me6" + } + }, + "commands": { + "vnf_config_template_version": { + "displayName": "vnf_config_template_version", + "command": "get_input", + "inputName": "2017488_adiodvpe0_vnf_config_template_version" + }, + "bandwidth_units": { + "displayName": "bandwidth_units", + "command": "get_input", + "inputName": "adiodvpe0_bandwidth_units" + }, + "bandwidth": { + "displayName": "bandwidth", + "command": "get_input", + "inputName": "adiodvpe0_bandwidth" + }, + "AIC_CLLI": { + "displayName": "AIC_CLLI", + "command": "get_input", + "inputName": "2017488_adiodvpe0_AIC_CLLI" + }, + "ASN": { + "displayName": "ASN", + "command": "get_input", + "inputName": "2017488_adiodvpe0_ASN" + }, + "vnf_instance_name": { + "displayName": "vnf_instance_name", + "command": "get_input", + "inputName": "2017488_adiodvpe0_vnf_instance_name" + } + }, + "properties": { + "vmxvre_retype": "RE-VMX", + "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version", + "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d", + "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9", + "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF", + "int_ctl_net_name": "VMX-INTXI", + "vmx_int_ctl_prefix": "10.0.0.10", + "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5", + "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279", + "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a", + "nf_type": "vPE", + "vmxvpfe_int_ctl_ip_1": "10.0.0.10", + "is_AVPN_service": "false", + "vmx_RSG_name": "vREXI-affinity", + "vmx_int_ctl_forwarding": "l2", + "vmxvre_oam_ip_0": "10.0.0.10", + "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvpfe_sriov41_0_port_vlanstrip": "false", + "vmxvpfe_sriov42_0_port_vlanfilter": "4001", + "vmxvpfe_sriov44_0_port_unknownunicastallow": "true", + "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2", + "vmxvre_instance": "0", + "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvre_flavor_name": "ns.c1r16d32.v5", + "vmxvpfe_volume_size_0": "40.0", + "vmxvpfe_sriov43_0_port_vlanfilter": "4001", + "nf_naming": "{ecomp_generated_naming=false}", + "nf_naming_code": "Navneet", + "vmxvre_name_0": "vREXI", + "vmxvpfe_sriov42_0_port_vlanstrip": "false", + "vmxvpfe_volume_name_0": "vPFEXI_FBVolume", + "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141", + "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2", + "vmxvpfe_sriov43_0_port_unknownunicastallow": "true", + "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true", + "vmxvre_console": "vidconsole", + "vmxvpfe_sriov44_0_port_vlanfilter": "4001", + "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3", + "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true", + "vmxvpfe_sriov44_0_port_vlanstrip": "false", + "vf_module_id": "123", + "nf_function": "JAI", + "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true", + "vmxvre_int_ctl_ip_0": "10.0.0.10", + "ecomp_generated_naming": "false", + "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI", + "vnf_name": "mtnj309me6vre", + "vmxvpfe_sriov41_0_port_unknownunicastallow": "true", + "vmxvre_volume_type_1": "HITACHI", + "vmxvpfe_sriov44_0_port_broadcastallow": "true", + "vmxvre_volume_type_0": "HITACHI", + "vmxvpfe_volume_type_0": "HITACHI", + "vmxvpfe_sriov43_0_port_broadcastallow": "true", + "bandwidth_units": "get_input:adiodvpe0_bandwidth_units", + "vnf_id": "123", + "vmxvre_oam_prefix": "24", + "availability_zone_0": "mtpocfo-kvm-az01", + "ASN": "get_input:2017488_adiodvpe0_ASN", + "vmxvre_chassis_i2cid": "161", + "vmxvpfe_name_0": "vPFEXI", + "bandwidth": "get_input:adiodvpe0_bandwidth", + "availability_zone_max_count": "1", + "vmxvre_volume_size_0": "45.0", + "vmxvre_volume_size_1": "50.0", + "vmxvpfe_sriov42_0_port_broadcastallow": "true", + "vmxvre_oam_gateway": "10.0.0.10", + "vmxvre_volume_name_1": "vREXI_FAVolume", + "vmxvre_ore_present": "0", + "vmxvre_volume_name_0": "vREXI_FBVolume", + "vmxvre_type": "0", + "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name", + "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true", + "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429", + "vmx_int_ctl_len": "24", + "vmxvpfe_sriov43_0_port_vlanstrip": "false", + "vmxvpfe_sriov41_0_port_broadcastallow": "true", + "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d", + "vmxvpfe_sriov41_0_port_vlanfilter": "4001", + "nf_role": "Testing", + "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a", + "vmxvpfe_sriov42_0_port_unknownunicastallow": "true", + "vmxvpfe_flavor_name": "ns.c20r16d25.v5" + }, + "type": "VF", + "modelCustomizationName": "2017-388_ADIOD-vPE 1", + "vfModules": {}, + "volumeGroups": {}, + "vfcInstanceGroups": {} + }, + "2017-388_ADIOD-vPE 0": { + "uuid": "afacccf6-397d-45d6-b5ae-94c39734b168", + "invariantUuid": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8", + "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM", + "name": "2017-388_ADIOD-vPE", + "version": "4.0", + "customizationUuid": "b3c76f73-eeb5-4fb6-9d31-72a889f1811c", + "inputs": { + "vnf_config_template_version": { + "type": "string", + "description": "VPE Software Version", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "17.2" + }, + "bandwidth_units": { + "type": "string", + "description": "Units of bandwidth", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "Gbps" + }, + "bandwidth": { + "type": "string", + "description": "Requested VPE bandwidth", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "10" + }, + "AIC_CLLI": { + "type": "string", + "description": "AIC Site CLLI", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "ATLMY8GA" + }, + "ASN": { + "type": "string", + "description": "AV/PE", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "AV_vPE" + }, + "vnf_instance_name": { + "type": "string", + "description": "The hostname assigned to the vpe.", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "mtnj309me6" + } + }, + "commands": { + "vnf_config_template_version": { + "displayName": "vnf_config_template_version", + "command": "get_input", + "inputName": "2017488_adiodvpe0_vnf_config_template_version" + }, + "bandwidth_units": { + "displayName": "bandwidth_units", + "command": "get_input", + "inputName": "adiodvpe0_bandwidth_units" + }, + "bandwidth": { + "displayName": "bandwidth", + "command": "get_input", + "inputName": "adiodvpe0_bandwidth" + }, + "AIC_CLLI": { + "displayName": "AIC_CLLI", + "command": "get_input", + "inputName": "2017488_adiodvpe0_AIC_CLLI" + }, + "ASN": { + "displayName": "ASN", + "command": "get_input", + "inputName": "2017488_adiodvpe0_ASN" + }, + "vnf_instance_name": { + "displayName": "vnf_instance_name", + "command": "get_input", + "inputName": "2017488_adiodvpe0_vnf_instance_name" + } + }, + "properties": { + "vmxvre_retype": "RE-VMX", + "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version", + "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d", + "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9", + "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF", + "int_ctl_net_name": "VMX-INTXI", + "vmx_int_ctl_prefix": "10.0.0.10", + "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5", + "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279", + "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a", + "nf_type": "vPE", + "vmxvpfe_int_ctl_ip_1": "10.0.0.10", + "is_AVPN_service": "false", + "vmx_RSG_name": "vREXI-affinity", + "vmx_int_ctl_forwarding": "l2", + "vmxvre_oam_ip_0": "10.0.0.10", + "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvpfe_sriov41_0_port_vlanstrip": "false", + "vmxvpfe_sriov42_0_port_vlanfilter": "4001", + "vmxvpfe_sriov44_0_port_unknownunicastallow": "true", + "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2", + "vmxvre_instance": "0", + "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvre_flavor_name": "ns.c1r16d32.v5", + "vmxvpfe_volume_size_0": "40.0", + "vmxvpfe_sriov43_0_port_vlanfilter": "4001", + "nf_naming": "{ecomp_generated_naming=false}", + "nf_naming_code": "Navneet", + "vmxvre_name_0": "vREXI", + "vmxvpfe_sriov42_0_port_vlanstrip": "false", + "vmxvpfe_volume_name_0": "vPFEXI_FBVolume", + "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141", + "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2", + "vmxvpfe_sriov43_0_port_unknownunicastallow": "true", + "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true", + "vmxvre_console": "vidconsole", + "vmxvpfe_sriov44_0_port_vlanfilter": "4001", + "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3", + "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true", + "min_instances": "1", + "vmxvpfe_sriov44_0_port_vlanstrip": "false", + "vf_module_id": "123", + "nf_function": "JAI", + "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true", + "vmxvre_int_ctl_ip_0": "10.0.0.10", + "ecomp_generated_naming": "false", + "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI", + "vnf_name": "mtnj309me6vre", + "vmxvpfe_sriov41_0_port_unknownunicastallow": "true", + "vmxvre_volume_type_1": "HITACHI", + "vmxvpfe_sriov44_0_port_broadcastallow": "true", + "vmxvre_volume_type_0": "HITACHI", + "vmxvpfe_volume_type_0": "HITACHI", + "vmxvpfe_sriov43_0_port_broadcastallow": "true", + "bandwidth_units": "get_input:adiodvpe0_bandwidth_units", + "vnf_id": "123", + "vmxvre_oam_prefix": "24", + "availability_zone_0": "mtpocfo-kvm-az01", + "ASN": "get_input:2017488_adiodvpe0_ASN", + "vmxvre_chassis_i2cid": "161", + "vmxvpfe_name_0": "vPFEXI", + "bandwidth": "get_input:adiodvpe0_bandwidth", + "availability_zone_max_count": "1", + "vmxvre_volume_size_0": "45.0", + "vmxvre_volume_size_1": "50.0", + "vmxvpfe_sriov42_0_port_broadcastallow": "true", + "vmxvre_oam_gateway": "10.0.0.10", + "vmxvre_volume_name_1": "vREXI_FAVolume", + "vmxvre_ore_present": "0", + "vmxvre_volume_name_0": "vREXI_FBVolume", + "vmxvre_type": "0", + "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name", + "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true", + "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429", + "vmx_int_ctl_len": "24", + "vmxvpfe_sriov43_0_port_vlanstrip": "false", + "vmxvpfe_sriov41_0_port_broadcastallow": "true", + "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d", + "vmxvpfe_sriov41_0_port_vlanfilter": "4001", + "nf_role": "Testing", + "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a", + "vmxvpfe_sriov42_0_port_unknownunicastallow": "true", + "vmxvpfe_flavor_name": "ns.c20r16d25.v5" + }, + "type": "VF", + "modelCustomizationName": "2017-388_ADIOD-vPE 0", + "vfModules": {}, + "volumeGroups": {}, + "vfcInstanceGroups": {} + }, + "2017-488_ADIOD-vPE 0": { + "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09", + "invariantUuid": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8", + "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM", + "name": "2017-488_ADIOD-vPE", + "version": "5.0", + "customizationUuid": "1da7b585-5e61-4993-b95e-8e6606c81e45", + "inputs": { + "vnf_config_template_version": { + "type": "string", + "description": "VPE Software Version", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "17.2" + }, + "bandwidth_units": { + "type": "string", + "description": "Units of bandwidth", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "Gbps" + }, + "bandwidth": { + "type": "string", + "description": "Requested VPE bandwidth", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "10" + }, + "AIC_CLLI": { + "type": "string", + "description": "AIC Site CLLI", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "ATLMY8GA" + }, + "ASN": { + "type": "string", + "description": "AV/PE", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "AV_vPE" + }, + "vnf_instance_name": { + "type": "string", + "description": "The hostname assigned to the vpe.", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "mtnj309me6" + } + }, + "commands": { + "vnf_config_template_version": { + "displayName": "vnf_config_template_version", + "command": "get_input", + "inputName": "2017488_adiodvpe0_vnf_config_template_version" + }, + "bandwidth_units": { + "displayName": "bandwidth_units", + "command": "get_input", + "inputName": "adiodvpe0_bandwidth_units" + }, + "bandwidth": { + "displayName": "bandwidth", + "command": "get_input", + "inputName": "adiodvpe0_bandwidth" + }, + "AIC_CLLI": { + "displayName": "AIC_CLLI", + "command": "get_input", + "inputName": "2017488_adiodvpe0_AIC_CLLI" + }, + "ASN": { + "displayName": "ASN", + "command": "get_input", + "inputName": "2017488_adiodvpe0_ASN" + }, + "vnf_instance_name": { + "displayName": "vnf_instance_name", + "command": "get_input", + "inputName": "2017488_adiodvpe0_vnf_instance_name" + } + }, + "properties": { + "vmxvre_retype": "RE-VMX", + "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version", + "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d", + "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9", + "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF", + "int_ctl_net_name": "VMX-INTXI", + "vmx_int_ctl_prefix": "10.0.0.10", + "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5", + "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279", + "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a", + "nf_type": "vPE", + "vmxvpfe_int_ctl_ip_1": "10.0.0.10", + "is_AVPN_service": "false", + "vmx_RSG_name": "vREXI-affinity", + "vmx_int_ctl_forwarding": "l2", + "vmxvre_oam_ip_0": "10.0.0.10", + "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvpfe_sriov41_0_port_vlanstrip": "false", + "vmxvpfe_sriov42_0_port_vlanfilter": "4001", + "vmxvpfe_sriov44_0_port_unknownunicastallow": "true", + "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2", + "vmxvre_instance": "0", + "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvre_flavor_name": "ns.c1r16d32.v5", + "vmxvpfe_volume_size_0": "40.0", + "vmxvpfe_sriov43_0_port_vlanfilter": "4001", + "nf_naming": "{ecomp_generated_naming=false}", + "nf_naming_code": "Navneet", + "vmxvre_name_0": "vREXI", + "vmxvpfe_sriov42_0_port_vlanstrip": "false", + "vmxvpfe_volume_name_0": "vPFEXI_FBVolume", + "max_instances": "3", + "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141", + "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2", + "vmxvpfe_sriov43_0_port_unknownunicastallow": "true", + "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true", + "vmxvre_console": "vidconsole", + "vmxvpfe_sriov44_0_port_vlanfilter": "4001", + "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3", + "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true", + "min_instances": "1", + "vmxvpfe_sriov44_0_port_vlanstrip": "false", + "vf_module_id": "123", + "nf_function": "JAI", + "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true", + "vmxvre_int_ctl_ip_0": "10.0.0.10", + "ecomp_generated_naming": "false", + "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI", + "vnf_name": "mtnj309me6vre", + "vmxvpfe_sriov41_0_port_unknownunicastallow": "true", + "vmxvre_volume_type_1": "HITACHI", + "vmxvpfe_sriov44_0_port_broadcastallow": "true", + "vmxvre_volume_type_0": "HITACHI", + "vmxvpfe_volume_type_0": "HITACHI", + "vmxvpfe_sriov43_0_port_broadcastallow": "true", + "bandwidth_units": "get_input:adiodvpe0_bandwidth_units", + "vnf_id": "123", + "vmxvre_oam_prefix": "24", + "availability_zone_0": "mtpocfo-kvm-az01", + "ASN": "get_input:2017488_adiodvpe0_ASN", + "vmxvre_chassis_i2cid": "161", + "vmxvpfe_name_0": "vPFEXI", + "bandwidth": "get_input:adiodvpe0_bandwidth", + "availability_zone_max_count": "1", + "vmxvre_volume_size_0": "45.0", + "vmxvre_volume_size_1": "50.0", + "vmxvpfe_sriov42_0_port_broadcastallow": "true", + "vmxvre_oam_gateway": "10.0.0.10", + "vmxvre_volume_name_1": "vREXI_FAVolume", + "vmxvre_ore_present": "0", + "vmxvre_volume_name_0": "vREXI_FBVolume", + "vmxvre_type": "0", + "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name", + "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true", + "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429", + "vmx_int_ctl_len": "24", + "vmxvpfe_sriov43_0_port_vlanstrip": "false", + "vmxvpfe_sriov41_0_port_broadcastallow": "true", + "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d", + "vmxvpfe_sriov41_0_port_vlanfilter": "4001", + "nf_role": "Testing", + "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a", + "vmxvpfe_sriov42_0_port_unknownunicastallow": "true", + "vmxvpfe_flavor_name": "ns.c20r16d25.v5" + }, + "type": "VF", + "modelCustomizationName": "2017-488_ADIOD-vPE 0", + "vfModules": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": { + "uuid": "25284168-24bb-4698-8cb4-3f509146eca5", + "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1", + "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vRE_BV", + "baseModule": false + }, + "inputs": { + "vnf_config_template_version": { + "type": "string", + "description": "VPE Software Version", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "vnf_config_template_version" + }, + "fromInputName": "2017488_adiodvpe0_vnf_config_template_version", + "constraints": null, + "required": true, + "default": "17.2" + }, + "bandwidth_units": { + "type": "string", + "description": "Units of bandwidth", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "bandwidth_units" + }, + "fromInputName": "adiodvpe0_bandwidth_units", + "constraints": null, + "required": true, + "default": "Gbps" + }, + "bandwidth": { + "type": "string", + "description": "Requested VPE bandwidth", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "bandwidth" + }, + "fromInputName": "adiodvpe0_bandwidth", + "constraints": null, + "required": true, + "default": "10" + }, + "AIC_CLLI": { + "type": "string", + "description": "AIC Site CLLI", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "AIC_CLLI" + }, + "fromInputName": "2017488_adiodvpe0_AIC_CLLI", + "constraints": null, + "required": true, + "default": "ATLMY8GA" + }, + "vnf_instance_name": { + "type": "string", + "description": "The hostname assigned to the vpe.", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "vnf_instance_name" + }, + "fromInputName": "2017488_adiodvpe0_vnf_instance_name", + "constraints": null, + "required": true, + "default": "mtnj309me6" + } + }, + "volumeGroupAllowed": true + }, + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": { + "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db", + "invariantUuid": "b34833bb-6aa9-4ad6-a831-70b06367a091", + "customizationUuid": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3", + "description": null, + "name": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0", + "version": "5", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0", + "properties": { + "minCountInstances": 1, + "maxCountInstances": 1, + "initialCount": 1, + "vfModuleLabel": "ADIOD_base_vPE_BV", + "baseModule": true + }, + "inputs": {}, + "volumeGroupAllowed": false + }, + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": { + "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a", + "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339", + "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vPFE_BV", + "baseModule": false + }, + "inputs": {}, + "volumeGroupAllowed": true + } + }, + "volumeGroups": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": { + "uuid": "25284168-24bb-4698-8cb4-3f509146eca5", + "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1", + "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vRE_BV", + "baseModule": false + }, + "inputs": { + "vnf_config_template_version": { + "type": "string", + "description": "VPE Software Version", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "vnf_config_template_version" + }, + "fromInputName": "2017488_adiodvpe0_vnf_config_template_version", + "constraints": null, + "required": true, + "default": "17.2" + }, + "bandwidth_units": { + "type": "string", + "description": "Units of bandwidth", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "bandwidth_units" + }, + "fromInputName": "adiodvpe0_bandwidth_units", + "constraints": null, + "required": true, + "default": "Gbps" + }, + "bandwidth": { + "type": "string", + "description": "Requested VPE bandwidth", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "bandwidth" + }, + "fromInputName": "adiodvpe0_bandwidth", + "constraints": null, + "required": true, + "default": "10" + }, + "AIC_CLLI": { + "type": "string", + "description": "AIC Site CLLI", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "AIC_CLLI" + }, + "fromInputName": "2017488_adiodvpe0_AIC_CLLI", + "constraints": null, + "required": true, + "default": "ATLMY8GA" + }, + "vnf_instance_name": { + "type": "string", + "description": "The hostname assigned to the vpe.", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "vnf_instance_name" + }, + "fromInputName": "2017488_adiodvpe0_vnf_instance_name", + "constraints": null, + "required": true, + "default": "mtnj309me6" + } + } + }, + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": { + "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a", + "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339", + "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vPFE_BV", + "baseModule": false + }, + "inputs": {} + } + }, + "vfcInstanceGroups": {} + } + }, + "networks": {}, + "collectionResource": {}, + "configurations": {}, + "fabricConfigurations": {}, + "serviceProxies": {}, + "vfModules": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": { + "uuid": "25284168-24bb-4698-8cb4-3f509146eca5", + "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1", + "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vRE_BV", + "baseModule": false + }, + "inputs": { + "vnf_config_template_version": { + "type": "string", + "description": "VPE Software Version", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "vnf_config_template_version" + }, + "fromInputName": "2017488_adiodvpe0_vnf_config_template_version", + "constraints": null, + "required": true, + "default": "17.2" + }, + "bandwidth_units": { + "type": "string", + "description": "Units of bandwidth", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "bandwidth_units" + }, + "fromInputName": "adiodvpe0_bandwidth_units", + "constraints": null, + "required": true, + "default": "Gbps" + }, + "bandwidth": { + "type": "string", + "description": "Requested VPE bandwidth", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "bandwidth" + }, + "fromInputName": "adiodvpe0_bandwidth", + "constraints": null, + "required": true, + "default": "10" + }, + "AIC_CLLI": { + "type": "string", + "description": "AIC Site CLLI", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "AIC_CLLI" + }, + "fromInputName": "2017488_adiodvpe0_AIC_CLLI", + "constraints": null, + "required": true, + "default": "ATLMY8GA" + }, + "vnf_instance_name": { + "type": "string", + "description": "The hostname assigned to the vpe.", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "vnf_instance_name" + }, + "fromInputName": "2017488_adiodvpe0_vnf_instance_name", + "constraints": null, + "required": true, + "default": "mtnj309me6" + } + }, + "volumeGroupAllowed": true + }, + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": { + "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db", + "invariantUuid": "b34833bb-6aa9-4ad6-a831-70b06367a091", + "customizationUuid": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3", + "description": null, + "name": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0", + "version": "5", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0", + "properties": { + "minCountInstances": 1, + "maxCountInstances": 1, + "initialCount": 1, + "vfModuleLabel": "ADIOD_base_vPE_BV", + "baseModule": true + }, + "inputs": {}, + "volumeGroupAllowed": false + }, + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": { + "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a", + "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339", + "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vPFE_BV", + "baseModule": false + }, + "inputs": {}, + "volumeGroupAllowed": true + } + }, + "volumeGroups": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": { + "uuid": "25284168-24bb-4698-8cb4-3f509146eca5", + "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1", + "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vRE_BV", + "baseModule": false + }, + "inputs": { + "vnf_config_template_version": { + "type": "string", + "description": "VPE Software Version", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "vnf_config_template_version" + }, + "fromInputName": "2017488_adiodvpe0_vnf_config_template_version", + "constraints": null, + "required": true, + "default": "17.2" + }, + "bandwidth_units": { + "type": "string", + "description": "Units of bandwidth", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "bandwidth_units" + }, + "fromInputName": "adiodvpe0_bandwidth_units", + "constraints": null, + "required": true, + "default": "Gbps" + }, + "bandwidth": { + "type": "string", + "description": "Requested VPE bandwidth", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "bandwidth" + }, + "fromInputName": "adiodvpe0_bandwidth", + "constraints": null, + "required": true, + "default": "10" + }, + "AIC_CLLI": { + "type": "string", + "description": "AIC Site CLLI", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "AIC_CLLI" + }, + "fromInputName": "2017488_adiodvpe0_AIC_CLLI", + "constraints": null, + "required": true, + "default": "ATLMY8GA" + }, + "vnf_instance_name": { + "type": "string", + "description": "The hostname assigned to the vpe.", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "vnf_instance_name" + }, + "fromInputName": "2017488_adiodvpe0_vnf_instance_name", + "constraints": null, + "required": true, + "default": "mtnj309me6" + } + } + }, + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": { + "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a", + "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339", + "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vPFE_BV", + "baseModule": false + }, + "inputs": {} + } + }, + "pnfs": {} + } + } + +}); diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/vnf/vnf.model.info.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/vnf/vnf.model.info.ts new file mode 100644 index 000000000..cec3fad1e --- /dev/null +++ b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/vnf/vnf.model.info.ts @@ -0,0 +1,332 @@ +import {DynamicInputsService} from "../../dynamicInputs.service"; +import {ILevelNodeInfo} from "../basic.model.info"; +import {VFModuleModelInfo} from "../vfModule/vfModule.model.info"; +import {VNFModel} from "../../../../../shared/models/vnfModel"; +import {VnfInstance} from "../../../../../shared/models/vnfInstance"; +import {VnfTreeNode} from "../../../../../shared/models/vnfTreeNode"; +import {InputType} from "../../../../../shared/models/inputTypes"; +import {SharedTreeService} from "../../shared.tree.service"; +import {NgRedux} from "@angular-redux/store"; +import {AppState} from "../../../../../shared/store/reducers"; +import {DefaultDataGeneratorService} from "../../../../../shared/services/defaultDataServiceGenerator/default.data.generator.service"; +import { + GenericFormPopupComponent, + PopupType +} from "../../../../../shared/components/genericFormPopup/generic-form-popup.component"; +import {DialogService} from 'ng2-bootstrap-modal'; +import {VnfPopupService} from "../../../../../shared/components/genericFormPopup/genericFormServices/vnf/vnf.popup.service"; +import {VfModulePopuopService} from "../../../../../shared/components/genericFormPopup/genericFormServices/vfModule/vfModule.popuop.service"; +import {ITreeNode} from "angular-tree-component/dist/defs/api"; +import {AvailableNodeIcons} from "../../../available-models-tree/available-models-tree.service"; +import {DuplicateService} from "../../../duplicate/duplicate.service"; +import {DuplicateVnfComponent} from "../../../duplicate/duplicate-vnf.component"; +import {SdcUiServices} from "onap-ui-angular"; +import {IframeService} from "../../../../../shared/utils/iframe.service"; +import {changeInstanceCounter, removeInstance} from "../../../../../shared/storeUtil/utils/general/general.actions"; +import {MessageBoxData} from "../../../../../shared/components/messageBox/messageBox.data"; +import {MessageBoxService} from "../../../../../shared/components/messageBox/messageBox.service"; +import {ServiceInstanceActions} from "../../../../../shared/models/serviceInstanceActions"; +import { + deleteActionVnfInstance, + undoDeleteActionVnfInstance, + updateVnfPosition +} from "../../../../../shared/storeUtil/utils/vnf/vnf.actions"; +import * as _ from 'lodash'; +import {IModalConfig} from "onap-ui-angular/dist/modals/models/modal-config"; +import {ComponentInfoModel, ComponentInfoType} from "../../../component-info/component-info-model"; +import {ComponentInfoService} from "../../../component-info/component-info.service"; +import {ModelInformationItem} from "../../../../../shared/components/model-information/model-information.component"; + +export class VnfModelInfo implements ILevelNodeInfo { + constructor(private _dynamicInputsService: DynamicInputsService, + private _sharedTreeService: SharedTreeService, + private _defaultDataGeneratorService: DefaultDataGeneratorService, + private _dialogService: DialogService, + private _vnfPopupService: VnfPopupService, + private _vfModulePopupService: VfModulePopuopService, + private _duplicateService: DuplicateService, + private modalService: SdcUiServices.ModalService, + private _iframeService: IframeService, + private _componentInfoService: ComponentInfoService, + private _store: NgRedux<AppState>) { + } + + name: string = 'vnfs'; + type: string = 'VNF'; + childName: string = 'vfModules'; + childType: string = 'VFModuleModelInfo'; + typeName: string = 'VNF'; + + /*********************************************************** + * return if user should provide instance name or not. + * @param currentModel - current Model object + ************************************************************/ + isEcompGeneratedNaming = (currentModel): boolean => { + const ecompGeneratedNaming = currentModel.properties.ecomp_generated_naming; + return ecompGeneratedNaming === "true"; + }; + + /*********************************************************** + * return model dynamic inputs + * @param currentModel - current Model object + ************************************************************/ + updateDynamicInputsDataFromModel = (currentModel): any => { + let displayInputs; + return _.isEmpty(displayInputs) ? [] : this._dynamicInputsService.getArbitraryInputs(displayInputs); + }; + + /*********************************************************** + * return vnf model + * @param vnfModelId - current Model id + * @param instance - vnf instance + * @param serviceHierarchy - serviceHierarchy + ************************************************************/ + getModel = (vnfModelId: string, instance: VnfInstance, serviceHierarchy): VNFModel => { + const originalModelName = instance.originalName ? instance.originalName : vnfModelId; + return new VNFModel(serviceHierarchy[this.name][originalModelName]); + }; + + + /*********************************************************** + * return vnf instance tree node + * @param instance - vnf instance + * @param model - vnf model + * @param parentModel + * @param storeKey - store key if exist + ************************************************************/ + createInstanceTreeNode = (instance: VnfInstance, model: VNFModel, parentModel, storeKey: string): VnfTreeNode => { + let node = new VnfTreeNode(instance, model, storeKey); + node.missingData = this.hasMissingData(instance, node, model.isEcompGeneratedNaming); + node.typeName = this.typeName; + node.menuActions = this.getMenuAction(<any>node, model.uuid); + node.isFailed = _.isNil(instance.isFailed) ? false : instance.isFailed; + node.statusMessage = !_.isNil(instance.statusMessage) ? instance.statusMessage: ""; + node = this._sharedTreeService.addingStatusProperty(node); + return node; + }; + + /*********************************************************** + * return next level object (VFModule) + ************************************************************/ + getNextLevelObject = (): VFModuleModelInfo => { + return new VFModuleModelInfo(this._dynamicInputsService, this._sharedTreeService, this._dialogService, this._vfModulePopupService, this._iframeService, this._store, this._componentInfoService); + }; + + /*********************************************************** + * return if instance has missing data + * @param instance - vnf instance + * @param dynamicInputs + * @param isEcompGeneratedNaming + ************************************************************/ + hasMissingData(instance, dynamicInputs: any, isEcompGeneratedNaming: boolean): boolean { + return this._sharedTreeService.hasMissingData(instance, dynamicInputs, isEcompGeneratedNaming, [InputType.LCP_REGION, InputType.TENANT, InputType.PLATFORM]); + } + + getTooltip = (): string => 'VF'; + + getType = (): string => 'VF'; + + /*********************************************************** + * return if instance has missing data + * @param node - VNF node + * @param serviceModelId - current service id + ************************************************************/ + onClickAdd(node, serviceModelId: string): void { + this._dialogService.addDialog(GenericFormPopupComponent, { + type: PopupType.VNF, + uuidData: <any>{ + serviceId: serviceModelId, + modelName: node.data.name, + vnfStoreKey: null, + modelId: node.data.modelVersionId, + type: node.data.type, + popupService: this._vnfPopupService + }, + node: node, + isUpdateMode: false + }) + } + + /*********************************************************** + * return number of existing instances + * @param node - VNF node + * @param serviceModelId - current service id + ************************************************************/ + getNodeCount(node: ITreeNode, serviceModelId: string): number { + let map = null; + if (!_.isNil(this._store.getState().service.serviceInstance[serviceModelId])) { + map = this._store.getState().service.serviceInstance[serviceModelId].existingVNFCounterMap || 0; + + if (!_.isNil(map)) { + let count = map[node.data.modelUniqueId] || 0; + count -= this._sharedTreeService.getExistingInstancesWithDeleteMode(node, serviceModelId, 'vnfs'); + return count; + } + } + return 0; + } + + /*********************************************************** + * should show node icon + * @param node - current ITrees node + * @param serviceModelId - service id + ************************************************************/ + showNodeIcons(node: ITreeNode, serviceModelId: string): AvailableNodeIcons { + let counter: number = !_.isNil(this._store.getState().service.serviceInstance[serviceModelId]) ? + (this._store.getState().service.serviceInstance[serviceModelId].existingVNFCounterMap[node.data.modelUniqueId] || 0) : 0; + counter -= this._sharedTreeService.getExistingInstancesWithDeleteMode(node, serviceModelId, 'vnfs'); + + const properties = this._store.getState().service.serviceHierarchy[serviceModelId].vnfs[node.data.name].properties; + const maxInstances: number = !_.isNil(properties) ? (properties.max_instances || 1) : 1; + const isReachedLimit = !(maxInstances > counter); + const showAddIcon = this._sharedTreeService.shouldShowAddIcon() && !isReachedLimit; + return new AvailableNodeIcons(showAddIcon, isReachedLimit) + } + + getMenuAction(node: ITreeNode, serviceModelId: string): { [methodName: string]: { method: Function, visible: Function, enable: Function } } { + return <any>{ + edit: { + method: (node, serviceModelId) => { + this._iframeService.addClassOpenModal('content'); + this._dialogService.addDialog(GenericFormPopupComponent, { + type: PopupType.VNF, + uuidData: <any>{ + serviceId: serviceModelId, + modelName: node.data.modelName, + vnfStoreKey: node.data.vnfStoreKey, + modelId: node.data.modelId, + type: node.data.type, + popupService: this._vnfPopupService + }, + node: node, + isUpdateMode: true + }); + }, + visible: (node) => this._sharedTreeService.shouldShowRemoveAndEdit(node), + enable: (node) => this._sharedTreeService.shouldShowRemoveAndEdit(node), + }, + showAuditInfo: { + method: (node, serviceModelId) => { + const instance = this._store.getState().service.serviceInstance[serviceModelId].vnfs[node.data.vnfStoreKey]; + this._sharedTreeService.openAuditInfoModal(node, serviceModelId, instance, 'VNF', this); + }, + visible: (node) => this._sharedTreeService.shouldShowAuditInfo(node), + enable: (node) => this._sharedTreeService.shouldShowAuditInfo(node) + }, + duplicate: { + method: (node, serviceModelId) => { + if (this._store.getState().global.flags['FLAG_DUPLICATE_VNF']) { + const storeKey = node.data.vnfStoreKey; + let modalConfig: IModalConfig = this._duplicateService.openDuplicateModal(serviceModelId, node.data.modelUniqueId, node.data.modelName, storeKey, 1, this._store, node); + this.modalService.openCustomModal(modalConfig, DuplicateVnfComponent); + } + }, + visible: (node) => this._sharedTreeService.shouldShowDuplicate(node) && !_.isNil(node.data) && !_.isNil(node.data.action) && node.data.action === ServiceInstanceActions.Create && this._duplicateService.canDuplicate(node), + enable: (node, serviceModelId) => this._duplicateService.isEnabled(node, this._store, serviceModelId) + }, + remove: { + method: (node, serviceModelId) => { + if ((!_.isNil(node.data.children) && node.data.children.length === 0) || _.isNil(node.data.children)) { + let storeKey: string = node.data.vnfStoreKey; + this._store.dispatch(removeInstance(node.data.vnfStoreKey, serviceModelId, storeKey, node)); + this._store.dispatch(changeInstanceCounter(node.data.modelUniqueId, serviceModelId, -1, node)); + this._sharedTreeService.selectedVNF = null; + } else { + let messageBoxData: MessageBoxData = new MessageBoxData( + "Remove VNF", // modal title + "You are about to remove this VNF and all its children from this service. Are you sure you want to remove it?", + <any>"warning", + <any>"md", + [ + { + text: "Remove VNF", + size: "large", + callback: this.removeVnf.bind(this, node, serviceModelId), + closeModal: true + }, + {text: "Don’t Remove", size: "medium", closeModal: true} + ]); + + MessageBoxService.openModal.next(messageBoxData); + } + }, + visible: (node) => this._sharedTreeService.shouldShowRemoveAndEdit(node), + enable: (node) => this._sharedTreeService.shouldShowRemoveAndEdit(node), + }, + delete: { + method: (node, serviceModelId) => { + if ((!_.isNil(node.data.children) && node.data.children.length === 0) || _.isNil(node.data.children)) { + this._store.dispatch(deleteActionVnfInstance(node.data.vnfStoreKey, serviceModelId)); + } else { + this._sharedTreeService.shouldShowDeleteInstanceWithChildrenModal(node, serviceModelId, (node, serviceModelId) => { + this._sharedTreeService.removeDeleteAllChild(node, serviceModelId, (node, serviceModelId) => { + this._store.dispatch(deleteActionVnfInstance(node.data.vnfStoreKey, serviceModelId)); + }); + }); + } + }, + visible: (node) => this._sharedTreeService.shouldShowDelete(node), + enable: (node) => this._sharedTreeService.shouldShowDelete(node) + }, + undoDelete: { + method: (node, serviceModelId) => { + if ((!_.isNil(node.data.children) && node.data.children.length === 0) || _.isNil(node.data.children)) { + this._store.dispatch(undoDeleteActionVnfInstance(node.data.vnfStoreKey, serviceModelId)); + } else { + this._sharedTreeService.undoDeleteAllChild(node, serviceModelId, (node, serviceModelId) => { + this._store.dispatch(undoDeleteActionVnfInstance(node.data.vnfStoreKey, serviceModelId)); + }); + } + }, + visible: (node) => this._sharedTreeService.shouldShowUndoDelete(node), + enable: (node, serviceModelId) => this._sharedTreeService.shouldShowUndoDelete(node) && !this._sharedTreeService.isServiceOnDeleteMode(serviceModelId) + } + } + } + + removeVnf(this, node, serviceModelId) { + this._store.dispatch(removeInstance(node.data.modelName, serviceModelId, node.data.vnfStoreKey, node)); + this._store.dispatch(changeInstanceCounter(node.data.modelUniqueId, serviceModelId, -1, node)); + this._sharedTreeService.selectedVNF = null; + } + + /*********************************************************** + * should update node position inside the tree + * @param node - current ITrees node + ************************************************************/ + updatePosition(that, node, instanceId): void { + that.store.dispatch(updateVnfPosition(node, instanceId, node.vnfStoreKey)); + } + + /*********************************************************** + * return the position of the current node in the tree + * @param instance - current ITrees node instance + ************************************************************/ + getNodePosition(instance): number { + return !_.isNil(instance) ? instance.position : null; + } + + /*********************************************************** + * When user is click on some nod element + * @param node - current ITrees node + ************************************************************/ + onSelectedNode(node: ITreeNode): void { + ComponentInfoService.triggerComponentInfoChange.next(new ComponentInfoModel(ComponentInfoType.VNF,[], [])); + } + + getInfoForVnf(model, instance): ComponentInfoModel { + let modelInfoItems: ModelInformationItem[] = []; + if (model) { + modelInfoItems.push(ModelInformationItem.createInstance("Min Instances", model.min)); + modelInfoItems.push(ModelInformationItem.createInstance("Max Instances", model.max)); + } + if (instance) { + modelInfoItems.push(ModelInformationItem.createInstance("NF Type", instance.nfType)); + modelInfoItems.push(ModelInformationItem.createInstance("NF Role", instance.nfRole)); + } + return this._componentInfoService.addGeneralInfoItems(modelInfoItems, ComponentInfoType.VNF, model, instance); + + } + + +} diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/vnfGrouping/vnfGrouping.model.info.spec.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/vnfGrouping/vnfGrouping.model.info.spec.ts new file mode 100644 index 000000000..532a8fe17 --- /dev/null +++ b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/vnfGrouping/vnfGrouping.model.info.spec.ts @@ -0,0 +1,291 @@ + +import {HttpClientTestingModule, HttpTestingController} from "@angular/common/http/testing"; +import {getTestBed, TestBed} from "@angular/core/testing"; +import {MockNgRedux, NgReduxTestingModule} from "@angular-redux/store/testing"; +import {VnfGroupingModelInfo} from "./vnfGrouping.model.info"; +import {DynamicInputsService} from "../../dynamicInputs.service"; +import {SharedTreeService} from "../../shared.tree.service"; +import {VnfGroupPopupService} from "../../../../../shared/components/genericFormPopup/genericFormServices/vnfGroup/vnfGroup.popup.service"; +import {DialogService} from "ng2-bootstrap-modal"; +import {AvailableNodeIcons} from "../../../available-models-tree/available-models-tree.service"; +import {VnfGroupModel} from "../../../../../shared/models/vnfGroupModel"; +import {IframeService} from "../../../../../shared/utils/iframe.service"; +import {ActivatedRoute} from "@angular/router"; +import {RouterTestingModule} from "@angular/router/testing"; +import {DrawingBoardModes} from "../../../drawing-board.modes"; + +describe('VnfGroupingModelInfo Model Info', () => { + let injector; + let _dialogService : DialogService; + let _vnfGroupPopupService : VnfGroupPopupService; + let _dynamicInputsService : DynamicInputsService; + let _sharedTreeService : SharedTreeService; + let _iframeService : IframeService; + let vnfGroupModel: VnfGroupingModelInfo; + beforeAll(done => (async () => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule, NgReduxTestingModule, RouterTestingModule], + providers: [ + DialogService, + VnfGroupPopupService, + DynamicInputsService, + SharedTreeService, + IframeService, + MockNgRedux] + }); + await TestBed.compileComponents(); + injector = getTestBed(); + _sharedTreeService = injector.get(SharedTreeService); + + vnfGroupModel = new VnfGroupingModelInfo(_dynamicInputsService, _sharedTreeService, _dialogService, _vnfGroupPopupService, _iframeService, MockNgRedux.getInstance()); + })().then(done).catch(done.fail)); + + + test('VnfGroupingModelInfo should be defined', () => { + expect(vnfGroupModel).toBeDefined(); + }); + + test('VnfGroupingModelInfo should defined extra details', () => { + expect(vnfGroupModel.name).toEqual('vnfGroups'); + expect(vnfGroupModel.type).toEqual('VnfGroup'); + }); + + test('isEcompGeneratedNaming should return true if vnf group has isEcompGeneratedNaming is "true" ', () => { + let isEcompGeneratedNaming : boolean = vnfGroupModel.isEcompGeneratedNaming({ + properties: { + ecomp_generated_naming: 'true' + } + }); + expect(isEcompGeneratedNaming).toBeTruthy(); + }); + + + test('getTooltip should return "vnfGrouping"', () => { + let tooltip: string = vnfGroupModel.getTooltip(); + expect(tooltip).toEqual('VnfGroup'); + }); + + test('getType should return "vnfGrouping"', () => { + let tooltip: string = vnfGroupModel.getType(); + expect(tooltip).toEqual('VnfGroup'); + }); + + test('getNextLevelObject should return null', () => { + let nextLevel = vnfGroupModel.getNextLevelObject(); + expect(nextLevel).not.toBeNull(); + }); + + + test('showNodeIcons should return true if not reachLimit of max', ()=>{ + let serviceId : string = 'servicedId'; + let node = { + data : { + id : 'vnfGroupId', + name : 'vnfGroupName' + } + }; + jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({ + global:{ + drawingBoardStatus: "EDIT" + }, + service : { + serviceHierarchy : { + 'servicedId' : { + 'vnfGroups' : { + 'vnfGroupName' : { + 'properties' : { + } + } + } + } + }, + serviceInstance : { + 'servicedId' : { + 'existingVnfGroupCounterMap' : { + 'vnfGroupId' : 1 + }, + 'vnfGroups' : { + 'vnfGroupName' :{ + + } + } + } + } + } + }); + + let result = vnfGroupModel.showNodeIcons(<any>node, serviceId); + expect(result).toEqual(new AvailableNodeIcons(true , false)); + }); + + test('getNodeCount should return number of nodes', ()=>{ + let serviceId : string = 'servicedId'; + jest.spyOn(_sharedTreeService, 'getExistingInstancesWithDeleteMode').mockReturnValue(0); + jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({ + global : {}, + service : { + serviceHierarchy : { + 'servicedId' : { + 'vnfGroups' : { + 'vnfGroupName' : { + 'properties' : { + } + } + } + } + }, + serviceInstance : { + 'servicedId' : { + 'existingVnfGroupCounterMap' : { + 'vnfGroupId' : 1 + }, + 'vnfGroups' : { + 'vnfGroupName' :{ + 'originalName' : 'vnfGroupName' + } + } + } + } + } + }); + + let node = { + data : { + id : 'vnfGroupId', + name : 'vnfGroupName', + modelUniqueId: 'vnfGroupId', + } + }; + let result = vnfGroupModel.getNodeCount(<any>node , serviceId); + expect(result).toEqual(1); + + node.data.modelUniqueId = 'vnfGroupId_notExist'; + result = vnfGroupModel.getNodeCount(<any>node , serviceId); + expect(result).toEqual(0); + + result = vnfGroupModel.getNodeCount(<any>node , serviceId + '_notExist'); + expect(result).toEqual(0); + }); + + test('getModel should return VnfGroup model', () => { + let model: VnfGroupModel = vnfGroupModel.getModel('ResourceGroup0', <any>{ + originalName : 'ResourceGroup0' + }, getServiceHierarchy()); + expect(model.type).toEqual('VnfGroup'); + }); + + test('getMenuAction: showAuditInfoVnfGroup', ()=>{ + + jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({ + global: { + "drawingBoardStatus": DrawingBoardModes.RETRY + } + }); + jest.spyOn(_sharedTreeService, 'isRetryMode').mockReturnValue(true); + let node = { + data : { + "modelId": "6b528779-44a3-4472-bdff-9cd15ec93450", + "action": "Create", + "isFailed": true, + } + }; + let serviceModelId = "6b528779-44a3-4472-bdff-9cd15ec93450"; + let result = vnfGroupModel.getMenuAction(<any>node, serviceModelId); + spyOn(result['showAuditInfo'], 'method'); + expect(result['showAuditInfo']).toBeDefined(); + expect(result['showAuditInfo'].visible(node)).toBeTruthy(); + expect(result['showAuditInfo'].enable(node)).toBeTruthy(); + result['showAuditInfo']['method'](node, serviceModelId); + expect(result['showAuditInfo']['method']).toHaveBeenCalledWith(node, serviceModelId); + }); + + function getServiceHierarchy(){ + return { + "service": { + "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450", + "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0", + "name": "action-data", + "version": "1.0", + "toscaModelURL": null, + "category": "", + "serviceType": "", + "serviceRole": "", + "description": "", + "serviceEcompNaming": "false", + "instantiationType": "Macro", + "inputs": { + "2017488_adiodvpe0_ASN": { + "type": "string", + "description": "AV/PE", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "AV_vPE" + } + }, + "vidNotions": { + "instantiationUI": "legacy", + "modelCategory": "other" + } + }, + "vnfGroups": { + "ResourceGroup0": { + "type": "VnfGroup", + "uuid": "0903e1c0-8e03-4936-b5c2-260653b96413", + "invariantUuid": "00beb8f9-6d39-452f-816d-c709b9cbb87d", + "version": "1", + "name": "ResourceGroup0", + "modelCustomizationName": "ResourceGroup0", + "properties": { + "contained_resource_type": "VF", + "role": "SERVICE-ACCESS", + "function": "DATA", + "description": "DDD0", + "type": "LOAD-GROUP" + }, + "members": { + "vdbe_svc_vprs_proxy 0": { + "uuid": "65fadfa8-a0d9-443f-95ad-836cd044e26c", + "invariantUuid": "f4baae0c-b3a5-4ca1-a777-afbffe7010bc", + "description": "A Proxy for Service vDBE_Svc_vPRS", + "name": "vDBE_Svc_vPRS Service Proxy", + "version": "1.0", + "customizationUuid": "bdb63d23-e132-4ce7-af2c-a493b4cafac9", + "inputs": {}, + "commands": {}, + "properties": {}, + "type": "Service Proxy", + "sourceModelUuid": "da7827a2-366d-4be6-8c68-a69153c61274", + "sourceModelInvariant": "24632e6b-584b-4f45-80d4-fefd75fd9f14", + "sourceModelName": "vDBE_Svc_vPRS" + }, + "vdbe_svc_vprs_proxy 1": { + "uuid": "111dfa8-a0d9-443f-95ad-836cd044e26c", + "invariantUuid": "111ae0c-b3a5-4ca1-a777-afbffe7010bc", + "description": "A Proxy for Service vDBE_Svc_vPRS", + "name": "111_Svc_vPRS Service Proxy", + "version": "1.0", + "customizationUuid": "1113d23-e132-4ce7-af2c-a493b4cafac9", + "inputs": {}, + "commands": {}, + "properties": {}, + "type": "Service Proxy", + "sourceModelUuid": "11127a2-366d-4be6-8c68-a69153c61274", + "sourceModelInvariant": "1112e6b-584b-4f45-80d4-fefd75fd9f14", + "sourceModelName": "111_Svc_vPRS" + } + } + } + }, + "networks": {}, + "collectionResource": {}, + "configurations": {}, + "fabricConfigurations": {}, + "serviceProxies": {}, + "vfModules": {}, + "volumeGroups": {}, + "pnfs": {} + } + } +}); diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/vnfGrouping/vnfGrouping.model.info.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/vnfGrouping/vnfGrouping.model.info.ts new file mode 100644 index 000000000..7f2052a0c --- /dev/null +++ b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/vnfGrouping/vnfGrouping.model.info.ts @@ -0,0 +1,272 @@ +import {ILevelNodeInfo} from "../basic.model.info"; +import {DynamicInputsService} from "../../dynamicInputs.service"; +import {ITreeNode} from "angular-tree-component/dist/defs/api"; +import {AvailableNodeIcons} from "../../../available-models-tree/available-models-tree.service"; +import {VnfGroupModel} from "../../../../../shared/models/vnfGroupModel"; +import {VnfGroupTreeNode} from "../../../../../shared/models/vnfGroupTreeNode"; +import {SharedTreeService} from "../../shared.tree.service"; +import {VnfGroupPopupService} from "../../../../../shared/components/genericFormPopup/genericFormServices/vnfGroup/vnfGroup.popup.service"; +import { + GenericFormPopupComponent, + PopupType +} from "../../../../../shared/components/genericFormPopup/generic-form-popup.component"; +import {DialogService} from 'ng2-bootstrap-modal'; +import {AppState} from "../../../../../shared/store/reducers"; +import {NgRedux} from "@angular-redux/store"; +import {changeInstanceCounter, removeInstance} from "../../../../../shared/storeUtil/utils/general/general.actions"; +import {IframeService} from "../../../../../shared/utils/iframe.service"; +import { + deleteActionVnfGroupInstance, + undoDeleteActionVnfGroupInstance +} from "../../../../../shared/storeUtil/utils/vnfGroup/vnfGroup.actions"; +import {RelatedVnfMemberInfoModel} from "../relatedVnfMember/relatedVnfMember.info.model"; +import {SearchMembersModalComponent} from "../../../../../shared/components/searchMembersModal/search-members-modal.component"; +import * as _ from "lodash"; +import {MessageBoxData} from "../../../../../shared/components/messageBox/messageBox.data"; +import {MessageBoxService} from "../../../../../shared/components/messageBox/messageBox.service"; + +export class VnfGroupingModelInfo implements ILevelNodeInfo { + constructor(private _dynamicInputsService: DynamicInputsService, + private _sharedTreeService: SharedTreeService, + private _dialogService: DialogService, + private _vnfGroupPopupService: VnfGroupPopupService, + private _iframeService: IframeService, + private _store: NgRedux<AppState>) { + } + + name: string = 'vnfGroups'; + type: string = 'VnfGroup'; + typeName: string = 'G'; + childType: string = 'RelatedVnfMemberInfoModel'; + childName: string = 'vnfs'; + limitMembers : number; + + /*********************************************************** + * return if user should provide instance name or not. + * get info from parent (VNF) + * @param currentModel - current Model object + ************************************************************/ + isEcompGeneratedNaming(currentModel): boolean { + const ecompGeneratedNaming = currentModel.properties.ecomp_generated_naming; + return ecompGeneratedNaming === "true"; + } + + /*********************************************************** + * return model dynamic inputs + * @param currentModel - current Model object + ************************************************************/ + updateDynamicInputsDataFromModel = (currentModel): any => { + let displayInputs = currentModel.inputs; + return _.isEmpty(displayInputs) ? [] : this._dynamicInputsService.getArbitraryInputs(displayInputs); + }; + + /*********************************************************** + * return next level object (null because is last level) + ************************************************************/ + getNextLevelObject = (): RelatedVnfMemberInfoModel => { + return new RelatedVnfMemberInfoModel(this._sharedTreeService, this._dynamicInputsService, this._store); + }; + + getTooltip = (): string => 'VnfGroup'; + + getType = (): string => 'VnfGroup'; + + createInstanceTreeNode(instance: any, model: any, parentModel: any, storeKey: string): any { + let node = new VnfGroupTreeNode(instance, model, storeKey); + node.missingData = this.hasMissingData(instance, node, model.isEcompGeneratedNaming); + node = this._sharedTreeService.addingStatusProperty(node); + node.typeName = this.typeName; + node.menuActions = this.getMenuAction(<any>node, model.uuid); + node.isFailed = _.isNil(instance.isFailed) ? false : instance.isFailed; + node.statusMessage = !_.isNil(instance.statusMessage) ? instance.statusMessage: ""; + node.limitMembers = (!_.isNil(model.properties.quantity)) ? model.properties.quantity : null; + return node; + } + + getModel(modelId: string, instance: any, serviceHierarchy): any { + const originalModelName = instance.originalName ? instance.originalName : modelId; + return new VnfGroupModel(serviceHierarchy[this.name][originalModelName]); + } + + hasMissingData(instance, dynamicInputs: any, isEcompGeneratedNaming: boolean): boolean { + return this._sharedTreeService.hasMissingData(instance, dynamicInputs, isEcompGeneratedNaming, []); + } + + onClickAdd(node: ITreeNode, serviceModelId: string): void { + this._dialogService.addDialog(GenericFormPopupComponent, { + type: PopupType.VNF_GROUP, + uuidData: <any>{ + serviceId: serviceModelId, + modelName: node.data.name, + vnfGroupStoreKey: null, + modelId: node.data.modelVersionId, + type: node.data.type, + popupService: this._vnfGroupPopupService + }, + node: node, + isUpdateMode: false + }); + } + + getNodeCount(node: ITreeNode, serviceModelId: string): number { + let map = null; + if (!_.isNil(this._store.getState().service.serviceInstance[serviceModelId])) { + map = this._store.getState().service.serviceInstance[serviceModelId].existingVnfGroupCounterMap || 0; + if (!_.isNil(map)) { + let count = map[node.data.modelUniqueId] || 0; + count -= this._sharedTreeService.getExistingInstancesWithDeleteMode(node, serviceModelId, 'vnfGroups'); + return count; + } + } + return 0; + } + + /*********************************************************** + * should show node icon + * @param node - current ITrees node + * @param serviceModelId - service id + ************************************************************/ + showNodeIcons(node: ITreeNode, serviceModelId: string): AvailableNodeIcons { + const showAddIcon = this._sharedTreeService.shouldShowAddIcon(); + return new AvailableNodeIcons(showAddIcon, false); + } + + getMenuAction(node: ITreeNode, serviceModelId: string): { [methodName: string]: { method: Function, visible: Function, enable: Function } } { + return { + edit: { + method: (node, serviceModelId) => { + this._iframeService.addClassOpenModal('content'); + this._dialogService.addDialog(GenericFormPopupComponent, { + type: PopupType.VNF_GROUP, + uuidData: <any>{ + serviceId: serviceModelId, + modelName: node.data.modelName, + vnfGroupStoreKey: node.data.vnfGroupStoreKey, + modelId: node.data.modelId, + type: node.data.type, + popupService: this._vnfGroupPopupService + }, + node: node, + isUpdateMode: true + }); + }, + visible: (node) => this._sharedTreeService.shouldShowRemoveAndEdit(node), + enable: (node) => this._sharedTreeService.shouldShowRemoveAndEdit(node) + }, + remove: { + method: (node, serviceModelId) => { + if ((!_.isNil(node.data.children) && node.data.children.length === 0) || _.isNil(node.data.children)) { + let storeKey: string = node.data.vnfGroupStoreKey; + this._store.dispatch(removeInstance(node.data.vnfGroupStoreKey, serviceModelId, storeKey, node)); + this._store.dispatch(changeInstanceCounter(node.data.modelUniqueId, serviceModelId, -1, node)); + this._sharedTreeService.selectedVNF = null; + } else { + let messageBoxData: MessageBoxData = new MessageBoxData( + "Remove VNFGroup", // modal title + "You are about to remove this group and all its children from this service. Are you sure you want to remove it?", + <any>"warning", + <any>"md", + [ + { + text: "Remove Group", + size: "large", + callback: this.removeGroup.bind(this, node, serviceModelId), + closeModal: true + }, + {text: "Don’t Remove", size: "medium", closeModal: true} + ]); + + MessageBoxService.openModal.next(messageBoxData); + } + }, + visible: (node) => this._sharedTreeService.shouldShowRemoveAndEdit(node), + enable: (node) => this._sharedTreeService.shouldShowRemoveAndEdit(node) + }, + addGroupMember: { + method: (node, serviceModelId) => { + let serviceHierarchy = this._store.getState().service.serviceHierarchy[serviceModelId]; + let serviceInstance = this._store.getState().service.serviceInstance[serviceModelId]; + let vnfGroupModel = new VnfGroupModel(serviceHierarchy['vnfGroups'][node.data.modelName]); + this._dialogService.addDialog(SearchMembersModalComponent, { + title: 'Add members to group', + description: 'Select VNF instances to associate', + subscriberId: serviceInstance.globalSubscriberId, + serviceType: serviceInstance.subscriptionServiceType, + vnfGroupModel: vnfGroupModel, + serviceModelId: serviceModelId, + node: node.data, + searchFields: [{ + title: 'Service model name', + dataTestId: 'sourceModelName', + value: (Object.values(vnfGroupModel.members))[0].sourceModelName + }, + { + title: 'Service invariant UUID', + dataTestId: 'sourceModelInvariant', + value: (Object.values(vnfGroupModel.members))[0].sourceModelInvariant + }] + } + ); + }, + visible: (node) => !_.isNil(node.data.action) ? node.data.action.split('_').pop() !== 'Delete' : true, + enable: (node) => !_.isNil(node.data.action) ? node.data.action.split('_').pop() !== 'Delete' : true + }, + showAuditInfo: { + method: (node, serviceModelId) => { + let instance = this._store.getState().service.serviceInstance[serviceModelId].vnfGroups[node.data.vnfGroupStoreKey]; + this._sharedTreeService.openAuditInfoModal(node, serviceModelId, instance, 'VNFGROUP', this); + }, + visible: (node) => this._sharedTreeService.shouldShowAuditInfo(node), + enable: (node) => this._sharedTreeService.shouldShowAuditInfo(node) + }, + delete: { + method: (node, serviceModelId) => { + if ((!_.isNil(node.data.children) && node.data.children.length === 0) || _.isNil(node.data.children)) { + this._store.dispatch(deleteActionVnfGroupInstance(node.data.vnfGroupStoreKey, serviceModelId)); + }else { + this._sharedTreeService.shouldShowDeleteInstanceWithChildrenModal(node, serviceModelId, (node, serviceModelId)=>{ + this._sharedTreeService.removeDeleteAllChild(node, serviceModelId, (node, serviceModelId)=>{ + this._store.dispatch(deleteActionVnfGroupInstance(node.data.vnfGroupStoreKey, serviceModelId)); + }); + }); + } + }, + visible: (node) => this._sharedTreeService.shouldShowDelete(node), + enable: (node) => this._sharedTreeService.shouldShowDelete(node) + }, + undoDelete: { + method: (node, serviceModelId) => { + if ((!_.isNil(node.data.children) && node.data.children.length === 0) || _.isNil(node.data.children)) { + this._store.dispatch(undoDeleteActionVnfGroupInstance(node.data.vnfGroupStoreKey, serviceModelId)); + } else { + this._sharedTreeService.undoDeleteAllChild(node, serviceModelId, (node, serviceModelId) => { + this._store.dispatch(undoDeleteActionVnfGroupInstance(node.data.vnfGroupStoreKey, serviceModelId)); + }); + } + }, + visible: (node) => this._sharedTreeService.shouldShowUndoDelete(node), + enable: (node, serviceModelId) => this._sharedTreeService.shouldShowUndoDelete(node) && !this._sharedTreeService.isServiceOnDeleteMode(serviceModelId) + } + }; + + + } + + removeGroup(this, node, serviceModelId) { + this._store.dispatch(removeInstance(node.data.modelName, serviceModelId, node.data.vnfGroupStoreKey, node)); + this._store.dispatch(changeInstanceCounter(node.data.modelUniqueId, serviceModelId, -1, node)); + this._sharedTreeService.selectedVNF = null; + } + + updatePosition(that , node, instanceId): void { + // TODO + } + + getNodePosition(instance): number { + return !_.isNil(instance) ? instance.position : null; + } + + onSelectedNode(node: ITreeNode): void { + } + +} diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/objectToInstanceTree/objectToInstanceTree.service.spec.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/objectToInstanceTree/objectToInstanceTree.service.spec.ts new file mode 100644 index 000000000..fd39ed92a --- /dev/null +++ b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/objectToInstanceTree/objectToInstanceTree.service.spec.ts @@ -0,0 +1,2764 @@ +import {HttpClientTestingModule, HttpTestingController} from "@angular/common/http/testing"; +import {getTestBed, TestBed} from "@angular/core/testing"; +import {MockNgRedux, NgReduxTestingModule} from "@angular-redux/store/testing"; +import {NgRedux} from "@angular-redux/store"; +import {ObjectToInstanceTreeService} from "./objectToInstanceTree.service"; +import {SharedTreeService} from "../shared.tree.service"; +import {DynamicInputsService} from "../dynamicInputs.service"; +import {DefaultDataGeneratorService} from "../../../../shared/services/defaultDataServiceGenerator/default.data.generator.service"; +import {AvailableModelsTreeService} from "../../available-models-tree/available-models-tree.service"; +import {ObjectToTreeService} from "../objectToTree.service"; +import {DrawingBoardModes} from "../../drawing-board.modes"; +import {DialogService} from "ng2-bootstrap-modal"; +import {VnfPopupService} from "../../../../shared/components/genericFormPopup/genericFormServices/vnf/vnf.popup.service"; +import {BasicControlGenerator} from "../../../../shared/components/genericForm/formControlsServices/basic.control.generator"; +import {AaiService} from "../../../../shared/services/aaiService/aai.service"; +import {FeatureFlagsService} from "../../../../shared/services/featureFlag/feature-flags.service"; +import {VnfControlGenerator} from "../../../../shared/components/genericForm/formControlsServices/vnfGenerator/vnf.control.generator"; +import {GenericFormService} from "../../../../shared/components/genericForm/generic-form.service"; +import {FormBuilder} from "@angular/forms"; +import {LogService} from "../../../../shared/utils/log/log.service"; +import {IframeService} from "../../../../shared/utils/iframe.service"; +import {BasicPopupService} from "../../../../shared/components/genericFormPopup/genericFormServices/basic.popup.service"; +import {NetworkPopupService} from "../../../../shared/components/genericFormPopup/genericFormServices/network/network.popup.service"; +import {NetworkControlGenerator} from "../../../../shared/components/genericForm/formControlsServices/networkGenerator/network.control.generator"; +import {VfModulePopuopService} from "../../../../shared/components/genericFormPopup/genericFormServices/vfModule/vfModule.popuop.service"; +import {VfModuleControlGenerator} from "../../../../shared/components/genericForm/formControlsServices/vfModuleGenerator/vfModule.control.generator"; +import {VnfGroupPopupService} from "../../../../shared/components/genericFormPopup/genericFormServices/vnfGroup/vnfGroup.popup.service"; +import {VnfGroupControlGenerator} from "../../../../shared/components/genericForm/formControlsServices/vnfGroupGenerator/vnfGroup.control.generator"; +import {DuplicateService} from "../../duplicate/duplicate.service"; +import {SdcUiComponentsModule, SdcUiServices} from "onap-ui-angular"; +import {ErrorMsgService} from "../../../../shared/components/error-msg/error-msg.service"; +import {ComponentInfoService} from "../../component-info/component-info.service"; + +class MockAppStore<T> { + getState() { + return { + global: { + 'drawingBoardStatus': DrawingBoardModes.CREATE, + flags : { + DRAG_AND_DROP_OPERATION : false + } + } + } + } +} + +describe('Model Tree Generator service', () => { + let injector; + let service: ObjectToInstanceTreeService; + let httpMock: HttpTestingController; + + beforeAll(done => (async () => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule, NgReduxTestingModule, SdcUiComponentsModule], + providers: [ + DuplicateService, + AvailableModelsTreeService, + ObjectToTreeService, + ObjectToInstanceTreeService, + DefaultDataGeneratorService, + DynamicInputsService, + SharedTreeService, + VnfPopupService, + VnfGroupPopupService, + BasicControlGenerator, + GenericFormService, + FormBuilder, + LogService, + IframeService, + BasicPopupService, + NetworkPopupService, + NetworkControlGenerator, + VfModulePopuopService, + VfModuleControlGenerator, + VnfGroupControlGenerator, + DialogService, + FeatureFlagsService, + VnfControlGenerator, + AaiService, + DialogService, + ErrorMsgService, + ComponentInfoService, + SdcUiServices.ModalService, + { provide: NgRedux, useClass: MockAppStore }, + MockNgRedux] + }); + await TestBed.compileComponents(); + + injector = getTestBed(); + service = injector.get(ObjectToInstanceTreeService); + httpMock = injector.get(HttpTestingController); + + })().then(done).catch(done.fail)); + + test('ObjectToInstanceTreeService should be defined', () => { + expect(service).toBeDefined(); + }); + + + test('should return instance nodes correctly: VNF', () => { + + let convertToNodes = service.convertServiceInstanceToTreeData(getInstanceServiceVNF(), getServiceInstanceHierarchy()); + delete convertToNodes[0].menuActions; + delete convertToNodes[0].errors; + delete convertToNodes[0].isFailed; + delete convertToNodes[0].trackById; + delete convertToNodes[0].updatePoistionFunction; + delete convertToNodes[0].position; + delete convertToNodes[0].onSelectedNode; + delete convertToNodes[1].children[0].isFailed; + delete convertToNodes[1].children[0].menuActions; + delete convertToNodes[1].children[0].trackById; + delete convertToNodes[1].children[0].errors; + delete convertToNodes[1].children[0].updatePoistionFunction; + delete convertToNodes[1].children[0].position; + delete convertToNodes[1].children[0].onSelectedNode; + expect(Object.assign({}, convertToNodes[0])).toEqual(Object.assign({}, expectInstanceNodesResultVNF()[0])); + expect(Object.assign({}, convertToNodes[1].children[0])).toEqual(Object.assign({}, expectInstanceNodesResultVNF()[1].children[0])); + expect(convertToNodes[1].inMaint).toBeFalsy(); + expect(convertToNodes[0].inMaint).toBeTruthy(); + expect(service.numberOfFailed).toBe(0); + expect(service.numberOfElements).toBe(3); + }); + + test('should return instance nodes correctly: VNF and Network', () => { + let convertToNodes = service.convertServiceInstanceToTreeData(getInstanceServiceVNF_Network(), getServiceHeirarchyVNF_Network()); + + delete convertToNodes[1].menuActions; + delete convertToNodes[1].trackById; + delete convertToNodes[1].errors; + delete convertToNodes[1].isFailed; + delete convertToNodes[1].updatePoistionFunction; + delete convertToNodes[1].position; + delete convertToNodes[1].onSelectedNode; + expect(Object.assign({}, convertToNodes[0].children[0].dynamicInputs)).toEqual(Object.assign({}, expectInstanceNodesResultVNF_Network()[0]['children'][0].dynamicInputs)); + expect(Object.assign({}, convertToNodes[0].children[0].missingData)).toEqual(Object.assign({}, expectInstanceNodesResultVNF_Network()[0]['children'][0].missingData)); + expect(Object.assign({}, convertToNodes[1])).toEqual(Object.assign({}, expectInstanceNodesResultVNF_Network()[1])); + expect(service.numberOfFailed).toBe(0); + expect(service.numberOfElements).toBe(5); + }); + + function getServiceInstanceHierarchy() { + return { + "service": { + "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450", + "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0", + "name": "action-data", + "version": "1.0", + "toscaModelURL": null, + "category": "", + "serviceType": "", + "serviceRole": "", + "description": "", + "serviceEcompNaming": "false", + "instantiationType": "Macro", + "inputs": { + "2017488_adiodvpe0_ASN": { + "type": "string", + "description": "AV/PE", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "AV_vPE" + } + }, + "vidNotions": { + "instantiationUI": "legacy", + "modelCategory": "other" + } + }, + "vnfs": { + "2017-388_ADIOD-vPE 1": { + "uuid": "0903e1c0-8e03-4936-b5c2-260653b96413", + "invariantUuid": "00beb8f9-6d39-452f-816d-c709b9cbb87d", + "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM", + "name": "2017-388_ADIOD-vPE", + "version": "1.0", + "customizationUuid": "280dec31-f16d-488b-9668-4aae55d6648a", + "inputs": { + "vnf_config_template_version": { + "type": "string", + "description": "VPE Software Version", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "17.2" + }, + "bandwidth_units": { + "type": "string", + "description": "Units of bandwidth", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "Gbps" + }, + "bandwidth": { + "type": "string", + "description": "Requested VPE bandwidth", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "10" + }, + "AIC_CLLI": { + "type": "string", + "description": "AIC Site CLLI", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "ATLMY8GA" + }, + "ASN": { + "type": "string", + "description": "AV/PE", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "AV_vPE" + }, + "vnf_instance_name": { + "type": "string", + "description": "The hostname assigned to the vpe.", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "mtnj309me6" + } + }, + "commands": { + "vnf_config_template_version": { + "displayName": "vnf_config_template_version", + "command": "get_input", + "inputName": "2017488_adiodvpe0_vnf_config_template_version" + }, + "bandwidth_units": { + "displayName": "bandwidth_units", + "command": "get_input", + "inputName": "adiodvpe0_bandwidth_units" + }, + "bandwidth": { + "displayName": "bandwidth", + "command": "get_input", + "inputName": "adiodvpe0_bandwidth" + }, + "AIC_CLLI": { + "displayName": "AIC_CLLI", + "command": "get_input", + "inputName": "2017488_adiodvpe0_AIC_CLLI" + }, + "ASN": { + "displayName": "ASN", + "command": "get_input", + "inputName": "2017488_adiodvpe0_ASN" + }, + "vnf_instance_name": { + "displayName": "vnf_instance_name", + "command": "get_input", + "inputName": "2017488_adiodvpe0_vnf_instance_name" + } + }, + "properties": { + "vmxvre_retype": "RE-VMX", + "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version", + "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d", + "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9", + "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF", + "int_ctl_net_name": "VMX-INTXI", + "vmx_int_ctl_prefix": "10.0.0.10", + "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5", + "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279", + "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a", + "nf_type": "vPE", + "vmxvpfe_int_ctl_ip_1": "10.0.0.10", + "is_AVPN_service": "false", + "vmx_RSG_name": "vREXI-affinity", + "vmx_int_ctl_forwarding": "l2", + "vmxvre_oam_ip_0": "10.0.0.10", + "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvpfe_sriov41_0_port_vlanstrip": "false", + "vmxvpfe_sriov42_0_port_vlanfilter": "4001", + "vmxvpfe_sriov44_0_port_unknownunicastallow": "true", + "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2", + "vmxvre_instance": "0", + "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvre_flavor_name": "ns.c1r16d32.v5", + "vmxvpfe_volume_size_0": "40.0", + "vmxvpfe_sriov43_0_port_vlanfilter": "4001", + "nf_naming": "{ecomp_generated_naming=false}", + "nf_naming_code": "Navneet", + "vmxvre_name_0": "vREXI", + "vmxvpfe_sriov42_0_port_vlanstrip": "false", + "vmxvpfe_volume_name_0": "vPFEXI_FBVolume", + "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141", + "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2", + "vmxvpfe_sriov43_0_port_unknownunicastallow": "true", + "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true", + "vmxvre_console": "vidconsole", + "vmxvpfe_sriov44_0_port_vlanfilter": "4001", + "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3", + "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true", + "vmxvpfe_sriov44_0_port_vlanstrip": "false", + "vf_module_id": "123", + "nf_function": "JAI", + "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true", + "vmxvre_int_ctl_ip_0": "10.0.0.10", + "ecomp_generated_naming": "false", + "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI", + "vnf_name": "mtnj309me6vre", + "vmxvpfe_sriov41_0_port_unknownunicastallow": "true", + "vmxvre_volume_type_1": "HITACHI", + "vmxvpfe_sriov44_0_port_broadcastallow": "true", + "vmxvre_volume_type_0": "HITACHI", + "vmxvpfe_volume_type_0": "HITACHI", + "vmxvpfe_sriov43_0_port_broadcastallow": "true", + "bandwidth_units": "get_input:adiodvpe0_bandwidth_units", + "vnf_id": "123", + "vmxvre_oam_prefix": "24", + "availability_zone_0": "mtpocfo-kvm-az01", + "ASN": "get_input:2017488_adiodvpe0_ASN", + "vmxvre_chassis_i2cid": "161", + "vmxvpfe_name_0": "vPFEXI", + "bandwidth": "get_input:adiodvpe0_bandwidth", + "availability_zone_max_count": "1", + "vmxvre_volume_size_0": "45.0", + "vmxvre_volume_size_1": "50.0", + "vmxvpfe_sriov42_0_port_broadcastallow": "true", + "vmxvre_oam_gateway": "10.0.0.10", + "vmxvre_volume_name_1": "vREXI_FAVolume", + "vmxvre_ore_present": "0", + "vmxvre_volume_name_0": "vREXI_FBVolume", + "vmxvre_type": "0", + "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name", + "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true", + "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429", + "vmx_int_ctl_len": "24", + "vmxvpfe_sriov43_0_port_vlanstrip": "false", + "vmxvpfe_sriov41_0_port_broadcastallow": "true", + "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d", + "vmxvpfe_sriov41_0_port_vlanfilter": "4001", + "nf_role": "Testing", + "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a", + "vmxvpfe_sriov42_0_port_unknownunicastallow": "true", + "vmxvpfe_flavor_name": "ns.c20r16d25.v5" + }, + "type": "VF", + "modelCustomizationName": "2017-388_ADIOD-vPE 1", + "vfModules": {}, + "volumeGroups": {}, + "vfcInstanceGroups": {} + }, + "2017-388_ADIOD-vPE 0": { + "uuid": "afacccf6-397d-45d6-b5ae-94c39734b168", + "invariantUuid": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8", + "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM", + "name": "2017-388_ADIOD-vPE", + "version": "4.0", + "customizationUuid": "b3c76f73-eeb5-4fb6-9d31-72a889f1811c", + "inputs": { + "vnf_config_template_version": { + "type": "string", + "description": "VPE Software Version", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "17.2" + }, + "bandwidth_units": { + "type": "string", + "description": "Units of bandwidth", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "Gbps" + }, + "bandwidth": { + "type": "string", + "description": "Requested VPE bandwidth", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "10" + }, + "AIC_CLLI": { + "type": "string", + "description": "AIC Site CLLI", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "ATLMY8GA" + }, + "ASN": { + "type": "string", + "description": "AV/PE", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "AV_vPE" + }, + "vnf_instance_name": { + "type": "string", + "description": "The hostname assigned to the vpe.", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "mtnj309me6" + } + }, + "commands": { + "vnf_config_template_version": { + "displayName": "vnf_config_template_version", + "command": "get_input", + "inputName": "2017488_adiodvpe0_vnf_config_template_version" + }, + "bandwidth_units": { + "displayName": "bandwidth_units", + "command": "get_input", + "inputName": "adiodvpe0_bandwidth_units" + }, + "bandwidth": { + "displayName": "bandwidth", + "command": "get_input", + "inputName": "adiodvpe0_bandwidth" + }, + "AIC_CLLI": { + "displayName": "AIC_CLLI", + "command": "get_input", + "inputName": "2017488_adiodvpe0_AIC_CLLI" + }, + "ASN": { + "displayName": "ASN", + "command": "get_input", + "inputName": "2017488_adiodvpe0_ASN" + }, + "vnf_instance_name": { + "displayName": "vnf_instance_name", + "command": "get_input", + "inputName": "2017488_adiodvpe0_vnf_instance_name" + } + }, + "properties": { + "vmxvre_retype": "RE-VMX", + "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version", + "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d", + "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9", + "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF", + "int_ctl_net_name": "VMX-INTXI", + "vmx_int_ctl_prefix": "10.0.0.10", + "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5", + "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279", + "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a", + "nf_type": "vPE", + "vmxvpfe_int_ctl_ip_1": "10.0.0.10", + "is_AVPN_service": "false", + "vmx_RSG_name": "vREXI-affinity", + "vmx_int_ctl_forwarding": "l2", + "vmxvre_oam_ip_0": "10.0.0.10", + "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvpfe_sriov41_0_port_vlanstrip": "false", + "vmxvpfe_sriov42_0_port_vlanfilter": "4001", + "vmxvpfe_sriov44_0_port_unknownunicastallow": "true", + "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2", + "vmxvre_instance": "0", + "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvre_flavor_name": "ns.c1r16d32.v5", + "vmxvpfe_volume_size_0": "40.0", + "vmxvpfe_sriov43_0_port_vlanfilter": "4001", + "nf_naming": "{ecomp_generated_naming=false}", + "nf_naming_code": "Navneet", + "vmxvre_name_0": "vREXI", + "vmxvpfe_sriov42_0_port_vlanstrip": "false", + "vmxvpfe_volume_name_0": "vPFEXI_FBVolume", + "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141", + "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2", + "vmxvpfe_sriov43_0_port_unknownunicastallow": "true", + "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true", + "vmxvre_console": "vidconsole", + "vmxvpfe_sriov44_0_port_vlanfilter": "4001", + "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3", + "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true", + "min_instances": "1", + "vmxvpfe_sriov44_0_port_vlanstrip": "false", + "vf_module_id": "123", + "nf_function": "JAI", + "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true", + "vmxvre_int_ctl_ip_0": "10.0.0.10", + "ecomp_generated_naming": "false", + "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI", + "vnf_name": "mtnj309me6vre", + "vmxvpfe_sriov41_0_port_unknownunicastallow": "true", + "vmxvre_volume_type_1": "HITACHI", + "vmxvpfe_sriov44_0_port_broadcastallow": "true", + "vmxvre_volume_type_0": "HITACHI", + "vmxvpfe_volume_type_0": "HITACHI", + "vmxvpfe_sriov43_0_port_broadcastallow": "true", + "bandwidth_units": "get_input:adiodvpe0_bandwidth_units", + "vnf_id": "123", + "vmxvre_oam_prefix": "24", + "availability_zone_0": "mtpocfo-kvm-az01", + "ASN": "get_input:2017488_adiodvpe0_ASN", + "vmxvre_chassis_i2cid": "161", + "vmxvpfe_name_0": "vPFEXI", + "bandwidth": "get_input:adiodvpe0_bandwidth", + "availability_zone_max_count": "1", + "vmxvre_volume_size_0": "45.0", + "vmxvre_volume_size_1": "50.0", + "vmxvpfe_sriov42_0_port_broadcastallow": "true", + "vmxvre_oam_gateway": "10.0.0.10", + "vmxvre_volume_name_1": "vREXI_FAVolume", + "vmxvre_ore_present": "0", + "vmxvre_volume_name_0": "vREXI_FBVolume", + "vmxvre_type": "0", + "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name", + "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true", + "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429", + "vmx_int_ctl_len": "24", + "vmxvpfe_sriov43_0_port_vlanstrip": "false", + "vmxvpfe_sriov41_0_port_broadcastallow": "true", + "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d", + "vmxvpfe_sriov41_0_port_vlanfilter": "4001", + "nf_role": "Testing", + "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a", + "vmxvpfe_sriov42_0_port_unknownunicastallow": "true", + "vmxvpfe_flavor_name": "ns.c20r16d25.v5" + }, + "type": "VF", + "modelCustomizationName": "2017-388_ADIOD-vPE 0", + "vfModules": {}, + "volumeGroups": {}, + "vfcInstanceGroups": {} + }, + "2017-488_ADIOD-vPE 0": { + "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09", + "invariantUuid": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8", + "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM", + "name": "2017-488_ADIOD-vPE", + "version": "5.0", + "customizationUuid": "1da7b585-5e61-4993-b95e-8e6606c81e45", + "inputs": { + "vnf_config_template_version": { + "type": "string", + "description": "VPE Software Version", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "17.2" + }, + "bandwidth_units": { + "type": "string", + "description": "Units of bandwidth", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "Gbps" + }, + "bandwidth": { + "type": "string", + "description": "Requested VPE bandwidth", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "10" + }, + "AIC_CLLI": { + "type": "string", + "description": "AIC Site CLLI", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "ATLMY8GA" + }, + "ASN": { + "type": "string", + "description": "AV/PE", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "AV_vPE" + }, + "vnf_instance_name": { + "type": "string", + "description": "The hostname assigned to the vpe.", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "mtnj309me6" + } + }, + "commands": { + "vnf_config_template_version": { + "displayName": "vnf_config_template_version", + "command": "get_input", + "inputName": "2017488_adiodvpe0_vnf_config_template_version" + }, + "bandwidth_units": { + "displayName": "bandwidth_units", + "command": "get_input", + "inputName": "adiodvpe0_bandwidth_units" + }, + "bandwidth": { + "displayName": "bandwidth", + "command": "get_input", + "inputName": "adiodvpe0_bandwidth" + }, + "AIC_CLLI": { + "displayName": "AIC_CLLI", + "command": "get_input", + "inputName": "2017488_adiodvpe0_AIC_CLLI" + }, + "ASN": { + "displayName": "ASN", + "command": "get_input", + "inputName": "2017488_adiodvpe0_ASN" + }, + "vnf_instance_name": { + "displayName": "vnf_instance_name", + "command": "get_input", + "inputName": "2017488_adiodvpe0_vnf_instance_name" + } + }, + "properties": { + "vmxvre_retype": "RE-VMX", + "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version", + "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d", + "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9", + "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF", + "int_ctl_net_name": "VMX-INTXI", + "vmx_int_ctl_prefix": "10.0.0.10", + "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5", + "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279", + "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a", + "nf_type": "vPE", + "vmxvpfe_int_ctl_ip_1": "10.0.0.10", + "is_AVPN_service": "false", + "vmx_RSG_name": "vREXI-affinity", + "vmx_int_ctl_forwarding": "l2", + "vmxvre_oam_ip_0": "10.0.0.10", + "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvpfe_sriov41_0_port_vlanstrip": "false", + "vmxvpfe_sriov42_0_port_vlanfilter": "4001", + "vmxvpfe_sriov44_0_port_unknownunicastallow": "true", + "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2", + "vmxvre_instance": "0", + "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvre_flavor_name": "ns.c1r16d32.v5", + "vmxvpfe_volume_size_0": "40.0", + "vmxvpfe_sriov43_0_port_vlanfilter": "4001", + "nf_naming": "{ecomp_generated_naming=false}", + "nf_naming_code": "Navneet", + "vmxvre_name_0": "vREXI", + "vmxvpfe_sriov42_0_port_vlanstrip": "false", + "vmxvpfe_volume_name_0": "vPFEXI_FBVolume", + "max_instances": "3", + "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141", + "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2", + "vmxvpfe_sriov43_0_port_unknownunicastallow": "true", + "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true", + "vmxvre_console": "vidconsole", + "vmxvpfe_sriov44_0_port_vlanfilter": "4001", + "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3", + "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true", + "min_instances": "1", + "vmxvpfe_sriov44_0_port_vlanstrip": "false", + "vf_module_id": "123", + "nf_function": "JAI", + "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true", + "vmxvre_int_ctl_ip_0": "10.0.0.10", + "ecomp_generated_naming": "false", + "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI", + "vnf_name": "mtnj309me6vre", + "vmxvpfe_sriov41_0_port_unknownunicastallow": "true", + "vmxvre_volume_type_1": "HITACHI", + "vmxvpfe_sriov44_0_port_broadcastallow": "true", + "vmxvre_volume_type_0": "HITACHI", + "vmxvpfe_volume_type_0": "HITACHI", + "vmxvpfe_sriov43_0_port_broadcastallow": "true", + "bandwidth_units": "get_input:adiodvpe0_bandwidth_units", + "vnf_id": "123", + "vmxvre_oam_prefix": "24", + "availability_zone_0": "mtpocfo-kvm-az01", + "ASN": "get_input:2017488_adiodvpe0_ASN", + "vmxvre_chassis_i2cid": "161", + "vmxvpfe_name_0": "vPFEXI", + "bandwidth": "get_input:adiodvpe0_bandwidth", + "availability_zone_max_count": "1", + "vmxvre_volume_size_0": "45.0", + "vmxvre_volume_size_1": "50.0", + "vmxvpfe_sriov42_0_port_broadcastallow": "true", + "vmxvre_oam_gateway": "10.0.0.10", + "vmxvre_volume_name_1": "vREXI_FAVolume", + "vmxvre_ore_present": "0", + "vmxvre_volume_name_0": "vREXI_FBVolume", + "vmxvre_type": "0", + "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name", + "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true", + "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429", + "vmx_int_ctl_len": "24", + "vmxvpfe_sriov43_0_port_vlanstrip": "false", + "vmxvpfe_sriov41_0_port_broadcastallow": "true", + "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d", + "vmxvpfe_sriov41_0_port_vlanfilter": "4001", + "nf_role": "Testing", + "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a", + "vmxvpfe_sriov42_0_port_unknownunicastallow": "true", + "vmxvpfe_flavor_name": "ns.c20r16d25.v5" + }, + "type": "VF", + "modelCustomizationName": "2017-488_ADIOD-vPE 0", + "vfModules": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": { + "uuid": "25284168-24bb-4698-8cb4-3f509146eca5", + "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1", + "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vRE_BV", + "baseModule": false + }, + "inputs": { + "vnf_config_template_version": { + "type": "string", + "description": "VPE Software Version", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "vnf_config_template_version" + }, + "fromInputName": "2017488_adiodvpe0_vnf_config_template_version", + "constraints": null, + "required": true, + "default": "17.2" + }, + "bandwidth_units": { + "type": "string", + "description": "Units of bandwidth", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "bandwidth_units" + }, + "fromInputName": "adiodvpe0_bandwidth_units", + "constraints": null, + "required": true, + "default": "Gbps" + }, + "bandwidth": { + "type": "string", + "description": "Requested VPE bandwidth", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "bandwidth" + }, + "fromInputName": "adiodvpe0_bandwidth", + "constraints": null, + "required": true, + "default": "10" + }, + "AIC_CLLI": { + "type": "string", + "description": "AIC Site CLLI", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "AIC_CLLI" + }, + "fromInputName": "2017488_adiodvpe0_AIC_CLLI", + "constraints": null, + "required": true, + "default": "ATLMY8GA" + }, + "vnf_instance_name": { + "type": "string", + "description": "The hostname assigned to the vpe.", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "vnf_instance_name" + }, + "fromInputName": "2017488_adiodvpe0_vnf_instance_name", + "constraints": null, + "required": true, + "default": "mtnj309me6" + } + }, + "volumeGroupAllowed": true + }, + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": { + "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db", + "invariantUuid": "b34833bb-6aa9-4ad6-a831-70b06367a091", + "customizationUuid": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3", + "description": null, + "name": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0", + "version": "5", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0", + "properties": { + "minCountInstances": 1, + "maxCountInstances": 1, + "initialCount": 1, + "vfModuleLabel": "ADIOD_base_vPE_BV", + "baseModule": true + }, + "inputs": {}, + "volumeGroupAllowed": false + }, + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": { + "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a", + "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339", + "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vPFE_BV", + "baseModule": false + }, + "inputs": {}, + "volumeGroupAllowed": true + } + }, + "volumeGroups": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": { + "uuid": "25284168-24bb-4698-8cb4-3f509146eca5", + "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1", + "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vRE_BV", + "baseModule": false + }, + "inputs": { + "vnf_config_template_version": { + "type": "string", + "description": "VPE Software Version", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "vnf_config_template_version" + }, + "fromInputName": "2017488_adiodvpe0_vnf_config_template_version", + "constraints": null, + "required": true, + "default": "17.2" + }, + "bandwidth_units": { + "type": "string", + "description": "Units of bandwidth", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "bandwidth_units" + }, + "fromInputName": "adiodvpe0_bandwidth_units", + "constraints": null, + "required": true, + "default": "Gbps" + }, + "bandwidth": { + "type": "string", + "description": "Requested VPE bandwidth", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "bandwidth" + }, + "fromInputName": "adiodvpe0_bandwidth", + "constraints": null, + "required": true, + "default": "10" + }, + "AIC_CLLI": { + "type": "string", + "description": "AIC Site CLLI", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "AIC_CLLI" + }, + "fromInputName": "2017488_adiodvpe0_AIC_CLLI", + "constraints": null, + "required": true, + "default": "ATLMY8GA" + }, + "vnf_instance_name": { + "type": "string", + "description": "The hostname assigned to the vpe.", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "vnf_instance_name" + }, + "fromInputName": "2017488_adiodvpe0_vnf_instance_name", + "constraints": null, + "required": true, + "default": "mtnj309me6" + } + } + }, + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": { + "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a", + "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339", + "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vPFE_BV", + "baseModule": false + }, + "inputs": {} + } + }, + "vfcInstanceGroups": {} + } + }, + "networks": {}, + "collectionResource": {}, + "configurations": {}, + "fabricConfigurations": {}, + "serviceProxies": {}, + "vfModules": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": { + "uuid": "25284168-24bb-4698-8cb4-3f509146eca5", + "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1", + "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vRE_BV", + "baseModule": false + }, + "inputs": { + "vnf_config_template_version": { + "type": "string", + "description": "VPE Software Version", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "vnf_config_template_version" + }, + "fromInputName": "2017488_adiodvpe0_vnf_config_template_version", + "constraints": null, + "required": true, + "default": "17.2" + }, + "bandwidth_units": { + "type": "string", + "description": "Units of bandwidth", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "bandwidth_units" + }, + "fromInputName": "adiodvpe0_bandwidth_units", + "constraints": null, + "required": true, + "default": "Gbps" + }, + "bandwidth": { + "type": "string", + "description": "Requested VPE bandwidth", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "bandwidth" + }, + "fromInputName": "adiodvpe0_bandwidth", + "constraints": null, + "required": true, + "default": "10" + }, + "AIC_CLLI": { + "type": "string", + "description": "AIC Site CLLI", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "AIC_CLLI" + }, + "fromInputName": "2017488_adiodvpe0_AIC_CLLI", + "constraints": null, + "required": true, + "default": "ATLMY8GA" + }, + "vnf_instance_name": { + "type": "string", + "description": "The hostname assigned to the vpe.", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "vnf_instance_name" + }, + "fromInputName": "2017488_adiodvpe0_vnf_instance_name", + "constraints": null, + "required": true, + "default": "mtnj309me6" + } + }, + "volumeGroupAllowed": true + }, + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": { + "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db", + "invariantUuid": "b34833bb-6aa9-4ad6-a831-70b06367a091", + "customizationUuid": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3", + "description": null, + "name": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0", + "version": "5", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0", + "properties": { + "minCountInstances": 1, + "maxCountInstances": 1, + "initialCount": 1, + "vfModuleLabel": "ADIOD_base_vPE_BV", + "baseModule": true + }, + "inputs": {}, + "volumeGroupAllowed": false + }, + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": { + "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a", + "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339", + "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vPFE_BV", + "baseModule": false + }, + "inputs": {}, + "volumeGroupAllowed": true + } + }, + "volumeGroups": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": { + "uuid": "25284168-24bb-4698-8cb4-3f509146eca5", + "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1", + "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vRE_BV", + "baseModule": false + }, + "inputs": { + "vnf_config_template_version": { + "type": "string", + "description": "VPE Software Version", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "vnf_config_template_version" + }, + "fromInputName": "2017488_adiodvpe0_vnf_config_template_version", + "constraints": null, + "required": true, + "default": "17.2" + }, + "bandwidth_units": { + "type": "string", + "description": "Units of bandwidth", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "bandwidth_units" + }, + "fromInputName": "adiodvpe0_bandwidth_units", + "constraints": null, + "required": true, + "default": "Gbps" + }, + "bandwidth": { + "type": "string", + "description": "Requested VPE bandwidth", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "bandwidth" + }, + "fromInputName": "adiodvpe0_bandwidth", + "constraints": null, + "required": true, + "default": "10" + }, + "AIC_CLLI": { + "type": "string", + "description": "AIC Site CLLI", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "AIC_CLLI" + }, + "fromInputName": "2017488_adiodvpe0_AIC_CLLI", + "constraints": null, + "required": true, + "default": "ATLMY8GA" + }, + "vnf_instance_name": { + "type": "string", + "description": "The hostname assigned to the vpe.", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "vnf_instance_name" + }, + "fromInputName": "2017488_adiodvpe0_vnf_instance_name", + "constraints": null, + "required": true, + "default": "mtnj309me6" + } + } + }, + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": { + "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a", + "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339", + "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vPFE_BV", + "baseModule": false + }, + "inputs": {} + } + }, + "pnfs": {} + } + } + + function getServiceHeirarchyVNF_Network() { + return { + "service": { + "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450", + "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0", + "name": "action-data", + "version": "1.0", + "toscaModelURL": null, + "category": "", + "serviceType": "", + "serviceRole": "", + "description": "", + "serviceEcompNaming": "false", + "instantiationType": "A-La-Carte", + "inputs": { + "2017488_adiodvpe0_ASN": { + "type": "string", + "description": "AV/PE", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "AV_vPE" + } + } + }, + "vnfs": { + "2017-388_ADIOD-vPE 1": { + "uuid": "0903e1c0-8e03-4936-b5c2-260653b96413", + "invariantUuid": "00beb8f9-6d39-452f-816d-c709b9cbb87d", + "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM", + "name": "2017-388_ADIOD-vPE", + "version": "1.0", + "customizationUuid": "280dec31-f16d-488b-9668-4aae55d6648a", + "inputs": { + "vnf_config_template_version": { + "type": "string", + "description": "VPE Software Version", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "17.2" + }, + "bandwidth_units": { + "type": "string", + "description": "Units of bandwidth", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "Gbps" + }, + "bandwidth": { + "type": "string", + "description": "Requested VPE bandwidth", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "10" + }, + "AIC_CLLI": { + "type": "string", + "description": "AIC Site CLLI", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "ATLMY8GA" + }, + "ASN": { + "type": "string", + "description": "AV/PE", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "AV_vPE" + }, + "vnf_instance_name": { + "type": "string", + "description": "The hostname assigned to the vpe.", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "mtnj309me6" + } + }, + "commands": { + "vnf_config_template_version": { + "displayName": "vnf_config_template_version", + "command": "get_input", + "inputName": "2017488_adiodvpe0_vnf_config_template_version" + }, + "bandwidth_units": { + "displayName": "bandwidth_units", + "command": "get_input", + "inputName": "adiodvpe0_bandwidth_units" + }, + "bandwidth": { + "displayName": "bandwidth", + "command": "get_input", + "inputName": "adiodvpe0_bandwidth" + }, + "AIC_CLLI": { + "displayName": "AIC_CLLI", + "command": "get_input", + "inputName": "2017488_adiodvpe0_AIC_CLLI" + }, + "ASN": { + "displayName": "ASN", + "command": "get_input", + "inputName": "2017488_adiodvpe0_ASN" + }, + "vnf_instance_name": { + "displayName": "vnf_instance_name", + "command": "get_input", + "inputName": "2017488_adiodvpe0_vnf_instance_name" + } + }, + "properties": { + "vmxvre_retype": "RE-VMX", + "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version", + "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d", + "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9", + "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF", + "int_ctl_net_name": "VMX-INTXI", + "vmx_int_ctl_prefix": "10.0.0.10", + "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5", + "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279", + "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a", + "nf_type": "vPE", + "vmxvpfe_int_ctl_ip_1": "10.0.0.10", + "is_AVPN_service": "false", + "vmx_RSG_name": "vREXI-affinity", + "vmx_int_ctl_forwarding": "l2", + "vmxvre_oam_ip_0": "10.0.0.10", + "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvpfe_sriov41_0_port_vlanstrip": "false", + "vmxvpfe_sriov42_0_port_vlanfilter": "4001", + "vmxvpfe_sriov44_0_port_unknownunicastallow": "true", + "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2", + "vmxvre_instance": "0", + "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvre_flavor_name": "ns.c1r16d32.v5", + "vmxvpfe_volume_size_0": "40.0", + "vmxvpfe_sriov43_0_port_vlanfilter": "4001", + "nf_naming": "{ecomp_generated_naming=false}", + "nf_naming_code": "Navneet", + "vmxvre_name_0": "vREXI", + "vmxvpfe_sriov42_0_port_vlanstrip": "false", + "vmxvpfe_volume_name_0": "vPFEXI_FBVolume", + "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141", + "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2", + "vmxvpfe_sriov43_0_port_unknownunicastallow": "true", + "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true", + "vmxvre_console": "vidconsole", + "vmxvpfe_sriov44_0_port_vlanfilter": "4001", + "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3", + "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true", + "vmxvpfe_sriov44_0_port_vlanstrip": "false", + "vf_module_id": "123", + "nf_function": "JAI", + "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true", + "vmxvre_int_ctl_ip_0": "10.0.0.10", + "ecomp_generated_naming": "false", + "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI", + "vnf_name": "mtnj309me6vre", + "vmxvpfe_sriov41_0_port_unknownunicastallow": "true", + "vmxvre_volume_type_1": "HITACHI", + "vmxvpfe_sriov44_0_port_broadcastallow": "true", + "vmxvre_volume_type_0": "HITACHI", + "vmxvpfe_volume_type_0": "HITACHI", + "vmxvpfe_sriov43_0_port_broadcastallow": "true", + "bandwidth_units": "get_input:adiodvpe0_bandwidth_units", + "vnf_id": "123", + "vmxvre_oam_prefix": "24", + "availability_zone_0": "mtpocfo-kvm-az01", + "ASN": "get_input:2017488_adiodvpe0_ASN", + "vmxvre_chassis_i2cid": "161", + "vmxvpfe_name_0": "vPFEXI", + "bandwidth": "get_input:adiodvpe0_bandwidth", + "availability_zone_max_count": "1", + "vmxvre_volume_size_0": "45.0", + "vmxvre_volume_size_1": "50.0", + "vmxvpfe_sriov42_0_port_broadcastallow": "true", + "vmxvre_oam_gateway": "10.0.0.10", + "vmxvre_volume_name_1": "vREXI_FAVolume", + "vmxvre_ore_present": "0", + "vmxvre_volume_name_0": "vREXI_FBVolume", + "vmxvre_type": "0", + "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name", + "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true", + "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429", + "vmx_int_ctl_len": "24", + "vmxvpfe_sriov43_0_port_vlanstrip": "false", + "vmxvpfe_sriov41_0_port_broadcastallow": "true", + "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d", + "vmxvpfe_sriov41_0_port_vlanfilter": "4001", + "nf_role": "Testing", + "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a", + "vmxvpfe_sriov42_0_port_unknownunicastallow": "true", + "vmxvpfe_flavor_name": "ns.c20r16d25.v5", + "max_instances": 5 + }, + "type": "VF", + "modelCustomizationName": "2017-388_ADIOD-vPE 1", + "vfModules": {}, + "volumeGroups": {}, + "vfcInstanceGroups": {} + }, + "2017-388_ADIOD-vPE 0": { + "uuid": "afacccf6-397d-45d6-b5ae-94c39734b168", + "invariantUuid": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8", + "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM", + "name": "2017-388_ADIOD-vPE", + "version": "4.0", + "customizationUuid": "b3c76f73-eeb5-4fb6-9d31-72a889f1811c", + "inputs": { + "vnf_config_template_version": { + "type": "string", + "description": "VPE Software Version", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "17.2" + }, + "bandwidth_units": { + "type": "string", + "description": "Units of bandwidth", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "Gbps" + }, + "bandwidth": { + "type": "string", + "description": "Requested VPE bandwidth", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "10" + }, + "AIC_CLLI": { + "type": "string", + "description": "AIC Site CLLI", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "ATLMY8GA" + }, + "ASN": { + "type": "string", + "description": "AV/PE", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "AV_vPE" + }, + "vnf_instance_name": { + "type": "string", + "description": "The hostname assigned to the vpe.", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "mtnj309me6" + } + }, + "commands": { + "vnf_config_template_version": { + "displayName": "vnf_config_template_version", + "command": "get_input", + "inputName": "2017488_adiodvpe0_vnf_config_template_version" + }, + "bandwidth_units": { + "displayName": "bandwidth_units", + "command": "get_input", + "inputName": "adiodvpe0_bandwidth_units" + }, + "bandwidth": { + "displayName": "bandwidth", + "command": "get_input", + "inputName": "adiodvpe0_bandwidth" + }, + "AIC_CLLI": { + "displayName": "AIC_CLLI", + "command": "get_input", + "inputName": "2017488_adiodvpe0_AIC_CLLI" + }, + "ASN": { + "displayName": "ASN", + "command": "get_input", + "inputName": "2017488_adiodvpe0_ASN" + }, + "vnf_instance_name": { + "displayName": "vnf_instance_name", + "command": "get_input", + "inputName": "2017488_adiodvpe0_vnf_instance_name" + } + }, + "properties": { + "vmxvre_retype": "RE-VMX", + "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version", + "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d", + "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9", + "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF", + "int_ctl_net_name": "VMX-INTXI", + "vmx_int_ctl_prefix": "10.0.0.10", + "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5", + "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279", + "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a", + "nf_type": "vPE", + "vmxvpfe_int_ctl_ip_1": "10.0.0.10", + "is_AVPN_service": "false", + "vmx_RSG_name": "vREXI-affinity", + "vmx_int_ctl_forwarding": "l2", + "vmxvre_oam_ip_0": "10.0.0.10", + "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvpfe_sriov41_0_port_vlanstrip": "false", + "vmxvpfe_sriov42_0_port_vlanfilter": "4001", + "vmxvpfe_sriov44_0_port_unknownunicastallow": "true", + "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2", + "vmxvre_instance": "0", + "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvre_flavor_name": "ns.c1r16d32.v5", + "vmxvpfe_volume_size_0": "40.0", + "vmxvpfe_sriov43_0_port_vlanfilter": "4001", + "nf_naming": "{ecomp_generated_naming=false}", + "nf_naming_code": "Navneet", + "vmxvre_name_0": "vREXI", + "vmxvpfe_sriov42_0_port_vlanstrip": "false", + "vmxvpfe_volume_name_0": "vPFEXI_FBVolume", + "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141", + "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2", + "vmxvpfe_sriov43_0_port_unknownunicastallow": "true", + "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true", + "vmxvre_console": "vidconsole", + "vmxvpfe_sriov44_0_port_vlanfilter": "4001", + "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3", + "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true", + "min_instances": "1", + "vmxvpfe_sriov44_0_port_vlanstrip": "false", + "vf_module_id": "123", + "nf_function": "JAI", + "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true", + "vmxvre_int_ctl_ip_0": "10.0.0.10", + "ecomp_generated_naming": "false", + "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI", + "vnf_name": "mtnj309me6vre", + "vmxvpfe_sriov41_0_port_unknownunicastallow": "true", + "vmxvre_volume_type_1": "HITACHI", + "vmxvpfe_sriov44_0_port_broadcastallow": "true", + "vmxvre_volume_type_0": "HITACHI", + "vmxvpfe_volume_type_0": "HITACHI", + "vmxvpfe_sriov43_0_port_broadcastallow": "true", + "bandwidth_units": "get_input:adiodvpe0_bandwidth_units", + "vnf_id": "123", + "vmxvre_oam_prefix": "24", + "availability_zone_0": "mtpocfo-kvm-az01", + "ASN": "get_input:2017488_adiodvpe0_ASN", + "vmxvre_chassis_i2cid": "161", + "vmxvpfe_name_0": "vPFEXI", + "bandwidth": "get_input:adiodvpe0_bandwidth", + "availability_zone_max_count": "1", + "vmxvre_volume_size_0": "45.0", + "vmxvre_volume_size_1": "50.0", + "vmxvpfe_sriov42_0_port_broadcastallow": "true", + "vmxvre_oam_gateway": "10.0.0.10", + "vmxvre_volume_name_1": "vREXI_FAVolume", + "vmxvre_ore_present": "0", + "vmxvre_volume_name_0": "vREXI_FBVolume", + "vmxvre_type": "0", + "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name", + "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true", + "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429", + "vmx_int_ctl_len": "24", + "vmxvpfe_sriov43_0_port_vlanstrip": "false", + "vmxvpfe_sriov41_0_port_broadcastallow": "true", + "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d", + "vmxvpfe_sriov41_0_port_vlanfilter": "4001", + "nf_role": "Testing", + "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a", + "vmxvpfe_sriov42_0_port_unknownunicastallow": "true", + "vmxvpfe_flavor_name": "ns.c20r16d25.v5" + }, + "type": "VF", + "modelCustomizationName": "2017-388_ADIOD-vPE 0", + "vfModules": {}, + "volumeGroups": {}, + "vfcInstanceGroups": {} + }, + "2017-488_ADIOD-vPE 0": { + "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09", + "invariantUuid": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8", + "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM", + "name": "2017-488_ADIOD-vPE", + "version": "5.0", + "customizationUuid": "1da7b585-5e61-4993-b95e-8e6606c81e45", + "inputs": { + "vnf_config_template_version": { + "type": "string", + "description": "VPE Software Version", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "17.2" + }, + "bandwidth_units": { + "type": "string", + "description": "Units of bandwidth", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "Gbps" + }, + "bandwidth": { + "type": "string", + "description": "Requested VPE bandwidth", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "10" + }, + "AIC_CLLI": { + "type": "string", + "description": "AIC Site CLLI", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "ATLMY8GA" + }, + "ASN": { + "type": "string", + "description": "AV/PE", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "AV_vPE" + }, + "vnf_instance_name": { + "type": "string", + "description": "The hostname assigned to the vpe.", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "mtnj309me6" + } + }, + "commands": { + "vnf_config_template_version": { + "displayName": "vnf_config_template_version", + "command": "get_input", + "inputName": "2017488_adiodvpe0_vnf_config_template_version" + }, + "bandwidth_units": { + "displayName": "bandwidth_units", + "command": "get_input", + "inputName": "adiodvpe0_bandwidth_units" + }, + "bandwidth": { + "displayName": "bandwidth", + "command": "get_input", + "inputName": "adiodvpe0_bandwidth" + }, + "AIC_CLLI": { + "displayName": "AIC_CLLI", + "command": "get_input", + "inputName": "2017488_adiodvpe0_AIC_CLLI" + }, + "ASN": { + "displayName": "ASN", + "command": "get_input", + "inputName": "2017488_adiodvpe0_ASN" + }, + "vnf_instance_name": { + "displayName": "vnf_instance_name", + "command": "get_input", + "inputName": "2017488_adiodvpe0_vnf_instance_name" + } + }, + "properties": { + "vmxvre_retype": "RE-VMX", + "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version", + "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d", + "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9", + "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF", + "int_ctl_net_name": "VMX-INTXI", + "vmx_int_ctl_prefix": "10.0.0.10", + "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5", + "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279", + "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a", + "nf_type": "vPE", + "vmxvpfe_int_ctl_ip_1": "10.0.0.10", + "is_AVPN_service": "false", + "vmx_RSG_name": "vREXI-affinity", + "vmx_int_ctl_forwarding": "l2", + "vmxvre_oam_ip_0": "10.0.0.10", + "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvpfe_sriov41_0_port_vlanstrip": "false", + "vmxvpfe_sriov42_0_port_vlanfilter": "4001", + "vmxvpfe_sriov44_0_port_unknownunicastallow": "true", + "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2", + "vmxvre_instance": "0", + "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvre_flavor_name": "ns.c1r16d32.v5", + "vmxvpfe_volume_size_0": "40.0", + "vmxvpfe_sriov43_0_port_vlanfilter": "4001", + "nf_naming": "{ecomp_generated_naming=false}", + "nf_naming_code": "Navneet", + "vmxvre_name_0": "vREXI", + "vmxvpfe_sriov42_0_port_vlanstrip": "false", + "vmxvpfe_volume_name_0": "vPFEXI_FBVolume", + "max_instances": "3", + "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141", + "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2", + "vmxvpfe_sriov43_0_port_unknownunicastallow": "true", + "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true", + "vmxvre_console": "vidconsole", + "vmxvpfe_sriov44_0_port_vlanfilter": "4001", + "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3", + "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true", + "min_instances": "1", + "vmxvpfe_sriov44_0_port_vlanstrip": "false", + "vf_module_id": "123", + "nf_function": "JAI", + "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true", + "vmxvre_int_ctl_ip_0": "10.0.0.10", + "ecomp_generated_naming": "false", + "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI", + "vnf_name": "mtnj309me6vre", + "vmxvpfe_sriov41_0_port_unknownunicastallow": "true", + "vmxvre_volume_type_1": "HITACHI", + "vmxvpfe_sriov44_0_port_broadcastallow": "true", + "vmxvre_volume_type_0": "HITACHI", + "vmxvpfe_volume_type_0": "HITACHI", + "vmxvpfe_sriov43_0_port_broadcastallow": "true", + "bandwidth_units": "get_input:adiodvpe0_bandwidth_units", + "vnf_id": "123", + "vmxvre_oam_prefix": "24", + "availability_zone_0": "mtpocfo-kvm-az01", + "ASN": "get_input:2017488_adiodvpe0_ASN", + "vmxvre_chassis_i2cid": "161", + "vmxvpfe_name_0": "vPFEXI", + "bandwidth": "get_input:adiodvpe0_bandwidth", + "availability_zone_max_count": "1", + "vmxvre_volume_size_0": "45.0", + "vmxvre_volume_size_1": "50.0", + "vmxvpfe_sriov42_0_port_broadcastallow": "true", + "vmxvre_oam_gateway": "10.0.0.10", + "vmxvre_volume_name_1": "vREXI_FAVolume", + "vmxvre_ore_present": "0", + "vmxvre_volume_name_0": "vREXI_FBVolume", + "vmxvre_type": "0", + "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name", + "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true", + "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429", + "vmx_int_ctl_len": "24", + "vmxvpfe_sriov43_0_port_vlanstrip": "false", + "vmxvpfe_sriov41_0_port_broadcastallow": "true", + "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d", + "vmxvpfe_sriov41_0_port_vlanfilter": "4001", + "nf_role": "Testing", + "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a", + "vmxvpfe_sriov42_0_port_unknownunicastallow": "true", + "vmxvpfe_flavor_name": "ns.c20r16d25.v5" + }, + "type": "VF", + "modelCustomizationName": "2017-488_ADIOD-vPE 0", + "vfModules": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": { + "uuid": "25284168-24bb-4698-8cb4-3f509146eca5", + "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1", + "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vRE_BV" + }, + "inputs": { + "adiodvpe0_bandwidth": { + "type": "string", + "description": "Requested VPE bandwidth", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "bandwidth" + }, + "constraints": null, + "required": true, + "default": "10" + }, + "2017488_adiodvpe0_vnf_instance_name": { + "type": "string", + "description": "The hostname assigned to the vpe.", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "vnf_instance_name" + }, + "constraints": null, + "required": true, + "default": "mtnj309me6" + }, + "2017488_adiodvpe0_vnf_config_template_version": { + "type": "string", + "description": "VPE Software Version", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "vnf_config_template_version" + }, + "constraints": null, + "required": true, + "default": "17.2" + }, + "2017488_adiodvpe0_AIC_CLLI": { + "type": "string", + "description": "AIC Site CLLI", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "AIC_CLLI" + }, + "constraints": null, + "required": true, + "default": "ATLMY8GA" + }, + "adiodvpe0_bandwidth_units": { + "type": "string", + "description": "Units of bandwidth", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "bandwidth_units" + }, + "constraints": null, + "required": true, + "default": "Gbps" + } + }, + "volumeGroupAllowed": true + }, + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": { + "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db", + "invariantUuid": "b34833bb-6aa9-4ad6-a831-70b06367a091", + "customizationUuid": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3", + "description": null, + "name": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0", + "version": "5", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0", + "properties": { + "minCountInstances": 1, + "maxCountInstances": 1, + "initialCount": 1, + "vfModuleLabel": "ADIOD_base_vPE_BV" + }, + "inputs": {}, + "volumeGroupAllowed": false + }, + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": { + "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a", + "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339", + "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vPFE_BV" + }, + "inputs": {}, + "volumeGroupAllowed": true + } + }, + "volumeGroups": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": { + "uuid": "25284168-24bb-4698-8cb4-3f509146eca5", + "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1", + "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vRE_BV" + }, + "inputs": { + "adiodvpe0_bandwidth": { + "type": "string", + "description": "Requested VPE bandwidth", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "bandwidth" + }, + "constraints": null, + "required": true, + "default": "10" + }, + "2017488_adiodvpe0_vnf_instance_name": { + "type": "string", + "description": "The hostname assigned to the vpe.", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "vnf_instance_name" + }, + "constraints": null, + "required": true, + "default": "mtnj309me6" + }, + "2017488_adiodvpe0_vnf_config_template_version": { + "type": "string", + "description": "VPE Software Version", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "vnf_config_template_version" + }, + "constraints": null, + "required": true, + "default": "17.2" + }, + "2017488_adiodvpe0_AIC_CLLI": { + "type": "string", + "description": "AIC Site CLLI", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "AIC_CLLI" + }, + "constraints": null, + "required": true, + "default": "ATLMY8GA" + }, + "adiodvpe0_bandwidth_units": { + "type": "string", + "description": "Units of bandwidth", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "bandwidth_units" + }, + "constraints": null, + "required": true, + "default": "Gbps" + } + } + }, + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": { + "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a", + "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339", + "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vPFE_BV" + }, + "inputs": {} + } + }, + "vfcInstanceGroups": {} + } + }, + "networks": { + "ExtVL 0": { + "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986", + "invariantUuid": "379f816b-a7aa-422f-be30-17114ff50b7c", + "description": "ECOMP generic virtual link (network) base type for all other service-level and global networks", + "name": "ExtVL", + "version": "37.0", + "customizationUuid": "94fdd893-4a36-4d70-b16a-ec29c54c184f", + "inputs": { + "vnf_config_template_version": { + "type": "string", + "description": "VPE Software Version", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "17.2" + }, + "bandwidth_units": { + "type": "string", + "description": "Units of bandwidth", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "Gbps" + }, + "bandwidth": { + "type": "string", + "description": "Requested VPE bandwidth", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "10" + }, + "AIC_CLLI": { + "type": "string", + "description": "AIC Site CLLI", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "ATLMY8GA" + }, + "ASN": { + "type": "string", + "description": "AV/PE", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "AV_vPE" + }, + "vnf_instance_name": { + "type": "string", + "description": "The hostname assigned to the vpe.", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "mtnj309me6" + } + }, + "commands": {}, + "properties": { + "network_role": "network role 1, network role 2", + "min_instances": 1, + "max_instances": 10, + "ecomp_generated_naming": "true", + "network_assignments": "{is_external_network=false, ipv4_subnet_default_assignment={min_subnets_count=1}, ecomp_generated_network_assignment=false, ipv6_subnet_default_assignment={min_subnets_count=1}}", + "exVL_naming": "{ecomp_generated_naming=true}", + "network_flows": "{is_network_policy=false, is_bound_to_vpn=false}", + "network_homing": "{ecomp_selected_instance_node_target=false}" + }, + "type": "VL", + "modelCustomizationName": "ExtVL 0" + } + }, + "collectionResource": {}, + "configurations": {}, + "fabricConfigurations": {}, + "serviceProxies": {}, + "vfModules": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": { + "uuid": "25284168-24bb-4698-8cb4-3f509146eca5", + "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1", + "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vRE_BV" + }, + "inputs": { + "adiodvpe0_bandwidth": { + "type": "string", + "description": "Requested VPE bandwidth", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "bandwidth" + }, + "constraints": null, + "required": true, + "default": "10" + }, + "2017488_adiodvpe0_vnf_instance_name": { + "type": "string", + "description": "The hostname assigned to the vpe.", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "vnf_instance_name" + }, + "constraints": null, + "required": true, + "default": "mtnj309me6" + }, + "2017488_adiodvpe0_vnf_config_template_version": { + "type": "string", + "description": "VPE Software Version", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "vnf_config_template_version" + }, + "constraints": null, + "required": true, + "default": "17.2" + }, + "2017488_adiodvpe0_AIC_CLLI": { + "type": "string", + "description": "AIC Site CLLI", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "AIC_CLLI" + }, + "constraints": null, + "required": true, + "default": "ATLMY8GA" + }, + "adiodvpe0_bandwidth_units": { + "type": "string", + "description": "Units of bandwidth", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "bandwidth_units" + }, + "constraints": null, + "required": true, + "default": "Gbps" + } + }, + "volumeGroupAllowed": true + }, + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": { + "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db", + "invariantUuid": "b34833bb-6aa9-4ad6-a831-70b06367a091", + "customizationUuid": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3", + "description": null, + "name": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0", + "version": "5", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0", + "properties": { + "minCountInstances": 1, + "maxCountInstances": 1, + "initialCount": 1, + "vfModuleLabel": "ADIOD_base_vPE_BV" + }, + "inputs": {}, + "volumeGroupAllowed": false + }, + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": { + "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a", + "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339", + "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vPFE_BV" + }, + "inputs": {}, + "volumeGroupAllowed": true + } + } + } + } + + function getInstanceServiceVNF() { + return { + "vnfs": { + "2017-388_ADIOD-vPE 0": { + "action": 'None', + "inMaint": true, + "orchStatus": "Active", + "provStatus": "prov", + "rollbackOnFailure": "true", + "originalName": "2017-388_ADIOD-vPE 0", + "isMissingData": true, + "trackById": "u5mtsvzmq6p", + "vfModules": {}, + "vnfStoreKey": "2017-388_ADIOD-vPE 0", + "uuid": "afacccf6-397d-45d6-b5ae-94c39734b168", + "productFamilyId": "d8a6ed93-251c-47ca-adc9-86671fd19f4c", + "lcpCloudRegionId": null, + "tenantId": null, + "lineOfBusiness": null, + "statusMessage": "Failed Vnf Message", + "platformName": null, + "modelInfo": { + "modelType": "VF", + "modelInvariantId": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8", + "modelVersionId": "6b528779-44a3-4472-bdff-9cd15ec93450", + "modelName": "2017-388_ADIOD-vPE", + "modelVersion": "4.0", + "modelCustomizationName": "2017-388_ADIOD-vPE 0" + } + }, + "2017-488_ADIOD-vPE 0": { + "action": 'None', + "inMaint": false, + "rollbackOnFailure": "true", + "originalName": "2017-488_ADIOD-vPE 0", + "isMissingData": false, + "trackById": "1d6dg4fsgbm", + "vfModules": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0zssmp": { + "action": 'None', + "isMissingData": true, + "sdncPreReload": null, + "modelInfo": { + "modelType": "VFmodule", + "modelInvariantId": "b34833bb-6aa9-4ad6-a831-70b06367a091", + "modelVersionId": "f8360508-3f17-4414-a2ed-6bc71161e8db", + "modelName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0", + "modelVersion": "5", + "modelCustomizationId": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3", + "modelUniqueId": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0" + }, + "instanceParams": [ + {} + ], + "trackById": "v2egx1b8i1l", + "statusMessage": "Failed vfModel message" + } + } + }, + "vnfStoreKey": "2017-488_ADIOD-vPE 0", + "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09", + "productFamilyId": "d8a6ed93-251c-47ca-adc9-86671fd19f4c", + "lcpCloudRegionId": "JANET25", + "tenantId": "092eb9e8e4b7412e8787dd091bc58e86", + "lineOfBusiness": "ONAP", + "platformName": "platform", + "modelInfo": { + "modelInvariantId": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8", + "modelVersionId": "69e09f68-8b63-4cc9-b9ff-860960b5db09", + "modelName": "2017-488_ADIOD-vPE", + "modelVersion": "5.0", + "modelCustomizationId": "1da7b585-5e61-4993-b95e-8e6606c81e45", + "modelUniqueId": "1da7b585-5e61-4993-b95e-8e6606c81e45", + "modelCustomizationName": "2017-488_ADIOD-vPE 0", + "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09" + }, + "instanceName": "2017488_ADIODvPE", + "legacyRegion": "123", + "instanceParams": [ + {} + ] + } + }, + "instanceParams": [ + { + "2017488_adiodvpe0_ASN": "AV_vPE" + } + ], + "validationCounter": 3, + "existingNames": { + "yoav": "" + }, + "existingVNFCounterMap": { + "afacccf6-397d-45d6-b5ae-94c39734b168": 1, + "69e09f68-8b63-4cc9-b9ff-860960b5db09": 1 + }, + "existingNetworksCounterMap": {}, + "networks": {}, + "instanceName": "yoav", + "globalSubscriberId": "e433710f-9217-458d-a79d-1c7aff376d89", + "subscriptionServiceType": "TYLER SILVIA", + "owningEntityId": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc", + "productFamilyId": "d8a6ed93-251c-47ca-adc9-86671fd19f4c", + "lcpCloudRegionId": "JANET25", + "tenantId": "092eb9e8e4b7412e8787dd091bc58e86", + "aicZoneId": "ABC15", + "projectName": "WATKINS", + "rollbackOnFailure": "true", + "bulkSize": 1, + "aicZoneName": "AAITESAN-ABC15", + "owningEntityName": "WayneHolland", + "testApi": "VNF_API", + "isEcompGeneratedNaming": false, + "tenantName": "USP-SIP-IC-24335-T-01", + "modelInfo": { + "modelInvariantId": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0", + "modelVersionId": "6b528779-44a3-4472-bdff-9cd15ec93450", + "modelName": "action-data", + "modelVersion": "1.0", + "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450" + }, + "isALaCarte": false, + "name": "action-data", + "version": "1.0", + "description": "", + "category": "", + "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450", + "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0", + "serviceType": "", + "serviceRole": "", + "isMultiStepDesign": false + } + } + + function getInstanceServiceVNF_Network() { + return { + "vnfs": { + "2017-488_ADIOD-vPE 0": { + "action": 'None', + "rollbackOnFailure": "true", + "originalName": "2017-488_ADIOD-vPE 0", + "isMissingData": false, + "trackById": "o65b26t2thj", + "vfModules": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1sgoqi": { + "action": 'None', + "instanceName": "yoav", + "volumeGroupName": "123", + "modelInfo": { + "modelInvariantId": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1", + "modelVersionId": "25284168-24bb-4698-8cb4-3f509146eca5", + "modelName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "modelVersion": "6", + "modelCustomizationId": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401", + "modelUniqueId": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "uuid": "25284168-24bb-4698-8cb4-3f509146eca5" + }, + "uuid": "25284168-24bb-4698-8cb4-3f509146eca5", + "isMissingData": false, + "instanceParams": [ + { + "adiodvpe0_bandwidth": "10", + "2017488_adiodvpe0_vnf_instance_name": "mtnj309me6", + "2017488_adiodvpe0_vnf_config_template_version": "17.2", + "2017488_adiodvpe0_AIC_CLLI": "ATLMY8GA", + "adiodvpe0_bandwidth_units": "Gbps" + } + ] + } + } + }, + "vnfStoreKey": "2017-488_ADIOD-vPE 0", + "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09", + "productFamilyId": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034", + "lcpCloudRegionId": "hvf6", + "tenantId": "bae71557c5bb4d5aac6743a4e5f1d054", + "lineOfBusiness": "ONAP", + "platformName": "platform", + "modelInfo": { + "modelInvariantId": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8", + "modelVersionId": "69e09f68-8b63-4cc9-b9ff-860960b5db09", + "modelName": "2017-488_ADIOD-vPE", + "modelVersion": "5.0", + "modelCustomizationId": "1da7b585-5e61-4993-b95e-8e6606c81e45", + "modelCustomizationName": "2017-488_ADIOD-vPE 0", + "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09" + }, + "instanceName": "2017488_ADIODvPE", + "instanceParams": [ + {} + ] + } + }, + "instanceParams": [ + { + "2017488_adiodvpe0_ASN": "AV_vPE" + } + ], + "validationCounter": 0, + "existingNames": { + "123": "", + "yoav": "", + "instancename": "", + "extvl": "" + }, + "existingVNFCounterMap": { + "69e09f68-8b63-4cc9-b9ff-860960b5db09": 1 + }, + "existingNetworksCounterMap": { + "ddc3f20c-08b5-40fd-af72-c6d14636b986": 3 + }, + "networks": { + "ExtVL 0": { + "action": "None", + "rollbackOnFailure": "true", + "isMissingData": false, + "originalName": "ExtVL 0", + "networkStoreKey": "ExtVL 0", + "trackById": "sf3zth68xjf", + "statusMessage": "Network failed message", + "productFamilyId": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034", + "lcpCloudRegionId": "hvf6", + "tenantId": "229bcdc6eaeb4ca59d55221141d01f8e", + "platformName": "xxx1", + "lineOfBusiness": "ONAP", + "instanceParams": [ + {} + ], + "modelInfo": { + "modelInvariantId": "379f816b-a7aa-422f-be30-17114ff50b7c", + "modelVersionId": "ddc3f20c-08b5-40fd-af72-c6d14636b986", + "modelName": "ExtVL", + "modelVersion": "37.0", + "modelCustomizationId": "94fdd893-4a36-4d70-b16a-ec29c54c184f", + "modelCustomizationName": "ExtVL 0", + "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986" + }, + "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986" + }, + "ExtVL 0:0001": { + "action": "None", + "rollbackOnFailure": "true", + "isMissingData": false, + "originalName": "ExtVL 0", + "networkStoreKey": "ExtVL 0", + "trackById": "2mdxioxca9h", + "productFamilyId": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034", + "lcpCloudRegionId": "hvf6", + "tenantId": "229bcdc6eaeb4ca59d55221141d01f8e", + "platformName": "xxx1", + "lineOfBusiness": "ONAP", + "instanceParams": [ + {} + ], + "modelInfo": { + "modelInvariantId": "379f816b-a7aa-422f-be30-17114ff50b7c", + "modelVersionId": "ddc3f20c-08b5-40fd-af72-c6d14636b986", + "modelName": "ExtVL", + "modelVersion": "37.0", + "modelCustomizationId": "94fdd893-4a36-4d70-b16a-ec29c54c184f", + "modelCustomizationName": "ExtVL 0", + "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986" + }, + "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986" + }, + "ExtVL 0_1": { + "action": "None", + "rollbackOnFailure": "true", + "isMissingData": false, + "originalName": "ExtVL 0", + "networkStoreKey": "ExtVL 0_1", + "trackById": "z7vd1gmpbs", + "instanceName": "ExtVL", + "productFamilyId": "17cc1042-527b-11e6-beb8-9e71128cae77", + "lcpCloudRegionId": "hvf6", + "tenantId": "229bcdc6eaeb4ca59d55221141d01f8e", + "platformName": "xxx1", + "lineOfBusiness": "zzz1", + "instanceParams": [ + { + "vnf_config_template_version": "17.2", + "bandwidth_units": "Gbps", + "bandwidth": "10", + "AIC_CLLI": "ATLMY8GA", + "ASN": "AV_vPE", + "vnf_instance_name": "yoav" + } + ], + "modelInfo": { + "modelInvariantId": "379f816b-a7aa-422f-be30-17114ff50b7c", + "modelVersionId": "ddc3f20c-08b5-40fd-af72-c6d14636b986", + "modelName": "ExtVL", + "modelVersion": "37.0", + "modelCustomizationId": "94fdd893-4a36-4d70-b16a-ec29c54c184f", + "modelCustomizationName": "ExtVL 0", + "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986" + }, + "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986" + } + }, + "instanceName": "InstanceName", + "globalSubscriberId": "e433710f-9217-458d-a79d-1c7aff376d89", + "subscriptionServiceType": "TYLER SILVIA", + "owningEntityId": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc", + "productFamilyId": "17cc1042-527b-11e6-beb8-9e71128cae77", + "lcpCloudRegionId": "JANET25", + "tenantId": "092eb9e8e4b7412e8787dd091bc58e86", + "aicZoneId": "JAG1", + "projectName": null, + "rollbackOnFailure": "true", + "bulkSize": 1, + "aicZoneName": "YUDFJULP-JAG1", + "owningEntityName": "WayneHolland", + "testApi": "GR_API", + "isEcompGeneratedNaming": false, + "tenantName": "USP-SIP-IC-24335-T-01", + "modelInfo": { + "modelInvariantId": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0", + "modelVersionId": "6b528779-44a3-4472-bdff-9cd15ec93450", + "modelName": "action-data", + "modelVersion": "1.0", + "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450" + }, + "isALaCarte": false, + "name": "action-data", + "version": "1.0", + "description": "", + "category": "", + "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450", + "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0", + "serviceType": "", + "serviceRole": "", + "isMultiStepDesign": false + } + } + + function expectInstanceNodesResultVNF() { + return [ + { + "action": 'None', + "modelId": "afacccf6-397d-45d6-b5ae-94c39734b168", + "modelCustomizationId": "b3c76f73-eeb5-4fb6-9d31-72a889f1811c", + "modelUniqueId": "b3c76f73-eeb5-4fb6-9d31-72a889f1811c", + "missingData": true, + "id": "u5mtsvzmq6p", + "orchStatus": 'Active', + "provStatus": 'prov', + "inMaint": true, + "name": "2017-388_ADIOD-vPE 0", + "modelName": "2017-388_ADIOD-vPE 0", + "type": "VF", + "parentType": '', + "isEcompGeneratedNaming": false, + "networkStoreKey": "2017-388_ADIOD-vPE 0", + "vnfStoreKey": "2017-388_ADIOD-vPE 0", + "typeName": "VNF", + "children": [], + "statusMessage": "Failed Vnf Message", + "statusProperties": [Object({ + key: 'Prov Status:', + value: 'prov', + testId: 'provStatus' + }), Object({ key: 'Orch Status:', value: 'Active', testId: 'orchStatus' }), Object({ + key: 'In-maintenance', + value: '', + testId: 'inMaint' + })] + }, + { + "action": 'None', + "modelId": "69e09f68-8b63-4cc9-b9ff-860960b5db09", + "missingData": false, + "id": "1d6dg4fsgbm", + "inMaint": false, + "parentType": '', + "name": "2017-488_ADIOD-vPE 0", + "modelName": "2017-488_ADIOD-vPE 0", + "type": "VF", + "isEcompGeneratedNaming": false, + "networkStoreKey": "2017-488_ADIOD-vPE 0", + "vnfStoreKey": "2017-488_ADIOD-vPE 0", + "typeName": "VNF", + "statusProperties": [Object({ + key: 'Prov Status:', + value: undefined, + testId: 'provStatus' + }), Object({ key: 'Orch Status:', value: undefined, testId: 'orchStatus' })], + "children": [{ + "parentType": 'VNF', + "action": 'None', + "modelId": "f8360508-3f17-4414-a2ed-6bc71161e8db", + "modelCustomizationId": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3", + "modelUniqueId": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3", + "missingData": true, + "id": "v2egx1b8i1l", + "statusMessage": "Failed vfModel message", + "name": "<Automatically Assigned>", + "modelName": "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0", + "type": "VFmodule", + "isEcompGeneratedNaming": false, + "dynamicInputs": [], + "dynamicModelName": "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0zssmp", + "typeName": "M", + "statusProperties": [Object({ + key: 'Prov Status:', + value: undefined, + testId: 'provStatus' + }), Object({ key: 'Orch Status:', value: undefined, testId: 'orchStatus' })], + }] + }] + } + + function expectInstanceNodesResultVNF_Network() { + return [ + { + "parentType": '', + "action": 'None', + "modelId": "69e09f68-8b63-4cc9-b9ff-860960b5db09", + "missingData": false, + "id": "o65b26t2thj", + "name": "2017488_ADIODvPE", + "modelName": "2017-488_ADIOD-vPE 0", + "type": "VF", + "isEcompGeneratedNaming": false, + "vnfStoreKey": "2017-488_ADIOD-vPE 0", + "typeName": "VNF", + "statusProperties": [Object({ + key: 'Prov Status:', + value: undefined, + testId: 'provStatus' + }), Object({ key: 'Orch Status:', value: undefined, testId: 'orchStatus' })], + "children": [ + { + "action": 'None', + "modelId": "25284168-24bb-4698-8cb4-3f509146eca5", + "missingData": false, + "name": "yoav", + "modelName": "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "type": "VFmodule", + "isEcompGeneratedNaming": false, + "typeName": "M", + "dynamicInputs": [ + { + "id": "adiodvpe0_bandwidth", + "type": "string", + "name": "adiodvpe0_bandwidth", + "value": "10", + "isRequired": true, + "description": "Requested VPE bandwidth" + }, + { + "id": "2017488_adiodvpe0_vnf_instance_name", + "type": "string", + "name": "2017488_adiodvpe0_vnf_instance_name", + "value": "mtnj309me6", + "isRequired": true, + "description": "The hostname assigned to the vpe." + }, + { + "id": "2017488_adiodvpe0_vnf_config_template_version", + "type": "string", + "name": "2017488_adiodvpe0_vnf_config_template_version", + "value": "17.2", + "isRequired": true, + "description": "VPE Software Version" + }, + { + "id": "2017488_adiodvpe0_AIC_CLLI", + "type": "string", + "name": "2017488_adiodvpe0_AIC_CLLI", + "value": "ATLMY8GA", + "isRequired": true, + "description": "AIC Site CLLI" + }, + { + "id": "adiodvpe0_bandwidth_units", + "type": "string", + "name": "adiodvpe0_bandwidth_units", + "value": "Gbps", + "isRequired": true, + "description": "Units of bandwidth" + } + ], + "dynamicModelName": "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1sgoqi" + } + ] + }, + { + "parentType": '', + "action": 'None', + "modelId": "ddc3f20c-08b5-40fd-af72-c6d14636b986", + "modelCustomizationId": "94fdd893-4a36-4d70-b16a-ec29c54c184f", + "modelUniqueId": "94fdd893-4a36-4d70-b16a-ec29c54c184f", + "missingData": false, + "id": "sf3zth68xjf", + "name": "<Automatically Assigned>", + "statusMessage": "Network failed message", + "modelName": "ExtVL 0", + "type": "VL", + "isEcompGeneratedNaming": true, + "networkStoreKey": "ExtVL 0", + "typeName": "N", + "statusProperties": [Object({ + key: 'Prov Status:', + value: undefined, + testId: 'provStatus' + }), Object({ key: 'Orch Status:', value: undefined, testId: 'orchStatus' })], + }, + { + "parentType": '', + "action": 'None', + "originalAction": 'None', + "modelId": "ddc3f20c-08b5-40fd-af72-c6d14636b986", + "missingData": false, + "id": "2mdxioxca9h", + "name": "<Automatically Assigned>", + "modelName": "ExtVL 0", + "type": "VL", + "isEcompGeneratedNaming": true, + "networkStoreKey": "ExtVL 0:0001", + "typeName": "M" + }, + { + "parentType": '', + "action": 'None', + "originalAction": 'None', + "modelId": "ddc3f20c-08b5-40fd-af72-c6d14636b986", + "missingData": false, + "id": "z7vd1gmpbs", + "name": "ExtVL", + "modelName": "ExtVL 0", + "type": "VL", + "isEcompGeneratedNaming": true, + "networkStoreKey": "ExtVL 0_1", + "typeName": "M" + } + ]; + } +}); diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/objectToInstanceTree/objectToInstanceTree.service.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/objectToInstanceTree/objectToInstanceTree.service.ts new file mode 100644 index 000000000..1fc439ea3 --- /dev/null +++ b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/objectToInstanceTree/objectToInstanceTree.service.ts @@ -0,0 +1,163 @@ +import {Injectable} from "@angular/core"; +import {ILevelNodeInfo} from "../models/basic.model.info"; +import {ObjectToTreeService} from "../objectToTree.service"; +import {DefaultDataGeneratorService} from "../../../../shared/services/defaultDataServiceGenerator/default.data.generator.service"; +import * as _ from "lodash"; +import {ServiceInstanceActions} from "../../../../shared/models/serviceInstanceActions"; +import {ErrorMsgService} from "../../../../shared/components/error-msg/error-msg.service"; +import {FeatureFlagsService, Features} from "../../../../shared/services/featureFlag/feature-flags.service"; +import {NgRedux} from "@angular-redux/store"; +import {AppState} from "../../../../shared/store/reducers"; + +@Injectable() +export class ObjectToInstanceTreeService { + constructor(private _objectToTreeService: ObjectToTreeService, private _errorMsgService: ErrorMsgService, private store: NgRedux<AppState>) { + this.numberOfFailed = 0; + this.numberOfElements = 0; + + } + + /** store number of failed ******** ONLY IN RETRY MODE ******** **/ + numberOfFailed: number = 0; + + /** store number of existing elements **/ + numberOfElements: number = 0; + + /***************************************************************** + * return array of first level node with there child's + * @param serviceInstance - The service instance object from store + * @param serviceHierarchy - The service Hierarchy store + ****************************************************************/ + convertServiceInstanceToTreeData(serviceInstance, serviceHierarchy): any[] { + this._errorMsgService.triggerClearError.next(); + let nodes = []; + this.numberOfFailed = 0; + this.numberOfElements = 0; + let _this = this; + const firstLevelOptions: ILevelNodeInfo[] = _this._objectToTreeService.getFirstLevelOptions(); + for (let option of firstLevelOptions) { + _.forOwn(serviceInstance[option.name], function (instance, modelName) { + nodes.push(_this.getNodeInstance(modelName, null, instance, serviceHierarchy, option)); + }); + } + return this.sortElementsByPosition(nodes); + } + + /***************************************************************** + * should increase number of failed + * @param node - the current node + ****************************************************************/ + increaseNumberOfFailed(node) { + if (node.isFailed) { + this.numberOfFailed++; + node['errors'] = !_.isNil(node['errors']) ? node['errors'] : {}; + node['errors']["isFailed"] = true; + this._errorMsgService.triggerShowError.next(this._errorMsgService.getRetryErrorObject(this.numberOfFailed)); + } + } + + /***************************************************************** + * should increase number of existing elements + * @param node - the current node + ****************************************************************/ + increaseNumberOfExcitingElements() { + this.numberOfElements++; + } + + /***************************************************************** + * return array of first level node with there child's + * @param modelName + * @param parentModel + * @param instance + * @param serviceHierarchy - The service Hierarchy store + * @param option + * @param parentType + ****************************************************************/ + getNodeInstance(modelName: string, parentModel: any, instance: any, serviceHierarchy, option: ILevelNodeInfo, parentType ?: string) { + const model = option.getModel(modelName, instance, serviceHierarchy); + + let optionalNodes = option.createInstanceTreeNode(instance, model, parentModel, modelName); + this.increaseNumberOfFailed(optionalNodes); + this.increaseNumberOfExcitingElements(); + let nodes: any[] = _.isArray(optionalNodes) ? optionalNodes : [optionalNodes]; + for (let node of nodes) { + node = this.addingExtraDataToNode(node, modelName, parentModel, instance, serviceHierarchy, option, parentType); + let children = this.addNextInstanceTreeNode(instance, model, option, node, serviceHierarchy); + if (!_.isNil(children) && children.length > 0) { + node.children = this.sortElementsByPosition(children); + } + this.updateScalingPolicy(node); + } + return nodes.length === 1 ? nodes[0] : nodes; + } + + addingExtraDataToNode(node, modelName: string, parentModel: any, instance: any, serviceHierarchy, option: ILevelNodeInfo, parentType ?: string) { + node.trackById = _.isNil(node.trackById) ? DefaultDataGeneratorService.createRandomTrackById() : node['trackById']; + node.parentType = !_.isNil(parentType) ? parentType : ""; + node.updatePoistionFunction = option.updatePosition; + node.position = option.getNodePosition(instance, node.dynamicModelName); + node.onSelectedNode = option.onSelectedNode; + return node; + } + + sortElementsByPosition(nodes: any[]): any[] { + if (!FeatureFlagsService.getFlagState(Features.DRAG_AND_DROP_OPERATION, this.store)) return nodes; + return nodes.sort((nodeA, nodeB) => { + return nodeA.position - nodeB.position; + }); + } + + /***************************************************************** + * return next level node with there child's + * @param parentInstance + * @param parentModel + * @param levelNodeInfo + * @param parentNode + * @param serviceHierarchy - The service Hierarchy store + ****************************************************************/ + addNextInstanceTreeNode(parentInstance, parentModel, levelNodeInfo: ILevelNodeInfo, parentNode, serviceHierarchy): any[] { + if (!_.isNil(levelNodeInfo.childName)) { + parentNode.children = []; + if (!_.isNil(parentInstance[levelNodeInfo.childName])) { + let parentType = levelNodeInfo.type; + let nextLevelNodeInfo = levelNodeInfo.getNextLevelObject.apply(this); + Object.keys(parentInstance[levelNodeInfo.childName]).map((modelName) => { + let nextLevelInstance = parentInstance[levelNodeInfo.childName][modelName]; + let nodes: any[] | any = this.getNodeInstance(modelName, parentModel, nextLevelInstance, serviceHierarchy, nextLevelNodeInfo, parentType); + if (_.isArray(nodes)) { + parentNode.children = parentNode.children.concat(nodes); + } else { + parentNode.children.push(nodes); + } + }); + return this.sortElementsByPosition(parentNode.children); + } + } + return parentNode.children; + } + + + /************************************************************************************ + * update instance scaling policy according to instance limit and existing children + * @param node + *********************************************************************************/ + updateScalingPolicy(node): void { + node['errors'] = !_.isNil(node['errors']) ? node['errors'] : {}; + if (!_.isNil(node['limitMembers']) && !_.isNil(node.children)) { + let effectiveChildren = (node.children).filter(child => [ + ServiceInstanceActions.Create, + ServiceInstanceActions.None, + ServiceInstanceActions.Update + ].includes(child.action)); + + + if (effectiveChildren.length > node.limitMembers) { + node['errors']["scalingError"] = true; + this._errorMsgService.triggerShowError.next(this._errorMsgService.getScalingErrorObject()); + } else { + delete node['errors']["scalingError"]; + } + + } + } +} diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/objectToModelTree/objectToModelTree.service.spec.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/objectToModelTree/objectToModelTree.service.spec.ts new file mode 100644 index 000000000..41ad23f07 --- /dev/null +++ b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/objectToModelTree/objectToModelTree.service.spec.ts @@ -0,0 +1,727 @@ +import {HttpClientTestingModule, HttpTestingController} from "@angular/common/http/testing"; +import {getTestBed, TestBed} from "@angular/core/testing"; +import {MockNgRedux, NgReduxTestingModule} from "@angular-redux/store/testing"; +import {NgRedux} from "@angular-redux/store"; +import {ObjectToTreeService} from "../objectToTree.service"; +import {ObjectToModelTreeService} from "./objectToModelTree.service"; +import {DefaultDataGeneratorService} from "../../../../shared/services/defaultDataServiceGenerator/default.data.generator.service"; +import {DynamicInputsService} from "../dynamicInputs.service"; +import {SharedTreeService} from "../shared.tree.service"; +import {DrawingBoardModes} from "../../drawing-board.modes"; +import {AvailableModelsTreeService} from "../../available-models-tree/available-models-tree.service"; +import {DialogService} from "ng2-bootstrap-modal"; +import {VnfPopupService} from "../../../../shared/components/genericFormPopup/genericFormServices/vnf/vnf.popup.service"; +import {BasicControlGenerator} from "../../../../shared/components/genericForm/formControlsServices/basic.control.generator"; +import {GenericFormService} from "../../../../shared/components/genericForm/generic-form.service"; +import {FormBuilder} from "@angular/forms"; +import {LogService} from "../../../../shared/utils/log/log.service"; +import {IframeService} from "../../../../shared/utils/iframe.service"; +import {BasicPopupService} from "../../../../shared/components/genericFormPopup/genericFormServices/basic.popup.service"; +import {NetworkPopupService} from "../../../../shared/components/genericFormPopup/genericFormServices/network/network.popup.service"; +import {NetworkControlGenerator} from "../../../../shared/components/genericForm/formControlsServices/networkGenerator/network.control.generator"; +import {VfModulePopuopService} from "../../../../shared/components/genericFormPopup/genericFormServices/vfModule/vfModule.popuop.service"; +import {VfModuleControlGenerator} from "../../../../shared/components/genericForm/formControlsServices/vfModuleGenerator/vfModule.control.generator"; +import {FeatureFlagsService} from "../../../../shared/services/featureFlag/feature-flags.service"; +import {VnfControlGenerator} from "../../../../shared/components/genericForm/formControlsServices/vnfGenerator/vnf.control.generator"; +import {AaiService} from "../../../../shared/services/aaiService/aai.service"; +import {VnfGroupPopupService} from "../../../../shared/components/genericFormPopup/genericFormServices/vnfGroup/vnfGroup.popup.service"; +import {VnfGroupControlGenerator} from "../../../../shared/components/genericForm/formControlsServices/vnfGroupGenerator/vnfGroup.control.generator"; +import {DuplicateService} from "../../duplicate/duplicate.service"; +import {SdcUiComponentsModule} from "onap-ui-angular"; +import {ComponentInfoService} from "../../component-info/component-info.service"; + +class MockAppStore<T> { + getState() { + return { + global: { + 'drawingBoardStatus': DrawingBoardModes.CREATE + } + } + } +} + +describe('Model Tree Generator service', () => { + let injector; + let service: ObjectToModelTreeService; + let httpMock: HttpTestingController; + + beforeEach(() => { + + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule, NgReduxTestingModule, SdcUiComponentsModule], + providers: [ + AvailableModelsTreeService, + ObjectToTreeService, + ObjectToModelTreeService, + DefaultDataGeneratorService, + DynamicInputsService, + SharedTreeService, + DialogService, + VnfPopupService, + VnfGroupPopupService, + BasicControlGenerator, + GenericFormService, + FormBuilder, + LogService, + IframeService, + BasicPopupService, + NetworkPopupService, + NetworkControlGenerator, + VfModulePopuopService, + VfModuleControlGenerator, + VnfGroupControlGenerator, + DialogService, + FeatureFlagsService, + VnfControlGenerator, + AaiService, + DialogService, + DuplicateService, + ComponentInfoService, + {provide: NgRedux, useClass: MockAppStore}, + MockNgRedux] + }).compileComponents(); + + injector = getTestBed(); + service = injector.get(ObjectToModelTreeService); + httpMock = injector.get(HttpTestingController); + }); + + test('ObjectToModelTreeService should be defined', () => { + expect(service).toBeDefined(); + }); + + test('should return nodes correctly: VNF', () => { + + let convertToNodes = service.convertServiceHierarchyModelToTreeNodes(getServiceHeirarchyVNF()); + convertToNodes.map((item) => { + delete item['onAddClick']; + delete item['getNodeCount']; + delete item['showNodeIcons']; + delete item['menuActions']; + delete item['getMenuAction']; + delete item['trackById']; + + if (item.children) { + item.children.map((child) => { + delete child['onAddClick']; + delete child['getNodeCount']; + delete child['showNodeIcons']; + delete child['menuActions']; + delete child['getMenuAction']; + delete child['trackById']; + }); + } + }); + + expect(Object.assign({}, convertToNodes)).toEqual(Object.assign({}, expectNodesResultVNF())); + }); + + + function expectNodesResultVNF() { + return [{ + "id": "280dec31-f16d-488b-9668-4aae55d6648a", + "modelVersionId": "0903e1c0-8e03-4936-b5c2-260653b96413", + "name": "2017-388_ADIOD-vPE 1", + "tooltip": "VF", + "type": "VF", + "count": 0, + "max": 1, + "children": [], + "disabled": false, + "modelCustomizationId": "280dec31-f16d-488b-9668-4aae55d6648a", + "modelUniqueId": "280dec31-f16d-488b-9668-4aae55d6648a", + "dynamicInputs": [], + "isEcompGeneratedNaming": true, + "typeName": 'VNF' + }, { + "id": "b3c76f73-eeb5-4fb6-9d31-72a889f1811c", + "modelVersionId": "afacccf6-397d-45d6-b5ae-94c39734b168", + "modelCustomizationId": "b3c76f73-eeb5-4fb6-9d31-72a889f1811c", + "modelUniqueId": "b3c76f73-eeb5-4fb6-9d31-72a889f1811c", + "name": "2017-388_ADIOD-vPE 0", + "tooltip": "VF", + "type": "VF", + "count": 0, + "max": 1, + "children": [], + "disabled": false, + "dynamicInputs": [], + "isEcompGeneratedNaming": true, + "typeName": 'VNF' + }, { + "id": "1da7b585-5e61-4993-b95e-8e6606c81e45", + "modelVersionId": "69e09f68-8b63-4cc9-b9ff-860960b5db09", + "modelCustomizationId": "1da7b585-5e61-4993-b95e-8e6606c81e45", + "modelUniqueId": "1da7b585-5e61-4993-b95e-8e6606c81e45", + "name": "2017-488_ADIOD-vPE 0", + "tooltip": "VF", + "type": "VF", + "count": 0, + "max": 1, + "children": [{ + "id": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401", + "modelVersionId": "25284168-24bb-4698-8cb4-3f509146eca5", + "modelCustomizationId": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401", + "modelUniqueId": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401", + "name": "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "tooltip": "VFmodule", + "type": "VFmodule", + "count": 0, + "max": 1, + "children": [], + "disabled": false, + "dynamicInputs": [], + "isEcompGeneratedNaming": true, + "typeName": 'M' + }, { + "id": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3", + "modelVersionId": "f8360508-3f17-4414-a2ed-6bc71161e8db", + "modelCustomizationId": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3", + "modelUniqueId": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3", + "name": "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0", + "tooltip": "VFmodule", + "type": "VFmodule", + "count": 0, + "max": 1, + "children": [], + "disabled": false, + "dynamicInputs": [], + "isEcompGeneratedNaming": true, + "typeName": 'M' + }, { + "id": "3cd946bb-50e0-40d8-96d3-c9023520b557", + "modelVersionId": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a", + "modelCustomizationId": "3cd946bb-50e0-40d8-96d3-c9023520b557", + "modelUniqueId": "3cd946bb-50e0-40d8-96d3-c9023520b557", + "name": "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "tooltip": "VFmodule", + "type": "VFmodule", + "count": 0, + "max": 1, + "children": [], + "disabled": false, + "dynamicInputs": [], + "isEcompGeneratedNaming": true, + "typeName": 'M' + }], + "disabled": false, + "dynamicInputs": [], + "isEcompGeneratedNaming": true, + "typeName": 'VNF' + }] + + } + + function getServiceHeirarchyVNF() { + return { + "service": { + "uuid": "1a80c596-27e5-4ca9-b5bb-e03a7fd4c0fd", + "invariantUuid": "cdb90b57-ed78-4d44-a5b4-7f43a02ec632", + "name": "action-data", + "version": "1.0", + "toscaModelURL": null, + "category": "Network L1-3", + "serviceType": "pnf", + "serviceRole": "Testing", + "description": "ADIOD vMX vPE based on Juniper 17.2 release. Updated with updated VF for v8.0 of VLM", + "serviceEcompNaming": "false", + "instantiationType": "Macro", + "inputs": {}, + "vidNotions": {"instantiationUI": "legacy", "modelCategory": "other"} + }, + "vnfs": { + "2017-388_ADIOD-vPE 1": { + "uuid": "0903e1c0-8e03-4936-b5c2-260653b96413", + "invariantUuid": "00beb8f9-6d39-452f-816d-c709b9cbb87d", + "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM", + "name": "2017-388_ADIOD-vPE", + "version": "1.0", + "customizationUuid": "280dec31-f16d-488b-9668-4aae55d6648a", + "inputs": {}, + "commands": {}, + "properties": { + "vmxvre_retype": "RE-VMX", + "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version", + "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d", + "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9", + "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF", + "int_ctl_net_name": "VMX-INTXI", + "vmx_int_ctl_prefix": "10.0.0.10", + "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5", + "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279", + "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a", + "nf_type": "vPE", + "vmxvpfe_int_ctl_ip_1": "10.0.0.10", + "is_AVPN_service": "false", + "vmx_RSG_name": "vREXI-affinity", + "vmx_int_ctl_forwarding": "l2", + "vmxvre_oam_ip_0": "10.0.0.10", + "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvpfe_sriov41_0_port_vlanstrip": "false", + "vmxvpfe_sriov42_0_port_vlanfilter": "4001", + "vmxvpfe_sriov44_0_port_unknownunicastallow": "true", + "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2", + "vmxvre_instance": "0", + "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvre_flavor_name": "ns.c1r16d32.v5", + "vmxvpfe_volume_size_0": "40.0", + "vmxvpfe_sriov43_0_port_vlanfilter": "4001", + "nf_naming": "{ecomp_generated_naming=true}", + "multi_stage_design": "true", + "nf_naming_code": "Navneet", + "vmxvre_name_0": "vREXI", + "vmxvpfe_sriov42_0_port_vlanstrip": "false", + "vmxvpfe_volume_name_0": "vPFEXI_FBVolume", + "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141", + "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2", + "vmxvpfe_sriov43_0_port_unknownunicastallow": "true", + "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true", + "vmxvre_console": "vidconsole", + "vmxvpfe_sriov44_0_port_vlanfilter": "4001", + "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3", + "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true", + "vmxvpfe_sriov44_0_port_vlanstrip": "false", + "vf_module_id": "123", + "nf_function": "JAI", + "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true", + "vmxvre_int_ctl_ip_0": "10.0.0.10", + "ecomp_generated_naming": "true", + "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI", + "vnf_name": "mtnj309me6vre", + "vmxvpfe_sriov41_0_port_unknownunicastallow": "true", + "vmxvre_volume_type_1": "HITACHI", + "vmxvpfe_sriov44_0_port_broadcastallow": "true", + "vmxvre_volume_type_0": "HITACHI", + "vmxvpfe_volume_type_0": "HITACHI", + "vmxvpfe_sriov43_0_port_broadcastallow": "true", + "bandwidth_units": "get_input:2017488_adiodvpe0_bandwidth_units", + "vnf_id": "123", + "vmxvre_oam_prefix": "24", + "availability_zone_0": "mtpocfo-kvm-az01", + "ASN": "get_input:2017488_adiodvpe0_ASN", + "vmxvre_chassis_i2cid": "161", + "vmxvpfe_name_0": "vPFEXI", + "bandwidth": "get_input:2017488_adiodvpe0_bandwidth", + "availability_zone_max_count": "1", + "vmxvre_volume_size_0": "45.0", + "vmxvre_volume_size_1": "50.0", + "vmxvpfe_sriov42_0_port_broadcastallow": "true", + "vmxvre_oam_gateway": "10.0.0.10", + "vmxvre_volume_name_1": "vREXI_FAVolume", + "vmxvre_ore_present": "0", + "vmxvre_volume_name_0": "vREXI_FBVolume", + "vmxvre_type": "0", + "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name", + "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true", + "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429", + "vmx_int_ctl_len": "24", + "vmxvpfe_sriov43_0_port_vlanstrip": "false", + "vmxvpfe_sriov41_0_port_broadcastallow": "true", + "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d", + "vmxvpfe_sriov41_0_port_vlanfilter": "4001", + "nf_role": "Testing", + "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a", + "vmxvpfe_sriov42_0_port_unknownunicastallow": "true", + "vmxvpfe_flavor_name": "ns.c20r16d25.v5" + }, + "type": "VF", + "modelCustomizationName": "2017-388_ADIOD-vPE 1", + "vfModules": {}, + "volumeGroups": {}, + "vfcInstanceGroups": {} + }, + "2017-388_ADIOD-vPE 0": { + "uuid": "afacccf6-397d-45d6-b5ae-94c39734b168", + "invariantUuid": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8", + "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM", + "name": "2017-388_ADIOD-vPE", + "version": "4.0", + "customizationUuid": "b3c76f73-eeb5-4fb6-9d31-72a889f1811c", + "inputs": {}, + "commands": {}, + "properties": { + "vmxvre_retype": "RE-VMX", + "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version", + "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d", + "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9", + "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF", + "int_ctl_net_name": "VMX-INTXI", + "vmx_int_ctl_prefix": "10.0.0.10", + "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5", + "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279", + "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a", + "nf_type": "vPE", + "vmxvpfe_int_ctl_ip_1": "10.0.0.10", + "is_AVPN_service": "false", + "vmx_RSG_name": "vREXI-affinity", + "vmx_int_ctl_forwarding": "l2", + "vmxvre_oam_ip_0": "10.0.0.10", + "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvpfe_sriov41_0_port_vlanstrip": "false", + "vmxvpfe_sriov42_0_port_vlanfilter": "4001", + "vmxvpfe_sriov44_0_port_unknownunicastallow": "true", + "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2", + "vmxvre_instance": "0", + "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvre_flavor_name": "ns.c1r16d32.v5", + "vmxvpfe_volume_size_0": "40.0", + "vmxvpfe_sriov43_0_port_vlanfilter": "4001", + "nf_naming": "{ecomp_generated_naming=true}", + "multi_stage_design": "true", + "nf_naming_code": "Navneet", + "vmxvre_name_0": "vREXI", + "vmxvpfe_sriov42_0_port_vlanstrip": "false", + "vmxvpfe_volume_name_0": "vPFEXI_FBVolume", + "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141", + "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2", + "vmxvpfe_sriov43_0_port_unknownunicastallow": "true", + "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true", + "vmxvre_console": "vidconsole", + "vmxvpfe_sriov44_0_port_vlanfilter": "4001", + "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3", + "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true", + "vmxvpfe_sriov44_0_port_vlanstrip": "false", + "vf_module_id": "123", + "nf_function": "JAI", + "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true", + "vmxvre_int_ctl_ip_0": "10.0.0.10", + "ecomp_generated_naming": "true", + "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI", + "vnf_name": "mtnj309me6vre", + "vmxvpfe_sriov41_0_port_unknownunicastallow": "true", + "vmxvre_volume_type_1": "HITACHI", + "vmxvpfe_sriov44_0_port_broadcastallow": "true", + "vmxvre_volume_type_0": "HITACHI", + "vmxvpfe_volume_type_0": "HITACHI", + "vmxvpfe_sriov43_0_port_broadcastallow": "true", + "bandwidth_units": "get_input:2017488_adiodvpe0_bandwidth_units", + "vnf_id": "123", + "vmxvre_oam_prefix": "24", + "availability_zone_0": "mtpocfo-kvm-az01", + "ASN": "get_input:2017488_adiodvpe0_ASN", + "vmxvre_chassis_i2cid": "161", + "vmxvpfe_name_0": "vPFEXI", + "bandwidth": "get_input:2017488_adiodvpe0_bandwidth", + "availability_zone_max_count": "1", + "vmxvre_volume_size_0": "45.0", + "vmxvre_volume_size_1": "50.0", + "vmxvpfe_sriov42_0_port_broadcastallow": "true", + "vmxvre_oam_gateway": "10.0.0.10", + "vmxvre_volume_name_1": "vREXI_FAVolume", + "vmxvre_ore_present": "0", + "vmxvre_volume_name_0": "vREXI_FBVolume", + "vmxvre_type": "0", + "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name", + "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true", + "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429", + "vmx_int_ctl_len": "24", + "vmxvpfe_sriov43_0_port_vlanstrip": "false", + "vmxvpfe_sriov41_0_port_broadcastallow": "true", + "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d", + "vmxvpfe_sriov41_0_port_vlanfilter": "4001", + "nf_role": "Testing", + "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a", + "vmxvpfe_sriov42_0_port_unknownunicastallow": "true", + "vmxvpfe_flavor_name": "ns.c20r16d25.v5" + }, + "type": "VF", + "modelCustomizationName": "2017-388_ADIOD-vPE 0", + "vfModules": {}, + "volumeGroups": {}, + "vfcInstanceGroups": {} + }, + "2017-488_ADIOD-vPE 0": { + "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09", + "invariantUuid": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8", + "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM", + "name": "2017-488_ADIOD-vPE", + "version": "5.0", + "customizationUuid": "1da7b585-5e61-4993-b95e-8e6606c81e45", + "inputs": {}, + "commands": {}, + "properties": { + "vmxvre_retype": "RE-VMX", + "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version", + "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d", + "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9", + "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF", + "int_ctl_net_name": "VMX-INTXI", + "vmx_int_ctl_prefix": "10.0.0.10", + "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5", + "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279", + "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a", + "nf_type": "vPE", + "vmxvpfe_int_ctl_ip_1": "10.0.0.10", + "is_AVPN_service": "false", + "vmx_RSG_name": "vREXI-affinity", + "vmx_int_ctl_forwarding": "l2", + "vmxvre_oam_ip_0": "10.0.0.10", + "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvpfe_sriov41_0_port_vlanstrip": "false", + "vmxvpfe_sriov42_0_port_vlanfilter": "4001", + "vmxvpfe_sriov44_0_port_unknownunicastallow": "true", + "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2", + "vmxvre_instance": "0", + "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvre_flavor_name": "ns.c1r16d32.v5", + "vmxvpfe_volume_size_0": "40.0", + "vmxvpfe_sriov43_0_port_vlanfilter": "4001", + "nf_naming": "{ecomp_generated_naming=true}", + "multi_stage_design": "true", + "nf_naming_code": "Navneet", + "vmxvre_name_0": "vREXI", + "vmxvpfe_sriov42_0_port_vlanstrip": "false", + "vmxvpfe_volume_name_0": "vPFEXI_FBVolume", + "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141", + "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2", + "vmxvpfe_sriov43_0_port_unknownunicastallow": "true", + "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true", + "vmxvre_console": "vidconsole", + "vmxvpfe_sriov44_0_port_vlanfilter": "4001", + "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3", + "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true", + "vmxvpfe_sriov44_0_port_vlanstrip": "false", + "vf_module_id": "123", + "nf_function": "JAI", + "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true", + "vmxvre_int_ctl_ip_0": "10.0.0.10", + "ecomp_generated_naming": "true", + "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI", + "vnf_name": "mtnj309me6vre", + "vmxvpfe_sriov41_0_port_unknownunicastallow": "true", + "vmxvre_volume_type_1": "HITACHI", + "vmxvpfe_sriov44_0_port_broadcastallow": "true", + "vmxvre_volume_type_0": "HITACHI", + "vmxvpfe_volume_type_0": "HITACHI", + "vmxvpfe_sriov43_0_port_broadcastallow": "true", + "bandwidth_units": "get_input:2017488_adiodvpe0_bandwidth_units", + "vnf_id": "123", + "vmxvre_oam_prefix": "24", + "availability_zone_0": "mtpocfo-kvm-az01", + "ASN": "get_input:2017488_adiodvpe0_ASN", + "vmxvre_chassis_i2cid": "161", + "vmxvpfe_name_0": "vPFEXI", + "bandwidth": "get_input:2017488_adiodvpe0_bandwidth", + "availability_zone_max_count": "1", + "vmxvre_volume_size_0": "45.0", + "vmxvre_volume_size_1": "50.0", + "vmxvpfe_sriov42_0_port_broadcastallow": "true", + "vmxvre_oam_gateway": "10.0.0.10", + "vmxvre_volume_name_1": "vREXI_FAVolume", + "vmxvre_ore_present": "0", + "vmxvre_volume_name_0": "vREXI_FBVolume", + "vmxvre_type": "0", + "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name", + "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true", + "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429", + "vmx_int_ctl_len": "24", + "vmxvpfe_sriov43_0_port_vlanstrip": "false", + "vmxvpfe_sriov41_0_port_broadcastallow": "true", + "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d", + "vmxvpfe_sriov41_0_port_vlanfilter": "4001", + "nf_role": "Testing", + "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a", + "vmxvpfe_sriov42_0_port_unknownunicastallow": "true", + "vmxvpfe_flavor_name": "ns.c20r16d25.v5" + }, + "type": "VF", + "modelCustomizationName": "2017-488_ADIOD-vPE 0", + "vfModules": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": { + "uuid": "25284168-24bb-4698-8cb4-3f509146eca5", + "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1", + "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vRE_BV", + "baseModule": false + }, + "inputs": {}, + "volumeGroupAllowed": true + }, + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": { + "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db", + "invariantUuid": "b34833bb-6aa9-4ad6-a831-70b06367a091", + "customizationUuid": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3", + "description": null, + "name": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0", + "version": "5", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0", + "properties": { + "minCountInstances": 1, + "maxCountInstances": 1, + "initialCount": 1, + "vfModuleLabel": "ADIOD_base_vPE_BV", + "baseModule": true + }, + "inputs": {}, + "volumeGroupAllowed": false + }, + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": { + "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a", + "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339", + "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vPFE_BV", + "baseModule": false + }, + "inputs": {}, + "volumeGroupAllowed": true + } + }, + "volumeGroups": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": { + "uuid": "25284168-24bb-4698-8cb4-3f509146eca5", + "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1", + "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vRE_BV", + "baseModule": false + }, + "inputs": {} + }, + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": { + "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a", + "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339", + "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vPFE_BV", + "baseModule": false + }, + "inputs": {} + } + }, + "vfcInstanceGroups": {} + } + }, + "networks": {}, + "collectionResource": {}, + "configurations": {}, + "fabricConfigurations": {}, + "serviceProxies": {}, + "vfModules": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": { + "uuid": "25284168-24bb-4698-8cb4-3f509146eca5", + "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1", + "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vRE_BV", + "baseModule": false + }, + "inputs": {}, + "volumeGroupAllowed": true + }, + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": { + "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db", + "invariantUuid": "b34833bb-6aa9-4ad6-a831-70b06367a091", + "customizationUuid": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3", + "description": null, + "name": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0", + "version": "5", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0", + "properties": { + "minCountInstances": 1, + "maxCountInstances": 1, + "initialCount": 1, + "vfModuleLabel": "ADIOD_base_vPE_BV", + "baseModule": true + }, + "inputs": {}, + "volumeGroupAllowed": false + }, + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": { + "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a", + "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339", + "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vPFE_BV", + "baseModule": false + }, + "inputs": {}, + "volumeGroupAllowed": true + } + }, + "volumeGroups": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": { + "uuid": "25284168-24bb-4698-8cb4-3f509146eca5", + "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1", + "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vRE_BV", + "baseModule": false + }, + "inputs": {} + }, + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": { + "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a", + "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339", + "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vPFE_BV", + "baseModule": false + }, + "inputs": {} + } + }, + "pnfs": {} + } + } +}); diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/objectToModelTree/objectToModelTree.service.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/objectToModelTree/objectToModelTree.service.ts new file mode 100644 index 000000000..e941faad3 --- /dev/null +++ b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/objectToModelTree/objectToModelTree.service.ts @@ -0,0 +1,98 @@ +import {Injectable} from "@angular/core"; +import {ILevelNodeInfo} from "../models/basic.model.info"; +import {ObjectToTreeService} from "../objectToTree.service"; +import * as _ from "lodash"; + +@Injectable() +export class ObjectToModelTreeService { + constructor(private _objectToTreeService: ObjectToTreeService) { + } + + /*********************************************************** + * return array of first level node with there child's + * @param serviceModel - The serviceHierarchy object + ************************************************************/ + convertServiceHierarchyModelToTreeNodes(serviceModel): any[] { + let _this = this; + const firstLevelOptions: ILevelNodeInfo[] = _this._objectToTreeService.getFirstLevelOptions(); + let nodes = []; + for (let option of firstLevelOptions) { + _.forOwn(serviceModel[option.name], function (item, key) { + nodes.push(_this.addFirstLevelModel(serviceModel.service.uuid, key, item, item.type, serviceModel, option)); + }); + } + console.log('nodes', nodes); + return nodes; + } + + + /*********************************************************** + * return node with all his child's + * @param name - Model name + * @param serviceId - service id + * @param currentModel - current Model object + * @param type - current Model type + * @param parentModel - current parent Model object + * @param levelNodeInfo - current level node information + ************************************************************/ + private addFirstLevelModel(serviceId: string, name, currentModel, type, parentModel, levelNodeInfo: ILevelNodeInfo) { + let node = ObjectToModelTreeService.convertItemToTreeNode(serviceId, name, currentModel, type, null, levelNodeInfo); + node.children = this.addNextLevelNodes(serviceId, currentModel, parentModel, levelNodeInfo, node); + return node; + } + + /*********************************************************** + * return all the child's of node (is child exist) + * else return empty array. + * @param currentModel - current Model object + * @param parentModel - current parent Model object + * @param levelNodeInfo - current level node information + * @param parentNode - parent node. + ************************************************************/ + addNextLevelNodes(serviceId: string, currentModel, parentModel, levelNodeInfo: ILevelNodeInfo, parentNode): any[] { + if (!_.isNil(levelNodeInfo.childName)) { + if (!_.isNil(currentModel[levelNodeInfo.childName])) { + let nextLevelNodeInfo = levelNodeInfo.getNextLevelObject.apply(this); + parentNode.children = Object.keys(currentModel[levelNodeInfo.childName]).map((key) => + ObjectToModelTreeService.convertItemToTreeNode(serviceId, key, currentModel[levelNodeInfo.childName][key], levelNodeInfo.childName, currentModel, nextLevelNodeInfo)); + + } + } + return parentNode.children; + } + + + /*********************************************************** + * return node with his properties + * @param serviceId + * @param name - model name + * @param currentModel - current model from serviceHierarchy + * @param valueType - model type + * @param parentModel - current parent model + * @param levelNodeInfo - current levelNodeInfo object + ************************************************************/ + static convertItemToTreeNode(serviceId: string, name: string, currentModel: any, valueType: string, parentModel: string, levelNodeInfo: ILevelNodeInfo) { + let node = { + id: currentModel.customizationUuid || currentModel.uuid, + modelCustomizationId : currentModel.customizationUuid, + modelVersionId: currentModel.uuid, + modelUniqueId : currentModel.customizationUuid || currentModel.uuid, + name: name, + tooltip: levelNodeInfo.getTooltip(), + type: levelNodeInfo.getType(), + count: currentModel.count || 0, + max: currentModel.max || 1, + children: [], + disabled: false, + dynamicInputs: levelNodeInfo.updateDynamicInputsDataFromModel(currentModel), + isEcompGeneratedNaming: levelNodeInfo.isEcompGeneratedNaming(currentModel, parentModel) + }; + + node['onAddClick'] = (node, serviceId) => levelNodeInfo.onClickAdd(node, serviceId); + node['getNodeCount'] = (node, serviceId) => levelNodeInfo.getNodeCount(node, serviceId); + node['getMenuAction'] = (node, serviceId) => levelNodeInfo.getMenuAction(node, serviceId); + node['showNodeIcons'] = (node, serviceId) => levelNodeInfo.showNodeIcons(node, serviceId); + node['typeName'] = levelNodeInfo['typeName']; + return node; + } +} diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/objectToTree.service.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/objectToTree.service.ts new file mode 100644 index 000000000..338964515 --- /dev/null +++ b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/objectToTree.service.ts @@ -0,0 +1,51 @@ +import {Injectable} from "@angular/core"; +import {ILevelNodeInfo} from "./models/basic.model.info"; +import {VnfModelInfo} from "./models/vnf/vnf.model.info"; +import {NetworkModelInfo} from "./models/network/network.model.info"; +import {ConfigurationModelInfo} from "./models/configuration/configuration.model.info"; +import {DefaultDataGeneratorService} from "../../../shared/services/defaultDataServiceGenerator/default.data.generator.service"; +import {DynamicInputsService} from "./dynamicInputs.service"; +import {SharedTreeService} from "./shared.tree.service"; +import {NgRedux} from "@angular-redux/store"; +import {AppState} from "../../../shared/store/reducers"; +import {DialogService} from "ng2-bootstrap-modal"; +import {VnfPopupService} from "../../../shared/components/genericFormPopup/genericFormServices/vnf/vnf.popup.service"; +import {NetworkPopupService} from "../../../shared/components/genericFormPopup/genericFormServices/network/network.popup.service"; +import {VfModulePopuopService} from "../../../shared/components/genericFormPopup/genericFormServices/vfModule/vfModule.popuop.service"; +import {VnfGroupingModelInfo} from "./models/vnfGrouping/vnfGrouping.model.info"; +import {VnfGroupPopupService} from "../../../shared/components/genericFormPopup/genericFormServices/vnfGroup/vnfGroup.popup.service"; +import {DuplicateService} from "../duplicate/duplicate.service"; +import {SdcUiServices} from "onap-ui-angular"; +import {IframeService} from "../../../shared/utils/iframe.service"; +import {ComponentInfoService} from "../component-info/component-info.service"; + +@Injectable() +export class ObjectToTreeService { + constructor(private _defaultDataGeneratorService: DefaultDataGeneratorService, + private _dynamicInputsService: DynamicInputsService, + private _sharedTreeService : SharedTreeService, + private _dialogService : DialogService, + private _vnfPopupService : VnfPopupService, + private _networkPopupService : NetworkPopupService, + private _vfModulePopupService : VfModulePopuopService, + private _vnfGroupPopupService : VnfGroupPopupService, + private _duplicateService : DuplicateService, + private _modalService: SdcUiServices.ModalService, + private _iframeService : IframeService, + private _componentInfoService : ComponentInfoService, + private _store : NgRedux<AppState>) { + } + + + + + /*********************************************************** + * return all first optional first level of the model tree + ************************************************************/ + getFirstLevelOptions(): ILevelNodeInfo[] { + return [new VnfModelInfo(this._dynamicInputsService, this._sharedTreeService, this._defaultDataGeneratorService, this._dialogService, this._vnfPopupService, this._vfModulePopupService, this._duplicateService, this._modalService, this._iframeService, this._componentInfoService, this._store) + , new NetworkModelInfo(this._dynamicInputsService, this._sharedTreeService, this._dialogService, this._networkPopupService, this._duplicateService, this._modalService, this._iframeService, this._store), + new ConfigurationModelInfo(this._dynamicInputsService, this._sharedTreeService), + new VnfGroupingModelInfo(this._dynamicInputsService, this._sharedTreeService, this._dialogService, this._vnfGroupPopupService, this._iframeService, this._store)]; + }; +} diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/shared.tree.service.spec.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/shared.tree.service.spec.ts new file mode 100644 index 000000000..617a81e1f --- /dev/null +++ b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/shared.tree.service.spec.ts @@ -0,0 +1,1761 @@ +import {HttpClientTestingModule} from "@angular/common/http/testing"; +import {getTestBed, TestBed} from "@angular/core/testing"; +import {MockNgRedux, NgReduxTestingModule} from "@angular-redux/store/testing"; +import {SharedTreeService} from "./shared.tree.service"; +import {ObjectToInstanceTreeService} from "./objectToInstanceTree/objectToInstanceTree.service"; +import {ObjectToTreeService} from "./objectToTree.service"; +import {DefaultDataGeneratorService} from "../../../shared/services/defaultDataServiceGenerator/default.data.generator.service"; +import {DynamicInputsService} from "./dynamicInputs.service"; +import {DialogService} from "ng2-bootstrap-modal"; +import {VnfPopupService} from "../../../shared/components/genericFormPopup/genericFormServices/vnf/vnf.popup.service"; +import {BasicControlGenerator} from "../../../shared/components/genericForm/formControlsServices/basic.control.generator"; +import {AaiService} from "../../../shared/services/aaiService/aai.service"; +import {NetworkPopupService} from "../../../shared/components/genericFormPopup/genericFormServices/network/network.popup.service"; +import {NetworkControlGenerator} from "../../../shared/components/genericForm/formControlsServices/networkGenerator/network.control.generator"; +import {VfModulePopuopService} from "../../../shared/components/genericFormPopup/genericFormServices/vfModule/vfModule.popuop.service"; +import {VfModuleControlGenerator} from "../../../shared/components/genericForm/formControlsServices/vfModuleGenerator/vfModule.control.generator"; +import {VnfGroupControlGenerator} from "../../../shared/components/genericForm/formControlsServices/vnfGroupGenerator/vnfGroup.control.generator"; +import {FeatureFlagsService} from "../../../shared/services/featureFlag/feature-flags.service"; +import {VnfControlGenerator} from "../../../shared/components/genericForm/formControlsServices/vnfGenerator/vnf.control.generator"; +import {NgRedux} from "@angular-redux/store"; +import {GenericFormService} from "../../../shared/components/genericForm/generic-form.service"; +import {FormBuilder} from "@angular/forms"; +import {SdcUiComponentsModule} from "onap-ui-angular"; +import {LogService} from "../../../shared/utils/log/log.service"; +import {IframeService} from "../../../shared/utils/iframe.service"; +import {BasicPopupService} from "../../../shared/components/genericFormPopup/genericFormServices/basic.popup.service"; +import {VnfGroupPopupService} from "../../../shared/components/genericFormPopup/genericFormServices/vnfGroup/vnfGroup.popup.service"; +import {DuplicateService} from "../duplicate/duplicate.service"; +import {AppState} from "../../../shared/store/reducers"; +import {MessageBoxService} from "../../../shared/components/messageBox/messageBox.service"; +import {ErrorMsgService} from "../../../shared/components/error-msg/error-msg.service"; +import {AuditInfoModalComponent} from "../../../shared/components/auditInfoModal/auditInfoModal.component"; +import {ILevelNodeInfo} from "./models/basic.model.info"; +import {VnfModelInfo} from "./models/vnf/vnf.model.info"; +import {ServiceInstanceActions} from "../../../shared/models/serviceInstanceActions"; +import each from "jest-each"; +import {DrawingBoardModes} from "../drawing-board.modes"; +import {ComponentInfoService} from "../component-info/component-info.service"; + +class MockAppStore<T> { + getState() { + return getStore() + } + + dispatch() { + } +} + +class MockVnfModelInfo<T> { + getModel() { + return {} + } +} + + +describe('Shared Tree Service', () => { + let injector; + let service: SharedTreeService; + let _objectToInstanceTreeService: ObjectToInstanceTreeService; + let store: NgRedux<AppState>; + beforeAll(done => (async () => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule, NgReduxTestingModule, SdcUiComponentsModule], + providers: [ + SharedTreeService, + ObjectToTreeService, + DefaultDataGeneratorService, + DialogService, + VnfPopupService, + BasicControlGenerator, + AaiService, + LogService, + BasicPopupService, + VnfGroupPopupService, + DuplicateService, + IframeService, + DynamicInputsService, + NetworkPopupService, + NetworkControlGenerator, + VfModulePopuopService, + VfModuleControlGenerator, + VnfGroupControlGenerator, + DialogService, + FeatureFlagsService, + VnfControlGenerator, + AaiService, + DialogService, + GenericFormService, + FormBuilder, + ErrorMsgService, + ObjectToInstanceTreeService, + ComponentInfoService, + {provide: NgRedux, useClass: MockAppStore} + ] + }); + await TestBed.compileComponents(); + injector = getTestBed(); + service = injector.get(SharedTreeService); + _objectToInstanceTreeService = injector.get(ObjectToInstanceTreeService); + store = injector.get(NgRedux); + })().then(done).catch(done.fail)); + + test('SharedTreeService should be defined', () => { + expect(service).toBeDefined(); + }); + + test('shouldShowDeleteInstanceWithChildrenModal should open modal if child exist with action create', () => { + jest.spyOn(MessageBoxService.openModal, 'next'); + let foo = () => { + + }; + let node = <any>{ + children: [{action: "Create"}, {action: "None"}], + data: { + typeName: 'VNF' + } + }; + service.shouldShowDeleteInstanceWithChildrenModal(node, "serviceModelId", foo); + expect(MessageBoxService.openModal.next).toHaveBeenCalled(); + }); + + test('openAuditInfoModal should open modal for failed instance', () => { + jest.spyOn(AuditInfoModalComponent.openInstanceAuditInfoModal, 'next'); + + let modelInfoServiceMock: ILevelNodeInfo = new VnfModelInfo(null, null, null, null, null, null, null, null, null, null); + const modelMock = {"a": "a"}; + const instanceMock = {"instance": "instance", "trackById": "123456789"}; + const instanceTypeMock = "instanceTypeMock"; + jest.spyOn(modelInfoServiceMock, 'getModel').mockReturnValue(modelMock); + let node = <any>{ + data: { + modelId: '6b528779-44a3-4472-bdff-9cd15ec93450', + trackById: '1245df21', + isFailed: true + } + }; + service.openAuditInfoModal(node, "serviceModelId", instanceMock, instanceTypeMock, <any>modelInfoServiceMock); + expect(AuditInfoModalComponent.openInstanceAuditInfoModal.next).toHaveBeenCalledWith( + { + "instance": instanceMock, + "instanceId": "serviceModelId", + "isInstanceFailed": node.data.isFailed, + "model": modelMock, + "trackById": instanceMock.trackById, + "type": instanceTypeMock + }); + }); + + test('shouldShowDeleteInstanceWithChildrfenModal should not open modal if all childs with action None', () => { + let foo = () => { + }; + spyOn(MessageBoxService.openModal, 'next'); + + let node = <any>{ + children: [{action: "None"}, {action: "None"}], + data: { + typeName: 'VNF' + } + }; + service.shouldShowDeleteInstanceWithChildrenModal(node, "serviceModelId", foo); + expect(MessageBoxService.openModal.next).not.toHaveBeenCalled(); + }); + + test('statusProperties should be prop on node according to node properties', () => { + let node = service.addingStatusProperty({orchStatus: 'completed', provStatus: 'inProgress', inMaint: false}); + expect(node.statusProperties).toBeDefined(); + expect(node.statusProperties).toEqual([Object({ + key: 'Prov Status:', + value: 'inProgress', + testId: 'provStatus' + }), Object({key: 'Orch Status:', value: 'completed', testId: 'orchStatus'})]); + node = service.addingStatusProperty({orchStatus: 'completed', provStatus: 'inProgress', inMaint: true}); + expect(node.statusProperties).toEqual([Object({ + key: 'Prov Status:', + value: 'inProgress', + testId: 'provStatus' + }), Object({key: 'Orch Status:', value: 'completed', testId: 'orchStatus'}), Object({ + key: 'In-maintenance', + value: '', + testId: 'inMaint' + })]); + }); + const enableRemoveAndEditItemsDataProvider = [ + ['Create action CREATE mode', DrawingBoardModes.CREATE ,ServiceInstanceActions.Create, true], + ['Create action VIEW mode',DrawingBoardModes.VIEW , ServiceInstanceActions.Create,false], + ['Create action RETRY_EDIT mode',DrawingBoardModes.RETRY_EDIT, ServiceInstanceActions.Create, true], + ['Create action EDIT mode',DrawingBoardModes.EDIT, ServiceInstanceActions.Create, true], + ['Create action RETRY mode',DrawingBoardModes.RETRY, ServiceInstanceActions.Create, false], + ['None action EDIT mode',DrawingBoardModes.EDIT, ServiceInstanceActions.None, false], + ['None action RETRY_EDIT mode', DrawingBoardModes.RETRY_EDIT, ServiceInstanceActions.None, false]]; + each(enableRemoveAndEditItemsDataProvider).test('shouldShowEditAndDelete if child exist with %s', (description, mode, action, enabled) => { + jest.spyOn(store, 'getState').mockReturnValue({ + global: { + drawingBoardStatus: mode + } + }); + let node = <any>{ + data:{ + action: action + }, + }; + let res = service.shouldShowRemoveAndEdit(node); + expect(res).toBe(enabled); + }); +}); +function generateService() { + return { + "vnfs": { + "2017-488_ADIOD-vPE 0": { + "inMaint": false, + "rollbackOnFailure": "true", + "originalName": "2017-488_ADIOD-vPE 0", + "isMissingData": false, + "trackById": "stigekyxrqi", + "vfModules": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0gytfi": { + "isMissingData": false, + "sdncPreReload": null, + "modelInfo": { + "modelType": "VFmodule", + "modelInvariantId": "b34833bb-6aa9-4ad6-a831-70b06367a091", + "modelVersionId": "f8360508-3f17-4414-a2ed-6bc71161e8db", + "modelName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0", + "modelVersion": "5", + "modelCustomizationId": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0" + }, + "instanceParams": [{}], + "trackById": "3oj23o7nupo" + } + } + }, + "vnfStoreKey": "2017-488_ADIOD-vPE 0", + "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09", + "productFamilyId": "d8a6ed93-251c-47ca-adc9-86671fd19f4c", + "lcpCloudRegionId": "JANET25", + "tenantId": "092eb9e8e4b7412e8787dd091bc58e86", + "lineOfBusiness": "ONAP", + "platformName": "xxx1", + "modelInfo": { + "modelInvariantId": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8", + "modelVersionId": "69e09f68-8b63-4cc9-b9ff-860960b5db09", + "modelName": "2017-488_ADIOD-vPE", + "modelVersion": "5.0", + "modelCustomizationName": "2017-488_ADIOD-vPE 0", + "modelCustomizationId": "1da7b585-5e61-4993-b95e-8e6606c81e45", + "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09" + }, + "legacyRegion": "11111111", + "instanceParams": [{}] + }, + "2017-388_ADIOD-vPE 0": { + "inMaint": false, + "rollbackOnFailure": "true", + "originalName": "2017-388_ADIOD-vPE 0", + "isMissingData": false, + "trackById": "nib719t5vca", + "vfModules": {}, + "vnfStoreKey": "2017-388_ADIOD-vPE 0", + "productFamilyId": "d8a6ed93-251c-47ca-adc9-86671fd19f4c", + "lcpCloudRegionId": "JANET25", + "legacyRegion": "11111", + "tenantId": "092eb9e8e4b7412e8787dd091bc58e86", + "platformName": "platform", + "lineOfBusiness": "zzz1", + "instanceParams": [{}], + "modelInfo": { + "modelInvariantId": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8", + "modelVersionId": "afacccf6-397d-45d6-b5ae-94c39734b168", + "modelName": "2017-388_ADIOD-vPE", + "modelVersion": "4.0", + "modelCustomizationId": "b3c76f73-eeb5-4fb6-9d31-72a889f1811c", + "modelCustomizationName": "2017-388_ADIOD-vPE 0", + "uuid": "afacccf6-397d-45d6-b5ae-94c39734b168" + }, + "uuid": "afacccf6-397d-45d6-b5ae-94c39734b168" + }, + "2017-388_ADIOD-vPE 1": { + "inMaint": false, + "rollbackOnFailure": "true", + "originalName": "2017-388_ADIOD-vPE 1", + "isMissingData": false, + "trackById": "cv7l1ak8vpe", + "vfModules": {}, + "vnfStoreKey": "2017-388_ADIOD-vPE 1", + "productFamilyId": "d8a6ed93-251c-47ca-adc9-86671fd19f4c", + "lcpCloudRegionId": "JANET25", + "legacyRegion": "123", + "tenantId": "092eb9e8e4b7412e8787dd091bc58e86", + "platformName": "platform", + "lineOfBusiness": "ONAP", + "instanceParams": [{}], + "modelInfo": { + "modelInvariantId": "00beb8f9-6d39-452f-816d-c709b9cbb87d", + "modelVersionId": "0903e1c0-8e03-4936-b5c2-260653b96413", + "modelName": "2017-388_ADIOD-vPE", + "modelVersion": "1.0", + "modelCustomizationId": "280dec31-f16d-488b-9668-4aae55d6648a", + "modelCustomizationName": "2017-388_ADIOD-vPE 1", + "uuid": "0903e1c0-8e03-4936-b5c2-260653b96413" + }, + "uuid": "0903e1c0-8e03-4936-b5c2-260653b96413" + } + }, + "instanceParams": [{}], + "validationCounter": 0, + "existingNames": {"yoav": ""}, + "existingVNFCounterMap": { + "69e09f68-8b63-4cc9-b9ff-860960b5db09": 1, + "afacccf6-397d-45d6-b5ae-94c39734b168": 1, + "0903e1c0-8e03-4936-b5c2-260653b96413": 1 + }, + "existingVnfGroupCounterMap": { + "daeb6568-cef8-417f-9075-ed259ce59f48": 0, + "c2b300e6-45de-4e5e-abda-3032bee2de56": -1 + }, + "existingNetworksCounterMap": {"ddc3f20c-08b5-40fd-af72-c6d14636b986": 1}, + "networks": { + "ExtVL 0": { + "inMaint": false, + "rollbackOnFailure": "true", + "originalName": "ExtVL 0", + "isMissingData": false, + "trackById": "s6okajvv2n8", + "networkStoreKey": "ExtVL 0", + "productFamilyId": "d8a6ed93-251c-47ca-adc9-86671fd19f4c", + "lcpCloudRegionId": "JANET25", + "legacyRegion": "12355555", + "tenantId": "092eb9e8e4b7412e8787dd091bc58e86", + "platformName": "platform", + "lineOfBusiness": null, + "instanceParams": [{}], + "modelInfo": { + "modelInvariantId": "379f816b-a7aa-422f-be30-17114ff50b7c", + "modelVersionId": "ddc3f20c-08b5-40fd-af72-c6d14636b986", + "modelName": "ExtVL", + "modelVersion": "37.0", + "modelCustomizationId": "94fdd893-4a36-4d70-b16a-ec29c54c184f", + "modelCustomizationName": "ExtVL 0", + "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986" + }, + "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986" + } + }, + "vnfGroups": { + "groupingservicefortest..ResourceInstanceGroup..0": { + "inMaint": false, + "rollbackOnFailure": "true", + "originalName": "groupingservicefortest..ResourceInstanceGroup..0", + "isMissingData": false, + "trackById": "se0obn93qq", + "vnfGroupStoreKey": "groupingservicefortest..ResourceInstanceGroup..0", + "instanceName": "groupingservicefortestResourceInstanceGroup0", + "instanceParams": [{}], + "modelInfo": { + "modelInvariantId": "4bb2e27e-ddab-4790-9c6d-1f731bc14a45", + "modelVersionId": "daeb6568-cef8-417f-9075-ed259ce59f48", + "modelName": "groupingservicefortest..ResourceInstanceGroup..0", + "modelVersion": "1", + "modelCustomizationName": "groupingservicefortest..ResourceInstanceGroup..0", + "uuid": "daeb6568-cef8-417f-9075-ed259ce59f48" + }, + "uuid": "daeb6568-cef8-417f-9075-ed259ce59f48" + } + }, + "instanceName": "yoav", + "globalSubscriberId": "e433710f-9217-458d-a79d-1c7aff376d89", + "subscriptionServiceType": "TYLER SILVIA", + "owningEntityId": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc", + "productFamilyId": "d8a6ed93-251c-47ca-adc9-86671fd19f4c", + "lcpCloudRegionId": "JANET25", + "tenantId": "092eb9e8e4b7412e8787dd091bc58e86", + "aicZoneId": "ATL53", + "pause": null, + "projectName": "WATKINS", + "rollbackOnFailure": "true", + "bulkSize": 1, + "aicZoneName": "AAIATLTE-ATL53", + "owningEntityName": "WayneHolland", + "testApi": "VNF_API", + "isEcompGeneratedNaming": false, + "tenantName": "USP-SIP-IC-24335-T-01", + "modelInfo": { + "modelInvariantId": "cdb90b57-ed78-4d44-a5b4-7f43a02ec632", + "modelVersionId": "1a80c596-27e5-4ca9-b5bb-e03a7fd4c0fd", + "modelName": "action-data", + "modelVersion": "1.0", + "uuid": "1a80c596-27e5-4ca9-b5bb-e03a7fd4c0fd" + }, + "isALaCarte": false, + "name": "action-data", + "version": "1.0", + "description": "ADIOD vMX vPE based on Juniper 17.2 release. Updated with updated VF for v8.0 of VLM", + "category": "Network L1-3", + "uuid": "1a80c596-27e5-4ca9-b5bb-e03a7fd4c0fd", + "invariantUuid": "cdb90b57-ed78-4d44-a5b4-7f43a02ec632", + "serviceType": "pnf", + "serviceRole": "Testing", + "vidNotions": {"instantiationUI": "legacy", "modelCategory": "other", "viewEditUI": "legacy"}, + "isMultiStepDesign": true + }; +} + +function getStore() { + return { + "global": { + "name": null, + "flags": { + "CREATE_INSTANCE_TEST": false, + "EMPTY_DRAWING_BOARD_TEST": false, + "FLAG_NETWORK_TO_ASYNC_INSTANTIATION": false, + "FLAG_ASYNC_INSTANTIATION": true, + "FLAG_ASYNC_JOBS": true, + "FLAG_ADD_MSO_TESTAPI_FIELD": true, + "FLAG_UNASSIGN_SERVICE": true, + "FLAG_SERVICE_MODEL_CACHE": true, + "FLAG_COLLECTION_RESOURCE_SUPPORT": true, + "FLAG_SHOW_ASSIGNMENTS": true, + "FLAG_FABRIC_CONFIGURATION_ASSIGNMENTS": true, + "FLAG_DUPLICATE_VNF": true, + "FLAG_DEFAULT_VNF": true, + "FLAG_SETTING_DEFAULTS_IN_DRAWING_BOARD": true, + "FLAG_A_LA_CARTE_AUDIT_INFO": true, + "FLAG_1810_CR_ADD_CLOUD_OWNER_TO_MSO_REQUEST": true, + "FLAG_PRESENT_PROVIDER_NETWORKS_ASSOCIATIONS": true, + "FLAG_1810_CR_SOFT_DELETE_ALACARTE_VF_MODULE": true, + "FLAG_1902_NEW_VIEW_EDIT": true, + "FLAG_1810_IDENTIFY_SERVICE_FOR_NEW_UI": false, + "FLAG_1902_VNF_GROUPING": true, + "FLAG_SHOW_VERIFY_SERVICE": true, + "FLAG_ASYNC_ALACARTE_VFMODULE": true, + "FLAG_ASYNC_ALACARTE_VNF": true, + "FLAG_SHIFT_VFMODULE_PARAMS_TO_VNF": true, + "FLAG_1810_AAI_LOCAL_CACHE": true, + "FLAG_EXP_USE_DEFAULT_HOST_NAME_VERIFIER": false, + "FLAG_EXP_ANY_ALACARTE_NEW_INSTANTIATION_UI": false, + "FLAG_SUPPLEMENTARY_FILE": true, + "FLAG_5G_IN_NEW_INSTANTIATION_UI": true, + "FLAG_RESTRICTED_SELECT": false, + "FLAG_1810_CR_LET_SELECTING_COLLECTOR_TYPE_UNCONDITIONALLY": true + }, + "drawingBoardStatus": "VIEW", + "type": "UPDATE_DRAWING_BOARD_STATUS" + }, + "service": { + "serviceHierarchy": { + "1a80c596-27e5-4ca9-b5bb-e03a7fd4c0fd": { + "service": { + "uuid": "1a80c596-27e5-4ca9-b5bb-e03a7fd4c0fd", + "invariantUuid": "cdb90b57-ed78-4d44-a5b4-7f43a02ec632", + "name": "action-data", + "version": "1.0", + "toscaModelURL": null, + "category": "Network L1-3", + "serviceType": "pnf", + "serviceRole": "Testing", + "description": "ADIOD vMX vPE based on Juniper 17.2 release. Updated with updated VF for v8.0 of VLM", + "serviceEcompNaming": "false", + "instantiationType": "Macro", + "inputs": {}, + "vidNotions": {"instantiationUI": "legacy", "modelCategory": "other", "viewEditUI": "legacy"} + }, + "vnfs": { + "2017-388_ADIOD-vPE 1": { + "uuid": "0903e1c0-8e03-4936-b5c2-260653b96413", + "invariantUuid": "00beb8f9-6d39-452f-816d-c709b9cbb87d", + "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM", + "name": "2017-388_ADIOD-vPE", + "version": "1.0", + "customizationUuid": "280dec31-f16d-488b-9668-4aae55d6648a", + "inputs": {}, + "commands": {}, + "properties": { + "vmxvre_retype": "RE-VMX", + "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version", + "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d", + "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9", + "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF", + "int_ctl_net_name": "VMX-INTXI", + "vmx_int_ctl_prefix": "10.0.0.10", + "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5", + "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279", + "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a", + "nf_type": "vPE", + "vmxvpfe_int_ctl_ip_1": "10.0.0.10", + "is_AVPN_service": "false", + "vmx_RSG_name": "vREXI-affinity", + "vmx_int_ctl_forwarding": "l2", + "vmxvre_oam_ip_0": "10.0.0.10", + "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvpfe_sriov41_0_port_vlanstrip": "false", + "vmxvpfe_sriov42_0_port_vlanfilter": "4001", + "vmxvpfe_sriov44_0_port_unknownunicastallow": "true", + "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2", + "vmxvre_instance": "0", + "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvre_flavor_name": "ns.c1r16d32.v5", + "vmxvpfe_volume_size_0": "40.0", + "vmxvpfe_sriov43_0_port_vlanfilter": "4001", + "nf_naming": "{ecomp_generated_naming=true}", + "multi_stage_design": "true", + "nf_naming_code": "Navneet", + "vmxvre_name_0": "vREXI", + "vmxvpfe_sriov42_0_port_vlanstrip": "false", + "vmxvpfe_volume_name_0": "vPFEXI_FBVolume", + "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141", + "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2", + "vmxvpfe_sriov43_0_port_unknownunicastallow": "true", + "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true", + "vmxvre_console": "vidconsole", + "vmxvpfe_sriov44_0_port_vlanfilter": "4001", + "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3", + "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true", + "vmxvpfe_sriov44_0_port_vlanstrip": "false", + "vf_module_id": "123", + "nf_function": "JAI", + "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true", + "vmxvre_int_ctl_ip_0": "10.0.0.10", + "ecomp_generated_naming": "true", + "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI", + "vnf_name": "mtnj309me6vre", + "vmxvpfe_sriov41_0_port_unknownunicastallow": "true", + "vmxvre_volume_type_1": "HITACHI", + "vmxvpfe_sriov44_0_port_broadcastallow": "true", + "vmxvre_volume_type_0": "HITACHI", + "vmxvpfe_volume_type_0": "HITACHI", + "vmxvpfe_sriov43_0_port_broadcastallow": "true", + "bandwidth_units": "get_input:2017488_adiodvpe0_bandwidth_units", + "vnf_id": "123", + "vmxvre_oam_prefix": "24", + "availability_zone_0": "mtpocfo-kvm-az01", + "ASN": "get_input:2017488_adiodvpe0_ASN", + "vmxvre_chassis_i2cid": "161", + "vmxvpfe_name_0": "vPFEXI", + "bandwidth": "get_input:2017488_adiodvpe0_bandwidth", + "availability_zone_max_count": "1", + "vmxvre_volume_size_0": "45.0", + "vmxvre_volume_size_1": "50.0", + "vmxvpfe_sriov42_0_port_broadcastallow": "true", + "vmxvre_oam_gateway": "10.0.0.10", + "vmxvre_volume_name_1": "vREXI_FAVolume", + "vmxvre_ore_present": "0", + "vmxvre_volume_name_0": "vREXI_FBVolume", + "vmxvre_type": "0", + "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name", + "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true", + "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429", + "vmx_int_ctl_len": "24", + "vmxvpfe_sriov43_0_port_vlanstrip": "false", + "vmxvpfe_sriov41_0_port_broadcastallow": "true", + "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d", + "vmxvpfe_sriov41_0_port_vlanfilter": "4001", + "nf_role": "Testing", + "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a", + "vmxvpfe_sriov42_0_port_unknownunicastallow": "true", + "vmxvpfe_flavor_name": "ns.c20r16d25.v5" + }, + "type": "VF", + "modelCustomizationName": "2017-388_ADIOD-vPE 1", + "vfModules": {}, + "volumeGroups": {}, + "vfcInstanceGroups": {} + }, + "2017-388_ADIOD-vPE 0": { + "uuid": "afacccf6-397d-45d6-b5ae-94c39734b168", + "invariantUuid": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8", + "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM", + "name": "2017-388_ADIOD-vPE", + "version": "4.0", + "customizationUuid": "b3c76f73-eeb5-4fb6-9d31-72a889f1811c", + "inputs": {}, + "commands": {}, + "properties": { + "vmxvre_retype": "RE-VMX", + "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version", + "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d", + "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9", + "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF", + "int_ctl_net_name": "VMX-INTXI", + "vmx_int_ctl_prefix": "10.0.0.10", + "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5", + "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279", + "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a", + "nf_type": "vPE", + "vmxvpfe_int_ctl_ip_1": "10.0.0.10", + "is_AVPN_service": "false", + "vmx_RSG_name": "vREXI-affinity", + "vmx_int_ctl_forwarding": "l2", + "vmxvre_oam_ip_0": "10.0.0.10", + "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvpfe_sriov41_0_port_vlanstrip": "false", + "vmxvpfe_sriov42_0_port_vlanfilter": "4001", + "vmxvpfe_sriov44_0_port_unknownunicastallow": "true", + "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2", + "vmxvre_instance": "0", + "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvre_flavor_name": "ns.c1r16d32.v5", + "vmxvpfe_volume_size_0": "40.0", + "vmxvpfe_sriov43_0_port_vlanfilter": "4001", + "nf_naming": "{ecomp_generated_naming=true}", + "multi_stage_design": "true", + "nf_naming_code": "Navneet", + "vmxvre_name_0": "vREXI", + "vmxvpfe_sriov42_0_port_vlanstrip": "false", + "vmxvpfe_volume_name_0": "vPFEXI_FBVolume", + "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141", + "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2", + "vmxvpfe_sriov43_0_port_unknownunicastallow": "true", + "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true", + "vmxvre_console": "vidconsole", + "vmxvpfe_sriov44_0_port_vlanfilter": "4001", + "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3", + "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true", + "vmxvpfe_sriov44_0_port_vlanstrip": "false", + "vf_module_id": "123", + "nf_function": "JAI", + "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true", + "vmxvre_int_ctl_ip_0": "10.0.0.10", + "ecomp_generated_naming": "true", + "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI", + "vnf_name": "mtnj309me6vre", + "vmxvpfe_sriov41_0_port_unknownunicastallow": "true", + "vmxvre_volume_type_1": "HITACHI", + "vmxvpfe_sriov44_0_port_broadcastallow": "true", + "vmxvre_volume_type_0": "HITACHI", + "vmxvpfe_volume_type_0": "HITACHI", + "vmxvpfe_sriov43_0_port_broadcastallow": "true", + "bandwidth_units": "get_input:2017488_adiodvpe0_bandwidth_units", + "vnf_id": "123", + "vmxvre_oam_prefix": "24", + "availability_zone_0": "mtpocfo-kvm-az01", + "ASN": "get_input:2017488_adiodvpe0_ASN", + "vmxvre_chassis_i2cid": "161", + "vmxvpfe_name_0": "vPFEXI", + "bandwidth": "get_input:2017488_adiodvpe0_bandwidth", + "availability_zone_max_count": "1", + "vmxvre_volume_size_0": "45.0", + "vmxvre_volume_size_1": "50.0", + "vmxvpfe_sriov42_0_port_broadcastallow": "true", + "vmxvre_oam_gateway": "10.0.0.10", + "vmxvre_volume_name_1": "vREXI_FAVolume", + "vmxvre_ore_present": "0", + "vmxvre_volume_name_0": "vREXI_FBVolume", + "vmxvre_type": "0", + "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name", + "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true", + "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429", + "vmx_int_ctl_len": "24", + "vmxvpfe_sriov43_0_port_vlanstrip": "false", + "vmxvpfe_sriov41_0_port_broadcastallow": "true", + "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d", + "vmxvpfe_sriov41_0_port_vlanfilter": "4001", + "nf_role": "Testing", + "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a", + "vmxvpfe_sriov42_0_port_unknownunicastallow": "true", + "vmxvpfe_flavor_name": "ns.c20r16d25.v5" + }, + "type": "VF", + "modelCustomizationName": "2017-388_ADIOD-vPE 0", + "vfModules": {}, + "volumeGroups": {}, + "vfcInstanceGroups": {} + }, + "2017-488_ADIOD-vPE 0": { + "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09", + "invariantUuid": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8", + "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM", + "name": "2017-488_ADIOD-vPE", + "version": "5.0", + "customizationUuid": "1da7b585-5e61-4993-b95e-8e6606c81e45", + "inputs": {}, + "commands": {}, + "properties": { + "max_instances": 1, + "vmxvre_retype": "RE-VMX", + "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version", + "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d", + "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9", + "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF", + "int_ctl_net_name": "VMX-INTXI", + "vmx_int_ctl_prefix": "10.0.0.10", + "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5", + "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279", + "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a", + "nf_type": "vPE", + "vmxvpfe_int_ctl_ip_1": "10.0.0.10", + "is_AVPN_service": "false", + "vmx_RSG_name": "vREXI-affinity", + "vmx_int_ctl_forwarding": "l2", + "vmxvre_oam_ip_0": "10.0.0.10", + "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvpfe_sriov41_0_port_vlanstrip": "false", + "vmxvpfe_sriov42_0_port_vlanfilter": "4001", + "vmxvpfe_sriov44_0_port_unknownunicastallow": "true", + "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2", + "vmxvre_instance": "0", + "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvre_flavor_name": "ns.c1r16d32.v5", + "vmxvpfe_volume_size_0": "40.0", + "vmxvpfe_sriov43_0_port_vlanfilter": "4001", + "nf_naming": "{ecomp_generated_naming=true}", + "multi_stage_design": "true", + "nf_naming_code": "Navneet", + "vmxvre_name_0": "vREXI", + "vmxvpfe_sriov42_0_port_vlanstrip": "false", + "vmxvpfe_volume_name_0": "vPFEXI_FBVolume", + "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141", + "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2", + "vmxvpfe_sriov43_0_port_unknownunicastallow": "true", + "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true", + "vmxvre_console": "vidconsole", + "vmxvpfe_sriov44_0_port_vlanfilter": "4001", + "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3", + "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true", + "vmxvpfe_sriov44_0_port_vlanstrip": "false", + "vf_module_id": "123", + "nf_function": "JAI", + "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true", + "vmxvre_int_ctl_ip_0": "10.0.0.10", + "ecomp_generated_naming": "true", + "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI", + "vnf_name": "mtnj309me6vre", + "vmxvpfe_sriov41_0_port_unknownunicastallow": "true", + "vmxvre_volume_type_1": "HITACHI", + "vmxvpfe_sriov44_0_port_broadcastallow": "true", + "vmxvre_volume_type_0": "HITACHI", + "vmxvpfe_volume_type_0": "HITACHI", + "vmxvpfe_sriov43_0_port_broadcastallow": "true", + "bandwidth_units": "get_input:2017488_adiodvpe0_bandwidth_units", + "vnf_id": "123", + "vmxvre_oam_prefix": "24", + "availability_zone_0": "mtpocfo-kvm-az01", + "ASN": "get_input:2017488_adiodvpe0_ASN", + "vmxvre_chassis_i2cid": "161", + "vmxvpfe_name_0": "vPFEXI", + "bandwidth": "get_input:2017488_adiodvpe0_bandwidth", + "availability_zone_max_count": "1", + "vmxvre_volume_size_0": "45.0", + "vmxvre_volume_size_1": "50.0", + "vmxvpfe_sriov42_0_port_broadcastallow": "true", + "vmxvre_oam_gateway": "10.0.0.10", + "vmxvre_volume_name_1": "vREXI_FAVolume", + "vmxvre_ore_present": "0", + "vmxvre_volume_name_0": "vREXI_FBVolume", + "vmxvre_type": "0", + "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name", + "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true", + "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429", + "vmx_int_ctl_len": "24", + "vmxvpfe_sriov43_0_port_vlanstrip": "false", + "vmxvpfe_sriov41_0_port_broadcastallow": "true", + "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d", + "vmxvpfe_sriov41_0_port_vlanfilter": "4001", + "nf_role": "Testing", + "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a", + "vmxvpfe_sriov42_0_port_unknownunicastallow": "true", + "vmxvpfe_flavor_name": "ns.c20r16d25.v5" + }, + "type": "VF", + "modelCustomizationName": "2017-488_ADIOD-vPE 0", + "vfModules": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": { + "uuid": "25284168-24bb-4698-8cb4-3f509146eca5", + "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1", + "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vRE_BV", + "baseModule": false + }, + "inputs": {}, + "volumeGroupAllowed": true + }, + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": { + "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db", + "invariantUuid": "b34833bb-6aa9-4ad6-a831-70b06367a091", + "customizationUuid": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3", + "description": null, + "name": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0", + "version": "5", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0", + "properties": { + "minCountInstances": 1, + "maxCountInstances": 1, + "initialCount": 1, + "vfModuleLabel": "ADIOD_base_vPE_BV", + "baseModule": true + }, + "inputs": {}, + "volumeGroupAllowed": false + }, + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": { + "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a", + "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339", + "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vPFE_BV", + "baseModule": false + }, + "inputs": {}, + "volumeGroupAllowed": true + } + }, + "volumeGroups": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": { + "uuid": "25284168-24bb-4698-8cb4-3f509146eca5", + "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1", + "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vRE_BV", + "baseModule": false + }, + "inputs": {} + }, + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": { + "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a", + "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339", + "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vPFE_BV", + "baseModule": false + }, + "inputs": {} + } + }, + "vfcInstanceGroups": {} + } + }, + "networks": { + "ExtVL 0": { + "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986", + "invariantUuid": "379f816b-a7aa-422f-be30-17114ff50b7c", + "description": "ECOMP generic virtual link (network) base type for all other service-level and global networks", + "name": "ExtVL", + "version": "37.0", + "customizationUuid": "94fdd893-4a36-4d70-b16a-ec29c54c184f", + "inputs": {}, + "commands": {}, + "properties": { + "network_assignments": "{is_external_network=false, ipv4_subnet_default_assignment={min_subnets_count=1}, ecomp_generated_network_assignment=false, ipv6_subnet_default_assignment={min_subnets_count=1}}", + "exVL_naming": "{ecomp_generated_naming=true}", + "network_flows": "{is_network_policy=false, is_bound_to_vpn=false}", + "network_homing": "{ecomp_selected_instance_node_target=false}" + }, + "type": "VL", + "modelCustomizationName": "ExtVL 0" + } + }, + "collectionResource": {}, + "configurations": {}, + "fabricConfigurations": {}, + "serviceProxies": {}, + "vfModules": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": { + "uuid": "25284168-24bb-4698-8cb4-3f509146eca5", + "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1", + "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vRE_BV", + "baseModule": false + }, + "inputs": {}, + "volumeGroupAllowed": true + }, + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": { + "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db", + "invariantUuid": "b34833bb-6aa9-4ad6-a831-70b06367a091", + "customizationUuid": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3", + "description": null, + "name": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0", + "version": "5", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0", + "properties": { + "minCountInstances": 1, + "maxCountInstances": 1, + "initialCount": 1, + "vfModuleLabel": "ADIOD_base_vPE_BV", + "baseModule": true + }, + "inputs": {}, + "volumeGroupAllowed": false + }, + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": { + "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a", + "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339", + "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vPFE_BV", + "baseModule": false + }, + "inputs": {}, + "volumeGroupAllowed": true + } + }, + "volumeGroups": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": { + "uuid": "25284168-24bb-4698-8cb4-3f509146eca5", + "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1", + "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vRE_BV", + "baseModule": false + }, + "inputs": {} + }, + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": { + "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a", + "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339", + "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vPFE_BV", + "baseModule": false + }, + "inputs": {} + } + }, + "pnfs": {}, + "vnfGroups": { + "groupingservicefortest..ResourceInstanceGroup..0": { + "type": "VnfGroup", + "invariantUuid": "4bb2e27e-ddab-4790-9c6d-1f731bc14a45", + "uuid": "daeb6568-cef8-417f-9075-ed259ce59f48", + "version": "1", + "name": "groupingservicefortest..ResourceInstanceGroup..0", + "modelCustomizationName": "groupingservicefortest..ResourceInstanceGroup..0", + "properties": { + "contained_resource_type": "VF", + "role": "SERVICE-ACCESS", + "function": "DATA", + "description": "DDD0", + "type": "LOAD-GROUP", + "ecomp_generated_naming": "true" + }, + "members": { + "vdbe_svc_vprs_proxy 0": { + "uuid": "65fadfa8-a0d9-443f-95ad-836cd044e26c", + "invariantUuid": "f4baae0c-b3a5-4ca1-a777-afbffe7010bc", + "description": "A Proxy for Service vDBE_Svc_vPRS", + "name": "vDBE_Svc_vPRS Service Proxy", + "version": "1.0", + "customizationUuid": "bdb63d23-e132-4ce7-af2c-a493b4cafac9", + "inputs": {}, + "commands": {}, + "properties": {}, + "type": "Service Proxy", + "sourceModelUuid": "da7827a2-366d-4be6-8c68-a69153c61274", + "sourceModelInvariant": "24632e6b-584b-4f45-80d4-fefd75fd9f14", + "sourceModelName": "vDBE_Svc_vPRS" + } + } + }, + "groupingservicefortest..ResourceInstanceGroup..1": { + "type": "VnfGroup", + "invariantUuid": "a704112d-dbc6-4e56-8d4e-aec57e95ef9a", + "uuid": "c2b300e6-45de-4e5e-abda-3032bee2de56", + "version": "1", + "name": "groupingservicefortest..ResourceInstanceGroup..1", + "modelCustomizationName": "groupingservicefortest..ResourceInstanceGroup..1", + "properties": { + "contained_resource_type": "VF", + "role": "SERVICE-ACCESS", + "function": "SIGNALING", + "description": "DDD1", + "type": "LOAD-GROUP", + "ecomp_generated_naming": "true" + }, + "members": { + "tsbc0001vm001_svc_proxy 0": { + "uuid": "65fadfa8-a0d9-443f-95ad-836cd044e26c", + "invariantUuid": "f4baae0c-b3a5-4ca1-a777-afbffe7010bc", + "description": "A Proxy for Service tsbc0001vm001_Svc", + "name": "tsbc0001vm001_Svc Service Proxy", + "version": "1.0", + "customizationUuid": "3d814462-30fb-4c62-b997-9aa360d27ead", + "inputs": {}, + "commands": {}, + "properties": {}, + "type": "Service Proxy", + "sourceModelUuid": "28aeb8f6-5620-4148-8bfb-a5fb406f0309", + "sourceModelInvariant": "c989ab9a-33c7-46ec-b521-1b2daef5f047", + "sourceModelName": "tsbc0001vm001_Svc" + } + } + } + } + }, + "b75e0d22-05ff-4448-9266-5f0d4e1dbbd6": { + "service": { + "uuid": "b75e0d22-05ff-4448-9266-5f0d4e1dbbd6", + "invariantUuid": "5b9c0f33-eec1-484a-bf77-736a6644d7a8", + "name": "Using VID for VoIP Network Instantiations Shani", + "version": "1.0", + "toscaModelURL": null, + "category": "VoIP Call Control", + "serviceType": "", + "serviceRole": "", + "description": "Using VID for VoIP Network Instantiations Shani", + "serviceEcompNaming": "true", + "instantiationType": "ClientConfig", + "inputs": {}, + "vidNotions": {"instantiationUI": "legacy", "modelCategory": "other", "viewEditUI": "legacy"} + }, + "vnfs": {}, + "networks": { + "AIC30_CONTRAIL_BASIC 0": { + "uuid": "ac815c68-35b7-4ea4-9d04-92d2f844b27c", + "invariantUuid": "de01afb5-532b-451d-aac4-ff9ff0644060", + "description": "Basic contrail 3.0.x L3 network for AIC 3.x sites. ", + "name": "AIC30_CONTRAIL_BASIC", + "version": "3.0", + "customizationUuid": "e94d61f7-b4b2-489a-a4a7-30b1a1a80daf", + "inputs": {}, + "commands": {}, + "properties": { + "network_assignments": "{is_external_network=false, ipv4_subnet_default_assignment={min_subnets_count=1}, ecomp_generated_network_assignment=false, ipv6_subnet_default_assignment={min_subnets_count=1}}", + "exVL_naming": "{ecomp_generated_naming=true}", + "network_flows": "{is_network_policy=false, is_bound_to_vpn=false}", + "network_scope": "Service", + "network_type": "AIC30_CONTRAIL_BASIC", + "network_technology": "Contrail", + "network_homing": "{ecomp_selected_instance_node_target=false}" + }, + "type": "VL", + "modelCustomizationName": "AIC30_CONTRAIL_BASIC 0" + } + }, + "collectionResource": {}, + "configurations": {}, + "fabricConfigurations": {}, + "serviceProxies": {}, + "vfModules": {}, + "volumeGroups": {}, + "pnfs": {}, + "vnfGroups": {} + } + }, + "serviceInstance": { + "1a80c596-27e5-4ca9-b5bb-e03a7fd4c0fd": { + "vnfs": { + "2017-488_ADIOD-vPE 0": { + "action": "None", + "inMaint": false, + "rollbackOnFailure": "true", + "originalName": "2017-488_ADIOD-vPE 0", + "isMissingData": false, + "trackById": "stigekyxrqi", + "vfModules": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0gytfi": { + "isMissingData": false, + "sdncPreReload": null, + "modelInfo": { + "modelType": "VFmodule", + "modelInvariantId": "b34833bb-6aa9-4ad6-a831-70b06367a091", + "modelVersionId": "f8360508-3f17-4414-a2ed-6bc71161e8db", + "modelName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0", + "modelVersion": "5", + "modelCustomizationId": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0" + }, + "instanceParams": [{}], + "trackById": "3oj23o7nupo" + } + } + }, + "vnfStoreKey": "2017-488_ADIOD-vPE 0", + "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09", + "productFamilyId": "d8a6ed93-251c-47ca-adc9-86671fd19f4c", + "lcpCloudRegionId": "JANET25", + "tenantId": "092eb9e8e4b7412e8787dd091bc58e86", + "lineOfBusiness": "ONAP", + "platformName": "xxx1", + "modelInfo": { + "modelInvariantId": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8", + "modelVersionId": "69e09f68-8b63-4cc9-b9ff-860960b5db09", + "modelName": "2017-488_ADIOD-vPE", + "modelVersion": "5.0", + "modelCustomizationName": "2017-488_ADIOD-vPE 0", + "modelCustomizationId": "1da7b585-5e61-4993-b95e-8e6606c81e45", + "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09" + }, + "legacyRegion": "11111111", + "instanceParams": [{}] + }, + "2017-388_ADIOD-vPE 0": { + "action": "Create", + "inMaint": false, + "rollbackOnFailure": "true", + "originalName": "2017-388_ADIOD-vPE 0", + "isMissingData": false, + "trackById": "nib719t5vca", + "vfModules": {}, + "vnfStoreKey": "2017-388_ADIOD-vPE 0", + "productFamilyId": "d8a6ed93-251c-47ca-adc9-86671fd19f4c", + "lcpCloudRegionId": "JANET25", + "legacyRegion": "11111", + "tenantId": "092eb9e8e4b7412e8787dd091bc58e86", + "platformName": "platform", + "lineOfBusiness": "zzz1", + "instanceParams": [{}], + "modelInfo": { + "modelInvariantId": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8", + "modelVersionId": "afacccf6-397d-45d6-b5ae-94c39734b168", + "modelName": "2017-388_ADIOD-vPE", + "modelVersion": "4.0", + "modelCustomizationId": "b3c76f73-eeb5-4fb6-9d31-72a889f1811c", + "modelCustomizationName": "2017-388_ADIOD-vPE 0", + "uuid": "afacccf6-397d-45d6-b5ae-94c39734b168" + }, + "uuid": "afacccf6-397d-45d6-b5ae-94c39734b168" + }, + "2017-388_ADIOD-vPE 1": { + "action": "None", + "inMaint": false, + "rollbackOnFailure": "true", + "originalName": "2017-388_ADIOD-vPE 1", + "isMissingData": false, + "trackById": "cv7l1ak8vpe", + "vfModules": {}, + "vnfStoreKey": "2017-388_ADIOD-vPE 1", + "productFamilyId": "d8a6ed93-251c-47ca-adc9-86671fd19f4c", + "lcpCloudRegionId": "JANET25", + "legacyRegion": "123", + "tenantId": "092eb9e8e4b7412e8787dd091bc58e86", + "platformName": "platform", + "lineOfBusiness": "ONAP", + "instanceParams": [{}], + "modelInfo": { + "modelInvariantId": "00beb8f9-6d39-452f-816d-c709b9cbb87d", + "modelVersionId": "0903e1c0-8e03-4936-b5c2-260653b96413", + "modelName": "2017-388_ADIOD-vPE", + "modelVersion": "1.0", + "modelCustomizationId": "280dec31-f16d-488b-9668-4aae55d6648a", + "modelCustomizationName": "2017-388_ADIOD-vPE 1", + "uuid": "0903e1c0-8e03-4936-b5c2-260653b96413" + }, + "uuid": "0903e1c0-8e03-4936-b5c2-260653b96413" + } + }, + "instanceParams": [{}], + "validationCounter": 0, + "existingNames": {"yoav": ""}, + "existingVNFCounterMap": { + "69e09f68-8b63-4cc9-b9ff-860960b5db09": 1, + "afacccf6-397d-45d6-b5ae-94c39734b168": 1, + "0903e1c0-8e03-4936-b5c2-260653b96413": 1 + }, + "existingVnfGroupCounterMap": { + "daeb6568-cef8-417f-9075-ed259ce59f48": 0, + "c2b300e6-45de-4e5e-abda-3032bee2de56": -1 + }, + "existingNetworksCounterMap": {"ddc3f20c-08b5-40fd-af72-c6d14636b986": 1}, + "networks": { + "ExtVL 0": { + "inMaint": false, + "rollbackOnFailure": "true", + "originalName": "ExtVL 0", + "isMissingData": false, + "trackById": "s6okajvv2n8", + "networkStoreKey": "ExtVL 0", + "productFamilyId": "d8a6ed93-251c-47ca-adc9-86671fd19f4c", + "lcpCloudRegionId": "JANET25", + "legacyRegion": "12355555", + "tenantId": "092eb9e8e4b7412e8787dd091bc58e86", + "platformName": "platform", + "lineOfBusiness": null, + "instanceParams": [{}], + "modelInfo": { + "modelInvariantId": "379f816b-a7aa-422f-be30-17114ff50b7c", + "modelVersionId": "ddc3f20c-08b5-40fd-af72-c6d14636b986", + "modelName": "ExtVL", + "modelVersion": "37.0", + "modelCustomizationId": "94fdd893-4a36-4d70-b16a-ec29c54c184f", + "modelCustomizationName": "ExtVL 0", + "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986" + }, + "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986" + } + }, + "vnfGroups": { + "groupingservicefortest..ResourceInstanceGroup..0": { + "inMaint": false, + "rollbackOnFailure": "true", + "originalName": "groupingservicefortest..ResourceInstanceGroup..0", + "isMissingData": false, + "trackById": "se0obn93qq", + "vnfGroupStoreKey": "groupingservicefortest..ResourceInstanceGroup..0", + "instanceName": "groupingservicefortestResourceInstanceGroup0", + "instanceParams": [{}], + "modelInfo": { + "modelInvariantId": "4bb2e27e-ddab-4790-9c6d-1f731bc14a45", + "modelVersionId": "daeb6568-cef8-417f-9075-ed259ce59f48", + "modelName": "groupingservicefortest..ResourceInstanceGroup..0", + "modelVersion": "1", + "modelCustomizationName": "groupingservicefortest..ResourceInstanceGroup..0", + "uuid": "daeb6568-cef8-417f-9075-ed259ce59f48" + }, + "uuid": "daeb6568-cef8-417f-9075-ed259ce59f48" + } + }, + "instanceName": "yoav", + "globalSubscriberId": "e433710f-9217-458d-a79d-1c7aff376d89", + "subscriptionServiceType": "TYLER SILVIA", + "owningEntityId": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc", + "productFamilyId": "d8a6ed93-251c-47ca-adc9-86671fd19f4c", + "lcpCloudRegionId": "JANET25", + "tenantId": "092eb9e8e4b7412e8787dd091bc58e86", + "aicZoneId": "ATL53", + "pause": null, + "projectName": "WATKINS", + "rollbackOnFailure": "true", + "bulkSize": 1, + "aicZoneName": "AAIATLTE-ATL53", + "owningEntityName": "WayneHolland", + "testApi": "VNF_API", + "isEcompGeneratedNaming": false, + "tenantName": "USP-SIP-IC-24335-T-01", + "modelInfo": { + "modelInvariantId": "cdb90b57-ed78-4d44-a5b4-7f43a02ec632", + "modelVersionId": "1a80c596-27e5-4ca9-b5bb-e03a7fd4c0fd", + "modelName": "action-data", + "modelVersion": "1.0", + "uuid": "1a80c596-27e5-4ca9-b5bb-e03a7fd4c0fd" + }, + "isALaCarte": false, + "name": "action-data", + "version": "1.0", + "description": "ADIOD vMX vPE based on Juniper 17.2 release. Updated with updated VF for v8.0 of VLM", + "category": "Network L1-3", + "uuid": "1a80c596-27e5-4ca9-b5bb-e03a7fd4c0fd", + "invariantUuid": "cdb90b57-ed78-4d44-a5b4-7f43a02ec632", + "serviceType": "pnf", + "serviceRole": "Testing", + "vidNotions": {"instantiationUI": "legacy", "modelCategory": "other", "viewEditUI": "legacy"}, + "isMultiStepDesign": true + } + }, + "lcpRegionsAndTenants": { + "lcpRegionList": [{ + "id": "JANET25", + "name": "JANET25 (AIC)", + "isPermitted": true, + "cloudOwner": "irma-aic" + }, {"id": "hvf6", "name": "hvf6 (AIC)", "isPermitted": true, "cloudOwner": "irma-aic"}], + "lcpRegionsTenantsMap": { + "JANET25": [{ + "id": "092eb9e8e4b7412e8787dd091bc58e86", + "name": "USP-SIP-IC-24335-T-01", + "isPermitted": true, + "cloudOwner": "irma-aic" + }], + "hvf6": [{ + "id": "bae71557c5bb4d5aac6743a4e5f1d054", + "name": "AIN Web Tool-15-D-testalexandria", + "isPermitted": true, + "cloudOwner": "irma-aic" + }, { + "id": "229bcdc6eaeb4ca59d55221141d01f8e", + "name": "AIN Web Tool-15-D-STTest2", + "isPermitted": true, + "cloudOwner": "irma-aic" + }, { + "id": "1178612d2b394be4834ad77f567c0af2", + "name": "AIN Web Tool-15-D-SSPtestcustome", + "isPermitted": true, + "cloudOwner": "irma-aic" + }, { + "id": "19c5ade915eb461e8af52fb2fd8cd1f2", + "name": "AIN Web Tool-15-D-UncheckedEcopm", + "isPermitted": true, + "cloudOwner": "irma-aic" + }, { + "id": "de007636e25249238447264a988a927b", + "name": "AIN Web Tool-15-D-dfsdf", + "isPermitted": true, + "cloudOwner": "irma-aic" + }, { + "id": "62f29b3613634ca6a3065cbe0e020c44", + "name": "AIN/SMS-16-D-Multiservices1", + "isPermitted": true, + "cloudOwner": "irma-aic" + }, { + "id": "649289e30d3244e0b48098114d63c2aa", + "name": "AIN Web Tool-15-D-SSPST66", + "isPermitted": true, + "cloudOwner": "irma-aic" + }, { + "id": "3f21eeea6c2c486bba31dab816c05a32", + "name": "AIN Web Tool-15-D-ASSPST47", + "isPermitted": true, + "cloudOwner": "irma-aic" + }, { + "id": "f60ce21d3ee6427586cff0d22b03b773", + "name": "CESAR-100-D-sspjg67246", + "isPermitted": true, + "cloudOwner": "irma-aic" + }, { + "id": "8774659e425f479895ae091bb5d46560", + "name": "CESAR-100-D-sspjg68359", + "isPermitted": true, + "cloudOwner": "irma-aic" + }, { + "id": "624eb554b0d147c19ff8885341760481", + "name": "AINWebTool-15-D-iftach", + "isPermitted": true, + "cloudOwner": "irma-aic" + }, { + "id": "214f55f5fc414c678059c383b03e4962", + "name": "CESAR-100-D-sspjg612401", + "isPermitted": true, + "cloudOwner": "irma-aic" + }, { + "id": "c90666c291664841bb98e4d981ff1db5", + "name": "CESAR-100-D-sspjg621340", + "isPermitted": true, + "cloudOwner": "irma-aic" + }, { + "id": "ce5b6bc5c7b348e1bf4b91ac9a174278", + "name": "sspjg621351cloned", + "isPermitted": true, + "cloudOwner": "irma-aic" + }, { + "id": "b386b768a3f24c8e953abbe0b3488c02", + "name": "AINWebTool-15-D-eteancomp", + "isPermitted": true, + "cloudOwner": "irma-aic" + }, { + "id": "dc6c4dbfd225474e9deaadd34968646c", + "name": "AINWebTool-15-T-SPFET", + "isPermitted": true, + "cloudOwner": "irma-aic" + }, { + "id": "02cb5030e9914aa4be120bd9ed1e19eb", + "name": "AINWebTool-15-X-eeweww", + "isPermitted": true, + "cloudOwner": "irma-aic" + }, { + "id": "f2f3830e4c984d45bcd00e1a04158a79", + "name": "CESAR-100-D-spjg61909", + "isPermitted": true, + "cloudOwner": "irma-aic" + }, { + "id": "05b91bd5137f4929878edd965755c06d", + "name": "CESAR-100-D-sspjg621512cloned", + "isPermitted": true, + "cloudOwner": "irma-aic" + }, { + "id": "7002fbe8482d4a989ddf445b1ce336e0", + "name": "AINWebTool-15-X-vdr", + "isPermitted": true, + "cloudOwner": "irma-aic" + }, { + "id": "4008522be43741dcb1f5422022a2aa0b", + "name": "AINWebTool-15-D-ssasa", + "isPermitted": true, + "cloudOwner": "irma-aic" + }, { + "id": "f44e2e96a1b6476abfda2fa407b00169", + "name": "AINWebTool-15-D-PFNPT", + "isPermitted": true, + "cloudOwner": "irma-aic" + }, { + "id": "b69a52bec8a84669a37a1e8b72708be7", + "name": "AINWebTool-15-X-vdre", + "isPermitted": true, + "cloudOwner": "irma-aic" + }, { + "id": "fac7d9fd56154caeb9332202dcf2969f", + "name": "AINWebTool-15-X-NONPODECOMP", + "isPermitted": true, + "cloudOwner": "irma-aic" + }, { + "id": "2d34d8396e194eb49969fd61ffbff961", + "name": "DN5242-Nov16-T5", + "isPermitted": true, + "cloudOwner": "irma-aic" + }, { + "id": "cb42a77ff45b48a8b8deb83bb64acc74", + "name": "ro-T11", + "isPermitted": true, + "cloudOwner": "irma-aic" + }, { + "id": "fa45ca53c80b492fa8be5477cd84fc2b", + "name": "ro-T112", + "isPermitted": true, + "cloudOwner": "irma-aic" + }, { + "id": "4914ab0ab3a743e58f0eefdacc1dde77", + "name": "DN5242-Nov21-T1", + "isPermitted": true, + "cloudOwner": "irma-aic" + }, { + "id": "d0a3e3f2964542259d155a81c41aadc3", + "name": "test-hvf6-09", + "isPermitted": true, + "cloudOwner": "irma-aic" + }, { + "id": "cbb99fe4ada84631b7baf046b6fd2044", + "name": "DN5242-Nov16-T3", + "isPermitted": true, + "cloudOwner": "irma-aic" + }] + } + }, + "subscribers": [{ + "id": "ERICA5779-Subscriber-2", + "name": "ERICA5779-Subscriber-2", + "isPermitted": false + }, { + "id": "ERICA5779-Subscriber-3", + "name": "ERICA5779-Subscriber-3", + "isPermitted": false + }, { + "id": "ERICA5779-Subscriber-4", + "name": "ERICA5779-Subscriber-5", + "isPermitted": false + }, { + "id": "ERICA5779-TestSub-PWT-101", + "name": "ERICA5779-TestSub-PWT-101", + "isPermitted": false + }, { + "id": "ERICA5779-TestSub-PWT-102", + "name": "ERICA5779-TestSub-PWT-102", + "isPermitted": false + }, { + "id": "ERICA5779-TestSub-PWT-103", + "name": "ERICA5779-TestSub-PWT-103", + "isPermitted": false + }, { + "id": "31739f3e-526b-11e6-beb8-9e71128cae77", + "name": "CRAIG/ROBERTS", + "isPermitted": false + }, {"id": "DHV1707-TestSubscriber-2", "name": "DALE BRIDGES", "isPermitted": false}, { + "id": "jimmy-example", + "name": "JimmyExampleCust-20161102", + "isPermitted": false + }, {"id": "jimmy-example2", "name": "JimmyExampleCust-20161103", "isPermitted": false}, { + "id": "CAR_2020_ER", + "name": "CAR_2020_ER", + "isPermitted": true + }, { + "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb", + "name": "Emanuel", + "isPermitted": false + }, { + "id": "21014aa2-526b-11e6-beb8-9e71128cae77", + "name": "JULIO ERICKSON", + "isPermitted": false + }, { + "id": "DHV1707-TestSubscriber-1", + "name": "LLOYD BRIDGES", + "isPermitted": false + }, {"id": "e433710f-9217-458d-a79d-1c7aff376d89", "name": "SILVIA ROBBINS", "isPermitted": true}], + "productFamilies": null, + "serviceTypes": { + "e433710f-9217-458d-a79d-1c7aff376d89": [{ + "id": "17", + "name": "JOHANNA_SANTOS", + "isPermitted": false + }, {"id": "16", "name": "LINDSEY", "isPermitted": false}, { + "id": "2", + "name": "Emanuel", + "isPermitted": false + }, {"id": "5", "name": "Kennedy", "isPermitted": false}, { + "id": "14", + "name": "SSD", + "isPermitted": false + }, {"id": "1", "name": "TYLER SILVIA", "isPermitted": true}, { + "id": "12", + "name": "VPMS", + "isPermitted": false + }, {"id": "3", "name": "vJamie", "isPermitted": false}, { + "id": "0", + "name": "vRichardson", + "isPermitted": false + }, {"id": "18", "name": "vCarroll", "isPermitted": false}, { + "id": "9", + "name": "vMME", + "isPermitted": false + }, {"id": "13", "name": "vMMSC", "isPermitted": false}, { + "id": "10", + "name": "vMNS", + "isPermitted": false + }, {"id": "15", "name": "vMOG", "isPermitted": false}, { + "id": "8", + "name": "vOTA", + "isPermitted": false + }, {"id": "11", "name": "vSCP", "isPermitted": false}, { + "id": "6", + "name": "vSEGW", + "isPermitted": false + }, {"id": "7", "name": "vVM", "isPermitted": false}, {"id": "4", "name": "vVoiceMail", "isPermitted": false}] + }, + "aicZones": [{"id": "ATL53", "name": "AAIATLTE-ATL53"}, {"id": "ABC15", "name": "AAITESAN-ABC15"}, { + "id": "TES36", + "name": "ABCEETES-TES36" + }, {"id": "ATL54", "name": "AICFTAAI-ATL54"}, {"id": "ATL43", "name": "AICLOCID-ATL43"}, { + "id": "AMD15", + "name": "AMDFAA01-AMD15" + }, {"id": "AMF11", "name": "AMDOCS01-AMF11"}, {"id": "RCT1", "name": "AMSTERNL-RCT1"}, { + "id": "AMS1", + "name": "AMSTNLBW-AMS1" + }, {"id": "HJH1", "name": "AOEEQQQD-HJH1"}, {"id": "HJE1", "name": "AOEEWWWD-HJE1"}, { + "id": "MCS1", + "name": "ASACMAMS-MCS1" + }, {"id": "AUG1", "name": "ASDFGHJK-AUG1"}, {"id": "LUC1", "name": "ATLDFGYC-LUC1"}, { + "id": "ATL1", + "name": "ATLNGAMA-ATL1" + }, {"id": "ATL2", "name": "ATLNGANW-ATL2"}, {"id": "HPO1", "name": "ATLNGAUP-HPO1"}, { + "id": "ANI1", + "name": "ATLNGTRE-ANI1" + }, {"id": "ATL44", "name": "ATLSANAB-ATL44"}, {"id": "ATL56", "name": "ATLSANAC-ATL56"}, { + "id": "ABC11", + "name": "ATLSANAI-ABC11" + }, {"id": "ATL34", "name": "ATLSANAI-ATL34"}, {"id": "ATL63", "name": "ATLSANEW-ATL63"}, { + "id": "ABC12", + "name": "ATLSECIA-ABC12" + }, {"id": "AMD18", "name": "AUDIMA01-AMD18"}, {"id": "AVT1", "name": "AVTRFLHD-AVT1"}, { + "id": "KIT1", + "name": "BHYJFGLN-KIT1" + }, {"id": "BHY17", "name": "BHYTFRF3-BHY17"}, {"id": "RTW5", "name": "BHYTFRY4-RTW5"}, { + "id": "RTZ4", + "name": "BHYTFRZ6-RTZ4" + }, {"id": "RTD2", "name": "BHYTFRk4-RTD2"}, {"id": "BNA1", "name": "BNARAGBK-BNA1"}, { + "id": "VEL1", + "name": "BNMLKUIK-VEL1" + }, {"id": "BOT1", "name": "BOTHWAKY-BOT1"}, {"id": "CAL33", "name": "CALIFORN-CAL33"}, { + "id": "ATL84", + "name": "CANTTCOC-ATL84" + }, {"id": "HSD1", "name": "CHASKCDS-HSD1"}, {"id": "CHI1", "name": "CHILLIWE-CHI1"}, { + "id": "XCP12", + "name": "CHKGH123-XCP12" + }, {"id": "JNL1", "name": "CJALSDAC-JNL1"}, {"id": "KJN1", "name": "CKALDKSA-KJN1"}, { + "id": "CLG1", + "name": "CLGRABAD-CLG1" + }, {"id": "CKL1", "name": "CLKSKCKK-CKL1"}, {"id": "ATL66", "name": "CLLIAAII-ATL66"}, { + "id": "CQK1", + "name": "CQKSCAKK-CQK1" + }, {"id": "CWY1", "name": "CWYMOWBS-CWY1"}, {"id": "DKJ1", "name": "DKJSJDKA-DKJ1"}, { + "id": "DSF45", + "name": "DSFBG123-DSF45" + }, {"id": "DSL12", "name": "DSLFK242-DSL12"}, {"id": "FDE55", "name": "FDERT555-FDE55"}, { + "id": "VEN2", + "name": "FGHJUHIL-VEN2" + }, {"id": "ATL64", "name": "FORLOAAJ-ATL64"}, {"id": "GNV1", "name": "GNVLSCTL-GNV1"}, { + "id": "SAN22", + "name": "GNVLSCTL-SAN22" + }, {"id": "KAP1", "name": "HIOUYTRQ-KAP1"}, {"id": "LIS1", "name": "HOSTPROF-LIS1"}, { + "id": "HRG1", + "name": "HRGHRGGS-HRG1" + }, {"id": "HST25", "name": "HSTNTX01-HST25"}, {"id": "STN27", "name": "HSTNTX01-STN27"}, { + "id": "HST70", + "name": "HSTNTX70-HST70" + }, {"id": "KOR1", "name": "HYFLNBVT-KOR1"}, {"id": "RAD10", "name": "INDIPUNE-RAD10"}, { + "id": "REL1", + "name": "INGERFGT-REL1" + }, {"id": "JAD1", "name": "JADECLLI-JAD1"}, {"id": "HKA1", "name": "JAKHLASS-HKA1"}, { + "id": "JCS1", + "name": "JCSJSCJS-JCS1" + }, {"id": "JCV1", "name": "JCVLFLBW-JCV1"}, {"id": "KGM2", "name": "KGMTNC20-KGM2"}, { + "id": "KJF12", + "name": "KJFDH123-KJF12" + }, {"id": "JGS1", "name": "KSJKKKKK-JGS1"}, {"id": "LAG1", "name": "LARGIZON-LAG1"}, { + "id": "LAG1a", + "name": "LARGIZON-LAG1a" + }, {"id": "LAG45", "name": "LARGIZON-LAG1a"}, {"id": "LAG1b", "name": "LARGIZON-LAG1b"}, { + "id": "WAN1", + "name": "LEIWANGW-WAN1" + }, {"id": "DSA1", "name": "LKJHGFDS-DSA1"}, {"id": "LON1", "name": "LONEENCO-LON1"}, { + "id": "SITE", + "name": "LONEENCO-SITE" + }, {"id": "ZXL1", "name": "LWLWCANN-ZXL1"}, {"id": "MTN20", "name": "MDTWNJ21-MTN20"}, { + "id": "MTN32", + "name": "MDTWNJ21-MTN32" + }, {"id": "AMD13", "name": "MEMATLAN-AMD13"}, {"id": "MIC54", "name": "MICHIGAN-MIC54"}, { + "id": "MAR1", + "name": "MNBVCXZM-MAR1" + }, {"id": "NCA1", "name": "NCANCANN-NCA1"}, {"id": "NFT1", "name": "NFTJSSSS-NFT1"}, { + "id": "GAR1", + "name": "NGFVSJKO-GAR1" + }, {"id": "NYC1", "name": "NYCMNY54-NYC1"}, {"id": "OKC1", "name": "OKCBOK55-OKC1"}, { + "id": "OLG1", + "name": "OLHOLHOL-OLG1" + }, {"id": "OLK1", "name": "OLKOLKLS-OLK1"}, {"id": "NIR1", "name": "ORFLMANA-NIR1"}, { + "id": "JAN1", + "name": "ORFLMATT-JAN1" + }, {"id": "ORL1", "name": "ORLDFLMA-ORL1"}, {"id": "PAR1", "name": "PARSFRCG-PAR1"}, { + "id": "PBL1", + "name": "PBLAPBAI-PBL1" + }, {"id": "mac10", "name": "PKGTESTF-mac10"}, {"id": "mac20", "name": "PKGTESTF-mac20"}, { + "id": "TIR2", + "name": "PLKINHYI-TIR2" + }, {"id": "IBB1", "name": "PLMKOIJU-IBB1"}, {"id": "COM1", "name": "PLMKOPIU-COM1"}, { + "id": "POI1", + "name": "PLMNJKIU-POI1" + }, {"id": "PLT1", "name": "PLTNCA60-PLT1"}, {"id": "POI22", "name": "POIUY123-POI22"}, { + "id": "DCC1", + "name": "POIUYTGH-DCC1" + }, {"id": "DCC1a", "name": "POIUYTGH-DCC1a"}, {"id": "DCC1b", "name": "POIUYTGH-DCC1b"}, { + "id": "DCC2", + "name": "POIUYTGH-DCC2" + }, {"id": "DCC3", "name": "POIUYTGH-DCC3"}, {"id": "IAA1", "name": "QAZXSWED-IAA1"}, { + "id": "QWE1", + "name": "QWECLLI1-QWE1" + }, {"id": "NUM1", "name": "QWERTYUI-NUM1"}, {"id": "RAD1", "name": "RADICAL1-RAD1"}, { + "id": "RJN1", + "name": "RJNRBZAW-RJN1" + }, {"id": "SAA13", "name": "SAIT1AA9-SAA13"}, {"id": "SAA14", "name": "SAIT1AA9-SAA14"}, { + "id": "SDD81", + "name": "SAIT1DD6-SDD81" + }, {"id": "SDD82", "name": "SAIT1DD9-SDD82"}, {"id": "SAA11", "name": "SAIT9AA2-SAA11"}, { + "id": "SAA80", + "name": "SAIT9AA3-SAA80" + }, {"id": "SAA12", "name": "SAIT9AF8-SAA12"}, {"id": "SCC80", "name": "SAIT9CC3-SCC80"}, { + "id": "ATL75", + "name": "SANAAIRE-ATL75" + }, {"id": "ICC1", "name": "SANJITAT-ICC1"}, {"id": "SCK1", "name": "SCKSCKSK-SCK1"}, { + "id": "EHH78", + "name": "SDCSHHH5-EHH78" + }, {"id": "SAA78", "name": "SDCTAAA1-SAA78"}, {"id": "SAX78", "name": "SDCTAXG1-SAX78"}, { + "id": "SBX78", + "name": "SDCTBXG1-SBX78" + }, {"id": "SEE78", "name": "SDCTEEE4-SEE78"}, {"id": "SGG78", "name": "SDCTGGG1-SGG78"}, { + "id": "SXB78", + "name": "SDCTGXB1-SXB78" + }, {"id": "SJJ78", "name": "SDCTJJJ1-SJJ78"}, {"id": "SKK78", "name": "SDCTKKK1-SKK78"}, { + "id": "SLF78", + "name": "SDCTLFN1-SLF78" + }, {"id": "SLL78", "name": "SDCTLLL1-SLL78"}, {"id": "MAD11", "name": "SDFQWGKL-MAD11"}, { + "id": "HGD1", + "name": "SDFQWHGD-HGD1" + }, {"id": "SBB78", "name": "SDIT1BBB-SBB78"}, {"id": "SDG78", "name": "SDIT1BDG-SDG78"}, { + "id": "SBU78", + "name": "SDIT1BUB-SBU78" + }, {"id": "SHH78", "name": "SDIT1HHH-SHH78"}, {"id": "SJU78", "name": "SDIT1JUB-SJU78"}, { + "id": "SNA1", + "name": "SNANTXCA-SNA1" + }, {"id": "SAM1", "name": "SNDGCA64-SAN1"}, {"id": "SNG1", "name": "SNGPSIAU-SNG1"}, { + "id": "SSA56", + "name": "SSIT2AA7-SSA56" + }, {"id": "STG1", "name": "STTGGE62-STG1"}, {"id": "STT1", "name": "STTLWA02-STT1"}, { + "id": "SYD1", + "name": "SYDNAUBV-SYD1" + }, {"id": "ATL99", "name": "TEESTAAI-ATL43"}, {"id": "ATL98", "name": "TEESTAAI-ATL43"}, { + "id": "ATL76", + "name": "TELEPAAI-ATL76" + }, {"id": "ABC14", "name": "TESAAISA-ABC14"}, {"id": "TAT33", "name": "TESAAISA-TAT33"}, { + "id": "TAT34", + "name": "TESAAISB-TAT34" + }, {"id": "TAT37", "name": "TESAAISD-TAT37"}, {"id": "ATL62", "name": "TESSASCH-ATL62"}, { + "id": "TLP1", + "name": "TLPNXM18-TLP1" + }, {"id": "SAN13", "name": "TOKYJPFA-SAN13"}, {"id": "TOK1", "name": "TOKYJPFA-TOK1"}, { + "id": "TOL1", + "name": "TOLDOH21-TOL1" + }, {"id": "TOR1", "name": "TOROONXN-TOR1"}, {"id": "TOY1", "name": "TORYONNZ-TOY1"}, { + "id": "ATL35", + "name": "TTESSAAI-ATL35" + }, {"id": "TUF1", "name": "TUFCLLI1-TUF1"}, {"id": "SAI1", "name": "UBEKQLPD-SAI1"}, { + "id": "UUU4", + "name": "UUUAAAUU-UUU4" + }, {"id": "YYY1", "name": "UUUAIAAI-YYY1"}, {"id": "BAN1", "name": "VSDKYUTP-BAN1"}, { + "id": "WAS1", + "name": "WASHDCSW-WAS1" + }, {"id": "APP1", "name": "WBHGTYUI-APP1"}, {"id": "SUL2", "name": "WERTYUJK-SUL2"}, { + "id": "DEF2", + "name": "WSBHGTYL-DEF2" + }, {"id": "DHA12", "name": "WSXEDECF-DHA12"}, {"id": "MNT11", "name": "WSXEFBTH-MNT11"}, { + "id": "RAJ1", + "name": "YGBIJNLQ-RAJ1" + }, {"id": "JAG1", "name": "YUDFJULP-JAG1"}, {"id": "ZEN1", "name": "ZENCLLI1-ZEN1"}, { + "id": "ZOG1", + "name": "ZOGASTRO-ZOG1" + }, {"id": "SDE1", "name": "ZXCVBNMA-SDE1"}, {"id": "SIP1", "name": "ZXCVBNMK-SIP1"}, { + "id": "JUL1", + "name": "ZXCVBNMM-JUL1" + }, {"id": "ERT1", "name": "ertclli1-ERT1"}, {"id": "IOP1", "name": "iopclli1-IOP1"}, { + "id": "OPA1", + "name": "opaclli1-OPA1" + }, {"id": "RAI1", "name": "poiuytre-RAI1"}, {"id": "PUR1", "name": "purelyde-PUR1"}, { + "id": "RTY1", + "name": "rtyclli1-RTY1" + }, {"id": "SDF1", "name": "sdfclli1-SDF1"}, {"id": "SSW56", "name": "ss8126GT-SSW56"}, { + "id": "UIO1", + "name": "uioclli1-UIO1" + }], + "categoryParameters": { + "owningEntityList": [{ + "id": "aaa1", + "name": "aaa1" + }, {"id": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc", "name": "WayneHolland"}, { + "id": "Melissa", + "name": "Melissa" + }], + "projectList": [{"id": "WATKINS", "name": "WATKINS"}, {"id": "x1", "name": "x1"}, {"id": "yyy1", "name": "yyy1"}], + "lineOfBusinessList": [{"id": "ONAP", "name": "ONAP"}, {"id": "zzz1", "name": "zzz1"}], + "platformList": [{"id": "platform", "name": "platform"}, {"id": "xxx1", "name": "xxx1"}] + }, + "type": "UPDATE_LCP_REGIONS_AND_TENANTS" + } + } +} diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/shared.tree.service.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/shared.tree.service.ts new file mode 100644 index 000000000..5a023d55c --- /dev/null +++ b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/shared.tree.service.ts @@ -0,0 +1,278 @@ +import {Injectable} from "@angular/core"; +import {NgRedux} from "@angular-redux/store"; +import {AppState} from "../../../shared/store/reducers"; +import {ServiceInstanceActions} from "../../../shared/models/serviceInstanceActions"; +import {MessageBoxData} from "../../../shared/components/messageBox/messageBox.data"; +import {MessageBoxService} from "../../../shared/components/messageBox/messageBox.service"; +import * as _ from "lodash"; +import {DrawingBoardModes} from "../drawing-board.modes"; +import {AuditInfoModalComponent} from "../../../shared/components/auditInfoModal/auditInfoModal.component"; +import {VnfModelInfo} from "./models/vnf/vnf.model.info"; +import {ILevelNodeInfo} from "./models/basic.model.info"; + +@Injectable() +export class SharedTreeService { + private _sharedTreeService: SharedTreeService; + constructor(private _store: NgRedux<AppState>) { + } + + /*********************************************************** + * return if instance has missing data + * @param instance - vnf instance + * @param dynamicInputs - from the instance + * @param isEcompGeneratedNaming + ************************************************************/ + selectedVNF: string = null; + + + getSelectedVNF(): string { + return this.selectedVNF; + } + + setSelectedVNF(node): void { + if (_.isNil(node) || node.data.type !== 'VF') { + this.selectedVNF = null; + } else { + this.selectedVNF = node.data.vnfStoreKey; + } + } + + hasMissingData(instance, dynamicInputs: any, isEcompGeneratedNaming: boolean, requiredFields: string[]): boolean { + if (!isEcompGeneratedNaming && _.isEmpty(instance.instanceName)) { + return true; + } + + for (let field of requiredFields) { + if (_.isEmpty(instance[field])) { + return true; + } + } + + for (let field of dynamicInputs) { + if (field.isRequired && !_.isNil(instance.instanceParams) && _.isEmpty(instance.instanceParams[0][field.id])) { + return true; + } + } + return false; + } + + + addingStatusProperty(node) { + node['statusProperties'] = []; + node['statusProperties'].push({key: 'Prov Status:', value: node.provStatus, testId: 'provStatus'}); + node['statusProperties'].push({key: 'Orch Status:', value: node.orchStatus, testId: 'orchStatus'}); + if (node.inMaint) { + node['statusProperties'].push({key: 'In-maintenance', value: '', testId: 'inMaint'}); + } + return node; + } + + /********************************************** + * should delete or remove child instance's + "new" -> should remove + !new" -> should change action status + **********************************************/ + removeDeleteAllChild(node, serviceModelId: string, callback): void { + for (let nodeChild of node.children) { + if (nodeChild.data.action === ServiceInstanceActions.Create) { + if (!_.isNil(nodeChild.data) && !_.isNil(nodeChild.data.menuActions) && !_.isNil(nodeChild.data.menuActions['remove'])) { + nodeChild.data.menuActions['remove']['method'](nodeChild, serviceModelId); + } + } else { + if (!_.isNil(nodeChild.data) && !_.isNil(nodeChild.data.menuActions) && !_.isNil(nodeChild.data.menuActions['delete'])) { + nodeChild.data.menuActions['delete']['method'](nodeChild, serviceModelId); + } + } + } + callback(node, serviceModelId); + } + + + /********************************************** + * should undo delete child instance's + **********************************************/ + undoDeleteAllChild(node, serviceModelId: string, callback): void { + for (let nodeChild of node.children) { + if (!_.isNil(nodeChild.data) && !_.isNil(nodeChild.data.menuActions) && !_.isNil(nodeChild.data.menuActions['undoDelete'])) { + nodeChild.data.menuActions['undoDelete']['method'](nodeChild, serviceModelId); + } + } + callback(node, serviceModelId); + } + + /********************************************** + * should return true if can delete + **********************************************/ + shouldShowDelete(node): boolean { + const mode = this._store.getState().global.drawingBoardStatus; + if (!_.isNil(node) && !_.isNil(node.data) && !_.isNil(node.data.action) && !_.isNil(node.data.menuActions['delete'])) { + if (mode !== DrawingBoardModes.EDIT || node.data.action === ServiceInstanceActions.Create) { + return false; + } else if (node.data.action === ServiceInstanceActions.None) { + return true + } + return false; + } + return false; + } + + /********************************************** + * should return true if can undo delete + **********************************************/ + shouldShowUndoDelete(node): boolean { + const mode = this._store.getState().global.drawingBoardStatus; + if (mode === DrawingBoardModes.EDIT && !_.isNil(node.data.action) && !_.isNil(node.data.menuActions['undoDelete'])) { + if (node.data.action === ServiceInstanceActions.Create || node.data.action === ServiceInstanceActions.Delete) { + return false; + } else if (node.data.action.split('_').pop() === 'Delete') { + return true + } + return false; + } + return false; + } + /********************************************** + * should return true if can remove or edit + * enabled only on edit/design mode and for new instances + **********************************************/ + shouldShowRemoveAndEdit(node): boolean { + const mode = this._store.getState().global.drawingBoardStatus; + if (!_.isNil(node) && !_.isNil(node.data) && !_.isNil(node.data.action) && node.data.action === ServiceInstanceActions.Create && + mode !== DrawingBoardModes.VIEW && mode !== DrawingBoardModes.RETRY) { + return true; + } + return false; + } + /********************************************** + * should return true if can duplicate by mode + **********************************************/ + shouldShowDuplicate(node): boolean { + const mode = this._store.getState().global.drawingBoardStatus; + return !mode.includes('RETRY'); + } + + /********************************************** + * should return true if can audit info + **********************************************/ + shouldShowAuditInfo(node): boolean { + return this.isRetryMode() || (!_.isNil(node.data) && !_.isNil(node.data.action) && node.data.action !== ServiceInstanceActions.Create); + } + + + isRetryMode(): boolean { + const mode = this._store.getState().global.drawingBoardStatus; + return mode.includes('RETRY'); + } + + + /********************************************** + * should return true if can add node instances + **********************************************/ + shouldShowAddIcon(): boolean{ + const mode = this._store.getState().global.drawingBoardStatus; + return mode === DrawingBoardModes.EDIT || mode=== DrawingBoardModes.CREATE; + } + /************************************************ + return number of instances with action Delete + @type: vnfs networks, vngGroups (not vfModule) + @node : node model from the left tree + ************************************************/ + getExistingInstancesWithDeleteMode(node, serviceModelId: string, type: string): number { + let counter = 0; + const existingInstances = this._store.getState().service.serviceInstance[serviceModelId][type]; + const modelUniqueId = node.data.modelUniqueId; + if (!_.isNil(existingInstances)) { + for (let instanceKey in existingInstances) { + if (!_.isNil(existingInstances[instanceKey].action)) { + if (existingInstances[instanceKey].modelInfo.modelUniqueId === modelUniqueId && existingInstances[instanceKey].action.split('_').pop() === 'Delete') { + counter++; + } + } + } + } + return counter; + } + + + isServiceOnDeleteMode(serviceId: string): boolean { + return this._store.getState().service.serviceInstance[serviceId].action === ServiceInstanceActions.Delete; + } + + + openModal(node : any | any[] , serviceModelId : string, cb : Function) : void { + let type: string = _.isArray(node) ? 'Service' : node.data.typeName; + let messageBoxData: MessageBoxData = new MessageBoxData( + "Mark for Delete", + `You are about to mark for delete this ${type} this will also mark all its children and remove all new instances just added`, + <any>"warning", + <any>"md", + [ + { + text: "Mark and remove", + size: "large", + callback: cb.bind(this, node, serviceModelId), + closeModal: true + }, + {text: "Don’t Remove", size: "medium", closeModal: true} + ]); + + MessageBoxService.openModal.next(messageBoxData); + } + + someChildHasCreateAction(nodes: any | any[]) : boolean { + let nodesArr = _.isArray(nodes) ? nodes : [nodes]; + for(const node of nodesArr){ + if(node.action === ServiceInstanceActions.Create) {return true;} + if(node.children){ + for (let nodeChild of node.children) { + if (nodeChild.action === ServiceInstanceActions.Create) { + return true; + } + if(nodeChild.children && nodeChild.children.length > 0){ + for(let child of nodeChild.children){ + let hasCreateAction = this.someChildHasCreateAction(child); + if(hasCreateAction) { + return true; + } + } + } + } + } + } + return false; + } + + shouldShowDeleteInstanceWithChildrenModal(node : any | any[] , serviceModelId : string, cb : Function) : void { + if(this.someChildHasCreateAction(node)){ + this.openModal(node , serviceModelId, cb); + }else { + cb(node, serviceModelId) + } + } + + + isFailed(node): boolean { + return !_.isNil(node.data) ? node.data.isFailed : false; + } + + /************************************************ + in a case the node is failed e.g. not instantiated correctly + the function will call to openRetryInstanceAuditInfoModal + @node : node model from the left tree + @serviceModelId : serviceModelId + @instance : instance + @instanceType: instanceType + @modelInfoService : the model (vnf, vfmodule, network, vnfgroup)object that call to the function (this) + ************************************************/ + openAuditInfoModal(node, serviceModelId, instance, instanceType, modelInfoService : ILevelNodeInfo){ + let isInstanceFailed = this.isFailed(node); + AuditInfoModalComponent.openInstanceAuditInfoModal.next({ + instanceId: serviceModelId, + type: instanceType, + model: modelInfoService.getModel(node.data.modelName, instance, this._store.getState().service.serviceHierarchy[serviceModelId]), + instance, + isInstanceFailed, + trackById: instance.trackById + }); + } +} diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/search/search.component.html b/vid-webpack-master/src/app/drawingBoard/service-planning/search/search.component.html new file mode 100644 index 000000000..0222b8097 --- /dev/null +++ b/vid-webpack-master/src/app/drawingBoard/service-planning/search/search.component.html @@ -0,0 +1,8 @@ +<div class="search-container"> + <sdc-filter-bar + [placeHolder]="'Search...'" + [debounceTime]="250" + [testId]="inputTestId" + (valueChange)="searchTree($event)"> + </sdc-filter-bar> +</div> diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/search/search.component.scss b/vid-webpack-master/src/app/drawingBoard/service-planning/search/search.component.scss new file mode 100644 index 000000000..5d9996256 --- /dev/null +++ b/vid-webpack-master/src/app/drawingBoard/service-planning/search/search.component.scss @@ -0,0 +1,3 @@ +.search-container { + min-width: 40px; +} diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/search/search.component.spec.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/search/search.component.spec.ts new file mode 100644 index 000000000..754dd6690 --- /dev/null +++ b/vid-webpack-master/src/app/drawingBoard/service-planning/search/search.component.spec.ts @@ -0,0 +1,93 @@ +import {ComponentFixture, TestBed} from '@angular/core/testing'; +import {HttpClientTestingModule} from '@angular/common/http/testing'; +import {CUSTOM_ELEMENTS_SCHEMA} from "@angular/core"; +import {SearchComponent} from "./search.component"; +import {FormsModule, ReactiveFormsModule} from "@angular/forms"; + +describe('Spinner component', () => { + + let component: SearchComponent; + let fixture: ComponentFixture<SearchComponent>; + + beforeAll(done => (async () => { + TestBed.configureTestingModule({ + imports: [FormsModule, ReactiveFormsModule, HttpClientTestingModule], + providers: [], + declarations: [SearchComponent], + schemas: [CUSTOM_ELEMENTS_SCHEMA] + }); + await TestBed.compileComponents(); + + fixture = TestBed.createComponent(SearchComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + + })().then(done).catch(done.fail)); + + + test('component should be defined', () => { + expect(component).toBeDefined(); + }); + + test('searchTree should return all nodes that include some text: with text', () => { + component.nodes = [ + { + name: 'name_1' + }, + { + name: 'name_2' + }, + { + name: 'name_3' + }, + { + name: 'name_3' + }]; + jest.spyOn(component.updateNodes, 'emit'); + spyOn(component, 'expandParentByNodeId').and.stub(); + component.searchTree('name_1'); + + expect(component.updateNodes.emit).toHaveBeenCalledWith({ + nodes: [ + { + name: 'name_1' + }, + { + name: 'name_2' + }, + { + name: 'name_3' + }, + { + name: 'name_3' + }], + filterValue: 'name_1' + }); + }); + + test('searchTree should return all nodes that include some text: without text', () => { + component.nodes = [ + { + name: 'name_1', + children: [ + { + name: 'name_child_1' + } + ] + }, + { + name: 'name_2' + }, + { + name: 'name_3' + }, + { + name: 'name_4' + }]; + jest.spyOn(component.updateNodes, 'emit'); + spyOn(component, 'expandParentByNodeId').and.stub(); + component.searchTree(''); + + expect(component.updateNodes.emit).toHaveBeenCalled(); + }); +}); diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/search/search.component.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/search/search.component.ts new file mode 100644 index 000000000..19edbcd09 --- /dev/null +++ b/vid-webpack-master/src/app/drawingBoard/service-planning/search/search.component.ts @@ -0,0 +1,50 @@ +import {Component, EventEmitter, Input, Output} from "@angular/core"; +import {IDType, ITreeNode} from "angular-tree-component/dist/defs/api"; +import * as _ from 'lodash'; + +@Component({ + selector: 'search-component', + templateUrl: './search.component.html', + styleUrls: ['./search.component.scss'] +}) +export class SearchComponent { + @Input() tree; + @Input() nodes; + @Input() inputTestId: string; + + @Output() updateNodes: EventEmitter<any> = new EventEmitter(); + + searchTree(searchText: string): void { + if(_.isNil(searchText)){ + return; + } + let __this = this; + let results: ITreeNode[] = []; + this.nodes.forEach( (node) => { + __this.searchTreeNode(node, searchText, results); + }); + results.forEach(function (result) { + __this.expandParentByNodeId(result.id) + }); + this.updateNodes.emit({ + nodes: this.nodes, + filterValue: searchText + }); + return; + } + + expandParentByNodeId(id: IDType): void { + this.tree.treeModel.getNodeById(id).parent.expand(); + } + + searchTreeNode(node, searchText: string, results): void { + if (node.name.toLowerCase().indexOf(searchText.toLowerCase()) != -1) { + results.push(node); + } + if (node.children != null) { + for (let i = 0; i < node.children.length; i++) { + this.searchTreeNode(node.children[i], searchText, results); + } + } + } +} diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/service-planning.component.html b/vid-webpack-master/src/app/drawingBoard/service-planning/service-planning.component.html index 5b2f22d5f..059937f6d 100644 --- a/vid-webpack-master/src/app/drawingBoard/service-planning/service-planning.component.html +++ b/vid-webpack-master/src/app/drawingBoard/service-planning/service-planning.component.html @@ -1,13 +1,13 @@ -<div class="service-planning-header"> - <drawing-board-header></drawing-board-header> -</div> -<div class="service-planning-content row"> - <available-models-tree class="left-side col-md-6" (highlightInstances)="highlightInstancesBySelectingNode($event)"></available-models-tree> - <!--<no-content-message-and-icon *ngIf="!isShowTree()" class="span-over"--> - <!--data-title="Please add objects (VNFs, network, modules etc.) from the left tree to design the service instance"--> - <!--subtitle="Once done, click Deploy to start instantiation"--> - <!--iconPath="./img/UPLOAD.svg"--> - <!--iconClass="upload-icon-service-planing"></no-content-message-and-icon>--> - <drawing-board-tree *ngIf="isShowTree()" class="span-over col-md-6" (highlightNode)="highlightNodeBySelectingInstance($event)"></drawing-board-tree> +<div [attr.id]="pageMode" clickOutside [classElements]="['angular-tree-component']" (clickOutsideTrigger)="clickOutside();"> + <div class="service-planning-header" > + <drawing-board-header></drawing-board-header> + </div> + <div class="service-planning-content"> + <available-models-tree class="left-side" [ngClass]="isShowComponentInfo() ?'col-md-5':'col-md-6'" + (highlightInstances)="highlightInstancesBySelectingNode($event)"></available-models-tree> + <drawing-board-tree *ngIf="isShowTree()" class="span-over" [ngClass]="isShowComponentInfo() ?'col-md-5':'col-md-6'" (highlightNode)="highlightNodeBySelectingInstance($event)"></drawing-board-tree> + <component-info *ngIf="isShowComponentInfo()" class="col-md-2"></component-info> + </div> + </div> diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/service-planning.component.scss b/vid-webpack-master/src/app/drawingBoard/service-planning/service-planning.component.scss index 69546a6c0..641af7acb 100644 --- a/vid-webpack-master/src/app/drawingBoard/service-planning/service-planning.component.scss +++ b/vid-webpack-master/src/app/drawingBoard/service-planning/service-planning.component.scss @@ -2,6 +2,8 @@ .service-planning-content { display: flex; flex: 1; + position: relative; + z-index: 0; } .span-over { @@ -14,3 +16,13 @@ height: 117px; margin-top: 32px; } + +component-info { + border-left: 1px solid #D2D2D2; + height: calc(100vh - 60px); + overflow: auto; + + &.col-md-2{ + padding: 0; + } +} diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/service-planning.component.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/service-planning.component.ts index 1ce0e8100..cbe8445ca 100644 --- a/vid-webpack-master/src/app/drawingBoard/service-planning/service-planning.component.ts +++ b/vid-webpack-master/src/app/drawingBoard/service-planning/service-planning.component.ts @@ -1,8 +1,17 @@ -import {Component, ViewChild} from '@angular/core'; -import {DrawingBoardTreeComponent} from "../drawing-board-tree/drawing-board-tree.component"; -import {AvailableModelsTreeComponent} from "../available-models-tree/available-models-tree.component"; +import {Component, OnInit, ViewChild} from '@angular/core'; +import {DrawingBoardTreeComponent} from "./drawing-board-tree/drawing-board-tree.component"; +import {AvailableModelsTreeComponent} from "./available-models-tree/available-models-tree.component"; import {ITreeNode} from "angular-tree-component/dist/defs/api"; import {TreeComponent} from 'angular-tree-component'; +import {ActivatedRoute} from "@angular/router"; +import * as _ from 'lodash'; +import {DrawingBoardModes} from "./drawing-board.modes"; +import {NgRedux} from "@angular-redux/store"; +import {AppState} from "../../shared/store/reducers"; +import {updateDrawingBoardStatus} from "../../shared/storeUtil/utils/global/global.actions"; +import {FeatureFlagsService, Features} from "../../shared/services/featureFlag/feature-flags.service"; +import {ComponentInfoService} from "./component-info/component-info.service"; +import {ComponentInfoModel, ComponentInfoType} from "./component-info/component-info-model"; @Component({ selector: 'service-planning', @@ -10,8 +19,13 @@ import {TreeComponent} from 'angular-tree-component'; styleUrls: ['./service-planning.component.scss'] }) -export class ServicePlanningComponent { +export class ServicePlanningComponent implements OnInit { + constructor(private route: ActivatedRoute, + private store: NgRedux<AppState>) { + } + + pageMode: DrawingBoardModes = DrawingBoardModes.CREATE; @ViewChild(DrawingBoardTreeComponent) drawingModelTree; @ViewChild(AvailableModelsTreeComponent) availableModelTree; @@ -20,18 +34,23 @@ export class ServicePlanningComponent { } public highlightNodeBySelectingInstance(modelId: number): void { - this.availableModelTree.tree.treeModel.getNodeBy((node: ITreeNode) => node.data.id === modelId) - .setActiveAndVisible().expand(); + // modelId might be undefined, e.g., if selected instance has no source in model + let matchInstance = modelId ? this.availableModelTree.tree.treeModel.getNodeBy((node: ITreeNode) => (node.data.modelUniqueId) === modelId) : undefined; + if (matchInstance) { + matchInstance.setActiveAndVisible().expand(); + } else { + this.clearSelectionInTree(this.availableModelTree.tree); + } } - public highlightInstancesBySelectingNode(id: number): void { - if(this.isShowTree()) { + public highlightInstancesBySelectingNode(uniqueId: string): void { + if (this.isShowTree()) { let _this = this; - let matchInstances = _this.searchTree(id); + let matchInstances = _this.searchTree(uniqueId); if (!matchInstances.length) _this.clearSelectionInTree(_this.drawingModelTree.tree); matchInstances.forEach(function (instance, index) { - let multi : boolean = !!index; + let multi: boolean = !!index; _this.drawingModelTree.tree.treeModel.getNodeById(instance.id) .setActiveAndVisible(multi).expand(); }); @@ -44,34 +63,47 @@ export class ServicePlanningComponent { activateNode ? activateNode.toggleActivated().blur() : null; } - searchTree(modelId: number) { + searchTree(uniqueId: string) { let _this = this; let results = []; let nodes = _this.drawingModelTree.nodes; nodes.forEach(function (node) { - _this.searchTreeNode(node, modelId, results); + _this.searchTreeNode(node, uniqueId, results); }); return results; } - searchTreeNode(node, modelId: number, results): void { - if(node.modelId === modelId){ + searchTreeNode(node, uniqueId: string, results): void { + if ((node.modelUniqueId) === uniqueId) { results.push(node); } - if (node.children != null){ - for(let i = 0; i < node.children.length; i++){ - this.searchTreeNode(node.children[i], modelId, results); + + if (node.children != null) { + for (let i = 0; i < node.children.length; i++) { + this.searchTreeNode(node.children[i], uniqueId, results); } } } + ngOnInit(): void { + this.pageMode = (!_.isNil(this.route.routeConfig.path) && this.route.routeConfig.path !== "") ? this.route.routeConfig.path as DrawingBoardModes : DrawingBoardModes.CREATE; + this.store.dispatch(updateDrawingBoardStatus(this.pageMode)); + } + + isShowComponentInfo():boolean { + return FeatureFlagsService.getFlagState(Features.FLAG_1906_COMPONENT_INFO, this.store) + } + clickOutside(): void{ + this.clearSelectionInTree(this.drawingModelTree.tree); + this.clearSelectionInTree(this.availableModelTree.tree); + ComponentInfoService.triggerComponentInfoChange.next(new ComponentInfoModel(ComponentInfoType.SERVICE, [], [])) + } } export class ServicePlanningEmptyComponent extends ServicePlanningComponent { - isShowTree() : boolean { + isShowTree(): boolean { return false; } } - diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/typeNodeInformation.model.spec.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/typeNodeInformation.model.spec.ts new file mode 100644 index 000000000..a6d3b5398 --- /dev/null +++ b/vid-webpack-master/src/app/drawingBoard/service-planning/typeNodeInformation.model.spec.ts @@ -0,0 +1,59 @@ +import {TestBed, getTestBed} from '@angular/core/testing'; +import { + HttpClientTestingModule, +} from '@angular/common/http/testing'; +import {TypeNodeInformation} from "./typeNodeInformation.model"; + +describe('Available Models Tree Service', () => { + let injector; + beforeEach(() => { + + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + providers: [] + }).compileComponents(); + + injector = getTestBed(); + }); + + + test('TypeNodeInformation VNF', () => { + let type: TypeNodeInformation = new TypeNodeInformation(<any>{ + data: { + type: 'VF' + } + }); + expect(type.hierarchyName).toEqual('vnfs'); + expect(type.existingMappingCounterName).toEqual('existingVNFCounterMap'); + }); + + test('TypeNodeInformation VNF group', () => { + let type: TypeNodeInformation = new TypeNodeInformation(<any>{ + data: { + type: 'VnfGroup' + } + }); + expect(type.hierarchyName).toEqual('vnfGroups'); + expect(type.existingMappingCounterName).toEqual('existingVnfGroupCounterMap'); + }); + + test('TypeNodeInformation VL', () => { + let type: TypeNodeInformation = new TypeNodeInformation(<any>{ + data: { + type: 'VL' + } + }); + expect(type.hierarchyName).toEqual('networks'); + expect(type.existingMappingCounterName).toEqual('existingNetworksCounterMap'); + }); + + test('TypeNodeInformation Network', () => { + let type: TypeNodeInformation = new TypeNodeInformation(<any>{ + data: { + type: 'Network' + } + }); + expect(type.hierarchyName).toEqual('networks'); + expect(type.existingMappingCounterName).toEqual('existingNetworksCounterMap'); + }); +}); diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/typeNodeInformation.model.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/typeNodeInformation.model.ts new file mode 100644 index 000000000..e8e22a422 --- /dev/null +++ b/vid-webpack-master/src/app/drawingBoard/service-planning/typeNodeInformation.model.ts @@ -0,0 +1,39 @@ +import {ITreeNode} from "angular-tree-component/dist/defs/api"; +import * as _ from 'lodash'; + +export class TypeNodeInformation { + hierarchyName: string; + existingMappingCounterName: string; + + constructor(node: ITreeNode) { + if (!_.isNil(node)) { + switch (node.data.type) { + case 'VF' : { + this.hierarchyName = 'vnfs'; + this.existingMappingCounterName = 'existingVNFCounterMap'; + break; + } + case 'VnfGroup' : { + this.hierarchyName = 'vnfGroups'; + this.existingMappingCounterName = 'existingVnfGroupCounterMap'; + break; + } + case 'VL' : { + this.hierarchyName = 'networks'; + this.existingMappingCounterName = 'existingNetworksCounterMap'; + break; + } + case 'Network': { + this.hierarchyName = 'networks'; + this.existingMappingCounterName = 'existingNetworksCounterMap'; + break; + } + default : { + console.error("Node type is not recognize"); + } + } + } + } +} + + diff --git a/vid-webpack-master/src/app/factories/models/requestDetails.model.ts b/vid-webpack-master/src/app/factories/models/requestDetails.model.ts index 4ccc4781b..1663f7af7 100644 --- a/vid-webpack-master/src/app/factories/models/requestDetails.model.ts +++ b/vid-webpack-master/src/app/factories/models/requestDetails.model.ts @@ -14,6 +14,7 @@ export class ModelInfo { modelVersion: string; modelCustomizationId: string; modelCustomizationName: string; + customizationUuid: string; } export class RequestParameters { @@ -109,7 +110,7 @@ export class RootObject { // “relatedInstance”: { // “instanceId”: “{instanceGroupId}”, // “modelInfo”: { -// “modelType”: “networkCollection”, +// “modelType”: “networkInstanceGroup”, // “modelInvariantId”: “9ea660dc-155f-44d3-b45c-cc7648b4f31c”, // “modelVersionId”: “bb07aad1-ce2d-40c1-85cb-5392f76bb1ef”, // “modelName”: “{network collection model name}”, diff --git a/vid-webpack-master/src/app/factories/mso.factory.spec.ts b/vid-webpack-master/src/app/factories/mso.factory.spec.ts index 16efd2970..75f205804 100644 --- a/vid-webpack-master/src/app/factories/mso.factory.spec.ts +++ b/vid-webpack-master/src/app/factories/mso.factory.spec.ts @@ -1,24 +1,25 @@ import {createRequest} from './mso.factory'; -sessionStorage.setItem("msoRequestParametersTestApiValue","GR_API"); + describe('Vlantagging', () => { - it('should create a correct request', (done: DoneFn) => { + test('should create a correct request', () => { + sessionStorage.setItem("msoRequestParametersTestApiValue","GR_API"); let userInputs_withEcompGeneratedNaming = { "productFamily": "e433710f-9217-458d-a79d-1c7aff376d89", - "lcpRegion": "AAIAIC25", + "lcpRegion": "JANET25", "tenantId": "092eb9e8e4b7412e8787dd091bc58e86", "aicZone": "YYY1", "platformName": "plat1", - "lineOfBusiness": "ecomp" + "lineOfBusiness": "onap" }; let userInputs_withoutEcompGeneratedNaming = { "instanceName": "New Name", "productFamily": "e433710f-9217-458d-a79d-1c7aff376d89", - "lcpRegion": "AAIAIC25", + "lcpRegion": "JANET25", "tenantId": "092eb9e8e4b7412e8787dd091bc58e86", "aicZone": "YYY1", "platformName": "plat1", - "lineOfBusiness": "ecomp" + "lineOfBusiness": "onap" }; let service = { "service": { @@ -249,9 +250,9 @@ describe('Vlantagging', () => { "requestorId": "az2016", "suppressRollback": false }, - "lineOfBusiness": Object({ lineOfBusinessName: "ecomp" }), + "lineOfBusiness": Object({ lineOfBusinessName: "onap" }), "cloudConfiguration": { - "lcpCloudRegionId": "AAIAIC25", + "lcpCloudRegionId": "JANET25", "tenantId": "092eb9e8e4b7412e8787dd091bc58e86" }, "platform": Object({ platformName: "plat1" }), @@ -285,11 +286,7 @@ describe('Vlantagging', () => { "relatedInstance": { "instanceId": "AAI-12002-test3-vm230w", "modelInfo": { - "modelName": "oam_group", - "modelType": "networkCollection", - "modelVersion": "1", - "modelVersionId": "a0efd5fc-f7be-4502-936a-a6c6392b958f", - "modelInvariantId": "9384abf9-1231-4da4-bd8d-89e4d2f8a749" + "modelType": "networkInstanceGroup" } } }, @@ -297,11 +294,7 @@ describe('Vlantagging', () => { "relatedInstance": { "instanceId": "AAI-12002-test3-vm230w", "modelInfo": { - "modelName": "oam_group", - "modelType": "networkCollection", - "modelVersion": "1", - "modelVersionId": "a0efd5fc-f7be-4502-936a-a6c6392b958f", - "modelInvariantId": "9384abf9-1231-4da4-bd8d-89e4d2f8a749" + "modelType": "networkInstanceGroup" } } } @@ -314,6 +307,6 @@ describe('Vlantagging', () => { expectedResult["requestInfo"]["instanceName"] = "New Name"; let actualResult_withoutEcompGeneratedNaming = <any>createRequest("az2016",userInputs_withoutEcompGeneratedNaming, service, serviceInstanceId, networkInstanceGroups,'vDBE 0','1'); expect(actualResult_withoutEcompGeneratedNaming).toEqual(expectedResult); - done(); + sessionStorage.removeItem("msoRequestParametersTestApiValue"); }); }); diff --git a/vid-webpack-master/src/app/factories/mso.factory.ts b/vid-webpack-master/src/app/factories/mso.factory.ts index c26296edf..ebca83412 100644 --- a/vid-webpack-master/src/app/factories/mso.factory.ts +++ b/vid-webpack-master/src/app/factories/mso.factory.ts @@ -1,4 +1,12 @@ -import { RequestInfo, RequestDetails, ModelInfo, CloudConfiguration, LineOfBusiness, Platform, RelatedInstanceList, VfcModel } from "./models/requestDetails.model"; +import { + CloudConfiguration, + LineOfBusiness, + ModelInfo, + Platform, + RelatedInstanceList, + RequestDetails, + RequestInfo +} from "./models/requestDetails.model"; import * as _ from "lodash"; function extractModelInfoFromNodeTemplate(node: any, type: string) { @@ -33,10 +41,6 @@ function extractPlatform(userInputs: any): Platform { return platform; } -function extractVfcGroupModelAccordingToUuid(vnfModel: any, vfcUuid: string) { - return _.find(vnfModel.vfcInstanceGroups, { uuid: vfcUuid }); -} - function extractLineOfBusiness(userInputs: any) { let lob: LineOfBusiness = <LineOfBusiness>{}; lob.lineOfBusinessName = userInputs["lineOfBusiness"]; @@ -50,13 +54,9 @@ function extractCloudConfiguration(userInputs: any) { return cloudConfig; } -function extractModelInfoFromVfcNode(vfcModel: VfcModel): ModelInfo { +function extractModelInfoFromVfcNode(): ModelInfo { let modelinfo: ModelInfo = <ModelInfo>{}; - modelinfo.modelName = vfcModel.name; - modelinfo.modelType = "networkCollection"; - modelinfo.modelVersion = vfcModel.version; - modelinfo.modelVersionId = vfcModel.uuid; - modelinfo.modelInvariantId = vfcModel.invariantUuid; + modelinfo.modelType = "networkInstanceGroup"; return modelinfo; } @@ -77,12 +77,10 @@ export function createRequest(userId: string, userInputs: any, service: any, ser }; request.relatedInstanceList.push(serviceRelatedInstance); _.forOwn(networkInstanceGroups, function(group) { - let modelUuid = group["instance-group"]["model-version-id"]; - let vfcModel = extractVfcGroupModelAccordingToUuid(service.vnfs[vnfCustomizationName], modelUuid); let networkInstanceGroup: RelatedInstanceList = { relatedInstance: { instanceId: group["instance-group"].id, - modelInfo: extractModelInfoFromVfcNode(vfcModel) + modelInfo: extractModelInfoFromVfcNode() } }; request.relatedInstanceList.push(networkInstanceGroup); diff --git a/vid-webpack-master/src/app/featureFlag/directive/basic/basic.featureFlag.directive.spec.ts b/vid-webpack-master/src/app/featureFlag/directive/basic/basic.featureFlag.directive.spec.ts new file mode 100644 index 000000000..5722aa795 --- /dev/null +++ b/vid-webpack-master/src/app/featureFlag/directive/basic/basic.featureFlag.directive.spec.ts @@ -0,0 +1,93 @@ +import {TestBed, ComponentFixture, tick, inject} from '@angular/core/testing'; +import {Component, DebugElement, Renderer2, Type} from "@angular/core"; +import {By} from "@angular/platform-browser"; +import {BasicFeatureFlagDirective} from "./basic.featureFlag.directive"; +import {FeatureFlagService} from "../../service/featureFlag.service"; +import {ConfigurationService} from "../../../shared/services/configuration.service"; +import {HttpClientTestingModule, HttpTestingController} from "@angular/common/http/testing"; +import {NgRedux} from "@angular-redux/store"; +import {of} from "rxjs"; + +@Component({ + template: ` + <div + id="featureFlagOff" + featureFlag + [flagName]='"featureFlagOff"'> + </div> + <div + id="featureFlagOn" + featureFlag + [flagName]='"featureFlagOn"'> + </div>` +}) +class TestFeatureFlagComponent { +} + +class MockRenderer<T> { + setStyle() { + + } +} + +class MockAppStore<T> { + getState() { + return { + global: { + flags : { + + } + } + } + } +} + + +describe('Basic Feature Flag Directive', () => { + let component: TestFeatureFlagComponent; + let fixture: ComponentFixture<TestFeatureFlagComponent>; + let directiveInstance: BasicFeatureFlagDirective; + let elementOff: DebugElement; + let elementOn: DebugElement; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [ + HttpClientTestingModule + ], + declarations: [ + TestFeatureFlagComponent, + BasicFeatureFlagDirective], + providers: [ + FeatureFlagService, + ConfigurationService, + {provide: NgRedux, useClass: MockAppStore}, + {provide: Renderer2, useClass: MockRenderer}] + }).compileComponents(); + + fixture = TestBed.createComponent(TestFeatureFlagComponent); + component = fixture.componentInstance; + elementOff = fixture.debugElement.query(By.css('#featureFlagOff')); + elementOn = fixture.debugElement.query(By.css('#featureFlagOn')); + directiveInstance = elementOff.injector.get(BasicFeatureFlagDirective); + }); + + + test('directive should be defined', () => { + expect(directiveInstance).toBeDefined(); + }); + + test('should hide element if feature flag is off', () => { + directiveInstance.flagName = 'featureFlagOff'; + + directiveInstance.ngAfterContentChecked(); + expect(elementOff.nativeElement.style.display).toEqual('none'); + }); + + test('should show element if feature flag is on', () => { + directiveInstance.flagName = 'featureFlagOn'; + + directiveInstance.ngAfterContentChecked(); + expect(elementOn.nativeElement.style.display).toEqual(''); + }); +}); diff --git a/vid-webpack-master/src/app/featureFlag/directive/basic/basic.featureFlag.directive.ts b/vid-webpack-master/src/app/featureFlag/directive/basic/basic.featureFlag.directive.ts new file mode 100644 index 000000000..e6cbb4f17 --- /dev/null +++ b/vid-webpack-master/src/app/featureFlag/directive/basic/basic.featureFlag.directive.ts @@ -0,0 +1,29 @@ +import {AfterContentChecked, Directive, ElementRef, Input} from '@angular/core'; +import {FeatureFlagService} from "../../service/featureFlag.service"; +import * as _ from 'lodash'; + +/************************************************************************ + Feature Flag Directive + Example: + <div featureFlag [flagName]='"<flag name>"'></div> + ************************************************************************/ +@Directive({ + selector: '[featureFlag]' +}) +export class BasicFeatureFlagDirective implements AfterContentChecked { + @Input() flagName: string; + element: ElementRef; + + constructor(el: ElementRef, private _featureToggleService: FeatureFlagService) { + this.element = el; + } + + ngAfterContentChecked(): void { + if (!_.isNil(this.element)) { + const isFeatureOn: boolean = this._featureToggleService.isFeatureOn(this.flagName); + if(!isFeatureOn){ + this._featureToggleService.hideElement(this.element) + } + } + } +} diff --git a/vid-webpack-master/src/app/featureFlag/featureFlag.module.ts b/vid-webpack-master/src/app/featureFlag/featureFlag.module.ts new file mode 100644 index 000000000..d22076682 --- /dev/null +++ b/vid-webpack-master/src/app/featureFlag/featureFlag.module.ts @@ -0,0 +1,32 @@ +import {ModuleWithProviders, NgModule} from '@angular/core'; +import {CommonModule} from '@angular/common'; +import {BrowserModule} from "@angular/platform-browser"; +import {HttpClientModule} from "@angular/common/http"; +import {FeatureFlagService} from "./service/featureFlag.service"; +import {BasicFeatureFlagDirective} from "./directive/basic/basic.featureFlag.directive"; + + +@NgModule({ + imports: [ + BrowserModule, + HttpClientModule, + CommonModule + ], + declarations: [ + BasicFeatureFlagDirective + ], + exports: [ + BasicFeatureFlagDirective + ], + providers: [ + FeatureFlagService + ] +}) +export class FeatureFlagModule { + static forRoot(): ModuleWithProviders { + return { + ngModule: FeatureFlagModule, + providers: [] + }; + } +} diff --git a/vid-webpack-master/src/app/featureFlag/service/featureFlag.service.ts b/vid-webpack-master/src/app/featureFlag/service/featureFlag.service.ts new file mode 100644 index 000000000..09ce7bbf5 --- /dev/null +++ b/vid-webpack-master/src/app/featureFlag/service/featureFlag.service.ts @@ -0,0 +1,28 @@ +import {ElementRef, Injectable, Renderer2, RendererFactory2} from "@angular/core"; +import {ConfigurationService} from "../../shared/services/configuration.service"; + +@Injectable() +export class FeatureFlagService{ + private features : { [key: string]: boolean } = {}; + private renderer: Renderer2; + constructor(private _configurationService: ConfigurationService, + rendererFactory: RendererFactory2){ + this.renderer = rendererFactory.createRenderer(null, null); + this._configurationService.getFlags().subscribe((res: { [key: string]: boolean }) =>{ + this.features = res; + }) + } + + + isFeatureOn(feature : string) : boolean { + return this.features && this.getFeatureFlag()[feature] === true; + } + + getFeatureFlag() : { [key: string]: boolean } { + return this.features; + } + + hideElement(element: ElementRef) { + this.renderer.setStyle(element.nativeElement, 'display', 'none'); + } +} diff --git a/vid-webpack-master/src/app/global.actions.ts b/vid-webpack-master/src/app/global.actions.ts deleted file mode 100644 index 46575fb34..000000000 --- a/vid-webpack-master/src/app/global.actions.ts +++ /dev/null @@ -1,23 +0,0 @@ -import {Action, ActionCreator} from "redux"; -export const UPDATE_NAME= '[NAME] Update'; -export const UPDATE_FLAGS= '[FLAGS] Update'; - -export interface UpdateGlobalAction extends Action { - name?: string; -} - -export interface UpdateFlagsAction extends Action { - flags?: any; -} - -export const updateName: ActionCreator<UpdateGlobalAction> = - (name) => ({ - type: UPDATE_NAME, - name: name - }); - -export const updateFlags: ActionCreator<UpdateFlagsAction> = - (flags) => ({ - type: UPDATE_FLAGS, - flags: flags - }); diff --git a/vid-webpack-master/src/app/healthStatus/health-status.component.spec.ts b/vid-webpack-master/src/app/healthStatus/health-status.component.spec.ts new file mode 100644 index 000000000..8a37c77ee --- /dev/null +++ b/vid-webpack-master/src/app/healthStatus/health-status.component.spec.ts @@ -0,0 +1,64 @@ +import {TestBed, ComponentFixture, async} from '@angular/core/testing'; +import {HealthStatusComponent} from "./health-status.component"; +import {HealthStatusService} from "../shared/server/healthStatusService/health-status.service"; +import {HttpClientTestingModule} from "@angular/common/http/testing"; +import {ExternalComponentStatus} from "../shared/models/externalComponentStatus"; +import {Observable} from "rxjs"; +import {of} from "rxjs"; + +export class MockHealthStatusService { + + + getProbe(): Observable<Array<ExternalComponentStatus>> { + return of(new Array<ExternalComponentStatus>( + new ExternalComponentStatus("x", true, {y:"r"}))); + } +} + +describe('HealthStatusComponent', () => { + let component: HealthStatusComponent; + let fixture: ComponentFixture<HealthStatusComponent>; + let mockHealthStatusService : MockHealthStatusService; + + mockHealthStatusService = new MockHealthStatusService(); + + beforeAll(done => (async () => { + + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + providers: [{provide: HealthStatusService, useValue: mockHealthStatusService}], + declarations: [HealthStatusComponent] + }); + await TestBed.compileComponents(); + + fixture = TestBed.createComponent(HealthStatusComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + })().then(done).catch(done.fail)); + + test('isAvailable taken from component status available field', () => { + expect(component.isAvailable(new ExternalComponentStatus("a", true, null))).toBeTruthy(); + expect(component.isAvailable(new ExternalComponentStatus("a", false, null))).toBeFalsy(); + }); + + test('getMetadata filter rawData ', () => { + let metadata:string = JSON.stringify(component.getMetadata(new ExternalComponentStatus("a", true, {a:1, rawData:2}))); + expect(metadata).toContain("1"); + expect(metadata.indexOf("2")).toEqual(-1); + }); + + test('componentStatus is initialized on startup ', () => { + expect(JSON.stringify(component.componentStatuses[0].metadata)).toContain("y"); + }); + + test('when refresh componentStatus is updated', () => { + spyOn(mockHealthStatusService, "getProbe" ).and.returnValue( + of(new Array<ExternalComponentStatus>( + new ExternalComponentStatus("mySpecialValue", true, {y:"z"})))); + component.refreshData(); + expect(component.componentStatuses[0].component).toEqual("mySpecialValue"); + expect(mockHealthStatusService.getProbe).toHaveBeenCalledTimes(1); + + }); + +}); diff --git a/vid-webpack-master/src/app/healthStatus/health-status.component.ts b/vid-webpack-master/src/app/healthStatus/health-status.component.ts index 6a9ddfdd7..a2b175788 100644 --- a/vid-webpack-master/src/app/healthStatus/health-status.component.ts +++ b/vid-webpack-master/src/app/healthStatus/health-status.component.ts @@ -8,9 +8,9 @@ import {HealthStatusService} from "../shared/server/healthStatusService/health-s styleUrls: ['./health-status.component.scss'] }) export class HealthStatusComponent implements OnInit { - private componentStatuses: Array<ExternalComponentStatus> = []; - private dataIsReady: boolean; - private lastUpdatedDate: Date; + componentStatuses: Array<ExternalComponentStatus> = []; + dataIsReady: boolean; + lastUpdatedDate: Date; constructor(private _healthStatusService: HealthStatusService) { } diff --git a/vid-webpack-master/src/app/healthStatus/health-status.module.ts b/vid-webpack-master/src/app/healthStatus/health-status.module.ts new file mode 100644 index 000000000..7479394f1 --- /dev/null +++ b/vid-webpack-master/src/app/healthStatus/health-status.module.ts @@ -0,0 +1,25 @@ +import {NgModule} from "@angular/core"; +import {BrowserModule} from "@angular/platform-browser"; +import {FormsModule} from "@angular/forms"; +import {TooltipModule} from "ngx-tooltip"; +import {CommonModule} from "@angular/common"; +import {SharedModule} from "../shared/shared.module"; +import {FeatureFlagModule} from "../featureFlag/featureFlag.module"; +import {HealthStatusService} from "../shared/server/healthStatusService/health-status.service"; +import {HealthStatusComponent} from "./health-status.component"; + +@NgModule({ + imports: [ + BrowserModule, + FormsModule, + TooltipModule, + CommonModule, + SharedModule.forRoot(), + FeatureFlagModule.forRoot()], + providers: [HealthStatusService], + declarations: [HealthStatusComponent], + entryComponents: [HealthStatusComponent], + exports: [HealthStatusComponent] +}) + +export class HealthStatusModule {} diff --git a/vid-webpack-master/src/app/healthStatus/health-status.routing.ts b/vid-webpack-master/src/app/healthStatus/health-status.routing.ts new file mode 100644 index 000000000..5344d2e5b --- /dev/null +++ b/vid-webpack-master/src/app/healthStatus/health-status.routing.ts @@ -0,0 +1,19 @@ +import {Route} from '@angular/router'; +import {FlagsResolve} from "../shared/resolvers/flag/flag.resolver"; +import {HealthStatusComponent} from "./health-status.component"; + +export const HealthStatusRoutes: Route[] = [ + { + path: 'healthStatus', + children: [ + { + path: '', + component: HealthStatusComponent, + resolve: { + flags: FlagsResolve + }, + } + ] + } +]; + diff --git a/vid-webpack-master/src/app/home/home.component.e2e-spec.js b/vid-webpack-master/src/app/home/home.component.e2e-spec.js deleted file mode 100644 index 41203f9d8..000000000 --- a/vid-webpack-master/src/app/home/home.component.e2e-spec.js +++ /dev/null @@ -1,13 +0,0 @@ -describe('Home', function () { - - beforeEach(function () { - browser.get('/'); - }); - - it('should have <my-home>', function () { - var home = element(by.css('vid-app my-home')); - expect(home.isPresent()).toEqual(true); - expect(home.getText()).toEqual("Home Works!"); - }); - -}); diff --git a/vid-webpack-master/src/app/home/home.component.html b/vid-webpack-master/src/app/home/home.component.html deleted file mode 100644 index 604d9e1d0..000000000 --- a/vid-webpack-master/src/app/home/home.component.html +++ /dev/null @@ -1,3 +0,0 @@ -<p> - Home Works! -</p> diff --git a/vid-webpack-master/src/app/home/home.component.scss b/vid-webpack-master/src/app/home/home.component.scss deleted file mode 100644 index 5db1e17a3..000000000 --- a/vid-webpack-master/src/app/home/home.component.scss +++ /dev/null @@ -1,4 +0,0 @@ -// component styles are encapsulated and only applied to their components -* { - color: #FFEF00; -} diff --git a/vid-webpack-master/src/app/home/home.component.ts b/vid-webpack-master/src/app/home/home.component.ts deleted file mode 100644 index 1adaf0ebf..000000000 --- a/vid-webpack-master/src/app/home/home.component.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { SdcService } from '../services/sdc.service'; -import { DataService } from '../services/data.service'; - -@Component({ - selector: 'my-home', - templateUrl: './home.component.html', - styleUrls: ['./home.component.scss'], - providers: [SdcService, DataService] -}) -export class HomeComponent implements OnInit { - - constructor(private _sdcService: SdcService) { - // Do stuff - } - - ngOnInit() { - console.log('Hello Home'); - console.log('getServicesModels: '); - this._sdcService.getServicesModels().subscribe( - // onNext() function - value => console.log('value is ', value), - // onError() function - error => console.log('error is ', error), - // onComplete() function - () => console.log('completed') - ); - } - -} diff --git a/vid-webpack-master/src/app/instantiationStatus/InstantiationStatus.module.ts b/vid-webpack-master/src/app/instantiationStatus/InstantiationStatus.module.ts index 01db0f187..6d14b149d 100644 --- a/vid-webpack-master/src/app/instantiationStatus/InstantiationStatus.module.ts +++ b/vid-webpack-master/src/app/instantiationStatus/InstantiationStatus.module.ts @@ -1,33 +1,30 @@ import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { InputsModule } from '../modules/inputs.module'; import { DataTableModule } from 'angular2-datatable'; import { BootstrapModalModule } from 'ng2-bootstrap-modal'; import { TooltipModule } from 'ngx-tooltip'; import { InstantiationStatusComponent } from './instantiationStatus.component'; import { InstantiationStatusComponentService } from './instantiationStatus.component.service'; import { SharedModule } from '../shared/shared.module'; -import { AngularSvgIconModule } from 'angular-svg-icon'; import { ContextMenuModule, ContextMenuService } from 'ngx-contextmenu'; import {ModalModule, PopoverModule} from 'ngx-bootstrap'; -import {AuditInfoModalComponent} from "./auditInfoModal/auditInfoModal.component"; +import {SdcUiComponentsModule} from "onap-ui-angular"; @NgModule({ imports: [ CommonModule, FormsModule, ReactiveFormsModule, + SdcUiComponentsModule, BootstrapModalModule, DataTableModule, TooltipModule, ModalModule, - InputsModule, - AngularSvgIconModule, ContextMenuModule, SharedModule.forRoot(), PopoverModule.forRoot()], - declarations: [InstantiationStatusComponent, AuditInfoModalComponent], + declarations: [InstantiationStatusComponent, ], providers: [InstantiationStatusComponentService, ContextMenuService] }) export class InstantiationStatusModule { } diff --git a/vid-webpack-master/src/app/instantiationStatus/InstantiationStatus.routing.ts b/vid-webpack-master/src/app/instantiationStatus/InstantiationStatus.routing.ts new file mode 100644 index 000000000..6991eefef --- /dev/null +++ b/vid-webpack-master/src/app/instantiationStatus/InstantiationStatus.routing.ts @@ -0,0 +1,19 @@ +import {Route} from "@angular/router"; +import {FlagsResolve} from "../shared/resolvers/flag/flag.resolver"; +import {InstantiationStatusComponent} from "./instantiationStatus.component"; + +export const InstantiationStatusRoutes: Route[] = [ + { + path: 'instantiationStatus', + children: [ + { + path: '', + component: InstantiationStatusComponent, + resolve: { + flags: FlagsResolve + }, + } + ] + } +]; + diff --git a/vid-webpack-master/src/app/instantiationStatus/auditInfoModal/auditInfoModal.component.ts b/vid-webpack-master/src/app/instantiationStatus/auditInfoModal/auditInfoModal.component.ts deleted file mode 100644 index 1cff97f5b..000000000 --- a/vid-webpack-master/src/app/instantiationStatus/auditInfoModal/auditInfoModal.component.ts +++ /dev/null @@ -1,83 +0,0 @@ -import {Component, ViewChild} from '@angular/core'; -import {Subject} from 'rxjs/Subject'; -import {ModalDirective} from 'ngx-bootstrap' -import {Constants} from '../../shared/utils/constants'; -import {ModelInformationItem} from '../../shared/components/model-information/model-information.component'; -import {ServiceModel} from '../../shared/models/serviceModel'; -import {ServiceInfoService} from '../../shared/server/serviceInfo/serviceInfo.service'; -import {ServiceInfoModel} from '../../shared/server/serviceInfo/serviceInfo.model'; -import {AuditStatus} from '../../shared/server/serviceInfo/AuditStatus.model'; -import {IframeService} from "../../shared/utils/iframe.service"; - -@Component({ - selector: 'audit-info-modal', - templateUrl: './auditInfoModal.component.html', - styleUrls: ['./auditInfoModal.component.scss'] -}) -export class AuditInfoModalComponent { - static openModal: Subject<ServiceInfoModel> = new Subject<ServiceInfoModel>(); - @ViewChild('auditInfoModal') public auditInfoModal: ModalDirective; - title: string = Constants.AuditInfoModal.TITLE; - modelInfoItems: Array<ModelInformationItem> = []; - serviceModel: ServiceModel; - serviceModelName: string; - vidInfoData: Array<AuditStatus> = []; - msoInfoData: Array<AuditStatus> = []; - parentElementClassName = 'content'; - isLoading = true; - - constructor(private _serviceInfoService: ServiceInfoService, private _iframeService : IframeService) { - AuditInfoModalComponent.openModal.subscribe((jobData: ServiceInfoModel) => { - this.initializeProperties(); - if (jobData) { - this.openAuditInfoModal(jobData); - _iframeService.addClassOpenModal(this.parentElementClassName); - this.serviceModelName = jobData.serviceModelName ? jobData.serviceModelName : ''; - this.auditInfoModal.show(); - } else { - _iframeService.removeClassCloseModal(this.parentElementClassName); - this.auditInfoModal.hide(); - } - }) - } - - initializeProperties() : void { - this.modelInfoItems = null; - this.vidInfoData = []; - this.msoInfoData = []; - this.isLoading = true; - } - - openAuditInfoModal(jobData: ServiceInfoModel): void { - this.modelInfoItems = this.createModelInformationItems(jobData); - this.initAuditInfoData(jobData['jobId']); - this.auditInfoModal.show(); - } - - initAuditInfoData(jobId: string) { - this._serviceInfoService.getJobAuditStatus(jobId) - .subscribe((res: Array<Array<AuditStatus>>) => { - this.vidInfoData = res[0]; - this.msoInfoData = res[1]; - this.isLoading = false; - }); - } - - createModelInformationItems(serviceModel: ServiceInfoModel): Array<ModelInformationItem> { - return [ - new ModelInformationItem('Subscriber name', 'subscriberName', [serviceModel.subscriberName]), - new ModelInformationItem('Service type', 'serviceType', [serviceModel.serviceType]), - new ModelInformationItem('Service model version', 'serviceModelVersion', [serviceModel.serviceModelVersion]), - new ModelInformationItem('Service instance name', 'serviceInstanceName', [serviceModel.serviceInstanceName], '', true), - new ModelInformationItem('Service instance ID', 'serviceInstanceId', [serviceModel.serviceInstanceId]), - new ModelInformationItem('Requestor User ID', 'userId', [serviceModel.userId]), - ]; - } - - onCancelClick() { - this._iframeService.removeClassCloseModal(this.parentElementClassName); - this.initializeProperties(); - this.auditInfoModal.hide(); - } -} - diff --git a/vid-webpack-master/src/app/instantiationStatus/instantiationStatus.component.html b/vid-webpack-master/src/app/instantiationStatus/instantiationStatus.component.html index e0641d03b..212981aaf 100644 --- a/vid-webpack-master/src/app/instantiationStatus/instantiationStatus.component.html +++ b/vid-webpack-master/src/app/instantiationStatus/instantiationStatus.component.html @@ -3,7 +3,7 @@ <div> <div class="row" style="margin-left: 0;"> <div> - <span class="title">Instantiation Status</span> + <span class="title" [attr.data-tests-id]="'instantiation-status-title'">Instantiation Status</span> <span class="icon-info" triggers="mouseenter:mouseleave" popover="This table presents all the instantiation requests you made that are waiting, during or finished instantiating. You may see others requests by removing the Show only my requests checkmark." @@ -24,6 +24,7 @@ <thead class="thead-dark"> <tr> <th scope="col" class="smallTd">User ID</th> + <th scope="col" class="smallTd">Action</th> <th scope="col" class="normal">Model Name</th> <th scope="col" class="normal">Instance Name</th> <th scope="col" class="smallTd">Model version</th> @@ -40,8 +41,9 @@ </tr> </thead> <tbody > - <tr *ngFor="let data of serviceInfoData; let i = index" [ngClass]="{'odd' : data.serviceIndex%2 == 1}" [id]="data.jobId" (mouseenter)="currentJobId = data?.jobId"> + <tr *ngFor="let data of serviceInfoData; trackBy: trackByFn; let i = index" [ngClass]="{'odd' : data.serviceIndex%2 == 1}" [id]="data.jobId"> <td class="smallTd" id="userId"><custom-ellipsis [id]="data.userId" [value]="data.userId"></custom-ellipsis></td> + <td class="smallTd" id="action"><custom-ellipsis [id]="data.action" [value]="data.action | capitalizeAndFormat"></custom-ellipsis></td> <td class="normal" id="serviceModelName"><custom-ellipsis [id]="data.serviceModelName" [value]="data.serviceModelName"></custom-ellipsis></td> <td class="normal" id="serviceInstanceName"><custom-ellipsis [id]="data.serviceInstanceName" [value]="data.serviceInstanceName"></custom-ellipsis></td> <td class="smallTd" id="serviceModelVersion"><custom-ellipsis [id]="data.serviceModelVersion" [value]="data.serviceModelVersion"></custom-ellipsis></td> @@ -55,37 +57,32 @@ <td class="smallTd" id="pause"><custom-ellipsis [id]="data.pause" [value]="data.pause"></custom-ellipsis></td> <td class="mediumTd" id="created"><custom-ellipsis [id]="data.created" [value]="data.created | date:'MMM. dd, yyyy HH:mm'"></custom-ellipsis></td> <td class="last" id="jobStatus" [ngClass]="data.jobStatus"> - <custom-popover [value]="data.serviceStatus.tooltip" style="float: left;"> - <svg-icon id="jobStatusIcon-{{i}}" (click)="auditInfo(data)" svg-directive [fill]="data.serviceStatus.color" [widthViewBox]="27" [heightViewBox]="27" - src="./assets/img/{{data.serviceStatus.iconClassName}}.svg"></svg-icon> + <custom-popover [value]="data.serviceStatus.tooltip" [popoverType]="data?.serviceStatus?.color" style="float: left;"> + <svg-icon + id="jobStatusIcon-{{i}}" + (click)="auditInfo(data)" + [mode]="data.serviceStatus.color" + [size]="'large'" + [name]="data.serviceStatus.iconClassName"> + </svg-icon> + </custom-popover> - <div class="menu-div" (click)="onContextMenu($event, data); currentJobId = data.jobId"> + <div class="menu-div" (click)="onContextMenu($event, data)"> <span class="icon-menu"></span> - <context-menu> - <ng-template contextMenuItem (execute)="open($event?.item)" [enabled]="isOpenVisible"> - <div [attr.data-tests-id]="'context-menu-open'"> - <span class="context-menu-icon"><i class="fa fa-external-link" aria-hidden="true"></i></span> - Open - </div> - </ng-template> - <ng-template contextMenuItem (execute)="auditInfo($event?.item)"> - <div [attr.data-tests-id]="'context-menu-audit-info'"> - <span class="context-menu-icon audit-icon"><i class="fa fa-info-circle" aria-hidden="true"></i></span> - Audit info - </div> - </ng-template> - <ng-template contextMenuItem let-item (execute)="deleteItem($event?.item)" [enabled]="isDeleteEnabled"> - <div [attr.data-tests-id]="'context-menu-delete'"> - <span class="context-menu-icon"><i class="fa fa-trash-o" aria-hidden="true"></i></span> - Delete - </div> - </ng-template> - <ng-template contextMenuItem let-item (execute)="hideItem($event?.item)" [enabled]="isHideEnabled"> - <div [attr.data-tests-id]="'context-menu-hide'"> - <span class="context-menu-icon"><i class="fa fa-eye-slash" aria-hidden="true"></i></span> - Hide request - </div> - </ng-template> + <context-menu> + <ng-template *ngFor="let action of contextMenuActions" contextMenuItem let-item + [visible]="action.visible" + [enabled]="action.enabled" + (execute)="action.click($event.item)"> + <div [attr.data-tests-id]="action.dataTestId" + [tooltip]="action?.tooltip" + [tooltipDisabled]="!action.tooltip"> + <span class="context-menu-icon"> + <i class="fa {{action.className}}" aria-hidden="true"></i> + </span> + {{action.name}} + </div> + </ng-template> </context-menu> </div> </td> @@ -93,7 +90,6 @@ </tbody> </table> </div> - <audit-info-modal></audit-info-modal> </div> diff --git a/vid-webpack-master/src/app/instantiationStatus/instantiationStatus.component.service.spec.ts b/vid-webpack-master/src/app/instantiationStatus/instantiationStatus.component.service.spec.ts index c9f434e99..4848d8e99 100644 --- a/vid-webpack-master/src/app/instantiationStatus/instantiationStatus.component.service.spec.ts +++ b/vid-webpack-master/src/app/instantiationStatus/instantiationStatus.component.service.spec.ts @@ -1,5 +1,6 @@ import {getTestBed, TestBed} from '@angular/core/testing'; import { + COMPLETED_WITH_ERRORS, INPROGRESS, InstantiationStatusComponentService, PAUSE, @@ -10,24 +11,64 @@ import { X_O } from './instantiationStatus.component.service'; import {ServiceInfoModel} from '../shared/server/serviceInfo/serviceInfo.model'; -import { Observable } from 'rxjs/Rx'; +import {AaiService} from "../shared/services/aaiService/aai.service"; +import {MsoService} from "../shared/services/msoService/mso.service"; +import {NgRedux} from "@angular-redux/store"; +import {HttpClientTestingModule} from "@angular/common/http/testing"; +import {FeatureFlagsService} from "../shared/services/featureFlag/feature-flags.service"; +import {DrawingBoardModes} from "../drawingBoard/service-planning/drawing-board.modes"; +import {RouterTestingModule} from "@angular/router/testing"; +import {of} from "rxjs"; +import {UrlTree} from "@angular/router"; +class MockAppStore<T> { + + getState() { + return { + global: { + flags: { + 'FLAG_1902_NEW_VIEW_EDIT': true, + + } + } + } + } + + dispatch() { + + } +} describe('Instantiation Status Service', () => { let injector; + let aaiService: AaiService; + let msoService: MsoService; let service: InstantiationStatusComponentService; - beforeEach(() => { + + beforeAll(done => (async () => { TestBed.configureTestingModule({ - imports: [], - providers: [InstantiationStatusComponentService] + imports: [ + HttpClientTestingModule, + RouterTestingModule, + ], + providers: [ + InstantiationStatusComponentService, + AaiService, + MsoService, + FeatureFlagsService, + {provide: NgRedux, useClass: MockAppStore}] }); + await TestBed.compileComponents(); injector = getTestBed(); + aaiService = injector.get(AaiService); + msoService = injector.get(MsoService); service = injector.get(InstantiationStatusComponentService); - }); - it('generateServiceInfoDataMapping should return mapping of arrays', (done: DoneFn) => { - let data : Array<ServiceInfoModel> = generateServiceInfoData(); + })().then(done).catch(done.fail)); + + test('generateServiceInfoDataMapping should return mapping of arrays', () => { + let data : ServiceInfoModel[] = generateServiceInfoData(); let result = service.generateServiceInfoDataMapping(data); expect(result['1']).toBeDefined(); @@ -37,53 +78,81 @@ describe('Instantiation Status Service', () => { expect(result['1'].length).toEqual(2); expect(result['2'].length).toEqual(2); expect(result['3'].length).toEqual(1); - done(); }); - it('generateServiceInfoDataMapping if array is empty should return empty object', (done: DoneFn) => { + test('generateServiceInfoDataMapping if array is empty should return empty object', () => { let result = service.generateServiceInfoDataMapping([]); expect(result['1']).not.toBeDefined(); expect(result['2']).not.toBeDefined(); expect(result['3']).not.toBeDefined(); - done(); }); - it('convertObjectToArray', (done: DoneFn) => { + test('convertObjectToArray', () => { - spyOn(service, 'convertObjectToArray').and.returnValue( - Observable.of([]) + jest.spyOn(service, 'convertObjectToArray').mockReturnValue( + of([]) ); - let data : Array<ServiceInfoModel> = generateServiceInfoData(); + let data : ServiceInfoModel[] = generateServiceInfoData(); service.convertObjectToArray(data).subscribe((result) => { expect(result).toBeDefined(); - done(); }); }); - it('getStatusTooltip should return status popover', (done: DoneFn) => { + test('click on "Open" button should open new view edit' , ()=>{ + const item = { + serviceModelId : 'serviceModelId', + serviceInstanceId : 'serviceInstanceId', + serviceType : 'serviceType', + subscriberId : 'subscriberId' + }; + let params:UrlTree = service.getNewViewEditUrlTree(item, DrawingBoardModes.VIEW); + expect(params.toString().startsWith('/servicePlanning/VIEW')).toBeTruthy(); + expect(params.queryParams).toEqual( + { + serviceModelId: item.serviceModelId, + serviceInstanceId: item.serviceInstanceId, + serviceType : item.serviceType, + subscriberId : item.subscriberId + }); + }); + + test('build the View Edit url' , ()=>{ + const item = { + serviceModelId : '28aeb8f6-5620-4148-8bfb-a5fb406f0309', + }; + let serviceModelUrl: string = '/servicePlanning/EDIT?serviceModelId=28aeb8f6-5620-4148-8bfb-a5fb406f0309'; + let suffix:string = '../../serviceModels.htm#'; + let tree:UrlTree = service.getNewViewEditUrlTree(item, DrawingBoardModes.EDIT); + let result = service.getViewEditUrl(tree); + expect (suffix + serviceModelUrl).toEqual(result); + }); + + test('getStatusTooltip should return status popover', () => { let result : ServiceStatus = service.getStatus('pending'); - expect(result.tooltip).toEqual('Pending: The service will automatically be sent for instantiation as soon as possible.'); + expect(result.tooltip).toEqual('Pending: The action required will be sent as soon as possible.'); result = service.getStatus('IN_PROGRESS'); - expect(result.tooltip).toEqual('In-progress: the service is in process of instantiation.'); + expect(result.tooltip).toEqual('In-progress: the service is in process of the action required.'); result = service.getStatus('PAUSED'); expect(result.tooltip).toEqual('Paused: Service has paused and waiting for your action.\n Select actions from the menu to the right.'); result = service.getStatus('FAILED'); - expect(result.tooltip).toEqual('Failed: Service instantiation has failed, load the service to see the error returned.'); + expect(result.tooltip).toEqual('Failed: All planned actions have failed.'); result = service.getStatus('COMPLETED'); - expect(result.tooltip).toEqual('Completed successfully: Service is successfully instantiated.'); + expect(result.tooltip).toEqual('Completed successfully: Service is successfully instantiated, updated or deleted.'); result = service.getStatus('STOPPED'); expect(result.tooltip).toEqual('Stopped: Due to previous failure, will not be instantiated.'); - done(); + + result = service.getStatus('COMPLETED_WITH_ERRORS'); + expect(result.tooltip).toEqual('Completed with errors: some of the planned actions where successfully committed while other have not.\n Open the service to check it out.'); }); - it('getStatusTooltip should return correct icon per job status', (done: DoneFn) => { + test('getStatusTooltip should return correct icon per job status', () => { let result : ServiceStatus = service.getStatus('pending'); expect(result.iconClassName).toEqual(PENDING); @@ -101,9 +170,10 @@ describe('Instantiation Status Service', () => { result = service.getStatus('STOPPED'); expect(result.iconClassName).toEqual(STOPED); - done(); - }); + result = service.getStatus('COMPLETED_WITH_ERRORS'); + expect(result.iconClassName).toEqual(COMPLETED_WITH_ERRORS); + }); function generateServiceInfoData(){ return JSON.parse(JSON.stringify([ diff --git a/vid-webpack-master/src/app/instantiationStatus/instantiationStatus.component.service.ts b/vid-webpack-master/src/app/instantiationStatus/instantiationStatus.component.service.ts index 293397cc9..0e4451ca8 100644 --- a/vid-webpack-master/src/app/instantiationStatus/instantiationStatus.component.service.ts +++ b/vid-webpack-master/src/app/instantiationStatus/instantiationStatus.component.service.ts @@ -1,23 +1,38 @@ import {Injectable} from '@angular/core'; import {ServiceInfoModel, ServiceInfoUiModel} from '../shared/server/serviceInfo/serviceInfo.model'; -import {isNullOrUndefined} from "util"; -import { Observable } from 'rxjs/Observable'; -import 'rxjs/observable/of'; - +import * as _ from 'lodash'; +import {Observable} from 'rxjs/Observable'; +import {NgRedux} from "@angular-redux/store"; +import {AppState} from "../shared/store/reducers"; +import {AaiService} from "../shared/services/aaiService/aai.service"; +import {ServiceModel} from "../shared/models/serviceModel"; +import {FeatureFlagsService, Features} from "../shared/services/featureFlag/feature-flags.service"; +import {DrawingBoardModes} from "../drawingBoard/service-planning/drawing-board.modes"; +import {updateDrawingBoardStatus} from "../shared/storeUtil/utils/global/global.actions"; +import {Router, UrlTree} from "@angular/router"; +import {of} from "rxjs"; +import {MsoService} from "../shared/services/msoService/mso.service"; export let PENDING : string = "pending"; -export let INPROGRESS : string = "inprogress"; +export let INPROGRESS : string = "in_progress"; export let PAUSE : string = "pause"; -export let X_O : string = "X_o"; -export let SUCCESS_CIRCLE : string = "success+Circle"; -export let STOPED : string = "stoped"; +export let X_O : string = "x-circle-o"; +export let SUCCESS_CIRCLE : string = "success-circle-o"; +export let STOPED : string = "stop"; +export let COMPLETED_WITH_ERRORS : string = "success_with_warning"; @Injectable() export class InstantiationStatusComponentService { - generateServiceInfoDataMapping(arr: Array<ServiceInfoModel>) : { [serviceInstanceId: string]: Array<ServiceInfoModel>}{ - let serviceInfoData: { [serviceInstanceId: string]: Array<ServiceInfoModel>; } = {}; + constructor( private _aaiService: AaiService, + private _msoService: MsoService, + private _router : Router, + private _store: NgRedux<AppState>) { + } + + generateServiceInfoDataMapping(arr: ServiceInfoModel[]) : { [serviceInstanceId: string]: ServiceInfoModel[]}{ + let serviceInfoData: { [serviceInstanceId: string]: ServiceInfoModel[]; } = {}; for(let item of arr){ - if(isNullOrUndefined(serviceInfoData[item.templateId])){ + if(_.isNil(serviceInfoData[item.templateId])){ serviceInfoData[item.templateId] = [item]; }else { serviceInfoData[item.templateId].push(item); @@ -26,7 +41,7 @@ export class InstantiationStatusComponentService { return serviceInfoData; } - convertObjectToArray(arr: Array<ServiceInfoModel>) : Observable<Array<ServiceInfoUiModel>>{ + convertObjectToArray(arr: ServiceInfoModel[]) : Observable<ServiceInfoUiModel[]>{ const obj = this.generateServiceInfoDataMapping(arr); let index:number = 0; let result = []; @@ -40,25 +55,108 @@ export class InstantiationStatusComponentService { } console.log(result); - return Observable.of(result); + return of(result); + } + + isDrawingBoardViewEdit(serviceModel: ServiceModel): boolean { + if (!_.isNil(serviceModel.vidNotions) && !_.isNil(serviceModel.vidNotions.viewEditUI) + && serviceModel.vidNotions.viewEditUI !== 'legacy'){ + return true; + } + return false; + } + + open(item: ServiceInfoModel): void { + if (FeatureFlagsService.getFlagState(Features.FLAG_1902_VNF_GROUPING, this._store)) { + this._aaiService.getServiceModelById(item['serviceModelId']).subscribe((result)=>{ + const serviceModel = new ServiceModel(result); + + if (this.isDrawingBoardViewEdit(serviceModel)) { + this.navigateToNewViewEdit(item, DrawingBoardModes.EDIT); + return; + } + + this.navigateToNewViewOnlyOrOldEditView(item); + + }); + } + + /*this else is here only to save time in case we don't need to retrieve service model + it can be removed once it service model is always needed, and it doesn't save time*/ + else { + this.navigateToNewViewOnlyOrOldEditView(item); + } + } + + navigateToNewViewOnlyOrOldEditView(item: ServiceInfoModel) { + if (FeatureFlagsService.getFlagState(Features.FLAG_1902_NEW_VIEW_EDIT, this._store)) { + this.navigateToNewViewEdit(item, DrawingBoardModes.VIEW); + } + else { + this.navigateToOldViewEdit(item); + } + } + + navigateToOldViewEdit(item: ServiceInfoModel) { + let query = + `subscriberId=${item.subscriberId}&` + + `subscriberName=${item.subscriberName}&` + + `serviceType=${item.serviceType}&` + + `serviceInstanceId=${item.serviceInstanceId}`; + + this._store.dispatch(updateDrawingBoardStatus(DrawingBoardModes.OLD_VIEW_EDIT)); + window.parent.location.assign('../../serviceModels.htm#/instantiate?' + query); + } + + navigateToNewViewEdit(item: ServiceInfoModel, mode: DrawingBoardModes): void{ + this._store.dispatch(updateDrawingBoardStatus(mode)); + const viewEditUrlTree:UrlTree = this.getNewViewEditUrlTree(item, mode); + this._router.navigateByUrl(viewEditUrlTree); + window.parent.location.assign(this.getViewEditUrl(viewEditUrlTree)); + } + + getNewViewEditUrlTree(item: ServiceInfoModel, mode: DrawingBoardModes): UrlTree { + return this._router.createUrlTree( + ['/servicePlanning/' + mode], + { + queryParams: + { + serviceModelId: item.serviceModelId, + serviceInstanceId: item.serviceInstanceId, + serviceType : item.serviceType, + subscriberId : item.subscriberId, + jobId: item.jobId + } + }); + } + + getViewEditUrl(viewEditUrlTree:UrlTree): string { + return '../../serviceModels.htm#' + viewEditUrlTree.toString(); + } getStatus(status : string) : ServiceStatus { switch(status.toUpperCase()) { case 'PENDING' : - return new ServiceStatus(PENDING, '#009FDB', 'Pending: The service will automatically be sent for instantiation as soon as possible.'); + return new ServiceStatus(PENDING, 'primary', 'Pending: The action required will be sent as soon as possible.'); case 'IN_PROGRESS' : - return new ServiceStatus(INPROGRESS, '#009FDB', 'In-progress: the service is in process of instantiation.'); + return new ServiceStatus(INPROGRESS, 'primary', 'In-progress: the service is in process of the action required.'); case 'PAUSED' : - return new ServiceStatus(PAUSE, '#009FDB', 'Paused: Service has paused and waiting for your action.\n Select actions from the menu to the right.'); + return new ServiceStatus(PAUSE, 'primary', 'Paused: Service has paused and waiting for your action.\n Select actions from the menu to the right.'); case 'FAILED' : - return new ServiceStatus(X_O, '#D02B2B', 'Failed: Service instantiation has failed, load the service to see the error returned.'); + return new ServiceStatus(X_O, 'error', 'Failed: All planned actions have failed.'); case 'COMPLETED' : - return new ServiceStatus(SUCCESS_CIRCLE, '#53AD15', 'Completed successfully: Service is successfully instantiated.'); + return new ServiceStatus(SUCCESS_CIRCLE, 'success', 'Completed successfully: Service is successfully instantiated, updated or deleted.'); case 'STOPPED' : - return new ServiceStatus(STOPED, '#D02B2B', 'Stopped: Due to previous failure, will not be instantiated.'); + return new ServiceStatus(STOPED, 'error', 'Stopped: Due to previous failure, will not be instantiated.'); + case 'COMPLETED_WITH_ERRORS' : + return new ServiceStatus(COMPLETED_WITH_ERRORS, 'success', 'Completed with errors: some of the planned actions where successfully committed while other have not.\n Open the service to check it out.'); } } + + retry(item: ServiceInfoModel): void { + this.navigateToNewViewEdit(item, DrawingBoardModes.RETRY_EDIT); + } } diff --git a/vid-webpack-master/src/app/instantiationStatus/instantiationStatus.component.spec.ts b/vid-webpack-master/src/app/instantiationStatus/instantiationStatus.component.spec.ts index 00b6a9945..53dfcc1f2 100644 --- a/vid-webpack-master/src/app/instantiationStatus/instantiationStatus.component.spec.ts +++ b/vid-webpack-master/src/app/instantiationStatus/instantiationStatus.component.spec.ts @@ -1,88 +1,227 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import {ComponentFixture, TestBed} from '@angular/core/testing'; import {InstantiationStatusComponent} from './instantiationStatus.component'; import {ServiceInfoService} from '../shared/server/serviceInfo/serviceInfo.service'; import {InstantiationStatusComponentService} from './instantiationStatus.component.service'; -import { ContextMenuModule, ContextMenuService } from 'ngx-contextmenu'; +import {ContextMenuModule, ContextMenuService} from 'ngx-contextmenu'; import {CUSTOM_ELEMENTS_SCHEMA} from '@angular/core'; -import { HttpClientTestingModule } from '@angular/common/http/testing'; -import { ScrollToModule } from '@nicky-lenaers/ngx-scroll-to'; -import { ConfigurationService } from '../services/configuration.service'; -import { LogService } from '../shared/utils/log/log.service'; +import {HttpClientTestingModule} from '@angular/common/http/testing'; +import {ScrollToModule} from '@nicky-lenaers/ngx-scroll-to'; +import {ConfigurationService} from '../shared/services/configuration.service'; +import {LogService} from '../shared/utils/log/log.service'; +import {NgRedux} from '@angular-redux/store'; +import {RouterTestingModule} from '@angular/router/testing'; +import {CapitalizeAndFormatPipe} from "../shared/pipes/capitalize/capitalize-and-format.pipe"; +import {AaiService} from "../shared/services/aaiService/aai.service"; +import {MsoService} from "../shared/services/msoService/mso.service"; +import {FeatureFlagsService} from "../shared/services/featureFlag/feature-flags.service"; +import {JobStatus, ServiceAction} from "../shared/models/serviceInstanceActions"; +import each from 'jest-each'; +import {ServiceInfoModel} from "../shared/server/serviceInfo/serviceInfo.model"; +import { TooltipModule } from 'ngx-tooltip'; + +class MockAppStore<T> { + + getState() { + return { + global: { + flags: { + 'FLAG_1902_NEW_VIEW_EDIT': true + } + } + } + } + + dispatch() { + + } +} describe('Instantiation Status Component', () => { let component: InstantiationStatusComponent; let fixture: ComponentFixture<InstantiationStatusComponent>; - let enableDeleteItems = [ - { jobStatus:"PENDING" }, - { jobStatus:"STOPPED" }]; - let disableDeleteItems = [ - { jobStatus:"COMPLETED" }, - { jobStatus:"FAILED" }, - {jobStatus:"IN_PROGRESS"}, - {jobStatus:"UnknownOne"}]; - +let item = new ServiceInfoModel(); + beforeAll(done => (async () => { - beforeEach(async(() => { TestBed.configureTestingModule({ - imports: [HttpClientTestingModule, ContextMenuModule, ScrollToModule.forRoot()], - providers: [ServiceInfoService, InstantiationStatusComponentService, ContextMenuService, ConfigurationService, LogService], - declarations: [InstantiationStatusComponent], + imports: [ + HttpClientTestingModule, + ContextMenuModule, + ScrollToModule.forRoot(), + RouterTestingModule, + TooltipModule + ], + providers: [ + ServiceInfoService, + InstantiationStatusComponentService, + AaiService, + MsoService, + ContextMenuService, + FeatureFlagsService, + ConfigurationService, + LogService, + {provide: NgRedux, useClass: MockAppStore} + ], + declarations: [InstantiationStatusComponent, CapitalizeAndFormatPipe], schemas: [ CUSTOM_ELEMENTS_SCHEMA ] - }).compileComponents(); - })); + }); + await TestBed.compileComponents(); - beforeEach(() => { fixture = TestBed.createComponent(InstantiationStatusComponent); component = fixture.componentInstance; fixture.detectChanges(); - }); + })().then(done).catch(done.fail)); + - it('component should initialize basic parameters', (done: DoneFn) => { + test('component should initialize basic parameters', () => { component.TIMER_TIME_IN_SECONDS = 2; expect(component.TIMER_TIME_IN_SECONDS).toEqual(2); expect(component.dataIsReady).toBeFalsy(); expect(component.lastUpdatedDate).toBeNull(); - done(); }); - it('component constructor should call activateInterval and ngOnInit', (done: DoneFn) => { + test('component constructor should call activateInterval and ngOnInit', () => { component.refreshData(); expect(component.dataIsReady).toBeFalsy(); - done(); }); - it('stopped and pending status isDeleteEnabled button should be enabled, not allowed delete statuses isDeleteEnabled button should be disabled', (done: DoneFn) => { - enableDeleteItems.forEach((item) => { - let isDeleteEnabled: boolean = component.isDeleteEnabled(item); - expect(isDeleteEnabled).toBeTruthy(); - }); + const enableDeleteItemsDataProvider = [ + ['INSTANTIATE action PENDING job status',JobStatus.PENDING , ServiceAction.INSTANTIATE], + ['DELETE action PENDING job status',JobStatus.PENDING , ServiceAction.DELETE], + ['UPDATE action PENDING job status',JobStatus.PENDING , ServiceAction.UPDATE], + ['INSTANTIATE action STOPPED job status',JobStatus.STOPPED , ServiceAction.INSTANTIATE]]; + each(enableDeleteItemsDataProvider).test('delete item should enable for %s', (desc, jobStatus, action ) => { + item.action=action; + item.jobStatus=jobStatus; + let isDeleteEnabled: boolean = component.isDeleteEnabled(item); + expect(isDeleteEnabled).toBeTruthy(); + }); - disableDeleteItems.forEach((item) => { - let isDeleteEnabled: boolean = component.isDeleteEnabled(item); - expect(isDeleteEnabled).toBeFalsy(); - }); - done(); + const disableDeleteItemsDataProvider = [ + [ 'INSTANTIATE action COMPLETED job status', JobStatus.COMPLETED , ServiceAction.INSTANTIATE], + [ 'INSTANTIATE action FAILED job status', JobStatus.FAILED , ServiceAction.INSTANTIATE], + [ 'INSTANTIATE action IN_PROGRESS job status', JobStatus.IN_PROGRESS, ServiceAction.INSTANTIATE], + [ 'INSTANTIATE action COMPLETED_WITH_ERRORS job status', JobStatus.COMPLETED_WITH_ERRORS, ServiceAction.INSTANTIATE], + [ 'DELETE action IN_PROGRESS job status', JobStatus.IN_PROGRESS, ServiceAction.DELETE], + [ 'DELETE action COMPLETED_WITH_ERRORS job status',JobStatus.COMPLETED_WITH_ERRORS, ServiceAction.DELETE], + [ 'UPDATE action IN_PROGRESS job status', JobStatus.IN_PROGRESS, ServiceAction.UPDATE], + [ 'UPDATE action COMPLETED_WITH_ERRORS job status', JobStatus.COMPLETED_WITH_ERRORS, ServiceAction.UPDATE], + [ 'INSTANTIATE action UNKNOWN job status', "UNKNOWN", ServiceAction.INSTANTIATE]]; + each(disableDeleteItemsDataProvider).test('delete item should disable for %s', (desc,jobStatus, action ) => { + item.action=action; + item.jobStatus=jobStatus; + let isDeleteEnabled: boolean = component.isDeleteEnabled(item); + expect(isDeleteEnabled).toBeFalsy(); }); - it('[COMPLETED, FAILED, STOPPED] status isHideEnable button should be enabled, [IN_PROGRESS, PAUSE, PENDING] status isHideEnable button should be disabled', (done: DoneFn) => { - const enableHideItems = [ - { jobStatus:"COMPLETED" }, - { jobStatus:"FAILED" }, - { jobStatus:"STOPPED" }]; - enableHideItems.forEach((item) => { - let isDeleteEnabled: boolean = component.isHideEnabled(item); - expect(isDeleteEnabled).toBeTruthy(); - }); + const enableHideItemsDataProvider = [ + ['instantiate action job status COMPLETED',JobStatus.COMPLETED, ServiceAction.INSTANTIATE ], + ['instantiate action job status FAILED',JobStatus.FAILED, ServiceAction.INSTANTIATE ], + ['instantiate action job status STOPPED', JobStatus.STOPPED, ServiceAction.INSTANTIATE ], + ['instantiate action job status COMPLETED_WITH_ERRORS', JobStatus.COMPLETED_WITH_ERRORS, ServiceAction.INSTANTIATE ], + ['delete action job status COMPLETED', JobStatus.COMPLETED, ServiceAction.DELETE ], + ['delete action job status FAILED', JobStatus.FAILED, ServiceAction.DELETE ], + ['delete action job status STOPPED',JobStatus.STOPPED, ServiceAction.DELETE ], + ['delete action job status COMPLETED_WITH_ERRORS', JobStatus.COMPLETED_WITH_ERRORS, ServiceAction.DELETE ], + ['update action job status COMPLETED', JobStatus.COMPLETED, ServiceAction.UPDATE ], + ['update action job status FAILED',JobStatus.FAILED, ServiceAction.UPDATE ], + ['update action job status STOPPED', JobStatus.STOPPED, ServiceAction.UPDATE ], + ['update action job status COMPLETED_WITH_ERRORS', JobStatus.COMPLETED_WITH_ERRORS, ServiceAction.UPDATE ]]; + each(enableHideItemsDataProvider).test('hide item should be enabled for %s', (desc, jobStatus, action ) => { + item.action=action; + item.jobStatus=jobStatus; + let isHideEnabled: boolean = component.isHideEnabled(item); + expect(isHideEnabled).toBeTruthy(); + }); - const disableHideItems = [ - { jobStatus:"IN_PROGRESS" }, - { jobStatus:"PAUSE" }, - { jobStatus:"PENDING" }, - { jobStatus:"NOT_MATTER"}]; - disableHideItems.forEach((item) => { - let isDeleteEnabled: boolean = component.isHideEnabled(item); - expect(isDeleteEnabled).toBeFalsy(); - }); - done(); + const disableHideItemsDataProvider = [ + ['action instantiate job status IN_PROGRESS',JobStatus.IN_PROGRESS , ServiceAction.INSTANTIATE], + ['action instantiate job status PAUSE',JobStatus.PAUSE, ServiceAction.INSTANTIATE], + ['action instantiate job status PENDING', JobStatus.PENDING, ServiceAction.INSTANTIATE ], + ['action instantiate job status UNKNOWN', "UNKNOWN", ServiceAction.INSTANTIATE], + ['update instantiate job status IN_PROGRESS', JobStatus.IN_PROGRESS , ServiceAction.UPDATE], + ['update instantiate job status PAUSE', JobStatus.PAUSE, ServiceAction.UPDATE], + ['update instantiate job status PENDING', JobStatus.PENDING, ServiceAction.UPDATE ], + ['update instantiate job status UNKNOWN',"UNKNOWN", ServiceAction.UPDATE], + ['delete instantiate job status IN_PROGRESS',JobStatus.IN_PROGRESS , ServiceAction.DELETE], + ['delete instantiate job status PAUSE', JobStatus.PAUSE, ServiceAction.DELETE], + ['delete instantiate job status PENDING', JobStatus.PENDING, ServiceAction.DELETE ], + ['delete instantiate job status UNKNOWN', "UNKNOWN", ServiceAction.DELETE]]; + each(disableHideItemsDataProvider).test('hide item should disable for %s', (desc, jobStatus, action ) => { + item.action=action; + item.jobStatus=jobStatus; + let isHideEnabled: boolean = component.isHideEnabled(item); + expect(isHideEnabled).toBeFalsy(); + }); + + const enableAuditItemsDataProvider = [ + ['instantiate action UNKNOWN job status', "UNKNOWN", ServiceAction.INSTANTIATE ], + ['delete action JobStatus IN_PROGRESS', JobStatus.IN_PROGRESS, ServiceAction.DELETE ], + ['delete action JobStatus PAUSE', JobStatus.PAUSE, ServiceAction.DELETE ], + ['delete action JobStatus FAILED', JobStatus.FAILED, ServiceAction.DELETE ], + ['delete action JobStatus COMPLETED', JobStatus.COMPLETED, ServiceAction.DELETE ], + ['delete action JobStatus COMPLETED_WITH_ERRORS', JobStatus.COMPLETED_WITH_ERRORS, ServiceAction.DELETE ], + ['update action JobStatus IN_PROGRESS', JobStatus.IN_PROGRESS, ServiceAction.UPDATE ], + ['update action JobStatus PAUSE', JobStatus.PAUSE, ServiceAction.UPDATE ], + ['update action JobStatus COMPLETED', JobStatus.COMPLETED, ServiceAction.UPDATE ], + ['update action JobStatus FAILED', JobStatus.FAILED, ServiceAction.UPDATE ], + ['update action JobStatus COMPLETED_WITH_ERRORS', JobStatus.COMPLETED_WITH_ERRORS, ServiceAction.UPDATE ]]; + + each(enableAuditItemsDataProvider).test('audit item should be enabled for %s', (desc, jobStatus, action ) => { + item.action=action; + item.jobStatus=jobStatus; + const isAuditEnabled: boolean = component.isAuditInfoEnabled(item); + expect(isAuditEnabled).toBeTruthy(); + }); + + const disableAuditItemsDataProvider = [ + ['Job status STOPPED action update', JobStatus.STOPPED, ServiceAction.UPDATE ], + ['Job status PENDING action update', JobStatus.PENDING, ServiceAction.UPDATE ], + ['Job status UNKNOWN action update', "UNKNOWN", ServiceAction.UPDATE], + ['Job status STOPPED action delete',JobStatus.STOPPED, ServiceAction.DELETE], + ['Job status PENDING action delete', JobStatus.PENDING, ServiceAction.DELETE ], + ['Job status UNKNOWN action delete', "UNKNOWN", ServiceAction.DELETE]]; + each(disableAuditItemsDataProvider).test('audit item should be disabled for %s', (desc, jobStatus, action ) => { + item.action=action; + item.jobStatus=jobStatus; + let isAuditEnabled: boolean = component.isAuditInfoEnabled(item); + expect(isAuditEnabled).toBeFalsy(); + }); + + const enableOpenItemsDataProvider = [ + ['action instantiate job status PAUSE', JobStatus.PAUSE, ServiceAction.INSTANTIATE ], + ['action instantiate job status COMPLETED', JobStatus.COMPLETED, ServiceAction.INSTANTIATE ], + ['action instantiate job status COMPLETED_WITH_ERRORS', JobStatus.COMPLETED_WITH_ERRORS, ServiceAction.INSTANTIATE ], + ['action delete job status PENDING', JobStatus.PENDING, ServiceAction.DELETE ], + ['action delete job status FAILED', JobStatus.FAILED, ServiceAction.DELETE ], + ['action delete job status COMPLETED_WITH_ERRORS', JobStatus.COMPLETED_WITH_ERRORS, ServiceAction.DELETE ], + ['action update job status PENDING', JobStatus.PENDING, ServiceAction.UPDATE ], + ['action update job status PAUSE', JobStatus.PAUSE, ServiceAction.UPDATE ], + ['action update job status COMPLETED', JobStatus.COMPLETED, ServiceAction.UPDATE ], + ['action update job status FAILED', JobStatus.FAILED, ServiceAction.UPDATE ], + ['action update job status COMPLETED_WITH_ERRORS', JobStatus.COMPLETED_WITH_ERRORS, ServiceAction.UPDATE ]]; + each(enableOpenItemsDataProvider).test('open item should be enabled for %s', (desc, jobStatus, action ) => { + item.action=action; + item.jobStatus=jobStatus; + let isOpenEnabled: boolean = component.isOpenEnabled(item); + expect(isOpenEnabled).toBeTruthy(); }); + + const disableOpenItemsDataProvider = [ + ['action instantiate job status STOPPED', JobStatus.STOPPED, ServiceAction.INSTANTIATE], + ['action instantiate job status FAILED', JobStatus.FAILED, ServiceAction.INSTANTIATE], + ['action instantiate job status UNKNOWN', "UNKNOWN", ServiceAction.INSTANTIATE], + ['action update job status STOPPED', JobStatus.STOPPED, ServiceAction.UPDATE ], + ['action update job status IN_PROGRESS', JobStatus.IN_PROGRESS, ServiceAction.UPDATE ], + ['action update job status UNKNOWN', "UNKNOWN", ServiceAction.UPDATE], + ['action delete job status COMPLETED', JobStatus.COMPLETED, ServiceAction.DELETE], + ['action delete job status PAUSE', JobStatus.PAUSE, ServiceAction.DELETE], + ['action delete job status IN_PROGRESS', JobStatus.IN_PROGRESS, ServiceAction.DELETE ], + ['action delete job status UNKNOWN',"UNKNOWN", ServiceAction.DELETE]]; + each(disableOpenItemsDataProvider).test('open item should be disabled for %s', (desc, jobStatus, action ) => { + item.action=action; + item.jobStatus=jobStatus; + let isOpenEnabled: boolean = component.isOpenEnabled(item); + expect(isOpenEnabled).toBeFalsy(); + }); + }); diff --git a/vid-webpack-master/src/app/instantiationStatus/instantiationStatus.component.ts b/vid-webpack-master/src/app/instantiationStatus/instantiationStatus.component.ts index ed45ce43c..f3f651960 100644 --- a/vid-webpack-master/src/app/instantiationStatus/instantiationStatus.component.ts +++ b/vid-webpack-master/src/app/instantiationStatus/instantiationStatus.component.ts @@ -1,40 +1,97 @@ -import {AfterViewChecked, Component, ViewChild} from '@angular/core'; +import {Component, ViewChild} from '@angular/core'; import {ServiceInfoService} from '../shared/server/serviceInfo/serviceInfo.service'; import {ServiceInfoModel} from '../shared/server/serviceInfo/serviceInfo.model'; import {InstantiationStatusComponentService} from './instantiationStatus.component.service'; import {ContextMenuComponent, ContextMenuService} from 'ngx-contextmenu'; -import {AuditInfoModalComponent} from "./auditInfoModal/auditInfoModal.component"; +import {AuditInfoModalComponent} from "../shared/components/auditInfoModal/auditInfoModal.component"; import * as _ from 'lodash'; import {ScrollToConfigOptions, ScrollToService} from '@nicky-lenaers/ngx-scroll-to'; -import {ConfigurationService} from "../services/configuration.service"; +import {ConfigurationService} from "../shared/services/configuration.service"; import {LogService} from '../shared/utils/log/log.service'; - +import {AppState} from "../shared/store/reducers"; +import {NgRedux} from '@angular-redux/store'; +import {JobStatus, ServiceAction} from "../shared/models/serviceInstanceActions"; +import {DrawingBoardModes} from "../drawingBoard/service-planning/drawing-board.modes"; + +export interface MenuAction{ + name: string; + dataTestId: string; + className: string; + tooltip?: string; + click(item: ServiceInfoModel): void; + enabled (item?: ServiceInfoModel): boolean; + visible (item?: ServiceInfoModel): boolean; +} @Component({ selector : 'instantiation-status', templateUrl : './instantiationStatus.component.html', styleUrls : ['./instantiationStatus.component.scss'] }) -export class InstantiationStatusComponent implements AfterViewChecked{ - +export class InstantiationStatusComponent { TIMER_TIME_IN_SECONDS : number = 0; timer = null; dataIsReady : boolean = false; scroll : boolean = false; lastUpdatedDate: Date = null; - currentJobId: string = null; instantiationStatusComponentService: InstantiationStatusComponentService; configurationService : ConfigurationService; - serviceInfoData: Array<ServiceInfoModel> = null; + serviceInfoData: ServiceInfoModel[] = null; @ViewChild(ContextMenuComponent) public contextMenu: ContextMenuComponent; + public contextMenuActions: Array<MenuAction> = [ + { + name: "Redeploy", + dataTestId: "context-menu-retry", + className: "fa-repeat", + click: (item: ServiceInfoModel) => this.retryItem(item), + enabled: () => true, + visible: (item: ServiceInfoModel) => item.isRetryEnabled, + }, + { + name: "Open", + dataTestId: "context-menu-open", + className: "fa-external-link", + click: (item: ServiceInfoModel) => this.instantiationStatusComponentService.open(item), + enabled: (item: ServiceInfoModel) => this.isOpenEnabled(item), + visible: () => true, + }, + { + name: "Audit info", + dataTestId: "context-menu-audit-info", + className: "fa-info-circle", + click: (item: ServiceInfoModel) => this.auditInfo(item), + enabled: (item: ServiceInfoModel) => this.isAuditInfoEnabled(item), + visible: () => true, + }, + { + name: "Delete", + dataTestId: "context-menu-remove", + className: "fa-trash-o", + click: (item: ServiceInfoModel) => this.deleteItem(item), + enabled: (item: ServiceInfoModel) => this.isDeleteEnabled(item), + visible: () => true, + }, + { + name: "Hide request", + dataTestId: "context-menu-hide", + className: "fa-eye-slash", + tooltip: "Hide this service from this table", + click: (item: ServiceInfoModel) => this.hideItem(item), + enabled: (item: ServiceInfoModel) => this.isHideEnabled(item), + visible: () => true, + } + ]; + + flags: any; constructor(private _serviceInfoService: ServiceInfoService, private _instantiationStatusComponentService : InstantiationStatusComponentService, private _contextMenuService: ContextMenuService, private _configurationService : ConfigurationService, private _scrollToService: ScrollToService, - private _logService : LogService) { + private _logService : LogService, + private _store: NgRedux<AppState>) { this.instantiationStatusComponentService = _instantiationStatusComponentService; this.configurationService = this._configurationService; this.configurationService.getConfiguration("refreshTimeInstantiationDashboard").subscribe(response => { @@ -58,61 +115,73 @@ export class InstantiationStatusComponent implements AfterViewChecked{ refreshData(): void { this.dataIsReady = false; - this._serviceInfoService.getServicesJobInfo(true) - .subscribe((res: Array<ServiceInfoModel>) => { + this._serviceInfoService.getServicesJobInfo(true, this.lastUpdatedDate === null) + .subscribe((res: ServiceInfoModel[]) => { this._instantiationStatusComponentService.convertObjectToArray(res).subscribe((res) => { this._logService.info('refresh instantiation status table', res); this.dataIsReady = true; this.lastUpdatedDate = new Date(); if (!_.isEqual(this.serviceInfoData, res)) { this.serviceInfoData = res; - this.scroll = true; + this.scrollToElement(this.findFirstVisibleJob()); } }); }) } - ngAfterViewChecked(){ - if (this.scroll) { - this.scrollToElement(); - this.scroll = false; - } + trackByFn(index: number, item: ServiceInfoModel){ + return _.isNil(item) ? null : item.jobId; } - - - isDeleteEnabled(item):boolean { - return _.includes(['PENDING', 'STOPPED'], item.jobStatus); - } - - deleteItem(item): void { + deleteItem(item: ServiceInfoModel): void { this._serviceInfoService.deleteJob(item.jobId).subscribe(() => { this.refreshData(); }); } - hideItem(item): void { + hideItem(item: ServiceInfoModel): void { this._serviceInfoService.hideJob(item.jobId).subscribe(() => { this.refreshData(); }); } + + retryItem(item: ServiceInfoModel) : void { + if (item.isRetryEnabled) { + this._instantiationStatusComponentService.retry(item); + } + } auditInfo(jobData : ServiceInfoModel): void { AuditInfoModalComponent.openModal.next(jobData); + } + isOpenEnabled(item: ServiceInfoModel):boolean { + switch(item.action) { + case ServiceAction.DELETE: + return _.includes([ JobStatus.PENDING, JobStatus.COMPLETED_WITH_ERRORS, JobStatus.FAILED], item.jobStatus); + case ServiceAction.UPDATE: + return _.includes([JobStatus.PENDING, JobStatus.PAUSE, JobStatus.COMPLETED_WITH_ERRORS, JobStatus.COMPLETED, JobStatus.FAILED], item.jobStatus); + default: + return _.includes([JobStatus.COMPLETED, JobStatus.PAUSE, JobStatus.COMPLETED_WITH_ERRORS], item.jobStatus); + } } - isOpenVisible(item):boolean { - return _.includes(['COMPLETED', 'PAUSE'], item.jobStatus); + isAuditInfoEnabled(item: ServiceInfoModel): boolean { + if(item.action === ServiceAction.DELETE || item.action=== ServiceAction.UPDATE) { + return _.includes([JobStatus.FAILED, JobStatus.IN_PROGRESS, JobStatus.COMPLETED_WITH_ERRORS, JobStatus.PAUSE, JobStatus.COMPLETED], item.jobStatus); + } + return true;// ServiceAction.INSTANTIATE } - open(item): void { - let query = - `subscriberId=${item['subscriberName']}&` + - `serviceType=${item['serviceType']}&` + - `serviceInstanceId=${item['serviceInstanceId']}`; + isDeleteEnabled(item: ServiceInfoModel):boolean { + if( item.action === ServiceAction.DELETE || item.action === ServiceAction.UPDATE){ + return _.includes([JobStatus.PENDING], item.jobStatus); + } + return _.includes([JobStatus.PENDING, JobStatus.STOPPED], item.jobStatus); + } - window.parent.location.assign('../../serviceModels.htm#/instantiate?' + query); + isHideEnabled(item: ServiceInfoModel):boolean { + return _.includes([JobStatus.COMPLETED, JobStatus.FAILED, JobStatus.STOPPED, JobStatus.COMPLETED_WITH_ERRORS], item.jobStatus); } public onContextMenu($event: MouseEvent, item: any): void { @@ -129,17 +198,36 @@ export class InstantiationStatusComponent implements AfterViewChecked{ return './' + imageName + '.svg'; } - isHideEnabled(item: any):boolean { - return _.includes(['COMPLETED', 'FAILED', 'STOPPED'], item.jobStatus); + private getHeaderHeaderClientRect(): ClientRect { + const element = document.querySelector("#instantiation-status thead") as HTMLElement; + return element.getBoundingClientRect(); } - scrollToElement() { - if(this.currentJobId){ + + findFirstVisibleJob(): HTMLElement { + const elements : any = document.querySelectorAll('#instantiation-status tr'); + const headerRect = this.getHeaderHeaderClientRect(); + if (headerRect) { + const topEdge = headerRect.bottom; + for (let i = 0; i < elements.length; i++) { + if (elements[i].getBoundingClientRect().top >= topEdge) + return elements[i]; + } + } + return null; + } + + scrollToElement(currentJob: HTMLElement) { + if (currentJob) { const config: ScrollToConfigOptions = { - target: this.currentJobId, - duration: 50, - offset: -35 //header height + target: currentJob, + duration: 0, + offset: -1 * (this.getHeaderHeaderClientRect().height + 2), }; - this._scrollToService.scrollTo(config); + + // wait after render + setTimeout(() => { + this._scrollToService.scrollTo(config); + }, 0) } } } diff --git a/vid-webpack-master/src/app/modules/inputs.module.ts b/vid-webpack-master/src/app/modules/inputs.module.ts deleted file mode 100644 index cb5f914cd..000000000 --- a/vid-webpack-master/src/app/modules/inputs.module.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { DynamicInputsComponent } from '../components/dynamic-inputs/dynamic-inputs.component'; -import { AngularMultiSelectModule } from "angular2-multiselect-dropdown"; -import { DynamicInputLabelPipe } from '../shared/pipes/dynamicInputLabel/dynamic-input-label.pipe'; - - -@NgModule({ - imports: [ - CommonModule, FormsModule, ReactiveFormsModule, AngularMultiSelectModule - ], - providers: [], - declarations: [ DynamicInputLabelPipe, DynamicInputsComponent ], - entryComponents: [], - exports: [ DynamicInputLabelPipe, DynamicInputsComponent ] - -}) - -export class InputsModule { } diff --git a/vid-webpack-master/src/app/service.actions.ts b/vid-webpack-master/src/app/service.actions.ts deleted file mode 100644 index a62fec673..000000000 --- a/vid-webpack-master/src/app/service.actions.ts +++ /dev/null @@ -1,197 +0,0 @@ -import { Action, ActionCreator } from "redux"; -import { LcpRegionsAndTenants } from "./shared/models/lcpRegionsAndTenants"; -import { ServiceInstance } from "./shared/models/serviceInstance"; -import { SelectOptionInterface } from "./shared/models/selectOption"; -import { ServiceType } from "./shared/models/serviceType"; -import { VnfInstance } from "./shared/models/vnfInstance"; - -export const UPDATE_MODEL = "[MODEL] Update"; -export const UPDATE_SERVICE_INSTANCE = "[SERVICE INSTANCE] Update"; -export const UPDATE_VNF_INSTANCE = "[VNF INSTANCE] Update"; -export const UPDATE_VF_MODULE = "[VF MODULE] Update"; -export const CREATE_VF_MODULE = "[VF MODULE] Create"; - -export const UPDATE_LCP_REGIONS_AND_TENANTS = "[LCP_REGIONS_AND_TENANTS] Update"; -export const UPDATE_SUBSCRIBERS = "[SUBSCRIBERS] Update"; -export const UPDATE_PRODUCT_FAMILIES = "[PRODUCT_FAMILIES] Update"; -export const UPDATE_SERVICE_TYPES = "[SERVICE_TYPE] Update"; -export const UPDATE_AIC_ZONES = "[AIC_ZONES] Update"; -export const DELETE_SERVICE_INSTANCE = "[SERVICE_INSTANCE] Delete"; -export const DELETE_VNF_INSTANCE = "[VNF_INSTANCE] Delete"; -export const DELETE_VNF_MODULE_INSTANCE = "[VNF_MODULE_INSTANCE] Delete"; -export const UPDATE_CATEGORY_PARAMETERS = "[CATEGORY_PARAMETERS] Update"; -export const UPDATE_NETWORK_FUNCTION = "[UPDATE_NETWORK_FUNCTION] Update"; -export const UPDATE_USER_ID = "[UPDATE_USER_ID] Update"; - - -export interface UpdateServiceModelAction extends Action { - serviceHierarchy?: any; -} - -export interface UpdateNetworkCollectionFunction extends Action { - networksAccordingToNetworkCollection: any; - network_function: any; -} - -export interface UpdateServiceInstanceAction extends Action { - serviceUuid?: string; - serviceInstance?: ServiceInstance; -} - -export interface UpdateVFModuleInstanceAction extends Action { - vfInstance: any; - vfId: string; - serviceUuid: string; -} - -export interface CreateVFModuleInstanceAction extends Action { - vfInstance: any; - vfId: string; - serviceUuid: string; - index : number -} - -export interface UpdateUserIdAction extends Action { - userId: string; -} - -export interface UpdateVnfInstanceAction extends Action { - vnfInstance?: VnfInstance; - vnfModelName?: string; - serviceUuid?: string; -} - -export interface UpdateLcpRegionsAndTenantsAction extends Action { - lcpRegionsAndTenants?: LcpRegionsAndTenants; -} - -export interface UpdateSubscribersAction extends Action { - subscribers?: SelectOptionInterface[]; -} - -export interface UpdateProductFamiliesAction extends Action { - productFamilies?: SelectOptionInterface[]; -} - -export interface UpdateAicZonesAction extends Action { - aicZones?: SelectOptionInterface[]; -} - -export interface UpdateServiceTypesAction extends Action { - serviceTypes?: ServiceType[]; - subscriberId: string; -} - -export interface DeleteServiceInstanceAction extends Action { - serviceUuid?: string; -} - -export interface DeleteVnfInstanceAction extends Action { - modelName?: string; - serviceModelId: string; -} - -export interface DeleteVfModuleInstanceAction extends Action { - modelName?: string; - serviceModelId?: string; - vfName?: string; -} - -export interface UpdateCategoryParametersAction extends Action { - categoryParameters?: string; -} - -export const updateModel: ActionCreator<UpdateServiceModelAction> = serviceHierarchy => ({ - type: UPDATE_MODEL, - serviceHierarchy: serviceHierarchy -}); - -export const updateServiceInstance: ActionCreator<UpdateServiceInstanceAction> = (serviceInstance, serviceUuid) => ({ - type: UPDATE_SERVICE_INSTANCE, - serviceInstance: serviceInstance, - serviceUuid: serviceUuid -}); - -export const updateVFModuleInstance: ActionCreator<UpdateVFModuleInstanceAction> = (vfInstance, vfId, serviceUuid) => ({ - type: UPDATE_VF_MODULE, - vfInstance: vfInstance, - vfId: vfId, - serviceUuid: serviceUuid -}) - -export const createVFModuleInstance: ActionCreator<CreateVFModuleInstanceAction> = (vfInstance, vfId, serviceUuid, index) => ({ - type: CREATE_VF_MODULE, - vfInstance: vfInstance, - vfId: vfId, - serviceUuid: serviceUuid, - index : index -}) - - - -export const updateVNFInstance: ActionCreator<UpdateVnfInstanceAction> = (vnfInstance, vnfModelName, serviceUuid) => ({ - type: UPDATE_VNF_INSTANCE, - vnfInstance: vnfInstance, - vnfModelName: vnfModelName, - serviceUuid: serviceUuid -}); - -export const updateLcpRegionsAndTenants: ActionCreator<UpdateLcpRegionsAndTenantsAction> = lcpRegionsAndTenants => ({ - type: UPDATE_LCP_REGIONS_AND_TENANTS, - lcpRegionsAndTenants: lcpRegionsAndTenants -}); - -export const updateSubscribers: ActionCreator<UpdateSubscribersAction> = subscribers => ({ - type: UPDATE_SUBSCRIBERS, - subscribers: subscribers -}); - -export const updateProductFamilies: ActionCreator<UpdateProductFamiliesAction> = productFamilies => ({ - type: UPDATE_PRODUCT_FAMILIES, - productFamilies: productFamilies -}); - -export const updateAicZones: ActionCreator<UpdateAicZonesAction> = aicZones => ({ - type: UPDATE_AIC_ZONES, - aicZones: aicZones -}); - -export const updateUserId: ActionCreator<UpdateUserIdAction> = userId => ({ - type: UPDATE_USER_ID, - userId: userId -}); - -export const updateCategoryParameters: ActionCreator<UpdateCategoryParametersAction> = categoryParameters => ({ - type: UPDATE_CATEGORY_PARAMETERS, - categoryParameters: categoryParameters -}); - -export const updateServiceTypes: ActionCreator<UpdateServiceTypesAction> = (serviceTypes, subscriberId) => ({ - type: UPDATE_SERVICE_TYPES, - serviceTypes: serviceTypes, - subscriberId: subscriberId -}); - -export const updateNetworkCollectionFunction: ActionCreator<UpdateNetworkCollectionFunction> = (ncf, networksAccordingToNetworkCollection) => ({ - type: UPDATE_NETWORK_FUNCTION, - networksAccordingToNetworkCollection: networksAccordingToNetworkCollection["results"], - network_function: ncf -}); - -export const deleteServiceInstance: ActionCreator<DeleteServiceInstanceAction> = serviceUuid => ({ - type: DELETE_SERVICE_INSTANCE, - serviceUuid: serviceUuid -}); - -export const deleteVnfInstance: ActionCreator<DeleteVnfInstanceAction> = (modelName, serviceModelId) => ({ - type: DELETE_VNF_INSTANCE, - modelName: modelName, - serviceModelId: serviceModelId -}); - -export const deleteVfModuleInstance: ActionCreator<DeleteVfModuleInstanceAction> = (modelName, serviceModelId, vfName) => ({ - type: DELETE_VNF_MODULE_INSTANCE, - modelName: modelName, - serviceModelId: serviceModelId, - vfName: vfName -}); diff --git a/vid-webpack-master/src/app/service.reducer.spec.ts b/vid-webpack-master/src/app/service.reducer.spec.ts deleted file mode 100644 index f734979ac..000000000 --- a/vid-webpack-master/src/app/service.reducer.spec.ts +++ /dev/null @@ -1,286 +0,0 @@ -import { LcpRegionsAndTenants } from './shared/models/lcpRegionsAndTenants'; -import { ServiceReducer, ServiceState } from './service.reducer'; -import { CategoryParams } from './shared/models/categoryParams'; -import { - DELETE_VNF_INSTANCE, DELETE_VNF_MODULE_INSTANCE, DeleteVfModuleInstanceAction, - DeleteVnfInstanceAction, - UPDATE_AIC_ZONES, - UPDATE_LCP_REGIONS_AND_TENANTS, - UPDATE_PRODUCT_FAMILIES, - UPDATE_SERVICE_INSTANCE, - UPDATE_SUBSCRIBERS, - UPDATE_USER_ID, - UPDATE_VNF_INSTANCE, - UpdateAicZonesAction, - UpdateProductFamiliesAction, UpdateServiceInstanceAction, - UpdateSubscribersAction, UpdateUserIdAction, - UpdateVnfInstanceAction -} from './service.actions'; -import { VnfInstance } from './shared/models/vnfInstance'; -import { ServiceInstance } from './shared/models/serviceInstance'; -import { LcpRegion } from './shared/models/lcpRegion'; -import { Tenant } from './shared/models/tenant'; -import { SelectOption } from './shared/models/selectOption'; - - -const initialState: ServiceState = { - serviceHierarchy: {}, - serviceInstance: {}, - lcpRegionsAndTenants: new LcpRegionsAndTenants(), - subscribers: null, - productFamilies: null, - serviceTypes: {}, - aicZones: null, - categoryParameters: new CategoryParams() -}; - - -describe('service reducer', () => { - const userId: string = 'userId'; - it('should handle initial state', () => { - expect(ServiceReducer(undefined, <any>{})).toEqual(initialState); - }); - - it('#UPDATE_USER_ID : should update userId ', (done: DoneFn) => { - expect(ServiceReducer(<any>{}, - <UpdateUserIdAction>{ - type: UPDATE_USER_ID, - userId: userId - } - )['userId']).toEqual(userId); - done(); - }); - - it('#UPDATE_SERVICE_INSTANCE : should update service instance with service id ', (done: DoneFn) => { - const serviceUuid:string = 'serviceUuid'; - - let serviceInstanceObject : ServiceInstance = { - instanceName: 'instanceName', - isUserProvidedNaming: false, - globalSubscriberId: 'globalSubscriberId', - productFamilyId: 'productFamilyId', - subscriptionServiceType: 'subscriptionServiceType', - lcpCloudRegionId: 'lcpCloudRegionId', - tenantId: 'tenantId', - tenantName: 'tenantName', - aicZoneId: 'aicZoneId', - aicZoneName: 'aicZoneName', - projectName: 'projectName', - owningEntityId: 'owningEntityId', - owningEntityName: 'owningEntityName', - pause: false, - bulkSize: 1, - vnfs: {}, - instanceParams : {}, - rollbackOnFailure: false, - subscriberName: 'subscriberName' - }; - - let serviceState = ServiceReducer(<any>{serviceInstance : {}}, - <UpdateServiceInstanceAction>{ - type: UPDATE_SERVICE_INSTANCE, - serviceUuid: serviceUuid, - serviceInstance : serviceInstanceObject - }).serviceInstance['serviceUuid']; - - expect(serviceState.instanceName).toEqual(serviceInstanceObject.instanceName); - expect(serviceState.isUserProvidedNaming).toEqual(serviceInstanceObject.isUserProvidedNaming); - expect(serviceState.globalSubscriberId).toEqual(serviceInstanceObject.globalSubscriberId); - expect(serviceState.productFamilyId).toEqual(serviceInstanceObject.productFamilyId); - expect(serviceState.subscriptionServiceType).toEqual(serviceInstanceObject.subscriptionServiceType); - expect(serviceState.lcpCloudRegionId).toEqual(serviceInstanceObject.lcpCloudRegionId); - expect(serviceState.tenantId).toEqual(serviceInstanceObject.tenantId); - expect(serviceState.tenantName).toEqual(serviceInstanceObject.tenantName); - expect(serviceState.aicZoneId).toEqual(serviceInstanceObject.aicZoneId); - expect(serviceState.aicZoneName).toEqual(serviceInstanceObject.aicZoneName); - expect(serviceState.projectName).toEqual(serviceInstanceObject.projectName); - expect(serviceState.owningEntityId).toEqual(serviceInstanceObject.owningEntityId); - expect(serviceState.owningEntityName).toEqual(serviceInstanceObject.owningEntityName); - expect(serviceState.pause).toEqual(serviceInstanceObject.pause); - expect(serviceState.bulkSize).toEqual(serviceInstanceObject.bulkSize); - expect(serviceState.vnfs).toEqual(serviceInstanceObject.vnfs); - expect(serviceState.instanceParams).toEqual(serviceInstanceObject.instanceParams); - expect(serviceState.rollbackOnFailure).toEqual(serviceInstanceObject.rollbackOnFailure); - expect(serviceState.subscriberName).toEqual(serviceInstanceObject.subscriberName); - - done(); - }); - - it('#UPDATE_VNF_INSTANCE : should update vnf instance with service id and vnfModelName ', (done: DoneFn) => { - let vnfInstanceObj : VnfInstance = { - instanceName: 'instanceName', - isUserProvidedNaming: false, - productFamilyId: 'productFamilyId', - lcpCloudRegionId: 'lcpCloudRegionId', - legacyRegion: 'legacyRegion', - tenantId: 'tenantId', - platformName: 'platformName', - lineOfBusiness: 'lineOfBusiness', - rollbackOnFailure: 'false', - vfModules: {} - }; - - let vnfState = ServiceReducer(<any>{serviceInstance : { - 'serviceUuid' : { - vnfs : {} - } - }}, - <UpdateVnfInstanceAction>{ - type: UPDATE_VNF_INSTANCE, - serviceUuid : 'serviceUuid', - vnfInstance: vnfInstanceObj, - vnfModelName : 'vnfModelName' - }).serviceInstance['serviceUuid'].vnfs['vnfModelName']; - - expect(vnfState.instanceName).toEqual(vnfInstanceObj.instanceName); - expect(vnfState.isUserProvidedNaming).toEqual(vnfInstanceObj.isUserProvidedNaming); - expect(vnfState.productFamilyId).toEqual(vnfInstanceObj.productFamilyId); - expect(vnfState.lcpCloudRegionId).toEqual(vnfInstanceObj.lcpCloudRegionId); - expect(vnfState.legacyRegion).toEqual(vnfInstanceObj.legacyRegion); - expect(vnfState.tenantId).toEqual(vnfInstanceObj.tenantId); - expect(vnfState.platformName).toEqual(vnfInstanceObj.platformName); - expect(vnfState.lineOfBusiness).toEqual(vnfInstanceObj.lineOfBusiness); - expect(vnfState.vfModules).toEqual(vnfInstanceObj.vfModules); - expect(vnfState.rollbackOnFailure).toEqual(vnfInstanceObj.rollbackOnFailure); - - done(); - }); - - it('#UPDATE_LCP_REGIONS_AND_TENANTS : should update lcp region and tenants', (done: DoneFn) => { - let lcpRegionsAndTenantsObj = [ - { - lcpRegionList : [ - new LcpRegion({ - "cloudRegionID" : 'cloudRegionID', - "is-permitted" : "is-permitted" - }) - ], - lcpRegionsTenantsMap : { - "lcpRegion" : [new Tenant({ - "tenantID" : "tenantID", - "tenantName" : "tenantName", - "is-permitted" : true - })] - } - } - ]; - let lcpRegionsAndTenantsState = ServiceReducer(<any>{serviceInstance : {}}, - <any>{ - type: UPDATE_LCP_REGIONS_AND_TENANTS, - lcpRegionsAndTenants : lcpRegionsAndTenantsObj - })['lcpRegionsAndTenants']; - - expect(lcpRegionsAndTenantsState).toBeDefined(); - done(); - }); - - it('#UPDATE_SUBSCRIBERS : should update subscribers', (done: DoneFn) => { - let subscribersList = [ - new SelectOption({ - id : 'id', - name : 'name', - isPermitted : false - }) - ]; - let subscribersState = ServiceReducer(<any>{serviceInstance : {}}, - <UpdateSubscribersAction>{ - type: UPDATE_SUBSCRIBERS, - subscribers : subscribersList - })['subscribers']; - - expect(subscribersState).toBeDefined(); - expect(subscribersState[0].id).toEqual(subscribersList[0].id); - expect(subscribersState[0].isPermitted).toEqual(subscribersList[0].isPermitted); - expect(subscribersState[0].name).toEqual(subscribersList[0].name); - - done(); - }); - - it('#UpdateProductFamiliesAction : should update product families', (done: DoneFn) => { - let productFamiliesObj = [ - new SelectOption({ - id : 'id', - name : 'name', - isPermitted : false - }) - ]; - let productFamiliesState = ServiceReducer(<any>{serviceInstance : {}}, - <UpdateProductFamiliesAction>{ - type: UPDATE_PRODUCT_FAMILIES, - productFamilies : productFamiliesObj - })['productFamilies']; - - expect(productFamiliesState).toBeDefined(); - expect(productFamiliesState[0].id).toEqual(productFamiliesObj[0].id); - expect(productFamiliesState[0].isPermitted).toEqual(productFamiliesObj[0].isPermitted); - expect(productFamiliesState[0].name).toEqual(productFamiliesObj[0].name); - - done(); - }); - - it('#UPDATE_AIC_ZONES : should update aic zones', (done: DoneFn) => { - let aicZonesObj = [ - new SelectOption({ - id : 'id', - name : 'name', - isPermitted : false - }) - ]; - let aicZonesState = ServiceReducer(<any>{serviceInstance : {}}, - <UpdateAicZonesAction>{ - type: UPDATE_AIC_ZONES, - aicZones : aicZonesObj - })['aicZones']; - - expect(aicZonesState).toBeDefined(); - expect(aicZonesState[0].id).toEqual(aicZonesObj[0].id); - expect(aicZonesState[0].isPermitted).toEqual(aicZonesObj[0].isPermitted); - expect(aicZonesState[0].name).toEqual(aicZonesObj[0].name); - - done(); - }); - - it('#DELETE_VNF_INSTANCE : should delete existing vnf', (done: DoneFn) => { - let state = ServiceReducer(<any>{serviceInstance : { - 'serviceModelId' : { - vnfs : { - 'modelName' : {} - } - } - }}, - <DeleteVnfInstanceAction>{ - type: DELETE_VNF_INSTANCE, - modelName : 'modelName', - serviceModelId : 'serviceModelId' - }); - - expect(state).toBeDefined(); - expect(state.serviceInstance[ 'serviceModelId'].vnfs['modelName']).not.toBeDefined(); - done(); - }); - - it('#DELETE_VNF_MODULE_INSTANCE : should delete existing vnf module', (done: DoneFn) => { - let state = ServiceReducer(<any>{serviceInstance : { - 'serviceModelId' : { - vnfs : { - 'vfName' : { - vfModules : { - 'modelName' : {} - } - } - } - } - }}, - <DeleteVfModuleInstanceAction>{ - type: DELETE_VNF_MODULE_INSTANCE, - modelName : 'modelName', - vfName : 'vfName', - serviceModelId : 'serviceModelId' - }); - - expect(state).toBeDefined(); - expect(state.serviceInstance['serviceModelId'].vnfs['vfName'].vfModules['modelName']).not.toBeDefined(); - done(); - }); - -}); diff --git a/vid-webpack-master/src/app/service.reducer.ts b/vid-webpack-master/src/app/service.reducer.ts deleted file mode 100644 index a11f31e80..000000000 --- a/vid-webpack-master/src/app/service.reducer.ts +++ /dev/null @@ -1,214 +0,0 @@ -import { Action } from 'redux'; -import { - CREATE_VF_MODULE, - CreateVFModuleInstanceAction, - DELETE_SERVICE_INSTANCE, - DELETE_VNF_INSTANCE, - DELETE_VNF_MODULE_INSTANCE, - DeleteServiceInstanceAction, - DeleteVfModuleInstanceAction, - DeleteVnfInstanceAction, - UPDATE_AIC_ZONES, - UPDATE_CATEGORY_PARAMETERS, - UPDATE_LCP_REGIONS_AND_TENANTS, - UPDATE_MODEL, - UPDATE_NETWORK_FUNCTION, - UPDATE_PRODUCT_FAMILIES, - UPDATE_SERVICE_INSTANCE, - UPDATE_SERVICE_TYPES, - UPDATE_SUBSCRIBERS, - UPDATE_USER_ID, - UPDATE_VF_MODULE, - UPDATE_VNF_INSTANCE, - UpdateAicZonesAction, - UpdateCategoryParametersAction, - UpdateLcpRegionsAndTenantsAction, - UpdateNetworkCollectionFunction, - UpdateProductFamiliesAction, - UpdateServiceInstanceAction, - UpdateServiceModelAction, - UpdateServiceTypesAction, - UpdateSubscribersAction, - UpdateUserIdAction, - UpdateVFModuleInstanceAction, - UpdateVnfInstanceAction, -} from './service.actions'; -import { LcpRegionsAndTenants } from './shared/models/lcpRegionsAndTenants'; -import * as _ from 'lodash'; -import { ServiceInstance } from './shared/models/serviceInstance'; -import { CategoryParams } from './shared/models/categoryParams'; -import { SelectOptionInterface } from './shared/models/selectOption'; -import { ServiceType } from './shared/models/serviceType'; -import { VnfInstance } from './shared/models/vnfInstance'; -import { VfModuleMap } from './shared/models/vfModulesMap'; - -export interface ServiceState { - serviceHierarchy: any; - serviceInstance: { [uuid: string]: ServiceInstance; }; - lcpRegionsAndTenants: LcpRegionsAndTenants; - subscribers: SelectOptionInterface[]; - productFamilies: any; - serviceTypes: { [subscriberId: string]: ServiceType[]; }; - aicZones: SelectOptionInterface[]; - categoryParameters: CategoryParams; -} - -const initialState: ServiceState = { - serviceHierarchy: {}, - serviceInstance: {}, - lcpRegionsAndTenants: new LcpRegionsAndTenants(), - subscribers: null, - productFamilies: null, - serviceTypes: {}, - aicZones: null, - categoryParameters: new CategoryParams() -}; - -export const ServiceReducer = - function (state: ServiceState = initialState, action: Action): ServiceState { - switch (action.type) { - case UPDATE_MODEL: { - let uuid = (<UpdateServiceModelAction>action).serviceHierarchy.service.uuid; - state.serviceHierarchy[uuid] = _.cloneDeep((<UpdateServiceModelAction>action).serviceHierarchy); - return Object.assign({}, state); - } - case UPDATE_SERVICE_INSTANCE: { - const updateServiceInstanceAction = <UpdateServiceInstanceAction>action; - const uuid = updateServiceInstanceAction.serviceUuid; - const newState = _.cloneDeep(state); - - const serviceInstance: ServiceInstance = newState.serviceInstance[uuid] || new ServiceInstance(); - - newState.serviceInstance[uuid] = Object.assign(serviceInstance, updateServiceInstanceAction.serviceInstance); - return newState; - } - case UPDATE_VNF_INSTANCE: { - const updateVnfInstanceAction = <UpdateVnfInstanceAction>action; - const serviceUuid = updateVnfInstanceAction.serviceUuid; - const vnfModelName = updateVnfInstanceAction.vnfModelName; - - const newState = _.cloneDeep(state); - const vnfInstance: VnfInstance = newState.serviceInstance[serviceUuid].vnfs[vnfModelName] || new VnfInstance(); - - newState.serviceInstance[serviceUuid].vnfs[vnfModelName] = Object.assign(vnfInstance, updateVnfInstanceAction.vnfInstance); - return newState; - } - - - case UPDATE_USER_ID: { - const updateUserId : UpdateUserIdAction = <UpdateUserIdAction>action; - // var newState2 = {...state,'userId':updateUserId.userId} - var newState = _.cloneDeep(state); - newState['userId'] = updateUserId.userId; - return newState; - - // state = (... {userId:action["userId"]},state]} - } - - case UPDATE_VF_MODULE: { - const updateVFModuleInstanceAction = <UpdateVFModuleInstanceAction>action; - const vfInstance = updateVFModuleInstanceAction.vfInstance; - const serviceUuid = updateVFModuleInstanceAction.serviceUuid; - const vfModuleId = updateVFModuleInstanceAction.vfId; - const newState = _.cloneDeep(state); - const vnfs = newState.serviceHierarchy[serviceUuid].vnfs; - const vnfId = getVfModuleParentVnfId(vnfs, vfModuleId); - let vfModulesMap = newState.serviceInstance[serviceUuid].vnfs[vnfId].vfModules[vfModuleId] || new VfModuleMap(); - vfModulesMap[vfModuleId] = vfInstance; - newState.serviceInstance[serviceUuid].vnfs[vnfId].vfModules[vfModuleId] = vfModulesMap; - return newState; - } - - case CREATE_VF_MODULE: { - const updateVFModuleInstanceAction = <CreateVFModuleInstanceAction>action; - const vfInstance = updateVFModuleInstanceAction.vfInstance; - const serviceUuid = updateVFModuleInstanceAction.serviceUuid; - const vfModuleId = updateVFModuleInstanceAction.vfId; - const index = updateVFModuleInstanceAction.index; - let newState = Object.assign({}, state); - const vnfs = newState.serviceHierarchy[serviceUuid].vnfs; - const vnfId = getVfModuleParentVnfId(vnfs, vfModuleId); - let vfModulesMap = newState.serviceInstance[serviceUuid].vnfs[vnfId].vfModules[vfModuleId] || new VfModuleMap(); - let randomId = generateId(); - vfModulesMap[vfModuleId + randomId] = vfInstance; - - newState.serviceInstance[serviceUuid].vnfs[vnfId].vfModules[vfModuleId] = vfModulesMap; - return newState; - } - - - case UPDATE_LCP_REGIONS_AND_TENANTS: { - Object.assign(state, (<UpdateLcpRegionsAndTenantsAction>action)); - return Object.assign({}, state); - } - case UPDATE_SUBSCRIBERS: { - Object.assign(state, (<UpdateSubscribersAction>action)); - return Object.assign({}, state); - } - case UPDATE_AIC_ZONES: { - Object.assign(state, (<UpdateAicZonesAction>action)); - return Object.assign({}, state); - } - case UPDATE_PRODUCT_FAMILIES: { - Object.assign(state, (<UpdateProductFamiliesAction>action)); - return Object.assign({}, state); - } - case UPDATE_NETWORK_FUNCTION: { - let networkFunctionReduxObj = state["networkFunctions"] == undefined ? {} : state["networkFunctions"]; - networkFunctionReduxObj[(<UpdateNetworkCollectionFunction>action).network_function] = (<UpdateNetworkCollectionFunction>action).networksAccordingToNetworkCollection; - Object.assign(state, {"networkFunctions":networkFunctionReduxObj}); - return Object.assign({}, state); - } - case UPDATE_SERVICE_TYPES: { - let subscriberId = (<UpdateServiceTypesAction>action).subscriberId; - let serviceTypes = (<UpdateServiceTypesAction>action).serviceTypes; - state.serviceTypes[subscriberId] = serviceTypes; - return Object.assign({}, state); - } - case UPDATE_CATEGORY_PARAMETERS: { - Object.assign(state, (<UpdateCategoryParametersAction>action)); - return Object.assign({}, state); - } - case DELETE_SERVICE_INSTANCE: { - const uuid = (<DeleteServiceInstanceAction>action).serviceUuid; - if (state.serviceHierarchy[uuid]) { - let newState = _.omit(state, ['serviceInstance[' + uuid + ']']); - return Object.assign({}, state, newState); - } - return Object.assign({}, state); - } - case DELETE_VNF_INSTANCE: { - const actionData =(<DeleteVnfInstanceAction>action); - if(state.serviceInstance[actionData.serviceModelId]){ - delete state.serviceInstance[actionData.serviceModelId].vnfs[actionData.modelName]; - } - return Object.assign({}, state); - } - - case DELETE_VNF_MODULE_INSTANCE: { - const actionData =(<DeleteVfModuleInstanceAction>action); - if(state.serviceInstance[actionData.serviceModelId]){ - delete state.serviceInstance[actionData.serviceModelId].vnfs[actionData.vfName].vfModules[actionData.modelName]; - } - return Object.assign({}, state); - } - default: - return Object.assign({}, state); - } - }; - -const generateId = () => { - return Math.random().toString(36).replace(/[^a-z]+/g, '').substr(0, 5); -}; - - -const getVfModuleParentVnfId = (vnfs: object, vfModuleId: string) => { - let vnfId = undefined; - _.forOwn(vnfs, (value, key) => { - if (vnfs[key].vfModules && vnfs[key].vfModules[vfModuleId]) { - vnfId = vnfs[key].modelCustomizationName; - return false; - } - }); - return vnfId; -}; diff --git a/vid-webpack-master/src/app/services/aaiService/aai.service.ts b/vid-webpack-master/src/app/services/aaiService/aai.service.ts deleted file mode 100644 index dd9d9fb29..000000000 --- a/vid-webpack-master/src/app/services/aaiService/aai.service.ts +++ /dev/null @@ -1,189 +0,0 @@ -import {Injectable} from '@angular/core'; -import {HttpClient, HttpHeaders} from '@angular/common/http'; -import { Constants } from '../../shared/utils/constants'; -import { ServiceType } from "../../shared/models/serviceType"; -import {GetSubDetailsResponse} from "./responseInterfaces/getSubDetailsResponseInterface"; -import {Observable} from "rxjs/Observable"; -import * as _ from 'lodash'; -import {CategoryParams} from "../../shared/models/categoryParams"; -import {GetCategoryParamsResponseInterface} from "./responseInterfaces/getCategoryParamsResponseInterface"; -import {Project} from "../../shared/models/project"; -import {OwningEntity} from "../../shared/models/owningEntity"; -import {GetServicesResponseInterface} from "./responseInterfaces/getServicesResponseInterface"; -import {Subscriber} from "../../shared/models/subscriber"; -import {GetSubscribersResponse} from "./responseInterfaces/getSubscribersResponseInterface"; -import {AicZone} from "../../shared/models/aicZone"; -import {GetAicZonesResponse} from "./responseInterfaces/getAicZonesResponseInterface"; -import {LcpRegionsAndTenants} from "../../shared/models/lcpRegionsAndTenants"; -import {LcpRegion} from "../../shared/models/lcpRegion"; -import {Tenant} from "../../shared/models/tenant"; -import {ProductFamily} from "../../shared/models/productFamily" -import { - updateAicZones, updateCategoryParameters, updateLcpRegionsAndTenants, updateModel, updateProductFamilies, - updateServiceTypes, updateSubscribers, updateUserId -} from '../../service.actions'; -import {SelectOption} from '../../shared/models/selectOption'; -import {NgRedux} from "@angular-redux/store"; -import {AppState} from "../../store/reducers"; -import {ResponseContentType, ResponseType} from "@angular/http"; -import 'rxjs/add/operator/do'; -import 'rxjs/add/observable/of'; -import 'rxjs/add/operator/catch'; - -@Injectable() -export class AaiService { - - constructor (private http: HttpClient, private store: NgRedux<AppState>) {} - - public getServiceModelById(serviceModelId: string): Observable<any> { - if (_.has(this.store.getState().service.serviceHierarchy,serviceModelId)){ - return Observable.of(<any> JSON.parse(JSON.stringify(this.store.getState().service.serviceHierarchy[serviceModelId]))); - } - let pathQuery: string = Constants.Path.SERVICES_PATH + serviceModelId; - return this.http.get(pathQuery).map(res => res ) - .do((res) => { - this.store.dispatch(updateModel(res)); - }); - } - - public getUserId() : Observable<any>{ - return this.http.get("../../getuserID",{responseType: 'text'}).do((res)=>this.store.dispatch(updateUserId(res))); - } - - - public getCRAccordingToNetworkFunctionId(networkCollectionFunction,cloudOwner,cloudRegionId){ - return this.http.get('../../aai_get_instance_groups_by_cloudregion/'+cloudOwner+'/'+cloudRegionId+'/' + networkCollectionFunction) - .map(res=>res).do((res)=>console.log(res)); - } - - public getCategoryParameters(familyName): Observable<CategoryParams> { - familyName = familyName || Constants.Path.PARAMETER_STANDARDIZATION_FAMILY; - let pathQuery: string = Constants.Path.GET_CATEGORY_PARAMETERS +"?familyName=" + familyName+ "&r=" + Math.random(); - - return this.http.get<GetCategoryParamsResponseInterface>(pathQuery) - .map(this.categoryParametersResponseToProductAndOwningEntity) - .do(res => { - this.store.dispatch(updateCategoryParameters(res)) - }); - } - - - - categoryParametersResponseToProductAndOwningEntity(res: GetCategoryParamsResponseInterface): CategoryParams { - if (res && res.categoryParameters) { - const owningEntityList = res.categoryParameters.owningEntity.map(owningEntity => new OwningEntity(owningEntity)); - const projectList = res.categoryParameters.project.map(project => new Project(project)); - const lineOfBusinessList = res.categoryParameters.lineOfBusiness.map(owningEntity => new SelectOption(owningEntity)); - const platformList = res.categoryParameters.platform.map(platform => new SelectOption(platform)); - - return new CategoryParams(owningEntityList, projectList, lineOfBusinessList, platformList); - } else { - return new CategoryParams(); - } - } - - public getProductFamilies(): Observable<ProductFamily[]> { - return this.getServices().map(res => res.service.map(service => new ProductFamily(service))); - } - - public getServices(): Observable<GetServicesResponseInterface> { - let pathQuery: string = Constants.Path.AAI_GET_SERVICES + Constants.Path.ASSIGN + Math.random(); - - return this.http.get<GetServicesResponseInterface>(pathQuery); - } - - public getSubscribers(): Observable<Subscriber[]> { - if (this.store.getState().service.subscribers){ - return Observable.of(<any> JSON.parse(JSON.stringify(this.store.getState().service.subscribers))); - } - - let pathQuery: string = Constants.Path.AAI_GET_SUBSCRIBERS + Constants.Path.ASSIGN + Math.random(); - - return this.http.get<GetSubscribersResponse>(pathQuery).map(res => - res.customer.map( subscriber => new Subscriber(subscriber))).do((res) => { - this.store.dispatch(updateSubscribers(res)); - }); - } - - public getAicZones(): Observable<AicZone[]> { - if (this.store.getState().service.aicZones){ - return Observable.of(<any> JSON.parse(JSON.stringify(this.store.getState().service.aicZones))); - } - - let pathQuery: string = Constants.Path.AAI_GET_AIC_ZONES + Constants.Path.ASSIGN + Math.random(); - - return this.http.get<GetAicZonesResponse>(pathQuery).map(res => - res.zone.map(aicZone => new AicZone(aicZone))).do((res) => { - this.store.dispatch(updateAicZones(res)); - }); - } - - public getLcpRegionsAndTenants(globalCustomerId, serviceType): Observable<LcpRegionsAndTenants> { - if (this.store.getState().service.lcpRegionsAndTenants.lcpRegionList.length !== 0){ - return Observable.of(<any> JSON.parse(JSON.stringify(this.store.getState().service.lcpRegionsAndTenants))); - } - let pathQuery: string = Constants.Path.AAI_GET_TENANTS - + globalCustomerId + Constants.Path.FORWARD_SLASH + serviceType + Constants.Path.ASSIGN + Math.random(); - - console.log("AaiService:getSubscriptionServiceTypeList: globalCustomerId: " - + globalCustomerId); - if (globalCustomerId != null) { - return this.http.get(pathQuery) - .map(this.tenantResponseToLcpRegionsAndTenants).do((res) => { - this.store.dispatch(updateLcpRegionsAndTenants(res)); - }); - } - } - - tenantResponseToLcpRegionsAndTenants(cloudRegionTenantList): LcpRegionsAndTenants { - - const lcpRegionsTenantsMap = {}; - - const lcpRegionList = _.uniqBy(cloudRegionTenantList, 'cloudRegionID').map((cloudRegionTenant) => { - return new LcpRegion(cloudRegionTenant) - }); - - lcpRegionList.forEach(region => { - lcpRegionsTenantsMap[region.id] = _.filter(cloudRegionTenantList, {'cloudRegionID' : region.id}) - .map((cloudRegionTenant) => { - return new Tenant(cloudRegionTenant) - }); - const reducer = (accumulator, currentValue) => { - accumulator.isPermitted = accumulator.isPermitted || currentValue.isPermitted; - - return accumulator; - }; - region.isPermitted = lcpRegionsTenantsMap[region.id].reduce(reducer).isPermitted; - }); - - return new LcpRegionsAndTenants(lcpRegionList, lcpRegionsTenantsMap); - } - - public getServiceTypes(subscriberId): Observable<ServiceType[]> { - console.log("AaiService:getSubscriptionServiceTypeList: globalCustomerId: " + subscriberId); - if (_.has(this.store.getState().service.serviceTypes, subscriberId)){ - return Observable.of(<any> JSON.parse(JSON.stringify(this.store.getState().service.serviceTypes[subscriberId]))); - } - - return this.getSubscriberDetails(subscriberId) - .map(this.subDetailsResponseToServiceTypes) - .do((res) => {this.store.dispatch(updateServiceTypes(res, subscriberId));}); - } - - public getSubscriberDetails(subscriberId): Observable<GetSubDetailsResponse> { - let pathQuery: string = Constants.Path.AAI_SUB_DETAILS_PATH + subscriberId + Constants.Path.ASSIGN + Math.random(); - - if (subscriberId != null) { - return this.http.get<GetSubDetailsResponse>(pathQuery); - } - } - - subDetailsResponseToServiceTypes(res: GetSubDetailsResponse): ServiceType[] { - if (res && res['service-subscriptions']) { - const serviceSubscriptions = res['service-subscriptions']['service-subscription']; - return serviceSubscriptions.map((subscription, index) => new ServiceType(String(index), subscription)) - } else { - return []; - } - } -} diff --git a/vid-webpack-master/src/app/services/msoService/mso.service.ts b/vid-webpack-master/src/app/services/msoService/mso.service.ts deleted file mode 100644 index 1402b50f7..000000000 --- a/vid-webpack-master/src/app/services/msoService/mso.service.ts +++ /dev/null @@ -1,26 +0,0 @@ -import {Injectable} from "@angular/core"; -import {HttpClient} from "@angular/common/http"; -import {Observable} from "rxjs/Observable"; -import {Constants} from "../../shared/utils/constants"; - -@Injectable() -export class MsoService { - httpClient: HttpClient; - - constructor(http: HttpClient) { - this.httpClient = http; - } - - - public submitMsoTask(instanceFields): Observable<any> { - let path = '../../asyncInstantiation/bulk'; - return this.httpClient.post(path, instanceFields); - } - public createVnf(requestDetails, serviceInstanceId): Observable<any> { - let pathQuery: string = Constants.Path.MSO_CREATE_VNF_INSTANCE + serviceInstanceId; - - return this.httpClient.post( pathQuery, { - requestDetails : requestDetails - }); - } -} diff --git a/vid-webpack-master/src/app/services/sdc.service.ts b/vid-webpack-master/src/app/services/sdc.service.ts deleted file mode 100644 index d4eba260a..000000000 --- a/vid-webpack-master/src/app/services/sdc.service.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { Injectable } from '@angular/core'; -import { HttpClient } from '@angular/common/http'; -import 'rxjs/add/operator/map'; -import { Constants } from '../shared/utils/constants'; -import { VidConfiguration } from '../configuration/vid.configuration'; - -@Injectable() -export class SdcService { - - - constructor (private http: HttpClient) { - } - - public getServicesModels(): any { - let pathQuery: string = Constants.Path.SERVICES_DIST_STATUS_PATH + VidConfiguration.ASDC_MODEL_STATUS; - - if ( VidConfiguration.ASDC_MODEL_STATUS === Constants.Status.ALL) { - pathQuery = Constants.Path.SERVICES_PATH; - } - - return this.http.get(pathQuery); - } - - getService(uuid: string) { - return this.http.get(Constants.Path.SERVICES_PATH + uuid); - } - -} diff --git a/vid-webpack-master/src/app/services/service-planning.service.spec.ts b/vid-webpack-master/src/app/services/service-planning.service.spec.ts deleted file mode 100644 index 5d60e29f7..000000000 --- a/vid-webpack-master/src/app/services/service-planning.service.spec.ts +++ /dev/null @@ -1,467 +0,0 @@ -import {ServicePlanningService} from "./service-planning.service"; -import {ReflectiveInjector} from "@angular/core"; -import {NgRedux} from "@angular-redux/store"; -import {ServiceNodeTypes} from "../shared/models/ServiceNodeTypes"; - -export class MockAppStore<T> { -} - -describe('Service planning service', () => { - let injector; - let service: ServicePlanningService; - - beforeEach(() => { - - let injector = ReflectiveInjector.resolveAndCreate([ - ServicePlanningService, - {provide: NgRedux, useClass: MockAppStore} - ]); - - service = injector.get(ServicePlanningService); - }); - - describe('#updateDynamicInputsVnfDataFromModel', () => { - it('get vfModule instance params', (done: DoneFn) => { - //get vfModule instance params - let dynamicInputs = service.updateDynamicInputsVnfDataFromModel(ServiceNodeTypes.VFmodule, generateVFModule()); - expect(dynamicInputs).toEqual([{ - id: '2017488_adiodvpe0_vnf_config_template_version', - type: 'string', - name: '2017488_adiodvpe0_vnf_config_template_version', - value: '17.2', - isRequired: true, - description: 'VPE Software Version' - }, { - id: '2017488_adiodvpe0_AIC_CLLI', - type: 'string', - name: '2017488_adiodvpe0_AIC_CLLI', - value: 'ATLMY8GA', - isRequired: true, - description: 'AIC Site CLLI' - }]); - - //get vfModule with no instance params should return empty array - dynamicInputs = service.updateDynamicInputsVnfDataFromModel(ServiceNodeTypes.VFmodule, generateVFModule2); - expect(dynamicInputs).toEqual([]); - - //get vf instance params should be undefined - dynamicInputs = service.updateDynamicInputsVnfDataFromModel(ServiceNodeTypes.VF, generateVNF()); - expect(dynamicInputs).toEqual([]); - done(); - }); - }); - - describe('#isUserProvidedNaming', () => { - it('get vfModule with generate ecompNaming should return userProvided false', (done: DoneFn) => { - //get vfModule with generate ecompNaming should return userProvided false - let isUserProvidedNaming = service.isUserProvidedNaming(ServiceNodeTypes.VFmodule, generateVFModule(), generateVNF()); - expect(isUserProvidedNaming).toBeFalsy(); - - //get vfModule without generate ecompNaming should return userProvided true - isUserProvidedNaming = service.isUserProvidedNaming(ServiceNodeTypes.VFmodule, generateVFModule(), generateVNF_ecompNamingFalse()); - expect(isUserProvidedNaming).toBeTruthy(); - - //get vnf with generate ecompNaming should return userProvided false - isUserProvidedNaming = service.isUserProvidedNaming(ServiceNodeTypes.VF, generateVNF(), null); - expect(isUserProvidedNaming).toBeFalsy(); - - //get vnf without generate ecompNaming should return userProvided true - isUserProvidedNaming = service.isUserProvidedNaming(ServiceNodeTypes.VF, generateVNF_ecompNamingFalse(), null); - expect(isUserProvidedNaming).toBeTruthy(); - done(); - }); - }); - - function generateVFModule() { - return { - 'uuid': '25284168-24bb-4698-8cb4-3f509146eca5', - 'invariantUuid': '7253ff5c-97f0-4b8b-937c-77aeb4d79aa1', - 'customizationUuid': 'f7e7c365-60cf-49a9-9ebf-a1aa11b9d401', - 'description': null, - 'name': '2017488AdiodVpe..ADIOD_vRE_BV..module-1', - 'version': '6', - 'modelCustomizationName': '2017488AdiodVpe..ADIOD_vRE_BV..module-1', - 'properties': {'minCountInstances': 0, 'maxCountInstances': null, 'initialCount': 0}, - 'commands': {}, - 'volumeGroupAllowed': true, - 'inputs': { - '2017488_adiodvpe0_vnf_config_template_version': { - 'type': 'string', - 'description': 'VPE Software Version', - 'entry_schema': null, - 'constraints': [], - 'required': true, - 'default': '17.2' - }, - '2017488_adiodvpe0_AIC_CLLI': { - 'type': 'string', - 'description': 'AIC Site CLLI', - 'entry_schema': null, - 'constraints': [], - 'required': true, - 'default': 'ATLMY8GA' - } - } - }; - } - - function generateVFModule2() { - return { - 'uuid': '0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a', - 'invariantUuid': 'eff8cc59-53a1-4101-aed7-8cf24ecf8339', - 'customizationUuid': '3cd946bb-50e0-40d8-96d3-c9023520b557', - 'description': null, - 'name': '2017488AdiodVpe..ADIOD_vPFE_BV..module-2', - 'version': '6', - 'modelCustomizationName': '2017488AdiodVpe..ADIOD_vPFE_BV..module-2', - 'properties': {'minCountInstances': 0, 'maxCountInstances': null, 'initialCount': 0}, - 'commands': {}, - 'volumeGroupAllowed': true, - 'inputs': {} - }; - } - - function generateVNF() { - return { - 'uuid': '0903e1c0-8e03-4936-b5c2-260653b96413', - 'invariantUuid': '00beb8f9-6d39-452f-816d-c709b9cbb87d', - 'description': 'Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM', - 'name': '2017-388_ADIOD-vPE', - 'version': '1.0', - 'customizationUuid': '280dec31-f16d-488b-9668-4aae55d6648a', - 'inputs': { - 'vnf_config_template_version': { - 'type': 'string', - 'description': 'VPE Software Version', - 'entry_schema': null, - 'constraints': [], - 'required': true, - 'default': '17.2' - }, - 'bandwidth_units': { - 'type': 'string', - 'description': 'Units of bandwidth', - 'entry_schema': null, - 'constraints': [], - 'required': true, - 'default': 'Gbps' - }, - 'bandwidth': { - 'type': 'string', - 'description': 'Requested VPE bandwidth', - 'entry_schema': null, - 'constraints': [], - 'required': true, - 'default': '10' - }, - 'AIC_CLLI': { - 'type': 'string', - 'description': 'AIC Site CLLI', - 'entry_schema': null, - 'constraints': [], - 'required': true, - 'default': 'ATLMY8GA' - }, - 'ASN': { - 'type': 'string', - 'description': 'AV/PE', - 'entry_schema': null, - 'constraints': [], - 'required': true, - 'default': 'AV_vPE' - }, - 'vnf_instance_name': { - 'type': 'string', - 'description': 'The hostname assigned to the vpe.', - 'entry_schema': null, - 'constraints': [], - 'required': true, - 'default': 'mtnj309me6' - } - }, - 'commands': { - 'vnf_config_template_version': { - 'displayName': 'vnf_config_template_version', - 'command': 'get_input', - 'inputName': '2017488_adiodvpe0_vnf_config_template_version' - }, - 'bandwidth_units': { - 'displayName': 'bandwidth_units', - 'command': 'get_input', - 'inputName': 'adiodvpe0_bandwidth_units' - }, - 'bandwidth': {'displayName': 'bandwidth', 'command': 'get_input', 'inputName': 'adiodvpe0_bandwidth'}, - 'AIC_CLLI': {'displayName': 'AIC_CLLI', 'command': 'get_input', 'inputName': '2017488_adiodvpe0_AIC_CLLI'}, - 'ASN': {'displayName': 'ASN', 'command': 'get_input', 'inputName': '2017488_adiodvpe0_ASN'}, - 'vnf_instance_name': { - 'displayName': 'vnf_instance_name', - 'command': 'get_input', - 'inputName': '2017488_adiodvpe0_vnf_instance_name' - } - }, - 'properties': { - 'vmxvre_retype': 'RE-VMX', - 'vnf_config_template_version': 'get_input:2017488_adiodvpe0_vnf_config_template_version', - 'sriov44_net_id': '48d399b3-11ee-48a8-94d2-f0ea94d6be8d', - 'int_ctl_net_id': '2f323477-6936-4d01-ac53-d849430281d9', - 'vmxvpfe_sriov41_0_port_mac': '00:11:22:EF:AC:DF', - 'int_ctl_net_name': 'VMX-INTXI', - 'vmx_int_ctl_prefix': '128.0.0.0', - 'sriov43_net_id': 'da349ca1-6de9-4548-be88-2d88e99bfef5', - 'sriov42_net_id': '760669ba-013d-4d9b-b0e7-4151fe2e6279', - 'sriov41_net_id': '25ad52d5-c165-40f8-b3b0-ddfc2373280a', - 'nf_type': 'vPE', - 'vmxvpfe_int_ctl_ip_1': '128.0.0.16', - 'is_AVPN_service': 'false', - 'vmx_RSG_name': 'vREXI-affinity', - 'vmx_int_ctl_forwarding': 'l2', - 'vmxvre_oam_ip_0': '10.40.123.5', - 'vmxvpfe_sriov44_0_port_mac': '00:11:22:EF:AC:DF', - 'vmxvpfe_sriov41_0_port_vlanstrip': 'false', - 'vmxvpfe_sriov42_0_port_vlanfilter': '4001', - 'vmxvpfe_sriov44_0_port_unknownunicastallow': 'true', - 'vmxvre_image_name_0': 'VRE-ENGINE_17.2-S2.1.qcow2', - 'vmxvre_instance': '0', - 'vmxvpfe_sriov43_0_port_mac': '00:11:22:EF:AC:DF', - 'vmxvre_flavor_name': 'ns.c1r16d32.v5', - 'vmxvpfe_volume_size_0': '40.0', - 'vmxvpfe_sriov43_0_port_vlanfilter': '4001', - 'nf_naming': '{ecomp_generated_naming=true}', - 'nf_naming_code': 'Navneet', - 'vmxvre_name_0': 'vREXI', - 'vmxvpfe_sriov42_0_port_vlanstrip': 'false', - 'vmxvpfe_volume_name_0': 'vPFEXI_FBVolume', - 'vmx_RSG_id': 'bd89a33c-13c3-4a04-8fde-1a57eb123141', - 'vmxvpfe_image_name_0': 'VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2', - 'vmxvpfe_sriov43_0_port_unknownunicastallow': 'true', - 'vmxvpfe_sriov44_0_port_unknownmulticastallow': 'true', - 'vmxvre_console': 'vidconsole', - 'vmxvpfe_sriov44_0_port_vlanfilter': '4001', - 'vmxvpfe_sriov42_0_port_mac': '00:11:22:EF:AC:DF', - 'vmxvpfe_volume_id_0': '47cede15-da2f-4397-a101-aa683220aff3', - 'vmxvpfe_sriov42_0_port_unknownmulticastallow': 'true', - 'vmxvpfe_sriov44_0_port_vlanstrip': 'false', - 'vf_module_id': '123', - 'nf_function': 'JAI', - 'vmxvpfe_sriov43_0_port_unknownmulticastallow': 'true', - 'vmxvre_int_ctl_ip_0': '128.0.0.1', - 'AIC_CLLI': 'get_input:2017488_adiodvpe0_AIC_CLLI', - 'vnf_name': 'mtnj309me6vre', - 'vmxvpfe_sriov41_0_port_unknownunicastallow': 'true', - 'vmxvre_volume_type_1': 'HITACHI', - 'vmxvpfe_sriov44_0_port_broadcastallow': 'true', - 'vmxvre_volume_type_0': 'HITACHI', - 'vmxvpfe_volume_type_0': 'HITACHI', - 'vmxvpfe_sriov43_0_port_broadcastallow': 'true', - 'bandwidth_units': 'get_input:adiodvpe0_bandwidth_units', - 'vnf_id': '123', - 'vmxvre_oam_prefix': '24', - 'availability_zone_0': 'mtpocfo-kvm-az01', - 'ASN': 'get_input:2017488_adiodvpe0_ASN', - 'vmxvre_chassis_i2cid': '161', - 'vmxvpfe_name_0': 'vPFEXI', - 'bandwidth': 'get_input:adiodvpe0_bandwidth', - 'availability_zone_max_count': '1', - 'vmxvre_volume_size_0': '45.0', - 'vmxvre_volume_size_1': '50.0', - 'vmxvpfe_sriov42_0_port_broadcastallow': 'true', - 'vmxvre_oam_gateway': '10.40.123.1', - 'vmxvre_volume_name_1': 'vREXI_FAVolume', - 'vmxvre_ore_present': '0', - 'vmxvre_volume_name_0': 'vREXI_FBVolume', - 'vmxvre_type': '0', - 'vnf_instance_name': 'get_input:2017488_adiodvpe0_vnf_instance_name', - 'vmxvpfe_sriov41_0_port_unknownmulticastallow': 'true', - 'oam_net_id': 'b95eeb1d-d55d-4827-abb4-8ebb94941429', - 'vmx_int_ctl_len': '24', - 'vmxvpfe_sriov43_0_port_vlanstrip': 'false', - 'vmxvpfe_sriov41_0_port_broadcastallow': 'true', - 'vmxvre_volume_id_1': '6e86797e-03cd-4fdc-ba72-2957119c746d', - 'vmxvpfe_sriov41_0_port_vlanfilter': '4001', - 'nf_role': 'Testing', - 'vmxvre_volume_id_0': 'f4eacb79-f687-4e9d-b760-21847c8bb15a', - 'vmxvpfe_sriov42_0_port_unknownunicastallow': 'true', - 'vmxvpfe_flavor_name': 'ns.c20r16d25.v5' - }, - 'type': 'VF', - 'modelCustomizationName': '2017-388_ADIOD-vPE 1', - 'vfModules': {}, - 'volumeGroups': {} - }; - } - - function generateVNF_ecompNamingFalse() { - return { - 'uuid': '0903e1c0-8e03-4936-b5c2-260653b96413', - 'invariantUuid': '00beb8f9-6d39-452f-816d-c709b9cbb87d', - 'description': 'Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM', - 'name': '2017-388_ADIOD-vPE', - 'version': '1.0', - 'customizationUuid': '280dec31-f16d-488b-9668-4aae55d6648a', - 'inputs': { - 'vnf_config_template_version': { - 'type': 'string', - 'description': 'VPE Software Version', - 'entry_schema': null, - 'constraints': [], - 'required': true, - 'default': '17.2' - }, - 'bandwidth_units': { - 'type': 'string', - 'description': 'Units of bandwidth', - 'entry_schema': null, - 'constraints': [], - 'required': true, - 'default': 'Gbps' - }, - 'bandwidth': { - 'type': 'string', - 'description': 'Requested VPE bandwidth', - 'entry_schema': null, - 'constraints': [], - 'required': true, - 'default': '10' - }, - 'AIC_CLLI': { - 'type': 'string', - 'description': 'AIC Site CLLI', - 'entry_schema': null, - 'constraints': [], - 'required': true, - 'default': 'ATLMY8GA' - }, - 'ASN': { - 'type': 'string', - 'description': 'AV/PE', - 'entry_schema': null, - 'constraints': [], - 'required': true, - 'default': 'AV_vPE' - }, - 'vnf_instance_name': { - 'type': 'string', - 'description': 'The hostname assigned to the vpe.', - 'entry_schema': null, - 'constraints': [], - 'required': true, - 'default': 'mtnj309me6' - } - }, - 'commands': { - 'vnf_config_template_version': { - 'displayName': 'vnf_config_template_version', - 'command': 'get_input', - 'inputName': '2017488_adiodvpe0_vnf_config_template_version' - }, - 'bandwidth_units': { - 'displayName': 'bandwidth_units', - 'command': 'get_input', - 'inputName': 'adiodvpe0_bandwidth_units' - }, - 'bandwidth': {'displayName': 'bandwidth', 'command': 'get_input', 'inputName': 'adiodvpe0_bandwidth'}, - 'AIC_CLLI': {'displayName': 'AIC_CLLI', 'command': 'get_input', 'inputName': '2017488_adiodvpe0_AIC_CLLI'}, - 'ASN': {'displayName': 'ASN', 'command': 'get_input', 'inputName': '2017488_adiodvpe0_ASN'}, - 'vnf_instance_name': { - 'displayName': 'vnf_instance_name', - 'command': 'get_input', - 'inputName': '2017488_adiodvpe0_vnf_instance_name' - } - }, - 'properties': { - 'ecomp_generated_naming': "false", - 'vmxvre_retype': 'RE-VMX', - 'vnf_config_template_version': 'get_input:2017488_adiodvpe0_vnf_config_template_version', - 'sriov44_net_id': '48d399b3-11ee-48a8-94d2-f0ea94d6be8d', - 'int_ctl_net_id': '2f323477-6936-4d01-ac53-d849430281d9', - 'vmxvpfe_sriov41_0_port_mac': '00:11:22:EF:AC:DF', - 'int_ctl_net_name': 'VMX-INTXI', - 'vmx_int_ctl_prefix': '128.0.0.0', - 'sriov43_net_id': 'da349ca1-6de9-4548-be88-2d88e99bfef5', - 'sriov42_net_id': '760669ba-013d-4d9b-b0e7-4151fe2e6279', - 'sriov41_net_id': '25ad52d5-c165-40f8-b3b0-ddfc2373280a', - 'nf_type': 'vPE', - 'vmxvpfe_int_ctl_ip_1': '128.0.0.16', - 'is_AVPN_service': 'false', - 'vmx_RSG_name': 'vREXI-affinity', - 'vmx_int_ctl_forwarding': 'l2', - 'vmxvre_oam_ip_0': '10.40.123.5', - 'vmxvpfe_sriov44_0_port_mac': '00:11:22:EF:AC:DF', - 'vmxvpfe_sriov41_0_port_vlanstrip': 'false', - 'vmxvpfe_sriov42_0_port_vlanfilter': '4001', - 'vmxvpfe_sriov44_0_port_unknownunicastallow': 'true', - 'vmxvre_image_name_0': 'VRE-ENGINE_17.2-S2.1.qcow2', - 'vmxvre_instance': '0', - 'vmxvpfe_sriov43_0_port_mac': '00:11:22:EF:AC:DF', - 'vmxvre_flavor_name': 'ns.c1r16d32.v5', - 'vmxvpfe_volume_size_0': '40.0', - 'vmxvpfe_sriov43_0_port_vlanfilter': '4001', - 'nf_naming': '{ecomp_generated_naming=false}', - 'nf_naming_code': 'Navneet', - 'vmxvre_name_0': 'vREXI', - 'vmxvpfe_sriov42_0_port_vlanstrip': 'false', - 'vmxvpfe_volume_name_0': 'vPFEXI_FBVolume', - 'vmx_RSG_id': 'bd89a33c-13c3-4a04-8fde-1a57eb123141', - 'vmxvpfe_image_name_0': 'VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2', - 'vmxvpfe_sriov43_0_port_unknownunicastallow': 'true', - 'vmxvpfe_sriov44_0_port_unknownmulticastallow': 'true', - 'vmxvre_console': 'vidconsole', - 'vmxvpfe_sriov44_0_port_vlanfilter': '4001', - 'vmxvpfe_sriov42_0_port_mac': '00:11:22:EF:AC:DF', - 'vmxvpfe_volume_id_0': '47cede15-da2f-4397-a101-aa683220aff3', - 'vmxvpfe_sriov42_0_port_unknownmulticastallow': 'true', - 'vmxvpfe_sriov44_0_port_vlanstrip': 'false', - 'vf_module_id': '123', - 'nf_function': 'JAI', - 'vmxvpfe_sriov43_0_port_unknownmulticastallow': 'true', - 'vmxvre_int_ctl_ip_0': '128.0.0.1', - 'AIC_CLLI': 'get_input:2017488_adiodvpe0_AIC_CLLI', - 'vnf_name': 'mtnj309me6vre', - 'vmxvpfe_sriov41_0_port_unknownunicastallow': 'true', - 'vmxvre_volume_type_1': 'HITACHI', - 'vmxvpfe_sriov44_0_port_broadcastallow': 'true', - 'vmxvre_volume_type_0': 'HITACHI', - 'vmxvpfe_volume_type_0': 'HITACHI', - 'vmxvpfe_sriov43_0_port_broadcastallow': 'true', - 'bandwidth_units': 'get_input:adiodvpe0_bandwidth_units', - 'vnf_id': '123', - 'vmxvre_oam_prefix': '24', - 'availability_zone_0': 'mtpocfo-kvm-az01', - 'ASN': 'get_input:2017488_adiodvpe0_ASN', - 'vmxvre_chassis_i2cid': '161', - 'vmxvpfe_name_0': 'vPFEXI', - 'bandwidth': 'get_input:adiodvpe0_bandwidth', - 'availability_zone_max_count': '1', - 'vmxvre_volume_size_0': '45.0', - 'vmxvre_volume_size_1': '50.0', - 'vmxvpfe_sriov42_0_port_broadcastallow': 'true', - 'vmxvre_oam_gateway': '10.40.123.1', - 'vmxvre_volume_name_1': 'vREXI_FAVolume', - 'vmxvre_ore_present': '0', - 'vmxvre_volume_name_0': 'vREXI_FBVolume', - 'vmxvre_type': '0', - 'vnf_instance_name': 'get_input:2017488_adiodvpe0_vnf_instance_name', - 'vmxvpfe_sriov41_0_port_unknownmulticastallow': 'true', - 'oam_net_id': 'b95eeb1d-d55d-4827-abb4-8ebb94941429', - 'vmx_int_ctl_len': '24', - 'vmxvpfe_sriov43_0_port_vlanstrip': 'false', - 'vmxvpfe_sriov41_0_port_broadcastallow': 'true', - 'vmxvre_volume_id_1': '6e86797e-03cd-4fdc-ba72-2957119c746d', - 'vmxvpfe_sriov41_0_port_vlanfilter': '4001', - 'nf_role': 'Testing', - 'vmxvre_volume_id_0': 'f4eacb79-f687-4e9d-b760-21847c8bb15a', - 'vmxvpfe_sriov42_0_port_unknownunicastallow': 'true', - 'vmxvpfe_flavor_name': 'ns.c20r16d25.v5' - }, - 'type': 'VF', - 'modelCustomizationName': '2017-388_ADIOD-vPE 1', - 'vfModules': {}, - 'volumeGroups': {} - }; - } - -}); - - - - diff --git a/vid-webpack-master/src/app/services/service-planning.service.ts b/vid-webpack-master/src/app/services/service-planning.service.ts deleted file mode 100644 index 75720c8a1..000000000 --- a/vid-webpack-master/src/app/services/service-planning.service.ts +++ /dev/null @@ -1,282 +0,0 @@ -import {Injectable} from '@angular/core'; -import {Constants} from "../shared/utils/constants"; -import {Utils} from "../utils/utils"; -import * as _ from 'lodash'; -import Parameter = Constants.Parameter; -import {ITreeNode} from "angular-tree-component/dist/defs/api"; -import {ServiceInstance} from "../shared/models/serviceInstance"; -import {VNFModel} from "../shared/models/vnfModel"; -import {ServiceNodeTypes} from "../shared/models/ServiceNodeTypes"; -import {VfModuleMap} from "../shared/models/vfModulesMap"; -import {VnfInstance} from "../shared/models/vnfInstance"; -import {VfModuleTreeNode} from "../shared/models/vfModuleTreeNode"; -import {VfModule} from "../shared/models/vfModule"; -import {VnfTreeNode} from "../shared/models/vnfTreeNode"; -import {NgRedux} from "@angular-redux/store"; -import {AppState} from "../store/reducers"; -import {InputType} from "../shared/models/inputTypes"; - - -@Injectable() -export class ServicePlanningService { - - modelDataTree: any[] = []; - drawingDataTree: any[] = []; - service: any = {name:'My Service'} ; - public requiredFields = { - VF: [InputType.LCP_REGION, InputType.TENANT, InputType.PLATFORM], - VFmodule: [] - }; - - constructor(private store: NgRedux<AppState>) {} - - - public getServiceName() :string{ - return this.service.name; - } - - public getServiceInstance(serviceModelId): ServiceInstance { - return this.store.getState().service.serviceInstance[serviceModelId]; - } - - public getVnfInstance(serviceModelId, vnfModelName): VnfInstance { - return this.getServiceInstance(serviceModelId).vnfs[vnfModelName]; - } - - public getVfModuleMap(serviceModelId, vnfModelName, vfModuleModelName): VfModuleMap { - let vnfInstance = this.getVnfInstance(serviceModelId, vnfModelName); - return _.get(vnfInstance, ['vfModules', vfModuleModelName]); - } - - public convertServiceModelToTreeNodes(serviceModel) { - let _this = this; - - _.forOwn(serviceModel.vnfs, function(item, key) { - _this.addFirstLevelModel(key, item, item.type, serviceModel); - }); - - _.forOwn(serviceModel.configurations, function(item, key) { - _this.addFirstLevelModel(key, item, ServiceNodeTypes.Configuration, serviceModel); - }); - - _.forOwn(serviceModel.networks, function(network, key) { - _this.addFirstLevelModel(key, network, ServiceNodeTypes.Network, serviceModel); - }); - - return this.modelDataTree; - } - - private addFirstLevelModel(key, value, valueType, serviceModel) { - - let node = this.convertItemToTreeNode(key, value, valueType, null, false); - let vnfInstance = this.getVnfInstance(serviceModel.service.uuid, key); - if(value.vfModules) { - node.children = Object.keys(value.vfModules).map((vmKey) => - this.convertItemToTreeNode(vmKey, value.vfModules[vmKey], ServiceNodeTypes.VFmodule, value, !vnfInstance)); - } - this.modelDataTree.push(node); - } - - private convertItemToTreeNode(key, value, valueType, parentModel , disabled) { - - return { - id: value.uuid, - name: key, - tooltip: valueType, - type: valueType, - count: value.count || 0, - max: value.max || 1, - children: [], - disabled: disabled, - dynamicInputs: this.updateDynamicInputsVnfDataFromModel(valueType, value), - userProvidedNaming: this.isUserProvidedNaming(valueType, value, parentModel) - } - } - - public convertServiceInstanceToTreeData(serviceInstance: ServiceInstance, modelId: string): any { - let drawingBoardData = []; - let _this = this; - _.forOwn(serviceInstance.vnfs, (vnfInstance, vnfModelName) => { - let vnfModel: VNFModel = _this.store.getState().service.serviceHierarchy[modelId].vnfs[vnfModelName]; - let vnfNode = new VnfTreeNode(vnfInstance, vnfModel); - - let vfModuleNodes = []; - _.forOwn(vnfInstance.vfModules, (vfModuleMap, vfModuleModelName) => { - _.forOwn(vfModuleMap, (vfModuleInstance, vfModuleInstsanceName) => { - let vfModule: VfModule = _this.store.getState().service.serviceHierarchy[modelId].vnfs[vnfModelName].vfModules[vfModuleModelName]; - let vfModuleNode: VfModuleTreeNode = new VfModuleTreeNode(vfModuleInstance, vfModule, vfModuleModelName); - vfModuleNodes.push(vfModuleNode); - }); - }); - vnfNode.children = vfModuleNodes; - drawingBoardData.push(vnfNode); - }); - - return drawingBoardData; - } - - public getArbitraryInputs(inputs) { - let parameter; - let parameterList = []; - for (let key in inputs) { - parameter = { - id : key, - type : Parameter.STRING, - name : key, - value : inputs[key][Parameter.DEFAULT], - isRequired : inputs[key][Parameter.REQUIRED], - description : inputs[key][Parameter.DESCRIPTION] - }; - switch (inputs[key][Parameter.TYPE]) { - case Parameter.INTEGER: - parameter.type = Parameter.NUMBER; - break; - case Parameter.BOOLEAN: - parameter.type = Parameter.BOOLEAN; - break; - case Parameter.RANGE: - break; - case Parameter.LIST: - parameter.type = Parameter.LIST; - break; - case Parameter.MAP: - parameter.type = Parameter.MAP; - break; - } - if ( Utils.hasContents(inputs[key][Parameter.CONSTRAINTS]) - && ( inputs[key][Parameter.CONSTRAINTS].length > 0 ) ) { - let constraintsArray = inputs[key][Parameter.CONSTRAINTS]; - this.addConstraintParameters (parameterList, constraintsArray, key, inputs, parameter); - } - else { - - parameterList.push(parameter); - } - } - return parameterList; - } - - private addConstraintParameters(parameterList, constraintsArray, key, inputs, parameter) { - // If there are constraints and the operator is "valid_values", - // use a select parameter type. - let i:number = constraintsArray.length; - let parameterPushed: boolean = false; - if ( i > 0 ) { - while ( (i--) && (!parameterPushed) ) { - let keys = Object.keys(constraintsArray[i]); - for ( let operator in keys ) { - switch (keys[operator]) { - case Parameter.VALID_VALUES: - let j: number = constraintsArray[i][Parameter.VALID_VALUES].length; - if ( j > 0 ) { - let oList = []; - let option; - while (j--) { - option = { - name: constraintsArray[i][Parameter.VALID_VALUES][j], - isDefault: false - }; - if ( (Utils.hasContents (inputs[key][Parameter.DEFAULT]) ) - && (inputs[key][Parameter.DEFAULT] === constraintsArray[i][Parameter.VALID_VALUES][j] ) ) { - option = { - name: constraintsArray[i][Parameter.VALID_VALUES][j], - isDefault: true - } - } - oList.push(option); - } - parameter.type = Parameter.SELECT; - parameter.optionList = oList; - parameterList.push(parameter); - parameterPushed = true; - } - break; - - case Parameter.EQUAL: - if ( constraintsArray[i][Parameter.EQUAL] != null ) { - //override parameter type - parameter.type = Parameter.STRING; - parameter.isReadOnly = true; - parameter.value = constraintsArray[i][Parameter.EQUAL]; - parameterList.push(parameter); - parameterPushed = true; - } - break; - - case Parameter.LENGTH: - if ( constraintsArray[i][Parameter.LENGTH] != null ) { - parameter.minLength = constraintsArray[i][Parameter.LENGTH]; - parameter.maxLength = constraintsArray[i][Parameter.LENGTH]; - parameterList.push(parameter); - parameterPushed = true; - } - break; - case Parameter.MAX_LENGTH: - if ( constraintsArray[i][Parameter.MAX_LENGTH] != null ) { - parameter.maxLength = constraintsArray[i][Parameter.MAX_LENGTH]; - parameterList.push(parameter); - parameterPushed = true; - } - break; - case Parameter.MIN_LENGTH: - if ( constraintsArray[i][Parameter.MIN_LENGTH] != null ) { - parameter.minLength = constraintsArray[i][Parameter.MIN_LENGTH]; - parameterList.push(parameter); - parameterPushed = true; - } - break; - case Parameter.IN_RANGE: - if ( constraintsArray[i][Parameter.IN_RANGE] != null ) { - if (constraintsArray[i][Parameter.IN_RANGE].length > 1 ) { - parameter.min = constraintsArray[i][Parameter.IN_RANGE][0]; - parameter.max = constraintsArray[i][Parameter.IN_RANGE][1]; - parameter.type = Parameter.NUMBER; - parameter.value = inputs[key][Parameter.DEFAULT]; - parameterList.push(parameter); - parameterPushed = true; - } - } - break; - case Parameter.GREATER_THAN: - if ( constraintsArray[i][Parameter.GREATER_THAN] != null ) { - parameter.type = Parameter.NUMBER; - parameter.min = constraintsArray[i][Parameter.GREATER_THAN]; - parameter.value = inputs[key][Parameter.DEFAULT]; - parameterList.push(parameter); - parameterPushed = true; - } - break; - }//switch - }//for - }//while - }//if - }; - - public static isVfModule(node:ITreeNode): boolean { - return node.data.type=='VFmodule'; - } - - public static isVnf(node:ITreeNode): boolean { - return node.data.type == ServiceNodeTypes.VF; - } - - updateDynamicInputsVnfDataFromModel(modelType: string, model: any): Array<any> { - let displayInputs; - if (modelType === ServiceNodeTypes.VFmodule) { - displayInputs = model.inputs; - } - return _.isEmpty(displayInputs) ? [] : this.getArbitraryInputs(displayInputs); - } - - isUserProvidedNaming(type: string, nodeModel: any, parentModel: any) : boolean { - let model; - if (type === ServiceNodeTypes.VFmodule) { - model = parentModel; - } - else { - model = nodeModel; - } - const ecompGeneratedNaming = model.properties.ecomp_generated_naming; - return ecompGeneratedNaming !== undefined && ecompGeneratedNaming === "false"; - } -} diff --git a/vid-webpack-master/src/app/shared/api.service.ts b/vid-webpack-master/src/app/shared/api.service.ts deleted file mode 100644 index a69d91ea4..000000000 --- a/vid-webpack-master/src/app/shared/api.service.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { Injectable } from '@angular/core'; - -@Injectable() -export class ApiService { - title = 'Angular 2'; -} diff --git a/vid-webpack-master/src/app/instantiationStatus/auditInfoModal/auditInfoModal.component.html b/vid-webpack-master/src/app/shared/components/auditInfoModal/auditInfoModal.component.html index 9386af347..1dad32376 100644 --- a/vid-webpack-master/src/app/instantiationStatus/auditInfoModal/auditInfoModal.component.html +++ b/vid-webpack-master/src/app/shared/components/auditInfoModal/auditInfoModal.component.html @@ -8,14 +8,14 @@ </div> <div class="modal-body row"> <div class="col-md-4 left-panel"> - <div id="service-model-name" class="row">SERVICE MODEL: {{serviceModelName}}</div> + <div id="service-model-name" class="row">{{type | uppercase}} MODEL: <span>{{serviceModelName}}</span></div> <div class="row service-model"> <model-information [modelInformationItems]="modelInfoItems"></model-information> </div> </div> <div class="col-md-8 right-panel"> - <div class="row"><span class="table-title">VID status</span></div> - <div class="row"> + <div class="row" *ngIf="showVidStatus"><span class="table-title">VID status</span></div> + <div class="row" *ngIf="showVidStatus"> <table id="service-instantiation-audit-info-vid" class="table table-bordered"> <thead class="thead-dark"> <tr class="row"> @@ -43,29 +43,36 @@ <div class="no-result" *ngIf="!isLoading && vidInfoData?.length == 0">There is no data.</div> </div> - <div class="row"><span class="table-title">MSO status</span></div> + <div class="row"> + <div class="col-md-6 leftColumn"><span class="table-title">MSO status</span></div> + <div class="col-md-6 rightColumn"><span><a id="glossary_link" target="_blank" href="#" (click)="onNavigate()">Building Block (BB) glossary</a></span></div> + </div> <table id="service-instantiation-audit-info-mso" class="table table-bordered"> <thead class="thead-dark row"> <tr class="row"> - <th class="col-md-3" scope="col">Request ID</th> - <th class="col-md-3" scope="col">Status</th> - <th class="col-md-3" scope="col">Status time</th> - <th class="col-md-3" scope="col">Additional info</th> + <th scope="col" class="request-id">Request ID</th> + <th *ngIf="isAlaCarte&&isALaCarteFlagOn" id="instanceName" class="col-md-2" scope="col">Instance Name</th> + <th class="col-md-2" scope="col">Status</th> + <th class="col-md-2" scope="col">Status time</th> + <th class="col-md-2" scope="col">Additional info</th> </tr> </thead> <tbody> <tr class="row" *ngFor="let data of msoInfoData"> - <td class="col-md-3" id="msoRequestId"> + <td id="msoRequestId" class="request-id"> <custom-ellipsis [id]="data?.requestId" [value]="data?.requestId"></custom-ellipsis> </td> - <td class="col-md-3" id="msoJobStatus"> + <td *ngIf="isAlaCarte && isALaCarteFlagOn" class="msoInstanceName col-md-2"> + <custom-ellipsis [id]="data?.instanceName" [value]="data?.instanceType + ': ' + data?.instanceName"></custom-ellipsis> + </td> + <td class="col-md-2" id="msoJobStatus"> <custom-ellipsis [id]="data?.jobStatus" [value]="data?.jobStatus | capitalizeAndFormat"></custom-ellipsis> </td> - <td class="col-md-3" id="msoStatusTime"> + <td class="col-md-2" id="msoStatusTime"> <custom-ellipsis [id]="data?.vidCreated" [value]="data?.createdDate | date:'MMM dd, yyyy HH:mm'"></custom-ellipsis> </td> - <td class="col-md-3" id="msoAdditionalInfo"> + <td class="col-md-2" id="msoAdditionalInfo"> <custom-ellipsis [id]="data?.additionalInfo" [value]="data?.additionalInfo"></custom-ellipsis> </td> </tr> @@ -73,9 +80,10 @@ </table> <div class="no-result" *ngIf="!isLoading && msoInfoData?.length == 0">There is no data.</div> </div> + </div> <div class="modal-footer row"> - <button id="cancelButton" type="button" class="btn btn-default cancel" (click)="onCancelClick()"> + <button style= "font-size: 12px" id="cancelButton" type="button" class="btn btn-default cancel" (click)="onCancelClick()"> Close </button> </div> diff --git a/vid-webpack-master/src/app/instantiationStatus/auditInfoModal/auditInfoModal.component.scss b/vid-webpack-master/src/app/shared/components/auditInfoModal/auditInfoModal.component.scss index 27b271496..f36b8b41d 100644 --- a/vid-webpack-master/src/app/instantiationStatus/auditInfoModal/auditInfoModal.component.scss +++ b/vid-webpack-master/src/app/shared/components/auditInfoModal/auditInfoModal.component.scss @@ -11,7 +11,14 @@ .modal{ #audit-info-modal { + .leftColumn { + padding-left: 0; + } + .rightColumn { + padding-right: 0; + text-align: right; + } .modal-content{ border-radius: 0px; border: none; @@ -82,7 +89,9 @@ overflow-x: auto; display: block; color: #5A5A5A; - + .request-id { + width: 85px; + } thead { position: sticky; top: 0; @@ -98,6 +107,9 @@ &:last-child{ border-right: none; } + &.request-id { + flex-grow: 0; + } } } } @@ -116,9 +128,13 @@ td { border: none; border-right: 1px solid #d2d2d2; + flex-grow: 1; &:last-child{ border-right: none; } + &.request-id { + flex-grow: 0; + } } } } diff --git a/vid-webpack-master/src/app/shared/components/auditInfoModal/auditInfoModal.component.service.spec.ts b/vid-webpack-master/src/app/shared/components/auditInfoModal/auditInfoModal.component.service.spec.ts new file mode 100644 index 000000000..35b5fbfe5 --- /dev/null +++ b/vid-webpack-master/src/app/shared/components/auditInfoModal/auditInfoModal.component.service.spec.ts @@ -0,0 +1,274 @@ + +import {HttpClientTestingModule, HttpTestingController} from "@angular/common/http/testing"; +import {getTestBed, TestBed} from "@angular/core/testing"; +import {NgRedux} from "@angular-redux/store"; +import {AuditInfoModalComponentService} from "./auditInfoModal.component.service"; +import {ModelInformationItem} from "../model-information/model-information.component"; + +class MockAppStore<T> { + getState() { + return { + "service": { + "serviceInstance": { + "6e59c5de-f052-46fa-aa7e-2fca9d674c44": { + "instanceParams": [], + "bulkSize": 1, + "action": "None", + "instanceName": "PQijmEmzhVma4zujr", + "instanceId": "service-instance-id", + "orchStatus": "GARBAGE DATA", + "productFamilyId": null, + "lcpCloudRegionId": null, + "tenantId": null, + "modelInfo": { + "modelInvariantId": "d27e42cf-087e-4d31-88ac-6c4b7585f800", + "modelVersionId": "6e59c5de-f052-46fa-aa7e-2fca9d674c44", + "modelName": "vf_vEPDG", + "modelType": "service", + "modelVersion": "5.0" + }, + "globalSubscriberId": "global-customer-id", + "subscriptionServiceType": "service-instance-type", + "owningEntityId": null, + "owningEntityName": null, + "tenantName": null, + "aicZoneId": null, + "aicZoneName": null, + "projectName": null, + "rollbackOnFailure": null, + "isALaCarte": false + } + }, + "subscribers": [ + { + "id": "CAR_2020_ER", + "name": "CAR_2020_ER", + "isPermitted": true + }, + { + "id": "21014aa2-526b-11e6-beb8-9e71128cae77", + "name": "JULIO ERICKSON", + "isPermitted": false + }, + { + "id": "global-customer-id", + "name": "DALE BRIDGES", + "isPermitted": false + }, + { + "id": "DHV1707-TestSubscriber-1", + "name": "LLOYD BRIDGES", + "isPermitted": false + }, + { + "id": "jimmy-example", + "name": "JimmyExampleCust-20161102", + "isPermitted": false + }, + { + "id": "jimmy-example2", + "name": "JimmyExampleCust-20161103", + "isPermitted": false + }, + { + "id": "ERICA5779-TestSub-PWT-102", + "name": "ERICA5779-TestSub-PWT-102", + "isPermitted": false + }, + { + "id": "ERICA5779-TestSub-PWT-101", + "name": "ERICA5779-TestSub-PWT-101", + "isPermitted": false + }, + { + "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb", + "name": "Emanuel", + "isPermitted": false + }, + { + "id": "ERICA5779-Subscriber-4", + "name": "ERICA5779-Subscriber-5", + "isPermitted": false + }, + { + "id": "ERICA5779-TestSub-PWT-103", + "name": "ERICA5779-TestSub-PWT-103", + "isPermitted": false + }, + { + "id": "ERICA5779-Subscriber-2", + "name": "ERICA5779-Subscriber-2", + "isPermitted": false + }, + { + "id": "e433710f-9217-458d-a79d-1c7aff376d89", + "name": "SILVIA ROBBINS", + "isPermitted": true + }, + { + "id": "ERICA5779-Subscriber-3", + "name": "ERICA5779-Subscriber-3", + "isPermitted": false + }, + { + "id": "31739f3e-526b-11e6-beb8-9e71128cae77", + "name": "CRAIG/ROBERTS", + "isPermitted": false + } + ] + } + } + } +} + +describe("Audit info modal component service", () => { + let injector; + let httpMock: HttpTestingController; + let auditInfoModalComponentService: AuditInfoModalComponentService; + + + beforeAll(done => (async () => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + providers: [ + AuditInfoModalComponentService, + {provide: NgRedux, useClass: MockAppStore} + ] + }); + await TestBed.compileComponents(); + + injector = getTestBed(); + httpMock = injector.get(HttpTestingController); + auditInfoModalComponentService = injector.get(AuditInfoModalComponentService); + + })().then(done).catch(done.fail)); + + + test('auditInfoModalComponentService service should be defined', () => { + expect(auditInfoModalComponentService).toBeDefined(); + }); + + test('getModelInfo: VNF information from existing instance with model', () => { + const model = getVNFModel(); + const instance = getVNFInstance(); + const results: ModelInformationItem[] = auditInfoModalComponentService.getModelInfo(model, instance, "6e59c5de-f052-46fa-aa7e-2fca9d674c44"); + expect(results.find((item) => item.label === 'Model customization ID').values[0]).toEqual("91415b44-753d-494c-926a-456a9172bbb9"); + expect(results.find((item) => item.label === 'Model version').values[0]).toEqual("2.0"); + expect(results.find((item) => item.label === 'Model name').values[0]).toEqual("VF_vMee"); + expect(results.find((item) => item.label === 'Instance name').values[0]).toEqual("4O61SmpFAdCm1oVEs"); + expect(results.find((item) => item.label === 'Instance ID').values[0]).toEqual("66cbb3b5-c823-470c-9520-4e0b85112250"); + expect(results.find((item) => item.label === 'Subscriber name').values[0]).toEqual("DALE BRIDGES"); // TODO should call subscriber + expect(results.find((item) => item.label === 'Service type').values[0]).toEqual("service-instance-type"); + }); + + test('getModelInfo: Network information from existing instance without model', () => { + const model = getNetworkModel(); + const instance = getNetworkInstance(); + const results: ModelInformationItem[] = auditInfoModalComponentService.getModelInfo(model, instance, "6e59c5de-f052-46fa-aa7e-2fca9d674c44"); + expect(results.find((item) => item.label === 'Instance name').values[0]).toEqual("KADmyK6e3sVWNfGbA"); + expect(results.find((item) => item.label === 'Instance ID').values[0]).toEqual("712cad2d-fc1c-40c7-aaff-d2d6e17ac2b6"); + expect(results.find((item) => item.label === 'Subscriber name').values[0]).toEqual("DALE BRIDGES"); // TODO should call subscriber + expect(results.find((item) => item.label === 'Service type').values[0]).toEqual("service-instance-type"); + }); + + test('getModelInfo: VFModule information from existing instance with model', () => { + const model = getVFModule(); + const instance = getVFModuleInstance(); + const results: ModelInformationItem[] = auditInfoModalComponentService.getModelInfo(model, instance, "6e59c5de-f052-46fa-aa7e-2fca9d674c44"); + expect(results.find((item) => item.label === 'Model customization ID').values[0]).toEqual("55b1be94-671a-403e-a26c-667e9c47d091"); + expect(results.find((item) => item.label === 'Model version').values[0]).toEqual("2"); + expect(results.find((item) => item.label === 'Model name').values[0]).toEqual("VfVmee..vmme_vlc..module-1"); + expect(results.find((item) => item.label === 'Instance name').values[0]).toEqual("ss820f_0918_db"); + expect(results.find((item) => item.label === 'Instance ID').values[0]).toEqual("2c1ca484-cbc2-408b-ab86-25a2c15ce280"); + expect(results.find((item) => item.label === 'Subscriber name').values[0]).toEqual("DALE BRIDGES"); // TODO should call subscriber + expect(results.find((item) => item.label === 'Service type').values[0]).toEqual("service-instance-type"); + }); + + test('getModelInfo: VNFGroup information from existing instance with model', () => { + const model = getVNFGroupModel(); + const instance = getVNFGroupInstance(); + const results: ModelInformationItem[] = auditInfoModalComponentService.getModelInfo(model, instance, "6e59c5de-f052-46fa-aa7e-2fca9d674c44"); + expect(results.find((item) => item.label === 'Model version').values[0]).toEqual("1"); + expect(results.find((item) => item.label === 'Model name').values[0]).toEqual("groupingservicefortest..ResourceInstanceGroup..0"); + expect(results.find((item) => item.label === 'Instance name').values[0]).toEqual("VNF_GROUP1_INSTANCE_NAME"); + expect(results.find((item) => item.label === 'Instance ID').values[0]).toEqual("VNF_GROUP1_INSTANCE_ID"); + expect(results.find((item) => item.label === 'Subscriber name').values[0]).toEqual("DALE BRIDGES"); // TODO should call subscriber + expect(results.find((item) => item.label === 'Service type').values[0]).toEqual("service-instance-type"); + }); + + + test('setModalTitlesType: should return modal title', () => { + expect(AuditInfoModalComponentService.setModalTitle('VNF')).toEqual('VNF Instantiation Information'); + expect(AuditInfoModalComponentService.setModalTitle('VFMODULE')).toEqual('VfModule Instantiation Information'); + expect(AuditInfoModalComponentService.setModalTitle('NETWORK')).toEqual('Network Instantiation Information'); + expect(AuditInfoModalComponentService.setModalTitle('VNFGROUP')).toEqual('Vnf Group Instantiation Information'); + }); + + test('setModalTitlesType: should return modal title type', () => { + expect(AuditInfoModalComponentService.setModalTitlesType('VNF')).toEqual('VNF'); + expect(AuditInfoModalComponentService.setModalTitlesType('VFMODULE')).toEqual('VfModule'); + expect(AuditInfoModalComponentService.setModalTitlesType('NETWORK')).toEqual('Network'); + expect(AuditInfoModalComponentService.setModalTitlesType('VNFGROUP')).toEqual('Vnf Group'); + }); + + test('getInstanceModelName: should return model name if exist', () => { + expect(AuditInfoModalComponentService.getInstanceModelName({name : 'some name'})).toEqual('some name'); + expect(AuditInfoModalComponentService.getInstanceModelName(null)).toEqual(''); + }); + + test('createModelInformationItemsJob: should return job information', () => { + let service = { + "uuid": "6e59c5de-f052-46fa-aa7e-2fca9d674c44", + "invariantUuid": "cfef8302-d90f-475f-87cc-3f49a62ef14c", + "name": "ComplexService", + "version": "1.0", + "toscaModelURL": null, + "category": "Emanuel", + "serviceType": "", + "serviceRole": "", + "description": "ComplexService", + "serviceEcompNaming": "true", + "instantiationType": "Macro", + "inputs": {}, + "vidNotions": { + "instantiationUI": "legacy", + "modelCategory": "other", + "viewEditUI": "legacy" + } + }; + const results = AuditInfoModalComponentService.createModelInformationItemsJob(<any>service); + }); + + + function getVNFModel(){ + return {"name":"VF_vMee","version":"2.0","description":"VSP_vMee","uuid":"d6557200-ecf2-4641-8094-5393ae3aae60","invariantUuid":"4160458e-f648-4b30-a176-43881ffffe9e","max":1,"min":0,"customizationUuid":"91415b44-753d-494c-926a-456a9172bbb9","isEcompGeneratedNaming":true,"type":"VF","modelCustomizationName":"VF_vMee 0","vfcInstanceGroups":{},"properties":{"gpb2_Internal2_mac":"00:11:22:EF:AC:DF","sctp-a-ipv6-egress_rule_application":"any","sctp-b-ipv6-egress_src_start_port":"0","Internal2_allow_transit":"true","sctp-b-IPv6_ethertype":"IPv6","ncb2_Internal1_mac":"00:11:22:EF:AC:DF","sctp-b-ingress_rule_protocol":"icmp","sctp-b-ingress_action":"pass","sctp-a-egress_rule_application":"any","sctp-b-ipv6-ingress-src_start_port":"0.0","ncb1_Internal2_mac":"00:11:22:EF:AC:DF","sctp-b-egress_src_addresses":"local","fsb_volume_size_0":"320.0","sctp-a-ipv6-ingress-dst_start_port":"0","sctp-a-ipv6-ingress_ethertype":"IPv4","sctp-b-ipv6-ingress_rule_application":"any","domain_name":"default-domain","sctp-a-egress_src_addresses":"local","sctp-b-egress-src_start_port":"0.0","sctp-a-ingress_rule_protocol":"icmp","sctp-b-display_name":"epc-sctp-b-ipv4v6-sec-group","sctp-b-ipv6-ingress-dst_end_port":"65535","sctp-a-ingress_ethertype":"IPv4","sctp-a-egress-src_start_port":"0.0","sctp-b-dst_subnet_prefix_v6":"::","nf_naming":"{ecomp_generated_naming=true}","sctp-a-ipv6-ingress_src_subnet_prefix":"0.0.0.0","sctp-b-egress-dst_start_port":"0.0","ncb_flavor_name":"nv.c20r64d1","sctp-b-egress_dst_subnet_prefix_len":"0.0","gpb1_Internal1_mac":"00:11:22:EF:AC:DF","Internal2_net_cidr":"10.0.0.10","sctp-a-ingress-dst_start_port":"0.0","fsb1_Internal2_mac":"00:11:22:EF:AC:DF","sctp-a-egress-dst_start_port":"0.0","sctp-a-egress_ethertype":"IPv4","vlc_st_service_mode":"in-network-nat","sctp-a-ipv6-egress_ethertype":"IPv4","sctp-a-egress-src_end_port":"65535.0","sctp-b-egress_action":"pass","sctp-b-ipv6-egress_rule_application":"any","sctp-a-ingress-src_subnet_prefix_len":"0.0","sctp-b-ipv6-ingress-src_end_port":"65535.0","sctp-a-ipv6-ingress-src_start_port":"0.0","fsb2_Internal1_mac":"00:11:22:EF:AC:DF","sctp-b-name":"epc-sctp-b-ipv4v6-sec-group","sctp-b-ipv6-egress_ethertype":"IPv4","Internal1_net_cidr":"10.0.0.10","sctp-a-egress_dst_subnet_prefix":"0.0.0.0","fsb_flavor_name":"nv.c20r64d1","sctp_rule_protocol":"132","sctp-a-ipv6-ingress_rule_application":"any","sctp-b-ipv6-ingress_src_subnet_prefix_len":"0","ecomp_generated_naming":"true","sctp-a-IPv6_ethertype":"IPv6","vlc_st_virtualization_type":"virtual-machine","vlc2_Internal1_mac":"00:11:22:EF:AC:DF","sctp-b-ingress-dst_end_port":"65535.0","sctp-b-ingress-dst_start_port":"0.0","sctp-a-ipv6-ingress-src_end_port":"65535.0","sctp-a-display_name":"epc-sctp-a-ipv4v6-sec-group","sctp-b-ingress_rule_application":"any","vlc_flavor_name":"nd.c16r64d1","int2_sec_group_name":"int2-sec-group","sctp-b-ipv6-egress_src_addresses":"local","vlc_st_interface_type_int1":"other1","vlc_st_interface_type_int2":"other2","sctp-a-ipv6-egress-dst_start_port":"0","sctp-b-egress-src_end_port":"65535.0","sctp-a-ipv6-egress_dst_subnet_prefix_len":"0","Internal2_shared":"false","sctp-a-ipv6-egress_rule_protocol":"any","Internal2_rpf":"disable","vlc1_Internal1_mac":"00:11:22:EF:AC:DF","sctp-b-ipv6-egress_src_end_port":"65535","sctp-a-ipv6-egress_src_addresses":"local","sctp-a-ingress-dst_end_port":"65535.0","sctp-a-ipv6-egress_src_end_port":"65535","Internal1_forwarding_mode":"l2","Internal2_dhcp":"false","sctp-a-dst_subnet_prefix_v6":"::","pxe_image_name":"MME_PXE-Boot_16ACP04_GA.qcow2","vlc_st_interface_type_gtp":"other0","ncb1_Internal1_mac":"00:11:22:EF:AC:DF","sctp-b-src_subnet_prefix_v6":"::","sctp-a-egress_dst_subnet_prefix_len":"0.0","int1_sec_group_name":"int1-sec-group","Internal1_dhcp":"false","fsb2_Internal2_mac":"00:11:22:EF:AC:DF","Internal2_forwarding_mode":"l2","sctp-a-ipv6-egress_dst_end_port":"65535","sctp-b-egress_dst_subnet_prefix":"0.0.0.0","Internal1_net_cidr_len":"17","gpb2_Internal1_mac":"00:11:22:EF:AC:DF","sctp-a-ingress_dst_addresses":"local","sctp-b-ingress-src_subnet_prefix_len":"0.0","sctp-a-egress_action":"pass","fsb_volume_type_0":"SF-Default-SSD","ncb2_Internal2_mac":"00:11:22:EF:AC:DF","vlc_st_interface_type_sctp_a":"left","vlc_st_version":"2","sctp-a-src_subnet_prefix_v6":"::","vlc_st_interface_type_sctp_b":"right","sctp-a-ingress_rule_application":"any","sctp-b-egress_ethertype":"IPv4","sctp-a-ipv6-egress_src_start_port":"0","instance_ip_family_v6":"v6","gpb1_Internal2_mac":"00:11:22:EF:AC:DF","sctp-b-ingress-src_start_port":"0.0","fsb1_Internal1_mac":"00:11:22:EF:AC:DF","sctp-b-ingress_dst_addresses":"local","vlc_st_interface_type_oam":"management","multi_stage_design":"false","oam_sec_group_name":"oam-sec-group","Internal2_net_gateway":"10.0.0.10","sctp-a-ipv6-ingress-dst_end_port":"65535","Internal1_net_gateway":"10.0.0.10","sctp-b-ipv6-egress-dst_start_port":"0","sctp-b-ipv6-egress_rule_protocol":"any","gtp_sec_group_name":"gtp-sec-group","sctp-a-ipv6-egress_dst_subnet_prefix":"0.0.0.0","sctp-a-ipv6-ingress_dst_addresses":"local","sctp-b-ipv6-egress_dst_subnet_prefix_len":"0","sctp-b-ipv6-egress_action":"pass","sctp-a-egress_rule_protocol":"icmp","sctp-a-ipv6-egress_action":"pass","Internal1_shared":"false","sctp-b-ipv6-ingress_rule_protocol":"any","Internal2_net_cidr_len":"17","sctp-a-name":"epc-sctp-a-ipv4v6-sec-group","sctp-a-ingress-src_end_port":"65535.0","sctp-b-ipv6-ingress_src_subnet_prefix":"0.0.0.0","sctp-a-egress-dst_end_port":"65535.0","sctp-b-egress_rule_protocol":"icmp","sctp-a-ingress_action":"pass","sctp-b-ipv6-ingress_action":"pass","vlc_st_service_type":"firewall","sctp-b-ipv6-egress_dst_end_port":"65535","vlc2_Internal2_mac":"00:11:22:EF:AC:DF","sctp-b-ipv6-ingress-dst_start_port":"0","vlc_st_availability_zone":"true","sctp-b-ingress-src_subnet_prefix":"0.0.0.0","fsb_volume_image_name_1":"MME_FSB2_16ACP04_GA.qcow2","sctp-a-ipv6-ingress_src_subnet_prefix_len":"0","gpb_flavor_name":"nv.c20r64d1","Internal1_allow_transit":"true","availability_zone_max_count":"1","fsb_volume_image_name_0":"MME_FSB1_16ACP04_GA.qcow2","sctp-b-ipv6-ingress_dst_addresses":"local","sctp-b-ipv6-ingress_ethertype":"IPv4","sctp-b-ipv6-egress_dst_subnet_prefix":"0.0.0.0","sctp-a-ingress-src_subnet_prefix":"0.0.0.0","vlc1_Internal2_mac":"00:11:22:EF:AC:DF","sctp-a-ipv6-ingress_action":"pass","Internal1_rpf":"disable","sctp-b-ingress_ethertype":"IPv4","sctp-b-ingress-src_end_port":"65535.0","sctp-b-egress_rule_application":"any","sctp-a-ipv6-ingress_rule_protocol":"any","sctp-a-ingress-src_start_port":"0.0","sctp-b-egress-dst_end_port":"65535.0"}}; + } + + function getVNFInstance(){ + return {"action":"None","instanceName":"4O61SmpFAdCm1oVEs","instanceId":"66cbb3b5-c823-470c-9520-4e0b85112250","orchStatus":null,"productFamilyId":null,"lcpCloudRegionId":null,"tenantId":null,"modelInfo":{"modelCustomizationName":"VF_vMee 0","modelInvariantId":"vnf-instance-model-invariant-id","modelVersionId":"d6557200-ecf2-4641-8094-5393ae3aae60","modelType":"vnf"},"instanceType":"7538ifdSoTccmbEkr","provStatus":null,"inMaint":true,"uuid":"d6557200-ecf2-4641-8094-5393ae3aae60","originalName":"VF_vMee 0","legacyRegion":null,"lineOfBusiness":null,"platformName":null,"trackById":"VF_vMee 0:004","vfModules":{"vf_vmee0..VfVmee..vmme_vlc..module-1":{"vf_vmee0..VfVmee..vmme_vlc..module-1:008":{"action":"None","instanceName":"ss820f_0918_db","instanceId":"2c1ca484-cbc2-408b-ab86-25a2c15ce280","orchStatus":"deleted","productFamilyId":null,"lcpCloudRegionId":null,"tenantId":null,"modelInfo":{"modelCustomizationName":"VfVmee..vmme_vlc..module-1","modelCustomizationId":"b200727a-1bf9-4e7c-bd06-b5f4c9d920b9","modelInvariantId":"09edc9ef-85d0-4b26-80de-1f569d49e750","modelVersionId":"522159d5-d6e0-4c2a-aa44-5a542a12a830","modelType":"vfModule"},"instanceType":null,"provStatus":null,"inMaint":true,"uuid":"522159d5-d6e0-4c2a-aa44-5a542a12a830","originalName":"VfVmee..vmme_vlc..module-1","legacyRegion":null,"lineOfBusiness":null,"platformName":null,"trackById":"vf_vmee0..VfVmee..vmme_vlc..module-1:008","isBase":false,"volumeGroupName":null}},"dc229cd8-c132-4455-8517-5c1787c18b14":{"dc229cd8-c132-4455-8517-5c1787c18b14:009":{"action":"None","instanceName":"ss820f_0918_base","instanceId":"3ef042c4-259f-45e0-9aba-0989bd8d1cc5","orchStatus":"Assigned","productFamilyId":null,"lcpCloudRegionId":null,"tenantId":null,"modelInfo":{"modelCustomizationId":"8ad8670b-0541-4499-8101-275bbd0e8b6a","modelInvariantId":"1e463c9c-404d-4056-ba56-28fd102608de","modelVersionId":"dc229cd8-c132-4455-8517-5c1787c18b14","modelType":"vfModule"},"instanceType":null,"provStatus":null,"inMaint":false,"uuid":"dc229cd8-c132-4455-8517-5c1787c18b14","originalName":null,"legacyRegion":null,"lineOfBusiness":null,"platformName":null,"trackById":"dc229cd8-c132-4455-8517-5c1787c18b14:009","isBase":true,"volumeGroupName":null}}},"networks":{}}; + } + + function getVFModule(){ + return {"uuid":"522159d5-d6e0-4c2a-aa44-5a542a12a830","invariantUuid":"98a7c88b-b577-476a-90e4-e25a5871e02b","customizationUuid":"55b1be94-671a-403e-a26c-667e9c47d091","description":null,"name":"VfVmee..vmme_vlc..module-1","version":"2","modelCustomizationName":"VfVmee..vmme_vlc..module-1","properties":{"minCountInstances":0,"maxCountInstances":null,"initialCount":0,"vfModuleLabel":"vmme_vlc","baseModule":false},"inputs":{},"volumeGroupAllowed":false}; + } + + function getVFModuleInstance() { + return{"action":"None","instanceName":"ss820f_0918_db","instanceId":"2c1ca484-cbc2-408b-ab86-25a2c15ce280","orchStatus":"deleted","productFamilyId":null,"lcpCloudRegionId":null,"tenantId":null,"modelInfo":{"modelCustomizationName":"VfVmee..vmme_vlc..module-1","modelCustomizationId":"b200727a-1bf9-4e7c-bd06-b5f4c9d920b9","modelInvariantId":"09edc9ef-85d0-4b26-80de-1f569d49e750","modelVersionId":"522159d5-d6e0-4c2a-aa44-5a542a12a830","modelType":"vfModule"},"instanceType":null,"provStatus":null,"inMaint":true,"uuid":"522159d5-d6e0-4c2a-aa44-5a542a12a830","originalName":"VfVmee..vmme_vlc..module-1","legacyRegion":null,"lineOfBusiness":null,"platformName":null,"trackById":"vf_vmee0..VfVmee..vmme_vlc..module-1:008","isBase":false,"volumeGroupName":null}; + } + + function getNetworkModel(){ + return null; + } + + function getNetworkInstance(){ + return {"action":"None","instanceName":"KADmyK6e3sVWNfGbA","instanceId":"712cad2d-fc1c-40c7-aaff-d2d6e17ac2b6","orchStatus":"Assigned","productFamilyId":null,"lcpCloudRegionId":null,"tenantId":null,"modelInfo":{"modelInvariantId":"network-instance-model-invariant-id","modelVersionId":"ddc3f20c-08b5-40fd-af72-c6d14636b986","modelType":"network"},"instanceType":"CONTRAIL30_BASIC","provStatus":"nvtprov","inMaint":false,"uuid":"ddc3f20c-08b5-40fd-af72-c6d14636b986","originalName":null,"legacyRegion":null,"lineOfBusiness":null,"platformName":null,"trackById":"ddc3f20c-08b5-40fd-af72-c6d14636b986:001"}; + } + + function getVNFGroupModel(){ + return {"name":"groupingservicefortest..ResourceInstanceGroup..0","version":"1","uuid":"daeb6568-cef8-417f-9075-ed259ce59f48","invariantUuid":"4bb2e27e-ddab-4790-9c6d-1f731bc14a45","max":1,"min":0,"isEcompGeneratedNaming":true,"type":"VnfGroup","modelCustomizationName":"groupingservicefortest..ResourceInstanceGroup..0","properties":{"contained_resource_type":"VF","role":"SERVICE-ACCESS","function":"DATA","description":"DDD0","type":"LOAD-GROUP","ecomp_generated_naming":"true"},"members":{"vdbe_svc_vprs_proxy 0":{"uuid":"65fadfa8-a0d9-443f-95ad-836cd044e26c","invariantUuid":"f4baae0c-b3a5-4ca1-a777-afbffe7010bc","description":"A Proxy for Service vDBE_Svc_vPRS","name":"vDBE_Svc_vPRS Service Proxy","version":"1.0","customizationUuid":"bdb63d23-e132-4ce7-af2c-a493b4cafac9","inputs":{},"commands":{},"properties":{"ecomp_generated_naming":"false"},"type":"Service Proxy","sourceModelUuid":"da7827a2-366d-4be6-8c68-a69153c61274","sourceModelInvariant":"24632e6b-584b-4f45-80d4-fefd75fd9f14","sourceModelName":"vDBE_Svc_vPRS"}}}; + } + + function getVNFGroupInstance(){ + return {"originalName":"groupingservicefortest..ResourceInstanceGroup..0","trackById":"groupingservicefortest..ResourceInstanceGroup..0:001","instanceName":"VNF_GROUP1_INSTANCE_NAME","action":"None","instanceId":"VNF_GROUP1_INSTANCE_ID","instanceType":"VNF_GROUP1_INSTANCE_TYPE","orchStatus":"Active","provStatus":null,"inMaint":false,"modelInfo":{"modelType":"instanceGroup","modelCustomizationName":"groupingservicefortest..ResourceInstanceGroup..0","modelInvariantId":"4bb2e27e-ddab-4790-9c6d-1f731bc14a45","modelVersionId":"daeb6568-cef8-417f-9075-ed259ce59f48"},"uuid":"daeb6568-cef8-417f-9075-ed259ce59f48","vnfs":{}}; + } +}); diff --git a/vid-webpack-master/src/app/shared/components/auditInfoModal/auditInfoModal.component.service.ts b/vid-webpack-master/src/app/shared/components/auditInfoModal/auditInfoModal.component.service.ts new file mode 100644 index 000000000..cd36ece25 --- /dev/null +++ b/vid-webpack-master/src/app/shared/components/auditInfoModal/auditInfoModal.component.service.ts @@ -0,0 +1,79 @@ +import {Injectable} from "@angular/core"; +import {ModelInformationItem} from "../model-information/model-information.component"; +import {NgRedux} from "@angular-redux/store"; +import {AppState} from "../../store/reducers"; +import {Subscriber} from "../../models/subscriber"; +import {ServiceInfoModel} from "../../server/serviceInfo/serviceInfo.model"; +import * as _ from 'lodash'; + +@Injectable() +export class AuditInfoModalComponentService { + constructor(private _store: NgRedux<AppState>){} + + getModelInfo(model, instance, serviceModelId: string): ModelInformationItem[] { + const serviceInstance = this._store.getState().service.serviceInstance[serviceModelId]; + const modelInformation = !_.isNil(model) ? [ + new ModelInformationItem('Model name', 'model_name', [model.name]), + new ModelInformationItem('Model version', 'model_version', [model.version]), + new ModelInformationItem('Model customization ID', 'model_customization_ID', [model.customizationUuid]), + new ModelInformationItem('Base module', 'base_module', [!_.isNil(model.properties) ? model.properties.baseModule : null]) + ] : []; + + const instanceInfo = !_.isNil(instance) ? [ + new ModelInformationItem('Instance name', 'instance_name', [instance.instanceName]), + new ModelInformationItem('Instance ID', 'instance_ID', [instance.instanceId]) + ] : []; + + const serviceInfo = !_.isNil(serviceInstance) ? [ + new ModelInformationItem("Subscriber name", "subscriberName", [this.extractSubscriberNameBySubscriberId(serviceInstance.globalSubscriberId, this._store)]), + new ModelInformationItem('Service type', 'service_type', [serviceInstance.subscriptionServiceType]) + ] : []; + + const result = [modelInformation, instanceInfo, serviceInfo]; + return _.uniq(_.flatten(result)); + } + + static createModelInformationItemsJob(serviceModel: ServiceInfoModel): ModelInformationItem[] { + return [ + new ModelInformationItem('Subscriber name', 'subscriberName', [serviceModel.subscriberName]), + new ModelInformationItem('Service type', 'serviceType', [serviceModel.serviceType]), + new ModelInformationItem('Service model version', 'serviceModelVersion', [serviceModel.serviceModelVersion]), + new ModelInformationItem('Service instance name', 'serviceInstanceName', [serviceModel.serviceInstanceName || 'Automatically generated'], '', true), + new ModelInformationItem('Service instance ID', 'serviceInstanceId', [serviceModel.serviceInstanceId]), + new ModelInformationItem('Requestor User ID', 'userId', [serviceModel.userId]), + ]; + } + + static getInstanceModelName(model) : string { + return !_.isNil(model) && model.name ? model.name : ''; + } + + static setModalTitlesType(type : string) : string { + return !_.isNil(type) ? AuditInfoModalComponentService.getTypeMap()[type] : 'Service' ; + } + + static getTypeMap(){ + return { + SERVICE : 'Service', + VNFGROUP : 'Vnf Group', + NETWORK : 'Network', + VFMODULE : 'VfModule', + VNF : 'VNF' + }; + } + + static setModalTitle(type : string) : string { + return !_.isNil(type) ? (AuditInfoModalComponentService.getTypeMap()[type] + " Instantiation Information") : 'Service Instantiation Information'; + } + + extractSubscriberNameBySubscriberId(subscriberId: string, store: NgRedux<AppState>) { + let result: string = null; + let filteredArray: any = _.filter(store.getState().service.subscribers, function (o: Subscriber) { + return o.id === subscriberId + }); + if (filteredArray.length > 0) { + result = filteredArray[0].name; + } + return result; + } +} diff --git a/vid-webpack-master/src/app/shared/components/auditInfoModal/auditInfoModal.component.spec.ts b/vid-webpack-master/src/app/shared/components/auditInfoModal/auditInfoModal.component.spec.ts new file mode 100644 index 000000000..ecce68daf --- /dev/null +++ b/vid-webpack-master/src/app/shared/components/auditInfoModal/auditInfoModal.component.spec.ts @@ -0,0 +1,203 @@ +import {ComponentFixture, TestBed} from '@angular/core/testing'; +import {ContextMenuModule, ContextMenuService} from 'ngx-contextmenu'; +import {CUSTOM_ELEMENTS_SCHEMA} from '@angular/core'; +import {AuditInfoModalComponent} from "./auditInfoModal.component"; +import {NgRedux} from "@angular-redux/store"; +import {FeatureFlagsService} from "../../services/featureFlag/feature-flags.service"; +import {AaiService} from "../../services/aaiService/aai.service"; +import {HttpClientTestingModule} from "@angular/common/http/testing"; +import {ScrollToModule} from "@nicky-lenaers/ngx-scroll-to"; +import {RouterTestingModule} from "@angular/router/testing"; +import {ModalModule} from "ngx-bootstrap"; +import {CapitalizeAndFormatPipe} from "../../pipes/capitalize/capitalize-and-format.pipe"; +import {ServiceInfoService} from "../../server/serviceInfo/serviceInfo.service"; +import {IframeService} from "../../utils/iframe.service"; +import {AuditInfoModalComponentService} from "./auditInfoModal.component.service"; +import {ServiceInfoModel} from "../../server/serviceInfo/serviceInfo.model"; +import {HttpClient} from '@angular/common/http'; +import {getTestBed} from "@angular/core/testing"; +import {of} from 'rxjs'; + +class MockAppStore<T> { + getState() { + return { + global: { + flags: { + 'FLAG_1902_NEW_VIEW_EDIT': true + } + }, + service: { + serviceInstance: {} + } + } + } + + dispatch() { + + } +} + + +describe('Audit Info Modal Component_serviceInfoService', () => { + let component: AuditInfoModalComponent; + let fixture: ComponentFixture<AuditInfoModalComponent>; + let _serviceInfoService: ServiceInfoService; + let injector; + beforeAll(done => (async () => { + + TestBed.configureTestingModule({ + imports: [ + HttpClientTestingModule, + ContextMenuModule, + ScrollToModule.forRoot(), + RouterTestingModule, + ModalModule.forRoot() + ], + providers: [ + ServiceInfoService, + AaiService, + IframeService, + AuditInfoModalComponentService, + ContextMenuService, + FeatureFlagsService, + {provide: NgRedux, useClass: MockAppStore} + ], + declarations: [AuditInfoModalComponent, CapitalizeAndFormatPipe], + schemas: [CUSTOM_ELEMENTS_SCHEMA] + }); + await TestBed.compileComponents(); + + injector = getTestBed(); + _serviceInfoService = injector.get(ServiceInfoService); + fixture = TestBed.createComponent(AuditInfoModalComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + })().then(done).catch(done.fail)); + + + test('component should be defined', () => { + expect(component).toBeDefined(); + }); + + test('setModalTitles should set modal title according to type', () => { + component.setModalTitles('VNF'); + expect(component.type).toEqual('VNF'); + expect(component.title).toEqual('VNF Instantiation Information'); + }); + + test('initializeProperties should init some component properties', () => { + component.initializeProperties(); + expect(component.modelInfoItems).toBeNull(); + expect(component.vidInfoData).toEqual([]); + expect(component.msoInfoData).toEqual([]); + expect(component.isLoading).toEqual(true); + }); + + test('openAuditInfoModal', () => { + const jobData: ServiceInfoModel = new ServiceInfoModel(); + spyOn(AuditInfoModalComponentService, 'createModelInformationItemsJob'); + spyOn(component, 'initAuditInfoData'); + spyOn(component.auditInfoModal, 'show'); + component.openAuditInfoModal(jobData); + + expect(AuditInfoModalComponentService.createModelInformationItemsJob).toHaveBeenCalledWith(jobData); + expect(component.initAuditInfoData).toHaveBeenCalledWith(jobData); + expect(component.auditInfoModal.show).toHaveBeenCalled(); + }); + + test('onCancelClick', () => { + spyOn(component, 'initializeProperties'); + spyOn(component.auditInfoModal, 'hide'); + component.onCancelClick(); + + expect(component.initializeProperties).toHaveBeenCalledWith(); + expect(component.auditInfoModal.hide).toHaveBeenCalled(); + }); + + test('openInstanceAuditInfoModal calls to getAuditStatusForRetry function', () => { + spyOn(component.auditInfoModalComponentService, 'getModelInfo').and.returnValue([]); + spyOn(component, 'initializeProperties'); + spyOn(component, 'setModalTitles'); + spyOn(component.auditInfoModal, 'show'); + spyOn(_serviceInfoService, 'getAuditStatusForRetry'); + jest.spyOn(_serviceInfoService, 'getAuditStatusForRetry').mockReturnValue(of([])) + + spyOn(AuditInfoModalComponentService, 'getInstanceModelName'); + const instanceId: string = "instanceID"; + const type: string = 'VNF'; + const model = {}; + const instance = {}; + const isInstanceFailed: boolean = true; + const trackById = "trackById"; + + AuditInfoModalComponent.openInstanceAuditInfoModal.next({ + instanceId: instanceId, + type: type, + model: model, + instance: instance, + isInstanceFailed: isInstanceFailed, + trackById: trackById + }); + + expect(component.showVidStatus).toEqual(false); + expect(component.initializeProperties).toHaveBeenCalled(); + expect(component.setModalTitles).toHaveBeenCalled(); + expect(_serviceInfoService.getAuditStatusForRetry).toHaveBeenCalledWith(trackById); + expect(component.auditInfoModal.show).toHaveBeenCalled(); + expect(AuditInfoModalComponentService.getInstanceModelName).toHaveBeenCalledWith(model); + }); + + test('openInstanceAuditInfoModal calls to getInstanceAuditStatus function', () => { + spyOn(component.auditInfoModalComponentService, 'getModelInfo').and.returnValue([]); + spyOn(component, 'initializeProperties'); + spyOn(component, 'setModalTitles'); + spyOn(component.auditInfoModal, 'show'); + spyOn(_serviceInfoService, 'getAuditStatusForRetry'); + jest.spyOn(_serviceInfoService, 'getInstanceAuditStatus').mockReturnValue(of([])) + + spyOn(AuditInfoModalComponentService, 'getInstanceModelName'); + const instanceId: string = "instanceID"; + const type: string = 'VNF'; + const model = {}; + const instance = {}; + const isInstanceFailed: boolean = false; + const trackById = "trackById"; + + AuditInfoModalComponent.openInstanceAuditInfoModal.next({ + instanceId: instanceId, + type: type, + model: model, + instance: instance, + isInstanceFailed: isInstanceFailed, + trackById: trackById + }); + + expect(component.showVidStatus).toEqual(false); + expect(component.initializeProperties).toHaveBeenCalled(); + expect(component.setModalTitles).toHaveBeenCalled(); + expect(_serviceInfoService.getInstanceAuditStatus).toHaveBeenCalledWith(instanceId, type); + expect(component.auditInfoModal.show).toHaveBeenCalled(); + expect(AuditInfoModalComponentService.getInstanceModelName).toHaveBeenCalledWith(model); + }); + + test('openInstanceAuditInfoModal : openModal : with job data', () => { + spyOn(component.auditInfoModalComponentService, 'getModelInfo').and.returnValue([]); + spyOn(component, 'initializeProperties'); + spyOn(component.auditInfoModal, 'show'); + spyOn(AuditInfoModalComponentService, 'getInstanceModelName'); + const jobData: ServiceInfoModel = new ServiceInfoModel(); + jobData.aLaCarte = true; + AuditInfoModalComponent.openModal.next(jobData); + + expect(component.showVidStatus).toEqual(true); + expect(component.initializeProperties).toHaveBeenCalled(); + expect(component.auditInfoModal.show).toHaveBeenCalled(); + }); + + test('openInstanceAuditInfoModal : openModal : without job data', () => { + spyOn(component.auditInfoModal, 'hide'); + const jobData: ServiceInfoModel = null; + AuditInfoModalComponent.openModal.next(jobData); + expect(component.auditInfoModal.hide).toHaveBeenCalled(); + }); +}); diff --git a/vid-webpack-master/src/app/shared/components/auditInfoModal/auditInfoModal.component.ts b/vid-webpack-master/src/app/shared/components/auditInfoModal/auditInfoModal.component.ts new file mode 100644 index 000000000..cf385d767 --- /dev/null +++ b/vid-webpack-master/src/app/shared/components/auditInfoModal/auditInfoModal.component.ts @@ -0,0 +1,122 @@ +import {Component, ViewChild} from '@angular/core'; +import {Subject} from 'rxjs/Subject'; +import {ModalDirective} from 'ngx-bootstrap' +import {ModelInformationItem} from '../model-information/model-information.component'; +import {ServiceModel} from '../../models/serviceModel'; +import {ServiceInfoService} from '../../server/serviceInfo/serviceInfo.service'; +import {ServiceInfoModel} from '../../server/serviceInfo/serviceInfo.model'; +import {AuditStatus} from '../../server/serviceInfo/AuditStatus.model'; +import {IframeService} from "../../utils/iframe.service"; +import {NgRedux} from "@angular-redux/store"; +import {AppState} from "../../store/reducers"; +import {AuditInfoModalComponentService} from "./auditInfoModal.component.service"; + +@Component({ + selector: 'audit-info-modal', + templateUrl: './auditInfoModal.component.html', + styleUrls: ['./auditInfoModal.component.scss'] +}) +export class AuditInfoModalComponent { + static openModal: Subject<ServiceInfoModel> = new Subject<ServiceInfoModel>(); + static openInstanceAuditInfoModal: Subject<{instanceId , type, model, instance, isInstanceFailed?, trackById?}> = new Subject<{instanceId , type, model, instance, isInstanceFailed, trackById}>(); + @ViewChild('auditInfoModal') public auditInfoModal: ModalDirective; + title: string = 'Service Instantiation Information'; + modelInfoItems: ModelInformationItem[] = []; + serviceModel: ServiceModel; + serviceModelName: string; + vidInfoData: AuditStatus[] = []; + msoInfoData: AuditStatus[] = []; + isAlaCarte: boolean; + parentElementClassName = 'content'; + isLoading = true; + model: any; + instanceId: string; + isALaCarteFlagOn: boolean; + type : string = "Service"; + showVidStatus : boolean = true; + auditInfoModalComponentService : AuditInfoModalComponentService; + constructor(private _serviceInfoService: ServiceInfoService, private _iframeService : IframeService, + private _auditInfoModalComponentService : AuditInfoModalComponentService, + private store: NgRedux<AppState>) { + this.auditInfoModalComponentService = this._auditInfoModalComponentService; + AuditInfoModalComponent.openModal.subscribe((jobData: ServiceInfoModel) => { + this.isALaCarteFlagOn = this.store.getState().global.flags['FLAG_A_LA_CARTE_AUDIT_INFO']; + this.initializeProperties(); + this.showVidStatus = true; + if (jobData) { + this.isAlaCarte = jobData.aLaCarte; + this.openAuditInfoModal(jobData); + _iframeService.addClassOpenModal(this.parentElementClassName); + this.serviceModelName = jobData.serviceModelName ? jobData.serviceModelName : ''; + this.auditInfoModal.show(); + } else { + _iframeService.removeClassCloseModal(this.parentElementClassName); + this.auditInfoModal.hide(); + } + }); + + AuditInfoModalComponent.openInstanceAuditInfoModal.subscribe(({instanceId , type , model, instance, isInstanceFailed, trackById}) => { + this.showVidStatus = false; + this.initializeProperties(); + this.setModalTitles(type); + this.serviceModelName = AuditInfoModalComponentService.getInstanceModelName(model); + + if (isInstanceFailed) { + this._serviceInfoService.getAuditStatusForRetry(trackById).subscribe((res: AuditStatus) => { + this.msoInfoData = [res]; + }); + }else{ + this._serviceInfoService.getInstanceAuditStatus(instanceId, type).subscribe((res : AuditStatus[]) =>{ + this.msoInfoData = res; + }); + } + this.modelInfoItems = this.auditInfoModalComponentService.getModelInfo(model, instance, instanceId); + _iframeService.addClassOpenModal(this.parentElementClassName); + this.auditInfoModal.show(); + }); + } + + + setModalTitles(type : string) : void{ + this.type = AuditInfoModalComponentService.setModalTitlesType(type) ; + this.title = AuditInfoModalComponentService.setModalTitle(type); + } + + initializeProperties() : void { + this.modelInfoItems = null; + this.vidInfoData = []; + this.msoInfoData = []; + this.isLoading = true; + } + + openAuditInfoModal(jobData: ServiceInfoModel): void { + this.modelInfoItems = AuditInfoModalComponentService.createModelInformationItemsJob(jobData); + this.initAuditInfoData(jobData); + this.auditInfoModal.onHide.subscribe(()=>{ + this._iframeService.removeClassCloseModal(this.parentElementClassName); + this.initializeProperties(); + }); + this.auditInfoModal.show(); + } + + initAuditInfoData(jobData: ServiceInfoModel) { + this._serviceInfoService.getJobAuditStatus(jobData) + .subscribe((res: AuditStatus[][]) => { + this.vidInfoData = res[0]; + this.msoInfoData = res[1]; + this.isLoading = false; + }); + } + + onCancelClick() { + this._iframeService.removeClassCloseModal(this.parentElementClassName); + this.initializeProperties(); + this.auditInfoModal.hide(); + } + + + onNavigate(){ + window.open("https://wiki.onap.org/display/DW/SO+Building+blocks", "_blank"); + } +} + diff --git a/vid-webpack-master/src/app/shared/components/dynamic-inputs/dynamic-inputs.component.spec.ts b/vid-webpack-master/src/app/shared/components/dynamic-inputs/dynamic-inputs.component.spec.ts new file mode 100644 index 000000000..6194aad5e --- /dev/null +++ b/vid-webpack-master/src/app/shared/components/dynamic-inputs/dynamic-inputs.component.spec.ts @@ -0,0 +1,157 @@ +import {HttpClientTestingModule, HttpTestingController} from "@angular/common/http/testing"; +import {DynamicInputsComponent} from "./dynamic-inputs.component"; +import {async, ComponentFixture, getTestBed, TestBed} from "@angular/core/testing"; +import {CUSTOM_ELEMENTS_SCHEMA} from "@angular/core"; +import {FormBuilder, FormGroup, FormsModule, ReactiveFormsModule, ValidatorFn} from "@angular/forms"; +import {BrowserModule} from "@angular/platform-browser"; +import {CommonModule} from "@angular/common"; +import {RouterTestingModule} from "@angular/router/testing"; +import {DynamicInputLabelPipe} from "../../pipes/dynamicInputLabel/dynamic-input-label.pipe"; +import {DynamicNumber} from "../../models/dynamicInput"; + + +describe('DynamicInputs Component', () => { + let component: DynamicInputsComponent; + let fixture: ComponentFixture<DynamicInputsComponent>; + + beforeAll(done => (async () => { + TestBed.configureTestingModule({ + imports: [BrowserModule, CommonModule, FormsModule, HttpClientTestingModule, RouterTestingModule, ReactiveFormsModule], + declarations: [DynamicInputsComponent, DynamicInputLabelPipe], + providers : [FormBuilder], + schemas: [ CUSTOM_ELEMENTS_SCHEMA ] + }); + await TestBed.compileComponents(); + + fixture = TestBed.createComponent(DynamicInputsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + })().then(done).catch(done.fail)); + + test('should be defined', () => { + expect(component).toBeDefined(); + }); + + test('isDynamicNumber should return item', () => { + let options = { + minLength : 10, + maxLength : 10 + }; + + let dynamicNumber : DynamicNumber = new DynamicNumber(<any>options); + expect(component.isDynamicNumber(dynamicNumber)).toBeDefined(); + }); + + test('buildValidators should return validator', () => { + let options = { + minLength : 10, + maxLength : 10, + max : 10, + min : 1 + }; + + let dynamicNumber : DynamicNumber = new DynamicNumber(<any>options); + let validator : ValidatorFn = component.buildValidators(dynamicNumber); + expect(validator).toBeDefined(); + }); + + + test('ngOnInit', ()=>{ + component.group = new FormGroup({ + + }); + component.list = [ + { + type : 'select', + value : 'optionName', + name : 'multiSelectControl', + optionList : [{ + isDataLoading : true, + name : 'optionName', + id : 'id' + }] + }, + { + type : 'select', + value : 'optionName', + name : 'multiSelectControl', + optionList : [{ + isDataLoading : true, + name : 'optionName', + id : 'id' + }] + }, + { + type : 'multi_select', + value : 'optionName', + name : 'selectControl', + optionList : [{ + isDataLoading : true, + name : 'optionName', + id : 'id' + }] + }, + { + type : 'multi_select', + value : 'optionName', + name : 'selectControl', + optionList : [{ + isDataLoading : true, + name : 'optionName' + }] + }, + { + type : 'boolean', + value : true, + name : 'booleanControl' + }, + { + type : 'boolean', + name : 'booleanControl2' + }, + { + type : 'number', + value : 100, + name : 'numberControl' + }, + { + type : 'file', + value : 'someValue', + name : 'fileControl' + }, + { + type : 'checkbox', + value : true, + name : 'checkboxControl' + }, + { + type : 'map', + value : true, + name : 'mapControl' + }, + { + type : 'list', + value : true, + name : 'listControl' + }, + { + type : 'default', + value : true, + name : 'defaultControl' + } + ]; + + component.ngOnInit(); + expect(component.group.controls['multiSelectControl'].value).toEqual('id'); + expect(component.group.controls['selectControl'].value).toEqual('optionName'); + expect(component.group.controls['booleanControl'].value).toEqual(true); + expect(component.group.controls['booleanControl2'].value).toEqual(false); + expect(component.group.controls['numberControl'].value).toEqual(100); + expect(component.group.controls['fileControl'].value).toEqual('someValue'); + expect(component.group.controls['checkboxControl'].value).toEqual(true); + expect(component.group.controls['mapControl'].value).toEqual(true); + expect(component.group.controls['listControl'].value).toEqual(true); + expect(component.group.controls['defaultControl'].value).toEqual(true); + }) + +}); diff --git a/vid-webpack-master/src/app/components/dynamic-inputs/dynamic-inputs.component.ts b/vid-webpack-master/src/app/shared/components/dynamic-inputs/dynamic-inputs.component.ts index 921c923df..096a51eb7 100644 --- a/vid-webpack-master/src/app/components/dynamic-inputs/dynamic-inputs.component.ts +++ b/vid-webpack-master/src/app/shared/components/dynamic-inputs/dynamic-inputs.component.ts @@ -1,6 +1,6 @@ import {Component, Input, OnInit} from '@angular/core'; import {FormControl, FormGroup, Validators} from "@angular/forms"; -import {DynamicInput, DynamicMultiSelect, DynamicNumber, DynamicSelect} from "../../shared/models/dynamicInput"; +import {DynamicInput, DynamicMultiSelect, DynamicNumber, DynamicSelect} from "../../models/dynamicInput"; @Component({ selector: 'dynamic-inputs', diff --git a/vid-webpack-master/src/app/components/dynamic-inputs/dynamic-inputs.html b/vid-webpack-master/src/app/shared/components/dynamic-inputs/dynamic-inputs.html index a933364e2..740b798e4 100644 --- a/vid-webpack-master/src/app/components/dynamic-inputs/dynamic-inputs.html +++ b/vid-webpack-master/src/app/shared/components/dynamic-inputs/dynamic-inputs.html @@ -1,6 +1,6 @@ <div *ngFor="let item of dynamicList"> <div id="{{item.id}}" class="details-item" [ngSwitch]="item.type" [formGroup]="group" [hidden]="!item.isVisible"> - <label>{{item.name | dynamicInputLabel }}</label> + <label [ngClass]="{'required' : item.isRequired && item.isVisible}">{{item.name | dynamicInputLabel }}</label> <select *ngSwitchCase="item.type === 'select'|| item.type === 'boolean'? item.type: ''" name="{{item.name}}" class="form-control input-text" [formControlName]="item.name" title="{{item.description}}" [required]="item.isRequired && item.isVisible" maxlength="{{item.maxLength}}" minlength="{{item.minLength}}"> <option value="null" [selected]="item.value == null || item.value == undefined" hidden disabled>{{item.prompt}}</option> <option *ngFor="let option of item.optionList" [ngValue]="option.id || option.name" [disabled]="!option.isPermitted" [selected]="option.isDataLoading">{{option.name}}</option> diff --git a/vid-webpack-master/src/app/components/dynamic-inputs/dynamic-inputs.scss b/vid-webpack-master/src/app/shared/components/dynamic-inputs/dynamic-inputs.scss index 11a141420..11a141420 100644 --- a/vid-webpack-master/src/app/components/dynamic-inputs/dynamic-inputs.scss +++ b/vid-webpack-master/src/app/shared/components/dynamic-inputs/dynamic-inputs.scss diff --git a/vid-webpack-master/src/app/shared/components/ellipsis/ellipsis.component.ts b/vid-webpack-master/src/app/shared/components/ellipsis/ellipsis.component.ts index fd58b6507..bce06953c 100644 --- a/vid-webpack-master/src/app/shared/components/ellipsis/ellipsis.component.ts +++ b/vid-webpack-master/src/app/shared/components/ellipsis/ellipsis.component.ts @@ -1,12 +1,17 @@ -import { Component, Input } from '@angular/core'; +import {Component, Input, OnChanges, SimpleChanges} from '@angular/core'; +import {HighlightPipe} from "../../pipes/highlight/highlight-filter.pipe"; +import * as _ from 'lodash'; @Component({ selector : 'custom-ellipsis', template: ` - <span + <span + sdc-tooltip class="ellipsis" id="{{id}}" - tooltip="{{value}}">{{value}}</span>`, + [innerHtml]="displayValue | safe : 'html'" + [tooltip-text]="value"> + </span>`, styles : [ ` .ellipsis { @@ -18,10 +23,23 @@ import { Component, Input } from '@angular/core'; text-align: left; } ` - ] + ], + providers : [HighlightPipe] }) -export class EllipsisComponent { +export class EllipsisComponent implements OnChanges{ @Input() value : string; @Input() id : string; + @Input() hightlight : string; + displayValue : string; + constructor(private _highlightPipe : HighlightPipe){ + this.displayValue = this.value; + } + + ngOnChanges(changes: SimpleChanges): void { + this.displayValue = this.value; + if(!_.isNil(this.hightlight)){ + this.displayValue = this._highlightPipe.transform(this.value ,this.hightlight ? this.hightlight : ''); + } + } } diff --git a/vid-webpack-master/src/app/shared/components/error-msg/error-msg.component.html b/vid-webpack-master/src/app/shared/components/error-msg/error-msg.component.html new file mode 100644 index 000000000..6fb46c256 --- /dev/null +++ b/vid-webpack-master/src/app/shared/components/error-msg/error-msg.component.html @@ -0,0 +1,5 @@ +<div [attr.data-tests-id]="'error-msg-wrapper'" class="error-msg-wrapper" *ngIf="errorMsgService?.errorMsgObject"> + <div class="title" [attr.data-tests-id]="'error-msg-title'">{{errorMsgService?.errorMsgObject?.title}}</div> + <div class="sub-title" [attr.data-tests-id]="'error-msg-sub-title'">{{errorMsgService?.errorMsgObject?.subtitle}}</div> + <div *ngIf="errorMsgService?.errorMsgObject?.description" class="description" [attr.data-tests-id]="'error-msg-description'">{{errorMsgService?.errorMsgObject?.description}}</div> +</div> diff --git a/vid-webpack-master/src/app/shared/components/error-msg/error-msg.component.scss b/vid-webpack-master/src/app/shared/components/error-msg/error-msg.component.scss new file mode 100644 index 000000000..98c7e8480 --- /dev/null +++ b/vid-webpack-master/src/app/shared/components/error-msg/error-msg.component.scss @@ -0,0 +1,22 @@ +.error-msg-wrapper{ + display: block; + border-top: 6px solid #CF2A2A; + border-bottom: 1px solid #D2D2D2; + padding: 20px 45px; + font-family: OpenSans-Regular; + font-size: 14px; + .title{ + color: #CF2A2A; + margin-bottom: 10px; + font-family: OpenSans-SemiBold; + font-size: 16px; + } + .sub-title{ + color: #CF2A2A; + margin-bottom: 5px; + } + .description{ + color: #191919; + } +} + diff --git a/vid-webpack-master/src/app/shared/components/error-msg/error-msg.component.spec.ts b/vid-webpack-master/src/app/shared/components/error-msg/error-msg.component.spec.ts new file mode 100644 index 000000000..2ca72c533 --- /dev/null +++ b/vid-webpack-master/src/app/shared/components/error-msg/error-msg.component.spec.ts @@ -0,0 +1,48 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import {ComponentFixture, TestBed} from '@angular/core/testing'; +import { ErrorMsgComponent } from './error-msg.component'; +import {ErrorMsgService} from "./error-msg.service"; +import {ErrorMsgObject} from "./error-msg.model"; + +describe('ErrorMsgComponent', () => { + + let component: ErrorMsgComponent; + let fixture: ComponentFixture<ErrorMsgComponent>; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ErrorMsgComponent], + providers: [ErrorMsgService] + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ErrorMsgComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + test('should create', () => { + expect(component).toBeTruthy(); + }); + + test('should triggerShowError fill error msg object', () => { + let errorMsgObj:ErrorMsgObject = new ErrorMsgObject("Title", "SubTitle", "Description") + component.errorMsgService.triggerShowError.next(errorMsgObj); + let errorMsg = component.errorMsgService.errorMsgObject; + expect(errorMsg).toBeDefined(); + expect(errorMsg.title).toBe('Title'); + expect(errorMsg.subtitle).toBe('SubTitle'); + expect(errorMsg.description).toBe('Description'); + }); + + test('should triggerClearError delete error msg object', () => { + let errorMsgObj:ErrorMsgObject = new ErrorMsgObject("Title", "SubTitle", "Description") + component.errorMsgService.triggerShowError.next(errorMsgObj); + let errorMsg = component.errorMsgService.errorMsgObject; + expect(errorMsg).toBeDefined(); + component.errorMsgService.triggerClearError.next(); + expect(component.errorMsgService.errorMsgObject).toBeNull(); + + }); +}); diff --git a/vid-webpack-master/src/app/shared/components/error-msg/error-msg.component.ts b/vid-webpack-master/src/app/shared/components/error-msg/error-msg.component.ts new file mode 100644 index 000000000..e47a06ca6 --- /dev/null +++ b/vid-webpack-master/src/app/shared/components/error-msg/error-msg.component.ts @@ -0,0 +1,28 @@ +import {Component, OnChanges, SimpleChanges} from '@angular/core'; +import {ErrorMsgService} from "./error-msg.service"; +import {ErrorMsgObject} from "./error-msg.model"; + +@Component({ + selector: 'error-msg', + templateUrl: './error-msg.component.html', + styleUrls: ['./error-msg.component.scss'] +}) + +export class ErrorMsgComponent implements OnChanges { + + errorMsgService: ErrorMsgService; + constructor(private _errorMsgService: ErrorMsgService) { + this.errorMsgService = _errorMsgService; + this._errorMsgService.triggerShowError.subscribe((error: ErrorMsgObject) => { + this.errorMsgService.errorMsgObject = error; + }); + + this._errorMsgService.triggerClearError.subscribe(() => { + this.errorMsgService.errorMsgObject = null; + }); + } + + ngOnChanges(changes: SimpleChanges): void { + } +} + diff --git a/vid-webpack-master/src/app/shared/components/error-msg/error-msg.model.ts b/vid-webpack-master/src/app/shared/components/error-msg/error-msg.model.ts new file mode 100644 index 000000000..0cdb74290 --- /dev/null +++ b/vid-webpack-master/src/app/shared/components/error-msg/error-msg.model.ts @@ -0,0 +1,11 @@ +export class ErrorMsgObject { + title: string; + subtitle: string; + description: string; + + constructor(title: string, subtitle: string, description: string) { + this.title = title; + this.subtitle = subtitle; + this.description = description; + } +} diff --git a/vid-webpack-master/src/app/shared/components/error-msg/error-msg.service.spec.ts b/vid-webpack-master/src/app/shared/components/error-msg/error-msg.service.spec.ts new file mode 100644 index 000000000..faaef8d41 --- /dev/null +++ b/vid-webpack-master/src/app/shared/components/error-msg/error-msg.service.spec.ts @@ -0,0 +1,38 @@ +import {TestBed, getTestBed } from '@angular/core/testing'; +import {ErrorMsgService} from "./error-msg.service"; + +describe('Error msg Service', () => { + let injector; + let service: ErrorMsgService; + + beforeAll(done => (async () => { + + TestBed.configureTestingModule( + { + providers: [ + ErrorMsgService + ] + }); + await TestBed.compileComponents(); + injector = getTestBed(); + service = injector.get(ErrorMsgService); + })().then(done).catch(done.fail)); + + test('should return error msg object when call to getScalingErrorObject', () => { + let errorMsgObject = service.getScalingErrorObject(); + expect(errorMsgObject).toBeDefined(); + expect(errorMsgObject.title).toBe('Error : Too many members'); + expect(errorMsgObject.subtitle).toBe('One or more VNF groups, marked below, exceeds the maximum allowed number of members to associate'); + expect(errorMsgObject.description).toBe('Please make sure the total amount of VNF instances is less than that amount.'); + }); + + test('should return error msg object when call to getRetryErrorObject', () => { + let errorMsgObject = service.getRetryErrorObject(1); + expect(errorMsgObject).toBeDefined(); + expect(errorMsgObject.title).toBe('ERROR!'); + expect(errorMsgObject.subtitle).toBe(`Attention: You are currently viewing instances from the MSO. \n 1 of the instances failed, please try again.`); + expect(errorMsgObject.description).toBe(null); + }); + +}); + diff --git a/vid-webpack-master/src/app/shared/components/error-msg/error-msg.service.ts b/vid-webpack-master/src/app/shared/components/error-msg/error-msg.service.ts new file mode 100644 index 000000000..e1bcd423f --- /dev/null +++ b/vid-webpack-master/src/app/shared/components/error-msg/error-msg.service.ts @@ -0,0 +1,22 @@ +import {Injectable} from '@angular/core'; +import {Subject} from 'rxjs/Subject'; +import {ErrorMsgObject} from "./error-msg.model"; + +@Injectable() +export class ErrorMsgService { + triggerShowError: Subject<ErrorMsgObject> = new Subject<ErrorMsgObject>(); + triggerClearError: Subject<boolean> = new Subject<boolean>(); + errorMsgObject: ErrorMsgObject = null; + + getScalingErrorObject(): ErrorMsgObject { + return new ErrorMsgObject("Error : Too many members", + "One or more VNF groups, marked below, exceeds the maximum allowed number of members to associate", + "Please make sure the total amount of VNF instances is less than that amount."); + } + + getRetryErrorObject(numberOfFailed: number): ErrorMsgObject { + return new ErrorMsgObject("ERROR!", + `Attention: You are currently viewing instances from the MSO. \n ${numberOfFailed} of the instances failed, please try again.`, + null); + } +} diff --git a/vid-webpack-master/src/app/shared/components/error/error.component.service.ts b/vid-webpack-master/src/app/shared/components/error/error.component.service.ts index 35b83f0b6..c573d16e9 100644 --- a/vid-webpack-master/src/app/shared/components/error/error.component.service.ts +++ b/vid-webpack-master/src/app/shared/components/error/error.component.service.ts @@ -1,18 +1,16 @@ import {Injectable} from "@angular/core"; -import {Subject} from "rxjs/Subject"; -import { MessageBoxService } from '../messageBox/messageBox.service'; -import { MessageBoxData, ModalSize, ModalType } from '../messageBox/messageBox.data'; - +import {MessageBoxService } from '../messageBox/messageBox.service'; +import {MessageBoxData} from '../messageBox/messageBox.data'; +import { SdcUiCommon} from "onap-ui-angular"; @Injectable() export class ErrorService { static showErrorWithMessage(error : ErrorMessage) : void { setTimeout(()=>{ let messageBoxData : MessageBoxData = new MessageBoxData( - error.title, // modal title + error.title, error.text, - - ModalType.error, - ModalSize.medium, + SdcUiCommon.ModalType.error, + SdcUiCommon.ModalSize.medium, [ {text:"Close", size:"large", closeModal:true} ]); @@ -33,3 +31,4 @@ export class ErrorMessage { this.errorNumber = errorNumber; } } + diff --git a/vid-webpack-master/src/app/shared/components/formControls/component/checkbox/checkbox.formControl.component.html b/vid-webpack-master/src/app/shared/components/formControls/component/checkbox/checkbox.formControl.component.html new file mode 100644 index 000000000..26362ebed --- /dev/null +++ b/vid-webpack-master/src/app/shared/components/formControls/component/checkbox/checkbox.formControl.component.html @@ -0,0 +1,11 @@ +<div class="details-item"> + <input type="checkbox" + id="{{data?.dataTestId}}" + [attr.data-tests-id]="data?.dataTestId" + [checked]="data?.value" + name="{{data?.controlName}}" + [formControl]="form?.controls[data?.controlName]" + data-toggle="toggle"> + <label class="checkbox-label" + for="{{data?.dataTestId}}">{{data?.displayName}}</label> +</div> diff --git a/vid-webpack-master/src/app/shared/components/formControls/component/checkbox/checkbox.formControl.component.ts b/vid-webpack-master/src/app/shared/components/formControls/component/checkbox/checkbox.formControl.component.ts new file mode 100644 index 000000000..f9ba48308 --- /dev/null +++ b/vid-webpack-master/src/app/shared/components/formControls/component/checkbox/checkbox.formControl.component.ts @@ -0,0 +1,13 @@ +import {Component, Input} from "@angular/core"; +import {FormControlModel} from "../../../../models/formControlModels/formControl.model"; +import {FormGroup} from "@angular/forms"; + +@Component({ + selector: 'checkbox-form-control', + templateUrl: './checkbox.formControl.component.html' +}) +export class CheckboxFormControlComponent{ + @Input() data: FormControlModel; + @Input() form: FormGroup; + +} diff --git a/vid-webpack-master/src/app/shared/components/formControls/component/dropdown/dropdown.formControl.component.html b/vid-webpack-master/src/app/shared/components/formControls/component/dropdown/dropdown.formControl.component.html new file mode 100644 index 000000000..6d13e52f8 --- /dev/null +++ b/vid-webpack-master/src/app/shared/components/formControls/component/dropdown/dropdown.formControl.component.html @@ -0,0 +1,21 @@ +<div class="details-item" *ngIf="data != null && form != null"> + <label [ngClass]="{'required': data.isRequired()}" + for="{{data?.dataTestId}}-select">{{data?.displayName}}:</label> + <select class="form-control input-text" + id="{{data?.dataTestId}}-select" + [attr.data-tests-id]="data?.dataTestId" + name="{{data?.name}}" + [formControl]="form.controls[data.controlName]" + [ngClass]="{'error-style' : (form?.controls[data?.controlName]?.touched && form?.controls[data?.controlName]?.errors) || data?.hasEmptyOptions , + 'grayColor': form?.controls[data?.controlName]?.value == null || form?.controls[data?.controlName]?.value == undefined, + 'blackColor' : form?.controls[data?.controlName]?.value != null}" + (blur)="data.onBlur()"> + + <option [value]="null" hidden>{{data?.placeHolder}}</option> + <option *ngFor="let option of data?.options$ | orderBy : {property : 'name', direction : 1} ; let i = index" class="{{option?.id}} {{data?.dataTestId}}Option" + [value]="option[data.ngValue]" [disabled]="!option?.isPermitted && option?.isPermitted != undefined">{{option.name}} + </option> + </select> + <form-control-error *ngIf="data?.hasEmptyOptions" [message]="'No results for this request. Please change criteria.'"></form-control-error> +</div> + diff --git a/vid-webpack-master/src/app/shared/components/formControls/component/dropdown/dropdown.formControl.component.scss b/vid-webpack-master/src/app/shared/components/formControls/component/dropdown/dropdown.formControl.component.scss new file mode 100644 index 000000000..9826332cc --- /dev/null +++ b/vid-webpack-master/src/app/shared/components/formControls/component/dropdown/dropdown.formControl.component.scss @@ -0,0 +1,7 @@ +.grayColor { + color: gray !important; +} + +.blackColor { + color: black !important; +} diff --git a/vid-webpack-master/src/app/shared/components/formControls/component/dropdown/dropdown.formControl.component.ts b/vid-webpack-master/src/app/shared/components/formControls/component/dropdown/dropdown.formControl.component.ts new file mode 100644 index 000000000..550feca22 --- /dev/null +++ b/vid-webpack-master/src/app/shared/components/formControls/component/dropdown/dropdown.formControl.component.ts @@ -0,0 +1,27 @@ +import {Component, Input, OnChanges, SimpleChanges} from "@angular/core"; +import {DropdownFormControl} from "../../../../models/formControlModels/dropdownFormControl.model"; +import {FormGroup} from "@angular/forms"; + +@Component({ + selector: 'dropdown-form-control', + templateUrl: './dropdown.formControl.component.html', + styleUrls : ['./dropdown.formControl.component.scss'] +}) +export class DropdownFormControlComponent implements OnChanges{ + @Input() data: DropdownFormControl = null; + @Input() form: FormGroup = null; + + ngOnChanges(changes: SimpleChanges): void { + if (changes["data"] !== undefined && changes["data"].currentValue !== changes["data"].previousValue && changes["data"].firstChange) { + if(this.data.onInit){ + this.data.onInit(this.data, this.form); + } + } + + if (changes["data"] !== undefined) { + this.form.controls[this.data.controlName].valueChanges.subscribe((value)=>{ + this.data.onChange(value, this.form); + }) + } + } +} diff --git a/vid-webpack-master/src/app/shared/components/formControls/component/file/file.formControl.component.html b/vid-webpack-master/src/app/shared/components/formControls/component/file/file.formControl.component.html new file mode 100644 index 000000000..bcbe91e5e --- /dev/null +++ b/vid-webpack-master/src/app/shared/components/formControls/component/file/file.formControl.component.html @@ -0,0 +1,22 @@ +<div class="details-item file-form-control"> + <label [ngClass]="{'required': data.isRequired()}" for="{{data?.controlName}}">{{data?.displayName}}:</label> + <label for="{{data?.controlName}}" class="file-input-wrapper" [ngClass]="{'file-uploaded': fileUploader.files && fileUploader.files[0] || data.selectedFile != data.placeHolder}"> + <span data-tests-id="file-name" class="file-name"> + {{ fileUploader.files && fileUploader.files[0] ? fileUploader.files[0].name : data.selectedFile}} + </span> + <input id="{{data?.controlName}}" + name="{{data?.controlName}}" + class="form-control input-text" + [formControl]="form?.controls[data?.controlName]" + [ngClass]="{'error-style' : form?.controls[data?.controlName]?.touched && form?.controls[data?.controlName]?.errors}" + type="file" + #fileUploader + accept="{{data?.acceptedExtentions}}" + (change)="data?.onChange($event.target.files, form)"> + <input *ngFor="let hiddenFile of data?.hiddenFile" type="hidden" id="{{hiddenFile.controlName}}" name="{{hiddenFile.controlName}}" + [formControl]="form?.controls[hiddenFile.controlName]"/> + <span class="delete" data-tests-id="remove-uploaded-file" (click)="onDelete($event, data, form)">X</span> + <span class="icon-browse"></span> + </label> +</div> + diff --git a/vid-webpack-master/src/app/shared/components/formControls/component/file/file.formControl.component.scss b/vid-webpack-master/src/app/shared/components/formControls/component/file/file.formControl.component.scss new file mode 100644 index 000000000..98fae0249 --- /dev/null +++ b/vid-webpack-master/src/app/shared/components/formControls/component/file/file.formControl.component.scss @@ -0,0 +1,87 @@ +.file-form-control{ + label{ + color: #191919; + } + input[type=file] { + opacity: 0; + flex: 0; + } + .file-input-wrapper{ + display: flex; + background: #FFFFFF; + border: 1px solid #D2D2D2; + border-radius: 2px; + height: 38px; + &:hover{ + cursor: pointer; + border: 1px solid #009FDB; + .icon-browse{ + background: #E6F6FB; + border-left: 1px solid #009FDB; + &:before{ + color: #009FDB; + } + } + } + &:active{ + .icon-browse{ + background: #1EB9F3; + border-left: 1px solid #009FDB; + &:before{ + color: #ffffff; + } + } + } + .file-name { + font-family: OpenSans-Italic; + font-weight: normal; + font-size: 14px; + color: #959595; + margin: 9px; + width: 100%; + } + .icon-browse{ + z-index: 1; + margin-left: auto; + margin-bottom: 0; + cursor: pointer; + content: "\e90d"; + color: #5A5A5A; + font-size: 30px; + display: block; + text-align: center; + padding-top: 4px; + background: #F2F2F2; + border-left: 1px solid #D2D2D2; + width: 36px; + height:100%; + &:before{ + content: "\e90d"; + color: #5A5A5A; + } + } + .delete{ + visibility: hidden; + cursor: pointer; + font-size: 14px; + margin-right: 10px; + margin-top: 9px; + color: #5a5a5a; + margin-left: 10px; + z-index: 1; + &:hover{ + color: #000000; + } + } + &.file-uploaded{ + .file-name{ + font-family: OpenSans-Regular; + font-size: 14px; + color: #000000; + } + .delete{ + visibility: visible; + } + } + } +} diff --git a/vid-webpack-master/src/app/shared/components/formControls/component/file/file.formControl.component.spec.ts b/vid-webpack-master/src/app/shared/components/formControls/component/file/file.formControl.component.spec.ts new file mode 100644 index 000000000..e27f5115a --- /dev/null +++ b/vid-webpack-master/src/app/shared/components/formControls/component/file/file.formControl.component.spec.ts @@ -0,0 +1,62 @@ +import {ComponentFixture, TestBed} from '@angular/core/testing'; +import {CUSTOM_ELEMENTS_SCHEMA} from '@angular/core' +import {FileFormControlComponent} from "./file.formControl.component"; +import {CommonModule} from "@angular/common"; +import {FormBuilder, FormControl, ReactiveFormsModule, Validators} from "@angular/forms"; +import {ValidatorModel, ValidatorOptions} from "../../../../models/formControlModels/formControl.model"; +import {FormControlMessageErrorComponent} from "../../errorMessage/formControlMessageError.component"; +import {BrowserModule} from "@angular/platform-browser"; +import {TooltipModule} from "ngx-tooltip"; +import {FileFormControl} from "../../../../models/formControlModels/fileFormControl.model"; + +describe('File Form Control Component', () => { + let component: FileFormControlComponent; + let fixture: ComponentFixture<FileFormControlComponent>; + let fb: FormBuilder; + + + beforeAll(done => (async () => { + TestBed.configureTestingModule({ + imports: [CommonModule, BrowserModule, ReactiveFormsModule, TooltipModule], + providers: [FormBuilder], + declarations: [FileFormControlComponent, FormControlMessageErrorComponent], + schemas: [CUSTOM_ELEMENTS_SCHEMA] + }); + await TestBed.compileComponents(); + + fixture = TestBed.createComponent(FileFormControlComponent); + component = fixture.componentInstance; + fb = TestBed.get(FormBuilder); + + })().then(done).catch(done.fail)); + + test('file component should initialize basic parameters', () => { + component.data = new FileFormControl({ + displayName: "display Name", + validations: [new ValidatorModel(ValidatorOptions.required, 'is required')], + dataTestId: "data-test-id", + placeHolder: "place holder", + controlName: 'testFile', + acceptedExtentions: "json" + }); + + component.form = fb.group({ + 'testFile': new FormControl({ + value: component.data.selectedFile, + disabled: false + }, + Validators.compose(component.data.validations.map(item => item.validator)) + ), + }); + + component.data.onDelete = function () { + component.form.controls['testFile'].setValue('onDelete'); + }; + + expect(component.form.controls['testFile'].value).toEqual("place holder"); + let event = new Event("onDelete", null); + component.data.onDelete(event, component.data, component.form); + expect(component.form.controls['testFile'].value).toEqual('onDelete'); + }) +}); + diff --git a/vid-webpack-master/src/app/shared/components/formControls/component/file/file.formControl.component.ts b/vid-webpack-master/src/app/shared/components/formControls/component/file/file.formControl.component.ts new file mode 100644 index 000000000..2c2172005 --- /dev/null +++ b/vid-webpack-master/src/app/shared/components/formControls/component/file/file.formControl.component.ts @@ -0,0 +1,27 @@ +import {Component, ElementRef, Input, ViewChild} from "@angular/core"; +import {FormGroup} from "@angular/forms"; +import {FileFormControl} from "../../../../models/formControlModels/fileFormControl.model"; + +@Component({ + selector : 'file-form-control', + templateUrl : './file.formControl.component.html', + styleUrls : ['./file.formControl.component.scss'] +}) + +export class FileFormControlComponent { + @Input() data: FileFormControl = null; + @Input() form: FormGroup; + @ViewChild('fileUploader') + fileUploader:ElementRef ; + + onDelete(event, data, form) { + event.stopPropagation(); + event.preventDefault(); + form.value[data.controlName] = this.fileUploader.nativeElement.value = ""; + data.selectedFile = data.placeHolder; + if (data.onDelete){ + data.onDelete(form); + } + + } +} diff --git a/vid-webpack-master/src/app/shared/components/formControls/component/file/fileUnit.enum.ts b/vid-webpack-master/src/app/shared/components/formControls/component/file/fileUnit.enum.ts new file mode 100644 index 000000000..d875e486c --- /dev/null +++ b/vid-webpack-master/src/app/shared/components/formControls/component/file/fileUnit.enum.ts @@ -0,0 +1,7 @@ +export enum FileUnit { + b, + B, + KB, + MB, + GB +} diff --git a/vid-webpack-master/src/app/shared/components/formControls/component/input/input.formControl.component.html b/vid-webpack-master/src/app/shared/components/formControls/component/input/input.formControl.component.html new file mode 100644 index 000000000..90ac7c698 --- /dev/null +++ b/vid-webpack-master/src/app/shared/components/formControls/component/input/input.formControl.component.html @@ -0,0 +1,25 @@ +<div class="details-item" *ngIf="data?.isVisible"> + <label + [tooltip]="data?.tooltip ? data.tooltip : null" + id="{{data?.dataTestId}}-label" + [ngClass]="{'required' : data?.isRequired()}"> + {{data?.displayName}}: </label> + <input + #customInput + + [disabled]="data?.isDisabled ? data.isDisabled : false" + [type]="data?.inputType ? data?.inputType : 'text'" + [attr.data-tests-id]="data?.dataTestId" + class="form-control input-text" + id="{{data?.dataTestId}}" + [placeholder]="data?.placeHolder ? data?.placeHolder : ''" + [formControl]="form?.controls[data?.controlName]" + [ngClass]="{'error-style' : form?.controls[data?.controlName]?.touched && form?.controls[data?.controlName]?.errors}" + minlength="{{data?.minLength}}" + maxlength="{{data?.maxLength}}" + (blur)="data.onBlur($event, form)" + (keypress)="data?.onKeypress($event)"> +</div> + + + diff --git a/vid-webpack-master/src/app/instantiationStatus/auditInfoModal/auditInfoModal.component.service.ts b/vid-webpack-master/src/app/shared/components/formControls/component/input/input.formControl.component.scss index e69de29bb..e69de29bb 100644 --- a/vid-webpack-master/src/app/instantiationStatus/auditInfoModal/auditInfoModal.component.service.ts +++ b/vid-webpack-master/src/app/shared/components/formControls/component/input/input.formControl.component.scss diff --git a/vid-webpack-master/src/app/shared/components/formControls/component/input/input.formControl.component.spec.ts b/vid-webpack-master/src/app/shared/components/formControls/component/input/input.formControl.component.spec.ts new file mode 100644 index 000000000..84d379d1a --- /dev/null +++ b/vid-webpack-master/src/app/shared/components/formControls/component/input/input.formControl.component.spec.ts @@ -0,0 +1,68 @@ +import {async, ComponentFixture, TestBed} from '@angular/core/testing'; +import {CUSTOM_ELEMENTS_SCHEMA} from '@angular/core' +import {InputFormControlComponent} from "./input.formControl.component"; +import {CommonModule} from "@angular/common"; +import {FormBuilder, FormControl, ReactiveFormsModule, Validators} from "@angular/forms"; +import {InputFormControl} from "../../../../models/formControlModels/inputFormControl.model"; +import {ValidatorModel, ValidatorOptions} from "../../../../models/formControlModels/formControl.model"; +import {FormControlMessageErrorComponent} from "../../errorMessage/formControlMessageError.component"; +import {BrowserModule} from "@angular/platform-browser"; +import {TooltipModule} from "ngx-tooltip"; + +describe('Input Form Control Component', () => { + let component: InputFormControlComponent; + let fixture: ComponentFixture<InputFormControlComponent>; + let fb: FormBuilder; + + beforeAll(done => (async () => { + TestBed.configureTestingModule({ + imports: [CommonModule, BrowserModule, ReactiveFormsModule, TooltipModule], + providers: [FormBuilder], + declarations: [InputFormControlComponent, FormControlMessageErrorComponent], + schemas: [CUSTOM_ELEMENTS_SCHEMA] + }); + await TestBed.compileComponents(); + + fixture = TestBed.createComponent(InputFormControlComponent); + component = fixture.componentInstance; + fb = TestBed.get(FormBuilder); + + })().then(done).catch(done.fail)); + + test('component should initialize basic parameters', () => { + component.data = new InputFormControl({ + value: "value", + displayName: "display Name", + validations: [new ValidatorModel(ValidatorOptions.required, 'is required')], + dataTestId: "data-test-id", + placeHolder: "place holder", + controlName: 'testInstanceName' + }); + + component.data.hasErrors = function () { + return this.formGroup.controls[this.controlName].touched && this.formGroup.controls[this.controlName].errors ? ['error-style'] : []; + }; + + component.data.onBlur = function () { + component.form.controls['testInstanceName'].setValue('onBlur'); + }; + + component.form = fb.group({ + 'testInstanceName': new FormControl({ + value: component.data.value, + disabled: false + }, Validators.compose(component.data.validations.map(item => item.validator))) + }); + + + component.form.controls['testInstanceName'].setValue('newValue'); + expect(component.form.controls['testInstanceName'].errors).toBeFalsy(); + component.form.controls['testInstanceName'].setValue(''); + expect(component.form.controls['testInstanceName'].errors.required).toBeTruthy(); + component.data.onBlur(); + expect(component.form.controls['testInstanceName'].value).toEqual('onBlur'); + expect(component.form.controls['testInstanceName'].errors).toBeFalsy(); + } + ) +}); + diff --git a/vid-webpack-master/src/app/shared/components/formControls/component/input/input.formControl.component.ts b/vid-webpack-master/src/app/shared/components/formControls/component/input/input.formControl.component.ts new file mode 100644 index 000000000..1e8c28104 --- /dev/null +++ b/vid-webpack-master/src/app/shared/components/formControls/component/input/input.formControl.component.ts @@ -0,0 +1,18 @@ +import {Component, ElementRef, Input, ViewChild} from "@angular/core"; +import {InputFormControl} from "../../../../models/formControlModels/inputFormControl.model"; +import {FormGroup} from "@angular/forms"; + +@Component({ + selector : 'form-control-input', + templateUrl : './input.formControl.component.html', + styleUrls : ['./input.formControl.component.scss'] +}) + +export class InputFormControlComponent{ + @ViewChild('customInput') element:ElementRef; + @Input() data: InputFormControl = null; + @Input() form: FormGroup; + + + +} diff --git a/vid-webpack-master/src/app/shared/components/formControls/component/multiselect/multiselect.formControl.component.html b/vid-webpack-master/src/app/shared/components/formControls/component/multiselect/multiselect.formControl.component.html new file mode 100644 index 000000000..f7c4894b2 --- /dev/null +++ b/vid-webpack-master/src/app/shared/components/formControls/component/multiselect/multiselect.formControl.component.html @@ -0,0 +1,16 @@ +<div> + <div class="details-item" *ngIf="data != null && form != null"> + <label [ngClass]="{'required': data.isRequired()}" + for="{{data?.dataTestId}}">{{data?.displayName}}:</label> + <angular2-multiselect id="{{data?.dataTestId}}" + [attr.data-tests-id]="data?.dataTestId" + [formControl]="form.controls[data.controlName]" + [(ngModel)]="data.selectedItems" + [data]="data?.options$" + [settings]="data?.settings" + title="{{data.tooltip}}" + [ngClass]="{'error-style' : form?.controls[data?.controlName]?.touched && form?.controls[data?.controlName]?.errors}"> + </angular2-multiselect> + </div> +</div> + diff --git a/vid-webpack-master/src/app/shared/components/formControls/component/multiselect/multiselect.formControl.component.spec.ts b/vid-webpack-master/src/app/shared/components/formControls/component/multiselect/multiselect.formControl.component.spec.ts new file mode 100644 index 000000000..81c8d4679 --- /dev/null +++ b/vid-webpack-master/src/app/shared/components/formControls/component/multiselect/multiselect.formControl.component.spec.ts @@ -0,0 +1,74 @@ +import {ComponentFixture, TestBed} from '@angular/core/testing'; +import {CUSTOM_ELEMENTS_SCHEMA} from '@angular/core' +import {CommonModule} from "@angular/common"; +import {FormBuilder, FormControl, ReactiveFormsModule, Validators} from "@angular/forms"; +import { + ValidatorModel, + ValidatorOptions +} from "../../../../models/formControlModels/formControl.model"; +import {FormControlMessageErrorComponent} from "../../errorMessage/formControlMessageError.component"; +import {BrowserModule} from "@angular/platform-browser"; +import {MultiselectFormControlComponent} from "./multiselect.formControl.component"; +import {MultiselectFormControl} from "../../../../models/formControlModels/multiselectFormControl.model"; +import { of } from "rxjs"; +describe('Dropdown Form Control Component', () => { + let component: MultiselectFormControlComponent; + let fixture: ComponentFixture<MultiselectFormControlComponent>; + let fb: FormBuilder; + + beforeAll(done => (async () => { + TestBed.configureTestingModule({ + imports: [CommonModule, BrowserModule, ReactiveFormsModule], + providers: [FormBuilder], + declarations: [MultiselectFormControlComponent, FormControlMessageErrorComponent], + schemas: [CUSTOM_ELEMENTS_SCHEMA] + }); + await TestBed.compileComponents(); + + fixture = TestBed.createComponent(MultiselectFormControlComponent); + component = fixture.componentInstance; + fb = TestBed.get(FormBuilder); + + })().then(done).catch(done.fail)); + + test('component should initialize basic parameters', () => { + component.data = new MultiselectFormControl({ + displayName: "display Name", + validations: [new ValidatorModel(ValidatorOptions.required, 'is required')], + dataTestId: "data-test-id", + placeHolder: "place holder", + controlName: 'testDropdown', + options: of([ + 'option1', + 'option2', + 'option3', + 'onBlur' + ]) + }); + + component.data.hasErrors = function () { + return this.formGroup.controls[this.controlName].touched && this.formGroup.controls[this.controlName].errors ? ['error-style'] : []; + }; + + component.data.onBlur = function () { + component.form.controls['testDropdown'].setValue('onBlur'); + }; + + component.form = fb.group({ + 'testDropdown': new FormControl({ + value: component.data.value, + disabled: false + }, Validators.compose(component.data.validations.map(item => item.validator))) + }); + + component.form.controls['testDropdown'].setValue(''); + expect(component.form.controls['testDropdown'].errors.required).toBeTruthy(); + component.form.controls['testDropdown'].setValue('option2'); + expect(component.form.controls['testDropdown'].errors).toBeFalsy(); + component.data.onBlur(); + expect(component.form.controls['testDropdown'].value).toEqual('onBlur'); + expect(component.form.controls['testDropdown'].errors).toBeFalsy(); + } + ) +}); + diff --git a/vid-webpack-master/src/app/shared/components/formControls/component/multiselect/multiselect.formControl.component.ts b/vid-webpack-master/src/app/shared/components/formControls/component/multiselect/multiselect.formControl.component.ts new file mode 100644 index 000000000..4b98c7e26 --- /dev/null +++ b/vid-webpack-master/src/app/shared/components/formControls/component/multiselect/multiselect.formControl.component.ts @@ -0,0 +1,20 @@ +import {Component, Input, OnChanges, SimpleChanges} from "@angular/core"; +import {FormGroup} from "@angular/forms"; +import {MultiselectFormControl} from "../../../../models/formControlModels/multiselectFormControl.model"; + +@Component({ + selector: 'multiselect-form-control', + templateUrl: './multiselect.formControl.component.html' +}) +export class MultiselectFormControlComponent implements OnChanges{ + @Input() data: MultiselectFormControl = null; + @Input() form: FormGroup = null; + + ngOnChanges(changes: SimpleChanges): void { + if (changes["data"] !== undefined && changes["data"].currentValue !== changes["data"].previousValue && changes["data"].firstChange) { + if(this.data.onInit){ + this.data.onInit(this.data, this.form); + } + } + } +} diff --git a/vid-webpack-master/src/app/shared/components/formControls/component/number/number.formControl.component.html b/vid-webpack-master/src/app/shared/components/formControls/component/number/number.formControl.component.html new file mode 100644 index 000000000..3763764d5 --- /dev/null +++ b/vid-webpack-master/src/app/shared/components/formControls/component/number/number.formControl.component.html @@ -0,0 +1,13 @@ +<div> + <div class="details-item" *ngIf="data != null && form != null"> + <label [ngClass]="{'required': data.isRequired()}" + for="{{data?.dataTestId}}">{{data?.displayName}}:</label> + <input id="{{data?.dataTestId}}" [attr.data-tests-id]="data?.dataTestId" + name="{{data?.controlName}}" class="form-control input-text" + [formControl]="form.controls[data.controlName]" type="number" + placeholder="{{data?.placeHolder}}" title="{{data?.tooltip}}" + [ngClass]="{'error-style' : form?.controls[data?.controlName]?.touched && form?.controls[data?.controlName]?.errors}" + min="{{data?.min}}" max="{{data?.max}}"> + </div> +</div> + diff --git a/vid-webpack-master/src/app/shared/components/formControls/component/number/number.formControl.component.ts b/vid-webpack-master/src/app/shared/components/formControls/component/number/number.formControl.component.ts new file mode 100644 index 000000000..bd25ded81 --- /dev/null +++ b/vid-webpack-master/src/app/shared/components/formControls/component/number/number.formControl.component.ts @@ -0,0 +1,12 @@ +import {Component, Input} from "@angular/core"; +import {FormGroup} from "@angular/forms"; +import {NumberFormControl} from "../../../../models/formControlModels/numberFormControl.model"; + +@Component({ + selector: 'number-form-control', + templateUrl: './number.formControl.component.html' +}) +export class NumberFormControlComponent { + @Input() data: NumberFormControl = null; + @Input() form: FormGroup = null; +} diff --git a/vid-webpack-master/src/app/shared/components/formControls/errorMessage/formControlMessageError.component.html b/vid-webpack-master/src/app/shared/components/formControls/errorMessage/formControlMessageError.component.html new file mode 100644 index 000000000..4d89854d5 --- /dev/null +++ b/vid-webpack-master/src/app/shared/components/formControls/errorMessage/formControlMessageError.component.html @@ -0,0 +1,5 @@ +<div *ngIf="form != null && formControl != null && form.controls[formControl.controlName]?.errors"> + <div *ngFor="let validatorModel of formControl?.validations"> + <form-control-error *ngIf="form.controls[formControl?.controlName]?.errors[validatorModel?.validatorName]" [message]="validatorModel?.errorMsg"></form-control-error> + </div> +</div> diff --git a/vid-webpack-master/src/app/shared/components/formControls/errorMessage/formControlMessageError.component.ts b/vid-webpack-master/src/app/shared/components/formControls/errorMessage/formControlMessageError.component.ts new file mode 100644 index 000000000..02ec57e43 --- /dev/null +++ b/vid-webpack-master/src/app/shared/components/formControls/errorMessage/formControlMessageError.component.ts @@ -0,0 +1,15 @@ +import {Component, Input, OnChanges, SimpleChanges} from "@angular/core"; +import {FormGroup} from "@angular/forms"; +import {FormControlModel} from "../../../models/formControlModels/formControl.model"; + +@Component({ + selector : 'form-control-message-error', + templateUrl : './formControlMessageError.component.html' +}) +export class FormControlMessageErrorComponent implements OnChanges{ + @Input() formControl: FormControlModel = null; + @Input() form: FormGroup = null; + + ngOnChanges(changes: SimpleChanges): void { + } +} diff --git a/vid-webpack-master/src/app/shared/components/formGeneralErrors/formGeneralErrors.component.scss b/vid-webpack-master/src/app/shared/components/formGeneralErrors/formGeneralErrors.component.scss index 5271cad49..988d12cd6 100644 --- a/vid-webpack-master/src/app/shared/components/formGeneralErrors/formGeneralErrors.component.scss +++ b/vid-webpack-master/src/app/shared/components/formGeneralErrors/formGeneralErrors.component.scss @@ -32,6 +32,7 @@ .parentbox { padding-right: 0; + line-height: 67px; } .parentbox:before { diff --git a/vid-webpack-master/src/app/shared/components/formGeneralErrors/formGeneralErrors.service.ts b/vid-webpack-master/src/app/shared/components/formGeneralErrors/formGeneralErrors.service.ts new file mode 100644 index 000000000..1550e0820 --- /dev/null +++ b/vid-webpack-master/src/app/shared/components/formGeneralErrors/formGeneralErrors.service.ts @@ -0,0 +1,7 @@ +import {Injectable} from "@angular/core"; +import {Subject} from "rxjs"; + +@Injectable() +export class FormGeneralErrorsService { + static checkForErrorTrigger : Subject<boolean> = new Subject<boolean>(); +} diff --git a/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/basic.control.generator.spec.ts b/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/basic.control.generator.spec.ts new file mode 100644 index 000000000..4189fba05 --- /dev/null +++ b/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/basic.control.generator.spec.ts @@ -0,0 +1,48 @@ +import {getTestBed, TestBed} from '@angular/core/testing'; +import {AaiService} from "../../../services/aaiService/aai.service"; +import {FormControlModel, ValidatorModel, ValidatorOptions} from "../../../models/formControlModels/formControl.model"; +import {FeatureFlagsService} from "../../../services/featureFlag/feature-flags.service"; +import {BasicControlGenerator} from "./basic.control.generator"; +import {NgRedux} from '@angular-redux/store'; +import {HttpClientTestingModule, HttpTestingController} from '@angular/common/http/testing'; + +class MockAppStore<T> {} + +class MockFeatureFlagsService {} + +describe('Basic Control Generator', () => { + let injector; + let service: BasicControlGenerator; + let httpMock: HttpTestingController; + + + beforeAll(done => (async () => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + providers: [BasicControlGenerator, + AaiService, + {provide:FeatureFlagsService, useClass: MockFeatureFlagsService}, + {provide: NgRedux, useClass: MockAppStore}] + }); + await TestBed.compileComponents(); + + injector = getTestBed(); + service = injector.get(BasicControlGenerator); + httpMock = injector.get(HttpTestingController); + + })().then(done).catch(done.fail)); + + + test('getlegacyRegion with JANET25 - isVisible true', () => { + const instance = {lcpCloudRegionId : 'JANET25'}; + const legacyRegionControl: FormControlModel = service.getLegacyRegion(instance); + expect(legacyRegionControl.isVisible).toBeTruthy(); + }); + + test('getlegacyRegion without JANET25 - isVisible false', () => { + const instance = {lcpCloudRegionId : 'olson3'}; + const legacyRegionControl: FormControlModel = service.getLegacyRegion(instance); + expect(legacyRegionControl.isVisible).toBeFalsy(); + }); +}); + diff --git a/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/basic.control.generator.ts b/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/basic.control.generator.ts new file mode 100644 index 000000000..cbbff3c39 --- /dev/null +++ b/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/basic.control.generator.ts @@ -0,0 +1,240 @@ +import {Injectable} from "@angular/core"; +import {DropdownFormControl} from "../../../models/formControlModels/dropdownFormControl.model"; +import {FormGroup} from "@angular/forms"; +import { + CustomValidatorOptions, + FormControlModel, + ValidatorModel, + ValidatorOptions +} from "../../../models/formControlModels/formControl.model"; +import {InputFormControl} from "../../../models/formControlModels/inputFormControl.model"; +import {AppState} from "../../../store/reducers"; +import {NgRedux} from "@angular-redux/store"; +import {NumberFormControl} from "../../../models/formControlModels/numberFormControl.model"; +import {FormControlType} from "../../../models/formControlModels/formControlTypes.enum"; +import {FileFormControl} from "../../../models/formControlModels/fileFormControl.model"; +import {SelectOption} from "../../../models/selectOption"; +import * as _ from 'lodash'; +import {DynamicInputLabelPipe} from "../../../pipes/dynamicInputLabel/dynamic-input-label.pipe"; +import {AaiService} from "../../../services/aaiService/aai.service"; +import {FormGeneralErrorsService} from "../../formGeneralErrors/formGeneralErrors.service"; +import {Observable, of} from "rxjs"; +import {NodeModel} from "../../../models/nodeModel"; +import {Constants} from "../../../utils/constants"; + + +@Injectable() +export class BasicControlGenerator { + + public static readonly INSTANCE_NAME_REG_EX:RegExp = /^[a-zA-Z0-9._-]*$/; + public static readonly GENERATED_NAME_REG_EX:RegExp = /[^a-zA-Z0-9._-]/g; + + constructor(private _store : NgRedux<AppState>, + private _aaiService : AaiService){} + getSubscribeResult(subscribeFunction : Function, control : DropdownFormControl) : Observable<any>{ + return subscribeFunction(this).subscribe((res) => { + control.options$ = res; + control.hasEmptyOptions = res.length === 0; + FormGeneralErrorsService.checkForErrorTrigger.next(); + return of(res); + }); + } + + getSubscribeInitResult(subscribeFunction : Function, control : DropdownFormControl, form : FormGroup) : Observable<any>{ + return subscribeFunction(this).subscribe((res) => { + if(!_.isNil(control['onInitSelectedField'])){ + let result = res; + for(let key of control['onInitSelectedField']){ + result = !_.isNil(result[key]) ? result[key] : []; + } + control.options$ = result; + control.hasEmptyOptions = _.isNil(result) || result.length === 0; + } else{ + control.options$ = !_.isNil(res) ? res : []; + control.hasEmptyOptions = _.isNil(res) || res.length === 0; + } + + FormGeneralErrorsService.checkForErrorTrigger.next(); + return of(res); + }); + } + + getInstanceNameController(instance: any, serviceId: string, isEcompGeneratedNaming: boolean, model: NodeModel): FormControlModel { + let validations: ValidatorModel[] = this.createValidationsForInstanceName(instance, serviceId, isEcompGeneratedNaming); + return new InputFormControl({ + controlName: 'instanceName', + displayName: 'Instance name', + dataTestId: 'instanceName', + placeHolder: (!isEcompGeneratedNaming) ? 'Instance name' : 'Automatically generated when not provided', + validations: validations, + isVisible : true, + value : (!isEcompGeneratedNaming || (!_.isNil(instance) && !_.isNil(instance.instanceName))) + ? this.getDefaultInstanceName(instance, model) : null, + onKeypress : (event) => { + const pattern:RegExp = BasicControlGenerator.INSTANCE_NAME_REG_EX; + if(pattern){ + if(!pattern.test(event['key'])){ + event.preventDefault(); + } + } + return event; + } + }); + } + + getInstanceName(instance : any, serviceId : string, isEcompGeneratedNaming: boolean): FormControlModel { + let formControlModel:FormControlModel = this.getInstanceNameController(instance, serviceId, isEcompGeneratedNaming, new NodeModel()); + formControlModel.value = instance ? instance.instanceName : null; + return formControlModel; + } + + isLegacyRegionShouldBeVisible(instance : any) : boolean { + if(!_.isNil(instance) && !_.isNil(instance.lcpCloudRegionId)) { + return Constants.LegacyRegion.MEGA_REGION.indexOf(instance.lcpCloudRegionId) !== -1; + } + return false; + } + + getLegacyRegion(instance: any): FormControlModel { + return new InputFormControl({ + controlName: 'legacyRegion', + displayName: 'Legacy Region', + dataTestId: 'lcpRegionText', + placeHolder: 'Type Legacy Region', + validations: [], + isVisible: this.isLegacyRegionShouldBeVisible(instance), + isDisabled : _.isNil(instance) ? true : Constants.LegacyRegion.MEGA_REGION.indexOf(instance.lcpCloudRegionId), + value: instance ? instance.legacyRegion : null + }); + } + + private createValidationsForInstanceName(instance: any, serviceId: string, isEcompGeneratedNaming: boolean): ValidatorModel[] { + let validations: ValidatorModel[] = [ + new ValidatorModel(ValidatorOptions.pattern, 'Instance name may include only alphanumeric characters and underscore.', BasicControlGenerator.INSTANCE_NAME_REG_EX), + new ValidatorModel(CustomValidatorOptions.uniqueInstanceNameValidator, 'some error', [this._store, serviceId, instance && instance.instanceName]) + ]; + if (!isEcompGeneratedNaming) { + validations.push(new ValidatorModel(ValidatorOptions.required, 'is required')); + } + return validations; + } + + getInputsOptions = (options: any[]) : Observable<SelectOption[]> =>{ + let optionList: SelectOption[] = []; + options.forEach((option) => { + optionList.push(new SelectOption({ + id: option.id || option.name, + name: option.name + })); + }); + return of(optionList); + }; + + getProductFamilyControl = (instance : any, controls : FormControlModel[], isMandatory?: boolean) : DropdownFormControl => { + return new DropdownFormControl({ + type : FormControlType.DROPDOWN, + controlName : 'productFamilyId', + displayName : 'Product family', + dataTestId : 'productFamily', + placeHolder : 'Select Product Family', + isDisabled : false, + name : "product-family-select", + value : instance ? instance.productFamilyId : null, + validations : _.isNil(isMandatory) || isMandatory === true ? [new ValidatorModel(ValidatorOptions.required, 'is required')]: [], + onInit : this.getSubscribeResult.bind(this, this._aaiService.getProductFamilies), + }) + }; + + + + getDynamicInputsByType(dynamicInputs : any, serviceModelId : string, storeKey : string, type: string ) : FormControlModel[] { + let result : FormControlModel[] = []; + if(dynamicInputs) { + let nodeInstance = null; + if (_.has(this._store.getState().service.serviceInstance[serviceModelId][type], storeKey)) { + nodeInstance = Object.assign({}, this._store.getState().service.serviceInstance[serviceModelId][type][storeKey]); + } + result = this.getDynamicInputs(dynamicInputs, nodeInstance); + } + return result; + } + + + getServiceDynamicInputs(dynamicInputs : any, serviceModelId : string) : FormControlModel[] { + let result: FormControlModel[] = []; + if (dynamicInputs) { + let serviceInstance = null; + if (_.has(this._store.getState().service.serviceInstance, serviceModelId)) { + serviceInstance = Object.assign({}, this._store.getState().service.serviceInstance[serviceModelId]); + } + result = this.getDynamicInputs(dynamicInputs, serviceInstance); + } + return result; + } + + getDynamicInputs(dynamicInputs : any, instance :any) : FormControlModel[]{ + let result : FormControlModel[] = []; + if(dynamicInputs) { + dynamicInputs.forEach((input)=> { + let validations: ValidatorModel[] = []; + if(input.isRequired) { + validations.push(new ValidatorModel(ValidatorOptions.required, 'is required')) + } + if(input.minLength) { + validations.push(new ValidatorModel(ValidatorOptions.minLength, '', input.minLength)) + } + if(input.maxLength) { + validations.push(new ValidatorModel(ValidatorOptions.maxLength, '', input.maxLength)) + } + + let dynamicInputLabelPipe: DynamicInputLabelPipe = new DynamicInputLabelPipe(); + let data:any = { + controlName: input.name, + displayName: dynamicInputLabelPipe.transform(input.name).slice(0, -1), + dataTestId: input.id, + placeHolder: input.prompt, + tooltip: input.description, + validations: validations, + isVisible: input.isVisible, + value: !_.isNil(instance) && !_.isNil(instance.instanceParams) && instance.instanceParams.length > 0 ? instance.instanceParams[0][input.name] : input.value + }; + + switch (input.type) { + case 'select' : + case 'boolean' :{ + data.value = data.value || input.optionList.filter((option) => option.isDefault ? option.id || option.name: null); + data.onInit = this.getSubscribeInitResult.bind(null, this.getInputsOptions.bind(this, input.optionList)); + result.push(new DropdownFormControl(data)); + break; + } + case 'checkbox': { + data.type = FormControlType.CHECKBOX; + result.push(new FormControlModel(data)); + break; + } + case 'number': { + data.min = input.min; + data.max = input.max; + result.push(new NumberFormControl(data)); + break; + } + case 'file': { + result.push(new FileFormControl(data)); + break; + } + default: { + result.push(new InputFormControl(data)); + } + } + }) + } + + return result; + } + + getDefaultInstanceName(instance: any, model: NodeModel) : string { + const initialInstanceName = (!_.isNil(instance) && instance.instanceName) || (!_.isNil(model.name) ? model.name.replace(BasicControlGenerator.GENERATED_NAME_REG_EX, "") : model.name); + return initialInstanceName; + } + +} diff --git a/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/networkGenerator/network.control.generator.spec.ts b/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/networkGenerator/network.control.generator.spec.ts new file mode 100644 index 000000000..97c6ddf59 --- /dev/null +++ b/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/networkGenerator/network.control.generator.spec.ts @@ -0,0 +1,1979 @@ +import {getTestBed, TestBed} from '@angular/core/testing'; +import {HttpClientTestingModule, HttpTestingController} from '@angular/common/http/testing'; +import {NgRedux} from '@angular-redux/store'; +import {BasicControlGenerator} from "../basic.control.generator"; +import {AaiService} from "../../../../services/aaiService/aai.service"; +import {GenericFormService} from "../../generic-form.service"; +import {FormBuilder} from "@angular/forms"; +import {LogService} from "../../../../utils/log/log.service"; +import {FormControlNames, NetworkControlGenerator} from "./network.control.generator"; +import { + FormControlModel, + ValidatorModel, + ValidatorOptions +} from "../../../../models/formControlModels/formControl.model"; +import {FeatureFlagsService} from "../../../../services/featureFlag/feature-flags.service"; + +class MockAppStore<T> { + getState(){ + return { + "global": { + "name": null, + "flags": { + "FLAG_NETWORK_TO_ASYNC_INSTANTIATION": false, + "FLAG_SHOW_ASSIGNMENTS": true, + "FLAG_FABRIC_CONFIGURATION_ASSIGNMENTS": true, + "FLAG_UNASSIGN_SERVICE": true, + "FLAG_SHOW_VERIFY_SERVICE": false, + "FLAG_COLLECTION_RESOURCE_SUPPORT": true, + "FLAG_DUPLICATE_VNF": true, + "FLAG_SERVICE_MODEL_CACHE": true, + "CREATE_INSTANCE_TEST": false, + "FLAG_SETTING_DEFAULTS_IN_DRAWING_BOARD": false, + "FLAG_ASYNC_INSTANTIATION": true, + "FLAG_ASYNC_JOBS": true, + "EMPTY_DRAWING_BOARD_TEST": false, + "FLAG_ADD_MSO_TESTAPI_FIELD": true + }, + "type": "[FLAGS] Update" + }, + "service": { + "serviceHierarchy": { + "6e59c5de-f052-46fa-aa7e-2fca9d674c44": { + "service": { + "uuid": "6e59c5de-f052-46fa-aa7e-2fca9d674c44", + "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0", + "name": "ComplexService", + "version": "1.0", + "toscaModelURL": null, + "category": "Emanuel", + "serviceType": "", + "serviceRole": "", + "description": "ComplexService", + "serviceEcompNaming": "false", + "instantiationType": "Macro", + "inputs": {} + }, + "vnfs": { + "VF_vMee 0": { + "uuid": "d6557200-ecf2-4641-8094-5393ae3aae60", + "invariantUuid": "4160458e-f648-4b30-a176-43881ffffe9e", + "description": "VSP_vMee", + "name": "VF_vMee", + "version": "2.0", + "customizationUuid": "91415b44-753d-494c-926a-456a9172bbb9", + "inputs": {}, + "commands": {}, + "properties": { + "max_instances": 10, + "min_instances": 1, + "gpb2_Internal2_mac": "00:11:22:EF:AC:DF", + "sctp-b-ipv6-egress_src_start_port": "0", + "sctp-a-ipv6-egress_rule_application": "any", + "Internal2_allow_transit": "true", + "sctp-b-IPv6_ethertype": "IPv6", + "sctp-a-egress_rule_application": "any", + "sctp-b-ingress_action": "pass", + "sctp-b-ingress_rule_protocol": "icmp", + "ncb2_Internal1_mac": "00:11:22:EF:AC:DF", + "sctp-b-ipv6-ingress-src_start_port": "0.0", + "ncb1_Internal2_mac": "00:11:22:EF:AC:DF", + "fsb_volume_size_0": "320.0", + "sctp-b-egress_src_addresses": "local", + "sctp-a-ipv6-ingress_ethertype": "IPv4", + "sctp-a-ipv6-ingress-dst_start_port": "0", + "sctp-b-ipv6-ingress_rule_application": "any", + "domain_name": "default-domain", + "sctp-a-ingress_rule_protocol": "icmp", + "sctp-b-egress-src_start_port": "0.0", + "sctp-a-egress_src_addresses": "local", + "sctp-b-display_name": "epc-sctp-b-ipv4v6-sec-group", + "sctp-a-egress-src_start_port": "0.0", + "sctp-a-ingress_ethertype": "IPv4", + "sctp-b-ipv6-ingress-dst_end_port": "65535", + "sctp-b-dst_subnet_prefix_v6": "::", + "nf_naming": "{ecomp_generated_naming=true}", + "sctp-a-ipv6-ingress_src_subnet_prefix": "0.0.0.0", + "sctp-b-egress-dst_start_port": "0.0", + "ncb_flavor_name": "nv.c20r64d1", + "gpb1_Internal1_mac": "00:11:22:EF:AC:DF", + "sctp-b-egress_dst_subnet_prefix_len": "0.0", + "Internal2_net_cidr": "10.0.0.10", + "sctp-a-ingress-dst_start_port": "0.0", + "sctp-a-egress-dst_start_port": "0.0", + "fsb1_Internal2_mac": "00:11:22:EF:AC:DF", + "sctp-a-egress_ethertype": "IPv4", + "vlc_st_service_mode": "in-network-nat", + "sctp-a-ipv6-egress_ethertype": "IPv4", + "sctp-a-egress-src_end_port": "65535.0", + "sctp-b-ipv6-egress_rule_application": "any", + "sctp-b-egress_action": "pass", + "sctp-a-ingress-src_subnet_prefix_len": "0.0", + "sctp-b-ipv6-ingress-src_end_port": "65535.0", + "sctp-b-name": "epc-sctp-b-ipv4v6-sec-group", + "fsb2_Internal1_mac": "00:11:22:EF:AC:DF", + "sctp-a-ipv6-ingress-src_start_port": "0.0", + "sctp-b-ipv6-egress_ethertype": "IPv4", + "Internal1_net_cidr": "10.0.0.10", + "sctp-a-egress_dst_subnet_prefix": "0.0.0.0", + "fsb_flavor_name": "nv.c20r64d1", + "sctp_rule_protocol": "132", + "sctp-b-ipv6-ingress_src_subnet_prefix_len": "0", + "sctp-a-ipv6-ingress_rule_application": "any", + "ecomp_generated_naming": "false", + "sctp-a-IPv6_ethertype": "IPv6", + "vlc2_Internal1_mac": "00:11:22:EF:AC:DF", + "vlc_st_virtualization_type": "virtual-machine", + "sctp-b-ingress-dst_start_port": "0.0", + "sctp-b-ingress-dst_end_port": "65535.0", + "sctp-a-ipv6-ingress-src_end_port": "65535.0", + "sctp-a-display_name": "epc-sctp-a-ipv4v6-sec-group", + "sctp-b-ingress_rule_application": "any", + "int2_sec_group_name": "int2-sec-group", + "vlc_flavor_name": "nd.c16r64d1", + "sctp-b-ipv6-egress_src_addresses": "local", + "vlc_st_interface_type_int1": "other1", + "sctp-b-egress-src_end_port": "65535.0", + "sctp-a-ipv6-egress-dst_start_port": "0", + "vlc_st_interface_type_int2": "other2", + "sctp-a-ipv6-egress_rule_protocol": "any", + "Internal2_shared": "false", + "sctp-a-ipv6-egress_dst_subnet_prefix_len": "0", + "Internal2_rpf": "disable", + "vlc1_Internal1_mac": "00:11:22:EF:AC:DF", + "sctp-b-ipv6-egress_src_end_port": "65535", + "sctp-a-ipv6-egress_src_addresses": "local", + "sctp-a-ingress-dst_end_port": "65535.0", + "sctp-a-ipv6-egress_src_end_port": "65535", + "Internal1_forwarding_mode": "l2", + "Internal2_dhcp": "false", + "sctp-a-dst_subnet_prefix_v6": "::", + "pxe_image_name": "MME_PXE-Boot_16ACP04_GA.qcow2", + "vlc_st_interface_type_gtp": "other0", + "ncb1_Internal1_mac": "00:11:22:EF:AC:DF", + "sctp-b-src_subnet_prefix_v6": "::", + "sctp-a-egress_dst_subnet_prefix_len": "0.0", + "int1_sec_group_name": "int1-sec-group", + "Internal1_dhcp": "false", + "sctp-a-ipv6-egress_dst_end_port": "65535", + "Internal2_forwarding_mode": "l2", + "fsb2_Internal2_mac": "00:11:22:EF:AC:DF", + "sctp-b-egress_dst_subnet_prefix": "0.0.0.0", + "Internal1_net_cidr_len": "17", + "gpb2_Internal1_mac": "00:11:22:EF:AC:DF", + "sctp-b-ingress-src_subnet_prefix_len": "0.0", + "sctp-a-ingress_dst_addresses": "local", + "sctp-a-egress_action": "pass", + "fsb_volume_type_0": "SF-Default-SSD", + "ncb2_Internal2_mac": "00:11:22:EF:AC:DF", + "vlc_st_interface_type_sctp_a": "left", + "vlc_st_interface_type_sctp_b": "right", + "sctp-a-src_subnet_prefix_v6": "::", + "vlc_st_version": "2", + "sctp-b-egress_ethertype": "IPv4", + "sctp-a-ingress_rule_application": "any", + "gpb1_Internal2_mac": "00:11:22:EF:AC:DF", + "instance_ip_family_v6": "v6", + "sctp-a-ipv6-egress_src_start_port": "0", + "sctp-b-ingress-src_start_port": "0.0", + "sctp-b-ingress_dst_addresses": "local", + "fsb1_Internal1_mac": "00:11:22:EF:AC:DF", + "vlc_st_interface_type_oam": "management", + "multi_stage_design": "true", + "oam_sec_group_name": "oam-sec-group", + "Internal2_net_gateway": "10.0.0.10", + "sctp-a-ipv6-ingress-dst_end_port": "65535", + "sctp-b-ipv6-egress-dst_start_port": "0", + "Internal1_net_gateway": "10.0.0.10", + "sctp-b-ipv6-egress_rule_protocol": "any", + "gtp_sec_group_name": "gtp-sec-group", + "sctp-a-ipv6-egress_dst_subnet_prefix": "0.0.0.0", + "sctp-b-ipv6-egress_dst_subnet_prefix_len": "0", + "sctp-a-ipv6-ingress_dst_addresses": "local", + "sctp-a-egress_rule_protocol": "icmp", + "sctp-b-ipv6-egress_action": "pass", + "sctp-a-ipv6-egress_action": "pass", + "Internal1_shared": "false", + "sctp-b-ipv6-ingress_rule_protocol": "any", + "Internal2_net_cidr_len": "17", + "sctp-a-name": "epc-sctp-a-ipv4v6-sec-group", + "sctp-a-ingress-src_end_port": "65535.0", + "sctp-b-ipv6-ingress_src_subnet_prefix": "0.0.0.0", + "sctp-a-egress-dst_end_port": "65535.0", + "sctp-a-ingress_action": "pass", + "sctp-b-egress_rule_protocol": "icmp", + "sctp-b-ipv6-ingress_action": "pass", + "vlc_st_service_type": "firewall", + "sctp-b-ipv6-egress_dst_end_port": "65535", + "sctp-b-ipv6-ingress-dst_start_port": "0", + "vlc2_Internal2_mac": "00:11:22:EF:AC:DF", + "vlc_st_availability_zone": "true", + "fsb_volume_image_name_1": "MME_FSB2_16ACP04_GA.qcow2", + "sctp-b-ingress-src_subnet_prefix": "0.0.0.0", + "sctp-a-ipv6-ingress_src_subnet_prefix_len": "0", + "Internal1_allow_transit": "true", + "gpb_flavor_name": "nv.c20r64d1", + "availability_zone_max_count": "1", + "fsb_volume_image_name_0": "MME_FSB1_16ACP04_GA.qcow2", + "sctp-b-ipv6-ingress_dst_addresses": "local", + "sctp-b-ipv6-egress_dst_subnet_prefix": "0.0.0.0", + "sctp-b-ipv6-ingress_ethertype": "IPv4", + "vlc1_Internal2_mac": "00:11:22:EF:AC:DF", + "sctp-a-ingress-src_subnet_prefix": "0.0.0.0", + "sctp-a-ipv6-ingress_action": "pass", + "Internal1_rpf": "disable", + "sctp-b-ingress_ethertype": "IPv4", + "sctp-b-egress_rule_application": "any", + "sctp-b-ingress-src_end_port": "65535.0", + "sctp-a-ipv6-ingress_rule_protocol": "any", + "sctp-a-ingress-src_start_port": "0.0", + "sctp-b-egress-dst_end_port": "65535.0" + }, + "type": "VF", + "modelCustomizationName": "VF_vMee 0", + "vfModules": { + "vf_vmee0..VfVmee..vmme_vlc..module-1": { + "uuid": "522159d5-d6e0-4c2a-aa44-5a542a12a830", + "invariantUuid": "98a7c88b-b577-476a-90e4-e25a5871e02b", + "customizationUuid": "55b1be94-671a-403e-a26c-667e9c47d091", + "description": null, + "name": "VfVmee..vmme_vlc..module-1", + "version": "2", + "modelCustomizationName": "VfVmee..vmme_vlc..module-1", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "vmme_vlc" + }, + "inputs": {}, + "volumeGroupAllowed": true + }, + "vf_vmee0..VfVmee..vmme_gpb..module-2": { + "uuid": "41708296-e443-4c71-953f-d9a010f059e1", + "invariantUuid": "1cca90b8-3490-495e-87da-3f3e4c57d5b9", + "customizationUuid": "6add59e0-7fe1-4bc4-af48-f8812422ae7c", + "description": null, + "name": "VfVmee..vmme_gpb..module-2", + "version": "2", + "modelCustomizationName": "VfVmee..vmme_gpb..module-2", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "vmme_gpb" + }, + "inputs": {}, + "volumeGroupAllowed": false + }, + "vf_vmee0..VfVmee..base_vmme..module-0": { + "uuid": "a27f5cfc-7f12-4f99-af08-0af9c3885c87", + "invariantUuid": "a6f9e51a-2b35-416a-ae15-15e58d61f36d", + "customizationUuid": "f8c040f1-7e51-4a11-aca8-acf256cfd861", + "description": null, + "name": "VfVmee..base_vmme..module-0", + "version": "2", + "modelCustomizationName": "VfVmee..base_vmme..module-0", + "properties": { + "minCountInstances": 1, + "maxCountInstances": 1, + "initialCount": 1, + "vfModuleLabel": "base_vmme" + }, + "inputs": {}, + "volumeGroupAllowed": true + } + }, + "volumeGroups": { + "vf_vmee0..VfVmee..base_vmme..module-0": { + "uuid": "a27f5cfc-7f12-4f99-af08-0af9c3885c87", + "invariantUuid": "a6f9e51a-2b35-416a-ae15-15e58d61f36d", + "customizationUuid": "f8c040f1-7e51-4a11-aca8-acf256cfd861", + "description": null, + "name": "VfVmee..base_vmme..module-0", + "version": "2", + "modelCustomizationName": "VfVmee..base_vmme..module-0", + "properties": { + "minCountInstances": 1, + "maxCountInstances": 1, + "initialCount": 1, + "vfModuleLabel": "base_vmme" + }, + "inputs": {} + } + }, + "vfcInstanceGroups": {} + } + }, + "networks": { + "ExtVL 0": { + "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986", + "invariantUuid": "379f816b-a7aa-422f-be30-17114ff50b7c", + "description": "ECOMP generic virtual link (network) base type for all other service-level and global networks", + "name": "ExtVL", + "version": "37.0", + "customizationUuid": "94fdd893-4a36-4d70-b16a-ec29c54c184f", + "inputs": {}, + "commands": {}, + "properties": { + "ecomp_generated_naming" : "false", + "network_assignments": "{is_external_network=false, ipv4_subnet_default_assignment={min_subnets_count=1}, ecomp_generated_network_assignment=false, ipv6_subnet_default_assignment={min_subnets_count=1}}", + "exVL_naming": "{ecomp_generated_naming=true}", + "network_flows": "{is_network_policy=false, is_bound_to_vpn=false}", + "network_homing": "{ecomp_selected_instance_node_target=false}" + }, + "type": "VL", + "modelCustomizationName": "ExtVL 0" + }, + "ExtVL 1": { + "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b987", + "invariantUuid": "379f816b-a7aa-422f-be30-17114ff50b7c", + "description": "ECOMP generic virtual link (network) base type for all other service-level and global networks", + "name": "ExtVL1", + "version": "37.0", + "customizationUuid": "94fdd893-4a36-4d70-b16a-ec29c54c184f", + "inputs": {}, + "commands": {}, + "properties": { + "ecomp_generated_naming" : "true", + "network_assignments": "{is_external_network=false, ipv4_subnet_default_assignment={min_subnets_count=1}, ecomp_generated_network_assignment=false, ipv6_subnet_default_assignment={min_subnets_count=1}}", + "exVL_naming": "{ecomp_generated_naming=true}", + "network_flows": "{is_network_policy=false, is_bound_to_vpn=false}", + "network_homing": "{ecomp_selected_instance_node_target=false}" + }, + "type": "VL", + "modelCustomizationName": "ExtVL 0" + } + }, + "collectionResource": {}, + "configurations": { + "Port Mirroring Configuration By Policy 0": { + "uuid": "b4398538-e89d-4f13-b33d-ca323434ba50", + "invariantUuid": "6ef0ca40-f366-4897-951f-abd65d25f6f7", + "description": "A port mirroring configuration by policy object", + "name": "Port Mirroring Configuration By Policy", + "version": "27.0", + "customizationUuid": "3c3b7b8d-8669-4b3b-8664-61970041fad2", + "inputs": {}, + "commands": {}, + "properties": {}, + "type": "Configuration", + "modelCustomizationName": "Port Mirroring Configuration By Policy 0", + "sourceNodes": [], + "collectorNodes": null, + "configurationByPolicy": false + } + }, + "serviceProxies": {}, + "vfModules": { + "vf_vmee0..VfVmee..vmme_vlc..module-1": { + "uuid": "522159d5-d6e0-4c2a-aa44-5a542a12a830", + "invariantUuid": "98a7c88b-b577-476a-90e4-e25a5871e02b", + "customizationUuid": "55b1be94-671a-403e-a26c-667e9c47d091", + "description": null, + "name": "VfVmee..vmme_vlc..module-1", + "version": "2", + "modelCustomizationName": "VfVmee..vmme_vlc..module-1", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "vmme_vlc" + }, + "inputs": {}, + "volumeGroupAllowed": true + }, + "vf_vmee0..VfVmee..vmme_gpb..module-2": { + "uuid": "41708296-e443-4c71-953f-d9a010f059e1", + "invariantUuid": "1cca90b8-3490-495e-87da-3f3e4c57d5b9", + "customizationUuid": "6add59e0-7fe1-4bc4-af48-f8812422ae7c", + "description": null, + "name": "VfVmee..vmme_gpb..module-2", + "version": "2", + "modelCustomizationName": "VfVmee..vmme_gpb..module-2", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "vmme_gpb" + }, + "inputs": {}, + "volumeGroupAllowed": false + }, + "vf_vmee0..VfVmee..base_vmme..module-0": { + "uuid": "a27f5cfc-7f12-4f99-af08-0af9c3885c87", + "invariantUuid": "a6f9e51a-2b35-416a-ae15-15e58d61f36d", + "customizationUuid": "f8c040f1-7e51-4a11-aca8-acf256cfd861", + "description": null, + "name": "VfVmee..base_vmme..module-0", + "version": "2", + "modelCustomizationName": "VfVmee..base_vmme..module-0", + "properties": { + "minCountInstances": 1, + "maxCountInstances": 1, + "initialCount": 1, + "vfModuleLabel": "base_vmme" + }, + "inputs": {}, + "volumeGroupAllowed": true + } + }, + "volumeGroups": { + "vf_vmee0..VfVmee..base_vmme..module-0": { + "uuid": "a27f5cfc-7f12-4f99-af08-0af9c3885c87", + "invariantUuid": "a6f9e51a-2b35-416a-ae15-15e58d61f36d", + "customizationUuid": "f8c040f1-7e51-4a11-aca8-acf256cfd861", + "description": null, + "name": "VfVmee..base_vmme..module-0", + "version": "2", + "modelCustomizationName": "VfVmee..base_vmme..module-0", + "properties": { + "minCountInstances": 1, + "maxCountInstances": 1, + "initialCount": 1, + "vfModuleLabel": "base_vmme" + }, + "inputs": {} + } + }, + "pnfs": {} + } + }, + "serviceInstance": { + "6e59c5de-f052-46fa-aa7e-2fca9d674c44": { + "networks" : {}, + "vnfs": { + "VF_vMee 0": { + "rollbackOnFailure": "true", + "vfModules": { + "vf_vmee0..VfVmee..base_vmme..module-0": { + "vf_vmee0..VfVmee..base_vmme..module-0vmvzo": { + "isMissingData": false, + "sdncPreReload": null, + "modelInfo": { + "modelType": "VFmodule", + "modelInvariantId": "a6f9e51a-2b35-416a-ae15-15e58d61f36d", + "modelVersionId": "a27f5cfc-7f12-4f99-af08-0af9c3885c87", + "modelName": "VfVmee..base_vmme..module-0", + "modelVersion": "2", + "modelCustomizationId": "f8c040f1-7e51-4a11-aca8-acf256cfd861", + "modelCustomizationName": "VfVmee..base_vmme..module-0" + }, + "instanceParams": [ + {} + ], + "trackById": "wmtm6sy2uj" + } + } + }, + "isMissingData": true, + "originalName": "VF_vMee 0", + "vnfStoreKey": "VF_vMee 0", + "trackById": "p3wk448m5do", + "uuid": "d6557200-ecf2-4641-8094-5393ae3aae60", + "productFamilyId": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e", + "lcpCloudRegionId": null, + "tenantId": null, + "lineOfBusiness": null, + "platformName": null, + "modelInfo": { + "modelType": "VF", + "modelInvariantId": "4160458e-f648-4b30-a176-43881ffffe9e", + "modelVersionId": "6e59c5de-f052-46fa-aa7e-2fca9d674c44", + "modelName": "VF_vMee", + "modelVersion": "2.0", + "modelCustomizationName": "VF_vMee 0" + } + } + }, + "instanceParams": [ + {} + ], + "validationCounter": 1, + "existingNames": {}, + "existingVNFCounterMap": { + "d6557200-ecf2-4641-8094-5393ae3aae60": 1 + }, + "globalSubscriberId": "e433710f-9217-458d-a79d-1c7aff376d89", + "subscriptionServiceType": "TYLER SILVIA", + "owningEntityId": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc", + "productFamilyId": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e", + "lcpCloudRegionId": "hvf6", + "tenantId": "229bcdc6eaeb4ca59d55221141d01f8e", + "aicZoneId": "JAG1", + "projectName": "x1", + "rollbackOnFailure": "true", + "bulkSize": 1, + "modelInfo": { + "modelInvariantId": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0", + "modelVersionId": "6e59c5de-f052-46fa-aa7e-2fca9d674c44", + "modelName": "ComplexService", + "modelVersion": "1.0", + "uuid": "6e59c5de-f052-46fa-aa7e-2fca9d674c44" + }, + "isALaCarte": false, + "name": "ComplexService", + "version": "1.0", + "description": "ComplexService", + "category": "Emanuel", + "uuid": "6e59c5de-f052-46fa-aa7e-2fca9d674c44", + "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0", + "serviceType": "", + "serviceRole": "", + "isMultiStepDesign": false + } + }, + "lcpRegionsAndTenants": { + "lcpRegionList": [ + { + "id": "JANET25", + "name": "JANET25", + "isPermitted": true + }, + { + "id": "hvf6", + "name": "hvf6", + "isPermitted": true + } + ], + "lcpRegionsTenantsMap": { + "JANET25": [ + { + "id": "092eb9e8e4b7412e8787dd091bc58e86", + "name": "USP-SIP-IC-24335-T-01", + "isPermitted": true + } + ], + "hvf6": [ + { + "id": "bae71557c5bb4d5aac6743a4e5f1d054", + "name": "AIN Web Tool-15-D-testalexandria", + "isPermitted": true + }, + { + "id": "229bcdc6eaeb4ca59d55221141d01f8e", + "name": "AIN Web Tool-15-D-STTest2", + "isPermitted": true + }, + { + "id": "1178612d2b394be4834ad77f567c0af2", + "name": "AIN Web Tool-15-D-SSPtestcustome", + "isPermitted": true + }, + { + "id": "19c5ade915eb461e8af52fb2fd8cd1f2", + "name": "AIN Web Tool-15-D-UncheckedEcopm", + "isPermitted": true + }, + { + "id": "de007636e25249238447264a988a927b", + "name": "AIN Web Tool-15-D-dfsdf", + "isPermitted": true + }, + { + "id": "62f29b3613634ca6a3065cbe0e020c44", + "name": "AIN/SMS-16-D-Multiservices1", + "isPermitted": true + }, + { + "id": "649289e30d3244e0b48098114d63c2aa", + "name": "AIN Web Tool-15-D-SSPST66", + "isPermitted": true + }, + { + "id": "3f21eeea6c2c486bba31dab816c05a32", + "name": "AIN Web Tool-15-D-ASSPST47", + "isPermitted": true + }, + { + "id": "f60ce21d3ee6427586cff0d22b03b773", + "name": "CESAR-100-D-sspjg67246", + "isPermitted": true + }, + { + "id": "8774659e425f479895ae091bb5d46560", + "name": "CESAR-100-D-sspjg68359", + "isPermitted": true + }, + { + "id": "624eb554b0d147c19ff8885341760481", + "name": "AINWebTool-15-D-iftach", + "isPermitted": true + }, + { + "id": "214f55f5fc414c678059c383b03e4962", + "name": "CESAR-100-D-sspjg612401", + "isPermitted": true + }, + { + "id": "c90666c291664841bb98e4d981ff1db5", + "name": "CESAR-100-D-sspjg621340", + "isPermitted": true + }, + { + "id": "ce5b6bc5c7b348e1bf4b91ac9a174278", + "name": "sspjg621351cloned", + "isPermitted": true + }, + { + "id": "b386b768a3f24c8e953abbe0b3488c02", + "name": "AINWebTool-15-D-eteancomp", + "isPermitted": true + }, + { + "id": "dc6c4dbfd225474e9deaadd34968646c", + "name": "AINWebTool-15-T-SPFET", + "isPermitted": true + }, + { + "id": "02cb5030e9914aa4be120bd9ed1e19eb", + "name": "AINWebTool-15-X-eeweww", + "isPermitted": true + }, + { + "id": "f2f3830e4c984d45bcd00e1a04158a79", + "name": "CESAR-100-D-spjg61909", + "isPermitted": true + }, + { + "id": "05b91bd5137f4929878edd965755c06d", + "name": "CESAR-100-D-sspjg621512cloned", + "isPermitted": true + }, + { + "id": "7002fbe8482d4a989ddf445b1ce336e0", + "name": "AINWebTool-15-X-vdr", + "isPermitted": true + }, + { + "id": "4008522be43741dcb1f5422022a2aa0b", + "name": "AINWebTool-15-D-ssasa", + "isPermitted": true + }, + { + "id": "f44e2e96a1b6476abfda2fa407b00169", + "name": "AINWebTool-15-D-PFNPT", + "isPermitted": true + }, + { + "id": "b69a52bec8a84669a37a1e8b72708be7", + "name": "AINWebTool-15-X-vdre", + "isPermitted": true + }, + { + "id": "fac7d9fd56154caeb9332202dcf2969f", + "name": "AINWebTool-15-X-NONPODECOMP", + "isPermitted": true + }, + { + "id": "2d34d8396e194eb49969fd61ffbff961", + "name": "DN5242-Nov16-T5", + "isPermitted": true + }, + { + "id": "cb42a77ff45b48a8b8deb83bb64acc74", + "name": "ro-T11", + "isPermitted": true + }, + { + "id": "fa45ca53c80b492fa8be5477cd84fc2b", + "name": "ro-T112", + "isPermitted": true + }, + { + "id": "4914ab0ab3a743e58f0eefdacc1dde77", + "name": "DN5242-Nov21-T1", + "isPermitted": true + }, + { + "id": "d0a3e3f2964542259d155a81c41aadc3", + "name": "test-hvf6-09", + "isPermitted": true + }, + { + "id": "cbb99fe4ada84631b7baf046b6fd2044", + "name": "DN5242-Nov16-T3", + "isPermitted": true + } + ] + } + }, + "productFamilies": [ + { + "id": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034", + "name": "SCOTTIE", + "isPermitted": true + }, + { + "id": "17cc1042-527b-11e6-beb8-9e71128cae77", + "name": "IGNACIO", + "isPermitted": true + }, + { + "id": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e", + "name": "Christie", + "isPermitted": true + }, + { + "id": "a4f6f2ae-9bf5-4ed7-b904-06b2099c4bd7", + "name": "Enhanced Services", + "isPermitted": true + }, + { + "id": "vTerrance", + "name": "vTerrance", + "isPermitted": true + }, + { + "id": "323d69d9-2efe-4r45-ay0a-89ea7ard4e6f", + "name": "vSCP", + "isPermitted": true + }, + { + "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb", + "name": "Emanuel", + "isPermitted": true + }, + { + "id": "d8a6ed93-251c-47ca-adc9-86671fd19f4c", + "name": "BVOIP", + "isPermitted": true + }, + { + "id": "db171b8f-115c-4992-a2e3-ee04cae357e0", + "name": "LINDSEY", + "isPermitted": true + }, + { + "id": "LRSI-OSPF", + "name": "LRSI-OSPF", + "isPermitted": true + }, + { + "id": "vRosemarie", + "name": "HNGATEWAY", + "isPermitted": true + }, + { + "id": "vHNPaas", + "name": "WILKINS", + "isPermitted": true + }, + { + "id": "e433710f-9217-458d-a79d-1c7aff376d89", + "name": "TYLER SILVIA", + "isPermitted": true + }, + { + "id": "b6a3f28c-eebf-494c-a900-055cc7c874ce", + "name": "VROUTER", + "isPermitted": true + }, + { + "id": "Cisneros", + "name": "vMuriel", + "isPermitted": true + }, + { + "id": "0ee8c1bc-7cbd-4b0a-a1ac-e9999255abc1", + "name": "CARA Griffin", + "isPermitted": true + }, + { + "id": "c7611ebe-c324-48f1-8085-94aef0c6ef3d", + "name": "DARREN MCGEE", + "isPermitted": true + }, + { + "id": "e30755dc-5673-4b6b-9dcf-9abdd96b93d1", + "name": "Transport", + "isPermitted": true + }, + { + "id": "vSalvatore", + "name": "vSalvatore", + "isPermitted": true + }, + { + "id": "d7bb0a21-66f2-4e6d-87d9-9ef3ced63ae4", + "name": "Josefina", + "isPermitted": true + }, + { + "id": "vHubbard", + "name": "vHubbard", + "isPermitted": true + }, + { + "id": "12a96a9d-4b4c-4349-a950-fe1159602621", + "name": "DARREN MCGEE", + "isPermitted": true + } + ], + "serviceTypes": { + "e433710f-9217-458d-a79d-1c7aff376d89": [ + { + "id": "0", + "name": "vRichardson", + "isPermitted": false + }, + { + "id": "1", + "name": "TYLER SILVIA", + "isPermitted": true + }, + { + "id": "2", + "name": "Emanuel", + "isPermitted": false + }, + { + "id": "3", + "name": "vJamie", + "isPermitted": false + }, + { + "id": "4", + "name": "vVoiceMail", + "isPermitted": false + }, + { + "id": "5", + "name": "Kennedy", + "isPermitted": false + }, + { + "id": "6", + "name": "vSEGW", + "isPermitted": false + }, + { + "id": "7", + "name": "vVM", + "isPermitted": false + }, + { + "id": "8", + "name": "vOTA", + "isPermitted": false + }, + { + "id": "9", + "name": "vMME", + "isPermitted": false + }, + { + "id": "10", + "name": "vMNS", + "isPermitted": false + }, + { + "id": "11", + "name": "vSCP", + "isPermitted": false + }, + { + "id": "12", + "name": "VPMS", + "isPermitted": false + }, + { + "id": "13", + "name": "vMMSC", + "isPermitted": false + }, + { + "id": "14", + "name": "SSD", + "isPermitted": false + }, + { + "id": "15", + "name": "vMOG", + "isPermitted": false + }, + { + "id": "16", + "name": "LINDSEY", + "isPermitted": false + }, + { + "id": "17", + "name": "JOHANNA_SANTOS", + "isPermitted": false + }, + { + "id": "18", + "name": "vCarroll", + "isPermitted": false + } + ] + }, + "aicZones": [ + { + "id": "NFT1", + "name": "NFTJSSSS-NFT1" + }, + { + "id": "JAG1", + "name": "YUDFJULP-JAG1" + }, + { + "id": "YYY1", + "name": "UUUAIAAI-YYY1" + }, + { + "id": "BAN1", + "name": "VSDKYUTP-BAN1" + }, + { + "id": "DKJ1", + "name": "DKJSJDKA-DKJ1" + }, + { + "id": "MCS1", + "name": "ASACMAMS-MCS1" + }, + { + "id": "UIO1", + "name": "uioclli1-UIO1" + }, + { + "id": "RAJ1", + "name": "YGBIJNLQ-RAJ1" + }, + { + "id": "OPA1", + "name": "opaclli1-OPA1" + }, + { + "id": "SDE1", + "name": "ZXCVBNMA-SDE1" + }, + { + "id": "VEN2", + "name": "FGHJUHIL-VEN2" + }, + { + "id": "ORL1", + "name": "ORLDFLMA-ORL1" + }, + { + "id": "JAD1", + "name": "JADECLLI-JAD1" + }, + { + "id": "ZXL1", + "name": "LWLWCANN-ZXL1" + }, + { + "id": "CKL1", + "name": "CLKSKCKK-CKL1" + }, + { + "id": "SDF1", + "name": "sdfclli1-SDF1" + }, + { + "id": "RAD1", + "name": "RADICAL1-RAD1" + }, + { + "id": "KIT1", + "name": "BHYJFGLN-KIT1" + }, + { + "id": "REL1", + "name": "INGERFGT-REL1" + }, + { + "id": "JNL1", + "name": "CJALSDAC-JNL1" + }, + { + "id": "OLK1", + "name": "OLKOLKLS-OLK1" + }, + { + "id": "CHI1", + "name": "CHILLIWE-CHI1" + }, + { + "id": "UUU4", + "name": "UUUAAAUU-UUU4" + }, + { + "id": "TUF1", + "name": "TUFCLLI1-TUF1" + }, + { + "id": "KJN1", + "name": "CKALDKSA-KJN1" + }, + { + "id": "SAM1", + "name": "SNDGCA64-SAN1" + }, + { + "id": "SCK1", + "name": "SCKSCKSK-SCK1" + }, + { + "id": "HJH1", + "name": "AOEEQQQD-HJH1" + }, + { + "id": "HGD1", + "name": "SDFQWHGD-HGD1" + }, + { + "id": "KOR1", + "name": "HYFLNBVT-KOR1" + }, + { + "id": "ATL43", + "name": "AICLOCID-ATL43" + }, + { + "id": "ATL54", + "name": "AICFTAAI-ATL54" + }, + { + "id": "ATL66", + "name": "CLLIAAII-ATL66" + }, + { + "id": "VEL1", + "name": "BNMLKUIK-VEL1" + }, + { + "id": "ICC1", + "name": "SANJITAT-ICC1" + }, + { + "id": "MNT11", + "name": "WSXEFBTH-MNT11" + }, + { + "id": "DEF2", + "name": "WSBHGTYL-DEF2" + }, + { + "id": "MAD11", + "name": "SDFQWGKL-MAD11" + }, + { + "id": "OLG1", + "name": "OLHOLHOL-OLG1" + }, + { + "id": "GAR1", + "name": "NGFVSJKO-GAR1" + }, + { + "id": "SAN22", + "name": "GNVLSCTL-SAN22" + }, + { + "id": "HRG1", + "name": "HRGHRGGS-HRG1" + }, + { + "id": "JCS1", + "name": "JCSJSCJS-JCS1" + }, + { + "id": "DHA12", + "name": "WSXEDECF-DHA12" + }, + { + "id": "HJE1", + "name": "AOEEWWWD-HJE1" + }, + { + "id": "NCA1", + "name": "NCANCANN-NCA1" + }, + { + "id": "IOP1", + "name": "iopclli1-IOP1" + }, + { + "id": "RTY1", + "name": "rtyclli1-RTY1" + }, + { + "id": "KAP1", + "name": "HIOUYTRQ-KAP1" + }, + { + "id": "ZEN1", + "name": "ZENCLLI1-ZEN1" + }, + { + "id": "HKA1", + "name": "JAKHLASS-HKA1" + }, + { + "id": "CQK1", + "name": "CQKSCAKK-CQK1" + }, + { + "id": "SAI1", + "name": "UBEKQLPD-SAI1" + }, + { + "id": "ERT1", + "name": "ertclli1-ERT1" + }, + { + "id": "IBB1", + "name": "PLMKOIJU-IBB1" + }, + { + "id": "TIR2", + "name": "PLKINHYI-TIR2" + }, + { + "id": "HSD1", + "name": "CHASKCDS-HSD1" + }, + { + "id": "SLF78", + "name": "SDCTLFN1-SLF78" + }, + { + "id": "SEE78", + "name": "SDCTEEE4-SEE78" + }, + { + "id": "SAN13", + "name": "TOKYJPFA-SAN13" + }, + { + "id": "SAA78", + "name": "SDCTAAA1-SAA78" + }, + { + "id": "LUC1", + "name": "ATLDFGYC-LUC1" + }, + { + "id": "AMD13", + "name": "MEMATLAN-AMD13" + }, + { + "id": "TOR1", + "name": "TOROONXN-TOR1" + }, + { + "id": "QWE1", + "name": "QWECLLI1-QWE1" + }, + { + "id": "ZOG1", + "name": "ZOGASTRO-ZOG1" + }, + { + "id": "CAL33", + "name": "CALIFORN-CAL33" + }, + { + "id": "SHH78", + "name": "SDIT1HHH-SHH78" + }, + { + "id": "DSA1", + "name": "LKJHGFDS-DSA1" + }, + { + "id": "CLG1", + "name": "CLGRABAD-CLG1" + }, + { + "id": "BNA1", + "name": "BNARAGBK-BNA1" + }, + { + "id": "ATL84", + "name": "CANTTCOC-ATL84" + }, + { + "id": "APP1", + "name": "WBHGTYUI-APP1" + }, + { + "id": "RJN1", + "name": "RJNRBZAW-RJN1" + }, + { + "id": "EHH78", + "name": "SDCSHHH5-EHH78" + }, + { + "id": "mac10", + "name": "PKGTESTF-mac10" + }, + { + "id": "SXB78", + "name": "SDCTGXB1-SXB78" + }, + { + "id": "SAX78", + "name": "SDCTAXG1-SAX78" + }, + { + "id": "SYD1", + "name": "SYDNAUBV-SYD1" + }, + { + "id": "TOK1", + "name": "TOKYJPFA-TOK1" + }, + { + "id": "KGM2", + "name": "KGMTNC20-KGM2" + }, + { + "id": "DCC1b", + "name": "POIUYTGH-DCC1b" + }, + { + "id": "SKK78", + "name": "SDCTKKK1-SKK78" + }, + { + "id": "SGG78", + "name": "SDCTGGG1-SGG78" + }, + { + "id": "SJJ78", + "name": "SDCTJJJ1-SJJ78" + }, + { + "id": "SBX78", + "name": "SDCTBXG1-SBX78" + }, + { + "id": "LAG1", + "name": "LARGIZON-LAG1" + }, + { + "id": "IAA1", + "name": "QAZXSWED-IAA1" + }, + { + "id": "POI1", + "name": "PLMNJKIU-POI1" + }, + { + "id": "LAG1a", + "name": "LARGIZON-LAG1a" + }, + { + "id": "PBL1", + "name": "PBLAPBAI-PBL1" + }, + { + "id": "LAG45", + "name": "LARGIZON-LAG1a" + }, + { + "id": "MAR1", + "name": "MNBVCXZM-MAR1" + }, + { + "id": "HST70", + "name": "HSTNTX70-HST70" + }, + { + "id": "DCC1a", + "name": "POIUYTGH-DCC1a" + }, + { + "id": "TOL1", + "name": "TOLDOH21-TOL1" + }, + { + "id": "LON1", + "name": "LONEENCO-LON1" + }, + { + "id": "SJU78", + "name": "SDIT1JUB-SJU78" + }, + { + "id": "STN27", + "name": "HSTNTX01-STN27" + }, + { + "id": "SSW56", + "name": "ss8126GT-SSW56" + }, + { + "id": "SBB78", + "name": "SDIT1BBB-SBB78" + }, + { + "id": "DCC3", + "name": "POIUYTGH-DCC3" + }, + { + "id": "GNV1", + "name": "GNVLSCTL-GNV1" + }, + { + "id": "WAS1", + "name": "WASHDCSW-WAS1" + }, + { + "id": "TOY1", + "name": "TORYONNZ-TOY1" + }, + { + "id": "STT1", + "name": "STTLWA02-STT1" + }, + { + "id": "STG1", + "name": "STTGGE62-STG1" + }, + { + "id": "SLL78", + "name": "SDCTLLL1-SLL78" + }, + { + "id": "SBU78", + "name": "SDIT1BUB-SBU78" + }, + { + "id": "ATL2", + "name": "ATLNGANW-ATL2" + }, + { + "id": "BOT1", + "name": "BOTHWAKY-BOT1" + }, + { + "id": "SNG1", + "name": "SNGPSIAU-SNG1" + }, + { + "id": "NYC1", + "name": "NYCMNY54-NYC1" + }, + { + "id": "LAG1b", + "name": "LARGIZON-LAG1b" + }, + { + "id": "AMD15", + "name": "AMDFAA01-AMD15" + }, + { + "id": "SNA1", + "name": "SNANTXCA-SNA1" + }, + { + "id": "PLT1", + "name": "PLTNCA60-PLT1" + }, + { + "id": "TLP1", + "name": "TLPNXM18-TLP1" + }, + { + "id": "SDD81", + "name": "SAIT1DD6-SDD81" + }, + { + "id": "DCC1", + "name": "POIUYTGH-DCC1" + }, + { + "id": "DCC2", + "name": "POIUYTGH-DCC2" + }, + { + "id": "OKC1", + "name": "OKCBOK55-OKC1" + }, + { + "id": "PAR1", + "name": "PARSFRCG-PAR1" + }, + { + "id": "TES36", + "name": "ABCEETES-TES36" + }, + { + "id": "COM1", + "name": "PLMKOPIU-COM1" + }, + { + "id": "ANI1", + "name": "ATLNGTRE-ANI1" + }, + { + "id": "SDG78", + "name": "SDIT1BDG-SDG78" + }, + { + "id": "mac20", + "name": "PKGTESTF-mac20" + }, + { + "id": "DSF45", + "name": "DSFBG123-DSF45" + }, + { + "id": "HST25", + "name": "HSTNTX01-HST25" + }, + { + "id": "AMD18", + "name": "AUDIMA01-AMD18" + }, + { + "id": "SAA80", + "name": "SAIT9AA3-SAA80" + }, + { + "id": "SSA56", + "name": "SSIT2AA7-SSA56" + }, + { + "id": "SDD82", + "name": "SAIT1DD9-SDD82" + }, + { + "id": "JCV1", + "name": "JCVLFLBW-JCV1" + }, + { + "id": "SUL2", + "name": "WERTYUJK-SUL2" + }, + { + "id": "PUR1", + "name": "purelyde-PUR1" + }, + { + "id": "FDE55", + "name": "FDERT555-FDE55" + }, + { + "id": "SITE", + "name": "LONEENCO-SITE" + }, + { + "id": "ATL1", + "name": "ATLNGAMA-ATL1" + }, + { + "id": "JUL1", + "name": "ZXCVBNMM-JUL1" + }, + { + "id": "TAT34", + "name": "TESAAISB-TAT34" + }, + { + "id": "XCP12", + "name": "CHKGH123-XCP12" + }, + { + "id": "RAI1", + "name": "poiuytre-RAI1" + }, + { + "id": "HPO1", + "name": "ATLNGAUP-HPO1" + }, + { + "id": "KJF12", + "name": "KJFDH123-KJF12" + }, + { + "id": "SCC80", + "name": "SAIT9CC3-SCC80" + }, + { + "id": "SAA12", + "name": "SAIT9AF8-SAA12" + }, + { + "id": "SAA14", + "name": "SAIT1AA9-SAA14" + }, + { + "id": "ATL35", + "name": "TTESSAAI-ATL35" + }, + { + "id": "CWY1", + "name": "CWYMOWBS-CWY1" + }, + { + "id": "ATL76", + "name": "TELEPAAI-ATL76" + }, + { + "id": "DSL12", + "name": "DSLFK242-DSL12" + }, + { + "id": "ATL53", + "name": "AAIATLTE-ATL53" + }, + { + "id": "SAA11", + "name": "SAIT9AA2-SAA11" + }, + { + "id": "ATL62", + "name": "TESSASCH-ATL62" + }, + { + "id": "AUG1", + "name": "ASDFGHJK-AUG1" + }, + { + "id": "POI22", + "name": "POIUY123-POI22" + }, + { + "id": "SAA13", + "name": "SAIT1AA9-SAA13" + }, + { + "id": "BHY17", + "name": "BHYTFRF3-BHY17" + }, + { + "id": "LIS1", + "name": "HOSTPROF-LIS1" + }, + { + "id": "SIP1", + "name": "ZXCVBNMK-SIP1" + }, + { + "id": "ATL99", + "name": "TEESTAAI-ATL43" + }, + { + "id": "ATL64", + "name": "FORLOAAJ-ATL64" + }, + { + "id": "TAT33", + "name": "TESAAISA-TAT33" + }, + { + "id": "RAD10", + "name": "INDIPUNE-RAD10" + }, + { + "id": "RTW5", + "name": "BHYTFRY4-RTW5" + }, + { + "id": "JGS1", + "name": "KSJKKKKK-JGS1" + }, + { + "id": "ATL98", + "name": "TEESTAAI-ATL43" + }, + { + "id": "WAN1", + "name": "LEIWANGW-WAN1" + }, + { + "id": "ATL44", + "name": "ATLSANAB-ATL44" + }, + { + "id": "RTD2", + "name": "BHYTFRk4-RTD2" + }, + { + "id": "NIR1", + "name": "ORFLMANA-NIR1" + }, + { + "id": "ATL75", + "name": "SANAAIRE-ATL75" + }, + { + "id": "NUM1", + "name": "QWERTYUI-NUM1" + }, + { + "id": "MTN32", + "name": "MDTWNJ21-MTN32" + }, + { + "id": "RTZ4", + "name": "BHYTFRZ6-RTZ4" + }, + { + "id": "ATL56", + "name": "ATLSANAC-ATL56" + }, + { + "id": "AMS1", + "name": "AMSTNLBW-AMS1" + }, + { + "id": "RCT1", + "name": "AMSTERNL-RCT1" + }, + { + "id": "JAN1", + "name": "ORFLMATT-JAN1" + }, + { + "id": "ABC14", + "name": "TESAAISA-ABC14" + }, + { + "id": "TAT37", + "name": "TESAAISD-TAT37" + }, + { + "id": "MIC54", + "name": "MICHIGAN-MIC54" + }, + { + "id": "ABC11", + "name": "ATLSANAI-ABC11" + }, + { + "id": "AMF11", + "name": "AMDOCS01-AMF11" + }, + { + "id": "ATL63", + "name": "ATLSANEW-ATL63" + }, + { + "id": "ABC12", + "name": "ATLSECIA-ABC12" + }, + { + "id": "MTN20", + "name": "MDTWNJ21-MTN20" + }, + { + "id": "ABC15", + "name": "AAITESAN-ABC15" + }, + { + "id": "AVT1", + "name": "AVTRFLHD-AVT1" + }, + { + "id": "ATL34", + "name": "ATLSANAI-ATL34" + } + ], + "categoryParameters": { + "owningEntityList": [ + { + "id": "aaa1", + "name": "aaa1" + }, + { + "id": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc", + "name": "WayneHolland" + }, + { + "id": "Melissa", + "name": "Melissa" + } + ], + "projectList": [ + { + "id": "WATKINS", + "name": "WATKINS" + }, + { + "id": "x1", + "name": "x1" + }, + { + "id": "yyy1", + "name": "yyy1" + } + ], + "lineOfBusinessList": [ + { + "id": "ONAP", + "name": "ONAP" + }, + { + "id": "zzz1", + "name": "zzz1" + } + ], + "platformList": [ + { + "id": "platform", + "name": "platform" + }, + { + "id": "xxx1", + "name": "xxx1" + } + ] + }, + "type": "[LCP_REGIONS_AND_TENANTS] Update", + "subscribers": [ + { + "id": "CAR_2020_ER", + "name": "CAR_2020_ER", + "isPermitted": true + }, + { + "id": "21014aa2-526b-11e6-beb8-9e71128cae77", + "name": "JULIO ERICKSON", + "isPermitted": false + }, + { + "id": "DHV1707-TestSubscriber-2", + "name": "DALE BRIDGES", + "isPermitted": false + }, + { + "id": "DHV1707-TestSubscriber-1", + "name": "LLOYD BRIDGES", + "isPermitted": false + }, + { + "id": "jimmy-example", + "name": "JimmyExampleCust-20161102", + "isPermitted": false + }, + { + "id": "jimmy-example2", + "name": "JimmyExampleCust-20161103", + "isPermitted": false + }, + { + "id": "ERICA5779-TestSub-PWT-102", + "name": "ERICA5779-TestSub-PWT-102", + "isPermitted": false + }, + { + "id": "ERICA5779-TestSub-PWT-101", + "name": "ERICA5779-TestSub-PWT-101", + "isPermitted": false + }, + { + "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb", + "name": "Emanuel", + "isPermitted": false + }, + { + "id": "ERICA5779-Subscriber-4", + "name": "ERICA5779-Subscriber-5", + "isPermitted": false + }, + { + "id": "ERICA5779-TestSub-PWT-103", + "name": "ERICA5779-TestSub-PWT-103", + "isPermitted": false + }, + { + "id": "ERICA5779-Subscriber-2", + "name": "ERICA5779-Subscriber-2", + "isPermitted": false + }, + { + "id": "e433710f-9217-458d-a79d-1c7aff376d89", + "name": "SILVIA ROBBINS", + "isPermitted": true + }, + { + "id": "ERICA5779-Subscriber-3", + "name": "ERICA5779-Subscriber-3", + "isPermitted": false + }, + { + "id": "31739f3e-526b-11e6-beb8-9e71128cae77", + "name": "CRAIG/ROBERTS", + "isPermitted": false + } + ] + } +} +} +} + +class MockFeatureFlagsService {} + +describe('Network Control Generator', () => { + let injector; + let service: NetworkControlGenerator; + let httpMock: HttpTestingController; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + providers: [NetworkControlGenerator, + GenericFormService, + BasicControlGenerator, + AaiService, + FormBuilder, + LogService, + {provide:FeatureFlagsService, useClass: MockFeatureFlagsService}, + {provide: NgRedux, useClass: MockAppStore}] + }); + + injector = getTestBed(); + service = injector.get(NetworkControlGenerator); + httpMock = injector.get(HttpTestingController); + }); + + test('getMacroFormControls check for mandatory controls', () => { + const serviceId : string = "6e59c5de-f052-46fa-aa7e-2fca9d674c44"; + const networkName : string = "ExtVL 0"; + const networkStoreKey : string = "ExtVL 0"; + const controls :FormControlModel[] = service.getMacroFormControls(serviceId, networkStoreKey, networkName, false); + + const mandatoryControls : string[] = [ + FormControlNames.LCPCLOUD_REGION_ID, + 'tenantId', + 'platformName' + ]; + for(let i = 0 ; i < mandatoryControls.length ; i++){ + let requiredExist = controls.find(ctrl => ctrl.controlName === mandatoryControls[i]).validations.find(item => item.validatorName === 'required'); + expect(requiredExist).toBeDefined(); + } + }); + + + test('getMacroFormControls should return instance name if isEcompName is true', () => { + const serviceId : string = "6e59c5de-f052-46fa-aa7e-2fca9d674c44"; + const networkName : string = "ExtVL 1"; + const networkStoreKey : string = "ExtVL 1"; + const controls :FormControlModel[] = service.getMacroFormControls(serviceId, networkStoreKey, networkName, false); + + const controlsOrderNames = [ + FormControlNames.INSTANCE_NAME, + FormControlNames.PRODUCT_FAMILY_ID, + FormControlNames.LCPCLOUD_REGION_ID , + 'legacyRegion', + 'tenantId', + 'platformName', + 'lineOfBusiness']; + + + + expect(controls.length).toEqual(7); + for(let i = 0 ; i < controls.length ; i++){ + expect(controls[i].controlName).toEqual(controlsOrderNames[i]); + } + }); + + test('getMacroFormControls should return the correct order of controls', () => { + const serviceId : string = "6e59c5de-f052-46fa-aa7e-2fca9d674c44"; + const networkName : string = "ExtVL 0"; + const networkStoreKey : string = "ExtVL 0"; + const controls :FormControlModel[] = service.getMacroFormControls(serviceId, networkStoreKey, networkName, false); + + const controlsOrderNames = [ + FormControlNames.INSTANCE_NAME, + FormControlNames.PRODUCT_FAMILY_ID, + FormControlNames.LCPCLOUD_REGION_ID , + 'legacyRegion', + 'tenantId', + 'platformName', + 'lineOfBusiness']; + + + + expect(controls.length).toEqual(7); + for(let i = 0 ; i < controls.length ; i++){ + expect(controls[i].controlName).toEqual(controlsOrderNames[i]); + } + }); + + test('getMacroFormControls should not return the rollback status', () => { + const serviceId : string = "6e59c5de-f052-46fa-aa7e-2fca9d674c44"; + const networkName : string = "ExtVL 0"; + const networkStoreKey : string = "ExtVL 0"; + const controls :FormControlModel[] = service.getMacroFormControls(serviceId, networkStoreKey, networkName, false); + + const controlsOrderNames = [ + FormControlNames.INSTANCE_NAME, + FormControlNames.PRODUCT_FAMILY_ID, + FormControlNames.LCPCLOUD_REGION_ID , + 'legacyRegion', + 'tenantId', + 'platformName', + 'lineOfBusiness', + FormControlNames.ROLLBACK_ON_FAILURE + ]; + + + + expect(controls.length).toEqual(7); + for(let i = 0 ; i < controls.length ; i++){ + expect(controls[i].controlName).toEqual(controlsOrderNames[i]); + } + }); + + test('getAlacartFormControls should return the correct order of controls', () => { + const controls:FormControlModel[] = getAlaCarteFormControls(); + + const controlsOrderNames = [ + FormControlNames.INSTANCE_NAME, + FormControlNames.PRODUCT_FAMILY_ID, + FormControlNames.LCPCLOUD_REGION_ID, + 'legacyRegion', + 'tenantId', + 'platformName', + 'lineOfBusiness', + 'rollbackOnFailure']; + expect(controls.length).toEqual(8); + for(let i = 0 ; i < controls.length ; i++) { + expect(controls[i].controlName).toEqual(controlsOrderNames[i]); + } + }); + + function getAlaCarteFormControls(): FormControlModel[] { + const serviceId: string = "6e59c5de-f052-46fa-aa7e-2fca9d674c44"; + const networkName: string = "ExtVL 0"; + const networkStoreKey: string = "ExtVL 0"; + const controls: FormControlModel[] = service.getAlaCarteFormControls(serviceId, networkStoreKey, networkName, false); + return controls; + } + + test('getAlacartFormControls instance name control validator shall have the expected regex', () => { + const controls:FormControlModel[] = getAlaCarteFormControls(); + + const instanceNameControl: FormControlModel = <FormControlModel>controls.find(item => item.controlName === FormControlNames.INSTANCE_NAME); + const instanceNameValidator: ValidatorModel = instanceNameControl.validations.find(val => val.validatorName === ValidatorOptions.pattern); + expect(instanceNameValidator.validatorArg).toEqual(/^[a-zA-Z0-9._-]*$/); + }); + + test('getAlacartFormControls check for mandatory controls', () => { + const controls:FormControlModel[] = getAlaCarteFormControls(); + + const mandatoryControls : string[] = [ + FormControlNames.INSTANCE_NAME, + FormControlNames.LCPCLOUD_REGION_ID, + 'tenantId', + 'platformName', + 'rollbackOnFailure' + ]; + for(let i = 0 ; i < mandatoryControls.length ; i++){ + let requiredExist = controls.find(ctrl => ctrl.controlName === mandatoryControls[i]).validations.find(item => item.validatorName === 'required'); + expect(requiredExist).toBeDefined(); + } + }); +}); + diff --git a/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/networkGenerator/network.control.generator.ts b/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/networkGenerator/network.control.generator.ts new file mode 100644 index 000000000..c3a622338 --- /dev/null +++ b/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/networkGenerator/network.control.generator.ts @@ -0,0 +1,247 @@ +import {Injectable} from "@angular/core"; +import {GenericFormService} from "../../generic-form.service"; +import {AaiService} from "../../../../services/aaiService/aai.service"; +import {NgRedux} from "@angular-redux/store"; +import {HttpClient} from "@angular/common/http"; +import {BasicControlGenerator} from "../basic.control.generator"; +import * as _ from 'lodash'; +import {Observable, of} from "rxjs"; + +import { + FormControlModel, + ValidatorModel, + ValidatorOptions +} from "../../../../models/formControlModels/formControl.model"; +import {LogService} from "../../../../utils/log/log.service"; +import {AppState} from "../../../../store/reducers"; +import {FormGroup} from "@angular/forms"; +import {DropdownFormControl} from "../../../../models/formControlModels/dropdownFormControl.model"; +import {FormControlType} from "../../../../models/formControlModels/formControlTypes.enum"; +import {InputFormControl} from "../../../../models/formControlModels/inputFormControl.model"; +import {SelectOption} from "../../../../models/selectOption"; +import {NetworkInstance} from "../../../../models/networkInstance"; +import {NetworkModel} from "../../../../models/networkModel"; +import {Constants} from "../../../../utils/constants"; + +export enum FormControlNames { + INSTANCE_NAME = 'instanceName', + GLOBAL_SUBSCRIBER_ID = 'globalSubscriberId', + PRODUCT_FAMILY_ID = 'productFamilyId', + LCPCLOUD_REGION_ID = 'lcpCloudRegionId', + TENANT_ID = 'tenantId', + AICZONE_ID = 'aicZoneId', + ROLLBACK_ON_FAILURE = 'rollbackOnFailure', + LEGACY_REGION = 'legacyRegion' +} + + +enum InputType { + LCP_REGION = "lcpCloudRegionId", + TENANT = "tenantId", + LOB = "lineOfBusiness", + PLATFORM = "platformName", + ROLLBACK = "rollbackOnFailure", + PRODUCT_FAMILY = "productFamilyId", + VG = "volumeGroupName" +} + +@Injectable() +export class NetworkControlGenerator { + aaiService: AaiService; + + constructor(private genericFormService: GenericFormService, + private _basicControlGenerator: BasicControlGenerator, + private store: NgRedux<AppState>, + private http: HttpClient, + private _aaiService: AaiService, + private _logService: LogService) { + this.aaiService = _aaiService; + } + + getNetworkInstance = (serviceId: string, networkName: string, isUpdateMode : boolean): NetworkInstance => { + let networkInstance : NetworkInstance = null; + if (isUpdateMode && this.store.getState().service.serviceInstance[serviceId] && _.has(this.store.getState().service.serviceInstance[serviceId].networks, networkName)) { + networkInstance = Object.assign({}, this.store.getState().service.serviceInstance[serviceId].networks[networkName]); + } + return networkInstance; + }; + + + getMacroFormControls(serviceId: string, networkStoreKey: string, networkName: string, isUpdateMode : boolean): FormControlModel[] { + networkStoreKey = _.isNil(networkStoreKey) ? networkName : networkStoreKey; + + if (_.isNil(serviceId) || _.isNil(networkStoreKey) || _.isNil(networkName)) { + this._logService.error('should provide serviceId, networkName, networkStoreKey', serviceId); + return []; + } + + const networkInstance = this.getNetworkInstance(serviceId, networkStoreKey, isUpdateMode); + const networkModel = new NetworkModel(this.store.getState().service.serviceHierarchy[serviceId].networks[networkName]); + let result: FormControlModel[] = []; + + if (!_.isNil(networkModel)) { + result.push(this.getInstanceName(networkInstance, serviceId, networkName, networkModel.isEcompGeneratedNaming)); + result.push(this._basicControlGenerator.getProductFamilyControl(networkInstance, result, false)); + result.push(this.getLcpRegionControl(serviceId, networkInstance, result)); + result.push(this._basicControlGenerator.getLegacyRegion(networkInstance)); + result.push(this.getTenantControl(serviceId, networkInstance, result)); + result.push(this.getPlatformControl(networkInstance, result)); + result.push(this.getLineOfBusinessControl(networkInstance, result)); + } + return result; + + } + + getAlaCarteFormControls(serviceId: string, networkStoreKey: string, networkName: string, isUpdateMode : boolean): FormControlModel[] { + networkStoreKey = _.isNil(networkStoreKey) ? networkName : networkStoreKey; + if (_.isNil(serviceId) || _.isNil(networkStoreKey) || _.isNil(networkName)) { + this._logService.error('should provide serviceId, networkName, networkStoreKey', serviceId); + return []; + } + + let result: FormControlModel[] = []; + const networkInstance = this.getNetworkInstance(serviceId, networkStoreKey, isUpdateMode); + const networkModel = new NetworkModel(this.store.getState().service.serviceHierarchy[serviceId].networks[networkName]); + + if (!_.isNil(networkModel)) { + result.push(this.getInstanceName(networkInstance, serviceId, networkName, networkModel.isEcompGeneratedNaming)); + result.push(this._basicControlGenerator.getProductFamilyControl(networkInstance, result, false)); + result.push(this.getLcpRegionControl(serviceId, networkInstance, result)); + result.push(this._basicControlGenerator.getLegacyRegion(networkInstance)); + result.push(this.getTenantControl(serviceId, networkInstance, result)); + result.push(this.getPlatformControl(networkInstance, result)); + result.push(this.getLineOfBusinessControl(networkInstance, result)); + result.push(this.getRollbackOnFailureControl(networkInstance, result)); + } + return result; + + } + + isInputShouldBeShown = (inputType: any): boolean => { + let networkInputs = [InputType.LCP_REGION, InputType.LOB, InputType.TENANT, InputType.PRODUCT_FAMILY, InputType.PLATFORM, InputType.ROLLBACK]; + return networkInputs.indexOf(inputType) > -1; + }; + + getInstanceName(instance : any, serviceId : string, networkName : string, isEcompGeneratedNaming: boolean): FormControlModel { + const networkModel : NetworkModel = this.store.getState().service.serviceHierarchy[serviceId].networks[networkName]; + return this._basicControlGenerator.getInstanceNameController(instance, serviceId, isEcompGeneratedNaming, networkModel); + } + + getLineOfBusinessControl = (instance: any, controls: FormControlModel[]): DropdownFormControl => { + return new DropdownFormControl({ + type: FormControlType.DROPDOWN, + controlName: 'lineOfBusiness', + displayName: 'Line of business', + dataTestId: 'lineOfBusiness', + placeHolder: 'Select Line Of Business', + isDisabled: false, + name: "lineOfBusiness", + value: instance ? instance.lineOfBusiness : null, + validations: [], + onInitSelectedField: ['lineOfBusinessList'], + onInit: this._basicControlGenerator.getSubscribeInitResult.bind(null, this._aaiService.getCategoryParameters) + }) + }; + + getPlatformControl = (instance: any, controls: FormControlModel[]): DropdownFormControl => { + return new DropdownFormControl({ + type: FormControlType.DROPDOWN, + controlName: 'platformName', + displayName: 'Platform', + dataTestId: 'platform', + placeHolder: 'Select Platform', + isDisabled: false, + name: "platform", + value: instance ? instance.platformName : null, + validations: [new ValidatorModel(ValidatorOptions.required, 'is required')], + onInitSelectedField: ['platformList'], + onInit: this._basicControlGenerator.getSubscribeInitResult.bind(null, this._aaiService.getCategoryParameters) + }) + }; + + getTenantControl = (serviceId: string, instance: any, controls: FormControlModel[]): DropdownFormControl => { + const service = this.store.getState().service.serviceInstance[serviceId]; + const globalCustomerId: string = service.globalSubscriberId; + const serviceType: string = service.subscriptionServiceType; + return new DropdownFormControl({ + type: FormControlType.DROPDOWN, + controlName: FormControlNames.TENANT_ID, + displayName: 'Tenant', + dataTestId: 'tenant', + placeHolder: 'Select Tenant', + name: "tenant", + isDisabled: _.isNil(instance) || _.isNil(instance.lcpCloudRegionId), + onInitSelectedField: instance ? ['lcpRegionsTenantsMap', instance.lcpCloudRegionId] : null, + value: instance ? instance.tenantId : null, + validations: [new ValidatorModel(ValidatorOptions.required, 'is required')], + onInit : instance ? this._basicControlGenerator.getSubscribeInitResult.bind( + this._aaiService, + this.aaiService.getLcpRegionsAndTenants.bind(this, globalCustomerId, serviceType)) : ()=>{}, + }) + }; + + getLcpRegionControl = (serviceId: string, instance: any, controls: FormControlModel[]): DropdownFormControl => { + const service = this.store.getState().service.serviceInstance[serviceId]; + const globalCustomerId: string = service.globalSubscriberId; + const serviceType: string = service.subscriptionServiceType; + return new DropdownFormControl({ + type: FormControlType.DROPDOWN, + controlName: 'lcpCloudRegionId', + displayName: 'LCP region', + dataTestId: 'lcpRegion', + placeHolder: 'Select LCP Region', + name: "lcpRegion", + isDisabled: false, + value: instance ? instance.lcpCloudRegionId : null, + validations: [new ValidatorModel(ValidatorOptions.required, 'is required')], + onInitSelectedField: ['lcpRegionList'], + onInit: this._basicControlGenerator.getSubscribeInitResult.bind( + this._aaiService, + this._aaiService.getLcpRegionsAndTenants.bind(this, globalCustomerId, serviceType)), + onChange: (param: string, form: FormGroup) => { + form.controls[FormControlNames.TENANT_ID].enable(); + form.controls[FormControlNames.TENANT_ID].reset(); + if (!_.isNil(globalCustomerId) && !_.isNil(serviceType)) { + this._basicControlGenerator.getSubscribeResult.bind(this, this._aaiService.getLcpRegionsAndTenants(globalCustomerId, serviceType).subscribe(res => { + controls.find(item => item.controlName === FormControlNames.TENANT_ID)['options$'] = res.lcpRegionsTenantsMap[param]; + if(res.lcpRegionsTenantsMap[param]){ + controls.find(item => item.controlName === FormControlNames.TENANT_ID)['hasEmptyOptions'] = res.lcpRegionsTenantsMap[param].length === 0; + } + })); + } + + if (Constants.LegacyRegion.MEGA_REGION.indexOf(param) !== -1) { + form.controls['legacyRegion'].enable(); + controls.find(item => item.controlName === 'legacyRegion').isVisible = true; + + } else { + controls.find(item => item.controlName === 'legacyRegion').isVisible = false; + form.controls['legacyRegion'].setValue(null); + form.controls['legacyRegion'].reset(); + form.controls['legacyRegion'].disable(); + } + } + }) + }; + + getRollbackOnFailureControl = (instance: any, controls: FormControlModel[]): DropdownFormControl => { + return new DropdownFormControl({ + type: FormControlType.DROPDOWN, + controlName: FormControlNames.ROLLBACK_ON_FAILURE, + displayName: 'Rollback on failure', + dataTestId: 'rollback', + placeHolder: 'Rollback on failure', + isDisabled: false, + validations: [new ValidatorModel(ValidatorOptions.required, 'is required')], + value: instance ? instance.rollbackOnFailure : 'true', + onInit: this._basicControlGenerator.getSubscribeInitResult.bind(null, this.getRollBackOnFailureOptions) + }) + }; + + getRollBackOnFailureOptions = (): Observable<SelectOption[]> => { + return of([ + new SelectOption({id: 'true', name: 'Rollback'}), + new SelectOption({id: 'false', name: 'Don\'t Rollback'}) + ]); + }; +} diff --git a/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/service.control.generator.spec.ts b/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/service.control.generator.spec.ts new file mode 100644 index 000000000..b7a728c6d --- /dev/null +++ b/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/service.control.generator.spec.ts @@ -0,0 +1,1859 @@ +import {getTestBed, TestBed} from '@angular/core/testing'; +import {HttpClientTestingModule, HttpTestingController} from '@angular/common/http/testing'; +import {NgRedux} from '@angular-redux/store'; +import {FormControlNames, ServiceControlGenerator} from "./service.control.generator"; +import {BasicControlGenerator} from "./basic.control.generator"; +import {AaiService} from "../../../services/aaiService/aai.service"; +import {GenericFormService} from "../generic-form.service"; +import {FormBuilder} from "@angular/forms"; +import {FormControlModel, ValidatorModel, ValidatorOptions} from "../../../models/formControlModels/formControl.model"; +import {LogService} from "../../../utils/log/log.service"; +import {FormControlType} from "../../../models/formControlModels/formControlTypes.enum"; +import {DropdownFormControl} from "../../../models/formControlModels/dropdownFormControl.model"; +import {FeatureFlagsService} from "../../../services/featureFlag/feature-flags.service"; + +class MockAppStore<T> { + getState(){ + return { + "global": { + "name": null, + "flags": { + "FLAG_NETWORK_TO_ASYNC_INSTANTIATION": false, + "FLAG_SHOW_ASSIGNMENTS": true, + "FLAG_FABRIC_CONFIGURATION_ASSIGNMENTS": true, + "FLAG_UNASSIGN_SERVICE": true, + "FLAG_SHOW_VERIFY_SERVICE": false, + "FLAG_COLLECTION_RESOURCE_SUPPORT": true, + "FLAG_DUPLICATE_VNF": true, + "FLAG_SERVICE_MODEL_CACHE": true, + "CREATE_INSTANCE_TEST": false, + "FLAG_SETTING_DEFAULTS_IN_DRAWING_BOARD": false, + "FLAG_ASYNC_INSTANTIATION": true, + "FLAG_ASYNC_JOBS": true, + "EMPTY_DRAWING_BOARD_TEST": false, + "FLAG_ADD_MSO_TESTAPI_FIELD": true + }, + "type": "[FLAGS] Update" + }, + "service": { + "serviceHierarchy": { + "6e59c5de-f052-46fa-aa7e-2fca9d674c44": { + "service": { + "uuid": "6e59c5de-f052-46fa-aa7e-2fca9d674c44", + "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0", + "name": "ComplexService", + "version": "1.0", + "toscaModelURL": null, + "category": "Emanuel", + "serviceType": "", + "serviceRole": "", + "description": "ComplexService", + "serviceEcompNaming": "false", + "instantiationType": "Macro", + "inputs": {} + }, + "vnfs": { + "VF_vMee 0": { + "uuid": "d6557200-ecf2-4641-8094-5393ae3aae60", + "invariantUuid": "4160458e-f648-4b30-a176-43881ffffe9e", + "description": "VSP_vMee", + "name": "VF_vMee", + "version": "2.0", + "customizationUuid": "91415b44-753d-494c-926a-456a9172bbb9", + "inputs": {}, + "commands": {}, + "properties": { + "max_instances": 10, + "min_instances": 1, + "gpb2_Internal2_mac": "00:11:22:EF:AC:DF", + "sctp-b-ipv6-egress_src_start_port": "0", + "sctp-a-ipv6-egress_rule_application": "any", + "Internal2_allow_transit": "true", + "sctp-b-IPv6_ethertype": "IPv6", + "sctp-a-egress_rule_application": "any", + "sctp-b-ingress_action": "pass", + "sctp-b-ingress_rule_protocol": "icmp", + "ncb2_Internal1_mac": "00:11:22:EF:AC:DF", + "sctp-b-ipv6-ingress-src_start_port": "0.0", + "ncb1_Internal2_mac": "00:11:22:EF:AC:DF", + "fsb_volume_size_0": "320.0", + "sctp-b-egress_src_addresses": "local", + "sctp-a-ipv6-ingress_ethertype": "IPv4", + "sctp-a-ipv6-ingress-dst_start_port": "0", + "sctp-b-ipv6-ingress_rule_application": "any", + "domain_name": "default-domain", + "sctp-a-ingress_rule_protocol": "icmp", + "sctp-b-egress-src_start_port": "0.0", + "sctp-a-egress_src_addresses": "local", + "sctp-b-display_name": "epc-sctp-b-ipv4v6-sec-group", + "sctp-a-egress-src_start_port": "0.0", + "sctp-a-ingress_ethertype": "IPv4", + "sctp-b-ipv6-ingress-dst_end_port": "65535", + "sctp-b-dst_subnet_prefix_v6": "::", + "nf_naming": "{ecomp_generated_naming=true}", + "sctp-a-ipv6-ingress_src_subnet_prefix": "0.0.0.0", + "sctp-b-egress-dst_start_port": "0.0", + "ncb_flavor_name": "nv.c20r64d1", + "gpb1_Internal1_mac": "00:11:22:EF:AC:DF", + "sctp-b-egress_dst_subnet_prefix_len": "0.0", + "Internal2_net_cidr": "10.0.0.10", + "sctp-a-ingress-dst_start_port": "0.0", + "sctp-a-egress-dst_start_port": "0.0", + "fsb1_Internal2_mac": "00:11:22:EF:AC:DF", + "sctp-a-egress_ethertype": "IPv4", + "vlc_st_service_mode": "in-network-nat", + "sctp-a-ipv6-egress_ethertype": "IPv4", + "sctp-a-egress-src_end_port": "65535.0", + "sctp-b-ipv6-egress_rule_application": "any", + "sctp-b-egress_action": "pass", + "sctp-a-ingress-src_subnet_prefix_len": "0.0", + "sctp-b-ipv6-ingress-src_end_port": "65535.0", + "sctp-b-name": "epc-sctp-b-ipv4v6-sec-group", + "fsb2_Internal1_mac": "00:11:22:EF:AC:DF", + "sctp-a-ipv6-ingress-src_start_port": "0.0", + "sctp-b-ipv6-egress_ethertype": "IPv4", + "Internal1_net_cidr": "10.0.0.10", + "sctp-a-egress_dst_subnet_prefix": "0.0.0.0", + "fsb_flavor_name": "nv.c20r64d1", + "sctp_rule_protocol": "132", + "sctp-b-ipv6-ingress_src_subnet_prefix_len": "0", + "sctp-a-ipv6-ingress_rule_application": "any", + "ecomp_generated_naming": "false", + "sctp-a-IPv6_ethertype": "IPv6", + "vlc2_Internal1_mac": "00:11:22:EF:AC:DF", + "vlc_st_virtualization_type": "virtual-machine", + "sctp-b-ingress-dst_start_port": "0.0", + "sctp-b-ingress-dst_end_port": "65535.0", + "sctp-a-ipv6-ingress-src_end_port": "65535.0", + "sctp-a-display_name": "epc-sctp-a-ipv4v6-sec-group", + "sctp-b-ingress_rule_application": "any", + "int2_sec_group_name": "int2-sec-group", + "vlc_flavor_name": "nd.c16r64d1", + "sctp-b-ipv6-egress_src_addresses": "local", + "vlc_st_interface_type_int1": "other1", + "sctp-b-egress-src_end_port": "65535.0", + "sctp-a-ipv6-egress-dst_start_port": "0", + "vlc_st_interface_type_int2": "other2", + "sctp-a-ipv6-egress_rule_protocol": "any", + "Internal2_shared": "false", + "sctp-a-ipv6-egress_dst_subnet_prefix_len": "0", + "Internal2_rpf": "disable", + "vlc1_Internal1_mac": "00:11:22:EF:AC:DF", + "sctp-b-ipv6-egress_src_end_port": "65535", + "sctp-a-ipv6-egress_src_addresses": "local", + "sctp-a-ingress-dst_end_port": "65535.0", + "sctp-a-ipv6-egress_src_end_port": "65535", + "Internal1_forwarding_mode": "l2", + "Internal2_dhcp": "false", + "sctp-a-dst_subnet_prefix_v6": "::", + "pxe_image_name": "MME_PXE-Boot_16ACP04_GA.qcow2", + "vlc_st_interface_type_gtp": "other0", + "ncb1_Internal1_mac": "00:11:22:EF:AC:DF", + "sctp-b-src_subnet_prefix_v6": "::", + "sctp-a-egress_dst_subnet_prefix_len": "0.0", + "int1_sec_group_name": "int1-sec-group", + "Internal1_dhcp": "false", + "sctp-a-ipv6-egress_dst_end_port": "65535", + "Internal2_forwarding_mode": "l2", + "fsb2_Internal2_mac": "00:11:22:EF:AC:DF", + "sctp-b-egress_dst_subnet_prefix": "0.0.0.0", + "Internal1_net_cidr_len": "17", + "gpb2_Internal1_mac": "00:11:22:EF:AC:DF", + "sctp-b-ingress-src_subnet_prefix_len": "0.0", + "sctp-a-ingress_dst_addresses": "local", + "sctp-a-egress_action": "pass", + "fsb_volume_type_0": "SF-Default-SSD", + "ncb2_Internal2_mac": "00:11:22:EF:AC:DF", + "vlc_st_interface_type_sctp_a": "left", + "vlc_st_interface_type_sctp_b": "right", + "sctp-a-src_subnet_prefix_v6": "::", + "vlc_st_version": "2", + "sctp-b-egress_ethertype": "IPv4", + "sctp-a-ingress_rule_application": "any", + "gpb1_Internal2_mac": "00:11:22:EF:AC:DF", + "instance_ip_family_v6": "v6", + "sctp-a-ipv6-egress_src_start_port": "0", + "sctp-b-ingress-src_start_port": "0.0", + "sctp-b-ingress_dst_addresses": "local", + "fsb1_Internal1_mac": "00:11:22:EF:AC:DF", + "vlc_st_interface_type_oam": "management", + "multi_stage_design": "true", + "oam_sec_group_name": "oam-sec-group", + "Internal2_net_gateway": "10.0.0.10", + "sctp-a-ipv6-ingress-dst_end_port": "65535", + "sctp-b-ipv6-egress-dst_start_port": "0", + "Internal1_net_gateway": "10.0.0.10", + "sctp-b-ipv6-egress_rule_protocol": "any", + "gtp_sec_group_name": "gtp-sec-group", + "sctp-a-ipv6-egress_dst_subnet_prefix": "0.0.0.0", + "sctp-b-ipv6-egress_dst_subnet_prefix_len": "0", + "sctp-a-ipv6-ingress_dst_addresses": "local", + "sctp-a-egress_rule_protocol": "icmp", + "sctp-b-ipv6-egress_action": "pass", + "sctp-a-ipv6-egress_action": "pass", + "Internal1_shared": "false", + "sctp-b-ipv6-ingress_rule_protocol": "any", + "Internal2_net_cidr_len": "17", + "sctp-a-name": "epc-sctp-a-ipv4v6-sec-group", + "sctp-a-ingress-src_end_port": "65535.0", + "sctp-b-ipv6-ingress_src_subnet_prefix": "0.0.0.0", + "sctp-a-egress-dst_end_port": "65535.0", + "sctp-a-ingress_action": "pass", + "sctp-b-egress_rule_protocol": "icmp", + "sctp-b-ipv6-ingress_action": "pass", + "vlc_st_service_type": "firewall", + "sctp-b-ipv6-egress_dst_end_port": "65535", + "sctp-b-ipv6-ingress-dst_start_port": "0", + "vlc2_Internal2_mac": "00:11:22:EF:AC:DF", + "vlc_st_availability_zone": "true", + "fsb_volume_image_name_1": "MME_FSB2_16ACP04_GA.qcow2", + "sctp-b-ingress-src_subnet_prefix": "0.0.0.0", + "sctp-a-ipv6-ingress_src_subnet_prefix_len": "0", + "Internal1_allow_transit": "true", + "gpb_flavor_name": "nv.c20r64d1", + "availability_zone_max_count": "1", + "fsb_volume_image_name_0": "MME_FSB1_16ACP04_GA.qcow2", + "sctp-b-ipv6-ingress_dst_addresses": "local", + "sctp-b-ipv6-egress_dst_subnet_prefix": "0.0.0.0", + "sctp-b-ipv6-ingress_ethertype": "IPv4", + "vlc1_Internal2_mac": "00:11:22:EF:AC:DF", + "sctp-a-ingress-src_subnet_prefix": "0.0.0.0", + "sctp-a-ipv6-ingress_action": "pass", + "Internal1_rpf": "disable", + "sctp-b-ingress_ethertype": "IPv4", + "sctp-b-egress_rule_application": "any", + "sctp-b-ingress-src_end_port": "65535.0", + "sctp-a-ipv6-ingress_rule_protocol": "any", + "sctp-a-ingress-src_start_port": "0.0", + "sctp-b-egress-dst_end_port": "65535.0" + }, + "type": "VF", + "modelCustomizationName": "VF_vMee 0", + "vfModules": { + "vf_vmee0..VfVmee..vmme_vlc..module-1": { + "uuid": "522159d5-d6e0-4c2a-aa44-5a542a12a830", + "invariantUuid": "98a7c88b-b577-476a-90e4-e25a5871e02b", + "customizationUuid": "55b1be94-671a-403e-a26c-667e9c47d091", + "description": null, + "name": "VfVmee..vmme_vlc..module-1", + "version": "2", + "modelCustomizationName": "VfVmee..vmme_vlc..module-1", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "vmme_vlc" + }, + "inputs": {}, + "volumeGroupAllowed": true + }, + "vf_vmee0..VfVmee..vmme_gpb..module-2": { + "uuid": "41708296-e443-4c71-953f-d9a010f059e1", + "invariantUuid": "1cca90b8-3490-495e-87da-3f3e4c57d5b9", + "customizationUuid": "6add59e0-7fe1-4bc4-af48-f8812422ae7c", + "description": null, + "name": "VfVmee..vmme_gpb..module-2", + "version": "2", + "modelCustomizationName": "VfVmee..vmme_gpb..module-2", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "vmme_gpb" + }, + "inputs": {}, + "volumeGroupAllowed": false + }, + "vf_vmee0..VfVmee..base_vmme..module-0": { + "uuid": "a27f5cfc-7f12-4f99-af08-0af9c3885c87", + "invariantUuid": "a6f9e51a-2b35-416a-ae15-15e58d61f36d", + "customizationUuid": "f8c040f1-7e51-4a11-aca8-acf256cfd861", + "description": null, + "name": "VfVmee..base_vmme..module-0", + "version": "2", + "modelCustomizationName": "VfVmee..base_vmme..module-0", + "properties": { + "minCountInstances": 1, + "maxCountInstances": 1, + "initialCount": 1, + "vfModuleLabel": "base_vmme" + }, + "inputs": {}, + "volumeGroupAllowed": true + } + }, + "volumeGroups": { + "vf_vmee0..VfVmee..base_vmme..module-0": { + "uuid": "a27f5cfc-7f12-4f99-af08-0af9c3885c87", + "invariantUuid": "a6f9e51a-2b35-416a-ae15-15e58d61f36d", + "customizationUuid": "f8c040f1-7e51-4a11-aca8-acf256cfd861", + "description": null, + "name": "VfVmee..base_vmme..module-0", + "version": "2", + "modelCustomizationName": "VfVmee..base_vmme..module-0", + "properties": { + "minCountInstances": 1, + "maxCountInstances": 1, + "initialCount": 1, + "vfModuleLabel": "base_vmme" + }, + "inputs": {} + } + }, + "vfcInstanceGroups": {} + } + }, + "networks": { + "ExtVL 0": { + "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986", + "invariantUuid": "379f816b-a7aa-422f-be30-17114ff50b7c", + "description": "ECOMP generic virtual link (network) base type for all other service-level and global networks", + "name": "ExtVL", + "version": "37.0", + "customizationUuid": "94fdd893-4a36-4d70-b16a-ec29c54c184f", + "inputs": {}, + "commands": {}, + "properties": { + "network_assignments": "{is_external_network=false, ipv4_subnet_default_assignment={min_subnets_count=1}, ecomp_generated_network_assignment=false, ipv6_subnet_default_assignment={min_subnets_count=1}}", + "exVL_naming": "{ecomp_generated_naming=true}", + "network_flows": "{is_network_policy=false, is_bound_to_vpn=false}", + "network_homing": "{ecomp_selected_instance_node_target=false}" + }, + "type": "VL", + "modelCustomizationName": "ExtVL 0" + } + }, + "collectionResource": {}, + "configurations": { + "Port Mirroring Configuration By Policy 0": { + "uuid": "b4398538-e89d-4f13-b33d-ca323434ba50", + "invariantUuid": "6ef0ca40-f366-4897-951f-abd65d25f6f7", + "description": "A port mirroring configuration by policy object", + "name": "Port Mirroring Configuration By Policy", + "version": "27.0", + "customizationUuid": "3c3b7b8d-8669-4b3b-8664-61970041fad2", + "inputs": {}, + "commands": {}, + "properties": {}, + "type": "Configuration", + "modelCustomizationName": "Port Mirroring Configuration By Policy 0", + "sourceNodes": [], + "collectorNodes": null, + "configurationByPolicy": false + } + }, + "serviceProxies": {}, + "vfModules": { + "vf_vmee0..VfVmee..vmme_vlc..module-1": { + "uuid": "522159d5-d6e0-4c2a-aa44-5a542a12a830", + "invariantUuid": "98a7c88b-b577-476a-90e4-e25a5871e02b", + "customizationUuid": "55b1be94-671a-403e-a26c-667e9c47d091", + "description": null, + "name": "VfVmee..vmme_vlc..module-1", + "version": "2", + "modelCustomizationName": "VfVmee..vmme_vlc..module-1", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "vmme_vlc" + }, + "inputs": {}, + "volumeGroupAllowed": true + }, + "vf_vmee0..VfVmee..vmme_gpb..module-2": { + "uuid": "41708296-e443-4c71-953f-d9a010f059e1", + "invariantUuid": "1cca90b8-3490-495e-87da-3f3e4c57d5b9", + "customizationUuid": "6add59e0-7fe1-4bc4-af48-f8812422ae7c", + "description": null, + "name": "VfVmee..vmme_gpb..module-2", + "version": "2", + "modelCustomizationName": "VfVmee..vmme_gpb..module-2", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "vmme_gpb" + }, + "inputs": {}, + "volumeGroupAllowed": false + }, + "vf_vmee0..VfVmee..base_vmme..module-0": { + "uuid": "a27f5cfc-7f12-4f99-af08-0af9c3885c87", + "invariantUuid": "a6f9e51a-2b35-416a-ae15-15e58d61f36d", + "customizationUuid": "f8c040f1-7e51-4a11-aca8-acf256cfd861", + "description": null, + "name": "VfVmee..base_vmme..module-0", + "version": "2", + "modelCustomizationName": "VfVmee..base_vmme..module-0", + "properties": { + "minCountInstances": 1, + "maxCountInstances": 1, + "initialCount": 1, + "vfModuleLabel": "base_vmme" + }, + "inputs": {}, + "volumeGroupAllowed": true + } + }, + "volumeGroups": { + "vf_vmee0..VfVmee..base_vmme..module-0": { + "uuid": "a27f5cfc-7f12-4f99-af08-0af9c3885c87", + "invariantUuid": "a6f9e51a-2b35-416a-ae15-15e58d61f36d", + "customizationUuid": "f8c040f1-7e51-4a11-aca8-acf256cfd861", + "description": null, + "name": "VfVmee..base_vmme..module-0", + "version": "2", + "modelCustomizationName": "VfVmee..base_vmme..module-0", + "properties": { + "minCountInstances": 1, + "maxCountInstances": 1, + "initialCount": 1, + "vfModuleLabel": "base_vmme" + }, + "inputs": {} + } + }, + "pnfs": {} + } + }, + "serviceInstance": {}, + "lcpRegionsAndTenants": { + "lcpRegionList": [ + { + "id": "JANET25", + "name": "JANET25", + "isPermitted": true + }, + { + "id": "hvf6", + "name": "hvf6", + "isPermitted": true + } + ], + "lcpRegionsTenantsMap": { + "JANET25": [ + { + "id": "092eb9e8e4b7412e8787dd091bc58e86", + "name": "USP-SIP-IC-24335-T-01", + "isPermitted": true + } + ], + "hvf6": [ + { + "id": "bae71557c5bb4d5aac6743a4e5f1d054", + "name": "AIN Web Tool-15-D-testalexandria", + "isPermitted": true + }, + { + "id": "229bcdc6eaeb4ca59d55221141d01f8e", + "name": "AIN Web Tool-15-D-STTest2", + "isPermitted": true + }, + { + "id": "1178612d2b394be4834ad77f567c0af2", + "name": "AIN Web Tool-15-D-SSPtestcustome", + "isPermitted": true + }, + { + "id": "19c5ade915eb461e8af52fb2fd8cd1f2", + "name": "AIN Web Tool-15-D-UncheckedEcopm", + "isPermitted": true + }, + { + "id": "de007636e25249238447264a988a927b", + "name": "AIN Web Tool-15-D-dfsdf", + "isPermitted": true + }, + { + "id": "62f29b3613634ca6a3065cbe0e020c44", + "name": "AIN/SMS-16-D-Multiservices1", + "isPermitted": true + }, + { + "id": "649289e30d3244e0b48098114d63c2aa", + "name": "AIN Web Tool-15-D-SSPST66", + "isPermitted": true + }, + { + "id": "3f21eeea6c2c486bba31dab816c05a32", + "name": "AIN Web Tool-15-D-ASSPST47", + "isPermitted": true + }, + { + "id": "f60ce21d3ee6427586cff0d22b03b773", + "name": "CESAR-100-D-sspjg67246", + "isPermitted": true + }, + { + "id": "8774659e425f479895ae091bb5d46560", + "name": "CESAR-100-D-sspjg68359", + "isPermitted": true + }, + { + "id": "624eb554b0d147c19ff8885341760481", + "name": "AINWebTool-15-D-iftach", + "isPermitted": true + }, + { + "id": "214f55f5fc414c678059c383b03e4962", + "name": "CESAR-100-D-sspjg612401", + "isPermitted": true + }, + { + "id": "c90666c291664841bb98e4d981ff1db5", + "name": "CESAR-100-D-sspjg621340", + "isPermitted": true + }, + { + "id": "ce5b6bc5c7b348e1bf4b91ac9a174278", + "name": "sspjg621351cloned", + "isPermitted": true + }, + { + "id": "b386b768a3f24c8e953abbe0b3488c02", + "name": "AINWebTool-15-D-eteancomp", + "isPermitted": true + }, + { + "id": "dc6c4dbfd225474e9deaadd34968646c", + "name": "AINWebTool-15-T-SPFET", + "isPermitted": true + }, + { + "id": "02cb5030e9914aa4be120bd9ed1e19eb", + "name": "AINWebTool-15-X-eeweww", + "isPermitted": true + }, + { + "id": "f2f3830e4c984d45bcd00e1a04158a79", + "name": "CESAR-100-D-spjg61909", + "isPermitted": true + }, + { + "id": "05b91bd5137f4929878edd965755c06d", + "name": "CESAR-100-D-sspjg621512cloned", + "isPermitted": true + }, + { + "id": "7002fbe8482d4a989ddf445b1ce336e0", + "name": "AINWebTool-15-X-vdr", + "isPermitted": true + }, + { + "id": "4008522be43741dcb1f5422022a2aa0b", + "name": "AINWebTool-15-D-ssasa", + "isPermitted": true + }, + { + "id": "f44e2e96a1b6476abfda2fa407b00169", + "name": "AINWebTool-15-D-PFNPT", + "isPermitted": true + }, + { + "id": "b69a52bec8a84669a37a1e8b72708be7", + "name": "AINWebTool-15-X-vdre", + "isPermitted": true + }, + { + "id": "fac7d9fd56154caeb9332202dcf2969f", + "name": "AINWebTool-15-X-NONPODECOMP", + "isPermitted": true + }, + { + "id": "2d34d8396e194eb49969fd61ffbff961", + "name": "DN5242-Nov16-T5", + "isPermitted": true + }, + { + "id": "cb42a77ff45b48a8b8deb83bb64acc74", + "name": "ro-T11", + "isPermitted": true + }, + { + "id": "fa45ca53c80b492fa8be5477cd84fc2b", + "name": "ro-T112", + "isPermitted": true + }, + { + "id": "4914ab0ab3a743e58f0eefdacc1dde77", + "name": "DN5242-Nov21-T1", + "isPermitted": true + }, + { + "id": "d0a3e3f2964542259d155a81c41aadc3", + "name": "test-hvf6-09", + "isPermitted": true + }, + { + "id": "cbb99fe4ada84631b7baf046b6fd2044", + "name": "DN5242-Nov16-T3", + "isPermitted": true + } + ] + } + }, + "productFamilies": [ + { + "id": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034", + "name": "SCOTTIE", + "isPermitted": true + }, + { + "id": "17cc1042-527b-11e6-beb8-9e71128cae77", + "name": "IGNACIO", + "isPermitted": true + }, + { + "id": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e", + "name": "Christie", + "isPermitted": true + }, + { + "id": "a4f6f2ae-9bf5-4ed7-b904-06b2099c4bd7", + "name": "Enhanced Services", + "isPermitted": true + }, + { + "id": "vTerrance", + "name": "vTerrance", + "isPermitted": true + }, + { + "id": "323d69d9-2efe-4r45-ay0a-89ea7ard4e6f", + "name": "vSCP", + "isPermitted": true + }, + { + "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb", + "name": "Emanuel", + "isPermitted": true + }, + { + "id": "d8a6ed93-251c-47ca-adc9-86671fd19f4c", + "name": "BVOIP", + "isPermitted": true + }, + { + "id": "db171b8f-115c-4992-a2e3-ee04cae357e0", + "name": "LINDSEY", + "isPermitted": true + }, + { + "id": "LRSI-OSPF", + "name": "LRSI-OSPF", + "isPermitted": true + }, + { + "id": "vRosemarie", + "name": "HNGATEWAY", + "isPermitted": true + }, + { + "id": "vHNPaas", + "name": "WILKINS", + "isPermitted": true + }, + { + "id": "e433710f-9217-458d-a79d-1c7aff376d89", + "name": "TYLER SILVIA", + "isPermitted": true + }, + { + "id": "b6a3f28c-eebf-494c-a900-055cc7c874ce", + "name": "VROUTER", + "isPermitted": true + }, + { + "id": "Cisneros", + "name": "vMuriel", + "isPermitted": true + }, + { + "id": "0ee8c1bc-7cbd-4b0a-a1ac-e9999255abc1", + "name": "CARA Griffin", + "isPermitted": true + }, + { + "id": "c7611ebe-c324-48f1-8085-94aef0c6ef3d", + "name": "DARREN MCGEE", + "isPermitted": true + }, + { + "id": "e30755dc-5673-4b6b-9dcf-9abdd96b93d1", + "name": "Transport", + "isPermitted": true + }, + { + "id": "vSalvatore", + "name": "vSalvatore", + "isPermitted": true + }, + { + "id": "d7bb0a21-66f2-4e6d-87d9-9ef3ced63ae4", + "name": "Josefina", + "isPermitted": true + }, + { + "id": "vHubbard", + "name": "vHubbard", + "isPermitted": true + }, + { + "id": "12a96a9d-4b4c-4349-a950-fe1159602621", + "name": "DARREN MCGEE", + "isPermitted": true + } + ], + "serviceTypes": { + "e433710f-9217-458d-a79d-1c7aff376d89": [ + { + "id": "0", + "name": "vRichardson", + "isPermitted": false + }, + { + "id": "1", + "name": "TYLER SILVIA", + "isPermitted": true + }, + { + "id": "2", + "name": "Emanuel", + "isPermitted": false + }, + { + "id": "3", + "name": "vJamie", + "isPermitted": false + }, + { + "id": "4", + "name": "vVoiceMail", + "isPermitted": false + }, + { + "id": "5", + "name": "Kennedy", + "isPermitted": false + }, + { + "id": "6", + "name": "vSEGW", + "isPermitted": false + }, + { + "id": "7", + "name": "vVM", + "isPermitted": false + }, + { + "id": "8", + "name": "vOTA", + "isPermitted": false + }, + { + "id": "9", + "name": "vMME", + "isPermitted": false + }, + { + "id": "10", + "name": "vMNS", + "isPermitted": false + }, + { + "id": "11", + "name": "vSCP", + "isPermitted": false + }, + { + "id": "12", + "name": "VPMS", + "isPermitted": false + }, + { + "id": "13", + "name": "vMMSC", + "isPermitted": false + }, + { + "id": "14", + "name": "SSD", + "isPermitted": false + }, + { + "id": "15", + "name": "vMOG", + "isPermitted": false + }, + { + "id": "16", + "name": "LINDSEY", + "isPermitted": false + }, + { + "id": "17", + "name": "JOHANNA_SANTOS", + "isPermitted": false + }, + { + "id": "18", + "name": "vCarroll", + "isPermitted": false + } + ] + }, + "aicZones": [ + { + "id": "NFT1", + "name": "NFTJSSSS-NFT1" + }, + { + "id": "JAG1", + "name": "YUDFJULP-JAG1" + }, + { + "id": "YYY1", + "name": "UUUAIAAI-YYY1" + }, + { + "id": "BAN1", + "name": "VSDKYUTP-BAN1" + }, + { + "id": "DKJ1", + "name": "DKJSJDKA-DKJ1" + }, + { + "id": "MCS1", + "name": "ASACMAMS-MCS1" + }, + { + "id": "UIO1", + "name": "uioclli1-UIO1" + }, + { + "id": "RAJ1", + "name": "YGBIJNLQ-RAJ1" + }, + { + "id": "OPA1", + "name": "opaclli1-OPA1" + }, + { + "id": "SDE1", + "name": "ZXCVBNMA-SDE1" + }, + { + "id": "VEN2", + "name": "FGHJUHIL-VEN2" + }, + { + "id": "ORL1", + "name": "ORLDFLMA-ORL1" + }, + { + "id": "JAD1", + "name": "JADECLLI-JAD1" + }, + { + "id": "ZXL1", + "name": "LWLWCANN-ZXL1" + }, + { + "id": "CKL1", + "name": "CLKSKCKK-CKL1" + }, + { + "id": "SDF1", + "name": "sdfclli1-SDF1" + }, + { + "id": "RAD1", + "name": "RADICAL1-RAD1" + }, + { + "id": "KIT1", + "name": "BHYJFGLN-KIT1" + }, + { + "id": "REL1", + "name": "INGERFGT-REL1" + }, + { + "id": "JNL1", + "name": "CJALSDAC-JNL1" + }, + { + "id": "OLK1", + "name": "OLKOLKLS-OLK1" + }, + { + "id": "CHI1", + "name": "CHILLIWE-CHI1" + }, + { + "id": "UUU4", + "name": "UUUAAAUU-UUU4" + }, + { + "id": "TUF1", + "name": "TUFCLLI1-TUF1" + }, + { + "id": "KJN1", + "name": "CKALDKSA-KJN1" + }, + { + "id": "SAM1", + "name": "SNDGCA64-SAN1" + }, + { + "id": "SCK1", + "name": "SCKSCKSK-SCK1" + }, + { + "id": "HJH1", + "name": "AOEEQQQD-HJH1" + }, + { + "id": "HGD1", + "name": "SDFQWHGD-HGD1" + }, + { + "id": "KOR1", + "name": "HYFLNBVT-KOR1" + }, + { + "id": "ATL43", + "name": "AICLOCID-ATL43" + }, + { + "id": "ATL54", + "name": "AICFTAAI-ATL54" + }, + { + "id": "ATL66", + "name": "CLLIAAII-ATL66" + }, + { + "id": "VEL1", + "name": "BNMLKUIK-VEL1" + }, + { + "id": "ICC1", + "name": "SANJITAT-ICC1" + }, + { + "id": "MNT11", + "name": "WSXEFBTH-MNT11" + }, + { + "id": "DEF2", + "name": "WSBHGTYL-DEF2" + }, + { + "id": "MAD11", + "name": "SDFQWGKL-MAD11" + }, + { + "id": "OLG1", + "name": "OLHOLHOL-OLG1" + }, + { + "id": "GAR1", + "name": "NGFVSJKO-GAR1" + }, + { + "id": "SAN22", + "name": "GNVLSCTL-SAN22" + }, + { + "id": "HRG1", + "name": "HRGHRGGS-HRG1" + }, + { + "id": "JCS1", + "name": "JCSJSCJS-JCS1" + }, + { + "id": "DHA12", + "name": "WSXEDECF-DHA12" + }, + { + "id": "HJE1", + "name": "AOEEWWWD-HJE1" + }, + { + "id": "NCA1", + "name": "NCANCANN-NCA1" + }, + { + "id": "IOP1", + "name": "iopclli1-IOP1" + }, + { + "id": "RTY1", + "name": "rtyclli1-RTY1" + }, + { + "id": "KAP1", + "name": "HIOUYTRQ-KAP1" + }, + { + "id": "ZEN1", + "name": "ZENCLLI1-ZEN1" + }, + { + "id": "HKA1", + "name": "JAKHLASS-HKA1" + }, + { + "id": "CQK1", + "name": "CQKSCAKK-CQK1" + }, + { + "id": "SAI1", + "name": "UBEKQLPD-SAI1" + }, + { + "id": "ERT1", + "name": "ertclli1-ERT1" + }, + { + "id": "IBB1", + "name": "PLMKOIJU-IBB1" + }, + { + "id": "TIR2", + "name": "PLKINHYI-TIR2" + }, + { + "id": "HSD1", + "name": "CHASKCDS-HSD1" + }, + { + "id": "SLF78", + "name": "SDCTLFN1-SLF78" + }, + { + "id": "SEE78", + "name": "SDCTEEE4-SEE78" + }, + { + "id": "SAN13", + "name": "TOKYJPFA-SAN13" + }, + { + "id": "SAA78", + "name": "SDCTAAA1-SAA78" + }, + { + "id": "LUC1", + "name": "ATLDFGYC-LUC1" + }, + { + "id": "AMD13", + "name": "MEMATLAN-AMD13" + }, + { + "id": "TOR1", + "name": "TOROONXN-TOR1" + }, + { + "id": "QWE1", + "name": "QWECLLI1-QWE1" + }, + { + "id": "ZOG1", + "name": "ZOGASTRO-ZOG1" + }, + { + "id": "CAL33", + "name": "CALIFORN-CAL33" + }, + { + "id": "SHH78", + "name": "SDIT1HHH-SHH78" + }, + { + "id": "DSA1", + "name": "LKJHGFDS-DSA1" + }, + { + "id": "CLG1", + "name": "CLGRABAD-CLG1" + }, + { + "id": "BNA1", + "name": "BNARAGBK-BNA1" + }, + { + "id": "ATL84", + "name": "CANTTCOC-ATL84" + }, + { + "id": "APP1", + "name": "WBHGTYUI-APP1" + }, + { + "id": "RJN1", + "name": "RJNRBZAW-RJN1" + }, + { + "id": "EHH78", + "name": "SDCSHHH5-EHH78" + }, + { + "id": "mac10", + "name": "PKGTESTF-mac10" + }, + { + "id": "SXB78", + "name": "SDCTGXB1-SXB78" + }, + { + "id": "SAX78", + "name": "SDCTAXG1-SAX78" + }, + { + "id": "SYD1", + "name": "SYDNAUBV-SYD1" + }, + { + "id": "TOK1", + "name": "TOKYJPFA-TOK1" + }, + { + "id": "KGM2", + "name": "KGMTNC20-KGM2" + }, + { + "id": "DCC1b", + "name": "POIUYTGH-DCC1b" + }, + { + "id": "SKK78", + "name": "SDCTKKK1-SKK78" + }, + { + "id": "SGG78", + "name": "SDCTGGG1-SGG78" + }, + { + "id": "SJJ78", + "name": "SDCTJJJ1-SJJ78" + }, + { + "id": "SBX78", + "name": "SDCTBXG1-SBX78" + }, + { + "id": "LAG1", + "name": "LARGIZON-LAG1" + }, + { + "id": "IAA1", + "name": "QAZXSWED-IAA1" + }, + { + "id": "POI1", + "name": "PLMNJKIU-POI1" + }, + { + "id": "LAG1a", + "name": "LARGIZON-LAG1a" + }, + { + "id": "PBL1", + "name": "PBLAPBAI-PBL1" + }, + { + "id": "LAG45", + "name": "LARGIZON-LAG1a" + }, + { + "id": "MAR1", + "name": "MNBVCXZM-MAR1" + }, + { + "id": "HST70", + "name": "HSTNTX70-HST70" + }, + { + "id": "DCC1a", + "name": "POIUYTGH-DCC1a" + }, + { + "id": "TOL1", + "name": "TOLDOH21-TOL1" + }, + { + "id": "LON1", + "name": "LONEENCO-LON1" + }, + { + "id": "SJU78", + "name": "SDIT1JUB-SJU78" + }, + { + "id": "STN27", + "name": "HSTNTX01-STN27" + }, + { + "id": "SSW56", + "name": "ss8126GT-SSW56" + }, + { + "id": "SBB78", + "name": "SDIT1BBB-SBB78" + }, + { + "id": "DCC3", + "name": "POIUYTGH-DCC3" + }, + { + "id": "GNV1", + "name": "GNVLSCTL-GNV1" + }, + { + "id": "WAS1", + "name": "WASHDCSW-WAS1" + }, + { + "id": "TOY1", + "name": "TORYONNZ-TOY1" + }, + { + "id": "STT1", + "name": "STTLWA02-STT1" + }, + { + "id": "STG1", + "name": "STTGGE62-STG1" + }, + { + "id": "SLL78", + "name": "SDCTLLL1-SLL78" + }, + { + "id": "SBU78", + "name": "SDIT1BUB-SBU78" + }, + { + "id": "ATL2", + "name": "ATLNGANW-ATL2" + }, + { + "id": "BOT1", + "name": "BOTHWAKY-BOT1" + }, + { + "id": "SNG1", + "name": "SNGPSIAU-SNG1" + }, + { + "id": "NYC1", + "name": "NYCMNY54-NYC1" + }, + { + "id": "LAG1b", + "name": "LARGIZON-LAG1b" + }, + { + "id": "AMD15", + "name": "AMDFAA01-AMD15" + }, + { + "id": "SNA1", + "name": "SNANTXCA-SNA1" + }, + { + "id": "PLT1", + "name": "PLTNCA60-PLT1" + }, + { + "id": "TLP1", + "name": "TLPNXM18-TLP1" + }, + { + "id": "SDD81", + "name": "SAIT1DD6-SDD81" + }, + { + "id": "DCC1", + "name": "POIUYTGH-DCC1" + }, + { + "id": "DCC2", + "name": "POIUYTGH-DCC2" + }, + { + "id": "OKC1", + "name": "OKCBOK55-OKC1" + }, + { + "id": "PAR1", + "name": "PARSFRCG-PAR1" + }, + { + "id": "TES36", + "name": "ABCEETES-TES36" + }, + { + "id": "COM1", + "name": "PLMKOPIU-COM1" + }, + { + "id": "ANI1", + "name": "ATLNGTRE-ANI1" + }, + { + "id": "SDG78", + "name": "SDIT1BDG-SDG78" + }, + { + "id": "mac20", + "name": "PKGTESTF-mac20" + }, + { + "id": "DSF45", + "name": "DSFBG123-DSF45" + }, + { + "id": "HST25", + "name": "HSTNTX01-HST25" + }, + { + "id": "AMD18", + "name": "AUDIMA01-AMD18" + }, + { + "id": "SAA80", + "name": "SAIT9AA3-SAA80" + }, + { + "id": "SSA56", + "name": "SSIT2AA7-SSA56" + }, + { + "id": "SDD82", + "name": "SAIT1DD9-SDD82" + }, + { + "id": "JCV1", + "name": "JCVLFLBW-JCV1" + }, + { + "id": "SUL2", + "name": "WERTYUJK-SUL2" + }, + { + "id": "PUR1", + "name": "purelyde-PUR1" + }, + { + "id": "FDE55", + "name": "FDERT555-FDE55" + }, + { + "id": "SITE", + "name": "LONEENCO-SITE" + }, + { + "id": "ATL1", + "name": "ATLNGAMA-ATL1" + }, + { + "id": "JUL1", + "name": "ZXCVBNMM-JUL1" + }, + { + "id": "TAT34", + "name": "TESAAISB-TAT34" + }, + { + "id": "XCP12", + "name": "CHKGH123-XCP12" + }, + { + "id": "RAI1", + "name": "poiuytre-RAI1" + }, + { + "id": "HPO1", + "name": "ATLNGAUP-HPO1" + }, + { + "id": "KJF12", + "name": "KJFDH123-KJF12" + }, + { + "id": "SCC80", + "name": "SAIT9CC3-SCC80" + }, + { + "id": "SAA12", + "name": "SAIT9AF8-SAA12" + }, + { + "id": "SAA14", + "name": "SAIT1AA9-SAA14" + }, + { + "id": "ATL35", + "name": "TTESSAAI-ATL35" + }, + { + "id": "CWY1", + "name": "CWYMOWBS-CWY1" + }, + { + "id": "ATL76", + "name": "TELEPAAI-ATL76" + }, + { + "id": "DSL12", + "name": "DSLFK242-DSL12" + }, + { + "id": "ATL53", + "name": "AAIATLTE-ATL53" + }, + { + "id": "SAA11", + "name": "SAIT9AA2-SAA11" + }, + { + "id": "ATL62", + "name": "TESSASCH-ATL62" + }, + { + "id": "AUG1", + "name": "ASDFGHJK-AUG1" + }, + { + "id": "POI22", + "name": "POIUY123-POI22" + }, + { + "id": "SAA13", + "name": "SAIT1AA9-SAA13" + }, + { + "id": "BHY17", + "name": "BHYTFRF3-BHY17" + }, + { + "id": "LIS1", + "name": "HOSTPROF-LIS1" + }, + { + "id": "SIP1", + "name": "ZXCVBNMK-SIP1" + }, + { + "id": "ATL99", + "name": "TEESTAAI-ATL43" + }, + { + "id": "ATL64", + "name": "FORLOAAJ-ATL64" + }, + { + "id": "TAT33", + "name": "TESAAISA-TAT33" + }, + { + "id": "RAD10", + "name": "INDIPUNE-RAD10" + }, + { + "id": "RTW5", + "name": "BHYTFRY4-RTW5" + }, + { + "id": "JGS1", + "name": "KSJKKKKK-JGS1" + }, + { + "id": "ATL98", + "name": "TEESTAAI-ATL43" + }, + { + "id": "WAN1", + "name": "LEIWANGW-WAN1" + }, + { + "id": "ATL44", + "name": "ATLSANAB-ATL44" + }, + { + "id": "RTD2", + "name": "BHYTFRk4-RTD2" + }, + { + "id": "NIR1", + "name": "ORFLMANA-NIR1" + }, + { + "id": "ATL75", + "name": "SANAAIRE-ATL75" + }, + { + "id": "NUM1", + "name": "QWERTYUI-NUM1" + }, + { + "id": "MTN32", + "name": "MDTWNJ21-MTN32" + }, + { + "id": "RTZ4", + "name": "BHYTFRZ6-RTZ4" + }, + { + "id": "ATL56", + "name": "ATLSANAC-ATL56" + }, + { + "id": "AMS1", + "name": "AMSTNLBW-AMS1" + }, + { + "id": "RCT1", + "name": "AMSTERNL-RCT1" + }, + { + "id": "JAN1", + "name": "ORFLMATT-JAN1" + }, + { + "id": "ABC14", + "name": "TESAAISA-ABC14" + }, + { + "id": "TAT37", + "name": "TESAAISD-TAT37" + }, + { + "id": "MIC54", + "name": "MICHIGAN-MIC54" + }, + { + "id": "ABC11", + "name": "ATLSANAI-ABC11" + }, + { + "id": "AMF11", + "name": "AMDOCS01-AMF11" + }, + { + "id": "ATL63", + "name": "ATLSANEW-ATL63" + }, + { + "id": "ABC12", + "name": "ATLSECIA-ABC12" + }, + { + "id": "MTN20", + "name": "MDTWNJ21-MTN20" + }, + { + "id": "ABC15", + "name": "AAITESAN-ABC15" + }, + { + "id": "AVT1", + "name": "AVTRFLHD-AVT1" + }, + { + "id": "ATL34", + "name": "ATLSANAI-ATL34" + } + ], + "categoryParameters": { + "owningEntityList": [ + { + "id": "aaa1", + "name": "aaa1" + }, + { + "id": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc", + "name": "WayneHolland" + }, + { + "id": "Melissa", + "name": "Melissa" + } + ], + "projectList": [ + { + "id": "WATKINS", + "name": "WATKINS" + }, + { + "id": "x1", + "name": "x1" + }, + { + "id": "yyy1", + "name": "yyy1" + } + ], + "lineOfBusinessList": [ + { + "id": "ONAP", + "name": "ONAP" + }, + { + "id": "zzz1", + "name": "zzz1" + } + ], + "platformList": [ + { + "id": "platform", + "name": "platform" + }, + { + "id": "xxx1", + "name": "xxx1" + } + ] + }, + "type": "[LCP_REGIONS_AND_TENANTS] Update", + "subscribers": [ + { + "id": "CAR_2020_ER", + "name": "CAR_2020_ER", + "isPermitted": true + }, + { + "id": "21014aa2-526b-11e6-beb8-9e71128cae77", + "name": "JULIO ERICKSON", + "isPermitted": false + }, + { + "id": "DHV1707-TestSubscriber-2", + "name": "DALE BRIDGES", + "isPermitted": false + }, + { + "id": "DHV1707-TestSubscriber-1", + "name": "LLOYD BRIDGES", + "isPermitted": false + }, + { + "id": "jimmy-example", + "name": "JimmyExampleCust-20161102", + "isPermitted": false + }, + { + "id": "jimmy-example2", + "name": "JimmyExampleCust-20161103", + "isPermitted": false + }, + { + "id": "ERICA5779-TestSub-PWT-102", + "name": "ERICA5779-TestSub-PWT-102", + "isPermitted": false + }, + { + "id": "ERICA5779-TestSub-PWT-101", + "name": "ERICA5779-TestSub-PWT-101", + "isPermitted": false + }, + { + "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb", + "name": "Emanuel", + "isPermitted": false + }, + { + "id": "ERICA5779-Subscriber-4", + "name": "ERICA5779-Subscriber-5", + "isPermitted": false + }, + { + "id": "ERICA5779-TestSub-PWT-103", + "name": "ERICA5779-TestSub-PWT-103", + "isPermitted": false + }, + { + "id": "ERICA5779-Subscriber-2", + "name": "ERICA5779-Subscriber-2", + "isPermitted": false + }, + { + "id": "e433710f-9217-458d-a79d-1c7aff376d89", + "name": "SILVIA ROBBINS", + "isPermitted": true + }, + { + "id": "ERICA5779-Subscriber-3", + "name": "ERICA5779-Subscriber-3", + "isPermitted": false + }, + { + "id": "31739f3e-526b-11e6-beb8-9e71128cae77", + "name": "CRAIG/ROBERTS", + "isPermitted": false + } + ] + } + } + } +} + +class MockFeatureFlagsService {} + +describe('Service Control Generator', () => { + let injector; + let service: ServiceControlGenerator; + let httpMock: HttpTestingController; + + + beforeAll(done => (async () => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + providers: [ServiceControlGenerator, + GenericFormService, + BasicControlGenerator, + AaiService, + FormBuilder, + LogService, + {provide:FeatureFlagsService, useClass: MockFeatureFlagsService}, + {provide: NgRedux, useClass: MockAppStore}] + }); + await TestBed.compileComponents(); + + injector = getTestBed(); + service = injector.get(ServiceControlGenerator); + httpMock = injector.get(HttpTestingController); + + })().then(done).catch(done.fail)); + + + test('ServiceControlGenerator should return the correct controls with correct order', () => { + const serviceId : string = "6e59c5de-f052-46fa-aa7e-2fca9d674c44"; + const controls :FormControlModel[] = service.getMacroFormControls(serviceId); + const globalSubscriberIdControl : DropdownFormControl = <DropdownFormControl>controls.find(item => item.controlName === FormControlNames.GLOBAL_SUBSCRIBER_ID); + + expect(globalSubscriberIdControl.validations.find(val => val.validatorName === ValidatorOptions.required)).toBeDefined(); + expect(globalSubscriberIdControl.dataTestId).toEqual('subscriberName'); + expect(globalSubscriberIdControl.type).toEqual(FormControlType.DROPDOWN); + expect(globalSubscriberIdControl.isDisabled).toBeFalsy(); + expect(globalSubscriberIdControl.placeHolder).toEqual('Select Subscriber Name'); + expect(globalSubscriberIdControl.displayName).toEqual('Subscriber name'); + expect(globalSubscriberIdControl.onInit).toBeDefined(); + expect(globalSubscriberIdControl.onChange).toBeDefined(); + + const serviceTypeControl : DropdownFormControl = <DropdownFormControl>controls.find(item => item.controlName === FormControlNames.SUBSCRIPTION_SERVICE_TYPE); + expect(serviceTypeControl.validations.find(val => val.validatorName === ValidatorOptions.required)).toBeDefined(); + expect(serviceTypeControl.dataTestId).toEqual('serviceType'); + expect(serviceTypeControl.type).toEqual(FormControlType.DROPDOWN); + expect(serviceTypeControl.isDisabled).toBeTruthy(); + expect(serviceTypeControl.placeHolder).toEqual('Select Service Type'); + expect(serviceTypeControl.displayName).toEqual('Service type'); + expect(serviceTypeControl.onInit).toBeDefined(); + expect(serviceTypeControl.onChange).toBeDefined(); + + const productFamilyControl : DropdownFormControl = <DropdownFormControl>controls.find(item => item.controlName === FormControlNames.PRODUCT_FAMILY_ID); + expect(productFamilyControl.validations.find(val => val.validatorName === ValidatorOptions.required)).toBeDefined(); + expect(productFamilyControl.dataTestId).toEqual('productFamily'); + expect(productFamilyControl.type).toEqual(FormControlType.DROPDOWN); + expect(productFamilyControl.isDisabled).toBeFalsy(); + expect(productFamilyControl.placeHolder).toEqual('Select Product Family'); + expect(productFamilyControl.displayName).toEqual('Product family'); + expect(productFamilyControl.onInit).toBeDefined(); + + const lcpRegionControl : DropdownFormControl = <DropdownFormControl>controls.find(item => item.controlName === FormControlNames.LCPCLOUD_REGION_ID); + expect(lcpRegionControl.validations.find(val => val.validatorName === ValidatorOptions.required)).toBeDefined(); + expect(lcpRegionControl.dataTestId).toEqual('lcpRegion'); + expect(lcpRegionControl.type).toEqual(FormControlType.DROPDOWN); + expect(lcpRegionControl.isDisabled).toBeTruthy(); + expect(lcpRegionControl.placeHolder).toEqual('Select LCP Region'); + expect(lcpRegionControl.displayName).toEqual('LCP region'); + expect(lcpRegionControl.onInit).toBeDefined(); + expect(lcpRegionControl.onChange).toBeDefined(); + + const tenantControl : DropdownFormControl = <DropdownFormControl>controls.find(item => item.controlName === FormControlNames.TENANT_ID); + expect(tenantControl.validations.find(val => val.validatorName === ValidatorOptions.required)).toBeDefined(); + expect(tenantControl.dataTestId).toEqual('tenant'); + expect(tenantControl.type).toEqual(FormControlType.DROPDOWN); + expect(tenantControl.isDisabled).toBeTruthy(); + expect(tenantControl.placeHolder).toEqual('Select Tenant'); + expect(tenantControl.displayName).toEqual('Tenant'); + expect(tenantControl.onInit).toBeDefined(); + expect(tenantControl.onChange).toBeDefined(); + + const instanceNameControl: FormControlModel = <FormControlModel>controls.find(item => item.controlName === FormControlNames.INSTANCE_NAME); + const instanceNameValidator: ValidatorModel = instanceNameControl.validations.find(val => val.validatorName === ValidatorOptions.pattern); + expect(instanceNameValidator.validatorArg).toEqual(/^[a-zA-Z0-9._-]*$/); + }); + + + test('getMacroFormControls should return the correct order of controls', () => { + // Order the fields + // 1. Instance name + // 2. Subscriber name + // 3. Service type + // 4. Owning entity (fix Entity to entity) + // 5. Product family + // 6. LCP region + // 7. Tenant + // 8. AIC zone (fix Zone to zone) + // 9. Pause on pause points + // 10. Project + // 11. Rollback on failure + const serviceId : string = "6e59c5de-f052-46fa-aa7e-2fca9d674c44"; + const controls :FormControlModel[] = service.getMacroFormControls(serviceId); + + + + const controlsOrderNames = [ + FormControlNames.INSTANCE_NAME, + FormControlNames.GLOBAL_SUBSCRIBER_ID, + FormControlNames.SUBSCRIPTION_SERVICE_TYPE , + FormControlNames.OWNING_ENTITY_ID , + FormControlNames.PRODUCT_FAMILY_ID , + FormControlNames.LCPCLOUD_REGION_ID , + FormControlNames.TENANT_ID , + FormControlNames.AICZONE_ID , + FormControlNames.PAUSE, + FormControlNames.PROJECT_NAME , + FormControlNames.ROLLBACK_ON_FAILURE]; + expect(controls.length).toEqual(11); + for(let i = 0 ; i < controls.length ; i++){ + expect(controls[i].controlName).toEqual(controlsOrderNames[i]); + } + }); + + test('getAlacartFormControls should return the correct order of controls', () => { + // Order the fields + // 1. Instance name + // 2. Subscriber name + // 3. Service type + // 4. Owning entity (fix Entity to entity) + // 5. Project + // 6. Rollback on failure + const serviceId : string = "6e59c5de-f052-46fa-aa7e-2fca9d674c44"; + const controls :FormControlModel[] = service.getAlaCartControls(serviceId); + const controlsOrderNames = [ + FormControlNames.INSTANCE_NAME, + FormControlNames.GLOBAL_SUBSCRIBER_ID, + FormControlNames.SUBSCRIPTION_SERVICE_TYPE , + FormControlNames.OWNING_ENTITY_ID , + FormControlNames.PROJECT_NAME , + FormControlNames.ROLLBACK_ON_FAILURE]; + + expect(controls.length).toEqual(6); + for(let i = 0 ; i < controls.length ; i++){ + expect(controls[i].controlName).toEqual(controlsOrderNames[i]); + } + }); + +}); + diff --git a/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/service.control.generator.ts b/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/service.control.generator.ts new file mode 100644 index 000000000..539f848d5 --- /dev/null +++ b/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/service.control.generator.ts @@ -0,0 +1,331 @@ +import {Injectable} from "@angular/core"; +import {GenericFormService} from "../generic-form.service"; +import {NgRedux} from "@angular-redux/store"; +import {AppState} from "../../../store/reducers"; +import { + FormControlModel, + ValidatorModel, + ValidatorOptions +} from "../../../models/formControlModels/formControl.model"; +import {DropdownFormControl} from "../../../models/formControlModels/dropdownFormControl.model"; +import * as _ from 'lodash'; +import {BasicControlGenerator} from "./basic.control.generator"; +import {AaiService} from "../../../services/aaiService/aai.service"; +import {FormGroup} from "@angular/forms"; +import {FormControlType} from "../../../models/formControlModels/formControlTypes.enum"; +import {HttpClient} from "@angular/common/http"; +import {SelectOption} from "../../../models/selectOption"; +import {Observable} from "rxjs"; +import {LogService} from "../../../utils/log/log.service"; +import {ServiceModel} from "../../../models/serviceModel"; +import {of} from "rxjs"; + +import {CheckboxFormControl} from "../../../models/formControlModels/checkboxFormControl.model"; + +export enum FormControlNames { + INSTANCE_NAME = 'instanceName', + GLOBAL_SUBSCRIBER_ID = 'globalSubscriberId', + SUBSCRIPTION_SERVICE_TYPE = 'subscriptionServiceType', + PRODUCT_FAMILY_ID = 'productFamilyId', + LCPCLOUD_REGION_ID = 'lcpCloudRegionId', + TENANT_ID = 'tenantId', + AICZONE_ID = 'aicZoneId', + PROJECT_NAME = 'projectName', + OWNING_ENTITY_ID = 'owningEntityId', + ROLLBACK_ON_FAILURE = 'rollbackOnFailure', + PAUSE = 'pause' +} + +@Injectable() +export class ServiceControlGenerator { + aaiService : AaiService; + constructor(private genericFormService : GenericFormService, + private _basicControlGenerator : BasicControlGenerator, + private store: NgRedux<AppState>, + private http: HttpClient, + private _aaiService : AaiService, + private _logService : LogService){ + this.aaiService = _aaiService; + } + + getServiceInstance = (serviceId : string) : any => { + let serviceInstance = null; + if (_.has(this.store.getState().service.serviceInstance, serviceId)) { + serviceInstance = Object.assign({}, this.store.getState().service.serviceInstance[serviceId]); + } + + return serviceInstance; + }; + + getAlaCartControls(serviceId: string, dynamicInputs?: any[]) : FormControlModel[] { + if(_.isNil(serviceId)){ + this._logService.error('should provide serviceId', serviceId); + return []; + } + const serviceInstance = this.getServiceInstance(serviceId); + + let result : FormControlModel[] = []; + + const serviceModel = new ServiceModel(this.store.getState().service.serviceHierarchy[serviceId]); + if(!_.isNil(serviceModel)){ + result.push(this._basicControlGenerator.getInstanceName(serviceInstance, serviceId, serviceModel.isEcompGeneratedNaming)); + result.push(this.getGlobalSubscriberControl(serviceInstance, result)); + result.push(this.getServiceTypeControl(serviceInstance, result, false)); + result.push(this.getOwningEntityControl(serviceInstance, result)); + result.push(this.getProjectControl(serviceInstance, result)); + result.push(this.getRollbackOnFailureControl(serviceInstance, result)); + } + + this._logService.info('Generate dynamic service controls, is edit mode: ' + serviceInstance != null , result); + return result; + } + + getMacroFormControls(serviceId: string, dynamicInputs?: any[]) : FormControlModel[] { + if(_.isNil(serviceId)){ + this._logService.error('should provide serviceId', serviceId); + return []; + } + + const serviceInstance = this.getServiceInstance(serviceId); + + let result : FormControlModel[] = []; + const serviceModel = new ServiceModel(this.store.getState().service.serviceHierarchy[serviceId]); + if(!_.isNil(serviceModel)){ + result.push(this._basicControlGenerator.getInstanceName(serviceInstance, serviceId, serviceModel.isEcompGeneratedNaming)); + result.push(this.getGlobalSubscriberControl(serviceInstance, result)); + result.push(this.getServiceTypeControl(serviceInstance, result, true)); + result.push(this.getOwningEntityControl(serviceInstance, result)); + result.push(this.getProductFamilyControl(serviceInstance, result)); + result.push(this.getLcpRegionControl(serviceInstance, result)); + result.push(this.getTenantControl(serviceInstance, result),); + result.push(this.getAICZoneControl(serviceInstance, result)); + + if(serviceModel.isMultiStepDesign){ + result.push(new CheckboxFormControl({ + controlName : FormControlNames.PAUSE, + displayName : 'Pause on pause points', + dataTestId : 'Pause', + isDisabled : false, + validations : [new ValidatorModel(ValidatorOptions.required, 'is required')], + value : serviceInstance ? serviceInstance.pause : null, + })); + } + + result.push(this.getProjectControl(serviceInstance, result)); + result.push(this.getRollbackOnFailureControl(serviceInstance, result)); + } + + + this._logService.info('Generate dynamic service controls, is edit mode: ' + serviceInstance != null , result); + return result; + } + + getRollBackOnFailureOptions = () : Observable<SelectOption[]> =>{ + return of([ + new SelectOption({id: 'true', name: 'Rollback'}), + new SelectOption({id: 'false', name: 'Don\'t Rollback'}) + ]); + }; + + getGlobalSubscriberControl = (serviceInstance : any, controls : FormControlModel[]) : DropdownFormControl => { + return new DropdownFormControl({ + type : FormControlType.DROPDOWN, + controlName : FormControlNames.GLOBAL_SUBSCRIBER_ID, + displayName : 'Subscriber name', + dataTestId : 'subscriberName', + placeHolder : 'Select Subscriber Name', + isDisabled : false, + name : "subscriber-name-select", + value : serviceInstance ? serviceInstance.globalSubscriberId : null, + validations : [new ValidatorModel(ValidatorOptions.required, 'is required')], + onInit : this._basicControlGenerator.getSubscribeInitResult.bind(this._aaiService, this.aaiService.getSubscribers), + onChange : (param: string, form : FormGroup) => { + form.controls[FormControlNames.SUBSCRIPTION_SERVICE_TYPE].reset(); + if(!_.isNil(param)){ + form.controls[FormControlNames.SUBSCRIPTION_SERVICE_TYPE].enable(); + this._basicControlGenerator.getSubscribeResult.bind(this, this._aaiService.getServiceTypes(param).subscribe(res =>{ + controls.find(item => item.controlName === FormControlNames.SUBSCRIPTION_SERVICE_TYPE)['options$'] = res; + })); + } + else { + form.controls[FormControlNames.SUBSCRIPTION_SERVICE_TYPE].disable(); + } + } + }) + }; + + getServiceTypeControl = (serviceInstance : any, controls : FormControlModel[], isMacro?: boolean) : DropdownFormControl => { + return new DropdownFormControl({ + type : FormControlType.DROPDOWN, + controlName : FormControlNames.SUBSCRIPTION_SERVICE_TYPE, + displayName : 'Service type', + dataTestId : 'serviceType', + placeHolder : 'Select Service Type', + selectedField : 'name', + name : "service-type", + isDisabled : _.isNil(serviceInstance), + value : serviceInstance ? serviceInstance.subscriptionServiceType : null, + validations : [new ValidatorModel(ValidatorOptions.required, 'is required')], + onInit : serviceInstance ? this._basicControlGenerator.getSubscribeInitResult.bind( + this._aaiService, + this.aaiService.getServiceTypes.bind(this, serviceInstance.globalSubscriberId)) : ()=>{}, + onChange : (param: string, form : FormGroup) => { + if(isMacro){ + form.controls[FormControlNames.LCPCLOUD_REGION_ID].reset(); + if(!_.isNil(param)) { + form.controls[FormControlNames.LCPCLOUD_REGION_ID].enable(); + const globalCustomerId: string = form.controls[FormControlNames.GLOBAL_SUBSCRIBER_ID].value; + if (!_.isNil(globalCustomerId)) { + this._basicControlGenerator.getSubscribeResult.bind(this, this._aaiService.getLcpRegionsAndTenants(globalCustomerId, param).subscribe(res => { + controls.find(item => item.controlName === FormControlNames.LCPCLOUD_REGION_ID)['options$'] = res.lcpRegionList; + })); + } + } + else { + form.controls[FormControlNames.LCPCLOUD_REGION_ID].disable(); + } + } + + } + }) + }; + + getOwningEntityControl = (serviceInstance : any, controls : FormControlModel[]) : DropdownFormControl => { + return new DropdownFormControl({ + type : FormControlType.DROPDOWN, + controlName : FormControlNames.OWNING_ENTITY_ID, + displayName : 'Owning entity', + dataTestId : 'owningEntity', + placeHolder : 'Select Owning Entity', + name :"owningEntity", + isDisabled : false, + validations : [new ValidatorModel(ValidatorOptions.required, 'is required'),], + onInitSelectedField : ['owningEntityList'], + value : serviceInstance ? serviceInstance.owningEntityId : null, + onInit : this._basicControlGenerator.getSubscribeInitResult.bind(null, this._aaiService.getCategoryParameters) + }) + }; + + getProductFamilyControl = (serviceInstance : any, controls : FormControlModel[]) : DropdownFormControl => { + return new DropdownFormControl({ + type : FormControlType.DROPDOWN, + controlName : FormControlNames.PRODUCT_FAMILY_ID, + displayName : 'Product family', + dataTestId : 'productFamily', + placeHolder : 'Select Product Family', + isDisabled : false, + name : "product-family-select", + value : serviceInstance ? serviceInstance.productFamilyId : null, + validations : [new ValidatorModel(ValidatorOptions.required, 'is required')], + onInit : this._basicControlGenerator.getSubscribeResult.bind(this, this._aaiService.getProductFamilies), + }) + }; + + getLcpRegionControl = (serviceInstance : any, controls : FormControlModel[]) : DropdownFormControl => { + return new DropdownFormControl({ + type : FormControlType.DROPDOWN, + controlName : FormControlNames.LCPCLOUD_REGION_ID, + displayName : 'LCP region', + dataTestId : 'lcpRegion', + placeHolder : 'Select LCP Region', + name : "lcpRegion", + isDisabled : _.isNil(serviceInstance), + value : serviceInstance ? serviceInstance.lcpCloudRegionId : null, + validations : [new ValidatorModel(ValidatorOptions.required, 'is required')], + onInitSelectedField : ['lcpRegionList'], + onInit : serviceInstance ? this._basicControlGenerator.getSubscribeInitResult.bind( + this._aaiService, + this.aaiService.getLcpRegionsAndTenants.bind(this, serviceInstance.globalSubscriberId, serviceInstance.subscriptionServiceType)) : ()=>{}, + onChange : (param: string, form : FormGroup) => { + form.controls[FormControlNames.TENANT_ID].reset(); + if(param) { + form.controls[FormControlNames.TENANT_ID].enable(); + } + else { + form.controls[FormControlNames.TENANT_ID].disable(); + } + const globalCustomerId : string = form.controls[FormControlNames.GLOBAL_SUBSCRIBER_ID].value; + const serviceType : string = form.controls[FormControlNames.SUBSCRIPTION_SERVICE_TYPE].value; + if(!_.isNil(globalCustomerId) && !_.isNil(serviceType)){ + this._basicControlGenerator.getSubscribeResult.bind(this, this._aaiService.getLcpRegionsAndTenants(globalCustomerId, serviceType).subscribe(res =>{ + controls.find(item => item.controlName === FormControlNames.TENANT_ID)['options$'] = res.lcpRegionsTenantsMap[param]; + })); + } + } + }) + }; + + getTenantControl = (serviceInstance : any, controls : FormControlModel[]) : DropdownFormControl => { + return new DropdownFormControl({ + type : FormControlType.DROPDOWN, + controlName : FormControlNames.TENANT_ID, + displayName : 'Tenant', + dataTestId : 'tenant', + placeHolder : 'Select Tenant', + name : "tenant", + isDisabled : _.isNil(serviceInstance), + onInitSelectedField :serviceInstance ? ['lcpRegionsTenantsMap', serviceInstance.lcpCloudRegionId] : null, + onInit : serviceInstance ? this._basicControlGenerator.getSubscribeInitResult.bind( + this._aaiService, + this.aaiService.getLcpRegionsAndTenants.bind(this, serviceInstance.globalSubscriberId, serviceInstance.subscriptionServiceType)) : ()=>{}, + value : serviceInstance ? serviceInstance.tenantId : null, + validations : [new ValidatorModel(ValidatorOptions.required, 'is required')], + }) + }; + + getAICZoneControl = (serviceInstance : any, controls : FormControlModel[]) : DropdownFormControl => { + return new DropdownFormControl({ + type : FormControlType.DROPDOWN, + controlName : FormControlNames.AICZONE_ID, + displayName : 'AIC zone', + dataTestId : 'aic_zone', + placeHolder : 'Select AIC zone', + name : "aicZone", + value : serviceInstance ? serviceInstance.aicZoneId : null, + isDisabled : false, + validations : [], + onInit : this._basicControlGenerator.getSubscribeInitResult.bind(null, this._aaiService.getAicZones) + }) + }; + + getPauseControl = (serviceInstance : any, controls : FormControlModel[]) :CheckboxFormControl => { + return new CheckboxFormControl({ + controlName : FormControlNames.PAUSE, + displayName : 'Pause on pause points', + dataTestId : 'Pause', + isDisabled : false, + value : serviceInstance ? serviceInstance.pause : null, + }) + }; + + getProjectControl = (serviceInstance : any, controls : FormControlModel[]) :DropdownFormControl =>{ + return new DropdownFormControl({ + type : FormControlType.DROPDOWN, + controlName : FormControlNames.PROJECT_NAME, + displayName : 'Project', + dataTestId : 'project', + placeHolder : 'Select Project', + name : "project", + isDisabled : false, + validations : [], + value : serviceInstance ? serviceInstance.projectName : null, + onInitSelectedField : ['projectList'], + onInit : this._basicControlGenerator.getSubscribeInitResult.bind(null, this._aaiService.getCategoryParameters) + }) + }; + + getRollbackOnFailureControl = (serviceInstance : any, controls : FormControlModel[]) : DropdownFormControl => { + return new DropdownFormControl({ + type : FormControlType.DROPDOWN, + controlName : FormControlNames.ROLLBACK_ON_FAILURE, + displayName : 'Rollback on failure', + dataTestId : 'rollback', + isDisabled : false, + validations : [new ValidatorModel(ValidatorOptions.required, 'is required')], + value : serviceInstance ? serviceInstance.rollbackOnFailure : 'true', + onInit : this._basicControlGenerator.getSubscribeInitResult.bind(null, this.getRollBackOnFailureOptions) + }) + }; +} + + diff --git a/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/vfModuleGenerator/vfModule.control.generator.spec.ts b/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/vfModuleGenerator/vfModule.control.generator.spec.ts new file mode 100644 index 000000000..36be1bdfa --- /dev/null +++ b/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/vfModuleGenerator/vfModule.control.generator.spec.ts @@ -0,0 +1,2008 @@ +import {getTestBed, TestBed} from '@angular/core/testing'; +import {HttpClientTestingModule, HttpTestingController} from '@angular/common/http/testing'; +import {NgRedux} from '@angular-redux/store'; +import {BasicControlGenerator} from "../basic.control.generator"; +import {AaiService} from "../../../../services/aaiService/aai.service"; +import {GenericFormService} from "../../generic-form.service"; +import {FormBuilder} from "@angular/forms"; +import {LogService} from "../../../../utils/log/log.service"; +import { + FormControlModel, + ValidatorModel, + ValidatorOptions +} from "../../../../models/formControlModels/formControl.model"; +import {FormControlNames, VfModuleControlGenerator} from "./vfModule.control.generator"; +import {FeatureFlagsService} from "../../../../services/featureFlag/feature-flags.service"; + +class MockAppStore<T> { + getState() { + return { + "global": { + "name": null, + "flags": { + "FLAG_NETWORK_TO_ASYNC_INSTANTIATION": false, + "FLAG_SHOW_ASSIGNMENTS": true, + "FLAG_FABRIC_CONFIGURATION_ASSIGNMENTS": true, + "FLAG_UNASSIGN_SERVICE": true, + "FLAG_SHOW_VERIFY_SERVICE": false, + "FLAG_COLLECTION_RESOURCE_SUPPORT": true, + "FLAG_DUPLICATE_VNF": true, + "FLAG_SERVICE_MODEL_CACHE": true, + "CREATE_INSTANCE_TEST": false, + "FLAG_SETTING_DEFAULTS_IN_DRAWING_BOARD": false, + "FLAG_ASYNC_INSTANTIATION": true, + "FLAG_ASYNC_JOBS": true, + "EMPTY_DRAWING_BOARD_TEST": false, + "FLAG_ADD_MSO_TESTAPI_FIELD": true + }, + "type": "[FLAGS] Update" + }, + "service": { + "serviceHierarchy": { + "6e59c5de-f052-46fa-aa7e-2fca9d674c44": { + "service": { + "uuid": "6e59c5de-f052-46fa-aa7e-2fca9d674c44", + "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0", + "name": "ComplexService", + "version": "1.0", + "toscaModelURL": null, + "category": "Emanuel", + "serviceType": "", + "serviceRole": "", + "description": "ComplexService", + "serviceEcompNaming": "false", + "instantiationType": "Macro", + "inputs": {} + }, + "vnfs": { + "VF_vMee 0": { + "uuid": "d6557200-ecf2-4641-8094-5393ae3aae60", + "invariantUuid": "4160458e-f648-4b30-a176-43881ffffe9e", + "description": "VSP_vMee", + "name": "VF_vMee", + "version": "2.0", + "customizationUuid": "91415b44-753d-494c-926a-456a9172bbb9", + "inputs": {}, + "commands": {}, + "serviceEcompNaming" : "true", + "properties": { + "ecomp_generated_naming": "false", + "max_instances": 10, + "min_instances": 1, + "gpb2_Internal2_mac": "00:11:22:EF:AC:DF", + "sctp-b-ipv6-egress_src_start_port": "0", + "sctp-a-ipv6-egress_rule_application": "any", + "Internal2_allow_transit": "true", + "sctp-b-IPv6_ethertype": "IPv6", + "sctp-a-egress_rule_application": "any", + "sctp-b-ingress_action": "pass", + "sctp-b-ingress_rule_protocol": "icmp", + "ncb2_Internal1_mac": "00:11:22:EF:AC:DF", + "sctp-b-ipv6-ingress-src_start_port": "0.0", + "ncb1_Internal2_mac": "00:11:22:EF:AC:DF", + "fsb_volume_size_0": "320.0", + "sctp-b-egress_src_addresses": "local", + "sctp-a-ipv6-ingress_ethertype": "IPv4", + "sctp-a-ipv6-ingress-dst_start_port": "0", + "sctp-b-ipv6-ingress_rule_application": "any", + "domain_name": "default-domain", + "sctp-a-ingress_rule_protocol": "icmp", + "sctp-b-egress-src_start_port": "0.0", + "sctp-a-egress_src_addresses": "local", + "sctp-b-display_name": "epc-sctp-b-ipv4v6-sec-group", + "sctp-a-egress-src_start_port": "0.0", + "sctp-a-ingress_ethertype": "IPv4", + "sctp-b-ipv6-ingress-dst_end_port": "65535", + "sctp-b-dst_subnet_prefix_v6": "::", + "nf_naming": "{ecomp_generated_naming=true}", + "sctp-a-ipv6-ingress_src_subnet_prefix": "0.0.0.0", + "sctp-b-egress-dst_start_port": "0.0", + "ncb_flavor_name": "nv.c20r64d1", + "gpb1_Internal1_mac": "00:11:22:EF:AC:DF", + "sctp-b-egress_dst_subnet_prefix_len": "0.0", + "Internal2_net_cidr": "10.0.0.10", + "sctp-a-ingress-dst_start_port": "0.0", + "sctp-a-egress-dst_start_port": "0.0", + "fsb1_Internal2_mac": "00:11:22:EF:AC:DF", + "sctp-a-egress_ethertype": "IPv4", + "vlc_st_service_mode": "in-network-nat", + "sctp-a-ipv6-egress_ethertype": "IPv4", + "sctp-a-egress-src_end_port": "65535.0", + "sctp-b-ipv6-egress_rule_application": "any", + "sctp-b-egress_action": "pass", + "sctp-a-ingress-src_subnet_prefix_len": "0.0", + "sctp-b-ipv6-ingress-src_end_port": "65535.0", + "sctp-b-name": "epc-sctp-b-ipv4v6-sec-group", + "fsb2_Internal1_mac": "00:11:22:EF:AC:DF", + "sctp-a-ipv6-ingress-src_start_port": "0.0", + "sctp-b-ipv6-egress_ethertype": "IPv4", + "Internal1_net_cidr": "10.0.0.10", + "sctp-a-egress_dst_subnet_prefix": "0.0.0.0", + "fsb_flavor_name": "nv.c20r64d1", + "sctp_rule_protocol": "132", + "sctp-b-ipv6-ingress_src_subnet_prefix_len": "0", + "sctp-a-ipv6-ingress_rule_application": "any", + "sctp-a-IPv6_ethertype": "IPv6", + "vlc2_Internal1_mac": "00:11:22:EF:AC:DF", + "vlc_st_virtualization_type": "virtual-machine", + "sctp-b-ingress-dst_start_port": "0.0", + "sctp-b-ingress-dst_end_port": "65535.0", + "sctp-a-ipv6-ingress-src_end_port": "65535.0", + "sctp-a-display_name": "epc-sctp-a-ipv4v6-sec-group", + "sctp-b-ingress_rule_application": "any", + "int2_sec_group_name": "int2-sec-group", + "vlc_flavor_name": "nd.c16r64d1", + "sctp-b-ipv6-egress_src_addresses": "local", + "vlc_st_interface_type_int1": "other1", + "sctp-b-egress-src_end_port": "65535.0", + "sctp-a-ipv6-egress-dst_start_port": "0", + "vlc_st_interface_type_int2": "other2", + "sctp-a-ipv6-egress_rule_protocol": "any", + "Internal2_shared": "false", + "sctp-a-ipv6-egress_dst_subnet_prefix_len": "0", + "Internal2_rpf": "disable", + "vlc1_Internal1_mac": "00:11:22:EF:AC:DF", + "sctp-b-ipv6-egress_src_end_port": "65535", + "sctp-a-ipv6-egress_src_addresses": "local", + "sctp-a-ingress-dst_end_port": "65535.0", + "sctp-a-ipv6-egress_src_end_port": "65535", + "Internal1_forwarding_mode": "l2", + "Internal2_dhcp": "false", + "sctp-a-dst_subnet_prefix_v6": "::", + "pxe_image_name": "MME_PXE-Boot_16ACP04_GA.qcow2", + "vlc_st_interface_type_gtp": "other0", + "ncb1_Internal1_mac": "00:11:22:EF:AC:DF", + "sctp-b-src_subnet_prefix_v6": "::", + "sctp-a-egress_dst_subnet_prefix_len": "0.0", + "int1_sec_group_name": "int1-sec-group", + "Internal1_dhcp": "false", + "sctp-a-ipv6-egress_dst_end_port": "65535", + "Internal2_forwarding_mode": "l2", + "fsb2_Internal2_mac": "00:11:22:EF:AC:DF", + "sctp-b-egress_dst_subnet_prefix": "0.0.0.0", + "Internal1_net_cidr_len": "17", + "gpb2_Internal1_mac": "00:11:22:EF:AC:DF", + "sctp-b-ingress-src_subnet_prefix_len": "0.0", + "sctp-a-ingress_dst_addresses": "local", + "sctp-a-egress_action": "pass", + "fsb_volume_type_0": "SF-Default-SSD", + "ncb2_Internal2_mac": "00:11:22:EF:AC:DF", + "vlc_st_interface_type_sctp_a": "left", + "vlc_st_interface_type_sctp_b": "right", + "sctp-a-src_subnet_prefix_v6": "::", + "vlc_st_version": "2", + "sctp-b-egress_ethertype": "IPv4", + "sctp-a-ingress_rule_application": "any", + "gpb1_Internal2_mac": "00:11:22:EF:AC:DF", + "instance_ip_family_v6": "v6", + "sctp-a-ipv6-egress_src_start_port": "0", + "sctp-b-ingress-src_start_port": "0.0", + "sctp-b-ingress_dst_addresses": "local", + "fsb1_Internal1_mac": "00:11:22:EF:AC:DF", + "vlc_st_interface_type_oam": "management", + "multi_stage_design": "true", + "oam_sec_group_name": "oam-sec-group", + "Internal2_net_gateway": "10.0.0.10", + "sctp-a-ipv6-ingress-dst_end_port": "65535", + "sctp-b-ipv6-egress-dst_start_port": "0", + "Internal1_net_gateway": "10.0.0.10", + "sctp-b-ipv6-egress_rule_protocol": "any", + "gtp_sec_group_name": "gtp-sec-group", + "sctp-a-ipv6-egress_dst_subnet_prefix": "0.0.0.0", + "sctp-b-ipv6-egress_dst_subnet_prefix_len": "0", + "sctp-a-ipv6-ingress_dst_addresses": "local", + "sctp-a-egress_rule_protocol": "icmp", + "sctp-b-ipv6-egress_action": "pass", + "sctp-a-ipv6-egress_action": "pass", + "Internal1_shared": "false", + "sctp-b-ipv6-ingress_rule_protocol": "any", + "Internal2_net_cidr_len": "17", + "sctp-a-name": "epc-sctp-a-ipv4v6-sec-group", + "sctp-a-ingress-src_end_port": "65535.0", + "sctp-b-ipv6-ingress_src_subnet_prefix": "0.0.0.0", + "sctp-a-egress-dst_end_port": "65535.0", + "sctp-a-ingress_action": "pass", + "sctp-b-egress_rule_protocol": "icmp", + "sctp-b-ipv6-ingress_action": "pass", + "vlc_st_service_type": "firewall", + "sctp-b-ipv6-egress_dst_end_port": "65535", + "sctp-b-ipv6-ingress-dst_start_port": "0", + "vlc2_Internal2_mac": "00:11:22:EF:AC:DF", + "vlc_st_availability_zone": "true", + "fsb_volume_image_name_1": "MME_FSB2_16ACP04_GA.qcow2", + "sctp-b-ingress-src_subnet_prefix": "0.0.0.0", + "sctp-a-ipv6-ingress_src_subnet_prefix_len": "0", + "Internal1_allow_transit": "true", + "gpb_flavor_name": "nv.c20r64d1", + "availability_zone_max_count": "1", + "fsb_volume_image_name_0": "MME_FSB1_16ACP04_GA.qcow2", + "sctp-b-ipv6-ingress_dst_addresses": "local", + "sctp-b-ipv6-egress_dst_subnet_prefix": "0.0.0.0", + "sctp-b-ipv6-ingress_ethertype": "IPv4", + "vlc1_Internal2_mac": "00:11:22:EF:AC:DF", + "sctp-a-ingress-src_subnet_prefix": "0.0.0.0", + "sctp-a-ipv6-ingress_action": "pass", + "Internal1_rpf": "disable", + "sctp-b-ingress_ethertype": "IPv4", + "sctp-b-egress_rule_application": "any", + "sctp-b-ingress-src_end_port": "65535.0", + "sctp-a-ipv6-ingress_rule_protocol": "any", + "sctp-a-ingress-src_start_port": "0.0", + "sctp-b-egress-dst_end_port": "65535.0" + }, + "type": "VF", + "modelCustomizationName": "VF_vMee 0", + "vfModules": { + "vf_vmee0..VfVmee..vmme_vlc..module-1": { + "uuid": "522159d5-d6e0-4c2a-aa44-5a542a12a830", + "invariantUuid": "98a7c88b-b577-476a-90e4-e25a5871e02b", + "customizationUuid": "55b1be94-671a-403e-a26c-667e9c47d091", + "description": null, + "name": "VfVmee..vmme_vlc..module-1", + "version": "2", + "modelCustomizationName": "VfVmee..vmme_vlc..module-1", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "vmme_vlc" + }, + "inputs": {}, + "volumeGroupAllowed": true + }, + "vf_vmee0..VfVmee..vmme_gpb..module-2": { + "uuid": "41708296-e443-4c71-953f-d9a010f059e1", + "invariantUuid": "1cca90b8-3490-495e-87da-3f3e4c57d5b9", + "customizationUuid": "6add59e0-7fe1-4bc4-af48-f8812422ae7c", + "description": null, + "name": "VfVmee..vmme_gpb..module-2", + "version": "2", + "modelCustomizationName": "VfVmee..vmme_gpb..module-2", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "vmme_gpb" + }, + "inputs": {}, + "volumeGroupAllowed": false + }, + "vf_vmee0..VfVmee..base_vmme..module-0": { + "uuid": "a27f5cfc-7f12-4f99-af08-0af9c3885c87", + "invariantUuid": "a6f9e51a-2b35-416a-ae15-15e58d61f36d", + "customizationUuid": "f8c040f1-7e51-4a11-aca8-acf256cfd861", + "description": null, + "name": "VfVmee..base_vmme..module-0", + "version": "2", + "modelCustomizationName": "VfVmee..base_vmme..module-0", + "properties": { + "minCountInstances": 1, + "maxCountInstances": 1, + "initialCount": 1, + "vfModuleLabel": "base_vmme" + }, + "inputs": {}, + "volumeGroupAllowed": true + } + }, + "volumeGroups": { + "vf_vmee0..VfVmee..base_vmme..module-0": { + "uuid": "a27f5cfc-7f12-4f99-af08-0af9c3885c87", + "invariantUuid": "a6f9e51a-2b35-416a-ae15-15e58d61f36d", + "customizationUuid": "f8c040f1-7e51-4a11-aca8-acf256cfd861", + "description": null, + "name": "VfVmee..base_vmme..module-0", + "version": "2", + "modelCustomizationName": "VfVmee..base_vmme..module-0", + "properties": { + "minCountInstances": 1, + "maxCountInstances": 1, + "initialCount": 1, + "vfModuleLabel": "base_vmme" + }, + "inputs": {} + } + }, + "vfcInstanceGroups": {} + } + }, + "networks": { + "ExtVL 0": { + "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986", + "invariantUuid": "379f816b-a7aa-422f-be30-17114ff50b7c", + "description": "ECOMP generic virtual link (network) base type for all other service-level and global networks", + "name": "ExtVL", + "version": "37.0", + "customizationUuid": "94fdd893-4a36-4d70-b16a-ec29c54c184f", + "inputs": {}, + "commands": {}, + "properties": { + "ecomp_generated_naming": "false", + "network_assignments": "{is_external_network=false, ipv4_subnet_default_assignment={min_subnets_count=1}, ecomp_generated_network_assignment=false, ipv6_subnet_default_assignment={min_subnets_count=1}}", + "exVL_naming": "{ecomp_generated_naming=true}", + "network_flows": "{is_network_policy=false, is_bound_to_vpn=false}", + "network_homing": "{ecomp_selected_instance_node_target=false}" + }, + "type": "VL", + "modelCustomizationName": "ExtVL 0" + } + }, + "collectionResource": {}, + "configurations": { + "Port Mirroring Configuration By Policy 0": { + "uuid": "b4398538-e89d-4f13-b33d-ca323434ba50", + "invariantUuid": "6ef0ca40-f366-4897-951f-abd65d25f6f7", + "description": "A port mirroring configuration by policy object", + "name": "Port Mirroring Configuration By Policy", + "version": "27.0", + "customizationUuid": "3c3b7b8d-8669-4b3b-8664-61970041fad2", + "inputs": {}, + "commands": {}, + "properties": {}, + "type": "Configuration", + "modelCustomizationName": "Port Mirroring Configuration By Policy 0", + "sourceNodes": [], + "collectorNodes": null, + "configurationByPolicy": false + } + }, + "serviceProxies": {}, + "vfModules": { + "vf_vmee0..VfVmee..vmme_vlc..module-1": { + "uuid": "522159d5-d6e0-4c2a-aa44-5a542a12a830", + "invariantUuid": "98a7c88b-b577-476a-90e4-e25a5871e02b", + "customizationUuid": "55b1be94-671a-403e-a26c-667e9c47d091", + "description": null, + "name": "VfVmee..vmme_vlc..module-1", + "version": "2", + "modelCustomizationName": "VfVmee..vmme_vlc..module-1", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "vmme_vlc" + }, + "inputs": {}, + "volumeGroupAllowed": true + }, + "vf_vmee0..VfVmee..vmme_gpb..module-2": { + "uuid": "41708296-e443-4c71-953f-d9a010f059e1", + "invariantUuid": "1cca90b8-3490-495e-87da-3f3e4c57d5b9", + "customizationUuid": "6add59e0-7fe1-4bc4-af48-f8812422ae7c", + "description": null, + "name": "VfVmee..vmme_gpb..module-2", + "version": "2", + "modelCustomizationName": "VfVmee..vmme_gpb..module-2", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "vmme_gpb" + }, + "inputs": {}, + "volumeGroupAllowed": false + }, + "vf_vmee0..VfVmee..base_vmme..module-0": { + "uuid": "a27f5cfc-7f12-4f99-af08-0af9c3885c87", + "invariantUuid": "a6f9e51a-2b35-416a-ae15-15e58d61f36d", + "customizationUuid": "f8c040f1-7e51-4a11-aca8-acf256cfd861", + "description": null, + "name": "VfVmee..base_vmme..module-0", + "version": "2", + "modelCustomizationName": "VfVmee..base_vmme..module-0", + "properties": { + "minCountInstances": 1, + "maxCountInstances": 1, + "initialCount": 1, + "vfModuleLabel": "base_vmme" + }, + "inputs": {}, + "volumeGroupAllowed": true + } + }, + "volumeGroups": { + "vf_vmee0..VfVmee..base_vmme..module-0": { + "uuid": "a27f5cfc-7f12-4f99-af08-0af9c3885c87", + "invariantUuid": "a6f9e51a-2b35-416a-ae15-15e58d61f36d", + "customizationUuid": "f8c040f1-7e51-4a11-aca8-acf256cfd861", + "description": null, + "name": "VfVmee..base_vmme..module-0", + "version": "2", + "modelCustomizationName": "VfVmee..base_vmme..module-0", + "properties": { + "minCountInstances": 1, + "maxCountInstances": 1, + "initialCount": 1, + "vfModuleLabel": "base_vmme" + }, + "inputs": {} + } + }, + "pnfs": {} + } + }, + "serviceInstance": { + "6e59c5de-f052-46fa-aa7e-2fca9d674c44": { + "networks": {}, + "vnfs": { + "VF_vMee 0": { + "rollbackOnFailure": "true", + "vfModules": { + "vf_vmee0..VfVmee..base_vmme..module-0": { + "vf_vmee0..VfVmee..base_vmme..module-0vmvzo": { + "isMissingData": false, + "sdncPreReload": null, + "modelInfo": { + "modelType": "VFmodule", + "modelInvariantId": "a6f9e51a-2b35-416a-ae15-15e58d61f36d", + "modelVersionId": "a27f5cfc-7f12-4f99-af08-0af9c3885c87", + "modelName": "VfVmee..base_vmme..module-0", + "modelVersion": "2", + "modelCustomizationId": "f8c040f1-7e51-4a11-aca8-acf256cfd861", + "modelCustomizationName": "VfVmee..base_vmme..module-0" + }, + "instanceParams": [ + {} + ], + "trackById": "wmtm6sy2uj" + } + } + }, + "isMissingData": true, + "originalName": "VF_vMee 0", + "vnfStoreKey": "VF_vMee 0", + "trackById": "p3wk448m5do", + "uuid": "d6557200-ecf2-4641-8094-5393ae3aae60", + "productFamilyId": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e", + "lcpCloudRegionId": null, + "tenantId": null, + "lineOfBusiness": null, + "platformName": null, + "modelInfo": { + "modelType": "VF", + "modelInvariantId": "4160458e-f648-4b30-a176-43881ffffe9e", + "modelVersionId": "6e59c5de-f052-46fa-aa7e-2fca9d674c44", + "modelName": "VF_vMee", + "modelVersion": "2.0", + "modelCustomizationName": "VF_vMee 0" + } + } + }, + "instanceParams": [ + {} + ], + "validationCounter": 1, + "existingNames": {}, + "existingVNFCounterMap": { + "d6557200-ecf2-4641-8094-5393ae3aae60": 1 + }, + "globalSubscriberId": "e433710f-9217-458d-a79d-1c7aff376d89", + "subscriptionServiceType": "TYLER SILVIA", + "owningEntityId": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc", + "productFamilyId": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e", + "lcpCloudRegionId": "hvf6", + "tenantId": "229bcdc6eaeb4ca59d55221141d01f8e", + "aicZoneId": "JAG1", + "projectName": "x1", + "rollbackOnFailure": "true", + "bulkSize": 1, + "modelInfo": { + "modelInvariantId": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0", + "modelVersionId": "6e59c5de-f052-46fa-aa7e-2fca9d674c44", + "modelName": "ComplexService", + "modelVersion": "1.0", + "uuid": "6e59c5de-f052-46fa-aa7e-2fca9d674c44" + }, + "isALaCarte": false, + "name": "ComplexService", + "version": "1.0", + "description": "ComplexService", + "category": "Emanuel", + "uuid": "6e59c5de-f052-46fa-aa7e-2fca9d674c44", + "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0", + "serviceType": "", + "serviceRole": "", + "isEcompGeneratedNaming": true, + "isMultiStepDesign": false + } + }, + "lcpRegionsAndTenants": { + "lcpRegionList": [ + { + "id": "JANET25", + "name": "JANET25", + "isPermitted": true + }, + { + "id": "hvf6", + "name": "hvf6", + "isPermitted": true + } + ], + "lcpRegionsTenantsMap": { + "JANET25": [ + { + "id": "092eb9e8e4b7412e8787dd091bc58e86", + "name": "USP-SIP-IC-24335-T-01", + "isPermitted": true + } + ], + "hvf6": [ + { + "id": "bae71557c5bb4d5aac6743a4e5f1d054", + "name": "AIN Web Tool-15-D-testalexandria", + "isPermitted": true + }, + { + "id": "229bcdc6eaeb4ca59d55221141d01f8e", + "name": "AIN Web Tool-15-D-STTest2", + "isPermitted": true + }, + { + "id": "1178612d2b394be4834ad77f567c0af2", + "name": "AIN Web Tool-15-D-SSPtestcustome", + "isPermitted": true + }, + { + "id": "19c5ade915eb461e8af52fb2fd8cd1f2", + "name": "AIN Web Tool-15-D-UncheckedEcopm", + "isPermitted": true + }, + { + "id": "de007636e25249238447264a988a927b", + "name": "AIN Web Tool-15-D-dfsdf", + "isPermitted": true + }, + { + "id": "62f29b3613634ca6a3065cbe0e020c44", + "name": "AIN/SMS-16-D-Multiservices1", + "isPermitted": true + }, + { + "id": "649289e30d3244e0b48098114d63c2aa", + "name": "AIN Web Tool-15-D-SSPST66", + "isPermitted": true + }, + { + "id": "3f21eeea6c2c486bba31dab816c05a32", + "name": "AIN Web Tool-15-D-ASSPST47", + "isPermitted": true + }, + { + "id": "f60ce21d3ee6427586cff0d22b03b773", + "name": "CESAR-100-D-sspjg67246", + "isPermitted": true + }, + { + "id": "8774659e425f479895ae091bb5d46560", + "name": "CESAR-100-D-sspjg68359", + "isPermitted": true + }, + { + "id": "624eb554b0d147c19ff8885341760481", + "name": "AINWebTool-15-D-iftach", + "isPermitted": true + }, + { + "id": "214f55f5fc414c678059c383b03e4962", + "name": "CESAR-100-D-sspjg612401", + "isPermitted": true + }, + { + "id": "c90666c291664841bb98e4d981ff1db5", + "name": "CESAR-100-D-sspjg621340", + "isPermitted": true + }, + { + "id": "ce5b6bc5c7b348e1bf4b91ac9a174278", + "name": "sspjg621351cloned", + "isPermitted": true + }, + { + "id": "b386b768a3f24c8e953abbe0b3488c02", + "name": "AINWebTool-15-D-eteancomp", + "isPermitted": true + }, + { + "id": "dc6c4dbfd225474e9deaadd34968646c", + "name": "AINWebTool-15-T-SPFET", + "isPermitted": true + }, + { + "id": "02cb5030e9914aa4be120bd9ed1e19eb", + "name": "AINWebTool-15-X-eeweww", + "isPermitted": true + }, + { + "id": "f2f3830e4c984d45bcd00e1a04158a79", + "name": "CESAR-100-D-spjg61909", + "isPermitted": true + }, + { + "id": "05b91bd5137f4929878edd965755c06d", + "name": "CESAR-100-D-sspjg621512cloned", + "isPermitted": true + }, + { + "id": "7002fbe8482d4a989ddf445b1ce336e0", + "name": "AINWebTool-15-X-vdr", + "isPermitted": true + }, + { + "id": "4008522be43741dcb1f5422022a2aa0b", + "name": "AINWebTool-15-D-ssasa", + "isPermitted": true + }, + { + "id": "f44e2e96a1b6476abfda2fa407b00169", + "name": "AINWebTool-15-D-PFNPT", + "isPermitted": true + }, + { + "id": "b69a52bec8a84669a37a1e8b72708be7", + "name": "AINWebTool-15-X-vdre", + "isPermitted": true + }, + { + "id": "fac7d9fd56154caeb9332202dcf2969f", + "name": "AINWebTool-15-X-NONPODECOMP", + "isPermitted": true + }, + { + "id": "2d34d8396e194eb49969fd61ffbff961", + "name": "DN5242-Nov16-T5", + "isPermitted": true + }, + { + "id": "cb42a77ff45b48a8b8deb83bb64acc74", + "name": "ro-T11", + "isPermitted": true + }, + { + "id": "fa45ca53c80b492fa8be5477cd84fc2b", + "name": "ro-T112", + "isPermitted": true + }, + { + "id": "4914ab0ab3a743e58f0eefdacc1dde77", + "name": "DN5242-Nov21-T1", + "isPermitted": true + }, + { + "id": "d0a3e3f2964542259d155a81c41aadc3", + "name": "test-hvf6-09", + "isPermitted": true + }, + { + "id": "cbb99fe4ada84631b7baf046b6fd2044", + "name": "DN5242-Nov16-T3", + "isPermitted": true + } + ] + } + }, + "productFamilies": [ + { + "id": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034", + "name": "SCOTTIE", + "isPermitted": true + }, + { + "id": "17cc1042-527b-11e6-beb8-9e71128cae77", + "name": "IGNACIO", + "isPermitted": true + }, + { + "id": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e", + "name": "Christie", + "isPermitted": true + }, + { + "id": "a4f6f2ae-9bf5-4ed7-b904-06b2099c4bd7", + "name": "Enhanced Services", + "isPermitted": true + }, + { + "id": "vTerrance", + "name": "vTerrance", + "isPermitted": true + }, + { + "id": "323d69d9-2efe-4r45-ay0a-89ea7ard4e6f", + "name": "vSCP", + "isPermitted": true + }, + { + "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb", + "name": "Emanuel", + "isPermitted": true + }, + { + "id": "d8a6ed93-251c-47ca-adc9-86671fd19f4c", + "name": "BVOIP", + "isPermitted": true + }, + { + "id": "db171b8f-115c-4992-a2e3-ee04cae357e0", + "name": "LINDSEY", + "isPermitted": true + }, + { + "id": "LRSI-OSPF", + "name": "LRSI-OSPF", + "isPermitted": true + }, + { + "id": "vRosemarie", + "name": "HNGATEWAY", + "isPermitted": true + }, + { + "id": "vHNPaas", + "name": "WILKINS", + "isPermitted": true + }, + { + "id": "e433710f-9217-458d-a79d-1c7aff376d89", + "name": "TYLER SILVIA", + "isPermitted": true + }, + { + "id": "b6a3f28c-eebf-494c-a900-055cc7c874ce", + "name": "VROUTER", + "isPermitted": true + }, + { + "id": "Cisneros", + "name": "vMuriel", + "isPermitted": true + }, + { + "id": "0ee8c1bc-7cbd-4b0a-a1ac-e9999255abc1", + "name": "CARA Griffin", + "isPermitted": true + }, + { + "id": "c7611ebe-c324-48f1-8085-94aef0c6ef3d", + "name": "DARREN MCGEE", + "isPermitted": true + }, + { + "id": "e30755dc-5673-4b6b-9dcf-9abdd96b93d1", + "name": "Transport", + "isPermitted": true + }, + { + "id": "vSalvatore", + "name": "vSalvatore", + "isPermitted": true + }, + { + "id": "d7bb0a21-66f2-4e6d-87d9-9ef3ced63ae4", + "name": "Josefina", + "isPermitted": true + }, + { + "id": "vHubbard", + "name": "vHubbard", + "isPermitted": true + }, + { + "id": "12a96a9d-4b4c-4349-a950-fe1159602621", + "name": "DARREN MCGEE", + "isPermitted": true + } + ], + "serviceTypes": { + "e433710f-9217-458d-a79d-1c7aff376d89": [ + { + "id": "0", + "name": "vRichardson", + "isPermitted": false + }, + { + "id": "1", + "name": "TYLER SILVIA", + "isPermitted": true + }, + { + "id": "2", + "name": "Emanuel", + "isPermitted": false + }, + { + "id": "3", + "name": "vJamie", + "isPermitted": false + }, + { + "id": "4", + "name": "vVoiceMail", + "isPermitted": false + }, + { + "id": "5", + "name": "Kennedy", + "isPermitted": false + }, + { + "id": "6", + "name": "vSEGW", + "isPermitted": false + }, + { + "id": "7", + "name": "vVM", + "isPermitted": false + }, + { + "id": "8", + "name": "vOTA", + "isPermitted": false + }, + { + "id": "9", + "name": "vMME", + "isPermitted": false + }, + { + "id": "10", + "name": "vMNS", + "isPermitted": false + }, + { + "id": "11", + "name": "vSCP", + "isPermitted": false + }, + { + "id": "12", + "name": "VPMS", + "isPermitted": false + }, + { + "id": "13", + "name": "vMMSC", + "isPermitted": false + }, + { + "id": "14", + "name": "SSD", + "isPermitted": false + }, + { + "id": "15", + "name": "vMOG", + "isPermitted": false + }, + { + "id": "16", + "name": "LINDSEY", + "isPermitted": false + }, + { + "id": "17", + "name": "JOHANNA_SANTOS", + "isPermitted": false + }, + { + "id": "18", + "name": "vCarroll", + "isPermitted": false + } + ] + }, + "aicZones": [ + { + "id": "NFT1", + "name": "NFTJSSSS-NFT1" + }, + { + "id": "JAG1", + "name": "YUDFJULP-JAG1" + }, + { + "id": "YYY1", + "name": "UUUAIAAI-YYY1" + }, + { + "id": "BAN1", + "name": "VSDKYUTP-BAN1" + }, + { + "id": "DKJ1", + "name": "DKJSJDKA-DKJ1" + }, + { + "id": "MCS1", + "name": "ASACMAMS-MCS1" + }, + { + "id": "UIO1", + "name": "uioclli1-UIO1" + }, + { + "id": "RAJ1", + "name": "YGBIJNLQ-RAJ1" + }, + { + "id": "OPA1", + "name": "opaclli1-OPA1" + }, + { + "id": "SDE1", + "name": "ZXCVBNMA-SDE1" + }, + { + "id": "VEN2", + "name": "FGHJUHIL-VEN2" + }, + { + "id": "ORL1", + "name": "ORLDFLMA-ORL1" + }, + { + "id": "JAD1", + "name": "JADECLLI-JAD1" + }, + { + "id": "ZXL1", + "name": "LWLWCANN-ZXL1" + }, + { + "id": "CKL1", + "name": "CLKSKCKK-CKL1" + }, + { + "id": "SDF1", + "name": "sdfclli1-SDF1" + }, + { + "id": "RAD1", + "name": "RADICAL1-RAD1" + }, + { + "id": "KIT1", + "name": "BHYJFGLN-KIT1" + }, + { + "id": "REL1", + "name": "INGERFGT-REL1" + }, + { + "id": "JNL1", + "name": "CJALSDAC-JNL1" + }, + { + "id": "OLK1", + "name": "OLKOLKLS-OLK1" + }, + { + "id": "CHI1", + "name": "CHILLIWE-CHI1" + }, + { + "id": "UUU4", + "name": "UUUAAAUU-UUU4" + }, + { + "id": "TUF1", + "name": "TUFCLLI1-TUF1" + }, + { + "id": "KJN1", + "name": "CKALDKSA-KJN1" + }, + { + "id": "SAM1", + "name": "SNDGCA64-SAN1" + }, + { + "id": "SCK1", + "name": "SCKSCKSK-SCK1" + }, + { + "id": "HJH1", + "name": "AOEEQQQD-HJH1" + }, + { + "id": "HGD1", + "name": "SDFQWHGD-HGD1" + }, + { + "id": "KOR1", + "name": "HYFLNBVT-KOR1" + }, + { + "id": "ATL43", + "name": "AICLOCID-ATL43" + }, + { + "id": "ATL54", + "name": "AICFTAAI-ATL54" + }, + { + "id": "ATL66", + "name": "CLLIAAII-ATL66" + }, + { + "id": "VEL1", + "name": "BNMLKUIK-VEL1" + }, + { + "id": "ICC1", + "name": "SANJITAT-ICC1" + }, + { + "id": "MNT11", + "name": "WSXEFBTH-MNT11" + }, + { + "id": "DEF2", + "name": "WSBHGTYL-DEF2" + }, + { + "id": "MAD11", + "name": "SDFQWGKL-MAD11" + }, + { + "id": "OLG1", + "name": "OLHOLHOL-OLG1" + }, + { + "id": "GAR1", + "name": "NGFVSJKO-GAR1" + }, + { + "id": "SAN22", + "name": "GNVLSCTL-SAN22" + }, + { + "id": "HRG1", + "name": "HRGHRGGS-HRG1" + }, + { + "id": "JCS1", + "name": "JCSJSCJS-JCS1" + }, + { + "id": "DHA12", + "name": "WSXEDECF-DHA12" + }, + { + "id": "HJE1", + "name": "AOEEWWWD-HJE1" + }, + { + "id": "NCA1", + "name": "NCANCANN-NCA1" + }, + { + "id": "IOP1", + "name": "iopclli1-IOP1" + }, + { + "id": "RTY1", + "name": "rtyclli1-RTY1" + }, + { + "id": "KAP1", + "name": "HIOUYTRQ-KAP1" + }, + { + "id": "ZEN1", + "name": "ZENCLLI1-ZEN1" + }, + { + "id": "HKA1", + "name": "JAKHLASS-HKA1" + }, + { + "id": "CQK1", + "name": "CQKSCAKK-CQK1" + }, + { + "id": "SAI1", + "name": "UBEKQLPD-SAI1" + }, + { + "id": "ERT1", + "name": "ertclli1-ERT1" + }, + { + "id": "IBB1", + "name": "PLMKOIJU-IBB1" + }, + { + "id": "TIR2", + "name": "PLKINHYI-TIR2" + }, + { + "id": "HSD1", + "name": "CHASKCDS-HSD1" + }, + { + "id": "SLF78", + "name": "SDCTLFN1-SLF78" + }, + { + "id": "SEE78", + "name": "SDCTEEE4-SEE78" + }, + { + "id": "SAN13", + "name": "TOKYJPFA-SAN13" + }, + { + "id": "SAA78", + "name": "SDCTAAA1-SAA78" + }, + { + "id": "LUC1", + "name": "ATLDFGYC-LUC1" + }, + { + "id": "AMD13", + "name": "MEMATLAN-AMD13" + }, + { + "id": "TOR1", + "name": "TOROONXN-TOR1" + }, + { + "id": "QWE1", + "name": "QWECLLI1-QWE1" + }, + { + "id": "ZOG1", + "name": "ZOGASTRO-ZOG1" + }, + { + "id": "CAL33", + "name": "CALIFORN-CAL33" + }, + { + "id": "SHH78", + "name": "SDIT1HHH-SHH78" + }, + { + "id": "DSA1", + "name": "LKJHGFDS-DSA1" + }, + { + "id": "CLG1", + "name": "CLGRABAD-CLG1" + }, + { + "id": "BNA1", + "name": "BNARAGBK-BNA1" + }, + { + "id": "ATL84", + "name": "CANTTCOC-ATL84" + }, + { + "id": "APP1", + "name": "WBHGTYUI-APP1" + }, + { + "id": "RJN1", + "name": "RJNRBZAW-RJN1" + }, + { + "id": "EHH78", + "name": "SDCSHHH5-EHH78" + }, + { + "id": "mac10", + "name": "PKGTESTF-mac10" + }, + { + "id": "SXB78", + "name": "SDCTGXB1-SXB78" + }, + { + "id": "SAX78", + "name": "SDCTAXG1-SAX78" + }, + { + "id": "SYD1", + "name": "SYDNAUBV-SYD1" + }, + { + "id": "TOK1", + "name": "TOKYJPFA-TOK1" + }, + { + "id": "KGM2", + "name": "KGMTNC20-KGM2" + }, + { + "id": "DCC1b", + "name": "POIUYTGH-DCC1b" + }, + { + "id": "SKK78", + "name": "SDCTKKK1-SKK78" + }, + { + "id": "SGG78", + "name": "SDCTGGG1-SGG78" + }, + { + "id": "SJJ78", + "name": "SDCTJJJ1-SJJ78" + }, + { + "id": "SBX78", + "name": "SDCTBXG1-SBX78" + }, + { + "id": "LAG1", + "name": "LARGIZON-LAG1" + }, + { + "id": "IAA1", + "name": "QAZXSWED-IAA1" + }, + { + "id": "POI1", + "name": "PLMNJKIU-POI1" + }, + { + "id": "LAG1a", + "name": "LARGIZON-LAG1a" + }, + { + "id": "PBL1", + "name": "PBLAPBAI-PBL1" + }, + { + "id": "LAG45", + "name": "LARGIZON-LAG1a" + }, + { + "id": "MAR1", + "name": "MNBVCXZM-MAR1" + }, + { + "id": "HST70", + "name": "HSTNTX70-HST70" + }, + { + "id": "DCC1a", + "name": "POIUYTGH-DCC1a" + }, + { + "id": "TOL1", + "name": "TOLDOH21-TOL1" + }, + { + "id": "LON1", + "name": "LONEENCO-LON1" + }, + { + "id": "SJU78", + "name": "SDIT1JUB-SJU78" + }, + { + "id": "STN27", + "name": "HSTNTX01-STN27" + }, + { + "id": "SSW56", + "name": "ss8126GT-SSW56" + }, + { + "id": "SBB78", + "name": "SDIT1BBB-SBB78" + }, + { + "id": "DCC3", + "name": "POIUYTGH-DCC3" + }, + { + "id": "GNV1", + "name": "GNVLSCTL-GNV1" + }, + { + "id": "WAS1", + "name": "WASHDCSW-WAS1" + }, + { + "id": "TOY1", + "name": "TORYONNZ-TOY1" + }, + { + "id": "STT1", + "name": "STTLWA02-STT1" + }, + { + "id": "STG1", + "name": "STTGGE62-STG1" + }, + { + "id": "SLL78", + "name": "SDCTLLL1-SLL78" + }, + { + "id": "SBU78", + "name": "SDIT1BUB-SBU78" + }, + { + "id": "ATL2", + "name": "ATLNGANW-ATL2" + }, + { + "id": "BOT1", + "name": "BOTHWAKY-BOT1" + }, + { + "id": "SNG1", + "name": "SNGPSIAU-SNG1" + }, + { + "id": "NYC1", + "name": "NYCMNY54-NYC1" + }, + { + "id": "LAG1b", + "name": "LARGIZON-LAG1b" + }, + { + "id": "AMD15", + "name": "AMDFAA01-AMD15" + }, + { + "id": "SNA1", + "name": "SNANTXCA-SNA1" + }, + { + "id": "PLT1", + "name": "PLTNCA60-PLT1" + }, + { + "id": "TLP1", + "name": "TLPNXM18-TLP1" + }, + { + "id": "SDD81", + "name": "SAIT1DD6-SDD81" + }, + { + "id": "DCC1", + "name": "POIUYTGH-DCC1" + }, + { + "id": "DCC2", + "name": "POIUYTGH-DCC2" + }, + { + "id": "OKC1", + "name": "OKCBOK55-OKC1" + }, + { + "id": "PAR1", + "name": "PARSFRCG-PAR1" + }, + { + "id": "TES36", + "name": "ABCEETES-TES36" + }, + { + "id": "COM1", + "name": "PLMKOPIU-COM1" + }, + { + "id": "ANI1", + "name": "ATLNGTRE-ANI1" + }, + { + "id": "SDG78", + "name": "SDIT1BDG-SDG78" + }, + { + "id": "mac20", + "name": "PKGTESTF-mac20" + }, + { + "id": "DSF45", + "name": "DSFBG123-DSF45" + }, + { + "id": "HST25", + "name": "HSTNTX01-HST25" + }, + { + "id": "AMD18", + "name": "AUDIMA01-AMD18" + }, + { + "id": "SAA80", + "name": "SAIT9AA3-SAA80" + }, + { + "id": "SSA56", + "name": "SSIT2AA7-SSA56" + }, + { + "id": "SDD82", + "name": "SAIT1DD9-SDD82" + }, + { + "id": "JCV1", + "name": "JCVLFLBW-JCV1" + }, + { + "id": "SUL2", + "name": "WERTYUJK-SUL2" + }, + { + "id": "PUR1", + "name": "purelyde-PUR1" + }, + { + "id": "FDE55", + "name": "FDERT555-FDE55" + }, + { + "id": "SITE", + "name": "LONEENCO-SITE" + }, + { + "id": "ATL1", + "name": "ATLNGAMA-ATL1" + }, + { + "id": "JUL1", + "name": "ZXCVBNMM-JUL1" + }, + { + "id": "TAT34", + "name": "TESAAISB-TAT34" + }, + { + "id": "XCP12", + "name": "CHKGH123-XCP12" + }, + { + "id": "RAI1", + "name": "poiuytre-RAI1" + }, + { + "id": "HPO1", + "name": "ATLNGAUP-HPO1" + }, + { + "id": "KJF12", + "name": "KJFDH123-KJF12" + }, + { + "id": "SCC80", + "name": "SAIT9CC3-SCC80" + }, + { + "id": "SAA12", + "name": "SAIT9AF8-SAA12" + }, + { + "id": "SAA14", + "name": "SAIT1AA9-SAA14" + }, + { + "id": "ATL35", + "name": "TTESSAAI-ATL35" + }, + { + "id": "CWY1", + "name": "CWYMOWBS-CWY1" + }, + { + "id": "ATL76", + "name": "TELEPAAI-ATL76" + }, + { + "id": "DSL12", + "name": "DSLFK242-DSL12" + }, + { + "id": "ATL53", + "name": "AAIATLTE-ATL53" + }, + { + "id": "SAA11", + "name": "SAIT9AA2-SAA11" + }, + { + "id": "ATL62", + "name": "TESSASCH-ATL62" + }, + { + "id": "AUG1", + "name": "ASDFGHJK-AUG1" + }, + { + "id": "POI22", + "name": "POIUY123-POI22" + }, + { + "id": "SAA13", + "name": "SAIT1AA9-SAA13" + }, + { + "id": "BHY17", + "name": "BHYTFRF3-BHY17" + }, + { + "id": "LIS1", + "name": "HOSTPROF-LIS1" + }, + { + "id": "SIP1", + "name": "ZXCVBNMK-SIP1" + }, + { + "id": "ATL99", + "name": "TEESTAAI-ATL43" + }, + { + "id": "ATL64", + "name": "FORLOAAJ-ATL64" + }, + { + "id": "TAT33", + "name": "TESAAISA-TAT33" + }, + { + "id": "RAD10", + "name": "INDIPUNE-RAD10" + }, + { + "id": "RTW5", + "name": "BHYTFRY4-RTW5" + }, + { + "id": "JGS1", + "name": "KSJKKKKK-JGS1" + }, + { + "id": "ATL98", + "name": "TEESTAAI-ATL43" + }, + { + "id": "WAN1", + "name": "LEIWANGW-WAN1" + }, + { + "id": "ATL44", + "name": "ATLSANAB-ATL44" + }, + { + "id": "RTD2", + "name": "BHYTFRk4-RTD2" + }, + { + "id": "NIR1", + "name": "ORFLMANA-NIR1" + }, + { + "id": "ATL75", + "name": "SANAAIRE-ATL75" + }, + { + "id": "NUM1", + "name": "QWERTYUI-NUM1" + }, + { + "id": "MTN32", + "name": "MDTWNJ21-MTN32" + }, + { + "id": "RTZ4", + "name": "BHYTFRZ6-RTZ4" + }, + { + "id": "ATL56", + "name": "ATLSANAC-ATL56" + }, + { + "id": "AMS1", + "name": "AMSTNLBW-AMS1" + }, + { + "id": "RCT1", + "name": "AMSTERNL-RCT1" + }, + { + "id": "JAN1", + "name": "ORFLMATT-JAN1" + }, + { + "id": "ABC14", + "name": "TESAAISA-ABC14" + }, + { + "id": "TAT37", + "name": "TESAAISD-TAT37" + }, + { + "id": "MIC54", + "name": "MICHIGAN-MIC54" + }, + { + "id": "ABC11", + "name": "ATLSANAI-ABC11" + }, + { + "id": "AMF11", + "name": "AMDOCS01-AMF11" + }, + { + "id": "ATL63", + "name": "ATLSANEW-ATL63" + }, + { + "id": "ABC12", + "name": "ATLSECIA-ABC12" + }, + { + "id": "MTN20", + "name": "MDTWNJ21-MTN20" + }, + { + "id": "ABC15", + "name": "AAITESAN-ABC15" + }, + { + "id": "AVT1", + "name": "AVTRFLHD-AVT1" + }, + { + "id": "ATL34", + "name": "ATLSANAI-ATL34" + } + ], + "categoryParameters": { + "owningEntityList": [ + { + "id": "aaa1", + "name": "aaa1" + }, + { + "id": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc", + "name": "WayneHolland" + }, + { + "id": "Melissa", + "name": "Melissa" + } + ], + "projectList": [ + { + "id": "WATKINS", + "name": "WATKINS" + }, + { + "id": "x1", + "name": "x1" + }, + { + "id": "yyy1", + "name": "yyy1" + } + ], + "lineOfBusinessList": [ + { + "id": "ONAP", + "name": "ONAP" + }, + { + "id": "zzz1", + "name": "zzz1" + } + ], + "platformList": [ + { + "id": "platform", + "name": "platform" + }, + { + "id": "xxx1", + "name": "xxx1" + } + ] + }, + "type": "[LCP_REGIONS_AND_TENANTS] Update", + "subscribers": [ + { + "id": "CAR_2020_ER", + "name": "CAR_2020_ER", + "isPermitted": true + }, + { + "id": "21014aa2-526b-11e6-beb8-9e71128cae77", + "name": "JULIO ERICKSON", + "isPermitted": false + }, + { + "id": "DHV1707-TestSubscriber-2", + "name": "DALE BRIDGES", + "isPermitted": false + }, + { + "id": "DHV1707-TestSubscriber-1", + "name": "LLOYD BRIDGES", + "isPermitted": false + }, + { + "id": "jimmy-example", + "name": "JimmyExampleCust-20161102", + "isPermitted": false + }, + { + "id": "jimmy-example2", + "name": "JimmyExampleCust-20161103", + "isPermitted": false + }, + { + "id": "ERICA5779-TestSub-PWT-102", + "name": "ERICA5779-TestSub-PWT-102", + "isPermitted": false + }, + { + "id": "ERICA5779-TestSub-PWT-101", + "name": "ERICA5779-TestSub-PWT-101", + "isPermitted": false + }, + { + "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb", + "name": "Emanuel", + "isPermitted": false + }, + { + "id": "ERICA5779-Subscriber-4", + "name": "ERICA5779-Subscriber-5", + "isPermitted": false + }, + { + "id": "ERICA5779-TestSub-PWT-103", + "name": "ERICA5779-TestSub-PWT-103", + "isPermitted": false + }, + { + "id": "ERICA5779-Subscriber-2", + "name": "ERICA5779-Subscriber-2", + "isPermitted": false + }, + { + "id": "e433710f-9217-458d-a79d-1c7aff376d89", + "name": "SILVIA ROBBINS", + "isPermitted": true + }, + { + "id": "ERICA5779-Subscriber-3", + "name": "ERICA5779-Subscriber-3", + "isPermitted": false + }, + { + "id": "31739f3e-526b-11e6-beb8-9e71128cae77", + "name": "CRAIG/ROBERTS", + "isPermitted": false + } + ] + } + } + } +} + +class MockFeatureFlagsService {} + +describe('VFModule Control Generator', () => { + let injector; + let service: VfModuleControlGenerator; + let httpMock: HttpTestingController; + + beforeAll(done => (async () => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + providers: [VfModuleControlGenerator, + GenericFormService, + BasicControlGenerator, + AaiService, + FormBuilder, + LogService, + {provide:FeatureFlagsService, useClass: MockFeatureFlagsService}, + {provide: NgRedux, useClass: MockAppStore}] + }); + await TestBed.compileComponents(); + + injector = getTestBed(); + service = injector.get(VfModuleControlGenerator); + httpMock = injector.get(HttpTestingController); + jest.spyOn(console, 'error'); + + })().then(done).catch(done.fail)); + + test(' getMacroFormControls gets vnfStoreKey === null', () => { + const serviceId: string = "6e59c5de-f052-46fa-aa7e-2fca9d674c44"; + const vnfStoreKey: string = null; + const vfModuleStoreKey: string = 'vf_vmee0..VfVmee..base_vmme..module-0'; + const vfModuleUUID: string = "522159d5-d6e0-4c2a-aa44-5a542a12a830"; + const controls: FormControlModel[] = service.getMacroFormControls(serviceId, vnfStoreKey, vfModuleStoreKey, vfModuleUUID, true); + + expect(controls).toEqual([]); + expect(console.error).toHaveBeenCalled(); + }); + + test('getAlaCarteFormControls check for mandatory controls', () => { + const serviceId: string = "6e59c5de-f052-46fa-aa7e-2fca9d674c44"; + const vnfStoreKey: string = 'VF_vMee 0'; + const vfModuleStoreKey: string = 'vf_vmee0..VfVmee..base_vmme..module-0'; + const uuidData: Object = { + modelId : "522159d5-d6e0-4c2a-aa44-5a542a12a830", + modelName : "vf_vmee0..VfVmee..base_vmme..module-0", + serviceId : "6e59c5de-f052-46fa-aa7e-2fca9d674c44", + type : "VFmodule", + vFModuleStoreKey : "vf_vmee0..VfVmee..base_vmme..module-0vmvzo", + vnfStoreKey : "VF_vMee 0" + }; + const controls: FormControlModel[] = service.getAlaCarteFormControls(serviceId, vnfStoreKey, vfModuleStoreKey, uuidData, true); + + const mandatoryControls : string[] = [ + FormControlNames.INSTANCE_NAME, + FormControlNames.LCPCLOUD_REGION_ID, + FormControlNames.TENANT_ID, + FormControlNames.ROLLBACK_ON_FAILURE, + ]; + + for(let i = 0 ; i < mandatoryControls.length ; i++) { + let requiredExist = controls.find(ctrl => ctrl.controlName === mandatoryControls[i]).validations.find(item => item.validatorName === 'required'); + expect(requiredExist).toBeDefined(); + } + }); + + test('getMacroFormControls check for mandatory controls', () => { + const serviceId: string = "6e59c5de-f052-46fa-aa7e-2fca9d674c44"; + const vnfStoreKey: string = 'VF_vMee 0'; + const uuidData: Object = { + modelId : "a27f5cfc-7f12-4f99-af08-0af9c3885c87", + modelName : "vf_vmee0..VfVmee..base_vmme..module-0", + serviceId : "6e59c5de-f052-46fa-aa7e-2fca9d674c44", + type : "VFmodule", + vFModuleStoreKey : "vf_vmee0..VfVmee..base_vmme..module-0vmvzo", + vnfStoreKey : "VF_vMee 0" + }; + const controls: FormControlModel[] = service.getMacroFormControls(serviceId, vnfStoreKey, vnfStoreKey, uuidData, true); + + const mandatoryControls : string[] = [ + 'instanceName' + ]; + + for(let i = 0 ; i < mandatoryControls.length ; i++) { + let requiredExist = controls.find(ctrl => ctrl.controlName === mandatoryControls[i]).validations.find(item => item.validatorName === 'required'); + expect(requiredExist).toBeDefined(); + } + }); + + test(' getMacroFormControls gets null vnfStoreKey', () => { + const serviceId: string = "6e59c5de-f052-46fa-aa7e-2fca9d674c44"; + const vnfStoreKey: string = null; + const vfModuleUUID: string = "522159d5-d6e0-4c2a-aa44-5a542a12a830"; + const uuidData: Object = {}; + const controls: FormControlModel[] = service.getMacroFormControls(serviceId, vnfStoreKey, vfModuleUUID, uuidData,true); + + expect(controls).toEqual([]); + expect(console.error).toHaveBeenCalled(); + }); + + test('getAlaCarteFormControls should return the correct order of controls', () => { + const controls:FormControlModel[] = getAlaCarteFormControls(); + + const orderedControls : string[] = [ + FormControlNames.INSTANCE_NAME, + FormControlNames.VOLUME_GROUP_NAME, + FormControlNames.LCPCLOUD_REGION_ID, + FormControlNames.LEGACY_REGION, + FormControlNames.TENANT_ID, + FormControlNames.ROLLBACK_ON_FAILURE, + FormControlNames.SDN_C_PRE_LOAD + ]; + + expect(controls.length).toEqual(7); + for(let i = 0 ; i < orderedControls.length ; i++) { + expect(controls[i].controlName).toEqual(orderedControls[i]); + } + }); + + function getAlaCarteFormControls():FormControlModel[] { + const serviceId: string = "6e59c5de-f052-46fa-aa7e-2fca9d674c44"; + const vnfStoreKey: string = 'VF_vMee 0'; + const vfModuleUUID: string = "522159d5-d6e0-4c2a-aa44-5a542a12a830"; + const uuidData: Object = { + modelId: "a27f5cfc-7f12-4f99-af08-0af9c3885c87", + modelName: "vf_vmee0..VfVmee..base_vmme..module-0", + serviceId: "6e59c5de-f052-46fa-aa7e-2fca9d674c44", + type: "VFmodule", + vFModuleStoreKey: "vf_vmee0..VfVmee..base_vmme..module-0vmvzo", + vnfStoreKey: "VF_vMee 0" + }; + const controls: FormControlModel[] = service.getAlaCarteFormControls(serviceId, vnfStoreKey, vfModuleUUID, uuidData, true); + return controls; + } + + test('getAlaCarteFormControls responce with wrong order of controls', () => { + const controls:FormControlModel[] = getAlaCarteFormControls(); + + const orderedControls : string[] = [ + FormControlNames.INSTANCE_NAME, + FormControlNames.VOLUME_GROUP_NAME, + FormControlNames.LCPCLOUD_REGION_ID, + FormControlNames.TENANT_ID, // TENANT_ID must be after LEGACY_REGION + FormControlNames.LEGACY_REGION, + FormControlNames.ROLLBACK_ON_FAILURE, + FormControlNames.SDN_C_PRE_LOAD + ]; + + for(let i = 0 ; i < orderedControls.length ; i++) { + if (controls[i].controlName === 'legacyRegion') { + expect(orderedControls[i]).toEqual('tenantId'); + } + } + }); + + test('getMacroFormControls should return the correct order of controls', () => { + const serviceId: string = "6e59c5de-f052-46fa-aa7e-2fca9d674c44"; + const vnfStoreKey: string = 'VF_vMee 0'; + const vfModuleUUID: string = "522159d5-d6e0-4c2a-aa44-5a542a12a830"; + const uuidData: Object = { + modelId : "a27f5cfc-7f12-4f99-af08-0af9c3885c87", + modelName : "vf_vmee0..VfVmee..base_vmme..module-0", + serviceId : "6e59c5de-f052-46fa-aa7e-2fca9d674c44", + type : "VFmodule", + vFModuleStoreKey : "vf_vmee0..VfVmee..base_vmme..module-0vmvzo", + vnfStoreKey : "VF_vMee 0" + }; + const controls: FormControlModel[] = service.getMacroFormControls(serviceId, vnfStoreKey, vfModuleUUID, uuidData, true); + + const orderedControls : string[] = [ + FormControlNames.INSTANCE_NAME, + FormControlNames.VOLUME_GROUP_NAME + ]; + + for(let i = 0 ; i < orderedControls.length ; i++) { + expect(controls[i].controlName).toEqual(orderedControls[i]); + } + }); + + test.each` + controllerName + ${'instanceName'} + ${'volumeGroupName'} + `('getAlacartFormControls $controllerName control validator shall have the expected regex', ({controllerName}) => { + const controls:FormControlModel[] = getAlaCarteFormControls(); + + const instanceNameControl: FormControlModel = <FormControlModel>controls.find(item => item.controlName == controllerName); + const instanceNameValidator: ValidatorModel = instanceNameControl.validations.find(val => val.validatorName === ValidatorOptions.pattern); + expect(instanceNameValidator.validatorArg).toEqual(/^[a-zA-Z0-9._-]*$/); + }); + + test(' getAlaCarteFormControls gets null service', () => { + const controls:FormControlModel[] = getAlaCarteFormControls(); + expect(controls.length).toEqual(7); + + const orderedControls : string[] = [ + FormControlNames.INSTANCE_NAME, + FormControlNames.VOLUME_GROUP_NAME, + FormControlNames.LCPCLOUD_REGION_ID, + FormControlNames.LEGACY_REGION, + FormControlNames.TENANT_ID, + FormControlNames.ROLLBACK_ON_FAILURE, + FormControlNames.SDN_C_PRE_LOAD + ]; + + for(let i = 0 ; i < orderedControls.length ; i++) { + expect(controls[i].controlName).toEqual(orderedControls[i]); + } + }); +}); + diff --git a/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/vfModuleGenerator/vfModule.control.generator.ts b/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/vfModuleGenerator/vfModule.control.generator.ts new file mode 100644 index 000000000..3012c139c --- /dev/null +++ b/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/vfModuleGenerator/vfModule.control.generator.ts @@ -0,0 +1,349 @@ +import {Injectable} from "@angular/core"; +import {GenericFormService} from "../../generic-form.service"; +import {AaiService} from "../../../../services/aaiService/aai.service"; +import {NgRedux} from "@angular-redux/store"; +import {HttpClient} from "@angular/common/http"; +import {BasicControlGenerator} from "../basic.control.generator"; +import * as _ from 'lodash'; +import {Observable, of} from "rxjs"; + +import { + CustomValidatorOptions, + FormControlModel, + ValidatorModel, + ValidatorOptions +} from "../../../../models/formControlModels/formControl.model"; +import {LogService} from "../../../../utils/log/log.service"; +import {AppState} from "../../../../store/reducers"; +import {FormGroup} from "@angular/forms"; +import {DropdownFormControl} from "../../../../models/formControlModels/dropdownFormControl.model"; +import {FormControlType} from "../../../../models/formControlModels/formControlTypes.enum"; +import {InputFormControl} from "../../../../models/formControlModels/inputFormControl.model"; +import {SelectOption} from "../../../../models/selectOption"; +import {VfModuleInstance} from "../../../../models/vfModuleInstance"; +import {VfModule} from "../../../../models/vfModule"; +import {VNFModel} from "../../../../models/vnfModel"; +import {VnfInstance} from "../../../../models/vnfInstance"; +import {FileFormControl} from "../../../../models/formControlModels/fileFormControl.model"; +import {CheckboxFormControl} from "../../../../models/formControlModels/checkboxFormControl.model"; +import {FileUnit} from "../../../formControls/component/file/fileUnit.enum"; +import {Constants} from "../../../../utils/constants"; + + +export enum FormControlNames { + INSTANCE_NAME = 'instanceName', + VOLUME_GROUP_NAME = 'volumeGroupName', + LCPCLOUD_REGION_ID = 'lcpCloudRegionId', + LEGACY_REGION = 'legacyRegion', + TENANT_ID = 'tenantId', + ROLLBACK_ON_FAILURE = 'rollbackOnFailure', + SDN_C_PRE_LOAD = 'sdncPreLoad', + SUPPLEMENTARY_FILE = 'supplementaryFile' +} + + +@Injectable() +export class VfModuleControlGenerator { + aaiService: AaiService; + vfModuleModel: VfModule; + vfModuleName : string; + isUpdateMode : boolean; + + constructor(private genericFormService: GenericFormService, + private _basicControlGenerator: BasicControlGenerator, + private store: NgRedux<AppState>, + private http: HttpClient, + private _aaiService: AaiService, + private _logService: LogService) { + this.aaiService = _aaiService; + } + + setVFModuleStoreKey = (serviceId: string, vfModuleUuid: string) => { + const vfModules = this.store.getState().service.serviceHierarchy[serviceId].vfModules; + const vfModulesKeys = Object.keys(vfModules); + for(let key of vfModulesKeys){ + if(vfModules[key].uuid === vfModuleUuid){ + this.vfModuleName = key; + return; + } + } + }; + + + getVfModuleInstance = (serviceId: string, vnfStoreKey: string, UUIDData: Object, isUpdateMode: boolean): VfModuleInstance => { + let vfModuleInstance: VfModuleInstance = null; + if (isUpdateMode && this.store.getState().service.serviceInstance[serviceId] && + _.has(this.store.getState().service.serviceInstance[serviceId].vnfs, vnfStoreKey) && + _.has(this.store.getState().service.serviceInstance[serviceId].vnfs[vnfStoreKey].vfModules, UUIDData['modelName'])) { + vfModuleInstance = Object.assign({},this.store.getState().service.serviceInstance[serviceId].vnfs[vnfStoreKey].vfModules[UUIDData['modelName']][UUIDData['vFModuleStoreKey']]); + } + return vfModuleInstance; + }; + + extractVfAccordingToVfModuleUuid(serviceId: string, UUIDData: Object): VfModule { + const vfModule = this.store.getState().service.serviceHierarchy[serviceId].vfModules[UUIDData['modelName']]; + this.vfModuleModel = vfModule; + return vfModule; + } + + getMacroFormControls(serviceId: string, vnfStoreKey: string, vfModuleStoreKey: string, uuidData : Object, isUpdateMode: boolean): FormControlModel[] { + this.isUpdateMode = isUpdateMode; + this.extractVfAccordingToVfModuleUuid(serviceId, uuidData); + if (_.isNil(serviceId) || _.isNil(vnfStoreKey) || _.isNil(vfModuleStoreKey)) { + if(isUpdateMode){ + this._logService.error('should provide serviceId, vfModuleStoreKey, vnfStoreKey', serviceId); + return []; + } + } + + const vfModuleInstance = this.getVfModuleInstance(serviceId, vnfStoreKey, uuidData, isUpdateMode); + const vfModuleModel = this.vfModuleModel; + const vnf: VnfInstance = this.store.getState().service.serviceInstance[serviceId].vnfs[vnfStoreKey]; + const vnfModelName: string = vnf.originalName; + const vnfModel = new VNFModel(this.store.getState().service.serviceHierarchy[serviceId].vnfs[vnfModelName]); + + let result: FormControlModel[] = []; + + if (!_.isNil(vfModuleModel)) { + result.push(this.getInstanceName(vfModuleInstance, serviceId, vnfModel.isEcompGeneratedNaming)); + if (this.vfModuleModel.volumeGroupAllowed) { + result.push(this.getVolumeGroupName(vfModuleInstance, serviceId, vnfStoreKey, vfModuleInstance && vfModuleInstance.volumeGroupName, vnfModel.isEcompGeneratedNaming)); + } + } + if(this.store.getState().global.flags['FLAG_SUPPLEMENTARY_FILE']) { + let suppFileInput:FileFormControl = <FileFormControl>(this.getSupplementaryFile(vfModuleInstance)); + result.push(suppFileInput); + result = result.concat(suppFileInput.hiddenFile); + } + return result; + } + + getAlaCarteFormControls(serviceId: string, vnfStoreKey: string, vfModuleStoreKey: string, uuidData : Object, isUpdateMode: boolean): FormControlModel[] { + this.isUpdateMode = isUpdateMode; + this.extractVfAccordingToVfModuleUuid(serviceId, uuidData); + if (_.isNil(serviceId) || _.isNil(vnfStoreKey) || _.isNil(vfModuleStoreKey)) { + if(isUpdateMode){ + this._logService.error('should provide serviceId, vfModuleStoreKey, vnfStoreKey', serviceId); + return []; + } + } + const vnf: VnfInstance = this.store.getState().service.serviceInstance[serviceId].vnfs[vnfStoreKey]; + const vnfModelName: string = vnf.originalName; + const vnfModel = new VNFModel(this.store.getState().service.serviceHierarchy[serviceId].vnfs[vnfModelName]); + + const vfModuleInstance = this.getVfModuleInstance(serviceId, vnfStoreKey, uuidData, isUpdateMode); + let result: FormControlModel[] = []; + result.push(this.getInstanceName(vfModuleInstance, serviceId, vnfModel.isEcompGeneratedNaming)); + + if (this.vfModuleModel.volumeGroupAllowed) { + result.push(this.getVolumeGroupName(vfModuleInstance, serviceId, vnfStoreKey, this.vfModuleName, vnfModel.isEcompGeneratedNaming)); + } + result.push(this.getLcpRegionControl(serviceId, vfModuleInstance, result)); + result.push(this._basicControlGenerator.getLegacyRegion(vfModuleInstance)); + result.push(this.getTenantControl(serviceId, vfModuleInstance, result)); + result.push(this.getRollbackOnFailureControl(vfModuleInstance, result)); + result.push(this.getSDNCControl(vfModuleInstance, result)); + if(this.store.getState().global.flags['FLAG_SUPPLEMENTARY_FILE']) { + let suppFileInput:FileFormControl = <FileFormControl>(this.getSupplementaryFile(vfModuleInstance)); + result.push(suppFileInput); + result = result.concat(suppFileInput.hiddenFile); + } + return result; + + } + + getInstanceName(instance: any, serviceId: string, isEcompGeneratedNaming: boolean): FormControlModel { + let formControlModel:FormControlModel = this._basicControlGenerator.getInstanceNameController(instance, serviceId, isEcompGeneratedNaming, this.vfModuleModel); + formControlModel.onBlur = (event, form : FormGroup) => { + if(!_.isNil(form.controls['volumeGroupName'])&& event.target.value.length > 0){ + form.controls['volumeGroupName'].setValue(event.target.value + "_vol"); + } + }; + + return formControlModel; + } + + getDefaultVolumeGroupName(instance: any, vfModuleName: string, isEcompGeneratedNaming: boolean): string { + if ((!_.isNil(instance) && instance.volumeGroupName)) { + return instance.volumeGroupName; + } + if (isEcompGeneratedNaming) { + return null; + } + return this._basicControlGenerator.getDefaultInstanceName(instance, this.vfModuleModel) + "_vol"; + } + + getVolumeGroupName(instance: any, serviceId: string, vnfStoreKey: string, vfModuleName: string, isEcompGeneratedNaming: boolean): FormControlModel { + let validations: ValidatorModel[] = [ + new ValidatorModel(ValidatorOptions.pattern, 'Instance name may include only alphanumeric characters and underscore.', BasicControlGenerator.INSTANCE_NAME_REG_EX), + new ValidatorModel(CustomValidatorOptions.uniqueInstanceNameValidator, 'Volume Group instance name is already in use, please pick another name', [this.store, serviceId, instance && instance.volumeGroupName]) + ]; + // comment out because if not provided vid won't create VG + // if (!isEcompGeneratedNaming) { + // validations.push(new ValidatorModel(ValidatorOptions.required, 'is required')); + // } + return new InputFormControl({ + controlName: 'volumeGroupName', + displayName: 'Volume Group Name', + dataTestId: 'volumeGroupName', + // placeHolder: (!isEcompGeneratedNaming) ? 'Volume Group Name' : 'Automatically generated when not provided', + validations: validations, + tooltip : 'When filled, VID will create a Volume Group by this name and associate with this module.\n' + + 'When empty, the module is created without a Volume Group.', + isVisible: true, + value: this.getDefaultVolumeGroupName(instance, vfModuleName, isEcompGeneratedNaming), + onKeypress: (event) => { + const pattern:RegExp = BasicControlGenerator.INSTANCE_NAME_REG_EX; + if (pattern) { + if (!pattern.test(event['key'])) { + event.preventDefault(); + } + } + return event; + } + }); + } + + getSupplementaryFile(instance: any): FormControlModel { + return new FileFormControl({ + controlName: FormControlNames.SUPPLEMENTARY_FILE, + displayName: 'Supplementary Data File (JSON format)', + dataTestId: 'SupplementaryFile', + placeHolder: 'Choose file', + selectedFile: !_.isNil(instance) ? instance.supplementaryFileName: null, + isVisible: true, + acceptedExtentions: "application/json", + hiddenFile : [new InputFormControl({ + controlName: FormControlNames.SUPPLEMENTARY_FILE + "_hidden", + isVisible: false, + validations: [new ValidatorModel(CustomValidatorOptions.isFileTooBig, "File size exceeds 5MB.", [FileUnit.MB, 5])] + }), + new InputFormControl({ + controlName: FormControlNames.SUPPLEMENTARY_FILE + "_hidden_content", + isVisible: false, + validations: [new ValidatorModel(CustomValidatorOptions.isValidJson, + "File is invalid, please make sure a legal JSON file is uploaded using name:value pairs.",[]), + new ValidatorModel(CustomValidatorOptions.isStringContainTags, + "File is invalid, please remove tags <>.",[])], + value: !_.isNil(instance) ? (instance.supplementaryFile_hidden_content): null, + }) + ], + onDelete : (form : FormGroup) => { + form.controls[FormControlNames.SUPPLEMENTARY_FILE + "_hidden"].setValue(null); + form.controls[FormControlNames.SUPPLEMENTARY_FILE + "_hidden_content"].setValue(null); + }, + onChange : (files: FileList, form : FormGroup) => { + if (files.length > 0) { + const file = files.item(0); + let reader = new FileReader(); + reader.onload = function(event) { + form.controls[FormControlNames.SUPPLEMENTARY_FILE + "_hidden_content"].setValue(reader.result); + form.controls[FormControlNames.SUPPLEMENTARY_FILE + "_hidden"].setValue(file); + }; + reader.readAsText(file); + } + else { + form.controls[FormControlNames.SUPPLEMENTARY_FILE + "_hidden"].setValue(null); + form.controls[FormControlNames.SUPPLEMENTARY_FILE + "_hidden_content"].setValue(null); + } + } + }) + }; + + getTenantControl = (serviceId: string, instance: any, controls: FormControlModel[]): DropdownFormControl => { + const service = this.store.getState().service.serviceInstance[serviceId]; + const globalCustomerId: string = service.globalSubscriberId; + const serviceType: string = service.subscriptionServiceType; + return new DropdownFormControl({ + type: FormControlType.DROPDOWN, + controlName: FormControlNames.TENANT_ID, + displayName: 'Tenant', + dataTestId: 'tenant', + placeHolder: 'Select Tenant', + name: "tenant", + isDisabled: _.isNil(instance) || _.isNil(instance.lcpCloudRegionId), + onInitSelectedField: instance ? ['lcpRegionsTenantsMap', instance.lcpCloudRegionId] : null, + value: instance ? instance.tenantId : null, + validations: [new ValidatorModel(ValidatorOptions.required, 'is required')], + onInit: instance ? this._basicControlGenerator.getSubscribeInitResult.bind( + this._aaiService, + this.aaiService.getLcpRegionsAndTenants.bind(this, globalCustomerId, serviceType)) : () => { + }, + }) + }; + + getLcpRegionControl = (serviceId: string, instance: any, controls: FormControlModel[]): DropdownFormControl => { + const service = this.store.getState().service.serviceInstance[serviceId]; + const globalCustomerId: string = service.globalSubscriberId; + const serviceType: string = service.subscriptionServiceType; + return new DropdownFormControl({ + type: FormControlType.DROPDOWN, + controlName: 'lcpCloudRegionId', + displayName: 'LCP region', + dataTestId: 'lcpRegion', + placeHolder: 'Select LCP Region', + name: "lcpRegion", + isDisabled: false, + value: instance ? instance.lcpCloudRegionId : null, + validations: [new ValidatorModel(ValidatorOptions.required, 'is required')], + onInitSelectedField: ['lcpRegionList'], + onInit: this._basicControlGenerator.getSubscribeInitResult.bind( + this._aaiService, + this._aaiService.getLcpRegionsAndTenants.bind(this, globalCustomerId, serviceType)), + onChange: (param: string, form: FormGroup) => { + form.controls[FormControlNames.TENANT_ID].enable(); + form.controls[FormControlNames.TENANT_ID].reset(); + if (!_.isNil(globalCustomerId) && !_.isNil(serviceType)) { + this._basicControlGenerator.getSubscribeResult.bind(this, this._aaiService.getLcpRegionsAndTenants(globalCustomerId, serviceType).subscribe(res => { + controls.find(item => item.controlName === FormControlNames.TENANT_ID)['options$'] = res.lcpRegionsTenantsMap[param]; + if (res.lcpRegionsTenantsMap[param]) { + controls.find(item => item.controlName === FormControlNames.TENANT_ID)['hasEmptyOptions'] = res.lcpRegionsTenantsMap[param].length === 0; + } + })); + } + + if (Constants.LegacyRegion.MEGA_REGION.indexOf(param) !== -1) { + form.controls['legacyRegion'].enable(); + controls.find(item => item.controlName === 'legacyRegion').isVisible = true; + + } else { + controls.find(item => item.controlName === 'legacyRegion').isVisible = false; + form.controls['legacyRegion'].setValue(null); + form.controls['legacyRegion'].reset(); + form.controls['legacyRegion'].disable(); + } + } + }) + }; + + getSDNCControl = (instance: any, controls: FormControlModel[]): CheckboxFormControl => { + return new CheckboxFormControl({ + type: FormControlType.CHECKBOX, + controlName: 'sdncPreLoad', + displayName: 'SDN-C pre-load', + dataTestId: 'sdncPreLoad', + value: instance ? instance.sdncPreLoad : false, + validations: [new ValidatorModel(ValidatorOptions.required, 'is required')] + }) + }; + + getRollbackOnFailureControl = (instance: any, controls: FormControlModel[]): DropdownFormControl => { + return new DropdownFormControl({ + type: FormControlType.DROPDOWN, + controlName: FormControlNames.ROLLBACK_ON_FAILURE, + displayName: 'Rollback on failure', + dataTestId: 'rollback', + isDisabled: false, + validations: [new ValidatorModel(ValidatorOptions.required, 'is required')], + value: instance ? instance.rollbackOnFailure : 'true', + onInit: this._basicControlGenerator.getSubscribeInitResult.bind(null, this.getRollBackOnFailureOptions) + }) + }; + + getRollBackOnFailureOptions = (): Observable<SelectOption[]> => { + return of([ + new SelectOption({id: 'true', name: 'Rollback'}), + new SelectOption({id: 'false', name: 'Don\'t Rollback'}) + ]); + }; +} diff --git a/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/vnfGenerator/vnf.control.generator.spec.ts b/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/vnfGenerator/vnf.control.generator.spec.ts new file mode 100644 index 000000000..d15a57bcf --- /dev/null +++ b/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/vnfGenerator/vnf.control.generator.spec.ts @@ -0,0 +1,1943 @@ +import {getTestBed, TestBed} from '@angular/core/testing'; +import {HttpClientTestingModule, HttpTestingController} from '@angular/common/http/testing'; +import {NgRedux} from '@angular-redux/store'; +import {FormControlNames} from "../service.control.generator"; +import {BasicControlGenerator} from "../basic.control.generator"; +import {AaiService} from "../../../../services/aaiService/aai.service"; +import {GenericFormService} from "../../generic-form.service"; +import {FormBuilder} from "@angular/forms"; +import { + FormControlModel, + ValidatorModel, + ValidatorOptions +} from "../../../../models/formControlModels/formControl.model"; +import {LogService} from "../../../../utils/log/log.service"; +import {VnfControlGenerator} from "./vnf.control.generator"; +import {Observable} from "rxjs"; +import {SelectOption} from "../../../../models/selectOption"; +import {FeatureFlagsService} from "../../../../services/featureFlag/feature-flags.service"; + +class MockAppStore<T> { + getState(){ + return { + "global": { + "name": null, + "flags": { + "FLAG_NETWORK_TO_ASYNC_INSTANTIATION": false, + "FLAG_SHOW_ASSIGNMENTS": true, + "FLAG_FABRIC_CONFIGURATION_ASSIGNMENTS": true, + "FLAG_UNASSIGN_SERVICE": true, + "FLAG_SHOW_VERIFY_SERVICE": false, + "FLAG_COLLECTION_RESOURCE_SUPPORT": true, + "FLAG_DUPLICATE_VNF": true, + "FLAG_SERVICE_MODEL_CACHE": true, + "CREATE_INSTANCE_TEST": false, + "FLAG_SETTING_DEFAULTS_IN_DRAWING_BOARD": false, + "FLAG_ASYNC_INSTANTIATION": true, + "FLAG_ASYNC_JOBS": true, + "EMPTY_DRAWING_BOARD_TEST": false, + "FLAG_ADD_MSO_TESTAPI_FIELD": true + }, + "type": "[FLAGS] Update" + }, + "service": { + "serviceHierarchy": { + "6e59c5de-f052-46fa-aa7e-2fca9d674c44": { + "service": { + "uuid": "6e59c5de-f052-46fa-aa7e-2fca9d674c44", + "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0", + "name": "ComplexService", + "version": "1.0", + "toscaModelURL": null, + "category": "Emanuel", + "serviceType": "", + "serviceRole": "", + "description": "ComplexService", + "serviceEcompNaming": "false", + "instantiationType": "Macro", + "inputs": {} + }, + "vnfs": { + "VF_vMee 0": { + "uuid": "d6557200-ecf2-4641-8094-5393ae3aae60", + "invariantUuid": "4160458e-f648-4b30-a176-43881ffffe9e", + "description": "VSP_vMee", + "name": "VF_vMee", + "version": "2.0", + "customizationUuid": "91415b44-753d-494c-926a-456a9172bbb9", + "inputs": {}, + "commands": {}, + "properties": { + "max_instances": 10, + "min_instances": 1, + "gpb2_Internal2_mac": "00:11:22:EF:AC:DF", + "sctp-b-ipv6-egress_src_start_port": "0", + "sctp-a-ipv6-egress_rule_application": "any", + "Internal2_allow_transit": "true", + "sctp-b-IPv6_ethertype": "IPv6", + "sctp-a-egress_rule_application": "any", + "sctp-b-ingress_action": "pass", + "sctp-b-ingress_rule_protocol": "icmp", + "ncb2_Internal1_mac": "00:11:22:EF:AC:DF", + "sctp-b-ipv6-ingress-src_start_port": "0.0", + "ncb1_Internal2_mac": "00:11:22:EF:AC:DF", + "fsb_volume_size_0": "320.0", + "sctp-b-egress_src_addresses": "local", + "sctp-a-ipv6-ingress_ethertype": "IPv4", + "sctp-a-ipv6-ingress-dst_start_port": "0", + "sctp-b-ipv6-ingress_rule_application": "any", + "domain_name": "default-domain", + "sctp-a-ingress_rule_protocol": "icmp", + "sctp-b-egress-src_start_port": "0.0", + "sctp-a-egress_src_addresses": "local", + "sctp-b-display_name": "epc-sctp-b-ipv4v6-sec-group", + "sctp-a-egress-src_start_port": "0.0", + "sctp-a-ingress_ethertype": "IPv4", + "sctp-b-ipv6-ingress-dst_end_port": "65535", + "sctp-b-dst_subnet_prefix_v6": "::", + "nf_naming": "{ecomp_generated_naming=true}", + "sctp-a-ipv6-ingress_src_subnet_prefix": "0.0.0.0", + "sctp-b-egress-dst_start_port": "0.0", + "ncb_flavor_name": "nv.c20r64d1", + "gpb1_Internal1_mac": "00:11:22:EF:AC:DF", + "sctp-b-egress_dst_subnet_prefix_len": "0.0", + "Internal2_net_cidr": "10.0.0.10", + "sctp-a-ingress-dst_start_port": "0.0", + "sctp-a-egress-dst_start_port": "0.0", + "fsb1_Internal2_mac": "00:11:22:EF:AC:DF", + "sctp-a-egress_ethertype": "IPv4", + "vlc_st_service_mode": "in-network-nat", + "sctp-a-ipv6-egress_ethertype": "IPv4", + "sctp-a-egress-src_end_port": "65535.0", + "sctp-b-ipv6-egress_rule_application": "any", + "sctp-b-egress_action": "pass", + "sctp-a-ingress-src_subnet_prefix_len": "0.0", + "sctp-b-ipv6-ingress-src_end_port": "65535.0", + "sctp-b-name": "epc-sctp-b-ipv4v6-sec-group", + "fsb2_Internal1_mac": "00:11:22:EF:AC:DF", + "sctp-a-ipv6-ingress-src_start_port": "0.0", + "sctp-b-ipv6-egress_ethertype": "IPv4", + "Internal1_net_cidr": "10.0.0.10", + "sctp-a-egress_dst_subnet_prefix": "0.0.0.0", + "fsb_flavor_name": "nv.c20r64d1", + "sctp_rule_protocol": "132", + "sctp-b-ipv6-ingress_src_subnet_prefix_len": "0", + "sctp-a-ipv6-ingress_rule_application": "any", + "ecomp_generated_naming": "false", + "sctp-a-IPv6_ethertype": "IPv6", + "vlc2_Internal1_mac": "00:11:22:EF:AC:DF", + "vlc_st_virtualization_type": "virtual-machine", + "sctp-b-ingress-dst_start_port": "0.0", + "sctp-b-ingress-dst_end_port": "65535.0", + "sctp-a-ipv6-ingress-src_end_port": "65535.0", + "sctp-a-display_name": "epc-sctp-a-ipv4v6-sec-group", + "sctp-b-ingress_rule_application": "any", + "int2_sec_group_name": "int2-sec-group", + "vlc_flavor_name": "nd.c16r64d1", + "sctp-b-ipv6-egress_src_addresses": "local", + "vlc_st_interface_type_int1": "other1", + "sctp-b-egress-src_end_port": "65535.0", + "sctp-a-ipv6-egress-dst_start_port": "0", + "vlc_st_interface_type_int2": "other2", + "sctp-a-ipv6-egress_rule_protocol": "any", + "Internal2_shared": "false", + "sctp-a-ipv6-egress_dst_subnet_prefix_len": "0", + "Internal2_rpf": "disable", + "vlc1_Internal1_mac": "00:11:22:EF:AC:DF", + "sctp-b-ipv6-egress_src_end_port": "65535", + "sctp-a-ipv6-egress_src_addresses": "local", + "sctp-a-ingress-dst_end_port": "65535.0", + "sctp-a-ipv6-egress_src_end_port": "65535", + "Internal1_forwarding_mode": "l2", + "Internal2_dhcp": "false", + "sctp-a-dst_subnet_prefix_v6": "::", + "pxe_image_name": "MME_PXE-Boot_16ACP04_GA.qcow2", + "vlc_st_interface_type_gtp": "other0", + "ncb1_Internal1_mac": "00:11:22:EF:AC:DF", + "sctp-b-src_subnet_prefix_v6": "::", + "sctp-a-egress_dst_subnet_prefix_len": "0.0", + "int1_sec_group_name": "int1-sec-group", + "Internal1_dhcp": "false", + "sctp-a-ipv6-egress_dst_end_port": "65535", + "Internal2_forwarding_mode": "l2", + "fsb2_Internal2_mac": "00:11:22:EF:AC:DF", + "sctp-b-egress_dst_subnet_prefix": "0.0.0.0", + "Internal1_net_cidr_len": "17", + "gpb2_Internal1_mac": "00:11:22:EF:AC:DF", + "sctp-b-ingress-src_subnet_prefix_len": "0.0", + "sctp-a-ingress_dst_addresses": "local", + "sctp-a-egress_action": "pass", + "fsb_volume_type_0": "SF-Default-SSD", + "ncb2_Internal2_mac": "00:11:22:EF:AC:DF", + "vlc_st_interface_type_sctp_a": "left", + "vlc_st_interface_type_sctp_b": "right", + "sctp-a-src_subnet_prefix_v6": "::", + "vlc_st_version": "2", + "sctp-b-egress_ethertype": "IPv4", + "sctp-a-ingress_rule_application": "any", + "gpb1_Internal2_mac": "00:11:22:EF:AC:DF", + "instance_ip_family_v6": "v6", + "sctp-a-ipv6-egress_src_start_port": "0", + "sctp-b-ingress-src_start_port": "0.0", + "sctp-b-ingress_dst_addresses": "local", + "fsb1_Internal1_mac": "00:11:22:EF:AC:DF", + "vlc_st_interface_type_oam": "management", + "multi_stage_design": "true", + "oam_sec_group_name": "oam-sec-group", + "Internal2_net_gateway": "10.0.0.10", + "sctp-a-ipv6-ingress-dst_end_port": "65535", + "sctp-b-ipv6-egress-dst_start_port": "0", + "Internal1_net_gateway": "10.0.0.10", + "sctp-b-ipv6-egress_rule_protocol": "any", + "gtp_sec_group_name": "gtp-sec-group", + "sctp-a-ipv6-egress_dst_subnet_prefix": "0.0.0.0", + "sctp-b-ipv6-egress_dst_subnet_prefix_len": "0", + "sctp-a-ipv6-ingress_dst_addresses": "local", + "sctp-a-egress_rule_protocol": "icmp", + "sctp-b-ipv6-egress_action": "pass", + "sctp-a-ipv6-egress_action": "pass", + "Internal1_shared": "false", + "sctp-b-ipv6-ingress_rule_protocol": "any", + "Internal2_net_cidr_len": "17", + "sctp-a-name": "epc-sctp-a-ipv4v6-sec-group", + "sctp-a-ingress-src_end_port": "65535.0", + "sctp-b-ipv6-ingress_src_subnet_prefix": "0.0.0.0", + "sctp-a-egress-dst_end_port": "65535.0", + "sctp-a-ingress_action": "pass", + "sctp-b-egress_rule_protocol": "icmp", + "sctp-b-ipv6-ingress_action": "pass", + "vlc_st_service_type": "firewall", + "sctp-b-ipv6-egress_dst_end_port": "65535", + "sctp-b-ipv6-ingress-dst_start_port": "0", + "vlc2_Internal2_mac": "00:11:22:EF:AC:DF", + "vlc_st_availability_zone": "true", + "fsb_volume_image_name_1": "MME_FSB2_16ACP04_GA.qcow2", + "sctp-b-ingress-src_subnet_prefix": "0.0.0.0", + "sctp-a-ipv6-ingress_src_subnet_prefix_len": "0", + "Internal1_allow_transit": "true", + "gpb_flavor_name": "nv.c20r64d1", + "availability_zone_max_count": "1", + "fsb_volume_image_name_0": "MME_FSB1_16ACP04_GA.qcow2", + "sctp-b-ipv6-ingress_dst_addresses": "local", + "sctp-b-ipv6-egress_dst_subnet_prefix": "0.0.0.0", + "sctp-b-ipv6-ingress_ethertype": "IPv4", + "vlc1_Internal2_mac": "00:11:22:EF:AC:DF", + "sctp-a-ingress-src_subnet_prefix": "0.0.0.0", + "sctp-a-ipv6-ingress_action": "pass", + "Internal1_rpf": "disable", + "sctp-b-ingress_ethertype": "IPv4", + "sctp-b-egress_rule_application": "any", + "sctp-b-ingress-src_end_port": "65535.0", + "sctp-a-ipv6-ingress_rule_protocol": "any", + "sctp-a-ingress-src_start_port": "0.0", + "sctp-b-egress-dst_end_port": "65535.0" + }, + "type": "VF", + "modelCustomizationName": "VF_vMee 0", + "vfModules": { + "vf_vmee0..VfVmee..vmme_vlc..module-1": { + "uuid": "522159d5-d6e0-4c2a-aa44-5a542a12a830", + "invariantUuid": "98a7c88b-b577-476a-90e4-e25a5871e02b", + "customizationUuid": "55b1be94-671a-403e-a26c-667e9c47d091", + "description": null, + "name": "VfVmee..vmme_vlc..module-1", + "version": "2", + "modelCustomizationName": "VfVmee..vmme_vlc..module-1", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "vmme_vlc" + }, + "inputs": {}, + "volumeGroupAllowed": true + }, + "vf_vmee0..VfVmee..vmme_gpb..module-2": { + "uuid": "41708296-e443-4c71-953f-d9a010f059e1", + "invariantUuid": "1cca90b8-3490-495e-87da-3f3e4c57d5b9", + "customizationUuid": "6add59e0-7fe1-4bc4-af48-f8812422ae7c", + "description": null, + "name": "VfVmee..vmme_gpb..module-2", + "version": "2", + "modelCustomizationName": "VfVmee..vmme_gpb..module-2", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "vmme_gpb" + }, + "inputs": {}, + "volumeGroupAllowed": false + }, + "vf_vmee0..VfVmee..base_vmme..module-0": { + "uuid": "a27f5cfc-7f12-4f99-af08-0af9c3885c87", + "invariantUuid": "a6f9e51a-2b35-416a-ae15-15e58d61f36d", + "customizationUuid": "f8c040f1-7e51-4a11-aca8-acf256cfd861", + "description": null, + "name": "VfVmee..base_vmme..module-0", + "version": "2", + "modelCustomizationName": "VfVmee..base_vmme..module-0", + "properties": { + "minCountInstances": 1, + "maxCountInstances": 1, + "initialCount": 1, + "vfModuleLabel": "base_vmme" + }, + "inputs": {}, + "volumeGroupAllowed": true + } + }, + "volumeGroups": { + "vf_vmee0..VfVmee..base_vmme..module-0": { + "uuid": "a27f5cfc-7f12-4f99-af08-0af9c3885c87", + "invariantUuid": "a6f9e51a-2b35-416a-ae15-15e58d61f36d", + "customizationUuid": "f8c040f1-7e51-4a11-aca8-acf256cfd861", + "description": null, + "name": "VfVmee..base_vmme..module-0", + "version": "2", + "modelCustomizationName": "VfVmee..base_vmme..module-0", + "properties": { + "minCountInstances": 1, + "maxCountInstances": 1, + "initialCount": 1, + "vfModuleLabel": "base_vmme" + }, + "inputs": {} + } + }, + "vfcInstanceGroups": {} + } + }, + "networks": { + "ExtVL 0": { + "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986", + "invariantUuid": "379f816b-a7aa-422f-be30-17114ff50b7c", + "description": "ECOMP generic virtual link (network) base type for all other service-level and global networks", + "name": "ExtVL", + "version": "37.0", + "customizationUuid": "94fdd893-4a36-4d70-b16a-ec29c54c184f", + "inputs": {}, + "commands": {}, + "properties": { + "network_assignments": "{is_external_network=false, ipv4_subnet_default_assignment={min_subnets_count=1}, ecomp_generated_network_assignment=false, ipv6_subnet_default_assignment={min_subnets_count=1}}", + "exVL_naming": "{ecomp_generated_naming=true}", + "network_flows": "{is_network_policy=false, is_bound_to_vpn=false}", + "network_homing": "{ecomp_selected_instance_node_target=false}" + }, + "type": "VL", + "modelCustomizationName": "ExtVL 0" + } + }, + "collectionResource": {}, + "configurations": { + "Port Mirroring Configuration By Policy 0": { + "uuid": "b4398538-e89d-4f13-b33d-ca323434ba50", + "invariantUuid": "6ef0ca40-f366-4897-951f-abd65d25f6f7", + "description": "A port mirroring configuration by policy object", + "name": "Port Mirroring Configuration By Policy", + "version": "27.0", + "customizationUuid": "3c3b7b8d-8669-4b3b-8664-61970041fad2", + "inputs": {}, + "commands": {}, + "properties": {}, + "type": "Configuration", + "modelCustomizationName": "Port Mirroring Configuration By Policy 0", + "sourceNodes": [], + "collectorNodes": null, + "configurationByPolicy": false + } + }, + "serviceProxies": {}, + "vfModules": { + "vf_vmee0..VfVmee..vmme_vlc..module-1": { + "uuid": "522159d5-d6e0-4c2a-aa44-5a542a12a830", + "invariantUuid": "98a7c88b-b577-476a-90e4-e25a5871e02b", + "customizationUuid": "55b1be94-671a-403e-a26c-667e9c47d091", + "description": null, + "name": "VfVmee..vmme_vlc..module-1", + "version": "2", + "modelCustomizationName": "VfVmee..vmme_vlc..module-1", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "vmme_vlc" + }, + "inputs": {}, + "volumeGroupAllowed": true + }, + "vf_vmee0..VfVmee..vmme_gpb..module-2": { + "uuid": "41708296-e443-4c71-953f-d9a010f059e1", + "invariantUuid": "1cca90b8-3490-495e-87da-3f3e4c57d5b9", + "customizationUuid": "6add59e0-7fe1-4bc4-af48-f8812422ae7c", + "description": null, + "name": "VfVmee..vmme_gpb..module-2", + "version": "2", + "modelCustomizationName": "VfVmee..vmme_gpb..module-2", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "vmme_gpb" + }, + "inputs": {}, + "volumeGroupAllowed": false + }, + "vf_vmee0..VfVmee..base_vmme..module-0": { + "uuid": "a27f5cfc-7f12-4f99-af08-0af9c3885c87", + "invariantUuid": "a6f9e51a-2b35-416a-ae15-15e58d61f36d", + "customizationUuid": "f8c040f1-7e51-4a11-aca8-acf256cfd861", + "description": null, + "name": "VfVmee..base_vmme..module-0", + "version": "2", + "modelCustomizationName": "VfVmee..base_vmme..module-0", + "properties": { + "minCountInstances": 1, + "maxCountInstances": 1, + "initialCount": 1, + "vfModuleLabel": "base_vmme" + }, + "inputs": {}, + "volumeGroupAllowed": true + } + }, + "volumeGroups": { + "vf_vmee0..VfVmee..base_vmme..module-0": { + "uuid": "a27f5cfc-7f12-4f99-af08-0af9c3885c87", + "invariantUuid": "a6f9e51a-2b35-416a-ae15-15e58d61f36d", + "customizationUuid": "f8c040f1-7e51-4a11-aca8-acf256cfd861", + "description": null, + "name": "VfVmee..base_vmme..module-0", + "version": "2", + "modelCustomizationName": "VfVmee..base_vmme..module-0", + "properties": { + "minCountInstances": 1, + "maxCountInstances": 1, + "initialCount": 1, + "vfModuleLabel": "base_vmme" + }, + "inputs": {} + } + }, + "pnfs": {} + } + }, + "serviceInstance": { + "6e59c5de-f052-46fa-aa7e-2fca9d674c44": { + "vnfs": { + "VF_vMee 0": { + "rollbackOnFailure": "true", + "vfModules": { + "vf_vmee0..VfVmee..base_vmme..module-0": { + "vf_vmee0..VfVmee..base_vmme..module-0vmvzo": { + "isMissingData": false, + "sdncPreReload": null, + "modelInfo": { + "modelType": "VFmodule", + "modelInvariantId": "a6f9e51a-2b35-416a-ae15-15e58d61f36d", + "modelVersionId": "a27f5cfc-7f12-4f99-af08-0af9c3885c87", + "modelName": "VfVmee..base_vmme..module-0", + "modelVersion": "2", + "modelCustomizationId": "f8c040f1-7e51-4a11-aca8-acf256cfd861", + "modelCustomizationName": "VfVmee..base_vmme..module-0" + }, + "instanceParams": [ + {} + ], + "trackById": "wmtm6sy2uj" + } + } + }, + "isMissingData": true, + "originalName": "VF_vMee 0", + "vnfStoreKey": "VF_vMee 0", + "trackById": "p3wk448m5do", + "uuid": "d6557200-ecf2-4641-8094-5393ae3aae60", + "productFamilyId": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e", + "lcpCloudRegionId": null, + "tenantId": null, + "lineOfBusiness": null, + "platformName": null, + "modelInfo": { + "modelType": "VF", + "modelInvariantId": "4160458e-f648-4b30-a176-43881ffffe9e", + "modelVersionId": "6e59c5de-f052-46fa-aa7e-2fca9d674c44", + "modelName": "VF_vMee", + "modelVersion": "2.0", + "modelCustomizationName": "VF_vMee 0" + } + } + }, + "instanceParams": [ + {} + ], + "validationCounter": 1, + "existingNames": {}, + "existingVNFCounterMap": { + "d6557200-ecf2-4641-8094-5393ae3aae60": 1 + }, + "globalSubscriberId": "e433710f-9217-458d-a79d-1c7aff376d89", + "subscriptionServiceType": "TYLER SILVIA", + "owningEntityId": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc", + "productFamilyId": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e", + "lcpCloudRegionId": "hvf6", + "tenantId": "229bcdc6eaeb4ca59d55221141d01f8e", + "aicZoneId": "JAG1", + "projectName": "x1", + "rollbackOnFailure": "true", + "bulkSize": 1, + "modelInfo": { + "modelInvariantId": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0", + "modelVersionId": "6e59c5de-f052-46fa-aa7e-2fca9d674c44", + "modelName": "ComplexService", + "modelVersion": "1.0", + "uuid": "6e59c5de-f052-46fa-aa7e-2fca9d674c44" + }, + "isALaCarte": false, + "name": "ComplexService", + "version": "1.0", + "description": "ComplexService", + "category": "Emanuel", + "uuid": "6e59c5de-f052-46fa-aa7e-2fca9d674c44", + "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0", + "serviceType": "", + "serviceRole": "", + "isMultiStepDesign": false + } + }, + "lcpRegionsAndTenants": { + "lcpRegionList": [ + { + "id": "JANET25", + "name": "JANET25", + "isPermitted": true + }, + { + "id": "hvf6", + "name": "hvf6", + "isPermitted": true + } + ], + "lcpRegionsTenantsMap": { + "JANET25": [ + { + "id": "092eb9e8e4b7412e8787dd091bc58e86", + "name": "USP-SIP-IC-24335-T-01", + "isPermitted": true + } + ], + "hvf6": [ + { + "id": "bae71557c5bb4d5aac6743a4e5f1d054", + "name": "AIN Web Tool-15-D-testalexandria", + "isPermitted": true + }, + { + "id": "229bcdc6eaeb4ca59d55221141d01f8e", + "name": "AIN Web Tool-15-D-STTest2", + "isPermitted": true + }, + { + "id": "1178612d2b394be4834ad77f567c0af2", + "name": "AIN Web Tool-15-D-SSPtestcustome", + "isPermitted": true + }, + { + "id": "19c5ade915eb461e8af52fb2fd8cd1f2", + "name": "AIN Web Tool-15-D-UncheckedEcopm", + "isPermitted": true + }, + { + "id": "de007636e25249238447264a988a927b", + "name": "AIN Web Tool-15-D-dfsdf", + "isPermitted": true + }, + { + "id": "62f29b3613634ca6a3065cbe0e020c44", + "name": "AIN/SMS-16-D-Multiservices1", + "isPermitted": true + }, + { + "id": "649289e30d3244e0b48098114d63c2aa", + "name": "AIN Web Tool-15-D-SSPST66", + "isPermitted": true + }, + { + "id": "3f21eeea6c2c486bba31dab816c05a32", + "name": "AIN Web Tool-15-D-ASSPST47", + "isPermitted": true + }, + { + "id": "f60ce21d3ee6427586cff0d22b03b773", + "name": "CESAR-100-D-sspjg67246", + "isPermitted": true + }, + { + "id": "8774659e425f479895ae091bb5d46560", + "name": "CESAR-100-D-sspjg68359", + "isPermitted": true + }, + { + "id": "624eb554b0d147c19ff8885341760481", + "name": "AINWebTool-15-D-iftach", + "isPermitted": true + }, + { + "id": "214f55f5fc414c678059c383b03e4962", + "name": "CESAR-100-D-sspjg612401", + "isPermitted": true + }, + { + "id": "c90666c291664841bb98e4d981ff1db5", + "name": "CESAR-100-D-sspjg621340", + "isPermitted": true + }, + { + "id": "ce5b6bc5c7b348e1bf4b91ac9a174278", + "name": "sspjg621351cloned", + "isPermitted": true + }, + { + "id": "b386b768a3f24c8e953abbe0b3488c02", + "name": "AINWebTool-15-D-eteancomp", + "isPermitted": true + }, + { + "id": "dc6c4dbfd225474e9deaadd34968646c", + "name": "AINWebTool-15-T-SPFET", + "isPermitted": true + }, + { + "id": "02cb5030e9914aa4be120bd9ed1e19eb", + "name": "AINWebTool-15-X-eeweww", + "isPermitted": true + }, + { + "id": "f2f3830e4c984d45bcd00e1a04158a79", + "name": "CESAR-100-D-spjg61909", + "isPermitted": true + }, + { + "id": "05b91bd5137f4929878edd965755c06d", + "name": "CESAR-100-D-sspjg621512cloned", + "isPermitted": true + }, + { + "id": "7002fbe8482d4a989ddf445b1ce336e0", + "name": "AINWebTool-15-X-vdr", + "isPermitted": true + }, + { + "id": "4008522be43741dcb1f5422022a2aa0b", + "name": "AINWebTool-15-D-ssasa", + "isPermitted": true + }, + { + "id": "f44e2e96a1b6476abfda2fa407b00169", + "name": "AINWebTool-15-D-PFNPT", + "isPermitted": true + }, + { + "id": "b69a52bec8a84669a37a1e8b72708be7", + "name": "AINWebTool-15-X-vdre", + "isPermitted": true + }, + { + "id": "fac7d9fd56154caeb9332202dcf2969f", + "name": "AINWebTool-15-X-NONPODECOMP", + "isPermitted": true + }, + { + "id": "2d34d8396e194eb49969fd61ffbff961", + "name": "DN5242-Nov16-T5", + "isPermitted": true + }, + { + "id": "cb42a77ff45b48a8b8deb83bb64acc74", + "name": "ro-T11", + "isPermitted": true + }, + { + "id": "fa45ca53c80b492fa8be5477cd84fc2b", + "name": "ro-T112", + "isPermitted": true + }, + { + "id": "4914ab0ab3a743e58f0eefdacc1dde77", + "name": "DN5242-Nov21-T1", + "isPermitted": true + }, + { + "id": "d0a3e3f2964542259d155a81c41aadc3", + "name": "test-hvf6-09", + "isPermitted": true + }, + { + "id": "cbb99fe4ada84631b7baf046b6fd2044", + "name": "DN5242-Nov16-T3", + "isPermitted": true + } + ] + } + }, + "productFamilies": [ + { + "id": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034", + "name": "SCOTTIE", + "isPermitted": true + }, + { + "id": "17cc1042-527b-11e6-beb8-9e71128cae77", + "name": "IGNACIO", + "isPermitted": true + }, + { + "id": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e", + "name": "Christie", + "isPermitted": true + }, + { + "id": "a4f6f2ae-9bf5-4ed7-b904-06b2099c4bd7", + "name": "Enhanced Services", + "isPermitted": true + }, + { + "id": "vTerrance", + "name": "vTerrance", + "isPermitted": true + }, + { + "id": "323d69d9-2efe-4r45-ay0a-89ea7ard4e6f", + "name": "vSCP", + "isPermitted": true + }, + { + "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb", + "name": "Emanuel", + "isPermitted": true + }, + { + "id": "d8a6ed93-251c-47ca-adc9-86671fd19f4c", + "name": "BVOIP", + "isPermitted": true + }, + { + "id": "db171b8f-115c-4992-a2e3-ee04cae357e0", + "name": "LINDSEY", + "isPermitted": true + }, + { + "id": "LRSI-OSPF", + "name": "LRSI-OSPF", + "isPermitted": true + }, + { + "id": "vRosemarie", + "name": "HNGATEWAY", + "isPermitted": true + }, + { + "id": "vHNPaas", + "name": "WILKINS", + "isPermitted": true + }, + { + "id": "e433710f-9217-458d-a79d-1c7aff376d89", + "name": "TYLER SILVIA", + "isPermitted": true + }, + { + "id": "b6a3f28c-eebf-494c-a900-055cc7c874ce", + "name": "VROUTER", + "isPermitted": true + }, + { + "id": "Cisneros", + "name": "vMuriel", + "isPermitted": true + }, + { + "id": "0ee8c1bc-7cbd-4b0a-a1ac-e9999255abc1", + "name": "CARA Griffin", + "isPermitted": true + }, + { + "id": "c7611ebe-c324-48f1-8085-94aef0c6ef3d", + "name": "DARREN MCGEE", + "isPermitted": true + }, + { + "id": "e30755dc-5673-4b6b-9dcf-9abdd96b93d1", + "name": "Transport", + "isPermitted": true + }, + { + "id": "vSalvatore", + "name": "vSalvatore", + "isPermitted": true + }, + { + "id": "d7bb0a21-66f2-4e6d-87d9-9ef3ced63ae4", + "name": "Josefina", + "isPermitted": true + }, + { + "id": "vHubbard", + "name": "vHubbard", + "isPermitted": true + }, + { + "id": "12a96a9d-4b4c-4349-a950-fe1159602621", + "name": "DARREN MCGEE", + "isPermitted": true + } + ], + "serviceTypes": { + "e433710f-9217-458d-a79d-1c7aff376d89": [ + { + "id": "0", + "name": "vRichardson", + "isPermitted": false + }, + { + "id": "1", + "name": "TYLER SILVIA", + "isPermitted": true + }, + { + "id": "2", + "name": "Emanuel", + "isPermitted": false + }, + { + "id": "3", + "name": "vJamie", + "isPermitted": false + }, + { + "id": "4", + "name": "vVoiceMail", + "isPermitted": false + }, + { + "id": "5", + "name": "Kennedy", + "isPermitted": false + }, + { + "id": "6", + "name": "vSEGW", + "isPermitted": false + }, + { + "id": "7", + "name": "vVM", + "isPermitted": false + }, + { + "id": "8", + "name": "vOTA", + "isPermitted": false + }, + { + "id": "9", + "name": "vMME", + "isPermitted": false + }, + { + "id": "10", + "name": "vMNS", + "isPermitted": false + }, + { + "id": "11", + "name": "vSCP", + "isPermitted": false + }, + { + "id": "12", + "name": "VPMS", + "isPermitted": false + }, + { + "id": "13", + "name": "vMMSC", + "isPermitted": false + }, + { + "id": "14", + "name": "SSD", + "isPermitted": false + }, + { + "id": "15", + "name": "vMOG", + "isPermitted": false + }, + { + "id": "16", + "name": "LINDSEY", + "isPermitted": false + }, + { + "id": "17", + "name": "JOHANNA_SANTOS", + "isPermitted": false + }, + { + "id": "18", + "name": "vCarroll", + "isPermitted": false + } + ] + }, + "aicZones": [ + { + "id": "NFT1", + "name": "NFTJSSSS-NFT1" + }, + { + "id": "JAG1", + "name": "YUDFJULP-JAG1" + }, + { + "id": "YYY1", + "name": "UUUAIAAI-YYY1" + }, + { + "id": "BAN1", + "name": "VSDKYUTP-BAN1" + }, + { + "id": "DKJ1", + "name": "DKJSJDKA-DKJ1" + }, + { + "id": "MCS1", + "name": "ASACMAMS-MCS1" + }, + { + "id": "UIO1", + "name": "uioclli1-UIO1" + }, + { + "id": "RAJ1", + "name": "YGBIJNLQ-RAJ1" + }, + { + "id": "OPA1", + "name": "opaclli1-OPA1" + }, + { + "id": "SDE1", + "name": "ZXCVBNMA-SDE1" + }, + { + "id": "VEN2", + "name": "FGHJUHIL-VEN2" + }, + { + "id": "ORL1", + "name": "ORLDFLMA-ORL1" + }, + { + "id": "JAD1", + "name": "JADECLLI-JAD1" + }, + { + "id": "ZXL1", + "name": "LWLWCANN-ZXL1" + }, + { + "id": "CKL1", + "name": "CLKSKCKK-CKL1" + }, + { + "id": "SDF1", + "name": "sdfclli1-SDF1" + }, + { + "id": "RAD1", + "name": "RADICAL1-RAD1" + }, + { + "id": "KIT1", + "name": "BHYJFGLN-KIT1" + }, + { + "id": "REL1", + "name": "INGERFGT-REL1" + }, + { + "id": "JNL1", + "name": "CJALSDAC-JNL1" + }, + { + "id": "OLK1", + "name": "OLKOLKLS-OLK1" + }, + { + "id": "CHI1", + "name": "CHILLIWE-CHI1" + }, + { + "id": "UUU4", + "name": "UUUAAAUU-UUU4" + }, + { + "id": "TUF1", + "name": "TUFCLLI1-TUF1" + }, + { + "id": "KJN1", + "name": "CKALDKSA-KJN1" + }, + { + "id": "SAM1", + "name": "SNDGCA64-SAN1" + }, + { + "id": "SCK1", + "name": "SCKSCKSK-SCK1" + }, + { + "id": "HJH1", + "name": "AOEEQQQD-HJH1" + }, + { + "id": "HGD1", + "name": "SDFQWHGD-HGD1" + }, + { + "id": "KOR1", + "name": "HYFLNBVT-KOR1" + }, + { + "id": "ATL43", + "name": "AICLOCID-ATL43" + }, + { + "id": "ATL54", + "name": "AICFTAAI-ATL54" + }, + { + "id": "ATL66", + "name": "CLLIAAII-ATL66" + }, + { + "id": "VEL1", + "name": "BNMLKUIK-VEL1" + }, + { + "id": "ICC1", + "name": "SANJITAT-ICC1" + }, + { + "id": "MNT11", + "name": "WSXEFBTH-MNT11" + }, + { + "id": "DEF2", + "name": "WSBHGTYL-DEF2" + }, + { + "id": "MAD11", + "name": "SDFQWGKL-MAD11" + }, + { + "id": "OLG1", + "name": "OLHOLHOL-OLG1" + }, + { + "id": "GAR1", + "name": "NGFVSJKO-GAR1" + }, + { + "id": "SAN22", + "name": "GNVLSCTL-SAN22" + }, + { + "id": "HRG1", + "name": "HRGHRGGS-HRG1" + }, + { + "id": "JCS1", + "name": "JCSJSCJS-JCS1" + }, + { + "id": "DHA12", + "name": "WSXEDECF-DHA12" + }, + { + "id": "HJE1", + "name": "AOEEWWWD-HJE1" + }, + { + "id": "NCA1", + "name": "NCANCANN-NCA1" + }, + { + "id": "IOP1", + "name": "iopclli1-IOP1" + }, + { + "id": "RTY1", + "name": "rtyclli1-RTY1" + }, + { + "id": "KAP1", + "name": "HIOUYTRQ-KAP1" + }, + { + "id": "ZEN1", + "name": "ZENCLLI1-ZEN1" + }, + { + "id": "HKA1", + "name": "JAKHLASS-HKA1" + }, + { + "id": "CQK1", + "name": "CQKSCAKK-CQK1" + }, + { + "id": "SAI1", + "name": "UBEKQLPD-SAI1" + }, + { + "id": "ERT1", + "name": "ertclli1-ERT1" + }, + { + "id": "IBB1", + "name": "PLMKOIJU-IBB1" + }, + { + "id": "TIR2", + "name": "PLKINHYI-TIR2" + }, + { + "id": "HSD1", + "name": "CHASKCDS-HSD1" + }, + { + "id": "SLF78", + "name": "SDCTLFN1-SLF78" + }, + { + "id": "SEE78", + "name": "SDCTEEE4-SEE78" + }, + { + "id": "SAN13", + "name": "TOKYJPFA-SAN13" + }, + { + "id": "SAA78", + "name": "SDCTAAA1-SAA78" + }, + { + "id": "LUC1", + "name": "ATLDFGYC-LUC1" + }, + { + "id": "AMD13", + "name": "MEMATLAN-AMD13" + }, + { + "id": "TOR1", + "name": "TOROONXN-TOR1" + }, + { + "id": "QWE1", + "name": "QWECLLI1-QWE1" + }, + { + "id": "ZOG1", + "name": "ZOGASTRO-ZOG1" + }, + { + "id": "CAL33", + "name": "CALIFORN-CAL33" + }, + { + "id": "SHH78", + "name": "SDIT1HHH-SHH78" + }, + { + "id": "DSA1", + "name": "LKJHGFDS-DSA1" + }, + { + "id": "CLG1", + "name": "CLGRABAD-CLG1" + }, + { + "id": "BNA1", + "name": "BNARAGBK-BNA1" + }, + { + "id": "ATL84", + "name": "CANTTCOC-ATL84" + }, + { + "id": "APP1", + "name": "WBHGTYUI-APP1" + }, + { + "id": "RJN1", + "name": "RJNRBZAW-RJN1" + }, + { + "id": "EHH78", + "name": "SDCSHHH5-EHH78" + }, + { + "id": "mac10", + "name": "PKGTESTF-mac10" + }, + { + "id": "SXB78", + "name": "SDCTGXB1-SXB78" + }, + { + "id": "SAX78", + "name": "SDCTAXG1-SAX78" + }, + { + "id": "SYD1", + "name": "SYDNAUBV-SYD1" + }, + { + "id": "TOK1", + "name": "TOKYJPFA-TOK1" + }, + { + "id": "KGM2", + "name": "KGMTNC20-KGM2" + }, + { + "id": "DCC1b", + "name": "POIUYTGH-DCC1b" + }, + { + "id": "SKK78", + "name": "SDCTKKK1-SKK78" + }, + { + "id": "SGG78", + "name": "SDCTGGG1-SGG78" + }, + { + "id": "SJJ78", + "name": "SDCTJJJ1-SJJ78" + }, + { + "id": "SBX78", + "name": "SDCTBXG1-SBX78" + }, + { + "id": "LAG1", + "name": "LARGIZON-LAG1" + }, + { + "id": "IAA1", + "name": "QAZXSWED-IAA1" + }, + { + "id": "POI1", + "name": "PLMNJKIU-POI1" + }, + { + "id": "LAG1a", + "name": "LARGIZON-LAG1a" + }, + { + "id": "PBL1", + "name": "PBLAPBAI-PBL1" + }, + { + "id": "LAG45", + "name": "LARGIZON-LAG1a" + }, + { + "id": "MAR1", + "name": "MNBVCXZM-MAR1" + }, + { + "id": "HST70", + "name": "HSTNTX70-HST70" + }, + { + "id": "DCC1a", + "name": "POIUYTGH-DCC1a" + }, + { + "id": "TOL1", + "name": "TOLDOH21-TOL1" + }, + { + "id": "LON1", + "name": "LONEENCO-LON1" + }, + { + "id": "SJU78", + "name": "SDIT1JUB-SJU78" + }, + { + "id": "STN27", + "name": "HSTNTX01-STN27" + }, + { + "id": "SSW56", + "name": "ss8126GT-SSW56" + }, + { + "id": "SBB78", + "name": "SDIT1BBB-SBB78" + }, + { + "id": "DCC3", + "name": "POIUYTGH-DCC3" + }, + { + "id": "GNV1", + "name": "GNVLSCTL-GNV1" + }, + { + "id": "WAS1", + "name": "WASHDCSW-WAS1" + }, + { + "id": "TOY1", + "name": "TORYONNZ-TOY1" + }, + { + "id": "STT1", + "name": "STTLWA02-STT1" + }, + { + "id": "STG1", + "name": "STTGGE62-STG1" + }, + { + "id": "SLL78", + "name": "SDCTLLL1-SLL78" + }, + { + "id": "SBU78", + "name": "SDIT1BUB-SBU78" + }, + { + "id": "ATL2", + "name": "ATLNGANW-ATL2" + }, + { + "id": "BOT1", + "name": "BOTHWAKY-BOT1" + }, + { + "id": "SNG1", + "name": "SNGPSIAU-SNG1" + }, + { + "id": "NYC1", + "name": "NYCMNY54-NYC1" + }, + { + "id": "LAG1b", + "name": "LARGIZON-LAG1b" + }, + { + "id": "AMD15", + "name": "AMDFAA01-AMD15" + }, + { + "id": "SNA1", + "name": "SNANTXCA-SNA1" + }, + { + "id": "PLT1", + "name": "PLTNCA60-PLT1" + }, + { + "id": "TLP1", + "name": "TLPNXM18-TLP1" + }, + { + "id": "SDD81", + "name": "SAIT1DD6-SDD81" + }, + { + "id": "DCC1", + "name": "POIUYTGH-DCC1" + }, + { + "id": "DCC2", + "name": "POIUYTGH-DCC2" + }, + { + "id": "OKC1", + "name": "OKCBOK55-OKC1" + }, + { + "id": "PAR1", + "name": "PARSFRCG-PAR1" + }, + { + "id": "TES36", + "name": "ABCEETES-TES36" + }, + { + "id": "COM1", + "name": "PLMKOPIU-COM1" + }, + { + "id": "ANI1", + "name": "ATLNGTRE-ANI1" + }, + { + "id": "SDG78", + "name": "SDIT1BDG-SDG78" + }, + { + "id": "mac20", + "name": "PKGTESTF-mac20" + }, + { + "id": "DSF45", + "name": "DSFBG123-DSF45" + }, + { + "id": "HST25", + "name": "HSTNTX01-HST25" + }, + { + "id": "AMD18", + "name": "AUDIMA01-AMD18" + }, + { + "id": "SAA80", + "name": "SAIT9AA3-SAA80" + }, + { + "id": "SSA56", + "name": "SSIT2AA7-SSA56" + }, + { + "id": "SDD82", + "name": "SAIT1DD9-SDD82" + }, + { + "id": "JCV1", + "name": "JCVLFLBW-JCV1" + }, + { + "id": "SUL2", + "name": "WERTYUJK-SUL2" + }, + { + "id": "PUR1", + "name": "purelyde-PUR1" + }, + { + "id": "FDE55", + "name": "FDERT555-FDE55" + }, + { + "id": "SITE", + "name": "LONEENCO-SITE" + }, + { + "id": "ATL1", + "name": "ATLNGAMA-ATL1" + }, + { + "id": "JUL1", + "name": "ZXCVBNMM-JUL1" + }, + { + "id": "TAT34", + "name": "TESAAISB-TAT34" + }, + { + "id": "XCP12", + "name": "CHKGH123-XCP12" + }, + { + "id": "RAI1", + "name": "poiuytre-RAI1" + }, + { + "id": "HPO1", + "name": "ATLNGAUP-HPO1" + }, + { + "id": "KJF12", + "name": "KJFDH123-KJF12" + }, + { + "id": "SCC80", + "name": "SAIT9CC3-SCC80" + }, + { + "id": "SAA12", + "name": "SAIT9AF8-SAA12" + }, + { + "id": "SAA14", + "name": "SAIT1AA9-SAA14" + }, + { + "id": "ATL35", + "name": "TTESSAAI-ATL35" + }, + { + "id": "CWY1", + "name": "CWYMOWBS-CWY1" + }, + { + "id": "ATL76", + "name": "TELEPAAI-ATL76" + }, + { + "id": "DSL12", + "name": "DSLFK242-DSL12" + }, + { + "id": "ATL53", + "name": "AAIATLTE-ATL53" + }, + { + "id": "SAA11", + "name": "SAIT9AA2-SAA11" + }, + { + "id": "ATL62", + "name": "TESSASCH-ATL62" + }, + { + "id": "AUG1", + "name": "ASDFGHJK-AUG1" + }, + { + "id": "POI22", + "name": "POIUY123-POI22" + }, + { + "id": "SAA13", + "name": "SAIT1AA9-SAA13" + }, + { + "id": "BHY17", + "name": "BHYTFRF3-BHY17" + }, + { + "id": "LIS1", + "name": "HOSTPROF-LIS1" + }, + { + "id": "SIP1", + "name": "ZXCVBNMK-SIP1" + }, + { + "id": "ATL99", + "name": "TEESTAAI-ATL43" + }, + { + "id": "ATL64", + "name": "FORLOAAJ-ATL64" + }, + { + "id": "TAT33", + "name": "TESAAISA-TAT33" + }, + { + "id": "RAD10", + "name": "INDIPUNE-RAD10" + }, + { + "id": "RTW5", + "name": "BHYTFRY4-RTW5" + }, + { + "id": "JGS1", + "name": "KSJKKKKK-JGS1" + }, + { + "id": "ATL98", + "name": "TEESTAAI-ATL43" + }, + { + "id": "WAN1", + "name": "LEIWANGW-WAN1" + }, + { + "id": "ATL44", + "name": "ATLSANAB-ATL44" + }, + { + "id": "RTD2", + "name": "BHYTFRk4-RTD2" + }, + { + "id": "NIR1", + "name": "ORFLMANA-NIR1" + }, + { + "id": "ATL75", + "name": "SANAAIRE-ATL75" + }, + { + "id": "NUM1", + "name": "QWERTYUI-NUM1" + }, + { + "id": "MTN32", + "name": "MDTWNJ21-MTN32" + }, + { + "id": "RTZ4", + "name": "BHYTFRZ6-RTZ4" + }, + { + "id": "ATL56", + "name": "ATLSANAC-ATL56" + }, + { + "id": "AMS1", + "name": "AMSTNLBW-AMS1" + }, + { + "id": "RCT1", + "name": "AMSTERNL-RCT1" + }, + { + "id": "JAN1", + "name": "ORFLMATT-JAN1" + }, + { + "id": "ABC14", + "name": "TESAAISA-ABC14" + }, + { + "id": "TAT37", + "name": "TESAAISD-TAT37" + }, + { + "id": "MIC54", + "name": "MICHIGAN-MIC54" + }, + { + "id": "ABC11", + "name": "ATLSANAI-ABC11" + }, + { + "id": "AMF11", + "name": "AMDOCS01-AMF11" + }, + { + "id": "ATL63", + "name": "ATLSANEW-ATL63" + }, + { + "id": "ABC12", + "name": "ATLSECIA-ABC12" + }, + { + "id": "MTN20", + "name": "MDTWNJ21-MTN20" + }, + { + "id": "ABC15", + "name": "AAITESAN-ABC15" + }, + { + "id": "AVT1", + "name": "AVTRFLHD-AVT1" + }, + { + "id": "ATL34", + "name": "ATLSANAI-ATL34" + } + ], + "categoryParameters": { + "owningEntityList": [ + { + "id": "aaa1", + "name": "aaa1" + }, + { + "id": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc", + "name": "WayneHolland" + }, + { + "id": "Melissa", + "name": "Melissa" + } + ], + "projectList": [ + { + "id": "WATKINS", + "name": "WATKINS" + }, + { + "id": "x1", + "name": "x1" + }, + { + "id": "yyy1", + "name": "yyy1" + } + ], + "lineOfBusinessList": [ + { + "id": "ONAP", + "name": "ONAP" + }, + { + "id": "zzz1", + "name": "zzz1" + } + ], + "platformList": [ + { + "id": "platform", + "name": "platform" + }, + { + "id": "xxx1", + "name": "xxx1" + } + ] + }, + "type": "[LCP_REGIONS_AND_TENANTS] Update", + "subscribers": [ + { + "id": "CAR_2020_ER", + "name": "CAR_2020_ER", + "isPermitted": true + }, + { + "id": "21014aa2-526b-11e6-beb8-9e71128cae77", + "name": "JULIO ERICKSON", + "isPermitted": false + }, + { + "id": "DHV1707-TestSubscriber-2", + "name": "DALE BRIDGES", + "isPermitted": false + }, + { + "id": "DHV1707-TestSubscriber-1", + "name": "LLOYD BRIDGES", + "isPermitted": false + }, + { + "id": "jimmy-example", + "name": "JimmyExampleCust-20161102", + "isPermitted": false + }, + { + "id": "jimmy-example2", + "name": "JimmyExampleCust-20161103", + "isPermitted": false + }, + { + "id": "ERICA5779-TestSub-PWT-102", + "name": "ERICA5779-TestSub-PWT-102", + "isPermitted": false + }, + { + "id": "ERICA5779-TestSub-PWT-101", + "name": "ERICA5779-TestSub-PWT-101", + "isPermitted": false + }, + { + "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb", + "name": "Emanuel", + "isPermitted": false + }, + { + "id": "ERICA5779-Subscriber-4", + "name": "ERICA5779-Subscriber-5", + "isPermitted": false + }, + { + "id": "ERICA5779-TestSub-PWT-103", + "name": "ERICA5779-TestSub-PWT-103", + "isPermitted": false + }, + { + "id": "ERICA5779-Subscriber-2", + "name": "ERICA5779-Subscriber-2", + "isPermitted": false + }, + { + "id": "e433710f-9217-458d-a79d-1c7aff376d89", + "name": "SILVIA ROBBINS", + "isPermitted": true + }, + { + "id": "ERICA5779-Subscriber-3", + "name": "ERICA5779-Subscriber-3", + "isPermitted": false + }, + { + "id": "31739f3e-526b-11e6-beb8-9e71128cae77", + "name": "CRAIG/ROBERTS", + "isPermitted": false + } + ] + } + } + } +} + +class MockFeatureFlagsService {} + +describe('VNF Control Generator', () => { + let injector; + let service: VnfControlGenerator; + let httpMock: HttpTestingController; + + + beforeAll(done => (async () => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + providers: [VnfControlGenerator, + GenericFormService, + BasicControlGenerator, + AaiService, + FormBuilder, + LogService, + {provide:FeatureFlagsService, useClass: MockFeatureFlagsService}, + {provide: NgRedux, useClass: MockAppStore}] + }); + await TestBed.compileComponents(); + + + injector = getTestBed(); + service = injector.get(VnfControlGenerator); + httpMock = injector.get(HttpTestingController); + + })().then(done).catch(done.fail)); + + + test('getMacroFormControls check for mandatory controls', () => { + const serviceId : string = "6e59c5de-f052-46fa-aa7e-2fca9d674c44"; + const vnfName : string = "VF_vMee 0"; + const vnfStoreKey : string = "VF_vMee 0"; + const controls :FormControlModel[] = service.getMacroFormControls(serviceId, vnfStoreKey, vnfName, []); + + const mandatoryControls : string[] = [ + FormControlNames.INSTANCE_NAME, + FormControlNames.LCPCLOUD_REGION_ID, + FormControlNames.TENANT_ID, + 'platformName' + ]; + + for(let i = 0 ; i < mandatoryControls.length ; i++){ + let requiredExist = controls.find(ctrl => ctrl.controlName === mandatoryControls[i]).validations.find(item => item.validatorName === 'required'); + expect(requiredExist).toBeDefined(); + } + }); + + test('should provide empty array on getMacroFormControls when serviceId, vnfName and vnfStoreKey equals to null', () => { + + let vnfStoreKey = null; + const serviceId = null; + const vnfName : string = null; + const result:FormControlModel[] = service.getMacroFormControls(serviceId, vnfStoreKey, vnfName, []); + expect(result).toEqual([]); + }); + + test('should provide empty array on getAlaCarteFormControls when serviceId, vnfName and vnfStoreKey equals to null', () => { + let vnfStoreKey = null; + const serviceId = null; + const vnfName : string = null; + const result:FormControlModel[] = service.getAlaCarteFormControls(serviceId, vnfStoreKey, vnfName, []); + expect(result).toEqual([]); + }); + + function getALaCarteFormControls(vnfStoreKey: string): FormControlModel[] { + const serviceId: string = "6e59c5de-f052-46fa-aa7e-2fca9d674c44"; + const vnfName: string = "VF_vMee 0"; + const controls: FormControlModel[] = service.getAlaCarteFormControls(serviceId, vnfStoreKey, vnfName, []); + return controls; + } + + test('getMacroFormControls should return the correct order of controls', () => { + const serviceId : string = "6e59c5de-f052-46fa-aa7e-2fca9d674c44"; + const vnfName : string = "VF_vMee 0"; + const vnfStoreKey : string = null; + const controls :FormControlModel[] = service.getMacroFormControls(serviceId, vnfStoreKey, vnfName, []); + + const controlsOrderNames = [ + FormControlNames.INSTANCE_NAME, + FormControlNames.PRODUCT_FAMILY_ID, + FormControlNames.LCPCLOUD_REGION_ID , + 'legacyRegion', + 'tenantId', + 'platformName', + 'lineOfBusiness']; + + expect(controls.length).toEqual(7); + for(let i = 0 ; i < controls.length ; i++){ + expect(controls[i].controlName).toEqual(controlsOrderNames[i]); + } + }); + + test('getAlacartFormControls should return the correct order of controls', () => { + const controls = getALaCarteFormControls(null); + + const controlsOrderNames = [ + FormControlNames.INSTANCE_NAME, + FormControlNames.PRODUCT_FAMILY_ID, + FormControlNames.LCPCLOUD_REGION_ID, + 'legacyRegion', + 'tenantId', + 'platformName', + 'lineOfBusiness', + 'rollbackOnFailure']; + expect(controls.length).toEqual(8); + for(let i = 0 ; i < controls.length ; i++) { + expect(controls[i].controlName).toEqual(controlsOrderNames[i]); + } + }); + + + test('getAlacartFormControls check for mandatory controls', () => { + const controls = getALaCarteFormControls("VF_vMee 0"); + const mandatoryControls : string[] = [ + FormControlNames.INSTANCE_NAME, + FormControlNames.LCPCLOUD_REGION_ID, + 'tenantId', + 'platformName', + 'rollbackOnFailure' + ]; + for(let i = 0 ; i < mandatoryControls.length ; i++){ + let requiredExist = controls.find(ctrl => ctrl.controlName === mandatoryControls[i]).validations.find(item => item.validatorName === 'required'); + expect(requiredExist).toBeDefined(); + } + }); + + test('getAlacartFormControls instance name control validator shall have the expected regex', () => { + const controls:FormControlModel[] = getALaCarteFormControls("VF_vMee 0"); + + const instanceNameControl: FormControlModel = <FormControlModel>controls.find(item => item.controlName === FormControlNames.INSTANCE_NAME); + const instanceNameValidator: ValidatorModel = instanceNameControl.validations.find(val => val.validatorName === ValidatorOptions.pattern); + expect(instanceNameValidator.validatorArg).toEqual(/^[a-zA-Z0-9._-]*$/); + }); + + test('rollback should return observable of true, false', () => { + let result : Observable<SelectOption[]> = service.getRollBackOnFailureOptions(); + result.subscribe((val)=>{ + expect(val).toEqual([ + new SelectOption({id: 'true', name: 'Rollback'}), + new SelectOption({id: 'false', name: 'Don\'t Rollback'}) + ]); + }); + }); +}); + diff --git a/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/vnfGenerator/vnf.control.generator.ts b/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/vnfGenerator/vnf.control.generator.ts new file mode 100644 index 000000000..3484038b1 --- /dev/null +++ b/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/vnfGenerator/vnf.control.generator.ts @@ -0,0 +1,243 @@ +import {Injectable} from "@angular/core"; +import {GenericFormService} from "../../generic-form.service"; +import {AaiService} from "../../../../services/aaiService/aai.service"; +import {NgRedux} from "@angular-redux/store"; +import {HttpClient} from "@angular/common/http"; +import {BasicControlGenerator} from "../basic.control.generator"; +import { + FormControlModel, + ValidatorModel, + ValidatorOptions +} from "../../../../models/formControlModels/formControl.model"; +import {LogService} from "../../../../utils/log/log.service"; +import {VNFModel} from "../../../../models/vnfModel"; +import {AppState} from "../../../../store/reducers"; +import {FormGroup} from "@angular/forms"; +import {DropdownFormControl} from "../../../../models/formControlModels/dropdownFormControl.model"; +import {FormControlType} from "../../../../models/formControlModels/formControlTypes.enum"; +import {InputFormControl} from "../../../../models/formControlModels/inputFormControl.model"; +import {Observable, of} from "rxjs"; +import {SelectOption} from "../../../../models/selectOption"; +import * as _ from 'lodash'; +import {Constants} from "../../../../utils/constants"; + +export enum FormControlNames { + INSTANCE_NAME = 'instanceName', + GLOBAL_SUBSCRIBER_ID = 'globalSubscriberId', + SUBSCRIPTION_SERVICE_TYPE = 'subscriptionServiceType', + PRODUCT_FAMILY_ID = 'productFamilyId', + LCPCLOUD_REGION_ID = 'lcpCloudRegionId', + TENANT_ID = 'tenantId', + AICZONE_ID = 'aicZoneId', + PROJECT_NAME = 'projectName', + OWNING_ENTITY_ID = 'owningEntityId', + ROLLBACK_ON_FAILURE = 'rollbackOnFailure', + PAUSE = 'pause' +} + +enum InputType { + LCP_REGION = "lcpCloudRegionId", + TENANT = "tenantId", + LOB = "lineOfBusiness", + PLATFORM = "platformName", + ROLLBACK = "rollbackOnFailure", + PRODUCT_FAMILY = "productFamilyId", + VG = "volumeGroupName" +} + +@Injectable() +export class VnfControlGenerator { + aaiService: AaiService; + constructor(private genericFormService: GenericFormService, + private _basicControlGenerator: BasicControlGenerator, + private store: NgRedux<AppState>, + private http: HttpClient, + private _aaiService: AaiService, + private _logService: LogService) { + this.aaiService = _aaiService; + } + + getVnfInstance = (serviceId: string, vnfStoreKey: string): any => { + let vnfInstance = null; + if (this.store.getState().service.serviceInstance[serviceId] && _.has(this.store.getState().service.serviceInstance[serviceId].vnfs, vnfStoreKey)) { + vnfInstance = Object.assign({}, this.store.getState().service.serviceInstance[serviceId].vnfs[vnfStoreKey]); + } + return vnfInstance; + }; + + getMacroFormControls(serviceId: string, vnfStoreKey: string, vnfName: string, dynamicInputs?: any[]): FormControlModel[] { + vnfStoreKey = _.isNil(vnfStoreKey) ? vnfName : vnfStoreKey; + + if (_.isNil(serviceId) || _.isNil(vnfStoreKey) || _.isNil(vnfName)) { + this._logService.error('should provide serviceId, vnfName, vnfStoreKey', serviceId); + return []; + } + + const vnfInstance = this.getVnfInstance(serviceId, vnfStoreKey); + const vnfModel = new VNFModel(this.store.getState().service.serviceHierarchy[serviceId].vnfs[vnfName]); + let result: FormControlModel[] = []; + + if (!_.isNil(vnfModel)) { + result.push(this.getInstanceName(vnfInstance, serviceId, vnfName, vnfModel.isEcompGeneratedNaming)); + result.push(this._basicControlGenerator.getProductFamilyControl(vnfInstance, result, false)); + result.push(this.getLcpRegionControl(serviceId, vnfInstance, result)); + result.push(this._basicControlGenerator.getLegacyRegion(vnfInstance)); + result.push(this.getTenantControl(serviceId, vnfInstance, result)); + result.push(this.getPlatformControl(vnfInstance, result)); + result.push(this.getLineOfBusinessControl(vnfInstance, result)); + } + return result; + } + + getAlaCarteFormControls(serviceId: string, vnfStoreKey: string, vnfName: string, dynamicInputs?: any[]): FormControlModel[] { + vnfStoreKey = _.isNil(vnfStoreKey) ? vnfName : vnfStoreKey; + if (_.isNil(serviceId) || _.isNil(vnfStoreKey) || _.isNil(vnfName)) { + this._logService.error('should provide serviceId, vnfName, vnfStoreKey', serviceId); + return []; + } + + let result: FormControlModel[] = []; + const vnfInstance = this.getVnfInstance(serviceId, vnfStoreKey); + const vnfModel = new VNFModel(this.store.getState().service.serviceHierarchy[serviceId].vnfs[vnfName]); + + if (!_.isNil(vnfModel)) { + result.push(this.getInstanceName(vnfInstance, serviceId, vnfName, vnfModel.isEcompGeneratedNaming)); + result.push(this._basicControlGenerator.getProductFamilyControl(vnfInstance, result, false)); + result.push(this.getLcpRegionControl(serviceId, vnfInstance, result)); + result.push(this._basicControlGenerator.getLegacyRegion(vnfInstance)); + result.push(this.getTenantControl(serviceId, vnfInstance, result)); + result.push(this.getPlatformControl(vnfInstance, result)); + result.push(this.getLineOfBusinessControl(vnfInstance, result)); + result.push(this.getRollbackOnFailureControl(vnfInstance, result)); + } + return result; + } + + isInputShouldBeShown = (inputType: any): boolean => { + let vnfInputs = [InputType.LCP_REGION, InputType.LOB, InputType.TENANT, InputType.PRODUCT_FAMILY, InputType.PLATFORM, InputType.ROLLBACK]; + return vnfInputs.indexOf(inputType) > -1; + }; + + getInstanceName(instance : any, serviceId : string, vnfName : string, isEcompGeneratedNaming: boolean): FormControlModel { + const vnfModel : VNFModel = this.store.getState().service.serviceHierarchy[serviceId].vnfs[vnfName]; + return this._basicControlGenerator.getInstanceNameController(instance, serviceId, isEcompGeneratedNaming, vnfModel); + } + + getLineOfBusinessControl = (instance: any, controls: FormControlModel[]): DropdownFormControl => { + return new DropdownFormControl({ + type: FormControlType.DROPDOWN, + controlName: 'lineOfBusiness', + displayName: 'Line of business', + dataTestId: 'lineOfBusiness', + placeHolder: 'Select Line Of Business', + isDisabled: false, + name: "lineOfBusiness", + value: instance ? instance.lineOfBusiness : null, + validations: [], + onInitSelectedField: ['lineOfBusinessList'], + onInit: this._basicControlGenerator.getSubscribeInitResult.bind(null, this._aaiService.getCategoryParameters) + }) + }; + + getPlatformControl = (instance: any, controls: FormControlModel[]): DropdownFormControl => { + return new DropdownFormControl({ + type: FormControlType.DROPDOWN, + controlName: 'platformName', + displayName: 'Platform', + dataTestId: 'platform', + placeHolder: 'Select Platform', + isDisabled: false, + name: "platform", + value: instance ? instance.platformName : null, + validations: [new ValidatorModel(ValidatorOptions.required, 'is required')], + onInitSelectedField: ['platformList'], + onInit: this._basicControlGenerator.getSubscribeInitResult.bind(null, this._aaiService.getCategoryParameters) + }) + }; + + getTenantControl = (serviceId: string, instance: any, controls: FormControlModel[]): DropdownFormControl => { + const service = this.store.getState().service.serviceInstance[serviceId]; + const globalCustomerId: string = service.globalSubscriberId; + const serviceType: string = service.subscriptionServiceType; + return new DropdownFormControl({ + type: FormControlType.DROPDOWN, + controlName: FormControlNames.TENANT_ID, + displayName: 'Tenant', + dataTestId: 'tenant', + placeHolder: 'Select Tenant', + name: "tenant", + isDisabled: _.isNil(instance) || _.isNil(instance.lcpCloudRegionId), + onInitSelectedField: instance ? ['lcpRegionsTenantsMap', instance.lcpCloudRegionId] : null, + value: instance ? instance.tenantId : null, + validations: [new ValidatorModel(ValidatorOptions.required, 'is required')], + onInit : instance ? this._basicControlGenerator.getSubscribeInitResult.bind( + this._aaiService, + this.aaiService.getLcpRegionsAndTenants.bind(this, globalCustomerId, serviceType)) : ()=>{}, + }) + }; + + getLcpRegionControl = (serviceId: string, instance: any, controls: FormControlModel[]): DropdownFormControl => { + const service = this.store.getState().service.serviceInstance[serviceId]; + const globalCustomerId: string = service.globalSubscriberId; + const serviceType: string = service.subscriptionServiceType; + return new DropdownFormControl({ + type: FormControlType.DROPDOWN, + controlName: 'lcpCloudRegionId', + displayName: 'LCP region', + dataTestId: 'lcpRegion', + placeHolder: 'Select LCP Region', + name: "lcpRegion", + isDisabled: false, + value: instance ? instance.lcpCloudRegionId : null, + validations: [new ValidatorModel(ValidatorOptions.required, 'is required')], + onInitSelectedField: ['lcpRegionList'], + onInit: this._basicControlGenerator.getSubscribeInitResult.bind( + this._aaiService, + this._aaiService.getLcpRegionsAndTenants.bind(this, globalCustomerId, serviceType)), + onChange: (param: string, form: FormGroup) => { + form.controls[FormControlNames.TENANT_ID].enable(); + form.controls[FormControlNames.TENANT_ID].reset(); + if (!_.isNil(globalCustomerId) && !_.isNil(serviceType)) { + this._basicControlGenerator.getSubscribeResult.bind(this, this._aaiService.getLcpRegionsAndTenants(globalCustomerId, serviceType).subscribe(res => { + controls.find(item => item.controlName === FormControlNames.TENANT_ID)['options$'] = res.lcpRegionsTenantsMap[param]; + if(res.lcpRegionsTenantsMap[param]){ + controls.find(item => item.controlName === FormControlNames.TENANT_ID)['hasEmptyOptions'] = res.lcpRegionsTenantsMap[param].length === 0; + } + })); + } + + if (Constants.LegacyRegion.MEGA_REGION.indexOf(param) !== -1) { + form.controls['legacyRegion'].enable(); + controls.find(item => item.controlName === 'legacyRegion').isVisible = true; + + } else { + controls.find(item => item.controlName === 'legacyRegion').isVisible = false; + form.controls['legacyRegion'].setValue(null); + form.controls['legacyRegion'].reset(); + form.controls['legacyRegion'].disable(); + } + } + }) + }; + + getRollbackOnFailureControl = (instance: any, controls: FormControlModel[]): DropdownFormControl => { + return new DropdownFormControl({ + type: FormControlType.DROPDOWN, + controlName: FormControlNames.ROLLBACK_ON_FAILURE, + displayName: 'Rollback on failure', + dataTestId: 'rollback', + placeHolder: 'Rollback on failure', + isDisabled: false, + validations: [new ValidatorModel(ValidatorOptions.required, 'is required')], + value: instance ? instance.rollbackOnFailure : 'true', + onInit: this._basicControlGenerator.getSubscribeInitResult.bind(null, this.getRollBackOnFailureOptions) + }) + }; + + getRollBackOnFailureOptions = (): Observable<SelectOption[]> => { + return of([ + new SelectOption({id: 'true', name: 'Rollback'}), + new SelectOption({id: 'false', name: 'Don\'t Rollback'}) + ]); + }; +} diff --git a/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/vnfGroupGenerator/vnfGroup.control.generator.spec.ts b/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/vnfGroupGenerator/vnfGroup.control.generator.spec.ts new file mode 100644 index 000000000..6dcaa8235 --- /dev/null +++ b/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/vnfGroupGenerator/vnfGroup.control.generator.spec.ts @@ -0,0 +1,364 @@ +import {getTestBed, TestBed} from '@angular/core/testing'; +import {HttpClientTestingModule, HttpTestingController} from '@angular/common/http/testing'; +import {NgRedux} from '@angular-redux/store'; +import {FormControlNames} from "../service.control.generator"; +import {BasicControlGenerator} from "../basic.control.generator"; +import {AaiService} from "../../../../services/aaiService/aai.service"; +import {GenericFormService} from "../../generic-form.service"; +import {FormBuilder} from "@angular/forms"; +import { + FormControlModel, + ValidatorModel, + ValidatorOptions +} from "../../../../models/formControlModels/formControl.model"; +import {LogService} from "../../../../utils/log/log.service"; +import {VnfGroupControlGenerator} from "./vnfGroup.control.generator"; +import {Observable} from "rxjs"; +import {SelectOption} from "../../../../models/selectOption"; +import {FeatureFlagsService} from "../../../../services/featureFlag/feature-flags.service"; + +class MockAppStore<T> { + getState(){ + return { + "global": { + "name": null, + "type": "UPDATE_DRAWING_BOARD_STATUS", + "drawingBoardStatus": "CREATE", + "flags": { + "CREATE_INSTANCE_TEST": false, + "EMPTY_DRAWING_BOARD_TEST": false, + "FLAG_NETWORK_TO_ASYNC_INSTANTIATION": false, + "FLAG_ASYNC_INSTANTIATION": true, + "FLAG_ASYNC_JOBS": true, + "FLAG_ADD_MSO_TESTAPI_FIELD": true, + "FLAG_UNASSIGN_SERVICE": false, + "FLAG_SERVICE_MODEL_CACHE": false, + "FLAG_COLLECTION_RESOURCE_SUPPORT": true, + "FLAG_SHOW_ASSIGNMENTS": true, + "FLAG_FABRIC_CONFIGURATION_ASSIGNMENTS": true, + "FLAG_DUPLICATE_VNF": true, + "FLAG_DEFAULT_VNF": true, + "FLAG_SETTING_DEFAULTS_IN_DRAWING_BOARD": true, + "FLAG_A_LA_CARTE_AUDIT_INFO": true, + "FLAG_1810_CR_ADD_CLOUD_OWNER_TO_MSO_REQUEST": true, + "FLAG_PRESENT_PROVIDER_NETWORKS_ASSOCIATIONS": true, + "FLAG_1810_CR_SOFT_DELETE_ALACARTE_VF_MODULE": true, + "FLAG_1902_NEW_VIEW_EDIT": true + } + }, + "service": { + "serviceHierarchy": { + "4117a0b6-e234-467d-b5b9-fe2f68c8b0fc": { + "service": { + "vidNotions": { + "instantiationUI": "serviceWithVnfGrouping", + "modelCategory": "other", + "viewEditUI": "serviceWithVnfGrouping" + }, + "uuid": "4117a0b6-e234-467d-b5b9-fe2f68c8b0fc", + "invariantUuid": "7ee41ce4-4827-44b0-a48e-2707a59905d2", + "name": "Grouping Service for Test", + "version": "1.0", + "toscaModelURL": null, + "category": "Network L4+", + "serviceType": "INFRASTRUCTURE", + "serviceRole": "GROUPING", + "description": "xxx", + "serviceEcompNaming": "false", + "instantiationType": "A-La-Carte", + "inputs": {} + }, + "vnfs": {}, + "networks": {}, + "collectionResource": {}, + "configurations": {}, + "fabricConfigurations": {}, + "serviceProxies": { + "vdbe_svc_vprs_proxy 0": { + "uuid": "65fadfa8-a0d9-443f-95ad-836cd044e26c", + "invariantUuid": "f4baae0c-b3a5-4ca1-a777-afbffe7010bc", + "description": "A Proxy for Service vDBE_Svc_vPRS", + "name": "vDBE_Svc_vPRS Service Proxy", + "version": "1.0", + "customizationUuid": "bdb63d23-e132-4ce7-af2c-a493b4cafac9", + "inputs": {}, + "commands": {}, + "properties": {}, + "type": "Service Proxy", + "sourceModelUuid": "da7827a2-366d-4be6-8c68-a69153c61274", + "sourceModelInvariant": "24632e6b-584b-4f45-80d4-fefd75fd9f14", + "sourceModelName": "vDBE_Svc_vPRS" + }, + "tsbc0001vm001_svc_proxy 0": { + "uuid": "65fadfa8-a0d9-443f-95ad-836cd044e26c", + "invariantUuid": "f4baae0c-b3a5-4ca1-a777-afbffe7010bc", + "description": "A Proxy for Service tsbc0001vm001_Svc", + "name": "tsbc0001vm001_Svc Service Proxy", + "version": "1.0", + "customizationUuid": "3d814462-30fb-4c62-b997-9aa360d27ead", + "inputs": {}, + "commands": {}, + "properties": {}, + "type": "Service Proxy", + "sourceModelUuid": "28aeb8f6-5620-4148-8bfb-a5fb406f0309", + "sourceModelInvariant": "c989ab9a-33c7-46ec-b521-1b2daef5f047", + "sourceModelName": "tsbc0001vm001_Svc" + } + }, + "vfModules": {}, + "volumeGroups": {}, + "pnfs": {}, + "vnfGroups": { + "groupingservicefortest..ResourceInstanceGroup..0": { + "type": "VnfGroup", + "invariantUuid": "4bb2e27e-ddab-4790-9c6d-1f731bc14a45", + "uuid": "daeb6568-cef8-417f-9075-ed259ce59f48", + "version": "1", + "name": "groupingservicefortest..ResourceInstanceGroup..0", + "modelCustomizationName": "groupingservicefortest..ResourceInstanceGroup..0", + "properties": { + "ecomp_generated_naming": "false", + "contained_resource_type": "VF", + "role": "SERVICE-ACCESS", + "function": "DATA", + "description": "DDD0", + "type": "LOAD-GROUP" + }, + "members": { + "vdbe_svc_vprs_proxy 0": { + "uuid": "65fadfa8-a0d9-443f-95ad-836cd044e26c", + "invariantUuid": "f4baae0c-b3a5-4ca1-a777-afbffe7010bc", + "description": "A Proxy for Service vDBE_Svc_vPRS", + "name": "vDBE_Svc_vPRS Service Proxy", + "version": "1.0", + "customizationUuid": "bdb63d23-e132-4ce7-af2c-a493b4cafac9", + "inputs": {}, + "commands": {}, + "properties": {}, + "type": "Service Proxy", + "sourceModelUuid": "da7827a2-366d-4be6-8c68-a69153c61274", + "sourceModelInvariant": "24632e6b-584b-4f45-80d4-fefd75fd9f14", + "sourceModelName": "vDBE_Svc_vPRS" + } + } + }, + "groupingservicefortest..ResourceInstanceGroup..1": { + "type": "VnfGroup", + "invariantUuid": "a704112d-dbc6-4e56-8d4e-aec57e95ef9a", + "uuid": "c2b300e6-45de-4e5e-abda-3032bee2de56", + "version": "1", + "name": "groupingservicefortest..ResourceInstanceGroup..1", + "modelCustomizationName": "groupingservicefortest..ResourceInstanceGroup..1", + "properties": { + "ecomp_generated_naming": "true", + "contained_resource_type": "VF", + "role": "SERVICE-ACCESS", + "function": "SIGNALING", + "description": "DDD1", + "type": "LOAD-GROUP" + }, + "members": { + "tsbc0001vm001_svc_proxy 0": { + "uuid": "65fadfa8-a0d9-443f-95ad-836cd044e26c", + "invariantUuid": "f4baae0c-b3a5-4ca1-a777-afbffe7010bc", + "description": "A Proxy for Service tsbc0001vm001_Svc", + "name": "tsbc0001vm001_Svc Service Proxy", + "version": "1.0", + "customizationUuid": "3d814462-30fb-4c62-b997-9aa360d27ead", + "inputs": {}, + "commands": {}, + "properties": {}, + "type": "Service Proxy", + "sourceModelUuid": "28aeb8f6-5620-4148-8bfb-a5fb406f0309", + "sourceModelInvariant": "c989ab9a-33c7-46ec-b521-1b2daef5f047", + "sourceModelName": "tsbc0001vm001_Svc" + } + } + } + } + } + }, + "serviceInstance": { + "4117a0b6-e234-467d-b5b9-fe2f68c8b0fc": { + "existingVNFCounterMap": {}, + "existingVnfGroupCounterMap": { + "daeb6568-cef8-417f-9075-ed259ce59f48": 1, + "c2b300e6-45de-4e5e-abda-3032bee2de56": 0 + }, + "existingNetworksCounterMap": {}, + "vnfs": {}, + "vnfGroups": { + "groupingservicefortest..ResourceInstanceGroup..0": { + "inMaint": false, + "rollbackOnFailure": "true", + "originalName": "groupingservicefortest..ResourceInstanceGroup..0", + "isMissingData": false, + "trackById": "johjmxpmrlk", + "vnfGroupStoreKey": "groupingservicefortest..ResourceInstanceGroup..0", + "instanceName": "groupingservicefortestResourceInstanceGroup0", + "instanceParams": [ + {} + ], + "modelInfo": { + "modelInvariantId": "4bb2e27e-ddab-4790-9c6d-1f731bc14a45", + "modelVersionId": "daeb6568-cef8-417f-9075-ed259ce59f48", + "modelName": "groupingservicefortest..ResourceInstanceGroup..0", + "modelVersion": "1", + "modelCustomizationName": "groupingservicefortest..ResourceInstanceGroup..0", + "uuid": "daeb6568-cef8-417f-9075-ed259ce59f48" + }, + "uuid": "daeb6568-cef8-417f-9075-ed259ce59f48" + } + }, + "isEcompGeneratedNaming": false, + "existingNames": {} + } + } + } + } + } +} + +class MockFeatureFlagsService {} + +describe('VNF Group Control Generator', () => { + let injector; + let service: VnfGroupControlGenerator; + let httpMock: HttpTestingController; + + beforeAll(done => (async () => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + providers: [VnfGroupControlGenerator, + GenericFormService, + BasicControlGenerator, + AaiService, + FormBuilder, + LogService, + {provide:FeatureFlagsService, useClass: MockFeatureFlagsService}, + {provide: NgRedux, useClass: MockAppStore}] + }); + await TestBed.compileComponents(); + + injector = getTestBed(); + service = injector.get(VnfGroupControlGenerator); + httpMock = injector.get(HttpTestingController); + + })().then(done).catch(done.fail)); + + + + test('getMacroFormControls check for mandatory controls', () => { + const serviceId : string = "4117a0b6-e234-467d-b5b9-fe2f68c8b0fc"; + const vnfGroupName : string = "groupingservicefortest..ResourceInstanceGroup..0"; + const vnfGroupStoreKey : string = "groupingservicefortest..ResourceInstanceGroup..0"; + const controls :FormControlModel[] = service.getMacroFormControls(serviceId, vnfGroupStoreKey, vnfGroupName, []); + + const mandatoryControls : string[] = [ + FormControlNames.INSTANCE_NAME + ]; + + for(let i = 0 ; i < mandatoryControls.length ; i++){ + let requiredExist = controls.find(ctrl => ctrl.controlName === mandatoryControls[i]).validations.find(item => item.validatorName === 'required'); + expect(requiredExist).toBeDefined(); + } + }); + + test('getMacroFormControls should return the correct order of controls', () => { + const serviceId : string = "4117a0b6-e234-467d-b5b9-fe2f68c8b0fc"; + const vnfGroupName : string = "groupingservicefortest..ResourceInstanceGroup..0"; + const vnfGroupStoreKey : string = "groupingservicefortest..ResourceInstanceGroup..0"; + const controls :FormControlModel[] = service.getMacroFormControls(serviceId, vnfGroupStoreKey, vnfGroupName, []); + + const controlsOrderNames = [ + FormControlNames.INSTANCE_NAME, + 'rollbackOnFailure']; + + expect(controls.length).toEqual(1); + for(let i = 0 ; i < controls.length ; i++){ + expect(controls[i].controlName).toEqual(controlsOrderNames[i]); + } + }); + + test('getMacroFormControls check for mandatory controls when ecomp naming = true', () => { + const serviceId : string = "4117a0b6-e234-467d-b5b9-fe2f68c8b0fc"; + const vnfGroupName : string = "groupingservicefortest..ResourceInstanceGroup..1"; + const vnfGroupStoreKey : string = "groupingservicefortest..ResourceInstanceGroup..1"; + const controls :FormControlModel[] = service.getMacroFormControls(serviceId, vnfGroupStoreKey, vnfGroupName, []); + + let isOptional = controls.find(ctrl => ctrl.controlName === 'instanceName').validations.find(item => item.validatorName !== 'required'); + expect(isOptional).toBeTruthy(); + }); + + test('getAlacartFormControls should return the correct order of controls', () => { + const controls:FormControlModel[] = getALaCarteFormControls(); + + const controlsOrderNames = [ + FormControlNames.INSTANCE_NAME, + 'rollbackOnFailure']; + expect(controls.length).toEqual(2); + for(let i = 0 ; i < controls.length ; i++) { + expect(controls[i].controlName).toEqual(controlsOrderNames[i]); + } + }); + + + test('getAlacartFormControls check for mandatory controls', () => { + const controls:FormControlModel[] = getALaCarteFormControls(); + + const mandatoryControls : string[] = [ + FormControlNames.INSTANCE_NAME, + 'rollbackOnFailure' + ]; + for(let i = 0 ; i < mandatoryControls.length ; i++){ + let requiredExist = controls.find(ctrl => ctrl.controlName === mandatoryControls[i]).validations.find(item => item.validatorName === 'required'); + expect(requiredExist).toBeDefined(); + } + }); + + test('getAlacartFormControls with ecomp_naming true check for mandatory controls', () => { + const controls:FormControlModel[] = getALaCarteFormControls(); + + const mandatoryControls : string[] = [ + 'rollbackOnFailure' + ]; + for(let i = 0 ; i < mandatoryControls.length ; i++){ + let requiredExist = controls.find(ctrl => ctrl.controlName === mandatoryControls[i]).validations.find(item => item.validatorName === 'required'); + expect(requiredExist).toBeDefined(); + } + }); + + test('default instanceName', () => { + const serviceId : string = "4117a0b6-e234-467d-b5b9-fe2f68c8b0fc"; + const vnfGroupName : string = "groupingservicefortest..ResourceInstanceGroup..0"; + let result:FormControlModel = service.getInstanceName(null, serviceId, vnfGroupName, false); + expect(result.value).toEqual("groupingservicefortest..ResourceInstanceGroup..0"); + }); + + test('rollbackOnFailure', () => { + let result : Observable<SelectOption[]> = service.getRollBackOnFailureOptions(); + result.subscribe((val)=>{ + expect(val).toEqual([ + new SelectOption({id: 'true', name: 'Rollback'}), + new SelectOption({id: 'false', name: 'Don\'t Rollback'}) + ]); + }); + }); + + test('getAlacartFormControls instance name control validator shall have the expected regex', () => { + const controls:FormControlModel[] = getALaCarteFormControls(); + + const instanceNameControl: FormControlModel = <FormControlModel>controls.find(item => item.controlName === FormControlNames.INSTANCE_NAME); + const instanceNameValidator: ValidatorModel = instanceNameControl.validations.find(val => val.validatorName === ValidatorOptions.pattern); + expect(instanceNameValidator.validatorArg).toEqual(/^[a-zA-Z0-9._-]*$/); + }); + + function getALaCarteFormControls():FormControlModel[] { + const serviceId: string = "4117a0b6-e234-467d-b5b9-fe2f68c8b0fc"; + const vnfGroupName: string = "groupingservicefortest..ResourceInstanceGroup..0"; + const vnfGroupStoreKey: string = "groupingservicefortest..ResourceInstanceGroup..0"; + const controls: FormControlModel[] = service.getAlaCarteFormControls(serviceId, vnfGroupStoreKey, vnfGroupName, []); + return controls; + } +}); + diff --git a/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/vnfGroupGenerator/vnfGroup.control.generator.ts b/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/vnfGroupGenerator/vnfGroup.control.generator.ts new file mode 100644 index 000000000..e503f4d2a --- /dev/null +++ b/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/vnfGroupGenerator/vnfGroup.control.generator.ts @@ -0,0 +1,118 @@ +import {Injectable} from "@angular/core"; +import {AaiService} from "../../../../services/aaiService/aai.service"; +import {NgRedux} from "@angular-redux/store"; +import {BasicControlGenerator} from "../basic.control.generator"; +import { + FormControlModel, + ValidatorModel, + ValidatorOptions +} from "../../../../models/formControlModels/formControl.model"; +import {LogService} from "../../../../utils/log/log.service"; +import {AppState} from "../../../../store/reducers"; +import {DropdownFormControl} from "../../../../models/formControlModels/dropdownFormControl.model"; +import {FormControlType} from "../../../../models/formControlModels/formControlTypes.enum"; +import {SelectOption} from "../../../../models/selectOption"; +import {VnfGroupModel} from "../../../../models/vnfGroupModel"; +import * as _ from 'lodash'; +import {Observable, of} from "rxjs"; + + +export enum FormControlNames { + INSTANCE_NAME = 'instanceName', + ROLLBACK_ON_FAILURE = 'rollbackOnFailure', +} + +enum InputType { + ROLLBACK = "rollbackOnFailure" +} + +@Injectable() +export class VnfGroupControlGenerator { + aaiService: AaiService; + constructor(private _basicControlGenerator: BasicControlGenerator, + private store: NgRedux<AppState>, + private _aaiService: AaiService, + private _logService: LogService) { + this.aaiService = _aaiService; + } + + getVnfGroupInstance = (serviceId: string, vnfGroupStoreKey: string): any => { + let vnfGroupInstance = null; + if (this.store.getState().service.serviceInstance[serviceId] && _.has(this.store.getState().service.serviceInstance[serviceId].vnfGroups, vnfGroupStoreKey)) { + vnfGroupInstance = Object.assign({}, this.store.getState().service.serviceInstance[serviceId].vnfGroups[vnfGroupStoreKey]); + } + return vnfGroupInstance; + }; + + getMacroFormControls(serviceId: string, vnfGroupStoreKey: string, vnfGroupName: string, dynamicInputs?: Array<any>): Array<FormControlModel> { + vnfGroupStoreKey = _.isNil(vnfGroupStoreKey) ? vnfGroupName : vnfGroupStoreKey; + + if (_.isNil(serviceId) || _.isNil(vnfGroupStoreKey) || _.isNil(vnfGroupName)) { + this._logService.error('should provide serviceId, vnfGroupName, vnfGroupStoreKey', serviceId); + return []; + } + + const vnfGroupInstance = this.getVnfGroupInstance(serviceId, vnfGroupStoreKey); + const vnfGroupModel = new VnfGroupModel(this.store.getState().service.serviceHierarchy[serviceId].vnfGroups[vnfGroupName]); + let result: FormControlModel[] = []; + + if (!_.isNil(vnfGroupModel)) { + result.push(this.getInstanceName(vnfGroupInstance, serviceId, vnfGroupName, vnfGroupModel.isEcompGeneratedNaming)); + } + return result; + } + + getAlaCarteFormControls(serviceId: string, vnfGroupStoreKey: string, vnfGroupName: string, dynamicInputs?: any[]): FormControlModel[] { + vnfGroupStoreKey = _.isNil(vnfGroupStoreKey) ? vnfGroupName : vnfGroupStoreKey; + if (_.isNil(serviceId) || _.isNil(vnfGroupStoreKey) || _.isNil(vnfGroupName)) { + this._logService.error('should provide serviceId, vnfGroupName, vnfGroupStoreKey', serviceId); + return []; + } + + let result: FormControlModel[] = []; + const vnfGroupInstance = this.getVnfGroupInstance(serviceId, vnfGroupStoreKey); + const vnfGroupModel = new VnfGroupModel(this.store.getState().service.serviceHierarchy[serviceId].vnfGroups[vnfGroupName]); + + if (!_.isNil(vnfGroupModel)) { + result.push(this.getInstanceName(vnfGroupInstance, serviceId, vnfGroupName, vnfGroupModel.isEcompGeneratedNaming)); + result.push(this.getRollbackOnFailureControl(vnfGroupInstance, result)); + } + return result; + } + + isInputShouldBeShown = (inputType: any): boolean => { + let vnfGroupInputs = [InputType.ROLLBACK]; + return vnfGroupInputs.indexOf(inputType) > -1; + }; + + getDefaultInstanceName(instance : any, serviceId : string, vnfGroupName : string) : string { + const vnfGroupModel: VnfGroupModel = this.store.getState().service.serviceHierarchy[serviceId].vnfGroups[vnfGroupName]; + return this._basicControlGenerator.getDefaultInstanceName(instance, vnfGroupModel); + } + + getInstanceName(instance : any, serviceId : string, vnfGroupName : string, isEcompGeneratedNaming: boolean): FormControlModel { + const vnfGroupModel : VnfGroupModel = this.store.getState().service.serviceHierarchy[serviceId].vnfGroups[vnfGroupName]; + return this._basicControlGenerator.getInstanceNameController(instance, serviceId, isEcompGeneratedNaming, vnfGroupModel); + } + + getRollbackOnFailureControl = (instance: any, controls: FormControlModel[]): DropdownFormControl => { + return new DropdownFormControl({ + type: FormControlType.DROPDOWN, + controlName: FormControlNames.ROLLBACK_ON_FAILURE, + displayName: 'Rollback on failure', + dataTestId: 'rollback', + placeHolder: 'Rollback on failure', + isDisabled: false, + validations: [new ValidatorModel(ValidatorOptions.required, 'is required')], + value: instance ? instance.rollbackOnFailure : 'true', + onInit: this._basicControlGenerator.getSubscribeInitResult.bind(null, this.getRollBackOnFailureOptions) + }) + }; + + getRollBackOnFailureOptions = (): Observable<SelectOption[]> => { + return of([ + new SelectOption({id: 'true', name: 'Rollback'}), + new SelectOption({id: 'false', name: 'Don\'t Rollback'}) + ]); + }; +} diff --git a/vid-webpack-master/src/app/shared/components/genericForm/generic-form.component.html b/vid-webpack-master/src/app/shared/components/genericForm/generic-form.component.html new file mode 100644 index 000000000..d4c5118b3 --- /dev/null +++ b/vid-webpack-master/src/app/shared/components/genericForm/generic-form.component.html @@ -0,0 +1,29 @@ +<div id="form-details" *ngIf="formControls != null && dynamicFormGroup != null"> + <form [formGroup]="dynamicFormGroup"> + <div *ngFor="let formControl of formControls" class="form-conrtols"> + <div [ngSwitch]="formControl.type"> + <form-control-input *ngSwitchCase="'INPUT'" [data]="formControl" [form]="dynamicFormGroup"></form-control-input> + <checkbox-form-control *ngSwitchCase="'CHECKBOX'" [data]="formControl" [form]="dynamicFormGroup" ></checkbox-form-control> + <dropdown-form-control *ngSwitchCase="'DROPDOWN'" [data]="formControl" [form]="dynamicFormGroup" ></dropdown-form-control> + <file-form-control *ngSwitchCase="'FILE'" [data]="formControl" [form]="dynamicFormGroup"></file-form-control> + </div> + <div *ngIf="dynamicFormGroup != null && formControl != null && dynamicFormGroup.controls[formControl.controlName]?.errors"> + <div *ngFor="let validatorModel of formControl?.validations"> + <form-control-error *ngIf="validatorModel?.validatorName != 'required' && dynamicFormGroup.controls[formControl?.controlName]?.errors[validatorModel?.validatorName]" [message]="validatorModel?.errorMsg"></form-control-error> + </div> + </div> + </div> + <div *ngFor="let dynamicInputs of dynamicInputs" class="form-conrtols"> + <div [ngSwitch]="dynamicInputs.type"> + <form-control-input *ngSwitchCase="'INPUT'" [data]="dynamicInputs" [form]="dynamicFormGroup.controls['instanceParams']"></form-control-input> + <checkbox-form-control *ngSwitchCase="'CHECKBOX'" [data]="dynamicInputs" [form]="dynamicFormGroup.controls['instanceParams']" ></checkbox-form-control> + <dropdown-form-control *ngSwitchCase="'DROPDOWN'" [data]="dynamicInputs" [form]="dynamicFormGroup.controls['instanceParams']" ></dropdown-form-control> + </div> + <div *ngIf="dynamicFormGroup?.controls['instanceParams'] != null && dynamicInputs != null && dynamicFormGroup.controls['instanceParams'].controls[dynamicInputs.controlName]?.errors"> + <div *ngFor="let validatorModel of dynamicInputs?.validations"> + <form-control-error *ngIf="validatorModel?.validatorName != 'required' && dynamicFormGroup.controls['instanceParams'].controls[dynamicInputs?.controlName]?.errors[validatorModel?.validatorName]" [message]="validatorModel?.errorMsg"></form-control-error> + </div> + </div> + </div> + </form> +</div> diff --git a/vid-webpack-master/src/app/components/service-popup/service-instance-details/service-instance-details.scss b/vid-webpack-master/src/app/shared/components/genericForm/generic-form.component.scss index 928343d43..b8f26d8b3 100644 --- a/vid-webpack-master/src/app/components/service-popup/service-instance-details/service-instance-details.scss +++ b/vid-webpack-master/src/app/shared/components/genericForm/generic-form.component.scss @@ -1,4 +1,4 @@ -#service-instance-details { +#form-details { position: relative; #notification-area { @@ -51,14 +51,18 @@ .input-text { border: 1px solid #D2D2D2; border-radius: 2px; + color: black; } - .details-item { - margin-bottom: 20px; + .form-conrtols { + margin-top: 20px; + &:first-child{ + margin-top: 0px; + } } } - .checkbox-label { - font-family: OpenSans-Regular; - } + .checkbox-label { + font-family: OpenSans-Regular; + } } diff --git a/vid-webpack-master/src/app/shared/components/genericForm/generic-form.component.ts b/vid-webpack-master/src/app/shared/components/genericForm/generic-form.component.ts new file mode 100644 index 000000000..6febd66d6 --- /dev/null +++ b/vid-webpack-master/src/app/shared/components/genericForm/generic-form.component.ts @@ -0,0 +1,45 @@ +import {Component, EventEmitter, Input, OnChanges, Output, SimpleChanges} from '@angular/core'; +import {GenericFormService} from "./generic-form.service"; +import {FormControlModel} from "../../models/formControlModels/formControl.model"; +import {FormGroup} from "@angular/forms"; +import * as _ from 'lodash'; + +@Component({ + selector : 'generic-form', + templateUrl : './generic-form.component.html', + styleUrls : ['./generic-form.component.scss'] +}) + +export class GenericFormComponent implements OnChanges{ + genericFormService: GenericFormService = null; + dynamicFormGroup: FormGroup = null; + + @Input() formControls : FormControlModel[] = null; + @Input() dynamicInputs : FormControlModel[] = null; + @Input() isValidForm : boolean = false; + @Output() onFormChanged = new EventEmitter(); + + constructor(private _genericFormService: GenericFormService){ + this.genericFormService = _genericFormService; + } + + ngOnChanges(changes: SimpleChanges): void { + if (changes["formControls"] !== undefined && changes["formControls"].currentValue !== changes["formControls"].previousValue) { + this.dynamicFormGroup = this._genericFormService.generateFormBuilder(this.formControls, this.dynamicInputs); + this.onFormChanged.next(this.dynamicFormGroup); + this.dynamicFormGroup.valueChanges.subscribe(() => { + this.onFormChanged.next(this.dynamicFormGroup); + }) + } + } + + hasApiError(controlName: string, data: any[], form: FormGroup) { + if (!_.isNil(data)) { + if (!form.controls[controlName].disabled && data.length === 0) { + return true; + } + } + return false; + } +} + diff --git a/vid-webpack-master/src/app/shared/components/genericForm/generic-form.service.spec.ts b/vid-webpack-master/src/app/shared/components/genericForm/generic-form.service.spec.ts new file mode 100644 index 000000000..7a993cfa1 --- /dev/null +++ b/vid-webpack-master/src/app/shared/components/genericForm/generic-form.service.spec.ts @@ -0,0 +1,140 @@ + +import { TestBed, getTestBed} from '@angular/core/testing'; +import {HttpClientTestingModule, HttpTestingController} from '@angular/common/http/testing'; +import {GenericFormService} from './generic-form.service'; +import {FormBuilder, FormGroup} from '@angular/forms'; +import {FormControlModel, ValidatorModel, ValidatorOptions} from "../../models/formControlModels/formControl.model"; +import {FormControlType} from "../../models/formControlModels/formControlTypes.enum"; + +describe('Generic Form Service', () => { + + let injector; + let service: GenericFormService; + let httpMock: HttpTestingController; + let form : FormGroup; + let fb : FormBuilder; + + + beforeAll(done => (async () => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + providers: [GenericFormService, FormBuilder] + }); + await TestBed.compileComponents(); + + injector = getTestBed(); + service = injector.get(GenericFormService); + httpMock = injector.get(HttpTestingController); + fb = injector.get(FormBuilder); + + })().then(done).catch(done.fail)); + + let controls : FormControlModel[] = [ + generateFormControlModel(FormControlType.INPUT, 'InputControlName','Test Value', false, generateFormValidators([ValidatorOptions.required])), + generateFormControlModel(FormControlType.INPUT, 'InputControlName_1', 'Test InputControlName_1', true, generateFormValidators([ValidatorOptions.required])), + generateFormControlModel(FormControlType.INPUT, 'InputControlName_2', 'Test InputControlName_2', false, [generateFormValidatorWithArg(ValidatorOptions.minLength, 4)]), + generateFormControlModel(FormControlType.INPUT, 'InputControlName_3', 'Exact 14 chars', false, [generateFormValidatorWithArg(ValidatorOptions.maxLength, 14)]), + generateFormControlModel(FormControlType.INPUT, 'InputControlName_4', 'Test pattern', false, [generateFormValidatorWithArg(ValidatorOptions.pattern, '^[a-zA-Z]+$')]) + ]; + + describe('generateFormBuilder', ()=> { + test('validators should work correct', () => { + const controlName: string = 'InputControlName'; + let form : FormGroup = service.generateFormBuilder(controls, []); + + expect(form instanceof FormGroup).toBeTruthy(); + expect(form.controls[controlName]).toBeDefined(); + expect(form.controls[controlName].value).toEqual('Test Value'); + expect(form.controls[controlName].disabled).toBeFalsy(); + expect(form.controls[controlName].valid).toBeTruthy(); + expect(form.controls[controlName].errors).toBeNull(); + + form.controls[controlName].setValue(''); + expect(form.controls[controlName].valid).toBeFalsy(); + expect(form.controls[controlName].errors.required).toBeTruthy(); + }); + + test('validators should prevent the value to appear', () => { + const controlName: string = 'InputControlName_1'; + let form : FormGroup = service.generateFormBuilder(controls, []); + + expect(form instanceof FormGroup).toBeTruthy(); + expect(form.controls[controlName]).toBeDefined(); + expect(form.controls[controlName].disabled).toBeTruthy(); + expect(form.controls[controlName].value).toEqual('Test InputControlName_1'); + expect(form.controls[controlName].errors).toBeNull(); + }); + + test('validators with minimum length args', () => { + const controlName: string = 'InputControlName_2'; + let form : FormGroup = service.generateFormBuilder(controls, []); + + expect(form instanceof FormGroup).toBeTruthy(); + expect(form.controls[controlName]).toBeDefined(); + expect(form.controls[controlName].disabled).toBeFalsy(); + expect(form.controls[controlName].value).toEqual('Test InputControlName_2'); + expect(form.controls[controlName].errors).toBeNull(); + + form.controls[controlName].setValue('123'); // less then 4 characters. -> error + expect(form.controls[controlName].errors.minlength).toBeDefined(); + form.controls[controlName].setValue('1234'); + expect(form.controls[controlName].errors).toBeNull(); + }); + + test('validators with maximum length args', () => { + const controlName: string = 'InputControlName_3'; + let form : FormGroup = service.generateFormBuilder(controls, []); + + expect(form instanceof FormGroup).toBeTruthy(); + expect(form.controls[controlName]).toBeDefined(); + expect(form.controls[controlName].disabled).toBeFalsy(); + expect(form.controls[controlName].value).toEqual('Exact 14 chars'); + expect(form.controls[controlName].errors).toBeNull(); + + form.controls[controlName].setValue('More than max length'); // more than max characters. -> error + expect(form.controls[controlName].errors.maxlength).toBeDefined(); + form.controls[controlName].setValue('Exact 14 chars'); + expect(form.controls[controlName].errors).toBeNull(); + }); + + test('pattern validator letters only', () => { + const controlName: string = 'InputControlName_4'; + let form : FormGroup = service.generateFormBuilder(controls, []); + + + expect(form.controls[controlName].errors.pattern).toBeDefined(); + form.controls[controlName].setValue('AAAAAAAA'); + expect(form.controls[controlName].errors).toBeNull(); + }); + }); + + + + function generateFormValidators(validatorsNames :ValidatorOptions[]){ + let validators : ValidatorModel[] = []; + for(let validatorName of validatorsNames){ + validators.push(new ValidatorModel(validatorName, 'error ' + validatorName)); + } + return validators; + } + + function generateFormValidatorWithArg(validatorName :ValidatorOptions, arg : any){ + return new ValidatorModel(validatorName, 'error ' + validatorName, arg); + } + + function generateFormControlModel(type : FormControlType, + controlName: string, + value: any, + isDisabled: boolean, + validations: ValidatorModel[]){ + let data : any = { + type : type, + isDisabled : isDisabled, + validations : validations, + value : value, + controlName :controlName + }; + + return new FormControlModel(data); + } +}); diff --git a/vid-webpack-master/src/app/shared/components/genericForm/generic-form.service.ts b/vid-webpack-master/src/app/shared/components/genericForm/generic-form.service.ts new file mode 100644 index 000000000..15089cafe --- /dev/null +++ b/vid-webpack-master/src/app/shared/components/genericForm/generic-form.service.ts @@ -0,0 +1,54 @@ +import {Injectable} from '@angular/core'; +import {FormBuilder, FormControl, FormGroup, Validators} from '@angular/forms'; +import {FormControlModel} from "../../models/formControlModels/formControl.model"; +import * as _ from 'lodash'; + +@Injectable() +export class GenericFormService { + constructor(private _formBuilder: FormBuilder){} + + generateFormBuilder(controls : FormControlModel[], dynamicInputs : FormControlModel[]) : FormGroup { + let controlsList = {}; + if(!_.isNil(controls)){ + for(let control of controls){ + controlsList[control.controlName] = new FormControl( + { + value: _.isNil(control.value) ? null :control.value, + disabled: control.isDisabled + }, Validators.compose(control.validations.map(item => item.validator))); + } + } + + if(!_.isNil(dynamicInputs)){ + let dynamicControlsList = {}; + if(!_.isNil(dynamicInputs)){ + for(let control of dynamicInputs){ + dynamicControlsList[control.controlName] = new FormControl( + { + value: control.value ? control.value : null, + disabled: control.isDisabled + }, Validators.compose(control.validations.map(item => item.validator))); + } + } + controlsList['instanceParams'] = this._formBuilder.group(dynamicControlsList); + } + + + return this._formBuilder.group(controlsList); + } + + shouldDisplayValidationError(form: FormGroup, controlName : string): boolean{ + if(!_.isNil(form) && !_.isNil(form.controls[controlName])){ + if(!form.controls[controlName].touched){ + return false; + } else if(form.controls[controlName].disabled) { + return false + }else if(_.isNil(form.controls[controlName].errors)){ + return false; + }else { + return true; + } + } + return false; + } +} diff --git a/vid-webpack-master/src/app/shared/components/genericFormPopup/generic-form-popup.component.html b/vid-webpack-master/src/app/shared/components/genericFormPopup/generic-form-popup.component.html new file mode 100644 index 000000000..57064f658 --- /dev/null +++ b/vid-webpack-master/src/app/shared/components/genericFormPopup/generic-form-popup.component.html @@ -0,0 +1,70 @@ +<div id="instance-popup" class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" + class="close" + (click)="formPopupDetails?.onCancel(formPopupDetails.that,dynamicForm)" >× + </button> + <span [attr.data-tests-id]="'create-modal-title'" + class="modal-title">{{formPopupDetails?.title}} + </span> + </div> + <div class="modal-body popup-content"> + + <div class="header-left"> + <div>MODEL: <span>"{{formPopupDetails?.leftSubTitle}}"</span></div> + </div> + + <div class="header-right"> + {{formPopupDetails?.rightSubTitle}} + </div> + + + <label class="quantity-label" *ngIf="formPopupDetails?.UUIDData['type'] == 'service'">Qty:</label> + <div class="quantity" *ngIf="formPopupDetails?.UUIDData['type'] == 'service'"> + <select [disabled]="formPopupDetails?.UUIDData['isMacro'] !== true" + class="quantity-select" + [(ngModel)]="formPopupDetails.UUIDData['bulkSize']" + name="quantity" + id="quantity-select" + required> + <option *ngFor="let qty of quantityOptions" [value]="qty">{{qty}}</option> + </select> + </div> + + <div class="model-information"> + <model-information [modelInformationItems]="formPopupDetails?.modelInformationItems"></model-information> + </div> + + <div class="instance-form"> + <div style="position: relative;height: 100%;overflow: auto;"> + <label id="notification-area" *ngIf="shouldShowNotification() == true" style="color: #959595;font-size: 12px;left: 30px;margin-left: 30px;">Data entered will apply to all service instances</label> + <generic-form [formControls]="formPopupDetails?.formControlList" + [dynamicInputs]="formPopupDetails?.dynamicInputsControlList" + (onFormChanged)="dynamicForm = $event" ></generic-form> + </div> + </div> + + </div> + <div class="modal-footer row" style="padding: 0"> + <div class="col-md-6"> + <div *ngIf="hasSomeError(formPopupDetails, dynamicForm) == true"> + <form-general-error [message]="errorMsg"></form-general-error> + </div> + </div> + <div class="col-md-6" style="padding: 15px;padding-right: 35px;"> + <button + [attr.data-tests-id]="'cancelButton'" + type="button" class="btn btn-default cancel" + (click)="formPopupDetails.onCancel(formPopupDetails.that, dynamicForm)"><span>Cancel</span></button> + + <input type="submit" + value="Set" + data-tests-id="form-set" + class="btn btn-success submit" + [disabled]="!dynamicForm?.valid" + (click)="formPopupDetails.onSubmit(formPopupDetails.that, dynamicForm, servicesQty)"> + </div> + </div> + </div> +</div> diff --git a/vid-webpack-master/src/app/components/vnf-popup/vnf-popup.scss b/vid-webpack-master/src/app/shared/components/genericFormPopup/generic-form-popup.component.scss index 6e606dbb9..5057b44a5 100644 --- a/vid-webpack-master/src/app/components/vnf-popup/vnf-popup.scss +++ b/vid-webpack-master/src/app/shared/components/genericFormPopup/generic-form-popup.component.scss @@ -37,54 +37,51 @@ $grid-border: 1px #d2d2d2 solid; grid-area: header-right; @extend .header-text; - border-bottom: $grid-border; } .quantity-label { grid-area: quantity-label; @extend .header-common; - border-bottom: $grid-border; height: 100%; font-family: OpenSans-Regular; } - .quantity { grid-area: quantity; border-left: $grid-border; - border-bottom: $grid-border; border-top-style: none; font-family: OpenSans-Semibold; text-align: start; text-indent: 10px; + .quantity-select { + width: 78px; + height: 100%; + border: 0; + background: white; + outline: none; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + background: url('../../../../assets/img/chevron.svg') 0 0 no-repeat; + background-size: 24px; + background-position-x: right; + background-position-y: center; + } } - .quantity-select { - width: 78px; - height: 100%; - border: 0; - background: white; - outline: none; - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; - background: url('../../../assets/img/chevron.svg') 0 0 no-repeat; - background-size: 24px; - background-position-x: right; - background-position-y: center; - } input[type="number"]:hover::-webkit-inner-spin-button { height: 20px; } .model-information { grid-area: model-information; - + border-top: $grid-border; padding: 30px; overflow: auto; @extend .left-panel; } .instance-form { + border-top: $grid-border; grid-area: instance-form; } @@ -93,7 +90,7 @@ $grid-border: 1px #d2d2d2 solid; grid-template-columns: 400px auto 30px 93px; grid-template-rows: 50px calc(100vh - 180px); grid-template-areas: - "header-left header-right header-right header-right" + "header-left header-right quantity-label quantity" "model-information instance-form instance-form instance-form"; padding: 0; } diff --git a/vid-webpack-master/src/app/shared/components/genericFormPopup/generic-form-popup.component.ts b/vid-webpack-master/src/app/shared/components/genericFormPopup/generic-form-popup.component.ts new file mode 100644 index 000000000..2b6417e33 --- /dev/null +++ b/vid-webpack-master/src/app/shared/components/genericFormPopup/generic-form-popup.component.ts @@ -0,0 +1,145 @@ +import {Component, OnChanges, OnDestroy, OnInit} from '@angular/core'; +import {FormPopupDetails} from "../../models/formControlModels/formPopupDetails.model"; +import {DialogComponent, DialogService} from "ng2-bootstrap-modal"; +import {FormGroup} from "@angular/forms"; +import {IframeService} from "../../utils/iframe.service"; +import {ITreeNode} from "angular-tree-component/dist/defs/api"; +import * as _ from "lodash"; +import {NgRedux} from "@angular-redux/store"; +import {AppState} from "../../store/reducers"; +import {ServicePopupService} from "./genericFormServices/service/service.popup.service"; +import {ActivatedRoute} from "@angular/router"; +import {AaiService} from "../../services/aaiService/aai.service"; +import {GenericFormPopupService} from "./generic-form-popup.service"; +import {FormControlModel} from "../../models/formControlModels/formControl.model"; +import {FormGeneralErrorsService} from "../formGeneralErrors/formGeneralErrors.service"; + + +export interface PopupModel { + type : PopupType; + uuidData : UUIDData; + node : ITreeNode; + isUpdateMode : boolean; +} + +export enum PopupType{ + SERVICE = 'service', + VNF = 'vnf', + NETWORK = 'network', + VF_MODULE = 'vf_module', + VNF_GROUP = 'vnf_group' +} + + +@Component({ + selector : 'generic-form-popup', + templateUrl : 'generic-form-popup.component.html', + styleUrls : ['generic-form-popup.component.scss'] +}) + +export class GenericFormPopupComponent extends DialogComponent<PopupModel, boolean> implements OnInit, OnDestroy{ + formPopupDetails : FormPopupDetails = null; + dynamicForm : FormGroup; + type : PopupType; + uuidData : UUIDData; + isUpdateMode : boolean; + node : ITreeNode = null; + hasGeneralApiError : boolean = false; + parentElementClassName = 'content'; + errorMsg = 'Page contains errors. Please see details next to the relevant fields.'; + + servicesQty = 1; + quantityOptions = _.range(1, 51) + constructor(dialogService: DialogService , + private _iframeService : IframeService, + private _store: NgRedux<AppState>, + private _servicePopupService : ServicePopupService, + private _activatedRoute : ActivatedRoute, + private _aaiService : AaiService, + private _route: ActivatedRoute, + private _genericFormPopupService : GenericFormPopupService){ + super(dialogService); + } + + closeDialog(that) : void{ + this._iframeService.removeClassCloseModal(that.parentElementClassName); + this.dialogService.removeDialog(this); + setTimeout(() => { + window.parent.postMessage("closeIframe", "*"); + }, 15); + } + + shouldShowNotification() : boolean { + return this.formPopupDetails && this.formPopupDetails.UUIDData['bulkSize'] > 1 + } + + ngOnInit(): void { + this._route + .queryParams + .subscribe(params => { + console.log('changed'); + if(params['serviceModelId'] && params['isCreate']=="true"){ + this._genericFormPopupService.initReduxOnCreateNewService().then((serviceModelId : string)=>{ + this.uuidData = <any>{ + bulkSize : 1, + isMacro : this._store.getState().service.serviceHierarchy[serviceModelId].service.instantiationType === 'Macro', + type : PopupType.SERVICE, + serviceId: serviceModelId, + popupService: this._servicePopupService, + }; + + this.uuidData.popupService.closeDialogEvent.subscribe((that)=>{ + this.closeDialog(that); + }); + + this.formPopupDetails = this.uuidData.popupService.getGenericFormPopupDetails( + this.uuidData['serviceId'], + null, + null, + this.node, + this.uuidData, + false + ); + }); + } + }); + + FormGeneralErrorsService.checkForErrorTrigger.subscribe(()=>{ + this.hasSomeError(this.formPopupDetails, this.dynamicForm); + }); + + if(!_.isNil(this.uuidData)){ + this.uuidData.popupService.closeDialogEvent.subscribe((that)=>{ + this.closeDialog(that); + }); + + this.uuidData['isMacro'] = this._store.getState().service.serviceHierarchy[this.uuidData['serviceId']].service.instantiationType === 'Macro'; + this.formPopupDetails = this._genericFormPopupService.getGenericFormDetails(this.uuidData, this.node, this.isUpdateMode); + } + } + + hasSomeError(formPopupDetails : FormPopupDetails, form : FormGroup) : boolean{ + if(_.isNil(formPopupDetails)) return false; + else { + for(let controlName in form.controls){ + if(form.controls[controlName].errors){ + let error: string[] = Object.keys(form.controls[controlName].errors); + if(error.length === 1 && error[0] === 'required'){ + continue; + }else if(Object.keys(form.controls[controlName].errors).length > 0 ){ + return true; + } + } + } + } + + return formPopupDetails.formControlList.filter((item : FormControlModel) =>item.type === 'DROPDOWN' && item['hasEmptyOptions']).length > 0 + } +} + + +export class UUIDData extends Object{ + type : string; + popupService : any; +} + diff --git a/vid-webpack-master/src/app/shared/components/genericFormPopup/generic-form-popup.service.spec.ts b/vid-webpack-master/src/app/shared/components/genericFormPopup/generic-form-popup.service.spec.ts new file mode 100644 index 000000000..02e545569 --- /dev/null +++ b/vid-webpack-master/src/app/shared/components/genericFormPopup/generic-form-popup.service.spec.ts @@ -0,0 +1,1938 @@ +import {getTestBed, TestBed} from '@angular/core/testing'; +import {HttpClientTestingModule, HttpTestingController} from '@angular/common/http/testing'; +import {FormBuilder, FormGroup} from '@angular/forms'; +import {GenericFormPopupService} from "./generic-form-popup.service"; +import {IframeService} from "../../utils/iframe.service"; +import {NgRedux} from "@angular-redux/store"; +import {ServicePopupService} from "./genericFormServices/service/service.popup.service"; +import {BasicControlGenerator} from "../genericForm/formControlsServices/basic.control.generator"; +import {AaiService} from "../../services/aaiService/aai.service"; +import {ServiceControlGenerator} from "../genericForm/formControlsServices/service.control.generator"; +import {GenericFormService} from "../genericForm/generic-form.service"; +import {LogService} from "../../utils/log/log.service"; +import {DefaultDataGeneratorService} from "../../services/defaultDataServiceGenerator/default.data.generator.service"; +import {BasicPopupService} from "./genericFormServices/basic.popup.service"; +import {ActivatedRoute} from "@angular/router"; +import {UUIDData} from "./generic-form-popup.component"; +import {ITreeNode} from "angular-tree-component/dist/defs/api"; +import {NetworkPopupService} from "./genericFormServices/network/network.popup.service"; +import {NetworkControlGenerator} from "../genericForm/formControlsServices/networkGenerator/network.control.generator"; +import {VfModulePopuopService} from "./genericFormServices/vfModule/vfModule.popuop.service"; +import {VfModuleControlGenerator} from "../genericForm/formControlsServices/vfModuleGenerator/vfModule.control.generator"; +import {FeatureFlagsService} from "../../services/featureFlag/feature-flags.service"; + +class MockAppStore<T>{ + getState() { + return { + "global": { + "name": null, + "flags": { + "FLAG_NETWORK_TO_ASYNC_INSTANTIATION": false, + "FLAG_SHOW_ASSIGNMENTS": true, + "FLAG_FABRIC_CONFIGURATION_ASSIGNMENTS": true, + "FLAG_UNASSIGN_SERVICE": true, + "FLAG_SHOW_VERIFY_SERVICE": false, + "FLAG_COLLECTION_RESOURCE_SUPPORT": true, + "FLAG_DUPLICATE_VNF": true, + "FLAG_SERVICE_MODEL_CACHE": true, + "CREATE_INSTANCE_TEST": false, + "FLAG_SETTING_DEFAULTS_IN_DRAWING_BOARD": false, + "FLAG_ASYNC_INSTANTIATION": true, + "FLAG_ASYNC_JOBS": true, + "EMPTY_DRAWING_BOARD_TEST": false, + "FLAG_ADD_MSO_TESTAPI_FIELD": true + }, + "type": "[FLAGS] Update" + }, + "service": { + "serviceHierarchy": { + "6e59c5de-f052-46fa-aa7e-2fca9d674c44": { + "service": { + "uuid": "6e59c5de-f052-46fa-aa7e-2fca9d674c44", + "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0", + "name": "ComplexService", + "version": "1.0", + "toscaModelURL": null, + "category": "Emanuel", + "serviceType": "", + "serviceRole": "", + "description": "ComplexService", + "serviceEcompNaming": "false", + "instantiationType": "Macro", + "inputs": {} + }, + "vnfs": { + "VF_vMee 0": { + "uuid": "d6557200-ecf2-4641-8094-5393ae3aae60", + "invariantUuid": "4160458e-f648-4b30-a176-43881ffffe9e", + "description": "VSP_vMee", + "name": "VF_vMee", + "version": "2.0", + "customizationUuid": "91415b44-753d-494c-926a-456a9172bbb9", + "inputs": {}, + "commands": {}, + "serviceEcompNaming" : "true", + "properties": { + "ecomp_generated_naming": "false", + "max_instances": 10, + "min_instances": 1, + "gpb2_Internal2_mac": "00:11:22:EF:AC:DF", + "sctp-b-ipv6-egress_src_start_port": "0", + "sctp-a-ipv6-egress_rule_application": "any", + "Internal2_allow_transit": "true", + "sctp-b-IPv6_ethertype": "IPv6", + "sctp-a-egress_rule_application": "any", + "sctp-b-ingress_action": "pass", + "sctp-b-ingress_rule_protocol": "icmp", + "ncb2_Internal1_mac": "00:11:22:EF:AC:DF", + "sctp-b-ipv6-ingress-src_start_port": "0.0", + "ncb1_Internal2_mac": "00:11:22:EF:AC:DF", + "fsb_volume_size_0": "320.0", + "sctp-b-egress_src_addresses": "local", + "sctp-a-ipv6-ingress_ethertype": "IPv4", + "sctp-a-ipv6-ingress-dst_start_port": "0", + "sctp-b-ipv6-ingress_rule_application": "any", + "domain_name": "default-domain", + "sctp-a-ingress_rule_protocol": "icmp", + "sctp-b-egress-src_start_port": "0.0", + "sctp-a-egress_src_addresses": "local", + "sctp-b-display_name": "epc-sctp-b-ipv4v6-sec-group", + "sctp-a-egress-src_start_port": "0.0", + "sctp-a-ingress_ethertype": "IPv4", + "sctp-b-ipv6-ingress-dst_end_port": "65535", + "sctp-b-dst_subnet_prefix_v6": "::", + "nf_naming": "{ecomp_generated_naming=true}", + "sctp-a-ipv6-ingress_src_subnet_prefix": "0.0.0.0", + "sctp-b-egress-dst_start_port": "0.0", + "ncb_flavor_name": "nv.c20r64d1", + "gpb1_Internal1_mac": "00:11:22:EF:AC:DF", + "sctp-b-egress_dst_subnet_prefix_len": "0.0", + "Internal2_net_cidr": "10.0.0.10", + "sctp-a-ingress-dst_start_port": "0.0", + "sctp-a-egress-dst_start_port": "0.0", + "fsb1_Internal2_mac": "00:11:22:EF:AC:DF", + "sctp-a-egress_ethertype": "IPv4", + "vlc_st_service_mode": "in-network-nat", + "sctp-a-ipv6-egress_ethertype": "IPv4", + "sctp-a-egress-src_end_port": "65535.0", + "sctp-b-ipv6-egress_rule_application": "any", + "sctp-b-egress_action": "pass", + "sctp-a-ingress-src_subnet_prefix_len": "0.0", + "sctp-b-ipv6-ingress-src_end_port": "65535.0", + "sctp-b-name": "epc-sctp-b-ipv4v6-sec-group", + "fsb2_Internal1_mac": "00:11:22:EF:AC:DF", + "sctp-a-ipv6-ingress-src_start_port": "0.0", + "sctp-b-ipv6-egress_ethertype": "IPv4", + "Internal1_net_cidr": "10.0.0.10", + "sctp-a-egress_dst_subnet_prefix": "0.0.0.0", + "fsb_flavor_name": "nv.c20r64d1", + "sctp_rule_protocol": "132", + "sctp-b-ipv6-ingress_src_subnet_prefix_len": "0", + "sctp-a-ipv6-ingress_rule_application": "any", + "sctp-a-IPv6_ethertype": "IPv6", + "vlc2_Internal1_mac": "00:11:22:EF:AC:DF", + "vlc_st_virtualization_type": "virtual-machine", + "sctp-b-ingress-dst_start_port": "0.0", + "sctp-b-ingress-dst_end_port": "65535.0", + "sctp-a-ipv6-ingress-src_end_port": "65535.0", + "sctp-a-display_name": "epc-sctp-a-ipv4v6-sec-group", + "sctp-b-ingress_rule_application": "any", + "int2_sec_group_name": "int2-sec-group", + "vlc_flavor_name": "nd.c16r64d1", + "sctp-b-ipv6-egress_src_addresses": "local", + "vlc_st_interface_type_int1": "other1", + "sctp-b-egress-src_end_port": "65535.0", + "sctp-a-ipv6-egress-dst_start_port": "0", + "vlc_st_interface_type_int2": "other2", + "sctp-a-ipv6-egress_rule_protocol": "any", + "Internal2_shared": "false", + "sctp-a-ipv6-egress_dst_subnet_prefix_len": "0", + "Internal2_rpf": "disable", + "vlc1_Internal1_mac": "00:11:22:EF:AC:DF", + "sctp-b-ipv6-egress_src_end_port": "65535", + "sctp-a-ipv6-egress_src_addresses": "local", + "sctp-a-ingress-dst_end_port": "65535.0", + "sctp-a-ipv6-egress_src_end_port": "65535", + "Internal1_forwarding_mode": "l2", + "Internal2_dhcp": "false", + "sctp-a-dst_subnet_prefix_v6": "::", + "pxe_image_name": "MME_PXE-Boot_16ACP04_GA.qcow2", + "vlc_st_interface_type_gtp": "other0", + "ncb1_Internal1_mac": "00:11:22:EF:AC:DF", + "sctp-b-src_subnet_prefix_v6": "::", + "sctp-a-egress_dst_subnet_prefix_len": "0.0", + "int1_sec_group_name": "int1-sec-group", + "Internal1_dhcp": "false", + "sctp-a-ipv6-egress_dst_end_port": "65535", + "Internal2_forwarding_mode": "l2", + "fsb2_Internal2_mac": "00:11:22:EF:AC:DF", + "sctp-b-egress_dst_subnet_prefix": "0.0.0.0", + "Internal1_net_cidr_len": "17", + "gpb2_Internal1_mac": "00:11:22:EF:AC:DF", + "sctp-b-ingress-src_subnet_prefix_len": "0.0", + "sctp-a-ingress_dst_addresses": "local", + "sctp-a-egress_action": "pass", + "fsb_volume_type_0": "SF-Default-SSD", + "ncb2_Internal2_mac": "00:11:22:EF:AC:DF", + "vlc_st_interface_type_sctp_a": "left", + "vlc_st_interface_type_sctp_b": "right", + "sctp-a-src_subnet_prefix_v6": "::", + "vlc_st_version": "2", + "sctp-b-egress_ethertype": "IPv4", + "sctp-a-ingress_rule_application": "any", + "gpb1_Internal2_mac": "00:11:22:EF:AC:DF", + "instance_ip_family_v6": "v6", + "sctp-a-ipv6-egress_src_start_port": "0", + "sctp-b-ingress-src_start_port": "0.0", + "sctp-b-ingress_dst_addresses": "local", + "fsb1_Internal1_mac": "00:11:22:EF:AC:DF", + "vlc_st_interface_type_oam": "management", + "multi_stage_design": "true", + "oam_sec_group_name": "oam-sec-group", + "Internal2_net_gateway": "10.0.0.10", + "sctp-a-ipv6-ingress-dst_end_port": "65535", + "sctp-b-ipv6-egress-dst_start_port": "0", + "Internal1_net_gateway": "10.0.0.10", + "sctp-b-ipv6-egress_rule_protocol": "any", + "gtp_sec_group_name": "gtp-sec-group", + "sctp-a-ipv6-egress_dst_subnet_prefix": "0.0.0.0", + "sctp-b-ipv6-egress_dst_subnet_prefix_len": "0", + "sctp-a-ipv6-ingress_dst_addresses": "local", + "sctp-a-egress_rule_protocol": "icmp", + "sctp-b-ipv6-egress_action": "pass", + "sctp-a-ipv6-egress_action": "pass", + "Internal1_shared": "false", + "sctp-b-ipv6-ingress_rule_protocol": "any", + "Internal2_net_cidr_len": "17", + "sctp-a-name": "epc-sctp-a-ipv4v6-sec-group", + "sctp-a-ingress-src_end_port": "65535.0", + "sctp-b-ipv6-ingress_src_subnet_prefix": "0.0.0.0", + "sctp-a-egress-dst_end_port": "65535.0", + "sctp-a-ingress_action": "pass", + "sctp-b-egress_rule_protocol": "icmp", + "sctp-b-ipv6-ingress_action": "pass", + "vlc_st_service_type": "firewall", + "sctp-b-ipv6-egress_dst_end_port": "65535", + "sctp-b-ipv6-ingress-dst_start_port": "0", + "vlc2_Internal2_mac": "00:11:22:EF:AC:DF", + "vlc_st_availability_zone": "true", + "fsb_volume_image_name_1": "MME_FSB2_16ACP04_GA.qcow2", + "sctp-b-ingress-src_subnet_prefix": "0.0.0.0", + "sctp-a-ipv6-ingress_src_subnet_prefix_len": "0", + "Internal1_allow_transit": "true", + "gpb_flavor_name": "nv.c20r64d1", + "availability_zone_max_count": "1", + "fsb_volume_image_name_0": "MME_FSB1_16ACP04_GA.qcow2", + "sctp-b-ipv6-ingress_dst_addresses": "local", + "sctp-b-ipv6-egress_dst_subnet_prefix": "0.0.0.0", + "sctp-b-ipv6-ingress_ethertype": "IPv4", + "vlc1_Internal2_mac": "00:11:22:EF:AC:DF", + "sctp-a-ingress-src_subnet_prefix": "0.0.0.0", + "sctp-a-ipv6-ingress_action": "pass", + "Internal1_rpf": "disable", + "sctp-b-ingress_ethertype": "IPv4", + "sctp-b-egress_rule_application": "any", + "sctp-b-ingress-src_end_port": "65535.0", + "sctp-a-ipv6-ingress_rule_protocol": "any", + "sctp-a-ingress-src_start_port": "0.0", + "sctp-b-egress-dst_end_port": "65535.0" + }, + "type": "VF", + "modelCustomizationName": "VF_vMee 0", + "vfModules": { + "vf_vmee0..VfVmee..vmme_vlc..module-1": { + "uuid": "522159d5-d6e0-4c2a-aa44-5a542a12a830", + "invariantUuid": "98a7c88b-b577-476a-90e4-e25a5871e02b", + "customizationUuid": "55b1be94-671a-403e-a26c-667e9c47d091", + "description": null, + "name": "VfVmee..vmme_vlc..module-1", + "version": "2", + "modelCustomizationName": "VfVmee..vmme_vlc..module-1", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "vmme_vlc" + }, + "inputs": {}, + "volumeGroupAllowed": true + }, + "vf_vmee0..VfVmee..vmme_gpb..module-2": { + "uuid": "41708296-e443-4c71-953f-d9a010f059e1", + "invariantUuid": "1cca90b8-3490-495e-87da-3f3e4c57d5b9", + "customizationUuid": "6add59e0-7fe1-4bc4-af48-f8812422ae7c", + "description": null, + "name": "VfVmee..vmme_gpb..module-2", + "version": "2", + "modelCustomizationName": "VfVmee..vmme_gpb..module-2", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "vmme_gpb" + }, + "inputs": {}, + "volumeGroupAllowed": false + }, + "vf_vmee0..VfVmee..base_vmme..module-0": { + "uuid": "a27f5cfc-7f12-4f99-af08-0af9c3885c87", + "invariantUuid": "a6f9e51a-2b35-416a-ae15-15e58d61f36d", + "customizationUuid": "f8c040f1-7e51-4a11-aca8-acf256cfd861", + "description": null, + "name": "VfVmee..base_vmme..module-0", + "version": "2", + "modelCustomizationName": "VfVmee..base_vmme..module-0", + "properties": { + "minCountInstances": 1, + "maxCountInstances": 1, + "initialCount": 1, + "vfModuleLabel": "base_vmme" + }, + "inputs": {}, + "volumeGroupAllowed": true + } + }, + "volumeGroups": { + "vf_vmee0..VfVmee..base_vmme..module-0": { + "uuid": "a27f5cfc-7f12-4f99-af08-0af9c3885c87", + "invariantUuid": "a6f9e51a-2b35-416a-ae15-15e58d61f36d", + "customizationUuid": "f8c040f1-7e51-4a11-aca8-acf256cfd861", + "description": null, + "name": "VfVmee..base_vmme..module-0", + "version": "2", + "modelCustomizationName": "VfVmee..base_vmme..module-0", + "properties": { + "minCountInstances": 1, + "maxCountInstances": 1, + "initialCount": 1, + "vfModuleLabel": "base_vmme" + }, + "inputs": {} + } + }, + "vfcInstanceGroups": {} + } + }, + "networks": { + "ExtVL 0": { + "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986", + "invariantUuid": "379f816b-a7aa-422f-be30-17114ff50b7c", + "description": "ECOMP generic virtual link (network) base type for all other service-level and global networks", + "name": "ExtVL", + "version": "37.0", + "customizationUuid": "94fdd893-4a36-4d70-b16a-ec29c54c184f", + "inputs": {}, + "commands": {}, + "properties": { + "ecomp_generated_naming": "false", + "network_assignments": "{is_external_network=false, ipv4_subnet_default_assignment={min_subnets_count=1}, ecomp_generated_network_assignment=false, ipv6_subnet_default_assignment={min_subnets_count=1}}", + "exVL_naming": "{ecomp_generated_naming=true}", + "network_flows": "{is_network_policy=false, is_bound_to_vpn=false}", + "network_homing": "{ecomp_selected_instance_node_target=false}" + }, + "type": "VL", + "modelCustomizationName": "ExtVL 0" + } + }, + "collectionResource": {}, + "configurations": { + "Port Mirroring Configuration By Policy 0": { + "uuid": "b4398538-e89d-4f13-b33d-ca323434ba50", + "invariantUuid": "6ef0ca40-f366-4897-951f-abd65d25f6f7", + "description": "A port mirroring configuration by policy object", + "name": "Port Mirroring Configuration By Policy", + "version": "27.0", + "customizationUuid": "3c3b7b8d-8669-4b3b-8664-61970041fad2", + "inputs": {}, + "commands": {}, + "properties": {}, + "type": "Configuration", + "modelCustomizationName": "Port Mirroring Configuration By Policy 0", + "sourceNodes": [], + "collectorNodes": null, + "configurationByPolicy": false + } + }, + "serviceProxies": {}, + "vfModules": { + "vf_vmee0..VfVmee..vmme_vlc..module-1": { + "uuid": "522159d5-d6e0-4c2a-aa44-5a542a12a830", + "invariantUuid": "98a7c88b-b577-476a-90e4-e25a5871e02b", + "customizationUuid": "55b1be94-671a-403e-a26c-667e9c47d091", + "description": null, + "name": "VfVmee..vmme_vlc..module-1", + "version": "2", + "modelCustomizationName": "VfVmee..vmme_vlc..module-1", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "vmme_vlc" + }, + "inputs": {}, + "volumeGroupAllowed": true + }, + "vf_vmee0..VfVmee..vmme_gpb..module-2": { + "uuid": "41708296-e443-4c71-953f-d9a010f059e1", + "invariantUuid": "1cca90b8-3490-495e-87da-3f3e4c57d5b9", + "customizationUuid": "6add59e0-7fe1-4bc4-af48-f8812422ae7c", + "description": null, + "name": "VfVmee..vmme_gpb..module-2", + "version": "2", + "modelCustomizationName": "VfVmee..vmme_gpb..module-2", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "vmme_gpb" + }, + "inputs": {}, + "volumeGroupAllowed": false + }, + "vf_vmee0..VfVmee..base_vmme..module-0": { + "uuid": "a27f5cfc-7f12-4f99-af08-0af9c3885c87", + "invariantUuid": "a6f9e51a-2b35-416a-ae15-15e58d61f36d", + "customizationUuid": "f8c040f1-7e51-4a11-aca8-acf256cfd861", + "description": null, + "name": "VfVmee..base_vmme..module-0", + "version": "2", + "modelCustomizationName": "VfVmee..base_vmme..module-0", + "properties": { + "minCountInstances": 1, + "maxCountInstances": 1, + "initialCount": 1, + "vfModuleLabel": "base_vmme" + }, + "inputs": {}, + "volumeGroupAllowed": true + } + }, + "volumeGroups": { + "vf_vmee0..VfVmee..base_vmme..module-0": { + "uuid": "a27f5cfc-7f12-4f99-af08-0af9c3885c87", + "invariantUuid": "a6f9e51a-2b35-416a-ae15-15e58d61f36d", + "customizationUuid": "f8c040f1-7e51-4a11-aca8-acf256cfd861", + "description": null, + "name": "VfVmee..base_vmme..module-0", + "version": "2", + "modelCustomizationName": "VfVmee..base_vmme..module-0", + "properties": { + "minCountInstances": 1, + "maxCountInstances": 1, + "initialCount": 1, + "vfModuleLabel": "base_vmme" + }, + "inputs": {} + } + }, + "pnfs": {} + } + }, + "serviceInstance": { + "6e59c5de-f052-46fa-aa7e-2fca9d674c44": { + "networks": {}, + "vnfs": { + "VF_vMee 0": { + "rollbackOnFailure": "true", + "vfModules": { + "vf_vmee0..VfVmee..base_vmme..module-0": { + "vf_vmee0..VfVmee..base_vmme..module-0vmvzo": { + "isMissingData": false, + "sdncPreReload": null, + "modelInfo": { + "modelType": "VFmodule", + "modelInvariantId": "a6f9e51a-2b35-416a-ae15-15e58d61f36d", + "modelVersionId": "a27f5cfc-7f12-4f99-af08-0af9c3885c87", + "modelName": "VfVmee..base_vmme..module-0", + "modelVersion": "2", + "modelCustomizationId": "f8c040f1-7e51-4a11-aca8-acf256cfd861", + "modelCustomizationName": "VfVmee..base_vmme..module-0" + }, + "instanceParams": [ + {} + ], + "trackById": "wmtm6sy2uj" + } + } + }, + "isMissingData": true, + "originalName": "VF_vMee 0", + "vnfStoreKey": "VF_vMee 0", + "trackById": "p3wk448m5do", + "uuid": "d6557200-ecf2-4641-8094-5393ae3aae60", + "productFamilyId": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e", + "lcpCloudRegionId": null, + "tenantId": null, + "lineOfBusiness": null, + "platformName": null, + "modelInfo": { + "modelType": "VF", + "modelInvariantId": "4160458e-f648-4b30-a176-43881ffffe9e", + "modelVersionId": "6e59c5de-f052-46fa-aa7e-2fca9d674c44", + "modelName": "VF_vMee", + "modelVersion": "2.0", + "modelCustomizationName": "VF_vMee 0" + } + } + }, + "instanceParams": [ + {} + ], + "validationCounter": 1, + "existingNames": {}, + "existingVNFCounterMap": { + "d6557200-ecf2-4641-8094-5393ae3aae60": 1 + }, + "globalSubscriberId": "e433710f-9217-458d-a79d-1c7aff376d89", + "subscriptionServiceType": "TYLER SILVIA", + "owningEntityId": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc", + "productFamilyId": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e", + "lcpCloudRegionId": "hvf6", + "tenantId": "229bcdc6eaeb4ca59d55221141d01f8e", + "aicZoneId": "JAG1", + "projectName": "x1", + "rollbackOnFailure": "true", + "bulkSize": 1, + "modelInfo": { + "modelInvariantId": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0", + "modelVersionId": "6e59c5de-f052-46fa-aa7e-2fca9d674c44", + "modelName": "ComplexService", + "modelVersion": "1.0", + "uuid": "6e59c5de-f052-46fa-aa7e-2fca9d674c44" + }, + "isALaCarte": false, + "name": "ComplexService", + "version": "1.0", + "description": "ComplexService", + "category": "Emanuel", + "uuid": "6e59c5de-f052-46fa-aa7e-2fca9d674c44", + "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0", + "serviceType": "", + "serviceRole": "", + "isEcompGeneratedNaming": true, + "isMultiStepDesign": false + } + }, + "lcpRegionsAndTenants": { + "lcpRegionList": [ + { + "id": "JANET25", + "name": "JANET25", + "isPermitted": true + }, + { + "id": "hvf6", + "name": "hvf6", + "isPermitted": true + } + ], + "lcpRegionsTenantsMap": { + "JANET25": [ + { + "id": "092eb9e8e4b7412e8787dd091bc58e86", + "name": "USP-SIP-IC-24335-T-01", + "isPermitted": true + } + ], + "hvf6": [ + { + "id": "bae71557c5bb4d5aac6743a4e5f1d054", + "name": "AIN Web Tool-15-D-testalexandria", + "isPermitted": true + }, + { + "id": "229bcdc6eaeb4ca59d55221141d01f8e", + "name": "AIN Web Tool-15-D-STTest2", + "isPermitted": true + }, + { + "id": "1178612d2b394be4834ad77f567c0af2", + "name": "AIN Web Tool-15-D-SSPtestcustome", + "isPermitted": true + }, + { + "id": "19c5ade915eb461e8af52fb2fd8cd1f2", + "name": "AIN Web Tool-15-D-UncheckedEcopm", + "isPermitted": true + }, + { + "id": "de007636e25249238447264a988a927b", + "name": "AIN Web Tool-15-D-dfsdf", + "isPermitted": true + }, + { + "id": "62f29b3613634ca6a3065cbe0e020c44", + "name": "AIN/SMS-16-D-Multiservices1", + "isPermitted": true + }, + { + "id": "649289e30d3244e0b48098114d63c2aa", + "name": "AIN Web Tool-15-D-SSPST66", + "isPermitted": true + }, + { + "id": "3f21eeea6c2c486bba31dab816c05a32", + "name": "AIN Web Tool-15-D-ASSPST47", + "isPermitted": true + }, + { + "id": "f60ce21d3ee6427586cff0d22b03b773", + "name": "CESAR-100-D-sspjg67246", + "isPermitted": true + }, + { + "id": "8774659e425f479895ae091bb5d46560", + "name": "CESAR-100-D-sspjg68359", + "isPermitted": true + }, + { + "id": "624eb554b0d147c19ff8885341760481", + "name": "AINWebTool-15-D-iftach", + "isPermitted": true + }, + { + "id": "214f55f5fc414c678059c383b03e4962", + "name": "CESAR-100-D-sspjg612401", + "isPermitted": true + }, + { + "id": "c90666c291664841bb98e4d981ff1db5", + "name": "CESAR-100-D-sspjg621340", + "isPermitted": true + }, + { + "id": "ce5b6bc5c7b348e1bf4b91ac9a174278", + "name": "sspjg621351cloned", + "isPermitted": true + }, + { + "id": "b386b768a3f24c8e953abbe0b3488c02", + "name": "AINWebTool-15-D-eteancomp", + "isPermitted": true + }, + { + "id": "dc6c4dbfd225474e9deaadd34968646c", + "name": "AINWebTool-15-T-SPFET", + "isPermitted": true + }, + { + "id": "02cb5030e9914aa4be120bd9ed1e19eb", + "name": "AINWebTool-15-X-eeweww", + "isPermitted": true + }, + { + "id": "f2f3830e4c984d45bcd00e1a04158a79", + "name": "CESAR-100-D-spjg61909", + "isPermitted": true + }, + { + "id": "05b91bd5137f4929878edd965755c06d", + "name": "CESAR-100-D-sspjg621512cloned", + "isPermitted": true + }, + { + "id": "7002fbe8482d4a989ddf445b1ce336e0", + "name": "AINWebTool-15-X-vdr", + "isPermitted": true + }, + { + "id": "4008522be43741dcb1f5422022a2aa0b", + "name": "AINWebTool-15-D-ssasa", + "isPermitted": true + }, + { + "id": "f44e2e96a1b6476abfda2fa407b00169", + "name": "AINWebTool-15-D-PFNPT", + "isPermitted": true + }, + { + "id": "b69a52bec8a84669a37a1e8b72708be7", + "name": "AINWebTool-15-X-vdre", + "isPermitted": true + }, + { + "id": "fac7d9fd56154caeb9332202dcf2969f", + "name": "AINWebTool-15-X-NONPODECOMP", + "isPermitted": true + }, + { + "id": "2d34d8396e194eb49969fd61ffbff961", + "name": "DN5242-Nov16-T5", + "isPermitted": true + }, + { + "id": "cb42a77ff45b48a8b8deb83bb64acc74", + "name": "ro-T11", + "isPermitted": true + }, + { + "id": "fa45ca53c80b492fa8be5477cd84fc2b", + "name": "ro-T112", + "isPermitted": true + }, + { + "id": "4914ab0ab3a743e58f0eefdacc1dde77", + "name": "DN5242-Nov21-T1", + "isPermitted": true + }, + { + "id": "d0a3e3f2964542259d155a81c41aadc3", + "name": "test-hvf6-09", + "isPermitted": true + }, + { + "id": "cbb99fe4ada84631b7baf046b6fd2044", + "name": "DN5242-Nov16-T3", + "isPermitted": true + } + ] + } + }, + "productFamilies": [ + { + "id": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034", + "name": "SCOTTIE", + "isPermitted": true + }, + { + "id": "17cc1042-527b-11e6-beb8-9e71128cae77", + "name": "IGNACIO", + "isPermitted": true + }, + { + "id": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e", + "name": "Christie", + "isPermitted": true + }, + { + "id": "a4f6f2ae-9bf5-4ed7-b904-06b2099c4bd7", + "name": "Enhanced Services", + "isPermitted": true + }, + { + "id": "vTerrance", + "name": "vTerrance", + "isPermitted": true + }, + { + "id": "323d69d9-2efe-4r45-ay0a-89ea7ard4e6f", + "name": "vSCP", + "isPermitted": true + }, + { + "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb", + "name": "Emanuel", + "isPermitted": true + }, + { + "id": "d8a6ed93-251c-47ca-adc9-86671fd19f4c", + "name": "BVOIP", + "isPermitted": true + }, + { + "id": "db171b8f-115c-4992-a2e3-ee04cae357e0", + "name": "LINDSEY", + "isPermitted": true + }, + { + "id": "LRSI-OSPF", + "name": "LRSI-OSPF", + "isPermitted": true + }, + { + "id": "vRosemarie", + "name": "HNGATEWAY", + "isPermitted": true + }, + { + "id": "vHNPaas", + "name": "WILKINS", + "isPermitted": true + }, + { + "id": "e433710f-9217-458d-a79d-1c7aff376d89", + "name": "TYLER SILVIA", + "isPermitted": true + }, + { + "id": "b6a3f28c-eebf-494c-a900-055cc7c874ce", + "name": "VROUTER", + "isPermitted": true + }, + { + "id": "Cisneros", + "name": "vMuriel", + "isPermitted": true + }, + { + "id": "0ee8c1bc-7cbd-4b0a-a1ac-e9999255abc1", + "name": "CARA Griffin", + "isPermitted": true + }, + { + "id": "c7611ebe-c324-48f1-8085-94aef0c6ef3d", + "name": "DARREN MCGEE", + "isPermitted": true + }, + { + "id": "e30755dc-5673-4b6b-9dcf-9abdd96b93d1", + "name": "Transport", + "isPermitted": true + }, + { + "id": "vSalvatore", + "name": "vSalvatore", + "isPermitted": true + }, + { + "id": "d7bb0a21-66f2-4e6d-87d9-9ef3ced63ae4", + "name": "Josefina", + "isPermitted": true + }, + { + "id": "vHubbard", + "name": "vHubbard", + "isPermitted": true + }, + { + "id": "12a96a9d-4b4c-4349-a950-fe1159602621", + "name": "DARREN MCGEE", + "isPermitted": true + } + ], + "serviceTypes": { + "e433710f-9217-458d-a79d-1c7aff376d89": [ + { + "id": "0", + "name": "vRichardson", + "isPermitted": false + }, + { + "id": "1", + "name": "TYLER SILVIA", + "isPermitted": true + }, + { + "id": "2", + "name": "Emanuel", + "isPermitted": false + }, + { + "id": "3", + "name": "vJamie", + "isPermitted": false + }, + { + "id": "4", + "name": "vVoiceMail", + "isPermitted": false + }, + { + "id": "5", + "name": "Kennedy", + "isPermitted": false + }, + { + "id": "6", + "name": "vSEGW", + "isPermitted": false + }, + { + "id": "7", + "name": "vVM", + "isPermitted": false + }, + { + "id": "8", + "name": "vOTA", + "isPermitted": false + }, + { + "id": "9", + "name": "vMME", + "isPermitted": false + }, + { + "id": "10", + "name": "vMNS", + "isPermitted": false + }, + { + "id": "11", + "name": "vSCP", + "isPermitted": false + }, + { + "id": "12", + "name": "VPMS", + "isPermitted": false + }, + { + "id": "13", + "name": "vMMSC", + "isPermitted": false + }, + { + "id": "14", + "name": "SSD", + "isPermitted": false + }, + { + "id": "15", + "name": "vMOG", + "isPermitted": false + }, + { + "id": "16", + "name": "LINDSEY", + "isPermitted": false + }, + { + "id": "17", + "name": "JOHANNA_SANTOS", + "isPermitted": false + }, + { + "id": "18", + "name": "vCarroll", + "isPermitted": false + } + ] + }, + "aicZones": [ + { + "id": "NFT1", + "name": "NFTJSSSS-NFT1" + }, + { + "id": "JAG1", + "name": "YUDFJULP-JAG1" + }, + { + "id": "YYY1", + "name": "UUUAIAAI-YYY1" + }, + { + "id": "BAN1", + "name": "VSDKYUTP-BAN1" + }, + { + "id": "DKJ1", + "name": "DKJSJDKA-DKJ1" + }, + { + "id": "MCS1", + "name": "ASACMAMS-MCS1" + }, + { + "id": "UIO1", + "name": "uioclli1-UIO1" + }, + { + "id": "RAJ1", + "name": "YGBIJNLQ-RAJ1" + }, + { + "id": "OPA1", + "name": "opaclli1-OPA1" + }, + { + "id": "SDE1", + "name": "ZXCVBNMA-SDE1" + }, + { + "id": "VEN2", + "name": "FGHJUHIL-VEN2" + }, + { + "id": "ORL1", + "name": "ORLDFLMA-ORL1" + }, + { + "id": "JAD1", + "name": "JADECLLI-JAD1" + }, + { + "id": "ZXL1", + "name": "LWLWCANN-ZXL1" + }, + { + "id": "CKL1", + "name": "CLKSKCKK-CKL1" + }, + { + "id": "SDF1", + "name": "sdfclli1-SDF1" + }, + { + "id": "RAD1", + "name": "RADICAL1-RAD1" + }, + { + "id": "KIT1", + "name": "BHYJFGLN-KIT1" + }, + { + "id": "REL1", + "name": "INGERFGT-REL1" + }, + { + "id": "JNL1", + "name": "CJALSDAC-JNL1" + }, + { + "id": "OLK1", + "name": "OLKOLKLS-OLK1" + }, + { + "id": "CHI1", + "name": "CHILLIWE-CHI1" + }, + { + "id": "UUU4", + "name": "UUUAAAUU-UUU4" + }, + { + "id": "TUF1", + "name": "TUFCLLI1-TUF1" + }, + { + "id": "KJN1", + "name": "CKALDKSA-KJN1" + }, + { + "id": "SAM1", + "name": "SNDGCA64-SAN1" + }, + { + "id": "SCK1", + "name": "SCKSCKSK-SCK1" + }, + { + "id": "HJH1", + "name": "AOEEQQQD-HJH1" + }, + { + "id": "HGD1", + "name": "SDFQWHGD-HGD1" + }, + { + "id": "KOR1", + "name": "HYFLNBVT-KOR1" + }, + { + "id": "ATL43", + "name": "AICLOCID-ATL43" + }, + { + "id": "ATL54", + "name": "AICFTAAI-ATL54" + }, + { + "id": "ATL66", + "name": "CLLIAAII-ATL66" + }, + { + "id": "VEL1", + "name": "BNMLKUIK-VEL1" + }, + { + "id": "ICC1", + "name": "SANJITAT-ICC1" + }, + { + "id": "MNT11", + "name": "WSXEFBTH-MNT11" + }, + { + "id": "DEF2", + "name": "WSBHGTYL-DEF2" + }, + { + "id": "MAD11", + "name": "SDFQWGKL-MAD11" + }, + { + "id": "OLG1", + "name": "OLHOLHOL-OLG1" + }, + { + "id": "GAR1", + "name": "NGFVSJKO-GAR1" + }, + { + "id": "SAN22", + "name": "GNVLSCTL-SAN22" + }, + { + "id": "HRG1", + "name": "HRGHRGGS-HRG1" + }, + { + "id": "JCS1", + "name": "JCSJSCJS-JCS1" + }, + { + "id": "DHA12", + "name": "WSXEDECF-DHA12" + }, + { + "id": "HJE1", + "name": "AOEEWWWD-HJE1" + }, + { + "id": "NCA1", + "name": "NCANCANN-NCA1" + }, + { + "id": "IOP1", + "name": "iopclli1-IOP1" + }, + { + "id": "RTY1", + "name": "rtyclli1-RTY1" + }, + { + "id": "KAP1", + "name": "HIOUYTRQ-KAP1" + }, + { + "id": "ZEN1", + "name": "ZENCLLI1-ZEN1" + }, + { + "id": "HKA1", + "name": "JAKHLASS-HKA1" + }, + { + "id": "CQK1", + "name": "CQKSCAKK-CQK1" + }, + { + "id": "SAI1", + "name": "UBEKQLPD-SAI1" + }, + { + "id": "ERT1", + "name": "ertclli1-ERT1" + }, + { + "id": "IBB1", + "name": "PLMKOIJU-IBB1" + }, + { + "id": "TIR2", + "name": "PLKINHYI-TIR2" + }, + { + "id": "HSD1", + "name": "CHASKCDS-HSD1" + }, + { + "id": "SLF78", + "name": "SDCTLFN1-SLF78" + }, + { + "id": "SEE78", + "name": "SDCTEEE4-SEE78" + }, + { + "id": "SAN13", + "name": "TOKYJPFA-SAN13" + }, + { + "id": "SAA78", + "name": "SDCTAAA1-SAA78" + }, + { + "id": "LUC1", + "name": "ATLDFGYC-LUC1" + }, + { + "id": "AMD13", + "name": "MEMATLAN-AMD13" + }, + { + "id": "TOR1", + "name": "TOROONXN-TOR1" + }, + { + "id": "QWE1", + "name": "QWECLLI1-QWE1" + }, + { + "id": "ZOG1", + "name": "ZOGASTRO-ZOG1" + }, + { + "id": "CAL33", + "name": "CALIFORN-CAL33" + }, + { + "id": "SHH78", + "name": "SDIT1HHH-SHH78" + }, + { + "id": "DSA1", + "name": "LKJHGFDS-DSA1" + }, + { + "id": "CLG1", + "name": "CLGRABAD-CLG1" + }, + { + "id": "BNA1", + "name": "BNARAGBK-BNA1" + }, + { + "id": "ATL84", + "name": "CANTTCOC-ATL84" + }, + { + "id": "APP1", + "name": "WBHGTYUI-APP1" + }, + { + "id": "RJN1", + "name": "RJNRBZAW-RJN1" + }, + { + "id": "EHH78", + "name": "SDCSHHH5-EHH78" + }, + { + "id": "mac10", + "name": "PKGTESTF-mac10" + }, + { + "id": "SXB78", + "name": "SDCTGXB1-SXB78" + }, + { + "id": "SAX78", + "name": "SDCTAXG1-SAX78" + }, + { + "id": "SYD1", + "name": "SYDNAUBV-SYD1" + }, + { + "id": "TOK1", + "name": "TOKYJPFA-TOK1" + }, + { + "id": "KGM2", + "name": "KGMTNC20-KGM2" + }, + { + "id": "DCC1b", + "name": "POIUYTGH-DCC1b" + }, + { + "id": "SKK78", + "name": "SDCTKKK1-SKK78" + }, + { + "id": "SGG78", + "name": "SDCTGGG1-SGG78" + }, + { + "id": "SJJ78", + "name": "SDCTJJJ1-SJJ78" + }, + { + "id": "SBX78", + "name": "SDCTBXG1-SBX78" + }, + { + "id": "LAG1", + "name": "LARGIZON-LAG1" + }, + { + "id": "IAA1", + "name": "QAZXSWED-IAA1" + }, + { + "id": "POI1", + "name": "PLMNJKIU-POI1" + }, + { + "id": "LAG1a", + "name": "LARGIZON-LAG1a" + }, + { + "id": "PBL1", + "name": "PBLAPBAI-PBL1" + }, + { + "id": "LAG45", + "name": "LARGIZON-LAG1a" + }, + { + "id": "MAR1", + "name": "MNBVCXZM-MAR1" + }, + { + "id": "HST70", + "name": "HSTNTX70-HST70" + }, + { + "id": "DCC1a", + "name": "POIUYTGH-DCC1a" + }, + { + "id": "TOL1", + "name": "TOLDOH21-TOL1" + }, + { + "id": "LON1", + "name": "LONEENCO-LON1" + }, + { + "id": "SJU78", + "name": "SDIT1JUB-SJU78" + }, + { + "id": "STN27", + "name": "HSTNTX01-STN27" + }, + { + "id": "SSW56", + "name": "ss8126GT-SSW56" + }, + { + "id": "SBB78", + "name": "SDIT1BBB-SBB78" + }, + { + "id": "DCC3", + "name": "POIUYTGH-DCC3" + }, + { + "id": "GNV1", + "name": "GNVLSCTL-GNV1" + }, + { + "id": "WAS1", + "name": "WASHDCSW-WAS1" + }, + { + "id": "TOY1", + "name": "TORYONNZ-TOY1" + }, + { + "id": "STT1", + "name": "STTLWA02-STT1" + }, + { + "id": "STG1", + "name": "STTGGE62-STG1" + }, + { + "id": "SLL78", + "name": "SDCTLLL1-SLL78" + }, + { + "id": "SBU78", + "name": "SDIT1BUB-SBU78" + }, + { + "id": "ATL2", + "name": "ATLNGANW-ATL2" + }, + { + "id": "BOT1", + "name": "BOTHWAKY-BOT1" + }, + { + "id": "SNG1", + "name": "SNGPSIAU-SNG1" + }, + { + "id": "NYC1", + "name": "NYCMNY54-NYC1" + }, + { + "id": "LAG1b", + "name": "LARGIZON-LAG1b" + }, + { + "id": "AMD15", + "name": "AMDFAA01-AMD15" + }, + { + "id": "SNA1", + "name": "SNANTXCA-SNA1" + }, + { + "id": "PLT1", + "name": "PLTNCA60-PLT1" + }, + { + "id": "TLP1", + "name": "TLPNXM18-TLP1" + }, + { + "id": "SDD81", + "name": "SAIT1DD6-SDD81" + }, + { + "id": "DCC1", + "name": "POIUYTGH-DCC1" + }, + { + "id": "DCC2", + "name": "POIUYTGH-DCC2" + }, + { + "id": "OKC1", + "name": "OKCBOK55-OKC1" + }, + { + "id": "PAR1", + "name": "PARSFRCG-PAR1" + }, + { + "id": "TES36", + "name": "ABCEETES-TES36" + }, + { + "id": "COM1", + "name": "PLMKOPIU-COM1" + }, + { + "id": "ANI1", + "name": "ATLNGTRE-ANI1" + }, + { + "id": "SDG78", + "name": "SDIT1BDG-SDG78" + }, + { + "id": "mac20", + "name": "PKGTESTF-mac20" + }, + { + "id": "DSF45", + "name": "DSFBG123-DSF45" + }, + { + "id": "HST25", + "name": "HSTNTX01-HST25" + }, + { + "id": "AMD18", + "name": "AUDIMA01-AMD18" + }, + { + "id": "SAA80", + "name": "SAIT9AA3-SAA80" + }, + { + "id": "SSA56", + "name": "SSIT2AA7-SSA56" + }, + { + "id": "SDD82", + "name": "SAIT1DD9-SDD82" + }, + { + "id": "JCV1", + "name": "JCVLFLBW-JCV1" + }, + { + "id": "SUL2", + "name": "WERTYUJK-SUL2" + }, + { + "id": "PUR1", + "name": "purelyde-PUR1" + }, + { + "id": "FDE55", + "name": "FDERT555-FDE55" + }, + { + "id": "SITE", + "name": "LONEENCO-SITE" + }, + { + "id": "ATL1", + "name": "ATLNGAMA-ATL1" + }, + { + "id": "JUL1", + "name": "ZXCVBNMM-JUL1" + }, + { + "id": "TAT34", + "name": "TESAAISB-TAT34" + }, + { + "id": "XCP12", + "name": "CHKGH123-XCP12" + }, + { + "id": "RAI1", + "name": "poiuytre-RAI1" + }, + { + "id": "HPO1", + "name": "ATLNGAUP-HPO1" + }, + { + "id": "KJF12", + "name": "KJFDH123-KJF12" + }, + { + "id": "SCC80", + "name": "SAIT9CC3-SCC80" + }, + { + "id": "SAA12", + "name": "SAIT9AF8-SAA12" + }, + { + "id": "SAA14", + "name": "SAIT1AA9-SAA14" + }, + { + "id": "ATL35", + "name": "TTESSAAI-ATL35" + }, + { + "id": "CWY1", + "name": "CWYMOWBS-CWY1" + }, + { + "id": "ATL76", + "name": "TELEPAAI-ATL76" + }, + { + "id": "DSL12", + "name": "DSLFK242-DSL12" + }, + { + "id": "ATL53", + "name": "AAIATLTE-ATL53" + }, + { + "id": "SAA11", + "name": "SAIT9AA2-SAA11" + }, + { + "id": "ATL62", + "name": "TESSASCH-ATL62" + }, + { + "id": "AUG1", + "name": "ASDFGHJK-AUG1" + }, + { + "id": "POI22", + "name": "POIUY123-POI22" + }, + { + "id": "SAA13", + "name": "SAIT1AA9-SAA13" + }, + { + "id": "BHY17", + "name": "BHYTFRF3-BHY17" + }, + { + "id": "LIS1", + "name": "HOSTPROF-LIS1" + }, + { + "id": "SIP1", + "name": "ZXCVBNMK-SIP1" + }, + { + "id": "ATL99", + "name": "TEESTAAI-ATL43" + }, + { + "id": "ATL64", + "name": "FORLOAAJ-ATL64" + }, + { + "id": "TAT33", + "name": "TESAAISA-TAT33" + }, + { + "id": "RAD10", + "name": "INDIPUNE-RAD10" + }, + { + "id": "RTW5", + "name": "BHYTFRY4-RTW5" + }, + { + "id": "JGS1", + "name": "KSJKKKKK-JGS1" + }, + { + "id": "ATL98", + "name": "TEESTAAI-ATL43" + }, + { + "id": "WAN1", + "name": "LEIWANGW-WAN1" + }, + { + "id": "ATL44", + "name": "ATLSANAB-ATL44" + }, + { + "id": "RTD2", + "name": "BHYTFRk4-RTD2" + }, + { + "id": "NIR1", + "name": "ORFLMANA-NIR1" + }, + { + "id": "ATL75", + "name": "SANAAIRE-ATL75" + }, + { + "id": "NUM1", + "name": "QWERTYUI-NUM1" + }, + { + "id": "MTN32", + "name": "MDTWNJ21-MTN32" + }, + { + "id": "RTZ4", + "name": "BHYTFRZ6-RTZ4" + }, + { + "id": "ATL56", + "name": "ATLSANAC-ATL56" + }, + { + "id": "AMS1", + "name": "AMSTNLBW-AMS1" + }, + { + "id": "RCT1", + "name": "AMSTERNL-RCT1" + }, + { + "id": "JAN1", + "name": "ORFLMATT-JAN1" + }, + { + "id": "ABC14", + "name": "TESAAISA-ABC14" + }, + { + "id": "TAT37", + "name": "TESAAISD-TAT37" + }, + { + "id": "MIC54", + "name": "MICHIGAN-MIC54" + }, + { + "id": "ABC11", + "name": "ATLSANAI-ABC11" + }, + { + "id": "AMF11", + "name": "AMDOCS01-AMF11" + }, + { + "id": "ATL63", + "name": "ATLSANEW-ATL63" + }, + { + "id": "ABC12", + "name": "ATLSECIA-ABC12" + }, + { + "id": "MTN20", + "name": "MDTWNJ21-MTN20" + }, + { + "id": "ABC15", + "name": "AAITESAN-ABC15" + }, + { + "id": "AVT1", + "name": "AVTRFLHD-AVT1" + }, + { + "id": "ATL34", + "name": "ATLSANAI-ATL34" + } + ], + "categoryParameters": { + "owningEntityList": [ + { + "id": "aaa1", + "name": "aaa1" + }, + { + "id": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc", + "name": "WayneHolland" + }, + { + "id": "Melissa", + "name": "Melissa" + } + ], + "projectList": [ + { + "id": "WATKINS", + "name": "WATKINS" + }, + { + "id": "x1", + "name": "x1" + }, + { + "id": "yyy1", + "name": "yyy1" + } + ], + "lineOfBusinessList": [ + { + "id": "ONAP", + "name": "ONAP" + }, + { + "id": "zzz1", + "name": "zzz1" + } + ], + "platformList": [ + { + "id": "platform", + "name": "platform" + }, + { + "id": "xxx1", + "name": "xxx1" + } + ] + }, + "type": "[LCP_REGIONS_AND_TENANTS] Update", + "subscribers": [ + { + "id": "CAR_2020_ER", + "name": "CAR_2020_ER", + "isPermitted": true + }, + { + "id": "21014aa2-526b-11e6-beb8-9e71128cae77", + "name": "JULIO ERICKSON", + "isPermitted": false + }, + { + "id": "DHV1707-TestSubscriber-2", + "name": "DALE BRIDGES", + "isPermitted": false + }, + { + "id": "DHV1707-TestSubscriber-1", + "name": "LLOYD BRIDGES", + "isPermitted": false + }, + { + "id": "jimmy-example", + "name": "JimmyExampleCust-20161102", + "isPermitted": false + }, + { + "id": "jimmy-example2", + "name": "JimmyExampleCust-20161103", + "isPermitted": false + }, + { + "id": "ERICA5779-TestSub-PWT-102", + "name": "ERICA5779-TestSub-PWT-102", + "isPermitted": false + }, + { + "id": "ERICA5779-TestSub-PWT-101", + "name": "ERICA5779-TestSub-PWT-101", + "isPermitted": false + }, + { + "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb", + "name": "Emanuel", + "isPermitted": false + }, + { + "id": "ERICA5779-Subscriber-4", + "name": "ERICA5779-Subscriber-5", + "isPermitted": false + }, + { + "id": "ERICA5779-TestSub-PWT-103", + "name": "ERICA5779-TestSub-PWT-103", + "isPermitted": false + }, + { + "id": "ERICA5779-Subscriber-2", + "name": "ERICA5779-Subscriber-2", + "isPermitted": false + }, + { + "id": "e433710f-9217-458d-a79d-1c7aff376d89", + "name": "SILVIA ROBBINS", + "isPermitted": true + }, + { + "id": "ERICA5779-Subscriber-3", + "name": "ERICA5779-Subscriber-3", + "isPermitted": false + }, + { + "id": "31739f3e-526b-11e6-beb8-9e71128cae77", + "name": "CRAIG/ROBERTS", + "isPermitted": false + } + ] + } + } + } +} +class ActivatedRouteMock<T>{ + queryParams() { + return { + serviceModelId : '6e59c5de-f052-46fa-aa7e-2fca9d674c44' + } + } +} + +class MockFeatureFlagsService {} + +describe('Generic Form popup Service', () => { + let injector; + let service: GenericFormPopupService; + let httpMock: HttpTestingController; + let form : FormGroup; + let fb : FormBuilder; + let netwokPopupService : NetworkPopupService; + let vfModulePopupService : VfModulePopuopService; + let servicePopupService : ServicePopupService; + let _aaiService : AaiService; + let _activatedRoute : ActivatedRoute; + + beforeAll(done => (async () => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + providers: [GenericFormPopupService, + FormBuilder, + IframeService, + ServicePopupService, + BasicControlGenerator, + ServiceControlGenerator, + GenericFormService, + LogService, + DefaultDataGeneratorService, + BasicPopupService, + AaiService, + NetworkPopupService, + NetworkControlGenerator, + VfModulePopuopService, + VfModuleControlGenerator, + {provide:FeatureFlagsService, useClass: MockFeatureFlagsService}, + {provide: ActivatedRoute, useClass: ActivatedRouteMock}, + {provide: NgRedux, useClass: MockAppStore}] + }); + await TestBed.compileComponents(); + + injector = getTestBed(); + service = injector.get(GenericFormPopupService); + httpMock = injector.get(HttpTestingController); + fb = injector.get(FormBuilder); + netwokPopupService = injector.get(NetworkPopupService); + vfModulePopupService = injector.get(VfModulePopuopService); + servicePopupService = injector.get(ServicePopupService); + _aaiService = injector.get(AaiService); + _activatedRoute = injector.get(ActivatedRoute); + + })().then(done).catch(done.fail)); + + + test('VL: getGenericFormDetails should return FormPopupDetails', () => { + let uuidData : UUIDData = <any>{ + type : 'VL', + serviceId : '6e59c5de-f052-46fa-aa7e-2fca9d674c44', + networkId : 'ExtVL 0', + networkStoreKey : 'ExtVL 0', + popupService : netwokPopupService + }; + let node : ITreeNode = <any>{data : {} }; + + jest.spyOn(uuidData.popupService ,'getGenericFormPopupDetails'); + service.getGenericFormDetails(uuidData, node,true); + + expect(uuidData.popupService.getGenericFormPopupDetails).toHaveBeenCalledTimes(1); + expect(uuidData.popupService.getGenericFormPopupDetails).toHaveBeenCalledWith(uuidData['serviceId'], + uuidData['networkId'], + uuidData['networkStoreKey'], + node, + uuidData, + true + ); + }); + + test('VFmodule: getGenericFormDetails should return FormPopupDetails', () => { + let uuidData : UUIDData = <any>{ + type : 'VFmodule', + serviceId : '6e59c5de-f052-46fa-aa7e-2fca9d674c44', + vnfStoreKey : 'VF_vMee 0', + vFModuleStoreKey : 'vf_vmee0..VfVmee..vmme_vlc..module-1', + popupService : vfModulePopupService + }; + let node : ITreeNode = <any>{data : {}}; + + spyOn(uuidData.popupService ,'getGenericFormPopupDetails'); + service.getGenericFormDetails(uuidData, node,true); + + expect(uuidData.popupService.getGenericFormPopupDetails).toHaveBeenCalledTimes(1) + expect(uuidData.popupService.getGenericFormPopupDetails).toHaveBeenCalledWith( + uuidData['serviceId'], + uuidData['vnfStoreKey'], + uuidData['vFModuleStoreKey'], + node, + uuidData, + true + ); + }); + + + test('service: getGenericFormDetails should return FormPopupDetails', () => { + let uuidData : UUIDData = <any>{ + type : 'service', + serviceId : '6e59c5de-f052-46fa-aa7e-2fca9d674c44', + popupService : servicePopupService + }; + let node : ITreeNode = <any>{data : {}}; + + jest.spyOn(uuidData.popupService ,'getGenericFormPopupDetails'); + service.getGenericFormDetails(uuidData, node,true); + + expect(uuidData.popupService.getGenericFormPopupDetails).toHaveBeenCalledTimes(1); + expect(uuidData.popupService.getGenericFormPopupDetails).toHaveBeenCalledWith( + uuidData['serviceId'], + null, + null, + node, + uuidData, + true + ); + }); + + + test('initReduxOnCreateNewService',() => { + jest.spyOn(_aaiService, 'getServiceModelById'); + service.initReduxOnCreateNewService(); + }) +}); diff --git a/vid-webpack-master/src/app/shared/components/genericFormPopup/generic-form-popup.service.ts b/vid-webpack-master/src/app/shared/components/genericFormPopup/generic-form-popup.service.ts new file mode 100644 index 000000000..6636a54f2 --- /dev/null +++ b/vid-webpack-master/src/app/shared/components/genericFormPopup/generic-form-popup.service.ts @@ -0,0 +1,93 @@ +import {Injectable} from "@angular/core"; +import {IframeService} from "../../utils/iframe.service"; +import {NgRedux} from "@angular-redux/store"; +import {AppState} from "../../store/reducers"; +import {ServicePopupService} from "./genericFormServices/service/service.popup.service"; +import {ActivatedRoute} from "@angular/router"; +import {AaiService} from "../../services/aaiService/aai.service"; +import {ITreeNode} from "angular-tree-component/dist/defs/api"; +import {UUIDData} from "./generic-form-popup.component"; +import {FormPopupDetails} from "../../models/formControlModels/formPopupDetails.model"; +import {Subject} from "rxjs"; +import {deleteAllServiceInstances} from "../../storeUtil/utils/service/service.actions"; + +@Injectable() +export class GenericFormPopupService { + constructor(private _iframeService : IframeService, + private _store: NgRedux<AppState>, + private _servicePopupService : ServicePopupService, + public _activatedRoute : ActivatedRoute, + private _aaiService : AaiService){ + + } + getGenericFormDetails(uuidData : UUIDData, node : ITreeNode, isUpdateMode : boolean) : FormPopupDetails { + switch (uuidData.type){ + case 'VL' : { + return uuidData.popupService.getGenericFormPopupDetails( + uuidData['serviceId'], + uuidData['networkId'], + uuidData['networkStoreKey'], + node, + uuidData, + isUpdateMode + ); + } + case 'VFmodule' : { + return uuidData.popupService.getGenericFormPopupDetails( + uuidData['serviceId'], + uuidData['vnfStoreKey'], + uuidData['vFModuleStoreKey'], + node, + uuidData, + isUpdateMode + ); + } + case 'VF' : { + return uuidData.popupService.getGenericFormPopupDetails( + uuidData['serviceId'], + uuidData['modelName'], + uuidData['vnfStoreKey'], + node, + uuidData, + isUpdateMode + ); + } + case 'VnfGroup' : { + return uuidData.popupService.getGenericFormPopupDetails( + uuidData['serviceId'], + uuidData['modelName'], + uuidData['vnfGroupStoreKey'], + node, + uuidData, + isUpdateMode + ); + } + case 'service' : { + uuidData['bulkSize'] = this._store.getState().service.serviceInstance[uuidData['serviceId']].bulkSize || 1; + return uuidData.popupService.getGenericFormPopupDetails( + uuidData['serviceId'], + null, + null, + node, + uuidData, + isUpdateMode + ); + } + } + } + + initReduxOnCreateNewService() : Promise<string> { + return new Promise((resolve, reject) => { + this._activatedRoute + .queryParams + .subscribe(params => { + this._store.dispatch(deleteAllServiceInstances()); + this._aaiService.getServiceModelById(params.serviceModelId).subscribe(()=>{ + resolve(params.serviceModelId); + }); + }); + }); + } + + refreshModalCheckForGeneralErrorTrigger : Subject<boolean> = new Subject<boolean>(); +} diff --git a/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/basic.popup.service.spec.ts b/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/basic.popup.service.spec.ts new file mode 100644 index 000000000..521e5fb59 --- /dev/null +++ b/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/basic.popup.service.spec.ts @@ -0,0 +1,92 @@ +import {NetworkPopupService} from "./network/network.popup.service"; +import {LogService} from "../../../utils/log/log.service"; +import {ReflectiveInjector} from "@angular/core"; +import {NgRedux} from "@angular-redux/store"; +import {BasicControlGenerator} from "../../genericForm/formControlsServices/basic.control.generator"; +import {AaiService} from "../../../services/aaiService/aai.service"; +import {HttpClient} from "@angular/common/http"; +import {NetworkControlGenerator} from "../../genericForm/formControlsServices/networkGenerator/network.control.generator"; +import {GenericFormService} from "../../genericForm/generic-form.service"; +import {FormBuilder} from "@angular/forms"; +import {IframeService} from "../../../utils/iframe.service"; +import {DefaultDataGeneratorService} from "../../../services/defaultDataServiceGenerator/default.data.generator.service"; +import {FormControlModel} from "../../../models/formControlModels/formControl.model"; +import {BasicPopupService} from "./basic.popup.service"; +import {SdcUiServices} from "onap-ui-angular"; +import {FeatureFlagsService} from "../../../services/featureFlag/feature-flags.service"; +import {getTestBed, TestBed} from "@angular/core/testing"; + +class MockAppStore<T> {} + +class MockModalService<T> {} + +class MockFeatureFlagsService {} + +class MockReduxStore<T> { + getState() { + return {"global":{"name":null,"flags":{"FLAG_NETWORK_TO_ASYNC_INSTANTIATION":false,"FLAG_SHOW_ASSIGNMENTS":true,"FLAG_FABRIC_CONFIGURATION_ASSIGNMENTS":true,"FLAG_UNASSIGN_SERVICE":true,"FLAG_SHOW_VERIFY_SERVICE":false,"FLAG_COLLECTION_RESOURCE_SUPPORT":true,"FLAG_DUPLICATE_VNF":true,"FLAG_SERVICE_MODEL_CACHE":true,"FLAG_ADVANCED_PORTS_FILTER":true,"CREATE_INSTANCE_TEST":false,"FLAG_SETTING_DEFAULTS_IN_DRAWING_BOARD":false,"FLAG_REGION_ID_FROM_REMOTE":true,"FLAG_ASYNC_INSTANTIATION":true,"FLAG_ASYNC_JOBS":true,"EMPTY_DRAWING_BOARD_TEST":false,"FLAG_ADD_MSO_TESTAPI_FIELD":true},"type":"[FLAGS] Update"},"service":{"serviceHierarchy":{"6e59c5de-f052-46fa-aa7e-2fca9d674c44":{"service":{"uuid":"6e59c5de-f052-46fa-aa7e-2fca9d674c44","invariantUuid":"e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0","name":"ComplexService","version":"1.0","toscaModelURL":null,"category":"Emanuel","serviceType":"","serviceRole":"","description":"ComplexService","serviceEcompNaming":"false","instantiationType":"Macro","inputs":{}},"vnfs":{"VF_vMee 0":{"uuid":"d6557200-ecf2-4641-8094-5393ae3aae60","invariantUuid":"4160458e-f648-4b30-a176-43881ffffe9e","description":"VSP_vMee","name":"VF_vMee","version":"2.0","customizationUuid":"91415b44-753d-494c-926a-456a9172bbb9","inputs":{},"commands":{},"properties":{"max_instances":10,"min_instances":1,"gpb2_Internal2_mac":"00:11:22:EF:AC:DF","sctp-b-ipv6-egress_src_start_port":"0","sctp-a-ipv6-egress_rule_application":"any","Internal2_allow_transit":"true","sctp-b-IPv6_ethertype":"IPv6","sctp-a-egress_rule_application":"any","sctp-b-ingress_action":"pass","sctp-b-ingress_rule_protocol":"icmp","ncb2_Internal1_mac":"00:11:22:EF:AC:DF","sctp-b-ipv6-ingress-src_start_port":"0.0","ncb1_Internal2_mac":"00:11:22:EF:AC:DF","fsb_volume_size_0":"320.0","sctp-b-egress_src_addresses":"local","sctp-a-ipv6-ingress_ethertype":"IPv4","sctp-a-ipv6-ingress-dst_start_port":"0","sctp-b-ipv6-ingress_rule_application":"any","domain_name":"default-domain","sctp-a-ingress_rule_protocol":"icmp","sctp-b-egress-src_start_port":"0.0","sctp-a-egress_src_addresses":"local","sctp-b-display_name":"epc-sctp-b-ipv4v6-sec-group","sctp-a-egress-src_start_port":"0.0","sctp-a-ingress_ethertype":"IPv4","sctp-b-ipv6-ingress-dst_end_port":"65535","sctp-b-dst_subnet_prefix_v6":"::","nf_naming":"{ecomp_generated_naming=true}","sctp-a-ipv6-ingress_src_subnet_prefix":"0.0.0.0","sctp-b-egress-dst_start_port":"0.0","ncb_flavor_name":"nv.c20r64d1","gpb1_Internal1_mac":"00:11:22:EF:AC:DF","sctp-b-egress_dst_subnet_prefix_len":"0.0","Internal2_net_cidr":"10.0.0.10","sctp-a-ingress-dst_start_port":"0.0","sctp-a-egress-dst_start_port":"0.0","fsb1_Internal2_mac":"00:11:22:EF:AC:DF","sctp-a-egress_ethertype":"IPv4","vlc_st_service_mode":"in-network-nat","sctp-a-ipv6-egress_ethertype":"IPv4","sctp-a-egress-src_end_port":"65535.0","sctp-b-ipv6-egress_rule_application":"any","sctp-b-egress_action":"pass","sctp-a-ingress-src_subnet_prefix_len":"0.0","sctp-b-ipv6-ingress-src_end_port":"65535.0","sctp-b-name":"epc-sctp-b-ipv4v6-sec-group","fsb2_Internal1_mac":"00:11:22:EF:AC:DF","sctp-a-ipv6-ingress-src_start_port":"0.0","sctp-b-ipv6-egress_ethertype":"IPv4","Internal1_net_cidr":"10.0.0.10","sctp-a-egress_dst_subnet_prefix":"0.0.0.0","fsb_flavor_name":"nv.c20r64d1","sctp_rule_protocol":"132","sctp-b-ipv6-ingress_src_subnet_prefix_len":"0","sctp-a-ipv6-ingress_rule_application":"any","ecomp_generated_naming":"false","sctp-a-IPv6_ethertype":"IPv6","vlc2_Internal1_mac":"00:11:22:EF:AC:DF","vlc_st_virtualization_type":"virtual-machine","sctp-b-ingress-dst_start_port":"0.0","sctp-b-ingress-dst_end_port":"65535.0","sctp-a-ipv6-ingress-src_end_port":"65535.0","sctp-a-display_name":"epc-sctp-a-ipv4v6-sec-group","sctp-b-ingress_rule_application":"any","int2_sec_group_name":"int2-sec-group","vlc_flavor_name":"nd.c16r64d1","sctp-b-ipv6-egress_src_addresses":"local","vlc_st_interface_type_int1":"other1","sctp-b-egress-src_end_port":"65535.0","sctp-a-ipv6-egress-dst_start_port":"0","vlc_st_interface_type_int2":"other2","sctp-a-ipv6-egress_rule_protocol":"any","Internal2_shared":"false","sctp-a-ipv6-egress_dst_subnet_prefix_len":"0","Internal2_rpf":"disable","vlc1_Internal1_mac":"00:11:22:EF:AC:DF","sctp-b-ipv6-egress_src_end_port":"65535","sctp-a-ipv6-egress_src_addresses":"local","sctp-a-ingress-dst_end_port":"65535.0","sctp-a-ipv6-egress_src_end_port":"65535","Internal1_forwarding_mode":"l2","Internal2_dhcp":"false","sctp-a-dst_subnet_prefix_v6":"::","pxe_image_name":"MME_PXE-Boot_16ACP04_GA.qcow2","vlc_st_interface_type_gtp":"other0","ncb1_Internal1_mac":"00:11:22:EF:AC:DF","sctp-b-src_subnet_prefix_v6":"::","sctp-a-egress_dst_subnet_prefix_len":"0.0","int1_sec_group_name":"int1-sec-group","Internal1_dhcp":"false","sctp-a-ipv6-egress_dst_end_port":"65535","Internal2_forwarding_mode":"l2","fsb2_Internal2_mac":"00:11:22:EF:AC:DF","sctp-b-egress_dst_subnet_prefix":"0.0.0.0","Internal1_net_cidr_len":"17","gpb2_Internal1_mac":"00:11:22:EF:AC:DF","sctp-b-ingress-src_subnet_prefix_len":"0.0","sctp-a-ingress_dst_addresses":"local","sctp-a-egress_action":"pass","fsb_volume_type_0":"SF-Default-SSD","ncb2_Internal2_mac":"00:11:22:EF:AC:DF","vlc_st_interface_type_sctp_a":"left","vlc_st_interface_type_sctp_b":"right","sctp-a-src_subnet_prefix_v6":"::","vlc_st_version":"2","sctp-b-egress_ethertype":"IPv4","sctp-a-ingress_rule_application":"any","gpb1_Internal2_mac":"00:11:22:EF:AC:DF","instance_ip_family_v6":"v6","sctp-a-ipv6-egress_src_start_port":"0","sctp-b-ingress-src_start_port":"0.0","sctp-b-ingress_dst_addresses":"local","fsb1_Internal1_mac":"00:11:22:EF:AC:DF","vlc_st_interface_type_oam":"management","multi_stage_design":"true","oam_sec_group_name":"oam-sec-group","Internal2_net_gateway":"10.0.0.10","sctp-a-ipv6-ingress-dst_end_port":"65535","sctp-b-ipv6-egress-dst_start_port":"0","Internal1_net_gateway":"10.0.0.10","sctp-b-ipv6-egress_rule_protocol":"any","gtp_sec_group_name":"gtp-sec-group","sctp-a-ipv6-egress_dst_subnet_prefix":"0.0.0.0","sctp-b-ipv6-egress_dst_subnet_prefix_len":"0","sctp-a-ipv6-ingress_dst_addresses":"local","sctp-a-egress_rule_protocol":"icmp","sctp-b-ipv6-egress_action":"pass","sctp-a-ipv6-egress_action":"pass","Internal1_shared":"false","sctp-b-ipv6-ingress_rule_protocol":"any","Internal2_net_cidr_len":"17","sctp-a-name":"epc-sctp-a-ipv4v6-sec-group","sctp-a-ingress-src_end_port":"65535.0","sctp-b-ipv6-ingress_src_subnet_prefix":"0.0.0.0","sctp-a-egress-dst_end_port":"65535.0","sctp-a-ingress_action":"pass","sctp-b-egress_rule_protocol":"icmp","sctp-b-ipv6-ingress_action":"pass","vlc_st_service_type":"firewall","sctp-b-ipv6-egress_dst_end_port":"65535","sctp-b-ipv6-ingress-dst_start_port":"0","vlc2_Internal2_mac":"00:11:22:EF:AC:DF","vlc_st_availability_zone":"true","fsb_volume_image_name_1":"MME_FSB2_16ACP04_GA.qcow2","sctp-b-ingress-src_subnet_prefix":"0.0.0.0","sctp-a-ipv6-ingress_src_subnet_prefix_len":"0","Internal1_allow_transit":"true","gpb_flavor_name":"nv.c20r64d1","availability_zone_max_count":"1","fsb_volume_image_name_0":"MME_FSB1_16ACP04_GA.qcow2","sctp-b-ipv6-ingress_dst_addresses":"local","sctp-b-ipv6-egress_dst_subnet_prefix":"0.0.0.0","sctp-b-ipv6-ingress_ethertype":"IPv4","vlc1_Internal2_mac":"00:11:22:EF:AC:DF","sctp-a-ingress-src_subnet_prefix":"0.0.0.0","sctp-a-ipv6-ingress_action":"pass","Internal1_rpf":"disable","sctp-b-ingress_ethertype":"IPv4","sctp-b-egress_rule_application":"any","sctp-b-ingress-src_end_port":"65535.0","sctp-a-ipv6-ingress_rule_protocol":"any","sctp-a-ingress-src_start_port":"0.0","sctp-b-egress-dst_end_port":"65535.0"},"type":"VF","modelCustomizationName":"VF_vMee 0","vfModules":{"vf_vmee0..VfVmee..vmme_vlc..module-1":{"uuid":"522159d5-d6e0-4c2a-aa44-5a542a12a830","invariantUuid":"98a7c88b-b577-476a-90e4-e25a5871e02b","customizationUuid":"55b1be94-671a-403e-a26c-667e9c47d091","description":null,"name":"VfVmee..vmme_vlc..module-1","version":"2","modelCustomizationName":"VfVmee..vmme_vlc..module-1","properties":{"minCountInstances":0,"maxCountInstances":null,"initialCount":0,"vfModuleLabel":"vmme_vlc"},"inputs":{},"volumeGroupAllowed":true},"vf_vmee0..VfVmee..vmme_gpb..module-2":{"uuid":"41708296-e443-4c71-953f-d9a010f059e1","invariantUuid":"1cca90b8-3490-495e-87da-3f3e4c57d5b9","customizationUuid":"6add59e0-7fe1-4bc4-af48-f8812422ae7c","description":null,"name":"VfVmee..vmme_gpb..module-2","version":"2","modelCustomizationName":"VfVmee..vmme_gpb..module-2","properties":{"minCountInstances":0,"maxCountInstances":null,"initialCount":0,"vfModuleLabel":"vmme_gpb"},"inputs":{},"volumeGroupAllowed":false},"vf_vmee0..VfVmee..base_vmme..module-0":{"uuid":"a27f5cfc-7f12-4f99-af08-0af9c3885c87","invariantUuid":"a6f9e51a-2b35-416a-ae15-15e58d61f36d","customizationUuid":"f8c040f1-7e51-4a11-aca8-acf256cfd861","description":null,"name":"VfVmee..base_vmme..module-0","version":"2","modelCustomizationName":"VfVmee..base_vmme..module-0","properties":{"minCountInstances":1,"maxCountInstances":1,"initialCount":1,"vfModuleLabel":"base_vmme"},"inputs":{},"volumeGroupAllowed":true}},"volumeGroups":{"vf_vmee0..VfVmee..base_vmme..module-0":{"uuid":"a27f5cfc-7f12-4f99-af08-0af9c3885c87","invariantUuid":"a6f9e51a-2b35-416a-ae15-15e58d61f36d","customizationUuid":"f8c040f1-7e51-4a11-aca8-acf256cfd861","description":null,"name":"VfVmee..base_vmme..module-0","version":"2","modelCustomizationName":"VfVmee..base_vmme..module-0","properties":{"minCountInstances":1,"maxCountInstances":1,"initialCount":1,"vfModuleLabel":"base_vmme"},"inputs":{}}},"vfcInstanceGroups":{}}},"networks":{"ExtVL 0":{"uuid":"ddc3f20c-08b5-40fd-af72-c6d14636b986","invariantUuid":"379f816b-a7aa-422f-be30-17114ff50b7c","description":"ECOMP generic virtual link (network) base type for all other service-level and global networks","name":"ExtVL","version":"37.0","customizationUuid":"94fdd893-4a36-4d70-b16a-ec29c54c184f","inputs":{},"commands":{},"properties":{"network_assignments":"{is_external_network=false, ipv4_subnet_default_assignment={min_subnets_count=1}, ecomp_generated_network_assignment=false, ipv6_subnet_default_assignment={min_subnets_count=1}}","exVL_naming":"{ecomp_generated_naming=true}","network_flows":"{is_network_policy=false, is_bound_to_vpn=false}","network_homing":"{ecomp_selected_instance_node_target=false}"},"type":"VL","modelCustomizationName":"ExtVL 0"}},"collectionResource":{},"configurations":{"Port Mirroring Configuration By Policy 0":{"uuid":"b4398538-e89d-4f13-b33d-ca323434ba50","invariantUuid":"6ef0ca40-f366-4897-951f-abd65d25f6f7","description":"A port mirroring configuration by policy object","name":"Port Mirroring Configuration By Policy","version":"27.0","customizationUuid":"3c3b7b8d-8669-4b3b-8664-61970041fad2","inputs":{},"commands":{},"properties":{},"type":"Configuration","modelCustomizationName":"Port Mirroring Configuration By Policy 0","sourceNodes":[],"collectorNodes":null,"configurationByPolicy":false}},"serviceProxies":{},"vfModules":{"vf_vmee0..VfVmee..vmme_vlc..module-1":{"uuid":"522159d5-d6e0-4c2a-aa44-5a542a12a830","invariantUuid":"98a7c88b-b577-476a-90e4-e25a5871e02b","customizationUuid":"55b1be94-671a-403e-a26c-667e9c47d091","description":null,"name":"VfVmee..vmme_vlc..module-1","version":"2","modelCustomizationName":"VfVmee..vmme_vlc..module-1","properties":{"minCountInstances":0,"maxCountInstances":null,"initialCount":0,"vfModuleLabel":"vmme_vlc"},"inputs":{},"volumeGroupAllowed":true},"vf_vmee0..VfVmee..vmme_gpb..module-2":{"uuid":"41708296-e443-4c71-953f-d9a010f059e1","invariantUuid":"1cca90b8-3490-495e-87da-3f3e4c57d5b9","customizationUuid":"6add59e0-7fe1-4bc4-af48-f8812422ae7c","description":null,"name":"VfVmee..vmme_gpb..module-2","version":"2","modelCustomizationName":"VfVmee..vmme_gpb..module-2","properties":{"minCountInstances":0,"maxCountInstances":null,"initialCount":0,"vfModuleLabel":"vmme_gpb"},"inputs":{},"volumeGroupAllowed":false},"vf_vmee0..VfVmee..base_vmme..module-0":{"uuid":"a27f5cfc-7f12-4f99-af08-0af9c3885c87","invariantUuid":"a6f9e51a-2b35-416a-ae15-15e58d61f36d","customizationUuid":"f8c040f1-7e51-4a11-aca8-acf256cfd861","description":null,"name":"VfVmee..base_vmme..module-0","version":"2","modelCustomizationName":"VfVmee..base_vmme..module-0","properties":{"minCountInstances":1,"maxCountInstances":1,"initialCount":1,"vfModuleLabel":"base_vmme"},"inputs":{},"volumeGroupAllowed":true}},"volumeGroups":{"vf_vmee0..VfVmee..base_vmme..module-0":{"uuid":"a27f5cfc-7f12-4f99-af08-0af9c3885c87","invariantUuid":"a6f9e51a-2b35-416a-ae15-15e58d61f36d","customizationUuid":"f8c040f1-7e51-4a11-aca8-acf256cfd861","description":null,"name":"VfVmee..base_vmme..module-0","version":"2","modelCustomizationName":"VfVmee..base_vmme..module-0","properties":{"minCountInstances":1,"maxCountInstances":1,"initialCount":1,"vfModuleLabel":"base_vmme"},"inputs":{}}},"pnfs":{}},"6b528779-44a3-4472-bdff-9cd15ec93450":{"service":{"uuid":"6b528779-44a3-4472-bdff-9cd15ec93450","invariantUuid":"e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0","name":"action-data","version":"1.0","toscaModelURL":null,"category":"","serviceType":"","serviceRole":"","description":"","serviceEcompNaming":"false","instantiationType":"A-La-Carte","inputs":{"2017488_adiodvpe0_ASN":{"type":"string","description":"AV/PE","entry_schema":null,"inputProperties":null,"constraints":[],"required":true,"default":"AV_vPE"}}},"vnfs":{"2017-388_ADIOD-vPE 1":{"uuid":"0903e1c0-8e03-4936-b5c2-260653b96413","invariantUuid":"00beb8f9-6d39-452f-816d-c709b9cbb87d","description":"Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM","name":"2017-388_ADIOD-vPE","version":"1.0","customizationUuid":"280dec31-f16d-488b-9668-4aae55d6648a","inputs":{"vnf_config_template_version":{"type":"string","description":"VPE Software Version","entry_schema":null,"inputProperties":null,"constraints":[],"required":true,"default":"17.2"},"bandwidth_units":{"type":"string","description":"Units of bandwidth","entry_schema":null,"inputProperties":null,"constraints":[],"required":true,"default":"Gbps"},"bandwidth":{"type":"string","description":"Requested VPE bandwidth","entry_schema":null,"inputProperties":null,"constraints":[],"required":true,"default":"10"},"AIC_CLLI":{"type":"string","description":"AIC Site CLLI","entry_schema":null,"inputProperties":null,"constraints":[],"required":true,"default":"ATLMY8GA"},"ASN":{"type":"string","description":"AV/PE","entry_schema":null,"inputProperties":null,"constraints":[],"required":true,"default":"AV_vPE"},"vnf_instance_name":{"type":"string","description":"The hostname assigned to the vpe.","entry_schema":null,"inputProperties":null,"constraints":[],"required":true,"default":"mtnj309me6"}},"commands":{"vnf_config_template_version":{"displayName":"vnf_config_template_version","command":"get_input","inputName":"2017488_adiodvpe0_vnf_config_template_version"},"bandwidth_units":{"displayName":"bandwidth_units","command":"get_input","inputName":"adiodvpe0_bandwidth_units"},"bandwidth":{"displayName":"bandwidth","command":"get_input","inputName":"adiodvpe0_bandwidth"},"AIC_CLLI":{"displayName":"AIC_CLLI","command":"get_input","inputName":"2017488_adiodvpe0_AIC_CLLI"},"ASN":{"displayName":"ASN","command":"get_input","inputName":"2017488_adiodvpe0_ASN"},"vnf_instance_name":{"displayName":"vnf_instance_name","command":"get_input","inputName":"2017488_adiodvpe0_vnf_instance_name"}},"properties":{"vmxvre_retype":"RE-VMX","vnf_config_template_version":"get_input:2017488_adiodvpe0_vnf_config_template_version","sriov44_net_id":"48d399b3-11ee-48a8-94d2-f0ea94d6be8d","int_ctl_net_id":"2f323477-6936-4d01-ac53-d849430281d9","vmxvpfe_sriov41_0_port_mac":"00:11:22:EF:AC:DF","int_ctl_net_name":"VMX-INTXI","vmx_int_ctl_prefix":"10.0.0.10","sriov43_net_id":"da349ca1-6de9-4548-be88-2d88e99bfef5","sriov42_net_id":"760669ba-013d-4d9b-b0e7-4151fe2e6279","sriov41_net_id":"25ad52d5-c165-40f8-b3b0-ddfc2373280a","nf_type":"vPE","vmxvpfe_int_ctl_ip_1":"10.0.0.10","is_AVPN_service":"false","vmx_RSG_name":"vREXI-affinity","vmx_int_ctl_forwarding":"l2","vmxvre_oam_ip_0":"10.0.0.10","vmxvpfe_sriov44_0_port_mac":"00:11:22:EF:AC:DF","vmxvpfe_sriov41_0_port_vlanstrip":"false","vmxvpfe_sriov42_0_port_vlanfilter":"4001","vmxvpfe_sriov44_0_port_unknownunicastallow":"true","vmxvre_image_name_0":"VRE-ENGINE_17.2-S2.1.qcow2","vmxvre_instance":"0","vmxvpfe_sriov43_0_port_mac":"00:11:22:EF:AC:DF","vmxvre_flavor_name":"ns.c1r16d32.v5","vmxvpfe_volume_size_0":"40.0","vmxvpfe_sriov43_0_port_vlanfilter":"4001","nf_naming":"{ecomp_generated_naming=false}","nf_naming_code":"Navneet","vmxvre_name_0":"vREXI","vmxvpfe_sriov42_0_port_vlanstrip":"false","vmxvpfe_volume_name_0":"vPFEXI_FBVolume","vmx_RSG_id":"bd89a33c-13c3-4a04-8fde-1a57eb123141","vmxvpfe_image_name_0":"VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2","vmxvpfe_sriov43_0_port_unknownunicastallow":"true","vmxvpfe_sriov44_0_port_unknownmulticastallow":"true","vmxvre_console":"vidconsole","vmxvpfe_sriov44_0_port_vlanfilter":"4001","vmxvpfe_sriov42_0_port_mac":"00:11:22:EF:AC:DF","vmxvpfe_volume_id_0":"47cede15-da2f-4397-a101-aa683220aff3","vmxvpfe_sriov42_0_port_unknownmulticastallow":"true","vmxvpfe_sriov44_0_port_vlanstrip":"false","vf_module_id":"123","nf_function":"JAI","vmxvpfe_sriov43_0_port_unknownmulticastallow":"true","vmxvre_int_ctl_ip_0":"10.0.0.10","ecomp_generated_naming":"false","AIC_CLLI":"get_input:2017488_adiodvpe0_AIC_CLLI","vnf_name":"mtnj309me6vre","vmxvpfe_sriov41_0_port_unknownunicastallow":"true","vmxvre_volume_type_1":"HITACHI","vmxvpfe_sriov44_0_port_broadcastallow":"true","vmxvre_volume_type_0":"HITACHI","vmxvpfe_volume_type_0":"HITACHI","vmxvpfe_sriov43_0_port_broadcastallow":"true","bandwidth_units":"get_input:adiodvpe0_bandwidth_units","vnf_id":"123","vmxvre_oam_prefix":"24","availability_zone_0":"mtpocfo-kvm-az01","ASN":"get_input:2017488_adiodvpe0_ASN","vmxvre_chassis_i2cid":"161","vmxvpfe_name_0":"vPFEXI","bandwidth":"get_input:adiodvpe0_bandwidth","availability_zone_max_count":"1","vmxvre_volume_size_0":"45.0","vmxvre_volume_size_1":"50.0","vmxvpfe_sriov42_0_port_broadcastallow":"true","vmxvre_oam_gateway":"10.0.0.10","vmxvre_volume_name_1":"vREXI_FAVolume","vmxvre_ore_present":"0","vmxvre_volume_name_0":"vREXI_FBVolume","vmxvre_type":"0","vnf_instance_name":"get_input:2017488_adiodvpe0_vnf_instance_name","vmxvpfe_sriov41_0_port_unknownmulticastallow":"true","oam_net_id":"b95eeb1d-d55d-4827-abb4-8ebb94941429","vmx_int_ctl_len":"24","vmxvpfe_sriov43_0_port_vlanstrip":"false","vmxvpfe_sriov41_0_port_broadcastallow":"true","vmxvre_volume_id_1":"6e86797e-03cd-4fdc-ba72-2957119c746d","vmxvpfe_sriov41_0_port_vlanfilter":"4001","nf_role":"Testing","vmxvre_volume_id_0":"f4eacb79-f687-4e9d-b760-21847c8bb15a","vmxvpfe_sriov42_0_port_unknownunicastallow":"true","vmxvpfe_flavor_name":"ns.c20r16d25.v5"},"type":"VF","modelCustomizationName":"2017-388_ADIOD-vPE 1","vfModules":{},"volumeGroups":{},"vfcInstanceGroups":{}},"2017-388_ADIOD-vPE 0":{"uuid":"afacccf6-397d-45d6-b5ae-94c39734b168","invariantUuid":"72e465fe-71b1-4e7b-b5ed-9496118ff7a8","description":"Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM","name":"2017-388_ADIOD-vPE","version":"4.0","customizationUuid":"b3c76f73-eeb5-4fb6-9d31-72a889f1811c","inputs":{"vnf_config_template_version":{"type":"string","description":"VPE Software Version","entry_schema":null,"inputProperties":null,"constraints":[],"required":true,"default":"17.2"},"bandwidth_units":{"type":"string","description":"Units of bandwidth","entry_schema":null,"inputProperties":null,"constraints":[],"required":true,"default":"Gbps"},"bandwidth":{"type":"string","description":"Requested VPE bandwidth","entry_schema":null,"inputProperties":null,"constraints":[],"required":true,"default":"10"},"AIC_CLLI":{"type":"string","description":"AIC Site CLLI","entry_schema":null,"inputProperties":null,"constraints":[],"required":true,"default":"ATLMY8GA"},"ASN":{"type":"string","description":"AV/PE","entry_schema":null,"inputProperties":null,"constraints":[],"required":true,"default":"AV_vPE"},"vnf_instance_name":{"type":"string","description":"The hostname assigned to the vpe.","entry_schema":null,"inputProperties":null,"constraints":[],"required":true,"default":"mtnj309me6"}},"commands":{"vnf_config_template_version":{"displayName":"vnf_config_template_version","command":"get_input","inputName":"2017488_adiodvpe0_vnf_config_template_version"},"bandwidth_units":{"displayName":"bandwidth_units","command":"get_input","inputName":"adiodvpe0_bandwidth_units"},"bandwidth":{"displayName":"bandwidth","command":"get_input","inputName":"adiodvpe0_bandwidth"},"AIC_CLLI":{"displayName":"AIC_CLLI","command":"get_input","inputName":"2017488_adiodvpe0_AIC_CLLI"},"ASN":{"displayName":"ASN","command":"get_input","inputName":"2017488_adiodvpe0_ASN"},"vnf_instance_name":{"displayName":"vnf_instance_name","command":"get_input","inputName":"2017488_adiodvpe0_vnf_instance_name"}},"properties":{"vmxvre_retype":"RE-VMX","vnf_config_template_version":"get_input:2017488_adiodvpe0_vnf_config_template_version","sriov44_net_id":"48d399b3-11ee-48a8-94d2-f0ea94d6be8d","int_ctl_net_id":"2f323477-6936-4d01-ac53-d849430281d9","vmxvpfe_sriov41_0_port_mac":"00:11:22:EF:AC:DF","int_ctl_net_name":"VMX-INTXI","vmx_int_ctl_prefix":"10.0.0.10","sriov43_net_id":"da349ca1-6de9-4548-be88-2d88e99bfef5","sriov42_net_id":"760669ba-013d-4d9b-b0e7-4151fe2e6279","sriov41_net_id":"25ad52d5-c165-40f8-b3b0-ddfc2373280a","nf_type":"vPE","vmxvpfe_int_ctl_ip_1":"10.0.0.10","is_AVPN_service":"false","vmx_RSG_name":"vREXI-affinity","vmx_int_ctl_forwarding":"l2","vmxvre_oam_ip_0":"10.0.0.10","vmxvpfe_sriov44_0_port_mac":"00:11:22:EF:AC:DF","vmxvpfe_sriov41_0_port_vlanstrip":"false","vmxvpfe_sriov42_0_port_vlanfilter":"4001","vmxvpfe_sriov44_0_port_unknownunicastallow":"true","vmxvre_image_name_0":"VRE-ENGINE_17.2-S2.1.qcow2","vmxvre_instance":"0","vmxvpfe_sriov43_0_port_mac":"00:11:22:EF:AC:DF","vmxvre_flavor_name":"ns.c1r16d32.v5","vmxvpfe_volume_size_0":"40.0","vmxvpfe_sriov43_0_port_vlanfilter":"4001","nf_naming":"{ecomp_generated_naming=false}","nf_naming_code":"Navneet","vmxvre_name_0":"vREXI","vmxvpfe_sriov42_0_port_vlanstrip":"false","vmxvpfe_volume_name_0":"vPFEXI_FBVolume","vmx_RSG_id":"bd89a33c-13c3-4a04-8fde-1a57eb123141","vmxvpfe_image_name_0":"VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2","vmxvpfe_sriov43_0_port_unknownunicastallow":"true","vmxvpfe_sriov44_0_port_unknownmulticastallow":"true","vmxvre_console":"vidconsole","vmxvpfe_sriov44_0_port_vlanfilter":"4001","vmxvpfe_sriov42_0_port_mac":"00:11:22:EF:AC:DF","vmxvpfe_volume_id_0":"47cede15-da2f-4397-a101-aa683220aff3","vmxvpfe_sriov42_0_port_unknownmulticastallow":"true","min_instances":"1","vmxvpfe_sriov44_0_port_vlanstrip":"false","vf_module_id":"123","nf_function":"JAI","vmxvpfe_sriov43_0_port_unknownmulticastallow":"true","vmxvre_int_ctl_ip_0":"10.0.0.10","ecomp_generated_naming":"false","AIC_CLLI":"get_input:2017488_adiodvpe0_AIC_CLLI","vnf_name":"mtnj309me6vre","vmxvpfe_sriov41_0_port_unknownunicastallow":"true","vmxvre_volume_type_1":"HITACHI","vmxvpfe_sriov44_0_port_broadcastallow":"true","vmxvre_volume_type_0":"HITACHI","vmxvpfe_volume_type_0":"HITACHI","vmxvpfe_sriov43_0_port_broadcastallow":"true","bandwidth_units":"get_input:adiodvpe0_bandwidth_units","vnf_id":"123","vmxvre_oam_prefix":"24","availability_zone_0":"mtpocfo-kvm-az01","ASN":"get_input:2017488_adiodvpe0_ASN","vmxvre_chassis_i2cid":"161","vmxvpfe_name_0":"vPFEXI","bandwidth":"get_input:adiodvpe0_bandwidth","availability_zone_max_count":"1","vmxvre_volume_size_0":"45.0","vmxvre_volume_size_1":"50.0","vmxvpfe_sriov42_0_port_broadcastallow":"true","vmxvre_oam_gateway":"10.0.0.10","vmxvre_volume_name_1":"vREXI_FAVolume","vmxvre_ore_present":"0","vmxvre_volume_name_0":"vREXI_FBVolume","vmxvre_type":"0","vnf_instance_name":"get_input:2017488_adiodvpe0_vnf_instance_name","vmxvpfe_sriov41_0_port_unknownmulticastallow":"true","oam_net_id":"b95eeb1d-d55d-4827-abb4-8ebb94941429","vmx_int_ctl_len":"24","vmxvpfe_sriov43_0_port_vlanstrip":"false","vmxvpfe_sriov41_0_port_broadcastallow":"true","vmxvre_volume_id_1":"6e86797e-03cd-4fdc-ba72-2957119c746d","vmxvpfe_sriov41_0_port_vlanfilter":"4001","nf_role":"Testing","vmxvre_volume_id_0":"f4eacb79-f687-4e9d-b760-21847c8bb15a","vmxvpfe_sriov42_0_port_unknownunicastallow":"true","vmxvpfe_flavor_name":"ns.c20r16d25.v5"},"type":"VF","modelCustomizationName":"2017-388_ADIOD-vPE 0","vfModules":{},"volumeGroups":{},"vfcInstanceGroups":{}},"2017-488_ADIOD-vPE 0":{"uuid":"69e09f68-8b63-4cc9-b9ff-860960b5db09","invariantUuid":"72e465fe-71b1-4e7b-b5ed-9496118ff7a8","description":"Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM","name":"2017-488_ADIOD-vPE","version":"5.0","customizationUuid":"1da7b585-5e61-4993-b95e-8e6606c81e45","inputs":{"vnf_config_template_version":{"type":"string","description":"VPE Software Version","entry_schema":null,"inputProperties":null,"constraints":[],"required":true,"default":"17.2"},"bandwidth_units":{"type":"string","description":"Units of bandwidth","entry_schema":null,"inputProperties":null,"constraints":[],"required":true,"default":"Gbps"},"bandwidth":{"type":"string","description":"Requested VPE bandwidth","entry_schema":null,"inputProperties":null,"constraints":[],"required":true,"default":"10"},"AIC_CLLI":{"type":"string","description":"AIC Site CLLI","entry_schema":null,"inputProperties":null,"constraints":[],"required":true,"default":"ATLMY8GA"},"ASN":{"type":"string","description":"AV/PE","entry_schema":null,"inputProperties":null,"constraints":[],"required":true,"default":"AV_vPE"},"vnf_instance_name":{"type":"string","description":"The hostname assigned to the vpe.","entry_schema":null,"inputProperties":null,"constraints":[],"required":true,"default":"mtnj309me6"}},"commands":{"vnf_config_template_version":{"displayName":"vnf_config_template_version","command":"get_input","inputName":"2017488_adiodvpe0_vnf_config_template_version"},"bandwidth_units":{"displayName":"bandwidth_units","command":"get_input","inputName":"adiodvpe0_bandwidth_units"},"bandwidth":{"displayName":"bandwidth","command":"get_input","inputName":"adiodvpe0_bandwidth"},"AIC_CLLI":{"displayName":"AIC_CLLI","command":"get_input","inputName":"2017488_adiodvpe0_AIC_CLLI"},"ASN":{"displayName":"ASN","command":"get_input","inputName":"2017488_adiodvpe0_ASN"},"vnf_instance_name":{"displayName":"vnf_instance_name","command":"get_input","inputName":"2017488_adiodvpe0_vnf_instance_name"}},"properties":{"vmxvre_retype":"RE-VMX","vnf_config_template_version":"get_input:2017488_adiodvpe0_vnf_config_template_version","sriov44_net_id":"48d399b3-11ee-48a8-94d2-f0ea94d6be8d","int_ctl_net_id":"2f323477-6936-4d01-ac53-d849430281d9","vmxvpfe_sriov41_0_port_mac":"00:11:22:EF:AC:DF","int_ctl_net_name":"VMX-INTXI","vmx_int_ctl_prefix":"10.0.0.10","sriov43_net_id":"da349ca1-6de9-4548-be88-2d88e99bfef5","sriov42_net_id":"760669ba-013d-4d9b-b0e7-4151fe2e6279","sriov41_net_id":"25ad52d5-c165-40f8-b3b0-ddfc2373280a","nf_type":"vPE","vmxvpfe_int_ctl_ip_1":"10.0.0.10","is_AVPN_service":"false","vmx_RSG_name":"vREXI-affinity","vmx_int_ctl_forwarding":"l2","vmxvre_oam_ip_0":"10.0.0.10","vmxvpfe_sriov44_0_port_mac":"00:11:22:EF:AC:DF","vmxvpfe_sriov41_0_port_vlanstrip":"false","vmxvpfe_sriov42_0_port_vlanfilter":"4001","vmxvpfe_sriov44_0_port_unknownunicastallow":"true","vmxvre_image_name_0":"VRE-ENGINE_17.2-S2.1.qcow2","vmxvre_instance":"0","vmxvpfe_sriov43_0_port_mac":"00:11:22:EF:AC:DF","vmxvre_flavor_name":"ns.c1r16d32.v5","vmxvpfe_volume_size_0":"40.0","vmxvpfe_sriov43_0_port_vlanfilter":"4001","nf_naming":"{ecomp_generated_naming=false}","nf_naming_code":"Navneet","vmxvre_name_0":"vREXI","vmxvpfe_sriov42_0_port_vlanstrip":"false","vmxvpfe_volume_name_0":"vPFEXI_FBVolume","max_instances":"3","vmx_RSG_id":"bd89a33c-13c3-4a04-8fde-1a57eb123141","vmxvpfe_image_name_0":"VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2","vmxvpfe_sriov43_0_port_unknownunicastallow":"true","vmxvpfe_sriov44_0_port_unknownmulticastallow":"true","vmxvre_console":"vidconsole","vmxvpfe_sriov44_0_port_vlanfilter":"4001","vmxvpfe_sriov42_0_port_mac":"00:11:22:EF:AC:DF","vmxvpfe_volume_id_0":"47cede15-da2f-4397-a101-aa683220aff3","vmxvpfe_sriov42_0_port_unknownmulticastallow":"true","min_instances":"1","vmxvpfe_sriov44_0_port_vlanstrip":"false","vf_module_id":"123","nf_function":"JAI","vmxvpfe_sriov43_0_port_unknownmulticastallow":"true","vmxvre_int_ctl_ip_0":"10.0.0.10","ecomp_generated_naming":"false","AIC_CLLI":"get_input:2017488_adiodvpe0_AIC_CLLI","vnf_name":"mtnj309me6vre","vmxvpfe_sriov41_0_port_unknownunicastallow":"true","vmxvre_volume_type_1":"HITACHI","vmxvpfe_sriov44_0_port_broadcastallow":"true","vmxvre_volume_type_0":"HITACHI","vmxvpfe_volume_type_0":"HITACHI","vmxvpfe_sriov43_0_port_broadcastallow":"true","bandwidth_units":"get_input:adiodvpe0_bandwidth_units","vnf_id":"123","vmxvre_oam_prefix":"24","availability_zone_0":"mtpocfo-kvm-az01","ASN":"get_input:2017488_adiodvpe0_ASN","vmxvre_chassis_i2cid":"161","vmxvpfe_name_0":"vPFEXI","bandwidth":"get_input:adiodvpe0_bandwidth","availability_zone_max_count":"1","vmxvre_volume_size_0":"45.0","vmxvre_volume_size_1":"50.0","vmxvpfe_sriov42_0_port_broadcastallow":"true","vmxvre_oam_gateway":"10.0.0.10","vmxvre_volume_name_1":"vREXI_FAVolume","vmxvre_ore_present":"0","vmxvre_volume_name_0":"vREXI_FBVolume","vmxvre_type":"0","vnf_instance_name":"get_input:2017488_adiodvpe0_vnf_instance_name","vmxvpfe_sriov41_0_port_unknownmulticastallow":"true","oam_net_id":"b95eeb1d-d55d-4827-abb4-8ebb94941429","vmx_int_ctl_len":"24","vmxvpfe_sriov43_0_port_vlanstrip":"false","vmxvpfe_sriov41_0_port_broadcastallow":"true","vmxvre_volume_id_1":"6e86797e-03cd-4fdc-ba72-2957119c746d","vmxvpfe_sriov41_0_port_vlanfilter":"4001","nf_role":"Testing","vmxvre_volume_id_0":"f4eacb79-f687-4e9d-b760-21847c8bb15a","vmxvpfe_sriov42_0_port_unknownunicastallow":"true","vmxvpfe_flavor_name":"ns.c20r16d25.v5"},"type":"VF","modelCustomizationName":"2017-488_ADIOD-vPE 0","vfModules":{"2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1":{"uuid":"25284168-24bb-4698-8cb4-3f509146eca5","invariantUuid":"7253ff5c-97f0-4b8b-937c-77aeb4d79aa1","customizationUuid":"f7e7c365-60cf-49a9-9ebf-a1aa11b9d401","description":null,"name":"2017488AdiodVpe..ADIOD_vRE_BV..module-1","version":"6","modelCustomizationName":"2017488AdiodVpe..ADIOD_vRE_BV..module-1","properties":{"minCountInstances":0,"maxCountInstances":null,"initialCount":0,"vfModuleLabel":"ADIOD_vRE_BV"},"inputs":{"adiodvpe0_bandwidth":{"type":"string","description":"Requested VPE bandwidth","entry_schema":null,"inputProperties":{"sourceType":"HEAT","vfModuleLabel":"ADIOD_vRE_BV","paramName":"bandwidth"},"constraints":null,"required":true,"default":"10"},"2017488_adiodvpe0_vnf_instance_name":{"type":"string","description":"The hostname assigned to the vpe.","entry_schema":null,"inputProperties":{"sourceType":"HEAT","vfModuleLabel":"ADIOD_vRE_BV","paramName":"vnf_instance_name"},"constraints":null,"required":true,"default":"mtnj309me6"},"2017488_adiodvpe0_vnf_config_template_version":{"type":"string","description":"VPE Software Version","entry_schema":null,"inputProperties":{"sourceType":"HEAT","vfModuleLabel":"ADIOD_vRE_BV","paramName":"vnf_config_template_version"},"constraints":null,"required":true,"default":"17.2"},"2017488_adiodvpe0_AIC_CLLI":{"type":"string","description":"AIC Site CLLI","entry_schema":null,"inputProperties":{"sourceType":"HEAT","vfModuleLabel":"ADIOD_vRE_BV","paramName":"AIC_CLLI"},"constraints":null,"required":true,"default":"ATLMY8GA"},"adiodvpe0_bandwidth_units":{"type":"string","description":"Units of bandwidth","entry_schema":null,"inputProperties":{"sourceType":"HEAT","vfModuleLabel":"ADIOD_vRE_BV","paramName":"bandwidth_units"},"constraints":null,"required":true,"default":"Gbps"}},"volumeGroupAllowed":true},"2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0":{"uuid":"f8360508-3f17-4414-a2ed-6bc71161e8db","invariantUuid":"b34833bb-6aa9-4ad6-a831-70b06367a091","customizationUuid":"a55961b2-2065-4ab0-a5b7-2fcee1c227e3","description":null,"name":"2017488AdiodVpe..ADIOD_base_vPE_BV..module-0","version":"5","modelCustomizationName":"2017488AdiodVpe..ADIOD_base_vPE_BV..module-0","properties":{"minCountInstances":1,"maxCountInstances":1,"initialCount":1,"vfModuleLabel":"ADIOD_base_vPE_BV"},"inputs":{},"volumeGroupAllowed":false},"2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2":{"uuid":"0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a","invariantUuid":"eff8cc59-53a1-4101-aed7-8cf24ecf8339","customizationUuid":"3cd946bb-50e0-40d8-96d3-c9023520b557","description":null,"name":"2017488AdiodVpe..ADIOD_vPFE_BV..module-2","version":"6","modelCustomizationName":"2017488AdiodVpe..ADIOD_vPFE_BV..module-2","properties":{"minCountInstances":0,"maxCountInstances":null,"initialCount":0,"vfModuleLabel":"ADIOD_vPFE_BV"},"inputs":{},"volumeGroupAllowed":true}},"volumeGroups":{"2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1":{"uuid":"25284168-24bb-4698-8cb4-3f509146eca5","invariantUuid":"7253ff5c-97f0-4b8b-937c-77aeb4d79aa1","customizationUuid":"f7e7c365-60cf-49a9-9ebf-a1aa11b9d401","description":null,"name":"2017488AdiodVpe..ADIOD_vRE_BV..module-1","version":"6","modelCustomizationName":"2017488AdiodVpe..ADIOD_vRE_BV..module-1","properties":{"minCountInstances":0,"maxCountInstances":null,"initialCount":0,"vfModuleLabel":"ADIOD_vRE_BV"},"inputs":{"adiodvpe0_bandwidth":{"type":"string","description":"Requested VPE bandwidth","entry_schema":null,"inputProperties":{"sourceType":"HEAT","vfModuleLabel":"ADIOD_vRE_BV","paramName":"bandwidth"},"constraints":null,"required":true,"default":"10"},"2017488_adiodvpe0_vnf_instance_name":{"type":"string","description":"The hostname assigned to the vpe.","entry_schema":null,"inputProperties":{"sourceType":"HEAT","vfModuleLabel":"ADIOD_vRE_BV","paramName":"vnf_instance_name"},"constraints":null,"required":true,"default":"mtnj309me6"},"2017488_adiodvpe0_vnf_config_template_version":{"type":"string","description":"VPE Software Version","entry_schema":null,"inputProperties":{"sourceType":"HEAT","vfModuleLabel":"ADIOD_vRE_BV","paramName":"vnf_config_template_version"},"constraints":null,"required":true,"default":"17.2"},"2017488_adiodvpe0_AIC_CLLI":{"type":"string","description":"AIC Site CLLI","entry_schema":null,"inputProperties":{"sourceType":"HEAT","vfModuleLabel":"ADIOD_vRE_BV","paramName":"AIC_CLLI"},"constraints":null,"required":true,"default":"ATLMY8GA"},"adiodvpe0_bandwidth_units":{"type":"string","description":"Units of bandwidth","entry_schema":null,"inputProperties":{"sourceType":"HEAT","vfModuleLabel":"ADIOD_vRE_BV","paramName":"bandwidth_units"},"constraints":null,"required":true,"default":"Gbps"}}},"2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2":{"uuid":"0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a","invariantUuid":"eff8cc59-53a1-4101-aed7-8cf24ecf8339","customizationUuid":"3cd946bb-50e0-40d8-96d3-c9023520b557","description":null,"name":"2017488AdiodVpe..ADIOD_vPFE_BV..module-2","version":"6","modelCustomizationName":"2017488AdiodVpe..ADIOD_vPFE_BV..module-2","properties":{"minCountInstances":0,"maxCountInstances":null,"initialCount":0,"vfModuleLabel":"ADIOD_vPFE_BV"},"inputs":{}}},"vfcInstanceGroups":{}}},"networks":{"ExtVL 0":{"uuid":"ddc3f20c-08b5-40fd-af72-c6d14636b986","invariantUuid":"379f816b-a7aa-422f-be30-17114ff50b7c","description":"ECOMP generic virtual link (network) base type for all other service-level and global networks","name":"ExtVL","version":"37.0","customizationUuid":"94fdd893-4a36-4d70-b16a-ec29c54c184f","inputs":{"vnf_config_template_version":{"type":"string","description":"VPE Software Version","entry_schema":null,"inputProperties":null,"constraints":[],"required":true,"default":"17.2"},"bandwidth_units":{"type":"string","description":"Units of bandwidth","entry_schema":null,"inputProperties":null,"constraints":[],"required":true,"default":"Gbps"},"bandwidth":{"type":"string","description":"Requested VPE bandwidth","entry_schema":null,"inputProperties":null,"constraints":[],"required":true,"default":"10"},"AIC_CLLI":{"type":"string","description":"AIC Site CLLI","entry_schema":null,"inputProperties":null,"constraints":[],"required":true,"default":"ATLMY8GA"},"ASN":{"type":"string","description":"AV/PE","entry_schema":null,"inputProperties":null,"constraints":[],"required":true,"default":"AV_vPE"},"vnf_instance_name":{"type":"string","description":"The hostname assigned to the vpe.","entry_schema":null,"inputProperties":null,"constraints":[],"required":true,"default":"mtnj309me6"}},"commands":{},"properties":{"min_instances":1,"max_instances":10,"network_assignments":"{is_external_network=false, ipv4_subnet_default_assignment={min_subnets_count=1}, ecomp_generated_network_assignment=false, ipv6_subnet_default_assignment={min_subnets_count=1}}","exVL_naming":"{ecomp_generated_naming=true}","network_flows":"{is_network_policy=false, is_bound_to_vpn=false}","network_homing":"{ecomp_selected_instance_node_target=false}"},"type":"VL","modelCustomizationName":"ExtVL 0"}},"collectionResource":{},"configurations":{},"fabricConfigurations":{},"serviceProxies":{},"vfModules":{"2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1":{"uuid":"25284168-24bb-4698-8cb4-3f509146eca5","invariantUuid":"7253ff5c-97f0-4b8b-937c-77aeb4d79aa1","customizationUuid":"f7e7c365-60cf-49a9-9ebf-a1aa11b9d401","description":null,"name":"2017488AdiodVpe..ADIOD_vRE_BV..module-1","version":"6","modelCustomizationName":"2017488AdiodVpe..ADIOD_vRE_BV..module-1","properties":{"minCountInstances":0,"maxCountInstances":null,"initialCount":0,"vfModuleLabel":"ADIOD_vRE_BV"},"inputs":{"adiodvpe0_bandwidth":{"type":"string","description":"Requested VPE bandwidth","entry_schema":null,"inputProperties":{"sourceType":"HEAT","vfModuleLabel":"ADIOD_vRE_BV","paramName":"bandwidth"},"constraints":null,"required":true,"default":"10"},"2017488_adiodvpe0_vnf_instance_name":{"type":"string","description":"The hostname assigned to the vpe.","entry_schema":null,"inputProperties":{"sourceType":"HEAT","vfModuleLabel":"ADIOD_vRE_BV","paramName":"vnf_instance_name"},"constraints":null,"required":true,"default":"mtnj309me6"},"2017488_adiodvpe0_vnf_config_template_version":{"type":"string","description":"VPE Software Version","entry_schema":null,"inputProperties":{"sourceType":"HEAT","vfModuleLabel":"ADIOD_vRE_BV","paramName":"vnf_config_template_version"},"constraints":null,"required":true,"default":"17.2"},"2017488_adiodvpe0_AIC_CLLI":{"type":"string","description":"AIC Site CLLI","entry_schema":null,"inputProperties":{"sourceType":"HEAT","vfModuleLabel":"ADIOD_vRE_BV","paramName":"AIC_CLLI"},"constraints":null,"required":true,"default":"ATLMY8GA"},"adiodvpe0_bandwidth_units":{"type":"string","description":"Units of bandwidth","entry_schema":null,"inputProperties":{"sourceType":"HEAT","vfModuleLabel":"ADIOD_vRE_BV","paramName":"bandwidth_units"},"constraints":null,"required":true,"default":"Gbps"}},"volumeGroupAllowed":true},"2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0":{"uuid":"f8360508-3f17-4414-a2ed-6bc71161e8db","invariantUuid":"b34833bb-6aa9-4ad6-a831-70b06367a091","customizationUuid":"a55961b2-2065-4ab0-a5b7-2fcee1c227e3","description":null,"name":"2017488AdiodVpe..ADIOD_base_vPE_BV..module-0","version":"5","modelCustomizationName":"2017488AdiodVpe..ADIOD_base_vPE_BV..module-0","properties":{"minCountInstances":1,"maxCountInstances":1,"initialCount":1,"vfModuleLabel":"ADIOD_base_vPE_BV"},"inputs":{},"volumeGroupAllowed":false},"2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2":{"uuid":"0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a","invariantUuid":"eff8cc59-53a1-4101-aed7-8cf24ecf8339","customizationUuid":"3cd946bb-50e0-40d8-96d3-c9023520b557","description":null,"name":"2017488AdiodVpe..ADIOD_vPFE_BV..module-2","version":"6","modelCustomizationName":"2017488AdiodVpe..ADIOD_vPFE_BV..module-2","properties":{"minCountInstances":0,"maxCountInstances":null,"initialCount":0,"vfModuleLabel":"ADIOD_vPFE_BV"},"inputs":{},"volumeGroupAllowed":true}},"volumeGroups":{"2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1":{"uuid":"25284168-24bb-4698-8cb4-3f509146eca5","invariantUuid":"7253ff5c-97f0-4b8b-937c-77aeb4d79aa1","customizationUuid":"f7e7c365-60cf-49a9-9ebf-a1aa11b9d401","description":null,"name":"2017488AdiodVpe..ADIOD_vRE_BV..module-1","version":"6","modelCustomizationName":"2017488AdiodVpe..ADIOD_vRE_BV..module-1","properties":{"minCountInstances":0,"maxCountInstances":null,"initialCount":0,"vfModuleLabel":"ADIOD_vRE_BV"},"inputs":{"adiodvpe0_bandwidth":{"type":"string","description":"Requested VPE bandwidth","entry_schema":null,"inputProperties":{"sourceType":"HEAT","vfModuleLabel":"ADIOD_vRE_BV","paramName":"bandwidth"},"constraints":null,"required":true,"default":"10"},"2017488_adiodvpe0_vnf_instance_name":{"type":"string","description":"The hostname assigned to the vpe.","entry_schema":null,"inputProperties":{"sourceType":"HEAT","vfModuleLabel":"ADIOD_vRE_BV","paramName":"vnf_instance_name"},"constraints":null,"required":true,"default":"mtnj309me6"},"2017488_adiodvpe0_vnf_config_template_version":{"type":"string","description":"VPE Software Version","entry_schema":null,"inputProperties":{"sourceType":"HEAT","vfModuleLabel":"ADIOD_vRE_BV","paramName":"vnf_config_template_version"},"constraints":null,"required":true,"default":"17.2"},"2017488_adiodvpe0_AIC_CLLI":{"type":"string","description":"AIC Site CLLI","entry_schema":null,"inputProperties":{"sourceType":"HEAT","vfModuleLabel":"ADIOD_vRE_BV","paramName":"AIC_CLLI"},"constraints":null,"required":true,"default":"ATLMY8GA"},"adiodvpe0_bandwidth_units":{"type":"string","description":"Units of bandwidth","entry_schema":null,"inputProperties":{"sourceType":"HEAT","vfModuleLabel":"ADIOD_vRE_BV","paramName":"bandwidth_units"},"constraints":null,"required":true,"default":"Gbps"}}},"2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2":{"uuid":"0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a","invariantUuid":"eff8cc59-53a1-4101-aed7-8cf24ecf8339","customizationUuid":"3cd946bb-50e0-40d8-96d3-c9023520b557","description":null,"name":"2017488AdiodVpe..ADIOD_vPFE_BV..module-2","version":"6","modelCustomizationName":"2017488AdiodVpe..ADIOD_vPFE_BV..module-2","properties":{"minCountInstances":0,"maxCountInstances":null,"initialCount":0,"vfModuleLabel":"ADIOD_vPFE_BV"},"inputs":{}}},"pnfs":{}}},"serviceInstance":{"6e59c5de-f052-46fa-aa7e-2fca9d674c44":{"vnfs":{"VF_vMee 0":{"rollbackOnFailure":"true","vfModules":{"vf_vmee0..VfVmee..base_vmme..module-0":{"vf_vmee0..VfVmee..base_vmme..module-0vmvzo":{"isMissingData":false,"sdncPreReload":null,"modelInfo":{"modelType":"VFmodule","modelInvariantId":"a6f9e51a-2b35-416a-ae15-15e58d61f36d","modelVersionId":"a27f5cfc-7f12-4f99-af08-0af9c3885c87","modelName":"VfVmee..base_vmme..module-0","modelVersion":"2","modelCustomizationId":"f8c040f1-7e51-4a11-aca8-acf256cfd861","modelCustomizationName":"VfVmee..base_vmme..module-0"},"instanceParams":[{}],"trackById":"wmtm6sy2uj"}}},"isMissingData":true,"originalName":"VF_vMee 0","vnfStoreKey":"VF_vMee 0","trackById":"p3wk448m5do","uuid":"d6557200-ecf2-4641-8094-5393ae3aae60","productFamilyId":"36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e","lcpCloudRegionId":null,"tenantId":null,"lineOfBusiness":null,"platformName":null,"modelInfo":{"modelType":"VF","modelInvariantId":"4160458e-f648-4b30-a176-43881ffffe9e","modelVersionId":"6e59c5de-f052-46fa-aa7e-2fca9d674c44","modelName":"VF_vMee","modelVersion":"2.0","modelCustomizationName":"VF_vMee 0"}}},"networks":{},"instanceParams":[{}],"validationCounter":1,"existingNames":{},"existingVNFCounterMap":{"d6557200-ecf2-4641-8094-5393ae3aae60":1},"globalSubscriberId":"e433710f-9217-458d-a79d-1c7aff376d89","subscriptionServiceType":"TYLER SILVIA","owningEntityId":"d61e6f2d-12fa-4cc2-91df-7c244011d6fc","productFamilyId":"36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e","lcpCloudRegionId":"hvf6","tenantId":"229bcdc6eaeb4ca59d55221141d01f8e","aicZoneId":"JAG1","projectName":"x1","rollbackOnFailure":"true","bulkSize":1,"modelInfo":{"modelInvariantId":"e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0","modelVersionId":"6e59c5de-f052-46fa-aa7e-2fca9d674c44","modelName":"ComplexService","modelVersion":"1.0","uuid":"6e59c5de-f052-46fa-aa7e-2fca9d674c44"},"isALaCarte":false,"name":"ComplexService","version":"1.0","description":"ComplexService","category":"Emanuel","uuid":"6e59c5de-f052-46fa-aa7e-2fca9d674c44","invariantUuid":"e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0","serviceType":"","serviceRole":"","isEcompGeneratedNaming":true,"isMultiStepDesign":false},"6b528779-44a3-4472-bdff-9cd15ec93450":{"networks":{"ExtVL 0":{"rollbackOnFailure":"true","isMissingData":false,"originalName":"ExtVL 0","networkStoreKey":"ExtVL 0","trackById":"sf3zth68xjf","productFamilyId":"ebc3bc3d-62fd-4a3f-a037-f619df4ff034","lcpCloudRegionId":"hvf6","tenantId":"229bcdc6eaeb4ca59d55221141d01f8e","platformName":"xxx1","lineOfBusiness":"ONAP","instanceParams":[{}],"modelInfo":{"modelInvariantId":"379f816b-a7aa-422f-be30-17114ff50b7c","modelVersionId":"ddc3f20c-08b5-40fd-af72-c6d14636b986","modelName":"ExtVL","modelVersion":"37.0","modelCustomizationId":"94fdd893-4a36-4d70-b16a-ec29c54c184f","modelCustomizationName":"ExtVL 0","uuid":"ddc3f20c-08b5-40fd-af72-c6d14636b986"},"uuid":"ddc3f20c-08b5-40fd-af72-c6d14636b986"},"ExtVL 0:0001":{"rollbackOnFailure":"true","isMissingData":false,"originalName":"ExtVL 0","networkStoreKey":"ExtVL 0","trackById":"2mdxioxca9h","productFamilyId":"ebc3bc3d-62fd-4a3f-a037-f619df4ff034","lcpCloudRegionId":"hvf6","tenantId":"229bcdc6eaeb4ca59d55221141d01f8e","platformName":"xxx1","lineOfBusiness":"ONAP","instanceParams":[{}],"modelInfo":{"modelInvariantId":"379f816b-a7aa-422f-be30-17114ff50b7c","modelVersionId":"ddc3f20c-08b5-40fd-af72-c6d14636b986","modelName":"ExtVL","modelVersion":"37.0","modelCustomizationId":"94fdd893-4a36-4d70-b16a-ec29c54c184f","modelCustomizationName":"ExtVL 0","uuid":"ddc3f20c-08b5-40fd-af72-c6d14636b986"},"uuid":"ddc3f20c-08b5-40fd-af72-c6d14636b986"},"ExtVL 0_1":{"rollbackOnFailure":"true","isMissingData":false,"originalName":"ExtVL 0","networkStoreKey":"ExtVL 0_1","trackById":"z7vd1gmpbs","instanceName":"ExtVL","productFamilyId":"17cc1042-527b-11e6-beb8-9e71128cae77","lcpCloudRegionId":"hvf6","tenantId":"229bcdc6eaeb4ca59d55221141d01f8e","platformName":"xxx1","lineOfBusiness":"zzz1","instanceParams":[{"vnf_config_template_version":"17.2","bandwidth_units":"Gbps","bandwidth":"10","AIC_CLLI":"ATLMY8GA","ASN":"AV_vPE","vnf_instance_name":"yoav"}],"modelInfo":{"modelInvariantId":"379f816b-a7aa-422f-be30-17114ff50b7c","modelVersionId":"ddc3f20c-08b5-40fd-af72-c6d14636b986","modelName":"ExtVL","modelVersion":"37.0","modelCustomizationId":"94fdd893-4a36-4d70-b16a-ec29c54c184f","modelCustomizationName":"ExtVL 0","uuid":"ddc3f20c-08b5-40fd-af72-c6d14636b986"},"uuid":"ddc3f20c-08b5-40fd-af72-c6d14636b986"}},"vnfs":{"2017-488_ADIOD-vPE 0":{"rollbackOnFailure":"true","vfModules":{"2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1":{"2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1sgoqi":{"instanceName":"yoav","volumeGroupName":"123","modelInfo":{"modelInvariantId":"7253ff5c-97f0-4b8b-937c-77aeb4d79aa1","modelVersionId":"25284168-24bb-4698-8cb4-3f509146eca5","modelName":"2017488AdiodVpe..ADIOD_vRE_BV..module-1","modelVersion":"6","modelCustomizationId":"f7e7c365-60cf-49a9-9ebf-a1aa11b9d401","modelCustomizationName":"2017488AdiodVpe..ADIOD_vRE_BV..module-1","uuid":"25284168-24bb-4698-8cb4-3f509146eca5"},"uuid":"25284168-24bb-4698-8cb4-3f509146eca5","isMissingData":false,"instanceParams":[{"adiodvpe0_bandwidth":"10","2017488_adiodvpe0_vnf_instance_name":"mtnj309me6","2017488_adiodvpe0_vnf_config_template_version":"17.2","2017488_adiodvpe0_AIC_CLLI":"ATLMY8GA","adiodvpe0_bandwidth_units":"Gbps"}]}}},"isMissingData":false,"originalName":"2017-488_ADIOD-vPE 0","vnfStoreKey":"2017-488_ADIOD-vPE 0","trackById":"o65b26t2thj","instanceName":"2017488_ADIODvPE","productFamilyId":"ebc3bc3d-62fd-4a3f-a037-f619df4ff034","lcpCloudRegionId":"hvf6","tenantId":"bae71557c5bb4d5aac6743a4e5f1d054","platformName":"platform","lineOfBusiness":"ONAP","instanceParams":[{}],"modelInfo":{"modelInvariantId":"72e465fe-71b1-4e7b-b5ed-9496118ff7a8","modelVersionId":"69e09f68-8b63-4cc9-b9ff-860960b5db09","modelName":"2017-488_ADIOD-vPE","modelVersion":"5.0","modelCustomizationId":"1da7b585-5e61-4993-b95e-8e6606c81e45","modelCustomizationName":"2017-488_ADIOD-vPE 0","uuid":"69e09f68-8b63-4cc9-b9ff-860960b5db09"},"uuid":"69e09f68-8b63-4cc9-b9ff-860960b5db09"}},"instanceParams":[{"2017488_adiodvpe0_ASN":"AV_vPE"}],"validationCounter":0,"existingNames":{"123":"","instancename":"","yoav":"","extvl":""},"existingVNFCounterMap":{"69e09f68-8b63-4cc9-b9ff-860960b5db09":1},"existingNetworksCounterMap":{"ddc3f20c-08b5-40fd-af72-c6d14636b986":3},"instanceName":"InstanceName","globalSubscriberId":"e433710f-9217-458d-a79d-1c7aff376d89","subscriptionServiceType":"TYLER SILVIA","owningEntityId":"d61e6f2d-12fa-4cc2-91df-7c244011d6fc","productFamilyId":"17cc1042-527b-11e6-beb8-9e71128cae77","lcpCloudRegionId":"JANET25","tenantId":"092eb9e8e4b7412e8787dd091bc58e86","aicZoneId":"JAG1","projectName":null,"rollbackOnFailure":"true","aicZoneName":"YUDFJULP-JAG1","owningEntityName":"WayneHolland","testApi":"GR_API","isEcompGeneratedNaming":false,"tenantName":"USP-SIP-IC-24335-T-01","bulkSize":1,"modelInfo":{"modelInvariantId":"e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0","modelVersionId":"6b528779-44a3-4472-bdff-9cd15ec93450","modelName":"action-data","modelVersion":"1.0","uuid":"6b528779-44a3-4472-bdff-9cd15ec93450"},"isALaCarte":false,"name":"action-data","version":"1.0","description":"","category":"","uuid":"6b528779-44a3-4472-bdff-9cd15ec93450","invariantUuid":"e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0","serviceType":"","serviceRole":"","isMultiStepDesign":false}},"lcpRegionsAndTenants":{"lcpRegionList":[{"id":"JANET25","name":"JANET25","isPermitted":true},{"id":"hvf6","name":"hvf6","isPermitted":true}],"lcpRegionsTenantsMap":{"JANET25":[{"id":"092eb9e8e4b7412e8787dd091bc58e86","name":"USP-SIP-IC-24335-T-01","isPermitted":true}],"hvf6":[{"id":"bae71557c5bb4d5aac6743a4e5f1d054","name":"AIN Web Tool-15-D-testalexandria","isPermitted":true},{"id":"229bcdc6eaeb4ca59d55221141d01f8e","name":"AIN Web Tool-15-D-STTest2","isPermitted":true},{"id":"1178612d2b394be4834ad77f567c0af2","name":"AIN Web Tool-15-D-SSPtestcustome","isPermitted":true},{"id":"19c5ade915eb461e8af52fb2fd8cd1f2","name":"AIN Web Tool-15-D-UncheckedEcopm","isPermitted":true},{"id":"de007636e25249238447264a988a927b","name":"AIN Web Tool-15-D-dfsdf","isPermitted":true},{"id":"62f29b3613634ca6a3065cbe0e020c44","name":"AIN/SMS-16-D-Multiservices1","isPermitted":true},{"id":"649289e30d3244e0b48098114d63c2aa","name":"AIN Web Tool-15-D-SSPST66","isPermitted":true},{"id":"3f21eeea6c2c486bba31dab816c05a32","name":"AIN Web Tool-15-D-ASSPST47","isPermitted":true},{"id":"f60ce21d3ee6427586cff0d22b03b773","name":"CESAR-100-D-sspjg67246","isPermitted":true},{"id":"8774659e425f479895ae091bb5d46560","name":"CESAR-100-D-sspjg68359","isPermitted":true},{"id":"624eb554b0d147c19ff8885341760481","name":"AINWebTool-15-D-iftach","isPermitted":true},{"id":"214f55f5fc414c678059c383b03e4962","name":"CESAR-100-D-sspjg612401","isPermitted":true},{"id":"c90666c291664841bb98e4d981ff1db5","name":"CESAR-100-D-sspjg621340","isPermitted":true},{"id":"ce5b6bc5c7b348e1bf4b91ac9a174278","name":"sspjg621351cloned","isPermitted":true},{"id":"b386b768a3f24c8e953abbe0b3488c02","name":"AINWebTool-15-D-eteancomp","isPermitted":true},{"id":"dc6c4dbfd225474e9deaadd34968646c","name":"AINWebTool-15-T-SPFET","isPermitted":true},{"id":"02cb5030e9914aa4be120bd9ed1e19eb","name":"AINWebTool-15-X-eeweww","isPermitted":true},{"id":"f2f3830e4c984d45bcd00e1a04158a79","name":"CESAR-100-D-spjg61909","isPermitted":true},{"id":"05b91bd5137f4929878edd965755c06d","name":"CESAR-100-D-sspjg621512cloned","isPermitted":true},{"id":"7002fbe8482d4a989ddf445b1ce336e0","name":"AINWebTool-15-X-vdr","isPermitted":true},{"id":"4008522be43741dcb1f5422022a2aa0b","name":"AINWebTool-15-D-ssasa","isPermitted":true},{"id":"f44e2e96a1b6476abfda2fa407b00169","name":"AINWebTool-15-D-PFNPT","isPermitted":true},{"id":"b69a52bec8a84669a37a1e8b72708be7","name":"AINWebTool-15-X-vdre","isPermitted":true},{"id":"fac7d9fd56154caeb9332202dcf2969f","name":"AINWebTool-15-X-NONPODECOMP","isPermitted":true},{"id":"2d34d8396e194eb49969fd61ffbff961","name":"DN5242-Nov16-T5","isPermitted":true},{"id":"cb42a77ff45b48a8b8deb83bb64acc74","name":"ro-T11","isPermitted":true},{"id":"fa45ca53c80b492fa8be5477cd84fc2b","name":"ro-T112","isPermitted":true},{"id":"4914ab0ab3a743e58f0eefdacc1dde77","name":"DN5242-Nov21-T1","isPermitted":true},{"id":"d0a3e3f2964542259d155a81c41aadc3","name":"test-hvf6-09","isPermitted":true},{"id":"cbb99fe4ada84631b7baf046b6fd2044","name":"DN5242-Nov16-T3","isPermitted":true}]}},"productFamilies":[{"id":"ebc3bc3d-62fd-4a3f-a037-f619df4ff034","name":"SCOTTIE","isPermitted":true},{"id":"17cc1042-527b-11e6-beb8-9e71128cae77","name":"IGNACIO","isPermitted":true},{"id":"36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e","name":"Christie","isPermitted":true},{"id":"a4f6f2ae-9bf5-4ed7-b904-06b2099c4bd7","name":"Enhanced Services","isPermitted":true},{"id":"vTerrance","name":"vTerrance","isPermitted":true},{"id":"323d69d9-2efe-4r45-ay0a-89ea7ard4e6f","name":"vSCP","isPermitted":true},{"id":"a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb","name":"Emanuel","isPermitted":true},{"id":"d8a6ed93-251c-47ca-adc9-86671fd19f4c","name":"BVOIP","isPermitted":true},{"id":"db171b8f-115c-4992-a2e3-ee04cae357e0","name":"LINDSEY","isPermitted":true},{"id":"LRSI-OSPF","name":"LRSI-OSPF","isPermitted":true},{"id":"vRosemarie","name":"HNGATEWAY","isPermitted":true},{"id":"vHNPaas","name":"WILKINS","isPermitted":true},{"id":"e433710f-9217-458d-a79d-1c7aff376d89","name":"TYLER SILVIA","isPermitted":true},{"id":"b6a3f28c-eebf-494c-a900-055cc7c874ce","name":"VROUTER","isPermitted":true},{"id":"Cisneros","name":"vMuriel","isPermitted":true},{"id":"0ee8c1bc-7cbd-4b0a-a1ac-e9999255abc1","name":"CARA Griffin","isPermitted":true},{"id":"c7611ebe-c324-48f1-8085-94aef0c6ef3d","name":"DARREN MCGEE","isPermitted":true},{"id":"e30755dc-5673-4b6b-9dcf-9abdd96b93d1","name":"Transport","isPermitted":true},{"id":"vSalvatore","name":"vSalvatore","isPermitted":true},{"id":"d7bb0a21-66f2-4e6d-87d9-9ef3ced63ae4","name":"Josefina","isPermitted":true},{"id":"vHubbard","name":"vHubbard","isPermitted":true},{"id":"12a96a9d-4b4c-4349-a950-fe1159602621","name":"DARREN MCGEE","isPermitted":true}],"serviceTypes":{"e433710f-9217-458d-a79d-1c7aff376d89":[{"id":"0","name":"vRichardson","isPermitted":false},{"id":"1","name":"TYLER SILVIA","isPermitted":true},{"id":"2","name":"Emanuel","isPermitted":false},{"id":"3","name":"vJamie","isPermitted":false},{"id":"4","name":"vVoiceMail","isPermitted":false},{"id":"5","name":"Kennedy","isPermitted":false},{"id":"6","name":"vSEGW","isPermitted":false},{"id":"7","name":"vVM","isPermitted":false},{"id":"8","name":"vOTA","isPermitted":false},{"id":"9","name":"vMME","isPermitted":false},{"id":"10","name":"vMNS","isPermitted":false},{"id":"11","name":"vSCP","isPermitted":false},{"id":"12","name":"VPMS","isPermitted":false},{"id":"13","name":"vMMSC","isPermitted":false},{"id":"14","name":"SSD","isPermitted":false},{"id":"15","name":"vMOG","isPermitted":false},{"id":"16","name":"LINDSEY","isPermitted":false},{"id":"17","name":"JOHANNA_SANTOS","isPermitted":false},{"id":"18","name":"vCarroll","isPermitted":false}]},"aicZones":[{"id":"NFT1","name":"NFTJSSSS-NFT1"},{"id":"JAG1","name":"YUDFJULP-JAG1"},{"id":"YYY1","name":"UUUAIAAI-YYY1"},{"id":"BAN1","name":"VSDKYUTP-BAN1"},{"id":"DKJ1","name":"DKJSJDKA-DKJ1"},{"id":"MCS1","name":"ASACMAMS-MCS1"},{"id":"UIO1","name":"uioclli1-UIO1"},{"id":"RAJ1","name":"YGBIJNLQ-RAJ1"},{"id":"OPA1","name":"opaclli1-OPA1"},{"id":"SDE1","name":"ZXCVBNMA-SDE1"},{"id":"VEN2","name":"FGHJUHIL-VEN2"},{"id":"ORL1","name":"ORLDFLMA-ORL1"},{"id":"JAD1","name":"JADECLLI-JAD1"},{"id":"ZXL1","name":"LWLWCANN-ZXL1"},{"id":"CKL1","name":"CLKSKCKK-CKL1"},{"id":"SDF1","name":"sdfclli1-SDF1"},{"id":"RAD1","name":"RADICAL1-RAD1"},{"id":"KIT1","name":"BHYJFGLN-KIT1"},{"id":"REL1","name":"INGERFGT-REL1"},{"id":"JNL1","name":"CJALSDAC-JNL1"},{"id":"OLK1","name":"OLKOLKLS-OLK1"},{"id":"CHI1","name":"CHILLIWE-CHI1"},{"id":"UUU4","name":"UUUAAAUU-UUU4"},{"id":"TUF1","name":"TUFCLLI1-TUF1"},{"id":"KJN1","name":"CKALDKSA-KJN1"},{"id":"SAM1","name":"SNDGCA64-SAN1"},{"id":"SCK1","name":"SCKSCKSK-SCK1"},{"id":"HJH1","name":"AOEEQQQD-HJH1"},{"id":"HGD1","name":"SDFQWHGD-HGD1"},{"id":"KOR1","name":"HYFLNBVT-KOR1"},{"id":"ATL43","name":"AICLOCID-ATL43"},{"id":"ATL54","name":"AICFTAAI-ATL54"},{"id":"ATL66","name":"CLLIAAII-ATL66"},{"id":"VEL1","name":"BNMLKUIK-VEL1"},{"id":"ICC1","name":"SANJITAT-ICC1"},{"id":"MNT11","name":"WSXEFBTH-MNT11"},{"id":"DEF2","name":"WSBHGTYL-DEF2"},{"id":"MAD11","name":"SDFQWGKL-MAD11"},{"id":"OLG1","name":"OLHOLHOL-OLG1"},{"id":"GAR1","name":"NGFVSJKO-GAR1"},{"id":"SAN22","name":"GNVLSCTL-SAN22"},{"id":"HRG1","name":"HRGHRGGS-HRG1"},{"id":"JCS1","name":"JCSJSCJS-JCS1"},{"id":"DHA12","name":"WSXEDECF-DHA12"},{"id":"HJE1","name":"AOEEWWWD-HJE1"},{"id":"NCA1","name":"NCANCANN-NCA1"},{"id":"IOP1","name":"iopclli1-IOP1"},{"id":"RTY1","name":"rtyclli1-RTY1"},{"id":"KAP1","name":"HIOUYTRQ-KAP1"},{"id":"ZEN1","name":"ZENCLLI1-ZEN1"},{"id":"HKA1","name":"JAKHLASS-HKA1"},{"id":"CQK1","name":"CQKSCAKK-CQK1"},{"id":"SAI1","name":"UBEKQLPD-SAI1"},{"id":"ERT1","name":"ertclli1-ERT1"},{"id":"IBB1","name":"PLMKOIJU-IBB1"},{"id":"TIR2","name":"PLKINHYI-TIR2"},{"id":"HSD1","name":"CHASKCDS-HSD1"},{"id":"SLF78","name":"SDCTLFN1-SLF78"},{"id":"SEE78","name":"SDCTEEE4-SEE78"},{"id":"SAN13","name":"TOKYJPFA-SAN13"},{"id":"SAA78","name":"SDCTAAA1-SAA78"},{"id":"LUC1","name":"ATLDFGYC-LUC1"},{"id":"AMD13","name":"MEMATLAN-AMD13"},{"id":"TOR1","name":"TOROONXN-TOR1"},{"id":"QWE1","name":"QWECLLI1-QWE1"},{"id":"ZOG1","name":"ZOGASTRO-ZOG1"},{"id":"CAL33","name":"CALIFORN-CAL33"},{"id":"SHH78","name":"SDIT1HHH-SHH78"},{"id":"DSA1","name":"LKJHGFDS-DSA1"},{"id":"CLG1","name":"CLGRABAD-CLG1"},{"id":"BNA1","name":"BNARAGBK-BNA1"},{"id":"ATL84","name":"CANTTCOC-ATL84"},{"id":"APP1","name":"WBHGTYUI-APP1"},{"id":"RJN1","name":"RJNRBZAW-RJN1"},{"id":"EHH78","name":"SDCSHHH5-EHH78"},{"id":"mac10","name":"PKGTESTF-mac10"},{"id":"SXB78","name":"SDCTGXB1-SXB78"},{"id":"SAX78","name":"SDCTAXG1-SAX78"},{"id":"SYD1","name":"SYDNAUBV-SYD1"},{"id":"TOK1","name":"TOKYJPFA-TOK1"},{"id":"KGM2","name":"KGMTNC20-KGM2"},{"id":"DCC1b","name":"POIUYTGH-DCC1b"},{"id":"SKK78","name":"SDCTKKK1-SKK78"},{"id":"SGG78","name":"SDCTGGG1-SGG78"},{"id":"SJJ78","name":"SDCTJJJ1-SJJ78"},{"id":"SBX78","name":"SDCTBXG1-SBX78"},{"id":"LAG1","name":"LARGIZON-LAG1"},{"id":"IAA1","name":"QAZXSWED-IAA1"},{"id":"POI1","name":"PLMNJKIU-POI1"},{"id":"LAG1a","name":"LARGIZON-LAG1a"},{"id":"PBL1","name":"PBLAPBAI-PBL1"},{"id":"LAG45","name":"LARGIZON-LAG1a"},{"id":"MAR1","name":"MNBVCXZM-MAR1"},{"id":"HST70","name":"HSTNTX70-HST70"},{"id":"DCC1a","name":"POIUYTGH-DCC1a"},{"id":"TOL1","name":"TOLDOH21-TOL1"},{"id":"LON1","name":"LONEENCO-LON1"},{"id":"SJU78","name":"SDIT1JUB-SJU78"},{"id":"STN27","name":"HSTNTX01-STN27"},{"id":"SSW56","name":"ss8126GT-SSW56"},{"id":"SBB78","name":"SDIT1BBB-SBB78"},{"id":"DCC3","name":"POIUYTGH-DCC3"},{"id":"GNV1","name":"GNVLSCTL-GNV1"},{"id":"WAS1","name":"WASHDCSW-WAS1"},{"id":"TOY1","name":"TORYONNZ-TOY1"},{"id":"STT1","name":"STTLWA02-STT1"},{"id":"STG1","name":"STTGGE62-STG1"},{"id":"SLL78","name":"SDCTLLL1-SLL78"},{"id":"SBU78","name":"SDIT1BUB-SBU78"},{"id":"ATL2","name":"ATLNGANW-ATL2"},{"id":"BOT1","name":"BOTHWAKY-BOT1"},{"id":"SNG1","name":"SNGPSIAU-SNG1"},{"id":"NYC1","name":"NYCMNY54-NYC1"},{"id":"LAG1b","name":"LARGIZON-LAG1b"},{"id":"AMD15","name":"AMDFAA01-AMD15"},{"id":"SNA1","name":"SNANTXCA-SNA1"},{"id":"PLT1","name":"PLTNCA60-PLT1"},{"id":"TLP1","name":"TLPNXM18-TLP1"},{"id":"SDD81","name":"SAIT1DD6-SDD81"},{"id":"DCC1","name":"POIUYTGH-DCC1"},{"id":"DCC2","name":"POIUYTGH-DCC2"},{"id":"OKC1","name":"OKCBOK55-OKC1"},{"id":"PAR1","name":"PARSFRCG-PAR1"},{"id":"TES36","name":"ABCEETES-TES36"},{"id":"COM1","name":"PLMKOPIU-COM1"},{"id":"ANI1","name":"ATLNGTRE-ANI1"},{"id":"SDG78","name":"SDIT1BDG-SDG78"},{"id":"mac20","name":"PKGTESTF-mac20"},{"id":"DSF45","name":"DSFBG123-DSF45"},{"id":"HST25","name":"HSTNTX01-HST25"},{"id":"AMD18","name":"AUDIMA01-AMD18"},{"id":"SAA80","name":"SAIT9AA3-SAA80"},{"id":"SSA56","name":"SSIT2AA7-SSA56"},{"id":"SDD82","name":"SAIT1DD9-SDD82"},{"id":"JCV1","name":"JCVLFLBW-JCV1"},{"id":"SUL2","name":"WERTYUJK-SUL2"},{"id":"PUR1","name":"purelyde-PUR1"},{"id":"FDE55","name":"FDERT555-FDE55"},{"id":"SITE","name":"LONEENCO-SITE"},{"id":"ATL1","name":"ATLNGAMA-ATL1"},{"id":"JUL1","name":"ZXCVBNMM-JUL1"},{"id":"TAT34","name":"TESAAISB-TAT34"},{"id":"XCP12","name":"CHKGH123-XCP12"},{"id":"RAI1","name":"poiuytre-RAI1"},{"id":"HPO1","name":"ATLNGAUP-HPO1"},{"id":"KJF12","name":"KJFDH123-KJF12"},{"id":"SCC80","name":"SAIT9CC3-SCC80"},{"id":"SAA12","name":"SAIT9AF8-SAA12"},{"id":"SAA14","name":"SAIT1AA9-SAA14"},{"id":"ATL35","name":"TTESSAAI-ATL35"},{"id":"CWY1","name":"CWYMOWBS-CWY1"},{"id":"ATL76","name":"TELEPAAI-ATL76"},{"id":"DSL12","name":"DSLFK242-DSL12"},{"id":"ATL53","name":"AAIATLTE-ATL53"},{"id":"SAA11","name":"SAIT9AA2-SAA11"},{"id":"ATL62","name":"TESSASCH-ATL62"},{"id":"AUG1","name":"ASDFGHJK-AUG1"},{"id":"POI22","name":"POIUY123-POI22"},{"id":"SAA13","name":"SAIT1AA9-SAA13"},{"id":"BHY17","name":"BHYTFRF3-BHY17"},{"id":"LIS1","name":"HOSTPROF-LIS1"},{"id":"SIP1","name":"ZXCVBNMK-SIP1"},{"id":"ATL99","name":"TEESTAAI-ATL43"},{"id":"ATL64","name":"FORLOAAJ-ATL64"},{"id":"TAT33","name":"TESAAISA-TAT33"},{"id":"RAD10","name":"INDIPUNE-RAD10"},{"id":"RTW5","name":"BHYTFRY4-RTW5"},{"id":"JGS1","name":"KSJKKKKK-JGS1"},{"id":"ATL98","name":"TEESTAAI-ATL43"},{"id":"WAN1","name":"LEIWANGW-WAN1"},{"id":"ATL44","name":"ATLSANAB-ATL44"},{"id":"RTD2","name":"BHYTFRk4-RTD2"},{"id":"NIR1","name":"ORFLMANA-NIR1"},{"id":"ATL75","name":"SANAAIRE-ATL75"},{"id":"NUM1","name":"QWERTYUI-NUM1"},{"id":"MTN32","name":"MDTWNJ21-MTN32"},{"id":"RTZ4","name":"BHYTFRZ6-RTZ4"},{"id":"ATL56","name":"ATLSANAC-ATL56"},{"id":"AMS1","name":"AMSTNLBW-AMS1"},{"id":"RCT1","name":"AMSTERNL-RCT1"},{"id":"JAN1","name":"ORFLMATT-JAN1"},{"id":"ABC14","name":"TESAAISA-ABC14"},{"id":"TAT37","name":"TESAAISD-TAT37"},{"id":"MIC54","name":"MICHIGAN-MIC54"},{"id":"ABC11","name":"ATLSANAI-ABC11"},{"id":"AMF11","name":"AMDOCS01-AMF11"},{"id":"ATL63","name":"ATLSANEW-ATL63"},{"id":"ABC12","name":"ATLSECIA-ABC12"},{"id":"MTN20","name":"MDTWNJ21-MTN20"},{"id":"ABC15","name":"AAITESAN-ABC15"},{"id":"AVT1","name":"AVTRFLHD-AVT1"},{"id":"ATL34","name":"ATLSANAI-ATL34"}],"categoryParameters":{"owningEntityList":[{"id":"aaa1","name":"aaa1"},{"id":"d61e6f2d-12fa-4cc2-91df-7c244011d6fc","name":"WayneHolland"},{"id":"Melissa","name":"Melissa"}],"projectList":[{"id":"WATKINS","name":"WATKINS"},{"id":"x1","name":"x1"},{"id":"yyy1","name":"yyy1"}],"lineOfBusinessList":[{"id":"ONAP","name":"ONAP"},{"id":"zzz1","name":"zzz1"}],"platformList":[{"id":"platform","name":"platform"},{"id":"xxx1","name":"xxx1"}]},"type":"[LCP_REGIONS_AND_TENANTS] Update","subscribers":[{"id":"CAR_2020_ER","name":"CAR_2020_ER","isPermitted":true},{"id":"21014aa2-526b-11e6-beb8-9e71128cae77","name":"JULIO ERICKSON","isPermitted":false},{"id":"DHV1707-TestSubscriber-2","name":"DALE BRIDGES","isPermitted":false},{"id":"DHV1707-TestSubscriber-1","name":"LLOYD BRIDGES","isPermitted":false},{"id":"jimmy-example","name":"JimmyExampleCust-20161102","isPermitted":false},{"id":"jimmy-example2","name":"JimmyExampleCust-20161103","isPermitted":false},{"id":"ERICA5779-TestSub-PWT-102","name":"ERICA5779-TestSub-PWT-102","isPermitted":false},{"id":"ERICA5779-TestSub-PWT-101","name":"ERICA5779-TestSub-PWT-101","isPermitted":false},{"id":"a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb","name":"Emanuel","isPermitted":false},{"id":"ERICA5779-Subscriber-4","name":"ERICA5779-Subscriber-5","isPermitted":false},{"id":"ERICA5779-TestSub-PWT-103","name":"ERICA5779-TestSub-PWT-103","isPermitted":false},{"id":"ERICA5779-Subscriber-2","name":"ERICA5779-Subscriber-2","isPermitted":false},{"id":"e433710f-9217-458d-a79d-1c7aff376d89","name":"SILVIA ROBBINS","isPermitted":true},{"id":"ERICA5779-Subscriber-3","name":"ERICA5779-Subscriber-3","isPermitted":false},{"id":"31739f3e-526b-11e6-beb8-9e71128cae77","name":"CRAIG/ROBERTS","isPermitted":false}]}}; + } +} + +describe('Basic popup service', () => { + let injector; + let service: BasicPopupService; + let genericFormService : GenericFormService; + let defaultDataGeneratorService : DefaultDataGeneratorService; + let fb : FormBuilder; + let iframeService : IframeService; + + + beforeAll(done => (async () => { + TestBed.configureTestingModule({ + providers : [ + NetworkPopupService, + BasicControlGenerator, + NetworkControlGenerator, + DefaultDataGeneratorService, + GenericFormService, + FormBuilder, + IframeService, + AaiService, + LogService, + BasicPopupService, + {provide:FeatureFlagsService, useClass: MockFeatureFlagsService}, + {provide: NgRedux, useClass: MockReduxStore}, + {provide: HttpClient, useClass: MockAppStore}, + {provide: SdcUiServices.ModalService, useClass: MockModalService} + ] + }); + await TestBed.compileComponents(); + injector = getTestBed(); + service = injector.get(BasicPopupService); + genericFormService = injector.get(GenericFormService); + defaultDataGeneratorService = injector.get(DefaultDataGeneratorService); + fb = injector.get(FormBuilder); + iframeService = injector.get(IframeService); + + })().then(done).catch(done.fail)); + + + + + test('getDynamicInputs should list of formControl model', () => { + const serviceId: string = '6b528779-44a3-4472-bdff-9cd15ec93450'; + const networkModel : string = 'ExtVL 0'; + const networkStoreKey : string = null; + const controls : FormControlModel[] = service.getDynamicInputs(serviceId, networkModel, networkStoreKey, 'networks'); + expect(controls.length).toEqual(6); + for(let i = 0 ; i < controls.length ; i++){ + expect(controls[i].type).toEqual('INPUT'); + expect(controls[i].isVisible).toBeTruthy(); + } + }); + + test('getModelFromResponse should return undefined if raw model not exist', () => { + const result= service.getModelFromResponse({ + "modelType" : { + "modelName" : null + } + }, 'modelType', 'modelName'); + expect(result).toBeUndefined(); + }); +}); diff --git a/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/basic.popup.service.ts b/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/basic.popup.service.ts new file mode 100644 index 000000000..5d4d16567 --- /dev/null +++ b/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/basic.popup.service.ts @@ -0,0 +1,54 @@ +import {Injectable} from "@angular/core"; +import {Subscriber} from "../../../models/subscriber"; +import {NetworkModel} from "../../../models/networkModel"; +import {AppState} from "../../../store/reducers"; +import {NgRedux} from "@angular-redux/store"; +import {FormControlModel} from "../../../models/formControlModels/formControl.model"; +import {DefaultDataGeneratorService} from "../../../services/defaultDataServiceGenerator/default.data.generator.service"; +import {BasicControlGenerator} from "../../genericForm/formControlsServices/basic.control.generator"; +import * as _ from 'lodash'; +import {VfModule} from "../../../models/vfModule"; +import {VNFModel} from "../../../models/vnfModel"; +import {VnfGroupModel} from "../../../models/vnfGroupModel"; + +@Injectable() +export class BasicPopupService { + constructor(private _store: NgRedux<AppState>, + private _defaultDataGeneratorService : DefaultDataGeneratorService, + private _basicControlGenerator : BasicControlGenerator){} + + extractSubscriberNameBySubscriberId(subsriberId: string) { + let result: string = null; + let filteredArray: any = _.filter(this._store.getState().service.subscribers, function (o: Subscriber) { + return o.id === subsriberId + }); + if (filteredArray.length > 0) { + result = filteredArray[0].name; + } + return result; + } + + getModelFromResponse(result: any, modelType: string, modelName: string) { + let rawModel = result[modelType][modelName]; + if (!rawModel) return; + switch (modelType){ + case 'vnfs' : { + return new VNFModel(rawModel); + } + case 'vfModules' : { + return new VfModule(rawModel); + } + case 'networks' : { + return new NetworkModel(rawModel); + } + case 'vnfGroups' : { + return new VnfGroupModel(rawModel); + } + } + } + + getDynamicInputs(serviceId : string, modelName : string, storeKey : string, type : string) : FormControlModel[]{ + let dynamic = this._defaultDataGeneratorService.getArbitraryInputs(this._store.getState().service.serviceHierarchy[serviceId][type][modelName].inputs); + return this._basicControlGenerator.getDynamicInputsByType(dynamic, serviceId, storeKey, type ); + } +} diff --git a/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/generic-popup.interface.ts b/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/generic-popup.interface.ts new file mode 100644 index 000000000..7324c64a7 --- /dev/null +++ b/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/generic-popup.interface.ts @@ -0,0 +1,25 @@ +/*********************************************************** + onSubmit : action when set button is clicked + onCancel : action when cancel/X button is clicked + getModelInformation : should generate the model information + getGenericFormPopupDetails : returns list of controls + getInstance : returns exists instance (if exist) + getTitle : returns generic popup title + getSubLeftTitle : returns generic popup left sub title + getSubRightTitle : returns generic popup right sub title + ***********************************************************/ + +import {FormGroup} from "@angular/forms"; +import {ITreeNode} from "angular-tree-component/dist/defs/api"; +import {FormPopupDetails} from "../../../models/formControlModels/formPopupDetails.model"; + +export interface GenericPopupInterface { + onSubmit(that, form: FormGroup, ...args) : void; + onCancel(that, form) : void; + getModelInformation(serviceId : string, modelName : string) : void; + getGenericFormPopupDetails(serviceId : string, modelName : string , storeKey : string, node : ITreeNode, uuidData : Object, isUpdateMode : boolean) : FormPopupDetails; + getInstance(serviceId : string, modelName : string , storeKey : string) : any; + getTitle(isUpdateMode : boolean) : string; + getSubLeftTitle() : string; + getSubRightTitle() : string; +} diff --git a/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/network/network.popup.service.spec.ts b/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/network/network.popup.service.spec.ts new file mode 100644 index 000000000..30164b8b6 --- /dev/null +++ b/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/network/network.popup.service.spec.ts @@ -0,0 +1,2395 @@ +import {NetworkPopupService} from "./network.popup.service"; +import {LogService} from "../../../../utils/log/log.service"; +import {SdcUiServices} from "onap-ui-angular"; +import {ReflectiveInjector} from "@angular/core"; +import {NgRedux} from "@angular-redux/store"; +import {BasicControlGenerator} from "../../../genericForm/formControlsServices/basic.control.generator"; +import {AaiService} from "../../../../services/aaiService/aai.service"; +import {HttpClient} from "@angular/common/http"; +import {NetworkControlGenerator} from "../../../genericForm/formControlsServices/networkGenerator/network.control.generator"; +import {GenericFormService} from "../../../genericForm/generic-form.service"; +import {FormBuilder} from "@angular/forms"; +import {IframeService} from "../../../../utils/iframe.service"; +import {DefaultDataGeneratorService} from "../../../../services/defaultDataServiceGenerator/default.data.generator.service"; +import {BasicPopupService} from "../basic.popup.service"; +import {FeatureFlagsService} from "../../../../services/featureFlag/feature-flags.service"; +import {getTestBed, TestBed} from "@angular/core/testing"; + +class MockAppStore<T> {} + +class MockModalService<T> {} + +class MockReduxStore<T> { + getState() { + return { + "global": { + "name": null, + "flags": { + "FLAG_NETWORK_TO_ASYNC_INSTANTIATION": false, + "FLAG_SHOW_ASSIGNMENTS": true, + "FLAG_FABRIC_CONFIGURATION_ASSIGNMENTS": true, + "FLAG_UNASSIGN_SERVICE": true, + "FLAG_SHOW_VERIFY_SERVICE": false, + "FLAG_COLLECTION_RESOURCE_SUPPORT": true, + "FLAG_DUPLICATE_VNF": true, + "FLAG_SERVICE_MODEL_CACHE": true, + "FLAG_ADVANCED_PORTS_FILTER": true, + "CREATE_INSTANCE_TEST": false, + "FLAG_SETTING_DEFAULTS_IN_DRAWING_BOARD": false, + "FLAG_REGION_ID_FROM_REMOTE": true, + "FLAG_ASYNC_INSTANTIATION": true, + "FLAG_ASYNC_JOBS": true, + "EMPTY_DRAWING_BOARD_TEST": false, + "FLAG_ADD_MSO_TESTAPI_FIELD": true + }, + "type": "[FLAGS] Update" + }, + "service": { + "serviceHierarchy": { + "6e59c5de-f052-46fa-aa7e-2fca9d674c44": { + "service": { + "uuid": "6e59c5de-f052-46fa-aa7e-2fca9d674c44", + "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0", + "name": "ComplexService", + "version": "1.0", + "toscaModelURL": null, + "category": "Emanuel", + "serviceType": "", + "serviceRole": "", + "description": "ComplexService", + "serviceEcompNaming": "false", + "instantiationType": "Macro", + "inputs": {} + }, + "vnfs": { + "VF_vMee 0": { + "uuid": "d6557200-ecf2-4641-8094-5393ae3aae60", + "invariantUuid": "4160458e-f648-4b30-a176-43881ffffe9e", + "description": "VSP_vMee", + "name": "VF_vMee", + "version": "2.0", + "customizationUuid": "91415b44-753d-494c-926a-456a9172bbb9", + "inputs": {}, + "commands": {}, + "properties": { + "max_instances": 10, + "min_instances": 1, + "gpb2_Internal2_mac": "00:11:22:EF:AC:DF", + "sctp-b-ipv6-egress_src_start_port": "0", + "sctp-a-ipv6-egress_rule_application": "any", + "Internal2_allow_transit": "true", + "sctp-b-IPv6_ethertype": "IPv6", + "sctp-a-egress_rule_application": "any", + "sctp-b-ingress_action": "pass", + "sctp-b-ingress_rule_protocol": "icmp", + "ncb2_Internal1_mac": "00:11:22:EF:AC:DF", + "sctp-b-ipv6-ingress-src_start_port": "0.0", + "ncb1_Internal2_mac": "00:11:22:EF:AC:DF", + "fsb_volume_size_0": "320.0", + "sctp-b-egress_src_addresses": "local", + "sctp-a-ipv6-ingress_ethertype": "IPv4", + "sctp-a-ipv6-ingress-dst_start_port": "0", + "sctp-b-ipv6-ingress_rule_application": "any", + "domain_name": "default-domain", + "sctp-a-ingress_rule_protocol": "icmp", + "sctp-b-egress-src_start_port": "0.0", + "sctp-a-egress_src_addresses": "local", + "sctp-b-display_name": "epc-sctp-b-ipv4v6-sec-group", + "sctp-a-egress-src_start_port": "0.0", + "sctp-a-ingress_ethertype": "IPv4", + "sctp-b-ipv6-ingress-dst_end_port": "65535", + "sctp-b-dst_subnet_prefix_v6": "::", + "nf_naming": "{ecomp_generated_naming=true}", + "sctp-a-ipv6-ingress_src_subnet_prefix": "0.0.0.0", + "sctp-b-egress-dst_start_port": "0.0", + "ncb_flavor_name": "nv.c20r64d1", + "gpb1_Internal1_mac": "00:11:22:EF:AC:DF", + "sctp-b-egress_dst_subnet_prefix_len": "0.0", + "Internal2_net_cidr": "10.0.0.10", + "sctp-a-ingress-dst_start_port": "0.0", + "sctp-a-egress-dst_start_port": "0.0", + "fsb1_Internal2_mac": "00:11:22:EF:AC:DF", + "sctp-a-egress_ethertype": "IPv4", + "vlc_st_service_mode": "in-network-nat", + "sctp-a-ipv6-egress_ethertype": "IPv4", + "sctp-a-egress-src_end_port": "65535.0", + "sctp-b-ipv6-egress_rule_application": "any", + "sctp-b-egress_action": "pass", + "sctp-a-ingress-src_subnet_prefix_len": "0.0", + "sctp-b-ipv6-ingress-src_end_port": "65535.0", + "sctp-b-name": "epc-sctp-b-ipv4v6-sec-group", + "fsb2_Internal1_mac": "00:11:22:EF:AC:DF", + "sctp-a-ipv6-ingress-src_start_port": "0.0", + "sctp-b-ipv6-egress_ethertype": "IPv4", + "Internal1_net_cidr": "10.0.0.10", + "sctp-a-egress_dst_subnet_prefix": "0.0.0.0", + "fsb_flavor_name": "nv.c20r64d1", + "sctp_rule_protocol": "132", + "sctp-b-ipv6-ingress_src_subnet_prefix_len": "0", + "sctp-a-ipv6-ingress_rule_application": "any", + "ecomp_generated_naming": "false", + "sctp-a-IPv6_ethertype": "IPv6", + "vlc2_Internal1_mac": "00:11:22:EF:AC:DF", + "vlc_st_virtualization_type": "virtual-machine", + "sctp-b-ingress-dst_start_port": "0.0", + "sctp-b-ingress-dst_end_port": "65535.0", + "sctp-a-ipv6-ingress-src_end_port": "65535.0", + "sctp-a-display_name": "epc-sctp-a-ipv4v6-sec-group", + "sctp-b-ingress_rule_application": "any", + "int2_sec_group_name": "int2-sec-group", + "vlc_flavor_name": "nd.c16r64d1", + "sctp-b-ipv6-egress_src_addresses": "local", + "vlc_st_interface_type_int1": "other1", + "sctp-b-egress-src_end_port": "65535.0", + "sctp-a-ipv6-egress-dst_start_port": "0", + "vlc_st_interface_type_int2": "other2", + "sctp-a-ipv6-egress_rule_protocol": "any", + "Internal2_shared": "false", + "sctp-a-ipv6-egress_dst_subnet_prefix_len": "0", + "Internal2_rpf": "disable", + "vlc1_Internal1_mac": "00:11:22:EF:AC:DF", + "sctp-b-ipv6-egress_src_end_port": "65535", + "sctp-a-ipv6-egress_src_addresses": "local", + "sctp-a-ingress-dst_end_port": "65535.0", + "sctp-a-ipv6-egress_src_end_port": "65535", + "Internal1_forwarding_mode": "l2", + "Internal2_dhcp": "false", + "sctp-a-dst_subnet_prefix_v6": "::", + "pxe_image_name": "MME_PXE-Boot_16ACP04_GA.qcow2", + "vlc_st_interface_type_gtp": "other0", + "ncb1_Internal1_mac": "00:11:22:EF:AC:DF", + "sctp-b-src_subnet_prefix_v6": "::", + "sctp-a-egress_dst_subnet_prefix_len": "0.0", + "int1_sec_group_name": "int1-sec-group", + "Internal1_dhcp": "false", + "sctp-a-ipv6-egress_dst_end_port": "65535", + "Internal2_forwarding_mode": "l2", + "fsb2_Internal2_mac": "00:11:22:EF:AC:DF", + "sctp-b-egress_dst_subnet_prefix": "0.0.0.0", + "Internal1_net_cidr_len": "17", + "gpb2_Internal1_mac": "00:11:22:EF:AC:DF", + "sctp-b-ingress-src_subnet_prefix_len": "0.0", + "sctp-a-ingress_dst_addresses": "local", + "sctp-a-egress_action": "pass", + "fsb_volume_type_0": "SF-Default-SSD", + "ncb2_Internal2_mac": "00:11:22:EF:AC:DF", + "vlc_st_interface_type_sctp_a": "left", + "vlc_st_interface_type_sctp_b": "right", + "sctp-a-src_subnet_prefix_v6": "::", + "vlc_st_version": "2", + "sctp-b-egress_ethertype": "IPv4", + "sctp-a-ingress_rule_application": "any", + "gpb1_Internal2_mac": "00:11:22:EF:AC:DF", + "instance_ip_family_v6": "v6", + "sctp-a-ipv6-egress_src_start_port": "0", + "sctp-b-ingress-src_start_port": "0.0", + "sctp-b-ingress_dst_addresses": "local", + "fsb1_Internal1_mac": "00:11:22:EF:AC:DF", + "vlc_st_interface_type_oam": "management", + "multi_stage_design": "true", + "oam_sec_group_name": "oam-sec-group", + "Internal2_net_gateway": "10.0.0.10", + "sctp-a-ipv6-ingress-dst_end_port": "65535", + "sctp-b-ipv6-egress-dst_start_port": "0", + "Internal1_net_gateway": "10.0.0.10", + "sctp-b-ipv6-egress_rule_protocol": "any", + "gtp_sec_group_name": "gtp-sec-group", + "sctp-a-ipv6-egress_dst_subnet_prefix": "0.0.0.0", + "sctp-b-ipv6-egress_dst_subnet_prefix_len": "0", + "sctp-a-ipv6-ingress_dst_addresses": "local", + "sctp-a-egress_rule_protocol": "icmp", + "sctp-b-ipv6-egress_action": "pass", + "sctp-a-ipv6-egress_action": "pass", + "Internal1_shared": "false", + "sctp-b-ipv6-ingress_rule_protocol": "any", + "Internal2_net_cidr_len": "17", + "sctp-a-name": "epc-sctp-a-ipv4v6-sec-group", + "sctp-a-ingress-src_end_port": "65535.0", + "sctp-b-ipv6-ingress_src_subnet_prefix": "0.0.0.0", + "sctp-a-egress-dst_end_port": "65535.0", + "sctp-a-ingress_action": "pass", + "sctp-b-egress_rule_protocol": "icmp", + "sctp-b-ipv6-ingress_action": "pass", + "vlc_st_service_type": "firewall", + "sctp-b-ipv6-egress_dst_end_port": "65535", + "sctp-b-ipv6-ingress-dst_start_port": "0", + "vlc2_Internal2_mac": "00:11:22:EF:AC:DF", + "vlc_st_availability_zone": "true", + "fsb_volume_image_name_1": "MME_FSB2_16ACP04_GA.qcow2", + "sctp-b-ingress-src_subnet_prefix": "0.0.0.0", + "sctp-a-ipv6-ingress_src_subnet_prefix_len": "0", + "Internal1_allow_transit": "true", + "gpb_flavor_name": "nv.c20r64d1", + "availability_zone_max_count": "1", + "fsb_volume_image_name_0": "MME_FSB1_16ACP04_GA.qcow2", + "sctp-b-ipv6-ingress_dst_addresses": "local", + "sctp-b-ipv6-egress_dst_subnet_prefix": "0.0.0.0", + "sctp-b-ipv6-ingress_ethertype": "IPv4", + "vlc1_Internal2_mac": "00:11:22:EF:AC:DF", + "sctp-a-ingress-src_subnet_prefix": "0.0.0.0", + "sctp-a-ipv6-ingress_action": "pass", + "Internal1_rpf": "disable", + "sctp-b-ingress_ethertype": "IPv4", + "sctp-b-egress_rule_application": "any", + "sctp-b-ingress-src_end_port": "65535.0", + "sctp-a-ipv6-ingress_rule_protocol": "any", + "sctp-a-ingress-src_start_port": "0.0", + "sctp-b-egress-dst_end_port": "65535.0" + }, + "type": "VF", + "modelCustomizationName": "VF_vMee 0", + "vfModules": { + "vf_vmee0..VfVmee..vmme_vlc..module-1": { + "uuid": "522159d5-d6e0-4c2a-aa44-5a542a12a830", + "invariantUuid": "98a7c88b-b577-476a-90e4-e25a5871e02b", + "customizationUuid": "55b1be94-671a-403e-a26c-667e9c47d091", + "description": null, + "name": "VfVmee..vmme_vlc..module-1", + "version": "2", + "modelCustomizationName": "VfVmee..vmme_vlc..module-1", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "vmme_vlc" + }, + "inputs": {}, + "volumeGroupAllowed": true + }, + "vf_vmee0..VfVmee..vmme_gpb..module-2": { + "uuid": "41708296-e443-4c71-953f-d9a010f059e1", + "invariantUuid": "1cca90b8-3490-495e-87da-3f3e4c57d5b9", + "customizationUuid": "6add59e0-7fe1-4bc4-af48-f8812422ae7c", + "description": null, + "name": "VfVmee..vmme_gpb..module-2", + "version": "2", + "modelCustomizationName": "VfVmee..vmme_gpb..module-2", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "vmme_gpb" + }, + "inputs": {}, + "volumeGroupAllowed": false + }, + "vf_vmee0..VfVmee..base_vmme..module-0": { + "uuid": "a27f5cfc-7f12-4f99-af08-0af9c3885c87", + "invariantUuid": "a6f9e51a-2b35-416a-ae15-15e58d61f36d", + "customizationUuid": "f8c040f1-7e51-4a11-aca8-acf256cfd861", + "description": null, + "name": "VfVmee..base_vmme..module-0", + "version": "2", + "modelCustomizationName": "VfVmee..base_vmme..module-0", + "properties": { + "minCountInstances": 1, + "maxCountInstances": 1, + "initialCount": 1, + "vfModuleLabel": "base_vmme" + }, + "inputs": {}, + "volumeGroupAllowed": true + } + }, + "volumeGroups": { + "vf_vmee0..VfVmee..base_vmme..module-0": { + "uuid": "a27f5cfc-7f12-4f99-af08-0af9c3885c87", + "invariantUuid": "a6f9e51a-2b35-416a-ae15-15e58d61f36d", + "customizationUuid": "f8c040f1-7e51-4a11-aca8-acf256cfd861", + "description": null, + "name": "VfVmee..base_vmme..module-0", + "version": "2", + "modelCustomizationName": "VfVmee..base_vmme..module-0", + "properties": { + "minCountInstances": 1, + "maxCountInstances": 1, + "initialCount": 1, + "vfModuleLabel": "base_vmme" + }, + "inputs": {} + } + }, + "vfcInstanceGroups": {} + } + }, + "networks": { + "ExtVL 0": { + "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986", + "invariantUuid": "379f816b-a7aa-422f-be30-17114ff50b7c", + "description": "ECOMP generic virtual link (network) base type for all other service-level and global networks", + "name": "ExtVL", + "version": "37.0", + "customizationUuid": "94fdd893-4a36-4d70-b16a-ec29c54c184f", + "inputs": {}, + "commands": {}, + "properties": { + "netowrk_role": "role 1, role 2, role 3", + "network_assignments": "{is_external_network=false, ipv4_subnet_default_assignment={min_subnets_count=1}, ecomp_generated_network_assignment=false, ipv6_subnet_default_assignment={min_subnets_count=1}}", + "exVL_naming": "{ecomp_generated_naming=true}", + "network_flows": "{is_network_policy=false, is_bound_to_vpn=false}", + "network_homing": "{ecomp_selected_instance_node_target=false}" + }, + "type": "VL", + "modelCustomizationName": "ExtVL 0" + } + }, + "collectionResource": {}, + "configurations": { + "Port Mirroring Configuration By Policy 0": { + "uuid": "b4398538-e89d-4f13-b33d-ca323434ba50", + "invariantUuid": "6ef0ca40-f366-4897-951f-abd65d25f6f7", + "description": "A port mirroring configuration by policy object", + "name": "Port Mirroring Configuration By Policy", + "version": "27.0", + "customizationUuid": "3c3b7b8d-8669-4b3b-8664-61970041fad2", + "inputs": {}, + "commands": {}, + "properties": {}, + "type": "Configuration", + "modelCustomizationName": "Port Mirroring Configuration By Policy 0", + "sourceNodes": [], + "collectorNodes": null, + "configurationByPolicy": false + } + }, + "serviceProxies": {}, + "vfModules": { + "vf_vmee0..VfVmee..vmme_vlc..module-1": { + "uuid": "522159d5-d6e0-4c2a-aa44-5a542a12a830", + "invariantUuid": "98a7c88b-b577-476a-90e4-e25a5871e02b", + "customizationUuid": "55b1be94-671a-403e-a26c-667e9c47d091", + "description": null, + "name": "VfVmee..vmme_vlc..module-1", + "version": "2", + "modelCustomizationName": "VfVmee..vmme_vlc..module-1", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "vmme_vlc" + }, + "inputs": {}, + "volumeGroupAllowed": true + }, + "vf_vmee0..VfVmee..vmme_gpb..module-2": { + "uuid": "41708296-e443-4c71-953f-d9a010f059e1", + "invariantUuid": "1cca90b8-3490-495e-87da-3f3e4c57d5b9", + "customizationUuid": "6add59e0-7fe1-4bc4-af48-f8812422ae7c", + "description": null, + "name": "VfVmee..vmme_gpb..module-2", + "version": "2", + "modelCustomizationName": "VfVmee..vmme_gpb..module-2", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "vmme_gpb" + }, + "inputs": {}, + "volumeGroupAllowed": false + }, + "vf_vmee0..VfVmee..base_vmme..module-0": { + "uuid": "a27f5cfc-7f12-4f99-af08-0af9c3885c87", + "invariantUuid": "a6f9e51a-2b35-416a-ae15-15e58d61f36d", + "customizationUuid": "f8c040f1-7e51-4a11-aca8-acf256cfd861", + "description": null, + "name": "VfVmee..base_vmme..module-0", + "version": "2", + "modelCustomizationName": "VfVmee..base_vmme..module-0", + "properties": { + "minCountInstances": 1, + "maxCountInstances": 1, + "initialCount": 1, + "vfModuleLabel": "base_vmme" + }, + "inputs": {}, + "volumeGroupAllowed": true + } + }, + "volumeGroups": { + "vf_vmee0..VfVmee..base_vmme..module-0": { + "uuid": "a27f5cfc-7f12-4f99-af08-0af9c3885c87", + "invariantUuid": "a6f9e51a-2b35-416a-ae15-15e58d61f36d", + "customizationUuid": "f8c040f1-7e51-4a11-aca8-acf256cfd861", + "description": null, + "name": "VfVmee..base_vmme..module-0", + "version": "2", + "modelCustomizationName": "VfVmee..base_vmme..module-0", + "properties": { + "minCountInstances": 1, + "maxCountInstances": 1, + "initialCount": 1, + "vfModuleLabel": "base_vmme" + }, + "inputs": {} + } + }, + "pnfs": {} + }, + "6b528779-44a3-4472-bdff-9cd15ec93450": { + "service": { + "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450", + "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0", + "name": "action-data", + "version": "1.0", + "toscaModelURL": null, + "category": "", + "serviceType": "", + "serviceRole": "", + "description": "", + "serviceEcompNaming": "false", + "instantiationType": "A-La-Carte", + "inputs": { + "2017488_adiodvpe0_ASN": { + "type": "string", + "description": "AV/PE", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "AV_vPE" + } + } + }, + "vnfs": { + "2017-388_ADIOD-vPE 1": { + "uuid": "0903e1c0-8e03-4936-b5c2-260653b96413", + "invariantUuid": "00beb8f9-6d39-452f-816d-c709b9cbb87d", + "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM", + "name": "2017-388_ADIOD-vPE", + "version": "1.0", + "customizationUuid": "280dec31-f16d-488b-9668-4aae55d6648a", + "inputs": { + "vnf_config_template_version": { + "type": "string", + "description": "VPE Software Version", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "17.2" + }, + "bandwidth_units": { + "type": "string", + "description": "Units of bandwidth", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "Gbps" + }, + "bandwidth": { + "type": "string", + "description": "Requested VPE bandwidth", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "10" + }, + "AIC_CLLI": { + "type": "string", + "description": "AIC Site CLLI", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "ATLMY8GA" + }, + "ASN": { + "type": "string", + "description": "AV/PE", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "AV_vPE" + }, + "vnf_instance_name": { + "type": "string", + "description": "The hostname assigned to the vpe.", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "mtnj309me6" + } + }, + "commands": { + "vnf_config_template_version": { + "displayName": "vnf_config_template_version", + "command": "get_input", + "inputName": "2017488_adiodvpe0_vnf_config_template_version" + }, + "bandwidth_units": { + "displayName": "bandwidth_units", + "command": "get_input", + "inputName": "adiodvpe0_bandwidth_units" + }, + "bandwidth": {"displayName": "bandwidth", "command": "get_input", "inputName": "adiodvpe0_bandwidth"}, + "AIC_CLLI": { + "displayName": "AIC_CLLI", + "command": "get_input", + "inputName": "2017488_adiodvpe0_AIC_CLLI" + }, + "ASN": {"displayName": "ASN", "command": "get_input", "inputName": "2017488_adiodvpe0_ASN"}, + "vnf_instance_name": { + "displayName": "vnf_instance_name", + "command": "get_input", + "inputName": "2017488_adiodvpe0_vnf_instance_name" + } + }, + "properties": { + "vmxvre_retype": "RE-VMX", + "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version", + "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d", + "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9", + "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF", + "int_ctl_net_name": "VMX-INTXI", + "vmx_int_ctl_prefix": "10.0.0.10", + "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5", + "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279", + "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a", + "nf_type": "vPE", + "vmxvpfe_int_ctl_ip_1": "10.0.0.10", + "is_AVPN_service": "false", + "vmx_RSG_name": "vREXI-affinity", + "vmx_int_ctl_forwarding": "l2", + "vmxvre_oam_ip_0": "10.0.0.10", + "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvpfe_sriov41_0_port_vlanstrip": "false", + "vmxvpfe_sriov42_0_port_vlanfilter": "4001", + "vmxvpfe_sriov44_0_port_unknownunicastallow": "true", + "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2", + "vmxvre_instance": "0", + "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvre_flavor_name": "ns.c1r16d32.v5", + "vmxvpfe_volume_size_0": "40.0", + "vmxvpfe_sriov43_0_port_vlanfilter": "4001", + "nf_naming": "{ecomp_generated_naming=false}", + "nf_naming_code": "Navneet", + "vmxvre_name_0": "vREXI", + "vmxvpfe_sriov42_0_port_vlanstrip": "false", + "vmxvpfe_volume_name_0": "vPFEXI_FBVolume", + "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141", + "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2", + "vmxvpfe_sriov43_0_port_unknownunicastallow": "true", + "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true", + "vmxvre_console": "vidconsole", + "vmxvpfe_sriov44_0_port_vlanfilter": "4001", + "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3", + "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true", + "vmxvpfe_sriov44_0_port_vlanstrip": "false", + "vf_module_id": "123", + "nf_function": "JAI", + "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true", + "vmxvre_int_ctl_ip_0": "10.0.0.10", + "ecomp_generated_naming": "false", + "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI", + "vnf_name": "mtnj309me6vre", + "vmxvpfe_sriov41_0_port_unknownunicastallow": "true", + "vmxvre_volume_type_1": "HITACHI", + "vmxvpfe_sriov44_0_port_broadcastallow": "true", + "vmxvre_volume_type_0": "HITACHI", + "vmxvpfe_volume_type_0": "HITACHI", + "vmxvpfe_sriov43_0_port_broadcastallow": "true", + "bandwidth_units": "get_input:adiodvpe0_bandwidth_units", + "vnf_id": "123", + "vmxvre_oam_prefix": "24", + "availability_zone_0": "mtpocfo-kvm-az01", + "ASN": "get_input:2017488_adiodvpe0_ASN", + "vmxvre_chassis_i2cid": "161", + "vmxvpfe_name_0": "vPFEXI", + "bandwidth": "get_input:adiodvpe0_bandwidth", + "availability_zone_max_count": "1", + "vmxvre_volume_size_0": "45.0", + "vmxvre_volume_size_1": "50.0", + "vmxvpfe_sriov42_0_port_broadcastallow": "true", + "vmxvre_oam_gateway": "10.0.0.10", + "vmxvre_volume_name_1": "vREXI_FAVolume", + "vmxvre_ore_present": "0", + "vmxvre_volume_name_0": "vREXI_FBVolume", + "vmxvre_type": "0", + "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name", + "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true", + "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429", + "vmx_int_ctl_len": "24", + "vmxvpfe_sriov43_0_port_vlanstrip": "false", + "vmxvpfe_sriov41_0_port_broadcastallow": "true", + "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d", + "vmxvpfe_sriov41_0_port_vlanfilter": "4001", + "nf_role": "Testing", + "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a", + "vmxvpfe_sriov42_0_port_unknownunicastallow": "true", + "vmxvpfe_flavor_name": "ns.c20r16d25.v5" + }, + "type": "VF", + "modelCustomizationName": "2017-388_ADIOD-vPE 1", + "vfModules": {}, + "volumeGroups": {}, + "vfcInstanceGroups": {} + }, + "2017-388_ADIOD-vPE 0": { + "uuid": "afacccf6-397d-45d6-b5ae-94c39734b168", + "invariantUuid": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8", + "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM", + "name": "2017-388_ADIOD-vPE", + "version": "4.0", + "customizationUuid": "b3c76f73-eeb5-4fb6-9d31-72a889f1811c", + "inputs": { + "vnf_config_template_version": { + "type": "string", + "description": "VPE Software Version", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "17.2" + }, + "bandwidth_units": { + "type": "string", + "description": "Units of bandwidth", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "Gbps" + }, + "bandwidth": { + "type": "string", + "description": "Requested VPE bandwidth", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "10" + }, + "AIC_CLLI": { + "type": "string", + "description": "AIC Site CLLI", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "ATLMY8GA" + }, + "ASN": { + "type": "string", + "description": "AV/PE", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "AV_vPE" + }, + "vnf_instance_name": { + "type": "string", + "description": "The hostname assigned to the vpe.", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "mtnj309me6" + } + }, + "commands": { + "vnf_config_template_version": { + "displayName": "vnf_config_template_version", + "command": "get_input", + "inputName": "2017488_adiodvpe0_vnf_config_template_version" + }, + "bandwidth_units": { + "displayName": "bandwidth_units", + "command": "get_input", + "inputName": "adiodvpe0_bandwidth_units" + }, + "bandwidth": {"displayName": "bandwidth", "command": "get_input", "inputName": "adiodvpe0_bandwidth"}, + "AIC_CLLI": { + "displayName": "AIC_CLLI", + "command": "get_input", + "inputName": "2017488_adiodvpe0_AIC_CLLI" + }, + "ASN": {"displayName": "ASN", "command": "get_input", "inputName": "2017488_adiodvpe0_ASN"}, + "vnf_instance_name": { + "displayName": "vnf_instance_name", + "command": "get_input", + "inputName": "2017488_adiodvpe0_vnf_instance_name" + } + }, + "properties": { + "vmxvre_retype": "RE-VMX", + "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version", + "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d", + "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9", + "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF", + "int_ctl_net_name": "VMX-INTXI", + "vmx_int_ctl_prefix": "10.0.0.10", + "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5", + "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279", + "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a", + "nf_type": "vPE", + "vmxvpfe_int_ctl_ip_1": "10.0.0.10", + "is_AVPN_service": "false", + "vmx_RSG_name": "vREXI-affinity", + "vmx_int_ctl_forwarding": "l2", + "vmxvre_oam_ip_0": "10.0.0.10", + "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvpfe_sriov41_0_port_vlanstrip": "false", + "vmxvpfe_sriov42_0_port_vlanfilter": "4001", + "vmxvpfe_sriov44_0_port_unknownunicastallow": "true", + "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2", + "vmxvre_instance": "0", + "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvre_flavor_name": "ns.c1r16d32.v5", + "vmxvpfe_volume_size_0": "40.0", + "vmxvpfe_sriov43_0_port_vlanfilter": "4001", + "nf_naming": "{ecomp_generated_naming=false}", + "nf_naming_code": "Navneet", + "vmxvre_name_0": "vREXI", + "vmxvpfe_sriov42_0_port_vlanstrip": "false", + "vmxvpfe_volume_name_0": "vPFEXI_FBVolume", + "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141", + "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2", + "vmxvpfe_sriov43_0_port_unknownunicastallow": "true", + "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true", + "vmxvre_console": "vidconsole", + "vmxvpfe_sriov44_0_port_vlanfilter": "4001", + "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3", + "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true", + "min_instances": "1", + "vmxvpfe_sriov44_0_port_vlanstrip": "false", + "vf_module_id": "123", + "nf_function": "JAI", + "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true", + "vmxvre_int_ctl_ip_0": "10.0.0.10", + "ecomp_generated_naming": "false", + "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI", + "vnf_name": "mtnj309me6vre", + "vmxvpfe_sriov41_0_port_unknownunicastallow": "true", + "vmxvre_volume_type_1": "HITACHI", + "vmxvpfe_sriov44_0_port_broadcastallow": "true", + "vmxvre_volume_type_0": "HITACHI", + "vmxvpfe_volume_type_0": "HITACHI", + "vmxvpfe_sriov43_0_port_broadcastallow": "true", + "bandwidth_units": "get_input:adiodvpe0_bandwidth_units", + "vnf_id": "123", + "vmxvre_oam_prefix": "24", + "availability_zone_0": "mtpocfo-kvm-az01", + "ASN": "get_input:2017488_adiodvpe0_ASN", + "vmxvre_chassis_i2cid": "161", + "vmxvpfe_name_0": "vPFEXI", + "bandwidth": "get_input:adiodvpe0_bandwidth", + "availability_zone_max_count": "1", + "vmxvre_volume_size_0": "45.0", + "vmxvre_volume_size_1": "50.0", + "vmxvpfe_sriov42_0_port_broadcastallow": "true", + "vmxvre_oam_gateway": "10.0.0.10", + "vmxvre_volume_name_1": "vREXI_FAVolume", + "vmxvre_ore_present": "0", + "vmxvre_volume_name_0": "vREXI_FBVolume", + "vmxvre_type": "0", + "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name", + "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true", + "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429", + "vmx_int_ctl_len": "24", + "vmxvpfe_sriov43_0_port_vlanstrip": "false", + "vmxvpfe_sriov41_0_port_broadcastallow": "true", + "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d", + "vmxvpfe_sriov41_0_port_vlanfilter": "4001", + "nf_role": "Testing", + "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a", + "vmxvpfe_sriov42_0_port_unknownunicastallow": "true", + "vmxvpfe_flavor_name": "ns.c20r16d25.v5" + }, + "type": "VF", + "modelCustomizationName": "2017-388_ADIOD-vPE 0", + "vfModules": {}, + "volumeGroups": {}, + "vfcInstanceGroups": {} + }, + "2017-488_ADIOD-vPE 0": { + "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09", + "invariantUuid": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8", + "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM", + "name": "2017-488_ADIOD-vPE", + "version": "5.0", + "customizationUuid": "1da7b585-5e61-4993-b95e-8e6606c81e45", + "inputs": { + "vnf_config_template_version": { + "type": "string", + "description": "VPE Software Version", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "17.2" + }, + "bandwidth_units": { + "type": "string", + "description": "Units of bandwidth", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "Gbps" + }, + "bandwidth": { + "type": "string", + "description": "Requested VPE bandwidth", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "10" + }, + "AIC_CLLI": { + "type": "string", + "description": "AIC Site CLLI", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "ATLMY8GA" + }, + "ASN": { + "type": "string", + "description": "AV/PE", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "AV_vPE" + }, + "vnf_instance_name": { + "type": "string", + "description": "The hostname assigned to the vpe.", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "mtnj309me6" + } + }, + "commands": { + "vnf_config_template_version": { + "displayName": "vnf_config_template_version", + "command": "get_input", + "inputName": "2017488_adiodvpe0_vnf_config_template_version" + }, + "bandwidth_units": { + "displayName": "bandwidth_units", + "command": "get_input", + "inputName": "adiodvpe0_bandwidth_units" + }, + "bandwidth": {"displayName": "bandwidth", "command": "get_input", "inputName": "adiodvpe0_bandwidth"}, + "AIC_CLLI": { + "displayName": "AIC_CLLI", + "command": "get_input", + "inputName": "2017488_adiodvpe0_AIC_CLLI" + }, + "ASN": {"displayName": "ASN", "command": "get_input", "inputName": "2017488_adiodvpe0_ASN"}, + "vnf_instance_name": { + "displayName": "vnf_instance_name", + "command": "get_input", + "inputName": "2017488_adiodvpe0_vnf_instance_name" + } + }, + "properties": { + "vmxvre_retype": "RE-VMX", + "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version", + "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d", + "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9", + "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF", + "int_ctl_net_name": "VMX-INTXI", + "vmx_int_ctl_prefix": "10.0.0.10", + "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5", + "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279", + "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a", + "nf_type": "vPE", + "vmxvpfe_int_ctl_ip_1": "10.0.0.10", + "is_AVPN_service": "false", + "vmx_RSG_name": "vREXI-affinity", + "vmx_int_ctl_forwarding": "l2", + "vmxvre_oam_ip_0": "10.0.0.10", + "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvpfe_sriov41_0_port_vlanstrip": "false", + "vmxvpfe_sriov42_0_port_vlanfilter": "4001", + "vmxvpfe_sriov44_0_port_unknownunicastallow": "true", + "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2", + "vmxvre_instance": "0", + "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvre_flavor_name": "ns.c1r16d32.v5", + "vmxvpfe_volume_size_0": "40.0", + "vmxvpfe_sriov43_0_port_vlanfilter": "4001", + "nf_naming": "{ecomp_generated_naming=false}", + "nf_naming_code": "Navneet", + "vmxvre_name_0": "vREXI", + "vmxvpfe_sriov42_0_port_vlanstrip": "false", + "vmxvpfe_volume_name_0": "vPFEXI_FBVolume", + "max_instances": "3", + "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141", + "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2", + "vmxvpfe_sriov43_0_port_unknownunicastallow": "true", + "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true", + "vmxvre_console": "vidconsole", + "vmxvpfe_sriov44_0_port_vlanfilter": "4001", + "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3", + "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true", + "min_instances": "1", + "vmxvpfe_sriov44_0_port_vlanstrip": "false", + "vf_module_id": "123", + "nf_function": "JAI", + "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true", + "vmxvre_int_ctl_ip_0": "10.0.0.10", + "ecomp_generated_naming": "false", + "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI", + "vnf_name": "mtnj309me6vre", + "vmxvpfe_sriov41_0_port_unknownunicastallow": "true", + "vmxvre_volume_type_1": "HITACHI", + "vmxvpfe_sriov44_0_port_broadcastallow": "true", + "vmxvre_volume_type_0": "HITACHI", + "vmxvpfe_volume_type_0": "HITACHI", + "vmxvpfe_sriov43_0_port_broadcastallow": "true", + "bandwidth_units": "get_input:adiodvpe0_bandwidth_units", + "vnf_id": "123", + "vmxvre_oam_prefix": "24", + "availability_zone_0": "mtpocfo-kvm-az01", + "ASN": "get_input:2017488_adiodvpe0_ASN", + "vmxvre_chassis_i2cid": "161", + "vmxvpfe_name_0": "vPFEXI", + "bandwidth": "get_input:adiodvpe0_bandwidth", + "availability_zone_max_count": "1", + "vmxvre_volume_size_0": "45.0", + "vmxvre_volume_size_1": "50.0", + "vmxvpfe_sriov42_0_port_broadcastallow": "true", + "vmxvre_oam_gateway": "10.0.0.10", + "vmxvre_volume_name_1": "vREXI_FAVolume", + "vmxvre_ore_present": "0", + "vmxvre_volume_name_0": "vREXI_FBVolume", + "vmxvre_type": "0", + "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name", + "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true", + "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429", + "vmx_int_ctl_len": "24", + "vmxvpfe_sriov43_0_port_vlanstrip": "false", + "vmxvpfe_sriov41_0_port_broadcastallow": "true", + "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d", + "vmxvpfe_sriov41_0_port_vlanfilter": "4001", + "nf_role": "Testing", + "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a", + "vmxvpfe_sriov42_0_port_unknownunicastallow": "true", + "vmxvpfe_flavor_name": "ns.c20r16d25.v5" + }, + "type": "VF", + "modelCustomizationName": "2017-488_ADIOD-vPE 0", + "vfModules": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": { + "uuid": "25284168-24bb-4698-8cb4-3f509146eca5", + "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1", + "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vRE_BV" + }, + "inputs": { + "adiodvpe0_bandwidth": { + "type": "string", + "description": "Requested VPE bandwidth", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "bandwidth" + }, + "constraints": null, + "required": true, + "default": "10" + }, + "2017488_adiodvpe0_vnf_instance_name": { + "type": "string", + "description": "The hostname assigned to the vpe.", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "vnf_instance_name" + }, + "constraints": null, + "required": true, + "default": "mtnj309me6" + }, + "2017488_adiodvpe0_vnf_config_template_version": { + "type": "string", + "description": "VPE Software Version", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "vnf_config_template_version" + }, + "constraints": null, + "required": true, + "default": "17.2" + }, + "2017488_adiodvpe0_AIC_CLLI": { + "type": "string", + "description": "AIC Site CLLI", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "AIC_CLLI" + }, + "constraints": null, + "required": true, + "default": "ATLMY8GA" + }, + "adiodvpe0_bandwidth_units": { + "type": "string", + "description": "Units of bandwidth", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "bandwidth_units" + }, + "constraints": null, + "required": true, + "default": "Gbps" + } + }, + "volumeGroupAllowed": true + }, + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": { + "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db", + "invariantUuid": "b34833bb-6aa9-4ad6-a831-70b06367a091", + "customizationUuid": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3", + "description": null, + "name": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0", + "version": "5", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0", + "properties": { + "minCountInstances": 1, + "maxCountInstances": 1, + "initialCount": 1, + "vfModuleLabel": "ADIOD_base_vPE_BV" + }, + "inputs": {}, + "volumeGroupAllowed": false + }, + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": { + "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a", + "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339", + "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vPFE_BV" + }, + "inputs": {}, + "volumeGroupAllowed": true + } + }, + "volumeGroups": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": { + "uuid": "25284168-24bb-4698-8cb4-3f509146eca5", + "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1", + "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vRE_BV" + }, + "inputs": { + "adiodvpe0_bandwidth": { + "type": "string", + "description": "Requested VPE bandwidth", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "bandwidth" + }, + "constraints": null, + "required": true, + "default": "10" + }, + "2017488_adiodvpe0_vnf_instance_name": { + "type": "string", + "description": "The hostname assigned to the vpe.", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "vnf_instance_name" + }, + "constraints": null, + "required": true, + "default": "mtnj309me6" + }, + "2017488_adiodvpe0_vnf_config_template_version": { + "type": "string", + "description": "VPE Software Version", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "vnf_config_template_version" + }, + "constraints": null, + "required": true, + "default": "17.2" + }, + "2017488_adiodvpe0_AIC_CLLI": { + "type": "string", + "description": "AIC Site CLLI", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "AIC_CLLI" + }, + "constraints": null, + "required": true, + "default": "ATLMY8GA" + }, + "adiodvpe0_bandwidth_units": { + "type": "string", + "description": "Units of bandwidth", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "bandwidth_units" + }, + "constraints": null, + "required": true, + "default": "Gbps" + } + } + }, + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": { + "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a", + "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339", + "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vPFE_BV" + }, + "inputs": {} + } + }, + "vfcInstanceGroups": {} + } + }, + "networks": { + "ExtVL 0": { + "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986", + "invariantUuid": "379f816b-a7aa-422f-be30-17114ff50b7c", + "description": "ECOMP generic virtual link (network) base type for all other service-level and global networks", + "name": "ExtVL", + "version": "37.0", + "customizationUuid": "94fdd893-4a36-4d70-b16a-ec29c54c184f", + "inputs": { + "vnf_config_template_version": { + "type": "string", + "description": "VPE Software Version", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "17.2" + }, + "bandwidth_units": { + "type": "string", + "description": "Units of bandwidth", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "Gbps" + }, + "bandwidth": { + "type": "string", + "description": "Requested VPE bandwidth", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "10" + }, + "AIC_CLLI": { + "type": "string", + "description": "AIC Site CLLI", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "ATLMY8GA" + }, + "ASN": { + "type": "string", + "description": "AV/PE", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "AV_vPE" + }, + "vnf_instance_name": { + "type": "string", + "description": "The hostname assigned to the vpe.", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "mtnj309me6" + } + }, + "commands": {}, + "properties": { + "network_role" : "network role 1, network role 2", + "network_assignments": "{is_external_network=false, ipv4_subnet_default_assignment={min_subnets_count=1}, ecomp_generated_network_assignment=false, ipv6_subnet_default_assignment={min_subnets_count=1}}", + "exVL_naming": "{ecomp_generated_naming=true}", + "network_flows": "{is_network_policy=false, is_bound_to_vpn=false}", + "network_homing": "{ecomp_selected_instance_node_target=false}" + }, + "type": "VL", + "modelCustomizationName": "ExtVL 0" + } + }, + "collectionResource": {}, + "configurations": {}, + "fabricConfigurations": {}, + "serviceProxies": {}, + "vfModules": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": { + "uuid": "25284168-24bb-4698-8cb4-3f509146eca5", + "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1", + "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vRE_BV" + }, + "inputs": { + "adiodvpe0_bandwidth": { + "type": "string", + "description": "Requested VPE bandwidth", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "bandwidth" + }, + "constraints": null, + "required": true, + "default": "10" + }, + "2017488_adiodvpe0_vnf_instance_name": { + "type": "string", + "description": "The hostname assigned to the vpe.", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "vnf_instance_name" + }, + "constraints": null, + "required": true, + "default": "mtnj309me6" + }, + "2017488_adiodvpe0_vnf_config_template_version": { + "type": "string", + "description": "VPE Software Version", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "vnf_config_template_version" + }, + "constraints": null, + "required": true, + "default": "17.2" + }, + "2017488_adiodvpe0_AIC_CLLI": { + "type": "string", + "description": "AIC Site CLLI", + "entry_schema": null, + "inputProperties": {"sourceType": "HEAT", "vfModuleLabel": "ADIOD_vRE_BV", "paramName": "AIC_CLLI"}, + "constraints": null, + "required": true, + "default": "ATLMY8GA" + }, + "adiodvpe0_bandwidth_units": { + "type": "string", + "description": "Units of bandwidth", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "bandwidth_units" + }, + "constraints": null, + "required": true, + "default": "Gbps" + } + }, + "volumeGroupAllowed": true + }, + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": { + "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db", + "invariantUuid": "b34833bb-6aa9-4ad6-a831-70b06367a091", + "customizationUuid": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3", + "description": null, + "name": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0", + "version": "5", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0", + "properties": { + "minCountInstances": 1, + "maxCountInstances": 1, + "initialCount": 1, + "vfModuleLabel": "ADIOD_base_vPE_BV" + }, + "inputs": {}, + "volumeGroupAllowed": false + }, + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": { + "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a", + "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339", + "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vPFE_BV" + }, + "inputs": {}, + "volumeGroupAllowed": true + } + }, + "volumeGroups": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": { + "uuid": "25284168-24bb-4698-8cb4-3f509146eca5", + "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1", + "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vRE_BV" + }, + "inputs": { + "adiodvpe0_bandwidth": { + "type": "string", + "description": "Requested VPE bandwidth", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "bandwidth" + }, + "constraints": null, + "required": true, + "default": "10" + }, + "2017488_adiodvpe0_vnf_instance_name": { + "type": "string", + "description": "The hostname assigned to the vpe.", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "vnf_instance_name" + }, + "constraints": null, + "required": true, + "default": "mtnj309me6" + }, + "2017488_adiodvpe0_vnf_config_template_version": { + "type": "string", + "description": "VPE Software Version", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "vnf_config_template_version" + }, + "constraints": null, + "required": true, + "default": "17.2" + }, + "2017488_adiodvpe0_AIC_CLLI": { + "type": "string", + "description": "AIC Site CLLI", + "entry_schema": null, + "inputProperties": {"sourceType": "HEAT", "vfModuleLabel": "ADIOD_vRE_BV", "paramName": "AIC_CLLI"}, + "constraints": null, + "required": true, + "default": "ATLMY8GA" + }, + "adiodvpe0_bandwidth_units": { + "type": "string", + "description": "Units of bandwidth", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "bandwidth_units" + }, + "constraints": null, + "required": true, + "default": "Gbps" + } + } + }, + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": { + "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a", + "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339", + "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vPFE_BV" + }, + "inputs": {} + } + }, + "pnfs": {} + } + }, + "serviceInstance": { + "6e59c5de-f052-46fa-aa7e-2fca9d674c44": { + "vnfs": { + "VF_vMee 0": { + "rollbackOnFailure": "true", + "vfModules": { + "vf_vmee0..VfVmee..base_vmme..module-0": { + "vf_vmee0..VfVmee..base_vmme..module-0vmvzo": { + "isMissingData": false, + "sdncPreReload": null, + "modelInfo": { + "modelType": "VFmodule", + "modelInvariantId": "a6f9e51a-2b35-416a-ae15-15e58d61f36d", + "modelVersionId": "a27f5cfc-7f12-4f99-af08-0af9c3885c87", + "modelName": "VfVmee..base_vmme..module-0", + "modelVersion": "2", + "modelCustomizationId": "f8c040f1-7e51-4a11-aca8-acf256cfd861", + "modelCustomizationName": "VfVmee..base_vmme..module-0" + }, + "instanceParams": [{}], + "trackById": "wmtm6sy2uj" + } + } + }, + "isMissingData": true, + "originalName": "VF_vMee 0", + "vnfStoreKey": "VF_vMee 0", + "trackById": "p3wk448m5do", + "uuid": "d6557200-ecf2-4641-8094-5393ae3aae60", + "productFamilyId": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e", + "lcpCloudRegionId": null, + "tenantId": null, + "lineOfBusiness": null, + "platformName": null, + "modelInfo": { + "modelType": "VF", + "modelInvariantId": "4160458e-f648-4b30-a176-43881ffffe9e", + "modelVersionId": "6e59c5de-f052-46fa-aa7e-2fca9d674c44", + "modelName": "VF_vMee", + "modelVersion": "2.0", + "modelCustomizationName": "VF_vMee 0" + } + } + }, + "networks": {}, + "instanceParams": [{}], + "validationCounter": 1, + "existingNames": {}, + "existingVNFCounterMap": {"d6557200-ecf2-4641-8094-5393ae3aae60": 1}, + "globalSubscriberId": "e433710f-9217-458d-a79d-1c7aff376d89", + "subscriptionServiceType": "TYLER SILVIA", + "owningEntityId": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc", + "productFamilyId": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e", + "lcpCloudRegionId": "hvf6", + "tenantId": "229bcdc6eaeb4ca59d55221141d01f8e", + "aicZoneId": "JAG1", + "projectName": "x1", + "rollbackOnFailure": "true", + "bulkSize": 1, + "modelInfo": { + "modelInvariantId": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0", + "modelVersionId": "6e59c5de-f052-46fa-aa7e-2fca9d674c44", + "modelName": "ComplexService", + "modelVersion": "1.0", + "uuid": "6e59c5de-f052-46fa-aa7e-2fca9d674c44" + }, + "isALaCarte": false, + "name": "ComplexService", + "version": "1.0", + "description": "ComplexService", + "category": "Emanuel", + "uuid": "6e59c5de-f052-46fa-aa7e-2fca9d674c44", + "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0", + "serviceType": "", + "serviceRole": "", + "isMultiStepDesign": false + }, + "6b528779-44a3-4472-bdff-9cd15ec93450": { + "networks": { + "ExtVL 0": { + "rollbackOnFailure": "true", + "isMissingData": false, + "originalName": "ExtVL 0", + "networkStoreKey": "ExtVL 0", + "trackById": "sf3zth68xjf", + "productFamilyId": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034", + "lcpCloudRegionId": "hvf6", + "tenantId": "229bcdc6eaeb4ca59d55221141d01f8e", + "platformName": "xxx1", + "lineOfBusiness": "ONAP", + "instanceParams": [{}], + "modelInfo": { + "modelInvariantId": "379f816b-a7aa-422f-be30-17114ff50b7c", + "modelVersionId": "ddc3f20c-08b5-40fd-af72-c6d14636b986", + "modelName": "ExtVL", + "modelVersion": "37.0", + "modelCustomizationId": "94fdd893-4a36-4d70-b16a-ec29c54c184f", + "modelCustomizationName": "ExtVL 0", + "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986" + }, + "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986" + }, + "ExtVL 0:0001": { + "rollbackOnFailure": "true", + "isMissingData": false, + "originalName": "ExtVL 0", + "networkStoreKey": "ExtVL 0", + "trackById": "2mdxioxca9h", + "productFamilyId": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034", + "lcpCloudRegionId": "hvf6", + "tenantId": "229bcdc6eaeb4ca59d55221141d01f8e", + "platformName": "xxx1", + "lineOfBusiness": "ONAP", + "instanceParams": [{}], + "modelInfo": { + "modelInvariantId": "379f816b-a7aa-422f-be30-17114ff50b7c", + "modelVersionId": "ddc3f20c-08b5-40fd-af72-c6d14636b986", + "modelName": "ExtVL", + "modelVersion": "37.0", + "modelCustomizationId": "94fdd893-4a36-4d70-b16a-ec29c54c184f", + "modelCustomizationName": "ExtVL 0", + "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986" + }, + "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986" + }, + "ExtVL 0_1": { + "rollbackOnFailure": "true", + "isMissingData": false, + "originalName": "ExtVL 0", + "networkStoreKey": "ExtVL 0_1", + "trackById": "z7vd1gmpbs", + "instanceName": "ExtVL", + "productFamilyId": "17cc1042-527b-11e6-beb8-9e71128cae77", + "lcpCloudRegionId": "hvf6", + "tenantId": "229bcdc6eaeb4ca59d55221141d01f8e", + "platformName": "xxx1", + "lineOfBusiness": "zzz1", + "instanceParams": [{ + "vnf_config_template_version": "17.2", + "bandwidth_units": "Gbps", + "bandwidth": "10", + "AIC_CLLI": "ATLMY8GA", + "ASN": "AV_vPE", + "vnf_instance_name": "yoav" + }], + "modelInfo": { + "modelInvariantId": "379f816b-a7aa-422f-be30-17114ff50b7c", + "modelVersionId": "ddc3f20c-08b5-40fd-af72-c6d14636b986", + "modelName": "ExtVL", + "modelVersion": "37.0", + "modelCustomizationId": "94fdd893-4a36-4d70-b16a-ec29c54c184f", + "modelCustomizationName": "ExtVL 0", + "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986" + }, + "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986" + } + }, + "vnfs": { + "2017-488_ADIOD-vPE 0": { + "rollbackOnFailure": "true", + "vfModules": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1sgoqi": { + "instanceName": "yoav", + "volumeGroupName": "123", + "modelInfo": { + "modelInvariantId": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1", + "modelVersionId": "25284168-24bb-4698-8cb4-3f509146eca5", + "modelName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "modelVersion": "6", + "modelCustomizationId": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "uuid": "25284168-24bb-4698-8cb4-3f509146eca5" + }, + "uuid": "25284168-24bb-4698-8cb4-3f509146eca5", + "isMissingData": false, + "instanceParams": [{ + "adiodvpe0_bandwidth": "10", + "2017488_adiodvpe0_vnf_instance_name": "mtnj309me6", + "2017488_adiodvpe0_vnf_config_template_version": "17.2", + "2017488_adiodvpe0_AIC_CLLI": "ATLMY8GA", + "adiodvpe0_bandwidth_units": "Gbps" + }] + } + } + }, + "isMissingData": false, + "originalName": "2017-488_ADIOD-vPE 0", + "vnfStoreKey": "2017-488_ADIOD-vPE 0", + "trackById": "o65b26t2thj", + "instanceName": "2017488_ADIODvPE", + "productFamilyId": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034", + "lcpCloudRegionId": "hvf6", + "tenantId": "bae71557c5bb4d5aac6743a4e5f1d054", + "platformName": "platform", + "lineOfBusiness": "ONAP", + "instanceParams": [{}], + "modelInfo": { + "modelInvariantId": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8", + "modelVersionId": "69e09f68-8b63-4cc9-b9ff-860960b5db09", + "modelName": "2017-488_ADIOD-vPE", + "modelVersion": "5.0", + "modelCustomizationId": "1da7b585-5e61-4993-b95e-8e6606c81e45", + "modelCustomizationName": "2017-488_ADIOD-vPE 0", + "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09" + }, + "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09" + } + }, + "instanceParams": [{"2017488_adiodvpe0_ASN": "AV_vPE"}], + "validationCounter": 0, + "existingNames": {"123": "", "instancename": "", "yoav": "", "extvl": ""}, + "existingVNFCounterMap": {"69e09f68-8b63-4cc9-b9ff-860960b5db09": 1}, + "existingNetworksCounterMap": {"ddc3f20c-08b5-40fd-af72-c6d14636b986": 3}, + "instanceName": "InstanceName", + "globalSubscriberId": "e433710f-9217-458d-a79d-1c7aff376d89", + "subscriptionServiceType": "TYLER SILVIA", + "owningEntityId": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc", + "productFamilyId": "17cc1042-527b-11e6-beb8-9e71128cae77", + "lcpCloudRegionId": "JANET25", + "tenantId": "092eb9e8e4b7412e8787dd091bc58e86", + "aicZoneId": "JAG1", + "projectName": null, + "rollbackOnFailure": "true", + "aicZoneName": "YUDFJULP-JAG1", + "owningEntityName": "WayneHolland", + "testApi": "GR_API", + "tenantName": "USP-SIP-IC-24335-T-01", + "bulkSize": 1, + "modelInfo": { + "modelInvariantId": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0", + "modelVersionId": "6b528779-44a3-4472-bdff-9cd15ec93450", + "modelName": "action-data", + "modelVersion": "1.0", + "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450" + }, + "isALaCarte": false, + "name": "action-data", + "version": "1.0", + "description": "", + "category": "", + "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450", + "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0", + "serviceType": "", + "serviceRole": "", + "isMultiStepDesign": false + } + }, + "lcpRegionsAndTenants": { + "lcpRegionList": [{ + "id": "JANET25", + "name": "JANET25", + "isPermitted": true + }, {"id": "hvf6", "name": "hvf6", "isPermitted": true}], + "lcpRegionsTenantsMap": { + "JANET25": [{ + "id": "092eb9e8e4b7412e8787dd091bc58e86", + "name": "USP-SIP-IC-24335-T-01", + "isPermitted": true + }], + "hvf6": [{ + "id": "bae71557c5bb4d5aac6743a4e5f1d054", + "name": "AIN Web Tool-15-D-testalexandria", + "isPermitted": true + }, { + "id": "229bcdc6eaeb4ca59d55221141d01f8e", + "name": "AIN Web Tool-15-D-STTest2", + "isPermitted": true + }, { + "id": "1178612d2b394be4834ad77f567c0af2", + "name": "AIN Web Tool-15-D-SSPtestcustome", + "isPermitted": true + }, { + "id": "19c5ade915eb461e8af52fb2fd8cd1f2", + "name": "AIN Web Tool-15-D-UncheckedEcopm", + "isPermitted": true + }, { + "id": "de007636e25249238447264a988a927b", + "name": "AIN Web Tool-15-D-dfsdf", + "isPermitted": true + }, { + "id": "62f29b3613634ca6a3065cbe0e020c44", + "name": "AIN/SMS-16-D-Multiservices1", + "isPermitted": true + }, { + "id": "649289e30d3244e0b48098114d63c2aa", + "name": "AIN Web Tool-15-D-SSPST66", + "isPermitted": true + }, { + "id": "3f21eeea6c2c486bba31dab816c05a32", + "name": "AIN Web Tool-15-D-ASSPST47", + "isPermitted": true + }, { + "id": "f60ce21d3ee6427586cff0d22b03b773", + "name": "CESAR-100-D-sspjg67246", + "isPermitted": true + }, { + "id": "8774659e425f479895ae091bb5d46560", + "name": "CESAR-100-D-sspjg68359", + "isPermitted": true + }, { + "id": "624eb554b0d147c19ff8885341760481", + "name": "AINWebTool-15-D-iftach", + "isPermitted": true + }, { + "id": "214f55f5fc414c678059c383b03e4962", + "name": "CESAR-100-D-sspjg612401", + "isPermitted": true + }, { + "id": "c90666c291664841bb98e4d981ff1db5", + "name": "CESAR-100-D-sspjg621340", + "isPermitted": true + }, { + "id": "ce5b6bc5c7b348e1bf4b91ac9a174278", + "name": "sspjg621351cloned", + "isPermitted": true + }, { + "id": "b386b768a3f24c8e953abbe0b3488c02", + "name": "AINWebTool-15-D-eteancomp", + "isPermitted": true + }, { + "id": "dc6c4dbfd225474e9deaadd34968646c", + "name": "AINWebTool-15-T-SPFET", + "isPermitted": true + }, { + "id": "02cb5030e9914aa4be120bd9ed1e19eb", + "name": "AINWebTool-15-X-eeweww", + "isPermitted": true + }, { + "id": "f2f3830e4c984d45bcd00e1a04158a79", + "name": "CESAR-100-D-spjg61909", + "isPermitted": true + }, { + "id": "05b91bd5137f4929878edd965755c06d", + "name": "CESAR-100-D-sspjg621512cloned", + "isPermitted": true + }, { + "id": "7002fbe8482d4a989ddf445b1ce336e0", + "name": "AINWebTool-15-X-vdr", + "isPermitted": true + }, { + "id": "4008522be43741dcb1f5422022a2aa0b", + "name": "AINWebTool-15-D-ssasa", + "isPermitted": true + }, { + "id": "f44e2e96a1b6476abfda2fa407b00169", + "name": "AINWebTool-15-D-PFNPT", + "isPermitted": true + }, { + "id": "b69a52bec8a84669a37a1e8b72708be7", + "name": "AINWebTool-15-X-vdre", + "isPermitted": true + }, { + "id": "fac7d9fd56154caeb9332202dcf2969f", + "name": "AINWebTool-15-X-NONPODECOMP", + "isPermitted": true + }, { + "id": "2d34d8396e194eb49969fd61ffbff961", + "name": "DN5242-Nov16-T5", + "isPermitted": true + }, { + "id": "cb42a77ff45b48a8b8deb83bb64acc74", + "name": "ro-T11", + "isPermitted": true + }, { + "id": "fa45ca53c80b492fa8be5477cd84fc2b", + "name": "ro-T112", + "isPermitted": true + }, { + "id": "4914ab0ab3a743e58f0eefdacc1dde77", + "name": "DN5242-Nov21-T1", + "isPermitted": true + }, { + "id": "d0a3e3f2964542259d155a81c41aadc3", + "name": "test-hvf6-09", + "isPermitted": true + }, {"id": "cbb99fe4ada84631b7baf046b6fd2044", "name": "DN5242-Nov16-T3", "isPermitted": true}] + } + }, + "productFamilies": [{ + "id": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034", + "name": "SCOTTIE", + "isPermitted": true + }, { + "id": "17cc1042-527b-11e6-beb8-9e71128cae77", + "name": "IGNACIO", + "isPermitted": true + }, { + "id": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e", + "name": "Christie", + "isPermitted": true + }, { + "id": "a4f6f2ae-9bf5-4ed7-b904-06b2099c4bd7", + "name": "Enhanced Services", + "isPermitted": true + }, {"id": "vTerrance", "name": "vTerrance", "isPermitted": true}, { + "id": "323d69d9-2efe-4r45-ay0a-89ea7ard4e6f", + "name": "vSCP", + "isPermitted": true + }, { + "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb", + "name": "Emanuel", + "isPermitted": true + }, { + "id": "d8a6ed93-251c-47ca-adc9-86671fd19f4c", + "name": "BVOIP", + "isPermitted": true + }, {"id": "db171b8f-115c-4992-a2e3-ee04cae357e0", "name": "LINDSEY", "isPermitted": true}, { + "id": "LRSI-OSPF", + "name": "LRSI-OSPF", + "isPermitted": true + }, {"id": "vRosemarie", "name": "HNGATEWAY", "isPermitted": true}, { + "id": "vHNPaas", + "name": "WILKINS", + "isPermitted": true + }, { + "id": "e433710f-9217-458d-a79d-1c7aff376d89", + "name": "TYLER SILVIA", + "isPermitted": true + }, {"id": "b6a3f28c-eebf-494c-a900-055cc7c874ce", "name": "VROUTER", "isPermitted": true}, { + "id": "Cisneros", + "name": "vMuriel", + "isPermitted": true + }, { + "id": "0ee8c1bc-7cbd-4b0a-a1ac-e9999255abc1", + "name": "CARA Griffin", + "isPermitted": true + }, { + "id": "c7611ebe-c324-48f1-8085-94aef0c6ef3d", + "name": "DARREN MCGEE", + "isPermitted": true + }, {"id": "e30755dc-5673-4b6b-9dcf-9abdd96b93d1", "name": "Transport", "isPermitted": true}, { + "id": "vSalvatore", + "name": "vSalvatore", + "isPermitted": true + }, {"id": "d7bb0a21-66f2-4e6d-87d9-9ef3ced63ae4", "name": "Josefina", "isPermitted": true}, { + "id": "vHubbard", + "name": "vHubbard", + "isPermitted": true + }, {"id": "12a96a9d-4b4c-4349-a950-fe1159602621", "name": "DARREN MCGEE", "isPermitted": true}], + "serviceTypes": { + "e433710f-9217-458d-a79d-1c7aff376d89": [{ + "id": "0", + "name": "vRichardson", + "isPermitted": false + }, {"id": "1", "name": "TYLER SILVIA", "isPermitted": true}, { + "id": "2", + "name": "Emanuel", + "isPermitted": false + }, {"id": "3", "name": "vJamie", "isPermitted": false}, { + "id": "4", + "name": "vVoiceMail", + "isPermitted": false + }, {"id": "5", "name": "Kennedy", "isPermitted": false}, { + "id": "6", + "name": "vSEGW", + "isPermitted": false + }, {"id": "7", "name": "vVM", "isPermitted": false}, { + "id": "8", + "name": "vOTA", + "isPermitted": false + }, {"id": "9", "name": "vMME", "isPermitted": false}, { + "id": "10", + "name": "vMNS", + "isPermitted": false + }, {"id": "11", "name": "vSCP", "isPermitted": false}, { + "id": "12", + "name": "VPMS", + "isPermitted": false + }, {"id": "13", "name": "vMMSC", "isPermitted": false}, { + "id": "14", + "name": "SSD", + "isPermitted": false + }, {"id": "15", "name": "vMOG", "isPermitted": false}, { + "id": "16", + "name": "LINDSEY", + "isPermitted": false + }, {"id": "17", "name": "JOHANNA_SANTOS", "isPermitted": false}, { + "id": "18", + "name": "vCarroll", + "isPermitted": false + }] + }, + "aicZones": [{"id": "NFT1", "name": "NFTJSSSS-NFT1"}, {"id": "JAG1", "name": "YUDFJULP-JAG1"}, { + "id": "YYY1", + "name": "UUUAIAAI-YYY1" + }, {"id": "BAN1", "name": "VSDKYUTP-BAN1"}, {"id": "DKJ1", "name": "DKJSJDKA-DKJ1"}, { + "id": "MCS1", + "name": "ASACMAMS-MCS1" + }, {"id": "UIO1", "name": "uioclli1-UIO1"}, {"id": "RAJ1", "name": "YGBIJNLQ-RAJ1"}, { + "id": "OPA1", + "name": "opaclli1-OPA1" + }, {"id": "SDE1", "name": "ZXCVBNMA-SDE1"}, {"id": "VEN2", "name": "FGHJUHIL-VEN2"}, { + "id": "ORL1", + "name": "ORLDFLMA-ORL1" + }, {"id": "JAD1", "name": "JADECLLI-JAD1"}, {"id": "ZXL1", "name": "LWLWCANN-ZXL1"}, { + "id": "CKL1", + "name": "CLKSKCKK-CKL1" + }, {"id": "SDF1", "name": "sdfclli1-SDF1"}, {"id": "RAD1", "name": "RADICAL1-RAD1"}, { + "id": "KIT1", + "name": "BHYJFGLN-KIT1" + }, {"id": "REL1", "name": "INGERFGT-REL1"}, {"id": "JNL1", "name": "CJALSDAC-JNL1"}, { + "id": "OLK1", + "name": "OLKOLKLS-OLK1" + }, {"id": "CHI1", "name": "CHILLIWE-CHI1"}, {"id": "UUU4", "name": "UUUAAAUU-UUU4"}, { + "id": "TUF1", + "name": "TUFCLLI1-TUF1" + }, {"id": "KJN1", "name": "CKALDKSA-KJN1"}, {"id": "SAM1", "name": "SNDGCA64-SAN1"}, { + "id": "SCK1", + "name": "SCKSCKSK-SCK1" + }, {"id": "HJH1", "name": "AOEEQQQD-HJH1"}, {"id": "HGD1", "name": "SDFQWHGD-HGD1"}, { + "id": "KOR1", + "name": "HYFLNBVT-KOR1" + }, {"id": "ATL43", "name": "AICLOCID-ATL43"}, {"id": "ATL54", "name": "AICFTAAI-ATL54"}, { + "id": "ATL66", + "name": "CLLIAAII-ATL66" + }, {"id": "VEL1", "name": "BNMLKUIK-VEL1"}, {"id": "ICC1", "name": "SANJITAT-ICC1"}, { + "id": "MNT11", + "name": "WSXEFBTH-MNT11" + }, {"id": "DEF2", "name": "WSBHGTYL-DEF2"}, {"id": "MAD11", "name": "SDFQWGKL-MAD11"}, { + "id": "OLG1", + "name": "OLHOLHOL-OLG1" + }, {"id": "GAR1", "name": "NGFVSJKO-GAR1"}, {"id": "SAN22", "name": "GNVLSCTL-SAN22"}, { + "id": "HRG1", + "name": "HRGHRGGS-HRG1" + }, {"id": "JCS1", "name": "JCSJSCJS-JCS1"}, {"id": "DHA12", "name": "WSXEDECF-DHA12"}, { + "id": "HJE1", + "name": "AOEEWWWD-HJE1" + }, {"id": "NCA1", "name": "NCANCANN-NCA1"}, {"id": "IOP1", "name": "iopclli1-IOP1"}, { + "id": "RTY1", + "name": "rtyclli1-RTY1" + }, {"id": "KAP1", "name": "HIOUYTRQ-KAP1"}, {"id": "ZEN1", "name": "ZENCLLI1-ZEN1"}, { + "id": "HKA1", + "name": "JAKHLASS-HKA1" + }, {"id": "CQK1", "name": "CQKSCAKK-CQK1"}, {"id": "SAI1", "name": "UBEKQLPD-SAI1"}, { + "id": "ERT1", + "name": "ertclli1-ERT1" + }, {"id": "IBB1", "name": "PLMKOIJU-IBB1"}, {"id": "TIR2", "name": "PLKINHYI-TIR2"}, { + "id": "HSD1", + "name": "CHASKCDS-HSD1" + }, {"id": "SLF78", "name": "SDCTLFN1-SLF78"}, {"id": "SEE78", "name": "SDCTEEE4-SEE78"}, { + "id": "SAN13", + "name": "TOKYJPFA-SAN13" + }, {"id": "SAA78", "name": "SDCTAAA1-SAA78"}, {"id": "LUC1", "name": "ATLDFGYC-LUC1"}, { + "id": "AMD13", + "name": "MEMATLAN-AMD13" + }, {"id": "TOR1", "name": "TOROONXN-TOR1"}, {"id": "QWE1", "name": "QWECLLI1-QWE1"}, { + "id": "ZOG1", + "name": "ZOGASTRO-ZOG1" + }, {"id": "CAL33", "name": "CALIFORN-CAL33"}, {"id": "SHH78", "name": "SDIT1HHH-SHH78"}, { + "id": "DSA1", + "name": "LKJHGFDS-DSA1" + }, {"id": "CLG1", "name": "CLGRABAD-CLG1"}, {"id": "BNA1", "name": "BNARAGBK-BNA1"}, { + "id": "ATL84", + "name": "CANTTCOC-ATL84" + }, {"id": "APP1", "name": "WBHGTYUI-APP1"}, {"id": "RJN1", "name": "RJNRBZAW-RJN1"}, { + "id": "EHH78", + "name": "SDCSHHH5-EHH78" + }, {"id": "mac10", "name": "PKGTESTF-mac10"}, {"id": "SXB78", "name": "SDCTGXB1-SXB78"}, { + "id": "SAX78", + "name": "SDCTAXG1-SAX78" + }, {"id": "SYD1", "name": "SYDNAUBV-SYD1"}, {"id": "TOK1", "name": "TOKYJPFA-TOK1"}, { + "id": "KGM2", + "name": "KGMTNC20-KGM2" + }, {"id": "DCC1b", "name": "POIUYTGH-DCC1b"}, {"id": "SKK78", "name": "SDCTKKK1-SKK78"}, { + "id": "SGG78", + "name": "SDCTGGG1-SGG78" + }, {"id": "SJJ78", "name": "SDCTJJJ1-SJJ78"}, {"id": "SBX78", "name": "SDCTBXG1-SBX78"}, { + "id": "LAG1", + "name": "LARGIZON-LAG1" + }, {"id": "IAA1", "name": "QAZXSWED-IAA1"}, {"id": "POI1", "name": "PLMNJKIU-POI1"}, { + "id": "LAG1a", + "name": "LARGIZON-LAG1a" + }, {"id": "PBL1", "name": "PBLAPBAI-PBL1"}, {"id": "LAG45", "name": "LARGIZON-LAG1a"}, { + "id": "MAR1", + "name": "MNBVCXZM-MAR1" + }, {"id": "HST70", "name": "HSTNTX70-HST70"}, {"id": "DCC1a", "name": "POIUYTGH-DCC1a"}, { + "id": "TOL1", + "name": "TOLDOH21-TOL1" + }, {"id": "LON1", "name": "LONEENCO-LON1"}, {"id": "SJU78", "name": "SDIT1JUB-SJU78"}, { + "id": "STN27", + "name": "HSTNTX01-STN27" + }, {"id": "SSW56", "name": "ss8126GT-SSW56"}, {"id": "SBB78", "name": "SDIT1BBB-SBB78"}, { + "id": "DCC3", + "name": "POIUYTGH-DCC3" + }, {"id": "GNV1", "name": "GNVLSCTL-GNV1"}, {"id": "WAS1", "name": "WASHDCSW-WAS1"}, { + "id": "TOY1", + "name": "TORYONNZ-TOY1" + }, {"id": "STT1", "name": "STTLWA02-STT1"}, {"id": "STG1", "name": "STTGGE62-STG1"}, { + "id": "SLL78", + "name": "SDCTLLL1-SLL78" + }, {"id": "SBU78", "name": "SDIT1BUB-SBU78"}, {"id": "ATL2", "name": "ATLNGANW-ATL2"}, { + "id": "BOT1", + "name": "BOTHWAKY-BOT1" + }, {"id": "SNG1", "name": "SNGPSIAU-SNG1"}, {"id": "NYC1", "name": "NYCMNY54-NYC1"}, { + "id": "LAG1b", + "name": "LARGIZON-LAG1b" + }, {"id": "AMD15", "name": "AMDFAA01-AMD15"}, {"id": "SNA1", "name": "SNANTXCA-SNA1"}, { + "id": "PLT1", + "name": "PLTNCA60-PLT1" + }, {"id": "TLP1", "name": "TLPNXM18-TLP1"}, {"id": "SDD81", "name": "SAIT1DD6-SDD81"}, { + "id": "DCC1", + "name": "POIUYTGH-DCC1" + }, {"id": "DCC2", "name": "POIUYTGH-DCC2"}, {"id": "OKC1", "name": "OKCBOK55-OKC1"}, { + "id": "PAR1", + "name": "PARSFRCG-PAR1" + }, {"id": "TES36", "name": "ABCEETES-TES36"}, {"id": "COM1", "name": "PLMKOPIU-COM1"}, { + "id": "ANI1", + "name": "ATLNGTRE-ANI1" + }, {"id": "SDG78", "name": "SDIT1BDG-SDG78"}, {"id": "mac20", "name": "PKGTESTF-mac20"}, { + "id": "DSF45", + "name": "DSFBG123-DSF45" + }, {"id": "HST25", "name": "HSTNTX01-HST25"}, {"id": "AMD18", "name": "AUDIMA01-AMD18"}, { + "id": "SAA80", + "name": "SAIT9AA3-SAA80" + }, {"id": "SSA56", "name": "SSIT2AA7-SSA56"}, {"id": "SDD82", "name": "SAIT1DD9-SDD82"}, { + "id": "JCV1", + "name": "JCVLFLBW-JCV1" + }, {"id": "SUL2", "name": "WERTYUJK-SUL2"}, {"id": "PUR1", "name": "purelyde-PUR1"}, { + "id": "FDE55", + "name": "FDERT555-FDE55" + }, {"id": "SITE", "name": "LONEENCO-SITE"}, {"id": "ATL1", "name": "ATLNGAMA-ATL1"}, { + "id": "JUL1", + "name": "ZXCVBNMM-JUL1" + }, {"id": "TAT34", "name": "TESAAISB-TAT34"}, {"id": "XCP12", "name": "CHKGH123-XCP12"}, { + "id": "RAI1", + "name": "poiuytre-RAI1" + }, {"id": "HPO1", "name": "ATLNGAUP-HPO1"}, {"id": "KJF12", "name": "KJFDH123-KJF12"}, { + "id": "SCC80", + "name": "SAIT9CC3-SCC80" + }, {"id": "SAA12", "name": "SAIT9AF8-SAA12"}, {"id": "SAA14", "name": "SAIT1AA9-SAA14"}, { + "id": "ATL35", + "name": "TTESSAAI-ATL35" + }, {"id": "CWY1", "name": "CWYMOWBS-CWY1"}, {"id": "ATL76", "name": "TELEPAAI-ATL76"}, { + "id": "DSL12", + "name": "DSLFK242-DSL12" + }, {"id": "ATL53", "name": "AAIATLTE-ATL53"}, {"id": "SAA11", "name": "SAIT9AA2-SAA11"}, { + "id": "ATL62", + "name": "TESSASCH-ATL62" + }, {"id": "AUG1", "name": "ASDFGHJK-AUG1"}, {"id": "POI22", "name": "POIUY123-POI22"}, { + "id": "SAA13", + "name": "SAIT1AA9-SAA13" + }, {"id": "BHY17", "name": "BHYTFRF3-BHY17"}, {"id": "LIS1", "name": "HOSTPROF-LIS1"}, { + "id": "SIP1", + "name": "ZXCVBNMK-SIP1" + }, {"id": "ATL99", "name": "TEESTAAI-ATL43"}, {"id": "ATL64", "name": "FORLOAAJ-ATL64"}, { + "id": "TAT33", + "name": "TESAAISA-TAT33" + }, {"id": "RAD10", "name": "INDIPUNE-RAD10"}, {"id": "RTW5", "name": "BHYTFRY4-RTW5"}, { + "id": "JGS1", + "name": "KSJKKKKK-JGS1" + }, {"id": "ATL98", "name": "TEESTAAI-ATL43"}, {"id": "WAN1", "name": "LEIWANGW-WAN1"}, { + "id": "ATL44", + "name": "ATLSANAB-ATL44" + }, {"id": "RTD2", "name": "BHYTFRk4-RTD2"}, {"id": "NIR1", "name": "ORFLMANA-NIR1"}, { + "id": "ATL75", + "name": "SANAAIRE-ATL75" + }, {"id": "NUM1", "name": "QWERTYUI-NUM1"}, {"id": "MTN32", "name": "MDTWNJ21-MTN32"}, { + "id": "RTZ4", + "name": "BHYTFRZ6-RTZ4" + }, {"id": "ATL56", "name": "ATLSANAC-ATL56"}, {"id": "AMS1", "name": "AMSTNLBW-AMS1"}, { + "id": "RCT1", + "name": "AMSTERNL-RCT1" + }, {"id": "JAN1", "name": "ORFLMATT-JAN1"}, {"id": "ABC14", "name": "TESAAISA-ABC14"}, { + "id": "TAT37", + "name": "TESAAISD-TAT37" + }, {"id": "MIC54", "name": "MICHIGAN-MIC54"}, {"id": "ABC11", "name": "ATLSANAI-ABC11"}, { + "id": "AMF11", + "name": "AMDOCS01-AMF11" + }, {"id": "ATL63", "name": "ATLSANEW-ATL63"}, {"id": "ABC12", "name": "ATLSECIA-ABC12"}, { + "id": "MTN20", + "name": "MDTWNJ21-MTN20" + }, {"id": "ABC15", "name": "AAITESAN-ABC15"}, {"id": "AVT1", "name": "AVTRFLHD-AVT1"}, { + "id": "ATL34", + "name": "ATLSANAI-ATL34" + }], + "categoryParameters": { + "owningEntityList": [{ + "id": "aaa1", + "name": "aaa1" + }, {"id": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc", "name": "WayneHolland"}, { + "id": "Melissa", + "name": "Melissa" + }], + "projectList": [{"id": "WATKINS", "name": "WATKINS"}, {"id": "x1", "name": "x1"}, {"id": "yyy1", "name": "yyy1"}], + "lineOfBusinessList": [{"id": "ONAP", "name": "ONAP"}, {"id": "zzz1", "name": "zzz1"}], + "platformList": [{"id": "platform", "name": "platform"}, {"id": "xxx1", "name": "xxx1"}] + }, + "type": "[LCP_REGIONS_AND_TENANTS] Update", + "subscribers": [{ + "id": "CAR_2020_ER", + "name": "CAR_2020_ER", + "isPermitted": true + }, { + "id": "21014aa2-526b-11e6-beb8-9e71128cae77", + "name": "JULIO ERICKSON", + "isPermitted": false + }, { + "id": "DHV1707-TestSubscriber-2", + "name": "DALE BRIDGES", + "isPermitted": false + }, {"id": "DHV1707-TestSubscriber-1", "name": "LLOYD BRIDGES", "isPermitted": false}, { + "id": "jimmy-example", + "name": "JimmyExampleCust-20161102", + "isPermitted": false + }, { + "id": "jimmy-example2", + "name": "JimmyExampleCust-20161103", + "isPermitted": false + }, { + "id": "ERICA5779-TestSub-PWT-102", + "name": "ERICA5779-TestSub-PWT-102", + "isPermitted": false + }, { + "id": "ERICA5779-TestSub-PWT-101", + "name": "ERICA5779-TestSub-PWT-101", + "isPermitted": false + }, { + "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb", + "name": "Emanuel", + "isPermitted": false + }, { + "id": "ERICA5779-Subscriber-4", + "name": "ERICA5779-Subscriber-5", + "isPermitted": false + }, { + "id": "ERICA5779-TestSub-PWT-103", + "name": "ERICA5779-TestSub-PWT-103", + "isPermitted": false + }, { + "id": "ERICA5779-Subscriber-2", + "name": "ERICA5779-Subscriber-2", + "isPermitted": false + }, { + "id": "e433710f-9217-458d-a79d-1c7aff376d89", + "name": "SILVIA ROBBINS", + "isPermitted": true + }, { + "id": "ERICA5779-Subscriber-3", + "name": "ERICA5779-Subscriber-3", + "isPermitted": false + }, {"id": "31739f3e-526b-11e6-beb8-9e71128cae77", "name": "CRAIG/ROBERTS", "isPermitted": false}] + } + }; + } +} + +class MockFeatureFlagsService {} + +describe('Network popup service', () => { + let injector; + let service: NetworkPopupService; + let genericFormService: GenericFormService + let defaultDataGeneratorService: DefaultDataGeneratorService; + let fb: FormBuilder; + let iframeService: IframeService; + + + beforeAll(done => (async () => { + TestBed.configureTestingModule({ + providers : [ + NetworkPopupService, + BasicControlGenerator, + NetworkControlGenerator, + DefaultDataGeneratorService, + GenericFormService, + FormBuilder, + IframeService, + AaiService, + LogService, + BasicPopupService, + {provide:FeatureFlagsService, useClass: MockFeatureFlagsService}, + {provide: NgRedux, useClass: MockReduxStore}, + {provide: HttpClient, useClass: MockAppStore}, + {provide: SdcUiServices.ModalService, useClass: MockModalService} + ] + }); + await TestBed.compileComponents(); + + injector = getTestBed(); + service = injector.get(NetworkPopupService); + genericFormService = injector.get(GenericFormService); + defaultDataGeneratorService = injector.get(DefaultDataGeneratorService); + fb = injector.get(FormBuilder); + iframeService = injector.get(IframeService); + + })().then(done).catch(done.fail)); + + test('getTitle should return the correct title for edit and create mode', () => { + expect(service.getTitle(true)).toBe('Edit Network'); + expect(service.getTitle(false)).toBe('Set new Network'); + }); + + test('getSubLeftTitle should return network model name', () => { + service.uuidData = { + 'networkId': 'Model name' + }; + expect(service.getSubLeftTitle()).toBe('Model name'); + }); + + test('getSubRightTitle should return popup type', () => { + expect(service.getSubRightTitle()).toBe('Network Instance Details'); + }); + + test('getModelInformation should update modelInformations', () => { + const serviceId: string = '6b528779-44a3-4472-bdff-9cd15ec93450'; + const networkModel: string = 'ExtVL 0'; + + service.getModelInformation(serviceId, networkModel); + expect(service.modelInformations.length).toEqual(13); + expect(service.modelInformations[0].label).toEqual("Subscriber Name"); + expect(service.modelInformations[0].values).toEqual(['SILVIA ROBBINS']); + + expect(service.modelInformations[1].label).toEqual("Service Name"); + expect(service.modelInformations[1].values).toEqual(['action-data']); + + expect(service.modelInformations[2].label).toEqual("Service Instance Name"); + expect(service.modelInformations[2].values).toEqual(['InstanceName']); + + expect(service.modelInformations[3].label).toEqual("Model Name"); + expect(service.modelInformations[3].values).toEqual(['ExtVL']); + + expect(service.modelInformations[4].label).toEqual("Model version"); + expect(service.modelInformations[4].values).toEqual(['37.0']); + + expect(service.modelInformations[5].label).toEqual("Description"); + expect(service.modelInformations[5].values).toEqual(['ECOMP generic virtual link (network) base type for all other service-level and global networks']); + + expect(service.modelInformations[6].label).toEqual("Category"); + expect(service.modelInformations[6].values).toEqual([undefined]); + + expect(service.modelInformations[7].label).toEqual("Sub Category"); + expect(service.modelInformations[7].values).toEqual([undefined]); + + expect(service.modelInformations[8].label).toEqual("UUID"); + expect(service.modelInformations[8].values).toEqual(['ddc3f20c-08b5-40fd-af72-c6d14636b986']); + + expect(service.modelInformations[9].label).toEqual("Invariant UUID"); + expect(service.modelInformations[9].values).toEqual(['379f816b-a7aa-422f-be30-17114ff50b7c']); + + expect(service.modelInformations[10].label).toEqual("Service type"); + expect(service.modelInformations[10].values).toEqual(['']); + + expect(service.modelInformations[11].label).toEqual("Service role"); + expect(service.modelInformations[11].values).toEqual(['']); + + expect(service.modelInformations[12].label).toEqual('Network roles'); + expect(service.modelInformations[12].values).toEqual( ['network role 1', ' network role 2']); + }); + + + test('onCancel should trigger closeDialogEvent and iframe', () => { + let that = <any>{ + parentElementClassName: 'content', + _iframeService: iframeService + }; + jest.spyOn(iframeService, 'removeClassCloseModal'); + jest.spyOn(service.closeDialogEvent, 'next'); + + service.onCancel(that, fb.group({})); + + expect(that._iframeService.removeClassCloseModal).toHaveBeenCalledWith(that.parentElementClassName) + expect(service.closeDialogEvent.next).toHaveBeenCalledWith(that); + }); + + test('onSubmit should trigger onCancel', () => { + let that = <any>{ + parentElementClassName: 'content', + _iframeService: iframeService, + storeNetwork: () => { + }, + serviceModel: { + uuid: 'someUUID' + } + }; + let form = fb.group({}); + jest.spyOn(service, 'onCancel'); + jest.spyOn(that, 'storeNetwork'); + jest.spyOn(window.parent, 'postMessage'); + + service.onSubmit(that, form); + + expect(service.onCancel).toHaveBeenCalledWith(that, form); + expect(that.storeNetwork).toHaveBeenCalledWith(that, form.value); + expect(window.parent.postMessage).toHaveBeenCalledWith({ + eventId: 'submitIframe', + data: { + serviceModelId: 'someUUID' + } + }, "*"); + }); +}); diff --git a/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/network/network.popup.service.ts b/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/network/network.popup.service.ts new file mode 100644 index 000000000..7f32360f5 --- /dev/null +++ b/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/network/network.popup.service.ts @@ -0,0 +1,150 @@ +import {Injectable} from "@angular/core"; +import {FormPopupDetails, PopupType} from "../../../../models/formControlModels/formPopupDetails.model"; +import {BasicControlGenerator} from "../../../genericForm/formControlsServices/basic.control.generator"; +import {NetworkInstance} from "../../../../models/networkInstance"; +import {AppState} from "../../../../store/reducers"; +import {NgRedux} from "@angular-redux/store"; +import {ITreeNode} from "angular-tree-component/dist/defs/api"; +import {NetworkControlGenerator} from "../../../genericForm/formControlsServices/networkGenerator/network.control.generator"; +import {ModelInformationItem} from "../../../model-information/model-information.component"; +import {Constants} from "../../../../utils/constants"; +import {AaiService} from "../../../../services/aaiService/aai.service"; +import {ServiceModel} from "../../../../models/serviceModel"; +import {FormGroup} from "@angular/forms"; +import {ModelInfo} from "../../../../models/modelInfo"; +import {IframeService} from "../../../../utils/iframe.service"; +import {GenericPopupInterface} from "../generic-popup.interface"; +import {Subject} from "rxjs/Subject"; +import {DefaultDataGeneratorService} from "../../../../services/defaultDataServiceGenerator/default.data.generator.service"; +import * as _ from 'lodash'; +import {BasicPopupService} from "../basic.popup.service"; +import {changeInstanceCounter} from "../../../../storeUtil/utils/general/general.actions"; +import {createNetworkInstance, updateNetworkInstance} from "../../../../storeUtil/utils/network/network.actions"; + +@Injectable() +export class NetworkPopupService implements GenericPopupInterface { + dynamicInputs: any; + instance: any; + model: any; + serviceModel: ServiceModel; + modelInformations: ModelInformationItem[] = []; + uuidData: Object; + closeDialogEvent: Subject<any> = new Subject<any>(); + isUpdateMode: boolean; + + + constructor(private _basicControlGenerator: BasicControlGenerator, + private _networkControlGenerator: NetworkControlGenerator, + private _iframeService: IframeService, + private _defaultDataGeneratorService: DefaultDataGeneratorService, + private _aaiService: AaiService, + private _basicPopupService : BasicPopupService, + private _store: NgRedux<AppState>) { + } + + getInstance(serviceId: string, networkName: string, networkStoreKey: string): any { + if (_.isNil(networkStoreKey)) { + return new NetworkInstance(); + } + return this._store.getState().service.serviceInstance[serviceId].networks[networkStoreKey]; + } + + getGenericFormPopupDetails(serviceId: string, networkName: string, networkStoreKey: string, node: ITreeNode, uuidData: Object, isUpdateMode: boolean): FormPopupDetails { + this.uuidData = uuidData; + this.instance = this.getInstance(serviceId, networkName, networkStoreKey); + + + this.getModelInformation(serviceId, networkName); + + return new FormPopupDetails(this, + PopupType.NETWORK_MACRO, + uuidData, + this.getTitle(isUpdateMode), + this.getSubLeftTitle(), + this.getSubRightTitle(), + this.getControls(serviceId, networkName, networkStoreKey, isUpdateMode), + this._basicPopupService.getDynamicInputs(serviceId,networkName, networkStoreKey, 'networks'), + this.modelInformations, + (that, form: FormGroup) => {that.onSubmit(that, form);}, + (that: any, form: FormGroup) => {that.onCancel(that, form); } + ); + } + + getModelInformation(serviceId: string, networkName: string) { + this._aaiService.getServiceModelById(serviceId).subscribe((result: any) => { + this.serviceModel = new ServiceModel(result); + this.model = this._basicPopupService.getModelFromResponse(result, 'networks', networkName); + + const serviceInstance = this._store.getState().service.serviceInstance[serviceId]; + this.modelInformations = [ + new ModelInformationItem("Subscriber Name", "subscriberName", [this._basicPopupService.extractSubscriberNameBySubscriberId(serviceInstance.globalSubscriberId)], "", true), + new ModelInformationItem("Service Name", "serviceModelName", [this.serviceModel.name], "", true), + new ModelInformationItem("Service Instance Name", "serviceName", [serviceInstance.instanceName], "", false), + new ModelInformationItem("Model Name", "modelName", [this.model.name], "", true), + new ModelInformationItem("Model version", "modelVersion", [this.model.version], "", true), + new ModelInformationItem("Description", "description", [this.model.description]), + new ModelInformationItem("Category", "category", [this.model.category]), + new ModelInformationItem("Sub Category", "subCategory", [this.model.subCategory]), + new ModelInformationItem("UUID", "uuid", [this.model.uuid], Constants.ServicePopup.TOOLTIP_UUID, true), + new ModelInformationItem("Invariant UUID", "invariantUuid", [this.model.invariantUuid], Constants.ServicePopup.TOOLTIP_INVARIANT_UUID, true), + new ModelInformationItem("Service type", "serviceType", [this.serviceModel.serviceType]), + new ModelInformationItem("Service role", "serviceRole", [this.serviceModel.serviceRole]), + new ModelInformationItem("Network roles", "network-role", this.model.roles, "", false) + ]; + }); + } + + getControls(serviceId: string, networkName: string, networkStoreKey: string, isUpdateMode: boolean) { + if (this._store.getState().service.serviceHierarchy[serviceId].service.instantiationType === 'Macro') { + return this._networkControlGenerator.getMacroFormControls(serviceId, networkStoreKey, networkName, isUpdateMode); + } else { + return this._networkControlGenerator.getAlaCarteFormControls(serviceId, networkStoreKey, networkName, isUpdateMode); + } + } + + + onSubmit(that, form: FormGroup) { + form.value['instanceParams'] = form.value['instanceParams'] && [form.value['instanceParams']]; + that.storeNetwork(that, form.value); + window.parent.postMessage({ + eventId: 'submitIframe', + data: { + serviceModelId: that.serviceModel.uuid + } + }, "*"); + this.onCancel(that, form); + } + + + onCancel(that, form) { + form.reset(); + that._iframeService.removeClassCloseModal('content'); + this.closeDialogEvent.next(that); + } + + storeNetwork = (that, formValues: any): void => { + formValues.modelInfo = new ModelInfo(that.model); + formValues.uuid = formValues.modelInfo.uuid; + formValues.isMissingData = false; + + if (!that.uuidData.networkStoreKey) { + this._store.dispatch(changeInstanceCounter(formValues.modelInfo.modelUniqueId , that.uuidData.serviceId, 1, <any>{data: {type: 'Network'}})); + this._store.dispatch(createNetworkInstance(formValues, that.uuidData.networkId, that.uuidData.serviceId, that.uuidData.networkId)); + } else { + this._store.dispatch(updateNetworkInstance(formValues, that.uuidData.networkId, that.uuidData.serviceId, that.uuidData.networkStoreKey)); + } + }; + + + getTitle(isUpdateMode : boolean) : string { + return isUpdateMode ? 'Edit Network' : 'Set new Network'; + } + + getSubLeftTitle(): string { + return this.uuidData['networkId']; + } + + getSubRightTitle(): string { + return "Network Instance Details"; + } +} diff --git a/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/service/service.popup.service.spec.ts b/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/service/service.popup.service.spec.ts new file mode 100644 index 000000000..64f47a3fc --- /dev/null +++ b/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/service/service.popup.service.spec.ts @@ -0,0 +1,2439 @@ +import {LogService} from "../../../../utils/log/log.service"; +import {ReflectiveInjector} from "@angular/core"; +import {NgRedux} from "@angular-redux/store"; +import {BasicControlGenerator} from "../../../genericForm/formControlsServices/basic.control.generator"; +import {AaiService} from "../../../../services/aaiService/aai.service"; +import {HttpClient} from "@angular/common/http"; +import {GenericFormService} from "../../../genericForm/generic-form.service"; +import {FormBuilder} from "@angular/forms"; +import {IframeService} from "../../../../utils/iframe.service"; +import {DefaultDataGeneratorService} from "../../../../services/defaultDataServiceGenerator/default.data.generator.service"; +import {BasicPopupService} from "../basic.popup.service"; +import {ServicePopupService} from "./service.popup.service"; +import {ServiceControlGenerator} from "../../../genericForm/formControlsServices/service.control.generator"; +import {FormControlModel} from "../../../../models/formControlModels/formControl.model"; +import {SdcUiServices} from "onap-ui-angular"; +import {FeatureFlagsService} from "../../../../services/featureFlag/feature-flags.service"; +import {getTestBed, TestBed} from "@angular/core/testing"; + +class MockModalService<T> {} + +class MockAppStore<T> {} + +class MockReduxStore<T> { + getState() { + return { + "global": { + "name": null, + "flags": { + "FLAG_NETWORK_TO_ASYNC_INSTANTIATION": false, + "FLAG_SHOW_ASSIGNMENTS": true, + "FLAG_FABRIC_CONFIGURATION_ASSIGNMENTS": true, + "FLAG_UNASSIGN_SERVICE": true, + "FLAG_SHOW_VERIFY_SERVICE": false, + "FLAG_COLLECTION_RESOURCE_SUPPORT": true, + "FLAG_DUPLICATE_VNF": true, + "FLAG_SERVICE_MODEL_CACHE": true, + "FLAG_ADVANCED_PORTS_FILTER": true, + "CREATE_INSTANCE_TEST": false, + "FLAG_SETTING_DEFAULTS_IN_DRAWING_BOARD": false, + "FLAG_REGION_ID_FROM_REMOTE": true, + "FLAG_ASYNC_INSTANTIATION": true, + "FLAG_ASYNC_JOBS": true, + "EMPTY_DRAWING_BOARD_TEST": false, + "FLAG_ADD_MSO_TESTAPI_FIELD": true + }, + "type": "[FLAGS] Update" + }, + "service": { + "serviceHierarchy": { + "6e59c5de-f052-46fa-aa7e-2fca9d674c44": { + "service": { + "uuid": "6e59c5de-f052-46fa-aa7e-2fca9d674c44", + "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0", + "name": "ComplexService", + "version": "1.0", + "toscaModelURL": null, + "category": "Emanuel", + "serviceType": "", + "serviceRole": "", + "description": "ComplexService", + "serviceEcompNaming": "false", + "instantiationType": "Macro", + "inputs": { + "2017488_adiodvpe0_ASN_1": { + "type": "string", + "description": "AV/PE", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "AV_vPE" + }, + "2017488_adiodvpe0_ASN_2": { + "type": "number", + "description": "AV/PE", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": 2 + }, + "2017488_adiodvpe0_ASN_3": { + "type": "string", + "description": "AV/PE", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": false, + "default": "AV_vPE" + }, + "2017488_adiodvpe0_ASN_4": { + "type": "string", + "description": "AV/PE", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "AV_vPE_123" + } + } + }, + "vnfs": { + "VF_vMee 0": { + "uuid": "d6557200-ecf2-4641-8094-5393ae3aae60", + "invariantUuid": "4160458e-f648-4b30-a176-43881ffffe9e", + "description": "VSP_vMee", + "name": "VF_vMee", + "version": "2.0", + "customizationUuid": "91415b44-753d-494c-926a-456a9172bbb9", + "inputs": {}, + "commands": {}, + "properties": { + "max_instances": 10, + "min_instances": 1, + "gpb2_Internal2_mac": "00:11:22:EF:AC:DF", + "sctp-b-ipv6-egress_src_start_port": "0", + "sctp-a-ipv6-egress_rule_application": "any", + "Internal2_allow_transit": "true", + "sctp-b-IPv6_ethertype": "IPv6", + "sctp-a-egress_rule_application": "any", + "sctp-b-ingress_action": "pass", + "sctp-b-ingress_rule_protocol": "icmp", + "ncb2_Internal1_mac": "00:11:22:EF:AC:DF", + "sctp-b-ipv6-ingress-src_start_port": "0.0", + "ncb1_Internal2_mac": "00:11:22:EF:AC:DF", + "fsb_volume_size_0": "320.0", + "sctp-b-egress_src_addresses": "local", + "sctp-a-ipv6-ingress_ethertype": "IPv4", + "sctp-a-ipv6-ingress-dst_start_port": "0", + "sctp-b-ipv6-ingress_rule_application": "any", + "domain_name": "default-domain", + "sctp-a-ingress_rule_protocol": "icmp", + "sctp-b-egress-src_start_port": "0.0", + "sctp-a-egress_src_addresses": "local", + "sctp-b-display_name": "epc-sctp-b-ipv4v6-sec-group", + "sctp-a-egress-src_start_port": "0.0", + "sctp-a-ingress_ethertype": "IPv4", + "sctp-b-ipv6-ingress-dst_end_port": "65535", + "sctp-b-dst_subnet_prefix_v6": "::", + "nf_naming": "{ecomp_generated_naming=true}", + "sctp-a-ipv6-ingress_src_subnet_prefix": "0.0.0.0", + "sctp-b-egress-dst_start_port": "0.0", + "ncb_flavor_name": "nv.c20r64d1", + "gpb1_Internal1_mac": "00:11:22:EF:AC:DF", + "sctp-b-egress_dst_subnet_prefix_len": "0.0", + "Internal2_net_cidr": "10.0.0.10", + "sctp-a-ingress-dst_start_port": "0.0", + "sctp-a-egress-dst_start_port": "0.0", + "fsb1_Internal2_mac": "00:11:22:EF:AC:DF", + "sctp-a-egress_ethertype": "IPv4", + "vlc_st_service_mode": "in-network-nat", + "sctp-a-ipv6-egress_ethertype": "IPv4", + "sctp-a-egress-src_end_port": "65535.0", + "sctp-b-ipv6-egress_rule_application": "any", + "sctp-b-egress_action": "pass", + "sctp-a-ingress-src_subnet_prefix_len": "0.0", + "sctp-b-ipv6-ingress-src_end_port": "65535.0", + "sctp-b-name": "epc-sctp-b-ipv4v6-sec-group", + "fsb2_Internal1_mac": "00:11:22:EF:AC:DF", + "sctp-a-ipv6-ingress-src_start_port": "0.0", + "sctp-b-ipv6-egress_ethertype": "IPv4", + "Internal1_net_cidr": "10.0.0.10", + "sctp-a-egress_dst_subnet_prefix": "0.0.0.0", + "fsb_flavor_name": "nv.c20r64d1", + "sctp_rule_protocol": "132", + "sctp-b-ipv6-ingress_src_subnet_prefix_len": "0", + "sctp-a-ipv6-ingress_rule_application": "any", + "ecomp_generated_naming": "false", + "sctp-a-IPv6_ethertype": "IPv6", + "vlc2_Internal1_mac": "00:11:22:EF:AC:DF", + "vlc_st_virtualization_type": "virtual-machine", + "sctp-b-ingress-dst_start_port": "0.0", + "sctp-b-ingress-dst_end_port": "65535.0", + "sctp-a-ipv6-ingress-src_end_port": "65535.0", + "sctp-a-display_name": "epc-sctp-a-ipv4v6-sec-group", + "sctp-b-ingress_rule_application": "any", + "int2_sec_group_name": "int2-sec-group", + "vlc_flavor_name": "nd.c16r64d1", + "sctp-b-ipv6-egress_src_addresses": "local", + "vlc_st_interface_type_int1": "other1", + "sctp-b-egress-src_end_port": "65535.0", + "sctp-a-ipv6-egress-dst_start_port": "0", + "vlc_st_interface_type_int2": "other2", + "sctp-a-ipv6-egress_rule_protocol": "any", + "Internal2_shared": "false", + "sctp-a-ipv6-egress_dst_subnet_prefix_len": "0", + "Internal2_rpf": "disable", + "vlc1_Internal1_mac": "00:11:22:EF:AC:DF", + "sctp-b-ipv6-egress_src_end_port": "65535", + "sctp-a-ipv6-egress_src_addresses": "local", + "sctp-a-ingress-dst_end_port": "65535.0", + "sctp-a-ipv6-egress_src_end_port": "65535", + "Internal1_forwarding_mode": "l2", + "Internal2_dhcp": "false", + "sctp-a-dst_subnet_prefix_v6": "::", + "pxe_image_name": "MME_PXE-Boot_16ACP04_GA.qcow2", + "vlc_st_interface_type_gtp": "other0", + "ncb1_Internal1_mac": "00:11:22:EF:AC:DF", + "sctp-b-src_subnet_prefix_v6": "::", + "sctp-a-egress_dst_subnet_prefix_len": "0.0", + "int1_sec_group_name": "int1-sec-group", + "Internal1_dhcp": "false", + "sctp-a-ipv6-egress_dst_end_port": "65535", + "Internal2_forwarding_mode": "l2", + "fsb2_Internal2_mac": "00:11:22:EF:AC:DF", + "sctp-b-egress_dst_subnet_prefix": "0.0.0.0", + "Internal1_net_cidr_len": "17", + "gpb2_Internal1_mac": "00:11:22:EF:AC:DF", + "sctp-b-ingress-src_subnet_prefix_len": "0.0", + "sctp-a-ingress_dst_addresses": "local", + "sctp-a-egress_action": "pass", + "fsb_volume_type_0": "SF-Default-SSD", + "ncb2_Internal2_mac": "00:11:22:EF:AC:DF", + "vlc_st_interface_type_sctp_a": "left", + "vlc_st_interface_type_sctp_b": "right", + "sctp-a-src_subnet_prefix_v6": "::", + "vlc_st_version": "2", + "sctp-b-egress_ethertype": "IPv4", + "sctp-a-ingress_rule_application": "any", + "gpb1_Internal2_mac": "00:11:22:EF:AC:DF", + "instance_ip_family_v6": "v6", + "sctp-a-ipv6-egress_src_start_port": "0", + "sctp-b-ingress-src_start_port": "0.0", + "sctp-b-ingress_dst_addresses": "local", + "fsb1_Internal1_mac": "00:11:22:EF:AC:DF", + "vlc_st_interface_type_oam": "management", + "multi_stage_design": "true", + "oam_sec_group_name": "oam-sec-group", + "Internal2_net_gateway": "10.0.0.10", + "sctp-a-ipv6-ingress-dst_end_port": "65535", + "sctp-b-ipv6-egress-dst_start_port": "0", + "Internal1_net_gateway": "10.0.0.10", + "sctp-b-ipv6-egress_rule_protocol": "any", + "gtp_sec_group_name": "gtp-sec-group", + "sctp-a-ipv6-egress_dst_subnet_prefix": "0.0.0.0", + "sctp-b-ipv6-egress_dst_subnet_prefix_len": "0", + "sctp-a-ipv6-ingress_dst_addresses": "local", + "sctp-a-egress_rule_protocol": "icmp", + "sctp-b-ipv6-egress_action": "pass", + "sctp-a-ipv6-egress_action": "pass", + "Internal1_shared": "false", + "sctp-b-ipv6-ingress_rule_protocol": "any", + "Internal2_net_cidr_len": "17", + "sctp-a-name": "epc-sctp-a-ipv4v6-sec-group", + "sctp-a-ingress-src_end_port": "65535.0", + "sctp-b-ipv6-ingress_src_subnet_prefix": "0.0.0.0", + "sctp-a-egress-dst_end_port": "65535.0", + "sctp-a-ingress_action": "pass", + "sctp-b-egress_rule_protocol": "icmp", + "sctp-b-ipv6-ingress_action": "pass", + "vlc_st_service_type": "firewall", + "sctp-b-ipv6-egress_dst_end_port": "65535", + "sctp-b-ipv6-ingress-dst_start_port": "0", + "vlc2_Internal2_mac": "00:11:22:EF:AC:DF", + "vlc_st_availability_zone": "true", + "fsb_volume_image_name_1": "MME_FSB2_16ACP04_GA.qcow2", + "sctp-b-ingress-src_subnet_prefix": "0.0.0.0", + "sctp-a-ipv6-ingress_src_subnet_prefix_len": "0", + "Internal1_allow_transit": "true", + "gpb_flavor_name": "nv.c20r64d1", + "availability_zone_max_count": "1", + "fsb_volume_image_name_0": "MME_FSB1_16ACP04_GA.qcow2", + "sctp-b-ipv6-ingress_dst_addresses": "local", + "sctp-b-ipv6-egress_dst_subnet_prefix": "0.0.0.0", + "sctp-b-ipv6-ingress_ethertype": "IPv4", + "vlc1_Internal2_mac": "00:11:22:EF:AC:DF", + "sctp-a-ingress-src_subnet_prefix": "0.0.0.0", + "sctp-a-ipv6-ingress_action": "pass", + "Internal1_rpf": "disable", + "sctp-b-ingress_ethertype": "IPv4", + "sctp-b-egress_rule_application": "any", + "sctp-b-ingress-src_end_port": "65535.0", + "sctp-a-ipv6-ingress_rule_protocol": "any", + "sctp-a-ingress-src_start_port": "0.0", + "sctp-b-egress-dst_end_port": "65535.0" + }, + "type": "VF", + "modelCustomizationName": "VF_vMee 0", + "vfModules": { + "vf_vmee0..VfVmee..vmme_vlc..module-1": { + "uuid": "522159d5-d6e0-4c2a-aa44-5a542a12a830", + "invariantUuid": "98a7c88b-b577-476a-90e4-e25a5871e02b", + "customizationUuid": "55b1be94-671a-403e-a26c-667e9c47d091", + "description": null, + "name": "VfVmee..vmme_vlc..module-1", + "version": "2", + "modelCustomizationName": "VfVmee..vmme_vlc..module-1", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "vmme_vlc" + }, + "inputs": {}, + "volumeGroupAllowed": true + }, + "vf_vmee0..VfVmee..vmme_gpb..module-2": { + "uuid": "41708296-e443-4c71-953f-d9a010f059e1", + "invariantUuid": "1cca90b8-3490-495e-87da-3f3e4c57d5b9", + "customizationUuid": "6add59e0-7fe1-4bc4-af48-f8812422ae7c", + "description": null, + "name": "VfVmee..vmme_gpb..module-2", + "version": "2", + "modelCustomizationName": "VfVmee..vmme_gpb..module-2", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "vmme_gpb" + }, + "inputs": {}, + "volumeGroupAllowed": false + }, + "vf_vmee0..VfVmee..base_vmme..module-0": { + "uuid": "a27f5cfc-7f12-4f99-af08-0af9c3885c87", + "invariantUuid": "a6f9e51a-2b35-416a-ae15-15e58d61f36d", + "customizationUuid": "f8c040f1-7e51-4a11-aca8-acf256cfd861", + "description": null, + "name": "VfVmee..base_vmme..module-0", + "version": "2", + "modelCustomizationName": "VfVmee..base_vmme..module-0", + "properties": { + "minCountInstances": 1, + "maxCountInstances": 1, + "initialCount": 1, + "vfModuleLabel": "base_vmme" + }, + "inputs": {}, + "volumeGroupAllowed": true + } + }, + "volumeGroups": { + "vf_vmee0..VfVmee..base_vmme..module-0": { + "uuid": "a27f5cfc-7f12-4f99-af08-0af9c3885c87", + "invariantUuid": "a6f9e51a-2b35-416a-ae15-15e58d61f36d", + "customizationUuid": "f8c040f1-7e51-4a11-aca8-acf256cfd861", + "description": null, + "name": "VfVmee..base_vmme..module-0", + "version": "2", + "modelCustomizationName": "VfVmee..base_vmme..module-0", + "properties": { + "minCountInstances": 1, + "maxCountInstances": 1, + "initialCount": 1, + "vfModuleLabel": "base_vmme" + }, + "inputs": {} + } + }, + "vfcInstanceGroups": {} + } + }, + "networks": { + "ExtVL 0": { + "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986", + "invariantUuid": "379f816b-a7aa-422f-be30-17114ff50b7c", + "description": "ECOMP generic virtual link (network) base type for all other service-level and global networks", + "name": "ExtVL", + "version": "37.0", + "customizationUuid": "94fdd893-4a36-4d70-b16a-ec29c54c184f", + "inputs": {}, + "commands": {}, + "properties": { + "netowrk_role": "role 1, role 2, role 3", + "network_assignments": "{is_external_network=false, ipv4_subnet_default_assignment={min_subnets_count=1}, ecomp_generated_network_assignment=false, ipv6_subnet_default_assignment={min_subnets_count=1}}", + "exVL_naming": "{ecomp_generated_naming=true}", + "network_flows": "{is_network_policy=false, is_bound_to_vpn=false}", + "network_homing": "{ecomp_selected_instance_node_target=false}" + }, + "type": "VL", + "modelCustomizationName": "ExtVL 0" + } + }, + "collectionResource": {}, + "configurations": { + "Port Mirroring Configuration By Policy 0": { + "uuid": "b4398538-e89d-4f13-b33d-ca323434ba50", + "invariantUuid": "6ef0ca40-f366-4897-951f-abd65d25f6f7", + "description": "A port mirroring configuration by policy object", + "name": "Port Mirroring Configuration By Policy", + "version": "27.0", + "customizationUuid": "3c3b7b8d-8669-4b3b-8664-61970041fad2", + "inputs": {}, + "commands": {}, + "properties": {}, + "type": "Configuration", + "modelCustomizationName": "Port Mirroring Configuration By Policy 0", + "sourceNodes": [], + "collectorNodes": null, + "configurationByPolicy": false + } + }, + "serviceProxies": {}, + "vfModules": { + "vf_vmee0..VfVmee..vmme_vlc..module-1": { + "uuid": "522159d5-d6e0-4c2a-aa44-5a542a12a830", + "invariantUuid": "98a7c88b-b577-476a-90e4-e25a5871e02b", + "customizationUuid": "55b1be94-671a-403e-a26c-667e9c47d091", + "description": null, + "name": "VfVmee..vmme_vlc..module-1", + "version": "2", + "modelCustomizationName": "VfVmee..vmme_vlc..module-1", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "vmme_vlc" + }, + "inputs": {}, + "volumeGroupAllowed": true + }, + "vf_vmee0..VfVmee..vmme_gpb..module-2": { + "uuid": "41708296-e443-4c71-953f-d9a010f059e1", + "invariantUuid": "1cca90b8-3490-495e-87da-3f3e4c57d5b9", + "customizationUuid": "6add59e0-7fe1-4bc4-af48-f8812422ae7c", + "description": null, + "name": "VfVmee..vmme_gpb..module-2", + "version": "2", + "modelCustomizationName": "VfVmee..vmme_gpb..module-2", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "vmme_gpb" + }, + "inputs": {}, + "volumeGroupAllowed": false + }, + "vf_vmee0..VfVmee..base_vmme..module-0": { + "uuid": "a27f5cfc-7f12-4f99-af08-0af9c3885c87", + "invariantUuid": "a6f9e51a-2b35-416a-ae15-15e58d61f36d", + "customizationUuid": "f8c040f1-7e51-4a11-aca8-acf256cfd861", + "description": null, + "name": "VfVmee..base_vmme..module-0", + "version": "2", + "modelCustomizationName": "VfVmee..base_vmme..module-0", + "properties": { + "minCountInstances": 1, + "maxCountInstances": 1, + "initialCount": 1, + "vfModuleLabel": "base_vmme" + }, + "inputs": {}, + "volumeGroupAllowed": true + } + }, + "volumeGroups": { + "vf_vmee0..VfVmee..base_vmme..module-0": { + "uuid": "a27f5cfc-7f12-4f99-af08-0af9c3885c87", + "invariantUuid": "a6f9e51a-2b35-416a-ae15-15e58d61f36d", + "customizationUuid": "f8c040f1-7e51-4a11-aca8-acf256cfd861", + "description": null, + "name": "VfVmee..base_vmme..module-0", + "version": "2", + "modelCustomizationName": "VfVmee..base_vmme..module-0", + "properties": { + "minCountInstances": 1, + "maxCountInstances": 1, + "initialCount": 1, + "vfModuleLabel": "base_vmme" + }, + "inputs": {} + } + }, + "pnfs": {} + }, + "6b528779-44a3-4472-bdff-9cd15ec93450": { + "service": { + "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450", + "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0", + "name": "action-data", + "version": "1.0", + "toscaModelURL": null, + "category": "some category", + "serviceType": "some service type", + "serviceRole": "some service role", + "description": "some description", + "serviceEcompNaming": "false", + "instantiationType": "A-La-Carte", + "inputs": { + "2017488_adiodvpe0_ASN_1": { + "type": "string", + "description": "AV/PE", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "AV_vPE" + }, + "2017488_adiodvpe0_ASN_2": { + "type": "number", + "description": "AV/PE", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": 2 + }, + "2017488_adiodvpe0_ASN_3": { + "type": "string", + "description": "AV/PE", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": false, + "default": "AV_vPE" + }, + "2017488_adiodvpe0_ASN_4": { + "type": "string", + "description": "AV/PE", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "AV_vPE_123" + } + } + }, + "vnfs": { + "2017-388_ADIOD-vPE 1": { + "uuid": "0903e1c0-8e03-4936-b5c2-260653b96413", + "invariantUuid": "00beb8f9-6d39-452f-816d-c709b9cbb87d", + "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM", + "name": "2017-388_ADIOD-vPE", + "version": "1.0", + "customizationUuid": "280dec31-f16d-488b-9668-4aae55d6648a", + "inputs": { + "vnf_config_template_version": { + "type": "string", + "description": "VPE Software Version", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "17.2" + }, + "bandwidth_units": { + "type": "string", + "description": "Units of bandwidth", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "Gbps" + }, + "bandwidth": { + "type": "string", + "description": "Requested VPE bandwidth", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "10" + }, + "AIC_CLLI": { + "type": "string", + "description": "AIC Site CLLI", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "ATLMY8GA" + }, + "ASN": { + "type": "string", + "description": "AV/PE", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "AV_vPE" + }, + "vnf_instance_name": { + "type": "string", + "description": "The hostname assigned to the vpe.", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "mtnj309me6" + } + }, + "commands": { + "vnf_config_template_version": { + "displayName": "vnf_config_template_version", + "command": "get_input", + "inputName": "2017488_adiodvpe0_vnf_config_template_version" + }, + "bandwidth_units": { + "displayName": "bandwidth_units", + "command": "get_input", + "inputName": "adiodvpe0_bandwidth_units" + }, + "bandwidth": {"displayName": "bandwidth", "command": "get_input", "inputName": "adiodvpe0_bandwidth"}, + "AIC_CLLI": { + "displayName": "AIC_CLLI", + "command": "get_input", + "inputName": "2017488_adiodvpe0_AIC_CLLI" + }, + "ASN": {"displayName": "ASN", "command": "get_input", "inputName": "2017488_adiodvpe0_ASN"}, + "vnf_instance_name": { + "displayName": "vnf_instance_name", + "command": "get_input", + "inputName": "2017488_adiodvpe0_vnf_instance_name" + } + }, + "properties": { + "vmxvre_retype": "RE-VMX", + "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version", + "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d", + "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9", + "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF", + "int_ctl_net_name": "VMX-INTXI", + "vmx_int_ctl_prefix": "10.0.0.10", + "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5", + "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279", + "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a", + "nf_type": "vPE", + "vmxvpfe_int_ctl_ip_1": "10.0.0.10", + "is_AVPN_service": "false", + "vmx_RSG_name": "vREXI-affinity", + "vmx_int_ctl_forwarding": "l2", + "vmxvre_oam_ip_0": "10.0.0.10", + "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvpfe_sriov41_0_port_vlanstrip": "false", + "vmxvpfe_sriov42_0_port_vlanfilter": "4001", + "vmxvpfe_sriov44_0_port_unknownunicastallow": "true", + "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2", + "vmxvre_instance": "0", + "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvre_flavor_name": "ns.c1r16d32.v5", + "vmxvpfe_volume_size_0": "40.0", + "vmxvpfe_sriov43_0_port_vlanfilter": "4001", + "nf_naming": "{ecomp_generated_naming=false}", + "nf_naming_code": "Navneet", + "vmxvre_name_0": "vREXI", + "vmxvpfe_sriov42_0_port_vlanstrip": "false", + "vmxvpfe_volume_name_0": "vPFEXI_FBVolume", + "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141", + "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2", + "vmxvpfe_sriov43_0_port_unknownunicastallow": "true", + "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true", + "vmxvre_console": "vidconsole", + "vmxvpfe_sriov44_0_port_vlanfilter": "4001", + "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3", + "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true", + "vmxvpfe_sriov44_0_port_vlanstrip": "false", + "vf_module_id": "123", + "nf_function": "JAI", + "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true", + "vmxvre_int_ctl_ip_0": "10.0.0.10", + "ecomp_generated_naming": "false", + "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI", + "vnf_name": "mtnj309me6vre", + "vmxvpfe_sriov41_0_port_unknownunicastallow": "true", + "vmxvre_volume_type_1": "HITACHI", + "vmxvpfe_sriov44_0_port_broadcastallow": "true", + "vmxvre_volume_type_0": "HITACHI", + "vmxvpfe_volume_type_0": "HITACHI", + "vmxvpfe_sriov43_0_port_broadcastallow": "true", + "bandwidth_units": "get_input:adiodvpe0_bandwidth_units", + "vnf_id": "123", + "vmxvre_oam_prefix": "24", + "availability_zone_0": "mtpocfo-kvm-az01", + "ASN": "get_input:2017488_adiodvpe0_ASN", + "vmxvre_chassis_i2cid": "161", + "vmxvpfe_name_0": "vPFEXI", + "bandwidth": "get_input:adiodvpe0_bandwidth", + "availability_zone_max_count": "1", + "vmxvre_volume_size_0": "45.0", + "vmxvre_volume_size_1": "50.0", + "vmxvpfe_sriov42_0_port_broadcastallow": "true", + "vmxvre_oam_gateway": "10.0.0.10", + "vmxvre_volume_name_1": "vREXI_FAVolume", + "vmxvre_ore_present": "0", + "vmxvre_volume_name_0": "vREXI_FBVolume", + "vmxvre_type": "0", + "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name", + "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true", + "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429", + "vmx_int_ctl_len": "24", + "vmxvpfe_sriov43_0_port_vlanstrip": "false", + "vmxvpfe_sriov41_0_port_broadcastallow": "true", + "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d", + "vmxvpfe_sriov41_0_port_vlanfilter": "4001", + "nf_role": "Testing", + "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a", + "vmxvpfe_sriov42_0_port_unknownunicastallow": "true", + "vmxvpfe_flavor_name": "ns.c20r16d25.v5" + }, + "type": "VF", + "modelCustomizationName": "2017-388_ADIOD-vPE 1", + "vfModules": {}, + "volumeGroups": {}, + "vfcInstanceGroups": {} + }, + "2017-388_ADIOD-vPE 0": { + "uuid": "afacccf6-397d-45d6-b5ae-94c39734b168", + "invariantUuid": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8", + "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM", + "name": "2017-388_ADIOD-vPE", + "version": "4.0", + "customizationUuid": "b3c76f73-eeb5-4fb6-9d31-72a889f1811c", + "inputs": { + "vnf_config_template_version": { + "type": "string", + "description": "VPE Software Version", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "17.2" + }, + "bandwidth_units": { + "type": "string", + "description": "Units of bandwidth", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "Gbps" + }, + "bandwidth": { + "type": "string", + "description": "Requested VPE bandwidth", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "10" + }, + "AIC_CLLI": { + "type": "string", + "description": "AIC Site CLLI", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "ATLMY8GA" + }, + "ASN": { + "type": "string", + "description": "AV/PE", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "AV_vPE" + }, + "vnf_instance_name": { + "type": "string", + "description": "The hostname assigned to the vpe.", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "mtnj309me6" + } + }, + "commands": { + "vnf_config_template_version": { + "displayName": "vnf_config_template_version", + "command": "get_input", + "inputName": "2017488_adiodvpe0_vnf_config_template_version" + }, + "bandwidth_units": { + "displayName": "bandwidth_units", + "command": "get_input", + "inputName": "adiodvpe0_bandwidth_units" + }, + "bandwidth": {"displayName": "bandwidth", "command": "get_input", "inputName": "adiodvpe0_bandwidth"}, + "AIC_CLLI": { + "displayName": "AIC_CLLI", + "command": "get_input", + "inputName": "2017488_adiodvpe0_AIC_CLLI" + }, + "ASN": {"displayName": "ASN", "command": "get_input", "inputName": "2017488_adiodvpe0_ASN"}, + "vnf_instance_name": { + "displayName": "vnf_instance_name", + "command": "get_input", + "inputName": "2017488_adiodvpe0_vnf_instance_name" + } + }, + "properties": { + "vmxvre_retype": "RE-VMX", + "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version", + "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d", + "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9", + "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF", + "int_ctl_net_name": "VMX-INTXI", + "vmx_int_ctl_prefix": "10.0.0.10", + "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5", + "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279", + "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a", + "nf_type": "vPE", + "vmxvpfe_int_ctl_ip_1": "10.0.0.10", + "is_AVPN_service": "false", + "vmx_RSG_name": "vREXI-affinity", + "vmx_int_ctl_forwarding": "l2", + "vmxvre_oam_ip_0": "10.0.0.10", + "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvpfe_sriov41_0_port_vlanstrip": "false", + "vmxvpfe_sriov42_0_port_vlanfilter": "4001", + "vmxvpfe_sriov44_0_port_unknownunicastallow": "true", + "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2", + "vmxvre_instance": "0", + "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvre_flavor_name": "ns.c1r16d32.v5", + "vmxvpfe_volume_size_0": "40.0", + "vmxvpfe_sriov43_0_port_vlanfilter": "4001", + "nf_naming": "{ecomp_generated_naming=false}", + "nf_naming_code": "Navneet", + "vmxvre_name_0": "vREXI", + "vmxvpfe_sriov42_0_port_vlanstrip": "false", + "vmxvpfe_volume_name_0": "vPFEXI_FBVolume", + "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141", + "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2", + "vmxvpfe_sriov43_0_port_unknownunicastallow": "true", + "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true", + "vmxvre_console": "vidconsole", + "vmxvpfe_sriov44_0_port_vlanfilter": "4001", + "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3", + "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true", + "min_instances": "1", + "vmxvpfe_sriov44_0_port_vlanstrip": "false", + "vf_module_id": "123", + "nf_function": "JAI", + "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true", + "vmxvre_int_ctl_ip_0": "10.0.0.10", + "ecomp_generated_naming": "false", + "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI", + "vnf_name": "mtnj309me6vre", + "vmxvpfe_sriov41_0_port_unknownunicastallow": "true", + "vmxvre_volume_type_1": "HITACHI", + "vmxvpfe_sriov44_0_port_broadcastallow": "true", + "vmxvre_volume_type_0": "HITACHI", + "vmxvpfe_volume_type_0": "HITACHI", + "vmxvpfe_sriov43_0_port_broadcastallow": "true", + "bandwidth_units": "get_input:adiodvpe0_bandwidth_units", + "vnf_id": "123", + "vmxvre_oam_prefix": "24", + "availability_zone_0": "mtpocfo-kvm-az01", + "ASN": "get_input:2017488_adiodvpe0_ASN", + "vmxvre_chassis_i2cid": "161", + "vmxvpfe_name_0": "vPFEXI", + "bandwidth": "get_input:adiodvpe0_bandwidth", + "availability_zone_max_count": "1", + "vmxvre_volume_size_0": "45.0", + "vmxvre_volume_size_1": "50.0", + "vmxvpfe_sriov42_0_port_broadcastallow": "true", + "vmxvre_oam_gateway": "10.0.0.10", + "vmxvre_volume_name_1": "vREXI_FAVolume", + "vmxvre_ore_present": "0", + "vmxvre_volume_name_0": "vREXI_FBVolume", + "vmxvre_type": "0", + "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name", + "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true", + "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429", + "vmx_int_ctl_len": "24", + "vmxvpfe_sriov43_0_port_vlanstrip": "false", + "vmxvpfe_sriov41_0_port_broadcastallow": "true", + "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d", + "vmxvpfe_sriov41_0_port_vlanfilter": "4001", + "nf_role": "Testing", + "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a", + "vmxvpfe_sriov42_0_port_unknownunicastallow": "true", + "vmxvpfe_flavor_name": "ns.c20r16d25.v5" + }, + "type": "VF", + "modelCustomizationName": "2017-388_ADIOD-vPE 0", + "vfModules": {}, + "volumeGroups": {}, + "vfcInstanceGroups": {} + }, + "2017-488_ADIOD-vPE 0": { + "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09", + "invariantUuid": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8", + "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM", + "name": "2017-488_ADIOD-vPE", + "version": "5.0", + "customizationUuid": "1da7b585-5e61-4993-b95e-8e6606c81e45", + "inputs": { + "vnf_config_template_version": { + "type": "string", + "description": "VPE Software Version", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "17.2" + }, + "bandwidth_units": { + "type": "string", + "description": "Units of bandwidth", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "Gbps" + }, + "bandwidth": { + "type": "string", + "description": "Requested VPE bandwidth", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "10" + }, + "AIC_CLLI": { + "type": "string", + "description": "AIC Site CLLI", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "ATLMY8GA" + }, + "ASN": { + "type": "string", + "description": "AV/PE", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "AV_vPE" + }, + "vnf_instance_name": { + "type": "string", + "description": "The hostname assigned to the vpe.", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "mtnj309me6" + } + }, + "commands": { + "vnf_config_template_version": { + "displayName": "vnf_config_template_version", + "command": "get_input", + "inputName": "2017488_adiodvpe0_vnf_config_template_version" + }, + "bandwidth_units": { + "displayName": "bandwidth_units", + "command": "get_input", + "inputName": "adiodvpe0_bandwidth_units" + }, + "bandwidth": {"displayName": "bandwidth", "command": "get_input", "inputName": "adiodvpe0_bandwidth"}, + "AIC_CLLI": { + "displayName": "AIC_CLLI", + "command": "get_input", + "inputName": "2017488_adiodvpe0_AIC_CLLI" + }, + "ASN": {"displayName": "ASN", "command": "get_input", "inputName": "2017488_adiodvpe0_ASN"}, + "vnf_instance_name": { + "displayName": "vnf_instance_name", + "command": "get_input", + "inputName": "2017488_adiodvpe0_vnf_instance_name" + } + }, + "properties": { + "vmxvre_retype": "RE-VMX", + "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version", + "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d", + "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9", + "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF", + "int_ctl_net_name": "VMX-INTXI", + "vmx_int_ctl_prefix": "10.0.0.10", + "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5", + "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279", + "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a", + "nf_type": "vPE", + "vmxvpfe_int_ctl_ip_1": "10.0.0.10", + "is_AVPN_service": "false", + "vmx_RSG_name": "vREXI-affinity", + "vmx_int_ctl_forwarding": "l2", + "vmxvre_oam_ip_0": "10.0.0.10", + "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvpfe_sriov41_0_port_vlanstrip": "false", + "vmxvpfe_sriov42_0_port_vlanfilter": "4001", + "vmxvpfe_sriov44_0_port_unknownunicastallow": "true", + "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2", + "vmxvre_instance": "0", + "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvre_flavor_name": "ns.c1r16d32.v5", + "vmxvpfe_volume_size_0": "40.0", + "vmxvpfe_sriov43_0_port_vlanfilter": "4001", + "nf_naming": "{ecomp_generated_naming=false}", + "nf_naming_code": "Navneet", + "vmxvre_name_0": "vREXI", + "vmxvpfe_sriov42_0_port_vlanstrip": "false", + "vmxvpfe_volume_name_0": "vPFEXI_FBVolume", + "max_instances": "3", + "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141", + "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2", + "vmxvpfe_sriov43_0_port_unknownunicastallow": "true", + "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true", + "vmxvre_console": "vidconsole", + "vmxvpfe_sriov44_0_port_vlanfilter": "4001", + "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3", + "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true", + "min_instances": "1", + "vmxvpfe_sriov44_0_port_vlanstrip": "false", + "vf_module_id": "123", + "nf_function": "JAI", + "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true", + "vmxvre_int_ctl_ip_0": "10.0.0.10", + "ecomp_generated_naming": "false", + "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI", + "vnf_name": "mtnj309me6vre", + "vmxvpfe_sriov41_0_port_unknownunicastallow": "true", + "vmxvre_volume_type_1": "HITACHI", + "vmxvpfe_sriov44_0_port_broadcastallow": "true", + "vmxvre_volume_type_0": "HITACHI", + "vmxvpfe_volume_type_0": "HITACHI", + "vmxvpfe_sriov43_0_port_broadcastallow": "true", + "bandwidth_units": "get_input:adiodvpe0_bandwidth_units", + "vnf_id": "123", + "vmxvre_oam_prefix": "24", + "availability_zone_0": "mtpocfo-kvm-az01", + "ASN": "get_input:2017488_adiodvpe0_ASN", + "vmxvre_chassis_i2cid": "161", + "vmxvpfe_name_0": "vPFEXI", + "bandwidth": "get_input:adiodvpe0_bandwidth", + "availability_zone_max_count": "1", + "vmxvre_volume_size_0": "45.0", + "vmxvre_volume_size_1": "50.0", + "vmxvpfe_sriov42_0_port_broadcastallow": "true", + "vmxvre_oam_gateway": "10.0.0.10", + "vmxvre_volume_name_1": "vREXI_FAVolume", + "vmxvre_ore_present": "0", + "vmxvre_volume_name_0": "vREXI_FBVolume", + "vmxvre_type": "0", + "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name", + "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true", + "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429", + "vmx_int_ctl_len": "24", + "vmxvpfe_sriov43_0_port_vlanstrip": "false", + "vmxvpfe_sriov41_0_port_broadcastallow": "true", + "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d", + "vmxvpfe_sriov41_0_port_vlanfilter": "4001", + "nf_role": "Testing", + "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a", + "vmxvpfe_sriov42_0_port_unknownunicastallow": "true", + "vmxvpfe_flavor_name": "ns.c20r16d25.v5" + }, + "type": "VF", + "modelCustomizationName": "2017-488_ADIOD-vPE 0", + "vfModules": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": { + "uuid": "25284168-24bb-4698-8cb4-3f509146eca5", + "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1", + "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vRE_BV" + }, + "inputs": { + "adiodvpe0_bandwidth": { + "type": "string", + "description": "Requested VPE bandwidth", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "bandwidth" + }, + "constraints": null, + "required": true, + "default": "10" + }, + "2017488_adiodvpe0_vnf_instance_name": { + "type": "string", + "description": "The hostname assigned to the vpe.", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "vnf_instance_name" + }, + "constraints": null, + "required": true, + "default": "mtnj309me6" + }, + "2017488_adiodvpe0_vnf_config_template_version": { + "type": "string", + "description": "VPE Software Version", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "vnf_config_template_version" + }, + "constraints": null, + "required": true, + "default": "17.2" + }, + "2017488_adiodvpe0_AIC_CLLI": { + "type": "string", + "description": "AIC Site CLLI", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "AIC_CLLI" + }, + "constraints": null, + "required": true, + "default": "ATLMY8GA" + }, + "adiodvpe0_bandwidth_units": { + "type": "string", + "description": "Units of bandwidth", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "bandwidth_units" + }, + "constraints": null, + "required": true, + "default": "Gbps" + } + }, + "volumeGroupAllowed": true + }, + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": { + "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db", + "invariantUuid": "b34833bb-6aa9-4ad6-a831-70b06367a091", + "customizationUuid": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3", + "description": null, + "name": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0", + "version": "5", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0", + "properties": { + "minCountInstances": 1, + "maxCountInstances": 1, + "initialCount": 1, + "vfModuleLabel": "ADIOD_base_vPE_BV" + }, + "inputs": {}, + "volumeGroupAllowed": false + }, + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": { + "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a", + "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339", + "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vPFE_BV" + }, + "inputs": {}, + "volumeGroupAllowed": true + } + }, + "volumeGroups": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": { + "uuid": "25284168-24bb-4698-8cb4-3f509146eca5", + "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1", + "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vRE_BV" + }, + "inputs": { + "adiodvpe0_bandwidth": { + "type": "string", + "description": "Requested VPE bandwidth", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "bandwidth" + }, + "constraints": null, + "required": true, + "default": "10" + }, + "2017488_adiodvpe0_vnf_instance_name": { + "type": "string", + "description": "The hostname assigned to the vpe.", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "vnf_instance_name" + }, + "constraints": null, + "required": true, + "default": "mtnj309me6" + }, + "2017488_adiodvpe0_vnf_config_template_version": { + "type": "string", + "description": "VPE Software Version", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "vnf_config_template_version" + }, + "constraints": null, + "required": true, + "default": "17.2" + }, + "2017488_adiodvpe0_AIC_CLLI": { + "type": "string", + "description": "AIC Site CLLI", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "AIC_CLLI" + }, + "constraints": null, + "required": true, + "default": "ATLMY8GA" + }, + "adiodvpe0_bandwidth_units": { + "type": "string", + "description": "Units of bandwidth", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "bandwidth_units" + }, + "constraints": null, + "required": true, + "default": "Gbps" + } + } + }, + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": { + "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a", + "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339", + "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vPFE_BV" + }, + "inputs": {} + } + }, + "vfcInstanceGroups": {} + } + }, + "networks": { + "ExtVL 0": { + "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986", + "invariantUuid": "379f816b-a7aa-422f-be30-17114ff50b7c", + "description": "ECOMP generic virtual link (network) base type for all other service-level and global networks", + "name": "ExtVL", + "version": "37.0", + "customizationUuid": "94fdd893-4a36-4d70-b16a-ec29c54c184f", + "inputs": { + "vnf_config_template_version": { + "type": "string", + "description": "VPE Software Version", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "17.2" + }, + "bandwidth_units": { + "type": "string", + "description": "Units of bandwidth", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "Gbps" + }, + "bandwidth": { + "type": "string", + "description": "Requested VPE bandwidth", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "10" + }, + "AIC_CLLI": { + "type": "string", + "description": "AIC Site CLLI", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "ATLMY8GA" + }, + "ASN": { + "type": "string", + "description": "AV/PE", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "AV_vPE" + }, + "vnf_instance_name": { + "type": "string", + "description": "The hostname assigned to the vpe.", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "mtnj309me6" + } + }, + "commands": {}, + "properties": { + "network_role" : "network role 1, network role 2", + "min_instances": 1, + "max_instances": 10, + "network_assignments": "{is_external_network=false, ipv4_subnet_default_assignment={min_subnets_count=1}, ecomp_generated_network_assignment=false, ipv6_subnet_default_assignment={min_subnets_count=1}}", + "exVL_naming": "{ecomp_generated_naming=true}", + "network_flows": "{is_network_policy=false, is_bound_to_vpn=false}", + "network_homing": "{ecomp_selected_instance_node_target=false}" + }, + "type": "VL", + "modelCustomizationName": "ExtVL 0" + } + }, + "collectionResource": {}, + "configurations": {}, + "fabricConfigurations": {}, + "serviceProxies": {}, + "vfModules": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": { + "uuid": "25284168-24bb-4698-8cb4-3f509146eca5", + "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1", + "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vRE_BV" + }, + "inputs": { + "adiodvpe0_bandwidth": { + "type": "string", + "description": "Requested VPE bandwidth", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "bandwidth" + }, + "constraints": null, + "required": true, + "default": "10" + }, + "2017488_adiodvpe0_vnf_instance_name": { + "type": "string", + "description": "The hostname assigned to the vpe.", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "vnf_instance_name" + }, + "constraints": null, + "required": true, + "default": "mtnj309me6" + }, + "2017488_adiodvpe0_vnf_config_template_version": { + "type": "string", + "description": "VPE Software Version", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "vnf_config_template_version" + }, + "constraints": null, + "required": true, + "default": "17.2" + }, + "2017488_adiodvpe0_AIC_CLLI": { + "type": "string", + "description": "AIC Site CLLI", + "entry_schema": null, + "inputProperties": {"sourceType": "HEAT", "vfModuleLabel": "ADIOD_vRE_BV", "paramName": "AIC_CLLI"}, + "constraints": null, + "required": true, + "default": "ATLMY8GA" + }, + "adiodvpe0_bandwidth_units": { + "type": "string", + "description": "Units of bandwidth", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "bandwidth_units" + }, + "constraints": null, + "required": true, + "default": "Gbps" + } + }, + "volumeGroupAllowed": true + }, + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": { + "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db", + "invariantUuid": "b34833bb-6aa9-4ad6-a831-70b06367a091", + "customizationUuid": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3", + "description": null, + "name": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0", + "version": "5", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0", + "properties": { + "minCountInstances": 1, + "maxCountInstances": 1, + "initialCount": 1, + "vfModuleLabel": "ADIOD_base_vPE_BV" + }, + "inputs": {}, + "volumeGroupAllowed": false + }, + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": { + "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a", + "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339", + "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vPFE_BV" + }, + "inputs": {}, + "volumeGroupAllowed": true + } + }, + "volumeGroups": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": { + "uuid": "25284168-24bb-4698-8cb4-3f509146eca5", + "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1", + "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vRE_BV" + }, + "inputs": { + "adiodvpe0_bandwidth": { + "type": "string", + "description": "Requested VPE bandwidth", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "bandwidth" + }, + "constraints": null, + "required": true, + "default": "10" + }, + "2017488_adiodvpe0_vnf_instance_name": { + "type": "string", + "description": "The hostname assigned to the vpe.", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "vnf_instance_name" + }, + "constraints": null, + "required": true, + "default": "mtnj309me6" + }, + "2017488_adiodvpe0_vnf_config_template_version": { + "type": "string", + "description": "VPE Software Version", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "vnf_config_template_version" + }, + "constraints": null, + "required": true, + "default": "17.2" + }, + "2017488_adiodvpe0_AIC_CLLI": { + "type": "string", + "description": "AIC Site CLLI", + "entry_schema": null, + "inputProperties": {"sourceType": "HEAT", "vfModuleLabel": "ADIOD_vRE_BV", "paramName": "AIC_CLLI"}, + "constraints": null, + "required": true, + "default": "ATLMY8GA" + }, + "adiodvpe0_bandwidth_units": { + "type": "string", + "description": "Units of bandwidth", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "bandwidth_units" + }, + "constraints": null, + "required": true, + "default": "Gbps" + } + } + }, + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": { + "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a", + "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339", + "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vPFE_BV" + }, + "inputs": {} + } + }, + "pnfs": {} + } + }, + "serviceInstance": { + "6e59c5de-f052-46fa-aa7e-2fca9d674c44": { + "vnfs": { + "VF_vMee 0": { + "rollbackOnFailure": "true", + "vfModules": { + "vf_vmee0..VfVmee..base_vmme..module-0": { + "vf_vmee0..VfVmee..base_vmme..module-0vmvzo": { + "isMissingData": false, + "sdncPreReload": null, + "modelInfo": { + "modelType": "VFmodule", + "modelInvariantId": "a6f9e51a-2b35-416a-ae15-15e58d61f36d", + "modelVersionId": "a27f5cfc-7f12-4f99-af08-0af9c3885c87", + "modelName": "VfVmee..base_vmme..module-0", + "modelVersion": "2", + "modelCustomizationId": "f8c040f1-7e51-4a11-aca8-acf256cfd861", + "modelCustomizationName": "VfVmee..base_vmme..module-0" + }, + "instanceParams": [{}], + "trackById": "wmtm6sy2uj" + } + } + }, + "isMissingData": true, + "originalName": "VF_vMee 0", + "vnfStoreKey": "VF_vMee 0", + "trackById": "p3wk448m5do", + "uuid": "d6557200-ecf2-4641-8094-5393ae3aae60", + "productFamilyId": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e", + "lcpCloudRegionId": null, + "tenantId": null, + "lineOfBusiness": null, + "platformName": null, + "modelInfo": { + "modelType": "VF", + "modelInvariantId": "4160458e-f648-4b30-a176-43881ffffe9e", + "modelVersionId": "6e59c5de-f052-46fa-aa7e-2fca9d674c44", + "modelName": "VF_vMee", + "modelVersion": "2.0", + "modelCustomizationName": "VF_vMee 0" + } + } + }, + "networks": {}, + "instanceParams": [{}], + "validationCounter": 1, + "existingNames": {}, + "existingVNFCounterMap": {"d6557200-ecf2-4641-8094-5393ae3aae60": 1}, + "globalSubscriberId": "e433710f-9217-458d-a79d-1c7aff376d89", + "subscriptionServiceType": "TYLER SILVIA", + "owningEntityId": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc", + "productFamilyId": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e", + "lcpCloudRegionId": "hvf6", + "tenantId": "229bcdc6eaeb4ca59d55221141d01f8e", + "aicZoneId": "JAG1", + "projectName": "x1", + "rollbackOnFailure": "true", + "bulkSize": 1, + "modelInfo": { + "modelInvariantId": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0", + "modelVersionId": "6e59c5de-f052-46fa-aa7e-2fca9d674c44", + "modelName": "ComplexService", + "modelVersion": "1.0", + "uuid": "6e59c5de-f052-46fa-aa7e-2fca9d674c44" + }, + "isALaCarte": false, + "name": "ComplexService", + "version": "1.0", + "description": "ComplexService", + "category": "Emanuel", + "uuid": "6e59c5de-f052-46fa-aa7e-2fca9d674c44", + "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0", + "serviceType": "", + "serviceRole": "", + "isMultiStepDesign": false + }, + "6b528779-44a3-4472-bdff-9cd15ec93450": { + "networks": { + "ExtVL 0": { + "rollbackOnFailure": "true", + "isMissingData": false, + "originalName": "ExtVL 0", + "networkStoreKey": "ExtVL 0", + "trackById": "sf3zth68xjf", + "productFamilyId": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034", + "lcpCloudRegionId": "hvf6", + "tenantId": "229bcdc6eaeb4ca59d55221141d01f8e", + "platformName": "xxx1", + "lineOfBusiness": "ONAP", + "instanceParams": [{}], + "modelInfo": { + "modelInvariantId": "379f816b-a7aa-422f-be30-17114ff50b7c", + "modelVersionId": "ddc3f20c-08b5-40fd-af72-c6d14636b986", + "modelName": "ExtVL", + "modelVersion": "37.0", + "modelCustomizationId": "94fdd893-4a36-4d70-b16a-ec29c54c184f", + "modelCustomizationName": "ExtVL 0", + "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986" + }, + "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986" + }, + "ExtVL 0:0001": { + "rollbackOnFailure": "true", + "isMissingData": false, + "originalName": "ExtVL 0", + "networkStoreKey": "ExtVL 0", + "trackById": "2mdxioxca9h", + "productFamilyId": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034", + "lcpCloudRegionId": "hvf6", + "tenantId": "229bcdc6eaeb4ca59d55221141d01f8e", + "platformName": "xxx1", + "lineOfBusiness": "ONAP", + "instanceParams": [{}], + "modelInfo": { + "modelInvariantId": "379f816b-a7aa-422f-be30-17114ff50b7c", + "modelVersionId": "ddc3f20c-08b5-40fd-af72-c6d14636b986", + "modelName": "ExtVL", + "modelVersion": "37.0", + "modelCustomizationId": "94fdd893-4a36-4d70-b16a-ec29c54c184f", + "modelCustomizationName": "ExtVL 0", + "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986" + }, + "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986" + }, + "ExtVL 0_1": { + "rollbackOnFailure": "true", + "isMissingData": false, + "originalName": "ExtVL 0", + "networkStoreKey": "ExtVL 0_1", + "trackById": "z7vd1gmpbs", + "instanceName": "ExtVL", + "productFamilyId": "17cc1042-527b-11e6-beb8-9e71128cae77", + "lcpCloudRegionId": "hvf6", + "tenantId": "229bcdc6eaeb4ca59d55221141d01f8e", + "platformName": "xxx1", + "lineOfBusiness": "zzz1", + "instanceParams": [{ + "vnf_config_template_version": "17.2", + "bandwidth_units": "Gbps", + "bandwidth": "10", + "AIC_CLLI": "ATLMY8GA", + "ASN": "AV_vPE", + "vnf_instance_name": "yoav" + }], + "modelInfo": { + "modelInvariantId": "379f816b-a7aa-422f-be30-17114ff50b7c", + "modelVersionId": "ddc3f20c-08b5-40fd-af72-c6d14636b986", + "modelName": "ExtVL", + "modelVersion": "37.0", + "modelCustomizationId": "94fdd893-4a36-4d70-b16a-ec29c54c184f", + "modelCustomizationName": "ExtVL 0", + "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986" + }, + "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986" + } + }, + "vnfs": { + "2017-488_ADIOD-vPE 0": { + "rollbackOnFailure": "true", + "vfModules": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1sgoqi": { + "instanceName": "yoav", + "volumeGroupName": "123", + "modelInfo": { + "modelInvariantId": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1", + "modelVersionId": "25284168-24bb-4698-8cb4-3f509146eca5", + "modelName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "modelVersion": "6", + "modelCustomizationId": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "uuid": "25284168-24bb-4698-8cb4-3f509146eca5" + }, + "uuid": "25284168-24bb-4698-8cb4-3f509146eca5", + "isMissingData": false, + "instanceParams": [{ + "adiodvpe0_bandwidth": "10", + "2017488_adiodvpe0_vnf_instance_name": "mtnj309me6", + "2017488_adiodvpe0_vnf_config_template_version": "17.2", + "2017488_adiodvpe0_AIC_CLLI": "ATLMY8GA", + "adiodvpe0_bandwidth_units": "Gbps" + }] + } + } + }, + "isMissingData": false, + "originalName": "2017-488_ADIOD-vPE 0", + "vnfStoreKey": "2017-488_ADIOD-vPE 0", + "trackById": "o65b26t2thj", + "instanceName": "2017488_ADIODvPE", + "productFamilyId": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034", + "lcpCloudRegionId": "hvf6", + "tenantId": "bae71557c5bb4d5aac6743a4e5f1d054", + "platformName": "platform", + "lineOfBusiness": "ONAP", + "instanceParams": [{}], + "modelInfo": { + "modelInvariantId": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8", + "modelVersionId": "69e09f68-8b63-4cc9-b9ff-860960b5db09", + "modelName": "2017-488_ADIOD-vPE", + "modelVersion": "5.0", + "modelCustomizationId": "1da7b585-5e61-4993-b95e-8e6606c81e45", + "modelCustomizationName": "2017-488_ADIOD-vPE 0", + "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09" + }, + "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09" + } + }, + "instanceParams": [{"2017488_adiodvpe0_ASN": "AV_vPE"}], + "validationCounter": 0, + "existingNames": {"123": "", "instancename": "", "yoav": "", "extvl": ""}, + "existingVNFCounterMap": {"69e09f68-8b63-4cc9-b9ff-860960b5db09": 1}, + "existingNetworksCounterMap": {"ddc3f20c-08b5-40fd-af72-c6d14636b986": 3}, + "instanceName": "InstanceName", + "globalSubscriberId": "e433710f-9217-458d-a79d-1c7aff376d89", + "subscriptionServiceType": "TYLER SILVIA", + "owningEntityId": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc", + "productFamilyId": "17cc1042-527b-11e6-beb8-9e71128cae77", + "lcpCloudRegionId": "JANET25", + "tenantId": "092eb9e8e4b7412e8787dd091bc58e86", + "aicZoneId": "JAG1", + "projectName": null, + "rollbackOnFailure": "true", + "aicZoneName": "YUDFJULP-JAG1", + "owningEntityName": "WayneHolland", + "testApi": "GR_API", + "tenantName": "USP-SIP-IC-24335-T-01", + "bulkSize": 1, + "modelInfo": { + "modelInvariantId": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0", + "modelVersionId": "6b528779-44a3-4472-bdff-9cd15ec93450", + "modelName": "action-data", + "modelVersion": "1.0", + "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450" + }, + "isALaCarte": false, + "name": "action-data", + "version": "1.0", + "description": "", + "category": "", + "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450", + "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0", + "serviceType": "", + "serviceRole": "", + "isMultiStepDesign": false + } + }, + "lcpRegionsAndTenants": { + "lcpRegionList": [{ + "id": "JANET25", + "name": "JANET25", + "isPermitted": true + }, {"id": "hvf6", "name": "hvf6", "isPermitted": true}], + "lcpRegionsTenantsMap": { + "JANET25": [{ + "id": "092eb9e8e4b7412e8787dd091bc58e86", + "name": "USP-SIP-IC-24335-T-01", + "isPermitted": true + }], + "hvf6": [{ + "id": "bae71557c5bb4d5aac6743a4e5f1d054", + "name": "AIN Web Tool-15-D-testalexandria", + "isPermitted": true + }, { + "id": "229bcdc6eaeb4ca59d55221141d01f8e", + "name": "AIN Web Tool-15-D-STTest2", + "isPermitted": true + }, { + "id": "1178612d2b394be4834ad77f567c0af2", + "name": "AIN Web Tool-15-D-SSPtestcustome", + "isPermitted": true + }, { + "id": "19c5ade915eb461e8af52fb2fd8cd1f2", + "name": "AIN Web Tool-15-D-UncheckedEcopm", + "isPermitted": true + }, { + "id": "de007636e25249238447264a988a927b", + "name": "AIN Web Tool-15-D-dfsdf", + "isPermitted": true + }, { + "id": "62f29b3613634ca6a3065cbe0e020c44", + "name": "AIN/SMS-16-D-Multiservices1", + "isPermitted": true + }, { + "id": "649289e30d3244e0b48098114d63c2aa", + "name": "AIN Web Tool-15-D-SSPST66", + "isPermitted": true + }, { + "id": "3f21eeea6c2c486bba31dab816c05a32", + "name": "AIN Web Tool-15-D-ASSPST47", + "isPermitted": true + }, { + "id": "f60ce21d3ee6427586cff0d22b03b773", + "name": "CESAR-100-D-sspjg67246", + "isPermitted": true + }, { + "id": "8774659e425f479895ae091bb5d46560", + "name": "CESAR-100-D-sspjg68359", + "isPermitted": true + }, { + "id": "624eb554b0d147c19ff8885341760481", + "name": "AINWebTool-15-D-iftach", + "isPermitted": true + }, { + "id": "214f55f5fc414c678059c383b03e4962", + "name": "CESAR-100-D-sspjg612401", + "isPermitted": true + }, { + "id": "c90666c291664841bb98e4d981ff1db5", + "name": "CESAR-100-D-sspjg621340", + "isPermitted": true + }, { + "id": "ce5b6bc5c7b348e1bf4b91ac9a174278", + "name": "sspjg621351cloned", + "isPermitted": true + }, { + "id": "b386b768a3f24c8e953abbe0b3488c02", + "name": "AINWebTool-15-D-eteancomp", + "isPermitted": true + }, { + "id": "dc6c4dbfd225474e9deaadd34968646c", + "name": "AINWebTool-15-T-SPFET", + "isPermitted": true + }, { + "id": "02cb5030e9914aa4be120bd9ed1e19eb", + "name": "AINWebTool-15-X-eeweww", + "isPermitted": true + }, { + "id": "f2f3830e4c984d45bcd00e1a04158a79", + "name": "CESAR-100-D-spjg61909", + "isPermitted": true + }, { + "id": "05b91bd5137f4929878edd965755c06d", + "name": "CESAR-100-D-sspjg621512cloned", + "isPermitted": true + }, { + "id": "7002fbe8482d4a989ddf445b1ce336e0", + "name": "AINWebTool-15-X-vdr", + "isPermitted": true + }, { + "id": "4008522be43741dcb1f5422022a2aa0b", + "name": "AINWebTool-15-D-ssasa", + "isPermitted": true + }, { + "id": "f44e2e96a1b6476abfda2fa407b00169", + "name": "AINWebTool-15-D-PFNPT", + "isPermitted": true + }, { + "id": "b69a52bec8a84669a37a1e8b72708be7", + "name": "AINWebTool-15-X-vdre", + "isPermitted": true + }, { + "id": "fac7d9fd56154caeb9332202dcf2969f", + "name": "AINWebTool-15-X-NONPODECOMP", + "isPermitted": true + }, { + "id": "2d34d8396e194eb49969fd61ffbff961", + "name": "DN5242-Nov16-T5", + "isPermitted": true + }, { + "id": "cb42a77ff45b48a8b8deb83bb64acc74", + "name": "ro-T11", + "isPermitted": true + }, { + "id": "fa45ca53c80b492fa8be5477cd84fc2b", + "name": "ro-T112", + "isPermitted": true + }, { + "id": "4914ab0ab3a743e58f0eefdacc1dde77", + "name": "DN5242-Nov21-T1", + "isPermitted": true + }, { + "id": "d0a3e3f2964542259d155a81c41aadc3", + "name": "test-hvf6-09", + "isPermitted": true + }, {"id": "cbb99fe4ada84631b7baf046b6fd2044", "name": "DN5242-Nov16-T3", "isPermitted": true}] + } + }, + "productFamilies": [{ + "id": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034", + "name": "SCOTTIE", + "isPermitted": true + }, { + "id": "17cc1042-527b-11e6-beb8-9e71128cae77", + "name": "IGNACIO", + "isPermitted": true + }, { + "id": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e", + "name": "Christie", + "isPermitted": true + }, { + "id": "a4f6f2ae-9bf5-4ed7-b904-06b2099c4bd7", + "name": "Enhanced Services", + "isPermitted": true + }, {"id": "vTerrance", "name": "vTerrance", "isPermitted": true}, { + "id": "323d69d9-2efe-4r45-ay0a-89ea7ard4e6f", + "name": "vSCP", + "isPermitted": true + }, { + "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb", + "name": "Emanuel", + "isPermitted": true + }, { + "id": "d8a6ed93-251c-47ca-adc9-86671fd19f4c", + "name": "BVOIP", + "isPermitted": true + }, {"id": "db171b8f-115c-4992-a2e3-ee04cae357e0", "name": "LINDSEY", "isPermitted": true}, { + "id": "LRSI-OSPF", + "name": "LRSI-OSPF", + "isPermitted": true + }, {"id": "vRosemarie", "name": "HNGATEWAY", "isPermitted": true}, { + "id": "vHNPaas", + "name": "WILKINS", + "isPermitted": true + }, { + "id": "e433710f-9217-458d-a79d-1c7aff376d89", + "name": "TYLER SILVIA", + "isPermitted": true + }, {"id": "b6a3f28c-eebf-494c-a900-055cc7c874ce", "name": "VROUTER", "isPermitted": true}, { + "id": "Cisneros", + "name": "vMuriel", + "isPermitted": true + }, { + "id": "0ee8c1bc-7cbd-4b0a-a1ac-e9999255abc1", + "name": "CARA Griffin", + "isPermitted": true + }, { + "id": "c7611ebe-c324-48f1-8085-94aef0c6ef3d", + "name": "DARREN MCGEE", + "isPermitted": true + }, {"id": "e30755dc-5673-4b6b-9dcf-9abdd96b93d1", "name": "Transport", "isPermitted": true}, { + "id": "vSalvatore", + "name": "vSalvatore", + "isPermitted": true + }, {"id": "d7bb0a21-66f2-4e6d-87d9-9ef3ced63ae4", "name": "Josefina", "isPermitted": true}, { + "id": "vHubbard", + "name": "vHubbard", + "isPermitted": true + }, {"id": "12a96a9d-4b4c-4349-a950-fe1159602621", "name": "DARREN MCGEE", "isPermitted": true}], + "serviceTypes": { + "e433710f-9217-458d-a79d-1c7aff376d89": [{ + "id": "0", + "name": "vRichardson", + "isPermitted": false + }, {"id": "1", "name": "TYLER SILVIA", "isPermitted": true}, { + "id": "2", + "name": "Emanuel", + "isPermitted": false + }, {"id": "3", "name": "vJamie", "isPermitted": false}, { + "id": "4", + "name": "vVoiceMail", + "isPermitted": false + }, {"id": "5", "name": "Kennedy", "isPermitted": false}, { + "id": "6", + "name": "vSEGW", + "isPermitted": false + }, {"id": "7", "name": "vVM", "isPermitted": false}, { + "id": "8", + "name": "vOTA", + "isPermitted": false + }, {"id": "9", "name": "vMME", "isPermitted": false}, { + "id": "10", + "name": "vMNS", + "isPermitted": false + }, {"id": "11", "name": "vSCP", "isPermitted": false}, { + "id": "12", + "name": "VPMS", + "isPermitted": false + }, {"id": "13", "name": "vMMSC", "isPermitted": false}, { + "id": "14", + "name": "SSD", + "isPermitted": false + }, {"id": "15", "name": "vMOG", "isPermitted": false}, { + "id": "16", + "name": "LINDSEY", + "isPermitted": false + }, {"id": "17", "name": "JOHANNA_SANTOS", "isPermitted": false}, { + "id": "18", + "name": "vCarroll", + "isPermitted": false + }] + }, + "aicZones": [{"id": "NFT1", "name": "NFTJSSSS-NFT1"}, {"id": "JAG1", "name": "YUDFJULP-JAG1"}, { + "id": "YYY1", + "name": "UUUAIAAI-YYY1" + }, {"id": "BAN1", "name": "VSDKYUTP-BAN1"}, {"id": "DKJ1", "name": "DKJSJDKA-DKJ1"}, { + "id": "MCS1", + "name": "ASACMAMS-MCS1" + }, {"id": "UIO1", "name": "uioclli1-UIO1"}, {"id": "RAJ1", "name": "YGBIJNLQ-RAJ1"}, { + "id": "OPA1", + "name": "opaclli1-OPA1" + }, {"id": "SDE1", "name": "ZXCVBNMA-SDE1"}, {"id": "VEN2", "name": "FGHJUHIL-VEN2"}, { + "id": "ORL1", + "name": "ORLDFLMA-ORL1" + }, {"id": "JAD1", "name": "JADECLLI-JAD1"}, {"id": "ZXL1", "name": "LWLWCANN-ZXL1"}, { + "id": "CKL1", + "name": "CLKSKCKK-CKL1" + }, {"id": "SDF1", "name": "sdfclli1-SDF1"}, {"id": "RAD1", "name": "RADICAL1-RAD1"}, { + "id": "KIT1", + "name": "BHYJFGLN-KIT1" + }, {"id": "REL1", "name": "INGERFGT-REL1"}, {"id": "JNL1", "name": "CJALSDAC-JNL1"}, { + "id": "OLK1", + "name": "OLKOLKLS-OLK1" + }, {"id": "CHI1", "name": "CHILLIWE-CHI1"}, {"id": "UUU4", "name": "UUUAAAUU-UUU4"}, { + "id": "TUF1", + "name": "TUFCLLI1-TUF1" + }, {"id": "KJN1", "name": "CKALDKSA-KJN1"}, {"id": "SAM1", "name": "SNDGCA64-SAN1"}, { + "id": "SCK1", + "name": "SCKSCKSK-SCK1" + }, {"id": "HJH1", "name": "AOEEQQQD-HJH1"}, {"id": "HGD1", "name": "SDFQWHGD-HGD1"}, { + "id": "KOR1", + "name": "HYFLNBVT-KOR1" + }, {"id": "ATL43", "name": "AICLOCID-ATL43"}, {"id": "ATL54", "name": "AICFTAAI-ATL54"}, { + "id": "ATL66", + "name": "CLLIAAII-ATL66" + }, {"id": "VEL1", "name": "BNMLKUIK-VEL1"}, {"id": "ICC1", "name": "SANJITAT-ICC1"}, { + "id": "MNT11", + "name": "WSXEFBTH-MNT11" + }, {"id": "DEF2", "name": "WSBHGTYL-DEF2"}, {"id": "MAD11", "name": "SDFQWGKL-MAD11"}, { + "id": "OLG1", + "name": "OLHOLHOL-OLG1" + }, {"id": "GAR1", "name": "NGFVSJKO-GAR1"}, {"id": "SAN22", "name": "GNVLSCTL-SAN22"}, { + "id": "HRG1", + "name": "HRGHRGGS-HRG1" + }, {"id": "JCS1", "name": "JCSJSCJS-JCS1"}, {"id": "DHA12", "name": "WSXEDECF-DHA12"}, { + "id": "HJE1", + "name": "AOEEWWWD-HJE1" + }, {"id": "NCA1", "name": "NCANCANN-NCA1"}, {"id": "IOP1", "name": "iopclli1-IOP1"}, { + "id": "RTY1", + "name": "rtyclli1-RTY1" + }, {"id": "KAP1", "name": "HIOUYTRQ-KAP1"}, {"id": "ZEN1", "name": "ZENCLLI1-ZEN1"}, { + "id": "HKA1", + "name": "JAKHLASS-HKA1" + }, {"id": "CQK1", "name": "CQKSCAKK-CQK1"}, {"id": "SAI1", "name": "UBEKQLPD-SAI1"}, { + "id": "ERT1", + "name": "ertclli1-ERT1" + }, {"id": "IBB1", "name": "PLMKOIJU-IBB1"}, {"id": "TIR2", "name": "PLKINHYI-TIR2"}, { + "id": "HSD1", + "name": "CHASKCDS-HSD1" + }, {"id": "SLF78", "name": "SDCTLFN1-SLF78"}, {"id": "SEE78", "name": "SDCTEEE4-SEE78"}, { + "id": "SAN13", + "name": "TOKYJPFA-SAN13" + }, {"id": "SAA78", "name": "SDCTAAA1-SAA78"}, {"id": "LUC1", "name": "ATLDFGYC-LUC1"}, { + "id": "AMD13", + "name": "MEMATLAN-AMD13" + }, {"id": "TOR1", "name": "TOROONXN-TOR1"}, {"id": "QWE1", "name": "QWECLLI1-QWE1"}, { + "id": "ZOG1", + "name": "ZOGASTRO-ZOG1" + }, {"id": "CAL33", "name": "CALIFORN-CAL33"}, {"id": "SHH78", "name": "SDIT1HHH-SHH78"}, { + "id": "DSA1", + "name": "LKJHGFDS-DSA1" + }, {"id": "CLG1", "name": "CLGRABAD-CLG1"}, {"id": "BNA1", "name": "BNARAGBK-BNA1"}, { + "id": "ATL84", + "name": "CANTTCOC-ATL84" + }, {"id": "APP1", "name": "WBHGTYUI-APP1"}, {"id": "RJN1", "name": "RJNRBZAW-RJN1"}, { + "id": "EHH78", + "name": "SDCSHHH5-EHH78" + }, {"id": "mac10", "name": "PKGTESTF-mac10"}, {"id": "SXB78", "name": "SDCTGXB1-SXB78"}, { + "id": "SAX78", + "name": "SDCTAXG1-SAX78" + }, {"id": "SYD1", "name": "SYDNAUBV-SYD1"}, {"id": "TOK1", "name": "TOKYJPFA-TOK1"}, { + "id": "KGM2", + "name": "KGMTNC20-KGM2" + }, {"id": "DCC1b", "name": "POIUYTGH-DCC1b"}, {"id": "SKK78", "name": "SDCTKKK1-SKK78"}, { + "id": "SGG78", + "name": "SDCTGGG1-SGG78" + }, {"id": "SJJ78", "name": "SDCTJJJ1-SJJ78"}, {"id": "SBX78", "name": "SDCTBXG1-SBX78"}, { + "id": "LAG1", + "name": "LARGIZON-LAG1" + }, {"id": "IAA1", "name": "QAZXSWED-IAA1"}, {"id": "POI1", "name": "PLMNJKIU-POI1"}, { + "id": "LAG1a", + "name": "LARGIZON-LAG1a" + }, {"id": "PBL1", "name": "PBLAPBAI-PBL1"}, {"id": "LAG45", "name": "LARGIZON-LAG1a"}, { + "id": "MAR1", + "name": "MNBVCXZM-MAR1" + }, {"id": "HST70", "name": "HSTNTX70-HST70"}, {"id": "DCC1a", "name": "POIUYTGH-DCC1a"}, { + "id": "TOL1", + "name": "TOLDOH21-TOL1" + }, {"id": "LON1", "name": "LONEENCO-LON1"}, {"id": "SJU78", "name": "SDIT1JUB-SJU78"}, { + "id": "STN27", + "name": "HSTNTX01-STN27" + }, {"id": "SSW56", "name": "ss8126GT-SSW56"}, {"id": "SBB78", "name": "SDIT1BBB-SBB78"}, { + "id": "DCC3", + "name": "POIUYTGH-DCC3" + }, {"id": "GNV1", "name": "GNVLSCTL-GNV1"}, {"id": "WAS1", "name": "WASHDCSW-WAS1"}, { + "id": "TOY1", + "name": "TORYONNZ-TOY1" + }, {"id": "STT1", "name": "STTLWA02-STT1"}, {"id": "STG1", "name": "STTGGE62-STG1"}, { + "id": "SLL78", + "name": "SDCTLLL1-SLL78" + }, {"id": "SBU78", "name": "SDIT1BUB-SBU78"}, {"id": "ATL2", "name": "ATLNGANW-ATL2"}, { + "id": "BOT1", + "name": "BOTHWAKY-BOT1" + }, {"id": "SNG1", "name": "SNGPSIAU-SNG1"}, {"id": "NYC1", "name": "NYCMNY54-NYC1"}, { + "id": "LAG1b", + "name": "LARGIZON-LAG1b" + }, {"id": "AMD15", "name": "AMDFAA01-AMD15"}, {"id": "SNA1", "name": "SNANTXCA-SNA1"}, { + "id": "PLT1", + "name": "PLTNCA60-PLT1" + }, {"id": "TLP1", "name": "TLPNXM18-TLP1"}, {"id": "SDD81", "name": "SAIT1DD6-SDD81"}, { + "id": "DCC1", + "name": "POIUYTGH-DCC1" + }, {"id": "DCC2", "name": "POIUYTGH-DCC2"}, {"id": "OKC1", "name": "OKCBOK55-OKC1"}, { + "id": "PAR1", + "name": "PARSFRCG-PAR1" + }, {"id": "TES36", "name": "ABCEETES-TES36"}, {"id": "COM1", "name": "PLMKOPIU-COM1"}, { + "id": "ANI1", + "name": "ATLNGTRE-ANI1" + }, {"id": "SDG78", "name": "SDIT1BDG-SDG78"}, {"id": "mac20", "name": "PKGTESTF-mac20"}, { + "id": "DSF45", + "name": "DSFBG123-DSF45" + }, {"id": "HST25", "name": "HSTNTX01-HST25"}, {"id": "AMD18", "name": "AUDIMA01-AMD18"}, { + "id": "SAA80", + "name": "SAIT9AA3-SAA80" + }, {"id": "SSA56", "name": "SSIT2AA7-SSA56"}, {"id": "SDD82", "name": "SAIT1DD9-SDD82"}, { + "id": "JCV1", + "name": "JCVLFLBW-JCV1" + }, {"id": "SUL2", "name": "WERTYUJK-SUL2"}, {"id": "PUR1", "name": "purelyde-PUR1"}, { + "id": "FDE55", + "name": "FDERT555-FDE55" + }, {"id": "SITE", "name": "LONEENCO-SITE"}, {"id": "ATL1", "name": "ATLNGAMA-ATL1"}, { + "id": "JUL1", + "name": "ZXCVBNMM-JUL1" + }, {"id": "TAT34", "name": "TESAAISB-TAT34"}, {"id": "XCP12", "name": "CHKGH123-XCP12"}, { + "id": "RAI1", + "name": "poiuytre-RAI1" + }, {"id": "HPO1", "name": "ATLNGAUP-HPO1"}, {"id": "KJF12", "name": "KJFDH123-KJF12"}, { + "id": "SCC80", + "name": "SAIT9CC3-SCC80" + }, {"id": "SAA12", "name": "SAIT9AF8-SAA12"}, {"id": "SAA14", "name": "SAIT1AA9-SAA14"}, { + "id": "ATL35", + "name": "TTESSAAI-ATL35" + }, {"id": "CWY1", "name": "CWYMOWBS-CWY1"}, {"id": "ATL76", "name": "TELEPAAI-ATL76"}, { + "id": "DSL12", + "name": "DSLFK242-DSL12" + }, {"id": "ATL53", "name": "AAIATLTE-ATL53"}, {"id": "SAA11", "name": "SAIT9AA2-SAA11"}, { + "id": "ATL62", + "name": "TESSASCH-ATL62" + }, {"id": "AUG1", "name": "ASDFGHJK-AUG1"}, {"id": "POI22", "name": "POIUY123-POI22"}, { + "id": "SAA13", + "name": "SAIT1AA9-SAA13" + }, {"id": "BHY17", "name": "BHYTFRF3-BHY17"}, {"id": "LIS1", "name": "HOSTPROF-LIS1"}, { + "id": "SIP1", + "name": "ZXCVBNMK-SIP1" + }, {"id": "ATL99", "name": "TEESTAAI-ATL43"}, {"id": "ATL64", "name": "FORLOAAJ-ATL64"}, { + "id": "TAT33", + "name": "TESAAISA-TAT33" + }, {"id": "RAD10", "name": "INDIPUNE-RAD10"}, {"id": "RTW5", "name": "BHYTFRY4-RTW5"}, { + "id": "JGS1", + "name": "KSJKKKKK-JGS1" + }, {"id": "ATL98", "name": "TEESTAAI-ATL43"}, {"id": "WAN1", "name": "LEIWANGW-WAN1"}, { + "id": "ATL44", + "name": "ATLSANAB-ATL44" + }, {"id": "RTD2", "name": "BHYTFRk4-RTD2"}, {"id": "NIR1", "name": "ORFLMANA-NIR1"}, { + "id": "ATL75", + "name": "SANAAIRE-ATL75" + }, {"id": "NUM1", "name": "QWERTYUI-NUM1"}, {"id": "MTN32", "name": "MDTWNJ21-MTN32"}, { + "id": "RTZ4", + "name": "BHYTFRZ6-RTZ4" + }, {"id": "ATL56", "name": "ATLSANAC-ATL56"}, {"id": "AMS1", "name": "AMSTNLBW-AMS1"}, { + "id": "RCT1", + "name": "AMSTERNL-RCT1" + }, {"id": "JAN1", "name": "ORFLMATT-JAN1"}, {"id": "ABC14", "name": "TESAAISA-ABC14"}, { + "id": "TAT37", + "name": "TESAAISD-TAT37" + }, {"id": "MIC54", "name": "MICHIGAN-MIC54"}, {"id": "ABC11", "name": "ATLSANAI-ABC11"}, { + "id": "AMF11", + "name": "AMDOCS01-AMF11" + }, {"id": "ATL63", "name": "ATLSANEW-ATL63"}, {"id": "ABC12", "name": "ATLSECIA-ABC12"}, { + "id": "MTN20", + "name": "MDTWNJ21-MTN20" + }, {"id": "ABC15", "name": "AAITESAN-ABC15"}, {"id": "AVT1", "name": "AVTRFLHD-AVT1"}, { + "id": "ATL34", + "name": "ATLSANAI-ATL34" + }], + "categoryParameters": { + "owningEntityList": [{ + "id": "aaa1", + "name": "aaa1" + }, {"id": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc", "name": "WayneHolland"}, { + "id": "Melissa", + "name": "Melissa" + }], + "projectList": [{"id": "WATKINS", "name": "WATKINS"}, {"id": "x1", "name": "x1"}, {"id": "yyy1", "name": "yyy1"}], + "lineOfBusinessList": [{"id": "ONAP", "name": "ONAP"}, {"id": "zzz1", "name": "zzz1"}], + "platformList": [{"id": "platform", "name": "platform"}, {"id": "xxx1", "name": "xxx1"}] + }, + "type": "[LCP_REGIONS_AND_TENANTS] Update", + "subscribers": [{ + "id": "CAR_2020_ER", + "name": "CAR_2020_ER", + "isPermitted": true + }, { + "id": "21014aa2-526b-11e6-beb8-9e71128cae77", + "name": "JULIO ERICKSON", + "isPermitted": false + }, { + "id": "DHV1707-TestSubscriber-2", + "name": "DALE BRIDGES", + "isPermitted": false + }, {"id": "DHV1707-TestSubscriber-1", "name": "LLOYD BRIDGES", "isPermitted": false}, { + "id": "jimmy-example", + "name": "JimmyExampleCust-20161102", + "isPermitted": false + }, { + "id": "jimmy-example2", + "name": "JimmyExampleCust-20161103", + "isPermitted": false + }, { + "id": "ERICA5779-TestSub-PWT-102", + "name": "ERICA5779-TestSub-PWT-102", + "isPermitted": false + }, { + "id": "ERICA5779-TestSub-PWT-101", + "name": "ERICA5779-TestSub-PWT-101", + "isPermitted": false + }, { + "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb", + "name": "Emanuel", + "isPermitted": false + }, { + "id": "ERICA5779-Subscriber-4", + "name": "ERICA5779-Subscriber-5", + "isPermitted": false + }, { + "id": "ERICA5779-TestSub-PWT-103", + "name": "ERICA5779-TestSub-PWT-103", + "isPermitted": false + }, { + "id": "ERICA5779-Subscriber-2", + "name": "ERICA5779-Subscriber-2", + "isPermitted": false + }, { + "id": "e433710f-9217-458d-a79d-1c7aff376d89", + "name": "SILVIA ROBBINS", + "isPermitted": true + }, { + "id": "ERICA5779-Subscriber-3", + "name": "ERICA5779-Subscriber-3", + "isPermitted": false + }, {"id": "31739f3e-526b-11e6-beb8-9e71128cae77", "name": "CRAIG/ROBERTS", "isPermitted": false}] + } + }; + } +} + +class MockFeatureFlagsService {} + +describe('Service popup service', () => { + let injector; + let service: ServicePopupService; + let genericFormService: GenericFormService; + let defaultDataGeneratorService: DefaultDataGeneratorService; + let fb: FormBuilder; + let iframeService: IframeService; + + beforeAll(done => (async () => { + TestBed.configureTestingModule({ + providers : [ + ServicePopupService, + BasicControlGenerator, + ServiceControlGenerator, + DefaultDataGeneratorService, + GenericFormService, + FormBuilder, + IframeService, + AaiService, + LogService, + BasicPopupService, + {provide:FeatureFlagsService, useClass: MockFeatureFlagsService}, + {provide: NgRedux, useClass: MockReduxStore}, + {provide: HttpClient, useClass: MockAppStore}, + {provide: SdcUiServices.ModalService, useClass: MockModalService} + ] + }); + await TestBed.compileComponents(); + + injector = getTestBed(); + service = injector.get(ServicePopupService); + genericFormService = injector.get(GenericFormService); + defaultDataGeneratorService = injector.get(DefaultDataGeneratorService); + fb = injector.get(FormBuilder); + iframeService = injector.get(IframeService); + + })().then(done).catch(done.fail)); + + test('getTitle should return the correct title for edit and create mode', () => { + expect(service.getTitle(true)).toBe('Edit service instance'); + expect(service.getTitle(false)).toBe('Set a new service instance'); + }); + + test('getSubLeftTitle should return service model name', () => { + service.uuidData = { + serviceId : '6b528779-44a3-4472-bdff-9cd15ec93450' + }; + expect(service.getSubLeftTitle()).toBe('action-data'); + }); + + test('getSubRightTitle should return popup type', () => { + expect(service.getSubRightTitle()).toBe('Service Instance Details'); + }); + + test('getModelInformation should update modelInformations', () => { + const serviceId: string = '6b528779-44a3-4472-bdff-9cd15ec93450'; + + service.getModelInformation(serviceId); + expect(service.modelInformations.length).toEqual(7); + + expect(service.modelInformations[0].label).toEqual("Model version"); + expect(service.modelInformations[0].values).toEqual(['1.0']); + + expect(service.modelInformations[1].label).toEqual("Description"); + expect(service.modelInformations[1].values).toEqual(['some description']); + + expect(service.modelInformations[2].label).toEqual("Category"); + expect(service.modelInformations[2].values).toEqual(['some category']); + + expect(service.modelInformations[3].label).toEqual("UUID"); + expect(service.modelInformations[3].values).toEqual(['6b528779-44a3-4472-bdff-9cd15ec93450']); + + expect(service.modelInformations[4].label).toEqual("Invariant UUID"); + expect(service.modelInformations[4].values).toEqual(['e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0']); + + expect(service.modelInformations[5].label).toEqual("Service type"); + expect(service.modelInformations[5].values).toEqual(['some service type']); + + expect(service.modelInformations[6].label).toEqual("Service role"); + expect(service.modelInformations[6].values).toEqual(['some service role']); + }); + + + test('onCancel should trigger closeDialogEvent and iframe', () => { + let that = <any>{ + parentElementClassName: 'content', + _iframeService: iframeService, + resetPopupData : () =>{ + + } + }; + jest.spyOn(iframeService, 'removeClassCloseModal'); + jest.spyOn(service.closeDialogEvent, 'next'); + service.onCancel(that, fb.group({})); + + expect(that._iframeService.removeClassCloseModal).toHaveBeenCalledWith(that.parentElementClassName) + expect(service.closeDialogEvent.next).toHaveBeenCalledWith(that); + }); + + + test('getDynamicInputs should return list of controls' ,() => { + const result: FormControlModel[] = service.getDynamicInputs('6b528779-44a3-4472-bdff-9cd15ec93450'); + console.log(result); + expect(result.length).toEqual(4); + expect(result[0].controlName).toEqual('2017488_adiodvpe0_ASN_1'); + expect(result[1].controlName).toEqual('2017488_adiodvpe0_ASN_2'); + expect(result[2].controlName).toEqual('2017488_adiodvpe0_ASN_3'); + expect(result[3].controlName).toEqual('2017488_adiodvpe0_ASN_4'); + + expect(result[0].dataTestId).toEqual('2017488_adiodvpe0_ASN_1'); + expect(result[1].dataTestId).toEqual('2017488_adiodvpe0_ASN_2'); + expect(result[2].dataTestId).toEqual('2017488_adiodvpe0_ASN_3'); + expect(result[3].dataTestId).toEqual('2017488_adiodvpe0_ASN_4'); + + expect(result[0].validations.length).toEqual(1); + expect(result[1].validations.length).toEqual(1); + expect(result[2].validations.length).toEqual(0); + expect(result[3].validations.length).toEqual(1); + }); +}); diff --git a/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/service/service.popup.service.ts b/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/service/service.popup.service.ts new file mode 100644 index 000000000..dc83083cb --- /dev/null +++ b/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/service/service.popup.service.ts @@ -0,0 +1,184 @@ +import {Injectable} from "@angular/core"; +import {GenericPopupInterface} from "../generic-popup.interface"; +import {ServiceModel} from "../../../../models/serviceModel"; +import {ModelInformationItem} from "../../../model-information/model-information.component"; +import {Subject} from "rxjs"; +import {ITreeNode} from "angular-tree-component/dist/defs/api"; +import {FormPopupDetails, PopupType} from "../../../../models/formControlModels/formPopupDetails.model"; +import {BasicControlGenerator} from "../../../genericForm/formControlsServices/basic.control.generator"; +import {IframeService} from "../../../../utils/iframe.service"; +import {DefaultDataGeneratorService} from "../../../../services/defaultDataServiceGenerator/default.data.generator.service"; +import {AaiService} from "../../../../services/aaiService/aai.service"; +import {BasicPopupService} from "../basic.popup.service"; +import {NgRedux} from "@angular-redux/store"; +import {AppState} from "../../../../store/reducers"; +import {ServiceControlGenerator} from "../../../genericForm/formControlsServices/service.control.generator"; +import {FormGroup} from "@angular/forms"; +import {Constants} from "../../../../utils/constants"; +import {ServiceInstance} from "../../../../models/serviceInstance"; +import {ModelInfo} from "../../../../models/modelInfo"; +import {FormControlModel} from "../../../../models/formControlModels/formControl.model"; +import { + ServiceActions, + createServiceInstance, + updateServiceInstance +} from "../../../../storeUtil/utils/service/service.actions"; +import {ServiceInstanceActions} from "../../../../models/serviceInstanceActions"; +import * as _ from 'lodash'; +@Injectable() +export class ServicePopupService implements GenericPopupInterface { + dynamicInputs: any; + instance: any; + model: any; + serviceModel: ServiceModel; + modelInformations: ModelInformationItem[] = []; + uuidData: Object; + closeDialogEvent: Subject<any> = new Subject<any>(); + isUpdateMode: boolean; + + + + constructor(private _basicControlGenerator: BasicControlGenerator, + private _serviceControlGenerator: ServiceControlGenerator, + private _iframeService: IframeService, + private _defaultDataGeneratorService: DefaultDataGeneratorService, + private _aaiService: AaiService, + private _basicPopupService : BasicPopupService, + private _store: NgRedux<AppState>) { + + } + + getGenericFormPopupDetails(serviceId: string, modelName: string, storeKey: string, node: ITreeNode, uuidData: Object, isUpdateMode: boolean): FormPopupDetails { + this.uuidData = uuidData; + this.instance = this.getInstance(serviceId); + this.getModelInformation(serviceId); + return new FormPopupDetails(this, + PopupType.SERVICE, + uuidData, + this.getTitle(isUpdateMode), + this.getSubLeftTitle(), + this.getSubRightTitle(), + this.getControls(serviceId), + this.getDynamicInputs(serviceId), + this.modelInformations, + (that, form: FormGroup) => {that.onSubmit(that, form);}, + (that: any, form: FormGroup) => {that.onCancel(that, form); } + ); + } + + getDynamicInputs(serviceId) : FormControlModel[]{ + let dynamic = this._defaultDataGeneratorService.getArbitraryInputs(this._store.getState().service.serviceHierarchy[serviceId].service.inputs); + return this._basicControlGenerator.getServiceDynamicInputs(dynamic, serviceId); + } + + + getControls(serviceId: string) { + if(this._store.getState().service.serviceHierarchy[serviceId].service.instantiationType === 'Macro') { + return this._serviceControlGenerator.getMacroFormControls(serviceId, this.dynamicInputs); + }else { + return this._serviceControlGenerator.getAlaCartControls(serviceId, this.dynamicInputs); + } + } + + getInstance(serviceId): ServiceInstance { + let result: ServiceInstance = null; + if(!_.isNil(this._store.getState().service.serviceInstance[serviceId])){ + result = this._store.getState().service.serviceInstance[serviceId]; + } + return result; + } + + getModelInformation(serviceId: string): void { + this._aaiService.getServiceModelById(serviceId).subscribe((result: any) => { + this.serviceModel = new ServiceModel(result); + + this.model = this._store.getState().service.serviceHierarchy[serviceId]; + this.modelInformations = [ + new ModelInformationItem("Model version", "modelVersion", [this.serviceModel.version], "", true), + new ModelInformationItem("Description", "description", [this.serviceModel.description]), + new ModelInformationItem("Category", "category", [this.serviceModel.category]), + new ModelInformationItem("UUID", "uuid", [this.serviceModel.uuid], Constants.ServicePopup.TOOLTIP_UUID, true), + new ModelInformationItem("Invariant UUID", "invariantUuid", [this.serviceModel.invariantUuid], Constants.ServicePopup.TOOLTIP_INVARIANT_UUID, true), + new ModelInformationItem("Service type", "serviceType", [this.serviceModel.serviceType]), + new ModelInformationItem("Service role", "serviceRole", [this.serviceModel.serviceRole]) + ]; + }); + } + + getSubLeftTitle(): string { + return this._store.getState().service.serviceHierarchy[this.uuidData['serviceId']].service.name; + } + + getSubRightTitle(): string { + return "Service Instance Details"; + } + + getTitle(isUpdateMode: boolean): string { + return isUpdateMode ? "Edit service instance" : "Set a new service instance"; + } + + onCancel(that, form): void { + form.reset(); + that._iframeService.removeClassCloseModal('content'); + this.closeDialogEvent.next(that); + } + + onSubmit(that, form: FormGroup, ...args): void { + form = that.updateExtraValues(that, form); + that.storeServiceInstance(form.value, args[0], [], new ModelInfo(that.serviceModel), that.serviceModel); + window.parent.postMessage( { + eventId: 'submitIframe', + data: { + serviceModelId: that.serviceModel.uuid + } + }, "*"); + this.onCancel(that, form); + } + + updateExtraValues = (that, form) : any => { + const service = that._store.getState().service; + form.value['bulkSize'] = that.uuidData['bulkSize']; + form.value['instanceParams'] = form.value['instanceParams'] && [form.value['instanceParams']]; + form.value['aicZoneName'] = !_.isNil(form.value['aicZoneId']) ?this.getNameFromListById(service.aicZones, form.value['aicZoneId']) : null; + form.value['owningEntityName'] = !_.isNil(form.value['owningEntityId']) ?this.getNameFromListById(service.categoryParameters.owningEntityList, form.value['owningEntityId']) : null; + form.value['testApi'] = sessionStorage.getItem("msoRequestParametersTestApiValue"); + form.value['tenantName'] = this.getNameFromListById(service.lcpRegionsAndTenants.lcpRegionsTenantsMap[form.value['lcpCloudRegionId']], form.value['tenantId']); + return form; + }; + + getNameFromListById(list, id) { + if(list && id) { + return list.find(item => item.id === id).name; + } + return null; + } + + storeServiceInstance = (formValues:any, servicesQty:number, dynamicInputs:any, serviceModel:ModelInfo, serviceDetails: any ) => { + formValues.bulkSize = this.uuidData['bulkSize']; + formValues.modelInfo = serviceModel; + let instantiationType = this._store.getState().service.serviceHierarchy[serviceModel.modelVersionId].service.instantiationType; + this.setIsALaCarte(formValues, instantiationType); + this.setTestApi(formValues); + Object.assign(formValues, serviceDetails); + let isCreateMode: boolean = this._store.getState().service.serviceInstance[serviceModel.modelVersionId] == null; + if(isCreateMode){ + this._store.dispatch(createServiceInstance(formValues, serviceModel.modelVersionId)); + }else { + this._store.dispatch(updateServiceInstance(formValues, serviceModel.modelVersionId)); + } + + if (this._store.getState().global.flags['FLAG_SETTING_DEFAULTS_IN_DRAWING_BOARD'] && isCreateMode) { + this._defaultDataGeneratorService.updateReduxOnFirstSet(serviceModel.modelVersionId, formValues); + } + }; + + setIsALaCarte = (formValues: any, instantiationType) => { + formValues.isALaCarte = instantiationType === 'A-La-Carte'; + }; + + setTestApi = (formValues: any) =>{ + if (this._store.getState().global.flags['FLAG_ADD_MSO_TESTAPI_FIELD'] && formValues.isAlaCarte) { + formValues.testApi = sessionStorage.getItem("msoRequestParametersTestApiValue"); + } + }; +} diff --git a/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/vfModule/vfModule.popuop.service.spec.ts b/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/vfModule/vfModule.popuop.service.spec.ts new file mode 100644 index 000000000..3794707ab --- /dev/null +++ b/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/vfModule/vfModule.popuop.service.spec.ts @@ -0,0 +1,2407 @@ +import {LogService} from "../../../../utils/log/log.service"; +import {NgRedux} from "@angular-redux/store"; +import {BasicControlGenerator} from "../../../genericForm/formControlsServices/basic.control.generator"; +import {AaiService} from "../../../../services/aaiService/aai.service"; +import {HttpClient} from "@angular/common/http"; +import {GenericFormService} from "../../../genericForm/generic-form.service"; +import {FormBuilder} from "@angular/forms"; +import {IframeService} from "../../../../utils/iframe.service"; +import {DefaultDataGeneratorService} from "../../../../services/defaultDataServiceGenerator/default.data.generator.service"; +import {BasicPopupService} from "../basic.popup.service"; +import {VfModulePopuopService} from "./vfModule.popuop.service"; +import {VfModuleControlGenerator} from "../../../genericForm/formControlsServices/vfModuleGenerator/vfModule.control.generator"; +import {SdcUiServices} from "onap-ui-angular"; +import {FeatureFlagsService} from "../../../../services/featureFlag/feature-flags.service"; +import {getTestBed, TestBed} from "@angular/core/testing"; + +class MockModalService<T> {} + +class MockAppStore<T> {} + +class MockReduxStore<T> { + getState() { + return { + "global": { + "name": null, + "flags": { + "FLAG_NETWORK_TO_ASYNC_INSTANTIATION": false, + "FLAG_SHOW_ASSIGNMENTS": true, + "FLAG_FABRIC_CONFIGURATION_ASSIGNMENTS": true, + "FLAG_UNASSIGN_SERVICE": true, + "FLAG_SHOW_VERIFY_SERVICE": false, + "FLAG_COLLECTION_RESOURCE_SUPPORT": true, + "FLAG_DUPLICATE_VNF": true, + "FLAG_SERVICE_MODEL_CACHE": true, + "FLAG_ADVANCED_PORTS_FILTER": true, + "CREATE_INSTANCE_TEST": false, + "FLAG_SETTING_DEFAULTS_IN_DRAWING_BOARD": false, + "FLAG_REGION_ID_FROM_REMOTE": true, + "FLAG_ASYNC_INSTANTIATION": true, + "FLAG_ASYNC_JOBS": true, + "EMPTY_DRAWING_BOARD_TEST": false, + "FLAG_ADD_MSO_TESTAPI_FIELD": true + }, + "type": "[FLAGS] Update" + }, + "service": { + "serviceHierarchy": { + "6e59c5de-f052-46fa-aa7e-2fca9d674c44": { + "service": { + "uuid": "6e59c5de-f052-46fa-aa7e-2fca9d674c44", + "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0", + "name": "ComplexService", + "version": "1.0", + "toscaModelURL": null, + "category": "Emanuel", + "serviceType": "", + "serviceRole": "", + "description": "ComplexService", + "serviceEcompNaming": "false", + "instantiationType": "Macro", + "inputs": {} + }, + "vnfs": { + "VF_vMee 0": { + "uuid": "d6557200-ecf2-4641-8094-5393ae3aae60", + "invariantUuid": "4160458e-f648-4b30-a176-43881ffffe9e", + "description": "VSP_vMee", + "name": "VF_vMee", + "version": "2.0", + "customizationUuid": "91415b44-753d-494c-926a-456a9172bbb9", + "inputs": {}, + "commands": {}, + "properties": { + "max_instances": 10, + "min_instances": 1, + "gpb2_Internal2_mac": "00:11:22:EF:AC:DF", + "sctp-b-ipv6-egress_src_start_port": "0", + "sctp-a-ipv6-egress_rule_application": "any", + "Internal2_allow_transit": "true", + "sctp-b-IPv6_ethertype": "IPv6", + "sctp-a-egress_rule_application": "any", + "sctp-b-ingress_action": "pass", + "sctp-b-ingress_rule_protocol": "icmp", + "ncb2_Internal1_mac": "00:11:22:EF:AC:DF", + "sctp-b-ipv6-ingress-src_start_port": "0.0", + "ncb1_Internal2_mac": "00:11:22:EF:AC:DF", + "fsb_volume_size_0": "320.0", + "sctp-b-egress_src_addresses": "local", + "sctp-a-ipv6-ingress_ethertype": "IPv4", + "sctp-a-ipv6-ingress-dst_start_port": "0", + "sctp-b-ipv6-ingress_rule_application": "any", + "domain_name": "default-domain", + "sctp-a-ingress_rule_protocol": "icmp", + "sctp-b-egress-src_start_port": "0.0", + "sctp-a-egress_src_addresses": "local", + "sctp-b-display_name": "epc-sctp-b-ipv4v6-sec-group", + "sctp-a-egress-src_start_port": "0.0", + "sctp-a-ingress_ethertype": "IPv4", + "sctp-b-ipv6-ingress-dst_end_port": "65535", + "sctp-b-dst_subnet_prefix_v6": "::", + "nf_naming": "{ecomp_generated_naming=true}", + "sctp-a-ipv6-ingress_src_subnet_prefix": "0.0.0.0", + "sctp-b-egress-dst_start_port": "0.0", + "ncb_flavor_name": "nv.c20r64d1", + "gpb1_Internal1_mac": "00:11:22:EF:AC:DF", + "sctp-b-egress_dst_subnet_prefix_len": "0.0", + "Internal2_net_cidr": "10.0.0.10", + "sctp-a-ingress-dst_start_port": "0.0", + "sctp-a-egress-dst_start_port": "0.0", + "fsb1_Internal2_mac": "00:11:22:EF:AC:DF", + "sctp-a-egress_ethertype": "IPv4", + "vlc_st_service_mode": "in-network-nat", + "sctp-a-ipv6-egress_ethertype": "IPv4", + "sctp-a-egress-src_end_port": "65535.0", + "sctp-b-ipv6-egress_rule_application": "any", + "sctp-b-egress_action": "pass", + "sctp-a-ingress-src_subnet_prefix_len": "0.0", + "sctp-b-ipv6-ingress-src_end_port": "65535.0", + "sctp-b-name": "epc-sctp-b-ipv4v6-sec-group", + "fsb2_Internal1_mac": "00:11:22:EF:AC:DF", + "sctp-a-ipv6-ingress-src_start_port": "0.0", + "sctp-b-ipv6-egress_ethertype": "IPv4", + "Internal1_net_cidr": "10.0.0.10", + "sctp-a-egress_dst_subnet_prefix": "0.0.0.0", + "fsb_flavor_name": "nv.c20r64d1", + "sctp_rule_protocol": "132", + "sctp-b-ipv6-ingress_src_subnet_prefix_len": "0", + "sctp-a-ipv6-ingress_rule_application": "any", + "ecomp_generated_naming": "false", + "sctp-a-IPv6_ethertype": "IPv6", + "vlc2_Internal1_mac": "00:11:22:EF:AC:DF", + "vlc_st_virtualization_type": "virtual-machine", + "sctp-b-ingress-dst_start_port": "0.0", + "sctp-b-ingress-dst_end_port": "65535.0", + "sctp-a-ipv6-ingress-src_end_port": "65535.0", + "sctp-a-display_name": "epc-sctp-a-ipv4v6-sec-group", + "sctp-b-ingress_rule_application": "any", + "int2_sec_group_name": "int2-sec-group", + "vlc_flavor_name": "nd.c16r64d1", + "sctp-b-ipv6-egress_src_addresses": "local", + "vlc_st_interface_type_int1": "other1", + "sctp-b-egress-src_end_port": "65535.0", + "sctp-a-ipv6-egress-dst_start_port": "0", + "vlc_st_interface_type_int2": "other2", + "sctp-a-ipv6-egress_rule_protocol": "any", + "Internal2_shared": "false", + "sctp-a-ipv6-egress_dst_subnet_prefix_len": "0", + "Internal2_rpf": "disable", + "vlc1_Internal1_mac": "00:11:22:EF:AC:DF", + "sctp-b-ipv6-egress_src_end_port": "65535", + "sctp-a-ipv6-egress_src_addresses": "local", + "sctp-a-ingress-dst_end_port": "65535.0", + "sctp-a-ipv6-egress_src_end_port": "65535", + "Internal1_forwarding_mode": "l2", + "Internal2_dhcp": "false", + "sctp-a-dst_subnet_prefix_v6": "::", + "pxe_image_name": "MME_PXE-Boot_16ACP04_GA.qcow2", + "vlc_st_interface_type_gtp": "other0", + "ncb1_Internal1_mac": "00:11:22:EF:AC:DF", + "sctp-b-src_subnet_prefix_v6": "::", + "sctp-a-egress_dst_subnet_prefix_len": "0.0", + "int1_sec_group_name": "int1-sec-group", + "Internal1_dhcp": "false", + "sctp-a-ipv6-egress_dst_end_port": "65535", + "Internal2_forwarding_mode": "l2", + "fsb2_Internal2_mac": "00:11:22:EF:AC:DF", + "sctp-b-egress_dst_subnet_prefix": "0.0.0.0", + "Internal1_net_cidr_len": "17", + "gpb2_Internal1_mac": "00:11:22:EF:AC:DF", + "sctp-b-ingress-src_subnet_prefix_len": "0.0", + "sctp-a-ingress_dst_addresses": "local", + "sctp-a-egress_action": "pass", + "fsb_volume_type_0": "SF-Default-SSD", + "ncb2_Internal2_mac": "00:11:22:EF:AC:DF", + "vlc_st_interface_type_sctp_a": "left", + "vlc_st_interface_type_sctp_b": "right", + "sctp-a-src_subnet_prefix_v6": "::", + "vlc_st_version": "2", + "sctp-b-egress_ethertype": "IPv4", + "sctp-a-ingress_rule_application": "any", + "gpb1_Internal2_mac": "00:11:22:EF:AC:DF", + "instance_ip_family_v6": "v6", + "sctp-a-ipv6-egress_src_start_port": "0", + "sctp-b-ingress-src_start_port": "0.0", + "sctp-b-ingress_dst_addresses": "local", + "fsb1_Internal1_mac": "00:11:22:EF:AC:DF", + "vlc_st_interface_type_oam": "management", + "multi_stage_design": "true", + "oam_sec_group_name": "oam-sec-group", + "Internal2_net_gateway": "10.0.0.10", + "sctp-a-ipv6-ingress-dst_end_port": "65535", + "sctp-b-ipv6-egress-dst_start_port": "0", + "Internal1_net_gateway": "10.0.0.10", + "sctp-b-ipv6-egress_rule_protocol": "any", + "gtp_sec_group_name": "gtp-sec-group", + "sctp-a-ipv6-egress_dst_subnet_prefix": "0.0.0.0", + "sctp-b-ipv6-egress_dst_subnet_prefix_len": "0", + "sctp-a-ipv6-ingress_dst_addresses": "local", + "sctp-a-egress_rule_protocol": "icmp", + "sctp-b-ipv6-egress_action": "pass", + "sctp-a-ipv6-egress_action": "pass", + "Internal1_shared": "false", + "sctp-b-ipv6-ingress_rule_protocol": "any", + "Internal2_net_cidr_len": "17", + "sctp-a-name": "epc-sctp-a-ipv4v6-sec-group", + "sctp-a-ingress-src_end_port": "65535.0", + "sctp-b-ipv6-ingress_src_subnet_prefix": "0.0.0.0", + "sctp-a-egress-dst_end_port": "65535.0", + "sctp-a-ingress_action": "pass", + "sctp-b-egress_rule_protocol": "icmp", + "sctp-b-ipv6-ingress_action": "pass", + "vlc_st_service_type": "firewall", + "sctp-b-ipv6-egress_dst_end_port": "65535", + "sctp-b-ipv6-ingress-dst_start_port": "0", + "vlc2_Internal2_mac": "00:11:22:EF:AC:DF", + "vlc_st_availability_zone": "true", + "fsb_volume_image_name_1": "MME_FSB2_16ACP04_GA.qcow2", + "sctp-b-ingress-src_subnet_prefix": "0.0.0.0", + "sctp-a-ipv6-ingress_src_subnet_prefix_len": "0", + "Internal1_allow_transit": "true", + "gpb_flavor_name": "nv.c20r64d1", + "availability_zone_max_count": "1", + "fsb_volume_image_name_0": "MME_FSB1_16ACP04_GA.qcow2", + "sctp-b-ipv6-ingress_dst_addresses": "local", + "sctp-b-ipv6-egress_dst_subnet_prefix": "0.0.0.0", + "sctp-b-ipv6-ingress_ethertype": "IPv4", + "vlc1_Internal2_mac": "00:11:22:EF:AC:DF", + "sctp-a-ingress-src_subnet_prefix": "0.0.0.0", + "sctp-a-ipv6-ingress_action": "pass", + "Internal1_rpf": "disable", + "sctp-b-ingress_ethertype": "IPv4", + "sctp-b-egress_rule_application": "any", + "sctp-b-ingress-src_end_port": "65535.0", + "sctp-a-ipv6-ingress_rule_protocol": "any", + "sctp-a-ingress-src_start_port": "0.0", + "sctp-b-egress-dst_end_port": "65535.0" + }, + "type": "VF", + "modelCustomizationName": "VF_vMee 0", + "vfModules": { + "vf_vmee0..VfVmee..vmme_vlc..module-1": { + "uuid": "522159d5-d6e0-4c2a-aa44-5a542a12a830", + "invariantUuid": "98a7c88b-b577-476a-90e4-e25a5871e02b", + "customizationUuid": "55b1be94-671a-403e-a26c-667e9c47d091", + "description": null, + "name": "VfVmee..vmme_vlc..module-1", + "version": "2", + "modelCustomizationName": "VfVmee..vmme_vlc..module-1", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "vmme_vlc" + }, + "inputs": {}, + "volumeGroupAllowed": true + }, + "vf_vmee0..VfVmee..vmme_gpb..module-2": { + "uuid": "41708296-e443-4c71-953f-d9a010f059e1", + "invariantUuid": "1cca90b8-3490-495e-87da-3f3e4c57d5b9", + "customizationUuid": "6add59e0-7fe1-4bc4-af48-f8812422ae7c", + "description": null, + "name": "VfVmee..vmme_gpb..module-2", + "version": "2", + "modelCustomizationName": "VfVmee..vmme_gpb..module-2", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "vmme_gpb" + }, + "inputs": {}, + "volumeGroupAllowed": false + }, + "vf_vmee0..VfVmee..base_vmme..module-0": { + "uuid": "a27f5cfc-7f12-4f99-af08-0af9c3885c87", + "invariantUuid": "a6f9e51a-2b35-416a-ae15-15e58d61f36d", + "customizationUuid": "f8c040f1-7e51-4a11-aca8-acf256cfd861", + "description": null, + "name": "VfVmee..base_vmme..module-0", + "version": "2", + "modelCustomizationName": "VfVmee..base_vmme..module-0", + "properties": { + "minCountInstances": 1, + "maxCountInstances": 1, + "initialCount": 1, + "vfModuleLabel": "base_vmme" + }, + "inputs": {}, + "volumeGroupAllowed": true + } + }, + "volumeGroups": { + "vf_vmee0..VfVmee..base_vmme..module-0": { + "uuid": "a27f5cfc-7f12-4f99-af08-0af9c3885c87", + "invariantUuid": "a6f9e51a-2b35-416a-ae15-15e58d61f36d", + "customizationUuid": "f8c040f1-7e51-4a11-aca8-acf256cfd861", + "description": null, + "name": "VfVmee..base_vmme..module-0", + "version": "2", + "modelCustomizationName": "VfVmee..base_vmme..module-0", + "properties": { + "minCountInstances": 1, + "maxCountInstances": 1, + "initialCount": 1, + "vfModuleLabel": "base_vmme" + }, + "inputs": {} + } + }, + "vfcInstanceGroups": {} + } + }, + "networks": { + "ExtVL 0": { + "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986", + "invariantUuid": "379f816b-a7aa-422f-be30-17114ff50b7c", + "description": "ECOMP generic virtual link (network) base type for all other service-level and global networks", + "name": "ExtVL", + "version": "37.0", + "customizationUuid": "94fdd893-4a36-4d70-b16a-ec29c54c184f", + "inputs": {}, + "commands": {}, + "properties": { + "netowrk_role": "role 1, role 2, role 3", + "network_assignments": "{is_external_network=false, ipv4_subnet_default_assignment={min_subnets_count=1}, ecomp_generated_network_assignment=false, ipv6_subnet_default_assignment={min_subnets_count=1}}", + "exVL_naming": "{ecomp_generated_naming=true}", + "network_flows": "{is_network_policy=false, is_bound_to_vpn=false}", + "network_homing": "{ecomp_selected_instance_node_target=false}" + }, + "type": "VL", + "modelCustomizationName": "ExtVL 0" + } + }, + "collectionResource": {}, + "configurations": { + "Port Mirroring Configuration By Policy 0": { + "uuid": "b4398538-e89d-4f13-b33d-ca323434ba50", + "invariantUuid": "6ef0ca40-f366-4897-951f-abd65d25f6f7", + "description": "A port mirroring configuration by policy object", + "name": "Port Mirroring Configuration By Policy", + "version": "27.0", + "customizationUuid": "3c3b7b8d-8669-4b3b-8664-61970041fad2", + "inputs": {}, + "commands": {}, + "properties": {}, + "type": "Configuration", + "modelCustomizationName": "Port Mirroring Configuration By Policy 0", + "sourceNodes": [], + "collectorNodes": null, + "configurationByPolicy": false + } + }, + "serviceProxies": {}, + "vfModules": { + "vf_vmee0..VfVmee..vmme_vlc..module-1": { + "uuid": "522159d5-d6e0-4c2a-aa44-5a542a12a830", + "invariantUuid": "98a7c88b-b577-476a-90e4-e25a5871e02b", + "customizationUuid": "55b1be94-671a-403e-a26c-667e9c47d091", + "description": null, + "name": "VfVmee..vmme_vlc..module-1", + "version": "2", + "modelCustomizationName": "VfVmee..vmme_vlc..module-1", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "vmme_vlc" + }, + "inputs": {}, + "volumeGroupAllowed": true + }, + "vf_vmee0..VfVmee..vmme_gpb..module-2": { + "uuid": "41708296-e443-4c71-953f-d9a010f059e1", + "invariantUuid": "1cca90b8-3490-495e-87da-3f3e4c57d5b9", + "customizationUuid": "6add59e0-7fe1-4bc4-af48-f8812422ae7c", + "description": null, + "name": "VfVmee..vmme_gpb..module-2", + "version": "2", + "modelCustomizationName": "VfVmee..vmme_gpb..module-2", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "vmme_gpb" + }, + "inputs": {}, + "volumeGroupAllowed": false + }, + "vf_vmee0..VfVmee..base_vmme..module-0": { + "uuid": "a27f5cfc-7f12-4f99-af08-0af9c3885c87", + "invariantUuid": "a6f9e51a-2b35-416a-ae15-15e58d61f36d", + "customizationUuid": "f8c040f1-7e51-4a11-aca8-acf256cfd861", + "description": null, + "name": "VfVmee..base_vmme..module-0", + "version": "2", + "modelCustomizationName": "VfVmee..base_vmme..module-0", + "properties": { + "minCountInstances": 1, + "maxCountInstances": 1, + "initialCount": 1, + "vfModuleLabel": "base_vmme" + }, + "inputs": {}, + "volumeGroupAllowed": true + } + }, + "volumeGroups": { + "vf_vmee0..VfVmee..base_vmme..module-0": { + "uuid": "a27f5cfc-7f12-4f99-af08-0af9c3885c87", + "invariantUuid": "a6f9e51a-2b35-416a-ae15-15e58d61f36d", + "customizationUuid": "f8c040f1-7e51-4a11-aca8-acf256cfd861", + "description": null, + "name": "VfVmee..base_vmme..module-0", + "version": "2", + "modelCustomizationName": "VfVmee..base_vmme..module-0", + "properties": { + "minCountInstances": 1, + "maxCountInstances": 1, + "initialCount": 1, + "vfModuleLabel": "base_vmme" + }, + "inputs": {} + } + }, + "pnfs": {} + }, + "6b528779-44a3-4472-bdff-9cd15ec93450": { + "service": { + "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450", + "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0", + "name": "action-data", + "version": "1.0", + "toscaModelURL": null, + "category": "", + "serviceType": "", + "serviceRole": "", + "description": "", + "serviceEcompNaming": "false", + "instantiationType": "A-La-Carte", + "inputs": { + "2017488_adiodvpe0_ASN": { + "type": "string", + "description": "AV/PE", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "AV_vPE" + } + } + }, + "vnfs": { + "2017-388_ADIOD-vPE 1": { + "uuid": "0903e1c0-8e03-4936-b5c2-260653b96413", + "invariantUuid": "00beb8f9-6d39-452f-816d-c709b9cbb87d", + "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM", + "name": "2017-388_ADIOD-vPE", + "version": "1.0", + "customizationUuid": "280dec31-f16d-488b-9668-4aae55d6648a", + "inputs": { + "vnf_config_template_version": { + "type": "string", + "description": "VPE Software Version", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "17.2" + }, + "bandwidth_units": { + "type": "string", + "description": "Units of bandwidth", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "Gbps" + }, + "bandwidth": { + "type": "string", + "description": "Requested VPE bandwidth", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "10" + }, + "AIC_CLLI": { + "type": "string", + "description": "AIC Site CLLI", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "ATLMY8GA" + }, + "ASN": { + "type": "string", + "description": "AV/PE", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "AV_vPE" + }, + "vnf_instance_name": { + "type": "string", + "description": "The hostname assigned to the vpe.", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "mtnj309me6" + } + }, + "commands": { + "vnf_config_template_version": { + "displayName": "vnf_config_template_version", + "command": "get_input", + "inputName": "2017488_adiodvpe0_vnf_config_template_version" + }, + "bandwidth_units": { + "displayName": "bandwidth_units", + "command": "get_input", + "inputName": "adiodvpe0_bandwidth_units" + }, + "bandwidth": {"displayName": "bandwidth", "command": "get_input", "inputName": "adiodvpe0_bandwidth"}, + "AIC_CLLI": { + "displayName": "AIC_CLLI", + "command": "get_input", + "inputName": "2017488_adiodvpe0_AIC_CLLI" + }, + "ASN": {"displayName": "ASN", "command": "get_input", "inputName": "2017488_adiodvpe0_ASN"}, + "vnf_instance_name": { + "displayName": "vnf_instance_name", + "command": "get_input", + "inputName": "2017488_adiodvpe0_vnf_instance_name" + } + }, + "properties": { + "vmxvre_retype": "RE-VMX", + "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version", + "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d", + "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9", + "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF", + "int_ctl_net_name": "VMX-INTXI", + "vmx_int_ctl_prefix": "10.0.0.10", + "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5", + "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279", + "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a", + "nf_type": "vPE", + "vmxvpfe_int_ctl_ip_1": "10.0.0.10", + "is_AVPN_service": "false", + "vmx_RSG_name": "vREXI-affinity", + "vmx_int_ctl_forwarding": "l2", + "vmxvre_oam_ip_0": "10.0.0.10", + "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvpfe_sriov41_0_port_vlanstrip": "false", + "vmxvpfe_sriov42_0_port_vlanfilter": "4001", + "vmxvpfe_sriov44_0_port_unknownunicastallow": "true", + "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2", + "vmxvre_instance": "0", + "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvre_flavor_name": "ns.c1r16d32.v5", + "vmxvpfe_volume_size_0": "40.0", + "vmxvpfe_sriov43_0_port_vlanfilter": "4001", + "nf_naming": "{ecomp_generated_naming=false}", + "nf_naming_code": "Navneet", + "vmxvre_name_0": "vREXI", + "vmxvpfe_sriov42_0_port_vlanstrip": "false", + "vmxvpfe_volume_name_0": "vPFEXI_FBVolume", + "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141", + "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2", + "vmxvpfe_sriov43_0_port_unknownunicastallow": "true", + "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true", + "vmxvre_console": "vidconsole", + "vmxvpfe_sriov44_0_port_vlanfilter": "4001", + "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3", + "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true", + "vmxvpfe_sriov44_0_port_vlanstrip": "false", + "vf_module_id": "123", + "nf_function": "JAI", + "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true", + "vmxvre_int_ctl_ip_0": "10.0.0.10", + "ecomp_generated_naming": "false", + "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI", + "vnf_name": "mtnj309me6vre", + "vmxvpfe_sriov41_0_port_unknownunicastallow": "true", + "vmxvre_volume_type_1": "HITACHI", + "vmxvpfe_sriov44_0_port_broadcastallow": "true", + "vmxvre_volume_type_0": "HITACHI", + "vmxvpfe_volume_type_0": "HITACHI", + "vmxvpfe_sriov43_0_port_broadcastallow": "true", + "bandwidth_units": "get_input:adiodvpe0_bandwidth_units", + "vnf_id": "123", + "vmxvre_oam_prefix": "24", + "availability_zone_0": "mtpocfo-kvm-az01", + "ASN": "get_input:2017488_adiodvpe0_ASN", + "vmxvre_chassis_i2cid": "161", + "vmxvpfe_name_0": "vPFEXI", + "bandwidth": "get_input:adiodvpe0_bandwidth", + "availability_zone_max_count": "1", + "vmxvre_volume_size_0": "45.0", + "vmxvre_volume_size_1": "50.0", + "vmxvpfe_sriov42_0_port_broadcastallow": "true", + "vmxvre_oam_gateway": "10.0.0.10", + "vmxvre_volume_name_1": "vREXI_FAVolume", + "vmxvre_ore_present": "0", + "vmxvre_volume_name_0": "vREXI_FBVolume", + "vmxvre_type": "0", + "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name", + "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true", + "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429", + "vmx_int_ctl_len": "24", + "vmxvpfe_sriov43_0_port_vlanstrip": "false", + "vmxvpfe_sriov41_0_port_broadcastallow": "true", + "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d", + "vmxvpfe_sriov41_0_port_vlanfilter": "4001", + "nf_role": "Testing", + "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a", + "vmxvpfe_sriov42_0_port_unknownunicastallow": "true", + "vmxvpfe_flavor_name": "ns.c20r16d25.v5" + }, + "type": "VF", + "modelCustomizationName": "2017-388_ADIOD-vPE 1", + "vfModules": {}, + "volumeGroups": {}, + "vfcInstanceGroups": {} + }, + "2017-388_ADIOD-vPE 0": { + "uuid": "afacccf6-397d-45d6-b5ae-94c39734b168", + "invariantUuid": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8", + "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM", + "name": "2017-388_ADIOD-vPE", + "version": "4.0", + "customizationUuid": "b3c76f73-eeb5-4fb6-9d31-72a889f1811c", + "inputs": { + "vnf_config_template_version": { + "type": "string", + "description": "VPE Software Version", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "17.2" + }, + "bandwidth_units": { + "type": "string", + "description": "Units of bandwidth", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "Gbps" + }, + "bandwidth": { + "type": "string", + "description": "Requested VPE bandwidth", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "10" + }, + "AIC_CLLI": { + "type": "string", + "description": "AIC Site CLLI", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "ATLMY8GA" + }, + "ASN": { + "type": "string", + "description": "AV/PE", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "AV_vPE" + }, + "vnf_instance_name": { + "type": "string", + "description": "The hostname assigned to the vpe.", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "mtnj309me6" + } + }, + "commands": { + "vnf_config_template_version": { + "displayName": "vnf_config_template_version", + "command": "get_input", + "inputName": "2017488_adiodvpe0_vnf_config_template_version" + }, + "bandwidth_units": { + "displayName": "bandwidth_units", + "command": "get_input", + "inputName": "adiodvpe0_bandwidth_units" + }, + "bandwidth": {"displayName": "bandwidth", "command": "get_input", "inputName": "adiodvpe0_bandwidth"}, + "AIC_CLLI": { + "displayName": "AIC_CLLI", + "command": "get_input", + "inputName": "2017488_adiodvpe0_AIC_CLLI" + }, + "ASN": {"displayName": "ASN", "command": "get_input", "inputName": "2017488_adiodvpe0_ASN"}, + "vnf_instance_name": { + "displayName": "vnf_instance_name", + "command": "get_input", + "inputName": "2017488_adiodvpe0_vnf_instance_name" + } + }, + "properties": { + "vmxvre_retype": "RE-VMX", + "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version", + "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d", + "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9", + "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF", + "int_ctl_net_name": "VMX-INTXI", + "vmx_int_ctl_prefix": "10.0.0.10", + "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5", + "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279", + "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a", + "nf_type": "vPE", + "vmxvpfe_int_ctl_ip_1": "10.0.0.10", + "is_AVPN_service": "false", + "vmx_RSG_name": "vREXI-affinity", + "vmx_int_ctl_forwarding": "l2", + "vmxvre_oam_ip_0": "10.0.0.10", + "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvpfe_sriov41_0_port_vlanstrip": "false", + "vmxvpfe_sriov42_0_port_vlanfilter": "4001", + "vmxvpfe_sriov44_0_port_unknownunicastallow": "true", + "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2", + "vmxvre_instance": "0", + "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvre_flavor_name": "ns.c1r16d32.v5", + "vmxvpfe_volume_size_0": "40.0", + "vmxvpfe_sriov43_0_port_vlanfilter": "4001", + "nf_naming": "{ecomp_generated_naming=false}", + "nf_naming_code": "Navneet", + "vmxvre_name_0": "vREXI", + "vmxvpfe_sriov42_0_port_vlanstrip": "false", + "vmxvpfe_volume_name_0": "vPFEXI_FBVolume", + "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141", + "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2", + "vmxvpfe_sriov43_0_port_unknownunicastallow": "true", + "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true", + "vmxvre_console": "vidconsole", + "vmxvpfe_sriov44_0_port_vlanfilter": "4001", + "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3", + "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true", + "min_instances": "1", + "vmxvpfe_sriov44_0_port_vlanstrip": "false", + "vf_module_id": "123", + "nf_function": "JAI", + "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true", + "vmxvre_int_ctl_ip_0": "10.0.0.10", + "ecomp_generated_naming": "false", + "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI", + "vnf_name": "mtnj309me6vre", + "vmxvpfe_sriov41_0_port_unknownunicastallow": "true", + "vmxvre_volume_type_1": "HITACHI", + "vmxvpfe_sriov44_0_port_broadcastallow": "true", + "vmxvre_volume_type_0": "HITACHI", + "vmxvpfe_volume_type_0": "HITACHI", + "vmxvpfe_sriov43_0_port_broadcastallow": "true", + "bandwidth_units": "get_input:adiodvpe0_bandwidth_units", + "vnf_id": "123", + "vmxvre_oam_prefix": "24", + "availability_zone_0": "mtpocfo-kvm-az01", + "ASN": "get_input:2017488_adiodvpe0_ASN", + "vmxvre_chassis_i2cid": "161", + "vmxvpfe_name_0": "vPFEXI", + "bandwidth": "get_input:adiodvpe0_bandwidth", + "availability_zone_max_count": "1", + "vmxvre_volume_size_0": "45.0", + "vmxvre_volume_size_1": "50.0", + "vmxvpfe_sriov42_0_port_broadcastallow": "true", + "vmxvre_oam_gateway": "10.0.0.10", + "vmxvre_volume_name_1": "vREXI_FAVolume", + "vmxvre_ore_present": "0", + "vmxvre_volume_name_0": "vREXI_FBVolume", + "vmxvre_type": "0", + "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name", + "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true", + "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429", + "vmx_int_ctl_len": "24", + "vmxvpfe_sriov43_0_port_vlanstrip": "false", + "vmxvpfe_sriov41_0_port_broadcastallow": "true", + "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d", + "vmxvpfe_sriov41_0_port_vlanfilter": "4001", + "nf_role": "Testing", + "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a", + "vmxvpfe_sriov42_0_port_unknownunicastallow": "true", + "vmxvpfe_flavor_name": "ns.c20r16d25.v5" + }, + "type": "VF", + "modelCustomizationName": "2017-388_ADIOD-vPE 0", + "vfModules": {}, + "volumeGroups": {}, + "vfcInstanceGroups": {} + }, + "2017-488_ADIOD-vPE 0": { + "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09", + "invariantUuid": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8", + "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM", + "name": "2017-488_ADIOD-vPE", + "version": "5.0", + "customizationUuid": "1da7b585-5e61-4993-b95e-8e6606c81e45", + "inputs": { + "vnf_config_template_version": { + "type": "string", + "description": "VPE Software Version", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "17.2" + }, + "bandwidth_units": { + "type": "string", + "description": "Units of bandwidth", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "Gbps" + }, + "bandwidth": { + "type": "string", + "description": "Requested VPE bandwidth", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "10" + }, + "AIC_CLLI": { + "type": "string", + "description": "AIC Site CLLI", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "ATLMY8GA" + }, + "ASN": { + "type": "string", + "description": "AV/PE", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "AV_vPE" + }, + "vnf_instance_name": { + "type": "string", + "description": "The hostname assigned to the vpe.", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "mtnj309me6" + } + }, + "commands": { + "vnf_config_template_version": { + "displayName": "vnf_config_template_version", + "command": "get_input", + "inputName": "2017488_adiodvpe0_vnf_config_template_version" + }, + "bandwidth_units": { + "displayName": "bandwidth_units", + "command": "get_input", + "inputName": "adiodvpe0_bandwidth_units" + }, + "bandwidth": {"displayName": "bandwidth", "command": "get_input", "inputName": "adiodvpe0_bandwidth"}, + "AIC_CLLI": { + "displayName": "AIC_CLLI", + "command": "get_input", + "inputName": "2017488_adiodvpe0_AIC_CLLI" + }, + "ASN": {"displayName": "ASN", "command": "get_input", "inputName": "2017488_adiodvpe0_ASN"}, + "vnf_instance_name": { + "displayName": "vnf_instance_name", + "command": "get_input", + "inputName": "2017488_adiodvpe0_vnf_instance_name" + } + }, + "properties": { + "vmxvre_retype": "RE-VMX", + "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version", + "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d", + "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9", + "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF", + "int_ctl_net_name": "VMX-INTXI", + "vmx_int_ctl_prefix": "10.0.0.10", + "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5", + "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279", + "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a", + "nf_type": "vPE", + "vmxvpfe_int_ctl_ip_1": "10.0.0.10", + "is_AVPN_service": "false", + "vmx_RSG_name": "vREXI-affinity", + "vmx_int_ctl_forwarding": "l2", + "vmxvre_oam_ip_0": "10.0.0.10", + "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvpfe_sriov41_0_port_vlanstrip": "false", + "vmxvpfe_sriov42_0_port_vlanfilter": "4001", + "vmxvpfe_sriov44_0_port_unknownunicastallow": "true", + "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2", + "vmxvre_instance": "0", + "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvre_flavor_name": "ns.c1r16d32.v5", + "vmxvpfe_volume_size_0": "40.0", + "vmxvpfe_sriov43_0_port_vlanfilter": "4001", + "nf_naming": "{ecomp_generated_naming=false}", + "nf_naming_code": "Navneet", + "vmxvre_name_0": "vREXI", + "vmxvpfe_sriov42_0_port_vlanstrip": "false", + "vmxvpfe_volume_name_0": "vPFEXI_FBVolume", + "max_instances": "3", + "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141", + "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2", + "vmxvpfe_sriov43_0_port_unknownunicastallow": "true", + "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true", + "vmxvre_console": "vidconsole", + "vmxvpfe_sriov44_0_port_vlanfilter": "4001", + "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3", + "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true", + "min_instances": "1", + "vmxvpfe_sriov44_0_port_vlanstrip": "false", + "vf_module_id": "123", + "nf_function": "JAI", + "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true", + "vmxvre_int_ctl_ip_0": "10.0.0.10", + "ecomp_generated_naming": "false", + "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI", + "vnf_name": "mtnj309me6vre", + "vmxvpfe_sriov41_0_port_unknownunicastallow": "true", + "vmxvre_volume_type_1": "HITACHI", + "vmxvpfe_sriov44_0_port_broadcastallow": "true", + "vmxvre_volume_type_0": "HITACHI", + "vmxvpfe_volume_type_0": "HITACHI", + "vmxvpfe_sriov43_0_port_broadcastallow": "true", + "bandwidth_units": "get_input:adiodvpe0_bandwidth_units", + "vnf_id": "123", + "vmxvre_oam_prefix": "24", + "availability_zone_0": "mtpocfo-kvm-az01", + "ASN": "get_input:2017488_adiodvpe0_ASN", + "vmxvre_chassis_i2cid": "161", + "vmxvpfe_name_0": "vPFEXI", + "bandwidth": "get_input:adiodvpe0_bandwidth", + "availability_zone_max_count": "1", + "vmxvre_volume_size_0": "45.0", + "vmxvre_volume_size_1": "50.0", + "vmxvpfe_sriov42_0_port_broadcastallow": "true", + "vmxvre_oam_gateway": "10.0.0.10", + "vmxvre_volume_name_1": "vREXI_FAVolume", + "vmxvre_ore_present": "0", + "vmxvre_volume_name_0": "vREXI_FBVolume", + "vmxvre_type": "0", + "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name", + "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true", + "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429", + "vmx_int_ctl_len": "24", + "vmxvpfe_sriov43_0_port_vlanstrip": "false", + "vmxvpfe_sriov41_0_port_broadcastallow": "true", + "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d", + "vmxvpfe_sriov41_0_port_vlanfilter": "4001", + "nf_role": "Testing", + "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a", + "vmxvpfe_sriov42_0_port_unknownunicastallow": "true", + "vmxvpfe_flavor_name": "ns.c20r16d25.v5" + }, + "type": "VF", + "modelCustomizationName": "2017-488_ADIOD-vPE 0", + "vfModules": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": { + "uuid": "25284168-24bb-4698-8cb4-3f509146eca5", + "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1", + "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vRE_BV" + }, + "inputs": { + "adiodvpe0_bandwidth": { + "type": "string", + "description": "Requested VPE bandwidth", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "bandwidth" + }, + "constraints": null, + "required": true, + "default": "10" + }, + "2017488_adiodvpe0_vnf_instance_name": { + "type": "string", + "description": "The hostname assigned to the vpe.", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "vnf_instance_name" + }, + "constraints": null, + "required": true, + "default": "mtnj309me6" + }, + "2017488_adiodvpe0_vnf_config_template_version": { + "type": "string", + "description": "VPE Software Version", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "vnf_config_template_version" + }, + "constraints": null, + "required": true, + "default": "17.2" + }, + "2017488_adiodvpe0_AIC_CLLI": { + "type": "string", + "description": "AIC Site CLLI", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "AIC_CLLI" + }, + "constraints": null, + "required": true, + "default": "ATLMY8GA" + }, + "adiodvpe0_bandwidth_units": { + "type": "string", + "description": "Units of bandwidth", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "bandwidth_units" + }, + "constraints": null, + "required": true, + "default": "Gbps" + } + }, + "volumeGroupAllowed": true + }, + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": { + "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db", + "invariantUuid": "b34833bb-6aa9-4ad6-a831-70b06367a091", + "customizationUuid": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3", + "description": null, + "name": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0", + "version": "5", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0", + "properties": { + "minCountInstances": 1, + "maxCountInstances": 1, + "initialCount": 1, + "vfModuleLabel": "ADIOD_base_vPE_BV" + }, + "inputs": {}, + "volumeGroupAllowed": false + }, + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": { + "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a", + "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339", + "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vPFE_BV" + }, + "inputs": {}, + "volumeGroupAllowed": true + } + }, + "volumeGroups": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": { + "uuid": "25284168-24bb-4698-8cb4-3f509146eca5", + "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1", + "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vRE_BV" + }, + "inputs": { + "adiodvpe0_bandwidth": { + "type": "string", + "description": "Requested VPE bandwidth", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "bandwidth" + }, + "constraints": null, + "required": true, + "default": "10" + }, + "2017488_adiodvpe0_vnf_instance_name": { + "type": "string", + "description": "The hostname assigned to the vpe.", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "vnf_instance_name" + }, + "constraints": null, + "required": true, + "default": "mtnj309me6" + }, + "2017488_adiodvpe0_vnf_config_template_version": { + "type": "string", + "description": "VPE Software Version", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "vnf_config_template_version" + }, + "constraints": null, + "required": true, + "default": "17.2" + }, + "2017488_adiodvpe0_AIC_CLLI": { + "type": "string", + "description": "AIC Site CLLI", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "AIC_CLLI" + }, + "constraints": null, + "required": true, + "default": "ATLMY8GA" + }, + "adiodvpe0_bandwidth_units": { + "type": "string", + "description": "Units of bandwidth", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "bandwidth_units" + }, + "constraints": null, + "required": true, + "default": "Gbps" + } + } + }, + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": { + "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a", + "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339", + "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vPFE_BV" + }, + "inputs": {} + } + }, + "vfcInstanceGroups": {} + } + }, + "networks": { + "ExtVL 0": { + "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986", + "invariantUuid": "379f816b-a7aa-422f-be30-17114ff50b7c", + "description": "ECOMP generic virtual link (network) base type for all other service-level and global networks", + "name": "ExtVL", + "version": "37.0", + "customizationUuid": "94fdd893-4a36-4d70-b16a-ec29c54c184f", + "inputs": { + "vnf_config_template_version": { + "type": "string", + "description": "VPE Software Version", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "17.2" + }, + "bandwidth_units": { + "type": "string", + "description": "Units of bandwidth", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "Gbps" + }, + "bandwidth": { + "type": "string", + "description": "Requested VPE bandwidth", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "10" + }, + "AIC_CLLI": { + "type": "string", + "description": "AIC Site CLLI", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "ATLMY8GA" + }, + "ASN": { + "type": "string", + "description": "AV/PE", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "AV_vPE" + }, + "vnf_instance_name": { + "type": "string", + "description": "The hostname assigned to the vpe.", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "mtnj309me6" + } + }, + "commands": {}, + "properties": { + "network_role" : "network role 1, network role 2", + "min_instances": 1, + "max_instances": 10, + "network_assignments": "{is_external_network=false, ipv4_subnet_default_assignment={min_subnets_count=1}, ecomp_generated_network_assignment=false, ipv6_subnet_default_assignment={min_subnets_count=1}}", + "exVL_naming": "{ecomp_generated_naming=true}", + "network_flows": "{is_network_policy=false, is_bound_to_vpn=false}", + "network_homing": "{ecomp_selected_instance_node_target=false}" + }, + "type": "VL", + "modelCustomizationName": "ExtVL 0" + } + }, + "collectionResource": {}, + "configurations": {}, + "fabricConfigurations": {}, + "serviceProxies": {}, + "vfModules": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": { + "uuid": "25284168-24bb-4698-8cb4-3f509146eca5", + "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1", + "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vRE_BV" + }, + "inputs": { + "adiodvpe0_bandwidth": { + "type": "string", + "description": "Requested VPE bandwidth", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "bandwidth" + }, + "constraints": null, + "required": true, + "default": "10" + }, + "2017488_adiodvpe0_vnf_instance_name": { + "type": "string", + "description": "The hostname assigned to the vpe.", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "vnf_instance_name" + }, + "constraints": null, + "required": true, + "default": "mtnj309me6" + }, + "2017488_adiodvpe0_vnf_config_template_version": { + "type": "string", + "description": "VPE Software Version", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "vnf_config_template_version" + }, + "constraints": null, + "required": true, + "default": "17.2" + }, + "2017488_adiodvpe0_AIC_CLLI": { + "type": "string", + "description": "AIC Site CLLI", + "entry_schema": null, + "inputProperties": {"sourceType": "HEAT", "vfModuleLabel": "ADIOD_vRE_BV", "paramName": "AIC_CLLI"}, + "constraints": null, + "required": true, + "default": "ATLMY8GA" + }, + "adiodvpe0_bandwidth_units": { + "type": "string", + "description": "Units of bandwidth", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "bandwidth_units" + }, + "constraints": null, + "required": true, + "default": "Gbps" + } + }, + "volumeGroupAllowed": true + }, + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": { + "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db", + "invariantUuid": "b34833bb-6aa9-4ad6-a831-70b06367a091", + "customizationUuid": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3", + "description": null, + "name": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0", + "version": "5", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0", + "properties": { + "minCountInstances": 1, + "maxCountInstances": 1, + "initialCount": 1, + "vfModuleLabel": "ADIOD_base_vPE_BV" + }, + "inputs": {}, + "volumeGroupAllowed": false + }, + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": { + "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a", + "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339", + "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vPFE_BV" + }, + "inputs": {}, + "volumeGroupAllowed": true + } + }, + "volumeGroups": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": { + "uuid": "25284168-24bb-4698-8cb4-3f509146eca5", + "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1", + "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vRE_BV" + }, + "inputs": { + "adiodvpe0_bandwidth": { + "type": "string", + "description": "Requested VPE bandwidth", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "bandwidth" + }, + "constraints": null, + "required": true, + "default": "10" + }, + "2017488_adiodvpe0_vnf_instance_name": { + "type": "string", + "description": "The hostname assigned to the vpe.", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "vnf_instance_name" + }, + "constraints": null, + "required": true, + "default": "mtnj309me6" + }, + "2017488_adiodvpe0_vnf_config_template_version": { + "type": "string", + "description": "VPE Software Version", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "vnf_config_template_version" + }, + "constraints": null, + "required": true, + "default": "17.2" + }, + "2017488_adiodvpe0_AIC_CLLI": { + "type": "string", + "description": "AIC Site CLLI", + "entry_schema": null, + "inputProperties": {"sourceType": "HEAT", "vfModuleLabel": "ADIOD_vRE_BV", "paramName": "AIC_CLLI"}, + "constraints": null, + "required": true, + "default": "ATLMY8GA" + }, + "adiodvpe0_bandwidth_units": { + "type": "string", + "description": "Units of bandwidth", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "bandwidth_units" + }, + "constraints": null, + "required": true, + "default": "Gbps" + } + } + }, + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": { + "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a", + "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339", + "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vPFE_BV" + }, + "inputs": {} + } + }, + "pnfs": {} + } + }, + "serviceInstance": { + "6e59c5de-f052-46fa-aa7e-2fca9d674c44": { + "vnfs": { + "VF_vMee 0": { + "rollbackOnFailure": "true", + "vfModules": { + "vf_vmee0..VfVmee..base_vmme..module-0": { + "vf_vmee0..VfVmee..base_vmme..module-0vmvzo": { + "isMissingData": false, + "sdncPreReload": null, + "modelInfo": { + "modelType": "VFmodule", + "modelInvariantId": "a6f9e51a-2b35-416a-ae15-15e58d61f36d", + "modelVersionId": "a27f5cfc-7f12-4f99-af08-0af9c3885c87", + "modelName": "VfVmee..base_vmme..module-0", + "modelVersion": "2", + "modelCustomizationId": "f8c040f1-7e51-4a11-aca8-acf256cfd861", + "modelCustomizationName": "VfVmee..base_vmme..module-0" + }, + "instanceParams": [{}], + "trackById": "wmtm6sy2uj" + } + } + }, + "isMissingData": true, + "originalName": "VF_vMee 0", + "vnfStoreKey": "VF_vMee 0", + "trackById": "p3wk448m5do", + "uuid": "d6557200-ecf2-4641-8094-5393ae3aae60", + "productFamilyId": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e", + "lcpCloudRegionId": null, + "tenantId": null, + "lineOfBusiness": null, + "platformName": null, + "modelInfo": { + "modelType": "VF", + "modelInvariantId": "4160458e-f648-4b30-a176-43881ffffe9e", + "modelVersionId": "6e59c5de-f052-46fa-aa7e-2fca9d674c44", + "modelName": "VF_vMee", + "modelVersion": "2.0", + "modelCustomizationName": "VF_vMee 0" + } + } + }, + "networks": {}, + "instanceParams": [{}], + "validationCounter": 1, + "existingNames": {}, + "existingVNFCounterMap": {"d6557200-ecf2-4641-8094-5393ae3aae60": 1}, + "globalSubscriberId": "e433710f-9217-458d-a79d-1c7aff376d89", + "subscriptionServiceType": "TYLER SILVIA", + "owningEntityId": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc", + "productFamilyId": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e", + "lcpCloudRegionId": "hvf6", + "tenantId": "229bcdc6eaeb4ca59d55221141d01f8e", + "aicZoneId": "JAG1", + "projectName": "x1", + "rollbackOnFailure": "true", + "bulkSize": 1, + "modelInfo": { + "modelInvariantId": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0", + "modelVersionId": "6e59c5de-f052-46fa-aa7e-2fca9d674c44", + "modelName": "ComplexService", + "modelVersion": "1.0", + "uuid": "6e59c5de-f052-46fa-aa7e-2fca9d674c44" + }, + "isALaCarte": false, + "name": "ComplexService", + "version": "1.0", + "description": "ComplexService", + "category": "Emanuel", + "uuid": "6e59c5de-f052-46fa-aa7e-2fca9d674c44", + "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0", + "serviceType": "", + "serviceRole": "", + "isMultiStepDesign": false + }, + "6b528779-44a3-4472-bdff-9cd15ec93450": { + "networks": { + "ExtVL 0": { + "rollbackOnFailure": "true", + "isMissingData": false, + "originalName": "ExtVL 0", + "networkStoreKey": "ExtVL 0", + "trackById": "sf3zth68xjf", + "productFamilyId": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034", + "lcpCloudRegionId": "hvf6", + "tenantId": "229bcdc6eaeb4ca59d55221141d01f8e", + "platformName": "xxx1", + "lineOfBusiness": "ONAP", + "instanceParams": [{}], + "modelInfo": { + "modelInvariantId": "379f816b-a7aa-422f-be30-17114ff50b7c", + "modelVersionId": "ddc3f20c-08b5-40fd-af72-c6d14636b986", + "modelName": "ExtVL", + "modelVersion": "37.0", + "modelCustomizationId": "94fdd893-4a36-4d70-b16a-ec29c54c184f", + "modelCustomizationName": "ExtVL 0", + "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986" + }, + "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986" + }, + "ExtVL 0:0001": { + "rollbackOnFailure": "true", + "isMissingData": false, + "originalName": "ExtVL 0", + "networkStoreKey": "ExtVL 0", + "trackById": "2mdxioxca9h", + "productFamilyId": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034", + "lcpCloudRegionId": "hvf6", + "tenantId": "229bcdc6eaeb4ca59d55221141d01f8e", + "platformName": "xxx1", + "lineOfBusiness": "ONAP", + "instanceParams": [{}], + "modelInfo": { + "modelInvariantId": "379f816b-a7aa-422f-be30-17114ff50b7c", + "modelVersionId": "ddc3f20c-08b5-40fd-af72-c6d14636b986", + "modelName": "ExtVL", + "modelVersion": "37.0", + "modelCustomizationId": "94fdd893-4a36-4d70-b16a-ec29c54c184f", + "modelCustomizationName": "ExtVL 0", + "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986" + }, + "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986" + }, + "ExtVL 0_1": { + "rollbackOnFailure": "true", + "isMissingData": false, + "originalName": "ExtVL 0", + "networkStoreKey": "ExtVL 0_1", + "trackById": "z7vd1gmpbs", + "instanceName": "ExtVL", + "productFamilyId": "17cc1042-527b-11e6-beb8-9e71128cae77", + "lcpCloudRegionId": "hvf6", + "tenantId": "229bcdc6eaeb4ca59d55221141d01f8e", + "platformName": "xxx1", + "lineOfBusiness": "zzz1", + "instanceParams": [{ + "vnf_config_template_version": "17.2", + "bandwidth_units": "Gbps", + "bandwidth": "10", + "AIC_CLLI": "ATLMY8GA", + "ASN": "AV_vPE", + "vnf_instance_name": "yoav" + }], + "modelInfo": { + "modelInvariantId": "379f816b-a7aa-422f-be30-17114ff50b7c", + "modelVersionId": "ddc3f20c-08b5-40fd-af72-c6d14636b986", + "modelName": "ExtVL", + "modelVersion": "37.0", + "modelCustomizationId": "94fdd893-4a36-4d70-b16a-ec29c54c184f", + "modelCustomizationName": "ExtVL 0", + "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986" + }, + "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986" + } + }, + "vnfs": { + "2017-488_ADIOD-vPE 0": { + "rollbackOnFailure": "true", + "vfModules": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1sgoqi": { + "instanceName": "yoav", + "volumeGroupName": "123", + "modelInfo": { + "modelInvariantId": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1", + "modelVersionId": "25284168-24bb-4698-8cb4-3f509146eca5", + "modelName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "modelVersion": "6", + "modelCustomizationId": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "uuid": "25284168-24bb-4698-8cb4-3f509146eca5" + }, + "uuid": "25284168-24bb-4698-8cb4-3f509146eca5", + "isMissingData": false, + "instanceParams": [{ + "adiodvpe0_bandwidth": "10", + "2017488_adiodvpe0_vnf_instance_name": "mtnj309me6", + "2017488_adiodvpe0_vnf_config_template_version": "17.2", + "2017488_adiodvpe0_AIC_CLLI": "ATLMY8GA", + "adiodvpe0_bandwidth_units": "Gbps" + }] + } + } + }, + "isMissingData": false, + "originalName": "2017-488_ADIOD-vPE 0", + "vnfStoreKey": "2017-488_ADIOD-vPE 0", + "trackById": "o65b26t2thj", + "instanceName": "2017488_ADIODvPE", + "productFamilyId": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034", + "lcpCloudRegionId": "hvf6", + "tenantId": "bae71557c5bb4d5aac6743a4e5f1d054", + "platformName": "platform", + "lineOfBusiness": "ONAP", + "instanceParams": [{}], + "modelInfo": { + "modelInvariantId": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8", + "modelVersionId": "69e09f68-8b63-4cc9-b9ff-860960b5db09", + "modelName": "2017-488_ADIOD-vPE", + "modelVersion": "5.0", + "modelCustomizationId": "1da7b585-5e61-4993-b95e-8e6606c81e45", + "modelCustomizationName": "2017-488_ADIOD-vPE 0", + "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09" + }, + "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09" + } + }, + "instanceParams": [{"2017488_adiodvpe0_ASN": "AV_vPE"}], + "validationCounter": 0, + "existingNames": {"123": "", "instancename": "", "yoav": "", "extvl": ""}, + "existingVNFCounterMap": {"69e09f68-8b63-4cc9-b9ff-860960b5db09": 1}, + "existingNetworksCounterMap": {"ddc3f20c-08b5-40fd-af72-c6d14636b986": 3}, + "instanceName": "InstanceName", + "globalSubscriberId": "e433710f-9217-458d-a79d-1c7aff376d89", + "subscriptionServiceType": "TYLER SILVIA", + "owningEntityId": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc", + "productFamilyId": "17cc1042-527b-11e6-beb8-9e71128cae77", + "lcpCloudRegionId": "JANET25", + "tenantId": "092eb9e8e4b7412e8787dd091bc58e86", + "aicZoneId": "JAG1", + "projectName": null, + "rollbackOnFailure": "true", + "aicZoneName": "YUDFJULP-JAG1", + "owningEntityName": "WayneHolland", + "testApi": "GR_API", + "tenantName": "USP-SIP-IC-24335-T-01", + "bulkSize": 1, + "modelInfo": { + "modelInvariantId": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0", + "modelVersionId": "6b528779-44a3-4472-bdff-9cd15ec93450", + "modelName": "action-data", + "modelVersion": "1.0", + "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450" + }, + "isALaCarte": false, + "name": "action-data", + "version": "1.0", + "description": "", + "category": "", + "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450", + "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0", + "serviceType": "", + "serviceRole": "", + "isMultiStepDesign": false + } + }, + "lcpRegionsAndTenants": { + "lcpRegionList": [{ + "id": "JANET25", + "name": "JANET25", + "isPermitted": true + }, {"id": "hvf6", "name": "hvf6", "isPermitted": true}], + "lcpRegionsTenantsMap": { + "JANET25": [{ + "id": "092eb9e8e4b7412e8787dd091bc58e86", + "name": "USP-SIP-IC-24335-T-01", + "isPermitted": true + }], + "hvf6": [{ + "id": "bae71557c5bb4d5aac6743a4e5f1d054", + "name": "AIN Web Tool-15-D-testalexandria", + "isPermitted": true + }, { + "id": "229bcdc6eaeb4ca59d55221141d01f8e", + "name": "AIN Web Tool-15-D-STTest2", + "isPermitted": true + }, { + "id": "1178612d2b394be4834ad77f567c0af2", + "name": "AIN Web Tool-15-D-SSPtestcustome", + "isPermitted": true + }, { + "id": "19c5ade915eb461e8af52fb2fd8cd1f2", + "name": "AIN Web Tool-15-D-UncheckedEcopm", + "isPermitted": true + }, { + "id": "de007636e25249238447264a988a927b", + "name": "AIN Web Tool-15-D-dfsdf", + "isPermitted": true + }, { + "id": "62f29b3613634ca6a3065cbe0e020c44", + "name": "AIN/SMS-16-D-Multiservices1", + "isPermitted": true + }, { + "id": "649289e30d3244e0b48098114d63c2aa", + "name": "AIN Web Tool-15-D-SSPST66", + "isPermitted": true + }, { + "id": "3f21eeea6c2c486bba31dab816c05a32", + "name": "AIN Web Tool-15-D-ASSPST47", + "isPermitted": true + }, { + "id": "f60ce21d3ee6427586cff0d22b03b773", + "name": "CESAR-100-D-sspjg67246", + "isPermitted": true + }, { + "id": "8774659e425f479895ae091bb5d46560", + "name": "CESAR-100-D-sspjg68359", + "isPermitted": true + }, { + "id": "624eb554b0d147c19ff8885341760481", + "name": "AINWebTool-15-D-iftach", + "isPermitted": true + }, { + "id": "214f55f5fc414c678059c383b03e4962", + "name": "CESAR-100-D-sspjg612401", + "isPermitted": true + }, { + "id": "c90666c291664841bb98e4d981ff1db5", + "name": "CESAR-100-D-sspjg621340", + "isPermitted": true + }, { + "id": "ce5b6bc5c7b348e1bf4b91ac9a174278", + "name": "sspjg621351cloned", + "isPermitted": true + }, { + "id": "b386b768a3f24c8e953abbe0b3488c02", + "name": "AINWebTool-15-D-eteancomp", + "isPermitted": true + }, { + "id": "dc6c4dbfd225474e9deaadd34968646c", + "name": "AINWebTool-15-T-SPFET", + "isPermitted": true + }, { + "id": "02cb5030e9914aa4be120bd9ed1e19eb", + "name": "AINWebTool-15-X-eeweww", + "isPermitted": true + }, { + "id": "f2f3830e4c984d45bcd00e1a04158a79", + "name": "CESAR-100-D-spjg61909", + "isPermitted": true + }, { + "id": "05b91bd5137f4929878edd965755c06d", + "name": "CESAR-100-D-sspjg621512cloned", + "isPermitted": true + }, { + "id": "7002fbe8482d4a989ddf445b1ce336e0", + "name": "AINWebTool-15-X-vdr", + "isPermitted": true + }, { + "id": "4008522be43741dcb1f5422022a2aa0b", + "name": "AINWebTool-15-D-ssasa", + "isPermitted": true + }, { + "id": "f44e2e96a1b6476abfda2fa407b00169", + "name": "AINWebTool-15-D-PFNPT", + "isPermitted": true + }, { + "id": "b69a52bec8a84669a37a1e8b72708be7", + "name": "AINWebTool-15-X-vdre", + "isPermitted": true + }, { + "id": "fac7d9fd56154caeb9332202dcf2969f", + "name": "AINWebTool-15-X-NONPODECOMP", + "isPermitted": true + }, { + "id": "2d34d8396e194eb49969fd61ffbff961", + "name": "DN5242-Nov16-T5", + "isPermitted": true + }, { + "id": "cb42a77ff45b48a8b8deb83bb64acc74", + "name": "ro-T11", + "isPermitted": true + }, { + "id": "fa45ca53c80b492fa8be5477cd84fc2b", + "name": "ro-T112", + "isPermitted": true + }, { + "id": "4914ab0ab3a743e58f0eefdacc1dde77", + "name": "DN5242-Nov21-T1", + "isPermitted": true + }, { + "id": "d0a3e3f2964542259d155a81c41aadc3", + "name": "test-hvf6-09", + "isPermitted": true + }, {"id": "cbb99fe4ada84631b7baf046b6fd2044", "name": "DN5242-Nov16-T3", "isPermitted": true}] + } + }, + "productFamilies": [{ + "id": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034", + "name": "SCOTTIE", + "isPermitted": true + }, { + "id": "17cc1042-527b-11e6-beb8-9e71128cae77", + "name": "IGNACIO", + "isPermitted": true + }, { + "id": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e", + "name": "Christie", + "isPermitted": true + }, { + "id": "a4f6f2ae-9bf5-4ed7-b904-06b2099c4bd7", + "name": "Enhanced Services", + "isPermitted": true + }, {"id": "vTerrance", "name": "vTerrance", "isPermitted": true}, { + "id": "323d69d9-2efe-4r45-ay0a-89ea7ard4e6f", + "name": "vSCP", + "isPermitted": true + }, { + "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb", + "name": "Emanuel", + "isPermitted": true + }, { + "id": "d8a6ed93-251c-47ca-adc9-86671fd19f4c", + "name": "BVOIP", + "isPermitted": true + }, {"id": "db171b8f-115c-4992-a2e3-ee04cae357e0", "name": "LINDSEY", "isPermitted": true}, { + "id": "LRSI-OSPF", + "name": "LRSI-OSPF", + "isPermitted": true + }, {"id": "vRosemarie", "name": "HNGATEWAY", "isPermitted": true}, { + "id": "vHNPaas", + "name": "WILKINS", + "isPermitted": true + }, { + "id": "e433710f-9217-458d-a79d-1c7aff376d89", + "name": "TYLER SILVIA", + "isPermitted": true + }, {"id": "b6a3f28c-eebf-494c-a900-055cc7c874ce", "name": "VROUTER", "isPermitted": true}, { + "id": "Cisneros", + "name": "vMuriel", + "isPermitted": true + }, { + "id": "0ee8c1bc-7cbd-4b0a-a1ac-e9999255abc1", + "name": "CARA Griffin", + "isPermitted": true + }, { + "id": "c7611ebe-c324-48f1-8085-94aef0c6ef3d", + "name": "DARREN MCGEE", + "isPermitted": true + }, {"id": "e30755dc-5673-4b6b-9dcf-9abdd96b93d1", "name": "Transport", "isPermitted": true}, { + "id": "vSalvatore", + "name": "vSalvatore", + "isPermitted": true + }, {"id": "d7bb0a21-66f2-4e6d-87d9-9ef3ced63ae4", "name": "Josefina", "isPermitted": true}, { + "id": "vHubbard", + "name": "vHubbard", + "isPermitted": true + }, {"id": "12a96a9d-4b4c-4349-a950-fe1159602621", "name": "DARREN MCGEE", "isPermitted": true}], + "serviceTypes": { + "e433710f-9217-458d-a79d-1c7aff376d89": [{ + "id": "0", + "name": "vRichardson", + "isPermitted": false + }, {"id": "1", "name": "TYLER SILVIA", "isPermitted": true}, { + "id": "2", + "name": "Emanuel", + "isPermitted": false + }, {"id": "3", "name": "vJamie", "isPermitted": false}, { + "id": "4", + "name": "vVoiceMail", + "isPermitted": false + }, {"id": "5", "name": "Kennedy", "isPermitted": false}, { + "id": "6", + "name": "vSEGW", + "isPermitted": false + }, {"id": "7", "name": "vVM", "isPermitted": false}, { + "id": "8", + "name": "vOTA", + "isPermitted": false + }, {"id": "9", "name": "vMME", "isPermitted": false}, { + "id": "10", + "name": "vMNS", + "isPermitted": false + }, {"id": "11", "name": "vSCP", "isPermitted": false}, { + "id": "12", + "name": "VPMS", + "isPermitted": false + }, {"id": "13", "name": "vMMSC", "isPermitted": false}, { + "id": "14", + "name": "SSD", + "isPermitted": false + }, {"id": "15", "name": "vMOG", "isPermitted": false}, { + "id": "16", + "name": "LINDSEY", + "isPermitted": false + }, {"id": "17", "name": "JOHANNA_SANTOS", "isPermitted": false}, { + "id": "18", + "name": "vCarroll", + "isPermitted": false + }] + }, + "aicZones": [{"id": "NFT1", "name": "NFTJSSSS-NFT1"}, {"id": "JAG1", "name": "YUDFJULP-JAG1"}, { + "id": "YYY1", + "name": "UUUAIAAI-YYY1" + }, {"id": "BAN1", "name": "VSDKYUTP-BAN1"}, {"id": "DKJ1", "name": "DKJSJDKA-DKJ1"}, { + "id": "MCS1", + "name": "ASACMAMS-MCS1" + }, {"id": "UIO1", "name": "uioclli1-UIO1"}, {"id": "RAJ1", "name": "YGBIJNLQ-RAJ1"}, { + "id": "OPA1", + "name": "opaclli1-OPA1" + }, {"id": "SDE1", "name": "ZXCVBNMA-SDE1"}, {"id": "VEN2", "name": "FGHJUHIL-VEN2"}, { + "id": "ORL1", + "name": "ORLDFLMA-ORL1" + }, {"id": "JAD1", "name": "JADECLLI-JAD1"}, {"id": "ZXL1", "name": "LWLWCANN-ZXL1"}, { + "id": "CKL1", + "name": "CLKSKCKK-CKL1" + }, {"id": "SDF1", "name": "sdfclli1-SDF1"}, {"id": "RAD1", "name": "RADICAL1-RAD1"}, { + "id": "KIT1", + "name": "BHYJFGLN-KIT1" + }, {"id": "REL1", "name": "INGERFGT-REL1"}, {"id": "JNL1", "name": "CJALSDAC-JNL1"}, { + "id": "OLK1", + "name": "OLKOLKLS-OLK1" + }, {"id": "CHI1", "name": "CHILLIWE-CHI1"}, {"id": "UUU4", "name": "UUUAAAUU-UUU4"}, { + "id": "TUF1", + "name": "TUFCLLI1-TUF1" + }, {"id": "KJN1", "name": "CKALDKSA-KJN1"}, {"id": "SAM1", "name": "SNDGCA64-SAN1"}, { + "id": "SCK1", + "name": "SCKSCKSK-SCK1" + }, {"id": "HJH1", "name": "AOEEQQQD-HJH1"}, {"id": "HGD1", "name": "SDFQWHGD-HGD1"}, { + "id": "KOR1", + "name": "HYFLNBVT-KOR1" + }, {"id": "ATL43", "name": "AICLOCID-ATL43"}, {"id": "ATL54", "name": "AICFTAAI-ATL54"}, { + "id": "ATL66", + "name": "CLLIAAII-ATL66" + }, {"id": "VEL1", "name": "BNMLKUIK-VEL1"}, {"id": "ICC1", "name": "SANJITAT-ICC1"}, { + "id": "MNT11", + "name": "WSXEFBTH-MNT11" + }, {"id": "DEF2", "name": "WSBHGTYL-DEF2"}, {"id": "MAD11", "name": "SDFQWGKL-MAD11"}, { + "id": "OLG1", + "name": "OLHOLHOL-OLG1" + }, {"id": "GAR1", "name": "NGFVSJKO-GAR1"}, {"id": "SAN22", "name": "GNVLSCTL-SAN22"}, { + "id": "HRG1", + "name": "HRGHRGGS-HRG1" + }, {"id": "JCS1", "name": "JCSJSCJS-JCS1"}, {"id": "DHA12", "name": "WSXEDECF-DHA12"}, { + "id": "HJE1", + "name": "AOEEWWWD-HJE1" + }, {"id": "NCA1", "name": "NCANCANN-NCA1"}, {"id": "IOP1", "name": "iopclli1-IOP1"}, { + "id": "RTY1", + "name": "rtyclli1-RTY1" + }, {"id": "KAP1", "name": "HIOUYTRQ-KAP1"}, {"id": "ZEN1", "name": "ZENCLLI1-ZEN1"}, { + "id": "HKA1", + "name": "JAKHLASS-HKA1" + }, {"id": "CQK1", "name": "CQKSCAKK-CQK1"}, {"id": "SAI1", "name": "UBEKQLPD-SAI1"}, { + "id": "ERT1", + "name": "ertclli1-ERT1" + }, {"id": "IBB1", "name": "PLMKOIJU-IBB1"}, {"id": "TIR2", "name": "PLKINHYI-TIR2"}, { + "id": "HSD1", + "name": "CHASKCDS-HSD1" + }, {"id": "SLF78", "name": "SDCTLFN1-SLF78"}, {"id": "SEE78", "name": "SDCTEEE4-SEE78"}, { + "id": "SAN13", + "name": "TOKYJPFA-SAN13" + }, {"id": "SAA78", "name": "SDCTAAA1-SAA78"}, {"id": "LUC1", "name": "ATLDFGYC-LUC1"}, { + "id": "AMD13", + "name": "MEMATLAN-AMD13" + }, {"id": "TOR1", "name": "TOROONXN-TOR1"}, {"id": "QWE1", "name": "QWECLLI1-QWE1"}, { + "id": "ZOG1", + "name": "ZOGASTRO-ZOG1" + }, {"id": "CAL33", "name": "CALIFORN-CAL33"}, {"id": "SHH78", "name": "SDIT1HHH-SHH78"}, { + "id": "DSA1", + "name": "LKJHGFDS-DSA1" + }, {"id": "CLG1", "name": "CLGRABAD-CLG1"}, {"id": "BNA1", "name": "BNARAGBK-BNA1"}, { + "id": "ATL84", + "name": "CANTTCOC-ATL84" + }, {"id": "APP1", "name": "WBHGTYUI-APP1"}, {"id": "RJN1", "name": "RJNRBZAW-RJN1"}, { + "id": "EHH78", + "name": "SDCSHHH5-EHH78" + }, {"id": "mac10", "name": "PKGTESTF-mac10"}, {"id": "SXB78", "name": "SDCTGXB1-SXB78"}, { + "id": "SAX78", + "name": "SDCTAXG1-SAX78" + }, {"id": "SYD1", "name": "SYDNAUBV-SYD1"}, {"id": "TOK1", "name": "TOKYJPFA-TOK1"}, { + "id": "KGM2", + "name": "KGMTNC20-KGM2" + }, {"id": "DCC1b", "name": "POIUYTGH-DCC1b"}, {"id": "SKK78", "name": "SDCTKKK1-SKK78"}, { + "id": "SGG78", + "name": "SDCTGGG1-SGG78" + }, {"id": "SJJ78", "name": "SDCTJJJ1-SJJ78"}, {"id": "SBX78", "name": "SDCTBXG1-SBX78"}, { + "id": "LAG1", + "name": "LARGIZON-LAG1" + }, {"id": "IAA1", "name": "QAZXSWED-IAA1"}, {"id": "POI1", "name": "PLMNJKIU-POI1"}, { + "id": "LAG1a", + "name": "LARGIZON-LAG1a" + }, {"id": "PBL1", "name": "PBLAPBAI-PBL1"}, {"id": "LAG45", "name": "LARGIZON-LAG1a"}, { + "id": "MAR1", + "name": "MNBVCXZM-MAR1" + }, {"id": "HST70", "name": "HSTNTX70-HST70"}, {"id": "DCC1a", "name": "POIUYTGH-DCC1a"}, { + "id": "TOL1", + "name": "TOLDOH21-TOL1" + }, {"id": "LON1", "name": "LONEENCO-LON1"}, {"id": "SJU78", "name": "SDIT1JUB-SJU78"}, { + "id": "STN27", + "name": "HSTNTX01-STN27" + }, {"id": "SSW56", "name": "ss8126GT-SSW56"}, {"id": "SBB78", "name": "SDIT1BBB-SBB78"}, { + "id": "DCC3", + "name": "POIUYTGH-DCC3" + }, {"id": "GNV1", "name": "GNVLSCTL-GNV1"}, {"id": "WAS1", "name": "WASHDCSW-WAS1"}, { + "id": "TOY1", + "name": "TORYONNZ-TOY1" + }, {"id": "STT1", "name": "STTLWA02-STT1"}, {"id": "STG1", "name": "STTGGE62-STG1"}, { + "id": "SLL78", + "name": "SDCTLLL1-SLL78" + }, {"id": "SBU78", "name": "SDIT1BUB-SBU78"}, {"id": "ATL2", "name": "ATLNGANW-ATL2"}, { + "id": "BOT1", + "name": "BOTHWAKY-BOT1" + }, {"id": "SNG1", "name": "SNGPSIAU-SNG1"}, {"id": "NYC1", "name": "NYCMNY54-NYC1"}, { + "id": "LAG1b", + "name": "LARGIZON-LAG1b" + }, {"id": "AMD15", "name": "AMDFAA01-AMD15"}, {"id": "SNA1", "name": "SNANTXCA-SNA1"}, { + "id": "PLT1", + "name": "PLTNCA60-PLT1" + }, {"id": "TLP1", "name": "TLPNXM18-TLP1"}, {"id": "SDD81", "name": "SAIT1DD6-SDD81"}, { + "id": "DCC1", + "name": "POIUYTGH-DCC1" + }, {"id": "DCC2", "name": "POIUYTGH-DCC2"}, {"id": "OKC1", "name": "OKCBOK55-OKC1"}, { + "id": "PAR1", + "name": "PARSFRCG-PAR1" + }, {"id": "TES36", "name": "ABCEETES-TES36"}, {"id": "COM1", "name": "PLMKOPIU-COM1"}, { + "id": "ANI1", + "name": "ATLNGTRE-ANI1" + }, {"id": "SDG78", "name": "SDIT1BDG-SDG78"}, {"id": "mac20", "name": "PKGTESTF-mac20"}, { + "id": "DSF45", + "name": "DSFBG123-DSF45" + }, {"id": "HST25", "name": "HSTNTX01-HST25"}, {"id": "AMD18", "name": "AUDIMA01-AMD18"}, { + "id": "SAA80", + "name": "SAIT9AA3-SAA80" + }, {"id": "SSA56", "name": "SSIT2AA7-SSA56"}, {"id": "SDD82", "name": "SAIT1DD9-SDD82"}, { + "id": "JCV1", + "name": "JCVLFLBW-JCV1" + }, {"id": "SUL2", "name": "WERTYUJK-SUL2"}, {"id": "PUR1", "name": "purelyde-PUR1"}, { + "id": "FDE55", + "name": "FDERT555-FDE55" + }, {"id": "SITE", "name": "LONEENCO-SITE"}, {"id": "ATL1", "name": "ATLNGAMA-ATL1"}, { + "id": "JUL1", + "name": "ZXCVBNMM-JUL1" + }, {"id": "TAT34", "name": "TESAAISB-TAT34"}, {"id": "XCP12", "name": "CHKGH123-XCP12"}, { + "id": "RAI1", + "name": "poiuytre-RAI1" + }, {"id": "HPO1", "name": "ATLNGAUP-HPO1"}, {"id": "KJF12", "name": "KJFDH123-KJF12"}, { + "id": "SCC80", + "name": "SAIT9CC3-SCC80" + }, {"id": "SAA12", "name": "SAIT9AF8-SAA12"}, {"id": "SAA14", "name": "SAIT1AA9-SAA14"}, { + "id": "ATL35", + "name": "TTESSAAI-ATL35" + }, {"id": "CWY1", "name": "CWYMOWBS-CWY1"}, {"id": "ATL76", "name": "TELEPAAI-ATL76"}, { + "id": "DSL12", + "name": "DSLFK242-DSL12" + }, {"id": "ATL53", "name": "AAIATLTE-ATL53"}, {"id": "SAA11", "name": "SAIT9AA2-SAA11"}, { + "id": "ATL62", + "name": "TESSASCH-ATL62" + }, {"id": "AUG1", "name": "ASDFGHJK-AUG1"}, {"id": "POI22", "name": "POIUY123-POI22"}, { + "id": "SAA13", + "name": "SAIT1AA9-SAA13" + }, {"id": "BHY17", "name": "BHYTFRF3-BHY17"}, {"id": "LIS1", "name": "HOSTPROF-LIS1"}, { + "id": "SIP1", + "name": "ZXCVBNMK-SIP1" + }, {"id": "ATL99", "name": "TEESTAAI-ATL43"}, {"id": "ATL64", "name": "FORLOAAJ-ATL64"}, { + "id": "TAT33", + "name": "TESAAISA-TAT33" + }, {"id": "RAD10", "name": "INDIPUNE-RAD10"}, {"id": "RTW5", "name": "BHYTFRY4-RTW5"}, { + "id": "JGS1", + "name": "KSJKKKKK-JGS1" + }, {"id": "ATL98", "name": "TEESTAAI-ATL43"}, {"id": "WAN1", "name": "LEIWANGW-WAN1"}, { + "id": "ATL44", + "name": "ATLSANAB-ATL44" + }, {"id": "RTD2", "name": "BHYTFRk4-RTD2"}, {"id": "NIR1", "name": "ORFLMANA-NIR1"}, { + "id": "ATL75", + "name": "SANAAIRE-ATL75" + }, {"id": "NUM1", "name": "QWERTYUI-NUM1"}, {"id": "MTN32", "name": "MDTWNJ21-MTN32"}, { + "id": "RTZ4", + "name": "BHYTFRZ6-RTZ4" + }, {"id": "ATL56", "name": "ATLSANAC-ATL56"}, {"id": "AMS1", "name": "AMSTNLBW-AMS1"}, { + "id": "RCT1", + "name": "AMSTERNL-RCT1" + }, {"id": "JAN1", "name": "ORFLMATT-JAN1"}, {"id": "ABC14", "name": "TESAAISA-ABC14"}, { + "id": "TAT37", + "name": "TESAAISD-TAT37" + }, {"id": "MIC54", "name": "MICHIGAN-MIC54"}, {"id": "ABC11", "name": "ATLSANAI-ABC11"}, { + "id": "AMF11", + "name": "AMDOCS01-AMF11" + }, {"id": "ATL63", "name": "ATLSANEW-ATL63"}, {"id": "ABC12", "name": "ATLSECIA-ABC12"}, { + "id": "MTN20", + "name": "MDTWNJ21-MTN20" + }, {"id": "ABC15", "name": "AAITESAN-ABC15"}, {"id": "AVT1", "name": "AVTRFLHD-AVT1"}, { + "id": "ATL34", + "name": "ATLSANAI-ATL34" + }], + "categoryParameters": { + "owningEntityList": [{ + "id": "aaa1", + "name": "aaa1" + }, {"id": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc", "name": "WayneHolland"}, { + "id": "Melissa", + "name": "Melissa" + }], + "projectList": [{"id": "WATKINS", "name": "WATKINS"}, {"id": "x1", "name": "x1"}, {"id": "yyy1", "name": "yyy1"}], + "lineOfBusinessList": [{"id": "ONAP", "name": "ONAP"}, {"id": "zzz1", "name": "zzz1"}], + "platformList": [{"id": "platform", "name": "platform"}, {"id": "xxx1", "name": "xxx1"}] + }, + "type": "[LCP_REGIONS_AND_TENANTS] Update", + "subscribers": [{ + "id": "CAR_2020_ER", + "name": "CAR_2020_ER", + "isPermitted": true + }, { + "id": "21014aa2-526b-11e6-beb8-9e71128cae77", + "name": "JULIO ERICKSON", + "isPermitted": false + }, { + "id": "DHV1707-TestSubscriber-2", + "name": "DALE BRIDGES", + "isPermitted": false + }, {"id": "DHV1707-TestSubscriber-1", "name": "LLOYD BRIDGES", "isPermitted": false}, { + "id": "jimmy-example", + "name": "JimmyExampleCust-20161102", + "isPermitted": false + }, { + "id": "jimmy-example2", + "name": "JimmyExampleCust-20161103", + "isPermitted": false + }, { + "id": "ERICA5779-TestSub-PWT-102", + "name": "ERICA5779-TestSub-PWT-102", + "isPermitted": false + }, { + "id": "ERICA5779-TestSub-PWT-101", + "name": "ERICA5779-TestSub-PWT-101", + "isPermitted": false + }, { + "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb", + "name": "Emanuel", + "isPermitted": false + }, { + "id": "ERICA5779-Subscriber-4", + "name": "ERICA5779-Subscriber-5", + "isPermitted": false + }, { + "id": "ERICA5779-TestSub-PWT-103", + "name": "ERICA5779-TestSub-PWT-103", + "isPermitted": false + }, { + "id": "ERICA5779-Subscriber-2", + "name": "ERICA5779-Subscriber-2", + "isPermitted": false + }, { + "id": "e433710f-9217-458d-a79d-1c7aff376d89", + "name": "SILVIA ROBBINS", + "isPermitted": true + }, { + "id": "ERICA5779-Subscriber-3", + "name": "ERICA5779-Subscriber-3", + "isPermitted": false + }, {"id": "31739f3e-526b-11e6-beb8-9e71128cae77", "name": "CRAIG/ROBERTS", "isPermitted": false}] + } + }; + } +} + +class MockFeatureFlagsService {} + +describe('VFModule popup service', () => { + let injector; + let service: VfModulePopuopService; + let genericFormService: GenericFormService + let defaultDataGeneratorService: DefaultDataGeneratorService; + let fb: FormBuilder; + let iframeService: IframeService; + + beforeAll(done => (async () => { + TestBed.configureTestingModule({ + providers : [ + VfModulePopuopService, + BasicControlGenerator, + VfModuleControlGenerator, + DefaultDataGeneratorService, + GenericFormService, + FormBuilder, + IframeService, + AaiService, + LogService, + BasicPopupService, + {provide:FeatureFlagsService, useClass: MockFeatureFlagsService}, + {provide: NgRedux, useClass: MockReduxStore}, + {provide: HttpClient, useClass: MockAppStore}, + {provide: SdcUiServices.ModalService, useClass: MockModalService} + ] + }); + await TestBed.compileComponents(); + + injector = getTestBed(); + service = injector.get(VfModulePopuopService); + genericFormService = injector.get(GenericFormService); + defaultDataGeneratorService = injector.get(DefaultDataGeneratorService); + fb = injector.get(FormBuilder); + iframeService = injector.get(IframeService); + + })().then(done).catch(done.fail)); + + test('getTitle should return the correct title for edit and create mode', () => { + expect(service.getTitle(true)).toBe('Edit Module (Heat stack)'); + expect(service.getTitle(false)).toBe('Set new Module (Heat stack)'); + }); + + test('getInstance should return new VfModuleInstance', () => { + const serviceId : string = '6b528779-44a3-4472-bdff-9cd15ec93450'; + const vnfStoreKey = null; + const vfModuleStoreKey = "VF_vMee 0"; + let VfModuleInstance ; + VfModuleInstance = service.getInstance(serviceId, vnfStoreKey, vfModuleStoreKey); + expect (VfModuleInstance).toBeDefined(); + }); + + test('getSubLeftTitle should return network model name', () => { + service.model = { + 'name' : 'Model name' + }; + expect(service.getSubLeftTitle()).toBe('Model name'); + }); + + test('getSubRightTitle should return popup type', () => { + expect(service.getSubRightTitle()).toBe('Module (Heat stack) Instance Details'); + }); + + test('getModelInformation should update modelInformations', () => { + const serviceId: string = '6b528779-44a3-4472-bdff-9cd15ec93450'; + const vfModuleModelName: string = '2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1'; + + service.getModelInformation(serviceId, vfModuleModelName); + expect(service.modelInformations.length).toEqual(15); + expect(service.modelInformations[0].label).toEqual("Subscriber Name"); + expect(service.modelInformations[0].values).toEqual(['SILVIA ROBBINS']); + + expect(service.modelInformations[1].label).toEqual("Service Name"); + expect(service.modelInformations[1].values).toEqual(['action-data']); + + expect(service.modelInformations[2].label).toEqual("Service Instance Name"); + expect(service.modelInformations[2].values).toEqual(['InstanceName']); + + expect(service.modelInformations[3].label).toEqual("Model Name"); + expect(service.modelInformations[3].values).toEqual(['2017488AdiodVpe..ADIOD_vRE_BV..module-1']); + + expect(service.modelInformations[4].label).toEqual("Model version"); + expect(service.modelInformations[4].values).toEqual(['6']); + + expect(service.modelInformations[5].label).toEqual("Description"); + expect(service.modelInformations[5].values).toEqual([null]); + + expect(service.modelInformations[6].label).toEqual("Category"); + expect(service.modelInformations[6].values).toEqual([undefined]); + + expect(service.modelInformations[7].label).toEqual("Sub Category"); + expect(service.modelInformations[7].values).toEqual([undefined]); + + expect(service.modelInformations[8].label).toEqual("UUID"); + expect(service.modelInformations[8].values).toEqual(['25284168-24bb-4698-8cb4-3f509146eca5']); + + expect(service.modelInformations[9].label).toEqual("Invariant UUID"); + expect(service.modelInformations[9].values).toEqual(['7253ff5c-97f0-4b8b-937c-77aeb4d79aa1']); + + expect(service.modelInformations[10].label).toEqual("Service type"); + expect(service.modelInformations[10].values).toEqual(['']); + + expect(service.modelInformations[11].label).toEqual("Service role"); + expect(service.modelInformations[11].values).toEqual(['']); + + expect(service.modelInformations[12].label).toEqual("Minimum to instantiate"); + expect(service.modelInformations[12].values).toEqual(['0']); + + expect(service.modelInformations[13].label).toEqual("Maximum to instantiate"); + expect(service.modelInformations[13].values).toEqual(['1']); + }); + + + test('onCancel should trigger closeDialogEvent and iframe', () => { + let that = <any>{ + parentElementClassName: 'content', + _iframeService: iframeService + }; + jest.spyOn(iframeService, 'removeClassCloseModal'); + jest.spyOn(service.closeDialogEvent, 'next'); + + service.onCancel(that, fb.group({})); + + expect(that._iframeService.removeClassCloseModal).toHaveBeenCalledWith(that.parentElementClassName) + expect(service.closeDialogEvent.next).toHaveBeenCalledWith(that); + }); + + test('onSubmit should trigger onCancel', () => { + let that = <any>{ + parentElementClassName: 'content', + _iframeService: iframeService, + storeVFModule: () => { + }, + serviceModel: { + uuid: 'someUUID' + } + }; + let form = fb.group({}); + jest.spyOn(service, 'onCancel'); + jest.spyOn(that, 'storeVFModule'); + jest.spyOn(window.parent, 'postMessage'); + + service.onSubmit(that, form); + + expect(service.onCancel).toHaveBeenCalledWith(that, form); + expect(that.storeVFModule).toHaveBeenCalledWith(that, form.value); + expect(window.parent.postMessage).toHaveBeenCalledWith({ + eventId: 'submitIframe', + data: { + serviceModelId: 'someUUID' + } + }, "*"); + }); +}); diff --git a/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/vfModule/vfModule.popuop.service.ts b/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/vfModule/vfModule.popuop.service.ts new file mode 100644 index 000000000..7563f1d2a --- /dev/null +++ b/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/vfModule/vfModule.popuop.service.ts @@ -0,0 +1,184 @@ +import {Injectable} from "@angular/core"; +import {FormPopupDetails, PopupType} from "../../../../models/formControlModels/formPopupDetails.model"; +import {BasicControlGenerator} from "../../../genericForm/formControlsServices/basic.control.generator"; +import {AppState} from "../../../../store/reducers"; +import {NgRedux} from "@angular-redux/store"; +import {ITreeNode} from "angular-tree-component/dist/defs/api"; +import {ModelInformationItem} from "../../../model-information/model-information.component"; +import {Constants} from "../../../../utils/constants"; +import {AaiService} from "../../../../services/aaiService/aai.service"; +import {ServiceModel} from "../../../../models/serviceModel"; +import {FormGroup} from "@angular/forms"; +import {ModelInfo} from "../../../../models/modelInfo"; +import {IframeService} from "../../../../utils/iframe.service"; +import {GenericPopupInterface} from "../generic-popup.interface"; +import {Subject} from "rxjs/Subject"; +import {DefaultDataGeneratorService} from "../../../../services/defaultDataServiceGenerator/default.data.generator.service"; +import {BasicPopupService} from "../basic.popup.service"; +import {VfModuleInstance} from "../../../../models/vfModuleInstance"; +import {VfModuleControlGenerator} from "../../../genericForm/formControlsServices/vfModuleGenerator/vfModule.control.generator"; +import {FormControlModel} from "../../../../models/formControlModels/formControl.model"; +import * as _ from 'lodash'; +import {createVFModuleInstance, updateVFModuleInstance} from "../../../../storeUtil/utils/vfModule/vfModule.actions"; + +@Injectable() +export class VfModulePopuopService implements GenericPopupInterface { + dynamicInputs: any; + instance: any; + model: any; + serviceModel: ServiceModel; + modelInformations: ModelInformationItem[] = []; + uuidData: Object; + closeDialogEvent: Subject<any> = new Subject<any>(); + isUpdateMode: boolean; + + + constructor(private _basicControlGenerator: BasicControlGenerator, + private _vfModuleControlGenerator: VfModuleControlGenerator, + private _iframeService: IframeService, + private _defaultDataGeneratorService: DefaultDataGeneratorService, + private _aaiService: AaiService, + private _basicPopupService : BasicPopupService, + private _store: NgRedux<AppState>) { + + } + + getInstance(serviceId: string, vnfStoreKey: string, vfModuleStoreKey: string): any { + if (_.isNil(vnfStoreKey) || _.isNil(vfModuleStoreKey)) { + return new VfModuleInstance(); + } + const vfModules = this._store.getState().service.serviceInstance[serviceId].vnfs[vnfStoreKey].vfModules; + return vfModules[this.uuidData['modelName']][vfModuleStoreKey]; + } + + getDynamicInputs(UUIDData : Object) : FormControlModel[]{ + let dynamic = this._defaultDataGeneratorService.getArbitraryInputs(this._store.getState().service.serviceHierarchy[UUIDData['serviceId']].vfModules[UUIDData['modelName']].inputs); + return this.getVFModuleDynamicInputs(dynamic, UUIDData); + } + + getVFModuleDynamicInputs(dynamicInputs : any, UUIDData : Object) : FormControlModel[] { + let result : FormControlModel[] = []; + if(dynamicInputs) { + let vfModuleInstance = null; + if (_.has(this._store.getState().service.serviceInstance[UUIDData['serviceId']].vnfs, UUIDData['vnfStoreKey']) && + _.has(this._store.getState().service.serviceInstance[UUIDData['serviceId']].vnfs[UUIDData['vnfStoreKey']].vfModules, UUIDData['modelName'])) { + vfModuleInstance = Object.assign({},this._store.getState().service.serviceInstance[UUIDData['serviceId']].vnfs[UUIDData['vnfStoreKey']].vfModules[UUIDData['modelName']][UUIDData['vfModuleStoreKey']]); + } + result = this._basicControlGenerator.getDynamicInputs(dynamicInputs, vfModuleInstance); + } + return result; + } + + + getGenericFormPopupDetails(serviceId: string, vnfStoreKey: string, vfModuleStoreKey: string, node: ITreeNode, uuidData: Object, isUpdateMode: boolean): FormPopupDetails { + + this.uuidData = uuidData; + this.instance = this.getInstance(serviceId, vnfStoreKey, vfModuleStoreKey); + this.getModelInformation(serviceId, uuidData['modelName']); + + return new FormPopupDetails(this, + PopupType.VFMODULE, + uuidData, + this.getTitle(isUpdateMode), + this.getSubLeftTitle(), + this.getSubRightTitle(), + this.getControls(serviceId, vnfStoreKey, vfModuleStoreKey, isUpdateMode), + this.getDynamicInputs(uuidData), + this.modelInformations, + (that, form: FormGroup) => {that.onSubmit(that, form);}, + (that: any, form: FormGroup) => {that.onCancel(that, form); } + ); + } + + getModelInformation(serviceId: string, modelName: string) { + this._aaiService.getServiceModelById(serviceId).subscribe((result: any) => { + this.serviceModel = new ServiceModel(result); + + this.model = this._basicPopupService.getModelFromResponse(result, 'vfModules', modelName); + const serviceInstance = this._store.getState().service.serviceInstance[serviceId]; + this.modelInformations = [ + new ModelInformationItem("Subscriber Name", "subscriberName", [this._basicPopupService.extractSubscriberNameBySubscriberId(serviceInstance.globalSubscriberId)], "", true), + new ModelInformationItem("Service Name", "serviceModelName", [this.serviceModel.name], "", true), + new ModelInformationItem("Service Instance Name", "serviceName", [serviceInstance.instanceName], "", false), + new ModelInformationItem("Model Name", "modelName", [this.model.name], "", true), + new ModelInformationItem("Model version", "modelVersion", [this.model.version], "", true), + new ModelInformationItem("Description", "description", [this.model.description]), + new ModelInformationItem("Category", "category", [this.model.category]), + new ModelInformationItem("Sub Category", "subCategory", [this.model.subCategory]), + new ModelInformationItem("UUID", "uuid", [this.model.uuid], Constants.ServicePopup.TOOLTIP_UUID, true), + new ModelInformationItem("Invariant UUID", "invariantUuid", [this.model.invariantUuid], Constants.ServicePopup.TOOLTIP_INVARIANT_UUID, true), + new ModelInformationItem("Service type", "serviceType", [this.serviceModel.serviceType]), + new ModelInformationItem("Service role", "serviceRole", [this.serviceModel.serviceRole]), + new ModelInformationItem("Minimum to instantiate", "min", this.model.min == undefined ? ['0'] : [this.model.min.toString()], "", true), + new ModelInformationItem("Maximum to instantiate", "max", this.model.max == undefined ? ['1'] : [this.model.max.toString()], "", true), + new ModelInformationItem("Recommended to instantiate", "initial", [this.model.initial]) + ]; + }); + } + + getControls(serviceId: string, vnfStoreKey: string, vfModuleStoreKey: string, isUpdateMode: boolean) { + if (this._store.getState().service.serviceHierarchy[serviceId].service.instantiationType === 'Macro') { + return this._vfModuleControlGenerator.getMacroFormControls(serviceId, vnfStoreKey, vfModuleStoreKey, this.uuidData, isUpdateMode); + } else { + return this._vfModuleControlGenerator.getAlaCarteFormControls(serviceId, vnfStoreKey, vfModuleStoreKey, this.uuidData, isUpdateMode); + } + } + + + onSubmit(that, form: FormGroup) { + form.value['instanceParams'] = form.value['instanceParams'] && [form.value['instanceParams']]; + if (!_.isNil(form.controls['supplementaryFile_hidden_content']) && form.controls['supplementaryFile_hidden_content'].value) { + form.value['supplementaryFileContent'] = JSON.parse(form.controls['supplementaryFile_hidden_content'].value); + if (!_.isNil(form.controls['supplementaryFile_hidden'].value)) { + form.value['supplementaryFileName'] = form.controls['supplementaryFile_hidden'].value.name; + } + else { + form.value['supplementaryFileName'] = that.instance.supplementaryFileName; + } + } + else { + delete form.value['supplementaryFileContent']; + delete form.value['supplementaryFileName']; + } + that.storeVFModule(that, form.value); + window.parent.postMessage({ + eventId: 'submitIframe', + data: { + serviceModelId: that.serviceModel.uuid + } + }, "*"); + this.onCancel(that, form); + } + + + onCancel(that, form) { + form.reset(); + that._iframeService.removeClassCloseModal('content'); + this.closeDialogEvent.next(that); + } + + storeVFModule = (that, formValues: any): void => { + formValues.modelInfo = new ModelInfo(that.model); + formValues.uuid = formValues.modelInfo.uuid; + formValues.isMissingData = false; + const vnf = that._store.getState().service.serviceInstance[that.uuidData.serviceId].vnfs[that.uuidData.vnfStoreKey]; + + if (!that.uuidData.vFModuleStoreKey) { + this._store.dispatch(createVFModuleInstance(formValues, that.uuidData.modelName, that.uuidData.serviceId, 0, that.uuidData.vnfStoreKey)); + } else { + this._store.dispatch(updateVFModuleInstance(formValues, that.uuidData.modelName, that.uuidData.serviceId, that.uuidData.vFModuleStoreKey, that.uuidData.vnfStoreKey)); + } + }; + + getTitle(isUpdateMode : boolean) : string { + return isUpdateMode ? 'Edit Module (Heat stack)' : 'Set new Module (Heat stack)'; + } + + getSubLeftTitle(): string { + return this.model.name; + } + + getSubRightTitle(): string { + return "Module (Heat stack) Instance Details"; + } +} diff --git a/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/vnf/vnf.popup.service.spec.ts b/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/vnf/vnf.popup.service.spec.ts new file mode 100644 index 000000000..c77c092f6 --- /dev/null +++ b/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/vnf/vnf.popup.service.spec.ts @@ -0,0 +1,3242 @@ +import {DefaultDataGeneratorService} from "../../../../services/defaultDataServiceGenerator/default.data.generator.service"; +import {NgRedux} from "@angular-redux/store"; +import {ReflectiveInjector} from "@angular/core"; +import {IframeService} from "../../../../utils/iframe.service"; +import {VfModulePopuopService} from "../vfModule/vfModule.popuop.service"; +import {FormBuilder} from "@angular/forms"; +import {GenericFormService} from "../../../genericForm/generic-form.service"; +import {BasicPopupService} from "../basic.popup.service"; +import {AaiService} from "../../../../services/aaiService/aai.service"; +import {LogService} from "../../../../utils/log/log.service"; +import {HttpClient} from "@angular/common/http"; +import {VnfPopupService} from "./vnf.popup.service"; +import {BasicControlGenerator} from "../../../genericForm/formControlsServices/basic.control.generator"; +import {VnfControlGenerator} from "../../../genericForm/formControlsServices/vnfGenerator/vnf.control.generator"; +import {UUIDData} from "../../generic-form-popup.component"; +import {FeatureFlagsService} from "../../../../services/featureFlag/feature-flags.service"; +import {getTestBed, TestBed} from "@angular/core/testing"; + +class MockAppStore<T> {} + +class MockReduxStore<T> { + getState() { + return { + "global": { + "name": null, + "flags": { + "FLAG_NETWORK_TO_ASYNC_INSTANTIATION": false, + "FLAG_SHOW_ASSIGNMENTS": true, + "FLAG_FABRIC_CONFIGURATION_ASSIGNMENTS": true, + "FLAG_UNASSIGN_SERVICE": true, + "FLAG_SHOW_VERIFY_SERVICE": false, + "FLAG_COLLECTION_RESOURCE_SUPPORT": true, + "FLAG_DUPLICATE_VNF": true, + "FLAG_SERVICE_MODEL_CACHE": true, + "FLAG_ADVANCED_PORTS_FILTER": true, + "CREATE_INSTANCE_TEST": false, + "FLAG_SETTING_DEFAULTS_IN_DRAWING_BOARD": false, + "FLAG_REGION_ID_FROM_REMOTE": true, + "FLAG_ASYNC_INSTANTIATION": true, + "FLAG_ASYNC_JOBS": true, + "EMPTY_DRAWING_BOARD_TEST": false, + "FLAG_ADD_MSO_TESTAPI_FIELD": true + }, + "type": "[FLAGS] Update" + }, + "service": { + "serviceHierarchy": { + "6e59c5de-f052-46fa-aa7e-2fca9d674c44": { + "service": { + "uuid": "6e59c5de-f052-46fa-aa7e-2fca9d674c44", + "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0", + "name": "ComplexService", + "version": "1.0", + "toscaModelURL": null, + "category": "Emanuel", + "serviceType": "", + "serviceRole": "", + "description": "ComplexService", + "serviceEcompNaming": "false", + "instantiationType": "Macro", + "inputs": {} + }, + "vnfGroups" : {}, + "vnfs": { + "VF_vMee 0": { + "uuid": "d6557200-ecf2-4641-8094-5393ae3aae60", + "invariantUuid": "4160458e-f648-4b30-a176-43881ffffe9e", + "description": "VSP_vMee", + "name": "VF_vMee", + "version": "2.0", + "customizationUuid": "91415b44-753d-494c-926a-456a9172bbb9", + "inputs": {}, + "commands": {}, + "properties": { + "max_instances": 10, + "min_instances": 1, + "gpb2_Internal2_mac": "00:11:22:EF:AC:DF", + "sctp-b-ipv6-egress_src_start_port": "0", + "sctp-a-ipv6-egress_rule_application": "any", + "Internal2_allow_transit": "true", + "sctp-b-IPv6_ethertype": "IPv6", + "sctp-a-egress_rule_application": "any", + "sctp-b-ingress_action": "pass", + "sctp-b-ingress_rule_protocol": "icmp", + "ncb2_Internal1_mac": "00:11:22:EF:AC:DF", + "sctp-b-ipv6-ingress-src_start_port": "0.0", + "ncb1_Internal2_mac": "00:11:22:EF:AC:DF", + "fsb_volume_size_0": "320.0", + "sctp-b-egress_src_addresses": "local", + "sctp-a-ipv6-ingress_ethertype": "IPv4", + "sctp-a-ipv6-ingress-dst_start_port": "0", + "sctp-b-ipv6-ingress_rule_application": "any", + "domain_name": "default-domain", + "sctp-a-ingress_rule_protocol": "icmp", + "sctp-b-egress-src_start_port": "0.0", + "sctp-a-egress_src_addresses": "local", + "sctp-b-display_name": "epc-sctp-b-ipv4v6-sec-group", + "sctp-a-egress-src_start_port": "0.0", + "sctp-a-ingress_ethertype": "IPv4", + "sctp-b-ipv6-ingress-dst_end_port": "65535", + "sctp-b-dst_subnet_prefix_v6": "::", + "nf_naming": "{ecomp_generated_naming=true}", + "sctp-a-ipv6-ingress_src_subnet_prefix": "0.0.0.0", + "sctp-b-egress-dst_start_port": "0.0", + "ncb_flavor_name": "nv.c20r64d1", + "gpb1_Internal1_mac": "00:11:22:EF:AC:DF", + "sctp-b-egress_dst_subnet_prefix_len": "0.0", + "Internal2_net_cidr": "10.0.0.10", + "sctp-a-ingress-dst_start_port": "0.0", + "sctp-a-egress-dst_start_port": "0.0", + "fsb1_Internal2_mac": "00:11:22:EF:AC:DF", + "sctp-a-egress_ethertype": "IPv4", + "vlc_st_service_mode": "in-network-nat", + "sctp-a-ipv6-egress_ethertype": "IPv4", + "sctp-a-egress-src_end_port": "65535.0", + "sctp-b-ipv6-egress_rule_application": "any", + "sctp-b-egress_action": "pass", + "sctp-a-ingress-src_subnet_prefix_len": "0.0", + "sctp-b-ipv6-ingress-src_end_port": "65535.0", + "sctp-b-name": "epc-sctp-b-ipv4v6-sec-group", + "fsb2_Internal1_mac": "00:11:22:EF:AC:DF", + "sctp-a-ipv6-ingress-src_start_port": "0.0", + "sctp-b-ipv6-egress_ethertype": "IPv4", + "Internal1_net_cidr": "10.0.0.10", + "sctp-a-egress_dst_subnet_prefix": "0.0.0.0", + "fsb_flavor_name": "nv.c20r64d1", + "sctp_rule_protocol": "132", + "sctp-b-ipv6-ingress_src_subnet_prefix_len": "0", + "sctp-a-ipv6-ingress_rule_application": "any", + "ecomp_generated_naming": "false", + "sctp-a-IPv6_ethertype": "IPv6", + "vlc2_Internal1_mac": "00:11:22:EF:AC:DF", + "vlc_st_virtualization_type": "virtual-machine", + "sctp-b-ingress-dst_start_port": "0.0", + "sctp-b-ingress-dst_end_port": "65535.0", + "sctp-a-ipv6-ingress-src_end_port": "65535.0", + "sctp-a-display_name": "epc-sctp-a-ipv4v6-sec-group", + "sctp-b-ingress_rule_application": "any", + "int2_sec_group_name": "int2-sec-group", + "vlc_flavor_name": "nd.c16r64d1", + "sctp-b-ipv6-egress_src_addresses": "local", + "vlc_st_interface_type_int1": "other1", + "sctp-b-egress-src_end_port": "65535.0", + "sctp-a-ipv6-egress-dst_start_port": "0", + "vlc_st_interface_type_int2": "other2", + "sctp-a-ipv6-egress_rule_protocol": "any", + "Internal2_shared": "false", + "sctp-a-ipv6-egress_dst_subnet_prefix_len": "0", + "Internal2_rpf": "disable", + "vlc1_Internal1_mac": "00:11:22:EF:AC:DF", + "sctp-b-ipv6-egress_src_end_port": "65535", + "sctp-a-ipv6-egress_src_addresses": "local", + "sctp-a-ingress-dst_end_port": "65535.0", + "sctp-a-ipv6-egress_src_end_port": "65535", + "Internal1_forwarding_mode": "l2", + "Internal2_dhcp": "false", + "sctp-a-dst_subnet_prefix_v6": "::", + "pxe_image_name": "MME_PXE-Boot_16ACP04_GA.qcow2", + "vlc_st_interface_type_gtp": "other0", + "ncb1_Internal1_mac": "00:11:22:EF:AC:DF", + "sctp-b-src_subnet_prefix_v6": "::", + "sctp-a-egress_dst_subnet_prefix_len": "0.0", + "int1_sec_group_name": "int1-sec-group", + "Internal1_dhcp": "false", + "sctp-a-ipv6-egress_dst_end_port": "65535", + "Internal2_forwarding_mode": "l2", + "fsb2_Internal2_mac": "00:11:22:EF:AC:DF", + "sctp-b-egress_dst_subnet_prefix": "0.0.0.0", + "Internal1_net_cidr_len": "17", + "gpb2_Internal1_mac": "00:11:22:EF:AC:DF", + "sctp-b-ingress-src_subnet_prefix_len": "0.0", + "sctp-a-ingress_dst_addresses": "local", + "sctp-a-egress_action": "pass", + "fsb_volume_type_0": "SF-Default-SSD", + "ncb2_Internal2_mac": "00:11:22:EF:AC:DF", + "vlc_st_interface_type_sctp_a": "left", + "vlc_st_interface_type_sctp_b": "right", + "sctp-a-src_subnet_prefix_v6": "::", + "vlc_st_version": "2", + "sctp-b-egress_ethertype": "IPv4", + "sctp-a-ingress_rule_application": "any", + "gpb1_Internal2_mac": "00:11:22:EF:AC:DF", + "instance_ip_family_v6": "v6", + "sctp-a-ipv6-egress_src_start_port": "0", + "sctp-b-ingress-src_start_port": "0.0", + "sctp-b-ingress_dst_addresses": "local", + "fsb1_Internal1_mac": "00:11:22:EF:AC:DF", + "vlc_st_interface_type_oam": "management", + "multi_stage_design": "true", + "oam_sec_group_name": "oam-sec-group", + "Internal2_net_gateway": "10.0.0.10", + "sctp-a-ipv6-ingress-dst_end_port": "65535", + "sctp-b-ipv6-egress-dst_start_port": "0", + "Internal1_net_gateway": "10.0.0.10", + "sctp-b-ipv6-egress_rule_protocol": "any", + "gtp_sec_group_name": "gtp-sec-group", + "sctp-a-ipv6-egress_dst_subnet_prefix": "0.0.0.0", + "sctp-b-ipv6-egress_dst_subnet_prefix_len": "0", + "sctp-a-ipv6-ingress_dst_addresses": "local", + "sctp-a-egress_rule_protocol": "icmp", + "sctp-b-ipv6-egress_action": "pass", + "sctp-a-ipv6-egress_action": "pass", + "Internal1_shared": "false", + "sctp-b-ipv6-ingress_rule_protocol": "any", + "Internal2_net_cidr_len": "17", + "sctp-a-name": "epc-sctp-a-ipv4v6-sec-group", + "sctp-a-ingress-src_end_port": "65535.0", + "sctp-b-ipv6-ingress_src_subnet_prefix": "0.0.0.0", + "sctp-a-egress-dst_end_port": "65535.0", + "sctp-a-ingress_action": "pass", + "sctp-b-egress_rule_protocol": "icmp", + "sctp-b-ipv6-ingress_action": "pass", + "vlc_st_service_type": "firewall", + "sctp-b-ipv6-egress_dst_end_port": "65535", + "sctp-b-ipv6-ingress-dst_start_port": "0", + "vlc2_Internal2_mac": "00:11:22:EF:AC:DF", + "vlc_st_availability_zone": "true", + "fsb_volume_image_name_1": "MME_FSB2_16ACP04_GA.qcow2", + "sctp-b-ingress-src_subnet_prefix": "0.0.0.0", + "sctp-a-ipv6-ingress_src_subnet_prefix_len": "0", + "Internal1_allow_transit": "true", + "gpb_flavor_name": "nv.c20r64d1", + "availability_zone_max_count": "1", + "fsb_volume_image_name_0": "MME_FSB1_16ACP04_GA.qcow2", + "sctp-b-ipv6-ingress_dst_addresses": "local", + "sctp-b-ipv6-egress_dst_subnet_prefix": "0.0.0.0", + "sctp-b-ipv6-ingress_ethertype": "IPv4", + "vlc1_Internal2_mac": "00:11:22:EF:AC:DF", + "sctp-a-ingress-src_subnet_prefix": "0.0.0.0", + "sctp-a-ipv6-ingress_action": "pass", + "Internal1_rpf": "disable", + "sctp-b-ingress_ethertype": "IPv4", + "sctp-b-egress_rule_application": "any", + "sctp-b-ingress-src_end_port": "65535.0", + "sctp-a-ipv6-ingress_rule_protocol": "any", + "sctp-a-ingress-src_start_port": "0.0", + "sctp-b-egress-dst_end_port": "65535.0" + }, + "type": "VF", + "modelCustomizationName": "VF_vMee 0", + "vfModules": { + "vf_vmee0..VfVmee..vmme_vlc..module-1": { + "uuid": "522159d5-d6e0-4c2a-aa44-5a542a12a830", + "invariantUuid": "98a7c88b-b577-476a-90e4-e25a5871e02b", + "customizationUuid": "55b1be94-671a-403e-a26c-667e9c47d091", + "description": null, + "name": "VfVmee..vmme_vlc..module-1", + "version": "2", + "modelCustomizationName": "VfVmee..vmme_vlc..module-1", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "vmme_vlc" + }, + "inputs": {}, + "volumeGroupAllowed": true + }, + "vf_vmee0..VfVmee..vmme_gpb..module-2": { + "uuid": "41708296-e443-4c71-953f-d9a010f059e1", + "invariantUuid": "1cca90b8-3490-495e-87da-3f3e4c57d5b9", + "customizationUuid": "6add59e0-7fe1-4bc4-af48-f8812422ae7c", + "description": null, + "name": "VfVmee..vmme_gpb..module-2", + "version": "2", + "modelCustomizationName": "VfVmee..vmme_gpb..module-2", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "vmme_gpb" + }, + "inputs": {}, + "volumeGroupAllowed": false + }, + "vf_vmee0..VfVmee..base_vmme..module-0": { + "uuid": "a27f5cfc-7f12-4f99-af08-0af9c3885c87", + "invariantUuid": "a6f9e51a-2b35-416a-ae15-15e58d61f36d", + "customizationUuid": "f8c040f1-7e51-4a11-aca8-acf256cfd861", + "description": null, + "name": "VfVmee..base_vmme..module-0", + "version": "2", + "modelCustomizationName": "VfVmee..base_vmme..module-0", + "properties": { + "minCountInstances": 1, + "maxCountInstances": 1, + "initialCount": 1, + "vfModuleLabel": "base_vmme" + }, + "inputs": {}, + "volumeGroupAllowed": true + } + }, + "volumeGroups": { + "vf_vmee0..VfVmee..base_vmme..module-0": { + "uuid": "a27f5cfc-7f12-4f99-af08-0af9c3885c87", + "invariantUuid": "a6f9e51a-2b35-416a-ae15-15e58d61f36d", + "customizationUuid": "f8c040f1-7e51-4a11-aca8-acf256cfd861", + "description": null, + "name": "VfVmee..base_vmme..module-0", + "version": "2", + "modelCustomizationName": "VfVmee..base_vmme..module-0", + "properties": { + "minCountInstances": 1, + "maxCountInstances": 1, + "initialCount": 1, + "vfModuleLabel": "base_vmme" + }, + "inputs": {} + } + }, + "vfcInstanceGroups": {} + } + }, + "networks": { + "ExtVL 0": { + "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986", + "invariantUuid": "379f816b-a7aa-422f-be30-17114ff50b7c", + "description": "ECOMP generic virtual link (network) base type for all other service-level and global networks", + "name": "ExtVL", + "version": "37.0", + "customizationUuid": "94fdd893-4a36-4d70-b16a-ec29c54c184f", + "inputs": {}, + "commands": {}, + "properties": { + "netowrk_role": "role 1, role 2, role 3", + "network_assignments": "{is_external_network=false, ipv4_subnet_default_assignment={min_subnets_count=1}, ecomp_generated_network_assignment=false, ipv6_subnet_default_assignment={min_subnets_count=1}}", + "exVL_naming": "{ecomp_generated_naming=true}", + "network_flows": "{is_network_policy=false, is_bound_to_vpn=false}", + "network_homing": "{ecomp_selected_instance_node_target=false}" + }, + "type": "VL", + "modelCustomizationName": "ExtVL 0" + } + }, + "collectionResource": {}, + "configurations": { + "Port Mirroring Configuration By Policy 0": { + "uuid": "b4398538-e89d-4f13-b33d-ca323434ba50", + "invariantUuid": "6ef0ca40-f366-4897-951f-abd65d25f6f7", + "description": "A port mirroring configuration by policy object", + "name": "Port Mirroring Configuration By Policy", + "version": "27.0", + "customizationUuid": "3c3b7b8d-8669-4b3b-8664-61970041fad2", + "inputs": {}, + "commands": {}, + "properties": {}, + "type": "Configuration", + "modelCustomizationName": "Port Mirroring Configuration By Policy 0", + "sourceNodes": [], + "collectorNodes": null, + "configurationByPolicy": false + } + }, + "serviceProxies": {}, + "vfModules": { + "vf_vmee0..VfVmee..vmme_vlc..module-1": { + "uuid": "522159d5-d6e0-4c2a-aa44-5a542a12a830", + "invariantUuid": "98a7c88b-b577-476a-90e4-e25a5871e02b", + "customizationUuid": "55b1be94-671a-403e-a26c-667e9c47d091", + "description": null, + "name": "VfVmee..vmme_vlc..module-1", + "version": "2", + "modelCustomizationName": "VfVmee..vmme_vlc..module-1", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "vmme_vlc" + }, + "inputs": {}, + "volumeGroupAllowed": true + }, + "vf_vmee0..VfVmee..vmme_gpb..module-2": { + "uuid": "41708296-e443-4c71-953f-d9a010f059e1", + "invariantUuid": "1cca90b8-3490-495e-87da-3f3e4c57d5b9", + "customizationUuid": "6add59e0-7fe1-4bc4-af48-f8812422ae7c", + "description": null, + "name": "VfVmee..vmme_gpb..module-2", + "version": "2", + "modelCustomizationName": "VfVmee..vmme_gpb..module-2", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "vmme_gpb" + }, + "inputs": {}, + "volumeGroupAllowed": false + }, + "vf_vmee0..VfVmee..base_vmme..module-0": { + "uuid": "a27f5cfc-7f12-4f99-af08-0af9c3885c87", + "invariantUuid": "a6f9e51a-2b35-416a-ae15-15e58d61f36d", + "customizationUuid": "f8c040f1-7e51-4a11-aca8-acf256cfd861", + "description": null, + "name": "VfVmee..base_vmme..module-0", + "version": "2", + "modelCustomizationName": "VfVmee..base_vmme..module-0", + "properties": { + "minCountInstances": 1, + "maxCountInstances": 1, + "initialCount": 1, + "vfModuleLabel": "base_vmme" + }, + "inputs": {}, + "volumeGroupAllowed": true + } + }, + "volumeGroups": { + "vf_vmee0..VfVmee..base_vmme..module-0": { + "uuid": "a27f5cfc-7f12-4f99-af08-0af9c3885c87", + "invariantUuid": "a6f9e51a-2b35-416a-ae15-15e58d61f36d", + "customizationUuid": "f8c040f1-7e51-4a11-aca8-acf256cfd861", + "description": null, + "name": "VfVmee..base_vmme..module-0", + "version": "2", + "modelCustomizationName": "VfVmee..base_vmme..module-0", + "properties": { + "minCountInstances": 1, + "maxCountInstances": 1, + "initialCount": 1, + "vfModuleLabel": "base_vmme" + }, + "inputs": {} + } + }, + "pnfs": {} + }, + "6b528779-44a3-4472-bdff-9cd15ec93450": { + "service": { + "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450", + "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0", + "name": "action-data", + "version": "1.0", + "toscaModelURL": null, + "category": "", + "serviceType": "", + "serviceRole": "", + "description": "", + "serviceEcompNaming": "false", + "instantiationType": "A-La-Carte", + "inputs": { + "2017488_adiodvpe0_ASN": { + "type": "string", + "description": "AV/PE", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "AV_vPE" + } + } + }, + "vnfs": { + "2017-388_ADIOD-vPE 1": { + "uuid": "0903e1c0-8e03-4936-b5c2-260653b96413", + "invariantUuid": "00beb8f9-6d39-452f-816d-c709b9cbb87d", + "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM", + "name": "2017-388_ADIOD-vPE", + "version": "1.0", + "customizationUuid": "280dec31-f16d-488b-9668-4aae55d6648a", + "inputs": { + "vnf_config_template_version": { + "type": "string", + "description": "VPE Software Version", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "17.2" + }, + "bandwidth_units": { + "type": "string", + "description": "Units of bandwidth", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "Gbps" + }, + "bandwidth": { + "type": "string", + "description": "Requested VPE bandwidth", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "10" + }, + "AIC_CLLI": { + "type": "string", + "description": "AIC Site CLLI", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "ATLMY8GA" + }, + "ASN": { + "type": "string", + "description": "AV/PE", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "AV_vPE" + }, + "vnf_instance_name": { + "type": "string", + "description": "The hostname assigned to the vpe.", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "mtnj309me6" + } + }, + "commands": { + "vnf_config_template_version": { + "displayName": "vnf_config_template_version", + "command": "get_input", + "inputName": "2017488_adiodvpe0_vnf_config_template_version" + }, + "bandwidth_units": { + "displayName": "bandwidth_units", + "command": "get_input", + "inputName": "adiodvpe0_bandwidth_units" + }, + "bandwidth": { + "displayName": "bandwidth", + "command": "get_input", + "inputName": "adiodvpe0_bandwidth" + }, + "AIC_CLLI": { + "displayName": "AIC_CLLI", + "command": "get_input", + "inputName": "2017488_adiodvpe0_AIC_CLLI" + }, + "ASN": { + "displayName": "ASN", + "command": "get_input", + "inputName": "2017488_adiodvpe0_ASN" + }, + "vnf_instance_name": { + "displayName": "vnf_instance_name", + "command": "get_input", + "inputName": "2017488_adiodvpe0_vnf_instance_name" + } + }, + "properties": { + "max_instances": 5, + "vmxvre_retype": "RE-VMX", + "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version", + "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d", + "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9", + "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF", + "int_ctl_net_name": "VMX-INTXI", + "vmx_int_ctl_prefix": "10.0.0.10", + "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5", + "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279", + "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a", + "nf_type": "vPE", + "vmxvpfe_int_ctl_ip_1": "10.0.0.10", + "is_AVPN_service": "false", + "vmx_RSG_name": "vREXI-affinity", + "vmx_int_ctl_forwarding": "l2", + "vmxvre_oam_ip_0": "10.0.0.10", + "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvpfe_sriov41_0_port_vlanstrip": "false", + "vmxvpfe_sriov42_0_port_vlanfilter": "4001", + "vmxvpfe_sriov44_0_port_unknownunicastallow": "true", + "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2", + "vmxvre_instance": "0", + "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvre_flavor_name": "ns.c1r16d32.v5", + "vmxvpfe_volume_size_0": "40.0", + "vmxvpfe_sriov43_0_port_vlanfilter": "4001", + "nf_naming": "{ecomp_generated_naming=false}", + "nf_naming_code": "Navneet", + "vmxvre_name_0": "vREXI", + "vmxvpfe_sriov42_0_port_vlanstrip": "false", + "vmxvpfe_volume_name_0": "vPFEXI_FBVolume", + "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141", + "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2", + "vmxvpfe_sriov43_0_port_unknownunicastallow": "true", + "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true", + "vmxvre_console": "vidconsole", + "vmxvpfe_sriov44_0_port_vlanfilter": "4001", + "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3", + "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true", + "vmxvpfe_sriov44_0_port_vlanstrip": "false", + "vf_module_id": "123", + "nf_function": "JAI", + "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true", + "vmxvre_int_ctl_ip_0": "10.0.0.10", + "ecomp_generated_naming": "false", + "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI", + "vnf_name": "mtnj309me6vre", + "vmxvpfe_sriov41_0_port_unknownunicastallow": "true", + "vmxvre_volume_type_1": "HITACHI", + "vmxvpfe_sriov44_0_port_broadcastallow": "true", + "vmxvre_volume_type_0": "HITACHI", + "vmxvpfe_volume_type_0": "HITACHI", + "vmxvpfe_sriov43_0_port_broadcastallow": "true", + "bandwidth_units": "get_input:adiodvpe0_bandwidth_units", + "vnf_id": "123", + "vmxvre_oam_prefix": "24", + "availability_zone_0": "mtpocfo-kvm-az01", + "ASN": "get_input:2017488_adiodvpe0_ASN", + "vmxvre_chassis_i2cid": "161", + "vmxvpfe_name_0": "vPFEXI", + "bandwidth": "get_input:adiodvpe0_bandwidth", + "availability_zone_max_count": "1", + "vmxvre_volume_size_0": "45.0", + "vmxvre_volume_size_1": "50.0", + "vmxvpfe_sriov42_0_port_broadcastallow": "true", + "vmxvre_oam_gateway": "10.0.0.10", + "vmxvre_volume_name_1": "vREXI_FAVolume", + "vmxvre_ore_present": "0", + "vmxvre_volume_name_0": "vREXI_FBVolume", + "vmxvre_type": "0", + "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name", + "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true", + "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429", + "vmx_int_ctl_len": "24", + "vmxvpfe_sriov43_0_port_vlanstrip": "false", + "vmxvpfe_sriov41_0_port_broadcastallow": "true", + "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d", + "vmxvpfe_sriov41_0_port_vlanfilter": "4001", + "nf_role": "Testing", + "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a", + "vmxvpfe_sriov42_0_port_unknownunicastallow": "true", + "vmxvpfe_flavor_name": "ns.c20r16d25.v5" + }, + "type": "VF", + "modelCustomizationName": "2017-388_ADIOD-vPE 1", + "vfModules": {}, + "volumeGroups": {}, + "vfcInstanceGroups": {} + }, + "2017-388_ADIOD-vPE 0": { + "uuid": "afacccf6-397d-45d6-b5ae-94c39734b168", + "invariantUuid": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8", + "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM", + "name": "2017-388_ADIOD-vPE", + "version": "4.0", + "customizationUuid": "b3c76f73-eeb5-4fb6-9d31-72a889f1811c", + "inputs": { + "vnf_config_template_version": { + "type": "string", + "description": "VPE Software Version", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "17.2" + }, + "bandwidth_units": { + "type": "string", + "description": "Units of bandwidth", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "Gbps" + }, + "bandwidth": { + "type": "string", + "description": "Requested VPE bandwidth", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "10" + }, + "AIC_CLLI": { + "type": "string", + "description": "AIC Site CLLI", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "ATLMY8GA" + }, + "ASN": { + "type": "string", + "description": "AV/PE", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "AV_vPE" + }, + "vnf_instance_name": { + "type": "string", + "description": "The hostname assigned to the vpe.", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "mtnj309me6" + } + }, + "commands": { + "vnf_config_template_version": { + "displayName": "vnf_config_template_version", + "command": "get_input", + "inputName": "2017488_adiodvpe0_vnf_config_template_version" + }, + "bandwidth_units": { + "displayName": "bandwidth_units", + "command": "get_input", + "inputName": "adiodvpe0_bandwidth_units" + }, + "bandwidth": { + "displayName": "bandwidth", + "command": "get_input", + "inputName": "adiodvpe0_bandwidth" + }, + "AIC_CLLI": { + "displayName": "AIC_CLLI", + "command": "get_input", + "inputName": "2017488_adiodvpe0_AIC_CLLI" + }, + "ASN": { + "displayName": "ASN", + "command": "get_input", + "inputName": "2017488_adiodvpe0_ASN" + }, + "vnf_instance_name": { + "displayName": "vnf_instance_name", + "command": "get_input", + "inputName": "2017488_adiodvpe0_vnf_instance_name" + } + }, + "properties": { + "vmxvre_retype": "RE-VMX", + "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version", + "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d", + "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9", + "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF", + "int_ctl_net_name": "VMX-INTXI", + "vmx_int_ctl_prefix": "10.0.0.10", + "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5", + "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279", + "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a", + "nf_type": "vPE", + "vmxvpfe_int_ctl_ip_1": "10.0.0.10", + "is_AVPN_service": "false", + "vmx_RSG_name": "vREXI-affinity", + "vmx_int_ctl_forwarding": "l2", + "vmxvre_oam_ip_0": "10.0.0.10", + "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvpfe_sriov41_0_port_vlanstrip": "false", + "vmxvpfe_sriov42_0_port_vlanfilter": "4001", + "vmxvpfe_sriov44_0_port_unknownunicastallow": "true", + "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2", + "vmxvre_instance": "0", + "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvre_flavor_name": "ns.c1r16d32.v5", + "vmxvpfe_volume_size_0": "40.0", + "vmxvpfe_sriov43_0_port_vlanfilter": "4001", + "nf_naming": "{ecomp_generated_naming=false}", + "nf_naming_code": "Navneet", + "vmxvre_name_0": "vREXI", + "vmxvpfe_sriov42_0_port_vlanstrip": "false", + "vmxvpfe_volume_name_0": "vPFEXI_FBVolume", + "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141", + "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2", + "vmxvpfe_sriov43_0_port_unknownunicastallow": "true", + "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true", + "vmxvre_console": "vidconsole", + "vmxvpfe_sriov44_0_port_vlanfilter": "4001", + "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3", + "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true", + "min_instances": "1", + "vmxvpfe_sriov44_0_port_vlanstrip": "false", + "vf_module_id": "123", + "nf_function": "JAI", + "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true", + "vmxvre_int_ctl_ip_0": "10.0.0.10", + "ecomp_generated_naming": "false", + "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI", + "vnf_name": "mtnj309me6vre", + "vmxvpfe_sriov41_0_port_unknownunicastallow": "true", + "vmxvre_volume_type_1": "HITACHI", + "vmxvpfe_sriov44_0_port_broadcastallow": "true", + "vmxvre_volume_type_0": "HITACHI", + "vmxvpfe_volume_type_0": "HITACHI", + "vmxvpfe_sriov43_0_port_broadcastallow": "true", + "bandwidth_units": "get_input:adiodvpe0_bandwidth_units", + "vnf_id": "123", + "vmxvre_oam_prefix": "24", + "availability_zone_0": "mtpocfo-kvm-az01", + "ASN": "get_input:2017488_adiodvpe0_ASN", + "vmxvre_chassis_i2cid": "161", + "vmxvpfe_name_0": "vPFEXI", + "bandwidth": "get_input:adiodvpe0_bandwidth", + "availability_zone_max_count": "1", + "vmxvre_volume_size_0": "45.0", + "vmxvre_volume_size_1": "50.0", + "vmxvpfe_sriov42_0_port_broadcastallow": "true", + "vmxvre_oam_gateway": "10.0.0.10", + "vmxvre_volume_name_1": "vREXI_FAVolume", + "vmxvre_ore_present": "0", + "vmxvre_volume_name_0": "vREXI_FBVolume", + "vmxvre_type": "0", + "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name", + "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true", + "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429", + "vmx_int_ctl_len": "24", + "vmxvpfe_sriov43_0_port_vlanstrip": "false", + "vmxvpfe_sriov41_0_port_broadcastallow": "true", + "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d", + "vmxvpfe_sriov41_0_port_vlanfilter": "4001", + "nf_role": "Testing", + "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a", + "vmxvpfe_sriov42_0_port_unknownunicastallow": "true", + "vmxvpfe_flavor_name": "ns.c20r16d25.v5" + }, + "type": "VF", + "modelCustomizationName": "2017-388_ADIOD-vPE 0", + "vfModules": {}, + "volumeGroups": {}, + "vfcInstanceGroups": {} + }, + "2017-488_ADIOD-vPE 0": { + "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09", + "invariantUuid": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8", + "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM", + "name": "2017-488_ADIOD-vPE", + "version": "5.0", + "customizationUuid": "1da7b585-5e61-4993-b95e-8e6606c81e45", + "inputs": { + "vnf_config_template_version": { + "type": "string", + "description": "VPE Software Version", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "17.2" + }, + "bandwidth_units": { + "type": "string", + "description": "Units of bandwidth", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "Gbps" + }, + "bandwidth": { + "type": "string", + "description": "Requested VPE bandwidth", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "10" + }, + "AIC_CLLI": { + "type": "string", + "description": "AIC Site CLLI", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "ATLMY8GA" + }, + "ASN": { + "type": "string", + "description": "AV/PE", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "AV_vPE" + }, + "vnf_instance_name": { + "type": "string", + "description": "The hostname assigned to the vpe.", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "mtnj309me6" + } + }, + "commands": { + "vnf_config_template_version": { + "displayName": "vnf_config_template_version", + "command": "get_input", + "inputName": "2017488_adiodvpe0_vnf_config_template_version" + }, + "bandwidth_units": { + "displayName": "bandwidth_units", + "command": "get_input", + "inputName": "adiodvpe0_bandwidth_units" + }, + "bandwidth": { + "displayName": "bandwidth", + "command": "get_input", + "inputName": "adiodvpe0_bandwidth" + }, + "AIC_CLLI": { + "displayName": "AIC_CLLI", + "command": "get_input", + "inputName": "2017488_adiodvpe0_AIC_CLLI" + }, + "ASN": { + "displayName": "ASN", + "command": "get_input", + "inputName": "2017488_adiodvpe0_ASN" + }, + "vnf_instance_name": { + "displayName": "vnf_instance_name", + "command": "get_input", + "inputName": "2017488_adiodvpe0_vnf_instance_name" + } + }, + "properties": { + "vmxvre_retype": "RE-VMX", + "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version", + "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d", + "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9", + "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF", + "int_ctl_net_name": "VMX-INTXI", + "vmx_int_ctl_prefix": "10.0.0.10", + "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5", + "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279", + "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a", + "nf_type": "vPE", + "vmxvpfe_int_ctl_ip_1": "10.0.0.10", + "is_AVPN_service": "false", + "vmx_RSG_name": "vREXI-affinity", + "vmx_int_ctl_forwarding": "l2", + "vmxvre_oam_ip_0": "10.0.0.10", + "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvpfe_sriov41_0_port_vlanstrip": "false", + "vmxvpfe_sriov42_0_port_vlanfilter": "4001", + "vmxvpfe_sriov44_0_port_unknownunicastallow": "true", + "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2", + "vmxvre_instance": "0", + "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvre_flavor_name": "ns.c1r16d32.v5", + "vmxvpfe_volume_size_0": "40.0", + "vmxvpfe_sriov43_0_port_vlanfilter": "4001", + "nf_naming": "{ecomp_generated_naming=false}", + "nf_naming_code": "Navneet", + "vmxvre_name_0": "vREXI", + "vmxvpfe_sriov42_0_port_vlanstrip": "false", + "vmxvpfe_volume_name_0": "vPFEXI_FBVolume", + "max_instances": "3", + "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141", + "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2", + "vmxvpfe_sriov43_0_port_unknownunicastallow": "true", + "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true", + "vmxvre_console": "vidconsole", + "vmxvpfe_sriov44_0_port_vlanfilter": "4001", + "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3", + "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true", + "min_instances": "1", + "vmxvpfe_sriov44_0_port_vlanstrip": "false", + "vf_module_id": "123", + "nf_function": "JAI", + "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true", + "vmxvre_int_ctl_ip_0": "10.0.0.10", + "ecomp_generated_naming": "false", + "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI", + "vnf_name": "mtnj309me6vre", + "vmxvpfe_sriov41_0_port_unknownunicastallow": "true", + "vmxvre_volume_type_1": "HITACHI", + "vmxvpfe_sriov44_0_port_broadcastallow": "true", + "vmxvre_volume_type_0": "HITACHI", + "vmxvpfe_volume_type_0": "HITACHI", + "vmxvpfe_sriov43_0_port_broadcastallow": "true", + "bandwidth_units": "get_input:adiodvpe0_bandwidth_units", + "vnf_id": "123", + "vmxvre_oam_prefix": "24", + "availability_zone_0": "mtpocfo-kvm-az01", + "ASN": "get_input:2017488_adiodvpe0_ASN", + "vmxvre_chassis_i2cid": "161", + "vmxvpfe_name_0": "vPFEXI", + "bandwidth": "get_input:adiodvpe0_bandwidth", + "availability_zone_max_count": "1", + "vmxvre_volume_size_0": "45.0", + "vmxvre_volume_size_1": "50.0", + "vmxvpfe_sriov42_0_port_broadcastallow": "true", + "vmxvre_oam_gateway": "10.0.0.10", + "vmxvre_volume_name_1": "vREXI_FAVolume", + "vmxvre_ore_present": "0", + "vmxvre_volume_name_0": "vREXI_FBVolume", + "vmxvre_type": "0", + "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name", + "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true", + "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429", + "vmx_int_ctl_len": "24", + "vmxvpfe_sriov43_0_port_vlanstrip": "false", + "vmxvpfe_sriov41_0_port_broadcastallow": "true", + "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d", + "vmxvpfe_sriov41_0_port_vlanfilter": "4001", + "nf_role": "Testing", + "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a", + "vmxvpfe_sriov42_0_port_unknownunicastallow": "true", + "vmxvpfe_flavor_name": "ns.c20r16d25.v5" + }, + "type": "VF", + "modelCustomizationName": "2017-488_ADIOD-vPE 0", + "vfModules": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": { + "uuid": "25284168-24bb-4698-8cb4-3f509146eca5", + "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1", + "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vRE_BV" + }, + "inputs": { + "adiodvpe0_bandwidth": { + "type": "string", + "description": "Requested VPE bandwidth", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "bandwidth" + }, + "constraints": null, + "required": true, + "default": "10" + }, + "2017488_adiodvpe0_vnf_instance_name": { + "type": "string", + "description": "The hostname assigned to the vpe.", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "vnf_instance_name" + }, + "constraints": null, + "required": true, + "default": "mtnj309me6" + }, + "2017488_adiodvpe0_vnf_config_template_version": { + "type": "string", + "description": "VPE Software Version", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "vnf_config_template_version" + }, + "constraints": null, + "required": true, + "default": "17.2" + }, + "2017488_adiodvpe0_AIC_CLLI": { + "type": "string", + "description": "AIC Site CLLI", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "AIC_CLLI" + }, + "constraints": null, + "required": true, + "default": "ATLMY8GA" + }, + "adiodvpe0_bandwidth_units": { + "type": "string", + "description": "Units of bandwidth", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "bandwidth_units" + }, + "constraints": null, + "required": true, + "default": "Gbps" + } + }, + "volumeGroupAllowed": true + }, + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": { + "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db", + "invariantUuid": "b34833bb-6aa9-4ad6-a831-70b06367a091", + "customizationUuid": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3", + "description": null, + "name": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0", + "version": "5", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0", + "properties": { + "minCountInstances": 1, + "maxCountInstances": 1, + "initialCount": 1, + "vfModuleLabel": "ADIOD_base_vPE_BV" + }, + "inputs": {}, + "volumeGroupAllowed": false + }, + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": { + "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a", + "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339", + "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vPFE_BV" + }, + "inputs": {}, + "volumeGroupAllowed": true + } + }, + "volumeGroups": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": { + "uuid": "25284168-24bb-4698-8cb4-3f509146eca5", + "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1", + "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vRE_BV" + }, + "inputs": { + "adiodvpe0_bandwidth": { + "type": "string", + "description": "Requested VPE bandwidth", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "bandwidth" + }, + "constraints": null, + "required": true, + "default": "10" + }, + "2017488_adiodvpe0_vnf_instance_name": { + "type": "string", + "description": "The hostname assigned to the vpe.", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "vnf_instance_name" + }, + "constraints": null, + "required": true, + "default": "mtnj309me6" + }, + "2017488_adiodvpe0_vnf_config_template_version": { + "type": "string", + "description": "VPE Software Version", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "vnf_config_template_version" + }, + "constraints": null, + "required": true, + "default": "17.2" + }, + "2017488_adiodvpe0_AIC_CLLI": { + "type": "string", + "description": "AIC Site CLLI", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "AIC_CLLI" + }, + "constraints": null, + "required": true, + "default": "ATLMY8GA" + }, + "adiodvpe0_bandwidth_units": { + "type": "string", + "description": "Units of bandwidth", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "bandwidth_units" + }, + "constraints": null, + "required": true, + "default": "Gbps" + } + } + }, + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": { + "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a", + "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339", + "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vPFE_BV" + }, + "inputs": {} + } + }, + "vfcInstanceGroups": {} + } + }, + "vnfGroups": {}, + "networks": { + "ExtVL 0": { + "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986", + "invariantUuid": "379f816b-a7aa-422f-be30-17114ff50b7c", + "description": "ECOMP generic virtual link (network) base type for all other service-level and global networks", + "name": "ExtVL", + "version": "37.0", + "customizationUuid": "94fdd893-4a36-4d70-b16a-ec29c54c184f", + "inputs": { + "vnf_config_template_version": { + "type": "string", + "description": "VPE Software Version", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "17.2" + }, + "bandwidth_units": { + "type": "string", + "description": "Units of bandwidth", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "Gbps" + }, + "bandwidth": { + "type": "string", + "description": "Requested VPE bandwidth", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "10" + }, + "AIC_CLLI": { + "type": "string", + "description": "AIC Site CLLI", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "ATLMY8GA" + }, + "ASN": { + "type": "string", + "description": "AV/PE", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "AV_vPE" + }, + "vnf_instance_name": { + "type": "string", + "description": "The hostname assigned to the vpe.", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "mtnj309me6" + } + }, + "commands": {}, + "properties": { + "network_role": "network role 1, network role 2", + "min_instances": 1, + "max_instances": 10, + "network_assignments": "{is_external_network=false, ipv4_subnet_default_assignment={min_subnets_count=1}, ecomp_generated_network_assignment=false, ipv6_subnet_default_assignment={min_subnets_count=1}}", + "exVL_naming": "{ecomp_generated_naming=true}", + "network_flows": "{is_network_policy=false, is_bound_to_vpn=false}", + "network_homing": "{ecomp_selected_instance_node_target=false}" + }, + "type": "VL", + "modelCustomizationName": "ExtVL 0" + } + }, + "collectionResource": {}, + "configurations": {}, + "fabricConfigurations": {}, + "serviceProxies": {}, + "vfModules": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": { + "uuid": "25284168-24bb-4698-8cb4-3f509146eca5", + "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1", + "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vRE_BV" + }, + "inputs": { + "adiodvpe0_bandwidth": { + "type": "string", + "description": "Requested VPE bandwidth", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "bandwidth" + }, + "constraints": null, + "required": true, + "default": "10" + }, + "2017488_adiodvpe0_vnf_instance_name": { + "type": "string", + "description": "The hostname assigned to the vpe.", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "vnf_instance_name" + }, + "constraints": null, + "required": true, + "default": "mtnj309me6" + }, + "2017488_adiodvpe0_vnf_config_template_version": { + "type": "string", + "description": "VPE Software Version", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "vnf_config_template_version" + }, + "constraints": null, + "required": true, + "default": "17.2" + }, + "2017488_adiodvpe0_AIC_CLLI": { + "type": "string", + "description": "AIC Site CLLI", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "AIC_CLLI" + }, + "constraints": null, + "required": true, + "default": "ATLMY8GA" + }, + "adiodvpe0_bandwidth_units": { + "type": "string", + "description": "Units of bandwidth", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "bandwidth_units" + }, + "constraints": null, + "required": true, + "default": "Gbps" + } + }, + "volumeGroupAllowed": true + }, + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": { + "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db", + "invariantUuid": "b34833bb-6aa9-4ad6-a831-70b06367a091", + "customizationUuid": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3", + "description": null, + "name": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0", + "version": "5", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0", + "properties": { + "minCountInstances": 1, + "maxCountInstances": 1, + "initialCount": 1, + "vfModuleLabel": "ADIOD_base_vPE_BV" + }, + "inputs": {}, + "volumeGroupAllowed": false + }, + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": { + "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a", + "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339", + "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vPFE_BV" + }, + "inputs": {}, + "volumeGroupAllowed": true + } + }, + "volumeGroups": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": { + "uuid": "25284168-24bb-4698-8cb4-3f509146eca5", + "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1", + "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vRE_BV" + }, + "inputs": { + "adiodvpe0_bandwidth": { + "type": "string", + "description": "Requested VPE bandwidth", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "bandwidth" + }, + "constraints": null, + "required": true, + "default": "10" + }, + "2017488_adiodvpe0_vnf_instance_name": { + "type": "string", + "description": "The hostname assigned to the vpe.", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "vnf_instance_name" + }, + "constraints": null, + "required": true, + "default": "mtnj309me6" + }, + "2017488_adiodvpe0_vnf_config_template_version": { + "type": "string", + "description": "VPE Software Version", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "vnf_config_template_version" + }, + "constraints": null, + "required": true, + "default": "17.2" + }, + "2017488_adiodvpe0_AIC_CLLI": { + "type": "string", + "description": "AIC Site CLLI", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "AIC_CLLI" + }, + "constraints": null, + "required": true, + "default": "ATLMY8GA" + }, + "adiodvpe0_bandwidth_units": { + "type": "string", + "description": "Units of bandwidth", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "bandwidth_units" + }, + "constraints": null, + "required": true, + "default": "Gbps" + } + } + }, + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": { + "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a", + "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339", + "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vPFE_BV" + }, + "inputs": {} + } + }, + "pnfs": {} + } + }, + "serviceInstance": { + "6e59c5de-f052-46fa-aa7e-2fca9d674c44": { + "vnfs": { + "VF_vMee 0": { + "rollbackOnFailure": "true", + "vfModules": { + "vf_vmee0..VfVmee..base_vmme..module-0": { + "vf_vmee0..VfVmee..base_vmme..module-0vmvzo": { + "isMissingData": false, + "sdncPreReload": null, + "modelInfo": { + "modelType": "VFmodule", + "modelInvariantId": "a6f9e51a-2b35-416a-ae15-15e58d61f36d", + "modelVersionId": "a27f5cfc-7f12-4f99-af08-0af9c3885c87", + "modelName": "VfVmee..base_vmme..module-0", + "modelVersion": "2", + "modelCustomizationId": "f8c040f1-7e51-4a11-aca8-acf256cfd861", + "modelCustomizationName": "VfVmee..base_vmme..module-0" + }, + "instanceParams": [ + {} + ], + "trackById": "wmtm6sy2uj" + } + } + }, + "isMissingData": true, + "originalName": "VF_vMee 0", + "vnfStoreKey": "VF_vMee 0", + "trackById": "p3wk448m5do", + "uuid": "d6557200-ecf2-4641-8094-5393ae3aae60", + "productFamilyId": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e", + "lcpCloudRegionId": null, + "tenantId": null, + "lineOfBusiness": null, + "platformName": null, + "modelInfo": { + "modelType": "VF", + "modelInvariantId": "4160458e-f648-4b30-a176-43881ffffe9e", + "modelVersionId": "6e59c5de-f052-46fa-aa7e-2fca9d674c44", + "modelName": "VF_vMee", + "modelVersion": "2.0", + "modelCustomizationName": "VF_vMee 0" + } + } + }, + "vnfGroups": {}, + "networks": {}, + "instanceParams": [ + {} + ], + "validationCounter": 1, + "existingNames": {}, + "existingVnfGroupCounterMap": {}, + "existingVNFCounterMap": { + "d6557200-ecf2-4641-8094-5393ae3aae60": 1 + }, + "globalSubscriberId": "e433710f-9217-458d-a79d-1c7aff376d89", + "subscriptionServiceType": "TYLER SILVIA", + "owningEntityId": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc", + "productFamilyId": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e", + "lcpCloudRegionId": "hvf6", + "tenantId": "229bcdc6eaeb4ca59d55221141d01f8e", + "aicZoneId": "JAG1", + "projectName": "x1", + "rollbackOnFailure": "true", + "bulkSize": 1, + "modelInfo": { + "modelInvariantId": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0", + "modelVersionId": "6e59c5de-f052-46fa-aa7e-2fca9d674c44", + "modelName": "ComplexService", + "modelVersion": "1.0", + "uuid": "6e59c5de-f052-46fa-aa7e-2fca9d674c44" + }, + "isALaCarte": false, + "name": "ComplexService", + "version": "1.0", + "description": "ComplexService", + "category": "Emanuel", + "uuid": "6e59c5de-f052-46fa-aa7e-2fca9d674c44", + "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0", + "serviceType": "", + "serviceRole": "", + "isMultiStepDesign": false + }, + "6b528779-44a3-4472-bdff-9cd15ec93450": { + "networks": { + "ExtVL 0": { + "rollbackOnFailure": "true", + "isMissingData": false, + "originalName": "ExtVL 0", + "networkStoreKey": "ExtVL 0", + "trackById": "sf3zth68xjf", + "productFamilyId": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034", + "lcpCloudRegionId": "hvf6", + "tenantId": "229bcdc6eaeb4ca59d55221141d01f8e", + "platformName": "xxx1", + "lineOfBusiness": "ONAP", + "instanceParams": [ + {} + ], + "modelInfo": { + "modelInvariantId": "379f816b-a7aa-422f-be30-17114ff50b7c", + "modelVersionId": "ddc3f20c-08b5-40fd-af72-c6d14636b986", + "modelName": "ExtVL", + "modelVersion": "37.0", + "modelCustomizationId": "94fdd893-4a36-4d70-b16a-ec29c54c184f", + "modelCustomizationName": "ExtVL 0", + "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986" + }, + "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986" + }, + "ExtVL 0:0001": { + "rollbackOnFailure": "true", + "isMissingData": false, + "originalName": "ExtVL 0", + "networkStoreKey": "ExtVL 0", + "trackById": "2mdxioxca9h", + "productFamilyId": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034", + "lcpCloudRegionId": "hvf6", + "tenantId": "229bcdc6eaeb4ca59d55221141d01f8e", + "platformName": "xxx1", + "lineOfBusiness": "ONAP", + "instanceParams": [ + {} + ], + "modelInfo": { + "modelInvariantId": "379f816b-a7aa-422f-be30-17114ff50b7c", + "modelVersionId": "ddc3f20c-08b5-40fd-af72-c6d14636b986", + "modelName": "ExtVL", + "modelVersion": "37.0", + "modelCustomizationId": "94fdd893-4a36-4d70-b16a-ec29c54c184f", + "modelCustomizationName": "ExtVL 0", + "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986" + }, + "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986" + }, + "ExtVL 0_1": { + "rollbackOnFailure": "true", + "isMissingData": false, + "originalName": "ExtVL 0", + "networkStoreKey": "ExtVL 0_1", + "trackById": "z7vd1gmpbs", + "instanceName": "ExtVL", + "productFamilyId": "17cc1042-527b-11e6-beb8-9e71128cae77", + "lcpCloudRegionId": "hvf6", + "tenantId": "229bcdc6eaeb4ca59d55221141d01f8e", + "platformName": "xxx1", + "lineOfBusiness": "zzz1", + "instanceParams": [ + { + "vnf_config_template_version": "17.2", + "bandwidth_units": "Gbps", + "bandwidth": "10", + "AIC_CLLI": "ATLMY8GA", + "ASN": "AV_vPE", + "vnf_instance_name": "yoav" + } + ], + "modelInfo": { + "modelInvariantId": "379f816b-a7aa-422f-be30-17114ff50b7c", + "modelVersionId": "ddc3f20c-08b5-40fd-af72-c6d14636b986", + "modelName": "ExtVL", + "modelVersion": "37.0", + "modelCustomizationId": "94fdd893-4a36-4d70-b16a-ec29c54c184f", + "modelCustomizationName": "ExtVL 0", + "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986" + }, + "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986" + } + }, + "vnfs": { + "2017-488_ADIOD-vPE 0": { + "rollbackOnFailure": "true", + "vfModules": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1sgoqi": { + "instanceName": "yoav", + "volumeGroupName": "123", + "modelInfo": { + "modelInvariantId": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1", + "modelVersionId": "25284168-24bb-4698-8cb4-3f509146eca5", + "modelName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "modelVersion": "6", + "modelCustomizationId": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "uuid": "25284168-24bb-4698-8cb4-3f509146eca5" + }, + "uuid": "25284168-24bb-4698-8cb4-3f509146eca5", + "isMissingData": false, + "instanceParams": [ + { + "adiodvpe0_bandwidth": "10", + "2017488_adiodvpe0_vnf_instance_name": "mtnj309me6", + "2017488_adiodvpe0_vnf_config_template_version": "17.2", + "2017488_adiodvpe0_AIC_CLLI": "ATLMY8GA", + "adiodvpe0_bandwidth_units": "Gbps" + } + ] + } + } + }, + "isMissingData": false, + "originalName": "2017-488_ADIOD-vPE 0", + "vnfStoreKey": "2017-488_ADIOD-vPE 0", + "trackById": "o65b26t2thj", + "instanceName": "2017488_ADIODvPE", + "productFamilyId": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034", + "lcpCloudRegionId": "hvf6", + "tenantId": "bae71557c5bb4d5aac6743a4e5f1d054", + "platformName": "platform", + "lineOfBusiness": "ONAP", + "instanceParams": [ + {} + ], + "modelInfo": { + "modelInvariantId": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8", + "modelVersionId": "69e09f68-8b63-4cc9-b9ff-860960b5db09", + "modelName": "2017-488_ADIOD-vPE", + "modelVersion": "5.0", + "modelCustomizationId": "1da7b585-5e61-4993-b95e-8e6606c81e45", + "modelCustomizationName": "2017-488_ADIOD-vPE 0", + "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09" + }, + "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09" + } + }, + "instanceParams": [ + { + "2017488_adiodvpe0_ASN": "AV_vPE" + } + ], + "validationCounter": 0, + "existingNames": { + "123": "", + "instancename": "", + "yoav": "", + "extvl": "" + }, + "existingVNFCounterMap": { + "69e09f68-8b63-4cc9-b9ff-860960b5db09": 1 + }, + "existingNetworksCounterMap": { + "ddc3f20c-08b5-40fd-af72-c6d14636b986": 3 + }, + "instanceName": "InstanceName", + "globalSubscriberId": "e433710f-9217-458d-a79d-1c7aff376d89", + "subscriptionServiceType": "TYLER SILVIA", + "owningEntityId": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc", + "productFamilyId": "17cc1042-527b-11e6-beb8-9e71128cae77", + "lcpCloudRegionId": "JANET25", + "tenantId": "092eb9e8e4b7412e8787dd091bc58e86", + "aicZoneId": "JAG1", + "projectName": null, + "rollbackOnFailure": "true", + "aicZoneName": "YUDFJULP-JAG1", + "owningEntityName": "WayneHolland", + "testApi": "GR_API", + "tenantName": "USP-SIP-IC-24335-T-01", + "bulkSize": 1, + "modelInfo": { + "modelInvariantId": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0", + "modelVersionId": "6b528779-44a3-4472-bdff-9cd15ec93450", + "modelName": "action-data", + "modelVersion": "1.0", + "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450" + }, + "isALaCarte": false, + "name": "action-data", + "version": "1.0", + "description": "", + "category": "", + "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450", + "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0", + "serviceType": "", + "serviceRole": "", + "isMultiStepDesign": false + } + }, + "lcpRegionsAndTenants": { + "lcpRegionList": [ + { + "id": "JANET25", + "name": "JANET25", + "isPermitted": true + }, + { + "id": "hvf6", + "name": "hvf6", + "isPermitted": true + } + ], + "lcpRegionsTenantsMap": { + "JANET25": [ + { + "id": "092eb9e8e4b7412e8787dd091bc58e86", + "name": "USP-SIP-IC-24335-T-01", + "isPermitted": true + } + ], + "hvf6": [ + { + "id": "bae71557c5bb4d5aac6743a4e5f1d054", + "name": "AIN Web Tool-15-D-testalexandria", + "isPermitted": true + }, + { + "id": "229bcdc6eaeb4ca59d55221141d01f8e", + "name": "AIN Web Tool-15-D-STTest2", + "isPermitted": true + }, + { + "id": "1178612d2b394be4834ad77f567c0af2", + "name": "AIN Web Tool-15-D-SSPtestcustome", + "isPermitted": true + }, + { + "id": "19c5ade915eb461e8af52fb2fd8cd1f2", + "name": "AIN Web Tool-15-D-UncheckedEcopm", + "isPermitted": true + }, + { + "id": "de007636e25249238447264a988a927b", + "name": "AIN Web Tool-15-D-dfsdf", + "isPermitted": true + }, + { + "id": "62f29b3613634ca6a3065cbe0e020c44", + "name": "AIN/SMS-16-D-Multiservices1", + "isPermitted": true + }, + { + "id": "649289e30d3244e0b48098114d63c2aa", + "name": "AIN Web Tool-15-D-SSPST66", + "isPermitted": true + }, + { + "id": "3f21eeea6c2c486bba31dab816c05a32", + "name": "AIN Web Tool-15-D-ASSPST47", + "isPermitted": true + }, + { + "id": "f60ce21d3ee6427586cff0d22b03b773", + "name": "CESAR-100-D-sspjg67246", + "isPermitted": true + }, + { + "id": "8774659e425f479895ae091bb5d46560", + "name": "CESAR-100-D-sspjg68359", + "isPermitted": true + }, + { + "id": "624eb554b0d147c19ff8885341760481", + "name": "AINWebTool-15-D-iftach", + "isPermitted": true + }, + { + "id": "214f55f5fc414c678059c383b03e4962", + "name": "CESAR-100-D-sspjg612401", + "isPermitted": true + }, + { + "id": "c90666c291664841bb98e4d981ff1db5", + "name": "CESAR-100-D-sspjg621340", + "isPermitted": true + }, + { + "id": "ce5b6bc5c7b348e1bf4b91ac9a174278", + "name": "sspjg621351cloned", + "isPermitted": true + }, + { + "id": "b386b768a3f24c8e953abbe0b3488c02", + "name": "AINWebTool-15-D-eteancomp", + "isPermitted": true + }, + { + "id": "dc6c4dbfd225474e9deaadd34968646c", + "name": "AINWebTool-15-T-SPFET", + "isPermitted": true + }, + { + "id": "02cb5030e9914aa4be120bd9ed1e19eb", + "name": "AINWebTool-15-X-eeweww", + "isPermitted": true + }, + { + "id": "f2f3830e4c984d45bcd00e1a04158a79", + "name": "CESAR-100-D-spjg61909", + "isPermitted": true + }, + { + "id": "05b91bd5137f4929878edd965755c06d", + "name": "CESAR-100-D-sspjg621512cloned", + "isPermitted": true + }, + { + "id": "7002fbe8482d4a989ddf445b1ce336e0", + "name": "AINWebTool-15-X-vdr", + "isPermitted": true + }, + { + "id": "4008522be43741dcb1f5422022a2aa0b", + "name": "AINWebTool-15-D-ssasa", + "isPermitted": true + }, + { + "id": "f44e2e96a1b6476abfda2fa407b00169", + "name": "AINWebTool-15-D-PFNPT", + "isPermitted": true + }, + { + "id": "b69a52bec8a84669a37a1e8b72708be7", + "name": "AINWebTool-15-X-vdre", + "isPermitted": true + }, + { + "id": "fac7d9fd56154caeb9332202dcf2969f", + "name": "AINWebTool-15-X-NONPODECOMP", + "isPermitted": true + }, + { + "id": "2d34d8396e194eb49969fd61ffbff961", + "name": "DN5242-Nov16-T5", + "isPermitted": true + }, + { + "id": "cb42a77ff45b48a8b8deb83bb64acc74", + "name": "ro-T11", + "isPermitted": true + }, + { + "id": "fa45ca53c80b492fa8be5477cd84fc2b", + "name": "ro-T112", + "isPermitted": true + }, + { + "id": "4914ab0ab3a743e58f0eefdacc1dde77", + "name": "DN5242-Nov21-T1", + "isPermitted": true + }, + { + "id": "d0a3e3f2964542259d155a81c41aadc3", + "name": "test-hvf6-09", + "isPermitted": true + }, + { + "id": "cbb99fe4ada84631b7baf046b6fd2044", + "name": "DN5242-Nov16-T3", + "isPermitted": true + } + ] + } + }, + "productFamilies": [ + { + "id": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034", + "name": "SCOTTIE", + "isPermitted": true + }, + { + "id": "17cc1042-527b-11e6-beb8-9e71128cae77", + "name": "IGNACIO", + "isPermitted": true + }, + { + "id": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e", + "name": "Christie", + "isPermitted": true + }, + { + "id": "a4f6f2ae-9bf5-4ed7-b904-06b2099c4bd7", + "name": "Enhanced Services", + "isPermitted": true + }, + { + "id": "vTerrance", + "name": "vTerrance", + "isPermitted": true + }, + { + "id": "323d69d9-2efe-4r45-ay0a-89ea7ard4e6f", + "name": "vSCP", + "isPermitted": true + }, + { + "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb", + "name": "Emanuel", + "isPermitted": true + }, + { + "id": "d8a6ed93-251c-47ca-adc9-86671fd19f4c", + "name": "BVOIP", + "isPermitted": true + }, + { + "id": "db171b8f-115c-4992-a2e3-ee04cae357e0", + "name": "LINDSEY", + "isPermitted": true + }, + { + "id": "LRSI-OSPF", + "name": "LRSI-OSPF", + "isPermitted": true + }, + { + "id": "vRosemarie", + "name": "HNGATEWAY", + "isPermitted": true + }, + { + "id": "vHNPaas", + "name": "WILKINS", + "isPermitted": true + }, + { + "id": "e433710f-9217-458d-a79d-1c7aff376d89", + "name": "TYLER SILVIA", + "isPermitted": true + }, + { + "id": "b6a3f28c-eebf-494c-a900-055cc7c874ce", + "name": "VROUTER", + "isPermitted": true + }, + { + "id": "Cisneros", + "name": "vMuriel", + "isPermitted": true + }, + { + "id": "0ee8c1bc-7cbd-4b0a-a1ac-e9999255abc1", + "name": "CARA Griffin", + "isPermitted": true + }, + { + "id": "c7611ebe-c324-48f1-8085-94aef0c6ef3d", + "name": "DARREN MCGEE", + "isPermitted": true + }, + { + "id": "e30755dc-5673-4b6b-9dcf-9abdd96b93d1", + "name": "Transport", + "isPermitted": true + }, + { + "id": "vSalvatore", + "name": "vSalvatore", + "isPermitted": true + }, + { + "id": "d7bb0a21-66f2-4e6d-87d9-9ef3ced63ae4", + "name": "Josefina", + "isPermitted": true + }, + { + "id": "vHubbard", + "name": "vHubbard", + "isPermitted": true + }, + { + "id": "12a96a9d-4b4c-4349-a950-fe1159602621", + "name": "DARREN MCGEE", + "isPermitted": true + } + ], + "serviceTypes": { + "e433710f-9217-458d-a79d-1c7aff376d89": [ + { + "id": "0", + "name": "vRichardson", + "isPermitted": false + }, + { + "id": "1", + "name": "TYLER SILVIA", + "isPermitted": true + }, + { + "id": "2", + "name": "Emanuel", + "isPermitted": false + }, + { + "id": "3", + "name": "vJamie", + "isPermitted": false + }, + { + "id": "4", + "name": "vVoiceMail", + "isPermitted": false + }, + { + "id": "5", + "name": "Kennedy", + "isPermitted": false + }, + { + "id": "6", + "name": "vSEGW", + "isPermitted": false + }, + { + "id": "7", + "name": "vVM", + "isPermitted": false + }, + { + "id": "8", + "name": "vOTA", + "isPermitted": false + }, + { + "id": "9", + "name": "vMME", + "isPermitted": false + }, + { + "id": "10", + "name": "vMNS", + "isPermitted": false + }, + { + "id": "11", + "name": "vSCP", + "isPermitted": false + }, + { + "id": "12", + "name": "VPMS", + "isPermitted": false + }, + { + "id": "13", + "name": "vMMSC", + "isPermitted": false + }, + { + "id": "14", + "name": "SSD", + "isPermitted": false + }, + { + "id": "15", + "name": "vMOG", + "isPermitted": false + }, + { + "id": "16", + "name": "LINDSEY", + "isPermitted": false + }, + { + "id": "17", + "name": "JOHANNA_SANTOS", + "isPermitted": false + }, + { + "id": "18", + "name": "vCarroll", + "isPermitted": false + } + ] + }, + "aicZones": [ + { + "id": "NFT1", + "name": "NFTJSSSS-NFT1" + }, + { + "id": "JAG1", + "name": "YUDFJULP-JAG1" + }, + { + "id": "YYY1", + "name": "UUUAIAAI-YYY1" + }, + { + "id": "BAN1", + "name": "VSDKYUTP-BAN1" + }, + { + "id": "DKJ1", + "name": "DKJSJDKA-DKJ1" + }, + { + "id": "MCS1", + "name": "ASACMAMS-MCS1" + }, + { + "id": "UIO1", + "name": "uioclli1-UIO1" + }, + { + "id": "RAJ1", + "name": "YGBIJNLQ-RAJ1" + }, + { + "id": "OPA1", + "name": "opaclli1-OPA1" + }, + { + "id": "SDE1", + "name": "ZXCVBNMA-SDE1" + }, + { + "id": "VEN2", + "name": "FGHJUHIL-VEN2" + }, + { + "id": "ORL1", + "name": "ORLDFLMA-ORL1" + }, + { + "id": "JAD1", + "name": "JADECLLI-JAD1" + }, + { + "id": "ZXL1", + "name": "LWLWCANN-ZXL1" + }, + { + "id": "CKL1", + "name": "CLKSKCKK-CKL1" + }, + { + "id": "SDF1", + "name": "sdfclli1-SDF1" + }, + { + "id": "RAD1", + "name": "RADICAL1-RAD1" + }, + { + "id": "KIT1", + "name": "BHYJFGLN-KIT1" + }, + { + "id": "REL1", + "name": "INGERFGT-REL1" + }, + { + "id": "JNL1", + "name": "CJALSDAC-JNL1" + }, + { + "id": "OLK1", + "name": "OLKOLKLS-OLK1" + }, + { + "id": "CHI1", + "name": "CHILLIWE-CHI1" + }, + { + "id": "UUU4", + "name": "UUUAAAUU-UUU4" + }, + { + "id": "TUF1", + "name": "TUFCLLI1-TUF1" + }, + { + "id": "KJN1", + "name": "CKALDKSA-KJN1" + }, + { + "id": "SAM1", + "name": "SNDGCA64-SAN1" + }, + { + "id": "SCK1", + "name": "SCKSCKSK-SCK1" + }, + { + "id": "HJH1", + "name": "AOEEQQQD-HJH1" + }, + { + "id": "HGD1", + "name": "SDFQWHGD-HGD1" + }, + { + "id": "KOR1", + "name": "HYFLNBVT-KOR1" + }, + { + "id": "ATL43", + "name": "AICLOCID-ATL43" + }, + { + "id": "ATL54", + "name": "AICFTAAI-ATL54" + }, + { + "id": "ATL66", + "name": "CLLIAAII-ATL66" + }, + { + "id": "VEL1", + "name": "BNMLKUIK-VEL1" + }, + { + "id": "ICC1", + "name": "SANJITAT-ICC1" + }, + { + "id": "MNT11", + "name": "WSXEFBTH-MNT11" + }, + { + "id": "DEF2", + "name": "WSBHGTYL-DEF2" + }, + { + "id": "MAD11", + "name": "SDFQWGKL-MAD11" + }, + { + "id": "OLG1", + "name": "OLHOLHOL-OLG1" + }, + { + "id": "GAR1", + "name": "NGFVSJKO-GAR1" + }, + { + "id": "SAN22", + "name": "GNVLSCTL-SAN22" + }, + { + "id": "HRG1", + "name": "HRGHRGGS-HRG1" + }, + { + "id": "JCS1", + "name": "JCSJSCJS-JCS1" + }, + { + "id": "DHA12", + "name": "WSXEDECF-DHA12" + }, + { + "id": "HJE1", + "name": "AOEEWWWD-HJE1" + }, + { + "id": "NCA1", + "name": "NCANCANN-NCA1" + }, + { + "id": "IOP1", + "name": "iopclli1-IOP1" + }, + { + "id": "RTY1", + "name": "rtyclli1-RTY1" + }, + { + "id": "KAP1", + "name": "HIOUYTRQ-KAP1" + }, + { + "id": "ZEN1", + "name": "ZENCLLI1-ZEN1" + }, + { + "id": "HKA1", + "name": "JAKHLASS-HKA1" + }, + { + "id": "CQK1", + "name": "CQKSCAKK-CQK1" + }, + { + "id": "SAI1", + "name": "UBEKQLPD-SAI1" + }, + { + "id": "ERT1", + "name": "ertclli1-ERT1" + }, + { + "id": "IBB1", + "name": "PLMKOIJU-IBB1" + }, + { + "id": "TIR2", + "name": "PLKINHYI-TIR2" + }, + { + "id": "HSD1", + "name": "CHASKCDS-HSD1" + }, + { + "id": "SLF78", + "name": "SDCTLFN1-SLF78" + }, + { + "id": "SEE78", + "name": "SDCTEEE4-SEE78" + }, + { + "id": "SAN13", + "name": "TOKYJPFA-SAN13" + }, + { + "id": "SAA78", + "name": "SDCTAAA1-SAA78" + }, + { + "id": "LUC1", + "name": "ATLDFGYC-LUC1" + }, + { + "id": "AMD13", + "name": "MEMATLAN-AMD13" + }, + { + "id": "TOR1", + "name": "TOROONXN-TOR1" + }, + { + "id": "QWE1", + "name": "QWECLLI1-QWE1" + }, + { + "id": "ZOG1", + "name": "ZOGASTRO-ZOG1" + }, + { + "id": "CAL33", + "name": "CALIFORN-CAL33" + }, + { + "id": "SHH78", + "name": "SDIT1HHH-SHH78" + }, + { + "id": "DSA1", + "name": "LKJHGFDS-DSA1" + }, + { + "id": "CLG1", + "name": "CLGRABAD-CLG1" + }, + { + "id": "BNA1", + "name": "BNARAGBK-BNA1" + }, + { + "id": "ATL84", + "name": "CANTTCOC-ATL84" + }, + { + "id": "APP1", + "name": "WBHGTYUI-APP1" + }, + { + "id": "RJN1", + "name": "RJNRBZAW-RJN1" + }, + { + "id": "EHH78", + "name": "SDCSHHH5-EHH78" + }, + { + "id": "mac10", + "name": "PKGTESTF-mac10" + }, + { + "id": "SXB78", + "name": "SDCTGXB1-SXB78" + }, + { + "id": "SAX78", + "name": "SDCTAXG1-SAX78" + }, + { + "id": "SYD1", + "name": "SYDNAUBV-SYD1" + }, + { + "id": "TOK1", + "name": "TOKYJPFA-TOK1" + }, + { + "id": "KGM2", + "name": "KGMTNC20-KGM2" + }, + { + "id": "DCC1b", + "name": "POIUYTGH-DCC1b" + }, + { + "id": "SKK78", + "name": "SDCTKKK1-SKK78" + }, + { + "id": "SGG78", + "name": "SDCTGGG1-SGG78" + }, + { + "id": "SJJ78", + "name": "SDCTJJJ1-SJJ78" + }, + { + "id": "SBX78", + "name": "SDCTBXG1-SBX78" + }, + { + "id": "LAG1", + "name": "LARGIZON-LAG1" + }, + { + "id": "IAA1", + "name": "QAZXSWED-IAA1" + }, + { + "id": "POI1", + "name": "PLMNJKIU-POI1" + }, + { + "id": "LAG1a", + "name": "LARGIZON-LAG1a" + }, + { + "id": "PBL1", + "name": "PBLAPBAI-PBL1" + }, + { + "id": "LAG45", + "name": "LARGIZON-LAG1a" + }, + { + "id": "MAR1", + "name": "MNBVCXZM-MAR1" + }, + { + "id": "HST70", + "name": "HSTNTX70-HST70" + }, + { + "id": "DCC1a", + "name": "POIUYTGH-DCC1a" + }, + { + "id": "TOL1", + "name": "TOLDOH21-TOL1" + }, + { + "id": "LON1", + "name": "LONEENCO-LON1" + }, + { + "id": "SJU78", + "name": "SDIT1JUB-SJU78" + }, + { + "id": "STN27", + "name": "HSTNTX01-STN27" + }, + { + "id": "SSW56", + "name": "ss8126GT-SSW56" + }, + { + "id": "SBB78", + "name": "SDIT1BBB-SBB78" + }, + { + "id": "DCC3", + "name": "POIUYTGH-DCC3" + }, + { + "id": "GNV1", + "name": "GNVLSCTL-GNV1" + }, + { + "id": "WAS1", + "name": "WASHDCSW-WAS1" + }, + { + "id": "TOY1", + "name": "TORYONNZ-TOY1" + }, + { + "id": "STT1", + "name": "STTLWA02-STT1" + }, + { + "id": "STG1", + "name": "STTGGE62-STG1" + }, + { + "id": "SLL78", + "name": "SDCTLLL1-SLL78" + }, + { + "id": "SBU78", + "name": "SDIT1BUB-SBU78" + }, + { + "id": "ATL2", + "name": "ATLNGANW-ATL2" + }, + { + "id": "BOT1", + "name": "BOTHWAKY-BOT1" + }, + { + "id": "SNG1", + "name": "SNGPSIAU-SNG1" + }, + { + "id": "NYC1", + "name": "NYCMNY54-NYC1" + }, + { + "id": "LAG1b", + "name": "LARGIZON-LAG1b" + }, + { + "id": "AMD15", + "name": "AMDFAA01-AMD15" + }, + { + "id": "SNA1", + "name": "SNANTXCA-SNA1" + }, + { + "id": "PLT1", + "name": "PLTNCA60-PLT1" + }, + { + "id": "TLP1", + "name": "TLPNXM18-TLP1" + }, + { + "id": "SDD81", + "name": "SAIT1DD6-SDD81" + }, + { + "id": "DCC1", + "name": "POIUYTGH-DCC1" + }, + { + "id": "DCC2", + "name": "POIUYTGH-DCC2" + }, + { + "id": "OKC1", + "name": "OKCBOK55-OKC1" + }, + { + "id": "PAR1", + "name": "PARSFRCG-PAR1" + }, + { + "id": "TES36", + "name": "ABCEETES-TES36" + }, + { + "id": "COM1", + "name": "PLMKOPIU-COM1" + }, + { + "id": "ANI1", + "name": "ATLNGTRE-ANI1" + }, + { + "id": "SDG78", + "name": "SDIT1BDG-SDG78" + }, + { + "id": "mac20", + "name": "PKGTESTF-mac20" + }, + { + "id": "DSF45", + "name": "DSFBG123-DSF45" + }, + { + "id": "HST25", + "name": "HSTNTX01-HST25" + }, + { + "id": "AMD18", + "name": "AUDIMA01-AMD18" + }, + { + "id": "SAA80", + "name": "SAIT9AA3-SAA80" + }, + { + "id": "SSA56", + "name": "SSIT2AA7-SSA56" + }, + { + "id": "SDD82", + "name": "SAIT1DD9-SDD82" + }, + { + "id": "JCV1", + "name": "JCVLFLBW-JCV1" + }, + { + "id": "SUL2", + "name": "WERTYUJK-SUL2" + }, + { + "id": "PUR1", + "name": "purelyde-PUR1" + }, + { + "id": "FDE55", + "name": "FDERT555-FDE55" + }, + { + "id": "SITE", + "name": "LONEENCO-SITE" + }, + { + "id": "ATL1", + "name": "ATLNGAMA-ATL1" + }, + { + "id": "JUL1", + "name": "ZXCVBNMM-JUL1" + }, + { + "id": "TAT34", + "name": "TESAAISB-TAT34" + }, + { + "id": "XCP12", + "name": "CHKGH123-XCP12" + }, + { + "id": "RAI1", + "name": "poiuytre-RAI1" + }, + { + "id": "HPO1", + "name": "ATLNGAUP-HPO1" + }, + { + "id": "KJF12", + "name": "KJFDH123-KJF12" + }, + { + "id": "SCC80", + "name": "SAIT9CC3-SCC80" + }, + { + "id": "SAA12", + "name": "SAIT9AF8-SAA12" + }, + { + "id": "SAA14", + "name": "SAIT1AA9-SAA14" + }, + { + "id": "ATL35", + "name": "TTESSAAI-ATL35" + }, + { + "id": "CWY1", + "name": "CWYMOWBS-CWY1" + }, + { + "id": "ATL76", + "name": "TELEPAAI-ATL76" + }, + { + "id": "DSL12", + "name": "DSLFK242-DSL12" + }, + { + "id": "ATL53", + "name": "AAIATLTE-ATL53" + }, + { + "id": "SAA11", + "name": "SAIT9AA2-SAA11" + }, + { + "id": "ATL62", + "name": "TESSASCH-ATL62" + }, + { + "id": "AUG1", + "name": "ASDFGHJK-AUG1" + }, + { + "id": "POI22", + "name": "POIUY123-POI22" + }, + { + "id": "SAA13", + "name": "SAIT1AA9-SAA13" + }, + { + "id": "BHY17", + "name": "BHYTFRF3-BHY17" + }, + { + "id": "LIS1", + "name": "HOSTPROF-LIS1" + }, + { + "id": "SIP1", + "name": "ZXCVBNMK-SIP1" + }, + { + "id": "ATL99", + "name": "TEESTAAI-ATL43" + }, + { + "id": "ATL64", + "name": "FORLOAAJ-ATL64" + }, + { + "id": "TAT33", + "name": "TESAAISA-TAT33" + }, + { + "id": "RAD10", + "name": "INDIPUNE-RAD10" + }, + { + "id": "RTW5", + "name": "BHYTFRY4-RTW5" + }, + { + "id": "JGS1", + "name": "KSJKKKKK-JGS1" + }, + { + "id": "ATL98", + "name": "TEESTAAI-ATL43" + }, + { + "id": "WAN1", + "name": "LEIWANGW-WAN1" + }, + { + "id": "ATL44", + "name": "ATLSANAB-ATL44" + }, + { + "id": "RTD2", + "name": "BHYTFRk4-RTD2" + }, + { + "id": "NIR1", + "name": "ORFLMANA-NIR1" + }, + { + "id": "ATL75", + "name": "SANAAIRE-ATL75" + }, + { + "id": "NUM1", + "name": "QWERTYUI-NUM1" + }, + { + "id": "MTN32", + "name": "MDTWNJ21-MTN32" + }, + { + "id": "RTZ4", + "name": "BHYTFRZ6-RTZ4" + }, + { + "id": "ATL56", + "name": "ATLSANAC-ATL56" + }, + { + "id": "AMS1", + "name": "AMSTNLBW-AMS1" + }, + { + "id": "RCT1", + "name": "AMSTERNL-RCT1" + }, + { + "id": "JAN1", + "name": "ORFLMATT-JAN1" + }, + { + "id": "ABC14", + "name": "TESAAISA-ABC14" + }, + { + "id": "TAT37", + "name": "TESAAISD-TAT37" + }, + { + "id": "MIC54", + "name": "MICHIGAN-MIC54" + }, + { + "id": "ABC11", + "name": "ATLSANAI-ABC11" + }, + { + "id": "AMF11", + "name": "AMDOCS01-AMF11" + }, + { + "id": "ATL63", + "name": "ATLSANEW-ATL63" + }, + { + "id": "ABC12", + "name": "ATLSECIA-ABC12" + }, + { + "id": "MTN20", + "name": "MDTWNJ21-MTN20" + }, + { + "id": "ABC15", + "name": "AAITESAN-ABC15" + }, + { + "id": "AVT1", + "name": "AVTRFLHD-AVT1" + }, + { + "id": "ATL34", + "name": "ATLSANAI-ATL34" + } + ], + "categoryParameters": { + "owningEntityList": [ + { + "id": "aaa1", + "name": "aaa1" + }, + { + "id": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc", + "name": "WayneHolland" + }, + { + "id": "Melissa", + "name": "Melissa" + } + ], + "projectList": [ + { + "id": "WATKINS", + "name": "WATKINS" + }, + { + "id": "x1", + "name": "x1" + }, + { + "id": "yyy1", + "name": "yyy1" + } + ], + "lineOfBusinessList": [ + { + "id": "ONAP", + "name": "ONAP" + }, + { + "id": "zzz1", + "name": "zzz1" + } + ], + "platformList": [ + { + "id": "platform", + "name": "platform" + }, + { + "id": "xxx1", + "name": "xxx1" + } + ] + }, + "type": "[LCP_REGIONS_AND_TENANTS] Update", + "subscribers": [ + { + "id": "CAR_2020_ER", + "name": "CAR_2020_ER", + "isPermitted": true + }, + { + "id": "21014aa2-526b-11e6-beb8-9e71128cae77", + "name": "JULIO ERICKSON", + "isPermitted": false + }, + { + "id": "DHV1707-TestSubscriber-2", + "name": "DALE BRIDGES", + "isPermitted": false + }, + { + "id": "DHV1707-TestSubscriber-1", + "name": "LLOYD BRIDGES", + "isPermitted": false + }, + { + "id": "jimmy-example", + "name": "JimmyExampleCust-20161102", + "isPermitted": false + }, + { + "id": "jimmy-example2", + "name": "JimmyExampleCust-20161103", + "isPermitted": false + }, + { + "id": "ERICA5779-TestSub-PWT-102", + "name": "ERICA5779-TestSub-PWT-102", + "isPermitted": false + }, + { + "id": "ERICA5779-TestSub-PWT-101", + "name": "ERICA5779-TestSub-PWT-101", + "isPermitted": false + }, + { + "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb", + "name": "Emanuel", + "isPermitted": false + }, + { + "id": "ERICA5779-Subscriber-4", + "name": "ERICA5779-Subscriber-5", + "isPermitted": false + }, + { + "id": "ERICA5779-TestSub-PWT-103", + "name": "ERICA5779-TestSub-PWT-103", + "isPermitted": false + }, + { + "id": "ERICA5779-Subscriber-2", + "name": "ERICA5779-Subscriber-2", + "isPermitted": false + }, + { + "id": "e433710f-9217-458d-a79d-1c7aff376d89", + "name": "SILVIA ROBBINS", + "isPermitted": true + }, + { + "id": "ERICA5779-Subscriber-3", + "name": "ERICA5779-Subscriber-3", + "isPermitted": false + }, + { + "id": "31739f3e-526b-11e6-beb8-9e71128cae77", + "name": "CRAIG/ROBERTS", + "isPermitted": false + } + ] + } + }; + } +} + +class MockFeatureFlagsService {} + +describe('vnf new popup service', () => { + let injector; + let service: VnfPopupService; + let genericFormService: GenericFormService + let defaultDataGeneratorService: DefaultDataGeneratorService; + let fb: FormBuilder; + let iframeService: IframeService; + + + beforeAll(done => (async () => { + TestBed.configureTestingModule({ + providers : [ + VnfPopupService, + DefaultDataGeneratorService, + GenericFormService, + FormBuilder, + IframeService, + {provide:FeatureFlagsService, useClass: MockFeatureFlagsService}, + AaiService, + LogService, + BasicPopupService, + VfModulePopuopService, + BasicControlGenerator, + VnfControlGenerator, + {provide: NgRedux, useClass: MockReduxStore}, + {provide: HttpClient, useClass: MockAppStore}, + ] + }); + await TestBed.compileComponents(); + + injector = getTestBed(); + service = injector.get(VnfPopupService); + genericFormService = injector.get(GenericFormService); + defaultDataGeneratorService = injector.get(DefaultDataGeneratorService); + fb = injector.get(FormBuilder); + iframeService = injector.get(IframeService); + + })().then(done).catch(done.fail)); + + test('getTitle vnf should return the correct title for edit and create mode', () => { + expect(service.getTitle(false)).toBe('Set a new VNF'); + expect(service.getTitle(true)).toBe('Edit VNF instance'); + }); + + test('getSubRightTitle vnf should return popup type', () => { + expect(service.getSubRightTitle()).toBe('VNF Instance Details'); + }); + + test('getModelInformation vnf should update modelInformations', () => { + const serviceId: string = '6b528779-44a3-4472-bdff-9cd15ec93450'; + const vnfModelName: string = '2017-388_ADIOD-vPE 1'; + service.getModelInformation(serviceId, vnfModelName); + expect(service.modelInformations.length).toEqual(14); + expect(service.modelInformations[0].label).toEqual("Subscriber Name"); + expect(service.modelInformations[0].values).toEqual(['SILVIA ROBBINS']); + + expect(service.modelInformations[1].label).toEqual("Service Name"); + expect(service.modelInformations[1].values).toEqual(['action-data']); + + expect(service.modelInformations[2].label).toEqual("Service Instance Name"); + expect(service.modelInformations[2].values).toEqual(['InstanceName']); + + expect(service.modelInformations[3].label).toEqual("Model Name"); + expect(service.modelInformations[3].values).toEqual(['2017-388_ADIOD-vPE']); + + expect(service.modelInformations[4].label).toEqual("Model version"); + expect(service.modelInformations[4].values).toEqual(['1.0']); + + expect(service.modelInformations[5].label).toEqual("Description"); + expect(service.modelInformations[5].values).toEqual(['Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM']); + + expect(service.modelInformations[6].label).toEqual("Category"); + expect(service.modelInformations[6].values).toEqual([undefined]); + + expect(service.modelInformations[7].label).toEqual("Sub Category"); + expect(service.modelInformations[7].values).toEqual([undefined]); + + expect(service.modelInformations[8].label).toEqual("UUID"); + expect(service.modelInformations[8].values).toEqual(['0903e1c0-8e03-4936-b5c2-260653b96413']); + + expect(service.modelInformations[9].label).toEqual("Invariant UUID"); + expect(service.modelInformations[9].values).toEqual(['00beb8f9-6d39-452f-816d-c709b9cbb87d']); + + expect(service.modelInformations[10].label).toEqual("Service type"); + expect(service.modelInformations[10].values).toEqual(['']); + + expect(service.modelInformations[11].label).toEqual("Service role"); + expect(service.modelInformations[11].values).toEqual(['']); + + expect(service.modelInformations[12].label).toEqual("Minimum to instantiate"); + expect(service.modelInformations[12].values).toEqual(['0']); + + expect(service.modelInformations[13].label).toEqual("Maximum to instantiate"); + expect(service.modelInformations[13].values).toEqual(['5']); + }); + + test('getSubLeftTitle new vnf popup should return service model name', () => { + service.uuidData = { + serviceId: '6e59c5de-f052-46fa-aa7e-2fca9d674c44', + modelName: 'VF_vMee 0' + }; + expect(service.getSubLeftTitle()).toBe('VNF MODEL: VF_vMee'); + }); + + test('getInstance with empty storekey should be created', () => { + const serviceId: string = '6e59c5de-f052-46fa-aa7e-2fca9d674c44'; + const vnfModelName: string = '2017-388_ADIOD-vPE 1'; + const newInstance = service.getInstance(serviceId, vnfModelName, null); + expect(newInstance).toBeDefined(); + }); + + test('getInstance with not empty storekey should return vnfStoreKey', () => { + const serviceId: string = '6b528779-44a3-4472-bdff-9cd15ec93450'; + const vnfModelName: string = '2017-388_ADIOD-vPE 1'; + const vnfStoreKey: string = '2017-488_ADIOD-vPE 0'; + const newInstance = service.getInstance(serviceId, vnfModelName, vnfStoreKey); + expect(newInstance.vnfStoreKey).toEqual('2017-488_ADIOD-vPE 0'); + }); + + test('getGenericFormPopupDetails returns the FormPopupDetails object', () => { + const serviceId: string = '6e59c5de-f052-46fa-aa7e-2fca9d674c44'; + const vnfModelName: string = 'VF_vMee 0'; + const vnfStoreKey: string = 'VF_vMee 0'; + let uuidData: UUIDData = <any>{ + serviceId: "6e59c5de-f052-46fa-aa7e-2fca9d674c44", + modelName: "VF_vMee 0", + vnfStoreKey: "VF_vMee 0" + }; + const formPopupDetailsObject = service.getGenericFormPopupDetails(serviceId, vnfModelName, vnfStoreKey, null, uuidData, true); + expect(formPopupDetailsObject).toBeDefined(); + } + ); +}); diff --git a/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/vnf/vnf.popup.service.ts b/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/vnf/vnf.popup.service.ts new file mode 100644 index 000000000..8969e3c15 --- /dev/null +++ b/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/vnf/vnf.popup.service.ts @@ -0,0 +1,158 @@ +import {Injectable} from '@angular/core'; +import {GenericPopupInterface} from "../generic-popup.interface"; +import {ITreeNode} from "angular-tree-component/dist/defs/api"; +import {FormPopupDetails, PopupType} from "../../../../models/formControlModels/formPopupDetails.model"; +import {FormGroup} from "@angular/forms"; +import {ModelInformationItem} from "../../../model-information/model-information.component"; +import {ServiceModel} from "../../../../models/serviceModel"; +import {Subject} from "rxjs/Subject"; +import {BasicControlGenerator} from "../../../genericForm/formControlsServices/basic.control.generator"; +import {VnfControlGenerator} from "../../../genericForm/formControlsServices/vnfGenerator/vnf.control.generator"; +import {IframeService} from "../../../../utils/iframe.service"; +import {DefaultDataGeneratorService} from "../../../../services/defaultDataServiceGenerator/default.data.generator.service"; +import {AaiService} from "../../../../services/aaiService/aai.service"; +import {BasicPopupService} from "../basic.popup.service"; +import {NgRedux} from "@angular-redux/store"; +import {AppState} from "../../../../store/reducers"; +import {Subscriber} from "../../../../models/subscriber"; +import {Constants} from "../../../../utils/constants"; +import {VnfInstance} from "../../../../models/vnfInstance"; +import {ModelInfo} from "../../../../models/modelInfo"; +import {changeInstanceCounter} from "../../../../storeUtil/utils/general/general.actions"; +import {createVNFInstance, updateVNFInstance} from "../../../../storeUtil/utils/vnf/vnf.actions"; +import * as _ from 'lodash'; + +@Injectable() +export class VnfPopupService implements GenericPopupInterface{ + dynamicInputs: any; + instance: any; + model:any; + serviceModel:ServiceModel; + modelInformations: ModelInformationItem[] = []; + uuidData: Object; + closeDialogEvent: Subject<any> = new Subject<any>(); + isUpdateMode: boolean; + + constructor( + private _basicControlGenerator: BasicControlGenerator, + private _vnfControlGenerator: VnfControlGenerator, + private _iframeService: IframeService, + private _defaultDataGeneratorService: DefaultDataGeneratorService, + private _aaiService: AaiService, + private _basicPopupService: BasicPopupService, + private _store: NgRedux<AppState>) { + } + + getGenericFormPopupDetails(serviceId: string, modelName: string, vnfStoreKey: string, node: ITreeNode, uuidData: Object, isUpdateMode: boolean): FormPopupDetails { + this.uuidData = uuidData; + this.isUpdateMode = isUpdateMode; + this.instance = this.getInstance(serviceId, modelName, vnfStoreKey); + this.getModelInformation(serviceId, modelName); + + return new FormPopupDetails(this, + PopupType.VNF_MACRO, + uuidData, + this.getTitle(isUpdateMode), + this.getSubLeftTitle(), + this.getSubRightTitle(), + this.getControls(serviceId, modelName, vnfStoreKey), + this._basicPopupService.getDynamicInputs(serviceId, modelName, vnfStoreKey, 'vnfs'), + this.modelInformations, + (that, form: FormGroup) => {that.onSubmit(that, form);}, + (that: any, form: FormGroup) => {that.onCancel(that, form); } + ) + } + + getControls(serviceId: string, modelName: string, vnfStoreKey: string){ + if(this._store.getState().service.serviceHierarchy[serviceId].service.instantiationType === 'Macro') { + return this._vnfControlGenerator.getMacroFormControls(serviceId, vnfStoreKey, modelName); + } else { + return this._vnfControlGenerator.getAlaCarteFormControls(serviceId, vnfStoreKey, modelName); + } + } + + getInstance(serviceId: string, modelName: string, vnfStoreKey: string): any { + if(_.isNil(vnfStoreKey)){ + return new VnfInstance(); + } + return this._store.getState().service.serviceInstance[serviceId].vnfs[vnfStoreKey]; + } + + getModelInformation(serviceId: string, modelName: string): void { + this._aaiService.getServiceModelById(serviceId).subscribe((result: any) => { + this.serviceModel = new ServiceModel(result); + this.model = this._basicPopupService.getModelFromResponse(result, 'vnfs', modelName); + const serviceInstance = this._store.getState().service.serviceInstance[serviceId]; + this.modelInformations = [ + new ModelInformationItem("Subscriber Name", "subscriberName", [this.extractSubscriberNameBySubscriberId(serviceInstance.globalSubscriberId, this._store)], "", true), + new ModelInformationItem("Service Name", "serviceModelName", [this.serviceModel.name], "", true), + new ModelInformationItem("Service Instance Name", "serviceName", [serviceInstance.instanceName], "", false), + new ModelInformationItem("Model Name", "modelName", [this.model.name], "", true), + new ModelInformationItem("Model version", "modelVersion", [this.model.version], "", true), + new ModelInformationItem("Description", "description", [this.model.description]), + new ModelInformationItem("Category", "category", [this.model.category]), + new ModelInformationItem("Sub Category", "subCategory", [this.model.subCategory]), + new ModelInformationItem("UUID", "uuid", [this.model.uuid], Constants.ServicePopup.TOOLTIP_UUID, true), + new ModelInformationItem("Invariant UUID", "invariantUuid", [this.model.invariantUuid], Constants.ServicePopup.TOOLTIP_INVARIANT_UUID, true), + new ModelInformationItem("Service type", "serviceType", [this.serviceModel.serviceType]), + new ModelInformationItem("Service role", "serviceRole", [this.serviceModel.serviceRole]), + new ModelInformationItem("Minimum to instantiate", "vnf-min", [!_.isNil(this.model.min) ? this.model.min.toString() : '0'], "", false), + new ModelInformationItem("Maximum to instantiate", "vnf-max", [!_.isNil(this.model.max) ? this.model.max.toString() : '1'], "", false) + ]; + }) + } + + getSubLeftTitle(): string { + return "VNF MODEL: " + this._store.getState().service.serviceHierarchy[this.uuidData['serviceId']].vnfs[this.uuidData['modelName']].name; + } + + getSubRightTitle(): string { + return "VNF Instance Details"; + } + + storeVNF = (that, formValues: any): void => { + formValues.modelInfo = new ModelInfo(that.model); + formValues.uuid = formValues.modelInfo.uuid; + formValues.isMissingData = false; + if(!that.isUpdateMode){ + that._store.dispatch(changeInstanceCounter(formValues.modelInfo.modelUniqueId, that.uuidData.serviceId, 1 , <any> {data: {type: 'VF'}})); + this._store.dispatch(createVNFInstance(formValues, that.uuidData['modelName'], that.uuidData['serviceId'], that.uuidData['modelName'])); + }else { + that._store.dispatch(updateVNFInstance(formValues, that.uuidData.modelName, that.uuidData.serviceId, that.uuidData.vnfStoreKey)) + } + }; + + getTitle(isUpdateMode: boolean): string { + return isUpdateMode ? "Edit VNF instance": "Set a new VNF" ; + } + + onCancel(that, form): void { + form.reset(); + that._iframeService.removeClassCloseModal('content'); + this.closeDialogEvent.next(that); + } + + onSubmit(that, form: FormGroup, ...args): void { + form.value['instanceParams'] = form.value['instanceParams'] && [form.value['instanceParams']]; + that.storeVNF(that, form.value); + window.parent.postMessage( { + eventId: 'submitIframe', + data: { + serviceModelId: that.uuidData.serviceId + } + }, "*"); + that.onCancel(that, form); + } + + extractSubscriberNameBySubscriberId(subscriberId: string, store: NgRedux<AppState>) { + let result: string = null; + let filteredArray: any = _.filter(store.getState().service.subscribers, function (o: Subscriber) { + return o.id === subscriberId + }); + if (filteredArray.length > 0) { + result = filteredArray[0].name; + } + return result; + } + +} diff --git a/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/vnfGroup/vnfGroup.popup.service.spec.ts b/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/vnfGroup/vnfGroup.popup.service.spec.ts new file mode 100644 index 000000000..6027f4346 --- /dev/null +++ b/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/vnfGroup/vnfGroup.popup.service.spec.ts @@ -0,0 +1,3239 @@ +import {DefaultDataGeneratorService} from "../../../../services/defaultDataServiceGenerator/default.data.generator.service"; +import {NgRedux} from "@angular-redux/store"; +import {ReflectiveInjector} from "@angular/core"; +import {IframeService} from "../../../../utils/iframe.service"; +import {VfModulePopuopService} from "../vfModule/vfModule.popuop.service"; +import {FormBuilder} from "@angular/forms"; +import {GenericFormService} from "../../../genericForm/generic-form.service"; +import {BasicPopupService} from "../basic.popup.service"; +import {AaiService} from "../../../../services/aaiService/aai.service"; +import {LogService} from "../../../../utils/log/log.service"; +import {HttpClient} from "@angular/common/http"; +import {BasicControlGenerator} from "../../../genericForm/formControlsServices/basic.control.generator"; +import {UUIDData} from "../../generic-form-popup.component"; +import {FeatureFlagsService} from "../../../../services/featureFlag/feature-flags.service"; +import {VnfGroupPopupService} from "./vnfGroup.popup.service"; +import {VnfGroupControlGenerator} from "../../../genericForm/formControlsServices/vnfGroupGenerator/vnfGroup.control.generator"; +import {getTestBed, TestBed} from "@angular/core/testing"; + +class MockAppStore<T> {} + +class MockReduxStore<T> { + getState() { + return { + "global": { + "name": null, + "flags": { + "FLAG_NETWORK_TO_ASYNC_INSTANTIATION": false, + "FLAG_SHOW_ASSIGNMENTS": true, + "FLAG_FABRIC_CONFIGURATION_ASSIGNMENTS": true, + "FLAG_UNASSIGN_SERVICE": true, + "FLAG_SHOW_VERIFY_SERVICE": false, + "FLAG_COLLECTION_RESOURCE_SUPPORT": true, + "FLAG_DUPLICATE_VNF": true, + "FLAG_SERVICE_MODEL_CACHE": true, + "FLAG_ADVANCED_PORTS_FILTER": true, + "CREATE_INSTANCE_TEST": false, + "FLAG_SETTING_DEFAULTS_IN_DRAWING_BOARD": false, + "FLAG_REGION_ID_FROM_REMOTE": true, + "FLAG_ASYNC_INSTANTIATION": true, + "FLAG_ASYNC_JOBS": true, + "EMPTY_DRAWING_BOARD_TEST": false, + "FLAG_ADD_MSO_TESTAPI_FIELD": true + }, + "type": "[FLAGS] Update" + }, + "service": { + "serviceHierarchy": { + "6e59c5de-f052-46fa-aa7e-2fca9d674c44": { + "service": { + "uuid": "6e59c5de-f052-46fa-aa7e-2fca9d674c44", + "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0", + "name": "ComplexService", + "version": "1.0", + "toscaModelURL": null, + "category": "Emanuel", + "serviceType": "", + "serviceRole": "", + "description": "ComplexService", + "serviceEcompNaming": "false", + "instantiationType": "Macro", + "inputs": {} + }, + "vnfGroups": { + "VF_vMee 0": { + "uuid": "d6557200-ecf2-4641-8094-5393ae3aae60", + "invariantUuid": "4160458e-f648-4b30-a176-43881ffffe9e", + "description": "VSP_vMee", + "name": "VF_vMee", + "version": "2.0", + "customizationUuid": "91415b44-753d-494c-926a-456a9172bbb9", + "inputs": {}, + "commands": {}, + "properties": { + "max_instances": 10, + "min_instances": 1, + "gpb2_Internal2_mac": "00:11:22:EF:AC:DF", + "sctp-b-ipv6-egress_src_start_port": "0", + "sctp-a-ipv6-egress_rule_application": "any", + "Internal2_allow_transit": "true", + "sctp-b-IPv6_ethertype": "IPv6", + "sctp-a-egress_rule_application": "any", + "sctp-b-ingress_action": "pass", + "sctp-b-ingress_rule_protocol": "icmp", + "ncb2_Internal1_mac": "00:11:22:EF:AC:DF", + "sctp-b-ipv6-ingress-src_start_port": "0.0", + "ncb1_Internal2_mac": "00:11:22:EF:AC:DF", + "fsb_volume_size_0": "320.0", + "sctp-b-egress_src_addresses": "local", + "sctp-a-ipv6-ingress_ethertype": "IPv4", + "sctp-a-ipv6-ingress-dst_start_port": "0", + "sctp-b-ipv6-ingress_rule_application": "any", + "domain_name": "default-domain", + "sctp-a-ingress_rule_protocol": "icmp", + "sctp-b-egress-src_start_port": "0.0", + "sctp-a-egress_src_addresses": "local", + "sctp-b-display_name": "epc-sctp-b-ipv4v6-sec-group", + "sctp-a-egress-src_start_port": "0.0", + "sctp-a-ingress_ethertype": "IPv4", + "sctp-b-ipv6-ingress-dst_end_port": "65535", + "sctp-b-dst_subnet_prefix_v6": "::", + "nf_naming": "{ecomp_generated_naming=true}", + "sctp-a-ipv6-ingress_src_subnet_prefix": "0.0.0.0", + "sctp-b-egress-dst_start_port": "0.0", + "ncb_flavor_name": "nv.c20r64d1", + "gpb1_Internal1_mac": "00:11:22:EF:AC:DF", + "sctp-b-egress_dst_subnet_prefix_len": "0.0", + "Internal2_net_cidr": "10.0.0.10", + "sctp-a-ingress-dst_start_port": "0.0", + "sctp-a-egress-dst_start_port": "0.0", + "fsb1_Internal2_mac": "00:11:22:EF:AC:DF", + "sctp-a-egress_ethertype": "IPv4", + "vlc_st_service_mode": "in-network-nat", + "sctp-a-ipv6-egress_ethertype": "IPv4", + "sctp-a-egress-src_end_port": "65535.0", + "sctp-b-ipv6-egress_rule_application": "any", + "sctp-b-egress_action": "pass", + "sctp-a-ingress-src_subnet_prefix_len": "0.0", + "sctp-b-ipv6-ingress-src_end_port": "65535.0", + "sctp-b-name": "epc-sctp-b-ipv4v6-sec-group", + "fsb2_Internal1_mac": "00:11:22:EF:AC:DF", + "sctp-a-ipv6-ingress-src_start_port": "0.0", + "sctp-b-ipv6-egress_ethertype": "IPv4", + "Internal1_net_cidr": "10.0.0.10", + "sctp-a-egress_dst_subnet_prefix": "0.0.0.0", + "fsb_flavor_name": "nv.c20r64d1", + "sctp_rule_protocol": "132", + "sctp-b-ipv6-ingress_src_subnet_prefix_len": "0", + "sctp-a-ipv6-ingress_rule_application": "any", + "ecomp_generated_naming": "false", + "sctp-a-IPv6_ethertype": "IPv6", + "vlc2_Internal1_mac": "00:11:22:EF:AC:DF", + "vlc_st_virtualization_type": "virtual-machine", + "sctp-b-ingress-dst_start_port": "0.0", + "sctp-b-ingress-dst_end_port": "65535.0", + "sctp-a-ipv6-ingress-src_end_port": "65535.0", + "sctp-a-display_name": "epc-sctp-a-ipv4v6-sec-group", + "sctp-b-ingress_rule_application": "any", + "int2_sec_group_name": "int2-sec-group", + "vlc_flavor_name": "nd.c16r64d1", + "sctp-b-ipv6-egress_src_addresses": "local", + "vlc_st_interface_type_int1": "other1", + "sctp-b-egress-src_end_port": "65535.0", + "sctp-a-ipv6-egress-dst_start_port": "0", + "vlc_st_interface_type_int2": "other2", + "sctp-a-ipv6-egress_rule_protocol": "any", + "Internal2_shared": "false", + "sctp-a-ipv6-egress_dst_subnet_prefix_len": "0", + "Internal2_rpf": "disable", + "vlc1_Internal1_mac": "00:11:22:EF:AC:DF", + "sctp-b-ipv6-egress_src_end_port": "65535", + "sctp-a-ipv6-egress_src_addresses": "local", + "sctp-a-ingress-dst_end_port": "65535.0", + "sctp-a-ipv6-egress_src_end_port": "65535", + "Internal1_forwarding_mode": "l2", + "Internal2_dhcp": "false", + "sctp-a-dst_subnet_prefix_v6": "::", + "pxe_image_name": "MME_PXE-Boot_16ACP04_GA.qcow2", + "vlc_st_interface_type_gtp": "other0", + "ncb1_Internal1_mac": "00:11:22:EF:AC:DF", + "sctp-b-src_subnet_prefix_v6": "::", + "sctp-a-egress_dst_subnet_prefix_len": "0.0", + "int1_sec_group_name": "int1-sec-group", + "Internal1_dhcp": "false", + "sctp-a-ipv6-egress_dst_end_port": "65535", + "Internal2_forwarding_mode": "l2", + "fsb2_Internal2_mac": "00:11:22:EF:AC:DF", + "sctp-b-egress_dst_subnet_prefix": "0.0.0.0", + "Internal1_net_cidr_len": "17", + "gpb2_Internal1_mac": "00:11:22:EF:AC:DF", + "sctp-b-ingress-src_subnet_prefix_len": "0.0", + "sctp-a-ingress_dst_addresses": "local", + "sctp-a-egress_action": "pass", + "fsb_volume_type_0": "SF-Default-SSD", + "ncb2_Internal2_mac": "00:11:22:EF:AC:DF", + "vlc_st_interface_type_sctp_a": "left", + "vlc_st_interface_type_sctp_b": "right", + "sctp-a-src_subnet_prefix_v6": "::", + "vlc_st_version": "2", + "sctp-b-egress_ethertype": "IPv4", + "sctp-a-ingress_rule_application": "any", + "gpb1_Internal2_mac": "00:11:22:EF:AC:DF", + "instance_ip_family_v6": "v6", + "sctp-a-ipv6-egress_src_start_port": "0", + "sctp-b-ingress-src_start_port": "0.0", + "sctp-b-ingress_dst_addresses": "local", + "fsb1_Internal1_mac": "00:11:22:EF:AC:DF", + "vlc_st_interface_type_oam": "management", + "multi_stage_design": "true", + "oam_sec_group_name": "oam-sec-group", + "Internal2_net_gateway": "10.0.0.10", + "sctp-a-ipv6-ingress-dst_end_port": "65535", + "sctp-b-ipv6-egress-dst_start_port": "0", + "Internal1_net_gateway": "10.0.0.10", + "sctp-b-ipv6-egress_rule_protocol": "any", + "gtp_sec_group_name": "gtp-sec-group", + "sctp-a-ipv6-egress_dst_subnet_prefix": "0.0.0.0", + "sctp-b-ipv6-egress_dst_subnet_prefix_len": "0", + "sctp-a-ipv6-ingress_dst_addresses": "local", + "sctp-a-egress_rule_protocol": "icmp", + "sctp-b-ipv6-egress_action": "pass", + "sctp-a-ipv6-egress_action": "pass", + "Internal1_shared": "false", + "sctp-b-ipv6-ingress_rule_protocol": "any", + "Internal2_net_cidr_len": "17", + "sctp-a-name": "epc-sctp-a-ipv4v6-sec-group", + "sctp-a-ingress-src_end_port": "65535.0", + "sctp-b-ipv6-ingress_src_subnet_prefix": "0.0.0.0", + "sctp-a-egress-dst_end_port": "65535.0", + "sctp-a-ingress_action": "pass", + "sctp-b-egress_rule_protocol": "icmp", + "sctp-b-ipv6-ingress_action": "pass", + "vlc_st_service_type": "firewall", + "sctp-b-ipv6-egress_dst_end_port": "65535", + "sctp-b-ipv6-ingress-dst_start_port": "0", + "vlc2_Internal2_mac": "00:11:22:EF:AC:DF", + "vlc_st_availability_zone": "true", + "fsb_volume_image_name_1": "MME_FSB2_16ACP04_GA.qcow2", + "sctp-b-ingress-src_subnet_prefix": "0.0.0.0", + "sctp-a-ipv6-ingress_src_subnet_prefix_len": "0", + "Internal1_allow_transit": "true", + "gpb_flavor_name": "nv.c20r64d1", + "availability_zone_max_count": "1", + "fsb_volume_image_name_0": "MME_FSB1_16ACP04_GA.qcow2", + "sctp-b-ipv6-ingress_dst_addresses": "local", + "sctp-b-ipv6-egress_dst_subnet_prefix": "0.0.0.0", + "sctp-b-ipv6-ingress_ethertype": "IPv4", + "vlc1_Internal2_mac": "00:11:22:EF:AC:DF", + "sctp-a-ingress-src_subnet_prefix": "0.0.0.0", + "sctp-a-ipv6-ingress_action": "pass", + "Internal1_rpf": "disable", + "sctp-b-ingress_ethertype": "IPv4", + "sctp-b-egress_rule_application": "any", + "sctp-b-ingress-src_end_port": "65535.0", + "sctp-a-ipv6-ingress_rule_protocol": "any", + "sctp-a-ingress-src_start_port": "0.0", + "sctp-b-egress-dst_end_port": "65535.0" + }, + "type": "VnfGroup", + "modelCustomizationName": "VF_vMee 0", + "vfModules": { + "vf_vmee0..VfVmee..vmme_vlc..module-1": { + "uuid": "522159d5-d6e0-4c2a-aa44-5a542a12a830", + "invariantUuid": "98a7c88b-b577-476a-90e4-e25a5871e02b", + "customizationUuid": "55b1be94-671a-403e-a26c-667e9c47d091", + "description": null, + "name": "VfVmee..vmme_vlc..module-1", + "version": "2", + "modelCustomizationName": "VfVmee..vmme_vlc..module-1", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "vmme_vlc" + }, + "inputs": {}, + "volumeGroupAllowed": true + }, + "vf_vmee0..VfVmee..vmme_gpb..module-2": { + "uuid": "41708296-e443-4c71-953f-d9a010f059e1", + "invariantUuid": "1cca90b8-3490-495e-87da-3f3e4c57d5b9", + "customizationUuid": "6add59e0-7fe1-4bc4-af48-f8812422ae7c", + "description": null, + "name": "VfVmee..vmme_gpb..module-2", + "version": "2", + "modelCustomizationName": "VfVmee..vmme_gpb..module-2", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "vmme_gpb" + }, + "inputs": {}, + "volumeGroupAllowed": false + }, + "vf_vmee0..VfVmee..base_vmme..module-0": { + "uuid": "a27f5cfc-7f12-4f99-af08-0af9c3885c87", + "invariantUuid": "a6f9e51a-2b35-416a-ae15-15e58d61f36d", + "customizationUuid": "f8c040f1-7e51-4a11-aca8-acf256cfd861", + "description": null, + "name": "VfVmee..base_vmme..module-0", + "version": "2", + "modelCustomizationName": "VfVmee..base_vmme..module-0", + "properties": { + "minCountInstances": 1, + "maxCountInstances": 1, + "initialCount": 1, + "vfModuleLabel": "base_vmme" + }, + "inputs": {}, + "volumeGroupAllowed": true + } + }, + "volumeGroups": { + "vf_vmee0..VfVmee..base_vmme..module-0": { + "uuid": "a27f5cfc-7f12-4f99-af08-0af9c3885c87", + "invariantUuid": "a6f9e51a-2b35-416a-ae15-15e58d61f36d", + "customizationUuid": "f8c040f1-7e51-4a11-aca8-acf256cfd861", + "description": null, + "name": "VfVmee..base_vmme..module-0", + "version": "2", + "modelCustomizationName": "VfVmee..base_vmme..module-0", + "properties": { + "minCountInstances": 1, + "maxCountInstances": 1, + "initialCount": 1, + "vfModuleLabel": "base_vmme" + }, + "inputs": {} + } + }, + "vfcInstanceGroups": {} + } + }, + "networks": { + "ExtVL 0": { + "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986", + "invariantUuid": "379f816b-a7aa-422f-be30-17114ff50b7c", + "description": "ECOMP generic virtual link (network) base type for all other service-level and global networks", + "name": "ExtVL", + "version": "37.0", + "customizationUuid": "94fdd893-4a36-4d70-b16a-ec29c54c184f", + "inputs": {}, + "commands": {}, + "properties": { + "netowrk_role": "role 1, role 2, role 3", + "network_assignments": "{is_external_network=false, ipv4_subnet_default_assignment={min_subnets_count=1}, ecomp_generated_network_assignment=false, ipv6_subnet_default_assignment={min_subnets_count=1}}", + "exVL_naming": "{ecomp_generated_naming=true}", + "network_flows": "{is_network_policy=false, is_bound_to_vpn=false}", + "network_homing": "{ecomp_selected_instance_node_target=false}" + }, + "type": "VL", + "modelCustomizationName": "ExtVL 0" + } + }, + "collectionResource": {}, + "configurations": { + "Port Mirroring Configuration By Policy 0": { + "uuid": "b4398538-e89d-4f13-b33d-ca323434ba50", + "invariantUuid": "6ef0ca40-f366-4897-951f-abd65d25f6f7", + "description": "A port mirroring configuration by policy object", + "name": "Port Mirroring Configuration By Policy", + "version": "27.0", + "customizationUuid": "3c3b7b8d-8669-4b3b-8664-61970041fad2", + "inputs": {}, + "commands": {}, + "properties": {}, + "type": "Configuration", + "modelCustomizationName": "Port Mirroring Configuration By Policy 0", + "sourceNodes": [], + "collectorNodes": null, + "configurationByPolicy": false + } + }, + "serviceProxies": {}, + "vfModules": { + "vf_vmee0..VfVmee..vmme_vlc..module-1": { + "uuid": "522159d5-d6e0-4c2a-aa44-5a542a12a830", + "invariantUuid": "98a7c88b-b577-476a-90e4-e25a5871e02b", + "customizationUuid": "55b1be94-671a-403e-a26c-667e9c47d091", + "description": null, + "name": "VfVmee..vmme_vlc..module-1", + "version": "2", + "modelCustomizationName": "VfVmee..vmme_vlc..module-1", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "vmme_vlc" + }, + "inputs": {}, + "volumeGroupAllowed": true + }, + "vf_vmee0..VfVmee..vmme_gpb..module-2": { + "uuid": "41708296-e443-4c71-953f-d9a010f059e1", + "invariantUuid": "1cca90b8-3490-495e-87da-3f3e4c57d5b9", + "customizationUuid": "6add59e0-7fe1-4bc4-af48-f8812422ae7c", + "description": null, + "name": "VfVmee..vmme_gpb..module-2", + "version": "2", + "modelCustomizationName": "VfVmee..vmme_gpb..module-2", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "vmme_gpb" + }, + "inputs": {}, + "volumeGroupAllowed": false + }, + "vf_vmee0..VfVmee..base_vmme..module-0": { + "uuid": "a27f5cfc-7f12-4f99-af08-0af9c3885c87", + "invariantUuid": "a6f9e51a-2b35-416a-ae15-15e58d61f36d", + "customizationUuid": "f8c040f1-7e51-4a11-aca8-acf256cfd861", + "description": null, + "name": "VfVmee..base_vmme..module-0", + "version": "2", + "modelCustomizationName": "VfVmee..base_vmme..module-0", + "properties": { + "minCountInstances": 1, + "maxCountInstances": 1, + "initialCount": 1, + "vfModuleLabel": "base_vmme" + }, + "inputs": {}, + "volumeGroupAllowed": true + } + }, + "volumeGroups": { + "vf_vmee0..VfVmee..base_vmme..module-0": { + "uuid": "a27f5cfc-7f12-4f99-af08-0af9c3885c87", + "invariantUuid": "a6f9e51a-2b35-416a-ae15-15e58d61f36d", + "customizationUuid": "f8c040f1-7e51-4a11-aca8-acf256cfd861", + "description": null, + "name": "VfVmee..base_vmme..module-0", + "version": "2", + "modelCustomizationName": "VfVmee..base_vmme..module-0", + "properties": { + "minCountInstances": 1, + "maxCountInstances": 1, + "initialCount": 1, + "vfModuleLabel": "base_vmme" + }, + "inputs": {} + } + }, + "pnfs": {} + }, + "6b528779-44a3-4472-bdff-9cd15ec93450": { + "service": { + "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450", + "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0", + "name": "action-data", + "version": "1.0", + "toscaModelURL": null, + "category": "", + "serviceType": "", + "serviceRole": "", + "description": "", + "serviceEcompNaming": "false", + "instantiationType": "A-La-Carte", + "inputs": { + "2017488_adiodvpe0_ASN": { + "type": "string", + "description": "AV/PE", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "AV_vPE" + } + } + }, + "vnfGroups": { + "2017-388_ADIOD-vPE 1": { + "uuid": "0903e1c0-8e03-4936-b5c2-260653b96413", + "invariantUuid": "00beb8f9-6d39-452f-816d-c709b9cbb87d", + "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM", + "name": "2017-388_ADIOD-vPE", + "version": "1.0", + "customizationUuid": "280dec31-f16d-488b-9668-4aae55d6648a", + "inputs": { + "vnf_config_template_version": { + "type": "string", + "description": "VPE Software Version", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "17.2" + }, + "bandwidth_units": { + "type": "string", + "description": "Units of bandwidth", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "Gbps" + }, + "bandwidth": { + "type": "string", + "description": "Requested VPE bandwidth", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "10" + }, + "AIC_CLLI": { + "type": "string", + "description": "AIC Site CLLI", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "ATLMY8GA" + }, + "ASN": { + "type": "string", + "description": "AV/PE", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "AV_vPE" + }, + "vnf_instance_name": { + "type": "string", + "description": "The hostname assigned to the vpe.", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "mtnj309me6" + } + }, + "commands": { + "vnf_config_template_version": { + "displayName": "vnf_config_template_version", + "command": "get_input", + "inputName": "2017488_adiodvpe0_vnf_config_template_version" + }, + "bandwidth_units": { + "displayName": "bandwidth_units", + "command": "get_input", + "inputName": "adiodvpe0_bandwidth_units" + }, + "bandwidth": { + "displayName": "bandwidth", + "command": "get_input", + "inputName": "adiodvpe0_bandwidth" + }, + "AIC_CLLI": { + "displayName": "AIC_CLLI", + "command": "get_input", + "inputName": "2017488_adiodvpe0_AIC_CLLI" + }, + "ASN": { + "displayName": "ASN", + "command": "get_input", + "inputName": "2017488_adiodvpe0_ASN" + }, + "vnf_instance_name": { + "displayName": "vnf_instance_name", + "command": "get_input", + "inputName": "2017488_adiodvpe0_vnf_instance_name" + } + }, + "properties": { + "max_instances": 5, + "vmxvre_retype": "RE-VMX", + "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version", + "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d", + "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9", + "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF", + "int_ctl_net_name": "VMX-INTXI", + "vmx_int_ctl_prefix": "10.0.0.10", + "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5", + "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279", + "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a", + "nf_type": "vPE", + "vmxvpfe_int_ctl_ip_1": "10.0.0.10", + "is_AVPN_service": "false", + "vmx_RSG_name": "vREXI-affinity", + "vmx_int_ctl_forwarding": "l2", + "vmxvre_oam_ip_0": "10.0.0.10", + "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvpfe_sriov41_0_port_vlanstrip": "false", + "vmxvpfe_sriov42_0_port_vlanfilter": "4001", + "vmxvpfe_sriov44_0_port_unknownunicastallow": "true", + "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2", + "vmxvre_instance": "0", + "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvre_flavor_name": "ns.c1r16d32.v5", + "vmxvpfe_volume_size_0": "40.0", + "vmxvpfe_sriov43_0_port_vlanfilter": "4001", + "nf_naming": "{ecomp_generated_naming=false}", + "nf_naming_code": "Navneet", + "vmxvre_name_0": "vREXI", + "vmxvpfe_sriov42_0_port_vlanstrip": "false", + "vmxvpfe_volume_name_0": "vPFEXI_FBVolume", + "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141", + "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2", + "vmxvpfe_sriov43_0_port_unknownunicastallow": "true", + "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true", + "vmxvre_console": "vidconsole", + "vmxvpfe_sriov44_0_port_vlanfilter": "4001", + "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3", + "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true", + "vmxvpfe_sriov44_0_port_vlanstrip": "false", + "vf_module_id": "123", + "nf_function": "JAI", + "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true", + "vmxvre_int_ctl_ip_0": "10.0.0.10", + "ecomp_generated_naming": "false", + "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI", + "vnf_name": "mtnj309me6vre", + "vmxvpfe_sriov41_0_port_unknownunicastallow": "true", + "vmxvre_volume_type_1": "HITACHI", + "vmxvpfe_sriov44_0_port_broadcastallow": "true", + "vmxvre_volume_type_0": "HITACHI", + "vmxvpfe_volume_type_0": "HITACHI", + "vmxvpfe_sriov43_0_port_broadcastallow": "true", + "bandwidth_units": "get_input:adiodvpe0_bandwidth_units", + "vnf_id": "123", + "vmxvre_oam_prefix": "24", + "availability_zone_0": "mtpocfo-kvm-az01", + "ASN": "get_input:2017488_adiodvpe0_ASN", + "vmxvre_chassis_i2cid": "161", + "vmxvpfe_name_0": "vPFEXI", + "bandwidth": "get_input:adiodvpe0_bandwidth", + "availability_zone_max_count": "1", + "vmxvre_volume_size_0": "45.0", + "vmxvre_volume_size_1": "50.0", + "vmxvpfe_sriov42_0_port_broadcastallow": "true", + "vmxvre_oam_gateway": "10.0.0.10", + "vmxvre_volume_name_1": "vREXI_FAVolume", + "vmxvre_ore_present": "0", + "vmxvre_volume_name_0": "vREXI_FBVolume", + "vmxvre_type": "0", + "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name", + "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true", + "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429", + "vmx_int_ctl_len": "24", + "vmxvpfe_sriov43_0_port_vlanstrip": "false", + "vmxvpfe_sriov41_0_port_broadcastallow": "true", + "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d", + "vmxvpfe_sriov41_0_port_vlanfilter": "4001", + "nf_role": "Testing", + "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a", + "vmxvpfe_sriov42_0_port_unknownunicastallow": "true", + "vmxvpfe_flavor_name": "ns.c20r16d25.v5" + }, + "type": "VnfGroup", + "modelCustomizationName": "2017-388_ADIOD-vPE 1", + "vfModules": {}, + "volumeGroups": {}, + "vfcInstanceGroups": {} + }, + "2017-388_ADIOD-vPE 0": { + "uuid": "afacccf6-397d-45d6-b5ae-94c39734b168", + "invariantUuid": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8", + "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM", + "name": "2017-388_ADIOD-vPE", + "version": "4.0", + "customizationUuid": "b3c76f73-eeb5-4fb6-9d31-72a889f1811c", + "inputs": { + "vnf_config_template_version": { + "type": "string", + "description": "VPE Software Version", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "17.2" + }, + "bandwidth_units": { + "type": "string", + "description": "Units of bandwidth", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "Gbps" + }, + "bandwidth": { + "type": "string", + "description": "Requested VPE bandwidth", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "10" + }, + "AIC_CLLI": { + "type": "string", + "description": "AIC Site CLLI", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "ATLMY8GA" + }, + "ASN": { + "type": "string", + "description": "AV/PE", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "AV_vPE" + }, + "vnf_instance_name": { + "type": "string", + "description": "The hostname assigned to the vpe.", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "mtnj309me6" + } + }, + "commands": { + "vnf_config_template_version": { + "displayName": "vnf_config_template_version", + "command": "get_input", + "inputName": "2017488_adiodvpe0_vnf_config_template_version" + }, + "bandwidth_units": { + "displayName": "bandwidth_units", + "command": "get_input", + "inputName": "adiodvpe0_bandwidth_units" + }, + "bandwidth": { + "displayName": "bandwidth", + "command": "get_input", + "inputName": "adiodvpe0_bandwidth" + }, + "AIC_CLLI": { + "displayName": "AIC_CLLI", + "command": "get_input", + "inputName": "2017488_adiodvpe0_AIC_CLLI" + }, + "ASN": { + "displayName": "ASN", + "command": "get_input", + "inputName": "2017488_adiodvpe0_ASN" + }, + "vnf_instance_name": { + "displayName": "vnf_instance_name", + "command": "get_input", + "inputName": "2017488_adiodvpe0_vnf_instance_name" + } + }, + "properties": { + "vmxvre_retype": "RE-VMX", + "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version", + "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d", + "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9", + "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF", + "int_ctl_net_name": "VMX-INTXI", + "vmx_int_ctl_prefix": "10.0.0.10", + "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5", + "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279", + "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a", + "nf_type": "vPE", + "vmxvpfe_int_ctl_ip_1": "10.0.0.10", + "is_AVPN_service": "false", + "vmx_RSG_name": "vREXI-affinity", + "vmx_int_ctl_forwarding": "l2", + "vmxvre_oam_ip_0": "10.0.0.10", + "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvpfe_sriov41_0_port_vlanstrip": "false", + "vmxvpfe_sriov42_0_port_vlanfilter": "4001", + "vmxvpfe_sriov44_0_port_unknownunicastallow": "true", + "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2", + "vmxvre_instance": "0", + "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvre_flavor_name": "ns.c1r16d32.v5", + "vmxvpfe_volume_size_0": "40.0", + "vmxvpfe_sriov43_0_port_vlanfilter": "4001", + "nf_naming": "{ecomp_generated_naming=false}", + "nf_naming_code": "Navneet", + "vmxvre_name_0": "vREXI", + "vmxvpfe_sriov42_0_port_vlanstrip": "false", + "vmxvpfe_volume_name_0": "vPFEXI_FBVolume", + "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141", + "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2", + "vmxvpfe_sriov43_0_port_unknownunicastallow": "true", + "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true", + "vmxvre_console": "vidconsole", + "vmxvpfe_sriov44_0_port_vlanfilter": "4001", + "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3", + "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true", + "min_instances": "1", + "vmxvpfe_sriov44_0_port_vlanstrip": "false", + "vf_module_id": "123", + "nf_function": "JAI", + "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true", + "vmxvre_int_ctl_ip_0": "10.0.0.10", + "ecomp_generated_naming": "false", + "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI", + "vnf_name": "mtnj309me6vre", + "vmxvpfe_sriov41_0_port_unknownunicastallow": "true", + "vmxvre_volume_type_1": "HITACHI", + "vmxvpfe_sriov44_0_port_broadcastallow": "true", + "vmxvre_volume_type_0": "HITACHI", + "vmxvpfe_volume_type_0": "HITACHI", + "vmxvpfe_sriov43_0_port_broadcastallow": "true", + "bandwidth_units": "get_input:adiodvpe0_bandwidth_units", + "vnf_id": "123", + "vmxvre_oam_prefix": "24", + "availability_zone_0": "mtpocfo-kvm-az01", + "ASN": "get_input:2017488_adiodvpe0_ASN", + "vmxvre_chassis_i2cid": "161", + "vmxvpfe_name_0": "vPFEXI", + "bandwidth": "get_input:adiodvpe0_bandwidth", + "availability_zone_max_count": "1", + "vmxvre_volume_size_0": "45.0", + "vmxvre_volume_size_1": "50.0", + "vmxvpfe_sriov42_0_port_broadcastallow": "true", + "vmxvre_oam_gateway": "10.0.0.10", + "vmxvre_volume_name_1": "vREXI_FAVolume", + "vmxvre_ore_present": "0", + "vmxvre_volume_name_0": "vREXI_FBVolume", + "vmxvre_type": "0", + "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name", + "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true", + "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429", + "vmx_int_ctl_len": "24", + "vmxvpfe_sriov43_0_port_vlanstrip": "false", + "vmxvpfe_sriov41_0_port_broadcastallow": "true", + "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d", + "vmxvpfe_sriov41_0_port_vlanfilter": "4001", + "nf_role": "Testing", + "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a", + "vmxvpfe_sriov42_0_port_unknownunicastallow": "true", + "vmxvpfe_flavor_name": "ns.c20r16d25.v5" + }, + "type": "VnfGroup", + "modelCustomizationName": "2017-388_ADIOD-vPE 0", + "vfModules": {}, + "volumeGroups": {}, + "vfcInstanceGroups": {} + }, + "2017-488_ADIOD-vPE 0": { + "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09", + "invariantUuid": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8", + "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM", + "name": "2017-488_ADIOD-vPE", + "version": "5.0", + "customizationUuid": "1da7b585-5e61-4993-b95e-8e6606c81e45", + "inputs": { + "vnf_config_template_version": { + "type": "string", + "description": "VPE Software Version", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "17.2" + }, + "bandwidth_units": { + "type": "string", + "description": "Units of bandwidth", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "Gbps" + }, + "bandwidth": { + "type": "string", + "description": "Requested VPE bandwidth", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "10" + }, + "AIC_CLLI": { + "type": "string", + "description": "AIC Site CLLI", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "ATLMY8GA" + }, + "ASN": { + "type": "string", + "description": "AV/PE", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "AV_vPE" + }, + "vnf_instance_name": { + "type": "string", + "description": "The hostname assigned to the vpe.", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "mtnj309me6" + } + }, + "commands": { + "vnf_config_template_version": { + "displayName": "vnf_config_template_version", + "command": "get_input", + "inputName": "2017488_adiodvpe0_vnf_config_template_version" + }, + "bandwidth_units": { + "displayName": "bandwidth_units", + "command": "get_input", + "inputName": "adiodvpe0_bandwidth_units" + }, + "bandwidth": { + "displayName": "bandwidth", + "command": "get_input", + "inputName": "adiodvpe0_bandwidth" + }, + "AIC_CLLI": { + "displayName": "AIC_CLLI", + "command": "get_input", + "inputName": "2017488_adiodvpe0_AIC_CLLI" + }, + "ASN": { + "displayName": "ASN", + "command": "get_input", + "inputName": "2017488_adiodvpe0_ASN" + }, + "vnf_instance_name": { + "displayName": "vnf_instance_name", + "command": "get_input", + "inputName": "2017488_adiodvpe0_vnf_instance_name" + } + }, + "properties": { + "vmxvre_retype": "RE-VMX", + "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version", + "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d", + "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9", + "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF", + "int_ctl_net_name": "VMX-INTXI", + "vmx_int_ctl_prefix": "10.0.0.10", + "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5", + "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279", + "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a", + "nf_type": "vPE", + "vmxvpfe_int_ctl_ip_1": "10.0.0.10", + "is_AVPN_service": "false", + "vmx_RSG_name": "vREXI-affinity", + "vmx_int_ctl_forwarding": "l2", + "vmxvre_oam_ip_0": "10.0.0.10", + "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvpfe_sriov41_0_port_vlanstrip": "false", + "vmxvpfe_sriov42_0_port_vlanfilter": "4001", + "vmxvpfe_sriov44_0_port_unknownunicastallow": "true", + "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2", + "vmxvre_instance": "0", + "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvre_flavor_name": "ns.c1r16d32.v5", + "vmxvpfe_volume_size_0": "40.0", + "vmxvpfe_sriov43_0_port_vlanfilter": "4001", + "nf_naming": "{ecomp_generated_naming=false}", + "nf_naming_code": "Navneet", + "vmxvre_name_0": "vREXI", + "vmxvpfe_sriov42_0_port_vlanstrip": "false", + "vmxvpfe_volume_name_0": "vPFEXI_FBVolume", + "max_instances": "3", + "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141", + "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2", + "vmxvpfe_sriov43_0_port_unknownunicastallow": "true", + "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true", + "vmxvre_console": "vidconsole", + "vmxvpfe_sriov44_0_port_vlanfilter": "4001", + "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF", + "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3", + "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true", + "min_instances": "1", + "vmxvpfe_sriov44_0_port_vlanstrip": "false", + "vf_module_id": "123", + "nf_function": "JAI", + "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true", + "vmxvre_int_ctl_ip_0": "10.0.0.10", + "ecomp_generated_naming": "false", + "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI", + "vnf_name": "mtnj309me6vre", + "vmxvpfe_sriov41_0_port_unknownunicastallow": "true", + "vmxvre_volume_type_1": "HITACHI", + "vmxvpfe_sriov44_0_port_broadcastallow": "true", + "vmxvre_volume_type_0": "HITACHI", + "vmxvpfe_volume_type_0": "HITACHI", + "vmxvpfe_sriov43_0_port_broadcastallow": "true", + "bandwidth_units": "get_input:adiodvpe0_bandwidth_units", + "vnf_id": "123", + "vmxvre_oam_prefix": "24", + "availability_zone_0": "mtpocfo-kvm-az01", + "ASN": "get_input:2017488_adiodvpe0_ASN", + "vmxvre_chassis_i2cid": "161", + "vmxvpfe_name_0": "vPFEXI", + "bandwidth": "get_input:adiodvpe0_bandwidth", + "availability_zone_max_count": "1", + "vmxvre_volume_size_0": "45.0", + "vmxvre_volume_size_1": "50.0", + "vmxvpfe_sriov42_0_port_broadcastallow": "true", + "vmxvre_oam_gateway": "10.0.0.10", + "vmxvre_volume_name_1": "vREXI_FAVolume", + "vmxvre_ore_present": "0", + "vmxvre_volume_name_0": "vREXI_FBVolume", + "vmxvre_type": "0", + "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name", + "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true", + "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429", + "vmx_int_ctl_len": "24", + "vmxvpfe_sriov43_0_port_vlanstrip": "false", + "vmxvpfe_sriov41_0_port_broadcastallow": "true", + "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d", + "vmxvpfe_sriov41_0_port_vlanfilter": "4001", + "nf_role": "Testing", + "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a", + "vmxvpfe_sriov42_0_port_unknownunicastallow": "true", + "vmxvpfe_flavor_name": "ns.c20r16d25.v5" + }, + "type": "VnfGroup", + "modelCustomizationName": "2017-488_ADIOD-vPE 0", + "vfModules": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": { + "uuid": "25284168-24bb-4698-8cb4-3f509146eca5", + "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1", + "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vRE_BV" + }, + "inputs": { + "adiodvpe0_bandwidth": { + "type": "string", + "description": "Requested VPE bandwidth", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "bandwidth" + }, + "constraints": null, + "required": true, + "default": "10" + }, + "2017488_adiodvpe0_vnf_instance_name": { + "type": "string", + "description": "The hostname assigned to the vpe.", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "vnf_instance_name" + }, + "constraints": null, + "required": true, + "default": "mtnj309me6" + }, + "2017488_adiodvpe0_vnf_config_template_version": { + "type": "string", + "description": "VPE Software Version", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "vnf_config_template_version" + }, + "constraints": null, + "required": true, + "default": "17.2" + }, + "2017488_adiodvpe0_AIC_CLLI": { + "type": "string", + "description": "AIC Site CLLI", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "AIC_CLLI" + }, + "constraints": null, + "required": true, + "default": "ATLMY8GA" + }, + "adiodvpe0_bandwidth_units": { + "type": "string", + "description": "Units of bandwidth", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "bandwidth_units" + }, + "constraints": null, + "required": true, + "default": "Gbps" + } + }, + "volumeGroupAllowed": true + }, + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": { + "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db", + "invariantUuid": "b34833bb-6aa9-4ad6-a831-70b06367a091", + "customizationUuid": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3", + "description": null, + "name": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0", + "version": "5", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0", + "properties": { + "minCountInstances": 1, + "maxCountInstances": 1, + "initialCount": 1, + "vfModuleLabel": "ADIOD_base_vPE_BV" + }, + "inputs": {}, + "volumeGroupAllowed": false + }, + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": { + "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a", + "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339", + "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vPFE_BV" + }, + "inputs": {}, + "volumeGroupAllowed": true + } + }, + "volumeGroups": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": { + "uuid": "25284168-24bb-4698-8cb4-3f509146eca5", + "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1", + "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vRE_BV" + }, + "inputs": { + "adiodvpe0_bandwidth": { + "type": "string", + "description": "Requested VPE bandwidth", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "bandwidth" + }, + "constraints": null, + "required": true, + "default": "10" + }, + "2017488_adiodvpe0_vnf_instance_name": { + "type": "string", + "description": "The hostname assigned to the vpe.", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "vnf_instance_name" + }, + "constraints": null, + "required": true, + "default": "mtnj309me6" + }, + "2017488_adiodvpe0_vnf_config_template_version": { + "type": "string", + "description": "VPE Software Version", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "vnf_config_template_version" + }, + "constraints": null, + "required": true, + "default": "17.2" + }, + "2017488_adiodvpe0_AIC_CLLI": { + "type": "string", + "description": "AIC Site CLLI", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "AIC_CLLI" + }, + "constraints": null, + "required": true, + "default": "ATLMY8GA" + }, + "adiodvpe0_bandwidth_units": { + "type": "string", + "description": "Units of bandwidth", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "bandwidth_units" + }, + "constraints": null, + "required": true, + "default": "Gbps" + } + } + }, + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": { + "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a", + "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339", + "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vPFE_BV" + }, + "inputs": {} + } + }, + "vfcInstanceGroups": {} + } + }, + "networks": { + "ExtVL 0": { + "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986", + "invariantUuid": "379f816b-a7aa-422f-be30-17114ff50b7c", + "description": "ECOMP generic virtual link (network) base type for all other service-level and global networks", + "name": "ExtVL", + "version": "37.0", + "customizationUuid": "94fdd893-4a36-4d70-b16a-ec29c54c184f", + "inputs": { + "vnf_config_template_version": { + "type": "string", + "description": "VPE Software Version", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "17.2" + }, + "bandwidth_units": { + "type": "string", + "description": "Units of bandwidth", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "Gbps" + }, + "bandwidth": { + "type": "string", + "description": "Requested VPE bandwidth", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "10" + }, + "AIC_CLLI": { + "type": "string", + "description": "AIC Site CLLI", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "ATLMY8GA" + }, + "ASN": { + "type": "string", + "description": "AV/PE", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "AV_vPE" + }, + "vnf_instance_name": { + "type": "string", + "description": "The hostname assigned to the vpe.", + "entry_schema": null, + "inputProperties": null, + "constraints": [], + "required": true, + "default": "mtnj309me6" + } + }, + "commands": {}, + "properties": { + "network_role": "network role 1, network role 2", + "min_instances": 1, + "max_instances": 10, + "network_assignments": "{is_external_network=false, ipv4_subnet_default_assignment={min_subnets_count=1}, ecomp_generated_network_assignment=false, ipv6_subnet_default_assignment={min_subnets_count=1}}", + "exVL_naming": "{ecomp_generated_naming=true}", + "network_flows": "{is_network_policy=false, is_bound_to_vpn=false}", + "network_homing": "{ecomp_selected_instance_node_target=false}" + }, + "type": "VL", + "modelCustomizationName": "ExtVL 0" + } + }, + "collectionResource": {}, + "configurations": {}, + "fabricConfigurations": {}, + "serviceProxies": {}, + "vfModules": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": { + "uuid": "25284168-24bb-4698-8cb4-3f509146eca5", + "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1", + "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vRE_BV" + }, + "inputs": { + "adiodvpe0_bandwidth": { + "type": "string", + "description": "Requested VPE bandwidth", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "bandwidth" + }, + "constraints": null, + "required": true, + "default": "10" + }, + "2017488_adiodvpe0_vnf_instance_name": { + "type": "string", + "description": "The hostname assigned to the vpe.", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "vnf_instance_name" + }, + "constraints": null, + "required": true, + "default": "mtnj309me6" + }, + "2017488_adiodvpe0_vnf_config_template_version": { + "type": "string", + "description": "VPE Software Version", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "vnf_config_template_version" + }, + "constraints": null, + "required": true, + "default": "17.2" + }, + "2017488_adiodvpe0_AIC_CLLI": { + "type": "string", + "description": "AIC Site CLLI", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "AIC_CLLI" + }, + "constraints": null, + "required": true, + "default": "ATLMY8GA" + }, + "adiodvpe0_bandwidth_units": { + "type": "string", + "description": "Units of bandwidth", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "bandwidth_units" + }, + "constraints": null, + "required": true, + "default": "Gbps" + } + }, + "volumeGroupAllowed": true + }, + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": { + "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db", + "invariantUuid": "b34833bb-6aa9-4ad6-a831-70b06367a091", + "customizationUuid": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3", + "description": null, + "name": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0", + "version": "5", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0", + "properties": { + "minCountInstances": 1, + "maxCountInstances": 1, + "initialCount": 1, + "vfModuleLabel": "ADIOD_base_vPE_BV" + }, + "inputs": {}, + "volumeGroupAllowed": false + }, + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": { + "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a", + "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339", + "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vPFE_BV" + }, + "inputs": {}, + "volumeGroupAllowed": true + } + }, + "volumeGroups": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": { + "uuid": "25284168-24bb-4698-8cb4-3f509146eca5", + "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1", + "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vRE_BV" + }, + "inputs": { + "adiodvpe0_bandwidth": { + "type": "string", + "description": "Requested VPE bandwidth", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "bandwidth" + }, + "constraints": null, + "required": true, + "default": "10" + }, + "2017488_adiodvpe0_vnf_instance_name": { + "type": "string", + "description": "The hostname assigned to the vpe.", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "vnf_instance_name" + }, + "constraints": null, + "required": true, + "default": "mtnj309me6" + }, + "2017488_adiodvpe0_vnf_config_template_version": { + "type": "string", + "description": "VPE Software Version", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "vnf_config_template_version" + }, + "constraints": null, + "required": true, + "default": "17.2" + }, + "2017488_adiodvpe0_AIC_CLLI": { + "type": "string", + "description": "AIC Site CLLI", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "AIC_CLLI" + }, + "constraints": null, + "required": true, + "default": "ATLMY8GA" + }, + "adiodvpe0_bandwidth_units": { + "type": "string", + "description": "Units of bandwidth", + "entry_schema": null, + "inputProperties": { + "sourceType": "HEAT", + "vfModuleLabel": "ADIOD_vRE_BV", + "paramName": "bandwidth_units" + }, + "constraints": null, + "required": true, + "default": "Gbps" + } + } + }, + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": { + "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a", + "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339", + "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557", + "description": null, + "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "version": "6", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2", + "properties": { + "minCountInstances": 0, + "maxCountInstances": null, + "initialCount": 0, + "vfModuleLabel": "ADIOD_vPFE_BV" + }, + "inputs": {} + } + }, + "pnfs": {} + } + }, + "serviceInstance": { + "6e59c5de-f052-46fa-aa7e-2fca9d674c44": { + "vnfGroups": { + "VF_vMee 0": { + "rollbackOnFailure": "true", + "vfModules": { + "vf_vmee0..VfVmee..base_vmme..module-0": { + "vf_vmee0..VfVmee..base_vmme..module-0vmvzo": { + "isMissingData": false, + "sdncPreReload": null, + "modelInfo": { + "modelType": "VFmodule", + "modelInvariantId": "a6f9e51a-2b35-416a-ae15-15e58d61f36d", + "modelVersionId": "a27f5cfc-7f12-4f99-af08-0af9c3885c87", + "modelName": "VfVmee..base_vmme..module-0", + "modelVersion": "2", + "modelCustomizationId": "f8c040f1-7e51-4a11-aca8-acf256cfd861", + "modelCustomizationName": "VfVmee..base_vmme..module-0" + }, + "instanceParams": [ + {} + ], + "trackById": "wmtm6sy2uj" + } + } + }, + "isMissingData": true, + "originalName": "VF_vMee 0", + "vnfGroupStoreKey": "VF_vMee 0", + "trackById": "p3wk448m5do", + "uuid": "d6557200-ecf2-4641-8094-5393ae3aae60", + "productFamilyId": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e", + "lcpCloudRegionId": null, + "tenantId": null, + "lineOfBusiness": null, + "platformName": null, + "modelInfo": { + "modelType": "VnfGroup", + "modelInvariantId": "4160458e-f648-4b30-a176-43881ffffe9e", + "modelVersionId": "6e59c5de-f052-46fa-aa7e-2fca9d674c44", + "modelName": "VF_vMee", + "modelVersion": "2.0", + "modelCustomizationName": "VF_vMee 0" + } + } + }, + "networks": {}, + "instanceParams": [ + {} + ], + "validationCounter": 1, + "existingNames": {}, + "existingVNFCounterMap": { + "d6557200-ecf2-4641-8094-5393ae3aae60": 1 + }, + "globalSubscriberId": "e433710f-9217-458d-a79d-1c7aff376d89", + "subscriptionServiceType": "TYLER SILVIA", + "owningEntityId": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc", + "productFamilyId": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e", + "lcpCloudRegionId": "hvf6", + "tenantId": "229bcdc6eaeb4ca59d55221141d01f8e", + "aicZoneId": "JAG1", + "projectName": "x1", + "rollbackOnFailure": "true", + "bulkSize": 1, + "modelInfo": { + "modelInvariantId": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0", + "modelVersionId": "6e59c5de-f052-46fa-aa7e-2fca9d674c44", + "modelName": "ComplexService", + "modelVersion": "1.0", + "uuid": "6e59c5de-f052-46fa-aa7e-2fca9d674c44" + }, + "isALaCarte": false, + "name": "ComplexService", + "version": "1.0", + "description": "ComplexService", + "category": "Emanuel", + "uuid": "6e59c5de-f052-46fa-aa7e-2fca9d674c44", + "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0", + "serviceType": "", + "serviceRole": "", + "isEcompGeneratedNaming": false, + "isMultiStepDesign": false + }, + "6b528779-44a3-4472-bdff-9cd15ec93450": { + "networks": { + "ExtVL 0": { + "rollbackOnFailure": "true", + "isMissingData": false, + "originalName": "ExtVL 0", + "networkStoreKey": "ExtVL 0", + "trackById": "sf3zth68xjf", + "productFamilyId": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034", + "lcpCloudRegionId": "hvf6", + "tenantId": "229bcdc6eaeb4ca59d55221141d01f8e", + "platformName": "xxx1", + "lineOfBusiness": "ONAP", + "instanceParams": [ + {} + ], + "modelInfo": { + "modelInvariantId": "379f816b-a7aa-422f-be30-17114ff50b7c", + "modelVersionId": "ddc3f20c-08b5-40fd-af72-c6d14636b986", + "modelName": "ExtVL", + "modelVersion": "37.0", + "modelCustomizationId": "94fdd893-4a36-4d70-b16a-ec29c54c184f", + "modelCustomizationName": "ExtVL 0", + "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986" + }, + "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986" + }, + "ExtVL 0:0001": { + "rollbackOnFailure": "true", + "isMissingData": false, + "originalName": "ExtVL 0", + "networkStoreKey": "ExtVL 0", + "trackById": "2mdxioxca9h", + "productFamilyId": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034", + "lcpCloudRegionId": "hvf6", + "tenantId": "229bcdc6eaeb4ca59d55221141d01f8e", + "platformName": "xxx1", + "lineOfBusiness": "ONAP", + "instanceParams": [ + {} + ], + "modelInfo": { + "modelInvariantId": "379f816b-a7aa-422f-be30-17114ff50b7c", + "modelVersionId": "ddc3f20c-08b5-40fd-af72-c6d14636b986", + "modelName": "ExtVL", + "modelVersion": "37.0", + "modelCustomizationId": "94fdd893-4a36-4d70-b16a-ec29c54c184f", + "modelCustomizationName": "ExtVL 0", + "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986" + }, + "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986" + }, + "ExtVL 0_1": { + "rollbackOnFailure": "true", + "isMissingData": false, + "originalName": "ExtVL 0", + "networkStoreKey": "ExtVL 0_1", + "trackById": "z7vd1gmpbs", + "instanceName": "ExtVL", + "productFamilyId": "17cc1042-527b-11e6-beb8-9e71128cae77", + "lcpCloudRegionId": "hvf6", + "tenantId": "229bcdc6eaeb4ca59d55221141d01f8e", + "platformName": "xxx1", + "lineOfBusiness": "zzz1", + "instanceParams": [ + { + "vnf_config_template_version": "17.2", + "bandwidth_units": "Gbps", + "bandwidth": "10", + "AIC_CLLI": "ATLMY8GA", + "ASN": "AV_vPE", + "vnf_instance_name": "yoav" + } + ], + "modelInfo": { + "modelInvariantId": "379f816b-a7aa-422f-be30-17114ff50b7c", + "modelVersionId": "ddc3f20c-08b5-40fd-af72-c6d14636b986", + "modelName": "ExtVL", + "modelVersion": "37.0", + "modelCustomizationId": "94fdd893-4a36-4d70-b16a-ec29c54c184f", + "modelCustomizationName": "ExtVL 0", + "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986" + }, + "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986" + } + }, + "vnfGroups": { + "2017-488_ADIOD-vPE 0": { + "rollbackOnFailure": "true", + "vfModules": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1sgoqi": { + "instanceName": "yoav", + "volumeGroupName": "123", + "modelInfo": { + "modelInvariantId": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1", + "modelVersionId": "25284168-24bb-4698-8cb4-3f509146eca5", + "modelName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "modelVersion": "6", + "modelCustomizationId": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "uuid": "25284168-24bb-4698-8cb4-3f509146eca5" + }, + "uuid": "25284168-24bb-4698-8cb4-3f509146eca5", + "isMissingData": false, + "instanceParams": [ + { + "adiodvpe0_bandwidth": "10", + "2017488_adiodvpe0_vnf_instance_name": "mtnj309me6", + "2017488_adiodvpe0_vnf_config_template_version": "17.2", + "2017488_adiodvpe0_AIC_CLLI": "ATLMY8GA", + "adiodvpe0_bandwidth_units": "Gbps" + } + ] + } + } + }, + "isMissingData": false, + "originalName": "2017-488_ADIOD-vPE 0", + "vnfGroupStoreKey": "2017-488_ADIOD-vPE 0", + "trackById": "o65b26t2thj", + "instanceName": "2017488_ADIODvPE", + "productFamilyId": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034", + "lcpCloudRegionId": "hvf6", + "tenantId": "bae71557c5bb4d5aac6743a4e5f1d054", + "platformName": "platform", + "lineOfBusiness": "ONAP", + "instanceParams": [ + {} + ], + "modelInfo": { + "modelInvariantId": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8", + "modelVersionId": "69e09f68-8b63-4cc9-b9ff-860960b5db09", + "modelName": "2017-488_ADIOD-vPE", + "modelVersion": "5.0", + "modelCustomizationId": "1da7b585-5e61-4993-b95e-8e6606c81e45", + "modelCustomizationName": "2017-488_ADIOD-vPE 0", + "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09" + }, + "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09" + } + }, + "instanceParams": [ + { + "2017488_adiodvpe0_ASN": "AV_vPE" + } + ], + "validationCounter": 0, + "existingNames": { + "123": "", + "instancename": "", + "yoav": "", + "extvl": "" + }, + "existingVnfGroupCounterMap": { + "69e09f68-8b63-4cc9-b9ff-860960b5db09": 1 + }, + "existingNetworksCounterMap": { + "ddc3f20c-08b5-40fd-af72-c6d14636b986": 3 + }, + "instanceName": "InstanceName", + "globalSubscriberId": "e433710f-9217-458d-a79d-1c7aff376d89", + "subscriptionServiceType": "TYLER SILVIA", + "owningEntityId": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc", + "productFamilyId": "17cc1042-527b-11e6-beb8-9e71128cae77", + "lcpCloudRegionId": "JANET25", + "tenantId": "092eb9e8e4b7412e8787dd091bc58e86", + "aicZoneId": "JAG1", + "projectName": null, + "rollbackOnFailure": "true", + "aicZoneName": "YUDFJULP-JAG1", + "owningEntityName": "WayneHolland", + "testApi": "GR_API", + "isEcompGeneratedNaming": true, + "tenantName": "USP-SIP-IC-24335-T-01", + "bulkSize": 1, + "modelInfo": { + "modelInvariantId": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0", + "modelVersionId": "6b528779-44a3-4472-bdff-9cd15ec93450", + "modelName": "action-data", + "modelVersion": "1.0", + "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450" + }, + "isALaCarte": false, + "name": "action-data", + "version": "1.0", + "description": "", + "category": "", + "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450", + "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0", + "serviceType": "", + "serviceRole": "", + "isMultiStepDesign": false + } + }, + "lcpRegionsAndTenants": { + "lcpRegionList": [ + { + "id": "JANET25", + "name": "JANET25", + "isPermitted": true + }, + { + "id": "hvf6", + "name": "hvf6", + "isPermitted": true + } + ], + "lcpRegionsTenantsMap": { + "JANET25": [ + { + "id": "092eb9e8e4b7412e8787dd091bc58e86", + "name": "USP-SIP-IC-24335-T-01", + "isPermitted": true + } + ], + "hvf6": [ + { + "id": "bae71557c5bb4d5aac6743a4e5f1d054", + "name": "AIN Web Tool-15-D-testalexandria", + "isPermitted": true + }, + { + "id": "229bcdc6eaeb4ca59d55221141d01f8e", + "name": "AIN Web Tool-15-D-STTest2", + "isPermitted": true + }, + { + "id": "1178612d2b394be4834ad77f567c0af2", + "name": "AIN Web Tool-15-D-SSPtestcustome", + "isPermitted": true + }, + { + "id": "19c5ade915eb461e8af52fb2fd8cd1f2", + "name": "AIN Web Tool-15-D-UncheckedEcopm", + "isPermitted": true + }, + { + "id": "de007636e25249238447264a988a927b", + "name": "AIN Web Tool-15-D-dfsdf", + "isPermitted": true + }, + { + "id": "62f29b3613634ca6a3065cbe0e020c44", + "name": "AIN/SMS-16-D-Multiservices1", + "isPermitted": true + }, + { + "id": "649289e30d3244e0b48098114d63c2aa", + "name": "AIN Web Tool-15-D-SSPST66", + "isPermitted": true + }, + { + "id": "3f21eeea6c2c486bba31dab816c05a32", + "name": "AIN Web Tool-15-D-ASSPST47", + "isPermitted": true + }, + { + "id": "f60ce21d3ee6427586cff0d22b03b773", + "name": "CESAR-100-D-sspjg67246", + "isPermitted": true + }, + { + "id": "8774659e425f479895ae091bb5d46560", + "name": "CESAR-100-D-sspjg68359", + "isPermitted": true + }, + { + "id": "624eb554b0d147c19ff8885341760481", + "name": "AINWebTool-15-D-iftach", + "isPermitted": true + }, + { + "id": "214f55f5fc414c678059c383b03e4962", + "name": "CESAR-100-D-sspjg612401", + "isPermitted": true + }, + { + "id": "c90666c291664841bb98e4d981ff1db5", + "name": "CESAR-100-D-sspjg621340", + "isPermitted": true + }, + { + "id": "ce5b6bc5c7b348e1bf4b91ac9a174278", + "name": "sspjg621351cloned", + "isPermitted": true + }, + { + "id": "b386b768a3f24c8e953abbe0b3488c02", + "name": "AINWebTool-15-D-eteancomp", + "isPermitted": true + }, + { + "id": "dc6c4dbfd225474e9deaadd34968646c", + "name": "AINWebTool-15-T-SPFET", + "isPermitted": true + }, + { + "id": "02cb5030e9914aa4be120bd9ed1e19eb", + "name": "AINWebTool-15-X-eeweww", + "isPermitted": true + }, + { + "id": "f2f3830e4c984d45bcd00e1a04158a79", + "name": "CESAR-100-D-spjg61909", + "isPermitted": true + }, + { + "id": "05b91bd5137f4929878edd965755c06d", + "name": "CESAR-100-D-sspjg621512cloned", + "isPermitted": true + }, + { + "id": "7002fbe8482d4a989ddf445b1ce336e0", + "name": "AINWebTool-15-X-vdr", + "isPermitted": true + }, + { + "id": "4008522be43741dcb1f5422022a2aa0b", + "name": "AINWebTool-15-D-ssasa", + "isPermitted": true + }, + { + "id": "f44e2e96a1b6476abfda2fa407b00169", + "name": "AINWebTool-15-D-PFNPT", + "isPermitted": true + }, + { + "id": "b69a52bec8a84669a37a1e8b72708be7", + "name": "AINWebTool-15-X-vdre", + "isPermitted": true + }, + { + "id": "fac7d9fd56154caeb9332202dcf2969f", + "name": "AINWebTool-15-X-NONPODECOMP", + "isPermitted": true + }, + { + "id": "2d34d8396e194eb49969fd61ffbff961", + "name": "DN5242-Nov16-T5", + "isPermitted": true + }, + { + "id": "cb42a77ff45b48a8b8deb83bb64acc74", + "name": "ro-T11", + "isPermitted": true + }, + { + "id": "fa45ca53c80b492fa8be5477cd84fc2b", + "name": "ro-T112", + "isPermitted": true + }, + { + "id": "4914ab0ab3a743e58f0eefdacc1dde77", + "name": "DN5242-Nov21-T1", + "isPermitted": true + }, + { + "id": "d0a3e3f2964542259d155a81c41aadc3", + "name": "test-hvf6-09", + "isPermitted": true + }, + { + "id": "cbb99fe4ada84631b7baf046b6fd2044", + "name": "DN5242-Nov16-T3", + "isPermitted": true + } + ] + } + }, + "productFamilies": [ + { + "id": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034", + "name": "SCOTTIE", + "isPermitted": true + }, + { + "id": "17cc1042-527b-11e6-beb8-9e71128cae77", + "name": "IGNACIO", + "isPermitted": true + }, + { + "id": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e", + "name": "Christie", + "isPermitted": true + }, + { + "id": "a4f6f2ae-9bf5-4ed7-b904-06b2099c4bd7", + "name": "Enhanced Services", + "isPermitted": true + }, + { + "id": "vTerrance", + "name": "vTerrance", + "isPermitted": true + }, + { + "id": "323d69d9-2efe-4r45-ay0a-89ea7ard4e6f", + "name": "vSCP", + "isPermitted": true + }, + { + "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb", + "name": "Emanuel", + "isPermitted": true + }, + { + "id": "d8a6ed93-251c-47ca-adc9-86671fd19f4c", + "name": "BVOIP", + "isPermitted": true + }, + { + "id": "db171b8f-115c-4992-a2e3-ee04cae357e0", + "name": "LINDSEY", + "isPermitted": true + }, + { + "id": "LRSI-OSPF", + "name": "LRSI-OSPF", + "isPermitted": true + }, + { + "id": "vRosemarie", + "name": "HNGATEWAY", + "isPermitted": true + }, + { + "id": "vHNPaas", + "name": "WILKINS", + "isPermitted": true + }, + { + "id": "e433710f-9217-458d-a79d-1c7aff376d89", + "name": "TYLER SILVIA", + "isPermitted": true + }, + { + "id": "b6a3f28c-eebf-494c-a900-055cc7c874ce", + "name": "VROUTER", + "isPermitted": true + }, + { + "id": "Cisneros", + "name": "vMuriel", + "isPermitted": true + }, + { + "id": "0ee8c1bc-7cbd-4b0a-a1ac-e9999255abc1", + "name": "CARA Griffin", + "isPermitted": true + }, + { + "id": "c7611ebe-c324-48f1-8085-94aef0c6ef3d", + "name": "DARREN MCGEE", + "isPermitted": true + }, + { + "id": "e30755dc-5673-4b6b-9dcf-9abdd96b93d1", + "name": "Transport", + "isPermitted": true + }, + { + "id": "vSalvatore", + "name": "vSalvatore", + "isPermitted": true + }, + { + "id": "d7bb0a21-66f2-4e6d-87d9-9ef3ced63ae4", + "name": "Josefina", + "isPermitted": true + }, + { + "id": "vHubbard", + "name": "vHubbard", + "isPermitted": true + }, + { + "id": "12a96a9d-4b4c-4349-a950-fe1159602621", + "name": "DARREN MCGEE", + "isPermitted": true + } + ], + "serviceTypes": { + "e433710f-9217-458d-a79d-1c7aff376d89": [ + { + "id": "0", + "name": "vRichardson", + "isPermitted": false + }, + { + "id": "1", + "name": "TYLER SILVIA", + "isPermitted": true + }, + { + "id": "2", + "name": "Emanuel", + "isPermitted": false + }, + { + "id": "3", + "name": "vJamie", + "isPermitted": false + }, + { + "id": "4", + "name": "vVoiceMail", + "isPermitted": false + }, + { + "id": "5", + "name": "Kennedy", + "isPermitted": false + }, + { + "id": "6", + "name": "vSEGW", + "isPermitted": false + }, + { + "id": "7", + "name": "vVM", + "isPermitted": false + }, + { + "id": "8", + "name": "vOTA", + "isPermitted": false + }, + { + "id": "9", + "name": "vMME", + "isPermitted": false + }, + { + "id": "10", + "name": "vMNS", + "isPermitted": false + }, + { + "id": "11", + "name": "vSCP", + "isPermitted": false + }, + { + "id": "12", + "name": "VPMS", + "isPermitted": false + }, + { + "id": "13", + "name": "vMMSC", + "isPermitted": false + }, + { + "id": "14", + "name": "SSD", + "isPermitted": false + }, + { + "id": "15", + "name": "vMOG", + "isPermitted": false + }, + { + "id": "16", + "name": "LINDSEY", + "isPermitted": false + }, + { + "id": "17", + "name": "JOHANNA_SANTOS", + "isPermitted": false + }, + { + "id": "18", + "name": "vCarroll", + "isPermitted": false + } + ] + }, + "aicZones": [ + { + "id": "NFT1", + "name": "NFTJSSSS-NFT1" + }, + { + "id": "JAG1", + "name": "YUDFJULP-JAG1" + }, + { + "id": "YYY1", + "name": "UUUAIAAI-YYY1" + }, + { + "id": "BAN1", + "name": "VSDKYUTP-BAN1" + }, + { + "id": "DKJ1", + "name": "DKJSJDKA-DKJ1" + }, + { + "id": "MCS1", + "name": "ASACMAMS-MCS1" + }, + { + "id": "UIO1", + "name": "uioclli1-UIO1" + }, + { + "id": "RAJ1", + "name": "YGBIJNLQ-RAJ1" + }, + { + "id": "OPA1", + "name": "opaclli1-OPA1" + }, + { + "id": "SDE1", + "name": "ZXCVBNMA-SDE1" + }, + { + "id": "VEN2", + "name": "FGHJUHIL-VEN2" + }, + { + "id": "ORL1", + "name": "ORLDFLMA-ORL1" + }, + { + "id": "JAD1", + "name": "JADECLLI-JAD1" + }, + { + "id": "ZXL1", + "name": "LWLWCANN-ZXL1" + }, + { + "id": "CKL1", + "name": "CLKSKCKK-CKL1" + }, + { + "id": "SDF1", + "name": "sdfclli1-SDF1" + }, + { + "id": "RAD1", + "name": "RADICAL1-RAD1" + }, + { + "id": "KIT1", + "name": "BHYJFGLN-KIT1" + }, + { + "id": "REL1", + "name": "INGERFGT-REL1" + }, + { + "id": "JNL1", + "name": "CJALSDAC-JNL1" + }, + { + "id": "OLK1", + "name": "OLKOLKLS-OLK1" + }, + { + "id": "CHI1", + "name": "CHILLIWE-CHI1" + }, + { + "id": "UUU4", + "name": "UUUAAAUU-UUU4" + }, + { + "id": "TUF1", + "name": "TUFCLLI1-TUF1" + }, + { + "id": "KJN1", + "name": "CKALDKSA-KJN1" + }, + { + "id": "SAM1", + "name": "SNDGCA64-SAN1" + }, + { + "id": "SCK1", + "name": "SCKSCKSK-SCK1" + }, + { + "id": "HJH1", + "name": "AOEEQQQD-HJH1" + }, + { + "id": "HGD1", + "name": "SDFQWHGD-HGD1" + }, + { + "id": "KOR1", + "name": "HYFLNBVT-KOR1" + }, + { + "id": "ATL43", + "name": "AICLOCID-ATL43" + }, + { + "id": "ATL54", + "name": "AICFTAAI-ATL54" + }, + { + "id": "ATL66", + "name": "CLLIAAII-ATL66" + }, + { + "id": "VEL1", + "name": "BNMLKUIK-VEL1" + }, + { + "id": "ICC1", + "name": "SANJITAT-ICC1" + }, + { + "id": "MNT11", + "name": "WSXEFBTH-MNT11" + }, + { + "id": "DEF2", + "name": "WSBHGTYL-DEF2" + }, + { + "id": "MAD11", + "name": "SDFQWGKL-MAD11" + }, + { + "id": "OLG1", + "name": "OLHOLHOL-OLG1" + }, + { + "id": "GAR1", + "name": "NGFVSJKO-GAR1" + }, + { + "id": "SAN22", + "name": "GNVLSCTL-SAN22" + }, + { + "id": "HRG1", + "name": "HRGHRGGS-HRG1" + }, + { + "id": "JCS1", + "name": "JCSJSCJS-JCS1" + }, + { + "id": "DHA12", + "name": "WSXEDECF-DHA12" + }, + { + "id": "HJE1", + "name": "AOEEWWWD-HJE1" + }, + { + "id": "NCA1", + "name": "NCANCANN-NCA1" + }, + { + "id": "IOP1", + "name": "iopclli1-IOP1" + }, + { + "id": "RTY1", + "name": "rtyclli1-RTY1" + }, + { + "id": "KAP1", + "name": "HIOUYTRQ-KAP1" + }, + { + "id": "ZEN1", + "name": "ZENCLLI1-ZEN1" + }, + { + "id": "HKA1", + "name": "JAKHLASS-HKA1" + }, + { + "id": "CQK1", + "name": "CQKSCAKK-CQK1" + }, + { + "id": "SAI1", + "name": "UBEKQLPD-SAI1" + }, + { + "id": "ERT1", + "name": "ertclli1-ERT1" + }, + { + "id": "IBB1", + "name": "PLMKOIJU-IBB1" + }, + { + "id": "TIR2", + "name": "PLKINHYI-TIR2" + }, + { + "id": "HSD1", + "name": "CHASKCDS-HSD1" + }, + { + "id": "SLF78", + "name": "SDCTLFN1-SLF78" + }, + { + "id": "SEE78", + "name": "SDCTEEE4-SEE78" + }, + { + "id": "SAN13", + "name": "TOKYJPFA-SAN13" + }, + { + "id": "SAA78", + "name": "SDCTAAA1-SAA78" + }, + { + "id": "LUC1", + "name": "ATLDFGYC-LUC1" + }, + { + "id": "AMD13", + "name": "MEMATLAN-AMD13" + }, + { + "id": "TOR1", + "name": "TOROONXN-TOR1" + }, + { + "id": "QWE1", + "name": "QWECLLI1-QWE1" + }, + { + "id": "ZOG1", + "name": "ZOGASTRO-ZOG1" + }, + { + "id": "CAL33", + "name": "CALIFORN-CAL33" + }, + { + "id": "SHH78", + "name": "SDIT1HHH-SHH78" + }, + { + "id": "DSA1", + "name": "LKJHGFDS-DSA1" + }, + { + "id": "CLG1", + "name": "CLGRABAD-CLG1" + }, + { + "id": "BNA1", + "name": "BNARAGBK-BNA1" + }, + { + "id": "ATL84", + "name": "CANTTCOC-ATL84" + }, + { + "id": "APP1", + "name": "WBHGTYUI-APP1" + }, + { + "id": "RJN1", + "name": "RJNRBZAW-RJN1" + }, + { + "id": "EHH78", + "name": "SDCSHHH5-EHH78" + }, + { + "id": "mac10", + "name": "PKGTESTF-mac10" + }, + { + "id": "SXB78", + "name": "SDCTGXB1-SXB78" + }, + { + "id": "SAX78", + "name": "SDCTAXG1-SAX78" + }, + { + "id": "SYD1", + "name": "SYDNAUBV-SYD1" + }, + { + "id": "TOK1", + "name": "TOKYJPFA-TOK1" + }, + { + "id": "KGM2", + "name": "KGMTNC20-KGM2" + }, + { + "id": "DCC1b", + "name": "POIUYTGH-DCC1b" + }, + { + "id": "SKK78", + "name": "SDCTKKK1-SKK78" + }, + { + "id": "SGG78", + "name": "SDCTGGG1-SGG78" + }, + { + "id": "SJJ78", + "name": "SDCTJJJ1-SJJ78" + }, + { + "id": "SBX78", + "name": "SDCTBXG1-SBX78" + }, + { + "id": "LAG1", + "name": "LARGIZON-LAG1" + }, + { + "id": "IAA1", + "name": "QAZXSWED-IAA1" + }, + { + "id": "POI1", + "name": "PLMNJKIU-POI1" + }, + { + "id": "LAG1a", + "name": "LARGIZON-LAG1a" + }, + { + "id": "PBL1", + "name": "PBLAPBAI-PBL1" + }, + { + "id": "LAG45", + "name": "LARGIZON-LAG1a" + }, + { + "id": "MAR1", + "name": "MNBVCXZM-MAR1" + }, + { + "id": "HST70", + "name": "HSTNTX70-HST70" + }, + { + "id": "DCC1a", + "name": "POIUYTGH-DCC1a" + }, + { + "id": "TOL1", + "name": "TOLDOH21-TOL1" + }, + { + "id": "LON1", + "name": "LONEENCO-LON1" + }, + { + "id": "SJU78", + "name": "SDIT1JUB-SJU78" + }, + { + "id": "STN27", + "name": "HSTNTX01-STN27" + }, + { + "id": "SSW56", + "name": "ss8126GT-SSW56" + }, + { + "id": "SBB78", + "name": "SDIT1BBB-SBB78" + }, + { + "id": "DCC3", + "name": "POIUYTGH-DCC3" + }, + { + "id": "GNV1", + "name": "GNVLSCTL-GNV1" + }, + { + "id": "WAS1", + "name": "WASHDCSW-WAS1" + }, + { + "id": "TOY1", + "name": "TORYONNZ-TOY1" + }, + { + "id": "STT1", + "name": "STTLWA02-STT1" + }, + { + "id": "STG1", + "name": "STTGGE62-STG1" + }, + { + "id": "SLL78", + "name": "SDCTLLL1-SLL78" + }, + { + "id": "SBU78", + "name": "SDIT1BUB-SBU78" + }, + { + "id": "ATL2", + "name": "ATLNGANW-ATL2" + }, + { + "id": "BOT1", + "name": "BOTHWAKY-BOT1" + }, + { + "id": "SNG1", + "name": "SNGPSIAU-SNG1" + }, + { + "id": "NYC1", + "name": "NYCMNY54-NYC1" + }, + { + "id": "LAG1b", + "name": "LARGIZON-LAG1b" + }, + { + "id": "AMD15", + "name": "AMDFAA01-AMD15" + }, + { + "id": "SNA1", + "name": "SNANTXCA-SNA1" + }, + { + "id": "PLT1", + "name": "PLTNCA60-PLT1" + }, + { + "id": "TLP1", + "name": "TLPNXM18-TLP1" + }, + { + "id": "SDD81", + "name": "SAIT1DD6-SDD81" + }, + { + "id": "DCC1", + "name": "POIUYTGH-DCC1" + }, + { + "id": "DCC2", + "name": "POIUYTGH-DCC2" + }, + { + "id": "OKC1", + "name": "OKCBOK55-OKC1" + }, + { + "id": "PAR1", + "name": "PARSFRCG-PAR1" + }, + { + "id": "TES36", + "name": "ABCEETES-TES36" + }, + { + "id": "COM1", + "name": "PLMKOPIU-COM1" + }, + { + "id": "ANI1", + "name": "ATLNGTRE-ANI1" + }, + { + "id": "SDG78", + "name": "SDIT1BDG-SDG78" + }, + { + "id": "mac20", + "name": "PKGTESTF-mac20" + }, + { + "id": "DSF45", + "name": "DSFBG123-DSF45" + }, + { + "id": "HST25", + "name": "HSTNTX01-HST25" + }, + { + "id": "AMD18", + "name": "AUDIMA01-AMD18" + }, + { + "id": "SAA80", + "name": "SAIT9AA3-SAA80" + }, + { + "id": "SSA56", + "name": "SSIT2AA7-SSA56" + }, + { + "id": "SDD82", + "name": "SAIT1DD9-SDD82" + }, + { + "id": "JCV1", + "name": "JCVLFLBW-JCV1" + }, + { + "id": "SUL2", + "name": "WERTYUJK-SUL2" + }, + { + "id": "PUR1", + "name": "purelyde-PUR1" + }, + { + "id": "FDE55", + "name": "FDERT555-FDE55" + }, + { + "id": "SITE", + "name": "LONEENCO-SITE" + }, + { + "id": "ATL1", + "name": "ATLNGAMA-ATL1" + }, + { + "id": "JUL1", + "name": "ZXCVBNMM-JUL1" + }, + { + "id": "TAT34", + "name": "TESAAISB-TAT34" + }, + { + "id": "XCP12", + "name": "CHKGH123-XCP12" + }, + { + "id": "RAI1", + "name": "poiuytre-RAI1" + }, + { + "id": "HPO1", + "name": "ATLNGAUP-HPO1" + }, + { + "id": "KJF12", + "name": "KJFDH123-KJF12" + }, + { + "id": "SCC80", + "name": "SAIT9CC3-SCC80" + }, + { + "id": "SAA12", + "name": "SAIT9AF8-SAA12" + }, + { + "id": "SAA14", + "name": "SAIT1AA9-SAA14" + }, + { + "id": "ATL35", + "name": "TTESSAAI-ATL35" + }, + { + "id": "CWY1", + "name": "CWYMOWBS-CWY1" + }, + { + "id": "ATL76", + "name": "TELEPAAI-ATL76" + }, + { + "id": "DSL12", + "name": "DSLFK242-DSL12" + }, + { + "id": "ATL53", + "name": "AAIATLTE-ATL53" + }, + { + "id": "SAA11", + "name": "SAIT9AA2-SAA11" + }, + { + "id": "ATL62", + "name": "TESSASCH-ATL62" + }, + { + "id": "AUG1", + "name": "ASDFGHJK-AUG1" + }, + { + "id": "POI22", + "name": "POIUY123-POI22" + }, + { + "id": "SAA13", + "name": "SAIT1AA9-SAA13" + }, + { + "id": "BHY17", + "name": "BHYTFRF3-BHY17" + }, + { + "id": "LIS1", + "name": "HOSTPROF-LIS1" + }, + { + "id": "SIP1", + "name": "ZXCVBNMK-SIP1" + }, + { + "id": "ATL99", + "name": "TEESTAAI-ATL43" + }, + { + "id": "ATL64", + "name": "FORLOAAJ-ATL64" + }, + { + "id": "TAT33", + "name": "TESAAISA-TAT33" + }, + { + "id": "RAD10", + "name": "INDIPUNE-RAD10" + }, + { + "id": "RTW5", + "name": "BHYTFRY4-RTW5" + }, + { + "id": "JGS1", + "name": "KSJKKKKK-JGS1" + }, + { + "id": "ATL98", + "name": "TEESTAAI-ATL43" + }, + { + "id": "WAN1", + "name": "LEIWANGW-WAN1" + }, + { + "id": "ATL44", + "name": "ATLSANAB-ATL44" + }, + { + "id": "RTD2", + "name": "BHYTFRk4-RTD2" + }, + { + "id": "NIR1", + "name": "ORFLMANA-NIR1" + }, + { + "id": "ATL75", + "name": "SANAAIRE-ATL75" + }, + { + "id": "NUM1", + "name": "QWERTYUI-NUM1" + }, + { + "id": "MTN32", + "name": "MDTWNJ21-MTN32" + }, + { + "id": "RTZ4", + "name": "BHYTFRZ6-RTZ4" + }, + { + "id": "ATL56", + "name": "ATLSANAC-ATL56" + }, + { + "id": "AMS1", + "name": "AMSTNLBW-AMS1" + }, + { + "id": "RCT1", + "name": "AMSTERNL-RCT1" + }, + { + "id": "JAN1", + "name": "ORFLMATT-JAN1" + }, + { + "id": "ABC14", + "name": "TESAAISA-ABC14" + }, + { + "id": "TAT37", + "name": "TESAAISD-TAT37" + }, + { + "id": "MIC54", + "name": "MICHIGAN-MIC54" + }, + { + "id": "ABC11", + "name": "ATLSANAI-ABC11" + }, + { + "id": "AMF11", + "name": "AMDOCS01-AMF11" + }, + { + "id": "ATL63", + "name": "ATLSANEW-ATL63" + }, + { + "id": "ABC12", + "name": "ATLSECIA-ABC12" + }, + { + "id": "MTN20", + "name": "MDTWNJ21-MTN20" + }, + { + "id": "ABC15", + "name": "AAITESAN-ABC15" + }, + { + "id": "AVT1", + "name": "AVTRFLHD-AVT1" + }, + { + "id": "ATL34", + "name": "ATLSANAI-ATL34" + } + ], + "categoryParameters": { + "owningEntityList": [ + { + "id": "aaa1", + "name": "aaa1" + }, + { + "id": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc", + "name": "WayneHolland" + }, + { + "id": "Melissa", + "name": "Melissa" + } + ], + "projectList": [ + { + "id": "WATKINS", + "name": "WATKINS" + }, + { + "id": "x1", + "name": "x1" + }, + { + "id": "yyy1", + "name": "yyy1" + } + ], + "lineOfBusinessList": [ + { + "id": "ONAP", + "name": "ONAP" + }, + { + "id": "zzz1", + "name": "zzz1" + } + ], + "platformList": [ + { + "id": "platform", + "name": "platform" + }, + { + "id": "xxx1", + "name": "xxx1" + } + ] + }, + "type": "[LCP_REGIONS_AND_TENANTS] Update", + "subscribers": [ + { + "id": "CAR_2020_ER", + "name": "CAR_2020_ER", + "isPermitted": true + }, + { + "id": "21014aa2-526b-11e6-beb8-9e71128cae77", + "name": "JULIO ERICKSON", + "isPermitted": false + }, + { + "id": "DHV1707-TestSubscriber-2", + "name": "DALE BRIDGES", + "isPermitted": false + }, + { + "id": "DHV1707-TestSubscriber-1", + "name": "LLOYD BRIDGES", + "isPermitted": false + }, + { + "id": "jimmy-example", + "name": "JimmyExampleCust-20161102", + "isPermitted": false + }, + { + "id": "jimmy-example2", + "name": "JimmyExampleCust-20161103", + "isPermitted": false + }, + { + "id": "ERICA5779-TestSub-PWT-102", + "name": "ERICA5779-TestSub-PWT-102", + "isPermitted": false + }, + { + "id": "ERICA5779-TestSub-PWT-101", + "name": "ERICA5779-TestSub-PWT-101", + "isPermitted": false + }, + { + "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb", + "name": "Emanuel", + "isPermitted": false + }, + { + "id": "ERICA5779-Subscriber-4", + "name": "ERICA5779-Subscriber-5", + "isPermitted": false + }, + { + "id": "ERICA5779-TestSub-PWT-103", + "name": "ERICA5779-TestSub-PWT-103", + "isPermitted": false + }, + { + "id": "ERICA5779-Subscriber-2", + "name": "ERICA5779-Subscriber-2", + "isPermitted": false + }, + { + "id": "e433710f-9217-458d-a79d-1c7aff376d89", + "name": "SILVIA ROBBINS", + "isPermitted": true + }, + { + "id": "ERICA5779-Subscriber-3", + "name": "ERICA5779-Subscriber-3", + "isPermitted": false + }, + { + "id": "31739f3e-526b-11e6-beb8-9e71128cae77", + "name": "CRAIG/ROBERTS", + "isPermitted": false + } + ] + } + }; + } +} + +class MockFeatureFlagsService {} + +describe('vnf group new popup service', () => { + let injector; + let service: VnfGroupPopupService; + let genericFormService: GenericFormService + let defaultDataGeneratorService: DefaultDataGeneratorService; + let fb: FormBuilder; + let iframeService: IframeService; + + beforeAll(done => (async () => { + TestBed.configureTestingModule({ + providers : [ + VnfGroupPopupService, + DefaultDataGeneratorService, + GenericFormService, + FormBuilder, + IframeService, + {provide:FeatureFlagsService, useClass: MockFeatureFlagsService}, + AaiService, + LogService, + BasicPopupService, + VfModulePopuopService, + BasicControlGenerator, + VnfGroupControlGenerator, + {provide: NgRedux, useClass: MockReduxStore}, + {provide: HttpClient, useClass: MockAppStore}] + }); + await TestBed.compileComponents(); + + injector = getTestBed(); + service = injector.get(VnfGroupPopupService); + genericFormService = injector.get(GenericFormService); + defaultDataGeneratorService = injector.get(DefaultDataGeneratorService); + fb = injector.get(FormBuilder); + iframeService = injector.get(IframeService); + + })().then(done).catch(done.fail)); + + test('getTitle vnf group should return the correct title for edit and create mode', () => { + expect(service.getTitle(false)).toBe('Set a new VNF Group'); + expect(service.getTitle(true)).toBe('Edit VNF Group instance'); + }); + + test('getSubRightTitle vnf should return popup type', () => { + expect(service.getSubRightTitle()).toBe('VNF Group Instance Details'); + }); + + test('getModelInformation vnfGroup should update modelInformations', () => { + const serviceId: string = '6b528779-44a3-4472-bdff-9cd15ec93450'; + const vnfGroupModelName: string = '2017-388_ADIOD-vPE 1'; + service.getModelInformation(serviceId, vnfGroupModelName); + expect(service.modelInformations.length).toEqual(14); + + expect(service.modelInformations[0].label).toEqual("Model version"); + expect(service.modelInformations[0].values).toEqual(['1.0']); + + expect(service.modelInformations[1].label).toEqual("Description"); + expect(service.modelInformations[1].values).toEqual(['Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM']); + + expect(service.modelInformations[2].label).toEqual("Category"); + expect(service.modelInformations[2].values).toEqual([undefined]); + + expect(service.modelInformations[3].label).toEqual("Sub Category"); + expect(service.modelInformations[3].values).toEqual([undefined]); + + expect(service.modelInformations[4].label).toEqual("UUID"); + expect(service.modelInformations[4].values).toEqual(['0903e1c0-8e03-4936-b5c2-260653b96413']); + + expect(service.modelInformations[5].label).toEqual("Invariant UUID"); + expect(service.modelInformations[5].values).toEqual(['00beb8f9-6d39-452f-816d-c709b9cbb87d']); + + expect(service.modelInformations[6].label).toEqual("Type"); + expect(service.modelInformations[6].values).toEqual([undefined]); + + expect(service.modelInformations[7].label).toEqual("Role"); + expect(service.modelInformations[7].values).toEqual([undefined]); + + expect(service.modelInformations[8].label).toEqual("Function"); + expect(service.modelInformations[8].values).toEqual([undefined]); + + expect(service.modelInformations[9].label).toEqual("Member resource type"); + expect(service.modelInformations[9].values).toEqual(['VNF']); + + expect(service.modelInformations[10].label).toEqual("Members service Invariant UUID"); + expect(service.modelInformations[10].values).toEqual([]); + + expect(service.modelInformations[11].label).toEqual("Members service model name"); + expect(service.modelInformations[11].values).toEqual([]); + + expect(service.modelInformations[12].label).toEqual("Minimum to instantiate"); + expect(service.modelInformations[12].values).toEqual(['0']); + + expect(service.modelInformations[13].label).toEqual("Maximum to instantiate"); + expect(service.modelInformations[13].values).toEqual(['Unlimited']); + }); + + test('getSubLeftTitle new vnf group popup should return service model name', () => { + service.uuidData = { + serviceId: '6e59c5de-f052-46fa-aa7e-2fca9d674c44', + modelName: 'VF_vMee 0' + }; + expect(service.getSubLeftTitle()).toBe('VNF Group : VF_vMee'); + }); + + test('getInstance with empty storekey should be created', () => { + const serviceId: string = '6e59c5de-f052-46fa-aa7e-2fca9d674c44'; + const vnfGroupModelName: string = '2017-388_ADIOD-vPE 1'; + const newInstance = service.getInstance(serviceId, vnfGroupModelName, null); + expect(newInstance).toBeDefined(); + }); + + test('getInstance with not empty storekey should return vnfGroupStoreKey', () => { + const serviceId: string = '6b528779-44a3-4472-bdff-9cd15ec93450'; + const vnfGroupModelName: string = '2017-388_ADIOD-vPE 1'; + const vnfGroupStoreKey: string = '2017-488_ADIOD-vPE 0'; + const newInstance = service.getInstance(serviceId, vnfGroupModelName, vnfGroupStoreKey); + expect(newInstance.vnfGroupStoreKey).toEqual('2017-488_ADIOD-vPE 0'); + }); + + test('getGenericFormPopupDetails returns the FormPopupDetails object', () => { + const serviceId: string = '6e59c5de-f052-46fa-aa7e-2fca9d674c44'; + const vnfGroupModelName: string = 'VF_vMee 0'; + const vnfGroupStoreKey: string = 'VF_vMee 0'; + let uuidData: UUIDData = <any>{ + serviceId: "6e59c5de-f052-46fa-aa7e-2fca9d674c44", + modelName: "VF_vMee 0", + vnfGroupStoreKey: "VF_vMee 0" + }; + const formPopupDetailsObject = service.getGenericFormPopupDetails(serviceId, vnfGroupModelName, vnfGroupStoreKey, null, uuidData, true); + expect(formPopupDetailsObject).toBeDefined(); + } + ); +}); diff --git a/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/vnfGroup/vnfGroup.popup.service.ts b/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/vnfGroup/vnfGroup.popup.service.ts new file mode 100644 index 000000000..748edd2cb --- /dev/null +++ b/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/vnfGroup/vnfGroup.popup.service.ts @@ -0,0 +1,158 @@ +import {Injectable} from '@angular/core'; +import {GenericPopupInterface} from "../generic-popup.interface"; +import {ITreeNode} from "angular-tree-component/dist/defs/api"; +import {FormPopupDetails, PopupType} from "../../../../models/formControlModels/formPopupDetails.model"; +import {FormGroup} from "@angular/forms"; +import {ModelInformationItem} from "../../../model-information/model-information.component"; +import {ServiceModel} from "../../../../models/serviceModel"; +import {Subject} from "rxjs/Subject"; +import {BasicControlGenerator} from "../../../genericForm/formControlsServices/basic.control.generator"; +import {IframeService} from "../../../../utils/iframe.service"; +import {DefaultDataGeneratorService} from "../../../../services/defaultDataServiceGenerator/default.data.generator.service"; +import {AaiService} from "../../../../services/aaiService/aai.service"; +import {BasicPopupService} from "../basic.popup.service"; +import {NgRedux} from "@angular-redux/store"; +import {AppState} from "../../../../store/reducers"; +import {Subscriber} from "../../../../models/subscriber"; +import {Constants} from "../../../../utils/constants"; +import {ModelInfo} from "../../../../models/modelInfo"; +import {changeInstanceCounter} from "../../../../storeUtil/utils/general/general.actions"; +import * as _ from 'lodash'; +import {VnfGroupControlGenerator} from "../../../genericForm/formControlsServices/vnfGroupGenerator/vnfGroup.control.generator"; +import {VnfGroupInstance} from "../../../../models/vnfGroupInstance"; +import {createVnfGroupInstance, updateVnfGroupInstance} from "../../../../storeUtil/utils/vnfGroup/vnfGroup.actions"; + +@Injectable() +export class VnfGroupPopupService implements GenericPopupInterface{ + dynamicInputs: any; + instance: any; + model:any; + serviceModel:ServiceModel; + modelInformations: ModelInformationItem[] = []; + uuidData: Object; + closeDialogEvent: Subject<any> = new Subject<any>(); + isUpdateMode: boolean; + + constructor( + private _basicControlGenerator: BasicControlGenerator, + private _vnfGroupControlGenerator: VnfGroupControlGenerator, + private _iframeService: IframeService, + private _defaultDataGeneratorService: DefaultDataGeneratorService, + private _aaiService: AaiService, + private _basicPopupService: BasicPopupService, + private _store: NgRedux<AppState>) { + } + + getGenericFormPopupDetails(serviceId: string, modelName: string, vnfGroupStoreKey: string, node: ITreeNode, uuidData: Object, isUpdateMode: boolean): FormPopupDetails { + this.uuidData = uuidData; + this.isUpdateMode = isUpdateMode; + this.instance = this.getInstance(serviceId, modelName, vnfGroupStoreKey); + this.getModelInformation(serviceId, modelName); + + return new FormPopupDetails(this, + PopupType.VNF_GROUP, + uuidData, + this.getTitle(isUpdateMode), + this.getSubLeftTitle(), + this.getSubRightTitle(), + this.getControls(serviceId, modelName, vnfGroupStoreKey), + this._basicPopupService.getDynamicInputs(serviceId, modelName, vnfGroupStoreKey, 'vnfGroups'), + this.modelInformations, + (that, form: FormGroup) => {that.onSubmit(that, form);}, + (that: any, form: FormGroup) => {that.onCancel(that, form); } + ) + } + + getControls(serviceId: string, modelName: string, vnfGroupStoreKey: string){ + if(this._store.getState().service.serviceHierarchy[serviceId].service.instantiationType === 'Macro') { + return this._vnfGroupControlGenerator.getMacroFormControls(serviceId, vnfGroupStoreKey, modelName); + } else { + return this._vnfGroupControlGenerator.getAlaCarteFormControls(serviceId, vnfGroupStoreKey, modelName); + } + } + + getInstance(serviceId: string, modelName: string, vnfGroupStoreKey: string): any { + if(_.isNil(vnfGroupStoreKey)){ + return new VnfGroupInstance(); + } + return this._store.getState().service.serviceInstance[serviceId].vnfGroups[vnfGroupStoreKey]; + } + + getModelInformation(serviceId: string, modelName: string): void { + this._aaiService.getServiceModelById(serviceId).subscribe((result: any) => { + this.serviceModel = new ServiceModel(result); + this.model = this._basicPopupService.getModelFromResponse(result, 'vnfGroups', modelName); + const serviceInstance = this._store.getState().service.serviceInstance[serviceId]; + this.modelInformations = [ + new ModelInformationItem("Model version", "modelVersion", [this.model.version], "", true), + new ModelInformationItem("Description", "description", [this.model.description]), + new ModelInformationItem("Category", "category", [this.model.category]), + new ModelInformationItem("Sub Category", "subCategory", [this.model.subCategory]), + new ModelInformationItem("UUID", "uuid", [this.model.uuid], Constants.ServicePopup.TOOLTIP_UUID, true), + new ModelInformationItem("Invariant UUID", "invariantUuid", [this.model.invariantUuid], Constants.ServicePopup.TOOLTIP_INVARIANT_UUID, true), + new ModelInformationItem("Type", "type", [this.model.properties.type], "", true), + new ModelInformationItem("Role", "role", [this.model.properties.role]), + new ModelInformationItem("Function", "function", [this.model.properties.function]), + new ModelInformationItem("Member resource type", "contained_resource_type", ["VNF"], "", true), + new ModelInformationItem("Members service Invariant UUID", "Members service Invariant UUID", _.toArray(_.mapValues(this.model.members, 'sourceModelInvariant'))), + new ModelInformationItem("Members service model name", "sourceModelName", _.toArray(_.mapValues(this.model.members, 'sourceModelName'))), + new ModelInformationItem("Minimum to instantiate", "vnfGroup-min", ['0'], "", false), + new ModelInformationItem("Maximum to instantiate", "vnfGroup-max", ['Unlimited'], "", false) + ]; + }) + } + + getSubLeftTitle(): string { + return "VNF Group : " + this._store.getState().service.serviceHierarchy[this.uuidData['serviceId']].vnfGroups[this.uuidData['modelName']].name; + } + + getSubRightTitle(): string { + return "VNF Group Instance Details"; + } + + storeVnfGroup = (that, formValues: any): void => { + formValues.modelInfo = new ModelInfo(that.model); + formValues.uuid = formValues.modelInfo.uuid; + formValues.isMissingData = false; + if(!that.isUpdateMode){ + that._store.dispatch(changeInstanceCounter(formValues.modelInfo.modelCustomizationId || formValues.uuid, that.uuidData.serviceId, 1 , <any> {data: {type: 'VnfGroup'}})); + this._store.dispatch(createVnfGroupInstance(formValues, that.uuidData['modelName'], that.uuidData['serviceId'], that.uuidData['modelName'])); + }else { + that._store.dispatch(updateVnfGroupInstance(formValues, that.uuidData.modelName, that.uuidData.serviceId, that.uuidData.vnfGroupStoreKey)) + } + }; + + getTitle(isUpdateMode: boolean): string { + return isUpdateMode ? "Edit VNF Group instance": "Set a new VNF Group" ; + } + + onCancel(that, form): void { + form.reset(); + that._iframeService.removeClassCloseModal('content'); + this.closeDialogEvent.next(that); + } + + onSubmit(that, form: FormGroup, ...args): void { + form.value['instanceParams'] = [{}]; + that.storeVnfGroup(that, form.value); + window.parent.postMessage( { + eventId: 'submitIframe', + data: { + serviceModelId: that.uuidData.serviceId + } + }, "*"); + that.onCancel(that, form); + } + + extractSubscriberNameBySubscriberId(subscriberId: string, store: NgRedux<AppState>) { + let result: string = null; + let filteredArray: any = _.filter(store.getState().service.subscribers, function (o: Subscriber) { + return o.id === subscriberId + }); + if (filteredArray.length > 0) { + result = filteredArray[0].name; + } + return result; + } + +} diff --git a/vid-webpack-master/src/app/shared/components/messageBox/messageBox.component.ts b/vid-webpack-master/src/app/shared/components/messageBox/messageBox.component.ts index 08e199cf5..c610110fd 100644 --- a/vid-webpack-master/src/app/shared/components/messageBox/messageBox.component.ts +++ b/vid-webpack-master/src/app/shared/components/messageBox/messageBox.component.ts @@ -30,7 +30,7 @@ import { Component } from '@angular/core'; import { MessageBoxData} from './messageBox.data'; import { MessageBoxService } from './messageBox.service'; -import { SdcUiComponents } from 'sdc-ui/lib/angular'; +import { SdcUiServices} from "onap-ui-angular"; @Component({ selector: 'message-box', @@ -38,12 +38,17 @@ import { SdcUiComponents } from 'sdc-ui/lib/angular'; }) export class MessageBoxComponent { - modalService: SdcUiComponents.ModalService; - - constructor(modalService: SdcUiComponents.ModalService, private _messageBoxService : MessageBoxService) { + modalService: SdcUiServices.ModalService; + isOpened : boolean = false; + constructor(modalService: SdcUiServices.ModalService, private _messageBoxService : MessageBoxService) { this.modalService = modalService; + MessageBoxService.openModal.subscribe((messageBoxData: MessageBoxData) => { - modalService.openModal(this._messageBoxService.setConfig(messageBoxData)) + if(this.isOpened) return; + this.isOpened = true; + modalService.openModal(this._messageBoxService.setConfig(messageBoxData)).onDestroy(()=>{ + this.isOpened = false; + }) }); } } diff --git a/vid-webpack-master/src/app/shared/components/messageBox/messageBox.data.ts b/vid-webpack-master/src/app/shared/components/messageBox/messageBox.data.ts index 165140ba7..e67b1f76f 100644 --- a/vid-webpack-master/src/app/shared/components/messageBox/messageBox.data.ts +++ b/vid-webpack-master/src/app/shared/components/messageBox/messageBox.data.ts @@ -1,13 +1,14 @@ -import { Subject } from 'rxjs/Subject'; +import { SdcUiCommon} from "onap-ui-angular"; +import {IModalButtonComponent} from "onap-ui-angular/dist/modals/models/modal-config"; export class MessageBoxData { title?: string; message?: string; - size : ModalSize; - type: ModalType; - buttons: Array<IModalButtonComponent>; + size : SdcUiCommon.ModalSize; + type: SdcUiCommon.ModalType; + buttons: IModalButtonComponent[]; - constructor(title: string, message: string, type: ModalType, size : ModalSize, buttons: Array<IModalButtonComponent>) { + constructor(title: string, message: string, type: SdcUiCommon.ModalType, size : SdcUiCommon.ModalSize, buttons: IModalButtonComponent[]) { this.title = title; this.message = message; this.size = size; @@ -15,37 +16,3 @@ export class MessageBoxData { this.buttons = buttons; } } - -export interface IModalConfig { - size?: string; - title?: string; - message?: string; - buttons?: Array<IModalButtonComponent>; - type?: string; -} -export interface IButtonComponent { - text: string; - disabled?: boolean; - type?: string; - size?: string; -} -export interface IModalButtonComponent extends IButtonComponent { - callback?: Function; - closeModal?: boolean; -} -export enum ModalType { - alert = "alert", - error = "error", - standard = "info", - custom = "custom", -} -export enum ModalSize { - xlarge = "xl", - large = "l", - medium = "md", - small = "sm", - xsmall = "xsm", -} - - - diff --git a/vid-webpack-master/src/app/shared/components/messageBox/messageBox.service.spec.ts b/vid-webpack-master/src/app/shared/components/messageBox/messageBox.service.spec.ts index 89562ac54..1d0e18ffb 100644 --- a/vid-webpack-master/src/app/shared/components/messageBox/messageBox.service.spec.ts +++ b/vid-webpack-master/src/app/shared/components/messageBox/messageBox.service.spec.ts @@ -3,35 +3,37 @@ import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing'; - import { MessageBoxService } from './messageBox.service'; -import {MessageBoxData, ModalSize, ModalType } from './messageBox.data'; +import {MessageBoxData} from './messageBox.data'; +import { SdcUiCommon} from "onap-ui-angular"; describe('MessageBoxService', () => { let injector; let service: MessageBoxService; let httpMock: HttpTestingController; - beforeEach(() => { + beforeAll(done => (async () => { TestBed.configureTestingModule({ imports: [HttpClientTestingModule], providers: [MessageBoxService] }); + await TestBed.compileComponents(); injector = getTestBed(); service = injector.get(MessageBoxService); httpMock = injector.get(HttpTestingController); - }); + + })().then(done).catch(done.fail)); describe('#setConfig', () => { - it('should return <IModalConfig>', (done: DoneFn) => { + test('should return <IModalConfig>', () => { let title = "Delete Instantiation"; let message = "You are about to stop the instantiation process of this service. \nAll data will be lost. Are you sure you want to stop?"; let messageBoxData : MessageBoxData = new MessageBoxData( title, message, - ModalType.alert, - ModalSize.medium, + SdcUiCommon.ModalType.warning, + SdcUiCommon.ModalSize.medium, [ {text:"Stop Instantiation", size:"large", closeModal:true}, {text:"Cancel", size:"medium", closeModal:true} @@ -41,9 +43,8 @@ describe('MessageBoxService', () => { expect(result.title).toEqual(title); expect(result.message).toEqual(message); expect(result.buttons.length).toEqual(2); - expect(result.type).toEqual(ModalType.alert); - expect(result.size).toEqual(ModalSize.medium); - done(); + expect(result.type).toEqual(SdcUiCommon.ModalType.warning); + expect(result.size).toEqual(SdcUiCommon.ModalSize.medium); }); }); }); diff --git a/vid-webpack-master/src/app/shared/components/messageBox/messageBox.service.ts b/vid-webpack-master/src/app/shared/components/messageBox/messageBox.service.ts index eaa012d3b..d73631a43 100644 --- a/vid-webpack-master/src/app/shared/components/messageBox/messageBox.service.ts +++ b/vid-webpack-master/src/app/shared/components/messageBox/messageBox.service.ts @@ -1,18 +1,18 @@ import { Injectable } from '@angular/core'; import { Subject } from 'rxjs/Subject'; -import { IModalConfig, MessageBoxData, ModalSize, ModalType } from './messageBox.data'; +import {MessageBoxData} from "./messageBox.data"; +import { SdcUiCommon} from "onap-ui-angular"; @Injectable() export class MessageBoxService { static openModal: Subject<MessageBoxData> = new Subject<MessageBoxData>(); - setConfig(messageBoxData: MessageBoxData) : IModalConfig{ + setConfig(messageBoxData: MessageBoxData) : SdcUiCommon.IModalConfig{ return { - size : ModalSize.medium, + size : SdcUiCommon.ModalSize.medium, title : messageBoxData.title, type : messageBoxData.type, message : messageBoxData.message, buttons: messageBoxData.buttons }; } - } diff --git a/vid-webpack-master/src/app/shared/components/model-information/model-information.component.ts b/vid-webpack-master/src/app/shared/components/model-information/model-information.component.ts index fea4c44c7..9401aca05 100644 --- a/vid-webpack-master/src/app/shared/components/model-information/model-information.component.ts +++ b/vid-webpack-master/src/app/shared/components/model-information/model-information.component.ts @@ -1,5 +1,6 @@ import {Component, Input} from '@angular/core'; -import * as _ from 'lodash'; +import {ModelInformationService} from "./model-information.service"; + @Component({ selector: 'model-information', @@ -8,17 +9,21 @@ import * as _ from 'lodash'; }) export class ModelInformationComponent { - private _modelInformationItems: Array<ModelInformationItem>; + constructor(private _modelInformationService : ModelInformationService){} + + private _modelInformationItems: ModelInformationItem[]; + + @Input() itemClass: string = 'item'; //default class for item is "item" - get modelInformationItems(): Array<ModelInformationItem> { + get modelInformationItems(): ModelInformationItem[] { return this._modelInformationItems; } @Input() - set modelInformationItems(_modelInformationItems: Array<ModelInformationItem>) { + set modelInformationItems(_modelInformationItems: ModelInformationItem[]) { if (_modelInformationItems) { - this._modelInformationItems = _modelInformationItems.filter(x => x.mandatory || (!_.isEmpty(x.values) && !_.isEmpty(x.values[0]))); + this._modelInformationItems = this._modelInformationService.filterModelItems(_modelInformationItems); } } } @@ -27,11 +32,11 @@ export class ModelInformationComponent { export class ModelInformationItem { label: string; testsId: string; - values: Array<string>; + values: string[]; toolTipText: string; mandatory: boolean; - constructor(label: string, testsId: string, values: Array<any>, toolTipText: string = "", mandatory: boolean = false,nested:boolean=false) { + constructor(label: string, testsId: string, values: any[], toolTipText: string = "", mandatory: boolean = false) { this.label = label; this.testsId = testsId; this.values = values; @@ -39,4 +44,8 @@ export class ModelInformationItem { this.mandatory = mandatory; } + static createInstance(label: string, value: any):ModelInformationItem { + return new ModelInformationItem(label, label, [value]); + } + } diff --git a/vid-webpack-master/src/app/shared/components/model-information/model-information.html b/vid-webpack-master/src/app/shared/components/model-information/model-information.html index 456dfdee4..78548b035 100644 --- a/vid-webpack-master/src/app/shared/components/model-information/model-information.html +++ b/vid-webpack-master/src/app/shared/components/model-information/model-information.html @@ -1,12 +1,12 @@ <div id="model-information"> - <div *ngFor="let item of modelInformationItems" class="item" attr.data-tests-id="model-item-{{item.label}}"> + <div *ngFor="let item of modelInformationItems" ngClass={{itemClass}} attr.data-tests-id="model-item-{{item.label}}"> <tooltip-content #a> <span> {{item.toolTipText}}</span> </tooltip-content> <div class="wrapper" [tooltip]="a" [tooltipDisabled]="!item.toolTipText" tooltipPlacement="top" [tooltipAnimation]="false"> <label attr.data-tests-id="model-item-label-{{item.testsId}}">{{item.label}}</label> - <div *ngFor="let value of item.values" attr.data-tests-id="model-item-value-{{item.testsId}}">{{value}}</div> + <div *ngFor="let value of item.values" class="model-item-value" attr.data-tests-id="model-item-value-{{item.testsId}}">{{value}}</div> </div> </div> </div> diff --git a/vid-webpack-master/src/app/shared/components/model-information/model-information.service.spec.ts b/vid-webpack-master/src/app/shared/components/model-information/model-information.service.spec.ts new file mode 100644 index 000000000..418493f2b --- /dev/null +++ b/vid-webpack-master/src/app/shared/components/model-information/model-information.service.spec.ts @@ -0,0 +1,32 @@ +import {ModelInformationService} from "./model-information.service"; +import {ModelInformationItem} from "./model-information.component"; + +describe('ModelInformationService', () => { + let underTest:ModelInformationService; + + beforeEach(() => { + underTest = new ModelInformationService(); + }); + + test('when call to filterModelItems then items with empty values are filtered', () =>{ + expect(underTest.filterModelItems([ + ModelInformationItem.createInstance("emptyValue", ""), + ModelInformationItem.createInstance("nullValue", null), + ModelInformationItem.createInstance("undefinedValue", undefined), + ModelInformationItem.createInstance("spacesValue", " "), + new ModelInformationItem("emptyArray", "id", [], "c", false) + ])).toHaveLength(0); + }); + + test('when call to filterModelItems then mandatory items with empty values are not filtered', () =>{ + const mandatoryItem:ModelInformationItem = new ModelInformationItem("a", "b", [""], "c", true); + expect(underTest.filterModelItems([mandatoryItem])).toEqual([mandatoryItem]); + }); + + test('when call to filterModelItems then items with values are not filtered', () =>{ + expect(underTest.filterModelItems([ + ModelInformationItem.createInstance("withString", "a"), + ModelInformationItem.createInstance("withNumber", 1), + ])).toHaveLength(2); + }); +}); diff --git a/vid-webpack-master/src/app/shared/components/model-information/model-information.service.ts b/vid-webpack-master/src/app/shared/components/model-information/model-information.service.ts new file mode 100644 index 000000000..7c0a96b01 --- /dev/null +++ b/vid-webpack-master/src/app/shared/components/model-information/model-information.service.ts @@ -0,0 +1,16 @@ +import {Injectable} from "@angular/core"; +import * as _ from 'lodash'; +import {ModelInformationItem} from "./model-information.component"; + +@Injectable() +export class ModelInformationService { + + filterModelItems(_modelInformationItems: ModelInformationItem[]) { + return _modelInformationItems.filter(x => x.mandatory || ( + !_.isEmpty(x.values) + && !_.isNil(x.values[0]) + && x.values[0].toString().trim()!="" + )); + } +} + diff --git a/vid-webpack-master/src/app/shared/components/model-information/model-information.spec.ts b/vid-webpack-master/src/app/shared/components/model-information/model-information.spec.ts new file mode 100644 index 000000000..cdba11f59 --- /dev/null +++ b/vid-webpack-master/src/app/shared/components/model-information/model-information.spec.ts @@ -0,0 +1,12 @@ +import {ModelInformationItem} from "./model-information.component"; + +describe('ModelInformationItem', () => { + test('when use createInstance, values initialized as expected', () =>{ + const modelInformationItem:ModelInformationItem = ModelInformationItem.createInstance("aStr", 4); + expect(modelInformationItem.label).toEqual("aStr"); + expect(modelInformationItem.testsId).toEqual("aStr"); + expect(modelInformationItem.values).toEqual([4]); + expect(modelInformationItem.mandatory).toBeFalsy(); + expect(modelInformationItem.toolTipText).toEqual(""); + }); +}); diff --git a/vid-webpack-master/src/app/shared/components/no-content-message-and-icon/no-content-message-and-icon.component.html b/vid-webpack-master/src/app/shared/components/no-content-message-and-icon/no-content-message-and-icon.component.html index bbe7bc78c..18200283b 100644 --- a/vid-webpack-master/src/app/shared/components/no-content-message-and-icon/no-content-message-and-icon.component.html +++ b/vid-webpack-master/src/app/shared/components/no-content-message-and-icon/no-content-message-and-icon.component.html @@ -1,5 +1,6 @@ <div class="width-100"> - <div class="text-title" [ngClass]="titleClass">{{title}}</div> - <div class="text-subtitle" [ngClass]="subtitleClass">{{subtitle}}</div> + <div class="text-title" [ngClass]="titleClass" [attr.data-tests-id]="'text-title'">{{title}}</div> + <div class="text-title" [ngClass]="titleClass" [attr.data-tests-id]="'text-title2'">{{title2}}</div> + <div class="text-subtitle" [ngClass]="subtitleClass" [attr.data-tests-id]="'text-subtitle'">{{subtitle}}</div> <img id="not-node-img-id" src="{{iconPath}}" alt="" class="no-content-icon" [ngClass]="iconClass" data-tests-id="no-content-icon"> </div> diff --git a/vid-webpack-master/src/app/shared/components/no-content-message-and-icon/no-content-message-and-icon.component.scss b/vid-webpack-master/src/app/shared/components/no-content-message-and-icon/no-content-message-and-icon.component.scss index 1320ef731..3829f06aa 100644 --- a/vid-webpack-master/src/app/shared/components/no-content-message-and-icon/no-content-message-and-icon.component.scss +++ b/vid-webpack-master/src/app/shared/components/no-content-message-and-icon/no-content-message-and-icon.component.scss @@ -9,6 +9,7 @@ font-size: 16px; color: #4A4A4A; text-align: center; + padding-bottom: 7px; } .text-subtitle { @@ -16,7 +17,7 @@ font-size: 16px; color: #959595; text-align: center; - margin-top: 7px; + margin-top: 2px; } .no-content-icon { diff --git a/vid-webpack-master/src/app/shared/components/no-content-message-and-icon/no-content-message-and-icon.component.ts b/vid-webpack-master/src/app/shared/components/no-content-message-and-icon/no-content-message-and-icon.component.ts index 7f4e98294..da66f3f17 100644 --- a/vid-webpack-master/src/app/shared/components/no-content-message-and-icon/no-content-message-and-icon.component.ts +++ b/vid-webpack-master/src/app/shared/components/no-content-message-and-icon/no-content-message-and-icon.component.ts @@ -11,6 +11,7 @@ export class NoContentMessageAndIconComponent { constructor() {} @Input() title: string; + @Input() title2?: string; @Input() subtitle: string; @Input() iconPath: string; diff --git a/vid-webpack-master/src/app/shared/components/popover/popover.component.html b/vid-webpack-master/src/app/shared/components/popover/popover.component.html index c5515596c..4dc8096dc 100644 --- a/vid-webpack-master/src/app/shared/components/popover/popover.component.html +++ b/vid-webpack-master/src/app/shared/components/popover/popover.component.html @@ -2,7 +2,10 @@ triggers="mouseenter:mouseleave" popover="{{value}}" [hidden]="value == null" - container="body"> + container="body" + containerClass="{{popoverType}}" + placement="{{placement}}" + [attr.data-tests-id]="'popover-test-id'"> <ng-content ></ng-content> </div> diff --git a/vid-webpack-master/src/app/shared/components/popover/popover.component.scss b/vid-webpack-master/src/app/shared/components/popover/popover.component.scss index ca2800a27..946b62d30 100644 --- a/vid-webpack-master/src/app/shared/components/popover/popover.component.scss +++ b/vid-webpack-master/src/app/shared/components/popover/popover.component.scss @@ -1,4 +1,5 @@ .popover.popover-top.top { color : green !important; font-size: 10px; + word-wrap: break-word; } diff --git a/vid-webpack-master/src/app/shared/components/popover/popover.component.ts b/vid-webpack-master/src/app/shared/components/popover/popover.component.ts index d6a4c3ae1..9dbbe63a5 100644 --- a/vid-webpack-master/src/app/shared/components/popover/popover.component.ts +++ b/vid-webpack-master/src/app/shared/components/popover/popover.component.ts @@ -1,17 +1,29 @@ import {Component, Input} from "@angular/core"; - @Component({ selector: 'custom-popover', - templateUrl: 'popover.component.html', - styles: [` - :host >>> .popover { - font-size: 13px; - text-align: left; - z-index: 10000; - } - `] + templateUrl: 'popover.component.html' }) -export class PopoverComponent { - @Input() value: String; +export class PopoverComponent{ + @Input() value: string; + @Input() extraStyle : string; + @Input() placement : string = PopoverPlacement.LEFT; + @Input() popoverType : string = PopoverType.CUSTOM; + +} + +export enum PopoverPlacement{ + TOP = 'top', + BOTTOM = 'bottom', + LEFT = 'left', + RIGHT = 'right', + AUTO ='auto', } + +export enum PopoverType { + ERROR = 'error', + WARNING = 'warning', + SUCCESS = 'success', + CUSTOM = 'custom' +} + diff --git a/vid-webpack-master/src/app/shared/components/searchMembersModal/members-table/member-table-row.model.ts b/vid-webpack-master/src/app/shared/components/searchMembersModal/members-table/member-table-row.model.ts new file mode 100644 index 000000000..c5f1a7a07 --- /dev/null +++ b/vid-webpack-master/src/app/shared/components/searchMembersModal/members-table/member-table-row.model.ts @@ -0,0 +1,6 @@ +import {VnfMember} from "../../../models/VnfMember"; + +export class MemberTableRowModel extends VnfMember{ + isSelected : boolean = false; +} + diff --git a/vid-webpack-master/src/app/shared/components/searchMembersModal/members-table/members-table.component.html b/vid-webpack-master/src/app/shared/components/searchMembersModal/members-table/members-table.component.html new file mode 100644 index 000000000..3a29ed824 --- /dev/null +++ b/vid-webpack-master/src/app/shared/components/searchMembersModal/members-table/members-table.component.html @@ -0,0 +1,75 @@ +<div class="table-header"> + <div class="left-header"> + <span class="title-header">{{description}}</span> + <div class="sub-title-header"> + <span class="vnf-match-your-criteria" class="total" [attr.data-tests-id]="'total-amount'" style="margin-right: 5px;"><span + [attr.data-tests-id]="'numberOfNotHideVnfMembers'">{{membersTableService.numberOfNotHideVnfMembers}}</span> VNFs match your criteria</span> + <span class="vnf-selected" class="total" [attr.data-tests-id]="'total-selected'"><span + [attr.data-tests-id]="'numberOfSelectedVnfMembers'">{{membersTableService.numberOfSelectedVnfMembers}}</span> VNF{{membersTableService.numberOfSelectedVnfMembers>1?'s':'' }} selected</span> + </div> + </div> + + <div class="search-container"> + <sdc-filter-bar + [placeHolder]="'Search...'" + [debounceTime]="250" + [testId]="'vnf-members-search'" + (valueChange)="search($event)"> + </sdc-filter-bar> + </div> +</div> +<table id="member-table" class="table table-bordered" *ngIf="data?.length > 0"> + <thead class="thead-dark"> + <tr> + <th class="allCheckboxAreSelected" style="position: relative;"> + <sdc-checkbox + [(checked)]="membersTableService.allCheckboxAreSelected" + [testId]="'all-checkbox-selected'" + (checkedChange)="changeAllCheckboxStatus($event)" + ></sdc-checkbox> + </th> + <th class="header-title" *ngFor="let header of headers">{{header.displayName}}</th> + </tr> + </thead> + <tbody> + <tr class="member-table-row" *ngFor="let vnf of membersTableService.filteredMembers"> + <td class="sdcCheckboxMember" style="position: relative;" [attr.data-tests-id]="vnf?.instanceId"> + <sdc-checkbox + [checked]="membersTableService.allMemberStatusMap[vnf.instanceId]?.isSelected" + [testId]="vnf?.instanceId" + (checkedChange)="changeCheckboxStatus(vnf.instanceId)" + ></sdc-checkbox></td> + <td id="vnfName"> + <custom-ellipsis [id]="vnf?.instanceName" [value]="vnf?.instanceName" + [hightlight]="filterValue"></custom-ellipsis> + <custom-ellipsis class="second-line" [id]="vnf?.instanceId" [value]="'UUID: '+ vnf?.instanceId" + [hightlight]="filterValue"></custom-ellipsis> + </td> + <td id="version"> + <custom-ellipsis [id]="vnf?.modelInfo?.modelVersion" [value]="vnf?.modelInfo?.modelVersion" [hightlight]="filterValue"></custom-ellipsis> + </td> + <td id="modelName"> + <custom-ellipsis [id]="vnf?.modelInfo?.modelName" [value]="vnf?.modelInfo?.modelName" [hightlight]="filterValue"></custom-ellipsis> + </td> + <td id="provStatus"> + <custom-ellipsis [id]="vnf?.provStatus" [value]="vnf?.provStatus" [hightlight]="filterValue"></custom-ellipsis> + </td> + <td id="serviceInstance"> + <custom-ellipsis [id]="vnf?.serviceInstanceName" [value]="vnf?.serviceInstanceName" + [hightlight]="filterValue"></custom-ellipsis> + <custom-ellipsis class="second-line" [id]="vnf?.serviceInstanceId" [value]="'UUID: '+ vnf?.serviceInstanceId" + [hightlight]="filterValue"></custom-ellipsis> + </td> + <td id="cloudRegion"> + <custom-ellipsis [id]="vnf?.lcpCloudRegionId" [value]="vnf?.lcpCloudRegionId" [hightlight]="filterValue"></custom-ellipsis> + </td> + <td id="tenantName"> + <custom-ellipsis [id]="vnf?.tenantName" [value]="vnf?.tenantName" [hightlight]="filterValue"></custom-ellipsis> + </td> + </tr> + + </tbody> +</table> +<div class="no-result" *ngIf="data?.length == 0">No VNFs were found that can belong to this group.</div> + + diff --git a/vid-webpack-master/src/app/shared/components/searchMembersModal/members-table/members-table.component.scss b/vid-webpack-master/src/app/shared/components/searchMembersModal/members-table/members-table.component.scss new file mode 100644 index 000000000..3be975222 --- /dev/null +++ b/vid-webpack-master/src/app/shared/components/searchMembersModal/members-table/members-table.component.scss @@ -0,0 +1,91 @@ +.table-header { + display: flex; + margin-bottom: 5px; + .left-header{ + .title-header{ + font-family: OpenSans-SemiBold; + color: #191919; + font-size: 15px; + margin-bottom: 5px; + display: block; + } + + .sub-title-header{ + + .vnf-selected{ + margin-left: 25px; + } + + .vnf-match-your-criteria{ + } + } + .total{ + font-family: OpenSans-Regular; + color: #191919; + font-size: 15px; + margin-right: 10px; + } + + } + + .search-container{ + flex-basis: 300px; + margin-left: auto; + } +} + +#member-table>tbody+tbody { + border-top: 1px solid #ddd; +} + + + +#member-table { + border: 1px solid #D2D2D2; + thead { + background: #F8F8F8; + th.allCheckboxAreSelected { + vertical-align: middle !important; + width: 48px; + max-width: 48px; + min-width: 48px; + height: 48px; + } + th.header-title { + font-family: OpenSans-SemiBold; + vertical-align: middle !important; + height: 48px; + font-size: 12px; + } + } + tbody { + td{ + text-align: center; + height: 60px; + padding-top: 0; + padding-bottom: 0; + max-height: 60px; + vertical-align: middle; + .second-line { + font-size: 12px; + } + } + } + + + //font-size: 12px; + + th.allCheckboxAreSelected { + text-align: center; + } +} + +.no-result { + font-family: OpenSans-Regular; + width: 100%; + height: 100%; + border: 1px solid #d2d2d2; + display: flex; + align-items: center; + justify-content: center; +} diff --git a/vid-webpack-master/src/app/shared/components/searchMembersModal/members-table/members-table.component.ts b/vid-webpack-master/src/app/shared/components/searchMembersModal/members-table/members-table.component.ts new file mode 100644 index 000000000..9736563af --- /dev/null +++ b/vid-webpack-master/src/app/shared/components/searchMembersModal/members-table/members-table.component.ts @@ -0,0 +1,57 @@ +import {Component, Input, OnChanges, Output, SimpleChanges, EventEmitter} from '@angular/core'; +import {VnfMember} from "../../../models/VnfMember"; +import {MembersTableService} from "./members-table.service"; +import * as _ from 'lodash'; + +export class CustomTableColumnDefinition { + public displayName = ''; + public key : any = ''; + public type? = 'text'; + public filter? = ''; +} + +@Component({ + selector: 'app-members-table', + templateUrl: './members-table.component.html', + styleUrls: ['./members-table.component.scss'] +}) + +export class MembersTableComponent implements OnChanges{ + filterValue: string = null; + allMemberStatusMap = null; + membersTableService : MembersTableService; + headers: CustomTableColumnDefinition[] = MembersTableService.getHeaders(); + @Input() data: VnfMember[]; + @Input() description: string; + @Output() selectedMembersAmountChange : EventEmitter<number> = new EventEmitter(); + constructor(private _membersTableService : MembersTableService){ + this.membersTableService = this._membersTableService; + } + + ngOnChanges(changes: SimpleChanges): void { + if(_.isNil(this.data)){ + this._membersTableService.resetAll(); + }else { + this._membersTableService.allMemberStatusMap = MembersTableService.generateAllMembersStatus(this.data); + this._membersTableService.filteredMembers = MembersTableService.sortVnfMembersByName(this.data, "instanceName"); + this._membersTableService.updateAmountsAndCheckAll(); + } + } + + search(searchStr: string): void { + this.filterValue = searchStr; + this._membersTableService.filterMembers(this.filterValue); + } + + changeAllCheckboxStatus(status: boolean) : void { + this._membersTableService.changeAllCheckboxStatus(status); + this.selectedMembersAmountChange.emit(this._membersTableService.numberOfSelectedVnfMembers); + } + + + changeCheckboxStatus(vnfInstanceId: string) : void { + this._membersTableService.changeCheckboxStatus(vnfInstanceId); + this.selectedMembersAmountChange.emit(this._membersTableService.numberOfSelectedVnfMembers); + } + +} diff --git a/vid-webpack-master/src/app/shared/components/searchMembersModal/members-table/members-table.service.spec.ts b/vid-webpack-master/src/app/shared/components/searchMembersModal/members-table/members-table.service.spec.ts new file mode 100644 index 000000000..e53c63be1 --- /dev/null +++ b/vid-webpack-master/src/app/shared/components/searchMembersModal/members-table/members-table.service.spec.ts @@ -0,0 +1,270 @@ +import {MembersTableService} from "./members-table.service"; +import {TestBed, getTestBed} from "@angular/core/testing"; +import {NgRedux} from "@angular-redux/store"; +import {CustomTableColumnDefinition} from "./members-table.component"; +import {AppState} from "../../../store/reducers"; +import {createRelatedVnfMemberInstance} from "../../../storeUtil/utils/relatedVnfMember/relatedVnfMember.actions"; +import {DataFilterPipe} from "../../../pipes/dataFilter/data-filter.pipe"; +import {VnfMember} from "../../../models/VnfMember"; + + + +class MockAppStore<T> { + dispatch() { + } + getState() { + return { + service : { + serviceHierarchy: { + }, + serviceInstance : { + "serviceModelId" : { + vnfGroups:{ + "aa1":{ + vnfs:{ + "VNF1_INSTANCE_ID":{ + "action": "None", + "instanceName": "VNF1_INSTANCE_NAME", + "instanceId": "VNF1_INSTANCE_ID", + "orchStatus": null, + "lcpCloudRegionId": "mtn23b", + "tenantId": "3e9a20a3e89e45f884e09df0cc2d2d2a", + "tenantName": "APPC-24595-T-IST-02C", + "modelInfo": { + "modelInvariantId": "vnf-instance-model-invariant-id", + "modelVersionId": "7a6ee536-f052-46fa-aa7e-2fca9d674c44", + "modelVersion": "2.0", + "modelName": "vf_vEPDG", + "modelType": "vnf" + }, + "instanceType": "VNF1_INSTANCE_TYPE", + "provStatus": null, + "inMaint": false, + "uuid": "7a6ee536-f052-46fa-aa7e-2fca9d674c44", + "trackById": "7a6ee536-f052-46fa-aa7e-2fca9d674c44:002", + "serviceInstanceId": "service-instance-id1", + "serviceInstanceName": "service-instance-name" + + }, + "aa1-vnf1":{ + vnfName: "", + instanceId:"", + serviceInstanceId:"" + } + } + } + } + } + + } + } + } + } +} + +describe('MembersTableService view member count', () => { + let injector; + let service: MembersTableService; + let store: NgRedux<AppState>; + let data = loadMockMembers(); + + beforeAll(done => (async () => { + + TestBed.configureTestingModule( + { + providers: [ + MembersTableService, + {provide: NgRedux, useClass: MockAppStore}, + DataFilterPipe + + ], + declarations: [DataFilterPipe] + }); + await TestBed.compileComponents(); + + injector = getTestBed(); + service = injector.get(MembersTableService); + store = injector.get(NgRedux) + + })().then(done).catch(done.fail)); + + + test('should return number of displayed members', () => { + service.allMemberStatusMap = MembersTableService.generateAllMembersStatus(<any>data); + service.filteredMembers = <any>data; + expect(service.calculateNotHideVnfMembers()).toEqual(2); + }); + + test('should return number of selected members', () => { + service.allMemberStatusMap = MembersTableService.generateAllMembersStatus(<any>data); + service.allMemberStatusMap['VNF1_INSTANCE_ID'].isSelected = true; + service.allMemberStatusMap['VNF2_INSTANCE_ID'].isSelected = true; + expect(service.calculateSelectedVnfMembers()).toEqual(2); + }); + + test('should return number of selected members', () => { + service.allMemberStatusMap = MembersTableService.generateAllMembersStatus(<any>data); + service.filteredMembers = <any>data; + service.allMemberStatusMap['VNF1_INSTANCE_ID'].isSelected = true; + service.filterMembers('VNF2'); + service.allMemberStatusMap['VNF2_INSTANCE_ID'].isSelected = true; + expect(service.calculateNotHideVnfMembers()).toEqual(1); + }); + + test('getHeader should return labels with array of keys', () => { + const headers: CustomTableColumnDefinition[] = MembersTableService.getHeaders(); + expect(headers).toEqual([ + {displayName: 'VNF instance name', key: ['instanceName']}, + {displayName: 'VNF version', key: ['modelInfo', 'modelVersion']}, + {displayName: 'VNF model name', key: ['modelInfo', 'modelName']}, + {displayName: 'Prov Status', key: ['provStatus']}, + {displayName: 'Service instance name', key: ['serviceInstanceName']}, + {displayName: 'Cloud Region', key: ['lcpCloudRegionId']}, + {displayName: 'Tenant Name', key: ['tenantName']} + ]); + }); + + + test('setMembers should dispatch action only on selected members', () => { + const vnfGroupStoreKey: string = 'vnfGroupStoreKey'; + const serviceId: string = 'serviceId'; + + jest.spyOn(store, 'dispatch'); + service.allMemberStatusMap = MembersTableService.generateAllMembersStatus(<any>data); + service.allMemberStatusMap['VNF1_INSTANCE_ID'].isSelected = true; + service.setMembers({serviceId: serviceId, vnfGroupStoreKey: vnfGroupStoreKey}); + expect(store.dispatch).toHaveBeenCalledTimes(1); + expect(store.dispatch).toHaveBeenCalledWith(createRelatedVnfMemberInstance(vnfGroupStoreKey, serviceId, service.allMemberStatusMap['VNF1_INSTANCE_ID'])); + }); + + test('generateAllMembersStatus should add to each instance isHide and isSelected and convert to map', () => { + + let allMemberStatusMapMock = MembersTableService.generateAllMembersStatus(<any>data); + for (const key in allMemberStatusMapMock) { + expect(allMemberStatusMapMock[key].isSelected).toBeFalsy(); + } + }); + + test('changeAllCheckboxStatus', () => { + let data = loadMockMembers(); + service.allMemberStatusMap = MembersTableService.generateAllMembersStatus(<any>data); + service.filteredMembers = <any>data; + service.changeAllCheckboxStatus(true); + for (let key in service.allMemberStatusMap) { + expect(service.allMemberStatusMap[key].isSelected).toEqual(true); + } + }); + + test('should reset all numbers and lists', () => { + let data = loadMockMembers(); + service.allMemberStatusMap = MembersTableService.generateAllMembersStatus(<any>data); + service.filteredMembers = <any>data; + service.changeAllCheckboxStatus(true); + service.resetAll(); + expect(service.numberOfNotHideVnfMembers).toEqual(0); + expect(service.numberOfSelectedAndNotHideVnfMembers).toEqual(0); + expect(service.numberOfSelectedVnfMembers).toEqual(0); + expect(service.allMemberStatusMap).toEqual({}); + expect(service.filteredMembers.length).toEqual(0); + }); + + test('checkAllCheckboxStatus should be false if not all are selected', () => { + service.allMemberStatusMap = MembersTableService.generateAllMembersStatus(<any>loadMockMembers()); + service.updateAmountsAndCheckAll(); + + expect(service.allCheckboxAreSelected).toEqual(false); + }); + + + test('sortVnfMembersByName should sort list by vnf name', () => { + let data = <any>loadMockMembers(); + let sortedList = MembersTableService.sortVnfMembersByName(data, "instanceName"); + + expect(sortedList[0].instanceName).toEqual("VNF1_INSTANCE_NAME"); + expect(sortedList[1].instanceName).toEqual("VNF2_INSTANCE_NAME"); + + let tmp = data[0]; + data[0] = data[1]; + data[1] = tmp; + + sortedList = MembersTableService.sortVnfMembersByName(data, "instanceName"); + + expect(sortedList[1].instanceName).toEqual("VNF1_INSTANCE_NAME"); + expect(sortedList[0].instanceName).toEqual("VNF2_INSTANCE_NAME"); + sortedList = MembersTableService.sortVnfMembersByName(null, "instanceName"); + expect(sortedList).toEqual([]); + sortedList = MembersTableService.sortVnfMembersByName(data, undefined); + expect(sortedList).toEqual([]); + }); + + test('should return only vnf members not associated to any vnf group', ()=>{ + const result: VnfMember[] = service.filterUsedVnfMembers("serviceModelId",loadMockMembers()); + expect(result.length).toEqual(1); + expect(result[0].instanceId).toEqual("VNF2_INSTANCE_ID"); + }); + +}); + + +function loadMockMembers(): any[] { + return [ + { + "action": "None", + "instanceName": "VNF1_INSTANCE_NAME", + "instanceId": "VNF1_INSTANCE_ID", + "orchStatus": null, + "productFamilyId": null, + "lcpCloudRegionId": "mtn23b", + "tenantId": "3e9a20a3e89e45f884e09df0cc2d2d2a", + "tenantName": "APPC-24595-T-IST-02C", + "modelInfo": { + "modelInvariantId": "vnf-instance-model-invariant-id", + "modelVersionId": "7a6ee536-f052-46fa-aa7e-2fca9d674c44", + "modelVersion": "2.0", + "modelName": "vf_vEPDG", + "modelType": "vnf" + }, + "instanceType": "VNF1_INSTANCE_TYPE", + "provStatus": null, + "inMaint": false, + "uuid": "7a6ee536-f052-46fa-aa7e-2fca9d674c44", + "originalName": null, + "legacyRegion": null, + "lineOfBusiness": null, + "platformName": null, + "trackById": "7a6ee536-f052-46fa-aa7e-2fca9d674c44:002", + "serviceInstanceId": "service-instance-id1", + "serviceInstanceName": "service-instance-name" + }, + { + "action": "None", + "instanceName": "VNF2_INSTANCE_NAME", + "instanceId": "VNF2_INSTANCE_ID", + "orchStatus": null, + "productFamilyId": null, + "lcpCloudRegionId": "mtn23b", + "tenantId": "3e9a20a3e89e45f884e09df0cc2d2d2a", + "tenantName": "APPC-24595-T-IST-02C", + "modelInfo": { + "modelInvariantId": "vnf-instance-model-invariant-id", + "modelVersionId": "eb5f56bf-5855-4e61-bd00-3e19a953bf02", + "modelVersion": "1.0", + "modelName": "vf_vEPDG", + "modelType": "vnf" + }, + "instanceType": "VNF2_INSTANCE_TYPE", + "provStatus": null, + "inMaint": true, + "uuid": "eb5f56bf-5855-4e61-bd00-3e19a953bf02", + "originalName": null, + "legacyRegion": null, + "lineOfBusiness": null, + "platformName": null, + "trackById": "eb5f56bf-5855-4e61-bd00-3e19a953bf02:003", + "serviceInstanceId": "service-instance-id2", + "serviceInstanceName": "service-instance-name" + } + ]; +} + + diff --git a/vid-webpack-master/src/app/shared/components/searchMembersModal/members-table/members-table.service.ts b/vid-webpack-master/src/app/shared/components/searchMembersModal/members-table/members-table.service.ts new file mode 100644 index 000000000..5b9cd39a2 --- /dev/null +++ b/vid-webpack-master/src/app/shared/components/searchMembersModal/members-table/members-table.service.ts @@ -0,0 +1,153 @@ +import {Injectable} from "@angular/core"; +import {VnfMember} from "../../../models/VnfMember"; +import {CustomTableColumnDefinition} from "./members-table.component"; +import {NgRedux} from "@angular-redux/store"; +import {AppState} from "../../../store/reducers"; +import {createRelatedVnfMemberInstance} from "../../../storeUtil/utils/relatedVnfMember/relatedVnfMember.actions"; +import * as _ from 'lodash'; +import {DataFilterPipe} from "../../../pipes/dataFilter/data-filter.pipe"; +import {MemberTableRowModel} from "./member-table-row.model"; + +@Injectable() +export class MembersTableService { + allMemberStatusMap : { [key:string]: MemberTableRowModel; }; + filteredMembers : VnfMember[]; + allCheckboxAreSelected : boolean; + numberOfNotHideVnfMembers : number; + numberOfSelectedVnfMembers : number; + numberOfSelectedAndNotHideVnfMembers : number; + + constructor(private _store: NgRedux<AppState>, private dataFilter: DataFilterPipe){ + this.resetAll(); + } + + filterUsedVnfMembers = (serviceModelId: string, result: VnfMember[]): VnfMember[] => { + const allMembersMap = _.keyBy(result as VnfMember[], 'instanceId'); + const vnfGroupsData = this._store.getState().service.serviceInstance[serviceModelId].vnfGroups; + const vnfMembersArr = _.flatMap(vnfGroupsData).map((vnfGroup) =>vnfGroup.vnfs ); + for( let vnf of vnfMembersArr ){ + for(let member in vnf){ + delete allMembersMap[member]; + } + } + return _.flatMap(allMembersMap); + }; + + updateAmountsAndCheckAll = () : void => { + this.numberOfSelectedVnfMembers = this.calculateSelectedVnfMembers(); + this.numberOfNotHideVnfMembers = this.calculateNotHideVnfMembers(); + this.numberOfSelectedAndNotHideVnfMembers = this.calculateSelectedAndNotHide(); + this.allCheckboxAreSelected = this.numberOfNotHideVnfMembers > 0 && this.numberOfNotHideVnfMembers === this.numberOfSelectedAndNotHideVnfMembers; + }; + + resetAll = () : void => { + this.allMemberStatusMap = {}; + this.filteredMembers = []; + this.numberOfSelectedVnfMembers = 0; + this.numberOfNotHideVnfMembers = 0; + this.numberOfSelectedAndNotHideVnfMembers = 0; + this.allCheckboxAreSelected = false; + }; + + changeAllCheckboxStatus = (status : boolean) : void =>{ + for(const member of this.filteredMembers){ + this.allMemberStatusMap[member.instanceId].isSelected = status; + } + this.updateAmountsAndCheckAll(); + }; + + changeCheckboxStatus = (vnfInstanceId : string ) : void =>{ + this.allMemberStatusMap[vnfInstanceId].isSelected = !this.allMemberStatusMap[vnfInstanceId].isSelected; + this.updateAmountsAndCheckAll(); + }; + + /************************************************ + iterate over all current vnf members: + 1) if vnf member is selected then update REDUX store + 2) if vnf member is not selected then delete member + @allMemberStatusMap: current vnf member status + @vnfGroupStoreKey: vnf group store key + @serviceId: service model id + ************************************************/ + setMembers = (data : {serviceId : string, vnfGroupStoreKey : string}) : void =>{ + let tmpMembers = this.allMemberStatusMap; + for(let key in tmpMembers){ + if(tmpMembers[key].isSelected){ + this._store.dispatch(createRelatedVnfMemberInstance( data.vnfGroupStoreKey, data.serviceId, tmpMembers[key])); + } + } + }; + + filterMembers(searchStr: string): void { + const keys: string[][] = MembersTableService.getDataKeys(); + this.filteredMembers = this.dataFilter.transform(_.values(this.allMemberStatusMap), searchStr || '', keys); + this.updateAmountsAndCheckAll(); + } + + /************************************ + generate vnf member data for select/ unselect rows + ************************************/ + static generateAllMembersStatus(tableData : VnfMember[]) : { [key:string]: MemberTableRowModel; }{ + + tableData.map((vnf) => { + vnf['isSelected'] = false + }); + return _.keyBy(tableData as MemberTableRowModel[], 'instanceId'); + } + + + static sortVnfMembersByName(list : VnfMember[], keyName : string) :VnfMember[]{ + if(!_.isNil(list) && !_.isNil(keyName)) { + return list.sort(function(itemA, itemB) { return itemA[keyName]- itemB[keyName];}) + } + return []; + + } + + /******************************** + table columns headers and key's + ********************************/ + static getHeaders() : CustomTableColumnDefinition[] { + return [ + {displayName: 'VNF instance name', key: ['instanceName']}, + {displayName: 'VNF version', key: ['modelInfo', 'modelVersion']}, + {displayName: 'VNF model name', key: ['modelInfo', 'modelName']}, + {displayName: 'Prov Status', key: ['provStatus']}, + {displayName: 'Service instance name', key: ['serviceInstanceName']}, + {displayName: 'Cloud Region', key: ['lcpCloudRegionId']}, + {displayName: 'Tenant Name', key: ['tenantName']} + ]; + } + + static getDataKeys(): string[][]{ + const headers = MembersTableService.getHeaders(); + return headers.map((header)=> header.key).concat([['instanceId']],[['serviceInstanceId']]); + } + + /************************************************************************************* + calculate the number of selected vnf members - include not visible and visible rows + @allMemberStatusMap: current vnf member status + *************************************************************************************/ + calculateSelectedVnfMembers() : number { + const flatObject = _.values(this.allMemberStatusMap); + return _.filter(flatObject, (item) => { if (item.isSelected) return item }).length; + } + + /************************************************ + calculate the number of display vnf members + @allMemberStatusMap: current vnf member status + ************************************************/ + calculateNotHideVnfMembers() : number { + return this.filteredMembers.length; + } + + /************************************************ + calculate the number of display vnf members + @allMemberStatusMap: current vnf member status + ************************************************/ + calculateSelectedAndNotHide() : number { + return _.filter(this.filteredMembers, (item) => { if ( this.allMemberStatusMap[item.instanceId].isSelected) return item }).length; + } + + +} diff --git a/vid-webpack-master/src/app/shared/components/searchMembersModal/search-members-modal.component.html b/vid-webpack-master/src/app/shared/components/searchMembersModal/search-members-modal.component.html new file mode 100644 index 000000000..899bc9889 --- /dev/null +++ b/vid-webpack-master/src/app/shared/components/searchMembersModal/search-members-modal.component.html @@ -0,0 +1,35 @@ +<div class="modal-search-member-content"> + <div class="header"> + <vid-svg-icon + [attr.data-tests-id]="'cancelBtn'" + (click)="closeDialog()" + class="navigation-arrow-back" + [mode]="'primary'" + [size]="'large'" + [name]="'navigation-arrow-back'" + [clickable]="true" + [fill]="'#FFFFFF'" + [widthViewBox]="'24'" + [heightViewBox]="'24'"> + </vid-svg-icon> + + <span class="title"> + {{title}} + </span> + <button type="submit" data-tests-id="setMembersBtn" [disabled]="disableSetMembers" (click)="setMembers()" class="sdc-button sdc-button__primary">SET MEMBERS</button> + </div> + <div class="content-wrapper"> + <div class="sidebar-left"> + <div class="search-criteria-wrapper"> + <div class="search-criteria-title">SEARCH CRITERIA</div> + <div class="search-item" *ngFor="let searchFieldItem of searchFields"> + <span class="label-item">{{searchFieldItem.title}}</span> + <span attr.data-tests-id="{{searchFieldItem.dataTestId}}" class="text-item">{{searchFieldItem.value}}</span> + </div> + </div> + </div> + <div class="sidebar-right"> + <app-members-table [data]="membersData" [description]="description" (selectedMembersAmountChange)="selectedMembersAmountChange($event)"></app-members-table> + </div> + </div> +</div> diff --git a/vid-webpack-master/src/app/shared/components/searchMembersModal/search-members-modal.component.scss b/vid-webpack-master/src/app/shared/components/searchMembersModal/search-members-modal.component.scss new file mode 100644 index 000000000..d49653934 --- /dev/null +++ b/vid-webpack-master/src/app/shared/components/searchMembersModal/search-members-modal.component.scss @@ -0,0 +1,89 @@ +.modal-search-member-content { + height: 100vh; + width: 100vw; + position: relative; + background: white; + .header { + height: 60px; + font-family: OpenSans-Regular; + display: -webkit-box; + display: flex; + font-size: 14px; + box-shadow: 2px 2px 6px #D2D2D2; + color: white; + background: #009fdb; + z-index: 1; + position: relative; + .navigation-arrow-back { + border-right: 1px solid #1eb9f3; + width: 60px; + height: 60px; + cursor: pointer; + display: flex; + justify-content: center; + align-items: center; + } + .title { + font-size: 18px; + line-height: 60px; + margin-left: 20px; + } + button { + width: 125px; + font-family: OpenSans-Regular; + font-size: 14px; + margin-left: auto; + margin-right: 20px; + margin-top: 12px; + border: 1px solid white; + &:disabled { + opacity: 0.5; + background: none; + } + } + } + + .content-wrapper { + display: flex; + + .sidebar-left { + flex-basis: 285px; + border-right: 1px solid #D2D2D2; + height: calc(100vh - 60px); + + .search-criteria-wrapper{ + + .search-criteria-title{ + font-family: OpenSans-SemiBold; + font-size: 14px; + color: #191919; + border-bottom: 1px solid #D2D2D2; + line-height: 50px; + padding-left: 30px; + } + .search-item{ + color: #191919; + display: flex; + flex-direction: column; + margin: 25px 30px; + .label-item { + font-family: OpenSans-SemiBold; + font-size: 12px; + } + .text-item{ + font-family: OpenSans-Regular; + font-size: 14px; + color: #5a5a5a; + word-break: break-all; + } + + } + } + } + + .sidebar-right { + flex: 1; + margin: 80px 50px; + } + } +} diff --git a/vid-webpack-master/src/app/shared/components/searchMembersModal/search-members-modal.component.ts b/vid-webpack-master/src/app/shared/components/searchMembersModal/search-members-modal.component.ts new file mode 100644 index 000000000..9c65d222d --- /dev/null +++ b/vid-webpack-master/src/app/shared/components/searchMembersModal/search-members-modal.component.ts @@ -0,0 +1,82 @@ +import {Component, OnDestroy, OnInit, ViewChild} from '@angular/core'; +import {DialogComponent, DialogService} from "ng2-bootstrap-modal"; +import {IframeService} from "../../utils/iframe.service"; +import {AaiService} from "../../services/aaiService/aai.service"; +import {VnfMember} from "../../models/VnfMember"; +import {VnfGroupModel} from "../../models/vnfGroupModel"; +import {MembersTableService} from "./members-table/members-table.service"; +import {VnfGroupInstance} from "../../models/vnfGroupInstance"; + + +export interface PopupModel { + title: string; + serviceModelId : string; + searchFields: ISearchField[]; + description : string; + subscriberId: string, + serviceType: string, + node: VnfGroupInstance, + vnfGroupModel: VnfGroupModel; + +} + +export interface ISearchField { + title: string; + value: any; + dataTestId: string; +} + +@Component({ + selector : 'search-members-modal', + templateUrl : 'search-members-modal.component.html', + styleUrls : ['search-members-modal.component.scss'] +}) + +export class SearchMembersModalComponent extends DialogComponent<PopupModel, boolean> implements OnInit, OnDestroy { + title: string; + serviceModelId : string; + parentElementClassName = 'content'; + membersData: VnfMember[]; + description : string; + searchFields: ISearchField[]; + vnfGroupModel: VnfGroupModel; + subscriberId: string; + serviceType: string; + node: VnfGroupInstance; + disableSetMembers: boolean = true; + constructor(dialogService: DialogService , + private _iframeService : IframeService, + private _aaiService : AaiService, + private _membersTableService: MembersTableService){ + super(dialogService); + + } + @ViewChild('MembersTableComponent') membersTable; + + ngOnInit() : void{ + this._aaiService.getOptionalGroupMembers(this.serviceModelId, this.subscriberId, this.serviceType, (Object.values(this.vnfGroupModel.members))[0].sourceModelInvariant, this.vnfGroupModel.properties.type, this.vnfGroupModel.properties.role) + .subscribe((result: VnfMember[])=>{ + this.membersData = this._membersTableService.filterUsedVnfMembers(this.serviceModelId, result); + }); + }; + + + closeDialog() : void{ + this._iframeService.removeClassCloseModal(this.parentElementClassName); + this.dialogService.removeDialog(this); + setTimeout(() => { + window.parent.postMessage("closeIframe", "*"); + }, 15); + } + selectedMembersAmountChange(selectedMembersAmount: number) : void { + this.disableSetMembers = selectedMembersAmount==0; + } + + + setMembers() : void { + this._membersTableService.setMembers({serviceId : this.serviceModelId, vnfGroupStoreKey : this.node.vnfGroupStoreKey}); + this.closeDialog(); + } +} + + diff --git a/vid-webpack-master/src/app/shared/components/spinner/spinner.component.html b/vid-webpack-master/src/app/shared/components/spinner/spinner.component.html index cb11feea8..238f7693d 100644 --- a/vid-webpack-master/src/app/shared/components/spinner/spinner.component.html +++ b/vid-webpack-master/src/app/shared/components/spinner/spinner.component.html @@ -1,2 +1,6 @@ -<div *ngIf="show" - class="spinner"></div> +<sdc-loader name= "global" + #globalLoader + [global] = "global" + [size]="size" + [(active)] = "show"></sdc-loader> + diff --git a/vid-webpack-master/src/app/shared/components/spinner/spinner.component.spec.ts b/vid-webpack-master/src/app/shared/components/spinner/spinner.component.spec.ts index 531ee8c62..57f7b009c 100644 --- a/vid-webpack-master/src/app/shared/components/spinner/spinner.component.spec.ts +++ b/vid-webpack-master/src/app/shared/components/spinner/spinner.component.spec.ts @@ -1,42 +1,50 @@ -import {async, ComponentFixture, TestBed} from '@angular/core/testing'; +import {ComponentFixture, TestBed} from '@angular/core/testing'; import {HttpClientTestingModule} from '@angular/common/http/testing'; -import { SpinnerComponent } from './spinner.component'; +import {SpinnerComponent, SpinnerInfo} from './spinner.component'; +import {CUSTOM_ELEMENTS_SCHEMA} from "@angular/core"; describe('Spinner component', () => { let component: SpinnerComponent; let fixture: ComponentFixture<SpinnerComponent>; - beforeEach(async(() => { + beforeAll(done => (async () => { TestBed.configureTestingModule({ imports: [HttpClientTestingModule], providers: [], - declarations: [SpinnerComponent ] - }) - .compileComponents(); - })); + declarations: [SpinnerComponent], + schemas: [ CUSTOM_ELEMENTS_SCHEMA ] + }); + await TestBed.compileComponents(); - beforeEach(() => { fixture = TestBed.createComponent(SpinnerComponent); component = fixture.componentInstance; fixture.detectChanges(); - }); - it('component should be defined', () => { + })().then(done).catch(done.fail)); + + + + test('component should be defined', () => { expect(component).toBeDefined(); }); - - it('component constructor should subscribe of showSpinner event with true', ()=> { - SpinnerComponent.showSpinner.next(true); + test('component constructor should subscribe of showSpinner event with true', ()=> { + let spinnerInfo : SpinnerInfo = new SpinnerInfo(true, 'someUrl', 'json'); + SpinnerComponent.showSpinner.next(spinnerInfo); expect(component.show).toBeTruthy(); }); - it('component constructor should subscribe of showSpinner event with false', ()=> { - SpinnerComponent.showSpinner.next(false); + test('component constructor should subscribe of showSpinner event with true and then to be false', ()=> { + let spinnerInfo : SpinnerInfo = new SpinnerInfo(true, 'someUrl', 'json'); + SpinnerComponent.showSpinner.next(spinnerInfo); + spinnerInfo = new SpinnerInfo(false, 'someUrl', 'json'); + SpinnerComponent.showSpinner.next(spinnerInfo); expect(component.show).toBeFalsy(); }); - - - + test('component constructor should subscribe of showSpinner event with false', ()=> { + let spinnerInfo : SpinnerInfo = new SpinnerInfo(false, 'someUrl', 'json'); + SpinnerComponent.showSpinner.next(spinnerInfo); + expect(component.show).toBeFalsy(); + }); }); diff --git a/vid-webpack-master/src/app/shared/components/spinner/spinner.component.ts b/vid-webpack-master/src/app/shared/components/spinner/spinner.component.ts index 0ce5d2074..94a0e1c52 100644 --- a/vid-webpack-master/src/app/shared/components/spinner/spinner.component.ts +++ b/vid-webpack-master/src/app/shared/components/spinner/spinner.component.ts @@ -1,18 +1,50 @@ -import { Component, Input } from '@angular/core'; -import { Subject } from 'rxjs/Subject'; +import {Component} from '@angular/core'; +import {Subject} from 'rxjs/Subject'; +import * as _ from 'lodash'; @Component({ selector : 'spinner-component', - templateUrl : './spinner.component.html', - styleUrls : ['./spinner.component.scss'] + templateUrl: './spinner.component.html', + styleUrls : ['./spinner.component.scss'], + providers : [] + }) -export class SpinnerComponent { - show : boolean = false; - static showSpinner: Subject<boolean> = new Subject<boolean>(); +export class SpinnerComponent{ + show : boolean; + size = "large"; + global = true; + + requestMap = {}; + + static showSpinner: Subject<SpinnerInfo> = new Subject<SpinnerInfo>(); constructor(){ - SpinnerComponent.showSpinner.subscribe((status) => { - this.show = status; + SpinnerComponent.showSpinner.subscribe((spinnerInfo) => { + let status = spinnerInfo['status']; + let requestType = spinnerInfo['requestType']; + let requestUrl = spinnerInfo['requestUrl']; + + if(status && requestType === 'json'){ + this.requestMap[requestUrl] = true; + }else { + delete this.requestMap[requestUrl] + } + console.log(this.requestMap); + this.show = !_.isEmpty(this.requestMap) && this.requestMap !== undefined; + }) } } + + +export class SpinnerInfo { + status : boolean; + requestUrl : string; + requestType : string; + + constructor(status : boolean, requestUrl : string, requestType : string){ + this.status = status; + this.requestUrl = requestUrl; + this.requestType = requestType; + } +} diff --git a/vid-webpack-master/src/app/shared/components/svg/svg-component.ts b/vid-webpack-master/src/app/shared/components/svg/svg-component.ts new file mode 100644 index 000000000..2e4642432 --- /dev/null +++ b/vid-webpack-master/src/app/shared/components/svg/svg-component.ts @@ -0,0 +1,47 @@ +import { + AfterViewChecked, + Component, + ElementRef, + EventEmitter, + Input, + Output +} from "@angular/core"; +import * as _ from 'lodash'; + +@Component({ + selector : 'vid-svg-icon', + template: ` + <svg-icon + [mode]="mode" + [size]="size" + [name]="name" + [testId]="testId" + [clickable]="clickable"> + </svg-icon> + `, + + +}) +export class SvgComponent implements AfterViewChecked{ + @Input() mode : string = 'primary'; + @Input() size : string = 'large'; + @Input() testId : string = null; + @Input() name : string = null; + @Input() clickable : boolean = false; + @Input() fill : string ; + @Input() widthViewBox: string = null; + @Input() heightViewBox: string = null; + + constructor(private elRef: ElementRef) {} + + ngAfterViewChecked(): void { + if(!_.isNil(this.fill)){ + this.elRef.nativeElement.children[0].children[0].children[0].style.fill = this.fill; + } + + if(this.widthViewBox && this.heightViewBox){ + this.elRef.nativeElement.children[0].children[0].children[0].setAttribute('viewBox', "1 1 " + this.widthViewBox + " " + this.heightViewBox) + } + + } +} diff --git a/vid-webpack-master/src/app/shared/components/validators/numbersLettersUnderscore/numbersLettersUnderscore.validator.spec.ts b/vid-webpack-master/src/app/shared/components/validators/numbersLettersUnderscore/numbersLettersUnderscore.validator.spec.ts deleted file mode 100644 index ec9f3f73e..000000000 --- a/vid-webpack-master/src/app/shared/components/validators/numbersLettersUnderscore/numbersLettersUnderscore.validator.spec.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { ReflectiveInjector } from '@angular/core'; -import { NumbersLettersUnderscoreValidator } from './numbersLettersUnderscore.validator'; - -describe('Numbers letters underscore validator', () => { - let injector; - let service: NumbersLettersUnderscoreValidator; - - beforeEach(() => { - - let injector = ReflectiveInjector.resolveAndCreate([ - NumbersLettersUnderscoreValidator - ]); - - service = injector.get(NumbersLettersUnderscoreValidator); - }); - - - describe('#valid', () => { - it("'legal' should return null", ()=> { - let legalVal: string = "legal"; - let result = NumbersLettersUnderscoreValidator.valid(legalVal); - expect(result).toBeNull(); - }); - - it("'illegal' should return object with invalidNumberLettersUnderscore true", ()=> { - let illegalVal: string = "illegal-Val"; - let result = NumbersLettersUnderscoreValidator.valid(illegalVal); - expect(result.invalidNumberLettersUnderscore).toBeTruthy(); - }); - - it("'null' should return null", ()=> { - let nullVal: string = null - let result = NumbersLettersUnderscoreValidator.valid(nullVal); - expect(result).toBeNull(); - }); - - - }); -}); diff --git a/vid-webpack-master/src/app/shared/components/validators/numbersLettersUnderscore/numbersLettersUnderscore.validator.ts b/vid-webpack-master/src/app/shared/components/validators/numbersLettersUnderscore/numbersLettersUnderscore.validator.ts deleted file mode 100644 index 418bdfc4d..000000000 --- a/vid-webpack-master/src/app/shared/components/validators/numbersLettersUnderscore/numbersLettersUnderscore.validator.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { Injectable } from '@angular/core'; -import { isNullOrUndefined, isString } from 'util'; - -@Injectable() -export class NumbersLettersUnderscoreValidator { - static valid(control: any) { - let reg = /^[a-zA-Z0-9_]*$/; - - if(isNullOrUndefined(control)) return null; - let val = isString(control) ? control : control.value; - if (val === null) { - return {'invalidNumberLettersUnderscore': true}; - } - if (reg.test(val)) { - return null; - } else { - return {'invalidNumberLettersUnderscore': true}; - } - } -} diff --git a/vid-webpack-master/src/app/shared/directives/clickOutside/clickOutside.directive.spec.ts b/vid-webpack-master/src/app/shared/directives/clickOutside/clickOutside.directive.spec.ts new file mode 100644 index 000000000..8edfb8733 --- /dev/null +++ b/vid-webpack-master/src/app/shared/directives/clickOutside/clickOutside.directive.spec.ts @@ -0,0 +1,52 @@ +import {ComponentFixture, TestBed} from '@angular/core/testing'; +import {Component, DebugElement} from "@angular/core"; +import {By} from "@angular/platform-browser"; +import {ClickOutsideDirective} from "./clickOutside.directive"; + +@Component({ + template: + `<div id="innerDiv" [clickOutside] [classElements]="['outsideDivShouldNotTrigger']"></div> + <div class="outsideDivShouldTrigger"></div> + <div class="outsideDivShouldNotTrigger"></div>` +}) +class TestHoverFocusComponent { +} + + +describe('Click outside Directive', () => { + let component: TestHoverFocusComponent; + let fixture: ComponentFixture<TestHoverFocusComponent>; + let directiveInstance : ClickOutsideDirective; + let outsideDivShouldNotTrigger: DebugElement; + let outsideDivShouldTrigger: DebugElement; + let innerDiv: DebugElement; + + beforeEach(() => { + TestBed.configureTestingModule({ + declarations: [TestHoverFocusComponent, ClickOutsideDirective] + }); + fixture = TestBed.createComponent(TestHoverFocusComponent); + component = fixture.componentInstance; + outsideDivShouldNotTrigger = fixture.debugElement.query(By.css('.outsideDivShouldNotTrigger')); + outsideDivShouldTrigger = fixture.debugElement.query(By.css('.outsideDivShouldTrigger')); + innerDiv = fixture.debugElement.query(By.css('#innerDiv')); + directiveInstance = innerDiv.injector.get(ClickOutsideDirective); + }); + + test('directive should be defined', () => { + expect(directiveInstance).toBeDefined(); + }); + + test(`should have list of class's`, () => { + fixture.detectChanges(); + expect(directiveInstance.classElements).toEqual(['outsideDivShouldNotTrigger']); + }); + + test('should not trigger output on click outside', () => { + fixture.detectChanges(); + spyOn(directiveInstance.clickOutsideTrigger, 'next'); + outsideDivShouldNotTrigger.nativeElement.click(); + expect(directiveInstance.clickOutsideTrigger.next).toHaveBeenCalledTimes(0); + }); + +}); diff --git a/vid-webpack-master/src/app/shared/directives/clickOutside/clickOutside.directive.ts b/vid-webpack-master/src/app/shared/directives/clickOutside/clickOutside.directive.ts new file mode 100644 index 000000000..1a43a3e68 --- /dev/null +++ b/vid-webpack-master/src/app/shared/directives/clickOutside/clickOutside.directive.ts @@ -0,0 +1,41 @@ +import {Directive, EventEmitter, HostListener, Input, Output} from "@angular/core"; +import * as _ from 'lodash'; +/********************************************************************** + Click outside directive + can get one list of class's or id's (Not together) + if all elements are not the target then clickOutside is trigger + *******************************************************************/ +@Directive({ + selector : '[clickOutside]' +}) +export class ClickOutsideDirective { + @Input() clickOutside : string; + @Input() classElements : string[] = []; + @Input() idElements : string[] = []; + @Output() public clickOutsideTrigger: EventEmitter<any> = new EventEmitter(); + + @HostListener('document:click', ['$event.target']) public onClick(targetElement) { + if(!_.isNil(this.classElements)){this.hostListener(targetElement, this.classElements, 'getElementsByClassName');} + if(!_.isNil(this.idElements)){this.hostListener(targetElement, this.idElements, 'getElementById');} + } + + +/******************************************************************************** + hostListener - iterate over all elements and check if the element is the target. + @param targetElement - the target element + @param elements - elements to check + @param documentMethod - method to find the element in dom + ********************************************************************************/ +hostListener(targetElement, elements, documentMethod): void{ + let result = true; +for(let i = 0 ; i < elements.length; i++){ + const classElements = document[documentMethod](elements[i]); + for (let j = 0 ; j < classElements.length; j++){ + const clickedInside = document[documentMethod](elements[i])[j].contains(targetElement); + if(clickedInside) return; + result = result && clickedInside; + } +} +if (!result) {this.clickOutsideTrigger.emit(null); } +} +} diff --git a/vid-webpack-master/src/app/shared/directives/inputPrevention/inputPreventionPattern.directive.spec.ts b/vid-webpack-master/src/app/shared/directives/inputPrevention/inputPreventionPattern.directive.spec.ts index 846ff70f2..ec5bfd8f3 100644 --- a/vid-webpack-master/src/app/shared/directives/inputPrevention/inputPreventionPattern.directive.spec.ts +++ b/vid-webpack-master/src/app/shared/directives/inputPrevention/inputPreventionPattern.directive.spec.ts @@ -1,19 +1,18 @@ -import {TestBed, ComponentFixture} from '@angular/core/testing'; +import {ComponentFixture, TestBed} from '@angular/core/testing'; import {Component, DebugElement} from "@angular/core"; import {By} from "@angular/platform-browser"; -import { InputPreventionPatternDirective } from './inputPreventionPattern.directive'; +import {InputPreventionPatternDirective} from './inputPreventionPattern.directive'; @Component({ - template: `<input + template: `<input patternInput - pattern="^[a-zA-Z0-9_]*$">` + pattern="^[a-zA-Z0-9._-]*$">` }) class TestHoverFocusComponent { } describe('InputPrevention Pattern Directive', () => { - let component: TestHoverFocusComponent; let fixture: ComponentFixture<TestHoverFocusComponent>; let directiveInstance : InputPreventionPatternDirective; @@ -29,37 +28,54 @@ describe('InputPrevention Pattern Directive', () => { directiveInstance = inputEl.injector.get(InputPreventionPatternDirective); }); - it('directive should be defined', () => { + test('directive should be defined', () => { expect(directiveInstance).toBeDefined(); }); - it('pattern exists', () => { - expect(inputEl.nativeElement.pattern).toEqual('^[a-zA-Z0-9_]*$'); + test('pattern exists', () => { + expect(inputEl.nativeElement.pattern).toEqual('^[a-zA-Z0-9._-]*$'); }); - it('kepress legal input', () => { + test('kepress legal input', () => { fixture.detectChanges(); inputEl.nativeElement.value = "legalInput"; expect(new RegExp(inputEl.nativeElement.pattern).test(inputEl.nativeElement.value)).toBeTruthy(); }); - it('kepress illegal input', () => { + test('kepress illegal input', () => { inputEl.triggerEventHandler('kepress', " "); fixture.detectChanges(); expect(inputEl.nativeElement.value).toBe(''); }); - it('kepress event legal input should return event', () => { - const event = <any>{ key: 'A' }; + + test('kepress event legal input should return event', () => { + const event = <any>{ key: 'A'}; + inputEl.nativeElement.value = "legalInput"; + let result = directiveInstance.onKeypress(event); + expect(result).toBe(event); + }); + + + test('kepress event legal(-) input should return event', () => { + const event = <any>{ key: '-'}; inputEl.nativeElement.value = "legalInput"; let result = directiveInstance.onKeypress(event); expect(result).toBe(event); }); - it('kepress event illegal input should prevent default', () => { - const event = <any>{key: '-', preventDefault : function () {} }; - spyOn(event, 'preventDefault'); - inputEl.nativeElement.value = "-"; + test('kepress event legal (.) input should return event', () => { + const event = <any>{ key: '.'}; + inputEl.nativeElement.value = "legalInput"; + let result = directiveInstance.onKeypress(event); + expect(result).toBe(event); + }); + + + test('kepress event illegal input should prevent default', () => { + const event = <any>{key: '$', preventDefault : function () {} }; + jest.spyOn(event, 'preventDefault'); + inputEl.nativeElement.value = "$"; let result = directiveInstance.onKeypress(event); expect(event.preventDefault).toHaveBeenCalled(); }); diff --git a/vid-webpack-master/src/app/shared/directives/inputPrevention/inputPreventionPattern.directive.ts b/vid-webpack-master/src/app/shared/directives/inputPrevention/inputPreventionPattern.directive.ts index dada09bef..d00c52502 100644 --- a/vid-webpack-master/src/app/shared/directives/inputPrevention/inputPreventionPattern.directive.ts +++ b/vid-webpack-master/src/app/shared/directives/inputPrevention/inputPreventionPattern.directive.ts @@ -1,18 +1,10 @@ -import {Directive, ElementRef} from '@angular/core'; +import {Directive, ElementRef, HostBinding, HostListener} from '@angular/core'; @Directive({ - selector: '[patternInput]', - host: { - '(keypress)': 'onKeypress($event)' - } + selector: '[patternInput]' }) export class InputPreventionPatternDirective{ - inputElement : ElementRef; - constructor(el: ElementRef) { - this.inputElement = el; - } - - onKeypress(event: KeyboardEvent) { + @HostListener('keypress', ['$event']) onKeypress(event: KeyboardEvent) { const pattern = new RegExp(this.inputElement.nativeElement.pattern); if(pattern){ if(!pattern.test(event['key'])){ @@ -21,4 +13,9 @@ export class InputPreventionPatternDirective{ } return event; } + + inputElement : ElementRef; + constructor(el: ElementRef) { + this.inputElement = el; + } } diff --git a/vid-webpack-master/src/app/shared/directives/svg/svg.directive.html b/vid-webpack-master/src/app/shared/directives/svg/svg.directive.html deleted file mode 100644 index e69de29bb..000000000 --- a/vid-webpack-master/src/app/shared/directives/svg/svg.directive.html +++ /dev/null diff --git a/vid-webpack-master/src/app/shared/directives/svg/svg.directive.ts b/vid-webpack-master/src/app/shared/directives/svg/svg.directive.ts deleted file mode 100644 index e4dc55a56..000000000 --- a/vid-webpack-master/src/app/shared/directives/svg/svg.directive.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { AfterContentChecked, AfterViewInit, Directive, ElementRef, Input } from '@angular/core'; -import { isNullOrUndefined } from 'util'; - - -/* - Temporary - Changing svg color and size. - color changing according to fill attribute - size according to viewBox -*/ -@Directive({ - selector: '[svg-directive]' -}) -export class SvgDirective implements AfterContentChecked { - @Input('fill') fill: string = "black"; - @Input('widthViewBox') widthViewBox: string = null; - @Input('heightViewBox') heightViewBox: string = null; - - constructor(private elRef: ElementRef) {} - ngAfterContentChecked(): void { - if(this.elRef !== undefined && this.elRef.nativeElement.children !== undefined && this.elRef.nativeElement.children[0] !== undefined){ - this.elRef.nativeElement.children[0].children[1].children[0].style.fill = this.fill; - if(this.elRef.nativeElement.children[0].children[1].children.length > 1){ - this.elRef.nativeElement.children[0].children[1].children[1].style.fill = this.fill; - this.elRef.nativeElement.children[0].children[1].children[2].children[0].style.fill = this.fill; - } - - if(this.widthViewBox && this.heightViewBox){ - this.elRef.nativeElement.firstChild.setAttribute('viewBox', "1 1 " + this.widthViewBox + " " + this.heightViewBox) - } - - } - } -} diff --git a/vid-webpack-master/src/app/shared/index.ts b/vid-webpack-master/src/app/shared/index.ts deleted file mode 100644 index 68fada65d..000000000 --- a/vid-webpack-master/src/app/shared/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './api.service'; diff --git a/vid-webpack-master/src/app/shared/models/ServiceNodeTypes.ts b/vid-webpack-master/src/app/shared/models/ServiceNodeTypes.ts index f72b32d8b..945c69be9 100644 --- a/vid-webpack-master/src/app/shared/models/ServiceNodeTypes.ts +++ b/vid-webpack-master/src/app/shared/models/ServiceNodeTypes.ts @@ -2,7 +2,9 @@ export enum ServiceNodeTypes { VF = "VF", VFmodule = "VFmodule", Network = "Network", - Configuration = "Configuration" + VL = 'VL', + Configuration = "Configuration", + VnfGroup = 'VnfGroup' } diff --git a/vid-webpack-master/src/app/shared/models/VnfMember.ts b/vid-webpack-master/src/app/shared/models/VnfMember.ts new file mode 100644 index 000000000..392f8ddf9 --- /dev/null +++ b/vid-webpack-master/src/app/shared/models/VnfMember.ts @@ -0,0 +1,11 @@ +import {Level1Instance} from "./level1Instance"; + +export class VnfMember extends Level1Instance{ + serviceInstanceName: string; + serviceInstanceId: string; + tenantName: string; + constructor(){ + super(); + } + +} diff --git a/vid-webpack-master/src/app/shared/models/formControlModels/checkboxFormControl.model.ts b/vid-webpack-master/src/app/shared/models/formControlModels/checkboxFormControl.model.ts new file mode 100644 index 000000000..f505b5667 --- /dev/null +++ b/vid-webpack-master/src/app/shared/models/formControlModels/checkboxFormControl.model.ts @@ -0,0 +1,11 @@ +import {FormControlModel} from "./formControl.model"; +import {FormControlType} from "./formControlTypes.enum"; + +export class CheckboxFormControl extends FormControlModel{ + + constructor(data) { + super(data); + this.type = FormControlType.CHECKBOX; + this.validations = []; + } +} diff --git a/vid-webpack-master/src/app/shared/models/formControlModels/dropdownFormControl.model.ts b/vid-webpack-master/src/app/shared/models/formControlModels/dropdownFormControl.model.ts new file mode 100644 index 000000000..ba3e860e0 --- /dev/null +++ b/vid-webpack-master/src/app/shared/models/formControlModels/dropdownFormControl.model.ts @@ -0,0 +1,29 @@ +import {FormControlModel} from "./formControl.model"; +import {FormGroup} from "@angular/forms"; +import {FormControlType} from "./formControlTypes.enum"; +import {Observable} from "rxjs"; + +export class DropdownFormControl extends FormControlModel{ + options$ : Observable<any[]> = null; + args : string[]; + onInit: (data : DropdownFormControl, form: FormGroup) => Observable<any>; + selectedField : string; + onInitSelectedField : string[]; // key that should select from API response. + ngValue : string; + name : string; + hasEmptyOptions : boolean; // get empty result from API or REDUX. + + + constructor(data) { + super(data); + this.type = FormControlType.DROPDOWN; + this.options$ = data.options ? data.options$ : null; + this.onInit = data.onInit; + this.selectedField = data.selectedField; + this.onInitSelectedField = data.onInitSelectedField ? data.onInitSelectedField : null; + this.ngValue = data.selectedField ? data.selectedField : 'id'; + this.name = data.name; + this.hasEmptyOptions = false; + } + +} diff --git a/vid-webpack-master/src/app/shared/models/formControlModels/fileFormControl.model.ts b/vid-webpack-master/src/app/shared/models/formControlModels/fileFormControl.model.ts new file mode 100644 index 000000000..7803fabf8 --- /dev/null +++ b/vid-webpack-master/src/app/shared/models/formControlModels/fileFormControl.model.ts @@ -0,0 +1,18 @@ +import {CustomValidatorOptions, FormControlModel, ValidatorModel} from "./formControl.model"; +import {FormControlType} from "./formControlTypes.enum"; +import {InputFormControl} from "./inputFormControl.model"; + +export class FileFormControl extends FormControlModel{ + acceptedExtentions : String; + selectedFile : String; + onDelete? :Function; + hiddenFile: InputFormControl[]; + constructor(data) { + super(data); + this.type = FormControlType.FILE; + this.selectedFile = data.selectedFile ? data.selectedFile : data.placeHolder; + this.acceptedExtentions = data.acceptedExtentions ? data.acceptedExtentions : ''; + this.onDelete = data.onDelete ? data.onDelete : function () {}; + this.hiddenFile = data.hiddenFile; + } +} diff --git a/vid-webpack-master/src/app/shared/models/formControlModels/formControl.model.ts b/vid-webpack-master/src/app/shared/models/formControlModels/formControl.model.ts new file mode 100644 index 000000000..24116549e --- /dev/null +++ b/vid-webpack-master/src/app/shared/models/formControlModels/formControl.model.ts @@ -0,0 +1,121 @@ +import {FormGroup, ValidatorFn, Validators} from "@angular/forms"; +import {Subject} from "rxjs/Subject"; +import {FormControlType} from "./formControlTypes.enum"; +import {CustomValidators} from "../../validators/uniqueName/uniqueName.validator"; +import * as _ from 'lodash'; + +export class FormControlModel { + formGroup : FormGroup; + controlName : string; + type : FormControlType; + displayName : string; + dataTestId : string; + placeHolder? : string; + tooltip? :string; + isDisabled? : boolean; + validations? : ValidatorModel[]; + isVisible? : boolean; + value? : any; + originalValue?: any; + minLength?: number; + maxLength?: number; + onChange? : Function; + onBlur? : Function; + preventionsAttribute : AttributeMap[] = []; + waitFor? : Subject<string>[] = []; + hasErrors : () => string[]; + + + constructor(data: any){ + this.type = data.type; + this.displayName = data.displayName; + this.dataTestId = data.dataTestId; + this.placeHolder = data.placeHolder; + this.tooltip = data.tooltip; + this.isDisabled = data.isDisabled || false; + this.validations = data.validations || []; + this.isVisible = !_.isNil(data.isVisible) ? data.isVisible : true; + this.value = data.value; + this.originalValue = data.value; + this.controlName = data.controlName; + this.minLength = data.minLength; + this.maxLength = data.maxLength; + this.preventionsAttribute = data.preventionsAttribute || []; + this.onBlur = function(){}; + this.onChange = data.onChange ? data.onChange: function () {} + } + + isRequired() : boolean { + for(let validtorsModel of this.validations){ + let required = 'required'; + if(validtorsModel.validatorName.toString() === required){ + return true; + } + } + return false; + } + + getPreventionAttribute() : AttributeMap[] { + let result : AttributeMap[] = [new AttributeMap('data-tests-id', this.dataTestId)]; + return this.preventionsAttribute.concat(result); + } +} + + + +export class ValidatorModel { + validator : ValidatorFn; + validatorArg? : any; + validatorName : ValidatorOptions | CustomValidatorOptions; + errorMsg : string; + + constructor(validatorName : ValidatorOptions | CustomValidatorOptions, errorMsg : string, validatorArg: any = null){ + this.validatorName = validatorName; + this.validator = this.setValidator(validatorName, validatorArg); + this.errorMsg = errorMsg; + this.validatorArg = validatorArg; + } + + + setValidator(validatorName : ValidatorOptions | CustomValidatorOptions, validatorArg: any = null) : ValidatorFn { + if(validatorName in ValidatorOptions){ + return validatorArg ? Validators[validatorName](validatorArg) : Validators[validatorName]; + }else { + return validatorArg ? CustomValidators[CustomValidatorOptions[validatorName]].apply(this, validatorArg) : CustomValidators[CustomValidatorOptions[validatorName]]; + } + } +} + + + +export enum ValidatorOptions { + required = 'required', + minLength = 'minLength', + maxLength = 'maxLength', + pattern = 'pattern', + nullValidator = 'nullValidator' +} + + + +export enum CustomValidatorOptions { + uniqueInstanceNameValidator = 'uniqueInstanceNameValidator', + emptyDropdownOptions = 'emptyDropdownOptions', + isValidJson = 'isValidJson', + isFileTooBig = 'isFileTooBig', + isStringContainTags = 'isStringContainTags' +} + +export class AttributeMap { + key : string; + value : string; + + constructor(key : string, value? : string){ + this.key = key; + this.value = value ? value : ''; + } +} + + + + diff --git a/vid-webpack-master/src/app/shared/models/formControlModels/formControlTypes.enum.ts b/vid-webpack-master/src/app/shared/models/formControlModels/formControlTypes.enum.ts new file mode 100644 index 000000000..eba1b0894 --- /dev/null +++ b/vid-webpack-master/src/app/shared/models/formControlModels/formControlTypes.enum.ts @@ -0,0 +1,8 @@ +export enum FormControlType{ + MULTI_SELECT = 'MULTI_SELECT', + FILE = 'FILE', + NUMBER = 'NUMBER', + INPUT = 'INPUT', + DROPDOWN = 'DROPDOWN', + CHECKBOX = 'CHECKBOX' +} diff --git a/vid-webpack-master/src/app/shared/models/formControlModels/formPopupDetails.model.ts b/vid-webpack-master/src/app/shared/models/formControlModels/formPopupDetails.model.ts new file mode 100644 index 000000000..8ea3d2d0b --- /dev/null +++ b/vid-webpack-master/src/app/shared/models/formControlModels/formPopupDetails.model.ts @@ -0,0 +1,55 @@ +import {FormControlModel} from "./formControl.model"; +import {ModelInformationItem} from "../../components/model-information/model-information.component"; +import {FormGroup} from "@angular/forms"; + +export class FormPopupDetails { + popupTypeName: PopupType; + that : any; + UUIDData : Object = {}; // TODO uuid tree + title: string; + leftSubTitle: string; + rightSubTitle: string; + formControlList: FormControlModel[]; + dynamicInputsControlList: FormControlModel[]; + modelInformationItems: ModelInformationItem[]; + onSubmit : (that : any, form: FormGroup , ...args) => void; + onCancel : (that : any, form: FormGroup) => void; + + constructor(that : any, + popupTypeName : PopupType , + UUIDData : Object, + title : string, + leftSubTitle : string, + rightSubTitle : string, + formControlList : FormControlModel[], + dynamicInputsControlList : FormControlModel[], + modelInformationItems : ModelInformationItem[], + onSubmit : (that : any, form : FormGroup, ...args) => void, + onCancel : (that : any, form : FormGroup) => void){ + this.title = title; + this.leftSubTitle = leftSubTitle; + this.rightSubTitle = rightSubTitle; + this.formControlList = formControlList; + this.dynamicInputsControlList = dynamicInputsControlList; + this.modelInformationItems = modelInformationItems; + this.onSubmit = onSubmit; + this.onCancel = onCancel; + this.popupTypeName = popupTypeName; + this.UUIDData = UUIDData; + this.that = that; + } +} + + + +export enum PopupType { + SERVICE_MACRO = 'service macro', + SERVICE_A_LA_CART = 'service a-la-cart', + SERVICE = 'service', + VNF_MACRO ='vnf macro', + VNF_A_LA_CARTE = 'vnf a-la-carte', + VFMODULE = 'vfModule', + NETWORK_MACRO = 'network_macro', + VNF_GROUP = 'vnfGroup' +} + diff --git a/vid-webpack-master/src/app/shared/models/formControlModels/inputFormControl.model.ts b/vid-webpack-master/src/app/shared/models/formControlModels/inputFormControl.model.ts new file mode 100644 index 000000000..99210af7a --- /dev/null +++ b/vid-webpack-master/src/app/shared/models/formControlModels/inputFormControl.model.ts @@ -0,0 +1,19 @@ +import {FormControlModel} from "./formControl.model"; +import {FormControlType} from "./formControlTypes.enum"; + +export class InputFormControl extends FormControlModel { + onBlur ?: Function; + onKeypress?: Function; + inputType: string = 'text'; + pattern: string; + preventions: string[]; + + constructor(data) { + super(data); + this.type = FormControlType.INPUT; + this.pattern = data.pattern; + this.onKeypress = data.onKeypress ? data.onKeypress : ()=>{} + this.onBlur = data.onBlur ? data.onBlur : ()=>{} + } +} + diff --git a/vid-webpack-master/src/app/shared/models/formControlModels/multiselectFormControl.model.ts b/vid-webpack-master/src/app/shared/models/formControlModels/multiselectFormControl.model.ts new file mode 100644 index 000000000..b13745104 --- /dev/null +++ b/vid-webpack-master/src/app/shared/models/formControlModels/multiselectFormControl.model.ts @@ -0,0 +1,27 @@ +import {FormControlModel} from "./formControl.model"; +import {Observable} from "rxjs"; +import {FormGroup} from "@angular/forms"; +import {FormControlType} from "./formControlTypes.enum"; + +export class MultiselectFormControl extends FormControlModel{ + options$ : Observable<any[]>; + args : string[]; + onInit: (data : MultiselectFormControl, form: FormGroup) => Observable<any>; + selectedItems : string; + onInitSelectedItems : string[]; + ngValue : string; + settings: {}; + + + constructor(data) { + super(data); + this.type = FormControlType.MULTI_SELECT; + this.options$ = data.options; + this.onInit = data.onInit; + this.selectedItems = data.selectedItems; + this.onInitSelectedItems = data.onInitSelectedItems ? data.onInitSelectedItems : null; + this.ngValue = data.selectedField ? data.selectedField : 'id'; + this.settings = data.settings || {}; + } + +} diff --git a/vid-webpack-master/src/app/shared/models/formControlModels/numberFormControl.model.ts b/vid-webpack-master/src/app/shared/models/formControlModels/numberFormControl.model.ts new file mode 100644 index 000000000..5de38e2f7 --- /dev/null +++ b/vid-webpack-master/src/app/shared/models/formControlModels/numberFormControl.model.ts @@ -0,0 +1,16 @@ +import {FormControlModel} from "./formControl.model"; +import {FormControlType} from "./formControlTypes.enum"; + +export class NumberFormControl extends FormControlModel{ + min: number; + max: number; + + + constructor(data) { + super(data); + this.type = FormControlType.NUMBER; + this.min = data.min; + this.max = data.max; + } + +} diff --git a/vid-webpack-master/src/app/shared/models/inputTypes.ts b/vid-webpack-master/src/app/shared/models/inputTypes.ts index 1f7222f52..542c13b44 100644 --- a/vid-webpack-master/src/app/shared/models/inputTypes.ts +++ b/vid-webpack-master/src/app/shared/models/inputTypes.ts @@ -1,11 +1,11 @@ export enum InputType { - LCP_REGION = "LCP_REGION", - TENANT = "TENANT", - LOB = "LOB", - PLATFORM = "PLATFORM", - ROLLBACK = "ROLLBACK", - PRODUCT_FAMILY = "PRODUCT_FAMILY", - VG = "VG" + LCP_REGION = "lcpCloudRegionId", + TENANT = "tenantId", + LOB = "lineOfBusiness", + PLATFORM = "platformName", + ROLLBACK = "rollbackOnFailure", + PRODUCT_FAMILY = "productFamilyId", + VG = "volumeGroupName" } diff --git a/vid-webpack-master/src/app/shared/models/lcpRegion.ts b/vid-webpack-master/src/app/shared/models/lcpRegion.ts index e39321d58..fe82a3eea 100644 --- a/vid-webpack-master/src/app/shared/models/lcpRegion.ts +++ b/vid-webpack-master/src/app/shared/models/lcpRegion.ts @@ -2,10 +2,12 @@ export class LcpRegion { id: string; name: string; isPermitted: boolean; + cloudOwner: string; - constructor(serviceJson){ - this.id = serviceJson["cloudRegionID"]; - this.name = serviceJson["cloudRegionID"]; - this.isPermitted = serviceJson["is-permitted"]; + constructor(id: string, name: string, isPermitted: boolean, cloudOwner: string) { + this.id = id; + this.name = name; + this.isPermitted = isPermitted; + this.cloudOwner = cloudOwner; } } diff --git a/vid-webpack-master/src/app/shared/models/level1Instance.ts b/vid-webpack-master/src/app/shared/models/level1Instance.ts new file mode 100644 index 000000000..b7925b8bd --- /dev/null +++ b/vid-webpack-master/src/app/shared/models/level1Instance.ts @@ -0,0 +1,24 @@ +import {ChildNodeInstance} from "./nodeInstance"; +import {DefaultDataGeneratorService} from "../services/defaultDataServiceGenerator/default.data.generator.service"; + +export class Level1Instance extends ChildNodeInstance{ + uuid : string; + isEcompGeneratedNaming: boolean; + productFamilyId: string; + lcpCloudRegionId: string; + legacyRegion: string; + tenantId: string; + platformName: string; + lineOfBusiness: string; + rollbackOnFailure: string; + originalName: string; + + constructor() { + super(); + this.rollbackOnFailure = 'true'; + this.originalName = null; + this.isMissingData= false; + this.trackById = DefaultDataGeneratorService.createRandomTrackById(); + this.inMaint= false; + } +} diff --git a/vid-webpack-master/src/app/shared/models/modelInfo.ts b/vid-webpack-master/src/app/shared/models/modelInfo.ts index 091c02ef1..eb599cbe1 100644 --- a/vid-webpack-master/src/app/shared/models/modelInfo.ts +++ b/vid-webpack-master/src/app/shared/models/modelInfo.ts @@ -1,11 +1,13 @@ export class ModelInfo { - modelInvariantId: string; - modelVersionId: string; + modelInvariantId?: string; + modelVersionId?: string; modelName: string; modelVersion: string; - modelCustomizationId: string; - modelCustomizationName: string; + modelCustomizationId?: string; + modelCustomizationName?: string; + uuid? : string; + modelUniqueId?: String; @@ -16,6 +18,8 @@ export class ModelInfo { this.modelVersion = instanceModel.version; this.modelCustomizationId = instanceModel.customizationUuid; this.modelCustomizationName = instanceModel.modelCustomizationName; + this.uuid = instanceModel.uuid; + this.modelUniqueId = this.modelCustomizationId||this.uuid; } } diff --git a/vid-webpack-master/src/app/shared/models/networkInstance.ts b/vid-webpack-master/src/app/shared/models/networkInstance.ts new file mode 100644 index 000000000..ded95a787 --- /dev/null +++ b/vid-webpack-master/src/app/shared/models/networkInstance.ts @@ -0,0 +1,14 @@ + + +import {Level1Instance} from "./level1Instance"; + +export class NetworkInstance extends Level1Instance{ + networkStoreKey : string; + isFailed: boolean; + statusMessage?: string; + + constructor() { + super(); + this.networkStoreKey = null; + } +} diff --git a/vid-webpack-master/src/app/shared/models/networkModel.ts b/vid-webpack-master/src/app/shared/models/networkModel.ts new file mode 100644 index 000000000..03f118eb7 --- /dev/null +++ b/vid-webpack-master/src/app/shared/models/networkModel.ts @@ -0,0 +1,32 @@ +import { + Level1Model, Level1ModelProperties, + Level1ModelResponseInterface +} from "./nodeModel"; +import {VfcInstanceGroupMap} from "./vfcInstanceGroupMap"; + + +export interface NetworkProperties extends Level1ModelProperties{ + ecomp_generated_naming: string; + network_role: string; +} + +export interface NetworkModelResponseInterface extends Level1ModelResponseInterface{ + properties: NetworkProperties; +} + +export class NetworkModel extends Level1Model{ + + roles: string[] = []; + properties: NetworkProperties; + + constructor(networkJson?: NetworkModelResponseInterface){ + super(networkJson); + if(networkJson && networkJson.properties){ + this.properties = networkJson.properties; + // expecting network_role to be a comma-saparated list + this.roles = networkJson.properties.network_role ? networkJson.properties.network_role.split(',') : []; + } + } + + +} diff --git a/vid-webpack-master/src/app/shared/models/networkTreeNode.ts b/vid-webpack-master/src/app/shared/models/networkTreeNode.ts new file mode 100644 index 000000000..d09d5e4c5 --- /dev/null +++ b/vid-webpack-master/src/app/shared/models/networkTreeNode.ts @@ -0,0 +1,23 @@ +import {NetworkInstance} from "./networkInstance"; +import {TreeNodeModel} from "./treeNodeModel"; +import {Level1Model} from "./nodeModel"; + + + +export class NetworkTreeNode extends TreeNodeModel { + networkStoreKey : string; + typeName: string; + menuActions: { [p: string]: { method: Function; visible: Function; enable: Function } }; + isFailed: boolean; + statusMessage?: string; + + constructor(instance: NetworkInstance, networkModel: Level1Model, networkStoreKey : string){ + super(instance, networkModel); + this.name = instance.instanceName? instance.instanceName: !networkModel.isEcompGeneratedNaming ? networkModel.modelCustomizationName : '<Automatically Assigned>'; + this.modelName = networkModel.modelCustomizationName; + this.type = networkModel.type; + this.isEcompGeneratedNaming = networkModel.isEcompGeneratedNaming; + this.networkStoreKey = networkStoreKey; + } +} + diff --git a/vid-webpack-master/src/app/shared/models/nodeInstance.ts b/vid-webpack-master/src/app/shared/models/nodeInstance.ts new file mode 100644 index 000000000..7656a0c2e --- /dev/null +++ b/vid-webpack-master/src/app/shared/models/nodeInstance.ts @@ -0,0 +1,21 @@ +import {ServiceInstanceActions} from "./serviceInstanceActions"; +import {ModelInfo} from "./modelInfo"; + +export class NodeInstance { + instanceName: string; + orchStatus?:string; + action: ServiceInstanceActions = ServiceInstanceActions.Create; + originalAction : ServiceInstanceActions; + modelInfo?: ModelInfo; + instanceId?: string; + trackById?: string; +} +export class ChildNodeInstance extends NodeInstance { + isMissingData: boolean; + provStatus?:string; + inMaint?:boolean; + constructor() { + super(); + this.inMaint = false; + } +} diff --git a/vid-webpack-master/src/app/shared/models/nodeModel.ts b/vid-webpack-master/src/app/shared/models/nodeModel.ts index 4b22b8d91..ee57ec038 100644 --- a/vid-webpack-master/src/app/shared/models/nodeModel.ts +++ b/vid-webpack-master/src/app/shared/models/nodeModel.ts @@ -1,12 +1,27 @@ +import {VfcInstanceGroupMap} from "./vfcInstanceGroupMap"; + export interface NodeModelResponseInterface { + customizationUuid: string; name: string; version: string; description: string; category: string; uuid: string; invariantUuid: string; + max: number; + min:number; +} +export interface Level1ModelResponseInterface extends NodeModelResponseInterface{ + serviceType: string; + serviceRole: string; + subCategory: string; + customizationUuid: string; + serviceEcompNaming: boolean; + type: string; + modelCustomizationName: string; + vfcInstanceGroups: VfcInstanceGroupMap; + properties: Level1ModelProperties; } - export class NodeModel { name: string; version: string; @@ -14,16 +29,65 @@ export class NodeModel { category: string; uuid: string; invariantUuid: string; + max: number; + min: number; + customizationUuid?: string; constructor(serviceJson?: NodeModelResponseInterface) { if (serviceJson) { + this.customizationUuid = serviceJson.customizationUuid; this.name = serviceJson.name; this.version = serviceJson.version; this.description = serviceJson.description; this.category = serviceJson.category; this.uuid = serviceJson.uuid; this.invariantUuid = serviceJson.invariantUuid; + this.max = serviceJson.max; + this.min = serviceJson.min; } } } +export class Level1ModelProperties { + max_instances : number; + min_instances : number; +} + + + +export class Level1Model extends NodeModel{ + serviceType: string; + serviceRole: string; + subCategory: string; + customizationUuid: string; + serviceEcompNaming: boolean; + type: string; + modelCustomizationName: string; + vfcInstanceGroups: VfcInstanceGroupMap; + isEcompGeneratedNaming: boolean; + constructor(nodeJson?: Level1ModelResponseInterface) { + super(nodeJson); + if (nodeJson) { + this.serviceType = nodeJson.serviceType; + this.serviceRole = nodeJson.serviceRole; + this.subCategory = nodeJson.subCategory; + this.customizationUuid = nodeJson.customizationUuid; + this.isEcompGeneratedNaming = this.getIsEcompGeneratedNaming(nodeJson); + this.type = nodeJson.type; + this.modelCustomizationName = nodeJson.modelCustomizationName; + this.vfcInstanceGroups = nodeJson.vfcInstanceGroups; + this.max = 1; + this.min = 0; + if (nodeJson.properties) { + this.min = nodeJson.properties.min_instances || 0; + this.max = nodeJson.properties.max_instances || 1; + } + + + } + } + private getIsEcompGeneratedNaming(vnfJson) { + const ecompGeneratedNaming = vnfJson.properties.ecomp_generated_naming; + return ecompGeneratedNaming === "true"; + }; +} diff --git a/vid-webpack-master/src/app/shared/models/productFamily.ts b/vid-webpack-master/src/app/shared/models/productFamily.ts index 3c55ac004..1ed2579b2 100644 --- a/vid-webpack-master/src/app/shared/models/productFamily.ts +++ b/vid-webpack-master/src/app/shared/models/productFamily.ts @@ -1,4 +1,4 @@ -import {ServiceResponseInterface} from "../../services/aaiService/responseInterfaces/getServicesResponseInterface"; +import {ServiceResponseInterface} from "../services/aaiService/responseInterfaces/getServicesResponseInterface"; export class ProductFamily { id: string; diff --git a/vid-webpack-master/src/app/shared/models/serviceInstance.ts b/vid-webpack-master/src/app/shared/models/serviceInstance.ts index a952430b0..38b4ac35d 100644 --- a/vid-webpack-master/src/app/shared/models/serviceInstance.ts +++ b/vid-webpack-master/src/app/shared/models/serviceInstance.ts @@ -1,8 +1,11 @@ import {VnfInstance} from "./vnfInstance"; +import {NetworkInstance} from "./networkInstance"; +import {NodeInstance} from "./nodeInstance"; +import {VnfGroupInstance} from "./vnfGroupInstance"; +import {VnfMember} from "./VnfMember"; -export class ServiceInstance { - instanceName: string; - isUserProvidedNaming: boolean; +export class ServiceInstance extends NodeInstance{ + isEcompGeneratedNaming: boolean; globalSubscriberId: string; productFamilyId: string; subscriptionServiceType: string; @@ -16,13 +19,37 @@ export class ServiceInstance { owningEntityName: string; pause: boolean; bulkSize: number; - vnfs: { [vnf_module_model_name: string] : VnfInstance; }; - instanceParams: { [key: string] : string; }; - rollbackOnFailure : boolean; - subscriberName : string; + vnfs: { [vnf_module_model_name: string]: VnfInstance; }; + vnfGroups : {[vnf_module_model_name: string]: VnfGroupInstance; }; + networks: { [vnf_module_model_name: string]: NetworkInstance; }; + isDirty : boolean; + instanceParams: {[key: string]: string}[]; + rollbackOnFailure: boolean; + subscriberName: string; + validationCounter: number; + existingNames: {[key: string] : any}; + modelInavariantId?: string; + existingVNFCounterMap : { [vnf_module_model_name: string]: number; }; + existingVnfGroupCounterMap : { [vnf_group_module_model_name: string]: number; }; + existingNetworksCounterMap : { [network_module_model_name: string]: number; }; + optionalGroupMembersMap?: { [path: string]: VnfMember[]; }; + isFailed: boolean; + statusMessage: string; constructor() { + super(); + this.isDirty = false; this.vnfs = {}; - this.instanceParams = {}; + this.instanceParams = []; + this.validationCounter = 0; + this.existingNames = {}; + this.existingVNFCounterMap = {}; + this.existingVnfGroupCounterMap = {}; + this.existingNetworksCounterMap = {}; + this.optionalGroupMembersMap = {}; + this.networks = {}; + this.vnfGroups = {}; + this.bulkSize = 1; } + } diff --git a/vid-webpack-master/src/app/shared/models/serviceInstanceActions.ts b/vid-webpack-master/src/app/shared/models/serviceInstanceActions.ts new file mode 100644 index 000000000..783f133b0 --- /dev/null +++ b/vid-webpack-master/src/app/shared/models/serviceInstanceActions.ts @@ -0,0 +1,24 @@ +export enum ServiceInstanceActions{ + Delete = "Delete", + Update="Update", + Create="Create", + None="None", + Update_Delete = 'Update_Delete', + None_Delete = 'None_Delete' +} +export enum ServiceAction { + INSTANTIATE = 'INSTANTIATE', + DELETE = 'DELETE', + UPDATE = 'UPDATE' +} +export enum JobStatus { + COMPLETED = 'COMPLETED', + FAILED = 'FAILED', + IN_PROGRESS = 'IN_PROGRESS', + RESOURCE_IN_PROGRESS = 'RESOURCE_IN_PROGRESS', + PAUSE = 'PAUSE', + PENDING = 'PENDING', + STOPPED = 'STOPPED', + COMPLETED_WITH_ERRORS = 'COMPLETED_WITH_ERRORS', + CREATING = 'CREATING' +} diff --git a/vid-webpack-master/src/app/shared/models/serviceModel.ts b/vid-webpack-master/src/app/shared/models/serviceModel.ts index 18d8582e8..21a34cc95 100644 --- a/vid-webpack-master/src/app/shared/models/serviceModel.ts +++ b/vid-webpack-master/src/app/shared/models/serviceModel.ts @@ -7,6 +7,7 @@ export interface ServiceModelResponseInterface extends NodeModelResponseInterfac serviceType: string; serviceRole: string; serviceEcompNaming: boolean; + vidNotions: any; } export class ServiceModel extends NodeModel{ @@ -14,8 +15,9 @@ export class ServiceModel extends NodeModel{ serviceType: string; serviceRole: string; servicesQty: number; - isUserProvidedNaming: boolean; + isEcompGeneratedNaming: boolean; isMultiStepDesign: boolean; + vidNotions?: any; constructor(serviceModelJson?: any){ super(serviceModelJson.service); @@ -23,13 +25,14 @@ export class ServiceModel extends NodeModel{ const service: ServiceModelResponseInterface = serviceModelJson.service; this.serviceType = service.serviceType; this.serviceRole = service.serviceRole; - this.isUserProvidedNaming = this.getIsUserProvidedName(service); + this.vidNotions= service.vidNotions; + this.isEcompGeneratedNaming = this.getServiceEcompNaming(service); this.isMultiStepDesign = this.getIsMultiStepDesign(serviceModelJson); } } - private getIsUserProvidedName(serviceJson): boolean { - return serviceJson.serviceEcompNaming !== undefined && serviceJson.serviceEcompNaming === "false"; + private getServiceEcompNaming(serviceJson): boolean { + return serviceJson.serviceEcompNaming === "true"; }; private getIsMultiStepDesign(serviceModel): boolean { diff --git a/vid-webpack-master/src/app/shared/models/serviceProxyModel.ts b/vid-webpack-master/src/app/shared/models/serviceProxyModel.ts new file mode 100644 index 000000000..31810ca72 --- /dev/null +++ b/vid-webpack-master/src/app/shared/models/serviceProxyModel.ts @@ -0,0 +1,22 @@ + +import {NodeModel, NodeModelResponseInterface} from "./nodeModel"; + +export interface ServiceProxyModelResponseInterface extends NodeModelResponseInterface{ + sourceModelUuid: string; + sourceModelInvariant: string; + sourceModelName: string; +} +export class ServiceProxyModel extends NodeModel { + sourceModelUuid: string; + sourceModelInvariant: string; + sourceModelName: string; + + constructor(serviceProxyJson?: ServiceProxyModelResponseInterface) { + if (serviceProxyJson) { + super(serviceProxyJson); + this.sourceModelUuid = serviceProxyJson.sourceModelUuid; + this.sourceModelInvariant = serviceProxyJson.sourceModelInvariant; + this.sourceModelName = serviceProxyJson.sourceModelName; + } + } +} diff --git a/vid-webpack-master/src/app/shared/models/tenant.ts b/vid-webpack-master/src/app/shared/models/tenant.ts index 234f1dbff..26ff69df5 100644 --- a/vid-webpack-master/src/app/shared/models/tenant.ts +++ b/vid-webpack-master/src/app/shared/models/tenant.ts @@ -2,10 +2,12 @@ export class Tenant { id: string; name: string; isPermitted: boolean; + cloudOwner: string; constructor(serviceJson){ this.id = serviceJson["tenantID"]; this.name = serviceJson["tenantName"]; this.isPermitted = serviceJson["is-permitted"]; + this.cloudOwner = serviceJson["cloudOwner"]; } } diff --git a/vid-webpack-master/src/app/shared/models/treeNodeModel.ts b/vid-webpack-master/src/app/shared/models/treeNodeModel.ts new file mode 100644 index 000000000..2be8b804a --- /dev/null +++ b/vid-webpack-master/src/app/shared/models/treeNodeModel.ts @@ -0,0 +1,53 @@ +import {ChildNodeInstance} from "./nodeInstance"; +import {NodeModel} from "./nodeModel"; +import {ServiceNodeTypes} from "./ServiceNodeTypes"; +import * as _ from 'lodash'; +import {ServiceInstanceActions} from "./serviceInstanceActions"; +export enum TreeLevel { + Level_0 , Level_1, Level_2 + +} +interface TreeNodeInstanceInterface { + treeLevel: TreeLevel; + getModel(): NodeModel; + convertToTreeNode(node: any): any; + type: ServiceNodeTypes; +} +export class TreeNodeModel { + type: String; + modelId: string; + modelCustomizationId?: string; + modelUniqueId?: string; + id: string; + name: string; + modelName: string; + missingData: boolean; + isEcompGeneratedNaming: boolean; + orchStatus?:string; + provStatus?:string; + inMaint?:boolean; + action : string ; + + constructor(instance: ChildNodeInstance, nodeModel: NodeModel){ + this.modelCustomizationId = nodeModel.customizationUuid; + this.modelId = nodeModel.uuid; + this.modelUniqueId = this.modelCustomizationId || this.modelId; + this.missingData = false; + this.id = instance.trackById; + this.action = !_.isNil(instance.action) ? instance.action : ServiceInstanceActions.Create; + + if(!_.isNil(instance.orchStatus)){ + this.orchStatus= instance.orchStatus; + } + + if(!_.isNil(instance.provStatus)){ + this.provStatus= instance.provStatus; + } + + if(!_.isNil(instance.inMaint)){ + this.inMaint= instance.inMaint; + } + + + } +} diff --git a/vid-webpack-master/src/app/shared/models/vfModule.ts b/vid-webpack-master/src/app/shared/models/vfModule.ts index 21f43ed17..c75202124 100644 --- a/vid-webpack-master/src/app/shared/models/vfModule.ts +++ b/vid-webpack-master/src/app/shared/models/vfModule.ts @@ -1,7 +1,7 @@ import {NodeModel, NodeModelResponseInterface} from "./nodeModel"; -export interface properties{ +export interface Properties{ initialCount: number; maxCountInstances: number; minCountInstances: number; @@ -10,24 +10,25 @@ export interface properties{ export interface VFModuleResponseInterface extends NodeModelResponseInterface { customizationUuid: string; modelCustomizationName: string; - properties: properties + volumeGroupAllowed : boolean; + properties: Properties } export class VfModule extends NodeModel { - min:number; - max:number; vgName:string; rollbackOnFailure:boolean; initial:number; customizationUuid: string; modelCustomizationName: string; + volumeGroupAllowed : boolean; constructor(vf?: VFModuleResponseInterface) { super(vf); if(vf){ this.customizationUuid = vf.customizationUuid; this.modelCustomizationName = vf.modelCustomizationName; + this.volumeGroupAllowed = vf.volumeGroupAllowed || false; } if (vf && vf.properties) { this.min = vf.properties.minCountInstances; diff --git a/vid-webpack-master/src/app/shared/models/vfModuleInstance.ts b/vid-webpack-master/src/app/shared/models/vfModuleInstance.ts index c6db00025..71140d44b 100644 --- a/vid-webpack-master/src/app/shared/models/vfModuleInstance.ts +++ b/vid-webpack-master/src/app/shared/models/vfModuleInstance.ts @@ -1,5 +1,14 @@ -export class VfModuleInstance { - instanceName: string; +import {ChildNodeInstance} from "./nodeInstance"; + +export class VfModuleInstance extends ChildNodeInstance{ volumeGroupName: string; instanceParams: { [key: string] : string; }; + isFailed: boolean; + position: any; + statusMessage?: string; + + constructor() { + super(); + this.instanceParams = {}; + } } diff --git a/vid-webpack-master/src/app/shared/models/vfModuleTreeNode.ts b/vid-webpack-master/src/app/shared/models/vfModuleTreeNode.ts index d4cc7e9c7..e3d1b79b0 100644 --- a/vid-webpack-master/src/app/shared/models/vfModuleTreeNode.ts +++ b/vid-webpack-master/src/app/shared/models/vfModuleTreeNode.ts @@ -1,17 +1,23 @@ import {VfModule} from "./vfModule"; import {VfModuleInstance} from "./vfModuleInstance"; import {ServiceNodeTypes} from "./ServiceNodeTypes"; +import {TreeLevel, TreeNodeModel} from "./treeNodeModel"; -export class VfModuleTreeNode { - modelId: string; - name: string; - modelName: string; - type: string; +export class VfModuleTreeNode extends TreeNodeModel{ + dynamicInputs: any; + dynamicModelName : string; + typeName: string; + menuActions: { [p: string]: { method: Function; visible: Function; enable: Function } }; + isFailed: boolean; + statusMessage?: string; - constructor(vfModuleInstance: VfModuleInstance, vfModuleModel: VfModule, vfModuleModelName: string){ - this.name = vfModuleInstance.instanceName || vfModuleInstance.volumeGroupName || '<Automatically Assigned>'; - this.modelId = vfModuleModel.uuid; + constructor(vfModuleInstance: VfModuleInstance, vfModuleModel: VfModule, vfModuleModelName: string, dynamicInputs: any, isEcompGeneratedNaming: boolean, dynamicModelName : string){ + super(vfModuleInstance,vfModuleModel); + this.name = vfModuleInstance.instanceName || vfModuleInstance.volumeGroupName || '<Automatically Assigned>'; this.modelName = vfModuleModelName; this.type = ServiceNodeTypes.VFmodule; + this.isEcompGeneratedNaming = isEcompGeneratedNaming; + this.dynamicInputs = dynamicInputs; + this.dynamicModelName = dynamicModelName; } } diff --git a/vid-webpack-master/src/app/shared/models/vnfGroupInstance.ts b/vid-webpack-master/src/app/shared/models/vnfGroupInstance.ts new file mode 100644 index 000000000..22ca44492 --- /dev/null +++ b/vid-webpack-master/src/app/shared/models/vnfGroupInstance.ts @@ -0,0 +1,13 @@ +import {Level1Instance} from "./level1Instance"; +import {VnfMember} from "./VnfMember"; +import {NetworkInstance} from "./networkInstance"; + +export class VnfGroupInstance extends Level1Instance{ + vnfGroupStoreKey : string; + vnfs: { [vnf_module_model_name: string]: VnfMember; }; + constructor() { + super(); + this.vnfGroupStoreKey = null; + this.vnfs ={}; + } +} diff --git a/vid-webpack-master/src/app/shared/models/vnfGroupModel.ts b/vid-webpack-master/src/app/shared/models/vnfGroupModel.ts new file mode 100644 index 000000000..5cff86cf0 --- /dev/null +++ b/vid-webpack-master/src/app/shared/models/vnfGroupModel.ts @@ -0,0 +1,32 @@ +import { + Level1Model, + Level1ModelProperties, + Level1ModelResponseInterface +} from "./nodeModel"; +import {ServiceProxyModel} from "./serviceProxyModel"; + + +export interface VnfGroupProperties extends Level1ModelProperties{ + ecomp_generated_naming: string; + role?: string; + type?: string; + quantity?: number; +} + +export interface VnfGroupModelResponseInterface extends Level1ModelResponseInterface{ + properties: VnfGroupProperties; + members: {[key: string]: ServiceProxyModel}; +} + +export class VnfGroupModel extends Level1Model{ + properties: VnfGroupProperties; + members: {[key: string]: ServiceProxyModel}; + + constructor(vnfGoupJson?: VnfGroupModelResponseInterface) { + super(vnfGoupJson); + if (vnfGoupJson) { + this.properties = vnfGoupJson.properties; + this.members = vnfGoupJson.members; + } + } +} diff --git a/vid-webpack-master/src/app/shared/models/vnfGroupTreeNode.ts b/vid-webpack-master/src/app/shared/models/vnfGroupTreeNode.ts new file mode 100644 index 000000000..0e71f47b8 --- /dev/null +++ b/vid-webpack-master/src/app/shared/models/vnfGroupTreeNode.ts @@ -0,0 +1,12 @@ +import {NetworkTreeNode} from "./networkTreeNode"; +import {NetworkInstance} from "./networkInstance"; +import {Level1Model} from "./nodeModel"; + +export class VnfGroupTreeNode extends NetworkTreeNode{ + vnfGroupStoreKey : string; + limitMembers: number; + constructor(instance: NetworkInstance, vnfGroupModel: Level1Model, vnfGroupStoreKey : string){ + super(instance, vnfGroupModel, vnfGroupStoreKey); + this.vnfGroupStoreKey = vnfGroupStoreKey; + } +} diff --git a/vid-webpack-master/src/app/shared/models/vnfInstance.ts b/vid-webpack-master/src/app/shared/models/vnfInstance.ts index 7f41e483a..8959cc5c3 100644 --- a/vid-webpack-master/src/app/shared/models/vnfInstance.ts +++ b/vid-webpack-master/src/app/shared/models/vnfInstance.ts @@ -1,19 +1,18 @@ import {VfModuleMap} from "./vfModulesMap"; +import {Level1Instance} from "./level1Instance"; + + +export class VnfInstance extends Level1Instance { -export class VnfInstance { - instanceName: string; - isUserProvidedNaming: boolean; - productFamilyId: string; - lcpCloudRegionId: string; - legacyRegion: string; - tenantId: string; - platformName: string; - lineOfBusiness: string; - rollbackOnFailure: string; vfModules: { [vf_module_model_name: string] : VfModuleMap; }; + vnfStoreKey : string; + isFailed: boolean; + position: number; + statusMessage?: string; constructor() { - this.rollbackOnFailure = 'true'; + super(); this.vfModules = {}; + this.vnfStoreKey = null; } } diff --git a/vid-webpack-master/src/app/shared/models/vnfModel.ts b/vid-webpack-master/src/app/shared/models/vnfModel.ts index e1302f1d0..8389606b6 100644 --- a/vid-webpack-master/src/app/shared/models/vnfModel.ts +++ b/vid-webpack-master/src/app/shared/models/vnfModel.ts @@ -1,52 +1,27 @@ -import {NodeModel, NodeModelResponseInterface} from "./nodeModel"; -import {VfcInstanceGroupMap} from "./vfcInstanceGroupMap"; +import { + Level1Model, + Level1ModelProperties, + Level1ModelResponseInterface +} from "./nodeModel"; -export interface VnfProperties { - ecomp_generated_naming: string -} -export interface VNFModelResponseInterface extends NodeModelResponseInterface{ +export interface VnfProperties extends Level1ModelProperties{ + ecomp_generated_naming: string; +} - serviceType: string; - serviceRole: string; - subCategory: string; - customizationUuid: string; - serviceEcompNaming: boolean; - type: string; - modelCustomizationName: string; +export interface VNFModelResponseInterface extends Level1ModelResponseInterface{ properties: VnfProperties; - vfcInstanceGroups: VfcInstanceGroupMap; } -export class VNFModel extends NodeModel{ - - serviceType: string; - serviceRole: string; - subCategory: string; - customizationUuid: string; - isUserProvidedNaming: boolean; - type: string; - modelCustomizationName: string; - vfcInstanceGroups: VfcInstanceGroupMap; +export class VNFModel extends Level1Model{ + properties: VnfProperties; - constructor(vnfJson?: VNFModelResponseInterface){ + constructor(vnfJson?: VNFModelResponseInterface) { super(vnfJson); if (vnfJson) { - this.serviceType = vnfJson.serviceType; - this.serviceRole = vnfJson.serviceRole; - this.subCategory = vnfJson.subCategory; - this.customizationUuid = vnfJson.customizationUuid; - this.isUserProvidedNaming = this.getIsUserProvidedName(vnfJson); - this.type = vnfJson.type; - this.modelCustomizationName = vnfJson.modelCustomizationName; - this.vfcInstanceGroups = vnfJson.vfcInstanceGroups; - + this.properties = vnfJson.properties; } } - private getIsUserProvidedName(vnfJson) { - const ecompGeneratedNaming = vnfJson.properties.ecomp_generated_naming; - return ecompGeneratedNaming !== undefined && ecompGeneratedNaming === "false"; - }; } diff --git a/vid-webpack-master/src/app/shared/models/vnfTreeNode.ts b/vid-webpack-master/src/app/shared/models/vnfTreeNode.ts index 316bf3e8b..b878d016e 100644 --- a/vid-webpack-master/src/app/shared/models/vnfTreeNode.ts +++ b/vid-webpack-master/src/app/shared/models/vnfTreeNode.ts @@ -1,18 +1,17 @@ -import {VNFModel} from "./vnfModel"; -import {VnfInstance} from "./vnfInstance"; import {VfModuleTreeNode} from "./vfModuleTreeNode"; +import {NetworkTreeNode} from "./networkTreeNode"; +import {Level1Model} from "./nodeModel"; +import {VnfInstance} from "./vnfInstance"; +import {ServiceNodeTypes} from "./ServiceNodeTypes"; + +export class VnfTreeNode extends NetworkTreeNode{ -export class VnfTreeNode { - modelId: string; - name: string; - modelName: string; - type: string; children: VfModuleTreeNode[]; + vnfStoreKey : string; - constructor(instance: VnfInstance, vnfModel: VNFModel){ - this.name = instance.instanceName || vnfModel['properties'].ecomp_generated_naming == 'false' ? vnfModel.modelCustomizationName : '<Automatically Assigned>'; - this.modelId = vnfModel.uuid; - this.modelName = vnfModel.modelCustomizationName; - this.type = vnfModel.type; + constructor(instance: VnfInstance, vnfModel: Level1Model, vnfStoreKey : string){ + super(<any>instance, vnfModel, vnfStoreKey); + this.type = ServiceNodeTypes.VF; + this.vnfStoreKey = vnfStoreKey; } } diff --git a/vid-webpack-master/src/app/shared/pipes/capitalize/capitalize-and-format.pipe.spec.ts b/vid-webpack-master/src/app/shared/pipes/capitalize/capitalize-and-format.pipe.spec.ts index 84d2ff4b6..f0bcbb0f1 100644 --- a/vid-webpack-master/src/app/shared/pipes/capitalize/capitalize-and-format.pipe.spec.ts +++ b/vid-webpack-master/src/app/shared/pipes/capitalize/capitalize-and-format.pipe.spec.ts @@ -1,25 +1,33 @@ - import {CapitalizeAndFormatPipe} from "./capitalize-and-format.pipe"; +import {TestBed} from "@angular/core/testing"; describe('Capitalize And Format Pipe', () => { let capitalizeAndFormatPipe: CapitalizeAndFormatPipe; - beforeEach(() => { + beforeAll(done => (async () => { + TestBed.configureTestingModule({}); + await TestBed.compileComponents(); capitalizeAndFormatPipe = new CapitalizeAndFormatPipe(); - }); + })().then(done).catch(done.fail)); + - it('Capitalize And Format Pipe should be defined', () => { + test('Capitalize And Format Pipe should be defined', () => { expect(capitalizeAndFormatPipe).toBeDefined(); }); - it('Capitalize And Format Pipe : (UPPERCASE)', ()=> { + test('Capitalize And Format Pipe : (UPPERCASE)', ()=> { let result: string = capitalizeAndFormatPipe.transform('PENDING'); expect(result).toEqual('Pending'); }); - it('Capitalize And Format Pipe (UPPERCASE) and Underscore should replace by -', ()=> { + test('Capitalize And Format Pipe (UPPERCASE) and Underscore should replace by -', ()=> { let result: string = capitalizeAndFormatPipe.transform('IN_PROGRESS'); expect(result).toEqual('In-progress'); }); + test('Capitalize And Format Pipe (COMPLETED_WITH_ERRORS) and All Underscores should replace by -', ()=> { + let result: string = capitalizeAndFormatPipe.transform('COMPLETED_WITH_ERRORS'); + expect('Completed-with-errors').toEqual(result); + }); + }); diff --git a/vid-webpack-master/src/app/shared/pipes/capitalize/capitalize-and-format.pipe.ts b/vid-webpack-master/src/app/shared/pipes/capitalize/capitalize-and-format.pipe.ts index e3ec9ae9a..12b1eb912 100644 --- a/vid-webpack-master/src/app/shared/pipes/capitalize/capitalize-and-format.pipe.ts +++ b/vid-webpack-master/src/app/shared/pipes/capitalize/capitalize-and-format.pipe.ts @@ -4,7 +4,7 @@ import {PipeTransform, Pipe} from '@angular/core'; export class CapitalizeAndFormatPipe implements PipeTransform { transform(text: string): string { if (text) { - text = text.toLowerCase().replace('_', '-'); + text = text.toLowerCase().replace(/_/g, '-'); return text.charAt(0).toUpperCase() + text.slice(1); } return text; diff --git a/vid-webpack-master/src/app/shared/pipes/data-filter.pipe.ts b/vid-webpack-master/src/app/shared/pipes/data-filter.pipe.ts deleted file mode 100644 index 1ff836762..000000000 --- a/vid-webpack-master/src/app/shared/pipes/data-filter.pipe.ts +++ /dev/null @@ -1,29 +0,0 @@ -/** - * Created by cp2122 on 1/4/2018. - */ -import { Pipe, PipeTransform } from '@angular/core'; - -@Pipe({ - name: 'dataFilter' -}) -export class DataFilterPipe implements PipeTransform { - keys = []; - transform(items: any, args: string): any { - if (items != null && items.length > 0) { - let ans = []; - - if (this.keys.length === 0) { - this.keys = Object.keys(items[0]); - } - for (let i of items) { - for (let k of this.keys) { - if (i[k] !== null && i[k].toString().match('^.*' + args + '.*$')) { - ans.push(i); - break; - } - } - } - return ans; - } - } -} diff --git a/vid-webpack-master/src/app/shared/pipes/dataFilter/data-filter.pipe.spec.ts b/vid-webpack-master/src/app/shared/pipes/dataFilter/data-filter.pipe.spec.ts new file mode 100644 index 000000000..378ba259d --- /dev/null +++ b/vid-webpack-master/src/app/shared/pipes/dataFilter/data-filter.pipe.spec.ts @@ -0,0 +1,52 @@ +import {TestBed} from "@angular/core/testing"; +import {DataFilterPipe} from "./data-filter.pipe"; + +describe('Data filter pipe', () => { + + let dataFilterPipe: DataFilterPipe; + + beforeAll(done => (async () => { + TestBed.configureTestingModule({}); + await TestBed.compileComponents(); + + dataFilterPipe = new DataFilterPipe(); + + })().then(done).catch(done.fail)); + const items= [{'id':1, 'name': 'aaa'}, + {'id':12, 'name': 'bbb', 'children':{'first': 155, 'second': 2, 'third': 3}}, + {'id':3, 'name': 'ccc', 'children':{'first': 1, 'second': 2, 'third': 3}}, + {'id':4, 'name': 'aad', 'children':{'first': 1, 'second': 2, 'third': 3}}]; + const keys : string[][] = [["id"],["name"],["children", "first"]]; + + + test('should return items contains substring, keys not provided', () => { + const expected = [{'id':1, 'name': 'aaa'}, {'id':4, 'name': 'aad', 'children':{'first': 1, 'second': 2, 'third': 3}}]; + let res:any[] = dataFilterPipe.transform(items,'aa'); + expect(res).toEqual(expected); + }); + + + test('should return no result, keys not provided', () => { + const expected = []; + let res:any[] = dataFilterPipe.transform(items,'5'); + expect(res).toEqual(expected); + }); + + test('should return no result, deep keys provided', () => { + const expected = []; + let res:any[] = dataFilterPipe.transform(items,'6', keys); + expect(res).toEqual(expected); + }); + + test('should return expected result, deep keys provided', () => { + const expected = [{'id':12, 'name': 'bbb', 'children':{'first': 155, 'second': 2, 'third': 3}}]; + let res:any[] = dataFilterPipe.transform(items,'155', keys); + expect(res).toEqual(expected); + }); + + test('should return expected result, case insensitive', () => { + const expected = [{'id':12, 'name': 'bbb', 'children':{'first': 155, 'second': 2, 'third': 3}}]; + let res:any[] = dataFilterPipe.transform(items,'BBB', keys); + expect(res).toEqual(expected); + }); +}); diff --git a/vid-webpack-master/src/app/shared/pipes/dataFilter/data-filter.pipe.ts b/vid-webpack-master/src/app/shared/pipes/dataFilter/data-filter.pipe.ts new file mode 100644 index 000000000..4b4f1a5bc --- /dev/null +++ b/vid-webpack-master/src/app/shared/pipes/dataFilter/data-filter.pipe.ts @@ -0,0 +1,47 @@ +/** + * Created by cp2122 on 1/4/2018. + */ +import { Pipe, PipeTransform } from '@angular/core'; +import * as _ from 'lodash'; + +@Pipe({ + name: 'dataFilter' +}) +export class DataFilterPipe implements PipeTransform { + + transform(items: any, searchStr: string, keys?: string[][]): any { + if (items != null && items.length > 0 && !_.isNil(searchStr)) { + let ans = []; + + if (_.isNil(keys) || keys.length === 0) { + keys = Object.keys(items[0]).map((key)=> new Array(key) ); + } + for (const item of items) { + for(const key of keys) { + + let val: string = DataFilterPipe.getDeepObjectValueByKeys(item, key); + if (!_.isNil(val) && val.toLowerCase().includes(searchStr.toLowerCase())) { + ans.push(item); + break; + } + } + } + return ans; + } + } + /********************************************************************** + get value from obj data by array of keys. + @keys: all table column and keys + @rowData : row data + ************************************************************************/ + static getDeepObjectValueByKeys(rowData: any , keys: string[]) : string { + let obj = rowData[keys[0]]; + if(_.isNil(obj)) { + return obj; + } + for(let i = 1; i < keys.length ; i++){ + obj = obj[keys[i]]; + } + return obj.toString(); + } +} diff --git a/vid-webpack-master/src/app/shared/pipes/dynamicInputLabel/dynamic-input-label.pipe.spec.ts b/vid-webpack-master/src/app/shared/pipes/dynamicInputLabel/dynamic-input-label.pipe.spec.ts index 22b619290..9938a1c57 100644 --- a/vid-webpack-master/src/app/shared/pipes/dynamicInputLabel/dynamic-input-label.pipe.spec.ts +++ b/vid-webpack-master/src/app/shared/pipes/dynamicInputLabel/dynamic-input-label.pipe.spec.ts @@ -1,43 +1,47 @@ import { DynamicInputLabelPipe } from './dynamic-input-label.pipe'; +import {TestBed} from "@angular/core/testing"; describe('Dynamic input label Pipe', () => { - let dynamicInputLabelPipe: DynamicInputLabelPipe; - beforeEach(() => { + let dynamicInputLabelPipe: DynamicInputLabelPipe; + beforeAll(done => (async () => { + TestBed.configureTestingModule({}); + await TestBed.compileComponents(); dynamicInputLabelPipe = new DynamicInputLabelPipe(); - }); - it('Dynamic input label Pipe should be defined', () => { + })().then(done).catch(done.fail)); + + test('Dynamic input label Pipe should be defined', () => { expect(dynamicInputLabelPipe).toBeDefined(); }); - it('Dynamic input label Pipe : Empty string should return empty string', ()=> { + test('Dynamic input label Pipe : Empty string should return empty string', ()=> { let result: string = dynamicInputLabelPipe.transform(''); - expect(result).toEqual(':*'); + expect(result).toEqual(':'); }); - it('Dynamic input label Pipe: vnf should be VNF (UPPERCASE)', ()=> { + test('Dynamic input label Pipe: vnf should be VNF (UPPERCASE)', ()=> { let result: string = dynamicInputLabelPipe.transform('vnf'); - expect(result).toEqual('VNF:*'); + expect(result).toEqual('VNF:'); }); - it('Dynamic input label Pipe : nf should be NF (UPPERCASE)\'', ()=> { + test('Dynamic input label Pipe : nf should be NF (UPPERCASE)\'', ()=> { let result: string = dynamicInputLabelPipe.transform('nf'); - expect(result).toEqual('NF:*'); + expect(result).toEqual('NF:'); }); - it('Dynamic input label Pipe : Underscore should replace by empty character', ()=> { + test('Dynamic input label Pipe : Underscore should replace by empty character', ()=> { let result: string = dynamicInputLabelPipe.transform('nf_Test'); - expect(result).toEqual('NF test:*'); + expect(result).toEqual('NF test:'); }); - it('Dynamic input label Pipe : Complex string', ()=> { + test('Dynamic input label Pipe : Complex string', ()=> { let result: string = dynamicInputLabelPipe.transform('nf_Test_vnf_nf'); - expect(result).toEqual('NF test VNF NF:*'); + expect(result).toEqual('NF test VNF NF:'); }); - it('Dynamic input label Pipe : First letter should be uppercase', ()=> { + test('Dynamic input label Pipe : First letter should be uppercase', ()=> { let result: string = dynamicInputLabelPipe.transform('nfr'); - expect(result).toEqual('Nfr:*'); + expect(result).toEqual('Nfr:'); }); }); diff --git a/vid-webpack-master/src/app/shared/pipes/dynamicInputLabel/dynamic-input-label.pipe.ts b/vid-webpack-master/src/app/shared/pipes/dynamicInputLabel/dynamic-input-label.pipe.ts index bec87b46d..f0896befb 100644 --- a/vid-webpack-master/src/app/shared/pipes/dynamicInputLabel/dynamic-input-label.pipe.ts +++ b/vid-webpack-master/src/app/shared/pipes/dynamicInputLabel/dynamic-input-label.pipe.ts @@ -7,6 +7,6 @@ export class DynamicInputLabelPipe implements PipeTransform { let uppercase_vnf = split_label.replace(/\bvnf\b/ig, 'VNF'); let uppercase_nf = uppercase_vnf.replace(/\bnf\b/ig, 'NF'); let capitalize_sentence = uppercase_nf.charAt(0).toUpperCase() + uppercase_nf.slice(1); - return capitalize_sentence + ':*'; + return capitalize_sentence + ':'; } } diff --git a/vid-webpack-master/src/app/shared/pipes/highlight/highlight-filter.pipe.spec.ts b/vid-webpack-master/src/app/shared/pipes/highlight/highlight-filter.pipe.spec.ts new file mode 100644 index 000000000..6c2fc42d7 --- /dev/null +++ b/vid-webpack-master/src/app/shared/pipes/highlight/highlight-filter.pipe.spec.ts @@ -0,0 +1,29 @@ + +import {HighlightPipe} from "./highlight-filter.pipe"; +import {TestBed} from "@angular/core/testing"; + +describe('Highlight Pipe', () => { + let highlightPipe: HighlightPipe; + + beforeAll(done => (async () => { + TestBed.configureTestingModule({}); + await TestBed.compileComponents(); + + highlightPipe = new HighlightPipe(); + + })().then(done).catch(done.fail)); + + test('Highlight Pipe should be defined', () => { + expect(highlightPipe).toBeDefined(); + }); + + test('Highlight Pipe should return "HTML" with highlight class if match exist', () => { + let result : string = highlightPipe.transform('Hello World', 'Wor'); + expect(result).toEqual('Hello <span class="highlight">Wor</span>ld'); + }); + + test('Highlight Pipe should not return "HTML" with highlight class if no match exist', () => { + let result : string = highlightPipe.transform('Hello World', 'ABC'); + expect(result).toEqual('Hello World'); + }); +}); diff --git a/vid-webpack-master/src/app/shared/pipes/highlight-filter.pipe.ts b/vid-webpack-master/src/app/shared/pipes/highlight/highlight-filter.pipe.ts index 93aecbf69..b25458d6d 100644 --- a/vid-webpack-master/src/app/shared/pipes/highlight-filter.pipe.ts +++ b/vid-webpack-master/src/app/shared/pipes/highlight/highlight-filter.pipe.ts @@ -1,8 +1,10 @@ import {PipeTransform, Pipe} from '@angular/core'; +import * as _ from 'lodash'; @Pipe({ name: 'highlight' }) export class HighlightPipe implements PipeTransform { transform(text: string, search: string): string { + if(_.isNil(text)) return text; let pattern = search.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, '\\$&'); let regex = new RegExp(pattern, 'gi'); return search ? text.replace(regex, (match) => `<span class="highlight">${match}</span>`) : text; diff --git a/vid-webpack-master/src/app/shared/pipes/objectToArray/objectToArray.pipe.spec.ts b/vid-webpack-master/src/app/shared/pipes/objectToArray/objectToArray.pipe.spec.ts new file mode 100644 index 000000000..093e17341 --- /dev/null +++ b/vid-webpack-master/src/app/shared/pipes/objectToArray/objectToArray.pipe.spec.ts @@ -0,0 +1,35 @@ +import {TestBed} from "@angular/core/testing"; +import {ObjectToArrayPipe} from "./objectToArray.pipe"; + + +describe('Object To Array Pipe', () => { + let pipe: ObjectToArrayPipe; + + beforeAll(done => (async () => { + TestBed.configureTestingModule({ + + }); + await TestBed.compileComponents(); + pipe = new ObjectToArrayPipe(); + + })().then(done).catch(done.fail)); + + + test('should flat object to array', () => { + let object = { + "a" : { + "name" : "A" + }, + "b" : { + "name" : "B" + }, + "c" : { + "name" : "C" + } + }; + let result = pipe.transform(object); + expect(result[0]).toEqual({"name" : "A"}); + expect(result[1]).toEqual({"name" : "B"}); + expect(result[2]).toEqual({"name" : "C"}); + }); +}); diff --git a/vid-webpack-master/src/app/shared/pipes/objectToArray/objectToArray.pipe.ts b/vid-webpack-master/src/app/shared/pipes/objectToArray/objectToArray.pipe.ts new file mode 100644 index 000000000..fa201d981 --- /dev/null +++ b/vid-webpack-master/src/app/shared/pipes/objectToArray/objectToArray.pipe.ts @@ -0,0 +1,8 @@ +import { PipeTransform, Pipe } from '@angular/core'; +import * as _ from 'lodash'; +@Pipe({name: 'objecttoarray'}) +export class ObjectToArrayPipe implements PipeTransform { + transform(obj) : any { + return _.values(obj); + } +} diff --git a/vid-webpack-master/src/app/shared/pipes/order/orderBy.pipe.spec.ts b/vid-webpack-master/src/app/shared/pipes/order/orderBy.pipe.spec.ts new file mode 100644 index 000000000..e6a1d310c --- /dev/null +++ b/vid-webpack-master/src/app/shared/pipes/order/orderBy.pipe.spec.ts @@ -0,0 +1,60 @@ +import {OrderByPipe} from "./orderBy.pipe"; +import {TestBed} from "@angular/core/testing"; + + +describe('Sort Pipe', () => { + let pipe: OrderByPipe; + + beforeAll(done => (async () => { + TestBed.configureTestingModule({ + + }); + await TestBed.compileComponents(); + pipe = new OrderByPipe(); + + })().then(done).catch(done.fail)); + + + test('Sort should order the array with nested objects', () => { + let list = [ + { + id: 1, + name: 'b' + }, + { + id: 3, + name: 'a' + }, + { + id: 2, + name: 'd' + } + ]; + + let result = pipe.transform(list, {property : 'name'}); + expect(result.length).toEqual(3); + expect(result).toEqual(<any>[ + { + 'id': 3, + 'name': 'a' + }, + { + 'id': 1, + 'name': 'b' + }, + { + 'id': 2, + 'name': 'd' + }]) + + }); + + test('Sort should order the array', () => { + let list = ['b', 'd', 'a']; + + let result = pipe.transform(list); + expect(result.length).toEqual(3); + expect(result).toEqual(<any>['a', 'b', 'd']); + + }); +}); diff --git a/vid-webpack-master/src/app/shared/pipes/order/orderBy.pipe.ts b/vid-webpack-master/src/app/shared/pipes/order/orderBy.pipe.ts new file mode 100644 index 000000000..a3b82329b --- /dev/null +++ b/vid-webpack-master/src/app/shared/pipes/order/orderBy.pipe.ts @@ -0,0 +1,35 @@ +import { Pipe, PipeTransform } from '@angular/core'; +import * as _ from 'lodash'; +@Pipe({ name: 'orderBy' }) +export class OrderByPipe implements PipeTransform { + + transform(records: any[], args: any = {}): any { + args.direction = !_.isNil(args.direction) ? args.direction : 1; + + if(!_.isNil(records)){ + return records.sort(function(a, b){ + if(args.property){ + if(a[args.property] < b[args.property]){ + return -1 * args.direction; + } + else if( a[args.property] > b[args.property]){ + return 1 * args.direction; + } + else{ + return 0; + } + }else { + if(a < b){ + return -1 * args.direction; + } + else if( a > b){ + return 1 * args.direction; + } + else{ + return 0; + } + } + }); + } + }; +} diff --git a/vid-webpack-master/src/app/shared/pipes/safe/safe.pipe.spec.ts b/vid-webpack-master/src/app/shared/pipes/safe/safe.pipe.spec.ts new file mode 100644 index 000000000..f0471731e --- /dev/null +++ b/vid-webpack-master/src/app/shared/pipes/safe/safe.pipe.spec.ts @@ -0,0 +1,60 @@ +import {SafePipe} from "./safe.pipe"; +import {DomSanitizer} from "@angular/platform-browser"; +import {getTestBed, TestBed} from "@angular/core/testing"; + + +describe('Safe pipe', () => { + + let injector; + let pipe: SafePipe; + let sanitizer: DomSanitizer; + + beforeAll(done => (async () => { + TestBed.configureTestingModule({ + providers: [SafePipe] + }); + await TestBed.compileComponents(); + + injector = getTestBed(); + sanitizer = injector.get(DomSanitizer); + pipe = injector.get(SafePipe); + + })().then(done).catch(done.fail)); + + test('safe pipe should return Safe object', () => { + let options = [ + { + value: 'value', + type: 'html', + func: 'bypassSecurityTrustHtml' + }, + { + value: 'value', + type: 'style', + func: 'bypassSecurityTrustStyle' + }, + { + value: 'value', + type: 'script', + func: 'bypassSecurityTrustScript' + }, + { + value: 'value', + type: 'url', + func: 'bypassSecurityTrustUrl' + }, + { + value: 'value', + type: 'resourceUrl', + func: 'bypassSecurityTrustResourceUrl' + } + ]; + + for (let option of options) { + jest.spyOn(sanitizer, <any>option.func); + pipe.transform(option.value, option.type); + expect(sanitizer[option.func]).toHaveBeenCalledWith(option.value); + } + }); + +}); diff --git a/vid-webpack-master/src/app/shared/pipes/safe/safe.pipe.ts b/vid-webpack-master/src/app/shared/pipes/safe/safe.pipe.ts new file mode 100644 index 000000000..cff5b61a9 --- /dev/null +++ b/vid-webpack-master/src/app/shared/pipes/safe/safe.pipe.ts @@ -0,0 +1,22 @@ +// @ts-ignore +import {DomSanitizer, SafeHtml, SafeResourceUrl, SafeScript, SafeStyle, SafeUrl} from "@angular/platform-browser"; +import {Pipe, PipeTransform} from "@angular/core"; + + +@Pipe({ + name: 'safe' +}) +export class SafePipe implements PipeTransform { + + constructor(protected sanitizer: DomSanitizer) {} + + public transform(value: any, type: string): SafeHtml | SafeStyle | SafeScript | SafeUrl | SafeResourceUrl { + switch (type) { + case 'html': return this.sanitizer.bypassSecurityTrustHtml(value); + case 'style': return this.sanitizer.bypassSecurityTrustStyle(value); + case 'script': return this.sanitizer.bypassSecurityTrustScript(value); + case 'url': return this.sanitizer.bypassSecurityTrustUrl(value); + case 'resourceUrl': return this.sanitizer.bypassSecurityTrustResourceUrl(value); + } + } +} diff --git a/vid-webpack-master/src/app/shared/pipes/serviceInfo/serviceInfo.pipe.spec.ts b/vid-webpack-master/src/app/shared/pipes/serviceInfo/serviceInfo.pipe.spec.ts index 984e3378c..670f2f224 100644 --- a/vid-webpack-master/src/app/shared/pipes/serviceInfo/serviceInfo.pipe.spec.ts +++ b/vid-webpack-master/src/app/shared/pipes/serviceInfo/serviceInfo.pipe.spec.ts @@ -1,14 +1,23 @@ import {ServiceInfoPipe} from "./serviceInfo.pipe"; +import {TestBed} from "@angular/core/testing"; describe('Service info Pipe', () => { let pipe: ServiceInfoPipe; - beforeEach(() => { + + beforeAll(done => (async () => { + TestBed.configureTestingModule({ + + }); + await TestBed.compileComponents(); pipe = new ServiceInfoPipe(); - }); - it('Service info Pipe should return model name', () => { + + })().then(done).catch(done.fail)); + + + test('Service info Pipe should return model name', () => { let store = { getState : function() { return { @@ -24,7 +33,7 @@ describe('Service info Pipe', () => { - it('Service info Pipe should return null if field name not exist', () => { + test('Service info Pipe should return null if field name not exist', () => { let store = { getState : function() { return { @@ -38,7 +47,7 @@ describe('Service info Pipe', () => { expect(result).toBeNull(); }); - it('Service info Pipe should return null if model not exist', () => { + test('Service info Pipe should return null if model not exist', () => { let store = { getState : function() { return { @@ -53,6 +62,6 @@ describe('Service info Pipe', () => { }); function generateserviceHierarchy(){ - return JSON.parse('{"6e59c5de-f052-46fa-aa7e-2fca9d674c44":{"service":{"uuid":"6e59c5de-f052-46fa-aa7e-2fca9d674c44","invariantUuid":"e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0","name":"ComplexService","version":"1.0","toscaModelURL":null,"category":"Mobility","serviceType":"","serviceRole":"","description":"ComplexService","serviceEcompNaming":"true","instantiationType":"Macro","inputs":{}},"vnfs":{"VF_vMee 0":{"uuid":"d6557200-ecf2-4641-8094-5393ae3aae60","invariantUuid":"4160458e-f648-4b30-a176-43881ffffe9e","description":"VSP_vMee","name":"VF_vMee","version":"2.0","customizationUuid":"91415b44-753d-494c-926a-456a9172bbb9","inputs":{},"commands":{},"properties":{"gpb2_Internal2_mac":"00:80:37:0E:02:22","sctp-b-ipv6-egress_src_start_port":"0","sctp-a-ipv6-egress_rule_application":"any","Internal2_allow_transit":"true","sctp-b-IPv6_ethertype":"IPv6","sctp-a-egress_rule_application":"any","sctp-b-ingress_action":"pass","sctp-b-ingress_rule_protocol":"icmp","ncb2_Internal1_mac":"00:80:37:0E:0F:12","sctp-b-ipv6-ingress-src_start_port":"0.0","ncb1_Internal2_mac":"00:80:37:0E:09:12","fsb_volume_size_0":"320.0","sctp-b-egress_src_addresses":"local","sctp-a-ipv6-ingress_ethertype":"IPv4","sctp-a-ipv6-ingress-dst_start_port":"0","sctp-b-ipv6-ingress_rule_application":"any","domain_name":"default-domain","sctp-a-ingress_rule_protocol":"icmp","sctp-b-egress-src_start_port":"0.0","sctp-a-egress_src_addresses":"local","sctp-b-display_name":"epc-sctp-b-ipv4v6-sec-group","sctp-a-egress-src_start_port":"0.0","sctp-a-ingress_ethertype":"IPv4","sctp-b-ipv6-ingress-dst_end_port":"65535","sctp-b-dst_subnet_prefix_v6":"::","nf_naming":"{ecomp_generated_naming=true}","sctp-a-ipv6-ingress_src_subnet_prefix":"0.0.0.0","sctp-b-egress-dst_start_port":"0.0","ncb_flavor_name":"nv.c20r64d1","gpb1_Internal1_mac":"00:80:37:0E:01:22","sctp-b-egress_dst_subnet_prefix_len":"0.0","Internal2_net_cidr":"169.255.0.0","sctp-a-ingress-dst_start_port":"0.0","sctp-a-egress-dst_start_port":"0.0","fsb1_Internal2_mac":"00:80:37:0E:0B:12","sctp-a-egress_ethertype":"IPv4","vlc_st_service_mode":"in-network-nat","sctp-a-ipv6-egress_ethertype":"IPv4","sctp-a-egress-src_end_port":"65535.0","sctp-b-ipv6-egress_rule_application":"any","sctp-b-egress_action":"pass","sctp-a-ingress-src_subnet_prefix_len":"0.0","sctp-b-ipv6-ingress-src_end_port":"65535.0","sctp-b-name":"epc-sctp-b-ipv4v6-sec-group","fsb2_Internal1_mac":"00:80:37:0E:0D:12","sctp-a-ipv6-ingress-src_start_port":"0.0","sctp-b-ipv6-egress_ethertype":"IPv4","Internal1_net_cidr":"169.253.0.0","sctp-a-egress_dst_subnet_prefix":"0.0.0.0","fsb_flavor_name":"nv.c20r64d1","sctp_rule_protocol":"132","sctp-b-ipv6-ingress_src_subnet_prefix_len":"0","sctp-a-ipv6-ingress_rule_application":"any","ecomp_generated_naming":"true","sctp-a-IPv6_ethertype":"IPv6","vlc2_Internal1_mac":"00:80:37:0E:02:12","vlc_st_virtualization_type":"virtual-machine","sctp-b-ingress-dst_start_port":"0.0","sctp-b-ingress-dst_end_port":"65535.0","sctp-a-ipv6-ingress-src_end_port":"65535.0","sctp-a-display_name":"epc-sctp-a-ipv4v6-sec-group","sctp-b-ingress_rule_application":"any","int2_sec_group_name":"int2-sec-group","vlc_flavor_name":"nd.c16r64d1","sctp-b-ipv6-egress_src_addresses":"local","vlc_st_interface_type_int1":"other1","sctp-b-egress-src_end_port":"65535.0","sctp-a-ipv6-egress-dst_start_port":"0","vlc_st_interface_type_int2":"other2","sctp-a-ipv6-egress_rule_protocol":"any","Internal2_shared":"false","sctp-a-ipv6-egress_dst_subnet_prefix_len":"0","Internal2_rpf":"disable","vlc1_Internal1_mac":"00:80:37:0E:01:12","sctp-b-ipv6-egress_src_end_port":"65535","sctp-a-ipv6-egress_src_addresses":"local","sctp-a-ingress-dst_end_port":"65535.0","sctp-a-ipv6-egress_src_end_port":"65535","Internal1_forwarding_mode":"l2","Internal2_dhcp":"false","sctp-a-dst_subnet_prefix_v6":"::","pxe_image_name":"MME_PXE-Boot_16ACP04_GA.qcow2","vlc_st_interface_type_gtp":"other0","ncb1_Internal1_mac":"00:80:37:0E:09:12","sctp-b-src_subnet_prefix_v6":"::","sctp-a-egress_dst_subnet_prefix_len":"0.0","int1_sec_group_name":"int1-sec-group","Internal1_dhcp":"false","sctp-a-ipv6-egress_dst_end_port":"65535","Internal2_forwarding_mode":"l2","fsb2_Internal2_mac":"00:80:37:0E:0D:12","sctp-b-egress_dst_subnet_prefix":"0.0.0.0","Internal1_net_cidr_len":"17","gpb2_Internal1_mac":"00:80:37:0E:02:22","sctp-b-ingress-src_subnet_prefix_len":"0.0","sctp-a-ingress_dst_addresses":"local","sctp-a-egress_action":"pass","fsb_volume_type_0":"SF-Default-SSD","ncb2_Internal2_mac":"00:80:37:0E:0F:12","vlc_st_interface_type_sctp_a":"left","vlc_st_interface_type_sctp_b":"right","sctp-a-src_subnet_prefix_v6":"::","vlc_st_version":"2","sctp-b-egress_ethertype":"IPv4","sctp-a-ingress_rule_application":"any","gpb1_Internal2_mac":"00:80:37:0E:01:22","instance_ip_family_v6":"v6","sctp-a-ipv6-egress_src_start_port":"0","sctp-b-ingress-src_start_port":"0.0","sctp-b-ingress_dst_addresses":"local","fsb1_Internal1_mac":"00:80:37:0E:0B:12","vlc_st_interface_type_oam":"management","multi_stage_design":"false","oam_sec_group_name":"oam-sec-group","Internal2_net_gateway":"169.255.0.3","sctp-a-ipv6-ingress-dst_end_port":"65535","sctp-b-ipv6-egress-dst_start_port":"0","Internal1_net_gateway":"169.253.0.3","sctp-b-ipv6-egress_rule_protocol":"any","gtp_sec_group_name":"gtp-sec-group","sctp-a-ipv6-egress_dst_subnet_prefix":"0.0.0.0","sctp-b-ipv6-egress_dst_subnet_prefix_len":"0","sctp-a-ipv6-ingress_dst_addresses":"local","sctp-a-egress_rule_protocol":"icmp","sctp-b-ipv6-egress_action":"pass","sctp-a-ipv6-egress_action":"pass","Internal1_shared":"false","sctp-b-ipv6-ingress_rule_protocol":"any","Internal2_net_cidr_len":"17","sctp-a-name":"epc-sctp-a-ipv4v6-sec-group","sctp-a-ingress-src_end_port":"65535.0","sctp-b-ipv6-ingress_src_subnet_prefix":"0.0.0.0","sctp-a-egress-dst_end_port":"65535.0","sctp-a-ingress_action":"pass","sctp-b-egress_rule_protocol":"icmp","sctp-b-ipv6-ingress_action":"pass","vlc_st_service_type":"firewall","sctp-b-ipv6-egress_dst_end_port":"65535","sctp-b-ipv6-ingress-dst_start_port":"0","vlc2_Internal2_mac":"00:80:37:0E:02:12","vlc_st_availability_zone":"true","fsb_volume_image_name_1":"MME_FSB2_16ACP04_GA.qcow2","sctp-b-ingress-src_subnet_prefix":"0.0.0.0","sctp-a-ipv6-ingress_src_subnet_prefix_len":"0","Internal1_allow_transit":"true","gpb_flavor_name":"nv.c20r64d1","availability_zone_max_count":"1","fsb_volume_image_name_0":"MME_FSB1_16ACP04_GA.qcow2","sctp-b-ipv6-ingress_dst_addresses":"local","sctp-b-ipv6-egress_dst_subnet_prefix":"0.0.0.0","sctp-b-ipv6-ingress_ethertype":"IPv4","vlc1_Internal2_mac":"00:80:37:0E:01:12","sctp-a-ingress-src_subnet_prefix":"0.0.0.0","sctp-a-ipv6-ingress_action":"pass","Internal1_rpf":"disable","sctp-b-ingress_ethertype":"IPv4","sctp-b-egress_rule_application":"any","sctp-b-ingress-src_end_port":"65535.0","sctp-a-ipv6-ingress_rule_protocol":"any","sctp-a-ingress-src_start_port":"0.0","sctp-b-egress-dst_end_port":"65535.0"},"type":"VF","modelCustomizationName":"VF_vMee 0","vfModules":{"vf_vmee0..VfVmee..vmme_vlc..module-1":{"uuid":"522159d5-d6e0-4c2a-aa44-5a542a12a830","invariantUuid":"98a7c88b-b577-476a-90e4-e25a5871e02b","customizationUuid":"55b1be94-671a-403e-a26c-667e9c47d091","description":null,"name":"VfVmee..vmme_vlc..module-1","version":"2","modelCustomizationName":"VfVmee..vmme_vlc..module-1","properties":{"minCountInstances":0,"maxCountInstances":null,"initialCount":0,"vfModuleLabel":"vmme_vlc"},"inputs":{},"volumeGroupAllowed":false},"vf_vmee0..VfVmee..vmme_gpb..module-2":{"uuid":"41708296-e443-4c71-953f-d9a010f059e1","invariantUuid":"1cca90b8-3490-495e-87da-3f3e4c57d5b9","customizationUuid":"6add59e0-7fe1-4bc4-af48-f8812422ae7c","description":null,"name":"VfVmee..vmme_gpb..module-2","version":"2","modelCustomizationName":"VfVmee..vmme_gpb..module-2","properties":{"minCountInstances":0,"maxCountInstances":null,"initialCount":0,"vfModuleLabel":"vmme_gpb"},"inputs":{},"volumeGroupAllowed":false},"vf_vmee0..VfVmee..base_vmme..module-0":{"uuid":"a27f5cfc-7f12-4f99-af08-0af9c3885c87","invariantUuid":"a6f9e51a-2b35-416a-ae15-15e58d61f36d","customizationUuid":"f8c040f1-7e51-4a11-aca8-acf256cfd861","description":null,"name":"VfVmee..base_vmme..module-0","version":"2","modelCustomizationName":"VfVmee..base_vmme..module-0","properties":{"minCountInstances":1,"maxCountInstances":1,"initialCount":1,"vfModuleLabel":"base_vmme"},"inputs":{},"volumeGroupAllowed":true}},"volumeGroups":{"vf_vmee0..VfVmee..base_vmme..module-0":{"uuid":"a27f5cfc-7f12-4f99-af08-0af9c3885c87","invariantUuid":"a6f9e51a-2b35-416a-ae15-15e58d61f36d","customizationUuid":"f8c040f1-7e51-4a11-aca8-acf256cfd861","description":null,"name":"VfVmee..base_vmme..module-0","version":"2","modelCustomizationName":"VfVmee..base_vmme..module-0","properties":{"minCountInstances":1,"maxCountInstances":1,"initialCount":1,"vfModuleLabel":"base_vmme"},"inputs":{}}},"vfcInstanceGroups":{}}},"networks":{"ExtVL 0":{"uuid":"ddc3f20c-08b5-40fd-af72-c6d14636b986","invariantUuid":"379f816b-a7aa-422f-be30-17114ff50b7c","description":"ECOMP generic virtual link (network) base type for all other service-level and global networks","name":"ExtVL","version":"37.0","customizationUuid":"94fdd893-4a36-4d70-b16a-ec29c54c184f","inputs":{},"commands":{},"properties":{"network_assignments":"{is_external_network=false, ipv4_subnet_default_assignment={min_subnets_count=1}, ecomp_generated_network_assignment=false, ipv6_subnet_default_assignment={min_subnets_count=1}}","exVL_naming":"{ecomp_generated_naming=true}","network_flows":"{is_network_policy=false, is_bound_to_vpn=false}","network_homing":"{ecomp_selected_instance_node_target=false}"},"type":"VL","modelCustomizationName":"ExtVL 0"}},"collectionResource":{},"configurations":{"Port Mirroring Configuration By Policy 0":{"uuid":"b4398538-e89d-4f13-b33d-ca323434ba50","invariantUuid":"6ef0ca40-f366-4897-951f-abd65d25f6f7","description":"A port mirroring configuration by policy object","name":"Port Mirroring Configuration By Policy","version":"27.0","customizationUuid":"3c3b7b8d-8669-4b3b-8664-61970041fad2","inputs":{},"commands":{},"properties":{},"type":"Configuration","modelCustomizationName":"Port Mirroring Configuration By Policy 0","sourceNodes":[],"collectorNodes":null,"configurationByPolicy":false}},"serviceProxies":{},"vfModules":{"vf_vmee0..VfVmee..vmme_vlc..module-1":{"uuid":"522159d5-d6e0-4c2a-aa44-5a542a12a830","invariantUuid":"98a7c88b-b577-476a-90e4-e25a5871e02b","customizationUuid":"55b1be94-671a-403e-a26c-667e9c47d091","description":null,"name":"VfVmee..vmme_vlc..module-1","version":"2","modelCustomizationName":"VfVmee..vmme_vlc..module-1","properties":{"minCountInstances":0,"maxCountInstances":null,"initialCount":0,"vfModuleLabel":"vmme_vlc"},"inputs":{},"volumeGroupAllowed":false},"vf_vmee0..VfVmee..vmme_gpb..module-2":{"uuid":"41708296-e443-4c71-953f-d9a010f059e1","invariantUuid":"1cca90b8-3490-495e-87da-3f3e4c57d5b9","customizationUuid":"6add59e0-7fe1-4bc4-af48-f8812422ae7c","description":null,"name":"VfVmee..vmme_gpb..module-2","version":"2","modelCustomizationName":"VfVmee..vmme_gpb..module-2","properties":{"minCountInstances":0,"maxCountInstances":null,"initialCount":0,"vfModuleLabel":"vmme_gpb"},"inputs":{},"volumeGroupAllowed":false},"vf_vmee0..VfVmee..base_vmme..module-0":{"uuid":"a27f5cfc-7f12-4f99-af08-0af9c3885c87","invariantUuid":"a6f9e51a-2b35-416a-ae15-15e58d61f36d","customizationUuid":"f8c040f1-7e51-4a11-aca8-acf256cfd861","description":null,"name":"VfVmee..base_vmme..module-0","version":"2","modelCustomizationName":"VfVmee..base_vmme..module-0","properties":{"minCountInstances":1,"maxCountInstances":1,"initialCount":1,"vfModuleLabel":"base_vmme"},"inputs":{},"volumeGroupAllowed":true}},"volumeGroups":{"vf_vmee0..VfVmee..base_vmme..module-0":{"uuid":"a27f5cfc-7f12-4f99-af08-0af9c3885c87","invariantUuid":"a6f9e51a-2b35-416a-ae15-15e58d61f36d","customizationUuid":"f8c040f1-7e51-4a11-aca8-acf256cfd861","description":null,"name":"VfVmee..base_vmme..module-0","version":"2","modelCustomizationName":"VfVmee..base_vmme..module-0","properties":{"minCountInstances":1,"maxCountInstances":1,"initialCount":1,"vfModuleLabel":"base_vmme"},"inputs":{}}},"pnfs":{}}}'); + return JSON.parse('{"6e59c5de-f052-46fa-aa7e-2fca9d674c44":{"service":{"uuid":"6e59c5de-f052-46fa-aa7e-2fca9d674c44","invariantUuid":"e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0","name":"ComplexService","version":"1.0","toscaModelURL":null,"category":"Emanuel","serviceType":"","serviceRole":"","description":"ComplexService","serviceEcompNaming":"true","instantiationType":"Macro","inputs":{}},"vnfs":{"VF_vMee 0":{"uuid":"d6557200-ecf2-4641-8094-5393ae3aae60","invariantUuid":"4160458e-f648-4b30-a176-43881ffffe9e","description":"VSP_vMee","name":"VF_vMee","version":"2.0","customizationUuid":"91415b44-753d-494c-926a-456a9172bbb9","inputs":{},"commands":{},"properties":{"gpb2_Internal2_mac":"00:11:22:EF:AC:DF","sctp-b-ipv6-egress_src_start_port":"0","sctp-a-ipv6-egress_rule_application":"any","Internal2_allow_transit":"true","sctp-b-IPv6_ethertype":"IPv6","sctp-a-egress_rule_application":"any","sctp-b-ingress_action":"pass","sctp-b-ingress_rule_protocol":"icmp","ncb2_Internal1_mac":"00:11:22:EF:AC:DF","sctp-b-ipv6-ingress-src_start_port":"0.0","ncb1_Internal2_mac":"00:11:22:EF:AC:DF","fsb_volume_size_0":"320.0","sctp-b-egress_src_addresses":"local","sctp-a-ipv6-ingress_ethertype":"IPv4","sctp-a-ipv6-ingress-dst_start_port":"0","sctp-b-ipv6-ingress_rule_application":"any","domain_name":"default-domain","sctp-a-ingress_rule_protocol":"icmp","sctp-b-egress-src_start_port":"0.0","sctp-a-egress_src_addresses":"local","sctp-b-display_name":"epc-sctp-b-ipv4v6-sec-group","sctp-a-egress-src_start_port":"0.0","sctp-a-ingress_ethertype":"IPv4","sctp-b-ipv6-ingress-dst_end_port":"65535","sctp-b-dst_subnet_prefix_v6":"::","nf_naming":"{ecomp_generated_naming=true}","sctp-a-ipv6-ingress_src_subnet_prefix":"0.0.0.0","sctp-b-egress-dst_start_port":"0.0","ncb_flavor_name":"nv.c20r64d1","gpb1_Internal1_mac":"00:11:22:EF:AC:DF","sctp-b-egress_dst_subnet_prefix_len":"0.0","Internal2_net_cidr":"10.0.0.10","sctp-a-ingress-dst_start_port":"0.0","sctp-a-egress-dst_start_port":"0.0","fsb1_Internal2_mac":"00:11:22:EF:AC:DF","sctp-a-egress_ethertype":"IPv4","vlc_st_service_mode":"in-network-nat","sctp-a-ipv6-egress_ethertype":"IPv4","sctp-a-egress-src_end_port":"65535.0","sctp-b-ipv6-egress_rule_application":"any","sctp-b-egress_action":"pass","sctp-a-ingress-src_subnet_prefix_len":"0.0","sctp-b-ipv6-ingress-src_end_port":"65535.0","sctp-b-name":"epc-sctp-b-ipv4v6-sec-group","fsb2_Internal1_mac":"00:11:22:EF:AC:DF","sctp-a-ipv6-ingress-src_start_port":"0.0","sctp-b-ipv6-egress_ethertype":"IPv4","Internal1_net_cidr":"10.0.0.10","sctp-a-egress_dst_subnet_prefix":"0.0.0.0","fsb_flavor_name":"nv.c20r64d1","sctp_rule_protocol":"132","sctp-b-ipv6-ingress_src_subnet_prefix_len":"0","sctp-a-ipv6-ingress_rule_application":"any","ecomp_generated_naming":"true","sctp-a-IPv6_ethertype":"IPv6","vlc2_Internal1_mac":"00:11:22:EF:AC:DF","vlc_st_virtualization_type":"virtual-machine","sctp-b-ingress-dst_start_port":"0.0","sctp-b-ingress-dst_end_port":"65535.0","sctp-a-ipv6-ingress-src_end_port":"65535.0","sctp-a-display_name":"epc-sctp-a-ipv4v6-sec-group","sctp-b-ingress_rule_application":"any","int2_sec_group_name":"int2-sec-group","vlc_flavor_name":"nd.c16r64d1","sctp-b-ipv6-egress_src_addresses":"local","vlc_st_interface_type_int1":"other1","sctp-b-egress-src_end_port":"65535.0","sctp-a-ipv6-egress-dst_start_port":"0","vlc_st_interface_type_int2":"other2","sctp-a-ipv6-egress_rule_protocol":"any","Internal2_shared":"false","sctp-a-ipv6-egress_dst_subnet_prefix_len":"0","Internal2_rpf":"disable","vlc1_Internal1_mac":"00:11:22:EF:AC:DF","sctp-b-ipv6-egress_src_end_port":"65535","sctp-a-ipv6-egress_src_addresses":"local","sctp-a-ingress-dst_end_port":"65535.0","sctp-a-ipv6-egress_src_end_port":"65535","Internal1_forwarding_mode":"l2","Internal2_dhcp":"false","sctp-a-dst_subnet_prefix_v6":"::","pxe_image_name":"MME_PXE-Boot_16ACP04_GA.qcow2","vlc_st_interface_type_gtp":"other0","ncb1_Internal1_mac":"00:11:22:EF:AC:DF","sctp-b-src_subnet_prefix_v6":"::","sctp-a-egress_dst_subnet_prefix_len":"0.0","int1_sec_group_name":"int1-sec-group","Internal1_dhcp":"false","sctp-a-ipv6-egress_dst_end_port":"65535","Internal2_forwarding_mode":"l2","fsb2_Internal2_mac":"00:11:22:EF:AC:DF","sctp-b-egress_dst_subnet_prefix":"0.0.0.0","Internal1_net_cidr_len":"17","gpb2_Internal1_mac":"00:11:22:EF:AC:DF","sctp-b-ingress-src_subnet_prefix_len":"0.0","sctp-a-ingress_dst_addresses":"local","sctp-a-egress_action":"pass","fsb_volume_type_0":"SF-Default-SSD","ncb2_Internal2_mac":"00:11:22:EF:AC:DF","vlc_st_interface_type_sctp_a":"left","vlc_st_interface_type_sctp_b":"right","sctp-a-src_subnet_prefix_v6":"::","vlc_st_version":"2","sctp-b-egress_ethertype":"IPv4","sctp-a-ingress_rule_application":"any","gpb1_Internal2_mac":"00:11:22:EF:AC:DF","instance_ip_family_v6":"v6","sctp-a-ipv6-egress_src_start_port":"0","sctp-b-ingress-src_start_port":"0.0","sctp-b-ingress_dst_addresses":"local","fsb1_Internal1_mac":"00:11:22:EF:AC:DF","vlc_st_interface_type_oam":"management","multi_stage_design":"false","oam_sec_group_name":"oam-sec-group","Internal2_net_gateway":"10.0.0.10","sctp-a-ipv6-ingress-dst_end_port":"65535","sctp-b-ipv6-egress-dst_start_port":"0","Internal1_net_gateway":"10.0.0.10","sctp-b-ipv6-egress_rule_protocol":"any","gtp_sec_group_name":"gtp-sec-group","sctp-a-ipv6-egress_dst_subnet_prefix":"0.0.0.0","sctp-b-ipv6-egress_dst_subnet_prefix_len":"0","sctp-a-ipv6-ingress_dst_addresses":"local","sctp-a-egress_rule_protocol":"icmp","sctp-b-ipv6-egress_action":"pass","sctp-a-ipv6-egress_action":"pass","Internal1_shared":"false","sctp-b-ipv6-ingress_rule_protocol":"any","Internal2_net_cidr_len":"17","sctp-a-name":"epc-sctp-a-ipv4v6-sec-group","sctp-a-ingress-src_end_port":"65535.0","sctp-b-ipv6-ingress_src_subnet_prefix":"0.0.0.0","sctp-a-egress-dst_end_port":"65535.0","sctp-a-ingress_action":"pass","sctp-b-egress_rule_protocol":"icmp","sctp-b-ipv6-ingress_action":"pass","vlc_st_service_type":"firewall","sctp-b-ipv6-egress_dst_end_port":"65535","sctp-b-ipv6-ingress-dst_start_port":"0","vlc2_Internal2_mac":"00:11:22:EF:AC:DF","vlc_st_availability_zone":"true","fsb_volume_image_name_1":"MME_FSB2_16ACP04_GA.qcow2","sctp-b-ingress-src_subnet_prefix":"0.0.0.0","sctp-a-ipv6-ingress_src_subnet_prefix_len":"0","Internal1_allow_transit":"true","gpb_flavor_name":"nv.c20r64d1","availability_zone_max_count":"1","fsb_volume_image_name_0":"MME_FSB1_16ACP04_GA.qcow2","sctp-b-ipv6-ingress_dst_addresses":"local","sctp-b-ipv6-egress_dst_subnet_prefix":"0.0.0.0","sctp-b-ipv6-ingress_ethertype":"IPv4","vlc1_Internal2_mac":"00:11:22:EF:AC:DF","sctp-a-ingress-src_subnet_prefix":"0.0.0.0","sctp-a-ipv6-ingress_action":"pass","Internal1_rpf":"disable","sctp-b-ingress_ethertype":"IPv4","sctp-b-egress_rule_application":"any","sctp-b-ingress-src_end_port":"65535.0","sctp-a-ipv6-ingress_rule_protocol":"any","sctp-a-ingress-src_start_port":"0.0","sctp-b-egress-dst_end_port":"65535.0"},"type":"VF","modelCustomizationName":"VF_vMee 0","vfModules":{"vf_vmee0..VfVmee..vmme_vlc..module-1":{"uuid":"522159d5-d6e0-4c2a-aa44-5a542a12a830","invariantUuid":"98a7c88b-b577-476a-90e4-e25a5871e02b","customizationUuid":"55b1be94-671a-403e-a26c-667e9c47d091","description":null,"name":"VfVmee..vmme_vlc..module-1","version":"2","modelCustomizationName":"VfVmee..vmme_vlc..module-1","properties":{"minCountInstances":0,"maxCountInstances":null,"initialCount":0,"vfModuleLabel":"vmme_vlc"},"inputs":{},"volumeGroupAllowed":false},"vf_vmee0..VfVmee..vmme_gpb..module-2":{"uuid":"41708296-e443-4c71-953f-d9a010f059e1","invariantUuid":"1cca90b8-3490-495e-87da-3f3e4c57d5b9","customizationUuid":"6add59e0-7fe1-4bc4-af48-f8812422ae7c","description":null,"name":"VfVmee..vmme_gpb..module-2","version":"2","modelCustomizationName":"VfVmee..vmme_gpb..module-2","properties":{"minCountInstances":0,"maxCountInstances":null,"initialCount":0,"vfModuleLabel":"vmme_gpb"},"inputs":{},"volumeGroupAllowed":false},"vf_vmee0..VfVmee..base_vmme..module-0":{"uuid":"a27f5cfc-7f12-4f99-af08-0af9c3885c87","invariantUuid":"a6f9e51a-2b35-416a-ae15-15e58d61f36d","customizationUuid":"f8c040f1-7e51-4a11-aca8-acf256cfd861","description":null,"name":"VfVmee..base_vmme..module-0","version":"2","modelCustomizationName":"VfVmee..base_vmme..module-0","properties":{"minCountInstances":1,"maxCountInstances":1,"initialCount":1,"vfModuleLabel":"base_vmme"},"inputs":{},"volumeGroupAllowed":true}},"volumeGroups":{"vf_vmee0..VfVmee..base_vmme..module-0":{"uuid":"a27f5cfc-7f12-4f99-af08-0af9c3885c87","invariantUuid":"a6f9e51a-2b35-416a-ae15-15e58d61f36d","customizationUuid":"f8c040f1-7e51-4a11-aca8-acf256cfd861","description":null,"name":"VfVmee..base_vmme..module-0","version":"2","modelCustomizationName":"VfVmee..base_vmme..module-0","properties":{"minCountInstances":1,"maxCountInstances":1,"initialCount":1,"vfModuleLabel":"base_vmme"},"inputs":{}}},"vfcInstanceGroups":{}}},"networks":{"ExtVL 0":{"uuid":"ddc3f20c-08b5-40fd-af72-c6d14636b986","invariantUuid":"379f816b-a7aa-422f-be30-17114ff50b7c","description":"ECOMP generic virtual link (network) base type for all other service-level and global networks","name":"ExtVL","version":"37.0","customizationUuid":"94fdd893-4a36-4d70-b16a-ec29c54c184f","inputs":{},"commands":{},"properties":{"network_assignments":"{is_external_network=false, ipv4_subnet_default_assignment={min_subnets_count=1}, ecomp_generated_network_assignment=false, ipv6_subnet_default_assignment={min_subnets_count=1}}","exVL_naming":"{ecomp_generated_naming=true}","network_flows":"{is_network_policy=false, is_bound_to_vpn=false}","network_homing":"{ecomp_selected_instance_node_target=false}"},"type":"VL","modelCustomizationName":"ExtVL 0"}},"collectionResource":{},"configurations":{"Port Mirroring Configuration By Policy 0":{"uuid":"b4398538-e89d-4f13-b33d-ca323434ba50","invariantUuid":"6ef0ca40-f366-4897-951f-abd65d25f6f7","description":"A port mirroring configuration by policy object","name":"Port Mirroring Configuration By Policy","version":"27.0","customizationUuid":"3c3b7b8d-8669-4b3b-8664-61970041fad2","inputs":{},"commands":{},"properties":{},"type":"Configuration","modelCustomizationName":"Port Mirroring Configuration By Policy 0","sourceNodes":[],"collectorNodes":null,"configurationByPolicy":false}},"serviceProxies":{},"vfModules":{"vf_vmee0..VfVmee..vmme_vlc..module-1":{"uuid":"522159d5-d6e0-4c2a-aa44-5a542a12a830","invariantUuid":"98a7c88b-b577-476a-90e4-e25a5871e02b","customizationUuid":"55b1be94-671a-403e-a26c-667e9c47d091","description":null,"name":"VfVmee..vmme_vlc..module-1","version":"2","modelCustomizationName":"VfVmee..vmme_vlc..module-1","properties":{"minCountInstances":0,"maxCountInstances":null,"initialCount":0,"vfModuleLabel":"vmme_vlc"},"inputs":{},"volumeGroupAllowed":false},"vf_vmee0..VfVmee..vmme_gpb..module-2":{"uuid":"41708296-e443-4c71-953f-d9a010f059e1","invariantUuid":"1cca90b8-3490-495e-87da-3f3e4c57d5b9","customizationUuid":"6add59e0-7fe1-4bc4-af48-f8812422ae7c","description":null,"name":"VfVmee..vmme_gpb..module-2","version":"2","modelCustomizationName":"VfVmee..vmme_gpb..module-2","properties":{"minCountInstances":0,"maxCountInstances":null,"initialCount":0,"vfModuleLabel":"vmme_gpb"},"inputs":{},"volumeGroupAllowed":false},"vf_vmee0..VfVmee..base_vmme..module-0":{"uuid":"a27f5cfc-7f12-4f99-af08-0af9c3885c87","invariantUuid":"a6f9e51a-2b35-416a-ae15-15e58d61f36d","customizationUuid":"f8c040f1-7e51-4a11-aca8-acf256cfd861","description":null,"name":"VfVmee..base_vmme..module-0","version":"2","modelCustomizationName":"VfVmee..base_vmme..module-0","properties":{"minCountInstances":1,"maxCountInstances":1,"initialCount":1,"vfModuleLabel":"base_vmme"},"inputs":{},"volumeGroupAllowed":true}},"volumeGroups":{"vf_vmee0..VfVmee..base_vmme..module-0":{"uuid":"a27f5cfc-7f12-4f99-af08-0af9c3885c87","invariantUuid":"a6f9e51a-2b35-416a-ae15-15e58d61f36d","customizationUuid":"f8c040f1-7e51-4a11-aca8-acf256cfd861","description":null,"name":"VfVmee..base_vmme..module-0","version":"2","modelCustomizationName":"VfVmee..base_vmme..module-0","properties":{"minCountInstances":1,"maxCountInstances":1,"initialCount":1,"vfModuleLabel":"base_vmme"},"inputs":{}}},"pnfs":{}}}'); } }); diff --git a/vid-webpack-master/src/app/shared/pipes/serviceInfo/serviceInfo.pipe.ts b/vid-webpack-master/src/app/shared/pipes/serviceInfo/serviceInfo.pipe.ts index 8cb2e1dcd..2876362e2 100644 --- a/vid-webpack-master/src/app/shared/pipes/serviceInfo/serviceInfo.pipe.ts +++ b/vid-webpack-master/src/app/shared/pipes/serviceInfo/serviceInfo.pipe.ts @@ -1,11 +1,11 @@ import {PipeTransform, Pipe} from '@angular/core'; -import {isNullOrUndefined} from "util"; +import * as _ from 'lodash'; @Pipe({ name: 'serviceInfo'}) export class ServiceInfoPipe implements PipeTransform { transform(service: string, store : any , modelId : string, fieldName : string): string { const serviceHierarchy = store.getState().service.serviceHierarchy; - if(!isNullOrUndefined(serviceHierarchy) && !isNullOrUndefined(serviceHierarchy[modelId])){ + if(!_.isNil(serviceHierarchy) && !_.isNil(serviceHierarchy[modelId])){ return serviceHierarchy[modelId].service[fieldName] || null; } return null; diff --git a/vid-webpack-master/src/app/shared/resolvers/flag/flag.resolver.spec.ts b/vid-webpack-master/src/app/shared/resolvers/flag/flag.resolver.spec.ts new file mode 100644 index 000000000..930562ce0 --- /dev/null +++ b/vid-webpack-master/src/app/shared/resolvers/flag/flag.resolver.spec.ts @@ -0,0 +1,61 @@ +import {TestBed, getTestBed} from '@angular/core/testing'; +import { + HttpClientTestingModule, + HttpTestingController +} from '@angular/common/http/testing'; +import {NgRedux} from "@angular-redux/store"; +import {FeatureFlagsService} from "../../services/featureFlag/feature-flags.service"; +import {ActivatedRouteSnapshot, convertToParamMap} from "@angular/router"; +import {FlagsResolve} from "./flag.resolver"; +import {ConfigurationService} from "../../services/configuration.service"; + +class MockAppStore<T> { + getState() { + return { + service: { + serviceInstance: {} + } + } + } +} + + +describe('Flag resolver', () => { + let injector; + let resolver: FlagsResolve; + let configurationService: ConfigurationService; + let httpMock: HttpTestingController; + + let activatedRouteSnapshot: ActivatedRouteSnapshot; + beforeAll(done => (async () => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + providers: [ + FlagsResolve, + ConfigurationService, + FeatureFlagsService, + {provide: NgRedux, useClass: MockAppStore}, + { + provide: ActivatedRouteSnapshot, useValue: { + queryParamMap: + convertToParamMap({ }) + } + }, + ] + }); + await TestBed.compileComponents(); + + injector = getTestBed(); + resolver = injector.get(FlagsResolve); + httpMock = injector.get(HttpTestingController); + activatedRouteSnapshot = injector.get(ActivatedRouteSnapshot); + configurationService = injector.get(ConfigurationService); + + })().then(done).catch(done.fail)); + + test('should update flags', () => { + spyOn(configurationService, 'getFlags'); + resolver.resolve(activatedRouteSnapshot); + expect(configurationService.getFlags).toHaveBeenCalled(); + }); +}); diff --git a/vid-webpack-master/src/app/services/flags.resolve.ts b/vid-webpack-master/src/app/shared/resolvers/flag/flag.resolver.ts index 70449379f..7ebce8bde 100644 --- a/vid-webpack-master/src/app/services/flags.resolve.ts +++ b/vid-webpack-master/src/app/shared/resolvers/flag/flag.resolver.ts @@ -1,7 +1,7 @@ import {ActivatedRouteSnapshot, Resolve} from "@angular/router"; import {Injectable} from "@angular/core"; -import {ConfigurationService} from "./configuration.service"; -import {Observable} from "rxjs/Observable"; +import {Observable} from "rxjs"; +import {ConfigurationService} from "../../services/configuration.service"; @Injectable() export class FlagsResolve implements Resolve<Observable< { [key: string]: boolean }>> { diff --git a/vid-webpack-master/src/app/shared/resolvers/retry/retry.resolver.spec.ts b/vid-webpack-master/src/app/shared/resolvers/retry/retry.resolver.spec.ts new file mode 100644 index 000000000..2578d7b2d --- /dev/null +++ b/vid-webpack-master/src/app/shared/resolvers/retry/retry.resolver.spec.ts @@ -0,0 +1,306 @@ +import {getTestBed, TestBed} from '@angular/core/testing'; +import {HttpClientTestingModule, HttpTestingController} from '@angular/common/http/testing'; +import {NgRedux} from "@angular-redux/store"; +import {ActivatedRouteSnapshot, convertToParamMap} from "@angular/router"; +import {AppState} from "../../store/reducers"; +import {RetryResolver} from "./retry.resolver"; +import {AaiService} from "../../services/aaiService/aai.service"; +import {FeatureFlagsService} from "../../services/featureFlag/feature-flags.service"; +import {Observable, of} from "rxjs"; + +class MockAppStore<T> { + getState() { + return { + global:{ + drawingBoardStatus: "VIEW" + }, + service: { + serviceInstance: {} + } + } + } + dispatch(){ + + } +} + + +describe('View Edit resolver', () => { + let injector; + let aaiService: AaiService; + let resolver: RetryResolver; + let httpMock: HttpTestingController; + let store : NgRedux<AppState>; + let activatedRouteSnapshot: ActivatedRouteSnapshot; + + beforeAll(done => (async () => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + providers: [ + FeatureFlagsService, + RetryResolver, + AaiService, + {provide: NgRedux, useClass: MockAppStore}, + { + provide: ActivatedRouteSnapshot, useValue: { + queryParamMap: + convertToParamMap({ + serviceModelId: 'serviceModelId', + subscriberId: 'subscriberId', + serviceType: 'serviceType', + serviceInstanceId : 'serviceInstanceId', + jobId : 'jobId' + }) + }, + + } + ] + }); + await TestBed.compileComponents(); + + injector = getTestBed(); + aaiService = injector.get(AaiService); + resolver = injector.get(RetryResolver); + httpMock = injector.get(HttpTestingController); + activatedRouteSnapshot = injector.get(ActivatedRouteSnapshot); + store = injector.get(NgRedux) + + })().then(done).catch(done.fail)); + + + test("should call get all parameter's from url", () => { + expect(activatedRouteSnapshot.queryParamMap.get("serviceModelId")).toBe('serviceModelId'); + expect(activatedRouteSnapshot.queryParamMap.get("subscriberId")).toBe('subscriberId'); + expect(activatedRouteSnapshot.queryParamMap.get("serviceType")).toBe('serviceType'); + expect(activatedRouteSnapshot.queryParamMap.get("serviceInstanceId")).toBe('serviceInstanceId'); + expect(activatedRouteSnapshot.queryParamMap.get("jobId")).toBe('jobId'); + }); + + + test("should return retry topology", () => { + jest.spyOn(aaiService, 'getServiceModelById').mockReturnValue(of({})); + jest.spyOn(aaiService, 'retrieveAndStoreServiceInstanceTopology').mockReturnValue(of({ + "vnfs": { + "2017-388_ADIOD-vPE 0": { + "vfModules": {}, + "uuid": "afacccf6-397d-45d6-b5ae-94c39734b168", + "productFamilyId": "e433710f-9217-458d-a79d-1c7aff376d89", + "lcpCloudRegionId": "JANET25", + "tenantId": "092eb9e8e4b7412e8787dd091bc58e86", + "lineOfBusiness": "ONAP", + "platformName": "platform", + "modelInfo": { + "modelInvariantId": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8", + "modelVersionId": "afacccf6-397d-45d6-b5ae-94c39734b168", + "modelName": "2017-388_ADIOD-vPE", + "modelVersion": "4.0", + "modelCustomizationId": "b3c76f73-eeb5-4fb6-9d31-72a889f1811c", + "modelCustomizationName": "2017-388_ADIOD-vPE 0", + "uuid": "afacccf6-397d-45d6-b5ae-94c39734b168" + }, + "instanceName": "2017388_ADIODvPEmCaNkinstanceName", + "legacyRegion": "some legacy region" + }, + "2017-488_ADIOD-vPE 0": { + "vfModules": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0uvfot": { + "instanceName": "VFinstancenameZERO", + "modelInfo": { + "modelInvariantId": "b34833bb-6aa9-4ad6-a831-70b06367a091", + "modelVersionId": "f8360508-3f17-4414-a2ed-6bc71161e8db", + "modelName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0", + "modelVersion": "5", + "modelCustomizationId": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0", + "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db" + }, + "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db", + "provStatus": "Prov Status", + "orchStatus": "Active", + "inMaint": true + } + }, + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1fshmc": { + "instanceName": "VFinstancename", + "volumeGroupName": "VFinstancename_vol_abc", + "orchStatus": "Create", + "provStatus": "Prov Status", + "inMaint": false, + "modelInfo": { + "modelInvariantId": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1", + "modelVersionId": "25284168-24bb-4698-8cb4-3f509146eca5", + "modelName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "modelVersion": "6", + "modelCustomizationId": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "uuid": "25284168-24bb-4698-8cb4-3f509146eca5" + }, + "uuid": "25284168-24bb-4698-8cb4-3f509146eca5" + } + } + }, + "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09", + "productFamilyId": "e433710f-9217-458d-a79d-1c7aff376d89", + "lcpCloudRegionId": "JANET25", + "tenantId": "092eb9e8e4b7412e8787dd091bc58e86", + "lineOfBusiness": "ONAP", + "platformName": "platform", + "modelInfo": { + "modelInvariantId": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8", + "modelVersionId": "69e09f68-8b63-4cc9-b9ff-860960b5db09", + "modelName": "2017-488_ADIOD-vPE", + "modelVersion": "5.0", + "modelCustomizationId": "1da7b585-5e61-4993-b95e-8e6606c81e45", + "modelCustomizationName": "2017-488_ADIOD-vPE 0", + "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09" + }, + "orchStatus": "Created", + "inMaint": false, + "instanceName": "2017488_ADIODvPEVNFinstancename", + "legacyRegion": "some legacy region" + }, + "2017-488_ADIOD-vPE 0:0001": { + "vfModules": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0uvfot": { + "instanceName": "VFinstancenameZERO_001", + "provStatus": "Prov Status", + "inMaint": true, + "modelInfo": { + "modelInvariantId": "b34833bb-6aa9-4ad6-a831-70b06367a091", + "modelVersionId": "f8360508-3f17-4414-a2ed-6bc71161e8db", + "modelName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0", + "modelVersion": "5", + "modelCustomizationId": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0", + "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db" + }, + "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db" + } + }, + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1fshmc": { + "instanceName": "VFinstancename_001", + "volumeGroupName": "VFinstancename_vol_abc_001", + "modelInfo": { + "modelInvariantId": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1", + "modelVersionId": "25284168-24bb-4698-8cb4-3f509146eca5", + "modelName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "modelVersion": "6", + "modelCustomizationId": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "uuid": "25284168-24bb-4698-8cb4-3f509146eca5" + }, + "uuid": "25284168-24bb-4698-8cb4-3f509146eca5" + } + } + }, + + "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09", + "productFamilyId": "e433710f-9217-458d-a79d-1c7aff376d89", + "lcpCloudRegionId": "JANET25", + "tenantId": "092eb9e8e4b7412e8787dd091bc58e86", + "lineOfBusiness": "ONAP", + "platformName": "platform", + "modelInfo": { + "modelInvariantId": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8", + "modelVersionId": "69e09f68-8b63-4cc9-b9ff-860960b5db09", + "modelName": "2017-488_ADIOD-vPE", + "modelVersion": "5.0", + "modelCustomizationId": "1da7b585-5e61-4993-b95e-8e6606c81e45", + "modelCustomizationName": "2017-488_ADIOD-vPE 0", + "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09" + }, + "instanceName": "2017488_ADIODvPEVNFinstancename_001", + "legacyRegion": "some legacy region" + }, + "2017-488_ADIOD-vPE 0:0002": { + "vfModules": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0uvfot": { + "instanceName": "VFinstancenameZERO_002", + "modelInfo": { + "modelInvariantId": "b34833bb-6aa9-4ad6-a831-70b06367a091", + "modelVersionId": "f8360508-3f17-4414-a2ed-6bc71161e8db", + "modelName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0", + "modelVersion": "5", + "modelCustomizationId": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0", + "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db" + }, + "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db" + } + }, + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1fshmc": { + "instanceName": "VFinstancename_002", + "volumeGroupName": "VFinstancename_vol_abc_002", + "modelInfo": { + "modelInvariantId": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1", + "modelVersionId": "25284168-24bb-4698-8cb4-3f509146eca5", + "modelName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "modelVersion": "6", + "modelCustomizationId": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "uuid": "25284168-24bb-4698-8cb4-3f509146eca5" + }, + "uuid": "25284168-24bb-4698-8cb4-3f509146eca5" + } + } + }, + "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09", + "productFamilyId": "e433710f-9217-458d-a79d-1c7aff376d89", + "lcpCloudRegionId": "JANET25", + "tenantId": "092eb9e8e4b7412e8787dd091bc58e86", + "lineOfBusiness": "ONAP", + "platformName": "platform", + "modelInfo": { + "modelInvariantId": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8", + "modelVersionId": "69e09f68-8b63-4cc9-b9ff-860960b5db09", + "modelName": "2017-488_ADIOD-vPE", + "modelVersion": "5.0", + "modelCustomizationId": "1da7b585-5e61-4993-b95e-8e6606c81e45", + "modelCustomizationName": "2017-488_ADIOD-vPE 0", + "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09" + }, + "instanceName": "2017488_ADIODvPEVNFinstancename_002", + "legacyRegion": "some legacy region" + } + }, + "vnfGroups": {}, + "existingVnfGroupCounterMap": {}, + "validationCounter": 0, + "existingVNFCounterMap": { + "afacccf6-397d-45d6-b5ae-94c39734b168": 1, + "69e09f68-8b63-4cc9-b9ff-860960b5db09": 3 + }, + "existingNetworksCounterMap": {}, + "instanceName": "mCaNkinstancename", + "globalSubscriberId": "e433710f-9217-458d-a79d-1c7aff376d89", + "subscriptionServiceType": "TYLER SILVIA", + "owningEntityId": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc", + "productFamilyId": "e433710f-9217-458d-a79d-1c7aff376d89", + "lcpCloudRegionId": "hvf6", + "tenantId": "bae71557c5bb4d5aac6743a4e5f1d054", + "aicZoneId": "NFT1", + "projectName": "WATKINS", + "rollbackOnFailure": "true", + "aicZoneName": "NFTJSSSS-NFT1", + "owningEntityName": "WayneHolland", + "tenantName": "AIN Web Tool-15-D-testalexandria", + "modelInfo": { + "modelInvariantId": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0", + "modelVersionId": "6b528779-44a3-4472-bdff-9cd15ec93450", + "modelName": "action-data", + "modelVersion": "1.0", + "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450" + }, + "isALaCarte": false, + "orchStatus": "Active", + "modelInavariantId": "6b528779-44a3-4472-bdff-9cd15ec93450" + })); + }); + +}); diff --git a/vid-webpack-master/src/app/shared/resolvers/retry/retry.resolver.ts b/vid-webpack-master/src/app/shared/resolvers/retry/retry.resolver.ts new file mode 100644 index 000000000..5e2250ad7 --- /dev/null +++ b/vid-webpack-master/src/app/shared/resolvers/retry/retry.resolver.ts @@ -0,0 +1,27 @@ +import {ActivatedRouteSnapshot, Resolve} from "@angular/router"; +import {Injectable} from "@angular/core"; +import {Observable} from "rxjs"; +import {AaiService} from "../../services/aaiService/aai.service"; +import {forkJoin} from "rxjs/observable/forkJoin"; +import {AppState} from "../../store/reducers"; +import {NgRedux} from "@angular-redux/store"; +import {createServiceInstance} from "../../storeUtil/utils/service/service.actions"; + +@Injectable() +export class RetryResolver implements Resolve<Observable<boolean>> { + + constructor(private _aaiService: AaiService, private _store: NgRedux<AppState>) {} + + resolve(route: ActivatedRouteSnapshot): Observable<boolean> { + const serviceModelId: string = route.queryParamMap.get("serviceModelId"); + const jobId: string = route.queryParamMap.get("jobId"); + + let serviceModelApi = this._aaiService.getServiceModelById(serviceModelId); + + let serviceInstanceApi = this._aaiService.retrieveAndStoreServiceInstanceRetryTopology(jobId, serviceModelId); + return forkJoin([serviceModelApi, serviceInstanceApi]).map(([serviceModel, serviceInstance ]) => { + this._store.dispatch(createServiceInstance( serviceInstance, serviceModelId)); + return true; + }); + } +} diff --git a/vid-webpack-master/src/app/shared/resolvers/viewEdit/viewEdit.resolver.spec.ts b/vid-webpack-master/src/app/shared/resolvers/viewEdit/viewEdit.resolver.spec.ts new file mode 100644 index 000000000..6e8fdc757 --- /dev/null +++ b/vid-webpack-master/src/app/shared/resolvers/viewEdit/viewEdit.resolver.spec.ts @@ -0,0 +1,82 @@ +import {getTestBed, TestBed} from '@angular/core/testing'; +import {HttpClientTestingModule, HttpTestingController} from '@angular/common/http/testing'; +import {NgRedux} from "@angular-redux/store"; +import {ViewEditResolver} from "./viewEdit.resolver"; +import {AaiService} from "../../services/aaiService/aai.service"; +import {FeatureFlagsService} from "../../services/featureFlag/feature-flags.service"; +import {ActivatedRouteSnapshot, convertToParamMap} from "@angular/router"; +import {AppState} from "../../store/reducers"; +import {UpdateDrawingBoardStatusAction} from "../../storeUtil/utils/global/global.actions"; + +class MockAppStore<T> { + getState() { + return { + global:{ + drawingBoardStatus: "VIEW" + }, + service: { + serviceInstance: {} + } + } + } + dispatch(){ + + } +} + + +describe('View Edit resolver', () => { + let injector; + let aaiService: AaiService; + let resolver: ViewEditResolver; + let httpMock: HttpTestingController; + let store : NgRedux<AppState>; + + let activatedRouteSnapshot: ActivatedRouteSnapshot; + let updateDrawingBoardStatusAction: UpdateDrawingBoardStatusAction; + + beforeAll(done => (async () => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + providers: [ + ViewEditResolver, + AaiService, + FeatureFlagsService, + {provide: NgRedux, useClass: MockAppStore}, + { + provide: ActivatedRouteSnapshot, useValue: { + queryParamMap: + convertToParamMap({ + serviceModelId: 'serviceModelId', + subscriberId: 'subscriberId', + serviceType: 'serviceType', + serviceInstanceId : 'serviceInstanceId' + }) + }, + + } + ] + }); + await TestBed.compileComponents(); + + injector = getTestBed(); + aaiService = injector.get(AaiService); + resolver = injector.get(ViewEditResolver); + httpMock = injector.get(HttpTestingController); + activatedRouteSnapshot = injector.get(ActivatedRouteSnapshot); + store = injector.get(NgRedux) + + })().then(done).catch(done.fail)); + + + test('should call both api', () => { + // spyOn(aaiService, 'getServiceModelById'); + // spyOn(aaiService, 'retrieveAndStoreServiceInstanceTopology'); + // spyOn(store, 'dispatch'); + // resolver.resolve(activatedRouteSnapshot); + // + // expect(aaiService.getServiceModelById).toHaveBeenCalledWith('serviceModelId'); + // expect(aaiService.retrieveAndStoreServiceInstanceTopology).toHaveBeenCalledWith('serviceInstanceId', 'subscriberId', 'serviceType', 'serviceModelId'); + }); + +}); diff --git a/vid-webpack-master/src/app/shared/resolvers/viewEdit/viewEdit.resolver.ts b/vid-webpack-master/src/app/shared/resolvers/viewEdit/viewEdit.resolver.ts new file mode 100644 index 000000000..d4aef1937 --- /dev/null +++ b/vid-webpack-master/src/app/shared/resolvers/viewEdit/viewEdit.resolver.ts @@ -0,0 +1,40 @@ +import {ActivatedRouteSnapshot, Resolve} from "@angular/router"; +import {Injectable} from "@angular/core"; +import {Observable} from "rxjs"; +import {AaiService} from "../../services/aaiService/aai.service"; +import {forkJoin} from "rxjs/observable/forkJoin"; +import {AppState} from "../../store/reducers"; +import {NgRedux} from "@angular-redux/store"; +import {createServiceInstance} from "../../storeUtil/utils/service/service.actions"; + +@Injectable() +export class ViewEditResolver implements Resolve<Observable<boolean>> { + + constructor(private _aaiService: AaiService, private _store: NgRedux<AppState>) { + } + + resolve(route: ActivatedRouteSnapshot): Observable<boolean> { + const serviceModeId: string = route.queryParamMap.get("serviceModelId"); + const serviceInstanceId: string = route.queryParamMap.get("serviceInstanceId"); + const subscriberId: string = route.queryParamMap.get("subscriberId"); + const serviceType: string = route.queryParamMap.get("serviceType"); + let serviceModelApi = this._aaiService.getServiceModelById(serviceModeId); + let serviceInstanceApi = this._aaiService.retrieveAndStoreServiceInstanceTopology(serviceInstanceId, subscriberId, serviceType, serviceModeId); + return forkJoin([serviceModelApi, serviceInstanceApi]).map(([serviceModel, serviceInstance ]) => { + this.setIsALaCarte(serviceInstance,serviceModel.service.instantiationType ); + this.setTestApi(serviceInstance); + this._store.dispatch(createServiceInstance( serviceInstance, serviceModeId)); + return true; + }); + } + + setTestApi = (service: any) => { + if (this._store.getState().global.flags['FLAG_ADD_MSO_TESTAPI_FIELD'] && service.isALaCarte) { + service.testApi = sessionStorage.getItem("msoRequestParametersTestApiValue"); + } + }; + setIsALaCarte = (service: any, instantiationType) => { + service.isALaCarte = instantiationType === 'A-La-Carte'; + }; + +} diff --git a/vid-webpack-master/src/app/shared/server/healthStatusService/health-status.service.spec.ts b/vid-webpack-master/src/app/shared/server/healthStatusService/health-status.service.spec.ts deleted file mode 100644 index 36f6349e2..000000000 --- a/vid-webpack-master/src/app/shared/server/healthStatusService/health-status.service.spec.ts +++ /dev/null @@ -1,60 +0,0 @@ -import {TestBed, inject, getTestBed} from '@angular/core/testing'; - -import { HealthStatusService } from './health-status.service'; -import {Constants} from "../../utils/constants"; -import {HttpClientTestingModule, HttpTestingController} from "@angular/common/http/testing"; -import {ExternalComponentStatus} from "../../models/externalComponentStatus"; - -describe('HealthStatusService', () => { - - let injector; - let service: HealthStatusService; - let httpMock: HttpTestingController; - - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [HttpClientTestingModule], - providers: [HealthStatusService] - }); - - injector = getTestBed(); - service = injector.get(HealthStatusService); - httpMock = injector.get(HttpTestingController); - }); - - describe('#getProbe', () =>{ - it('when call probe, there is http GET with right url', () => { - - service.getProbe().subscribe((result: Array<ExternalComponentStatus>)=>{ - expect(result[0].component).toEqual("AAI"); - expect(result[0].available).toBeTruthy(); - expect(result[0].metadata).toEqual({ myKey: 'myValue' }); - - expect(result[1].component).toEqual("MSO"); - expect(result[1].available).toBeFalsy(); - expect(result[1].metadata).toEqual({otherKey: 123}); - }); - - const req = httpMock.expectOne(Constants.Path.SERVICES_PROBE_PATH); - expect(req.request.method).toEqual('GET'); - req.flush([ - { - "component": "AAI", - "available": true, - "metadata": { - "myKey": "myValue" - } - }, - { - "component": "MSO", - "available": false, - "metadata": { - "otherKey": 123 - } - }, - ]); - }); - - }); - -}); diff --git a/vid-webpack-master/src/app/shared/server/healthStatusService/health-status.service.ts b/vid-webpack-master/src/app/shared/server/healthStatusService/health-status.service.ts index 4305ab97e..71e32f1d4 100644 --- a/vid-webpack-master/src/app/shared/server/healthStatusService/health-status.service.ts +++ b/vid-webpack-master/src/app/shared/server/healthStatusService/health-status.service.ts @@ -1,6 +1,6 @@ import { Injectable } from '@angular/core'; import {HttpClient} from "@angular/common/http"; -import {Observable} from "rxjs/Observable"; +import {Observable} from "rxjs"; import {Constants} from "../../utils/constants"; import {ExternalComponentStatus} from "../../models/externalComponentStatus"; @@ -10,8 +10,8 @@ export class HealthStatusService { constructor(private _http: HttpClient) { } - getProbe(): Observable<Array<ExternalComponentStatus>> { + getProbe(): Observable<ExternalComponentStatus[]> { let pathQuery = Constants.Path.SERVICES_PROBE_PATH; - return this._http.get<Array<ExternalComponentStatus>>(pathQuery).map(res => res); + return this._http.get<ExternalComponentStatus[]>(pathQuery).map(res => res); } } diff --git a/vid-webpack-master/src/app/shared/server/serviceInfo/AuditStatus.model.ts b/vid-webpack-master/src/app/shared/server/serviceInfo/AuditStatus.model.ts index 0b4c70f9d..a0920a902 100644 --- a/vid-webpack-master/src/app/shared/server/serviceInfo/AuditStatus.model.ts +++ b/vid-webpack-master/src/app/shared/server/serviceInfo/AuditStatus.model.ts @@ -6,5 +6,7 @@ export class AuditStatus{ jobStatus :string; source: string; requestId: string; - additionalInfo :any + additionalInfo :any; + instanceName: string; + instanceType : string; } diff --git a/vid-webpack-master/src/app/shared/server/serviceInfo/serviceInfo.model.ts b/vid-webpack-master/src/app/shared/server/serviceInfo/serviceInfo.model.ts index 0b4695930..a507e073e 100644 --- a/vid-webpack-master/src/app/shared/server/serviceInfo/serviceInfo.model.ts +++ b/vid-webpack-master/src/app/shared/server/serviceInfo/serviceInfo.model.ts @@ -1,4 +1,5 @@ import {ServiceStatus} from '../../../instantiationStatus/instantiationStatus.component.service'; +import {ServiceAction} from "../../models/serviceInstanceActions"; export class ServiceInfoModel { id: number; @@ -9,6 +10,8 @@ export class ServiceInfoModel { numRow: number; uuid: string; userId: string; + requestId: string; + aLaCarte: boolean; jobStatus: string; pause: boolean; owningEntityId: string; @@ -22,6 +25,7 @@ export class ServiceInfoModel { regionName: string; serviceType: string; subscriberName: string; + subscriberId: string; serviceInstanceId: string; serviceInstanceName: string; serviceModelId: string; @@ -30,6 +34,8 @@ export class ServiceInfoModel { templateId: string; auditUserId: string; jobId: string; + action: ServiceAction; + isRetryEnabled: boolean; } export class ServiceInfoUiModel extends ServiceInfoModel{ diff --git a/vid-webpack-master/src/app/shared/server/serviceInfo/serviceInfo.service.spec.ts b/vid-webpack-master/src/app/shared/server/serviceInfo/serviceInfo.service.spec.ts index 78c1b5ab9..147434b1a 100644 --- a/vid-webpack-master/src/app/shared/server/serviceInfo/serviceInfo.service.spec.ts +++ b/vid-webpack-master/src/app/shared/server/serviceInfo/serviceInfo.service.spec.ts @@ -9,59 +9,75 @@ describe('Service Info Service', () => { let service: ServiceInfoService; let httpMock: HttpTestingController; - beforeEach(() => { + beforeAll(done => (async () => { TestBed.configureTestingModule({ imports: [HttpClientTestingModule], providers: [ServiceInfoService] }); + await TestBed.compileComponents(); + injector = getTestBed(); service = injector.get(ServiceInfoService); httpMock = injector.get(HttpTestingController); - }); - describe('#getServicesJobInfo', () => { - it('should return an Observable<ServiceInfoModel[]>', () => { - const dummyServiceInfo: ServiceInfoModel[] = generateServiceInfoData(); + })().then(done).catch(done.fail)); - service.getServicesJobInfo(true).subscribe((serviceInfo:Array<ServiceInfoModel>) => { - expect(serviceInfo).toEqual(dummyServiceInfo); - }); - }); + describe('#getMacroJobAuditStatus', ()=> { + test('should return Observable<Object[]>', ()=>{ + let job: ServiceInfoModel = new ServiceInfoModel(); + job.jobId = '111'; + service.getJobAuditStatus(job).subscribe(); + const req = httpMock.expectOne(Constants.Path.SERVICES_JOB_INFO_PATH + Constants.Path.SERVICES_JOB_AUDIT_PATH + '/' + job.jobId + '?source=VID'); + const req2 = httpMock.expectOne(Constants.Path.SERVICES_JOB_INFO_PATH + Constants.Path.SERVICES_JOB_AUDIT_PATH + '/' + job.jobId + '?source=MSO'); + expect(req.request.method).toBe('GET'); + expect(req2.request.method).toBe('GET'); + }); }); - describe('#deleteJob', () =>{ - it('delete job', () => { - const jobId : string = "1111"; - - service.deleteJob(jobId).subscribe(); + describe('#getALaCarteJobAuditStatus Without params', ()=> { + test('should return Observable<Object[]>', ()=>{ + let job: ServiceInfoModel = new ServiceInfoModel(); + job.aLaCarte = true; + job.jobId = '111'; - const req = httpMock.expectOne(Constants.Path.SERVICES_JOB_INFO_PATH + '/job/' + jobId); - expect(req.request.method).toEqual('DELETE'); + service.getJobAuditStatus(job).subscribe(); + const req = httpMock.expectOne(Constants.Path.SERVICES_JOB_INFO_PATH + Constants.Path.SERVICES_JOB_AUDIT_PATH + '/' + job.jobId + '?source=VID'); + const req2 = httpMock.expectOne(Constants.Path.SERVICES_JOB_INFO_PATH + Constants.Path.SERVICES_JOB_AUDIT_PATH + '/' + job.jobId + '/mso'); + expect(req.request.method).toEqual('GET'); + expect(req2.request.method).toEqual('GET'); }); }); - describe('#hideJob', () =>{ - it('when call hide job, there is http POST with right url', () => { - const jobId : string = "3"; + describe('#getALaCarteJobAuditStatus With ServiceInstanceId', ()=> { + test('should return Observable<Object[]>', ()=>{ + let job: ServiceInfoModel = new ServiceInfoModel(); + job.aLaCarte = true; + job.jobId = '111'; + job.serviceInstanceId = '222'; - service.hideJob(jobId).subscribe(); + service.getJobAuditStatus(job).subscribe(); + const req = httpMock.expectOne(Constants.Path.SERVICES_JOB_INFO_PATH + Constants.Path.SERVICES_JOB_AUDIT_PATH + '/' + job.jobId + '?source=VID'); + const req2 = httpMock.expectOne(Constants.Path.SERVICES_JOB_INFO_PATH + Constants.Path.SERVICES_JOB_AUDIT_PATH + '/' + job.jobId + '/mso?serviceInstanceId=' + job.serviceInstanceId); - const req = httpMock.expectOne(Constants.Path.SERVICES_JOB_INFO_PATH + '/hide/' + jobId); - expect(req.request.method).toEqual('POST'); + expect(req.request.method).toEqual('GET'); + expect(req2.request.method).toEqual('GET'); }); }); - describe('#getJobAuditStatus', ()=> { - it('should return Observable<Object[]>', ()=>{ - const jobId : string = '111'; + describe('#getALaCarteJobAuditStatus With RequestId', ()=> { + test('should return Observable<Object[]>', ()=>{ + let job: ServiceInfoModel = new ServiceInfoModel(); + job.aLaCarte = true; + job.jobId = '111'; + job.requestId = '333'; - service.getJobAuditStatus(jobId).subscribe(); - const req = httpMock.expectOne(Constants.Path.SERVICES_JOB_INFO_PATH + Constants.Path.SERVICES_JOB_AUDIT_PATH + '/' + jobId + '?source=VID'); - const req2 = httpMock.expectOne(Constants.Path.SERVICES_JOB_INFO_PATH + Constants.Path.SERVICES_JOB_AUDIT_PATH + '/' + jobId + '?source=MSO'); + service.getJobAuditStatus(job).subscribe(); + const req = httpMock.expectOne(Constants.Path.SERVICES_JOB_INFO_PATH + Constants.Path.SERVICES_JOB_AUDIT_PATH + '/' + job.jobId + '?source=VID'); + const req2 = httpMock.expectOne(Constants.Path.SERVICES_JOB_INFO_PATH + Constants.Path.SERVICES_JOB_AUDIT_PATH + '/' + job.jobId + '/mso?requestId=' + job.requestId); expect(req.request.method).toEqual('GET'); expect(req2.request.method).toEqual('GET'); @@ -73,6 +89,7 @@ describe('Service Info Service', () => { [{ "created": 1519956533000, "modified": 1521727738000, + "action": "INSTANTIATE", "createdId": null, "modifiedId": null, "rowNum": null, @@ -105,6 +122,7 @@ describe('Service Info Service', () => { { "created": 1519956533000, "modified": 1521727738000, + "action": "INSTANTIATE", "createdId": null, "modifiedId": null, "rowNum": null, @@ -137,6 +155,7 @@ describe('Service Info Service', () => { { "created": 1519956533000, "modified": 1521727738000, + "action": "INSTANTIATE", "createdId": null, "modifiedId": null, "rowNum": null, @@ -169,6 +188,7 @@ describe('Service Info Service', () => { { "created": 1519956533000, "modified": 1521727738000, + "action": "INSTANTIATE", "createdId": null, "modifiedId": null, "rowNum": null, @@ -201,6 +221,7 @@ describe('Service Info Service', () => { { "created": 1519956533000, "modified": 1521727738000, + "action": "INSTANTIATE", "createdId": null, "modifiedId": null, "rowNum": null, diff --git a/vid-webpack-master/src/app/shared/server/serviceInfo/serviceInfo.service.ts b/vid-webpack-master/src/app/shared/server/serviceInfo/serviceInfo.service.ts index e0057bb4d..fe6ebc7ee 100644 --- a/vid-webpack-master/src/app/shared/server/serviceInfo/serviceInfo.service.ts +++ b/vid-webpack-master/src/app/shared/server/serviceInfo/serviceInfo.service.ts @@ -1,19 +1,23 @@ import {Injectable} from '@angular/core'; -import {Observable} from 'rxjs/Observable'; +import {Observable} from 'rxjs'; import {ServiceInfoModel} from './serviceInfo.model'; -import {HttpClient} from '@angular/common/http'; -import 'rxjs/add/operator/map' +import {HttpClient, HttpHeaders} from '@angular/common/http'; +import { of } from 'rxjs'; +import { map } from 'rxjs/operators'; import {Constants} from '../../utils/constants'; import {forkJoin} from "rxjs/observable/forkJoin"; +import * as _ from 'lodash'; +import {AuditStatus} from "./AuditStatus.model"; @Injectable() export class ServiceInfoService { constructor(private _http: HttpClient) { } - getServicesJobInfo(filterByUser : boolean): Observable<ServiceInfoModel[]> { + getServicesJobInfo(filterByUser : boolean, showSpinner: boolean = true): Observable<ServiceInfoModel[]> { let pathQuery = Constants.Path.SERVICES_JOB_INFO_PATH; - return this._http.get<ServiceInfoModel[]>(pathQuery).map(res => res ); + let headers = new HttpHeaders({'x-show-spinner': showSpinner.toString()}); + return this._http.get<ServiceInfoModel[]>(pathQuery, { headers: headers }).map(res => res ); } deleteJob(jobId: string): Observable<any> { @@ -26,13 +30,42 @@ export class ServiceInfoService { return this._http.post<any>(pathQuery, null).map(res => res); } - getJobAuditStatus(jobId : string) : Observable<Object[]>{ - let pathQueryVID = Constants.Path.SERVICES_JOB_INFO_PATH + Constants.Path.SERVICES_JOB_AUDIT_PATH + '/' + jobId + '?source=VID'; - let pathQueryMSO = Constants.Path.SERVICES_JOB_INFO_PATH + Constants.Path.SERVICES_JOB_AUDIT_PATH + '/' + jobId + '?source=MSO'; + getJobAuditStatus(jobData: ServiceInfoModel) : Observable<Object[]>{ + let pathQueryBySource: string = Constants.Path.SERVICES_JOB_INFO_PATH + Constants.Path.SERVICES_JOB_AUDIT_PATH + '/' + jobData.jobId + '?source='; + let pathQueryVID: string = pathQueryBySource + 'VID'; + let pathQueryMSO: string; + + // just call it + if(jobData.aLaCarte) { + let requestParams: string[] = []; + pathQueryMSO = Constants.Path.SERVICES_JOB_INFO_PATH + Constants.Path.SERVICES_JOB_AUDIT_PATH + '/' + jobData.jobId + '/mso'; + if (!_.isEmpty(jobData.requestId)) { + requestParams[requestParams.length] = 'requestId=' + jobData.requestId; + } + if (!_.isEmpty(jobData.serviceInstanceId)) { + requestParams[requestParams.length] = 'serviceInstanceId=' + jobData.serviceInstanceId; + } + if (requestParams.length > 0) { + pathQueryMSO += '?' + requestParams.join('&'); + } + } + else { + pathQueryMSO = pathQueryBySource + 'MSO'; + } + let vidObs = this._http.get(pathQueryVID); let msoObs = this._http.get(pathQueryMSO); return forkJoin([vidObs, msoObs]); } + getInstanceAuditStatus(instanceId: string, type :string) : Observable<AuditStatus[]>{ + let pathQuery: string = Constants.Path.SERVICES_JOB_INFO_PATH + Constants.Path.SERVICES_JOB_AUDIT_PATH + '/' + type + '/' + instanceId + '/mso'; + return this._http.get<any>(pathQuery).map(res => res); + } + + getAuditStatusForRetry(trackById: string) : Observable<AuditStatus>{ + let pathQuery: string = Constants.Path.AUDIT_STATUS_FOR_RETRY_PATH + '/' + trackById ; + return this._http.get<any>(pathQuery).map(res => res); + } } diff --git a/vid-webpack-master/src/app/services/aaiService/aai.actions.ts b/vid-webpack-master/src/app/shared/services/aaiService/aai.actions.ts index 649fb1456..dc234bd61 100644 --- a/vid-webpack-master/src/app/services/aaiService/aai.actions.ts +++ b/vid-webpack-master/src/app/shared/services/aaiService/aai.actions.ts @@ -50,8 +50,10 @@ export const loadUserId: ActionCreator<LoadUserId> = export const loadLcpTenant: ActionCreator<LoadLcpTenant> = - () => ({ + (subscriberId : string, serviceType : string) => ({ type: LOAD_LCP_TENANT, + subscriberId : subscriberId, + serviceType : serviceType }); diff --git a/vid-webpack-master/src/app/services/aaiService/aai.epics.ts b/vid-webpack-master/src/app/shared/services/aaiService/aai.epics.ts index 5249cea82..a850d55da 100644 --- a/vid-webpack-master/src/app/services/aaiService/aai.epics.ts +++ b/vid-webpack-master/src/app/shared/services/aaiService/aai.epics.ts @@ -1,6 +1,5 @@ -import {updateServiceInstance} from './../../service.actions'; import {Injectable} from '@angular/core'; -import {createEpicMiddleware} from 'redux-observable'; +import {combineEpics, createEpicMiddleware, ofType} from 'redux-observable'; import 'rxjs/add/operator/catch'; import 'rxjs/add/operator/map'; import 'rxjs/add/operator/do'; @@ -15,11 +14,15 @@ import { LOAD_USER_ID } from "./aai.actions"; import {AaiService} from "./aai.service"; +import {AppState} from "../../store/reducers"; import { - updateAicZones, updateCategoryParameters, updateLcpRegionsAndTenants, updateNetworkCollectionFunction, + updateAicZones, updateCategoryParameters, + updateLcpRegionsAndTenants, + updateNetworkCollectionFunction, updateProductFamilies, updateUserId -} from "../../service.actions"; -import {AppState} from "../../store/reducers"; +} from "../../storeUtil/utils/general/general.actions"; +import {createServiceInstance} from "../../storeUtil/utils/service/service.actions"; +import {delay, mapTo} from "rxjs/operators"; const notFetchedAlready = (state: AppState): boolean => state.service.productFamilies !== null; @@ -29,23 +32,20 @@ export class AAIEpics { } public createEpic() { - return [createEpicMiddleware(this.loadProductFamiliesEpic) - , createEpicMiddleware(this.loadLcpTenants) - , createEpicMiddleware(this.loadAicZones) - , createEpicMiddleware(this.loadCategoryParameters) - , createEpicMiddleware(this.loadServiceAccordingToUuid) - , createEpicMiddleware(this.loadNetworkAccordingToNetworkFunction) - , createEpicMiddleware(this.loadUserId) - ]; + return combineEpics( + this.loadProductFamiliesEpic + , this.loadLcpTenants + , this.loadAicZones + , this.loadCategoryParameters + , this.loadServiceAccordingToUuid + , this.loadNetworkAccordingToNetworkFunction + , this.loadUserId) } private loadLcpTenants = (action$, store) => - action$ - .ofType(LOAD_LCP_TENANT) - .switchMap(() => this - .aaiService - .getLcpRegionsAndTenants('e433710f-9217-458d-a79d-1c7aff376d89', 'VIRTUAL USP') - .map(data => updateLcpRegionsAndTenants(data))); + action$.ofType(LOAD_LCP_TENANT) + .switchMap((action) => this.aaiService.getLcpRegionsAndTenants(action.subscriberId, action.serviceType) + .map(data => updateLcpRegionsAndTenants(data))); private loadProductFamiliesEpic = (action$, store) => action$ .ofType(LOAD_PRODUCT_FAMILIES) @@ -64,7 +64,7 @@ export class AAIEpics { private loadServiceAccordingToUuid = (action$, store) => action$ .ofType(LOAD_SERVICE_MDOEL_BY_UUID) .switchMap((action) => this.aaiService.getServiceModelById(action.modelId) - .map(data => updateServiceInstance(action.uuid, data))); + .map(data => createServiceInstance(action.uuid, data))); private loadUserId = (action$, store) => action$ .ofType(LOAD_USER_ID) diff --git a/vid-webpack-master/src/app/shared/services/aaiService/aai.service.spec.ts b/vid-webpack-master/src/app/shared/services/aaiService/aai.service.spec.ts new file mode 100644 index 000000000..9f19f6259 --- /dev/null +++ b/vid-webpack-master/src/app/shared/services/aaiService/aai.service.spec.ts @@ -0,0 +1,497 @@ +import {ServiceInstance} from "../../models/serviceInstance"; +import {RootObject} from "./model/crawledAaiService"; +import {AaiService} from "./aai.service"; +import {instance, mock, when} from "ts-mockito"; +import {FeatureFlagsService, Features} from "../featureFlag/feature-flags.service"; +import {HttpClientTestingModule, HttpTestingController} from "@angular/common/http/testing"; +import {getTestBed, TestBed} from "@angular/core/testing"; +import {NgRedux} from "@angular-redux/store"; +import {Constants} from "../../utils/constants"; +import {AppState} from "../../store/reducers"; +import {setOptionalMembersVnfGroupInstance} from "../../storeUtil/utils/vnfGroup/vnfGroup.actions"; +import each from 'jest-each'; + +class MockAppStore<T> { + dispatch(){} + getState(){} +} + +describe("AaiService", () => { + + let injector; + let httpMock: HttpTestingController; + let aaiService: AaiService; + let mockFeatureFlagsService: FeatureFlagsService = mock(FeatureFlagsService); + let store : NgRedux<AppState>; + + beforeAll(done => (async () => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + providers: [ + AaiService, + {provide: NgRedux, useClass: MockAppStore}, + {provide: FeatureFlagsService, useValue: instance(mockFeatureFlagsService)} + ] + }); + await TestBed.compileComponents(); + + injector = getTestBed(); + httpMock = injector.get(HttpTestingController); + aaiService = injector.get(AaiService); + store = injector.get(NgRedux); + + })().then(done).catch(done.fail)); + + + + describe('#resolve tests', () => { + test('aai service resolve should return the right object', () => { + let serviceInstance = new ServiceInstance(); + aaiService.resolve(aaiServiceInstnace.root, serviceInstance); + + expectedResult.vnfs['DROR_vsp'].trackById = serviceInstance.vnfs['DROR_vsp'].trackById; + expect(JSON.parse(JSON.stringify(serviceInstance.vnfs))).toEqual(expectedResult.vnfs); + expect(JSON.parse(JSON.stringify(serviceInstance.networks))).toEqual(expectedResult.networks); + }); + }); + + describe('#serviceInstanceTopology tests', () => { + test('aai service get serviceInstanceTopolgetServiceInstanceTopologyResult.jsonogy from backend, and return ServiceInstance', () => { + + const mockedResult = getTopology(); + const serviceInstanceId: string = "id"; + const subscriberId: string = "fakeSunId"; + const serviceType: string = "justServiceType"; + aaiService.retrieveServiceInstanceTopology(serviceInstanceId, subscriberId, serviceType).subscribe((result: ServiceInstance) => { + expect(result.instanceName).toEqual("mCaNkinstancename"); + expect(result.modelInavariantId).toEqual("6b528779-44a3-4472-bdff-9cd15ec93450"); + expect(result.vnfs["2017-388_ADIOD-vPE 0"].instanceName).toEqual("2017388_ADIODvPEmCaNkinstanceName"); + expect(result.vnfs["2017-488_ADIOD-vPE 0"]. + vfModules["2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0"] + ["2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0uvfot"].instanceName + ).toEqual("VFinstancenameZERO"); + }); + + const req = httpMock.expectOne(`${Constants.Path.AAI_GET_SERVICE_INSTANCE_TOPOLOGY_PATH}${subscriberId}/${serviceType}/${serviceInstanceId}`); + expect(req.request.method).toEqual('GET'); + req.flush(mockedResult); + }); + }); + + + describe('#retrieveAndStoreServiceInstanceRetryTopology tests', () => { + test('aai service get retrieveAndStoreServiceInstanceRetryTopology.jsonogy from backend, and return ServiceInstance', () => { + + let mockedResult = getTopology(); + + const jobId: string = "jobId"; + aaiService.retrieveServiceInstanceRetryTopology(jobId).subscribe((result: ServiceInstance) => { + expect(result.instanceName).toEqual("mCaNkinstancename"); + expect(result.modelInavariantId).toEqual("6b528779-44a3-4472-bdff-9cd15ec93450"); + expect(result.vnfs["2017-388_ADIOD-vPE 0"].instanceName).toEqual("2017388_ADIODvPEmCaNkinstanceName"); + expect(result.vnfs["2017-488_ADIOD-vPE 0"]. + vfModules["2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0"] + ["2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0uvfot"].instanceName + ).toEqual("VFinstancenameZERO"); + }); + + const req = httpMock.expectOne(`${Constants.Path.SERVICES_RETRY_TOPOLOGY}/${jobId}`); + expect(req.request.method).toEqual('GET'); + req.flush(mockedResult); + }); + }); + + describe('# get optional group members tests', () =>{ + test('aai service get getOptionalGroupMembers and return list of VnfMember', () => { + jest.spyOn(store, 'dispatch'); + jest.spyOn(store, 'getState').mockReturnValue({ + service :{ + serviceInstance : { + "serviceModelId" : { + optionalGroupMembersMap : {} + } + } + } + }); + const mockedResult = getMockMembers(); + const serviceInvariantId: string = "serviceInvariantId"; + const subscriberId: string = "subscriberId"; + const serviceType: string = "serviceType"; + const groupType: string = "groupType"; + const groupRole: string = "groupRole"; + const serviceModelId: string = "serviceModelId"; + aaiService.getOptionalGroupMembers(serviceModelId, subscriberId, serviceType, serviceInvariantId, groupType, groupRole).subscribe((res)=>{ + const path = `${Constants.Path.AAI_GET_SERVICE_GROUP_MEMBERS_PATH}${subscriberId}/${serviceType}/${serviceInvariantId}/${groupType}/${groupRole}`; + expect(store.dispatch).toHaveBeenCalledWith(setOptionalMembersVnfGroupInstance(serviceModelId, path, res)); + expect(res.length).toEqual(2); + }); + + + const req = httpMock.expectOne(`${Constants.Path.AAI_GET_SERVICE_GROUP_MEMBERS_PATH}${subscriberId}/${serviceType}/${serviceInvariantId}/${groupType}/${groupRole}`); + expect(req.request.method).toEqual('GET'); + req.flush(mockedResult); + }); + }); + describe('#cloud owner tests', () => { + let featureFlagToLcpRegionName = [ + ['aai service extract lcpRegion, flag is true=> lcp region include cloud owner', true, 'id (OWNER)' ], + ['aai service extract lcpRegion, flag is false=> lcp region doesnt include cloud owner', false, 'id'] + ]; + + each(featureFlagToLcpRegionName).test("%s", (desc: string, flag: boolean, expectedName: string ) => { + when(mockFeatureFlagsService.getFlagState(Features.FLAG_1810_CR_ADD_CLOUD_OWNER_TO_MSO_REQUEST)).thenReturn(flag); + let name: string = aaiService.extractLcpRegionName("id", "att-owner"); + expect(name).toEqual(expectedName); + }); + + let cloudOwnerFormattingDataProvider = [ + ['classic cloud owner', 'irma-aic', ' (AIC)'], + ['upper case cloud owner', 'IRMA-AIC', ' (AIC)'], + ['no att cloud owner', 'nc', ' (NC)'], + ]; + + each(cloudOwnerFormattingDataProvider).test('test cloudOwner trailer formatting %s', (desc: string, cloudOwner: string, expectedTrailer: string) => { + expect(AaiService.formatCloudOwnerTrailer(cloudOwner)).toEqual(expectedTrailer); + }); + }); + + function getTopology() { + return { + "vnfs": { + "2017-388_ADIOD-vPE 0": { + "vfModules": {}, + "uuid": "afacccf6-397d-45d6-b5ae-94c39734b168", + "productFamilyId": "e433710f-9217-458d-a79d-1c7aff376d89", + "lcpCloudRegionId": "JANET25", + "tenantId": "092eb9e8e4b7412e8787dd091bc58e86", + "lineOfBusiness": "ONAP", + "platformName": "platform", + "modelInfo": { + "modelInvariantId": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8", + "modelVersionId": "afacccf6-397d-45d6-b5ae-94c39734b168", + "modelName": "2017-388_ADIOD-vPE", + "modelVersion": "4.0", + "modelCustomizationId": "b3c76f73-eeb5-4fb6-9d31-72a889f1811c", + "modelCustomizationName": "2017-388_ADIOD-vPE 0", + "uuid": "afacccf6-397d-45d6-b5ae-94c39734b168" + }, + "instanceName": "2017388_ADIODvPEmCaNkinstanceName", + "legacyRegion": "some legacy region" + }, + "2017-488_ADIOD-vPE 0": { + "vfModules": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0uvfot": { + "instanceName": "VFinstancenameZERO", + "modelInfo": { + "modelInvariantId": "b34833bb-6aa9-4ad6-a831-70b06367a091", + "modelVersionId": "f8360508-3f17-4414-a2ed-6bc71161e8db", + "modelName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0", + "modelVersion": "5", + "modelCustomizationId": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0", + "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db" + }, + "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db", + "provStatus": "Prov Status", + "orchStatus": "Active", + "inMaint": true + } + }, + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1fshmc": { + "instanceName": "VFinstancename", + "volumeGroupName": "VFinstancename_vol_abc", + "orchStatus": "Create", + "provStatus": "Prov Status", + "inMaint": false, + "modelInfo": { + "modelInvariantId": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1", + "modelVersionId": "25284168-24bb-4698-8cb4-3f509146eca5", + "modelName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "modelVersion": "6", + "modelCustomizationId": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "uuid": "25284168-24bb-4698-8cb4-3f509146eca5" + }, + "uuid": "25284168-24bb-4698-8cb4-3f509146eca5" + } + } + }, + "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09", + "productFamilyId": "e433710f-9217-458d-a79d-1c7aff376d89", + "lcpCloudRegionId": "JANET25", + "tenantId": "092eb9e8e4b7412e8787dd091bc58e86", + "lineOfBusiness": "ONAP", + "platformName": "platform", + "modelInfo": { + "modelInvariantId": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8", + "modelVersionId": "69e09f68-8b63-4cc9-b9ff-860960b5db09", + "modelName": "2017-488_ADIOD-vPE", + "modelVersion": "5.0", + "modelCustomizationId": "1da7b585-5e61-4993-b95e-8e6606c81e45", + "modelCustomizationName": "2017-488_ADIOD-vPE 0", + "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09" + }, + "orchStatus": "Created", + "inMaint": false, + "instanceName": "2017488_ADIODvPEVNFinstancename", + "legacyRegion": "some legacy region" + }, + "2017-488_ADIOD-vPE 0:0001": { + "vfModules": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0uvfot": { + "instanceName": "VFinstancenameZERO_001", + "provStatus": "Prov Status", + "inMaint": true, + "modelInfo": { + "modelInvariantId": "b34833bb-6aa9-4ad6-a831-70b06367a091", + "modelVersionId": "f8360508-3f17-4414-a2ed-6bc71161e8db", + "modelName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0", + "modelVersion": "5", + "modelCustomizationId": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0", + "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db" + }, + "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db" + } + }, + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1fshmc": { + "instanceName": "VFinstancename_001", + "volumeGroupName": "VFinstancename_vol_abc_001", + "modelInfo": { + "modelInvariantId": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1", + "modelVersionId": "25284168-24bb-4698-8cb4-3f509146eca5", + "modelName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "modelVersion": "6", + "modelCustomizationId": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "uuid": "25284168-24bb-4698-8cb4-3f509146eca5" + }, + "uuid": "25284168-24bb-4698-8cb4-3f509146eca5" + } + } + }, + + "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09", + "productFamilyId": "e433710f-9217-458d-a79d-1c7aff376d89", + "lcpCloudRegionId": "JANET25", + "tenantId": "092eb9e8e4b7412e8787dd091bc58e86", + "lineOfBusiness": "ONAP", + "platformName": "platform", + "modelInfo": { + "modelInvariantId": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8", + "modelVersionId": "69e09f68-8b63-4cc9-b9ff-860960b5db09", + "modelName": "2017-488_ADIOD-vPE", + "modelVersion": "5.0", + "modelCustomizationId": "1da7b585-5e61-4993-b95e-8e6606c81e45", + "modelCustomizationName": "2017-488_ADIOD-vPE 0", + "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09" + }, + "instanceName": "2017488_ADIODvPEVNFinstancename_001", + "legacyRegion": "some legacy region" + }, + "2017-488_ADIOD-vPE 0:0002": { + "vfModules": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0uvfot": { + "instanceName": "VFinstancenameZERO_002", + "modelInfo": { + "modelInvariantId": "b34833bb-6aa9-4ad6-a831-70b06367a091", + "modelVersionId": "f8360508-3f17-4414-a2ed-6bc71161e8db", + "modelName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0", + "modelVersion": "5", + "modelCustomizationId": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0", + "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db" + }, + "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db" + } + }, + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1fshmc": { + "instanceName": "VFinstancename_002", + "volumeGroupName": "VFinstancename_vol_abc_002", + "modelInfo": { + "modelInvariantId": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1", + "modelVersionId": "25284168-24bb-4698-8cb4-3f509146eca5", + "modelName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "modelVersion": "6", + "modelCustomizationId": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1", + "uuid": "25284168-24bb-4698-8cb4-3f509146eca5" + }, + "uuid": "25284168-24bb-4698-8cb4-3f509146eca5" + } + } + }, + "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09", + "productFamilyId": "e433710f-9217-458d-a79d-1c7aff376d89", + "lcpCloudRegionId": "JANET25", + "tenantId": "092eb9e8e4b7412e8787dd091bc58e86", + "lineOfBusiness": "ONAP", + "platformName": "platform", + "modelInfo": { + "modelInvariantId": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8", + "modelVersionId": "69e09f68-8b63-4cc9-b9ff-860960b5db09", + "modelName": "2017-488_ADIOD-vPE", + "modelVersion": "5.0", + "modelCustomizationId": "1da7b585-5e61-4993-b95e-8e6606c81e45", + "modelCustomizationName": "2017-488_ADIOD-vPE 0", + "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09" + }, + "instanceName": "2017488_ADIODvPEVNFinstancename_002", + "legacyRegion": "some legacy region" + } + }, + "vnfGroups": {}, + "existingVnfGroupCounterMap": {}, + "validationCounter": 0, + "existingVNFCounterMap": { + "afacccf6-397d-45d6-b5ae-94c39734b168": 1, + "69e09f68-8b63-4cc9-b9ff-860960b5db09": 3 + }, + "existingNetworksCounterMap": {}, + "instanceName": "mCaNkinstancename", + "globalSubscriberId": "e433710f-9217-458d-a79d-1c7aff376d89", + "subscriptionServiceType": "TYLER SILVIA", + "owningEntityId": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc", + "productFamilyId": "e433710f-9217-458d-a79d-1c7aff376d89", + "lcpCloudRegionId": "hvf6", + "tenantId": "bae71557c5bb4d5aac6743a4e5f1d054", + "aicZoneId": "NFT1", + "projectName": "WATKINS", + "rollbackOnFailure": "true", + "aicZoneName": "NFTJSSSS-NFT1", + "owningEntityName": "WayneHolland", + "tenantName": "AIN Web Tool-15-D-testalexandria", + "modelInfo": { + "modelInvariantId": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0", + "modelVersionId": "6b528779-44a3-4472-bdff-9cd15ec93450", + "modelName": "action-data", + "modelVersion": "1.0", + "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450" + }, + "isALaCarte": false, + "orchStatus": "Active", + "modelInavariantId": "6b528779-44a3-4472-bdff-9cd15ec93450" + } + } + + const getMockMembers = (): any[] => { + return [ + { + "action":"None", + "instanceName":"VNF1_INSTANCE_NAME", + "instanceId":"VNF1_INSTANCE_ID", + "orchStatus":null, + "productFamilyId":null, + "lcpCloudRegionId":null, + "tenantId":null, + "modelInfo":{ + "modelInvariantId":"vnf-instance-model-invariant-id", + "modelVersionId":"7a6ee536-f052-46fa-aa7e-2fca9d674c44", + "modelVersion":"2.0", + "modelName":"vf_vEPDG", + "modelType":"vnf" + }, + "instanceType":"VNF1_INSTANCE_TYPE", + "provStatus":null, + "inMaint":false, + "uuid":"7a6ee536-f052-46fa-aa7e-2fca9d674c44", + "originalName":null, + "legacyRegion":null, + "lineOfBusiness":null, + "platformName":null, + "trackById":"7a6ee536-f052-46fa-aa7e-2fca9d674c44:002", + "serviceInstanceId":"service-instance-id1", + "serviceInstanceName":"service-instance-name" + }, + { + "action":"None", + "instanceName":"VNF2_INSTANCE_NAME", + "instanceId":"VNF2_INSTANCE_ID", + "orchStatus":null, + "productFamilyId":null, + "lcpCloudRegionId":null, + "tenantId":null, + "modelInfo":{ + "modelInvariantId":"vnf-instance-model-invariant-id", + "modelVersionId":"eb5f56bf-5855-4e61-bd00-3e19a953bf02", + "modelVersion":"1.0", + "modelName":"vf_vEPDG", + "modelType":"vnf" + }, + "instanceType":"VNF2_INSTANCE_TYPE", + "provStatus":null, + "inMaint":true, + "uuid":"eb5f56bf-5855-4e61-bd00-3e19a953bf02", + "originalName":null, + "legacyRegion":null, + "lineOfBusiness":null, + "platformName":null, + "trackById":"eb5f56bf-5855-4e61-bd00-3e19a953bf02:003", + "serviceInstanceId":"service-instance-id2", + "serviceInstanceName":"service-instance-name" + }]; + }; +}); + + +var expectedResult = + { + 'vnfs': { + 'DROR_vsp': { + 'rollbackOnFailure': 'true', + 'vfModules': {}, + 'isMissingData': false, + 'originalName': 'DROR_vsp', + 'orchStatus': 'Created', + 'inMaint': false, + 'vnfStoreKey' : null, + 'trackById' : 'abc', + 'action': 'Create' + } + }, + "vnfGroups" :{}, + "existingVNFCounterMap" : {}, + "existingVnfGroupCounterMap" : {}, + "existingNetworksCounterMap" : {}, + 'instanceParams': {}, + 'validationCounter': 0, + 'existingNames': {}, + 'networks': {}, + 'instanceName': 'Dror123', + 'orchStatus': 'Active', + 'modelInavariantId': '35340388-0b82-4d3a-823d-cbddf842be52', + 'action': 'Create' + }; + + +var aaiServiceInstnace: RootObject = { + "root": { + "type": "service-instance", + "orchestrationStatus": "Active", + "modelVersionId": "4e799efd-fd78-444d-bc25-4a3cde2f8cb0", + "modelCustomizationId": "4e799efd-fd78-444d-bc25-4a3cde2f8cb0", + "modelInvariantId": "35340388-0b82-4d3a-823d-cbddf842be52", + "id": "62888f15-6d24-4f7b-92a7-c3f35beeb215", + "name": "Dror123", + "children": [ + { + "type": "generic-vnf", + "orchestrationStatus": "Created", + "provStatus": "PREPROV", + "inMaint": true, + "modelVersionId": "11c6dc3e-cd6a-41b3-a50e-b5a10f7157d0", + "modelCustomizationId": "11c6dc3e-cd6a-41b3-a50e-b5a10f7157d0", + "modelInvariantId": "55628ce3-ed56-40bd-9b27-072698ce02a9", + "id": "59bde732-9b84-46bd-a59a-3c45fee0538b", + "name": "DROR_vsp", + "children": [] + } + ] + } +}; diff --git a/vid-webpack-master/src/app/shared/services/aaiService/aai.service.ts b/vid-webpack-master/src/app/shared/services/aaiService/aai.service.ts new file mode 100644 index 000000000..1b102e623 --- /dev/null +++ b/vid-webpack-master/src/app/shared/services/aaiService/aai.service.ts @@ -0,0 +1,619 @@ +import {NgRedux} from "@angular-redux/store"; +import {HttpClient} from '@angular/common/http'; +import {Injectable} from '@angular/core'; +import * as _ from 'lodash'; +import 'rxjs/add/operator/catch'; +import 'rxjs/add/operator/do'; +import {of} from "rxjs"; + +import {AicZone} from "../../models/aicZone"; +import {CategoryParams} from "../../models/categoryParams"; +import {LcpRegion} from "../../models/lcpRegion"; +import {LcpRegionsAndTenants} from "../../models/lcpRegionsAndTenants"; +import {OwningEntity} from "../../models/owningEntity"; +import {ProductFamily} from "../../models/productFamily"; +import {Project} from "../../models/project"; +import {SelectOption} from '../../models/selectOption'; +import {ServiceType} from "../../models/serviceType"; +import {Subscriber} from "../../models/subscriber"; +import {Tenant} from "../../models/tenant"; +import {Constants} from '../../utils/constants'; +import {AppState} from "../../store/reducers"; +import {GetAicZonesResponse} from "./responseInterfaces/getAicZonesResponseInterface"; +import {GetCategoryParamsResponseInterface} from "./responseInterfaces/getCategoryParamsResponseInterface"; +import {GetServicesResponseInterface} from "./responseInterfaces/getServicesResponseInterface"; +import {GetSubDetailsResponse} from "./responseInterfaces/getSubDetailsResponseInterface"; +import {GetSubscribersResponse} from "./responseInterfaces/getSubscribersResponseInterface"; +import {Root} from "./model/crawledAaiService"; +import {VnfInstance} from "../../models/vnfInstance"; +import {VfModuleInstance} from "../../models/vfModuleInstance"; +import {ServiceInstance} from "../../models/serviceInstance"; +import {VfModuleMap} from "../../models/vfModulesMap"; +import { + updateAicZones, + updateCategoryParameters, + updateLcpRegionsAndTenants, + updateServiceTypes, + updateSubscribers, + updateUserId +} from "../../storeUtil/utils/general/general.actions"; +import {updateModel, createServiceInstance} from "../../storeUtil/utils/service/service.actions"; +import {FeatureFlagsService, Features} from "../featureFlag/feature-flags.service"; +import {VnfMember} from "../../models/VnfMember"; +import {setOptionalMembersVnfGroupInstance} from "../../storeUtil/utils/vnfGroup/vnfGroup.actions"; +import {Observable} from "rxjs"; + +@Injectable() +export class AaiService { + constructor(private http: HttpClient, private store: NgRedux<AppState>, private featureFlagsService:FeatureFlagsService) { + + } + + getServiceModelById = (serviceModelId: string): Observable<any> => { + if (_.has(this.store.getState().service.serviceHierarchy, serviceModelId)) { + return of(<any> JSON.parse(JSON.stringify(this.store.getState().service.serviceHierarchy[serviceModelId]))); + } + let pathQuery: string = Constants.Path.SERVICES_PATH + serviceModelId; + return this.http.get(pathQuery).map(res => res) + .do((res) => { + this.store.dispatch(updateModel(res)); + }); + }; + + getUserId = (): Observable<any> => { + return this.http.get("../../getuserID", {responseType: 'text'}).do((res) => this.store.dispatch(updateUserId(res))); + }; + + + resolve = (root: Root, serviceInstance: ServiceInstance) => { + if (root.type === 'service-instance') { + serviceInstance.instanceName = root.name; + serviceInstance.orchStatus = root.orchestrationStatus; + serviceInstance.modelInavariantId = root.modelInvariantId; + for (let i = 0; i < root.children.length; i++) { + let child = root.children[i]; + if (child.type === 'generic-vnf') { + let vnf = new VnfInstance(); + vnf.originalName = child.name; + vnf.orchStatus = child.orchestrationStatus + if (child.children.length > 0) { + let vfModuleMap = new VfModuleMap(); + for (let j = 0; j < child.children.length; j++) { + let child = root.children[i]; + if (child.type === 'vf-module') { + let vfModule = new VfModuleInstance(); + vfModule.instanceName = child.name; + vfModule.orchStatus = child.orchestrationStatus; + vfModuleMap.vfModules[child.name] = vfModule; + } + } + vnf.vfModules = {"a": vfModuleMap}; + } + serviceInstance.vnfs[child.name] = vnf; + + } + } + + } + }; + + + getCRAccordingToNetworkFunctionId = (networkCollectionFunction, cloudOwner, cloudRegionId) => { + return this.http.get('../../aai_get_instance_groups_by_cloudregion/' + cloudOwner + '/' + cloudRegionId + '/' + networkCollectionFunction) + .map(res => res).do((res) => console.log(res)); + }; + + getCategoryParameters = (familyName): Observable<CategoryParams> => { + familyName = familyName || Constants.Path.PARAMETER_STANDARDIZATION_FAMILY; + let pathQuery: string = Constants.Path.GET_CATEGORY_PARAMETERS + "?familyName=" + familyName + "&r=" + Math.random(); + + return this.http.get<GetCategoryParamsResponseInterface>(pathQuery) + .map(this.categoryParametersResponseToProductAndOwningEntity) + .do(res => { + this.store.dispatch(updateCategoryParameters(res)) + }); + }; + + + categoryParametersResponseToProductAndOwningEntity = (res: GetCategoryParamsResponseInterface): CategoryParams => { + if (res && res.categoryParameters) { + const owningEntityList = res.categoryParameters.owningEntity.map(owningEntity => new OwningEntity(owningEntity)); + const projectList = res.categoryParameters.project.map(project => new Project(project)); + const lineOfBusinessList = res.categoryParameters.lineOfBusiness.map(owningEntity => new SelectOption(owningEntity)); + const platformList = res.categoryParameters.platform.map(platform => new SelectOption(platform)); + + return new CategoryParams(owningEntityList, projectList, lineOfBusinessList, platformList); + } else { + return new CategoryParams(); + } + }; + + getProductFamilies = (): Observable<ProductFamily[]> => { + + let pathQuery: string = Constants.Path.AAI_GET_SERVICES + Constants.Path.ASSIGN + Math.random(); + + return this.http.get<GetServicesResponseInterface>(pathQuery).map(res => res.service.map(service => new ProductFamily(service))); + }; + + getServices = (): Observable<GetServicesResponseInterface> => { + let pathQuery: string = Constants.Path.AAI_GET_SERVICES + Constants.Path.ASSIGN + Math.random(); + + return this.http.get<GetServicesResponseInterface>(pathQuery); + }; + + getSubscribers = (): Observable<Subscriber[]> => { + + if (this.store.getState().service.subscribers) { + return of(<any> JSON.parse(JSON.stringify(this.store.getState().service.subscribers))); + } + + let pathQuery: string = Constants.Path.AAI_GET_SUBSCRIBERS + Constants.Path.ASSIGN + Math.random(); + + return this.http.get<GetSubscribersResponse>(pathQuery).map(res => + res.customer.map(subscriber => new Subscriber(subscriber))).do((res) => { + this.store.dispatch(updateSubscribers(res)); + }); + }; + + getAicZones = (): Observable<AicZone[]> => { + if (this.store.getState().service.aicZones) { + return of(<any> JSON.parse(JSON.stringify(this.store.getState().service.aicZones))); + } + + let pathQuery: string = Constants.Path.AAI_GET_AIC_ZONES + Constants.Path.ASSIGN + Math.random(); + + return this.http.get<GetAicZonesResponse>(pathQuery).map(res => + res.zone.map(aicZone => new AicZone(aicZone))).do((res) => { + this.store.dispatch(updateAicZones(res)); + }); + }; + + getLcpRegionsAndTenants = (globalCustomerId, serviceType): Observable<LcpRegionsAndTenants> => { + + let pathQuery: string = Constants.Path.AAI_GET_TENANTS + + globalCustomerId + Constants.Path.FORWARD_SLASH + serviceType + Constants.Path.ASSIGN + Math.random(); + + console.log("AaiService:getSubscriptionServiceTypeList: globalCustomerId: " + + globalCustomerId); + if (globalCustomerId != null) { + return this.http.get(pathQuery) + .map(this.tenantResponseToLcpRegionsAndTenants).do((res) => { + this.store.dispatch(updateLcpRegionsAndTenants(res)); + }); + } + }; + + tenantResponseToLcpRegionsAndTenants = (cloudRegionTenantList): LcpRegionsAndTenants => { + + const lcpRegionsTenantsMap = {}; + + const lcpRegionList = _.uniqBy(cloudRegionTenantList, 'cloudRegionID').map((cloudRegionTenant) => { + const cloudOwner:string = cloudRegionTenant["cloudOwner"]; + const cloudRegionId:string = cloudRegionTenant["cloudRegionID"]; + const name:string = this.extractLcpRegionName(cloudRegionId, cloudOwner); + const isPermitted:boolean = cloudRegionTenant["is-permitted"]; + return new LcpRegion(cloudRegionId, name, isPermitted, cloudOwner); + }); + + lcpRegionList.forEach(region => { + lcpRegionsTenantsMap[region.id] = _.filter(cloudRegionTenantList, {'cloudRegionID': region.id}) + .map((cloudRegionTenant) => { + return new Tenant(cloudRegionTenant) + }); + const reducer = (accumulator, currentValue) => { + accumulator.isPermitted = accumulator.isPermitted || currentValue.isPermitted; + + return accumulator; + }; + region.isPermitted = lcpRegionsTenantsMap[region.id].reduce(reducer).isPermitted; + }); + + return new LcpRegionsAndTenants(lcpRegionList, lcpRegionsTenantsMap); + }; + + public extractLcpRegionName(cloudRegionId: string, cloudOwner: string):string { + return this.featureFlagsService.getFlagState(Features.FLAG_1810_CR_ADD_CLOUD_OWNER_TO_MSO_REQUEST) ? + cloudRegionId+AaiService.formatCloudOwnerTrailer(cloudOwner) : cloudRegionId; + }; + + public static formatCloudOwnerTrailer(cloudOwner: string):string { + return " ("+ cloudOwner.trim().toLowerCase().replace(/^att-/, "").toUpperCase() + ")"; + } + + getServiceTypes = (subscriberId): Observable<ServiceType[]> => { + + console.log("AaiService:getSubscriptionServiceTypeList: globalCustomerId: " + subscriberId); + if (_.has(this.store.getState().service.serviceTypes, subscriberId)) { + return of(<ServiceType[]> JSON.parse(JSON.stringify(this.store.getState().service.serviceTypes[subscriberId]))); + } + + return this.getSubscriberDetails(subscriberId) + .map(this.subDetailsResponseToServiceTypes) + .do((res) => { + this.store.dispatch(updateServiceTypes(res, subscriberId)); + }); + }; + + getSubscriberDetails = (subscriberId): Observable<GetSubDetailsResponse> => { + let pathQuery: string = Constants.Path.AAI_SUB_DETAILS_PATH + subscriberId + Constants.Path.ASSIGN + Math.random(); + + if (subscriberId != null) { + return this.http.get<GetSubDetailsResponse>(pathQuery); + } + }; + + subDetailsResponseToServiceTypes = (res: GetSubDetailsResponse): ServiceType[] => { + if (res && res['service-subscriptions']) { + const serviceSubscriptions = res['service-subscriptions']['service-subscription']; + return serviceSubscriptions.map((subscription, index) => new ServiceType(String(index), subscription)) + } else { + return []; + } + }; + + + public retrieveServiceInstanceTopology(serviceInstanceId : string, subscriberId: string, serviceType: string):Observable<ServiceInstance> { + let pathQuery: string = `${Constants.Path.AAI_GET_SERVICE_INSTANCE_TOPOLOGY_PATH}${subscriberId}/${serviceType}/${serviceInstanceId}`; + return this.http.get<ServiceInstance>(pathQuery); + } + + public retrieveAndStoreServiceInstanceTopology(serviceInstanceId: string, subscriberId: string, serviceType: string, serviceModeId: string):Observable<ServiceInstance> { + return this.retrieveServiceInstanceTopology(serviceInstanceId, subscriberId, serviceType).do((service:ServiceInstance) => { + this.store.dispatch(createServiceInstance(service, serviceModeId)); + }); + }; + + + public retrieveServiceInstanceRetryTopology(jobId : string) :Observable<ServiceInstance> { + let pathQuery: string = `${Constants.Path.SERVICES_RETRY_TOPOLOGY}/${jobId}`; + return this.http.get<ServiceInstance>(pathQuery); + + // return of( + // <any>{ + // "action": "None", + // "instanceName": "LXzQMx9clZl7D6ckJ", + // "instanceId": "service-instance-id", + // "orchStatus": "GARBAGE DATA", + // "productFamilyId": null, + // "lcpCloudRegionId": null, + // "tenantId": null, + // "modelInfo": { + // "modelInvariantId": "d27e42cf-087e-4d31-88ac-6c4b7585f800", + // "modelVersionId": "6e59c5de-f052-46fa-aa7e-2fca9d674c44", + // "modelName": "vf_vEPDG", + // "modelType": "service", + // "modelVersion": "5.0" + // }, + // "globalSubscriberId": "global-customer-id", + // "subscriptionServiceType": "service-instance-type", + // "owningEntityId": null, + // "owningEntityName": null, + // "tenantName": null, + // "aicZoneId": null, + // "aicZoneName": null, + // "projectName": null, + // "rollbackOnFailure": null, + // "isALaCarte": false, + // "vnfs": { + // "1e918ade-3dc6-4cec-b952-3ff94ed82d1c": { + // "action": "None", + // "instanceName": "DgZuxjJy5LMIc3755", + // "instanceId": "1e918ade-3dc6-4cec-b952-3ff94ed82d1c", + // "orchStatus": null, + // "productFamilyId": null, + // "lcpCloudRegionId": null, + // "tenantId": null, + // "modelInfo": { + // "modelInvariantId": "vnf-instance-model-invariant-id", + // "modelVersionId": "vnf-instance-model-version-id", + // "modelType": "vnf" + // }, + // "instanceType": "SXDBMhwdR9iO0g1Uv", + // "provStatus": null, + // "inMaint": false, + // "uuid": "vnf-instance-model-version-id", + // "originalName": null, + // "legacyRegion": null, + // "lineOfBusiness": null, + // "platformName": null, + // "trackById": "1e918ade-3dc6-4cec-b952-3ff94ed82d1c", + // "vfModules": {}, + // "networks": { + // "ff464c97-ea9c-4165-996a-fe400499af3e": { + // "action": "None", + // "instanceName": "ZI0quzIpu8TNXS7nl", + // "instanceId": "ff464c97-ea9c-4165-996a-fe400499af3e", + // "orchStatus": "Assigned", + // "productFamilyId": null, + // "lcpCloudRegionId": null, + // "tenantId": null, + // "modelInfo": { + // "modelInvariantId": "network-instance-model-invariant-id", + // "modelVersionId": "network-instance-model-version-id", + // "modelType": "network" + // }, + // "instanceType": "CONTRAIL30_BASIC", + // "provStatus": "prov", + // "inMaint": false, + // "uuid": "network-instance-model-version-id", + // "originalName": null, + // "legacyRegion": null, + // "lineOfBusiness": null, + // "platformName": null, + // "trackById": "ff464c97-ea9c-4165-996a-fe400499af3e", + // "isFailed": true + // }, + // "3e41d57c-8bb4-443e-af02-9f86487ba938": { + // "action": "None", + // "instanceName": "0i9asscqSLm7Poeb8", + // "instanceId": "3e41d57c-8bb4-443e-af02-9f86487ba938", + // "orchStatus": "Created", + // "productFamilyId": null, + // "lcpCloudRegionId": null, + // "tenantId": null, + // "modelInfo": { + // "modelInvariantId": "network-instance-model-invariant-id", + // "modelVersionId": "network-instance-model-version-id", + // "modelType": "network" + // }, + // "instanceType": "CONTRAIL30_BASIC", + // "provStatus": "prov", + // "inMaint": false, + // "uuid": "network-instance-model-version-id", + // "originalName": null, + // "legacyRegion": null, + // "lineOfBusiness": null, + // "platformName": null, + // "trackById": "3e41d57c-8bb4-443e-af02-9f86487ba938", + // "isFailed": true + // } + // }, + // "isFailed": true + // }, + // "9a9b2705-c569-4f1b-9a67-13e9f86e6c55": { + // "isFailed": true, + // "action": "None", + // "instanceName": "TFn0SYhrCUs7L3qWS", + // "instanceId": "9a9b2705-c569-4f1b-9a67-13e9f86e6c55", + // "orchStatus": null, + // "productFamilyId": null, + // "lcpCloudRegionId": null, + // "tenantId": null, + // "modelInfo": { + // "modelCustomizationName": "VF_vMee 0", + // "modelInvariantId": "vnf-instance-model-invariant-id", + // "modelVersionId": "d6557200-ecf2-4641-8094-5393ae3aae60", + // "modelType": "vnf" + // }, + // "instanceType": "WIT68GUnH34VaGZgp", + // "provStatus": null, + // "inMaint": true, + // "uuid": "d6557200-ecf2-4641-8094-5393ae3aae60", + // "originalName": "VF_vMee 0", + // "legacyRegion": null, + // "lineOfBusiness": null, + // "platformName": null, + // "trackById": "9a9b2705-c569-4f1b-9a67-13e9f86e6c55", + // "vfModules": { + // "vf_vmee0..VfVmee..vmme_vlc..module-1": { + // "2c1ca484-cbc2-408b-ab86-25a2c15ce280": { + // "action": "None", + // "instanceName": "ss820f_0918_db", + // "instanceId": "2c1ca484-cbc2-408b-ab86-25a2c15ce280", + // "orchStatus": "deleted", + // "productFamilyId": null, + // "lcpCloudRegionId": null, + // "tenantId": null, + // "modelInfo": { + // "modelCustomizationName": "VfVmee..vmme_vlc..module-1", + // "modelCustomizationId": "b200727a-1bf9-4e7c-bd06-b5f4c9d920b9", + // "modelInvariantId": "09edc9ef-85d0-4b26-80de-1f569d49e750", + // "modelVersionId": "522159d5-d6e0-4c2a-aa44-5a542a12a830", + // "modelType": "vfModule" + // }, + // "instanceType": null, + // "provStatus": null, + // "inMaint": true, + // "uuid": "522159d5-d6e0-4c2a-aa44-5a542a12a830", + // "originalName": "VfVmee..vmme_vlc..module-1", + // "legacyRegion": null, + // "lineOfBusiness": null, + // "platformName": null, + // "trackById": "2c1ca484-cbc2-408b-ab86-25a2c15ce280", + // "isBase": false, + // "volumeGroupName": null, + // "isFailed": true + // } + // }, + // "dc229cd8-c132-4455-8517-5c1787c18b14": { + // "3ef042c4-259f-45e0-9aba-0989bd8d1cc5": { + // "action": "None", + // "instanceName": "ss820f_0918_base", + // "instanceId": "3ef042c4-259f-45e0-9aba-0989bd8d1cc5", + // "orchStatus": "Assigned", + // "productFamilyId": null, + // "lcpCloudRegionId": null, + // "tenantId": null, + // "modelInfo": { + // "modelCustomizationId": "8ad8670b-0541-4499-8101-275bbd0e8b6a", + // "modelInvariantId": "1e463c9c-404d-4056-ba56-28fd102608de", + // "modelVersionId": "dc229cd8-c132-4455-8517-5c1787c18b14", + // "modelType": "vfModule" + // }, + // "instanceType": null, + // "provStatus": null, + // "inMaint": false, + // "uuid": "dc229cd8-c132-4455-8517-5c1787c18b14", + // "originalName": null, + // "legacyRegion": null, + // "lineOfBusiness": null, + // "platformName": null, + // "trackById": "3ef042c4-259f-45e0-9aba-0989bd8d1cc5", + // "isBase": true, + // "volumeGroupName": null + // } + // } + // }, + // "networks": {} + // } + // }, + // "networks": { + // "e1edb09e-e68b-4ebf-adb8-e2587be56257": { + // "action": "None", + // "instanceName": "cNpGlYQDsmrUDK5iG", + // "instanceId": "e1edb09e-e68b-4ebf-adb8-e2587be56257", + // "orchStatus": "Created", + // "productFamilyId": null, + // "lcpCloudRegionId": null, + // "tenantId": null, + // "modelInfo": { + // "modelInvariantId": "network-instance-model-invariant-id", + // "modelVersionId": "ddc3f20c-08b5-40fd-af72-c6d14636b986", + // "modelType": "network" + // }, + // "instanceType": "CONTRAIL30_HIMELGUARD", + // "provStatus": "preprov", + // "inMaint": false, + // "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986", + // "originalName": null, + // "legacyRegion": null, + // "lineOfBusiness": null, + // "platformName": null, + // "trackById": "e1edb09e-e68b-4ebf-adb8-e2587be56257" + // }, + // "de4b5203-ad1c-4f2b-8843-5236fb8dc9ba": { + // "action": "None", + // "instanceName": "EI9QlSRVK0lon54Cb", + // "instanceId": "de4b5203-ad1c-4f2b-8843-5236fb8dc9ba", + // "orchStatus": "Assigned", + // "productFamilyId": null, + // "lcpCloudRegionId": null, + // "tenantId": null, + // "modelInfo": { + // "modelInvariantId": "network-instance-model-invariant-id", + // "modelVersionId": "ddc3f20c-08b5-40fd-af72-c6d14636b986", + // "modelType": "network" + // }, + // "instanceType": "CONTRAIL30_BASIC", + // "provStatus": "nvtprov", + // "inMaint": false, + // "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986", + // "originalName": null, + // "legacyRegion": null, + // "lineOfBusiness": null, + // "platformName": null, + // "trackById": "de4b5203-ad1c-4f2b-8843-5236fb8dc9ba", + // "isFailed": true + // } + // }, + // "vnfGroups": {}, + // "validationCounter": 0, + // "existingVNFCounterMap": { + // "vnf-instance-model-version-id": 1, + // "d6557200-ecf2-4641-8094-5393ae3aae60": 1 + // }, + // "existingNetworksCounterMap": { + // "ddc3f20c-08b5-40fd-af72-c6d14636b986": 2 + // }, + // "existingVnfGroupCounterMap": {} + // } + // ); + + } + + public retrieveAndStoreServiceInstanceRetryTopology(jobId: string, serviceModeId : string):Observable<ServiceInstance> { + return this.retrieveServiceInstanceRetryTopology(jobId).do((service:ServiceInstance) => { + this.store.dispatch(createServiceInstance(service, serviceModeId)); + }); + }; + + public getOptionalGroupMembers(serviceModelId: string, subscriberId: string, serviceType: string, serviceInvariantId: string, groupType: string, groupRole: string): Observable<VnfMember[]> { + let pathQuery: string = `${Constants.Path.AAI_GET_SERVICE_GROUP_MEMBERS_PATH}${subscriberId}/${serviceType}/${serviceInvariantId}/${groupType}/${groupRole}`; + if(_.has(this.store.getState().service.serviceInstance[serviceModelId].optionalGroupMembersMap,pathQuery)){ + return of(<VnfMember[]> JSON.parse(JSON.stringify(this.store.getState().service.serviceInstance[serviceModelId].optionalGroupMembersMap[pathQuery]))); + } + return this.http.get<VnfMember[]>(pathQuery) + .do((res) => { + this.store.dispatch(setOptionalMembersVnfGroupInstance(serviceModelId, pathQuery, res)) + }); + // let res = Observable.of((JSON.parse(JSON.stringify(this.loadMockMembers())))); + // return res; + + } + + //TODO: make other places use this function + extractSubscriberNameBySubscriberId(subscriberId: string) { + let result: string = null; + let filteredArray: any = _.filter(this.store.getState().service.subscribers, function (o: Subscriber) { + return o.id === subscriberId + }); + if (filteredArray.length > 0) { + result = filteredArray[0].name; + } + return result; + } + + loadMockMembers(): any { + return [ + { + "action":"None", + "instanceName":"VNF1_INSTANCE_NAME", + "instanceId":"VNF1_INSTANCE_ID", + "orchStatus":null, + "productFamilyId":null, + "lcpCloudRegionId":"mtn23b", + "tenantId":"3e9a20a3e89e45f884e09df0cc2d2d2a", + "tenantName":"APPC-24595-T-IST-02C", + "modelInfo":{ + "modelInvariantId":"vnf-instance-model-invariant-id", + "modelVersionId":"7a6ee536-f052-46fa-aa7e-2fca9d674c44", + "modelVersion":"2.0", + "modelName":"vf_vEPDG", + "modelType":"vnf" + }, + "instanceType":"VNF1_INSTANCE_TYPE", + "provStatus":null, + "inMaint":false, + "uuid":"7a6ee536-f052-46fa-aa7e-2fca9d674c44", + "originalName":null, + "legacyRegion":null, + "lineOfBusiness":null, + "platformName":null, + "trackById":"7a6ee536-f052-46fa-aa7e-2fca9d674c44:002", + "serviceInstanceId":"service-instance-id1", + "serviceInstanceName":"service-instance-name" + }, + { + "action":"None", + "instanceName":"VNF2_INSTANCE_NAME", + "instanceId":"VNF2_INSTANCE_ID", + "orchStatus":null, + "productFamilyId":null, + "lcpCloudRegionId":"mtn23b", + "tenantId":"3e9a20a3e89e45f884e09df0cc2d2d2a", + "tenantName":"APPC-24595-T-IST-02C", + "modelInfo":{ + "modelInvariantId":"vnf-instance-model-invariant-id", + "modelVersionId":"eb5f56bf-5855-4e61-bd00-3e19a953bf02", + "modelVersion":"1.0", + "modelName":"vf_vEPDG", + "modelType":"vnf" + }, + "instanceType":"VNF2_INSTANCE_TYPE", + "provStatus":null, + "inMaint":true, + "uuid":"eb5f56bf-5855-4e61-bd00-3e19a953bf02", + "originalName":null, + "legacyRegion":null, + "lineOfBusiness":null, + "platformName":null, + "trackById":"eb5f56bf-5855-4e61-bd00-3e19a953bf02:003", + "serviceInstanceId":"service-instance-id2", + "serviceInstanceName":"service-instance-name" + } + ] + + } + + +} diff --git a/vid-webpack-master/src/app/shared/services/aaiService/model/crawledAaiService.ts b/vid-webpack-master/src/app/shared/services/aaiService/model/crawledAaiService.ts new file mode 100644 index 000000000..8c27d43f7 --- /dev/null +++ b/vid-webpack-master/src/app/shared/services/aaiService/model/crawledAaiService.ts @@ -0,0 +1,30 @@ + + export interface Child { + type: string; + orchestrationStatus: string; + provStatus: string; + inMaint: boolean; + modelVersionId: string; + modelCustomizationId: string; + modelInvariantId: string; + id: string; + name: string; + children: any[]; + } + + export interface Root { + type: string; + orchestrationStatus: string; + modelVersionId: string; + modelCustomizationId: string; + modelInvariantId: string; + id: string; + name: string; + children: Child[]; + } + + export interface RootObject { + root: Root; + } + + diff --git a/vid-webpack-master/src/app/services/aaiService/responseInterfaces/getAicZonesResponseInterface.ts b/vid-webpack-master/src/app/shared/services/aaiService/responseInterfaces/getAicZonesResponseInterface.ts index 62581c9e2..62581c9e2 100644 --- a/vid-webpack-master/src/app/services/aaiService/responseInterfaces/getAicZonesResponseInterface.ts +++ b/vid-webpack-master/src/app/shared/services/aaiService/responseInterfaces/getAicZonesResponseInterface.ts diff --git a/vid-webpack-master/src/app/services/aaiService/responseInterfaces/getCategoryParamsResponseInterface.ts b/vid-webpack-master/src/app/shared/services/aaiService/responseInterfaces/getCategoryParamsResponseInterface.ts index 06398904c..06398904c 100644 --- a/vid-webpack-master/src/app/services/aaiService/responseInterfaces/getCategoryParamsResponseInterface.ts +++ b/vid-webpack-master/src/app/shared/services/aaiService/responseInterfaces/getCategoryParamsResponseInterface.ts diff --git a/vid-webpack-master/src/app/services/aaiService/responseInterfaces/getServiceModelResponseInterface.ts b/vid-webpack-master/src/app/shared/services/aaiService/responseInterfaces/getServiceModelResponseInterface.ts index 87671155d..016bb0a85 100644 --- a/vid-webpack-master/src/app/services/aaiService/responseInterfaces/getServiceModelResponseInterface.ts +++ b/vid-webpack-master/src/app/shared/services/aaiService/responseInterfaces/getServiceModelResponseInterface.ts @@ -1,4 +1,4 @@ -import {ServiceModelResponseInterface} from "../../../shared/models/serviceModel"; +import {ServiceModelResponseInterface} from "../../../models/serviceModel"; export interface GetServiceModelResponseInterface { service: ServiceModelResponseInterface diff --git a/vid-webpack-master/src/app/services/aaiService/responseInterfaces/getServicesResponseInterface.ts b/vid-webpack-master/src/app/shared/services/aaiService/responseInterfaces/getServicesResponseInterface.ts index ae04055e4..ae04055e4 100644 --- a/vid-webpack-master/src/app/services/aaiService/responseInterfaces/getServicesResponseInterface.ts +++ b/vid-webpack-master/src/app/shared/services/aaiService/responseInterfaces/getServicesResponseInterface.ts diff --git a/vid-webpack-master/src/app/services/aaiService/responseInterfaces/getSubDetailsResponseInterface.ts b/vid-webpack-master/src/app/shared/services/aaiService/responseInterfaces/getSubDetailsResponseInterface.ts index dbfb695d0..dbfb695d0 100644 --- a/vid-webpack-master/src/app/services/aaiService/responseInterfaces/getSubDetailsResponseInterface.ts +++ b/vid-webpack-master/src/app/shared/services/aaiService/responseInterfaces/getSubDetailsResponseInterface.ts diff --git a/vid-webpack-master/src/app/services/aaiService/responseInterfaces/getSubscribersResponseInterface.ts b/vid-webpack-master/src/app/shared/services/aaiService/responseInterfaces/getSubscribersResponseInterface.ts index 065f66e21..1399709a5 100644 --- a/vid-webpack-master/src/app/services/aaiService/responseInterfaces/getSubscribersResponseInterface.ts +++ b/vid-webpack-master/src/app/shared/services/aaiService/responseInterfaces/getSubscribersResponseInterface.ts @@ -1,4 +1,4 @@ -import {Subscriber} from "../../../shared/models/subscriber"; +import {Subscriber} from "../../../models/subscriber"; export interface GetSubscribersResponse { customer: Subscriber[]; diff --git a/vid-webpack-master/src/app/services/configuration.service.ts b/vid-webpack-master/src/app/shared/services/configuration.service.ts index 4edd8ffb5..6c618b5b4 100644 --- a/vid-webpack-master/src/app/services/configuration.service.ts +++ b/vid-webpack-master/src/app/shared/services/configuration.service.ts @@ -1,10 +1,11 @@ import {Injectable} from '@angular/core'; import {HttpClient} from "@angular/common/http"; -import {Constants} from "../shared/utils/constants"; -import {Observable} from 'rxjs/Observable'; -import {updateFlags} from "../global.actions"; +import {Constants} from "../utils/constants"; +import {Observable} from 'rxjs'; import {NgRedux} from "@angular-redux/store"; import {AppState} from "../store/reducers"; +import {updateFlags} from "../storeUtil/utils/global/global.actions"; +import {of} from "rxjs"; @Injectable() export class ConfigurationService { @@ -23,7 +24,7 @@ export class ConfigurationService { getFlags(): Observable<{[key: string] : boolean}> { let flags = this.store.getState().global.flags; if (flags) { - return Observable.of(flags); + return of(flags); } let pathQuery = Constants.Path.FEATURES_FLAG_PATH; return this._http.get<{[key: string] : boolean}>(pathQuery).map(response => { diff --git a/vid-webpack-master/src/app/services/data.service.ts b/vid-webpack-master/src/app/shared/services/data.service.ts index 4f8bf3623..4f8bf3623 100644 --- a/vid-webpack-master/src/app/services/data.service.ts +++ b/vid-webpack-master/src/app/shared/services/data.service.ts diff --git a/vid-webpack-master/src/app/shared/services/defaultDataServiceGenerator/default.data.generator.service.spec.ts b/vid-webpack-master/src/app/shared/services/defaultDataServiceGenerator/default.data.generator.service.spec.ts index 617dbd3da..c4ef881f0 100644 --- a/vid-webpack-master/src/app/shared/services/defaultDataServiceGenerator/default.data.generator.service.spec.ts +++ b/vid-webpack-master/src/app/shared/services/defaultDataServiceGenerator/default.data.generator.service.spec.ts @@ -1,33 +1,44 @@ -import { getTestBed, TestBed } from '@angular/core/testing'; -import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing'; -import { NgRedux } from '@angular-redux/store'; -import { DefaultDataGeneratorService } from './default.data.generator.service'; - -export class MockAppStore<T> {} +import {getTestBed, TestBed} from '@angular/core/testing'; +import {HttpClientTestingModule, HttpTestingController} from '@angular/common/http/testing'; +import {NgRedux} from '@angular-redux/store'; +import {DefaultDataGeneratorService} from './default.data.generator.service'; +import {ServiceNodeTypes} from "../../models/ServiceNodeTypes"; +import {VNFModel} from "../../models/vnfModel"; +class MockAppStore<T> {} describe('Default Data Generator Service', () => { let injector; let service: DefaultDataGeneratorService; let httpMock: HttpTestingController; - beforeEach(() => { + beforeAll(done => (async () => { TestBed.configureTestingModule({ imports: [HttpClientTestingModule], - providers: [DefaultDataGeneratorService, - {provide: NgRedux, useClass: MockAppStore}] + providers: [DefaultDataGeneratorService, + {provide: NgRedux, useClass: MockAppStore}] }); + await TestBed.compileComponents(); injector = getTestBed(); service = injector.get(DefaultDataGeneratorService); httpMock = injector.get(HttpTestingController); + })().then(done).catch(done.fail)); + + test('generateVFModule aLaCarte vf module object should missed data', () => { + const serviceHierarchy = generateServiceHierarchy(); + const vnfUUID: string = 'VF_vMee 0'; + const vnfModuleUUID: string = 'vf_vmee0..VfVmee..base_vmme..module-0'; + + let result = service.generateVFModule(serviceHierarchy.vnfs[vnfUUID].vfModules[vnfModuleUUID], [], false, true); + expect(result.isMissingData).toBeTruthy(); }); - it('generateVFModule should create vf module object', () => { + test('generateVFModule should create vf module object', () => { const serviceHierarchy = generateServiceHierarchy(); const vnfUUID: string = 'VF_vMee 0'; const vnfModuleUUID: string = 'vf_vmee0..VfVmee..base_vmme..module-0'; - let result = service.generateVFModule(serviceHierarchy, vnfUUID, vnfModuleUUID); + let result = service.generateVFModule(serviceHierarchy.vnfs[vnfUUID].vfModules[vnfModuleUUID], [], false, false); expect(result.modelInfo.modelType).toEqual('VFmodule'); expect(result.modelInfo.modelInvariantId).toEqual(serviceHierarchy.vnfs[vnfUUID].vfModules[vnfModuleUUID].invariantUuid); @@ -37,15 +48,16 @@ describe('Default Data Generator Service', () => { expect(result.modelInfo.modelCustomizationId).toEqual(serviceHierarchy.vnfs[vnfUUID].vfModules[vnfModuleUUID].customizationUuid); expect(result.modelInfo.modelCustomizationName).toEqual(serviceHierarchy.vnfs[vnfUUID].vfModules[vnfModuleUUID].modelCustomizationName); expect(result.sdncPreReload).toBeNull(); + expect(result.isMissingData).toBeTruthy(); + expect(result.instanceParams).toEqual([{}]); }); - it('generateVNFData should create vnf object', () => { + test('generateVNFData should create vnf object', () => { const serviceHierarchy = generateServiceHierarchy(); const vnfName: string = 'VF_vMee 0'; const formValues = generateVNFFormValues(); - const vfUUID: string = 'vf_vmee0..VfVmee..base_vmme..module-0'; - let result = service.generateVNFData(serviceHierarchy, vnfName, vfUUID, formValues); + let result = service.generateVNFData(serviceHierarchy, vnfName, formValues, false); expect(result.productFamilyId).toEqual(formValues.productFamilyId); expect(result.lcpCloudRegionId).toBeNull(); @@ -57,17 +69,343 @@ describe('Default Data Generator Service', () => { expect(result.modelInfo.modelVersionId).toEqual(formValues.modelInfo.modelVersionId); expect(result.modelInfo.modelName).toEqual(serviceHierarchy.vnfs[vnfName].name); expect(result.modelInfo.modelVersion).toEqual(serviceHierarchy.vnfs[vnfName].version); - expect(result.modelInfo.modelCustomizationId).toEqual(serviceHierarchy.vnfs[vnfName].modelCustomizationId); + expect(result.modelInfo.modelCustomizationId).toEqual(serviceHierarchy.vnfs[vnfName].customizationUuid); + expect(result.modelInfo.modelUniqueId).toEqual(serviceHierarchy.vnfs[vnfName].customizationUuid); expect(result.modelInfo.modelCustomizationName).toEqual(serviceHierarchy.vnfs[vnfName].modelCustomizationName); + expect(result.isMissingData).toBeTruthy(); + }); + + describe('#updateDynamicInputsVnfDataFromModel', () => { + test('get vfModule instance params', () => { + let dynamicInputs = service.updateDynamicInputsVnfDataFromModel(ServiceNodeTypes.VFmodule, generateVFModule()); + expect(dynamicInputs).toEqual([{ + id: '2017488_adiodvpe0_vnf_config_template_version', + type: 'string', + name: '2017488_adiodvpe0_vnf_config_template_version', + value: '17.2', + isRequired: true, + description: 'VPE Software Version' + }, { + id: '2017488_adiodvpe0_AIC_CLLI', + type: 'string', + name: '2017488_adiodvpe0_AIC_CLLI', + value: 'ATLMY8GA', + isRequired: true, + description: 'AIC Site CLLI' + }]); + + /*get vfModule with no instance params should return empty array*/ + dynamicInputs = service.updateDynamicInputsVnfDataFromModel(ServiceNodeTypes.VFmodule, generateVFModule2); + expect(dynamicInputs).toEqual([]); + + /*get vf instance params should be undefined*/ + dynamicInputs = service.updateDynamicInputsVnfDataFromModel(ServiceNodeTypes.VF, generateVNF()); + expect(dynamicInputs).toEqual([]); + }); + }); + + describe('#createNewVfModuleTreeNode', () => { + test('createNewVfModuleTreeNode with isEcompGeneratedNaming instance name not fill - missing data true', () => { + const vnfModuleUUID: string = 'vf_vmee0..VfVmee..base_vmme..module-0'; + const vfModuleModel = generateServiceHierarchy().vnfs['VF_vMee 0'].vfModules['vf_vmee0..VfVmee..base_vmme..module-0']; + const newVfModule = service.createNewVfModuleTreeNode(<any>{ + instanceName: "", + instanceParams: {}, + volumeGroupName: "", + isMissingData : false, + trackById: Math.random().toString() + }, vfModuleModel, vnfModuleUUID, false, [], ""); + expect(newVfModule.name).toEqual('<Automatically Assigned>'); + expect(newVfModule.missingData).toEqual(true); + }); + + test('createNewVfModuleTreeNode without isEcompGeneratedNaming missing data false', () => { + const vnfModuleUUID: string = 'vf_vmee0..VfVmee..base_vmme..module-0'; + const vfModuleModel = generateServiceHierarchy().vnfs['VF_vMee 0'].vfModules['vf_vmee0..VfVmee..base_vmme..module-0']; + const newVfModule = service.createNewVfModuleTreeNode(<any>{ + instanceName: "", + instanceParams: {}, + volumeGroupName: "", + isMissingData : false, + trackById: Math.random().toString() + }, vfModuleModel, vnfModuleUUID, true, [], ""); + expect(newVfModule.name).toEqual('<Automatically Assigned>'); + expect(newVfModule.missingData).toEqual(false); + }); + }); + + describe('#createNewVnfTreeNode', () => { + test('createNewVnfTreeNode with isEcompGeneratedNaming instance name not filled - missing data true', () => { + const vnfModel = generateServiceHierarchy().vnfs['VF_vMee 0']; + const newVnf = service.createNewTreeNode({ + uuid : '', + instanceName: "", + productFamilyId: "productFamilyId", + lcpCloudRegionId: "lcpCloudRegionId", + legacyRegion: "legacyRegion", + tenantId: "tenantId", + platformName: "platformName", + lineOfBusiness: "lineOfBusiness", + rollbackOnFailure: "rollbackOnFailure", + originalName : null, + vfModules: {}, + isMissingData: false, + trackById: Math.random().toString(), + vnfStoreKey: "abc" + }, new VNFModel(vnfModel),'VF_vMee 0', 'vnfs'); + expect(newVnf.name).toEqual('VF_vMee 0'); + expect(newVnf.missingData).toEqual(true); + }); + + test('createNewVnfTreeNode with isEcompGeneratedNaming instance name filled - missing data false', () => { + const vnfModel = generateServiceHierarchy().vnfs['VF_vMee 0']; + const newVnf = service.createNewTreeNode({ + uuid : '', + instanceName: "instanceName", + productFamilyId: "productFamilyId", + lcpCloudRegionId: "lcpCloudRegionId", + legacyRegion: "legacyRegion", + tenantId: "tenantId", + platformName: "platformName", + lineOfBusiness: "lineOfBusiness", + rollbackOnFailure: "rollbackOnFailure", + originalName : null, + vfModules: {}, + isMissingData: false, + trackById: Math.random().toString(), + vnfStoreKey: "abc" + }, vnfModel,'VF_vMee 0', 'vnfs'); + expect(newVnf.name).toEqual("instanceName"); + expect(newVnf.missingData).toEqual(false); + }); }); + }); function generateServiceHierarchy() { - return JSON.parse('{"service":{"uuid":"6e59c5de-f052-46fa-aa7e-2fca9d674c44","invariantUuid":"e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0","name":"ComplexService","version":"1.0","toscaModelURL":null,"category":"Mobility","serviceType":"","serviceRole":"","description":"ComplexService","serviceEcompNaming":"true","instantiationType":"Macro","inputs":{}},"vnfs":{"VF_vMee 0":{"uuid":"d6557200-ecf2-4641-8094-5393ae3aae60","invariantUuid":"4160458e-f648-4b30-a176-43881ffffe9e","description":"VSP_vMee","name":"VF_vMee","version":"2.0","customizationUuid":"91415b44-753d-494c-926a-456a9172bbb9","inputs":{},"commands":{},"properties":{"gpb2_Internal2_mac":"00:80:37:0E:02:22","sctp-b-ipv6-egress_src_start_port":"0","sctp-a-ipv6-egress_rule_application":"any","Internal2_allow_transit":"true","sctp-b-IPv6_ethertype":"IPv6","sctp-a-egress_rule_application":"any","sctp-b-ingress_action":"pass","sctp-b-ingress_rule_protocol":"icmp","ncb2_Internal1_mac":"00:80:37:0E:0F:12","sctp-b-ipv6-ingress-src_start_port":"0.0","ncb1_Internal2_mac":"00:80:37:0E:09:12","fsb_volume_size_0":"320.0","sctp-b-egress_src_addresses":"local","sctp-a-ipv6-ingress_ethertype":"IPv4","sctp-a-ipv6-ingress-dst_start_port":"0","sctp-b-ipv6-ingress_rule_application":"any","domain_name":"default-domain","sctp-a-ingress_rule_protocol":"icmp","sctp-b-egress-src_start_port":"0.0","sctp-a-egress_src_addresses":"local","sctp-b-display_name":"epc-sctp-b-ipv4v6-sec-group","sctp-a-egress-src_start_port":"0.0","sctp-a-ingress_ethertype":"IPv4","sctp-b-ipv6-ingress-dst_end_port":"65535","sctp-b-dst_subnet_prefix_v6":"::","nf_naming":"{ecomp_generated_naming=true}","sctp-a-ipv6-ingress_src_subnet_prefix":"0.0.0.0","sctp-b-egress-dst_start_port":"0.0","ncb_flavor_name":"nv.c20r64d1","gpb1_Internal1_mac":"00:80:37:0E:01:22","sctp-b-egress_dst_subnet_prefix_len":"0.0","Internal2_net_cidr":"169.255.0.0","sctp-a-ingress-dst_start_port":"0.0","sctp-a-egress-dst_start_port":"0.0","fsb1_Internal2_mac":"00:80:37:0E:0B:12","sctp-a-egress_ethertype":"IPv4","vlc_st_service_mode":"in-network-nat","sctp-a-ipv6-egress_ethertype":"IPv4","sctp-a-egress-src_end_port":"65535.0","sctp-b-ipv6-egress_rule_application":"any","sctp-b-egress_action":"pass","sctp-a-ingress-src_subnet_prefix_len":"0.0","sctp-b-ipv6-ingress-src_end_port":"65535.0","sctp-b-name":"epc-sctp-b-ipv4v6-sec-group","fsb2_Internal1_mac":"00:80:37:0E:0D:12","sctp-a-ipv6-ingress-src_start_port":"0.0","sctp-b-ipv6-egress_ethertype":"IPv4","Internal1_net_cidr":"169.253.0.0","sctp-a-egress_dst_subnet_prefix":"0.0.0.0","fsb_flavor_name":"nv.c20r64d1","sctp_rule_protocol":"132","sctp-b-ipv6-ingress_src_subnet_prefix_len":"0","sctp-a-ipv6-ingress_rule_application":"any","ecomp_generated_naming":"true","sctp-a-IPv6_ethertype":"IPv6","vlc2_Internal1_mac":"00:80:37:0E:02:12","vlc_st_virtualization_type":"virtual-machine","sctp-b-ingress-dst_start_port":"0.0","sctp-b-ingress-dst_end_port":"65535.0","sctp-a-ipv6-ingress-src_end_port":"65535.0","sctp-a-display_name":"epc-sctp-a-ipv4v6-sec-group","sctp-b-ingress_rule_application":"any","int2_sec_group_name":"int2-sec-group","vlc_flavor_name":"nd.c16r64d1","sctp-b-ipv6-egress_src_addresses":"local","vlc_st_interface_type_int1":"other1","sctp-b-egress-src_end_port":"65535.0","sctp-a-ipv6-egress-dst_start_port":"0","vlc_st_interface_type_int2":"other2","sctp-a-ipv6-egress_rule_protocol":"any","Internal2_shared":"false","sctp-a-ipv6-egress_dst_subnet_prefix_len":"0","Internal2_rpf":"disable","vlc1_Internal1_mac":"00:80:37:0E:01:12","sctp-b-ipv6-egress_src_end_port":"65535","sctp-a-ipv6-egress_src_addresses":"local","sctp-a-ingress-dst_end_port":"65535.0","sctp-a-ipv6-egress_src_end_port":"65535","Internal1_forwarding_mode":"l2","Internal2_dhcp":"false","sctp-a-dst_subnet_prefix_v6":"::","pxe_image_name":"MME_PXE-Boot_16ACP04_GA.qcow2","vlc_st_interface_type_gtp":"other0","ncb1_Internal1_mac":"00:80:37:0E:09:12","sctp-b-src_subnet_prefix_v6":"::","sctp-a-egress_dst_subnet_prefix_len":"0.0","int1_sec_group_name":"int1-sec-group","Internal1_dhcp":"false","sctp-a-ipv6-egress_dst_end_port":"65535","Internal2_forwarding_mode":"l2","fsb2_Internal2_mac":"00:80:37:0E:0D:12","sctp-b-egress_dst_subnet_prefix":"0.0.0.0","Internal1_net_cidr_len":"17","gpb2_Internal1_mac":"00:80:37:0E:02:22","sctp-b-ingress-src_subnet_prefix_len":"0.0","sctp-a-ingress_dst_addresses":"local","sctp-a-egress_action":"pass","fsb_volume_type_0":"SF-Default-SSD","ncb2_Internal2_mac":"00:80:37:0E:0F:12","vlc_st_interface_type_sctp_a":"left","vlc_st_interface_type_sctp_b":"right","sctp-a-src_subnet_prefix_v6":"::","vlc_st_version":"2","sctp-b-egress_ethertype":"IPv4","sctp-a-ingress_rule_application":"any","gpb1_Internal2_mac":"00:80:37:0E:01:22","instance_ip_family_v6":"v6","sctp-a-ipv6-egress_src_start_port":"0","sctp-b-ingress-src_start_port":"0.0","sctp-b-ingress_dst_addresses":"local","fsb1_Internal1_mac":"00:80:37:0E:0B:12","vlc_st_interface_type_oam":"management","multi_stage_design":"false","oam_sec_group_name":"oam-sec-group","Internal2_net_gateway":"169.255.0.3","sctp-a-ipv6-ingress-dst_end_port":"65535","sctp-b-ipv6-egress-dst_start_port":"0","Internal1_net_gateway":"169.253.0.3","sctp-b-ipv6-egress_rule_protocol":"any","gtp_sec_group_name":"gtp-sec-group","sctp-a-ipv6-egress_dst_subnet_prefix":"0.0.0.0","sctp-b-ipv6-egress_dst_subnet_prefix_len":"0","sctp-a-ipv6-ingress_dst_addresses":"local","sctp-a-egress_rule_protocol":"icmp","sctp-b-ipv6-egress_action":"pass","sctp-a-ipv6-egress_action":"pass","Internal1_shared":"false","sctp-b-ipv6-ingress_rule_protocol":"any","Internal2_net_cidr_len":"17","sctp-a-name":"epc-sctp-a-ipv4v6-sec-group","sctp-a-ingress-src_end_port":"65535.0","sctp-b-ipv6-ingress_src_subnet_prefix":"0.0.0.0","sctp-a-egress-dst_end_port":"65535.0","sctp-a-ingress_action":"pass","sctp-b-egress_rule_protocol":"icmp","sctp-b-ipv6-ingress_action":"pass","vlc_st_service_type":"firewall","sctp-b-ipv6-egress_dst_end_port":"65535","sctp-b-ipv6-ingress-dst_start_port":"0","vlc2_Internal2_mac":"00:80:37:0E:02:12","vlc_st_availability_zone":"true","fsb_volume_image_name_1":"MME_FSB2_16ACP04_GA.qcow2","sctp-b-ingress-src_subnet_prefix":"0.0.0.0","sctp-a-ipv6-ingress_src_subnet_prefix_len":"0","Internal1_allow_transit":"true","gpb_flavor_name":"nv.c20r64d1","availability_zone_max_count":"1","fsb_volume_image_name_0":"MME_FSB1_16ACP04_GA.qcow2","sctp-b-ipv6-ingress_dst_addresses":"local","sctp-b-ipv6-egress_dst_subnet_prefix":"0.0.0.0","sctp-b-ipv6-ingress_ethertype":"IPv4","vlc1_Internal2_mac":"00:80:37:0E:01:12","sctp-a-ingress-src_subnet_prefix":"0.0.0.0","sctp-a-ipv6-ingress_action":"pass","Internal1_rpf":"disable","sctp-b-ingress_ethertype":"IPv4","sctp-b-egress_rule_application":"any","sctp-b-ingress-src_end_port":"65535.0","sctp-a-ipv6-ingress_rule_protocol":"any","sctp-a-ingress-src_start_port":"0.0","sctp-b-egress-dst_end_port":"65535.0"},"type":"VF","modelCustomizationName":"VF_vMee 0","vfModules":{"vf_vmee0..VfVmee..vmme_vlc..module-1":{"uuid":"522159d5-d6e0-4c2a-aa44-5a542a12a830","invariantUuid":"98a7c88b-b577-476a-90e4-e25a5871e02b","customizationUuid":"55b1be94-671a-403e-a26c-667e9c47d091","description":null,"name":"VfVmee..vmme_vlc..module-1","version":"2","modelCustomizationName":"VfVmee..vmme_vlc..module-1","properties":{"minCountInstances":0,"maxCountInstances":null,"initialCount":0,"vfModuleLabel":"vmme_vlc"},"inputs":{},"volumeGroupAllowed":false},"vf_vmee0..VfVmee..vmme_gpb..module-2":{"uuid":"41708296-e443-4c71-953f-d9a010f059e1","invariantUuid":"1cca90b8-3490-495e-87da-3f3e4c57d5b9","customizationUuid":"6add59e0-7fe1-4bc4-af48-f8812422ae7c","description":null,"name":"VfVmee..vmme_gpb..module-2","version":"2","modelCustomizationName":"VfVmee..vmme_gpb..module-2","properties":{"minCountInstances":0,"maxCountInstances":null,"initialCount":0,"vfModuleLabel":"vmme_gpb"},"inputs":{},"volumeGroupAllowed":false},"vf_vmee0..VfVmee..base_vmme..module-0":{"uuid":"a27f5cfc-7f12-4f99-af08-0af9c3885c87","invariantUuid":"a6f9e51a-2b35-416a-ae15-15e58d61f36d","customizationUuid":"f8c040f1-7e51-4a11-aca8-acf256cfd861","description":null,"name":"VfVmee..base_vmme..module-0","version":"2","modelCustomizationName":"VfVmee..base_vmme..module-0","properties":{"minCountInstances":1,"maxCountInstances":1,"initialCount":1,"vfModuleLabel":"base_vmme"},"inputs":{},"volumeGroupAllowed":true}},"volumeGroups":{"vf_vmee0..VfVmee..base_vmme..module-0":{"uuid":"a27f5cfc-7f12-4f99-af08-0af9c3885c87","invariantUuid":"a6f9e51a-2b35-416a-ae15-15e58d61f36d","customizationUuid":"f8c040f1-7e51-4a11-aca8-acf256cfd861","description":null,"name":"VfVmee..base_vmme..module-0","version":"2","modelCustomizationName":"VfVmee..base_vmme..module-0","properties":{"minCountInstances":1,"maxCountInstances":1,"initialCount":1,"vfModuleLabel":"base_vmme"},"inputs":{}}},"vfcInstanceGroups":{}}},"networks":{"ExtVL 0":{"uuid":"ddc3f20c-08b5-40fd-af72-c6d14636b986","invariantUuid":"379f816b-a7aa-422f-be30-17114ff50b7c","description":"ECOMP generic virtual link (network) base type for all other service-level and global networks","name":"ExtVL","version":"37.0","customizationUuid":"94fdd893-4a36-4d70-b16a-ec29c54c184f","inputs":{},"commands":{},"properties":{"network_assignments":"{is_external_network=false, ipv4_subnet_default_assignment={min_subnets_count=1}, ecomp_generated_network_assignment=false, ipv6_subnet_default_assignment={min_subnets_count=1}}","exVL_naming":"{ecomp_generated_naming=true}","network_flows":"{is_network_policy=false, is_bound_to_vpn=false}","network_homing":"{ecomp_selected_instance_node_target=false}"},"type":"VL","modelCustomizationName":"ExtVL 0"}},"collectionResource":{},"configurations":{"Port Mirroring Configuration By Policy 0":{"uuid":"b4398538-e89d-4f13-b33d-ca323434ba50","invariantUuid":"6ef0ca40-f366-4897-951f-abd65d25f6f7","description":"A port mirroring configuration by policy object","name":"Port Mirroring Configuration By Policy","version":"27.0","customizationUuid":"3c3b7b8d-8669-4b3b-8664-61970041fad2","inputs":{},"commands":{},"properties":{},"type":"Configuration","modelCustomizationName":"Port Mirroring Configuration By Policy 0","sourceNodes":[],"collectorNodes":null,"configurationByPolicy":false}},"serviceProxies":{},"vfModules":{"vf_vmee0..VfVmee..vmme_vlc..module-1":{"uuid":"522159d5-d6e0-4c2a-aa44-5a542a12a830","invariantUuid":"98a7c88b-b577-476a-90e4-e25a5871e02b","customizationUuid":"55b1be94-671a-403e-a26c-667e9c47d091","description":null,"name":"VfVmee..vmme_vlc..module-1","version":"2","modelCustomizationName":"VfVmee..vmme_vlc..module-1","properties":{"minCountInstances":0,"maxCountInstances":null,"initialCount":0,"vfModuleLabel":"vmme_vlc"},"inputs":{},"volumeGroupAllowed":false},"vf_vmee0..VfVmee..vmme_gpb..module-2":{"uuid":"41708296-e443-4c71-953f-d9a010f059e1","invariantUuid":"1cca90b8-3490-495e-87da-3f3e4c57d5b9","customizationUuid":"6add59e0-7fe1-4bc4-af48-f8812422ae7c","description":null,"name":"VfVmee..vmme_gpb..module-2","version":"2","modelCustomizationName":"VfVmee..vmme_gpb..module-2","properties":{"minCountInstances":0,"maxCountInstances":null,"initialCount":0,"vfModuleLabel":"vmme_gpb"},"inputs":{},"volumeGroupAllowed":false},"vf_vmee0..VfVmee..base_vmme..module-0":{"uuid":"a27f5cfc-7f12-4f99-af08-0af9c3885c87","invariantUuid":"a6f9e51a-2b35-416a-ae15-15e58d61f36d","customizationUuid":"f8c040f1-7e51-4a11-aca8-acf256cfd861","description":null,"name":"VfVmee..base_vmme..module-0","version":"2","modelCustomizationName":"VfVmee..base_vmme..module-0","properties":{"minCountInstances":1,"maxCountInstances":1,"initialCount":1,"vfModuleLabel":"base_vmme"},"inputs":{},"volumeGroupAllowed":true}},"volumeGroups":{"vf_vmee0..VfVmee..base_vmme..module-0":{"uuid":"a27f5cfc-7f12-4f99-af08-0af9c3885c87","invariantUuid":"a6f9e51a-2b35-416a-ae15-15e58d61f36d","customizationUuid":"f8c040f1-7e51-4a11-aca8-acf256cfd861","description":null,"name":"VfVmee..base_vmme..module-0","version":"2","modelCustomizationName":"VfVmee..base_vmme..module-0","properties":{"minCountInstances":1,"maxCountInstances":1,"initialCount":1,"vfModuleLabel":"base_vmme"},"inputs":{}}},"pnfs":{}}'); + return JSON.parse('{"service":{"uuid":"6e59c5de-f052-46fa-aa7e-2fca9d674c44","invariantUuid":"e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0","name":"ComplexService","version":"1.0","toscaModelURL":null,"category":"Emanuel","serviceType":"","serviceRole":"","description":"ComplexService","serviceEcompNaming":"true","instantiationType":"Macro","inputs":{}},"vnfs":{"VF_vMee 0":{"uuid":"d6557200-ecf2-4641-8094-5393ae3aae60","invariantUuid":"4160458e-f648-4b30-a176-43881ffffe9e","description":"VSP_vMee","name":"VF_vMee","version":"2.0","customizationUuid":"91415b44-753d-494c-926a-456a9172bbb9","inputs":{},"commands":{},"properties":{"gpb2_Internal2_mac":"00:11:22:EF:AC:DF","sctp-b-ipv6-egress_src_start_port":"0","sctp-a-ipv6-egress_rule_application":"any","Internal2_allow_transit":"true","sctp-b-IPv6_ethertype":"IPv6","sctp-a-egress_rule_application":"any","sctp-b-ingress_action":"pass","sctp-b-ingress_rule_protocol":"icmp","ncb2_Internal1_mac":"00:11:22:EF:AC:DF","sctp-b-ipv6-ingress-src_start_port":"0.0","ncb1_Internal2_mac":"00:11:22:EF:AC:DF","fsb_volume_size_0":"320.0","sctp-b-egress_src_addresses":"local","sctp-a-ipv6-ingress_ethertype":"IPv4","sctp-a-ipv6-ingress-dst_start_port":"0","sctp-b-ipv6-ingress_rule_application":"any","domain_name":"default-domain","sctp-a-ingress_rule_protocol":"icmp","sctp-b-egress-src_start_port":"0.0","sctp-a-egress_src_addresses":"local","sctp-b-display_name":"epc-sctp-b-ipv4v6-sec-group","sctp-a-egress-src_start_port":"0.0","sctp-a-ingress_ethertype":"IPv4","sctp-b-ipv6-ingress-dst_end_port":"65535","sctp-b-dst_subnet_prefix_v6":"::","nf_naming":"{ecomp_generated_naming=true}","sctp-a-ipv6-ingress_src_subnet_prefix":"0.0.0.0","sctp-b-egress-dst_start_port":"0.0","ncb_flavor_name":"nv.c20r64d1","gpb1_Internal1_mac":"00:11:22:EF:AC:DF","sctp-b-egress_dst_subnet_prefix_len":"0.0","Internal2_net_cidr":"10.0.0.10","sctp-a-ingress-dst_start_port":"0.0","sctp-a-egress-dst_start_port":"0.0","fsb1_Internal2_mac":"00:11:22:EF:AC:DF","sctp-a-egress_ethertype":"IPv4","vlc_st_service_mode":"in-network-nat","sctp-a-ipv6-egress_ethertype":"IPv4","sctp-a-egress-src_end_port":"65535.0","sctp-b-ipv6-egress_rule_application":"any","sctp-b-egress_action":"pass","sctp-a-ingress-src_subnet_prefix_len":"0.0","sctp-b-ipv6-ingress-src_end_port":"65535.0","sctp-b-name":"epc-sctp-b-ipv4v6-sec-group","fsb2_Internal1_mac":"00:11:22:EF:AC:DF","sctp-a-ipv6-ingress-src_start_port":"0.0","sctp-b-ipv6-egress_ethertype":"IPv4","Internal1_net_cidr":"10.0.0.10","sctp-a-egress_dst_subnet_prefix":"0.0.0.0","fsb_flavor_name":"nv.c20r64d1","sctp_rule_protocol":"132","sctp-b-ipv6-ingress_src_subnet_prefix_len":"0","sctp-a-ipv6-ingress_rule_application":"any","ecomp_generated_naming":"false","sctp-a-IPv6_ethertype":"IPv6","vlc2_Internal1_mac":"00:11:22:EF:AC:DF","vlc_st_virtualization_type":"virtual-machine","sctp-b-ingress-dst_start_port":"0.0","sctp-b-ingress-dst_end_port":"65535.0","sctp-a-ipv6-ingress-src_end_port":"65535.0","sctp-a-display_name":"epc-sctp-a-ipv4v6-sec-group","sctp-b-ingress_rule_application":"any","int2_sec_group_name":"int2-sec-group","vlc_flavor_name":"nd.c16r64d1","sctp-b-ipv6-egress_src_addresses":"local","vlc_st_interface_type_int1":"other1","sctp-b-egress-src_end_port":"65535.0","sctp-a-ipv6-egress-dst_start_port":"0","vlc_st_interface_type_int2":"other2","sctp-a-ipv6-egress_rule_protocol":"any","Internal2_shared":"false","sctp-a-ipv6-egress_dst_subnet_prefix_len":"0","Internal2_rpf":"disable","vlc1_Internal1_mac":"00:11:22:EF:AC:DF","sctp-b-ipv6-egress_src_end_port":"65535","sctp-a-ipv6-egress_src_addresses":"local","sctp-a-ingress-dst_end_port":"65535.0","sctp-a-ipv6-egress_src_end_port":"65535","Internal1_forwarding_mode":"l2","Internal2_dhcp":"false","sctp-a-dst_subnet_prefix_v6":"::","pxe_image_name":"MME_PXE-Boot_16ACP04_GA.qcow2","vlc_st_interface_type_gtp":"other0","ncb1_Internal1_mac":"00:11:22:EF:AC:DF","sctp-b-src_subnet_prefix_v6":"::","sctp-a-egress_dst_subnet_prefix_len":"0.0","int1_sec_group_name":"int1-sec-group","Internal1_dhcp":"false","sctp-a-ipv6-egress_dst_end_port":"65535","Internal2_forwarding_mode":"l2","fsb2_Internal2_mac":"00:11:22:EF:AC:DF","sctp-b-egress_dst_subnet_prefix":"0.0.0.0","Internal1_net_cidr_len":"17","gpb2_Internal1_mac":"00:11:22:EF:AC:DF","sctp-b-ingress-src_subnet_prefix_len":"0.0","sctp-a-ingress_dst_addresses":"local","sctp-a-egress_action":"pass","fsb_volume_type_0":"SF-Default-SSD","ncb2_Internal2_mac":"00:11:22:EF:AC:DF","vlc_st_interface_type_sctp_a":"left","vlc_st_interface_type_sctp_b":"right","sctp-a-src_subnet_prefix_v6":"::","vlc_st_version":"2","sctp-b-egress_ethertype":"IPv4","sctp-a-ingress_rule_application":"any","gpb1_Internal2_mac":"00:11:22:EF:AC:DF","instance_ip_family_v6":"v6","sctp-a-ipv6-egress_src_start_port":"0","sctp-b-ingress-src_start_port":"0.0","sctp-b-ingress_dst_addresses":"local","fsb1_Internal1_mac":"00:11:22:EF:AC:DF","vlc_st_interface_type_oam":"management","multi_stage_design":"false","oam_sec_group_name":"oam-sec-group","Internal2_net_gateway":"10.0.0.10","sctp-a-ipv6-ingress-dst_end_port":"65535","sctp-b-ipv6-egress-dst_start_port":"0","Internal1_net_gateway":"10.0.0.10","sctp-b-ipv6-egress_rule_protocol":"any","gtp_sec_group_name":"gtp-sec-group","sctp-a-ipv6-egress_dst_subnet_prefix":"0.0.0.0","sctp-b-ipv6-egress_dst_subnet_prefix_len":"0","sctp-a-ipv6-ingress_dst_addresses":"local","sctp-a-egress_rule_protocol":"icmp","sctp-b-ipv6-egress_action":"pass","sctp-a-ipv6-egress_action":"pass","Internal1_shared":"false","sctp-b-ipv6-ingress_rule_protocol":"any","Internal2_net_cidr_len":"17","sctp-a-name":"epc-sctp-a-ipv4v6-sec-group","sctp-a-ingress-src_end_port":"65535.0","sctp-b-ipv6-ingress_src_subnet_prefix":"0.0.0.0","sctp-a-egress-dst_end_port":"65535.0","sctp-a-ingress_action":"pass","sctp-b-egress_rule_protocol":"icmp","sctp-b-ipv6-ingress_action":"pass","vlc_st_service_type":"firewall","sctp-b-ipv6-egress_dst_end_port":"65535","sctp-b-ipv6-ingress-dst_start_port":"0","vlc2_Internal2_mac":"00:11:22:EF:AC:DF","vlc_st_availability_zone":"true","fsb_volume_image_name_1":"MME_FSB2_16ACP04_GA.qcow2","sctp-b-ingress-src_subnet_prefix":"0.0.0.0","sctp-a-ipv6-ingress_src_subnet_prefix_len":"0","Internal1_allow_transit":"true","gpb_flavor_name":"nv.c20r64d1","availability_zone_max_count":"1","fsb_volume_image_name_0":"MME_FSB1_16ACP04_GA.qcow2","sctp-b-ipv6-ingress_dst_addresses":"local","sctp-b-ipv6-egress_dst_subnet_prefix":"0.0.0.0","sctp-b-ipv6-ingress_ethertype":"IPv4","vlc1_Internal2_mac":"00:11:22:EF:AC:DF","sctp-a-ingress-src_subnet_prefix":"0.0.0.0","sctp-a-ipv6-ingress_action":"pass","Internal1_rpf":"disable","sctp-b-ingress_ethertype":"IPv4","sctp-b-egress_rule_application":"any","sctp-b-ingress-src_end_port":"65535.0","sctp-a-ipv6-ingress_rule_protocol":"any","sctp-a-ingress-src_start_port":"0.0","sctp-b-egress-dst_end_port":"65535.0"},"type":"VF","modelCustomizationName":"VF_vMee 0","vfModules":{"vf_vmee0..VfVmee..vmme_vlc..module-1":{"uuid":"522159d5-d6e0-4c2a-aa44-5a542a12a830","invariantUuid":"98a7c88b-b577-476a-90e4-e25a5871e02b","customizationUuid":"55b1be94-671a-403e-a26c-667e9c47d091","description":null,"name":"VfVmee..vmme_vlc..module-1","version":"2","modelCustomizationName":"VfVmee..vmme_vlc..module-1","properties":{"minCountInstances":0,"maxCountInstances":null,"initialCount":0,"vfModuleLabel":"vmme_vlc"},"inputs":{},"volumeGroupAllowed":false},"vf_vmee0..VfVmee..vmme_gpb..module-2":{"uuid":"41708296-e443-4c71-953f-d9a010f059e1","invariantUuid":"1cca90b8-3490-495e-87da-3f3e4c57d5b9","customizationUuid":"6add59e0-7fe1-4bc4-af48-f8812422ae7c","description":null,"name":"VfVmee..vmme_gpb..module-2","version":"2","modelCustomizationName":"VfVmee..vmme_gpb..module-2","properties":{"minCountInstances":0,"maxCountInstances":null,"initialCount":0,"vfModuleLabel":"vmme_gpb"},"inputs":{},"volumeGroupAllowed":false},"vf_vmee0..VfVmee..base_vmme..module-0":{"uuid":"a27f5cfc-7f12-4f99-af08-0af9c3885c87","invariantUuid":"a6f9e51a-2b35-416a-ae15-15e58d61f36d","customizationUuid":"f8c040f1-7e51-4a11-aca8-acf256cfd861","description":null,"name":"VfVmee..base_vmme..module-0","version":"2","modelCustomizationName":"VfVmee..base_vmme..module-0","properties":{"minCountInstances":1,"maxCountInstances":1,"initialCount":1,"vfModuleLabel":"base_vmme"},"inputs":{},"volumeGroupAllowed":true}},"volumeGroups":{"vf_vmee0..VfVmee..base_vmme..module-0":{"uuid":"a27f5cfc-7f12-4f99-af08-0af9c3885c87","invariantUuid":"a6f9e51a-2b35-416a-ae15-15e58d61f36d","customizationUuid":"f8c040f1-7e51-4a11-aca8-acf256cfd861","description":null,"name":"VfVmee..base_vmme..module-0","version":"2","modelCustomizationName":"VfVmee..base_vmme..module-0","properties":{"minCountInstances":1,"maxCountInstances":1,"initialCount":1,"vfModuleLabel":"base_vmme"},"inputs":{}}},"vfcInstanceGroups":{}}},"networks":{"ExtVL 0":{"uuid":"ddc3f20c-08b5-40fd-af72-c6d14636b986","invariantUuid":"379f816b-a7aa-422f-be30-17114ff50b7c","description":"ECOMP generic virtual link (network) base type for all other service-level and global networks","name":"ExtVL","version":"37.0","customizationUuid":"94fdd893-4a36-4d70-b16a-ec29c54c184f","inputs":{},"commands":{},"properties":{"network_assignments":"{is_external_network=false, ipv4_subnet_default_assignment={min_subnets_count=1}, ecomp_generated_network_assignment=false, ipv6_subnet_default_assignment={min_subnets_count=1}}","exVL_naming":"{ecomp_generated_naming=true}","network_flows":"{is_network_policy=false, is_bound_to_vpn=false}","network_homing":"{ecomp_selected_instance_node_target=false}"},"type":"VL","modelCustomizationName":"ExtVL 0"}},"collectionResource":{},"configurations":{"Port Mirroring Configuration By Policy 0":{"uuid":"b4398538-e89d-4f13-b33d-ca323434ba50","invariantUuid":"6ef0ca40-f366-4897-951f-abd65d25f6f7","description":"A port mirroring configuration by policy object","name":"Port Mirroring Configuration By Policy","version":"27.0","customizationUuid":"3c3b7b8d-8669-4b3b-8664-61970041fad2","inputs":{},"commands":{},"properties":{},"type":"Configuration","modelCustomizationName":"Port Mirroring Configuration By Policy 0","sourceNodes":[],"collectorNodes":null,"configurationByPolicy":false}},"serviceProxies":{},"vfModules":{"vf_vmee0..VfVmee..vmme_vlc..module-1":{"uuid":"522159d5-d6e0-4c2a-aa44-5a542a12a830","invariantUuid":"98a7c88b-b577-476a-90e4-e25a5871e02b","customizationUuid":"55b1be94-671a-403e-a26c-667e9c47d091","description":null,"name":"VfVmee..vmme_vlc..module-1","version":"2","modelCustomizationName":"VfVmee..vmme_vlc..module-1","properties":{"minCountInstances":0,"maxCountInstances":null,"initialCount":0,"vfModuleLabel":"vmme_vlc"},"inputs":{},"volumeGroupAllowed":false},"vf_vmee0..VfVmee..vmme_gpb..module-2":{"uuid":"41708296-e443-4c71-953f-d9a010f059e1","invariantUuid":"1cca90b8-3490-495e-87da-3f3e4c57d5b9","customizationUuid":"6add59e0-7fe1-4bc4-af48-f8812422ae7c","description":null,"name":"VfVmee..vmme_gpb..module-2","version":"2","modelCustomizationName":"VfVmee..vmme_gpb..module-2","properties":{"minCountInstances":0,"maxCountInstances":null,"initialCount":0,"vfModuleLabel":"vmme_gpb"},"inputs":{},"volumeGroupAllowed":false},"vf_vmee0..VfVmee..base_vmme..module-0":{"uuid":"a27f5cfc-7f12-4f99-af08-0af9c3885c87","invariantUuid":"a6f9e51a-2b35-416a-ae15-15e58d61f36d","customizationUuid":"f8c040f1-7e51-4a11-aca8-acf256cfd861","description":null,"name":"VfVmee..base_vmme..module-0","version":"2","modelCustomizationName":"VfVmee..base_vmme..module-0","properties":{"minCountInstances":1,"maxCountInstances":1,"initialCount":1,"vfModuleLabel":"base_vmme"},"inputs":{},"volumeGroupAllowed":true}},"volumeGroups":{"vf_vmee0..VfVmee..base_vmme..module-0":{"uuid":"a27f5cfc-7f12-4f99-af08-0af9c3885c87","invariantUuid":"a6f9e51a-2b35-416a-ae15-15e58d61f36d","customizationUuid":"f8c040f1-7e51-4a11-aca8-acf256cfd861","description":null,"name":"VfVmee..base_vmme..module-0","version":"2","modelCustomizationName":"VfVmee..base_vmme..module-0","properties":{"minCountInstances":1,"maxCountInstances":1,"initialCount":1,"vfModuleLabel":"base_vmme"},"inputs":{}}},"pnfs":{}}'); } function generateVNFFormValues() { - return JSON.parse('{"globalSubscriberId":"e433710f-9217-458d-a79d-1c7aff376d89","productFamilyId":"vRRaaS","subscriptionServiceType":"VIRTUAL USP","lcpCloudRegionId":"mtn6","tenantId":"1178612d2b394be4834ad77f567c0af2","aicZoneId":"JAG1","projectName":"DFW","owningEntityId":"d61e6f2d-12fa-4cc2-91df-7c244011d6fc","rollbackOnFailure":"true","bulkSize":1,"instanceParams":[{}],"modelInfo":{"modelInvariantId":"e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0","modelVersionId":"6e59c5de-f052-46fa-aa7e-2fca9d674c44","modelName":"ComplexService","modelVersion":"1.0"},"isUserProvidedNaming":false,"tenantName":"AIN Web Tool-15-D-SSPtestcustome","aicZoneName":"YUDFJULP-JAG1"}'); + return JSON.parse('{"globalSubscriberId":"e433710f-9217-458d-a79d-1c7aff376d89","productFamilyId":"vTerrance","subscriptionServiceType":"TYLER SILVIA","lcpCloudRegionId":"hvf6","tenantId":"1178612d2b394be4834ad77f567c0af2","aicZoneId":"JAG1","projectName":"WATKINS","owningEntityId":"d61e6f2d-12fa-4cc2-91df-7c244011d6fc","rollbackOnFailure":"true","bulkSize":1,"instanceParams":[{}],"modelInfo":{"modelInvariantId":"e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0","modelVersionId":"6e59c5de-f052-46fa-aa7e-2fca9d674c44","modelName":"ComplexService","modelVersion":"1.0"},"tenantName":"AIN Web Tool-15-D-SSPtestcustome","aicZoneName":"YUDFJULP-JAG1"}'); +} + +function generateVFModule() { + return { + 'uuid': '25284168-24bb-4698-8cb4-3f509146eca5', + 'invariantUuid': '7253ff5c-97f0-4b8b-937c-77aeb4d79aa1', + 'customizationUuid': 'f7e7c365-60cf-49a9-9ebf-a1aa11b9d401', + 'description': null, + 'name': '2017488AdiodVpe..ADIOD_vRE_BV..module-1', + 'version': '6', + 'modelCustomizationName': '2017488AdiodVpe..ADIOD_vRE_BV..module-1', + 'properties': {'minCountInstances': 0, 'maxCountInstances': null, 'initialCount': 0}, + 'commands': {}, + 'volumeGroupAllowed': true, + 'inputs': { + '2017488_adiodvpe0_vnf_config_template_version': { + 'type': 'string', + 'description': 'VPE Software Version', + 'entry_schema': null, + 'constraints': [], + 'required': true, + 'default': '17.2' + }, + '2017488_adiodvpe0_AIC_CLLI': { + 'type': 'string', + 'description': 'AIC Site CLLI', + 'entry_schema': null, + 'constraints': [], + 'required': true, + 'default': 'ATLMY8GA' + } + } + }; +} + +function generateVFModule2() { + return { + 'uuid': '0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a', + 'invariantUuid': 'eff8cc59-53a1-4101-aed7-8cf24ecf8339', + 'customizationUuid': '3cd946bb-50e0-40d8-96d3-c9023520b557', + 'description': null, + 'name': '2017488AdiodVpe..ADIOD_vPFE_BV..module-2', + 'version': '6', + 'modelCustomizationName': '2017488AdiodVpe..ADIOD_vPFE_BV..module-2', + 'properties': {'minCountInstances': 0, 'maxCountInstances': null, 'initialCount': 0}, + 'commands': {}, + 'volumeGroupAllowed': true, + 'inputs': {} + }; +} + +function generateVNF() { + return { + 'uuid': '0903e1c0-8e03-4936-b5c2-260653b96413', + 'invariantUuid': '00beb8f9-6d39-452f-816d-c709b9cbb87d', + 'description': 'Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM', + 'name': '2017-388_ADIOD-vPE', + 'version': '1.0', + 'customizationUuid': '280dec31-f16d-488b-9668-4aae55d6648a', + 'inputs': { + 'vnf_config_template_version': { + 'type': 'string', + 'description': 'VPE Software Version', + 'entry_schema': null, + 'constraints': [], + 'required': true, + 'default': '17.2' + }, + 'bandwidth_units': { + 'type': 'string', + 'description': 'Units of bandwidth', + 'entry_schema': null, + 'constraints': [], + 'required': true, + 'default': 'Gbps' + }, + 'bandwidth': { + 'type': 'string', + 'description': 'Requested VPE bandwidth', + 'entry_schema': null, + 'constraints': [], + 'required': true, + 'default': '10' + }, + 'AIC_CLLI': { + 'type': 'string', + 'description': 'AIC Site CLLI', + 'entry_schema': null, + 'constraints': [], + 'required': true, + 'default': 'ATLMY8GA' + }, + 'ASN': { + 'type': 'string', + 'description': 'AV/PE', + 'entry_schema': null, + 'constraints': [], + 'required': true, + 'default': 'AV_vPE' + }, + 'vnf_instance_name': { + 'type': 'string', + 'description': 'The hostname assigned to the vpe.', + 'entry_schema': null, + 'constraints': [], + 'required': true, + 'default': 'mtnj309me6' + } + }, + 'commands': { + 'vnf_config_template_version': { + 'displayName': 'vnf_config_template_version', + 'command': 'get_input', + 'inputName': '2017488_adiodvpe0_vnf_config_template_version' + }, + 'bandwidth_units': { + 'displayName': 'bandwidth_units', + 'command': 'get_input', + 'inputName': 'adiodvpe0_bandwidth_units' + }, + 'bandwidth': {'displayName': 'bandwidth', 'command': 'get_input', 'inputName': 'adiodvpe0_bandwidth'}, + 'AIC_CLLI': {'displayName': 'AIC_CLLI', 'command': 'get_input', 'inputName': '2017488_adiodvpe0_AIC_CLLI'}, + 'ASN': {'displayName': 'ASN', 'command': 'get_input', 'inputName': '2017488_adiodvpe0_ASN'}, + 'vnf_instance_name': { + 'displayName': 'vnf_instance_name', + 'command': 'get_input', + 'inputName': '2017488_adiodvpe0_vnf_instance_name' + } + }, + 'properties': { + 'vmxvre_retype': 'RE-VMX', + 'vnf_config_template_version': 'get_input:2017488_adiodvpe0_vnf_config_template_version', + 'sriov44_net_id': '48d399b3-11ee-48a8-94d2-f0ea94d6be8d', + 'int_ctl_net_id': '2f323477-6936-4d01-ac53-d849430281d9', + 'vmxvpfe_sriov41_0_port_mac': '00:11:22:EF:AC:DF', + 'int_ctl_net_name': 'VMX-INTXI', + 'vmx_int_ctl_prefix': '10.0.0.10', + 'sriov43_net_id': 'da349ca1-6de9-4548-be88-2d88e99bfef5', + 'sriov42_net_id': '760669ba-013d-4d9b-b0e7-4151fe2e6279', + 'sriov41_net_id': '25ad52d5-c165-40f8-b3b0-ddfc2373280a', + 'nf_type': 'vPE', + 'vmxvpfe_int_ctl_ip_1': '10.0.0.10', + 'is_AVPN_service': 'false', + 'vmx_RSG_name': 'vREXI-affinity', + 'vmx_int_ctl_forwarding': 'l2', + 'vmxvre_oam_ip_0': '10.0.0.10', + 'vmxvpfe_sriov44_0_port_mac': '00:11:22:EF:AC:DF', + 'vmxvpfe_sriov41_0_port_vlanstrip': 'false', + 'vmxvpfe_sriov42_0_port_vlanfilter': '4001', + 'vmxvpfe_sriov44_0_port_unknownunicastallow': 'true', + 'vmxvre_image_name_0': 'VRE-ENGINE_17.2-S2.1.qcow2', + 'vmxvre_instance': '0', + 'vmxvpfe_sriov43_0_port_mac': '00:11:22:EF:AC:DF', + 'vmxvre_flavor_name': 'ns.c1r16d32.v5', + 'vmxvpfe_volume_size_0': '40.0', + 'vmxvpfe_sriov43_0_port_vlanfilter': '4001', + 'nf_naming': '{ecomp_generated_naming=true}', + 'nf_naming_code': 'Navneet', + 'vmxvre_name_0': 'vREXI', + 'vmxvpfe_sriov42_0_port_vlanstrip': 'false', + 'vmxvpfe_volume_name_0': 'vPFEXI_FBVolume', + 'vmx_RSG_id': 'bd89a33c-13c3-4a04-8fde-1a57eb123141', + 'vmxvpfe_image_name_0': 'VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2', + 'vmxvpfe_sriov43_0_port_unknownunicastallow': 'true', + 'vmxvpfe_sriov44_0_port_unknownmulticastallow': 'true', + 'vmxvre_console': 'vidconsole', + 'vmxvpfe_sriov44_0_port_vlanfilter': '4001', + 'vmxvpfe_sriov42_0_port_mac': '00:11:22:EF:AC:DF', + 'vmxvpfe_volume_id_0': '47cede15-da2f-4397-a101-aa683220aff3', + 'vmxvpfe_sriov42_0_port_unknownmulticastallow': 'true', + 'vmxvpfe_sriov44_0_port_vlanstrip': 'false', + 'vf_module_id': '123', + 'nf_function': 'JAI', + 'vmxvpfe_sriov43_0_port_unknownmulticastallow': 'true', + 'vmxvre_int_ctl_ip_0': '10.0.0.10', + 'AIC_CLLI': 'get_input:2017488_adiodvpe0_AIC_CLLI', + 'vnf_name': 'mtnj309me6vre', + 'vmxvpfe_sriov41_0_port_unknownunicastallow': 'true', + 'vmxvre_volume_type_1': 'HITACHI', + 'vmxvpfe_sriov44_0_port_broadcastallow': 'true', + 'vmxvre_volume_type_0': 'HITACHI', + 'vmxvpfe_volume_type_0': 'HITACHI', + 'vmxvpfe_sriov43_0_port_broadcastallow': 'true', + 'bandwidth_units': 'get_input:adiodvpe0_bandwidth_units', + 'vnf_id': '123', + 'vmxvre_oam_prefix': '24', + 'availability_zone_0': 'mtpocfo-kvm-az01', + 'ASN': 'get_input:2017488_adiodvpe0_ASN', + 'vmxvre_chassis_i2cid': '161', + 'vmxvpfe_name_0': 'vPFEXI', + 'bandwidth': 'get_input:adiodvpe0_bandwidth', + 'availability_zone_max_count': '1', + 'vmxvre_volume_size_0': '45.0', + 'vmxvre_volume_size_1': '50.0', + 'vmxvpfe_sriov42_0_port_broadcastallow': 'true', + 'vmxvre_oam_gateway': '10.0.0.10', + 'vmxvre_volume_name_1': 'vREXI_FAVolume', + 'vmxvre_ore_present': '0', + 'vmxvre_volume_name_0': 'vREXI_FBVolume', + 'vmxvre_type': '0', + 'vnf_instance_name': 'get_input:2017488_adiodvpe0_vnf_instance_name', + 'vmxvpfe_sriov41_0_port_unknownmulticastallow': 'true', + 'oam_net_id': 'b95eeb1d-d55d-4827-abb4-8ebb94941429', + 'vmx_int_ctl_len': '24', + 'vmxvpfe_sriov43_0_port_vlanstrip': 'false', + 'vmxvpfe_sriov41_0_port_broadcastallow': 'true', + 'vmxvre_volume_id_1': '6e86797e-03cd-4fdc-ba72-2957119c746d', + 'vmxvpfe_sriov41_0_port_vlanfilter': '4001', + 'nf_role': 'Testing', + 'vmxvre_volume_id_0': 'f4eacb79-f687-4e9d-b760-21847c8bb15a', + 'vmxvpfe_sriov42_0_port_unknownunicastallow': 'true', + 'vmxvpfe_flavor_name': 'ns.c20r16d25.v5' + }, + 'type': 'VF', + 'modelCustomizationName': '2017-388_ADIOD-vPE 1', + 'vfModules': {}, + 'volumeGroups': {} + }; } diff --git a/vid-webpack-master/src/app/shared/services/defaultDataServiceGenerator/default.data.generator.service.ts b/vid-webpack-master/src/app/shared/services/defaultDataServiceGenerator/default.data.generator.service.ts index b1e676fc5..b0baa82ec 100644 --- a/vid-webpack-master/src/app/shared/services/defaultDataServiceGenerator/default.data.generator.service.ts +++ b/vid-webpack-master/src/app/shared/services/defaultDataServiceGenerator/default.data.generator.service.ts @@ -1,67 +1,355 @@ -import { Injectable } from '@angular/core'; +import {Injectable} from '@angular/core'; import * as _ from 'lodash'; -import { createVFModuleInstance, updateVNFInstance } from '../../../service.actions'; -import { NgRedux } from '@angular-redux/store'; -import { AppState } from '../../../store/reducers'; + +import {NgRedux} from '@angular-redux/store'; +import {AppState} from '../../store/reducers'; +import {VnfTreeNode} from "../../models/vnfTreeNode"; +import {VfModuleInstance} from "../../models/vfModuleInstance"; +import {VfModule} from "../../models/vfModule"; +import {VfModuleTreeNode} from "../../models/vfModuleTreeNode"; +import {InputType} from "../../models/inputTypes"; +import {ServiceNodeTypes} from "../../models/ServiceNodeTypes"; +import {Constants} from "../../utils/constants"; +import {Utils} from "../../utils/utils"; +import {NetworkTreeNode} from "../../models/networkTreeNode"; +import {createVNFInstance} from "../../storeUtil/utils/vnf/vnf.actions"; +import {changeInstanceCounter} from "../../storeUtil/utils/general/general.actions"; +import {createNetworkInstance} from "../../storeUtil/utils/network/network.actions"; +import {createVFModuleInstance} from "../../storeUtil/utils/vfModule/vfModule.actions"; +import {createVnfGroupInstance} from "../../storeUtil/utils/vnfGroup/vnfGroup.actions"; +import {VnfGroupTreeNode} from "../../models/vnfGroupTreeNode"; +import {ModelInfo} from "../../models/modelInfo"; +import {ServiceInstanceActions} from "../../models/serviceInstanceActions"; +import Parameter = Constants.Parameter; @Injectable() export class DefaultDataGeneratorService { static controlsFieldsStatus = {}; + public requiredFields = { + VF: [InputType.LCP_REGION, InputType.TENANT, InputType.PLATFORM], + Network: [InputType.LCP_REGION, InputType.TENANT, InputType.PLATFORM], + VL: [InputType.LCP_REGION, InputType.TENANT, InputType.PLATFORM], + VFmodule: [], + VnfGroup: [] + }; + + constructor(private store: NgRedux<AppState>) { + } + + public getArbitraryInputs(inputs) { + let parameter; + let parameterList = []; + for (let key in inputs) { + parameter = { + id: key, + type: Parameter.STRING, + name: key, + value: inputs[key][Parameter.DEFAULT], + isRequired: inputs[key][Parameter.REQUIRED], + description: inputs[key][Parameter.DESCRIPTION] + }; + switch (inputs[key][Parameter.TYPE]) { + case Parameter.INTEGER: + parameter.type = Parameter.NUMBER; + break; + case Parameter.BOOLEAN: + parameter.type = Parameter.BOOLEAN; + break; + case Parameter.RANGE: + break; + case Parameter.LIST: + parameter.type = Parameter.LIST; + break; + case Parameter.MAP: + parameter.type = Parameter.MAP; + break; + } + if (Utils.hasContents(inputs[key][Parameter.CONSTRAINTS]) + && ( inputs[key][Parameter.CONSTRAINTS].length > 0 )) { + let constraintsArray = inputs[key][Parameter.CONSTRAINTS]; + this.addConstraintParameters(parameterList, constraintsArray, key, inputs, parameter); + } + else { + + parameterList.push(parameter); + } + } + return parameterList; + } + + private addConstraintParameters(parameterList, constraintsArray, key, inputs, parameter) { + // If there are constraints and the operator is "valid_values", + // use a select parameter type. + let i: number = constraintsArray.length; + let parameterPushed: boolean = false; + if (i > 0) { + while ((i--) && (!parameterPushed)) { + let keys = Object.keys(constraintsArray[i]); + for (let operator in keys) { + switch (keys[operator]) { + case Parameter.VALID_VALUES: + let j: number = constraintsArray[i][Parameter.VALID_VALUES].length; + if (j > 0) { + let oList = []; + let option; + while (j--) { + option = { + name: constraintsArray[i][Parameter.VALID_VALUES][j], + isDefault: false + }; + if ((Utils.hasContents(inputs[key][Parameter.DEFAULT]) ) + && (inputs[key][Parameter.DEFAULT] === constraintsArray[i][Parameter.VALID_VALUES][j] )) { + option = { + name: constraintsArray[i][Parameter.VALID_VALUES][j], + isDefault: true + } + } + oList.push(option); + } + parameter.type = Parameter.SELECT; + parameter.optionList = oList; + parameterList.push(parameter); + parameterPushed = true; + } + break; + + case Parameter.EQUAL: + if (constraintsArray[i][Parameter.EQUAL] != null) { + parameter.type = Parameter.STRING; + parameter.isReadOnly = true; + parameter.value = constraintsArray[i][Parameter.EQUAL]; + parameterList.push(parameter); + parameterPushed = true; + } + break; + + case Parameter.LENGTH: + if (constraintsArray[i][Parameter.LENGTH] != null) { + parameter.minLength = constraintsArray[i][Parameter.LENGTH]; + parameter.maxLength = constraintsArray[i][Parameter.LENGTH]; + parameterList.push(parameter); + parameterPushed = true; + } + break; + case Parameter.MAX_LENGTH: + if (constraintsArray[i][Parameter.MAX_LENGTH] != null) { + parameter.maxLength = constraintsArray[i][Parameter.MAX_LENGTH]; + parameterList.push(parameter); + parameterPushed = true; + } + break; + case Parameter.MIN_LENGTH: + if (constraintsArray[i][Parameter.MIN_LENGTH] != null) { + parameter.minLength = constraintsArray[i][Parameter.MIN_LENGTH]; + parameterList.push(parameter); + parameterPushed = true; + } + break; + case Parameter.IN_RANGE: + if (constraintsArray[i][Parameter.IN_RANGE] != null) { + if (constraintsArray[i][Parameter.IN_RANGE].length > 1) { + parameter.min = constraintsArray[i][Parameter.IN_RANGE][0]; + parameter.max = constraintsArray[i][Parameter.IN_RANGE][1]; + parameter.type = Parameter.NUMBER; + parameter.value = inputs[key][Parameter.DEFAULT]; + parameterList.push(parameter); + parameterPushed = true; + } + } + break; + case Parameter.GREATER_THAN: + if (constraintsArray[i][Parameter.GREATER_THAN] != null) { + parameter.type = Parameter.NUMBER; + parameter.min = constraintsArray[i][Parameter.GREATER_THAN]; + parameter.value = inputs[key][Parameter.DEFAULT]; + parameterList.push(parameter); + parameterPushed = true; + } + break; + } + } + } + } + }; + + updateDynamicInputsVnfDataFromModel(modelType: string, model: any): any[] { + let displayInputs; + if (modelType === ServiceNodeTypes.VFmodule) { + displayInputs = model.inputs; + } + return _.isEmpty(displayInputs) ? [] : this.getArbitraryInputs(displayInputs); + } + + updateNetworksOnFirstSet(serviceId: string, formServiceValues: any){ + const serviceHierarchy = this.store.getState().service.serviceHierarchy[serviceId]; + if (serviceHierarchy && !_.isEmpty(serviceHierarchy.networks)) { + for (let networkUUID in serviceHierarchy.networks) { + const isEcompGeneratedNaming = this.getIsEcompGeneratedNaming(serviceHierarchy.networks[networkUUID]); + let min_vnf_instances_greater_than_0 = serviceHierarchy.networks[networkUUID].properties['min_instances'] && serviceHierarchy.networks[networkUUID].properties['min_instances'] > 0; + if(this.store.getState().global.flags['FLAG_DEFAULT_VNF'] && min_vnf_instances_greater_than_0) + { + this.createNetworkInstanceReduxIfNotExist( + serviceId, + this.generateNetworkData(serviceHierarchy, networkUUID, formServiceValues, isEcompGeneratedNaming) + ); + } + } + } + } - constructor(private store: NgRedux<AppState>) { } + updateVnfGroupsOnFirstSet(serviceId: string, formServiceValues: any){ + const serviceHierarchy = this.store.getState().service.serviceHierarchy[serviceId]; + if (serviceHierarchy && !_.isEmpty(serviceHierarchy.vnfGroups)) { + for (let vnfGroupUUID in serviceHierarchy.vnfGroups) { + const isEcompGeneratedNaming = this.getIsEcompGeneratedNaming(serviceHierarchy.vnfGroups[vnfGroupUUID]); + let min_vnf_group_instances_greater_than_0 = serviceHierarchy.vnfGroups[vnfGroupUUID].properties['min_instances'] && serviceHierarchy.vnfGroups[vnfGroupUUID].properties['min_instances'] > 0; + if(this.store.getState().global.flags['FLAG_DEFAULT_VNF'] && min_vnf_group_instances_greater_than_0) + { + this.createVnfGroupInstanceReduxIfNotExist( + serviceId, + this.generateVnfGroupData(serviceHierarchy, vnfGroupUUID, formServiceValues, isEcompGeneratedNaming) + ); + } + } + } + } updateReduxOnFirstSet(serviceId: string, formServiceValues: any): void { + this.updateNetworksOnFirstSet(serviceId, formServiceValues); + this.updateVnfGroupsOnFirstSet(serviceId, formServiceValues); const serviceHierarchy = this.store.getState().service.serviceHierarchy[serviceId]; if (serviceHierarchy && !_.isEmpty(serviceHierarchy.vnfs)) { for (let vnfUUID in serviceHierarchy.vnfs) { + const isEcompGeneratedNaming = this.getIsEcompGeneratedNaming(serviceHierarchy.vnfs[vnfUUID]); for (let vnfModuleUUID in serviceHierarchy.vnfs[vnfUUID].vfModules) { - if (serviceHierarchy.vnfs[vnfUUID].vfModules[vnfModuleUUID].properties.minCountInstances > 0) { - - let vfModule = this.generateVFModule(serviceHierarchy, vnfUUID, vnfModuleUUID); - this.updateVNFInstanceRedux( - serviceHierarchy.vnfs[vnfUUID].modelName, - serviceId, - serviceHierarchy.vnfs[vnfUUID].vfModules[vnfModuleUUID].properties.initialCount, - vfModule, - this.generateVNFData(serviceHierarchy, vnfUUID, vnfModuleUUID, formServiceValues), - vnfModuleUUID - ); + const vfModuleModel = serviceHierarchy.vnfs[vnfUUID].vfModules[vnfModuleUUID]; + if (vfModuleModel.properties.minCountInstances > 0) { + let vfModule = this.generateVFModule(vfModuleModel, this.updateDynamicInputsVnfDataFromModel(ServiceNodeTypes.VFmodule, vfModuleModel), isEcompGeneratedNaming, formServiceValues.isALaCarte); + if (vfModuleModel.properties.initialCount > 0) { + this.createVNFInstanceReduxIfNotExist( + serviceId, + this.generateVNFData(serviceHierarchy, vnfUUID, formServiceValues, isEcompGeneratedNaming) + ); + + this.addDefaultVfModulesInRedux( + serviceId, + vfModuleModel.properties.initialCount, + vfModule, + vnfModuleUUID, + vnfUUID + ) + + } } } + + let min_vnf_instances_greater_than_0 = serviceHierarchy.vnfs[vnfUUID].properties['min_instances'] && serviceHierarchy.vnfs[vnfUUID].properties['min_instances'] > 0; + if(this.store.getState().global.flags['FLAG_DEFAULT_VNF'] && min_vnf_instances_greater_than_0) + { + this.createVNFInstanceReduxIfNotExist( + serviceId, + this.generateVNFData(serviceHierarchy, vnfUUID, formServiceValues, isEcompGeneratedNaming) + ); + } } } } - updateVNFInstanceRedux(vnfModelName: string, serviceId: string, numberOfVfModules: number, vfModuleData: any, vnfData: any, vfModuleName : string): void { - if (numberOfVfModules > 0) { - this.store.dispatch(updateVNFInstance(vnfData, vnfData.modelInfo.modelCustomizationName, serviceId)); - for (let i = 0; i < numberOfVfModules; i++) { - this.store.dispatch(createVFModuleInstance(vfModuleData, vfModuleName, serviceId)); - } + + private getIsEcompGeneratedNaming(vnfJson) { + const ecompGeneratedNaming = vnfJson.properties.ecomp_generated_naming; + return ecompGeneratedNaming === "true"; + }; + + createVNFInstanceReduxIfNotExist(serviceId: string, vnfData: any): void { + if(!this.store.getState().service.serviceInstance[serviceId].vnfs[vnfData.modelInfo.modelCustomizationName]){ + this.store.dispatch(createVNFInstance(vnfData, vnfData.modelInfo.modelCustomizationName, serviceId)); + this.store.dispatch(changeInstanceCounter(vnfData.modelInfo.modelUniqueId, serviceId, 1, <any> {data : {type : 'VF'}})); + } + } + + createNetworkInstanceReduxIfNotExist(serviceId: string, networkData: any): void { + if(!this.store.getState().service.serviceInstance[serviceId].vnfs[networkData.modelInfo.modelCustomizationName]){ + this.store.dispatch(createNetworkInstance(networkData, networkData.modelInfo.modelCustomizationName, serviceId)); + this.store.dispatch(changeInstanceCounter(networkData.modelInfo.modelUniqueId, serviceId, 1, <any> {data : {type : 'VL'}})); } } + createVnfGroupInstanceReduxIfNotExist(serviceId: string, vnfGroupData: any): void { + if(!this.store.getState().service.serviceInstance[serviceId].vnfGroups[vnfGroupData.modelInfo.modelCustomizationName]){ + this.store.dispatch(createVnfGroupInstance(vnfGroupData, vnfGroupData.modelInfo.modelCustomizationName, serviceId)); + this.store.dispatch(changeInstanceCounter(vnfGroupData.modelInfo.modelUniqueId , serviceId, 1, <any> {data : {type : 'VnfGroup'}})); + } + } + + addDefaultVfModulesInRedux(serviceId: string, numberOfVfModules: number, vfModuleData: any, vfModuleName: string, vnfUUID : string){ + for (let i = 0; i < numberOfVfModules; i++) { + this.store.dispatch(createVFModuleInstance(vfModuleData, vfModuleName, serviceId, null, vnfUUID)); + } + } - generateVFModule(serviceHierarchy: any, vnfUUID: string, vnfModuleUUID: string) { + generateVnfGroupInstance(vnfGroupModel: any, isEcompGeneratedNaming : boolean, isALaCarte: boolean, instanceName: string) { + let modelInfo = new ModelInfo(vnfGroupModel); + let instanceParams = {}; return { + 'uuid' : modelInfo.uuid, + 'action': ServiceInstanceActions.Create, + 'instanceName': (!isEcompGeneratedNaming) ? instanceName : null, + 'isMissingData' : false, + 'modelInfo': modelInfo, + 'rollbackOnFailure' : "true", + 'instanceParams': [ + instanceParams + ], + 'trackById': DefaultDataGeneratorService.createRandomTrackById() + }; + } + + + generateVFModule(vfModule: any, dynamicInputs: any, isEcompGeneratedNaming : boolean, isALaCarte: boolean) { + let instanceParams = {}; + dynamicInputs.forEach(field => { + instanceParams[field.id] = field.value; + }); + return { + 'isMissingData' : this.setIsMissingData(ServiceNodeTypes.VFmodule, dynamicInputs, isEcompGeneratedNaming, isALaCarte), 'sdncPreReload': null, 'modelInfo': { 'modelType': 'VFmodule', - 'modelInvariantId': serviceHierarchy.vnfs[vnfUUID].vfModules[vnfModuleUUID].invariantUuid, - 'modelVersionId': serviceHierarchy.vnfs[vnfUUID].vfModules[vnfModuleUUID].uuid, - 'modelName': serviceHierarchy.vnfs[vnfUUID].vfModules[vnfModuleUUID].name, - 'modelVersion': serviceHierarchy.vnfs[vnfUUID].vfModules[vnfModuleUUID].version, - 'modelCustomizationId': serviceHierarchy.vnfs[vnfUUID].vfModules[vnfModuleUUID].customizationUuid, - 'modelCustomizationName': serviceHierarchy.vnfs[vnfUUID].vfModules[vnfModuleUUID].modelCustomizationName + 'modelInvariantId': vfModule.invariantUuid, + 'modelVersionId': vfModule.uuid, + 'modelName': vfModule.name, + 'modelVersion': vfModule.version, + 'modelCustomizationId': vfModule.customizationUuid, + 'modelCustomizationName': vfModule.modelCustomizationName, + 'modelUniqueId' : vfModule.customizationUuid || vfModule.uuid }, 'instanceParams': [ - {} - ] + instanceParams + ], + 'trackById': DefaultDataGeneratorService.createRandomTrackById(), }; } - generateVNFData(serviceHierarchy: any, vnfName: string, vnfUUID: string, formValues: any) { + setIsMissingData(type: string, dynamicInputs: any, isEcompGeneratedNaming: boolean, isAlaCarte?: boolean): boolean { + if (isAlaCarte || !isEcompGeneratedNaming || this.requiredFields[type].length > 0) { + return true; + } + + if (dynamicInputs) { + for(let input of dynamicInputs) { + if (input.isRequired && _.isEmpty(input.value)) { + return true; + } + } + } + return false; + } + + generateVNFData(serviceHierarchy: any, vnfName: string, formValues: any, isEcompGeneratedNaming) { return { + 'uuid' : serviceHierarchy.vnfs[vnfName].uuid, + 'isMissingData' :this.setIsMissingData(ServiceNodeTypes.VF, [], isEcompGeneratedNaming), 'productFamilyId': formValues.productFamilyId, 'lcpCloudRegionId': null, 'tenantId': null, @@ -73,10 +361,100 @@ export class DefaultDataGeneratorService { 'modelVersionId': formValues.modelInfo.modelVersionId, 'modelName': serviceHierarchy.vnfs[vnfName].name, 'modelVersion': serviceHierarchy.vnfs[vnfName].version, - 'modelCustomizationId': serviceHierarchy.vnfs[vnfName].modelCustomizationId, - 'modelCustomizationName': serviceHierarchy.vnfs[vnfName].modelCustomizationName + 'modelCustomizationId': serviceHierarchy.vnfs[vnfName].customizationUuid, + 'modelCustomizationName': serviceHierarchy.vnfs[vnfName].modelCustomizationName, + 'modelUniqueId' : serviceHierarchy.vnfs[vnfName].customizationUuid || serviceHierarchy.vnfs[vnfName].uuid, }, - 'isUserProvidedNaming': null + 'trackById': DefaultDataGeneratorService.createRandomTrackById(), } } + + generateNetworkData(serviceHierarchy: any, networkName: string, formValues: any, isEcompGeneratedNaming) { + return { + 'uuid' : serviceHierarchy.network[networkName].uuid, + 'isMissingData' :this.setIsMissingData(ServiceNodeTypes.VL, [], isEcompGeneratedNaming), + 'productFamilyId': formValues.productFamilyId, + 'lcpCloudRegionId': null, + 'tenantId': null, + 'lineOfBusiness': null, + 'platformName': null, + 'modelInfo': { + 'modelType': 'VF', + 'modelInvariantId': serviceHierarchy.network[networkName].invariantUuid, + 'modelVersionId': formValues.modelInfo.modelVersionId, + 'modelName': serviceHierarchy.network[networkName].name, + 'modelVersion': serviceHierarchy.network[networkName].version, + 'modelCustomizationId': serviceHierarchy.network[networkName].modelCustomizationId, + 'modelCustomizationName': serviceHierarchy.network[networkName].modelCustomizationName, + 'modelUniqueId' : serviceHierarchy.network[networkName].modelCustomizationId || serviceHierarchy.network[networkName].uuid, + }, + 'trackById': DefaultDataGeneratorService.createRandomTrackById(), + } + } + + generateVnfGroupData(serviceHierarchy: any, vnfGroupName: string, formValues: any, isEcompGeneratedNaming) { + return { + 'uuid' : serviceHierarchy.vnfGroups[vnfGroupName].uuid, + 'isMissingData' :this.setIsMissingData(ServiceNodeTypes.VnfGroup, [], isEcompGeneratedNaming), + 'platformName': null, + 'modelInfo': { + 'modelType': 'VnfGroup', + 'modelInvariantId': serviceHierarchy.vnfGroups[vnfGroupName].invariantUuid, + 'modelVersionId': formValues.modelInfo.modelVersionId, + 'modelName': serviceHierarchy.vnfGroups[vnfGroupName].name, + 'modelVersion': serviceHierarchy.vnfGroups[vnfGroupName].version, + 'modelCustomizationId': serviceHierarchy.vnfGroups[vnfGroupName].modelCustomizationId, + 'modelCustomizationName': serviceHierarchy.vnfGroups[vnfGroupName].modelCustomizationName, + 'modelUniqueId' : serviceHierarchy.vnfGroups[vnfGroupName].modelCustomizationId || serviceHierarchy.vnfGroups[vnfGroupName].uuid, + + }, + 'trackById': DefaultDataGeneratorService.createRandomTrackById(), + } + } + + + static createRandomTrackById() { + return Math.random().toString(36).slice(2); + } + + private checkMissingData(instance, type: string, dynamicInputs: any, isEcompGeneratedNaming: boolean): boolean { + if (!isEcompGeneratedNaming && _.isEmpty(instance.instanceName)) { + return true; + } + + for (let field of this.requiredFields[type]) { + if (_.isEmpty(instance[field])) { + return true; + } + } + + for (let field of dynamicInputs) { + if (field.isRequired && !_.isNil(instance.instanceParams) && _.isEmpty(instance.instanceParams[0][field.id])) { + return true; + } + } + + return false; + } + + createNewTreeNode(instance: any, model: any, storeKey : string, type : string): VnfTreeNode { + let tmp = null; + if(type === 'vnfs') { + tmp = new VnfTreeNode(instance, model, storeKey); + }else if (type === 'vnfGroups') { + tmp = new VnfGroupTreeNode(instance, model, storeKey); + }else { + tmp = new NetworkTreeNode(instance, model, storeKey); + } + tmp.missingData = this.checkMissingData(instance, ServiceNodeTypes.VF, [], model.isEcompGeneratedNaming); + + return tmp; + } + + createNewVfModuleTreeNode(instance: VfModuleInstance, vfModuleModel: VfModule, vfModuleModelName: string, isEcompGeneratedNamig: boolean, dynamicInputs, dynamicModelName :string): VfModuleTreeNode { + let newVfModule: VfModuleTreeNode = new VfModuleTreeNode(instance, vfModuleModel, vfModuleModelName, dynamicInputs, isEcompGeneratedNamig, dynamicModelName); + newVfModule.missingData = this.checkMissingData(instance, ServiceNodeTypes.VFmodule, dynamicInputs, isEcompGeneratedNamig); + return newVfModule; + } + } diff --git a/vid-webpack-master/src/app/shared/services/featureFlag/feature-flags.service.spec.ts b/vid-webpack-master/src/app/shared/services/featureFlag/feature-flags.service.spec.ts new file mode 100644 index 000000000..847af6676 --- /dev/null +++ b/vid-webpack-master/src/app/shared/services/featureFlag/feature-flags.service.spec.ts @@ -0,0 +1,47 @@ +import {FeatureFlagsService, Features} from "./feature-flags.service"; +import {getTestBed, TestBed} from "@angular/core/testing"; +import {NgRedux} from "@angular-redux/store"; +import each from 'jest-each'; +let flagValue:boolean; + +class MockReduxStore<T> { + + getState() { + return { + "global": { + "flags": { + "FLAG_1810_CR_ADD_CLOUD_OWNER_TO_MSO_REQUEST": flagValue, + }, + }, + } + }; +} + +describe('Feature flags Service', () => { + + let injector; + let service: FeatureFlagsService; + + beforeAll(done => (async () => { + TestBed.configureTestingModule({ + providers: [ + FeatureFlagsService, + {provide: NgRedux, useClass: MockReduxStore}] + }); + await TestBed.compileComponents(); + + injector = getTestBed(); + service = injector.get(FeatureFlagsService); + + })().then(done).catch(done.fail)); + + let flagValueDataProvider = [ + ['flag is true', true], + ['flag is false', false] + ]; + + each(flagValueDataProvider).test("should return the correct flag %s", (desc: string, flag: boolean) => { + flagValue = flag; + expect(service.getFlagState(Features.FLAG_1810_CR_ADD_CLOUD_OWNER_TO_MSO_REQUEST)).toEqual(flag); + }); +}); diff --git a/vid-webpack-master/src/app/shared/services/featureFlag/feature-flags.service.ts b/vid-webpack-master/src/app/shared/services/featureFlag/feature-flags.service.ts new file mode 100644 index 000000000..ec7bb0214 --- /dev/null +++ b/vid-webpack-master/src/app/shared/services/featureFlag/feature-flags.service.ts @@ -0,0 +1,29 @@ +import {NgRedux} from "@angular-redux/store"; +import {AppState} from "../../store/reducers"; +import {Injectable} from "@angular/core"; + +export enum Features { + FLAG_1810_CR_ADD_CLOUD_OWNER_TO_MSO_REQUEST='FLAG_1810_CR_ADD_CLOUD_OWNER_TO_MSO_REQUEST', + FLAG_1902_NEW_VIEW_EDIT='FLAG_1902_NEW_VIEW_EDIT', + FLAG_1902_VNF_GROUPING='FLAG_1902_VNF_GROUPING', + FLAG_VF_MODULE_RESUME_STATUS_CREATE = 'FLAG_VF_MODULE_RESUME_STATUS_CREATE', + DRAG_AND_DROP_OPERATION = 'DRAG_AND_DROP_OPERATION', + FLAG_1906_COMPONENT_INFO = 'FLAG_1906_COMPONENT_INFO', +} + +@Injectable() +export class FeatureFlagsService { + + constructor(private store: NgRedux<AppState>){} + + public getFlagState(flag: Features):boolean { + return FeatureFlagsService.getFlagState(flag, this.store); + } + + /*static method for easy refactoring of code, so no injection of FeatureFlagsService is needed*/ + public static getFlagState(flag: Features, store: NgRedux<AppState>):boolean { + return store.getState().global.flags[flag]; + } + + +} diff --git a/vid-webpack-master/src/app/shared/services/msoService/mso.service.spec.ts b/vid-webpack-master/src/app/shared/services/msoService/mso.service.spec.ts new file mode 100644 index 000000000..9142e8d0f --- /dev/null +++ b/vid-webpack-master/src/app/shared/services/msoService/mso.service.spec.ts @@ -0,0 +1,37 @@ +import {getTestBed, TestBed} from '@angular/core/testing'; +import {HttpClientTestingModule, HttpTestingController} from '@angular/common/http/testing'; +import {MsoService} from './mso.service'; +import {Constants} from "../../utils/constants"; + + +describe('Mso Service', () => { + let injector; + let service: MsoService; + let httpMock: HttpTestingController; + + beforeAll(done => (async () => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + providers: [MsoService] + }); + await TestBed.compileComponents(); + + + injector = getTestBed(); + service = injector.get(MsoService); + httpMock = injector.get(HttpTestingController); + + })().then(done).catch(done.fail)); + + describe('#instantiation status tests ', ()=> { + test('retry should send the right request', ()=>{ + const jobId: string = '111'; + + service.retryMsoTask(jobId).subscribe(); + const req = httpMock.expectOne(Constants.Path.SERVICES_JOB_INFO_PATH + '/retry/' + jobId); + + expect(req.request.method).toBe('POST'); + }); + }); + +}); diff --git a/vid-webpack-master/src/app/shared/services/msoService/mso.service.ts b/vid-webpack-master/src/app/shared/services/msoService/mso.service.ts new file mode 100644 index 000000000..7d31c6f7c --- /dev/null +++ b/vid-webpack-master/src/app/shared/services/msoService/mso.service.ts @@ -0,0 +1,38 @@ +import {Injectable} from "@angular/core"; +import {HttpClient} from "@angular/common/http"; +import {Observable} from "rxjs"; +import {Constants} from "../../utils/constants"; +import {ServiceInstance} from "../../models/serviceInstance"; + +@Injectable() +export class MsoService { + httpClient: HttpClient; + + constructor(http: HttpClient) { + this.httpClient = http; + } + + + public submitMsoTask(instanceFields): Observable<any> { + let path = Constants.Path.SERVICES_JOB_INFO_PATH + '/bulk'; + return this.httpClient.post(path, instanceFields); + } + + public retryMsoTask(jobId: string): Observable<any> { + let pathQuery = Constants.Path.SERVICES_JOB_INFO_PATH + '/retry/' + jobId; + return this.httpClient.post<any>(pathQuery, null); + } + + public retryBulkMsoTask(jobId: string, instanceFields: ServiceInstance): Observable<any> { + let pathQuery = Constants.Path.SERVICES_JOB_INFO_PATH + '/retryJobWithChangedData/'+ jobId; + return this.httpClient.post<any>(pathQuery, instanceFields); + } + + public createVnf(requestDetails, serviceInstanceId): Observable<any> { + let pathQuery: string = Constants.Path.MSO_CREATE_VNF_INSTANCE + serviceInstanceId; + + return this.httpClient.post( pathQuery, { + requestDetails : requestDetails + }); + } +} diff --git a/vid-webpack-master/src/app/shared/shared.module.ts b/vid-webpack-master/src/app/shared/shared.module.ts index ab6ecaa08..57af070c1 100644 --- a/vid-webpack-master/src/app/shared/shared.module.ts +++ b/vid-webpack-master/src/app/shared/shared.module.ts @@ -1,33 +1,77 @@ -import {NgModule, ModuleWithProviders} from '@angular/core'; +import {ModuleWithProviders, NgModule} from '@angular/core'; import {CommonModule} from '@angular/common'; import {RouterModule} from '@angular/router'; -import { BrowserModule } from '@angular/platform-browser'; -import { HttpClientModule } from '@angular/common/http'; -import { ServiceInfoService } from './server/serviceInfo/serviceInfo.service'; -import { PopoverModule } from 'ngx-bootstrap'; -import { AngularSvgIconModule } from 'angular-svg-icon'; -import { SvgDirective } from './directives/svg/svg.directive'; -import { PopoverComponent } from './components/popover/popover.component'; -import { EllipsisComponent } from './components/ellipsis/ellipsis.component'; -import { MessageBoxComponent } from './components/messageBox/messageBox.component'; -import { MessageBoxService } from './components/messageBox/messageBox.service'; -import { SdcUiComponentsModule , SdcUiComponents} from 'sdc-ui/lib/angular'; -import { HttpInterceptorService } from './utils/httpInterceptor/httpInterceptor.service'; -import { FormControlErrorComponent } from './components/formControlError/formControlError.component'; -import { InputPreventionPatternDirective } from './directives/inputPrevention/inputPreventionPattern.directive'; -import { FormGeneralErrorsComponent } from './components/formGeneralErrors/formGeneralErrors.component'; -import { NumbersLettersUnderscoreValidator } from './components/validators/numbersLettersUnderscore/numbersLettersUnderscore.validator'; -import { SpinnerComponent } from './components/spinner/spinner.component'; -import { NoContentMessageAndIconComponent } from './components/no-content-message-and-icon/no-content-message-and-icon.component'; -import { ModelInformationComponent } from './components/model-information/model-information.component'; -import { TooltipModule } from 'ngx-tooltip'; +import {BrowserModule} from '@angular/platform-browser'; +import {HttpClientModule} from '@angular/common/http'; +import {ServiceInfoService} from './server/serviceInfo/serviceInfo.service'; +import {ModalModule, PopoverModule} from 'ngx-bootstrap'; +import {PopoverComponent} from './components/popover/popover.component'; +import {EllipsisComponent} from './components/ellipsis/ellipsis.component'; +import {MessageBoxComponent} from './components/messageBox/messageBox.component'; +import {MessageBoxService} from './components/messageBox/messageBox.service'; +import {HttpInterceptorService} from './utils/httpInterceptor/httpInterceptor.service'; +import {FormControlErrorComponent} from './components/formControlError/formControlError.component'; +import {DropdownFormControlComponent} from "./components/formControls/component/dropdown/dropdown.formControl.component"; +import {InputPreventionPatternDirective} from './directives/inputPrevention/inputPreventionPattern.directive'; +import {FormGeneralErrorsComponent} from './components/formGeneralErrors/formGeneralErrors.component'; +import {SpinnerComponent} from './components/spinner/spinner.component'; +import {NoContentMessageAndIconComponent} from './components/no-content-message-and-icon/no-content-message-and-icon.component'; +import {ModelInformationComponent} from './components/model-information/model-information.component'; +import {TooltipModule} from 'ngx-tooltip'; import {IframeService} from "./utils/iframe.service"; import {CapitalizeAndFormatPipe} from "./pipes/capitalize/capitalize-and-format.pipe"; -import { DefaultDataGeneratorService } from './services/defaultDataServiceGenerator/default.data.generator.service'; +import {DefaultDataGeneratorService} from './services/defaultDataServiceGenerator/default.data.generator.service'; import {ServiceInfoPipe} from "./pipes/serviceInfo/serviceInfo.pipe"; -import {HealthStatusService} from "./server/healthStatusService/health-status.service"; -import {ConfigurationService} from "../services/configuration.service"; -import {FlagsResolve} from "../services/flags.resolve"; +import {ConfigurationService} from "./services/configuration.service"; +import {InputFormControlComponent} from "./components/formControls/component/input/input.formControl.component"; +import {MultiselectFormControlComponent} from "./components/formControls/component/multiselect/multiselect.formControl.component"; +import {FormsModule, ReactiveFormsModule} from "@angular/forms"; +import {FormControlMessageErrorComponent} from "./components/formControls/errorMessage/formControlMessageError.component"; +import {GenericFormPopupComponent} from "./components/genericFormPopup/generic-form-popup.component"; +import {CheckboxFormControlComponent} from "./components/formControls/component/checkbox/checkbox.formControl.component"; +import {GenericFormService} from "./components/genericForm/generic-form.service"; +import {GenericFormComponent} from "./components/genericForm/generic-form.component"; +import {ServiceControlGenerator} from "./components/genericForm/formControlsServices/service.control.generator"; +import {BasicControlGenerator} from "./components/genericForm/formControlsServices/basic.control.generator"; +import {CustomValidators} from "./validators/uniqueName/uniqueName.validator"; +import {FileFormControlComponent} from "./components/formControls/component/file/file.formControl.component"; +import {NumberFormControlComponent} from "./components/formControls/component/number/number.formControl.component"; +import {AngularMultiSelectModule} from 'angular2-multiselect-dropdown'; +import {VnfControlGenerator} from "./components/genericForm/formControlsServices/vnfGenerator/vnf.control.generator"; +import {NetworkPopupService} from "./components/genericFormPopup/genericFormServices/network/network.popup.service"; +import {NetworkControlGenerator} from "./components/genericForm/formControlsServices/networkGenerator/network.control.generator"; +import {BasicPopupService} from "./components/genericFormPopup/genericFormServices/basic.popup.service"; +import {VfModulePopuopService} from "./components/genericFormPopup/genericFormServices/vfModule/vfModule.popuop.service"; +import {VfModuleControlGenerator} from "./components/genericForm/formControlsServices/vfModuleGenerator/vfModule.control.generator"; +import {OrderByPipe} from "./pipes/order/orderBy.pipe"; +import {ServicePopupService} from "./components/genericFormPopup/genericFormServices/service/service.popup.service"; +import {GenericFormPopupService} from "./components/genericFormPopup/generic-form-popup.service"; +import {FormGeneralErrorsService} from "./components/formGeneralErrors/formGeneralErrors.service"; +import {VnfPopupService} from "./components/genericFormPopup/genericFormServices/vnf/vnf.popup.service"; +import {SdcUiComponentsModule, SdcUiServices} from "onap-ui-angular"; +import {SafePipe} from "./pipes/safe/safe.pipe"; +import {ViewEditResolver} from "./resolvers/viewEdit/viewEdit.resolver"; +import {FlagsResolve} from "./resolvers/flag/flag.resolver"; +import {FeatureFlagModule} from "../featureFlag/featureFlag.module"; +import {VnfGroupPopupService} from "./components/genericFormPopup/genericFormServices/vnfGroup/vnfGroup.popup.service"; +import {VnfGroupControlGenerator} from "./components/genericForm/formControlsServices/vnfGroupGenerator/vnfGroup.control.generator"; +import {AuditInfoModalComponent} from "./components/auditInfoModal/auditInfoModal.component"; +import {BootstrapModalModule} from 'ng2-bootstrap-modal'; +import {DataTableModule} from "angular2-datatable"; +import {AuditInfoModalComponentService} from "./components/auditInfoModal/auditInfoModal.component.service"; +import {SearchMembersModalComponent} from "./components/searchMembersModal/search-members-modal.component"; +import {MembersTableComponent} from "./components/searchMembersModal/members-table/members-table.component"; +import {MembersTableService} from "./components/searchMembersModal/members-table/members-table.service"; +import {ObjectToArrayPipe} from "./pipes/objectToArray/objectToArray.pipe"; +import {DataFilterPipe} from "./pipes/dataFilter/data-filter.pipe"; +import {SvgComponent} from "./components/svg/svg-component"; +import {ErrorMsgComponent} from './components/error-msg/error-msg.component'; +import {ErrorMsgService} from "./components/error-msg/error-msg.service"; +import {RetryResolver} from "./resolvers/retry/retry.resolver"; +import {ClickOutsideDirective} from "./directives/clickOutside/clickOutside.directive"; +import {DynamicInputsComponent} from "./components/dynamic-inputs/dynamic-inputs.component"; +import {DynamicInputLabelPipe} from "./pipes/dynamicInputLabel/dynamic-input-label.pipe"; +import {ModelInformationService} from "./components/model-information/model-information.service"; @NgModule({ @@ -37,49 +81,119 @@ import {FlagsResolve} from "../services/flags.resolve"; CommonModule, RouterModule, PopoverModule.forRoot(), - AngularSvgIconModule, + FeatureFlagModule.forRoot(), + FormsModule, + ReactiveFormsModule, TooltipModule, SdcUiComponentsModule, + AngularMultiSelectModule, + BootstrapModalModule, + DataTableModule, + ModalModule.forRoot() ], declarations: [ PopoverComponent, - SvgDirective, EllipsisComponent, MessageBoxComponent, FormControlErrorComponent, + DropdownFormControlComponent, + MultiselectFormControlComponent, + FileFormControlComponent, + NumberFormControlComponent, InputPreventionPatternDirective, + ClickOutsideDirective, FormGeneralErrorsComponent, SpinnerComponent, NoContentMessageAndIconComponent, ModelInformationComponent, CapitalizeAndFormatPipe, ServiceInfoPipe, + OrderByPipe, + SafePipe, + ObjectToArrayPipe, + DataFilterPipe, + InputFormControlComponent, + FormControlMessageErrorComponent, + GenericFormPopupComponent, + SearchMembersModalComponent, + AuditInfoModalComponent, + GenericFormComponent, + CheckboxFormControlComponent, + MembersTableComponent, + SvgComponent, + ErrorMsgComponent, + DynamicInputsComponent, + DynamicInputLabelPipe ], exports: [ PopoverComponent, - SvgDirective, EllipsisComponent, MessageBoxComponent, FormControlErrorComponent, + DropdownFormControlComponent, InputPreventionPatternDirective, + ClickOutsideDirective, FormGeneralErrorsComponent, SpinnerComponent, NoContentMessageAndIconComponent, ModelInformationComponent, CapitalizeAndFormatPipe, ServiceInfoPipe, + OrderByPipe, + SafePipe, + ObjectToArrayPipe, + DataFilterPipe, + InputFormControlComponent, + FormControlMessageErrorComponent, + GenericFormPopupComponent, + SearchMembersModalComponent, + AuditInfoModalComponent, + GenericFormComponent, + CheckboxFormControlComponent, + MembersTableComponent, + ErrorMsgComponent, + SvgComponent, + DynamicInputsComponent, + DynamicInputLabelPipe + ], + entryComponents : [ + GenericFormPopupComponent, + SearchMembersModalComponent ], providers: [ ServiceInfoService, MessageBoxService, - SdcUiComponents.ModalService, + SdcUiServices.ModalService, + SdcUiServices.LoaderService, HttpInterceptorService, IframeService, - NumbersLettersUnderscoreValidator, DefaultDataGeneratorService, - HealthStatusService, ConfigurationService, - FlagsResolve + GenericFormService, + FlagsResolve, + ViewEditResolver, + RetryResolver, + ServiceControlGenerator, + ServicePopupService, + VnfControlGenerator, + VfModuleControlGenerator, + BasicControlGenerator, + CustomValidators, + NetworkPopupService, + VfModulePopuopService, + NetworkControlGenerator, + VnfGroupControlGenerator, + VnfGroupPopupService, + BasicPopupService, + GenericFormPopupService, + FormGeneralErrorsService, + VnfPopupService, + AuditInfoModalComponentService, + VnfPopupService, + MembersTableService, + ErrorMsgService, + DataFilterPipe, + ModelInformationService, ] }) export class SharedModule { diff --git a/vid-webpack-master/src/app/store/epics.ts b/vid-webpack-master/src/app/shared/store/epics.ts index f424e7355..c7b190d19 100644 --- a/vid-webpack-master/src/app/store/epics.ts +++ b/vid-webpack-master/src/app/shared/store/epics.ts @@ -1,13 +1,11 @@ import { Injectable } from '@angular/core'; - import {AAIEpics} from "../services/aaiService/aai.epics"; @Injectable() export class RootEpics { constructor(private aaiEpics: AAIEpics) {} - public createEpics() { + public createEpics() { return this.aaiEpics.createEpic(); - } } diff --git a/vid-webpack-master/src/app/shared/store/module.ts b/vid-webpack-master/src/app/shared/store/module.ts new file mode 100644 index 000000000..5a81f36ec --- /dev/null +++ b/vid-webpack-master/src/app/shared/store/module.ts @@ -0,0 +1,36 @@ +import {NgModule} from '@angular/core'; +import {NgReduxModule, NgRedux, DevToolsExtension} from '@angular-redux/store'; +import {RootEpics} from './epics'; + +import rootReducer, {AppState} from "./reducers"; +import {AAIEpics} from "../services/aaiService/aai.epics"; +import {createEpicMiddleware} from "redux-observable"; +import {AaiService} from "../services/aaiService/aai.service"; +import {applyMiddleware, createStore} from "redux"; + +@NgModule({ + imports: [NgReduxModule], + providers: [RootEpics, AAIEpics], +}) + +export class StoreModule { + constructor( + public store: NgRedux<AppState>, + private aaiService : AaiService, + devTools: DevToolsExtension, + rootEpics: RootEpics, + ) { + const epicMiddleware = createEpicMiddleware(); + const persistedState = sessionStorage.getItem('reduxState') ? + JSON.parse(sessionStorage.getItem('reduxState')) : {}; + + const configStore = createStore( + rootReducer, + <any>persistedState, + applyMiddleware(epicMiddleware) + ); + + epicMiddleware.run(rootEpics.createEpics()); + store.provideStore(configStore); + } +} diff --git a/vid-webpack-master/src/app/shared/store/reducers.ts b/vid-webpack-master/src/app/shared/store/reducers.ts new file mode 100644 index 000000000..90cdd273f --- /dev/null +++ b/vid-webpack-master/src/app/shared/store/reducers.ts @@ -0,0 +1,16 @@ +import {MainReducer, ServiceState} from "../storeUtil/utils/main.reducer"; +import {globalReducer, GlobalState} from "../storeUtil/utils/global/global.reducers"; +import {combineReducers, Reducer} from "redux"; + + +export interface AppState { + global: GlobalState; + service: ServiceState; +} + +const rootReducer: Reducer<AppState> = combineReducers<AppState>({ + global: globalReducer, + service: MainReducer +}); + +export default rootReducer; diff --git a/vid-webpack-master/src/app/shared/storeUtil/utils/general/general.action.spec.ts b/vid-webpack-master/src/app/shared/storeUtil/utils/general/general.action.spec.ts new file mode 100644 index 000000000..a65249a3b --- /dev/null +++ b/vid-webpack-master/src/app/shared/storeUtil/utils/general/general.action.spec.ts @@ -0,0 +1,157 @@ +import { + GeneralActions, UpdateAicZonesAction, + UpdateLcpRegionsAndTenantsAction, + UpdateProductFamiliesAction, + UpdateSubscribersAction, UpdateUserIdAction +} from "./general.actions"; +import {SelectOption} from "../../../models/selectOption"; + + +describe('general actions', () => { + test('#UPDATE_LCP_REGIONS_AND_TENANTS : action', () => { + const action: UpdateLcpRegionsAndTenantsAction = <UpdateLcpRegionsAndTenantsAction>{ + type: GeneralActions.UPDATE_LCP_REGIONS_AND_TENANTS, + lcpRegionsAndTenants: { + "lcpRegionList": [], + "lcpRegionsTenantsMap": {} + } + }; + + expect(action.type).toEqual(GeneralActions.UPDATE_LCP_REGIONS_AND_TENANTS); + expect(action.lcpRegionsAndTenants.lcpRegionList).toEqual([]); + expect(action.lcpRegionsAndTenants.lcpRegionsTenantsMap).toEqual({}); + }); + + test('#UPDATE_SUBSCRIBERS : action', () => { + const action: UpdateSubscribersAction = <UpdateSubscribersAction>{ + type: GeneralActions.UPDATE_SUBSCRIBERS, + subscribers: [ + { + "id": "ERICA5779-Subscriber-2", + "name": "ERICA5779-Subscriber-2", + "isPermitted": false + }, + { + "id": "ERICA5779-Subscriber-3", + "name": "ERICA5779-Subscriber-3", + "isPermitted": false + }, + { + "id": "ERICA5779-Subscriber-4", + "name": "ERICA5779-Subscriber-5", + "isPermitted": false + }, + { + "id": "ERICA5779-TestSub-PWT-101", + "name": "ERICA5779-TestSub-PWT-101", + "isPermitted": false + }, + { + "id": "ERICA5779-TestSub-PWT-102", + "name": "ERICA5779-TestSub-PWT-102", + "isPermitted": false + }, + { + "id": "ERICA5779-TestSub-PWT-103", + "name": "ERICA5779-TestSub-PWT-103", + "isPermitted": false + }, + { + "id": "31739f3e-526b-11e6-beb8-9e71128cae77", + "name": "CRAIG/ROBERTS", + "isPermitted": false + }, + { + "id": "DHV1707-TestSubscriber-2", + "name": "DALE BRIDGES", + "isPermitted": false + }, + { + "id": "jimmy-example", + "name": "JimmyExampleCust-20161102", + "isPermitted": false + }, + { + "id": "jimmy-example2", + "name": "JimmyExampleCust-20161103", + "isPermitted": false + }, + { + "id": "CAR_2020_ER", + "name": "CAR_2020_ER", + "isPermitted": true + }, + { + "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb", + "name": "Emanuel", + "isPermitted": false + }, + { + "id": "21014aa2-526b-11e6-beb8-9e71128cae77", + "name": "JULIO ERICKSON", + "isPermitted": false + }, + { + "id": "DHV1707-TestSubscriber-1", + "name": "LLOYD BRIDGES", + "isPermitted": false + }, + { + "id": "e433710f-9217-458d-a79d-1c7aff376d89", + "name": "SILVIA ROBBINS", + "isPermitted": true + } + ] + }; + + expect(action.type).toEqual(GeneralActions.UPDATE_SUBSCRIBERS); + expect(action.subscribers).toHaveLength(15); + }); + + test('#UPDATE_PRODUCT_FAMILIES : action', () => { + const action: UpdateProductFamiliesAction = <UpdateProductFamiliesAction>{ + type: GeneralActions.UPDATE_PRODUCT_FAMILIES, + productFamilies: [ + new SelectOption({ + id : 'id', + name : 'name', + isPermitted : false + }) + ] + }; + + expect(action.type).toEqual(GeneralActions.UPDATE_PRODUCT_FAMILIES); + expect(action.productFamilies).toHaveLength(1); + }); + + + test('#UpdateAicZonesAction : action', () => { + const action: UpdateAicZonesAction = <UpdateAicZonesAction>{ + type: GeneralActions.UPDATE_AIC_ZONES, + aicZones: [ + new SelectOption({ + id : 'id', + name : 'name', + isPermitted : false + }) + ] + }; + + expect(action.type).toEqual(GeneralActions.UPDATE_AIC_ZONES); + expect(action.aicZones).toHaveLength(1); + }); + + test('#UpdateUserIdAction : action', () => { + const action: UpdateUserIdAction = <UpdateUserIdAction>{ + type: GeneralActions.UPDATE_USER_ID, + userId: "userId" + }; + + expect(action.type).toEqual(GeneralActions.UPDATE_USER_ID); + expect(action.userId).toBe("userId"); + }); + +}); + + + diff --git a/vid-webpack-master/src/app/shared/storeUtil/utils/general/general.actions.ts b/vid-webpack-master/src/app/shared/storeUtil/utils/general/general.actions.ts new file mode 100644 index 000000000..7a10eba0a --- /dev/null +++ b/vid-webpack-master/src/app/shared/storeUtil/utils/general/general.actions.ts @@ -0,0 +1,150 @@ +import {Action, ActionCreator} from "redux"; +import {LcpRegionsAndTenants} from "../../../models/lcpRegionsAndTenants"; +import {SelectOptionInterface} from "../../../models/selectOption"; +import {ServiceType} from "../../../models/serviceType"; +import {ITreeNode} from "angular-tree-component/dist/defs/api"; + +export enum GeneralActions { + UPDATE_LCP_REGIONS_AND_TENANTS = "UPDATE_LCP_REGIONS_AND_TENANTS", + UPDATE_SUBSCRIBERS = "UPDATE_SUBSCRIBERS", + UPDATE_PRODUCT_FAMILIES = "UPDATE_PRODUCT_FAMILIES", + UPDATE_SERVICE_TYPES = "UPDATE_SERVICE_TYPES", + UPDATE_AIC_ZONES = "UPDATE_AIC_ZONES", + UPDATE_USER_ID = "UPDATE_USER_ID", + UPDATE_NETWORK_FUNCTION = "UPDATE_NETWORK_FUNCTION", + UPDATE_CATEGORY_PARAMETERS = "UPDATE_CATEGORY_PARAMETERS", + REMOVE_INSTANCE = 'REMOVE_INSTANCE', + CHANGE_INSTANCE_COUNTER = 'CHANGE_INSTANCE_COUNTER', + DUPLICATE_BULK_INSTANCES = 'DUPLICATE_BULK_INSTANCES' +} +export interface UpdateLcpRegionsAndTenantsAction extends Action { + lcpRegionsAndTenants?: LcpRegionsAndTenants; +} + +export interface RemoveInstanceAction extends Action { + modelName?: string; + serviceModelId: string; + storeKey : string; + node : ITreeNode; +} + +export interface UpdateSubscribersAction extends Action { + subscribers?: SelectOptionInterface[]; +} + +export interface UpdateProductFamiliesAction extends Action { + productFamilies?: SelectOptionInterface[]; +} + +export interface UpdateAicZonesAction extends Action { + aicZones?: SelectOptionInterface[]; +} + +export interface UpdateServiceTypesAction extends Action { + serviceTypes?: ServiceType[]; + subscriberId: string; +} +export interface UpdateUserIdAction extends Action { + userId: string; +} + +export interface UpdateNetworkCollectionFunction extends Action { + networksAccordingToNetworkCollection: any; + network_function: any; +} + +export interface UpdateCategoryParametersAction extends Action { + categoryParameters?: Object; +} + +export interface ChangeInstanceCounterAction extends Action{ + serviceUUID : string; + UUID : string; + changeBy : number; + node : ITreeNode; +} + +export interface DuplicateBulkInstancesAction extends Action { + serviceId?: string; + modelName?: string; + originalName? : string; + objects? : {}; + existingNames: {[key: string] : any}; + node : ITreeNode; +} + +export interface UpdateServiceTypesAction extends Action { + serviceTypes?: ServiceType[]; + subscriberId: string; +} + +export const updateLcpRegionsAndTenants: ActionCreator<UpdateLcpRegionsAndTenantsAction> = lcpRegionsAndTenants => ({ + type: GeneralActions.UPDATE_LCP_REGIONS_AND_TENANTS, + lcpRegionsAndTenants: lcpRegionsAndTenants +}); + +export const updateSubscribers: ActionCreator<UpdateSubscribersAction> = subscribers => ({ + type: GeneralActions.UPDATE_SUBSCRIBERS, + subscribers: subscribers +}); + +export const updateProductFamilies: ActionCreator<UpdateProductFamiliesAction> = productFamilies => ({ + type: GeneralActions.UPDATE_PRODUCT_FAMILIES, + productFamilies: productFamilies +}); + +export const updateAicZones: ActionCreator<UpdateAicZonesAction> = aicZones => ({ + type: GeneralActions.UPDATE_AIC_ZONES, + aicZones: aicZones +}); + +export const updateUserId: ActionCreator<UpdateUserIdAction> = userId => ({ + type: GeneralActions.UPDATE_USER_ID, + userId: userId +}); + +export const updateNetworkCollectionFunction: ActionCreator<UpdateNetworkCollectionFunction> = (ncf, networksAccordingToNetworkCollection) => ({ + type: GeneralActions.UPDATE_NETWORK_FUNCTION, + networksAccordingToNetworkCollection: networksAccordingToNetworkCollection["results"], + network_function: ncf +}); + +export const updateCategoryParameters: ActionCreator<UpdateCategoryParametersAction> = categoryParameters => ({ + type: GeneralActions.UPDATE_CATEGORY_PARAMETERS, + categoryParameters: categoryParameters +}); + +export const removeInstance: ActionCreator<RemoveInstanceAction> = (modelName, serviceModelId, storeKey, node : ITreeNode) => ({ + type: GeneralActions.REMOVE_INSTANCE, + modelName: modelName, + serviceModelId: serviceModelId, + storeKey: storeKey, + node : node +}); + + +export const changeInstanceCounter: ActionCreator<ChangeInstanceCounterAction> = (UUID, serviceUUID , changeBy, node) => ({ + type: GeneralActions.CHANGE_INSTANCE_COUNTER, + UUID: UUID, + serviceUUID: serviceUUID, + changeBy : changeBy || 1, + node : node +}); + + +export const duplicateBulkInstances: ActionCreator<DuplicateBulkInstancesAction> = (serviceId, objects, existingNames, node) => ({ + type: GeneralActions.DUPLICATE_BULK_INSTANCES, + serviceId: serviceId, + objects : objects, + existingNames: existingNames, + node : node +}); + + +export const updateServiceTypes: ActionCreator<UpdateServiceTypesAction> = (serviceTypes, subscriberId) => ({ + type: GeneralActions.UPDATE_SERVICE_TYPES, + serviceTypes: serviceTypes, + subscriberId: subscriberId +}); + + diff --git a/vid-webpack-master/src/app/shared/storeUtil/utils/general/general.reducers.spec.ts b/vid-webpack-master/src/app/shared/storeUtil/utils/general/general.reducers.spec.ts new file mode 100644 index 000000000..ed456314e --- /dev/null +++ b/vid-webpack-master/src/app/shared/storeUtil/utils/general/general.reducers.spec.ts @@ -0,0 +1,376 @@ +import {LcpRegion} from "../../../models/lcpRegion"; +import {Tenant} from "../../../models/tenant"; +import {generalReducer} from "./general.reducers"; +import { + ChangeInstanceCounterAction, + RemoveInstanceAction, + DuplicateBulkInstancesAction, + GeneralActions, + UpdateAicZonesAction, + UpdateCategoryParametersAction, + UpdateProductFamiliesAction, + UpdateServiceTypesAction, + UpdateSubscribersAction, + UpdateUserIdAction, UpdateNetworkCollectionFunction, +} from "./general.actions"; +import {SelectOption} from "../../../models/selectOption"; +import {ServiceType} from "../../../models/serviceType"; +import {ITreeNode} from "angular-tree-component/dist/defs/api"; +import {VnfInstance} from "../../../models/vnfInstance"; + +describe('generalReducer', () => { + test('#UPDATE_LCP_REGIONS_AND_TENANTS : should update lcp region and tenants', () => { + let lcpRegionsAndTenantsObj = [ + { + lcpRegionList : [ + new LcpRegion( + 'cloudRegionID', + 'cloudRegionID (cloudOwner)', + true, + 'cloudOwner' + ) + ], + lcpRegionsTenantsMap : { + "lcpRegion" : [new Tenant({ + "tenantID" : "tenantID", + "tenantName" : "tenantName", + "is-permitted" : true + })] + } + } + ]; + let lcpRegionsAndTenantsState = generalReducer(<any>{serviceInstance : {}}, + <any>{ + type: GeneralActions.UPDATE_LCP_REGIONS_AND_TENANTS, + lcpRegionsAndTenants : lcpRegionsAndTenantsObj + })['lcpRegionsAndTenants']; + + expect(lcpRegionsAndTenantsState).toBeDefined(); + }); + + test('#UPDATE_SUBSCRIBERS : should update subscribers', () => { + let subscribersList = [ + new SelectOption({ + id : 'id', + name : 'name', + isPermitted : false + }) + ]; + let subscribersState = generalReducer(<any> + { + serviceInstance : {} + }, + <UpdateSubscribersAction>{ + type: GeneralActions.UPDATE_SUBSCRIBERS, + subscribers : subscribersList + })['subscribers']; + + expect(subscribersState).toBeDefined(); + expect(subscribersState[0].id).toEqual(subscribersList[0].id); + expect(subscribersState[0].isPermitted).toEqual(subscribersList[0].isPermitted); + expect(subscribersState[0].name).toEqual(subscribersList[0].name); + }); + + test('#UPDATE_PRODUCT_FAMILIES : should update product families', () => { + let productFamiliesObj = [ + new SelectOption({ + id : 'id', + name : 'name', + isPermitted : false + }) + ]; + let productFamiliesState = generalReducer(<any>{serviceInstance : {}}, + <UpdateProductFamiliesAction>{ + type: GeneralActions.UPDATE_PRODUCT_FAMILIES, + productFamilies : productFamiliesObj + })['productFamilies']; + + expect(productFamiliesState).toBeDefined(); + expect(productFamiliesState[0].id).toEqual(productFamiliesObj[0].id); + expect(productFamiliesState[0].isPermitted).toEqual(productFamiliesObj[0].isPermitted); + expect(productFamiliesState[0].name).toEqual(productFamiliesObj[0].name); + }); + + test('#UPDATE_AIC_ZONES : should update aic zones', () => { + let aicZonesObj = [ + new SelectOption({ + id : 'id', + name : 'name', + isPermitted : false + }) + ]; + let aicZonesState = generalReducer(<any>{serviceInstance : {}}, + <UpdateAicZonesAction>{ + type: GeneralActions.UPDATE_AIC_ZONES, + aicZones : aicZonesObj + })['aicZones']; + + expect(aicZonesState).toBeDefined(); + expect(aicZonesState[0].id).toEqual(aicZonesObj[0].id); + expect(aicZonesState[0].isPermitted).toEqual(aicZonesObj[0].isPermitted); + expect(aicZonesState[0].name).toEqual(aicZonesObj[0].name); + }); + + test('#UPDATE_SERVICE_TYPES : should update service types', () => { + const subscriberId = 'subscriberId'; + let serviceTypesList : ServiceType[] = [ + new ServiceType('id',{ + 'service-type' : 'name', + 'is-permitted' : true + }) + ]; + let serviceTypesState = generalReducer(<any> + { + serviceTypes : { + } + }, + <UpdateServiceTypesAction>{ + type: GeneralActions.UPDATE_SERVICE_TYPES, + subscriberId : subscriberId, + serviceTypes : serviceTypesList + })['serviceTypes'][subscriberId]; + + expect(serviceTypesState).toBeDefined(); + expect(serviceTypesState[0].id).toEqual(serviceTypesList[0].id); + expect(serviceTypesState[0].isPermitted).toEqual(serviceTypesList[0].isPermitted); + expect(serviceTypesState[0].name).toEqual(serviceTypesList[0].name); + }); + + test('#UPDATE_CATEGORY_PARAMETERS : should update category parameters', () => { + let list = [ + new SelectOption({ + id : 'id', + name : 'name', + isPermitted : false + }) + ]; + + const categoryParametersObj = { + owningEntityList : list, + projectList : list, + lineOfBusinessList : list, + platformList : list + }; + + let categoryParametersState = generalReducer(<any>{serviceInstance : {}}, + <UpdateCategoryParametersAction>{ + type: GeneralActions.UPDATE_CATEGORY_PARAMETERS, + categoryParameters : categoryParametersObj + })['categoryParameters']; + + expect(categoryParametersState).toBeDefined(); + expect(categoryParametersState['owningEntityList'][0].id).toEqual(list[0].id); + expect(categoryParametersState['owningEntityList'][0].isPermitted).toEqual(list[0].isPermitted); + expect(categoryParametersState['owningEntityList'][0].name).toEqual(list[0].name); + + expect(categoryParametersState['projectList'][0].id).toEqual(list[0].id); + expect(categoryParametersState['projectList'][0].isPermitted).toEqual(list[0].isPermitted); + expect(categoryParametersState['projectList'][0].name).toEqual(list[0].name); + + expect(categoryParametersState['lineOfBusinessList'][0].id).toEqual(list[0].id); + expect(categoryParametersState['lineOfBusinessList'][0].isPermitted).toEqual(list[0].isPermitted); + expect(categoryParametersState['lineOfBusinessList'][0].name).toEqual(list[0].name); + + expect(categoryParametersState['platformList'][0].id).toEqual(list[0].id); + expect(categoryParametersState['platformList'][0].isPermitted).toEqual(list[0].isPermitted); + expect(categoryParametersState['platformList'][0].name).toEqual(list[0].name); + }); + + test('#UPDATE_USER_ID : should update user id', () => { + const userId = 'userId'; + let userState = generalReducer(<any>{serviceInstance : {}}, + <UpdateUserIdAction>{ + type: GeneralActions.UPDATE_USER_ID, + userId : userId + })['userId']; + + expect(userState).toBeDefined(); + expect(userState).toEqual(userId); + }); + + test('#DELETE_VNF_INSTANCE : should delete existing vnf', () => { + let state = generalReducer(<any>{serviceInstance : { + 'serviceModelId' : { + vnfs : { + 'modelName' : {} + } + } + }}, + <RemoveInstanceAction>{ + type: GeneralActions.REMOVE_INSTANCE, + modelName : 'modelName', + serviceModelId : 'serviceModelId', + storeKey : 'modelName', + node : { + data : { + type : 'VF' + } + } + }); + + expect(state).toBeDefined(); + expect(state.serviceInstance[ 'serviceModelId'].vnfs['modelName']).not.toBeDefined(); + }); + + test('#DELETE_VNF_INSTANCE : should delete existing network', () => { + let state = generalReducer(<any>{serviceInstance : { + 'serviceModelId' : { + 'networks' : { + 'modelName' : {} + } + } + }}, + <RemoveInstanceAction>{ + type: GeneralActions.REMOVE_INSTANCE, + modelName : 'modelName', + serviceModelId : 'serviceModelId', + storeKey : 'modelName', + node : { + data : { + type : 'VL' + } + } + }); + + expect(state).toBeDefined(); + expect(state.serviceInstance['serviceModelId'].networks['modelName']).not.toBeDefined(); + }); + + test('#CHANGE_VNF_INSTANCE_COUNTER : should init existingVNFCounterMap to 1', () => { + let state = generalReducer(<any>{serviceInstance : { + 'serviceModelId' : { + vnfs : { + 'vnfName' : { } + }, + existingVNFCounterMap : { + + } + } + }}, + <ChangeInstanceCounterAction>{ + type: GeneralActions.CHANGE_INSTANCE_COUNTER, + serviceUUID : 'serviceModelId', + node : {data : {type : 'VF'}}, + UUID : 'vnfUUID', + changeBy : 1 + }); + + expect(state).toBeDefined(); + expect(state.serviceInstance['serviceModelId'].existingVNFCounterMap['vnfUUID']).toEqual(1); + }); + + test('#CHANGE_VNF_INSTANCE_COUNTER : should increase existingVNFCounterMap to 2 if VNF exist', () => { + let state = generalReducer(<any>{serviceInstance : { + 'serviceModelId' : { + vnfs : { + 'vnfName' : { } + }, + existingVNFCounterMap : { + 'vnfUUID' : 1 + } + } + }}, + <ChangeInstanceCounterAction>{ + type: GeneralActions.CHANGE_INSTANCE_COUNTER, + serviceUUID : 'serviceModelId', + UUID : 'vnfUUID', + node : {data : {type : 'VF'}}, + changeBy : 1 + }); + + expect(state).toBeDefined(); + expect(state.serviceInstance['serviceModelId'].existingVNFCounterMap['vnfUUID']).toEqual(2); + }); + + test('#CHANGE_VNF_INSTANCE_COUNTER : should remove existingVNFCounterMap to 0 remove VNF', () => { + + let state = generalReducer(<any>{serviceInstance : { + 'serviceModelId' : { + vnfs : { + 'vnfName' : { } + }, + existingVNFCounterMap : { + 'vnfUUID' : 1 + } + } + }}, + <ChangeInstanceCounterAction>{ + type: GeneralActions.CHANGE_INSTANCE_COUNTER, + serviceUUID : 'serviceModelId', + UUID : 'vnfUUID', + node : {data : {type : 'VF'}}, + changeBy : -1 + }); + + expect(state).toBeDefined(); + expect(state.serviceInstance['serviceModelId'].existingVNFCounterMap['vnfUUID']).toEqual(0); + }); + + test('#DUPLICATE_BULK_INSTANCES : should duplicate existing VNF/Network', ()=>{ + let existingNames = { + 'vnfOriginalName' : 1 + }; + + let vnfInstance: VnfInstance = new VnfInstance(); + vnfInstance.originalName = 'vnfOriginalName'; + vnfInstance.vnfStoreKey = 'vnfStoreKey'; + + let cloneObjects = { + 'vnfOriginalName' : vnfInstance, + 'vnfOriginalName:0001' : vnfInstance, + 'vnfOriginalName:0002' : vnfInstance, + 'vnfOriginalName:0003' : vnfInstance + }; + + let node : ITreeNode = <any>{ + data : { + serviceId : 'serviceModelId', + vnfStoreKey : 'vnfStoreKey', + type : 'VF' + } + }; + + let vnfsState = generalReducer(<any>{serviceInstance : { + 'serviceModelId' : { + vnfs : { + }, + existingVNFCounterMap : {} + } + }}, + <DuplicateBulkInstancesAction>{ + type: GeneralActions.DUPLICATE_BULK_INSTANCES, + serviceId: 'serviceModelId', + modelName: 'modelName', + originalName : 'modelName', + objects : cloneObjects, + existingNames: existingNames, + node : node + }).serviceInstance['serviceModelId'].vnfs; + + expect(vnfsState).toBeDefined(); + expect(Object.keys(vnfsState).length).toEqual(4); + }); + + test('#UPDATE_NETWORK_FUNCTION : should update network functions', ()=>{ + let state = generalReducer(<any>{serviceInstance : { + 'serviceModelId' : { + vnfs : { + }, + existingVNFCounterMap : {} + } + }}, + <UpdateNetworkCollectionFunction>{ + type: GeneralActions.UPDATE_NETWORK_FUNCTION, + network_function : { + results : [] + }, + networksAccordingToNetworkCollection : "networksAccordingToNetworkCollection" + }); + + expect(state).toBeDefined(); + expect(state['networkFunctions']).toBeDefined(); + }); +}); + + + diff --git a/vid-webpack-master/src/app/shared/storeUtil/utils/general/general.reducers.ts b/vid-webpack-master/src/app/shared/storeUtil/utils/general/general.reducers.ts new file mode 100644 index 000000000..8ee47331f --- /dev/null +++ b/vid-webpack-master/src/app/shared/storeUtil/utils/general/general.reducers.ts @@ -0,0 +1,147 @@ +import {Action} from "redux"; +import { + ChangeInstanceCounterAction, RemoveInstanceAction, DuplicateBulkInstancesAction, + GeneralActions, + UpdateAicZonesAction, UpdateCategoryParametersAction, + UpdateLcpRegionsAndTenantsAction, UpdateNetworkCollectionFunction, + UpdateProductFamiliesAction, UpdateServiceTypesAction, + UpdateSubscribersAction, UpdateUserIdAction +} from "./general.actions"; +import {TypeNodeInformation} from "../../../../drawingBoard/service-planning/typeNodeInformation.model"; +import * as _ from "lodash"; +import {ITreeNode} from "angular-tree-component/dist/defs/api"; +import {ServiceInstance} from "../../../models/serviceInstance"; +import {ServiceState} from "../main.reducer"; + +export function generalReducer(state: ServiceState, action: Action) : ServiceState { + switch (action.type) { + case GeneralActions.UPDATE_LCP_REGIONS_AND_TENANTS: { + Object.assign(state, (<UpdateLcpRegionsAndTenantsAction>action)); + return Object.assign({}, state); + } + case GeneralActions.UPDATE_SUBSCRIBERS: { + Object.assign(state, (<UpdateSubscribersAction>action)); + return Object.assign({}, state); + } + case GeneralActions.UPDATE_AIC_ZONES: { + Object.assign(state, (<UpdateAicZonesAction>action)); + return Object.assign({}, state); + } + case GeneralActions.UPDATE_PRODUCT_FAMILIES: { + Object.assign(state, (<UpdateProductFamiliesAction>action)); + return Object.assign({}, state); + } + case GeneralActions.UPDATE_NETWORK_FUNCTION: { + const networkFunctionReduxObj = state['networkFunctions'] == undefined ? {} : state['networkFunctions']; + networkFunctionReduxObj[(<UpdateNetworkCollectionFunction>action).network_function] = (<UpdateNetworkCollectionFunction>action).networksAccordingToNetworkCollection; + Object.assign(state, {'networkFunctions': networkFunctionReduxObj}); + return Object.assign({}, state); + } + case GeneralActions.UPDATE_SERVICE_TYPES: { + state.serviceTypes[(<UpdateServiceTypesAction>action).subscriberId] = (<UpdateServiceTypesAction>action).serviceTypes; + return Object.assign({}, state); + } + case GeneralActions.UPDATE_CATEGORY_PARAMETERS: { + Object.assign(state, (<UpdateCategoryParametersAction>action)); + return Object.assign({}, state); + } + case GeneralActions.UPDATE_USER_ID: { + const updateUserId: UpdateUserIdAction = <UpdateUserIdAction>action; + let newState = _.cloneDeep(state); + newState['userId'] = updateUserId.userId; + return newState; + } + case GeneralActions.REMOVE_INSTANCE: { + const actionData = (<RemoveInstanceAction>action); + if (state.serviceInstance[actionData.serviceModelId]) { + const typeNodeInformation : TypeNodeInformation = new TypeNodeInformation(actionData.node); + updateIsMissingDataOnDelete(state, actionData.serviceModelId, actionData.storeKey, actionData.node); + updateUniqueNames(state.serviceInstance[actionData.serviceModelId][typeNodeInformation.hierarchyName][actionData.storeKey].instanceName, null, state.serviceInstance[actionData.serviceModelId]); + if(actionData.node.data.type === 'VF'){ + _.forOwn(state.serviceInstance[actionData.serviceModelId][typeNodeInformation.hierarchyName][actionData.storeKey].vfModules, (vfModuleMap) => { + _.forOwn(vfModuleMap, (vfModuleInstance) => { + updateUniqueNames(vfModuleInstance.instanceName, null, state.serviceInstance[actionData.serviceModelId]); + }) + }); + } + delete state.serviceInstance[actionData.serviceModelId][typeNodeInformation.hierarchyName][actionData.storeKey]; + } + return Object.assign({}, state); + } + + case GeneralActions.CHANGE_INSTANCE_COUNTER : { + const changeInstanceCounterAction = <ChangeInstanceCounterAction>action; + const typeNodeInformation : TypeNodeInformation = new TypeNodeInformation(changeInstanceCounterAction.node); + let newState = _.cloneDeep(state); + + let existing: number = getExistingCounter(newState, changeInstanceCounterAction.serviceUUID, changeInstanceCounterAction.UUID, typeNodeInformation); + newState.serviceInstance[changeInstanceCounterAction.serviceUUID][typeNodeInformation.existingMappingCounterName][changeInstanceCounterAction.UUID] = existing ? existing + changeInstanceCounterAction.changeBy : changeInstanceCounterAction.changeBy; + return newState; + } + + case GeneralActions.DUPLICATE_BULK_INSTANCES : { + const createInstanceAction = <DuplicateBulkInstancesAction>action; + const typeNodeInformation : TypeNodeInformation = new TypeNodeInformation(createInstanceAction.node); + const serviceId = createInstanceAction.serviceId; + const objects = createInstanceAction.objects; + + let newState = _.cloneDeep(state); + newState.serviceInstance[serviceId].existingNames = createInstanceAction.existingNames; + newState.serviceInstance[serviceId][typeNodeInformation.hierarchyName] = Object.assign({}, newState.serviceInstance[serviceId][typeNodeInformation.hierarchyName], objects); + return newState; + } + } +} + +const getExistingCounter = (state: any, serviceModelId: string, modelId: string, typeNodeInformation : TypeNodeInformation ) : number => { + const serviceExistingCounterMap = state.serviceInstance[serviceModelId][typeNodeInformation.existingMappingCounterName]; + if(serviceExistingCounterMap && !_.isNil(serviceExistingCounterMap[modelId])){ + return serviceExistingCounterMap[modelId]; + }else { + return null; + } +}; + +const updateIsMissingDataOnDelete = (state: any, serviceModelId: string, storeKey: string, node: ITreeNode): void => { + const typeNodeInformation : TypeNodeInformation = new TypeNodeInformation(node); + let vnf = state.serviceInstance[serviceModelId][typeNodeInformation.hierarchyName][storeKey]; + if(node.children){ + _.forOwn(vnf.vfModules, (vfModules, vfModulesKey) => { + updateIsMissingDataOnDeleteVFModule(state, serviceModelId, storeKey, vfModulesKey); + }); + } + + + let isMissingData: boolean = state.serviceInstance[serviceModelId][typeNodeInformation.hierarchyName][storeKey].isMissingData; + updateServiceValidationCounter(state, isMissingData, false, serviceModelId); +}; + +const updateUniqueNames = (oldName : string, newName : string, serviceInstance : ServiceInstance) : void => { + let existingNames = serviceInstance.existingNames; + if (!_.isNil(oldName) && oldName.toLowerCase() in existingNames) { + delete existingNames[oldName.toLowerCase()]; + } + if(!_.isNil(newName)) { + existingNames[newName.toLowerCase()] = ""; + } +}; + +const updateIsMissingDataOnDeleteVFModule = (state: any, serviceModelId: string, vnfStoreKey: string, vfModuleName): void => { + const vfModules = state.serviceInstance[serviceModelId].vnfs[vnfStoreKey].vfModules[vfModuleName]; + + _.forOwn(vfModules, (vfModuleInstance) => { + let isMissingData: boolean = vfModuleInstance.isMissingData; + updateServiceValidationCounter(state, isMissingData, false, serviceModelId); + }); +}; + +const updateServiceValidationCounter = (newState: any, oldValidationState: boolean, newValidationState: boolean, serviceUuid: string) => { + if (oldValidationState && !newValidationState) { + newState.serviceInstance[serviceUuid].validationCounter--; + } else if (!oldValidationState && newValidationState) { + newState.serviceInstance[serviceUuid].validationCounter++; + } +}; + + + diff --git a/vid-webpack-master/src/app/shared/storeUtil/utils/global/global.actions.ts b/vid-webpack-master/src/app/shared/storeUtil/utils/global/global.actions.ts new file mode 100644 index 000000000..609ec69f4 --- /dev/null +++ b/vid-webpack-master/src/app/shared/storeUtil/utils/global/global.actions.ts @@ -0,0 +1,37 @@ +import {Action, ActionCreator} from "redux"; + +export enum GlobalActions { + UPDATE_NAME = 'UPDATE_NAME', + UPDATE_FLAGS = 'UPDATE_FLAGS', + UPDATE_DRAWING_BOARD_STATUS = 'UPDATE_DRAWING_BOARD_STATUS' +} + +export interface UpdateGlobalAction extends Action { + name?: string; +} + +export interface UpdateFlagsAction extends Action { + flags?: any; +} + +export interface UpdateDrawingBoardStatusAction extends Action{ + drawingBoardStatus?: any; +} + +export const updateName: ActionCreator<UpdateGlobalAction> = + (name) => ({ + type: GlobalActions.UPDATE_NAME, + name: name + }); + +export const updateFlags: ActionCreator<UpdateFlagsAction> = + (flags) => ({ + type: GlobalActions.UPDATE_FLAGS, + flags: flags + }); + +export const updateDrawingBoardStatus: ActionCreator<UpdateDrawingBoardStatusAction> = + (drawingBoardStatus) => ({ + type: GlobalActions.UPDATE_DRAWING_BOARD_STATUS, + drawingBoardStatus: drawingBoardStatus + }); diff --git a/vid-webpack-master/src/app/shared/storeUtil/utils/global/global.reducers.spec.ts b/vid-webpack-master/src/app/shared/storeUtil/utils/global/global.reducers.spec.ts new file mode 100644 index 000000000..4fc80863a --- /dev/null +++ b/vid-webpack-master/src/app/shared/storeUtil/utils/global/global.reducers.spec.ts @@ -0,0 +1,48 @@ +import {GlobalActions, UpdateFlagsAction, UpdateGlobalAction, UpdateDrawingBoardStatusAction} from "./global.actions"; +import {globalReducer} from "./global.reducers"; + + +describe('globalReducer', () => { + + test('#UPDATE_FLAGS : should update global flags', () => { + const flags = { + 'A' : 'A', + 'B' : 'B', + 'C' : 'C', + 'D' : 'D' + }; + let flagsState = globalReducer(<any>{global : {}}, + <UpdateFlagsAction>{ + type: GlobalActions.UPDATE_FLAGS, + flags : flags + }).flags; + + expect(flagsState).toBeDefined(); + expect(<any>flagsState).toEqual(<any>flags); + }); + + test('#UPDATE_NAME : should update global name', () => { + const name = 'name'; + let globalState = globalReducer(<any>{global : {}}, + <UpdateGlobalAction>{ + type: GlobalActions.UPDATE_NAME, + name : name + }); + expect(globalState).toBeDefined(); + expect(globalState.name).toEqual(name); + }); + + test('#UPDATE_DRAWING_BOARD_STATUS : should update global drawing board status', ()=> { + const drawingBoardStatus = 'EDIT'; + let globalDrawingBoardState = globalReducer(<any>{global : {}}, + <UpdateDrawingBoardStatusAction>{ + type: GlobalActions.UPDATE_DRAWING_BOARD_STATUS, + drawingBoardStatus : drawingBoardStatus + }); + expect(globalDrawingBoardState).toBeDefined(); + expect(globalDrawingBoardState.drawingBoardStatus).toEqual(drawingBoardStatus); + }); +}); + + + diff --git a/vid-webpack-master/src/app/global.reducer.ts b/vid-webpack-master/src/app/shared/storeUtil/utils/global/global.reducers.ts index cffd34603..f9e083414 100644 --- a/vid-webpack-master/src/app/global.reducer.ts +++ b/vid-webpack-master/src/app/shared/storeUtil/utils/global/global.reducers.ts @@ -1,28 +1,28 @@ -/* tslint:disable no-switch-case-fall-through */ import {Action} from 'redux'; -import {UPDATE_FLAGS, UPDATE_NAME, UpdateFlagsAction, UpdateGlobalAction} from "./global.actions"; - - +import {GlobalActions, UpdateFlagsAction, UpdateGlobalAction, UpdateDrawingBoardStatusAction} from "./global.actions"; export interface GlobalState { name : string; flags : { [key: string]: boolean }; + drawingBoardStatus : string; } const initialState: GlobalState = { name : null, - flags : null + flags : null, + drawingBoardStatus : null }; - -export const GlobalReducer = +export const globalReducer = function (state: GlobalState = initialState, action: Action): GlobalState { switch (action.type) { - case UPDATE_NAME: + case GlobalActions.UPDATE_NAME: return Object.assign(state, state, (<UpdateGlobalAction>action)); - case UPDATE_FLAGS: + case GlobalActions.UPDATE_FLAGS: Object.assign(state, (<UpdateFlagsAction>action)); return Object.assign({}, state); + case GlobalActions.UPDATE_DRAWING_BOARD_STATUS: + return Object.assign(state, state, (<UpdateDrawingBoardStatusAction>action)); default: return state; } diff --git a/vid-webpack-master/src/app/shared/storeUtil/utils/main.reducer.ts b/vid-webpack-master/src/app/shared/storeUtil/utils/main.reducer.ts new file mode 100644 index 000000000..2166c81a0 --- /dev/null +++ b/vid-webpack-master/src/app/shared/storeUtil/utils/main.reducer.ts @@ -0,0 +1,67 @@ +import {LcpRegionsAndTenants} from "../../models/lcpRegionsAndTenants"; +import {CategoryParams} from "../../models/categoryParams"; +import {Action} from "redux"; +import {ServiceActions} from "./service/service.actions"; +import {GeneralActions} from "./general/general.actions"; +import {NetworkActions} from "./network/network.actions"; +import {VfModuleActions} from "./vfModule/vfModule.actions"; +import {VNFActions} from "./vnf/vnf.actions"; +import {vnfReducer} from "./vnf/vnf.reducers"; +import {generalReducer} from "./general/general.reducers"; +import {serviceReducer} from "./service/service.reducers"; +import {networkReducer} from "./network/network.reducers"; +import {vfModuleReducer} from "./vfModule/vfModule.reducers"; +import {ServiceInstance} from "../../models/serviceInstance"; +import {SelectOptionInterface} from "../../models/selectOption"; +import {ServiceType} from "../../models/serviceType"; +import {VnfGroupActions} from "./vnfGroup/vnfGroup.actions"; +import {vnfGroupReducer} from "./vnfGroup/vnfGroup.reducers"; +import {RelatedVnfActions} from "./relatedVnfMember/relatedVnfMember.actions"; +import {relatedVnfMemeberReducer} from "./relatedVnfMember/relatedVnfMember.reducers"; + +export let initialState: ServiceState = { + serviceHierarchy: {}, + serviceInstance: {}, + lcpRegionsAndTenants: new LcpRegionsAndTenants(), + subscribers: null, + productFamilies: null, + serviceTypes: {}, + aicZones: null, + categoryParameters: new CategoryParams() +}; + + +export interface ServiceState { + serviceHierarchy: any; + serviceInstance: { [uuid: string]: ServiceInstance; }; + lcpRegionsAndTenants: LcpRegionsAndTenants; + subscribers: SelectOptionInterface[]; + productFamilies: any; + serviceTypes: { [subscriberId: string]: ServiceType[]; }; + aicZones: SelectOptionInterface[]; + categoryParameters: CategoryParams; +} + +export const MainReducer = function (state: ServiceState = initialState, action: Action): ServiceState { + console.info("action name", action.type); + if(Object.values(ServiceActions).includes(action.type)){ + return serviceReducer(state, action); + }else if (Object.values(GeneralActions).includes(action.type)){ + return generalReducer(state, action); + }else if (Object.values(NetworkActions).includes(action.type)){ + return networkReducer(state, action); + }else if (Object.values(VfModuleActions).includes(action.type)){ + return vfModuleReducer(state, action); + }else if (Object.values(VNFActions).includes(action.type)){ + return vnfReducer(state, action); + }else if (Object.values(VnfGroupActions).includes(action.type)){ + return vnfGroupReducer(state, action); + }else if(Object.values(RelatedVnfActions).includes(action.type)){ + return relatedVnfMemeberReducer(state, action); + } else { + return Object.assign({}, state); + } +}; + + + diff --git a/vid-webpack-master/src/app/shared/storeUtil/utils/network/network.actions.ts b/vid-webpack-master/src/app/shared/storeUtil/utils/network/network.actions.ts new file mode 100644 index 000000000..c90d8eb3d --- /dev/null +++ b/vid-webpack-master/src/app/shared/storeUtil/utils/network/network.actions.ts @@ -0,0 +1,94 @@ +import {Action, ActionCreator} from "redux"; +import {NetworkInstance} from "../../../models/networkInstance"; + +export enum NetworkActions { + UPDATE_NETWORK_INSTANCE = "UPDATE_NETWORK_INSTANCE", + UPDATE_NETWORK_FUNCTION = 'UPDATE_NETWORK_FUNCTION', + CREATE_NETWORK_INSTANCE = 'CREATE_NETWORK_INSTANCE', + DELETE_ACTION_NETWORK_INSTANCE = "DELETE_ACTION_NETWORK_INSTANCE", + UNDO_DELETE_ACTION_NETWORK_INSTANCE = "UNDO_DELETE_ACTION_NETWORK_INSTANCE", + UPDATE_NETWORK_POSITION = "UPDATE_NETWORK_POSITION" + +} + + +export interface UpdateNetworkPosition extends Action { + node: any, + instanceId : string, + networkStoreKey?: string; +} + +export interface UpdateNetworkInstanceAction extends Action { + networkInstance?: NetworkInstance; + networkModelName?: string; + serviceUuid?: string; + networkStoreKey?:string; +} + +export interface UpdateNetworkCollectionFunction extends Action { + networksAccordingToNetworkCollection: any; + network_function: any; +} + +export interface CreateNetworkInstanceAction extends Action { + networkInstance?: NetworkInstance; + networkModelName?: string; + serviceUuid?: string; + networkStoreKey?:string; +} + +export interface DeleteActionNetworkInstanceAction extends Action { + networkStoreKey: string; + serviceId?: string; +} + +export interface UndoDeleteActionNetworkInstanceAction extends Action { + networkStoreKey: string; + serviceId?: string; +} + +export const updateNetworkInstance: ActionCreator<UpdateNetworkInstanceAction> = (networkInstance, networkfModelName, serviceUuid, networkStoreKey) => ({ + type: NetworkActions.UPDATE_NETWORK_INSTANCE, + networkInstance: networkInstance, + networkModelName: networkfModelName, + serviceUuid: serviceUuid, + networkStoreKey : networkStoreKey +}); + + +export const updateNetworkCollectionFunction: ActionCreator<UpdateNetworkCollectionFunction> = (ncf, networksAccordingToNetworkCollection) => ({ + type: NetworkActions.UPDATE_NETWORK_FUNCTION, + networksAccordingToNetworkCollection: networksAccordingToNetworkCollection["results"], + network_function: ncf +}); + +export const createNetworkInstance: ActionCreator<CreateNetworkInstanceAction> = (networkInstance, networkModelName, serviceUuid, networkStoreKey) => ({ + type: NetworkActions.CREATE_NETWORK_INSTANCE, + networkInstance: networkInstance, + networkModelName: networkModelName, + serviceUuid: serviceUuid, + networkStoreKey : networkStoreKey +}); + + +export const deleteActionNetworkInstance: ActionCreator<DeleteActionNetworkInstanceAction> = (networkStoreKey, serviceId) => ({ + type: NetworkActions.DELETE_ACTION_NETWORK_INSTANCE, + networkStoreKey: networkStoreKey, + serviceId: serviceId +}); + +export const undoDeleteActionNetworkInstance: ActionCreator<UndoDeleteActionNetworkInstanceAction> = (networkStoreKey, serviceId) => ({ + type: NetworkActions.UNDO_DELETE_ACTION_NETWORK_INSTANCE, + networkStoreKey: networkStoreKey, + serviceId: serviceId +}); + + +export const updateNetworkPosition: ActionCreator<UpdateNetworkPosition> = (node, instanceId, networkStoreKey) => ({ + type: NetworkActions.UPDATE_NETWORK_POSITION, + node: node, + instanceId: instanceId, + networkStoreKey : networkStoreKey +}); + + diff --git a/vid-webpack-master/src/app/shared/storeUtil/utils/network/network.reducers.spec.ts b/vid-webpack-master/src/app/shared/storeUtil/utils/network/network.reducers.spec.ts new file mode 100644 index 000000000..ba41ad6e6 --- /dev/null +++ b/vid-webpack-master/src/app/shared/storeUtil/utils/network/network.reducers.spec.ts @@ -0,0 +1,114 @@ +import {networkReducer} from "./network.reducers"; +import { + CreateNetworkInstanceAction, DeleteActionNetworkInstanceAction, + NetworkActions, UndoDeleteActionNetworkInstanceAction, + UpdateNetworkCollectionFunction, + UpdateNetworkInstanceAction +} from "./network.actions"; +import {NetworkInstance} from "../../../models/networkInstance"; +import {ServiceInstanceActions} from "../../../models/serviceInstanceActions"; + + +describe('networkReducer', () => { + test('#CREATE_SERVICE_INSTANCE', () => { + let networkInstance: NetworkInstance = new NetworkInstance(); + networkInstance.isMissingData = false; + networkInstance.instanceName = 'instanceName'; + let networkState = networkReducer(<any>{serviceInstance : { + 'serviceModelId' : { + networks : { + 'networkStoreKey' : { + isMissingData : true + } + } + } + }}, + <UpdateNetworkInstanceAction>{ + type: NetworkActions.UPDATE_NETWORK_INSTANCE, + networkInstance : new NetworkInstance(), + networkStoreKey : 'networkStoreKey', + networkModelName : 'networkModelName', + serviceUuid : 'serviceModelId' + }).serviceInstance['serviceModelId'].networks['networkStoreKey']; + + expect(networkState).toBeDefined(); + expect(networkState.isMissingData).toBeFalsy(); + }); + + test('#CREATE_NETWORK_INSTANCE', () => { + let networkInstance: NetworkInstance = new NetworkInstance(); + networkInstance.isMissingData = false; + networkInstance.instanceName = 'instanceName'; + let networkState = networkReducer(<any>{serviceInstance : { + 'serviceModelId' : { + networks : {} + } + }}, + <CreateNetworkInstanceAction>{ + type: NetworkActions.CREATE_NETWORK_INSTANCE, + networkInstance : new NetworkInstance(), + networkStoreKey : null, + networkModelName : 'networkModelName', + serviceUuid : 'serviceModelId' + }).serviceInstance['serviceModelId'].networks['networkModelName']; + + expect(networkState).toBeDefined(); + expect(networkState.isMissingData).toBeFalsy(); + }); + + test('#UPDATE_NETWORK_FUNCTION', () => { + let state = networkReducer(<any>{serviceInstance : {}}, + <UpdateNetworkCollectionFunction>{ + type: NetworkActions.UPDATE_NETWORK_FUNCTION, + networksAccordingToNetworkCollection: 'networksAccordingToNetworkCollection', + network_function: 'network_function' + }); + + expect(state).toBeDefined(); + }); + + test('#DELETE_ACTION_NETWORK_INSTANCE', () => { + let networkState = networkReducer(<any>{serviceInstance : { + 'serviceModelId' : { + networks : { + 'networkStoreKey' : { + isMissingData : true, + action : 'None' + } + } + } + }}, + <DeleteActionNetworkInstanceAction>{ + type: NetworkActions.DELETE_ACTION_NETWORK_INSTANCE, + networkStoreKey: 'networkStoreKey', + serviceId: 'serviceModelId' + }).serviceInstance['serviceModelId'].networks['networkStoreKey']; + + expect(networkState).toBeDefined(); + expect(networkState.action).toEqual(ServiceInstanceActions.None_Delete); + }); + + test('#UNDO_DELETE_ACTION_NETWORK_INSTANCE', () => { + let networkState = networkReducer(<any>{serviceInstance : { + 'serviceModelId' : { + networks : { + 'networkStoreKey' : { + isMissingData : true, + action : 'Update_Delete' + } + } + } + }}, + <UndoDeleteActionNetworkInstanceAction>{ + type: NetworkActions.UNDO_DELETE_ACTION_NETWORK_INSTANCE, + networkStoreKey: 'networkStoreKey', + serviceId: 'serviceModelId' + }).serviceInstance['serviceModelId'].networks['networkStoreKey']; + + expect(networkState).toBeDefined(); + expect(networkState.action).toEqual(ServiceInstanceActions.Update); + }); +}); + + + diff --git a/vid-webpack-master/src/app/shared/storeUtil/utils/network/network.reducers.ts b/vid-webpack-master/src/app/shared/storeUtil/utils/network/network.reducers.ts new file mode 100644 index 000000000..bcbbea57d --- /dev/null +++ b/vid-webpack-master/src/app/shared/storeUtil/utils/network/network.reducers.ts @@ -0,0 +1,102 @@ +import {Action} from "redux"; +import * as _ from "lodash"; +import {NetworkInstance} from "../../../models/networkInstance"; +import { + CreateNetworkInstanceAction, DeleteActionNetworkInstanceAction, + NetworkActions, UndoDeleteActionNetworkInstanceAction, + UpdateNetworkCollectionFunction, + UpdateNetworkInstanceAction +} from "./network.actions"; +import {ServiceInstance} from "../../../models/serviceInstance"; +import {calculateNextUniqueModelName} from "../vnf/vnf.reducers"; +import {ServiceState} from "../main.reducer"; +import {ServiceInstanceActions} from "../../../models/serviceInstanceActions"; + + +export function networkReducer(state: ServiceState , action: Action) : ServiceState { + switch (action.type) { + case NetworkActions.CREATE_NETWORK_INSTANCE: { + const updateNetworkInstanceAction = <CreateNetworkInstanceAction>action; + const serviceUuid = updateNetworkInstanceAction.serviceUuid; + let networkModelName = updateNetworkInstanceAction.networkModelName; + + + let newState = _.cloneDeep(state); + + updateNetworkInstanceAction.networkInstance.originalName = networkModelName; + updateNetworkInstanceAction.networkModelName = calculateNextUniqueModelName(networkModelName, serviceUuid, newState, 'networks'); + + let networkInstance: NetworkInstance = newState.serviceInstance[serviceUuid].networks[networkModelName]; + networkInstance = new NetworkInstance(); + updateNetworkInstanceAction.networkInstance.networkStoreKey = updateNetworkInstanceAction.networkModelName; + updateNetworkInstanceAction.networkInstance.originalName = networkModelName; + networkInstance.originalName = updateNetworkInstanceAction.networkInstance.originalName; + networkInstance.networkStoreKey = updateNetworkInstanceAction.networkInstance.networkStoreKey; + updateServiceValidationCounter(newState, networkInstance['isMissingData'], updateNetworkInstanceAction.networkInstance['isMissingData'], serviceUuid); + + newState.serviceInstance[serviceUuid].networks[updateNetworkInstanceAction.networkModelName] = Object.assign(networkInstance, updateNetworkInstanceAction.networkInstance); + return newState; + } + case NetworkActions.UPDATE_NETWORK_INSTANCE: { + const updateNetworkInstanceAction = <UpdateNetworkInstanceAction>action; + const serviceUuid = updateNetworkInstanceAction.serviceUuid; + let networkStoreKey = updateNetworkInstanceAction.networkStoreKey; + + let newState = _.cloneDeep(state); + let networkInstance: NetworkInstance = newState.serviceInstance[serviceUuid].networks[networkStoreKey]; + updateUniqueNames(networkInstance? networkInstance.instanceName : null, updateNetworkInstanceAction.networkInstance.instanceName, newState.serviceInstance[serviceUuid]); + + networkInstance = networkInstance || new NetworkInstance(); + updateServiceValidationCounter(newState, networkInstance['isMissingData'], updateNetworkInstanceAction.networkInstance['isMissingData'], serviceUuid); + + newState.serviceInstance[serviceUuid].networks[networkStoreKey] = Object.assign(networkInstance, updateNetworkInstanceAction.networkInstance); + return newState; + } + case NetworkActions.UPDATE_NETWORK_FUNCTION: { + let networkFunctionReduxObj = state['networkFunctions'] == undefined ? {} : state['networkFunctions']; + networkFunctionReduxObj[(<UpdateNetworkCollectionFunction>action).network_function] = (<UpdateNetworkCollectionFunction>action).networksAccordingToNetworkCollection; + Object.assign(state, {'networkFunctions': networkFunctionReduxObj}); + return Object.assign({}, state); + } + case NetworkActions.DELETE_ACTION_NETWORK_INSTANCE : { + let newState = _.cloneDeep(state); + let network = newState.serviceInstance[(<DeleteActionNetworkInstanceAction>action).serviceId].networks[(<DeleteActionNetworkInstanceAction>action).networkStoreKey]; + let oldAction = network.action; + if(oldAction === ServiceInstanceActions.None_Delete || oldAction === ServiceInstanceActions.Update_Delete) return newState; + newState.serviceInstance[(<DeleteActionNetworkInstanceAction>action).serviceId].networks[(<DeleteActionNetworkInstanceAction>action).networkStoreKey].action = (oldAction + '_Delete') as ServiceInstanceActions; + updateServiceValidationCounter(newState, network['isMissingData'], false , (<DeleteActionNetworkInstanceAction>action).serviceId); + + return newState; + } + + case NetworkActions.UNDO_DELETE_ACTION_NETWORK_INSTANCE : { + let newState = _.cloneDeep(state); + let network = newState.serviceInstance[(<UndoDeleteActionNetworkInstanceAction>action).serviceId].networks[(<UndoDeleteActionNetworkInstanceAction>action).networkStoreKey]; + let oldState = network.action; + newState.serviceInstance[(<UndoDeleteActionNetworkInstanceAction>action).serviceId].networks[(<UndoDeleteActionNetworkInstanceAction>action).networkStoreKey].action = (oldState.split('_')[0]) as ServiceInstanceActions; + updateServiceValidationCounter(newState, network['isMissingData'], false , (<DeleteActionNetworkInstanceAction>action).serviceId); + return newState; + } + } +} + +const updateUniqueNames = (oldName : string, newName : string, serviceInstance : ServiceInstance) : void => { + let existingNames = serviceInstance.existingNames; + if (!_.isNil(oldName) && oldName.toLowerCase() in existingNames) { + delete existingNames[oldName.toLowerCase()]; + } + if(!_.isNil(newName)) { + existingNames[newName.toLowerCase()] = ""; + } +}; + + +const updateServiceValidationCounter = (newState: any, oldValidationState: boolean, newValidationState: boolean, serviceUuid: string) => { + if (oldValidationState && !newValidationState) { + newState.serviceInstance[serviceUuid].validationCounter--; + } else if (!oldValidationState && newValidationState) { + newState.serviceInstance[serviceUuid].validationCounter++; + } +}; + + diff --git a/vid-webpack-master/src/app/shared/storeUtil/utils/relatedVnfMember/relatedVnfMember.actions.ts b/vid-webpack-master/src/app/shared/storeUtil/utils/relatedVnfMember/relatedVnfMember.actions.ts new file mode 100644 index 000000000..faa7a52d3 --- /dev/null +++ b/vid-webpack-master/src/app/shared/storeUtil/utils/relatedVnfMember/relatedVnfMember.actions.ts @@ -0,0 +1,68 @@ +import {Action, ActionCreator} from "redux"; + +export enum RelatedVnfActions { + CREATE_RELATED_VNF_MEMBER_INSTANCE = "CREATE_RELATED_VNF_MEMBER_INSTANCE", + REMOVE_RELATED_VNF_MEMBER_INSTANCE = "REMOVE_RELATED_VNF_MEMBER_INSTANCE", + DELETE_ACTION_RELATED_VNF_MEMBER_INSTANCE = "DELETE_ACTION_RELATED_VNF_MEMBER_INSTANCE", + UNDO_DELETE_ACTION_RELATED_VNF_MEMBER_INSTANCE = "UNDO_DELETE_ACTION_RELATED_VNF_MEMBER_INSTANCE" +} + +export interface RemoveRelatedVnfMemebrInstance extends Action { + vnfGroupStoreKey: string; + relatedVnfMemeberStoreKey: string; + serviceId?: string; +} + +export interface DeleteRelatedVnfMemebrInstanceAction extends Action { + vnfGroupStoreKey: string; + relatedVnfMemeberStoreKey: string; + serviceId?: string; +} + +export interface DeleteActionRelatedVnfMemeberInstanceAction extends Action { + vnfGroupStoreKey: string; + relatedVnfMemeberStoreKey: string; + serviceId?: string; +} + +export interface UndoDeleteActionRelatedVnfMemeberInstanceAction extends Action { + vnfGroupStoreKey: string; + relatedVnfMemeberStoreKey: string; + serviceId?: string; +} + +export interface CreateRelatedVnfMemeberInstanceAction extends Action { + relatedVnfMember: any; + vnfGroupStoreKey: string; + serviceId?: string; +} + + +export const removeRelatedVnfMemberInstance: ActionCreator<RemoveRelatedVnfMemebrInstance> = (vnfGroupStoreKey, relatedVnfMemeberStoreKey, serviceId) => ({ + type: RelatedVnfActions.REMOVE_RELATED_VNF_MEMBER_INSTANCE, + vnfGroupStoreKey: vnfGroupStoreKey, + relatedVnfMemeberStoreKey: relatedVnfMemeberStoreKey, + serviceId: serviceId +}); + +export const deleteActionRelatedVnfMemberInstance: ActionCreator<DeleteActionRelatedVnfMemeberInstanceAction> = (vnfGroupStoreKey, relatedVnfMemeberStoreKey, serviceId) => ({ + type: RelatedVnfActions.DELETE_ACTION_RELATED_VNF_MEMBER_INSTANCE, + vnfGroupStoreKey: vnfGroupStoreKey, + relatedVnfMemeberStoreKey: relatedVnfMemeberStoreKey, + serviceId: serviceId +}); + +export const undoDeleteActionRelatedVnfMemberInstance: ActionCreator<UndoDeleteActionRelatedVnfMemeberInstanceAction> = (vnfGroupStoreKey, relatedVnfMemeberStoreKey, serviceId) => ({ + type: RelatedVnfActions.UNDO_DELETE_ACTION_RELATED_VNF_MEMBER_INSTANCE, + vnfGroupStoreKey: vnfGroupStoreKey, + relatedVnfMemeberStoreKey: relatedVnfMemeberStoreKey, + serviceId: serviceId +}); + + +export const createRelatedVnfMemberInstance: ActionCreator<CreateRelatedVnfMemeberInstanceAction> = (vnfGroupStoreKey, serviceId, relatedVnfMember) => ({ + type: RelatedVnfActions.CREATE_RELATED_VNF_MEMBER_INSTANCE, + relatedVnfMember: relatedVnfMember, + vnfGroupStoreKey: vnfGroupStoreKey, + serviceId: serviceId +}); diff --git a/vid-webpack-master/src/app/shared/storeUtil/utils/relatedVnfMember/relatedVnfMember.reducers.spec.ts b/vid-webpack-master/src/app/shared/storeUtil/utils/relatedVnfMember/relatedVnfMember.reducers.spec.ts new file mode 100644 index 000000000..347957480 --- /dev/null +++ b/vid-webpack-master/src/app/shared/storeUtil/utils/relatedVnfMember/relatedVnfMember.reducers.spec.ts @@ -0,0 +1,153 @@ +import {relatedVnfMemeberReducer} from "./relatedVnfMember.reducers"; +import { + CreateRelatedVnfMemeberInstanceAction, + DeleteActionRelatedVnfMemeberInstanceAction, + RelatedVnfActions, + UndoDeleteActionRelatedVnfMemeberInstanceAction +} from "./relatedVnfMember.actions"; +import {ServiceInstanceActions} from "../../../models/serviceInstanceActions"; + + +describe('relatedVnfMemberReducer', () => { + + test('#DELETE_ACTION_RELATED_VNF_MEMBER_INSTANCE should change action to delete',() => { + const serviceUuid: string = 'serviceUuid'; + const actionName: ServiceInstanceActions = ServiceInstanceActions.None; + + let service = relatedVnfMemeberReducer(<any>{ + serviceInstance: { + 'serviceUuid': { + 'vnfGroups' : { + 'vnfGroupStoreKey' : { + 'vnfs' : { + 'vnfStoreKey1' : { + 'action' : actionName + } + } + } + + } + } + } + }, <DeleteActionRelatedVnfMemeberInstanceAction>{ + type: RelatedVnfActions.DELETE_ACTION_RELATED_VNF_MEMBER_INSTANCE, + vnfGroupStoreKey: 'vnfGroupStoreKey', + relatedVnfMemeberStoreKey : 'vnfStoreKey1', + serviceId : 'serviceUuid' + }); + + expect(service.serviceInstance[serviceUuid].vnfGroups['vnfGroupStoreKey']['vnfs']['vnfStoreKey1'].action).toEqual('None_Delete'); + }); + + test('#UNDO_DELETE_ACTION_RELATED_VNF_MEMBER_INSTANCE should undo change action to delete', () => { + const serviceUuid: string = 'serviceUuid'; + const actionName: ServiceInstanceActions = ServiceInstanceActions.None_Delete; + + let service = relatedVnfMemeberReducer(<any>{ + serviceInstance: { + 'serviceUuid': { + 'vnfGroups' : { + 'vnfGroupStoreKey' : { + 'vnfs' : { + 'vnfStoreKey1' : { + 'action' : actionName + } + } + } + + } + } + } + }, <UndoDeleteActionRelatedVnfMemeberInstanceAction>{ + type: RelatedVnfActions.UNDO_DELETE_ACTION_RELATED_VNF_MEMBER_INSTANCE, + vnfGroupStoreKey: 'vnfGroupStoreKey', + relatedVnfMemeberStoreKey : 'vnfStoreKey1', + serviceId : 'serviceUuid' + }); + + expect(service.serviceInstance[serviceUuid].vnfGroups['vnfGroupStoreKey']['vnfs']['vnfStoreKey1'].action).toEqual('None'); + }); + + test('#REMOVE_RELATED_VNF_MEMBER_INSTANCE should remove instance', () => { + const serviceUuid: string = 'serviceUuid'; + const actionName: ServiceInstanceActions = ServiceInstanceActions.None_Delete; + + let service = relatedVnfMemeberReducer(<any>{ + serviceInstance: { + 'serviceUuid': { + 'vnfGroups' : { + 'vnfGroupStoreKey' : { + 'vnfs' : { + 'vnfStoreKey1' : { + 'action' : actionName + } + } + } + + } + } + } + }, <UndoDeleteActionRelatedVnfMemeberInstanceAction>{ + type: RelatedVnfActions.UNDO_DELETE_ACTION_RELATED_VNF_MEMBER_INSTANCE, + vnfGroupStoreKey: 'vnfGroupStoreKey', + relatedVnfMemeberStoreKey : 'vnfStoreKey1', + serviceId : 'serviceUuid' + }); + + expect(service.serviceInstance[serviceUuid].vnfGroups['vnfGroupStoreKey']['vnfs']['vnfStoreKey1'].action).toEqual('None'); + }); + + test('#CREATE_RELATED_VNF_MEMBER_INSTANCE should add new relatedVNF instance', () => { + const serviceUuid: string = 'serviceUuid'; + const actionName: ServiceInstanceActions = ServiceInstanceActions.None_Delete; + let relatedVnfMember = { + "instanceName":"VNF1_INSTANCE_NAME", + "instanceId":"VNF1_INSTANCE_ID", + "orchStatus":null, + "productFamilyId":null, + "lcpCloudRegionId":"mtn23b", + "tenantId":"3e9a20a3e89e45f884e09df0cc2d2d2a", + "tenantName":"APPC-24595-T-IST-02C", + "modelInfo":{ + "modelInvariantId":"vnf-instance-model-invariant-id", + "modelVersionId":"7a6ee536-f052-46fa-aa7e-2fca9d674c44", + "modelVersion":"2.0", + "modelName":"vf_vEPDG", + "modelType":"vnf" + }, + "instanceType":"VNF1_INSTANCE_TYPE", + "provStatus":null, + "inMaint":false, + "uuid":"7a6ee536-f052-46fa-aa7e-2fca9d674c44", + "originalName":null, + "legacyRegion":null, + "lineOfBusiness":null, + "platformName":null, + "trackById":"7a6ee536-f052-46fa-aa7e-2fca9d674c44:002", + "serviceInstanceId":"service-instance-id1", + "serviceInstanceName":"service-instance-name" + }; + + let service = relatedVnfMemeberReducer(<any>{ + serviceInstance: { + 'serviceUuid': { + 'vnfGroups' : { + 'vnfGroupStoreKey' : { } + } + } + } + }, <CreateRelatedVnfMemeberInstanceAction>{ + type: RelatedVnfActions.CREATE_RELATED_VNF_MEMBER_INSTANCE, + relatedVnfMember: relatedVnfMember, + vnfGroupStoreKey: 'vnfGroupStoreKey', + serviceId: serviceUuid + }); + + expect(service.serviceInstance[serviceUuid].vnfGroups['vnfGroupStoreKey']['vnfs']['VNF1_INSTANCE_ID'].action).toEqual('Create'); + expect(service.serviceInstance[serviceUuid].vnfGroups['vnfGroupStoreKey']['vnfs']['VNF1_INSTANCE_ID'].instanceId).toEqual('VNF1_INSTANCE_ID'); + }); + +}); + + + diff --git a/vid-webpack-master/src/app/shared/storeUtil/utils/relatedVnfMember/relatedVnfMember.reducers.ts b/vid-webpack-master/src/app/shared/storeUtil/utils/relatedVnfMember/relatedVnfMember.reducers.ts new file mode 100644 index 000000000..250f934be --- /dev/null +++ b/vid-webpack-master/src/app/shared/storeUtil/utils/relatedVnfMember/relatedVnfMember.reducers.ts @@ -0,0 +1,58 @@ +import {Action} from "redux"; +import * as _ from "lodash"; +import {ServiceState} from "../main.reducer"; +import {ServiceInstanceActions} from "../../../models/serviceInstanceActions"; +import { + CreateRelatedVnfMemeberInstanceAction, + DeleteActionRelatedVnfMemeberInstanceAction, DeleteRelatedVnfMemebrInstanceAction, + RelatedVnfActions, + UndoDeleteActionRelatedVnfMemeberInstanceAction +} from "./relatedVnfMember.actions"; + +export function relatedVnfMemeberReducer(state: ServiceState, action: Action): ServiceState { + switch (action.type) { + + case RelatedVnfActions.DELETE_ACTION_RELATED_VNF_MEMBER_INSTANCE : { + let newState = _.cloneDeep(state); + let relatedVnfMember = newState.serviceInstance[(<DeleteActionRelatedVnfMemeberInstanceAction>action).serviceId].vnfGroups[(<DeleteActionRelatedVnfMemeberInstanceAction>action).vnfGroupStoreKey]['vnfs'][(<DeleteActionRelatedVnfMemeberInstanceAction>action).relatedVnfMemeberStoreKey]; + let oldAction = relatedVnfMember.action; + if(oldAction === ServiceInstanceActions.None_Delete || oldAction === ServiceInstanceActions.Update_Delete) return newState; + newState.serviceInstance[(<DeleteActionRelatedVnfMemeberInstanceAction>action).serviceId].vnfGroups[(<DeleteActionRelatedVnfMemeberInstanceAction>action).vnfGroupStoreKey]['vnfs'][(<DeleteActionRelatedVnfMemeberInstanceAction>action).relatedVnfMemeberStoreKey].action = (oldAction + '_Delete') as ServiceInstanceActions; + return newState; + } + + case RelatedVnfActions.UNDO_DELETE_ACTION_RELATED_VNF_MEMBER_INSTANCE : { + let newState = _.cloneDeep(state); + let relatedVnfMember = newState.serviceInstance[(<UndoDeleteActionRelatedVnfMemeberInstanceAction>action).serviceId].vnfGroups[(<UndoDeleteActionRelatedVnfMemeberInstanceAction>action).vnfGroupStoreKey]['vnfs'][(<UndoDeleteActionRelatedVnfMemeberInstanceAction>action).relatedVnfMemeberStoreKey]; + let oldState = relatedVnfMember.action; + newState.serviceInstance[(<DeleteActionRelatedVnfMemeberInstanceAction>action).serviceId].vnfGroups[(<DeleteActionRelatedVnfMemeberInstanceAction>action).vnfGroupStoreKey]['vnfs'][(<DeleteActionRelatedVnfMemeberInstanceAction>action).relatedVnfMemeberStoreKey].action = (oldState.split('_')[0]) as ServiceInstanceActions; + return newState; + } + + case RelatedVnfActions.REMOVE_RELATED_VNF_MEMBER_INSTANCE : { + let newState = _.cloneDeep(state); + delete newState.serviceInstance[(<DeleteRelatedVnfMemebrInstanceAction>action).serviceId].vnfGroups[(<DeleteRelatedVnfMemebrInstanceAction>action).vnfGroupStoreKey]['vnfs'][(<DeleteRelatedVnfMemebrInstanceAction>action).relatedVnfMemeberStoreKey]; + return newState; + } + + case RelatedVnfActions.CREATE_RELATED_VNF_MEMBER_INSTANCE : { + let newState = _.cloneDeep(state); + let relatedVnfMember = (<CreateRelatedVnfMemeberInstanceAction>action).relatedVnfMember; + relatedVnfMember['action'] = 'Create'; + relatedVnfMember['vnfStoreKey'] = relatedVnfMember.instanceId; + relatedVnfMember['trackById'] = relatedVnfMember.instanceId; + relatedVnfMember['instanceName'] = relatedVnfMember.instanceName; + if(_.isNil(newState.serviceInstance[(<CreateRelatedVnfMemeberInstanceAction>action).serviceId].vnfGroups[(<CreateRelatedVnfMemeberInstanceAction>action).vnfGroupStoreKey]['vnfs'])){ + newState.serviceInstance[(<CreateRelatedVnfMemeberInstanceAction>action).serviceId].vnfGroups[(<CreateRelatedVnfMemeberInstanceAction>action).vnfGroupStoreKey]['vnfs'] = {}; + } + newState.serviceInstance[(<CreateRelatedVnfMemeberInstanceAction>action).serviceId].vnfGroups[(<CreateRelatedVnfMemeberInstanceAction>action).vnfGroupStoreKey]['vnfs'][(<CreateRelatedVnfMemeberInstanceAction>action).relatedVnfMember['instanceId']] = relatedVnfMember; + newState.serviceInstance[(<CreateRelatedVnfMemeberInstanceAction>action).serviceId].isDirty = true; + return newState; + } + } +} + + + + + diff --git a/vid-webpack-master/src/app/shared/storeUtil/utils/service/service.actions.ts b/vid-webpack-master/src/app/shared/storeUtil/utils/service/service.actions.ts new file mode 100644 index 000000000..e4e7e494e --- /dev/null +++ b/vid-webpack-master/src/app/shared/storeUtil/utils/service/service.actions.ts @@ -0,0 +1,102 @@ +import {ServiceInstance} from "../../../models/serviceInstance"; +import {ServiceInstanceActions} from "../../../models/serviceInstanceActions"; +import {Action, ActionCreator} from "redux"; + +export enum ServiceActions { + CREATE_SERVICE_INSTANCE = 'CREATE_SERVICE_INSTANCE', + UPDATE_SERVICE_INSTANCE = 'UPDATE_SERVICE_INSTANCE', + DELETE_ALL_SERVICE_INSTANCES = 'DELETE_ALL_SERVICE_INSTANCES', + UPDATE_MODEL = 'UPDATE_MODEL', + ADD_SERVICE_ACTION = 'ADD_SERVICE_ACTION', + DELETE_ACTION_SERVICE_INSTANCE = "DELETE_ACTION_SERVICE_INSTANCE", + UNDO_DELETE_ACTION_SERVICE_INSTANCE = "UNDO_DELETE_ACTION_SERVICE_INSTANCE", + CHANGE_SERVICE_IS_DIRTY = "CHANGE_SERVICE_IS_DIRTY" +} + +export interface CreateServiceInstanceAction extends Action { + serviceUuid?: string; + serviceInstance?: ServiceInstance; +} + +export interface UpdateServiceInstanceAction extends Action { + serviceUuid?: string; + serviceInstance?: ServiceInstance; +} + +export interface DeleteServiceInstanceAction extends Action { + serviceUuid?: string; +} + +export interface DeleteServiceInstanceAction extends Action { + serviceUuid?: string; +} + +export interface UpdateServiceModelAction extends Action { + serviceHierarchy?: any; +} + +export interface AddServiceAction extends Action{ + serviceUuid: string; + action: ServiceInstanceActions; +} + + +export interface DeleteActionServiceInstanceAction extends Action { + serviceId?: string; +} + +export interface UndoDeleteActionServiceInstanceAction extends Action { + serviceId?: string; +} + +export interface ChangeServiceDirty extends Action { + nodes: any[]; + serviceId : string; +} + +export const addServiceAction: ActionCreator<AddServiceAction> = (serviceUuid : string, actionName : ServiceInstanceActions) => ({ + type: ServiceActions.ADD_SERVICE_ACTION, + serviceUuid: serviceUuid, + action : actionName +}); + + +export const deleteAllServiceInstances: ActionCreator<DeleteServiceInstanceAction> = () => ({ + type: ServiceActions.DELETE_ALL_SERVICE_INSTANCES +}); + +export const createServiceInstance: ActionCreator<CreateServiceInstanceAction> = (serviceInstance, serviceUuid) => ({ + type: ServiceActions.CREATE_SERVICE_INSTANCE, + serviceInstance: serviceInstance, + serviceUuid: serviceUuid +}); + +export const updateServiceInstance: ActionCreator<UpdateServiceInstanceAction> = (serviceInstance, serviceUuid) => ({ + type: ServiceActions.UPDATE_SERVICE_INSTANCE, + serviceInstance: serviceInstance, + serviceUuid: serviceUuid +}); + +export const updateModel: ActionCreator<UpdateServiceModelAction> = serviceHierarchy => ({ + type: ServiceActions.UPDATE_MODEL, + serviceHierarchy: serviceHierarchy +}); + + +export const deleteActionServiceInstance: ActionCreator<DeleteActionServiceInstanceAction> = (vnfStoreKey, serviceId) => ({ + type: ServiceActions.DELETE_ACTION_SERVICE_INSTANCE, + serviceId: serviceId +}); + +export const undoDeleteActionServiceInstance: ActionCreator<UndoDeleteActionServiceInstanceAction> = (vnfStoreKey, serviceId) => ({ + type: ServiceActions.UNDO_DELETE_ACTION_SERVICE_INSTANCE, + serviceId: serviceId +}); + +export const changeServiceIsDirty: ActionCreator<ChangeServiceDirty> = (nodes, serviceId) => ({ + type: ServiceActions.CHANGE_SERVICE_IS_DIRTY, + nodes: nodes, + serviceId : serviceId +}); + + diff --git a/vid-webpack-master/src/app/shared/storeUtil/utils/service/service.reducers.spec.ts b/vid-webpack-master/src/app/shared/storeUtil/utils/service/service.reducers.spec.ts new file mode 100644 index 000000000..05fc008ad --- /dev/null +++ b/vid-webpack-master/src/app/shared/storeUtil/utils/service/service.reducers.spec.ts @@ -0,0 +1,499 @@ +import {ServiceInstance} from "../../../models/serviceInstance"; +import { + AddServiceAction, ChangeServiceDirty, + DeleteServiceInstanceAction, + ServiceActions, + CreateServiceInstanceAction, + UpdateServiceModelAction, UpdateServiceInstanceAction +} from "./service.actions"; +import {serviceReducer} from "./service.reducers"; +import {ServiceInstanceActions} from "../../../models/serviceInstanceActions"; + +describe('serviceReducer', () => { + + test('#UPDATE_SERVICE_INSTANCE should update exiting instance without change his child', () => { + const serviceUuid: string = 'serviceUuid'; + const actionName: ServiceInstanceActions = ServiceInstanceActions.Create; + + const elemntThatShouldNotOverideOnUpdateService = { + vnfs: { + "2017-388_ADIOD-vPE 0": { + "action": "Create", + "inMaint": false, + "rollbackOnFailure": "true", + "originalName": "2017-388_ADIOD-vPE 0", + "isMissingData": false, + "trackById": "eymgwlevh54", + "vfModules": {}, + "vnfStoreKey": "2017-388_ADIOD-vPE 0", + "uuid": "afacccf6-397d-45d6-b5ae-94c39734b168", + "productFamilyId": "e433710f-9217-458d-a79d-1c7aff376d89", + "lcpCloudRegionId": "JANET25", + "tenantId": "092eb9e8e4b7412e8787dd091bc58e86", + "lineOfBusiness": "ONAP", + "platformName": "platform", + "modelInfo": { + "modelInvariantId": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8", + "modelVersionId": "afacccf6-397d-45d6-b5ae-94c39734b168", + "modelName": "2017-388_ADIOD-vPE", + "modelVersion": "4.0", + "modelCustomizationId": "b3c76f73-eeb5-4fb6-9d31-72a889f1811c", + "modelCustomizationName": "2017-388_ADIOD-vPE 0", + "uuid": "afacccf6-397d-45d6-b5ae-94c39734b168", + "modelUniqueId": "b3c76f73-eeb5-4fb6-9d31-72a889f1811c" + }, + "instanceName": "2017-388_ADIOD-vPEAjXzainstanceName", + "legacyRegion": "some legacy region", + "instanceParams": [ + { + "vnf_config_template_version": "17.2", + "bandwidth_units": "Gbps", + "bandwidth": "10", + "AIC_CLLI": "ATLMY8GA", + "ASN": "AV_vPE", + "vnf_instance_name": "mtnj309me6" + } + ] + }, + "2017-488_ADIOD-vPE 0": { + "action": "Create", + "inMaint": false, + "rollbackOnFailure": "true", + "originalName": "2017-488_ADIOD-vPE 0", + "isMissingData": false, + "trackById": "xr6o2782z7", + "vfModules": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": { + "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0wmkjw": { + "isMissingData": true, + "sdncPreReload": null, + "modelInfo": { + "modelType": "VFmodule", + "modelInvariantId": "b34833bb-6aa9-4ad6-a831-70b06367a091", + "modelVersionId": "f8360508-3f17-4414-a2ed-6bc71161e8db", + "modelName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0", + "modelVersion": "5", + "modelCustomizationId": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3", + "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0", + "modelUniqueId": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3" + }, + "instanceParams": [ + {} + ], + "trackById": "a19sjb1ez2" + } + } + }, + "vnfStoreKey": "2017-488_ADIOD-vPE 0", + "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09", + "productFamilyId": "e433710f-9217-458d-a79d-1c7aff376d89", + "lcpCloudRegionId": "JANET25", + "tenantId": "092eb9e8e4b7412e8787dd091bc58e86", + "lineOfBusiness": "ONAP", + "platformName": "platform", + "modelInfo": { + "modelInvariantId": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8", + "modelVersionId": "69e09f68-8b63-4cc9-b9ff-860960b5db09", + "modelName": "2017-488_ADIOD-vPE", + "modelVersion": "5.0", + "modelCustomizationId": "1da7b585-5e61-4993-b95e-8e6606c81e45", + "modelCustomizationName": "2017-488_ADIOD-vPE 0", + "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09", + "modelUniqueId": "1da7b585-5e61-4993-b95e-8e6606c81e45" + }, + "instanceName": "2017-488_ADIOD-vPEVNFinstancename", + "legacyRegion": "some legacy region", + "instanceParams": [ + { + "vnf_config_template_version": "17.2", + "bandwidth_units": "Gbps", + "bandwidth": "10", + "AIC_CLLI": "ATLMY8GA", + "ASN": "AV_vPE", + "vnf_instance_name": "mtnj309me6" + } + ] + } + }, + existingVNFCounterMap: { + "b3c76f73-eeb5-4fb6-9d31-72a889f1811c": 1, + "1da7b585-5e61-4993-b95e-8e6606c81e45": 1 + }, + existingVnfGroupCounterMap: {}, + existingNetworksCounterMap: {}, + optionalGroupMembersMap : {}, + networks : {}, + vnfGroups : {} + }; + + + let service = serviceReducer(<any>{ + "serviceInstance": { + "6b528779-44a3-4472-bdff-9cd15ec93450": { + "action": "Create", + "isDirty": true, + "vnfs": elemntThatShouldNotOverideOnUpdateService.vnfs, + "instanceParams": [ + { + "2017488_adiodvpe0_ASN": "AV_vPE" + } + ], + "validationCounter": 1, + "existingNames": { + "ajxzainstancename": "", + "2017-488_adiod-vpevnfinstancename": "", + "2017-388_adiod-vpeajxzainstancename": "" + }, + "existingVNFCounterMap": elemntThatShouldNotOverideOnUpdateService.existingVNFCounterMap, + "existingVnfGroupCounterMap": elemntThatShouldNotOverideOnUpdateService.existingVnfGroupCounterMap, + "existingNetworksCounterMap": elemntThatShouldNotOverideOnUpdateService.existingNetworksCounterMap, + "optionalGroupMembersMap":elemntThatShouldNotOverideOnUpdateService.optionalGroupMembersMap, + "networks": elemntThatShouldNotOverideOnUpdateService.networks, + "vnfGroups": elemntThatShouldNotOverideOnUpdateService.vnfGroups, + "bulkSize": "3", + "instanceName": "AjXzainstancename", + "globalSubscriberId": "e433710f-9217-458d-a79d-1c7aff376d89", + "subscriptionServiceType": "TYLER SILVIA", + "owningEntityId": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc", + "productFamilyId": "e433710f-9217-458d-a79d-1c7aff376d89", + "lcpCloudRegionId": "hvf6", + "tenantId": "bae71557c5bb4d5aac6743a4e5f1d054", + "aicZoneId": "NFT1", + "projectName": "WATKINS", + "rollbackOnFailure": "true", + "aicZoneName": "NFTJSSSS-NFT1", + "owningEntityName": "WayneHolland", + "testApi": "VNF_API", + "tenantName": "AIN Web Tool-15-D-testalexandria", + "modelInfo": { + "modelInvariantId": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0", + "modelVersionId": "6b528779-44a3-4472-bdff-9cd15ec93450", + "modelName": "action-data", + "modelVersion": "1.0", + "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450", + "modelUniqueId": "6b528779-44a3-4472-bdff-9cd15ec93450" + }, + "isALaCarte": false, + "name": "action-data", + "version": "1.0", + "description": "", + "category": "", + "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450", + "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0", + "serviceType": "", + "serviceRole": "", + "vidNotions": { + "instantiationUI": "legacy", + "modelCategory": "other", + "viewEditUI": "legacy" + }, + "isEcompGeneratedNaming": false, + "isMultiStepDesign": false + } + }, + }, <UpdateServiceInstanceAction>{ + type: ServiceActions.UPDATE_SERVICE_INSTANCE, + serviceUuid: "6b528779-44a3-4472-bdff-9cd15ec93450", + serviceInstance: <any>{ + aicZoneId: "ATL53", + aicZoneName: "AAIATLTE-ATL53", + bulkSize: 1, + category: "", + description: "", + globalSubscriberId: "e433710f-9217-458d-a79d-1c7aff376d89", + instanceName: "yoav", + instanceParams: [{}], + invariantUuid: "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0", + isALaCarte: false, + isEcompGeneratedNaming: false, + isMultiStepDesign: false, + lcpCloudRegionId: "JANET25", + modelInfo: { + modelInvariantId: "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0", + modelVersionId: "6b528779-44a3-4472-bdff-9cd15ec93450", + modelName: "action-data", + modelVersion: "1.0" + }, + name: "action-data", + owningEntityId: "d61e6f2d-12fa-4cc2-91df-7c244011d6fc", + owningEntityName: "WayneHolland", + productFamilyId: "d8a6ed93-251c-47ca-adc9-86671fd19f4c", + projectName: "WATKINS", + rollbackOnFailure: "true", + serviceRole: "", + serviceType: "", + subscriptionServiceType: "TYLER SILVIA", + tenantId: "092eb9e8e4b7412e8787dd091bc58e86", + tenantName: "USP-SIP-IC-24335-T-01", + testApi: "VNF_API", + uuid: "6b528779-44a3-4472-bdff-9cd15ec93450", + version: "1.0", + vidNotions: {instantiationUI: "legacy", modelCategory: "other", viewEditUI: "legacy"} + } + }); + expect(service.serviceInstance["6b528779-44a3-4472-bdff-9cd15ec93450"]).toBeDefined(); + + for(const element in elemntThatShouldNotOverideOnUpdateService){ + expect(service.serviceInstance["6b528779-44a3-4472-bdff-9cd15ec93450"][element]).toEqual(elemntThatShouldNotOverideOnUpdateService[element]); + } + + expect(service.serviceInstance["6b528779-44a3-4472-bdff-9cd15ec93450"].aicZoneId).toEqual("ATL53"); + expect(service.serviceInstance["6b528779-44a3-4472-bdff-9cd15ec93450"].owningEntityId).toEqual("d61e6f2d-12fa-4cc2-91df-7c244011d6fc"); + expect(service.serviceInstance["6b528779-44a3-4472-bdff-9cd15ec93450"].owningEntityName).toEqual("WayneHolland"); + expect(service.serviceInstance["6b528779-44a3-4472-bdff-9cd15ec93450"].productFamilyId).toEqual("d8a6ed93-251c-47ca-adc9-86671fd19f4c"); + expect(service.serviceInstance["6b528779-44a3-4472-bdff-9cd15ec93450"].projectName).toEqual("WATKINS"); + expect(service.serviceInstance["6b528779-44a3-4472-bdff-9cd15ec93450"].rollbackOnFailure).toEqual("true"); + expect(service.serviceInstance["6b528779-44a3-4472-bdff-9cd15ec93450"].subscriptionServiceType).toEqual("TYLER SILVIA"); + expect(service.serviceInstance["6b528779-44a3-4472-bdff-9cd15ec93450"].tenantId).toEqual("092eb9e8e4b7412e8787dd091bc58e86"); + + }); + + test('#ADD_SERVICE_ACTION should add action to the service', () => { + const serviceUuid: string = 'serviceUuid'; + const actionName: ServiceInstanceActions = ServiceInstanceActions.Create; + + let service = serviceReducer(<any>{ + serviceInstance: { + 'serviceUuid': {} + } + }, <AddServiceAction>{ + type: ServiceActions.ADD_SERVICE_ACTION, + serviceUuid: 'serviceUuid', + action: actionName + }); + expect(service.serviceInstance[serviceUuid]['action']).toEqual(actionName); + }); + + test('#UPDATE_SERVICE_INSTANCE', () => { + const serviceUuid: string = 'serviceUuid'; + + let serviceInstanceObject: ServiceInstance = <any>{ + isDirty: false, + instanceName: 'instanceName', + isEcompGeneratedNaming: false, + globalSubscriberId: 'globalSubscriberId', + productFamilyId: 'productFamilyId', + subscriptionServiceType: 'subscriptionServiceType', + lcpCloudRegionId: 'lcpCloudRegionId', + tenantId: 'tenantId', + tenantName: 'tenantName', + aicZoneId: 'aicZoneId', + aicZoneName: 'aicZoneName', + projectName: 'projectName', + owningEntityId: 'owningEntityId', + owningEntityName: 'owningEntityName', + existingVnfGroupCounterMap: {}, + existingVNFCounterMap: {}, + existingNetworksCounterMap: {}, + pause: false, + bulkSize: 1, + vnfs: {}, + vnfGroups: {}, + networks: {}, + instanceParams: [], + rollbackOnFailure: false, + subscriberName: 'subscriberName', + validationCounter: 0, + existingNames: {}, + action: ServiceInstanceActions.Create + }; + + let serviceState = serviceReducer(<any>{serviceInstance: {}}, + <CreateServiceInstanceAction>{ + type: ServiceActions.CREATE_SERVICE_INSTANCE, + serviceUuid: serviceUuid, + serviceInstance: serviceInstanceObject + }).serviceInstance[serviceUuid]; + + expect(serviceState.instanceName).toEqual(serviceInstanceObject.instanceName); + expect(serviceState.isEcompGeneratedNaming).toEqual(serviceInstanceObject.isEcompGeneratedNaming); + expect(serviceState.globalSubscriberId).toEqual(serviceInstanceObject.globalSubscriberId); + expect(serviceState.productFamilyId).toEqual(serviceInstanceObject.productFamilyId); + expect(serviceState.subscriptionServiceType).toEqual(serviceInstanceObject.subscriptionServiceType); + expect(serviceState.lcpCloudRegionId).toEqual(serviceInstanceObject.lcpCloudRegionId); + expect(serviceState.tenantId).toEqual(serviceInstanceObject.tenantId); + expect(serviceState.tenantName).toEqual(serviceInstanceObject.tenantName); + expect(serviceState.aicZoneId).toEqual(serviceInstanceObject.aicZoneId); + expect(serviceState.aicZoneName).toEqual(serviceInstanceObject.aicZoneName); + expect(serviceState.projectName).toEqual(serviceInstanceObject.projectName); + expect(serviceState.owningEntityId).toEqual(serviceInstanceObject.owningEntityId); + expect(serviceState.owningEntityName).toEqual(serviceInstanceObject.owningEntityName); + expect(serviceState.pause).toEqual(serviceInstanceObject.pause); + expect(serviceState.bulkSize).toEqual(serviceInstanceObject.bulkSize); + expect(serviceState.vnfs).toEqual(serviceInstanceObject.vnfs); + expect(serviceState.instanceParams).toEqual(serviceInstanceObject.instanceParams); + expect(serviceState.rollbackOnFailure).toEqual(serviceInstanceObject.rollbackOnFailure); + expect(serviceState.subscriberName).toEqual(serviceInstanceObject.subscriberName); + }); + + + test('#DELETE_ALL_SERVICE_INSTANCES should delete all services', () => { + const state = serviceReducer(<any>{ + serviceInstance: { + 'service-1': {}, + 'service-2': {} + } + }, + <CreateServiceInstanceAction>{ + type: ServiceActions.DELETE_ALL_SERVICE_INSTANCES + }); + + expect(state.serviceInstance['service-1']).toBeUndefined(); + expect(state.serviceInstance['service-2']).toBeUndefined(); + }); + + test('#DELETE_SERVICE_INSTANCE should delete service', () => { + const state = serviceReducer(<any>{ + serviceInstance: { + 'service-1': {} + } + }, + <DeleteServiceInstanceAction>{ + type: ServiceActions.DELETE_ALL_SERVICE_INSTANCES + }); + + expect(state.serviceInstance['service-1']).toBeUndefined(); + }); + + test('#UPDATE_MODEL should update service model ', () => { + const state = serviceReducer(<any>{ + serviceHierarchy: {} + }, + <UpdateServiceModelAction>{ + type: ServiceActions.UPDATE_MODEL, + serviceHierarchy: { + service: { + uuid: 'uuid-1' + } + } + }); + + expect(state.serviceHierarchy['uuid-1'].service).toBeDefined(); + }); + + test('#UPDATE_MODEL should update service model with vnfGroups ', () => { + const state = serviceReducer(<any>{ + serviceHierarchy: {} + }, + <UpdateServiceModelAction>{ + type: ServiceActions.UPDATE_MODEL, + serviceHierarchy: { + service: { + uuid: 'uuid-1' + }, + vnfs: {}, + vnfGroups: { + 'vnfGrouop_1': { + uuid: 'vnfGroup_uuid_1', + name: 'vnfGroup_name_1', + type: 'Group' + }, + 'vnfGrouop_2': { + uuid: 'vnfGroup_uuid_2', + name: 'vnfGroup_name_2', + type: 'Group' + } + } + } + }); + + expect(state.serviceHierarchy['uuid-1']).toBeDefined(); + expect(state.serviceHierarchy['uuid-1'].vnfGroups['vnfGrouop_1']).toBeDefined(); + expect(state.serviceHierarchy['uuid-1'].vnfGroups['vnfGrouop_2']).toBeDefined(); + }); + + test('#CHANGE_SERVICE_IS_DIRTY should update service isDirty flag : service is not dirty ', () => { + const state = serviceReducer(<any>{ + serviceInstance: { + 'serviceId': { + action: ServiceInstanceActions.None, + 'vnfs': { + 'vnf1': { + action: ServiceInstanceActions.None + }, + 'vnf2': { + action: ServiceInstanceActions.None + } + } + + } + } + }, + <ChangeServiceDirty>{ + type: ServiceActions.CHANGE_SERVICE_IS_DIRTY, + nodes: [ + { + action: ServiceInstanceActions.None + }, + { + action: ServiceInstanceActions.None + }], + serviceId: 'serviceId' + + }); + + expect(state.serviceInstance['serviceId'].isDirty).toBeFalsy(); + }); + + test('#CHANGE_SERVICE_IS_DIRTY should update service isDirty flag : service is dirty should return true', () => { + const state = serviceReducer(<any>{ + serviceInstance: { + 'serviceId': { + action: ServiceInstanceActions.Create + + } + } + }, + <ChangeServiceDirty>{ + type: ServiceActions.CHANGE_SERVICE_IS_DIRTY, + nodes: [ + { + action: ServiceInstanceActions.None + }, + { + action: ServiceInstanceActions.None + }], + serviceId: 'serviceId' + + }); + + expect(state.serviceInstance['serviceId'].isDirty).toBeTruthy(); + }); + + test('#CHANGE_SERVICE_IS_DIRTY should update service isDirty flag : vnf is dirty ', () => { + const state = serviceReducer(<any>{ + serviceInstance: { + 'serviceId': { + action: ServiceInstanceActions.None, + 'vnfs': { + 'vnf1': { + action: ServiceInstanceActions.None + }, + 'vnf2': { + action: ServiceInstanceActions.Create + } + } + + } + } + }, + <ChangeServiceDirty>{ + type: ServiceActions.CHANGE_SERVICE_IS_DIRTY, + nodes: [ + { + action: ServiceInstanceActions.None + }, + { + action: ServiceInstanceActions.Create + }], + serviceId: 'serviceId' + + }); + + expect(state.serviceInstance['serviceId'].isDirty).toBeTruthy(); + }); + +}); + + + diff --git a/vid-webpack-master/src/app/shared/storeUtil/utils/service/service.reducers.ts b/vid-webpack-master/src/app/shared/storeUtil/utils/service/service.reducers.ts new file mode 100644 index 000000000..9d21d359c --- /dev/null +++ b/vid-webpack-master/src/app/shared/storeUtil/utils/service/service.reducers.ts @@ -0,0 +1,107 @@ +import {Action} from "redux"; +import { + AddServiceAction, + ChangeServiceDirty, + ServiceActions, + CreateServiceInstanceAction, + UpdateServiceModelAction, UpdateServiceInstanceAction +} from "./service.actions"; +import {ServiceInstance} from "../../../models/serviceInstance"; +import {ServiceState} from "../main.reducer"; +import {ServiceInstanceActions} from "../../../models/serviceInstanceActions"; +import * as _ from "lodash"; + +export function serviceReducer(state: ServiceState, action: Action) : ServiceState{ + switch (action.type) { + case ServiceActions.UPDATE_SERVICE_INSTANCE : { + let newState = _.cloneDeep(state); + const updateServiceInstanceAction = <UpdateServiceInstanceAction>action; + const uuid = updateServiceInstanceAction.serviceUuid; + const serviceInstance = updateServiceInstanceAction.serviceInstance; + + + updateUniqueNames(serviceInstance.instanceName, updateServiceInstanceAction.serviceInstance.instanceName, newState.serviceInstance[uuid]); + + newState.serviceInstance[uuid] = _.merge(newState.serviceInstance[uuid], serviceInstance); + return newState; + } + case ServiceActions.CREATE_SERVICE_INSTANCE : { + const updateServiceInstanceAction = <CreateServiceInstanceAction>action; + const uuid = updateServiceInstanceAction.serviceUuid; + let newState = _.cloneDeep(state); + + const serviceInstance: ServiceInstance = new ServiceInstance(); + const currentInstaceName = state.serviceInstance[uuid] ? serviceInstance.instanceName : null; + + newState.serviceInstance[uuid] = Object.assign(serviceInstance, updateServiceInstanceAction.serviceInstance); + if (!_.isNil(updateServiceInstanceAction.serviceInstance)) { + updateUniqueNames(currentInstaceName, updateServiceInstanceAction.serviceInstance.instanceName, newState.serviceInstance[uuid]); + } + return newState; + } + case ServiceActions.DELETE_ALL_SERVICE_INSTANCES: { + if (state.serviceInstance) { + let newState = _.cloneDeep(state); + newState.serviceInstance = {}; + return Object.assign({}, state, newState); + } + return Object.assign({}, state); + } + case ServiceActions.UPDATE_MODEL: { + let uuid = (<UpdateServiceModelAction>action).serviceHierarchy.service.uuid; + state.serviceHierarchy[uuid] = _.cloneDeep((<UpdateServiceModelAction>action).serviceHierarchy); + return Object.assign({}, state); + } + case ServiceActions.ADD_SERVICE_ACTION: { + const uuid: string = (<AddServiceAction>action).serviceUuid; + const actionToAdd: ServiceInstanceActions = (<AddServiceAction>action).action; + state.serviceInstance[uuid].action = actionToAdd; + return Object.assign({}, state); + } + case ServiceActions.CHANGE_SERVICE_IS_DIRTY : { + let newState = _.cloneDeep(state); + let serviceInstanceAction: ServiceInstanceActions = newState.serviceInstance[(<ChangeServiceDirty>action).serviceId].action; + + if(serviceInstanceAction !== ServiceInstanceActions.None){ + newState.serviceInstance[(<ChangeServiceDirty>action).serviceId].isDirty = true; + return newState; + } + + const nodes = (<ChangeServiceDirty>action).nodes; + for(let node of nodes){ + const dirty = isDirty(node); + if(dirty) { + newState.serviceInstance[(<ChangeServiceDirty>action).serviceId].isDirty = true; + return newState; + } + } + + newState.serviceInstance[(<ChangeServiceDirty>action).serviceId].isDirty = false; + return newState; + } + } +} + +const isDirty = (node) : boolean => { + if(node.action !== ServiceInstanceActions.None) return true; + if(!_.isNil(node.children) && node.children.length > 0){ + for(let child of node.children){ + const dirty: boolean = isDirty(child); + if(dirty) return true; + } + } + return false; +}; + +const updateUniqueNames = (oldName : string, newName : string, serviceInstance : ServiceInstance) : void => { + let existingNames = serviceInstance.existingNames; + if (!_.isNil(oldName) && oldName.toLowerCase() in existingNames) { + delete existingNames[oldName.toLowerCase()]; + } + if(!_.isNil(newName)) { + existingNames[newName.toLowerCase()] = ""; + } +}; + + + diff --git a/vid-webpack-master/src/app/shared/storeUtil/utils/vfModule/vfModule.actions.ts b/vid-webpack-master/src/app/shared/storeUtil/utils/vfModule/vfModule.actions.ts new file mode 100644 index 000000000..a3f0f4009 --- /dev/null +++ b/vid-webpack-master/src/app/shared/storeUtil/utils/vfModule/vfModule.actions.ts @@ -0,0 +1,105 @@ +import {Action, ActionCreator} from "redux"; + +export enum VfModuleActions { + REMOVE_VNF_MODULE_INSTANCE = 'REMOVE_VNF_MODULE_INSTANCE', + CREATE_VF_MODULE = 'CREATE_VF_MODULE', + UPDATE_VF_MODULE = 'UPDATE_VF_MODULE', + DELETE_ACTION_VF_MODULE_INSTANCE = "DELETE_ACTION_VF_MODULE_INSTANCE", + UNDO_DELETE_ACTION_VF_MODULE_INSTANCE = "UNDO_DELETE_ACTION_VF_MODULE_INSTANCE", + UPDATE_VFMODULE_POSITION = "UPDATE_VFMODULE_POSITION" +} + + +export interface UpdateVFModluePosition extends Action { + node: any, + instanceId : string, + vnfStoreKey ?: string; +} + +export interface DeleteVfModuleInstanceAction extends Action { + modelName?: string; + serviceModelId?: string; + vfName?: string; + vnfStoreKey?:string; + dynamicModelName?: string; +} + +export interface CreateVFModuleInstanceAction extends Action { + vfInstance: any; + vfId: string; + serviceUuid: string; + index : number + vnfStoreKey : string; +} + +export interface UpdateVFModuleInstanceAction extends Action { + vfInstance: any; + vfId: string; + serviceUuid: string; + dynamicModelName : string; + vnfStoreKey : string +} + + +export interface DeleteActionVfModuleInstanceAction extends Action { + dynamicModelName: string; + vnfStoreKey : string; + serviceId?: string; +} + +export interface UndoDeleteActionVfModuleInstanceAction extends Action { + dynamicModelName: string; + vnfStoreKey : string; + serviceId?: string; +} + +export const removeVfModuleInstance: ActionCreator<DeleteVfModuleInstanceAction> = (modelName, serviceModelId, vfName, vnfStoreKey, dynamicModelName) => ({ + type: VfModuleActions.REMOVE_VNF_MODULE_INSTANCE, + modelName: modelName, + serviceModelId: serviceModelId, + vfName: vfName, + vnfStoreKey : vnfStoreKey, + dynamicModelName:dynamicModelName +}); + + +export const createVFModuleInstance: ActionCreator<CreateVFModuleInstanceAction> = (vfInstance, vfId, serviceUuid, index, vnfStoreKey) => ({ + type: VfModuleActions.CREATE_VF_MODULE, + vfInstance: vfInstance, + vfId: vfId, + serviceUuid: serviceUuid, + index : index, + vnfStoreKey : vnfStoreKey +}); + +export const updateVFModuleInstance: ActionCreator<UpdateVFModuleInstanceAction> = (vfInstance, vfId, serviceUuid, dynamicModelName, vnfStoreKey) => ({ + type: VfModuleActions.UPDATE_VF_MODULE, + vfInstance: vfInstance, + vfId: vfId, + serviceUuid: serviceUuid, + dynamicModelName : dynamicModelName, + vnfStoreKey : vnfStoreKey +}); + +export const deleteActionVfModuleInstance: ActionCreator<DeleteActionVfModuleInstanceAction> = (dynamicModelName, vnfStoreKey, serviceId) => ({ + type: VfModuleActions.DELETE_ACTION_VF_MODULE_INSTANCE, + dynamicModelName: dynamicModelName, + vnfStoreKey : vnfStoreKey, + serviceId: serviceId +}); + +export const undoDeleteVfModuleInstance: ActionCreator<UndoDeleteActionVfModuleInstanceAction> = (dynamicModelName, vnfStoreKey, serviceId) => ({ + type: VfModuleActions.UNDO_DELETE_ACTION_VF_MODULE_INSTANCE, + dynamicModelName: dynamicModelName, + vnfStoreKey : vnfStoreKey, + serviceId: serviceId +}); + + +export const updateVFModulePosition: ActionCreator<UpdateVFModluePosition> = (node, instanceId, vnfStoreKey) => ({ + type: VfModuleActions.UPDATE_VFMODULE_POSITION, + node: node, + instanceId: instanceId, + vnfStoreKey : vnfStoreKey +}); + diff --git a/vid-webpack-master/src/app/shared/storeUtil/utils/vfModule/vfModule.reducers.spec.ts b/vid-webpack-master/src/app/shared/storeUtil/utils/vfModule/vfModule.reducers.spec.ts new file mode 100644 index 000000000..de6d2142c --- /dev/null +++ b/vid-webpack-master/src/app/shared/storeUtil/utils/vfModule/vfModule.reducers.spec.ts @@ -0,0 +1,248 @@ +import { + CreateVFModuleInstanceAction, + DeleteActionVfModuleInstanceAction, + DeleteVfModuleInstanceAction, UndoDeleteActionVfModuleInstanceAction, UpdateVFModluePosition, + VfModuleActions +} from "./vfModule.actions"; +import {vfModuleReducer} from "./vfModule.reducers"; +import {VfModuleInstance} from "../../../models/vfModuleInstance"; +import {ServiceInstanceActions} from "../../../models/serviceInstanceActions"; + + +describe('vfModuleReducer', () => { + test('#REMOVE_VNF_MODULE_INSTANCE : should delete existing vnf module by dynamicModelName', () => { + let state = vfModuleReducer(<any>{serviceInstance : { + 'serviceModelId' : { + vnfs : { + 'vfName' : { + vfModules : { + 'modelName' : { + 'dynamicModelName1': {}, + 'dynamicModelName2': {}, + } + } + } + } + } + }}, + <DeleteVfModuleInstanceAction>{ + type: VfModuleActions.REMOVE_VNF_MODULE_INSTANCE, + modelName : 'modelName', + vfName : 'vfName', + vnfStoreKey : 'vfName', + serviceModelId : 'serviceModelId', + dynamicModelName: 'dynamicModelName1' + }); + + expect(state).toBeDefined(); + expect(state.serviceInstance['serviceModelId'].vnfs['vfName'].vfModules['modelName']['dynamicModelName2']).toBeDefined(); + expect(state.serviceInstance['serviceModelId'].vnfs['vfName'].vfModules['modelName']['dynamicModelName1']).not.toBeDefined(); + }); + + test('#DELETE_LAST_VNF_MODULE_INSTANCE : should delete existing vnf module', () => { + let state = vfModuleReducer(<any>{serviceInstance : { + 'serviceModelId' : { + vnfs : { + 'vfName' : { + vfModules : { + 'modelName' : { + 'dynamicModelName': { + } + } + } + } + } + } + }}, + <DeleteVfModuleInstanceAction>{ + type: VfModuleActions.REMOVE_VNF_MODULE_INSTANCE, + modelName : 'modelName', + vfName : 'vfName', + vnfStoreKey : 'vfName', + serviceModelId : 'serviceModelId', + dynamicModelName: 'dynamicModelName' + }); + + expect(state).toBeDefined(); + expect(state.serviceInstance['serviceModelId'].vnfs['vfName'].vfModules['modelName']).not.toBeDefined(); + }); + + test('#CREATE_VF_MODULE: should create new vfModule to existing VNF', ()=>{ + let vfModuleInstance : VfModuleInstance = new VfModuleInstance(); + vfModuleInstance.instanceName = 'instanceName'; + vfModuleInstance.isMissingData = false; + vfModuleInstance.volumeGroupName = 'volumeGroupName'; + let vfModule = vfModuleReducer(<any>{serviceInstance : { + 'serviceUuid' : { + vnfs : { + 'vnfStoreKey' : { + 'vfModules' : { + } + } + } + } + }}, + <CreateVFModuleInstanceAction>{ + type: VfModuleActions.CREATE_VF_MODULE, + vfId : 'vfId', + vfInstance : new VfModuleInstance(), + vnfStoreKey : 'vnfStoreKey', + serviceUuid : 'serviceUuid', + index : 1 + }).serviceInstance['serviceUuid'].vnfs['vnfStoreKey'].vfModules; + + let firstVfModuleName = Object.keys(vfModule)[0]; + expect(vfModule[firstVfModuleName]).toBeDefined(); + expect(vfModule[firstVfModuleName].isMissingData).toBeFalsy(); + }); + + test('#UPDATE_VF_MODULE: should update existing VFModule', ()=>{ + let vfModuleInstance : VfModuleInstance = new VfModuleInstance(); + vfModuleInstance.instanceName = 'instanceName'; + vfModuleInstance.isMissingData = false; + vfModuleInstance.volumeGroupName = 'volumeGroupName'; + let vfModule = vfModuleReducer(<any>{ + serviceHierarchy : { + 'serviceModelId' : {} + }, + serviceInstance : { + 'serviceModelId' : { + vnfs : { + 'vfName' : { + vfModules : { + 'modelName' : { + 'dynamicModelName1': { + isMissingData : true + }, + 'dynamicModelName2': {}, + } + } + } + } + } + }}, + <CreateVFModuleInstanceAction>{ + type: VfModuleActions.UPDATE_VF_MODULE, + vfId : 'modelName', + vfInstance : new VfModuleInstance(), + vnfStoreKey : 'vfName', + dynamicModelName : 'dynamicModelName1', + serviceUuid : 'serviceModelId', + index : 1 + }).serviceInstance['serviceModelId'].vnfs['vfName'].vfModules; + + let firstVfModuleName = Object.keys(vfModule)[0]; + expect(vfModule[firstVfModuleName]).toBeDefined(); + expect(vfModule[firstVfModuleName].isMissingData).toBeFalsy(); + }); + + + test('#UPDATE_VFMODULE_POSITION: should update position', ()=>{ + let vfModule = vfModuleReducer(<any>{ + serviceHierarchy : { + 'serviceModelId' : {} + }, + serviceInstance : { + 'serviceModelId' : { + vnfs : { + 'vfName' : { + vfModules : { + 'modelName' : { + 'dynamicModelName': { + isMissingData : true + } + } + } + } + } + } + }}, + <UpdateVFModluePosition>{ + type: VfModuleActions.UPDATE_VFMODULE_POSITION, + node: { + position : 1, + dynamicModelName : "dynamicModelName", + modelName : "modelName" + }, + instanceId : "serviceModelId", + vnfStoreKey : "vfName" + + }).serviceInstance['serviceModelId'].vnfs['vfName'].vfModules["modelName"]["dynamicModelName"]; + + expect(vfModule.position).toEqual(1); + }); + + + test('#DELETE_ACTION_VF_MODULE_INSTANCE', ()=>{ + let vfModule = vfModuleReducer(<any>{ + serviceHierarchy : { + 'serviceModelId' : {} + }, + serviceInstance : { + 'serviceModelId' : { + vnfs : { + 'vnfStoreKey' : { + vfModules : { + 'modelName' : { + 'dynamicModelName1': { + isMissingData : true, + action : 'None' + }, + 'dynamicModelName2': {}, + } + } + } + } + } + }}, + <DeleteActionVfModuleInstanceAction>{ + type: VfModuleActions.DELETE_ACTION_VF_MODULE_INSTANCE, + dynamicModelName: 'dynamicModelName1', + vnfStoreKey : 'vnfStoreKey', + serviceId: 'serviceModelId' + }).serviceInstance['serviceModelId'].vnfs['vnfStoreKey'].vfModules['modelName']['dynamicModelName1']; + + console.log(vfModule.action); + expect(vfModule).toBeDefined(); + expect(vfModule.isMissingData).toBeTruthy(); + expect(vfModule.action).toEqual(ServiceInstanceActions.None_Delete); + }); + + test('#UNDO_DELETE_ACTION_VF_MODULE_INSTANCE', ()=>{ + let vfModule = vfModuleReducer(<any>{ + serviceHierarchy : { + 'serviceModelId' : {} + }, + serviceInstance : { + 'serviceModelId' : { + vnfs : { + 'vnfStoreKey' : { + vfModules : { + 'modelName' : { + 'dynamicModelName1': { + isMissingData : true, + action : 'None_Delete' + }, + 'dynamicModelName2': {}, + } + } + } + } + } + }}, + <UndoDeleteActionVfModuleInstanceAction>{ + type: VfModuleActions.UNDO_DELETE_ACTION_VF_MODULE_INSTANCE, + dynamicModelName: 'dynamicModelName1', + vnfStoreKey : 'vnfStoreKey', + serviceId: 'serviceModelId' + }).serviceInstance['serviceModelId'].vnfs['vnfStoreKey'].vfModules['modelName']['dynamicModelName1']; + + console.log(vfModule.action); + expect(vfModule).toBeDefined(); + expect(vfModule.action).toEqual(ServiceInstanceActions.None); + }); + +}); + + + diff --git a/vid-webpack-master/src/app/shared/storeUtil/utils/vfModule/vfModule.reducers.ts b/vid-webpack-master/src/app/shared/storeUtil/utils/vfModule/vfModule.reducers.ts new file mode 100644 index 000000000..f3636ff41 --- /dev/null +++ b/vid-webpack-master/src/app/shared/storeUtil/utils/vfModule/vfModule.reducers.ts @@ -0,0 +1,165 @@ +import {Action} from "redux"; +import * as _ from "lodash"; +import { + CreateVFModuleInstanceAction, DeleteActionVfModuleInstanceAction, + DeleteVfModuleInstanceAction, UndoDeleteActionVfModuleInstanceAction, UpdateVFModluePosition, + UpdateVFModuleInstanceAction, + VfModuleActions +} from "./vfModule.actions"; +import {ServiceInstance} from "../../../models/serviceInstance"; +import {VfModuleMap} from "../../../models/vfModulesMap"; +import {ServiceState} from "../main.reducer"; +import {ServiceInstanceActions} from "../../../models/serviceInstanceActions"; + + +export function vfModuleReducer(state: ServiceState , action: Action) : ServiceState{ + switch (action.type) { + case VfModuleActions.CREATE_VF_MODULE: { + const updateVFModuleInstanceAction = <CreateVFModuleInstanceAction>action; + const vfInstance = updateVFModuleInstanceAction.vfInstance; + const serviceUuid = updateVFModuleInstanceAction.serviceUuid; + const vfModuleId = updateVFModuleInstanceAction.vfId; + const vnfStoreKey = updateVFModuleInstanceAction.vnfStoreKey; + + let newState = Object.assign({}, state); + + let vfModulesMap = newState.serviceInstance[serviceUuid].vnfs[vnfStoreKey].vfModules[vfModuleId] || new VfModuleMap(); + let randomId = generateId(); + vfModulesMap[vfModuleId + randomId] = vfInstance; + updateUniqueNames(null, vfInstance.instanceName, newState.serviceInstance[serviceUuid]); + updateUniqueNames(null, vfInstance.volumeGroupName, newState.serviceInstance[serviceUuid]); + updateServiceValidationCounter(newState, false, vfInstance['isMissingData'], serviceUuid); + + newState.serviceInstance[serviceUuid].vnfs[vnfStoreKey].vfModules[vfModuleId] = vfModulesMap; + return newState; + } + case VfModuleActions.UPDATE_VF_MODULE: { + const updateVFModuleInstanceAction = <UpdateVFModuleInstanceAction>action; + const vfInstance = updateVFModuleInstanceAction.vfInstance; + const serviceUuid = updateVFModuleInstanceAction.serviceUuid; + const vfModuleId = updateVFModuleInstanceAction.vfId; + const newState = _.cloneDeep(state); + const vnfs = newState.serviceHierarchy[serviceUuid].vnfs; + let vnfId = getVfModuleParentVnfId(vnfs, vfModuleId); + const vnfStoreKey = updateVFModuleInstanceAction.vnfStoreKey; + if (!_.isNil(vnfStoreKey)) { + vnfId = vnfStoreKey; + } + let vfModulesMap = newState.serviceInstance[serviceUuid].vnfs[vnfId].vfModules[vfModuleId] || new VfModuleMap(); + updateServiceValidationCounter(newState, vfModulesMap[updateVFModuleInstanceAction.dynamicModelName]['isMissingData'], vfInstance.isMissingData, serviceUuid); + updateUniqueNames(vfModulesMap[updateVFModuleInstanceAction.dynamicModelName].instanceName, vfInstance.instanceName, newState.serviceInstance[serviceUuid]); + updateUniqueNames(vfModulesMap[updateVFModuleInstanceAction.dynamicModelName].volumeGroupName, vfInstance.volumeGroupName, newState.serviceInstance[serviceUuid]); + vfModulesMap[updateVFModuleInstanceAction.dynamicModelName] = vfInstance; + newState.serviceInstance[serviceUuid].vnfs[vnfId].vfModules[vfModuleId] = vfModulesMap; + return newState; + } + case VfModuleActions.REMOVE_VNF_MODULE_INSTANCE: { + const actionData = (<DeleteVfModuleInstanceAction>action); + if (state.serviceInstance[actionData.serviceModelId]) { + let vfModulesMap = state.serviceInstance[actionData.serviceModelId].vnfs[actionData.vnfStoreKey].vfModules; + updateIsMissingDataOnDeleteVFModule(state, actionData.serviceModelId, actionData.vnfStoreKey, actionData.modelName); + updateUniqueNames(vfModulesMap[actionData.modelName][actionData.dynamicModelName].instanceName, null, state.serviceInstance[actionData.serviceModelId] ); + updateUniqueNames(vfModulesMap[actionData.modelName][actionData.dynamicModelName].volumeGroupName, null, state.serviceInstance[actionData.serviceModelId] ); + delete vfModulesMap[actionData.modelName][actionData.dynamicModelName]; + if(_.isEmpty(vfModulesMap[actionData.modelName])){ + delete vfModulesMap[actionData.modelName]; + } + } + return Object.assign({}, state); + } + case VfModuleActions.DELETE_ACTION_VF_MODULE_INSTANCE : { + let newState = _.cloneDeep(state); + let vfModules = newState.serviceInstance[(<DeleteActionVfModuleInstanceAction>action).serviceId].vnfs[(<DeleteActionVfModuleInstanceAction>action).vnfStoreKey].vfModules; + + for(let key in vfModules){ + let firstKey = Object.keys(vfModules[key])[0]; + if(firstKey === (<DeleteActionVfModuleInstanceAction>action).dynamicModelName){ + let oldAction = newState.serviceInstance[(<DeleteActionVfModuleInstanceAction>action).serviceId].vnfs[(<DeleteActionVfModuleInstanceAction>action).vnfStoreKey].vfModules[key][firstKey].action; + if(oldAction === ServiceInstanceActions.None_Delete || oldAction === ServiceInstanceActions.Update_Delete) return newState; + newState.serviceInstance[(<DeleteActionVfModuleInstanceAction>action).serviceId].vnfs[(<DeleteActionVfModuleInstanceAction>action).vnfStoreKey].vfModules[key][firstKey].action = (oldAction + '_Delete') as ServiceInstanceActions; + updateIsMissingDataOnDeleteVFModule(newState, (<UndoDeleteActionVfModuleInstanceAction>action).serviceId, (<UndoDeleteActionVfModuleInstanceAction>action).vnfStoreKey, key); + return newState; + } + } + return newState; + } + case VfModuleActions.UNDO_DELETE_ACTION_VF_MODULE_INSTANCE : { + let newState = _.cloneDeep(state); + let vfModules = newState.serviceInstance[(<DeleteActionVfModuleInstanceAction>action).serviceId].vnfs[(<DeleteActionVfModuleInstanceAction>action).vnfStoreKey].vfModules; + + for(let key in vfModules){ + let firstKey = Object.keys(vfModules[key])[0]; + if(firstKey === (<UndoDeleteActionVfModuleInstanceAction>action).dynamicModelName){ + let oldAction = newState.serviceInstance[(<UndoDeleteActionVfModuleInstanceAction>action).serviceId].vnfs[(<UndoDeleteActionVfModuleInstanceAction>action).vnfStoreKey].vfModules[key][firstKey].action; + newState.serviceInstance[(<UndoDeleteActionVfModuleInstanceAction>action).serviceId].vnfs[(<UndoDeleteActionVfModuleInstanceAction>action).vnfStoreKey].vfModules[key][firstKey].action = (oldAction.split('_')[0]) as ServiceInstanceActions; + updateIsMissingDataOnDeleteVFModule(newState, (<UndoDeleteActionVfModuleInstanceAction>action).serviceId, (<UndoDeleteActionVfModuleInstanceAction>action).vnfStoreKey, key); + return newState; + } + } + return newState; + } + + case VfModuleActions.UPDATE_VFMODULE_POSITION : { + const updateVFModluePosition = <UpdateVFModluePosition>action; + const serviceUuid = updateVFModluePosition.instanceId; + const dynamicModelName = updateVFModluePosition.node.dynamicModelName; + const modelName = updateVFModluePosition.node.modelName; + const newState = _.cloneDeep(state); + + newState.serviceInstance[serviceUuid].vnfs[updateVFModluePosition.vnfStoreKey].vfModules[modelName][dynamicModelName].position = updateVFModluePosition.node.position; + return newState; + } + } +} + +const updateIsMissingDataOnDeleteVFModule = (state: any, serviceModelId: string, vnfStoreKey: string, vfModuleName): void => { + const vfModules = state.serviceInstance[serviceModelId].vnfs[vnfStoreKey].vfModules[vfModuleName]; + + _.forOwn(vfModules, (vfModuleInstance) => { + let isMissingData: boolean = vfModuleInstance.isMissingData; + updateServiceValidationCounter(state, isMissingData, false, serviceModelId); + }); +}; + + +const updateUniqueNames = (oldName : string, newName : string, serviceInstance : ServiceInstance) : void => { + let existingNames = serviceInstance.existingNames; + if (!_.isNil(oldName) && oldName.toLowerCase() in existingNames) { + delete existingNames[oldName.toLowerCase()]; + } + if(!_.isNil(newName)) { + existingNames[newName.toLowerCase()] = ""; + } +}; + +const updateServiceValidationCounter = (newState: any, oldValidationState: boolean, newValidationState: boolean, serviceUuid: string) => { + if (oldValidationState && !newValidationState) { + newState.serviceInstance[serviceUuid].validationCounter--; + } else if (!oldValidationState && newValidationState) { + newState.serviceInstance[serviceUuid].validationCounter++; + } +}; + +const generateId = () => { + return Math.random().toString(36).replace(/[^a-z]+/g, '').substr(0, 5); +}; +const getVfModuleParentVnfId = (vnfs: object, vfModuleId: string) => { + let vnfId = undefined; + _.forOwn(vnfs, (value, key) => { + if (vnfs[key].vfModules && vnfs[key].vfModules[vfModuleId]) { + vnfId = vnfs[key].modelCustomizationName; + return false; + } + }); + return vnfId; +}; + + + + + + + + + + diff --git a/vid-webpack-master/src/app/shared/storeUtil/utils/vnf/vnf.actions.ts b/vid-webpack-master/src/app/shared/storeUtil/utils/vnf/vnf.actions.ts new file mode 100644 index 000000000..b84284490 --- /dev/null +++ b/vid-webpack-master/src/app/shared/storeUtil/utils/vnf/vnf.actions.ts @@ -0,0 +1,99 @@ +import {Action, ActionCreator} from "redux"; +import {VnfInstance} from "../../../models/vnfInstance"; + +export enum VNFActions { + CREATE_VNF_INSTANCE = "CREATE_VNF_INSTANCE", + UPDATE_VNF_INSTANCE = "UPDATE_VNF_INSTANCE", + REMOVE_VNF_INSTANCE = "REMOVE_VNF_INSTANCE", + DELETE_ACTION_VNF_INSTANCE = "DELETE_VNF_INSTANCE", + UNDO_DELETE_ACTION_VNF_INSTANCE = "UNDO_DELETE_VNF_INSTANCE", + UPDATE_VNF_POSITION = "UPDATE_VNF_POISTION" +} + + +export interface CreateVnfInstanceAction extends Action { + vnfInstance?: VnfInstance; + vnfModelName?: string; + serviceUuid?: string; + vnfStoreKey?:string; +} + +export interface UpdateVnfPosition extends Action { + node: any, + instanceId : string, + vnfStoreKey?: string; +} + +export interface UpdateVnfInstanceAction extends Action { + vnfInstance?: VnfInstance; + vnfModelName?: string; + serviceUuid?: string; + vnfStoreKey?:string; +} + + + +export interface DeleteActionVnfInstanceAction extends Action { + vnfStoreKey: string; + serviceId?: string; +} + +export interface UndoDeleteActionVnfInstanceAction extends Action { + vnfStoreKey: string; + serviceId?: string; +} + +export interface RemoveVnfInstanceAction extends Action { + vnfStoreKey: string; + serviceId?: string; +} + +export const createVNFInstance: ActionCreator<CreateVnfInstanceAction> = (vnfInstance, vnfModelName, serviceUuid, vnfStoreKey) => ({ + type: VNFActions.CREATE_VNF_INSTANCE, + vnfInstance: vnfInstance, + vnfModelName: vnfModelName, + serviceUuid: serviceUuid, + vnfStoreKey : vnfStoreKey +}); + + +export const updateVNFInstance: ActionCreator<UpdateVnfInstanceAction> = (vnfInstance, vnfModelName, serviceUuid, vnfStoreKey) => ({ + type: VNFActions.UPDATE_VNF_INSTANCE, + vnfInstance: vnfInstance, + vnfModelName: vnfModelName, + serviceUuid: serviceUuid, + vnfStoreKey : vnfStoreKey +}); + + +export const deleteActionVnfInstance: ActionCreator<DeleteActionVnfInstanceAction> = (vnfStoreKey, serviceId) => ({ + type: VNFActions.DELETE_ACTION_VNF_INSTANCE, + vnfStoreKey: vnfStoreKey, + serviceId: serviceId +}); + +export const undoDeleteActionVnfInstance: ActionCreator<UndoDeleteActionVnfInstanceAction> = (vnfStoreKey, serviceId) => ({ + type: VNFActions.UNDO_DELETE_ACTION_VNF_INSTANCE, + vnfStoreKey: vnfStoreKey, + serviceId: serviceId +}); + +export const removeVnfInstance: ActionCreator<RemoveVnfInstanceAction> = (vnfStoreKey, serviceId) => ({ + type: VNFActions.REMOVE_VNF_INSTANCE, + vnfStoreKey: vnfStoreKey, + serviceId: serviceId +}); + +export const updateVnfPosition: ActionCreator<UpdateVnfPosition> = (node, instanceId, vnfStoreKey) => ({ + type: VNFActions.UPDATE_VNF_POSITION, + node: node, + instanceId: instanceId, + vnfStoreKey : vnfStoreKey +}); + + + + + + + diff --git a/vid-webpack-master/src/app/shared/storeUtil/utils/vnf/vnf.reducers.spec.ts b/vid-webpack-master/src/app/shared/storeUtil/utils/vnf/vnf.reducers.spec.ts new file mode 100644 index 000000000..3241f11d9 --- /dev/null +++ b/vid-webpack-master/src/app/shared/storeUtil/utils/vnf/vnf.reducers.spec.ts @@ -0,0 +1,132 @@ +import {VnfInstance} from "../../../models/vnfInstance"; +import { + CreateVnfInstanceAction, + DeleteActionVnfInstanceAction, RemoveVnfInstanceAction, + UndoDeleteActionVnfInstanceAction, UpdateVnfPosition, + VNFActions +} from "./vnf.actions"; +import {vnfReducer} from "./vnf.reducers"; +import {ServiceInstanceActions} from "../../../models/serviceInstanceActions"; + +describe('networkReducer', () => { + test('#UPDATE_VNF_POSITION', () => { + let vnfInstance: VnfInstance = new VnfInstance(); + vnfInstance.isMissingData = false; + vnfInstance.instanceName = 'instanceName'; + let vnfState = vnfReducer(<any>{ + serviceInstance : { + 'serviceModelId' : { + vnfs : { + "vnfStoreKey" : { + + } + } + } + }}, + <UpdateVnfPosition>{ + type: VNFActions.UPDATE_VNF_POSITION, + node : <any>{ + position : 1 + }, + vnfStoreKey : 'vnfStoreKey', + instanceId : 'serviceModelId' + }).serviceInstance['serviceModelId'].vnfs['vnfStoreKey']; + + expect(vnfState).toBeDefined(); + expect(vnfState.position).toEqual(1); + }); + + test('#CREATE_NETWORK_INSTANCE', () => { + let vnfInstance: VnfInstance = new VnfInstance(); + vnfInstance.isMissingData = false; + vnfInstance.instanceName = 'instanceName'; + let vnfState = vnfReducer(<any>{serviceInstance : { + 'serviceModelId' : { + vnfs : { + + } + } + }}, + <CreateVnfInstanceAction>{ + type: VNFActions.CREATE_VNF_INSTANCE, + vnfInstance : vnfInstance, + vnfStoreKey : null, + vnfModelName : 'vnfModelName', + serviceUuid : 'serviceModelId' + }).serviceInstance['serviceModelId'].vnfs['vnfModelName']; + + expect(vnfState).toBeDefined(); + expect(vnfState.isMissingData).toBeFalsy(); + }); + + test('#DELETE_ACTION_VNF_INSTANCE', () => { + let vnfState = vnfReducer(<any>{serviceInstance : { + 'serviceModelId' : { + vnfs : { + 'vnfStoreKey' : { + isMissingData : true, + action : 'None' + } + } + } + }}, + <DeleteActionVnfInstanceAction>{ + type: VNFActions.DELETE_ACTION_VNF_INSTANCE, + vnfStoreKey: 'vnfStoreKey', + serviceId: 'serviceModelId' + }).serviceInstance['serviceModelId'].vnfs['vnfStoreKey']; + + expect(vnfState).toBeDefined(); + expect(vnfState.action).toEqual(ServiceInstanceActions.None_Delete); + }); + + test('#UNDO_DELETE_ACTION_VNF_INSTANCE', () => { + let vnfState = vnfReducer(<any>{serviceInstance : { + 'serviceModelId' : { + vnfs : { + 'vnfStoreKey' : { + isMissingData : true, + action : 'Update_Delete' + } + } + } + }}, + <UndoDeleteActionVnfInstanceAction>{ + type: VNFActions.UNDO_DELETE_ACTION_VNF_INSTANCE, + vnfStoreKey: 'vnfStoreKey', + serviceId: 'serviceModelId' + }).serviceInstance['serviceModelId'].vnfs['vnfStoreKey']; + + expect(vnfState).toBeDefined(); + expect(vnfState.action).toEqual(ServiceInstanceActions.Update); + }); + + test('#REMOVE_VNF_INSTANCE', () => { + let vnfs = vnfReducer(<any>{serviceInstance : { + 'serviceModelId' : { + vnfs : { + 'vnfStoreKey' : { + isMissingData : true, + action : 'Update_Delete' + }, + 'vnfStoreKey_1' : { + isMissingData : true, + action : 'Update_Delete' + } + } + } + }}, + <RemoveVnfInstanceAction>{ + type: VNFActions.REMOVE_VNF_INSTANCE, + vnfStoreKey: 'vnfStoreKey', + serviceId: 'serviceModelId' + }).serviceInstance['serviceModelId'].vnfs; + + expect(vnfs).toBeDefined(); + expect(vnfs['vnfStoreKey']).toBeUndefined(); + }); + +}); + + + diff --git a/vid-webpack-master/src/app/shared/storeUtil/utils/vnf/vnf.reducers.ts b/vid-webpack-master/src/app/shared/storeUtil/utils/vnf/vnf.reducers.ts new file mode 100644 index 000000000..cc24d8dc3 --- /dev/null +++ b/vid-webpack-master/src/app/shared/storeUtil/utils/vnf/vnf.reducers.ts @@ -0,0 +1,124 @@ +import {Action} from "redux"; +import {VnfInstance} from "../../../models/vnfInstance"; +import { + CreateVnfInstanceAction, + DeleteActionVnfInstanceAction, RemoveVnfInstanceAction, UndoDeleteActionVnfInstanceAction, + UpdateVnfInstanceAction, UpdateVnfPosition, + VNFActions +} from "./vnf.actions"; +import * as _ from "lodash"; +import {ServiceInstance} from "../../../models/serviceInstance"; +import {ServiceState} from "../main.reducer"; +import {ServiceInstanceActions} from "../../../models/serviceInstanceActions"; + +export function vnfReducer(state: ServiceState, action: Action): ServiceState { + switch (action.type) { + case VNFActions.CREATE_VNF_INSTANCE: { + const updateVnfInstanceAction = <CreateVnfInstanceAction>action; + const serviceUuid = updateVnfInstanceAction.serviceUuid; + let vnfModelName = updateVnfInstanceAction.vnfModelName; + let newState = _.cloneDeep(state); + + updateVnfInstanceAction.vnfInstance.originalName = vnfModelName; + updateVnfInstanceAction.vnfModelName = calculateNextUniqueModelName(vnfModelName, serviceUuid, newState, 'vnfs'); + + let vnfInstance: VnfInstance = newState.serviceInstance[serviceUuid].vnfs[vnfModelName]; + vnfInstance = new VnfInstance(); + updateVnfInstanceAction.vnfInstance.vnfStoreKey = updateVnfInstanceAction.vnfModelName; + updateVnfInstanceAction.vnfInstance.originalName = vnfModelName; + vnfInstance.originalName = updateVnfInstanceAction.vnfInstance.originalName; + vnfInstance.vnfStoreKey = updateVnfInstanceAction.vnfInstance.vnfStoreKey; + updateServiceValidationCounter(newState, vnfInstance['isMissingData'], updateVnfInstanceAction.vnfInstance['isMissingData'], serviceUuid); + + newState.serviceInstance[serviceUuid].vnfs[updateVnfInstanceAction.vnfModelName] = Object.assign(vnfInstance, updateVnfInstanceAction.vnfInstance); + return newState; + } + + case VNFActions.UPDATE_VNF_INSTANCE: { + const updateVnfInstanceAction = <UpdateVnfInstanceAction>action; + const serviceUuid = updateVnfInstanceAction.serviceUuid; + let vnfStoreKey = updateVnfInstanceAction.vnfStoreKey; + + + let newState = _.cloneDeep(state); + let vnfInstance: VnfInstance = newState.serviceInstance[serviceUuid].vnfs[vnfStoreKey]; + updateUniqueNames(vnfInstance ? vnfInstance.instanceName : null, updateVnfInstanceAction.vnfInstance.instanceName, newState.serviceInstance[serviceUuid]); + + vnfInstance = vnfInstance || new VnfInstance(); + updateServiceValidationCounter(newState, vnfInstance['isMissingData'], updateVnfInstanceAction.vnfInstance['isMissingData'], serviceUuid); + + newState.serviceInstance[serviceUuid].vnfs[vnfStoreKey] = Object.assign(vnfInstance, updateVnfInstanceAction.vnfInstance); + return newState; + } + + case VNFActions.DELETE_ACTION_VNF_INSTANCE : { + let newState = _.cloneDeep(state); + let vnf = newState.serviceInstance[(<DeleteActionVnfInstanceAction>action).serviceId].vnfs[(<DeleteActionVnfInstanceAction>action).vnfStoreKey]; + let oldAction = vnf.action; + if(oldAction === ServiceInstanceActions.None_Delete || oldAction === ServiceInstanceActions.Update_Delete) return newState; + newState.serviceInstance[(<DeleteActionVnfInstanceAction>action).serviceId].vnfs[(<DeleteActionVnfInstanceAction>action).vnfStoreKey].action = (oldAction + '_Delete') as ServiceInstanceActions; + updateServiceValidationCounter(newState, vnf['isMissingData'], false, (<RemoveVnfInstanceAction>action).serviceId); + return newState; + } + + case VNFActions.UNDO_DELETE_ACTION_VNF_INSTANCE : { + let newState = _.cloneDeep(state); + let vnf = newState.serviceInstance[(<UndoDeleteActionVnfInstanceAction>action).serviceId].vnfs[(<UndoDeleteActionVnfInstanceAction>action).vnfStoreKey]; + let oldState = vnf.action; + newState.serviceInstance[(<UndoDeleteActionVnfInstanceAction>action).serviceId].vnfs[(<UndoDeleteActionVnfInstanceAction>action).vnfStoreKey].action = (oldState.split('_')[0]) as ServiceInstanceActions; + updateServiceValidationCounter(newState, vnf['isMissingData'], false, (<UndoDeleteActionVnfInstanceAction>action).serviceId); + return newState; + } + + case VNFActions.REMOVE_VNF_INSTANCE : { + let newState = _.cloneDeep(state); + let vnfInstance = newState.serviceInstance[(<RemoveVnfInstanceAction>action).serviceId].vnfs[(<RemoveVnfInstanceAction>action).vnfStoreKey]; + updateServiceValidationCounter(newState, vnfInstance['isMissingData'], false, (<RemoveVnfInstanceAction>action).serviceId); + delete newState.serviceInstance[(<RemoveVnfInstanceAction>action).serviceId].vnfs[(<RemoveVnfInstanceAction>action).vnfStoreKey]; + return newState; + } + + case VNFActions.UPDATE_VNF_POSITION : { + let newState = _.cloneDeep(state); + newState.serviceInstance[(<UpdateVnfPosition>action).instanceId].vnfs[(<UpdateVnfPosition>action).vnfStoreKey].position = (<UpdateVnfPosition>action).node.position; + return newState; + } + } +} + +const updateServiceValidationCounter = (newState: any, oldValidationState: boolean, newValidationState: boolean, serviceUuid: string) => { + if (oldValidationState && !newValidationState) { + newState.serviceInstance[serviceUuid].validationCounter--; + } else if (!oldValidationState && newValidationState) { + newState.serviceInstance[serviceUuid].validationCounter++; + } +}; + + +const updateUniqueNames = (oldName: string, newName: string, serviceInstance: ServiceInstance): void => { + let existingNames = serviceInstance.existingNames; + if (!_.isNil(oldName) && oldName.toLowerCase() in existingNames) { + delete existingNames[oldName.toLowerCase()]; + } + if (!_.isNil(newName)) { + existingNames[newName.toLowerCase()] = ""; + } +}; + + +export const calculateNextUniqueModelName = (vnfModelName: string, serviceId: string, state: any, levelName: string): string => { + let counter: number = null; + while (true) { + let pattern = !_.isNil(counter) ? ("_" + counter) : ""; + if (!_.isNil(state.serviceInstance[serviceId][levelName][vnfModelName + pattern])) { + counter = counter ? (counter + 1) : 1; + } else { + return vnfModelName + pattern; + } + } +}; + + + + + diff --git a/vid-webpack-master/src/app/shared/storeUtil/utils/vnfGroup/vnfGroup.actions.ts b/vid-webpack-master/src/app/shared/storeUtil/utils/vnfGroup/vnfGroup.actions.ts new file mode 100644 index 000000000..4ed377b7d --- /dev/null +++ b/vid-webpack-master/src/app/shared/storeUtil/utils/vnfGroup/vnfGroup.actions.ts @@ -0,0 +1,82 @@ +import {Action, ActionCreator} from "redux"; +import {VnfGroupInstance} from "../../../models/vnfGroupInstance"; +import {VnfMember} from "../../../models/VnfMember"; + +export enum VnfGroupActions { + CREATE_VNF_GROUP_INSTANCE = "CREATE_VNF_GROUP_INSTANCE", + UPDATE_VNF_GROUP_INSTANCE = "UPDATE_VNF_GROUP_INSTANCE", + DELETE_ACTION_VNF_GROUP_INSTANCE = "DELETE_VNF_GROUP_INSTANCE", + UNDO_DELETE_ACTION_VNF_GROUP_INSTANCE = "UNDO_DELETE_VNF_GROUP_INSTANCE", + SET_OPTIONAL_MEMBERS_VNF_GROUP_INSTANCE = "SET_OPTIONAL_MEMBERS_VNF_GROUP_INSTANCE" +} + + +export interface CreateVnfGroupInstanceAction extends Action { + vnfGroupInstance?: VnfGroupInstance; + vnfGroupModelName?: string; + serviceUuid?: string; + vnfGroupStoreKey?:string; +} + +export interface UpdateVnfGroupInstanceAction extends Action { + vnfGroupInstance?: VnfGroupInstance; + vnfGroupModelName?: string; + serviceUuid?: string; + vnfGroupStoreKey?:string; +} + +export interface DeleteActionVnfGroupInstanceAction extends Action { + vnfGroupStoreKey: string; + serviceId?: string; +} + +export interface UndoDeleteActionVnfGroupInstanceAction extends Action { + vnfGroupStoreKey: string; + serviceId?: string; +} + +export interface SetOptionalMembersVnfGroupInstanceAction extends Action{ + path?: string; + serviceId?: string; + vnfMembers?: VnfMember[] +} + +export const createVnfGroupInstance: ActionCreator<CreateVnfGroupInstanceAction> = (vnfGroupInstance, vnfGroupModelName, serviceUuid, vnfGroupStoreKey) => ({ + type: VnfGroupActions.CREATE_VNF_GROUP_INSTANCE, + vnfGroupInstance: vnfGroupInstance, + vnfGroupModelName: vnfGroupModelName, + serviceUuid: serviceUuid, + vnfGroupStoreKey : vnfGroupStoreKey +}); + + +export const updateVnfGroupInstance: ActionCreator<UpdateVnfGroupInstanceAction> = (vnfGroupInstance, vnfGroupModelName, serviceUuid, vnfGroupStoreKey) => ({ + type: VnfGroupActions.UPDATE_VNF_GROUP_INSTANCE, + vnfGroupInstance: vnfGroupInstance, + vnfGroupModelName: vnfGroupModelName, + serviceUuid: serviceUuid, + vnfGroupStoreKey : vnfGroupStoreKey +}); + +export const deleteActionVnfGroupInstance: ActionCreator<DeleteActionVnfGroupInstanceAction> = (vnfGroupStoreKey, serviceId) => ({ + type: VnfGroupActions.DELETE_ACTION_VNF_GROUP_INSTANCE, + vnfGroupStoreKey: vnfGroupStoreKey, + serviceId: serviceId +}); + +export const undoDeleteActionVnfGroupInstance: ActionCreator<UndoDeleteActionVnfGroupInstanceAction> = (vnfGroupStoreKey, serviceId) => ({ + type: VnfGroupActions.UNDO_DELETE_ACTION_VNF_GROUP_INSTANCE, + vnfGroupStoreKey: vnfGroupStoreKey, + serviceId: serviceId +}); + +export const setOptionalMembersVnfGroupInstance: ActionCreator<SetOptionalMembersVnfGroupInstanceAction> = ( serviceId: string, path: string, vnfMembers: VnfMember[]) => ({ + type: VnfGroupActions.SET_OPTIONAL_MEMBERS_VNF_GROUP_INSTANCE, + path: path, + serviceId: serviceId, + vnfMembers: vnfMembers +}); + + + + diff --git a/vid-webpack-master/src/app/shared/storeUtil/utils/vnfGroup/vnfGroup.reducers.spec.ts b/vid-webpack-master/src/app/shared/storeUtil/utils/vnfGroup/vnfGroup.reducers.spec.ts new file mode 100644 index 000000000..16c1c45cd --- /dev/null +++ b/vid-webpack-master/src/app/shared/storeUtil/utils/vnfGroup/vnfGroup.reducers.spec.ts @@ -0,0 +1,140 @@ +import {VnfGroupInstance} from "../../../models/vnfGroupInstance"; +import { + CreateVnfGroupInstanceAction, + DeleteActionVnfGroupInstanceAction, + SetOptionalMembersVnfGroupInstanceAction, + UpdateVnfGroupInstanceAction, + VnfGroupActions +} from "./vnfGroup.actions"; +import {vnfGroupReducer} from "./vnfGroup.reducers"; +import {ServiceInstanceActions} from "../../../models/serviceInstanceActions"; +import {VnfMember} from "../../../models/VnfMember"; + + +describe('vnfGroupReducer', () => { + test('#CREATE_VNF_GROUP_INSTANCE', () => { + let vnfGroupInstance: VnfGroupInstance = new VnfGroupInstance(); + vnfGroupInstance.isMissingData = false; + vnfGroupInstance.instanceName = 'instanceName'; + let vnfGroupState = vnfGroupReducer(<any>{serviceInstance : { + 'serviceModelId' : { + vnfGroups : { + + } + } + }}, + <CreateVnfGroupInstanceAction>{ + type: VnfGroupActions.CREATE_VNF_GROUP_INSTANCE, + vnfGroupInstance : vnfGroupInstance, + vnfGroupStoreKey : null, + vnfGroupModelName : 'vnfGroupModelName', + serviceUuid : 'serviceModelId' + }).serviceInstance['serviceModelId'].vnfGroups['vnfGroupModelName']; + + expect(vnfGroupState).toBeDefined(); + expect(vnfGroupState.isMissingData).toBeFalsy(); + }); + + test('#UPDATE_VNF_GROUP_INSTANCE', () => { + let vnfGroupInstance: VnfGroupInstance = new VnfGroupInstance(); + vnfGroupInstance.isMissingData = false; + vnfGroupInstance.instanceName = 'instanceName'; + let vnfGroupState = vnfGroupReducer(<any>{serviceInstance : { + 'serviceModelId' : { + vnfGroups : { + 'vnfGroupStoreKey' : { + isMissingData : true + } + } + } + }}, + <UpdateVnfGroupInstanceAction>{ + type: VnfGroupActions.UPDATE_VNF_GROUP_INSTANCE, + vnfGroupInstance : new VnfGroupInstance(), + vnfGroupStoreKey : 'vnfGroupStoreKey', + vnfGroupModelName : 'vnfGroupModelName', + serviceUuid : 'serviceModelId' + }).serviceInstance['serviceModelId'].vnfGroups['vnfGroupStoreKey']; + + expect(vnfGroupState).toBeDefined(); + expect(vnfGroupState.isMissingData).toBeFalsy(); + }); + + test('#DELETE_ACTION_VNF_GROUP_INSTANCE', () => { + let vnfGroupInstance: VnfGroupInstance = new VnfGroupInstance(); + vnfGroupInstance.isMissingData = false; + vnfGroupInstance.instanceName = 'instanceName'; + vnfGroupInstance.action = ServiceInstanceActions.None; + let vnfGroupState = vnfGroupReducer(<any>{serviceInstance : { + 'serviceModelId' : { + vnfGroups : { + 'vnfGroupStoreKey' : { + isMissingData : true, + action : 'None' + } + } + } + }}, + <DeleteActionVnfGroupInstanceAction>{ + type: VnfGroupActions.DELETE_ACTION_VNF_GROUP_INSTANCE, + vnfGroupStoreKey: 'vnfGroupStoreKey', + serviceId: 'serviceModelId' + }).serviceInstance['serviceModelId'].vnfGroups['vnfGroupStoreKey']; + + expect(vnfGroupState).toBeDefined(); + expect(vnfGroupState.action).toEqual(ServiceInstanceActions.None_Delete); + }); + + test('#UNDO_DELETE_ACTION_VNF_GROUP_INSTANCE', () => { + let vnfGroupInstance: VnfGroupInstance = new VnfGroupInstance(); + vnfGroupInstance.isMissingData = false; + vnfGroupInstance.instanceName = 'instanceName'; + vnfGroupInstance.action = ServiceInstanceActions.None_Delete; + let vnfGroupState = vnfGroupReducer(<any>{serviceInstance : { + 'serviceModelId' : { + vnfGroups : { + 'vnfGroupStoreKey' : { + isMissingData : true, + action : 'None_Delete' + } + } + } + }}, + <DeleteActionVnfGroupInstanceAction>{ + type: VnfGroupActions.UNDO_DELETE_ACTION_VNF_GROUP_INSTANCE, + vnfGroupStoreKey: 'vnfGroupStoreKey', + serviceId: 'serviceModelId' + }).serviceInstance['serviceModelId'].vnfGroups['vnfGroupStoreKey']; + + expect(vnfGroupState).toBeDefined(); + expect(vnfGroupState.action).toEqual(ServiceInstanceActions.None); + }); + + test('#SET_OPTIONAL_MEMBERS_VNF_GROUP_INSTANCE', () => { + let vnf1: VnfMember = new VnfMember(); + vnf1.serviceInstanceId = 'aa'; + vnf1.instanceId = 'aaa'; + let vnf2: VnfMember = new VnfMember(); + vnf2.serviceInstanceId = 'bb'; + vnf2.instanceId = 'bbb'; + let optionalGroupMembersMap = vnfGroupReducer(<any>{ + serviceInstance: { + 'serviceModelId': { + optionalGroupMembersMap : {} + } + } + }, + <SetOptionalMembersVnfGroupInstanceAction>{ + type: VnfGroupActions.SET_OPTIONAL_MEMBERS_VNF_GROUP_INSTANCE, + path: 'path1', + serviceId: 'serviceModelId', + vnfMembers: [vnf1, vnf2] + }).serviceInstance['serviceModelId'].optionalGroupMembersMap; + + optionalGroupMembersMap['path1']= [vnf1, vnf2]; + expect(optionalGroupMembersMap).toEqual({'path1':[vnf1, vnf2]}); + }); +}); + + + diff --git a/vid-webpack-master/src/app/shared/storeUtil/utils/vnfGroup/vnfGroup.reducers.ts b/vid-webpack-master/src/app/shared/storeUtil/utils/vnfGroup/vnfGroup.reducers.ts new file mode 100644 index 000000000..2923c09b2 --- /dev/null +++ b/vid-webpack-master/src/app/shared/storeUtil/utils/vnfGroup/vnfGroup.reducers.ts @@ -0,0 +1,108 @@ +import {Action} from "redux"; +import {VnfGroupInstance} from "../../../models/vnfGroupInstance"; +import * as _ from "lodash"; +import {ServiceInstance} from "../../../models/serviceInstance"; +import {ServiceState} from "../main.reducer"; +import { + CreateVnfGroupInstanceAction, + DeleteActionVnfGroupInstanceAction, SetOptionalMembersVnfGroupInstanceAction, + UpdateVnfGroupInstanceAction, + VnfGroupActions +} from "./vnfGroup.actions"; +import {ServiceInstanceActions} from "../../../models/serviceInstanceActions"; + +export function vnfGroupReducer(state: ServiceState, action: Action): ServiceState { + switch (action.type) { + case VnfGroupActions.CREATE_VNF_GROUP_INSTANCE: { + const updateVnfGroupInstanceAction = <CreateVnfGroupInstanceAction>action; + const serviceUuid = updateVnfGroupInstanceAction.serviceUuid; + let vnfGroupModelName = updateVnfGroupInstanceAction.vnfGroupModelName; + let newState = _.cloneDeep(state); + + updateVnfGroupInstanceAction.vnfGroupInstance.originalName = vnfGroupModelName; + updateVnfGroupInstanceAction.vnfGroupModelName = calculateNextUniqueModelName(vnfGroupModelName, serviceUuid, newState, 'vnfGroups'); + + let vnfGroupInstance: VnfGroupInstance = newState.serviceInstance[serviceUuid].vnfGroups[vnfGroupModelName]; + vnfGroupInstance = new VnfGroupInstance(); + updateVnfGroupInstanceAction.vnfGroupInstance.vnfGroupStoreKey = updateVnfGroupInstanceAction.vnfGroupModelName; + updateVnfGroupInstanceAction.vnfGroupInstance.originalName = vnfGroupModelName; + vnfGroupInstance.originalName = updateVnfGroupInstanceAction.vnfGroupInstance.originalName; + vnfGroupInstance.vnfGroupStoreKey = updateVnfGroupInstanceAction.vnfGroupInstance.vnfGroupStoreKey; + updateServiceValidationCounter(newState, vnfGroupInstance['isMissingData'], updateVnfGroupInstanceAction.vnfGroupInstance['isMissingData'], serviceUuid); + + newState.serviceInstance[serviceUuid].vnfGroups[updateVnfGroupInstanceAction.vnfGroupModelName] = Object.assign(vnfGroupInstance, updateVnfGroupInstanceAction.vnfGroupInstance); + return newState; + } + case VnfGroupActions.UPDATE_VNF_GROUP_INSTANCE: { + const updateVnfInstanceAction = <UpdateVnfGroupInstanceAction>action; + const serviceUuid = updateVnfInstanceAction.serviceUuid; + let vnfGroupStoreKey = updateVnfInstanceAction.vnfGroupStoreKey; + + + let newState = _.cloneDeep(state); + let vnfGroupInstance: VnfGroupInstance = newState.serviceInstance[serviceUuid].vnfGroups[vnfGroupStoreKey]; + updateUniqueNames(vnfGroupInstance ? vnfGroupInstance.instanceName : null, updateVnfInstanceAction.vnfGroupInstance.instanceName, newState.serviceInstance[serviceUuid]); + + vnfGroupInstance = vnfGroupInstance || new VnfGroupInstance(); + updateServiceValidationCounter(newState, vnfGroupInstance['isMissingData'], updateVnfInstanceAction.vnfGroupInstance['isMissingData'], serviceUuid); + + newState.serviceInstance[serviceUuid].vnfGroups[vnfGroupStoreKey] = Object.assign(vnfGroupInstance, updateVnfInstanceAction.vnfGroupInstance); + return newState; + } + case VnfGroupActions.DELETE_ACTION_VNF_GROUP_INSTANCE : { + let newState = _.cloneDeep(state); + let oldAction = newState.serviceInstance[(<DeleteActionVnfGroupInstanceAction>action).serviceId].vnfGroups[(<DeleteActionVnfGroupInstanceAction>action).vnfGroupStoreKey].action; + if(oldAction === ServiceInstanceActions.None_Delete || oldAction === ServiceInstanceActions.Update_Delete) return newState; + newState.serviceInstance[(<DeleteActionVnfGroupInstanceAction>action).serviceId].vnfGroups[(<DeleteActionVnfGroupInstanceAction>action).vnfGroupStoreKey].action = (oldAction + '_Delete') as ServiceInstanceActions; + return newState; + } + case VnfGroupActions.UNDO_DELETE_ACTION_VNF_GROUP_INSTANCE : { + let newState = _.cloneDeep(state); + let oldState = newState.serviceInstance[(<DeleteActionVnfGroupInstanceAction>action).serviceId].vnfGroups[(<DeleteActionVnfGroupInstanceAction>action).vnfGroupStoreKey].action; + newState.serviceInstance[(<DeleteActionVnfGroupInstanceAction>action).serviceId].vnfGroups[(<DeleteActionVnfGroupInstanceAction>action).vnfGroupStoreKey].action = (oldState.split('_')[0]) as ServiceInstanceActions; + return newState; + } + case VnfGroupActions.SET_OPTIONAL_MEMBERS_VNF_GROUP_INSTANCE:{ + let newState = _.cloneDeep(state); + newState.serviceInstance[(<SetOptionalMembersVnfGroupInstanceAction>action).serviceId].optionalGroupMembersMap[(<SetOptionalMembersVnfGroupInstanceAction>action).path] = (<SetOptionalMembersVnfGroupInstanceAction>action).vnfMembers; + return newState; + } + } +} + +const updateServiceValidationCounter = (newState: any, oldValidationState: boolean, newValidationState: boolean, serviceUuid: string) => { + if (oldValidationState && !newValidationState) { + newState.serviceInstance[serviceUuid].validationCounter--; + } else if (!oldValidationState && newValidationState) { + newState.serviceInstance[serviceUuid].validationCounter++; + } +}; + + +const updateUniqueNames = (oldName: string, newName: string, serviceInstance: ServiceInstance): void => { + let existingNames = serviceInstance.existingNames; + if (!_.isNil(oldName) && oldName.toLowerCase() in existingNames) { + delete existingNames[oldName.toLowerCase()]; + } + if (!_.isNil(newName)) { + existingNames[newName.toLowerCase()] = ""; + } +}; + + +export const calculateNextUniqueModelName = (vnfGroupModelName: string, serviceId: string, state: any, levelName: string): string => { + let counter: number = null; + while (true) { + let pattern = !_.isNil(counter) ? ("_" + counter) : ""; + if (!_.isNil(state.serviceInstance[serviceId][levelName][vnfGroupModelName + pattern])) { + counter = counter ? (counter + 1) : 1; + } else { + return vnfGroupModelName + pattern; + } + } +}; + + + + + diff --git a/vid-webpack-master/src/app/shared/utils/constants.ts b/vid-webpack-master/src/app/shared/utils/constants.ts index c78e12e28..f69517cf2 100644 --- a/vid-webpack-master/src/app/shared/utils/constants.ts +++ b/vid-webpack-master/src/app/shared/utils/constants.ts @@ -34,9 +34,10 @@ export module Constants { public static AAI_GET_SERVICES_BY_TYPE = 'aai_get_models_by_service_type'; public static AAI_GET_TENANTS = '../../aai_get_tenants/'; public static AAI_SUB_DETAILS_PATH = '../../aai_sub_details/'; + public static AAI_GET_SERVICE_INSTANCE_TOPOLOGY_PATH = '../../aai_get_service_instance_topology/'; + public static AAI_GET_SERVICE_GROUP_MEMBERS_PATH = '../../aai_search_group_members/'; public static AAI_GET_VERSION_BY_INVARIANT_ID = 'aai_get_version_by_invariant_id/'; public static SEARCH_SERVICE_INSTANCES = 'search_service_instances'; - public static AAI_GET_VNF_DATA_PATH = 'aai_get_vnf_data/'; public static AAI_GET_VNF_BY_CUSTOMERID_AND_SERVICETYPE = 'get_vnf_data_by_globalid_and_service_type/'; public static AAI_GET_SERVICES_BY_OWNING_ENTITY_ID = 'aai_get_services_by_owning_entity_id'; public static AAI_GET_VNF_INFO = 'aai_get_vnf_information'; @@ -87,10 +88,12 @@ export module Constants { public static WELCOME_PATH = 'welcome.htm'; public static IS_PERMITTED_SUB_PATH = '&isPermitted='; public static SERVICES_JOB_INFO_PATH = '../../asyncInstantiation'; + public static SERVICES_RETRY_TOPOLOGY = '../../asyncInstantiation/bulkForRetry'; public static CONFIGURATION_PATH = '../../get_property/{name}/defaultvalue'; public static SERVICES_JOB_AUDIT_PATH = '/auditStatus'; public static SERVICES_PROBE_PATH = "../../probe"; public static FEATURES_FLAG_PATH ="../../flags"; + public static AUDIT_STATUS_FOR_RETRY_PATH = '../../asyncInstantiation/auditStatusForRetry'; // Test Environment Urls = public static OPERATIONAL_ENVIRONMENT_CREATE = 'operationalEnvironment/create'; @@ -284,4 +287,8 @@ export module Constants { export class AuditInfoModal{ public static TITLE = 'Service Instantiation Information'; } + + export class LegacyRegion { + public static MEGA_REGION = ['JANET25']; + } } diff --git a/vid-webpack-master/src/app/shared/utils/httpInterceptor/httpInterceptor.service.ts b/vid-webpack-master/src/app/shared/utils/httpInterceptor/httpInterceptor.service.ts index be9ade080..daa31a33f 100644 --- a/vid-webpack-master/src/app/shared/utils/httpInterceptor/httpInterceptor.service.ts +++ b/vid-webpack-master/src/app/shared/utils/httpInterceptor/httpInterceptor.service.ts @@ -1,19 +1,19 @@ -import { Injectable } from '@angular/core'; -import { - HttpInterceptor, - HttpRequest, - HttpHandler, - HttpEvent, HttpErrorResponse -} from '@angular/common/http'; +import {Injectable} from '@angular/core'; +import {HttpErrorResponse, HttpEvent, HttpHandler, HttpInterceptor, HttpRequest} from '@angular/common/http'; -import { Observable } from 'rxjs/Observable'; -import { ErrorMessage, ErrorService } from '../../components/error/error.component.service'; -import { SpinnerComponent } from '../../components/spinner/spinner.component'; +import {Observable} from 'rxjs'; +import {ErrorMessage, ErrorService} from '../../components/error/error.component.service'; +import {SpinnerComponent, SpinnerInfo} from '../../components/spinner/spinner.component'; +import {of} from "rxjs"; @Injectable() export class HttpInterceptorService implements HttpInterceptor { intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> { - SpinnerComponent.showSpinner.next(true); + if (request.headers.get('x-show-spinner') !== false.toString()) { + let spinnerInfo : SpinnerInfo = new SpinnerInfo(true, request.url, request.responseType); + SpinnerComponent.showSpinner.next(spinnerInfo); + } + return next.handle(request) .catch((err: HttpErrorResponse) => { if (err.status === 500) { @@ -21,11 +21,12 @@ export class HttpInterceptorService implements HttpInterceptor { 'It appears that one of the backend servers is not responding.\n Please try later.', 500); ErrorService.showErrorWithMessage(errorMessage); - return Observable.of(null); + return of(null); } return Observable.throw(err); }).finally(() => { - SpinnerComponent.showSpinner.next(false); + let spinnerInfo : SpinnerInfo = new SpinnerInfo(false, request.url, request.responseType); + SpinnerComponent.showSpinner.next(spinnerInfo); }); } } diff --git a/vid-webpack-master/src/app/shared/utils/log/log.service.spec.ts b/vid-webpack-master/src/app/shared/utils/log/log.service.spec.ts index ea0eb0499..15a840f76 100644 --- a/vid-webpack-master/src/app/shared/utils/log/log.service.spec.ts +++ b/vid-webpack-master/src/app/shared/utils/log/log.service.spec.ts @@ -1,16 +1,24 @@ import {LogService} from "./log.service"; +import {TestBed} from "@angular/core/testing"; describe('log service service', () => { + let logService : LogService; - beforeEach(() => { + beforeAll(done => (async () => { + TestBed.configureTestingModule({ + + }); + await TestBed.compileComponents(); logService = new LogService(); - }); - it('check all ILogger function are defined', ()=>{ + })().then(done).catch(done.fail)); + + + test('check all ILogger function are defined', ()=>{ expect(logService.log).toBeDefined(); expect(logService.assert).toBeDefined(); expect(logService.error).toBeDefined(); @@ -20,10 +28,40 @@ describe('log service service', () => { expect(logService.warn).toBeDefined(); }); - it('test getPrefixLog function', ()=> { + test('test getPrefixLog function: with data', ()=> { let args = ['message', [1,2,3,4,5]]; let result = LogService.getPrefixLog(args); expect(result).toBeDefined(); }); + test('log assert', ()=> { + jest.spyOn(console, 'assert'); + logService.assert('someArg'); + expect(console.assert).toHaveBeenCalled(); + }); + + test('log group', ()=> { + jest.spyOn(console, 'group'); + logService.group('someArg'); + expect(console.group).toHaveBeenCalled(); + }); + + test('log groupEnd', ()=> { + jest.spyOn(console, 'groupEnd'); + logService.groupEnd('someArg'); + expect(console.groupEnd).toHaveBeenCalled(); + }); + + test('log log', ()=> { + jest.spyOn(console, 'log'); + logService.log('someArg'); + expect(console.log).toHaveBeenCalled(); + }); + + test('log warn', ()=> { + spyOn(console, 'warn'); + logService.warn('someArg'); + expect(console.warn).toHaveBeenCalled(); + }); + }); diff --git a/vid-webpack-master/src/app/shared/utils/util.spec.ts b/vid-webpack-master/src/app/shared/utils/util.spec.ts new file mode 100644 index 000000000..2f9142f9c --- /dev/null +++ b/vid-webpack-master/src/app/shared/utils/util.spec.ts @@ -0,0 +1,31 @@ +import {Utils} from "./utils"; +import {TestBed} from "@angular/core/testing"; + + +describe('Util', () => { + let util: Utils; + + beforeAll(done => (async () => { + TestBed.configureTestingModule({ + + }); + await TestBed.compileComponents(); + + util = new Utils(); + + })().then(done).catch(done.fail)); + + test('should be defined', () => { + expect(util).toBeDefined(); + }); + + test('hasContents should return false if object is undefined or null or empty', () => { + expect(Utils.hasContents(undefined)).toBeFalsy(); + expect(Utils.hasContents(null)).toBeFalsy(); + expect(Utils.hasContents("")).toBeFalsy(); + }); + + test('hasContents should return true if object is not undefined and not null and not empty', () => { + expect(Utils.hasContents("someValue")).toBeTruthy(); + }); +}); diff --git a/vid-webpack-master/src/app/utils/utils.ts b/vid-webpack-master/src/app/shared/utils/utils.ts index dc4db3e4f..d63a3c997 100644 --- a/vid-webpack-master/src/app/utils/utils.ts +++ b/vid-webpack-master/src/app/shared/utils/utils.ts @@ -1,5 +1,3 @@ -import { Constants } from '../shared/utils/constants'; -import Parameter = Constants.Parameter; import * as _ from 'lodash' export class Utils { @@ -196,8 +194,6 @@ export class Utils { for (let networkCustomizationName in serviceModel.networks) { let networkModel = serviceModel.networks[networkCustomizationName]; convertedAsdcModel.networks[networkModel.invariantUuid] = {}; - //convertedAsdcModel.networks[networkModel.invariantUuid][networkModel.version] = networkModel; - // need a network model to test this convertedAsdcModel.networks[networkModel.uuid] = { "uuid": networkModel.uuid, "invariantUuid": networkModel.invariantUuid, diff --git a/vid-webpack-master/src/app/shared/validators/uniqueName/uniqueName.validator.spec.ts b/vid-webpack-master/src/app/shared/validators/uniqueName/uniqueName.validator.spec.ts new file mode 100644 index 000000000..35d3c48e8 --- /dev/null +++ b/vid-webpack-master/src/app/shared/validators/uniqueName/uniqueName.validator.spec.ts @@ -0,0 +1,41 @@ +import {FormControl, ValidatorFn} from "@angular/forms"; +import {CustomValidators} from "./uniqueName.validator"; +import {FileUnit} from "../../components/formControls/component/file/fileUnit.enum"; + + +describe('Custom Validator Functions', () => { + test('isValidJson Validator should return null when value is valid and correct object when invalid', () => { + + let isValidJsonFunction: ValidatorFn = CustomValidators.isValidJson(); + + expect(isValidJsonFunction(new FormControl("{ 'key': 'value', 'array': ['first',]}"))).toEqual({ isValidJson: true }); + + expect(isValidJsonFunction(new FormControl('{ "key": "value", "array": ["first"]'))).toEqual({ isValidJson: true }); + + expect(isValidJsonFunction(new FormControl('{ "key": "value", "array": ["first"]}'))).toEqual(null); + + expect(isValidJsonFunction(new FormControl('{ "key": "value", "array": "first"}'))).toEqual(null); + }); + + test('isStringContainTags Validator should return null when value is valid and correct object when invalid', () => { + + const isStringContainTagsFunction: ValidatorFn = CustomValidators.isStringContainTags(); + + expect(isStringContainTagsFunction(new FormControl('<asdf>'))).toEqual({isStringContainTags : true}); + + expect(isStringContainTagsFunction(new FormControl('1234<asfd56'))).toEqual(null); + }); + + test('isFileTooBig Validator should return null when value is valid and correct object when invalid', () => { + + let isFileTooBigFunction: ValidatorFn = CustomValidators.isFileTooBig(FileUnit.MB, 5); + + expect(isFileTooBigFunction(new FormControl({ size: 6000001 }))).toEqual({ isFileTooBig: true }); + + expect(isFileTooBigFunction(new FormControl({ size: 4000000}))).toEqual(null); + + isFileTooBigFunction = CustomValidators.isFileTooBig(FileUnit.B, 5); + + expect(isFileTooBigFunction(new FormControl({ size: 4000000}))).toEqual({ isFileTooBig: true }); + }) +}); diff --git a/vid-webpack-master/src/app/shared/validators/uniqueName/uniqueName.validator.ts b/vid-webpack-master/src/app/shared/validators/uniqueName/uniqueName.validator.ts new file mode 100644 index 000000000..4d3e3837b --- /dev/null +++ b/vid-webpack-master/src/app/shared/validators/uniqueName/uniqueName.validator.ts @@ -0,0 +1,100 @@ +import {AbstractControl, ValidatorFn} from "@angular/forms"; +import {Injectable} from "@angular/core"; +import {NgRedux} from "@angular-redux/store"; +import {AppState} from "../../store/reducers"; +import {FileUnit} from "../../components/formControls/component/file/fileUnit.enum"; +import * as _ from 'lodash'; + +@Injectable() +export class CustomValidators { + static uniqueInstanceNameValidator(...args): ValidatorFn { + const store : NgRedux<AppState> = args[0]; + const serviceId : string = args[1]; + const originalName : string = args[2]; + return (control: AbstractControl): {[key: string]: any} | null => { + const name = control.value; + if(name && name !== originalName) { + const result: boolean = CustomValidators.isUnique(store.getState().service.serviceInstance, serviceId, name, name === originalName); + if(!result){ + return { + uniqueInstanceNameValidator : true + }; + }else { + return null; + } + } + return null; + }; + } + + static isUnique(serviceInstance : any, serviceId : string, name: string, isEqualToOriginalInstanceName : boolean) : boolean { + const service = serviceInstance[serviceId]; + if(service){ + const existingNames = service.existingNames; + if(_.includes(existingNames, name)) return false; + } + return true; + } + + static isStringContainHtmlTag(str: string): boolean{ + var regex = RegExp("<[^>]*>"); + return regex.test(str); + } + + static isValidJson() : ValidatorFn { + return (control: AbstractControl): {[key: string]: any} | null => { + const content = control.value; + let invalid: boolean = false; + if (content) { + try { + JSON.parse(content); + } catch (e) { + invalid = true; + } + } + return (invalid) ? {isValidJson : true} : null; + } + } + + static isStringContainTags() : ValidatorFn { + return (control: AbstractControl): {[key: string]: any} | null => { + const content = control.value; + let invalid: boolean = false; + if (content) { + invalid = CustomValidators.isStringContainHtmlTag(content); + } + return (invalid) ? {isStringContainTags : true} : null; + } + } + + static isFileTooBig(...args) : ValidatorFn { + const unit : FileUnit = args[0]; + const size : number = args[1]; + return (control: AbstractControl): {[key: string]: any} | null => { + const file = control.value; + let sizeToByte: number; + if (file) { + switch (unit) { + case FileUnit.b: + sizeToByte = 1/8; + break; + case FileUnit.B: + sizeToByte = 1; + break; + case FileUnit.KB: + sizeToByte = 1000; + break; + case FileUnit.MB: + sizeToByte = 1000000; + break; + default: + sizeToByte = 0; + break; + + } + return (file.size > (sizeToByte * size)) ? {isFileTooBig: true} : null; + } + return null; + } + } +} diff --git a/vid-webpack-master/src/app/store/module.ts b/vid-webpack-master/src/app/store/module.ts deleted file mode 100644 index c0909c124..000000000 --- a/vid-webpack-master/src/app/store/module.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { NgModule } from '@angular/core'; -import { NgReduxModule, NgRedux, DevToolsExtension } from '@angular-redux/store'; -import { RootEpics } from './epics'; - -import rootReducer, {AppState} from "./reducers"; -import {AAIEpics} from "../services/aaiService/aai.epics"; - -@NgModule({ - imports: [NgReduxModule], - providers: [RootEpics, AAIEpics], -}) - -export class StoreModule { - constructor( - public store: NgRedux<AppState>, - devTools: DevToolsExtension, - rootEpics: RootEpics, - ) { - - const persistedState = sessionStorage.getItem('reduxState') ? - JSON.parse(sessionStorage.getItem('reduxState')) : {}; - - store.configureStore( - rootReducer, - persistedState, - rootEpics.createEpics(), - devTools.isEnabled() ? [ devTools.enhancer() ] : []); - } -} diff --git a/vid-webpack-master/src/app/store/reducers.ts b/vid-webpack-master/src/app/store/reducers.ts deleted file mode 100644 index b3e4f4712..000000000 --- a/vid-webpack-master/src/app/store/reducers.ts +++ /dev/null @@ -1,17 +0,0 @@ -import {Reducer, combineReducers} from 'redux'; -import {GlobalReducer, GlobalState} from "../global.reducer"; -import {ServiceReducer, ServiceState} from "../service.reducer"; - - -export interface AppState { - global: GlobalState; - service: ServiceState; - -} - -const rootReducer: Reducer<AppState> = combineReducers<AppState>({ - global: GlobalReducer, - service: ServiceReducer -}); - -export default rootReducer; diff --git a/vid-webpack-master/src/app/support/support.component.ts b/vid-webpack-master/src/app/support/support.component.ts new file mode 100644 index 000000000..a065e8a67 --- /dev/null +++ b/vid-webpack-master/src/app/support/support.component.ts @@ -0,0 +1,20 @@ +import {Component} from '@angular/core'; + +@Component({ + selector: 'app-support', + template: ` + <ul> + <li><a href="../../version">Version</a></li> + <li><a href="../../flags">Feature Flags</a></li> + <li><a href="#/healthStatus">Probe</a></li> + <li> + <form action="../../rest/models/reset" method="post"> + <button name="upvote" value="Upvote"></button> + </form> + </li> + </ul> + `, +}) + +export class SupportComponent { +} diff --git a/vid-webpack-master/src/app/components/form-async/form-async.component.ts b/vid-webpack-master/src/app/vlanTagging/form-async/form-async.component.ts index e71c4446b..623a4f42f 100644 --- a/vid-webpack-master/src/app/components/form-async/form-async.component.ts +++ b/vid-webpack-master/src/app/vlanTagging/form-async/form-async.component.ts @@ -1,16 +1,20 @@ import {Component, Input, OnInit, ViewChild} from '@angular/core'; -import { NgRedux, select } from '@angular-redux/store'; -import { Observable } from "rxjs/Observable"; -import { updateProductFamilies } from "../../service.actions"; -import { AppState } from "../../store/reducers"; +import {NgRedux, select} from '@angular-redux/store'; +import {Observable} from "rxjs"; +import {AppState} from "../../shared/store/reducers"; import { - loadProductFamiliesAction, loadLcpTenant, loadAicZones, - loadCategoryParameters -} from '../../services/aaiService/aai.actions'; -import { LcpRegionsAndTenants } from "../../shared/models/lcpRegionsAndTenants"; + loadAicZones, + loadCategoryParameters, + loadLcpTenant, + loadProductFamiliesAction +} from '../../shared/services/aaiService/aai.actions'; +import {LcpRegionsAndTenants} from "../../shared/models/lcpRegionsAndTenants"; import {NgForm} from "@angular/forms"; import {SelectOption} from "../../shared/models/selectOption"; import {VNFModel} from "../../shared/models/vnfModel"; +import {Tenant} from "../../shared/models/tenant"; +import {FormAsyncService} from "./form-async.service"; +import {AaiService} from "../../shared/services/aaiService/aai.service"; @Component({ selector: "formasync", @@ -19,16 +23,21 @@ import {VNFModel} from "../../shared/models/vnfModel"; }) -export class formasync implements OnInit { +export class Formasync implements OnInit { - constructor(private store: NgRedux<AppState>) { } + constructor(private store: NgRedux<AppState>, private _formAsyncService: FormAsyncService) { } @ViewChild('form') form: NgForm; - + @Input() + set params(params: any) { + if (params) { + this.paramsInfo = params; + } + } @Input() set model(model: VNFModel) { if (model) { - this.isUserProvidedNaming = model.isUserProvidedNaming; + this.isEcompGeneratedNaming = model.isEcompGeneratedNaming; } }; @@ -54,26 +63,39 @@ export class formasync implements OnInit { new SelectOption({id: 'true', name: 'Rollback'}), new SelectOption({id: 'false', name: 'Don\'t Rollback'}) ]; - tenants = []; + tenants: Tenant[] = []; serviceInstance: any = { + cloudOwner: null, rollback:'true' }; - isUserProvidedNaming: boolean = false; + isEcompGeneratedNaming: boolean = true; + paramsInfo : any; onLcpSelect(newValue: string) { let value: LcpRegionsAndTenants = undefined; this.lcpRegionsAndTenants.subscribe(data => value = data); this.tenants = value.lcpRegionsTenantsMap[newValue]; + this.serviceInstance.tenantId = undefined; + } + + + + onTenantSelect(newValue: string) { + this.serviceInstance.cloudOwner = this._formAsyncService.onTenantSelect(this.tenants, newValue); } ngOnInit() { this.store.dispatch(loadProductFamiliesAction()); - this.store.dispatch(loadLcpTenant()); + this.store.dispatch(loadLcpTenant(this.paramsInfo['globalCustomerId'], this.paramsInfo['serviceType'])); this.store.dispatch(loadAicZones()); this.store.dispatch(loadCategoryParameters()); } + + public formatCloudOwnerTrailer(cloudOwner: string):string { + return AaiService.formatCloudOwnerTrailer(cloudOwner); + } } diff --git a/vid-webpack-master/src/app/vlanTagging/form-async/form-async.service.spec.ts b/vid-webpack-master/src/app/vlanTagging/form-async/form-async.service.spec.ts new file mode 100644 index 000000000..0f7d4444b --- /dev/null +++ b/vid-webpack-master/src/app/vlanTagging/form-async/form-async.service.spec.ts @@ -0,0 +1,31 @@ +import {async, getTestBed, TestBed} from '@angular/core/testing'; +import {FormAsyncService} from "./form-async.service"; + +describe('FormAsyncService', () => { + + let injector; + let service: FormAsyncService; + + beforeAll(done => (async () => { + TestBed.configureTestingModule({ + providers: [FormAsyncService] + }); + await TestBed.compileComponents(); + + injector = getTestBed(); + service = injector.get(FormAsyncService); + + })().then(done).catch(done.fail)); + + test('should add cloudOwner according to new tenant value', () => { + const tenants = [{'id': '1', 'name': 'firstTenant', 'isPermitted': true, cloudOwner: 'irma-aic'}, + {'id': '2', 'name': 'secondTenant', 'isPermitted': true, cloudOwner: 'irma-aic2'}]; + let cloudOwner: string; + cloudOwner = service.onTenantSelect(tenants,'1'); + expect(cloudOwner).toEqual('irma-aic'); + + cloudOwner = service.onTenantSelect(tenants, '2'); + expect(cloudOwner).toEqual('irma-aic2'); + }) + +}); diff --git a/vid-webpack-master/src/app/vlanTagging/form-async/form-async.service.ts b/vid-webpack-master/src/app/vlanTagging/form-async/form-async.service.ts new file mode 100644 index 000000000..f5a33fe4d --- /dev/null +++ b/vid-webpack-master/src/app/vlanTagging/form-async/form-async.service.ts @@ -0,0 +1,12 @@ +import {Injectable} from '@angular/core'; +import {Tenant} from "../../shared/models/tenant"; + +@Injectable() +export class FormAsyncService { + constructor(){} + + public onTenantSelect(tenants: Tenant[], newValue: string) { + let tenantTemp: Tenant[] = tenants.filter(tenant => tenant.id == newValue); + return tenantTemp[0] && tenantTemp[0].cloudOwner; + } +} diff --git a/vid-webpack-master/src/app/components/form-async/form-async.style.scss b/vid-webpack-master/src/app/vlanTagging/form-async/form-async.style.scss index e6c89bcae..e6c89bcae 100644 --- a/vid-webpack-master/src/app/components/form-async/form-async.style.scss +++ b/vid-webpack-master/src/app/vlanTagging/form-async/form-async.style.scss diff --git a/vid-webpack-master/src/app/components/form-async/form-async.template.html b/vid-webpack-master/src/app/vlanTagging/form-async/form-async.template.html index c63a7bee6..ba35a42e9 100644 --- a/vid-webpack-master/src/app/components/form-async/form-async.template.html +++ b/vid-webpack-master/src/app/vlanTagging/form-async/form-async.template.html @@ -1,6 +1,6 @@ <div class="content"> <form #form="ngForm" name="networkNodeForm" class="form-wrapper"> - <div *ngIf="isUserProvidedNaming" class="details-item"> + <div class="details-item"> <label class="placeholder">Instance name*</label> <input [attr.data-tests-id]="'instanceName'" id="instance-name" [(ngModel)]="serviceInstance.instanceName" name="instance-name" class="form-control input-text" placeholder="Type Instance Name" type="text" required> @@ -20,12 +20,12 @@ <select (change)="onLcpSelect($event.target.value)" class="form-control input-text" [(ngModel)]="serviceInstance.lcpRegion" name="lcpRegion" id="lcpRegion-select" data-tests-id="lcpRegion" required> <option class="placeholder1" [value]="undefined" disabled>Select LCP Region</option> - <option *ngFor="let lcpRegion of lcpRegions | async" [value]="lcpRegion.id" [disabled]="!lcpRegion.isPermitted" class="lcpRegionOption">{{lcpRegion.id}}</option> + <option *ngFor="let lcpRegion of lcpRegions | async" [value]="lcpRegion.id" [disabled]="!lcpRegion.isPermitted" class="lcpRegionOption">{{lcpRegion.id}}{{formatCloudOwnerTrailer(lcpRegion.cloudOwner)}}</option> </select> </div> <div class="details-item"> <label>Tenant:*</label> - <select class="form-control input-text" [(ngModel)]="serviceInstance.tenantId" name="tenant" id="tenant-select" data-tests-id="tenant" + <select (change)="onTenantSelect($event.target.value)" class="form-control input-text" [(ngModel)]="serviceInstance.tenantId" name="tenant" id="tenant-select" data-tests-id="tenant" required> <option class="placeholder1" [value]="undefined" disabled>Select Tenant</option> <option *ngFor="let tenant of tenants" [value]="tenant.id" [disabled]="!tenant.isPermitted">{{tenant.name}}</option> diff --git a/vid-webpack-master/src/app/vlanTagging/network-selector/network-selector.component.ts b/vid-webpack-master/src/app/vlanTagging/network-selector/network-selector.component.ts index 46a176984..d3df9268d 100644 --- a/vid-webpack-master/src/app/vlanTagging/network-selector/network-selector.component.ts +++ b/vid-webpack-master/src/app/vlanTagging/network-selector/network-selector.component.ts @@ -1,8 +1,8 @@ import {Component, Input, OnInit, ViewChild} from "@angular/core"; import {NgRedux, select} from "@angular-redux/store"; -import {AppState} from "../../store/reducers"; +import {AppState} from "../../shared/store/reducers"; import {ModelInformationItem} from "../../shared/components/model-information/model-information.component"; -import {Observable} from "rxjs/Observable"; +import {Observable} from "rxjs"; import {NgForm} from "@angular/forms"; import * as _ from 'lodash'; diff --git a/vid-webpack-master/src/app/vlanTagging/vlan-tagging.component.html b/vid-webpack-master/src/app/vlanTagging/vlan-tagging.component.html index f474f4bd1..5443a25f0 100644 --- a/vid-webpack-master/src/app/vlanTagging/vlan-tagging.component.html +++ b/vid-webpack-master/src/app/vlanTagging/vlan-tagging.component.html @@ -9,7 +9,7 @@ <span (serviceInstamce)="onServiceInstanceChange($event)"></span> <div class="content-wrapper"> <div class="left-side"> - <formasync [hidden]="currentStep === wizardSteps.two" [model]="model" class="form"></formasync> + <formasync [hidden]="currentStep === wizardSteps.two" [params]="params" [model]="model" class="form"></formasync> <app-network-selector [hidden]="currentStep === wizardSteps.one" class="form-wrapper" [groups]="groups"></app-network-selector> </div> diff --git a/vid-webpack-master/src/app/vlanTagging/vlan-tagging.component.ts b/vid-webpack-master/src/app/vlanTagging/vlan-tagging.component.ts index f3f63e1e9..87f117202 100644 --- a/vid-webpack-master/src/app/vlanTagging/vlan-tagging.component.ts +++ b/vid-webpack-master/src/app/vlanTagging/vlan-tagging.component.ts @@ -1,19 +1,17 @@ -import {formasync} from './../components/form-async/form-async.component'; +import {Formasync} from './form-async/form-async.component'; import {Component, OnInit, ViewChild} from "@angular/core"; import {NetworkSelectorComponent} from "./network-selector/network-selector.component"; import {NgRedux, select} from "@angular-redux/store"; -import {AppState} from "../store/reducers"; +import {AppState} from "../shared/store/reducers"; import {ActivatedRoute} from "@angular/router"; -import { - loadServiceAccordingToUuid, loadAaiNetworkAccordingToNetworkCF, - loadUserId -} from "../services/aaiService/aai.actions"; +import {loadServiceAccordingToUuid, loadAaiNetworkAccordingToNetworkCF, loadUserId} from "../shared/services/aaiService/aai.actions"; import {createRequest} from "../factories/mso.factory"; -import {Observable} from "rxjs/Observable"; import {VNFModel} from "../shared/models/vnfModel"; import {VfcInstanceGroupProperties} from "../shared/models/vfcInstanceGroupProperties"; -import * as _ from "lodash"; import {ModelInformationItem} from "../shared/components/model-information/model-information.component"; +import {Observable} from "rxjs"; +import {RootEpics} from "../shared/store/epics"; +import * as _ from "lodash"; enum WizardSteps { one, @@ -33,12 +31,15 @@ const buttonTextCancel = "Cancel"; export class VlanTaggingComponent implements OnInit { constructor(private store: NgRedux<AppState>, - private route: ActivatedRoute) { + private route: ActivatedRoute, + rootEpics: RootEpics) { this.nextButtonText = buttonTextNext; this.cancelButtonText = buttonTextCancel; this.currentStep = WizardSteps.one; + rootEpics.createEpics(); } + subscriberId: string; subscriberName: string; serviceKey: string; serviceType: string; @@ -47,11 +48,11 @@ export class VlanTaggingComponent implements OnInit { serviceModelId: string; modelInfoItems: Array<ModelInformationItem>; groups: Array<Array<ModelInformationItem>>; + params : any; currentStep: WizardSteps; nextButtonText: string; cancelButtonText: string; wizardSteps = WizardSteps; - cloudOwner: string; cloudRegionId: string; serviceInstanceId : string; model: VNFModel; @@ -72,8 +73,8 @@ export class VlanTaggingComponent implements OnInit { @ViewChild(NetworkSelectorComponent) public networkSelectorComponent: NetworkSelectorComponent; - @ViewChild(formasync) - public formAsync: formasync; + @ViewChild(Formasync) + public formAsync: Formasync; deploySubInterface() { @@ -101,15 +102,15 @@ export class VlanTaggingComponent implements OnInit { this.store.dispatch(loadUserId()); this.userIdObs.subscribe(res => this.userId = res); this.route.queryParams.subscribe(params => { + this.params = params; this.serviceModelId = params["serviceModelId"]; - this.subscriberName = params["subscriberName"]; + this.subscriberId = params["globalCustomerId"]; this.serviceType = params["serviceType"]; this.serviceKey = params["serviceInstanceID"]; this.vnfKey = params["modelCustomizationName"]; this.serviceInstanceId = params["serviceInstanceID"]; this.serviceInstanceName = params["serviceInstanceName"]; this.modelCustomizationId = params["modelCustomizationId"]; - this.cloudOwner = params["globalCustomerId"]; this.store.dispatch(loadServiceAccordingToUuid(this.serviceModelId)); this.serviceHierarchyObserable.subscribe(data => { this.serviceHirarchy = data; @@ -143,7 +144,7 @@ export class VlanTaggingComponent implements OnInit { this.groups.map(group => { let networkName = _.find(group, (groupElements: ModelInformationItem) => groupElements.testsId === "networkCollectionFunction"); this.store.dispatch( - loadAaiNetworkAccordingToNetworkCF(networkName["values"][0], this.cloudOwner, this.formAsync.serviceInstance.lcpRegion) + loadAaiNetworkAccordingToNetworkCF(networkName["values"][0], this.formAsync.serviceInstance.cloudOwner, this.formAsync.serviceInstance.lcpRegion) ); }); this.currentStep = WizardSteps.two; diff --git a/vid-webpack-master/src/app/vlanTagging/vlan-tagging.module.ts b/vid-webpack-master/src/app/vlanTagging/vlan-tagging.module.ts index 3227542c6..c3848998e 100644 --- a/vid-webpack-master/src/app/vlanTagging/vlan-tagging.module.ts +++ b/vid-webpack-master/src/app/vlanTagging/vlan-tagging.module.ts @@ -1,5 +1,4 @@ - -import { formasync } from './../components/form-async/form-async.component'; +import { Formasync } from './form-async/form-async.component'; import {NgModule,} from '@angular/core'; import { FormsModule } from '@angular/forms'; import { VlanTaggingComponent } from './vlan-tagging.component'; @@ -9,11 +8,9 @@ import { NgReduxModule } from '@angular-redux/store'; import { SharedModule } from '../shared/shared.module'; import { NetworkSelectorComponent } from './network-selector/network-selector.component'; import { TooltipModule } from 'ngx-tooltip'; - - +import {FormAsyncService} from "./form-async/form-async.service"; @NgModule({ - imports: [ CommonModule, NgReduxModule, @@ -23,11 +20,10 @@ imports: [ SharedModule.forRoot() ], - providers: [ ], - declarations: [VlanTaggingComponent,formasync,NetworkSelectorComponent], + providers: [ FormAsyncService ], + declarations: [VlanTaggingComponent, Formasync, NetworkSelectorComponent], entryComponents: [], - exports: [formasync] - + exports: [Formasync] }) export class VlanTaggingModule { } diff --git a/vid-webpack-master/src/app/vlanTagging/vlan-tagging.routing.ts b/vid-webpack-master/src/app/vlanTagging/vlan-tagging.routing.ts new file mode 100644 index 000000000..d89c9beec --- /dev/null +++ b/vid-webpack-master/src/app/vlanTagging/vlan-tagging.routing.ts @@ -0,0 +1,19 @@ +import {Route} from "@angular/router"; +import {FlagsResolve} from "../shared/resolvers/flag/flag.resolver"; +import {VlanTaggingComponent} from "./vlan-tagging.component"; + +export const VlanTaggingRoutes: Route[] = [ + { + path: 'vlan', + children: [ + { + path: '', + component: VlanTaggingComponent, + resolve: { + flags: FlagsResolve + }, + } + ] + } +]; + |