From 02558d31ab250b42d7138e2f762125ee41fad2d6 Mon Sep 17 00:00:00 2001 From: elinuxhenrik Date: Thu, 4 Feb 2021 12:25:50 +0100 Subject: [PATCH] Move Enrichment Producer Logic from backend Change-Id: I10e96c75484beb381b3c3fa6a8dacf23d9dbe340 Signed-off-by: elinuxhenrik Issue-ID: NONRTRIC-408 --- .../ei-coordinator.component.spec.ts | 4 +- .../app/ei-coordinator/ei-coordinator.component.ts | 4 +- .../app/ei-coordinator/ei-job.datasource.spec.ts | 4 +- .../src/app/ei-coordinator/ei-job.datasource.ts | 4 +- .../ei-coordinator/ei-producer.datasource.spec.ts | 84 ++++++++++++++++++++++ .../app/ei-coordinator/ei-producer.datasource.ts | 39 ++++++---- webapp-frontend/src/app/interceptor.mock.ts | 25 +++++-- webapp-frontend/src/app/interfaces/ei.types.ts | 6 +- .../src/app/mock/ei-producer-status1.json | 3 + .../src/app/mock/ei-producer-status2.json | 3 + webapp-frontend/src/app/mock/ei-producer1.json | 3 + webapp-frontend/src/app/mock/ei-producer2.json | 3 + webapp-frontend/src/app/mock/ei-producers.json | 23 ------ .../src/app/services/ei/ei.service.spec.ts | 4 +- webapp-frontend/src/app/services/ei/ei.service.ts | 10 +-- 15 files changed, 160 insertions(+), 59 deletions(-) create mode 100644 webapp-frontend/src/app/ei-coordinator/ei-producer.datasource.spec.ts create mode 100644 webapp-frontend/src/app/mock/ei-producer-status1.json create mode 100644 webapp-frontend/src/app/mock/ei-producer-status2.json create mode 100644 webapp-frontend/src/app/mock/ei-producer1.json create mode 100644 webapp-frontend/src/app/mock/ei-producer2.json delete mode 100644 webapp-frontend/src/app/mock/ei-producers.json diff --git a/webapp-frontend/src/app/ei-coordinator/ei-coordinator.component.spec.ts b/webapp-frontend/src/app/ei-coordinator/ei-coordinator.component.spec.ts index b9c2e0f..3e0fbf5 100644 --- a/webapp-frontend/src/app/ei-coordinator/ei-coordinator.component.spec.ts +++ b/webapp-frontend/src/app/ei-coordinator/ei-coordinator.component.spec.ts @@ -36,12 +36,12 @@ describe('EICoordinatorComponent', () => { beforeEach(async(() => { const jobDataSourceSpy = jasmine.createSpyObj('EIJobDataSource', [ 'connect', 'getJobs', 'disconnect' ]); - const producerDataSourceSpy = jasmine.createSpyObj('EIProducerDataSource', [ 'connect', 'loadTable', 'getProducers', 'disconnect' ]); + const producerDataSourceSpy = jasmine.createSpyObj('EIProducerDataSource', [ 'connect', 'loadTable', 'loadProducers', 'disconnect' ]); jobDataSourceSpy.connect.and.returnValue(of([])); jobDataSourceSpy.disconnect(); producerDataSourceSpy.connect.and.returnValue(of([])); - producerDataSourceSpy.getProducers.and.returnValue(of([])); + producerDataSourceSpy.loadProducers.and.returnValue(of([])); producerDataSourceSpy.disconnect(); TestBed.configureTestingModule({ diff --git a/webapp-frontend/src/app/ei-coordinator/ei-coordinator.component.ts b/webapp-frontend/src/app/ei-coordinator/ei-coordinator.component.ts index bd3f946..d69deab 100644 --- a/webapp-frontend/src/app/ei-coordinator/ei-coordinator.component.ts +++ b/webapp-frontend/src/app/ei-coordinator/ei-coordinator.component.ts @@ -73,7 +73,7 @@ export class EICoordinatorComponent implements OnInit { ngOnInit() { this.eiJobsDataSource.getJobs(); - this.producers$= this.eiProducersDataSource.getProducers(); + this.producers$= this.eiProducersDataSource.loadProducers(); this.filteredProducers$ = defer(() => this.formGroup.get("filter") .valueChanges.pipe( startWith(""), @@ -149,6 +149,6 @@ export class EICoordinatorComponent implements OnInit { refreshTables() { this.eiJobsDataSource.getJobs(); - this.eiProducersDataSource.loadTable(); + this.eiProducersDataSource.loadProducers(); } } diff --git a/webapp-frontend/src/app/ei-coordinator/ei-job.datasource.spec.ts b/webapp-frontend/src/app/ei-coordinator/ei-job.datasource.spec.ts index cb530a6..dc51387 100644 --- a/webapp-frontend/src/app/ei-coordinator/ei-job.datasource.spec.ts +++ b/webapp-frontend/src/app/ei-coordinator/ei-job.datasource.spec.ts @@ -17,7 +17,7 @@ * limitations under the License. * ========================LICENSE_END=================================== */ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { TestBed } from '@angular/core/testing'; import { BehaviorSubject, of } from 'rxjs'; import { EIJobDataSource } from './ei-job.datasource'; @@ -51,7 +51,7 @@ describe('EIJobDataSource', () => { expect(dataSource).toBeTruthy(); }); - it('#getJobs and connect', () => { + it('#getJobs', () => { dataSource.getJobs(); const jobsSubject: BehaviorSubject = dataSource.eiJobsSubject; const value = jobsSubject.getValue(); diff --git a/webapp-frontend/src/app/ei-coordinator/ei-job.datasource.ts b/webapp-frontend/src/app/ei-coordinator/ei-job.datasource.ts index 2e0e0c8..ef9e478 100644 --- a/webapp-frontend/src/app/ei-coordinator/ei-job.datasource.ts +++ b/webapp-frontend/src/app/ei-coordinator/ei-job.datasource.ts @@ -60,14 +60,14 @@ export class EIJobDataSource extends MatTableDataSource { }), finalize(() => this.loadingSubject.next(false)) ) - .subscribe((producerIds: String[]) => { + .subscribe((producerIds: string[]) => { producerIds.forEach(id => { this.getJobsForProducer(id); }); }); } - private getJobsForProducer(id: String) { + private getJobsForProducer(id: string) { console.log('Getting jobs for producer ID: ', id); this.eiSvc.getJobsForProducer(id).subscribe(jobs => { this.addJobsToSubject(jobs); diff --git a/webapp-frontend/src/app/ei-coordinator/ei-producer.datasource.spec.ts b/webapp-frontend/src/app/ei-coordinator/ei-producer.datasource.spec.ts new file mode 100644 index 0000000..6dcbf41 --- /dev/null +++ b/webapp-frontend/src/app/ei-coordinator/ei-producer.datasource.spec.ts @@ -0,0 +1,84 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2021 Nordix Foundation + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ +import { TestBed } from '@angular/core/testing'; +import { BehaviorSubject, of } from 'rxjs'; + +import { EIService } from '../services/ei/ei.service'; +import { NotificationService } from '../services/ui/notification.service'; +import { ToastrModule } from 'ngx-toastr'; +import { EIJob, EIProducer, OperationalState, ProducerRegistrationInfo, ProducerStatus } from '../interfaces/ei.types'; +import { EIProducerDataSource } from './ei-producer.datasource'; + +describe('EIProducerDataSource', () => { + let dataSource: EIProducerDataSource; + let eiServiceSpy: any; + + let producer1 = { + supported_ei_types: [ 'type1', 'type2' ] + } as ProducerRegistrationInfo; + let producer2 = { + supported_ei_types: [ 'type3', 'type4' ] + } as ProducerRegistrationInfo; + let producerStatus1 = { + opState: OperationalState.ENABLED + } as ProducerStatus; + let producerStatus2 = { + opState: OperationalState.DISABLED + } as ProducerStatus; + + let expectedProducer1 = { + ei_producer_id: 'producer1', + ei_producer_types: [ 'type1', 'type2' ], + status: 'ENABLED' + } as EIProducer; + let expectedProducer2 = { + ei_producer_id: 'producer2', + ei_producer_types: [ 'type3', 'type4' ], + status: 'DISABLED' + } as EIProducer; + + beforeEach(() => { + eiServiceSpy = jasmine.createSpyObj('EIService', ['getProducerIds', 'getProducer', 'getProducerStatus']); + + eiServiceSpy.getProducerIds.and.returnValue(of([ 'producer1', 'producer2'])); + eiServiceSpy.getProducer.and.returnValues(of(producer1), of(producer2)); + eiServiceSpy.getProducerStatus.and.returnValues(of(producerStatus1), of(producerStatus2)); + TestBed.configureTestingModule({ + imports: [ToastrModule.forRoot()], + providers: [ + { provide: EIService, useValue: eiServiceSpy }, + NotificationService + ] + }); + }); + + it('should create', () => { + dataSource = TestBed.get(EIProducerDataSource); + expect(dataSource).toBeTruthy(); + }); + + it('#loadProducers', () => { + dataSource.loadProducers(); + const jobsSubject: BehaviorSubject = dataSource.producerSubject; + const value = jobsSubject.getValue(); + expect(value).toEqual([ expectedProducer1, expectedProducer2 ]); + expect(dataSource.rowCount).toEqual(2); + }); +}); diff --git a/webapp-frontend/src/app/ei-coordinator/ei-producer.datasource.ts b/webapp-frontend/src/app/ei-coordinator/ei-producer.datasource.ts index 2b12021..bd7f276 100644 --- a/webapp-frontend/src/app/ei-coordinator/ei-producer.datasource.ts +++ b/webapp-frontend/src/app/ei-coordinator/ei-producer.datasource.ts @@ -37,7 +37,7 @@ import { NotificationService } from '../services/ui/notification.service'; export class EIProducerDataSource extends MatTableDataSource { - private producerSubject = new BehaviorSubject([]); + producerSubject = new BehaviorSubject([]); private loadingSubject = new BehaviorSubject(false); @@ -51,9 +51,10 @@ export class EIProducerDataSource extends MatTableDataSource { super(); } - loadTable() { + loadProducers(): Observable { this.loadingSubject.next(true); - this.eiSvc.getEIProducers() + let producers: Array = []; + this.eiSvc.getProducerIds() .pipe( catchError((her: HttpErrorResponse) => { this.notificationService.error('Failed to get producers: ' + her.error); @@ -61,12 +62,29 @@ export class EIProducerDataSource extends MatTableDataSource { }), finalize(() => this.loadingSubject.next(false)) ) - .subscribe((prods: EIProducer[]) => { - console.log("Producers: " + prods); - this.rowCount = prods.length; - this.producerSubject.next(prods); + .subscribe((prodIds: string[]) => { + console.log("ProducerIds: " + prodIds); + prodIds.forEach(id => { + let eiProducer = {}; + eiProducer.ei_producer_id = id; + this.eiSvc.getProducer(id).subscribe(producer => { + eiProducer.ei_producer_types = producer.supported_ei_types; + }); + this.eiSvc.getProducerStatus(id).subscribe(prodStatus => { + eiProducer.status = prodStatus.opState.toString(); + }); + this.addProducerToSubject(eiProducer); + producers.push(eiProducer); + }); + this.rowCount = this.producerSubject.value.length; }); - this.connect(); + return of(producers); + } + + private addProducerToSubject(producer: EIProducer) { + const currentValue = this.producerSubject.value; + const updatedValue = [...currentValue, producer]; + this.producerSubject.next(updatedValue); } connect(): BehaviorSubject { @@ -77,9 +95,4 @@ export class EIProducerDataSource extends MatTableDataSource { this.producerSubject.complete(); this.loadingSubject.complete(); } - - getProducers(): Observable { - return this.eiSvc.getEIProducers() - .pipe(tap(console.log)); - } } diff --git a/webapp-frontend/src/app/interceptor.mock.ts b/webapp-frontend/src/app/interceptor.mock.ts index 66807d7..a744584 100644 --- a/webapp-frontend/src/app/interceptor.mock.ts +++ b/webapp-frontend/src/app/interceptor.mock.ts @@ -29,7 +29,10 @@ import * as policyinstances2Status from './mock/policy-instance-2-status.json'; import * as eijobsProd1 from './mock/ei-jobs-producer1.json'; import * as eijobsProd2 from './mock/ei-jobs-producer2.json'; import * as eiProducerIds from './mock/ei-producerids.json'; -import * as eiproducers from './mock/ei-producers.json'; +import * as eiproducer1 from './mock/ei-producer1.json'; +import * as eiproducer2 from './mock/ei-producer2.json'; +import * as eiproducerstatus1 from './mock/ei-producer-status1.json'; +import * as eiproducerstatus2 from './mock/ei-producer-status2.json'; import * as policytypesList from './mock/policy-types.json'; import * as policytypes1 from './mock/policy-type1.json'; import * as policyinstanceedit from './mock/policy-instance-edit.json'; @@ -102,10 +105,6 @@ const urls = [ url: '/a1-policy/v2/rics?policytype_id=', json: ric2 }, - { - url: 'api/enrichment/eiproducers', - json: eiproducers - }, { url: 'api/policy/rics?policyType=1', json: rics @@ -118,6 +117,22 @@ const urls = [ url: '/ei-producer/v1/eiproducers', json: eiProducerIds }, + { + url: '/ei-producer/v1/eiproducers/producer1', + json: eiproducer1 + }, + { + url: '/ei-producer/v1/eiproducers/producer2', + json: eiproducer2 + }, + { + url: '/ei-producer/v1/eiproducers/producer1/status', + json: eiproducerstatus1 + }, + { + url: '/ei-producer/v1/eiproducers/producer2/status', + json: eiproducerstatus2 + }, { url: '/ei-producer/v1/eiproducers/producer1/eijobs', json: eijobsProd1 diff --git a/webapp-frontend/src/app/interfaces/ei.types.ts b/webapp-frontend/src/app/interfaces/ei.types.ts index 814c099..1aecebc 100644 --- a/webapp-frontend/src/app/interfaces/ei.types.ts +++ b/webapp-frontend/src/app/interfaces/ei.types.ts @@ -35,12 +35,12 @@ export interface EIProducer { } export interface ProducerRegistrationInfo { - supported_ei_types: String[] + supported_ei_types: string[] } export enum OperationalState { - ENABLED, - DISABLED + ENABLED = 'ENABLED', + DISABLED = 'DISABLED' } export interface ProducerStatus { opState: OperationalState diff --git a/webapp-frontend/src/app/mock/ei-producer-status1.json b/webapp-frontend/src/app/mock/ei-producer-status1.json new file mode 100644 index 0000000..9977a3e --- /dev/null +++ b/webapp-frontend/src/app/mock/ei-producer-status1.json @@ -0,0 +1,3 @@ +{ + "opState": "ENABLED" +} \ No newline at end of file diff --git a/webapp-frontend/src/app/mock/ei-producer-status2.json b/webapp-frontend/src/app/mock/ei-producer-status2.json new file mode 100644 index 0000000..721cddb --- /dev/null +++ b/webapp-frontend/src/app/mock/ei-producer-status2.json @@ -0,0 +1,3 @@ +{ + "opState": "DISABLED" +} \ No newline at end of file diff --git a/webapp-frontend/src/app/mock/ei-producer1.json b/webapp-frontend/src/app/mock/ei-producer1.json new file mode 100644 index 0000000..222cff9 --- /dev/null +++ b/webapp-frontend/src/app/mock/ei-producer1.json @@ -0,0 +1,3 @@ +{ + "supported_ei_types": [ "type1", "type2" ] +} \ No newline at end of file diff --git a/webapp-frontend/src/app/mock/ei-producer2.json b/webapp-frontend/src/app/mock/ei-producer2.json new file mode 100644 index 0000000..c723167 --- /dev/null +++ b/webapp-frontend/src/app/mock/ei-producer2.json @@ -0,0 +1,3 @@ +{ + "supported_ei_types": [ "type3", "type4" ] +} \ No newline at end of file diff --git a/webapp-frontend/src/app/mock/ei-producers.json b/webapp-frontend/src/app/mock/ei-producers.json deleted file mode 100644 index 2a2be7a..0000000 --- a/webapp-frontend/src/app/mock/ei-producers.json +++ /dev/null @@ -1,23 +0,0 @@ -[ - { - "ei_producer_id": "1", - "ei_producer_types": [ - "type1" - ], - "status": "ENABLED" - }, - { - "ei_producer_id": "prod-2", - "ei_producer_types": [ - "type2" - ], - "status": "ENABLED" - }, - { - "ei_producer_id": "3-prod", - "ei_producer_types": [ - "type1" - ], - "status": "DISABLED" - } - ] \ No newline at end of file diff --git a/webapp-frontend/src/app/services/ei/ei.service.spec.ts b/webapp-frontend/src/app/services/ei/ei.service.spec.ts index 5bf7d3d..cf9f2f0 100644 --- a/webapp-frontend/src/app/services/ei/ei.service.spec.ts +++ b/webapp-frontend/src/app/services/ei/ei.service.spec.ts @@ -43,12 +43,12 @@ describe('EIService', () => { }); describe('#getProducerIds', () => { - let expectedEIProducerIds: String[]; + let expectedEIProducerIds: string[]; beforeEach(() => { service = TestBed.get(EIService); httpTestingController = TestBed.get(HttpTestingController); - expectedEIProducerIds = [ 'producer1', 'producer2' ] as String[]; + expectedEIProducerIds = [ 'producer1', 'producer2' ] as string[]; }); it('should return all producer IDs', () => { diff --git a/webapp-frontend/src/app/services/ei/ei.service.ts b/webapp-frontend/src/app/services/ei/ei.service.ts index 19c5836..bb429e3 100644 --- a/webapp-frontend/src/app/services/ei/ei.service.ts +++ b/webapp-frontend/src/app/services/ei/ei.service.ts @@ -48,22 +48,22 @@ export class EIService { // injects to variable httpClient } - getProducerIds(): Observable { + getProducerIds(): Observable { const url = this.buildPath(this.eiProducersPath); - return this.httpClient.get(url); + return this.httpClient.get(url); } - getJobsForProducer(producerId: String): Observable { + getJobsForProducer(producerId: string): Observable { const url = this.buildPath(this.eiProducersPath, producerId, this.eiJobsPath); return this.httpClient.get(url); } - getProducer(producerId: String): Observable { + getProducer(producerId: string): Observable { const url = this.buildPath(this.eiProducersPath, producerId); return this.httpClient.get(url); } - getProducerStatus(producerId: String): Observable { + getProducerStatus(producerId: string): Observable { const url = this.buildPath(this.eiProducersPath, producerId, this.eiProducerStatusPath); return this.httpClient.get(url); } -- 2.16.6