Move Enrichment Producer Logic from backend 90/5590/1
authorelinuxhenrik <henrik.b.andersson@est.tech>
Thu, 4 Feb 2021 11:25:50 +0000 (12:25 +0100)
committerelinuxhenrik <henrik.b.andersson@est.tech>
Thu, 4 Feb 2021 11:25:54 +0000 (12:25 +0100)
Change-Id: I10e96c75484beb381b3c3fa6a8dacf23d9dbe340
Signed-off-by: elinuxhenrik <henrik.b.andersson@est.tech>
Issue-ID: NONRTRIC-408

15 files changed:
webapp-frontend/src/app/ei-coordinator/ei-coordinator.component.spec.ts
webapp-frontend/src/app/ei-coordinator/ei-coordinator.component.ts
webapp-frontend/src/app/ei-coordinator/ei-job.datasource.spec.ts
webapp-frontend/src/app/ei-coordinator/ei-job.datasource.ts
webapp-frontend/src/app/ei-coordinator/ei-producer.datasource.spec.ts [new file with mode: 0644]
webapp-frontend/src/app/ei-coordinator/ei-producer.datasource.ts
webapp-frontend/src/app/interceptor.mock.ts
webapp-frontend/src/app/interfaces/ei.types.ts
webapp-frontend/src/app/mock/ei-producer-status1.json [new file with mode: 0644]
webapp-frontend/src/app/mock/ei-producer-status2.json [new file with mode: 0644]
webapp-frontend/src/app/mock/ei-producer1.json [new file with mode: 0644]
webapp-frontend/src/app/mock/ei-producer2.json [new file with mode: 0644]
webapp-frontend/src/app/mock/ei-producers.json [deleted file]
webapp-frontend/src/app/services/ei/ei.service.spec.ts
webapp-frontend/src/app/services/ei/ei.service.ts

index b9c2e0f..3e0fbf5 100644 (file)
@@ -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({
index bd3f946..d69deab 100644 (file)
@@ -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();
     }
 }
index cb530a6..dc51387 100644 (file)
@@ -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<EIJob[]> = dataSource.eiJobsSubject;
         const value = jobsSubject.getValue();
index 2e0e0c8..ef9e478 100644 (file)
@@ -60,14 +60,14 @@ export class EIJobDataSource extends MatTableDataSource<EIJob> {
                 }),
                 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 (file)
index 0000000..6dcbf41
--- /dev/null
@@ -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<EIProducer[]> = dataSource.producerSubject;
+        const value = jobsSubject.getValue();
+        expect(value).toEqual([ expectedProducer1, expectedProducer2 ]);
+        expect(dataSource.rowCount).toEqual(2);
+    });
+});
index 2b12021..bd7f276 100644 (file)
@@ -37,7 +37,7 @@ import { NotificationService } from '../services/ui/notification.service';
 
 export class EIProducerDataSource extends MatTableDataSource<EIProducer> {
 
-    private producerSubject = new BehaviorSubject<EIProducer[]>([]);
+    producerSubject = new BehaviorSubject<EIProducer[]>([]);
 
     private loadingSubject = new BehaviorSubject<boolean>(false);
 
@@ -51,9 +51,10 @@ export class EIProducerDataSource extends MatTableDataSource<EIProducer> {
         super();
     }
 
-    loadTable() {
+    loadProducers(): Observable<EIProducer[]> {
         this.loadingSubject.next(true);
-        this.eiSvc.getEIProducers()
+        let producers: Array<EIProducer> = [];
+        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<EIProducer> {
                 }),
                 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>{};
+                    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<EIProducer[]> {
@@ -77,9 +95,4 @@ export class EIProducerDataSource extends MatTableDataSource<EIProducer> {
         this.producerSubject.complete();
         this.loadingSubject.complete();
     }
-
-    getProducers(): Observable<EIProducer[]> {
-        return this.eiSvc.getEIProducers()
-        .pipe(tap(console.log));
-    }
 }
index 66807d7..a744584 100644 (file)
@@ -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
index 814c099..1aecebc 100644 (file)
@@ -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 (file)
index 0000000..9977a3e
--- /dev/null
@@ -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 (file)
index 0000000..721cddb
--- /dev/null
@@ -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 (file)
index 0000000..222cff9
--- /dev/null
@@ -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 (file)
index 0000000..c723167
--- /dev/null
@@ -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 (file)
index 2a2be7a..0000000
+++ /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
index 5bf7d3d..cf9f2f0 100644 (file)
@@ -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', () => {
index 19c5836..bb429e3 100644 (file)
@@ -48,22 +48,22 @@ export class EIService {
         // injects to variable httpClient
     }
 
-    getProducerIds(): Observable<String[]> {
+    getProducerIds(): Observable<string[]> {
         const url = this.buildPath(this.eiProducersPath);
-        return this.httpClient.get<String[]>(url);
+        return this.httpClient.get<string[]>(url);
     }
 
-    getJobsForProducer(producerId: String): Observable<EIJob[]> {
+    getJobsForProducer(producerId: string): Observable<EIJob[]> {
         const url = this.buildPath(this.eiProducersPath, producerId, this.eiJobsPath);
         return this.httpClient.get<EIJob[]>(url);
     }
 
-    getProducer(producerId: String): Observable<ProducerRegistrationInfo> {
+    getProducer(producerId: string): Observable<ProducerRegistrationInfo> {
         const url = this.buildPath(this.eiProducersPath, producerId);
         return this.httpClient.get<ProducerRegistrationInfo>(url);
     }
 
-    getProducerStatus(producerId: String): Observable<ProducerStatus> {
+    getProducerStatus(producerId: string): Observable<ProducerStatus> {
         const url = this.buildPath(this.eiProducersPath, producerId, this.eiProducerStatusPath);
         return this.httpClient.get<ProducerStatus>(url);
     }