/nbdist/
/.nb-gradle/
/build/
+/bin/
include /etc/nginx/mime.types;
upstream backend {
- # to be replaced with hostname:port of nonrtric-gateway once it gets ready
- server nonrtricgateway:8080;
+ server nonrtricgateway:9090;
}
server {
server_name localhost;
root /usr/share/nginx/html;
index index.html;
- location /api/ {
+ location /v2/ {
proxy_pass http://backend;
}
+ location / {
+ try_files $uri $uri/ /index.html;
+ }
}
}
\ No newline at end of file
import { Injectable, Injector } from '@angular/core';
import { Observable, of } from 'rxjs';
import * as policyinstances1 from './mock/policy-instance-1.json';
-import * as policyinstancesNoType from './mock/policy-instance-notype.json';
+import * as policies from './mock/policies.json';
+import * as policyinstances2 from './mock/policy-instance-2.json';
+import * as policyinstances1Status from './mock/policy-instance-1-status.json';
+import * as policyinstances2Status from './mock/policy-instance-2-status.json';
import * as eijobs from './mock/ei-jobs.json';
import * as eiproducers from './mock/ei-producers.json';
-import * as nopolicyinstances from './mock/nopolicyinstances.json';
+import * as policyinstanceNoType from './mock/policy-instance-notype.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';
json: policytypes1
},
{
- url: 'v2/policies?type=1',
+ url: 'v2/policies?policytype_id=',
+ json: policies
+ },
+ {
+ url: 'v2/policies?policytype_id=1',
+ json: policies
+ },
+ {
+ url: 'v2/policies/2000',
json: policyinstances1
},
{
- url: 'v2/policies?type=',
- json: policyinstancesNoType
+ url: 'v2/policies/2100',
+ json: policyinstances2
},
{
- url: 'v2/policies?type=2',
- json: nopolicyinstances
+ url: 'v2/policies/2000/status',
+ json: policyinstances1Status
},
{
- url: 'v2/policies/2000?type=1',
+ url: 'v2/policies/2100/status',
+ json: policyinstances2Status
+ },
+ {
+ url: 'v2/policies/2000?type=',
json: policyinstanceedit
},
{
- url: 'v2/policies/3000?type=1',
+ url: 'v2/policies/2100?type=',
+ json: policyinstanceedit
+ },
+ {
+ url: 'v2/policies/2000?type=1',
json: policyinstanceedit
},
{
- url: 'v2/policies/2001?type=',
+ url: 'v2/policies/2100?type=1',
json: policyinstanceedit
},
{
// Models of data used by the Policy Control
export interface PolicyTypeSchema {
+ id: string;
name: string;
schemaObject: any;
}
policytype_ids: any[];
}
+export interface PolicyInstances {
+ policy_ids: any[];
+}
+
export interface PolicyInstance {
- id: string;
- json: string;
- ric: string;
- service: string;
+ policy_id: string;
+ policy_data: string;
+ ric_id: string;
+ service_id: string;
lastModified: string;
}
+export interface PolicyStatus {
+ last_modified: string;
+}
export interface PolicyInstanceAck {
status: string;
--- /dev/null
+{
+ "policy_ids": [
+ "2100"
+ ]
+}
\ No newline at end of file
--- /dev/null
+{
+ "last_modified": "2021-01-26T13:15:11.827435Z",
+ "status": {
+ "instance_status": "NOT IN EFFECT",
+ "has_been_deleted": "false",
+ "created_at": "01/26/2021, 13:15:11"
+ }
+}
\ No newline at end of file
-[
- {
- "id": "2000",
- "type": "1",
- "ric": "ric1",
- "json": {
- "scope": {
- "ueId": "ue3100",
- "qosId": "qos3100"
- },
- "qosObjectives": {
- "priorityLevel": 3100
- }
- },
- "service": "service1",
- "lastModified": "2020-12-08T21:12:43.719084Z"
+{
+ "policy_id": "2000",
+ "policytype_id": "1",
+ "ric_id": "ric1",
+ "policy_data": {
+ "scope": {
+ "ueId": "ue3100",
+ "qosId": "qos3100"
},
- {
- "id": "3000",
- "type": "1",
- "ric": "ric2",
- "json": {
- "scope": {
- "ueId": "ue3300",
- "qosId": "qos3300"
- },
- "qosObjectives": {
- "priorityLevel": 3300
- }
- },
- "service": "service1",
- "lastModified": "2020-12-08T21:12:43.719084Z"
+ "qosObjectives": {
+ "priorityLevel": 3100
}
- ]
\ No newline at end of file
+ },
+ "service_id": "service1",
+ "transient": false,
+ "status_notification_uri": ""
+}
\ No newline at end of file
--- /dev/null
+{
+ "last_modified": "2021-01-26T13:15:11.895297Z",
+ "status": {
+ "enforceStatus": "UNDEFINED"
+ }
+}
\ No newline at end of file
--- /dev/null
+{
+ "policy_id": "2100",
+ "policytype_id": "",
+ "ric_id": "ric2",
+ "policy_data": {
+ "scope": {
+ "ueId": "ue3100",
+ "qosId": "qos3100"
+ },
+ "qosObjectives": {
+ "priorityLevel": 3100
+ }
+ },
+ "service_id": "service1",
+ "transient": false,
+ "status_notification_uri": ""
+}
\ No newline at end of file
[
{
"id": "2001",
- "type": "2",
+ "type": "",
"ric": "ric1",
"json": {
"scope": {
export function getPolicyDialogProperties(policyTypeSchema: PolicyTypeSchema, instance: PolicyInstance, darkMode: boolean): MatDialogConfig {
const createSchema = policyTypeSchema.schemaObject;
- const instanceId = instance ? instance.id : null;
- const instanceJson = instance ? instance.json : null;
+ const instanceId = instance ? instance.policy_id : null;
+ const instanceJson = instance ? instance.policy_data : null;
const name = policyTypeSchema.name;
- const ric = instance ? instance.ric : null;
+ const ric = instance ? instance.ric_id : null;
return {
maxWidth: '1200px',
maxHeight: '900px',
<mat-header-cell mat-sort-header *matHeaderCellDef matTooltip="The ID of the policy instance">
Instance
</mat-header-cell>
- <mat-cell *matCellDef="let element" (click)="modifyInstance(element)">{{element.id}}
+ <mat-cell *matCellDef="let element" (click)="modifyInstance(element)">{{element.policy_id}}
</mat-cell>
</ng-container>
matTooltip="Element where the policy instance resides, e.g. a gNodeB or Near-RT RIC">
Target
</mat-header-cell>
- <mat-cell *matCellDef="let element" (click)="modifyInstance(element)">{{element.ric}}
+ <mat-cell *matCellDef="let element" (click)="modifyInstance(element)">{{element.ric_id}}
</mat-cell>
</ng-container>
matTooltip="The service that created the policy instance, and is responsible for its lifecycle">
Owner
</mat-header-cell>
- <mat-cell *matCellDef="let element" (click)="modifyInstance(element)">{{element.service}}
+ <mat-cell *matCellDef="let element" (click)="modifyInstance(element)">{{element.service_id}}
</mat-cell>
</ng-container>
}
ngOnInit() {
- this.instanceDataSource = new PolicyInstanceDataSource(this.policySvc, this.sort, this.notificationService, this.policyTypeSchema);
+ this.instanceDataSource = new PolicyInstanceDataSource(this.policySvc, this.sort, this.notificationService,this.policyTypeSchema);
this.expanded.subscribe((isExpanded: boolean) => this.onExpand(isExpanded));
this.ui.darkModeState.subscribe((isDark) => {
this.darkMode = isDark;
private onExpand(isExpanded: boolean) {
if (isExpanded) {
- this.instanceDataSource.loadTable();
+ this.instanceDataSource.getPolicyInstances();
}
}
}
modifyInstance(instance: PolicyInstance): void {
- this.policySvc.getPolicy(this.policyTypeSchema.name, instance.id).subscribe(
+ this.policySvc.getPolicy(this.policyTypeSchema.name, instance.policy_id).subscribe(
(refreshedJson: any) => {
- instance.json = JSON.stringify(refreshedJson);
+ instance.policy_data = JSON.stringify(refreshedJson);
if (this.isSchemaEmpty()) {
this.dialog.open(
NoTypePolicyInstanceDialogComponent,
getPolicyDialogProperties(this.policyTypeSchema, instance, this.darkMode)).afterClosed().subscribe(
(_: any) => {
- this.instanceDataSource.loadTable();
+ this.instanceDataSource.getPolicyInstances();
}
);
} else {
PolicyInstanceDialogComponent,
getPolicyDialogProperties(this.policyTypeSchema, instance, this.darkMode)).afterClosed().subscribe(
(_: any) => {
- this.instanceDataSource.loadTable();
+ this.instanceDataSource.getPolicyInstances();
}
);
.afterClosed().subscribe(
(res: any) => {
if (res) {
- this.policySvc.deletePolicy(this.policyTypeSchema.name, instance.id)
+ this.policySvc.deletePolicy(this.policyTypeSchema.name, instance.policy_id)
.subscribe(
(response: HttpResponse<Object>) => {
switch (response.status) {
case 200:
this.notificationService.success('Delete succeeded!');
- this.instanceDataSource.loadTable();
+ this.instanceDataSource.getPolicyInstances();
break;
default:
this.notificationService.warn('Delete failed ' + response.status + ' ' + response.body);
export class PolicyInstanceDataSource extends DataSource<PolicyInstance> {
+ policyInstances: PolicyInstance[] = [];
+
private policyInstanceSubject = new BehaviorSubject<PolicyInstance[]>([]);
private loadingSubject = new BehaviorSubject<boolean>(false);
super();
}
- loadTable() {
- this.loadingSubject.next(true);
- this.policySvc.getPolicyInstances(this.policyTypeSchema.name)
- .pipe(
- catchError((her: HttpErrorResponse) => {
- this.notificationService.error('Failed to get policy instances: ' + her.error);
- return of([]);
- }),
- finalize(() => this.loadingSubject.next(false))
- )
- .subscribe((instances: PolicyInstance[]) => {
- this.rowCount = instances.length;
- this.policyInstanceSubject.next(instances);
- });
+ public getPolicyInstances() {
+ this.policyInstances = [] as PolicyInstance[];
+ this.policySvc.getPolicyInstancesByType(this.policyTypeSchema.id).subscribe(policies => {
+ if (policies.policy_ids.length != 0) {
+ policies.policy_ids.forEach(policyId => {
+ var policyInstance = {} as PolicyInstance
+ this.policySvc.getPolicyInstance(policyId).subscribe(policyInstance => {
+ this.policySvc.getPolicyStatus(policyId).subscribe(policyStatus => {
+ policyInstance.lastModified = policyStatus.last_modified;
+ })
+ this.policyInstances.push(policyInstance);
+ })
+ this.policyInstanceSubject.next(this.policyInstances);
+ })
+ }
+ })
}
connect(): Observable<PolicyInstance[]> {
return data.sort((a, b) => {
const isAsc = this.sort.direction === 'asc';
switch (this.sort.active) {
- case 'instanceId': return compare(a.id, b.id, isAsc);
- case 'ric': return compare(a.ric, b.ric, isAsc);
- case 'service': return compare(a.service, b.service, isAsc);
+ case 'instanceId': return compare(a.policy_id, b.policy_id, isAsc);
+ case 'ric': return compare(a.ric_id, b.ric_id, isAsc);
+ case 'service': return compare(a.service_id, b.service_id, isAsc);
case 'lastModified': return compare(a.lastModified, b.lastModified, isAsc);
default: return 0;
}
public getPolicyTypes() {
this.policyTypes = [] as PolicyTypeSchema[];
- this.policySvc.getPolicyTypes().subscribe(data => {
- if (data.policytype_ids.length != 0) {
- data.policytype_ids.forEach(policyId => {
+ this.policySvc.getPolicyTypes().subscribe(policyType => {
+ if (policyType.policytype_ids.length != 0) {
+ policyType.policytype_ids.forEach(policyTypeId => {
var policyTypeSchema = {} as PolicyTypeSchema
- if (policyId === "") {
+ if (policyTypeId === "") {
+ policyTypeSchema.id = '';
policyTypeSchema.name = '';
policyTypeSchema.schemaObject = '{}';
this.policyTypes.push(policyTypeSchema);
}
else {
- this.policySvc.getPolicyType(policyId).subscribe(policyType => {
+ this.policySvc.getPolicyType(policyTypeId).subscribe(policyType => {
+ policyTypeSchema.id = policyTypeId;
policyTypeSchema.schemaObject = policyType.policy_schema;
policyTypeSchema.name = policyType.policy_schema.title;
this.policyTypes.push(policyTypeSchema);
import { PolicyService } from './policy.service';
import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing'
-import { PolicyInstance, PolicyTypes } from '../../interfaces/policy.types';
+import { PolicyInstance, PolicyInstances, PolicyTypes } from '../../interfaces/policy.types';
describe('PolicyService', () => {
let apiVersion2 = 'v2'
policytypes => expect(policytypes).toEqual(expectedPolicytypes, 'should return expected PolicyTypes'),
fail
);
-
+
const req = httpTestingController.expectOne(basePath + apiVersion2 + '/' + policyService.policyTypesPath);
expect(req.request.method).toEqual('GET');
req.flush(emptyPolicyType); //Return empty data
});
});
- describe('#getPolicyInstance', () => {
- let expectedPolicyInstances: PolicyInstance[];
- let policyTypeId: string;
+ describe('#getPolicyInstances', () => {
+ let expectedPolicyInstances: PolicyInstances;
+ let emptyPolicyInstances: PolicyInstances;
+ let policyTypeId = '1';
beforeEach(() => {
policyService = TestBed.get(PolicyService);
httpTestingController = TestBed.get(HttpTestingController);
- expectedPolicyInstances = [
- { id: '2000', json: '{"scope": {"ueId": "ue3100","qosId": "qos3100"},"qosObjectives": {"priorityLevel": 3100}}', service: 'service1', lastModified: '2020-12-08T21:12:43.719084Z' }
- ] as PolicyInstance[];
- policyTypeId = "1";
+ expectedPolicyInstances = {
+ "policy_ids": [
+ "2100",
+ "2000"
+ ]
+ } as PolicyInstances;
});
//Policy Instances Test Case 1:
it('should return all policy instances', () => {
- policyService.getPolicyInstances(policyTypeId).subscribe(
+ policyService.getPolicyInstancesByType(policyTypeId).subscribe(
policyinstances => expect(policyinstances).toEqual(expectedPolicyInstances, 'should return expected Policy Instances'),
fail
);
- const req = httpTestingController.expectOne(basePath + apiVersion2 + '/' + policyService.policyPath + '?type=' + policyTypeId);
+ const req = httpTestingController.expectOne(basePath + apiVersion2 + '/' + policyService.policyPath + '?' + 'policytype_id=' + policyTypeId);
expect(req.request.method).toEqual('GET');
req.flush(expectedPolicyInstances);
});
//Policy Instances Test Case 2:
+ emptyPolicyInstances = {
+ "policy_ids": [
+ ]
+ } as PolicyInstances;
it('should return no policy instances', () => {
- policyService.getPolicyInstances(policyTypeId).subscribe(
- policyinstances => expect(policyinstances.length).toEqual(0, 'should return empty array of Policy Instances'),
+ policyService.getPolicyInstancesByType(policyTypeId).subscribe(
+ policyinstances => expect(policyinstances.policy_ids.length).toEqual(0, 'should return empty array of Policy Instances'),
+ fail
+ );
+ const req = httpTestingController.expectOne(basePath + apiVersion2 + '/' + policyService.policyPath + '?' + 'policytype_id=' + policyTypeId);
+ req.flush(emptyPolicyInstances); //Return empty data
+ });
+ });
+
+ describe('#getPolicyInstance', () => {
+ let expectedPolicyInstance: PolicyInstance;
+ let emptyPolicyInstances: PolicyInstances;
+ let policyId = "2000";
+ beforeEach(() => {
+ policyService = TestBed.get(PolicyService);
+ httpTestingController = TestBed.get(HttpTestingController);
+ expectedPolicyInstance = {
+ "policy_id": "2000",
+ "policytype_id": "1",
+ "ric_id": "ric1",
+ "policy_data": "",
+ "service_id": "service1",
+ "lastModified": ""
+ } as PolicyInstance;
+ });
+ //Policy Instances Test Case 1:
+ it('should return one policy instance', () => {
+ policyService.getPolicyInstance(policyId).subscribe(
+ policyinstance => expect(policyinstance).toEqual(expectedPolicyInstance, 'should return expected Policy Instances'),
fail
);
- const req = httpTestingController.expectOne(basePath + apiVersion2 + '/' + policyService.policyPath + '?type=' + policyTypeId);
- req.flush([]); //Return empty data
+ const req = httpTestingController.expectOne(basePath + apiVersion2 + '/' + policyService.policyPath + '/' + policyId);
+ expect(req.request.method).toEqual('GET');
+ req.flush(expectedPolicyInstance);
});
});
});
import { HttpClient } from '@angular/common/http';
import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';
-import { PolicyInstance, PolicyInstanceAck, PolicyType, PolicyTypes } from '../../interfaces/policy.types';
+import { PolicyInstance, PolicyInstanceAck, PolicyInstances, PolicyStatus, PolicyType, PolicyTypes } from '../../interfaces/policy.types';
import { ControlpanelSuccessTransport } from '../../interfaces/controlpanel.types';
/**
return this.httpClient.get<PolicyType>(url);
}
- getPolicyInstances(policyTypeId: string): Observable<PolicyInstance[]> {
- const url = this.buildPath(this.policyPath) + '?type=' + policyTypeId;
- return this.httpClient.get<PolicyInstance[]>(url);
+ getPolicyInstancesByType(policyTypeId: string): Observable<PolicyInstances> {
+ const url = this.buildPath(this.policyPath + '?' + 'policytype_id=' + policyTypeId);
+ return this.httpClient.get<PolicyInstances>(url);
+ }
+
+ getPolicyInstance(policyId: string): Observable<PolicyInstance> {
+ const url = this.buildPath(this.policyPath) + '/' + policyId;
+ return this.httpClient.get<PolicyInstance>(url);
+ }
+
+ getPolicyStatus(policyId: string): Observable<PolicyStatus> {
+ const url = this.buildPath(this.policyPath) + '/' + policyId + '/status';
+ return this.httpClient.get<PolicyStatus>(url);
}
/**