The directory ``src/test/resources`` contains usable versions of the required property
files. These steps are required to launch:
-1. Set an environment variable via JVM argument: ``-Dorg.oransc.ric.portal.dashboard=mock``
-2. Run the JUnit test case ``DashboardServerTest`` which is not exactly a "test" because it never finishes.
+1. Install all project jar files locally
+2. Set an environment variable via JVM argument: ``-Dorg.oransc.ric.portal.dashboard=mock``
+3. Run the JUnit test case ``DashboardServerTest`` which is not exactly a "test" because it never finishes.
-Both steps can be done with this command-line invocation::
+These steps can be done with these commands::
+ mvn -Ddocker.skip=true -DskipTests=true install
mvn -Dorg.oransc.ric.portal.dashboard=mock -Dtest=DashboardTestServer test
Development user authentication
removed cached copy
* Silence many Sonar complaints
* Revise license statements in documentation files
+* Revise stats screen to drop mock load, pendulum, reporting items
Version 1.2.4, 24 Oct 2019
--------------------------
import { CaasIngressComponent } from './caas-ingress/caas-ingress.component';
import { CatalogCardComponent } from './ui/catalog-card/catalog-card.component';
import { CatalogComponent } from './catalog/catalog.component';
-import { ConfigEventComponent } from './ui/config-event/config-event.component';
import { ConfirmDialogComponent } from './ui/confirm-dialog/confirm-dialog.component';
import { ControlCardComponent } from './ui/control-card/control-card.component';
import { ControlComponent } from './control/control.component';
import { LoadingDialogComponent } from './ui/loading-dialog/loading-dialog.component';
import { MainComponent } from './main/main.component';
import { MaterialDesignFrameworkModule } from 'angular6-json-schema-form';
-import { ModalEventComponent } from './ui/modal-event/modal-event.component';
import { PlatformComponent } from './platform/platform.component';
import { RanControlComponent } from './ran-control/ran-control.component';
import { RanControlConnectDialogComponent } from './ran-control/ran-connection-dialog.component';
CaasIngressComponent,
CatalogCardComponent,
CatalogComponent,
- ConfigEventComponent,
ConfirmDialogComponent,
ControlCardComponent,
ControlComponent,
FooterComponent,
LoadingDialogComponent,
MainComponent,
- ModalEventComponent,
PlatformComponent,
RanControlComponent,
RanControlConnectDialogComponent,
<h3 class="rd-global-page-title">Platform stats</h3>
- <mat-card class="bar-chart-card">
- <mat-card-header>
- <mat-card-title>RIC Total Load</mat-card-title>
- </mat-card-header>
- <mat-card-content>
- <canvas baseChart [datasets]="cpuChartData" [labels]="cpuChartLabels" [options]="cpuChartOptions"
- [colors]="cpuChartColors" [legend]="cpuChartLegend" [chartType]="cpuChartType" (click)="loadClickData()">
- </canvas>
- </mat-card-content>
- </mat-card>
-
- <mat-divider></mat-divider>
-
<mat-tab-group>
- <mat-tab label="Pendulum xApp">
- <mat-grid-list cols="3" rowHeight="3:2">
- <mat-grid-tile>
- <mat-card>
- <div>Additional Delay</div>
- <mat-slider thumbLabel tickInterval="1" min="0" [max]="sliderDelayMax" [(ngModel)]="delay"
- (click)="saveDelay()"></mat-slider>
- </mat-card>
- </mat-grid-tile>
- <mat-grid-tile>
- <mat-card class="bar-chart-card">
- <mat-card-header>
- <mat-card-title>Pendulum Control Loop Latency</mat-card-title>
- </mat-card-header>
- <mat-card-content>
- <canvas baseChart [datasets]="latencyChartData" [labels]="latencyChartLabels"
- [options]="latencyChartOptions" [colors]="latencyChartColors" [legend]="latencyChartLegend"
- [chartType]="latencyChartType" (click)="loadClickData()">
- </canvas>
- </mat-card-content>
- </mat-card>
- </mat-grid-tile>
- <mat-grid-tile>
- <mat-card class="bar-chart-card">
- <mat-card-header>
- <mat-card-title>Pendulum Control Load</mat-card-title>
- </mat-card-header>
- <mat-card-content>
- <canvas baseChart [datasets]="loadChartData" [labels]="loadChartLabels" [options]="loadChartOptions"
- [colors]="loadChartColors" [legend]="loadChartLegend" [chartType]="loadChartType"
- (click)="loadClickData()">
- </canvas>
- </mat-card-content>
- </mat-card>
- </mat-grid-tile>
- </mat-grid-list>
- </mat-tab>
- <mat-tab label="Reporting xApp">
- <mat-grid-list cols="3" rowHeight="3:2">
- <mat-grid-tile>
- <mat-card>
- <div>Additional Load</div>
- <mat-slider thumbLabel tickInterval="1" min="0" [max]="sliderLoadMax" [(ngModel)]="load"
- (click)="saveLoad()"></mat-slider>
- </mat-card>
- </mat-grid-tile>
- </mat-grid-list>
- </mat-tab>
<mat-tab label="AC xApp">
<mat-grid-list cols="3" rowHeight="3:2">
<mat-grid-tile>
</mat-tab-group>
</div>
-
-<rd-app-config-event></rd-app-config-event>
import { HttpClient } from '@angular/common/http';
import { map } from 'rxjs/operators';
import { DashboardSuccessTransport } from '../interfaces/dashboard.types';
-import { DomSanitizer, SafeUrl, SafeResourceUrl } from '@angular/platform-browser';
+import { DomSanitizer, SafeResourceUrl } from '@angular/platform-browser';
@Component({
selector: 'rd-stats',
export class StatsComponent implements OnInit {
@ViewChildren(BaseChartDirective) charts: QueryList<BaseChartDirective>;
- timeLeft = 60;
- interval;
checked = false;
- load;
- delay;
metricsUrlAc : SafeResourceUrl;
metricsUrlMc : SafeResourceUrl;
- public latencyChartColors: Array<any> = [
- { // blue
- backgroundColor: 'rgba(197, 239, 247, 0.2)',
- borderColor: 'lightblue',
- pointBackgroundColor: 'lightblue',
- pointBorderColor: '#fff',
- pointHoverBackgroundColor: '#fff',
- pointHoverBorderColor: 'rgba(148,159,177,0.8)'
- }
- ];
- public latencyChartOptions = {
- scaleShowVerticalLines: true,
- responsive: true,
- animation: {
- duration: 800 * 1.5,
- easing: 'linear'
- },
- hover: {
- animationDuration: 1 // duration of animations when hovering an item
- },
- responsiveAnimationDuration: 500,
- scales: {
- yAxes: [{
- ticks: {
- // the data minimum used for determining the ticks is Math.min(dataMin, suggestedMin)
- suggestedMin: 0,
- // the data maximum used for determining the ticks is Math.max(dataMax, suggestedMax)
- // suggestedMax: 1000
- },
- scaleLabel: {
- display: true,
- labelString: 'msecs'
- }
- }],
- xAxes: [{
- scaleLabel: {
- display: true,
- labelString: 'time (last 10 seconds)'
- }
- }]
- },
- };
- public latencyChartLabels = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10'];
- public latencyChartType = 'line';
- public latencyChartLegend = true;
- public latencyChartData = [
- { data: [65, 59, 80, 81, 56, 55, 40, 20, 12, 34], label: 'Latency' },
- ];
-
- public loadChartColors: Array<any> = [
-
- { // green
- backgroundColor: 'rgba(200, 247, 197, 0.2)',
- borderColor: 'lightgreen',
- pointBackgroundColor: 'lightgreen',
- pointBorderColor: '#fff',
- pointHoverBackgroundColor: '#fff',
- pointHoverBorderColor: 'rgba(0,200,0,0.5)'
- }
- ];
- public loadChartOptions = {
- scaleShowVerticalLines: false,
- responsive: true,
- animation: {
- duration: 800 * 1.5,
- easing: 'linear'
- },
- hover: {
- animationDuration: 1 // duration of animations when hovering an item
- },
- responsiveAnimationDuration: 500,
- scales: {
- yAxes: [{
- ticks: {
- // the data minimum used for determining the ticks is Math.min(dataMin, suggestedMin)
- suggestedMin: 0,
- // the data maximum used for determining the ticks is Math.max(dataMax, suggestedMax)
- // suggestedMax: 1000
- },
- scaleLabel: {
- display: true,
- labelString: '# of requests'
- }
- }],
- xAxes: [{
- scaleLabel: {
- display: true,
- labelString: 'time (last 10 seconds)'
- }
- }]
- },
- };
- public loadChartLabels = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10'];
- public loadChartType = 'line';
- public loadChartLegend = true;
- public loadChartData = [
- { data: [28, 48, 40, 19, 86, 77, 90, 20, 12, 34], label: 'Load' }
- ];
-
- public cpuChartColors: Array<any> = [
-
- { // red
- backgroundColor: 'rgba(241, 169, 160, 0.2)',
- borderColor: 'brown',
- pointBackgroundColor: 'brown',
- pointBorderColor: '#fff',
- pointHoverBackgroundColor: '#fff',
- pointHoverBorderColor: 'rgba(0,200,0,0.5)'
- }
- ];
- public cpuChartOptions = {
- scaleShowVerticalLines: false,
- responsive: true,
- animation: {
- duration: 800 * 1.5,
- easing: 'linear'
- },
- hover: {
- animationDuration: 1 // duration of animations when hovering an item
- },
- responsiveAnimationDuration: 500,
- scales: {
- yAxes: [{
- ticks: {
- // the data minimum used for determining the ticks is Math.min(dataMin, suggestedMin)
- suggestedMin: 0,
- // the data maximum used for determining the ticks is Math.max(dataMax, suggestedMax)
- // suggestedMax: 1000
- },
- scaleLabel: {
- display: true,
- labelString: '# of requests'
- }
- }],
- xAxes: [{
- scaleLabel: {
- display: true,
- labelString: 'time (last 10 seconds)'
- }
- }]
- },
- };
- public cpuChartLabels = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10'];
- public cpuChartType = 'line';
- public cpuChartLegend = true;
- public cpuChartData = [
- { data: [15, 29, 30, 31, 53, 52, 41, 70, 32, 14], label: 'RICLoad' }
- ];
-
- public x = 11;
- public y = 11;
- public z = 11;
- public loop = true;
-
- public sliderLoadMax = Number(this.service.loadMax) || 0;
-
- public sliderDelayMax = Number(this.service.delayMax) || 0;
-
- latencyClickData() {
- // this.latencyChartData = [{data: [Math.random() * 100, Math.random() * 100, Math.random() * 100,
- // Math.random() * 100, Math.random() * 100, Math.random() * 100, Math.random() * 100, Math.random() * 100,
- // Math.random() * 100, Math.random() * 100], label: 'Latency'}];
- this.charts.forEach((child) => {
- if (child.datasets[0].label === 'Latency') {
- this.latencyChartLabels.shift();
- child.datasets[0].data.shift();
-
- const latencyData = this.service.getLatencyMetrics();
- child.datasets[0].data.push(latencyData);
- this.latencyChartLabels.push('' + this.x++);
- }
- // once new data is computed and datasets are updated, tell our baseChart the datasets changed
- child.ngOnChanges({
- datasets: {
- currentValue: child.datasets,
- previousValue: null,
- firstChange: true,
- isFirstChange: () => true
- }
- });
- });
- }
-
- loadClickData() {
- if (this.loop) {
- this.loop = false;
- this.startLoadTimer();
- } else {
- this.loop = true;
- this.pauseLoadTimer();
- }
- }
-
- loopLoadData(metricsv: any) {
- this.charts.forEach((child) => {
- if (child.datasets[0].label === 'Load') {
- this.loadChartLabels.shift();
- child.datasets[0].data.shift();
-
- // const loadData = this.service.getLoad();
- // child.datasets[0].data.push(this.service.load);
- child.datasets[0].data.push(metricsv['load']);
- this.loadChartLabels.push('' + this.x++);
- }
- if (child.datasets[0].label === 'Latency') {
- this.latencyChartLabels.shift();
- child.datasets[0].data.shift();
-
- // const loadData = this.service.getLoad();
- // child.datasets[0].data.push(this.service.load);
- child.datasets[0].data.push(metricsv['latency']);
- this.latencyChartLabels.push('' + this.x++);
- }
- if (child.datasets[0].label === 'RICLoad') {
- this.latencyChartLabels.shift();
- child.datasets[0].data.shift();
-
- // const loadData = this.service.getLoad();
- // child.datasets[0].data.push(this.service.load);
- child.datasets[0].data.push(metricsv['ricload']);
- this.latencyChartLabels.push('' + this.x++);
- }
- // once new data is computed and datasets are updated, tell our baseChart the datasets changed
- child.ngOnChanges({
- datasets: {
- currentValue: child.datasets,
- previousValue: null,
- firstChange: true,
- isFirstChange: () => true
- }
- });
- });
- }
-
- cpuClickData() {
- // this.cpuChartData = [{data: [Math.random() * 100, Math.random() * 100, Math.random() * 100,
- // Math.random() * 100, Math.random() * 100, Math.random() * 100, Math.random() * 100, Math.random() * 100,
- // Math.random() * 100, Math.random() * 100], label: 'CPU'}];
- const cpuData = this.service.getLatencyMetrics();
- this.newDataPoint([cpuData], this.z++);
- }
-
- newDataPoint(dataArr = [100], label) {
-
- this.cpuChartData.forEach((dataset, index) => {
- this.cpuChartData[index] = Object.assign({}, this.cpuChartData[index], {
- data: [...this.cpuChartData[index].data, dataArr[index]]
- });
- });
-
- this.cpuChartLabels = [...this.cpuChartLabels, label];
- // console.log(this.cpuChartLabels);
- // console.log(this.cpuChartData);
- }
-
- formatLabel(value: number | null) {
- if (!value) {
- return 0;
- }
-
- if (value >= 1000) {
- return Math.round(value / 1000);
- }
-
- return value;
- }
-
constructor(private service: StatsService, private httpClient: HttpClient, private sanitize: DomSanitizer) {
- this.sliderLoadMax = Number(this.service.loadMax) || 0;
- this.sliderDelayMax = Number(this.service.delayMax) || 0;
- // console.log('this.sliderLoadMax: ' + this.sliderLoadMax);
- // console.log('this.sliderDelayMax: ' + this.sliderDelayMax);
}
ngOnInit() {
- this.fetchLoad().subscribe(loadv => {
- // console.log('loadv: ' + loadv);
- this.checked = loadv;
- });
- this.fetchDelay().subscribe(delayv => {
- // console.log('delayv: ' + delayv);
- this.delay = delayv;
- });
- this.fetchMetrics().subscribe(metricsv => {
- // console.log('metricsv.load: ' + metricsv['load']);
- });
this.service.getAppMetricsUrl('AC').subscribe((res:DashboardSuccessTransport) => {
this.metricsUrlAc = this.sanitize.bypassSecurityTrustResourceUrl(res.data);
});
});
}
- startLoadTimer() {
- this.interval = setInterval(() => {
- if (this.timeLeft > 0) {
- this.timeLeft--;
- this.fetchMetrics().subscribe(metricsv => {
- // console.log('metricsv.load: ' + metricsv['latency']);
- // console.log('metricsv.load: ' + metricsv['load']);
- // console.log('metricsv.load: ' + metricsv['ricload']);
- this.loopLoadData(metricsv);
- });
-
- } else {
- this.timeLeft = 60;
- }
- }, 1000);
- }
-
- pauseLoadTimer() {
- clearInterval(this.interval);
- }
-
- fetchMetrics() {
- return this.httpClient.get<any[]>(this.service.hostURL + this.service.metricsPath, this.service.httpOptions).pipe(map(res => {
- return res;
- }));
- }
-
- fetchDelay() {
- return this.httpClient.get<any[]>(this.service.hostURL + this.service.delayPath, this.service.httpOptions).pipe(map(res => {
- const delayv = res['delay'];
- this.delay = delayv;
- return this.delay;
- }));
- }
-
- saveDelay() {
- this.service.putDelay(this.delay);
- }
-
- fetchLoad() {
- return this.httpClient.get<any[]>(this.service.hostURL + this.service.loadPath, this.service.httpOptions).pipe(map(res => {
- const loadv = res['load'];
- this.load = loadv;
- return this.load;
- }));
-
- }
-
- saveLoad() {
- this.service.putLoad(this.load);
- }
-
}
+++ /dev/null
-<!--
- ========================LICENSE_START=================================
- O-RAN-SC
- %%
- Copyright (C) 2019 AT&T Intellectual Property
- %%
- 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===================================
- -->
-<button type="button" mdbBtn color="default" rounded="true" data-toggle="modal" data-target="#basicExample"
- (click)="frame.show()" mdbWavesEffect><mat-icon style="vertical-align: -21%; size: 1em">settings</mat-icon></button>
-
-<div mdbModal #frame="mdbModal" class="modal fade left" id="frameModalTop" tabindex="-1" role="dialog"
- aria-labelledby="myModalLabel" aria-hidden="true" (opened)="onOpened($event)">
- <div class="modal-dialog modal-notify modal-info modal-side modal-top-left" role="document">
- <!--Content-->
- <div class="modal-content">
- <!--Header-->
- <div class="modal-header">
- <p class="heading lead">Settings</p>
-
- <button type="button" class="close" data-dismiss="modal" aria-label="Close" (click)="frame.hide()">
- <span aria-hidden="true" class="white-text">×</span>
- </button>
- </div>
-
- <!--Body-->
- <div class="modal-body">
-
- <div class="text-center">
- <div class="md-form">
- <input type="text" id="jsonurl" class="form-control" mdbInput [formControl]="contactFormModalJsonUrl">
- <label for="jsonurl">JSON-SERVER url</label>
- </div>
- <div class="md-form">
- <input type="text" id="host" class="form-control" mdbInput [formControl]="contactFormModalHost">
- <label for="host">Host url</label>
- </div>
- <div class="md-form">
- <input type="text" id="metricsPath" class="form-control" mdbInput
- [formControl]="contactFormModalMetrics">
- <label data-error="wrong" data-success="right" for="metricsPath">Metrics Path</label>
- </div>
- <div class="md-form">
- <input type="text" id="delayPath" class="form-control" mdbInput
- [formControl]="contactFormModalDelay">
- <label data-error="wrong" data-success="delayPath" for="url">Delay Path</label>
- </div>
- <div class="md-form">
- <input type="text" id="loadPath" class="form-control" mdbInput
- [formControl]="contactFormModalLoad">
- <label data-error="wrong" data-success="right" for="loadPath">Load Path</label>
- </div>
- <div class="md-form">
- <input type="text" id="delayMax" class="form-control" mdbInput
- [formControl]="contactFormModalDelayMax">
- <label data-error="wrong" data-success="delayMax" for="url">Delay Max</label>
- </div>
- <div class="md-form">
- <input type="text" id="loadMax" class="form-control" mdbInput
- [formControl]="contactFormModalLoadMax">
- <label data-error="wrong" data-success="right" for="loadMax">Load Max</label>
- </div>
- </div>
- </div>
-
- <!--Footer-->
- <div class="modal-footer justify-content-center">
- <a type="button" mdbBtn color="primary" class="waves-effect" mdbWavesEffect (click)="save(); frame.hide()">
- <mat-icon style="vertical-align: -21%;">launch</mat-icon> Save
- </a>
- <a type="button" mdbBtn color="primary" outline="true" class="waves-effect" mdbWavesEffect (click)="frame.hide()"
- data-dismiss="modal">
- <mat-icon style="vertical-align: -21%; size: 1em">close</mat-icon> Cancel</a>
- </div>
- </div>
- <!--/.Content-->
- </div>
-</div>
+++ /dev/null
-/*-
- * ========================LICENSE_START=================================
- * O-RAN-SC
- * %%
- * Copyright (C) 2019 AT&T Intellectual Property
- * %%
- * 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 { async, ComponentFixture, TestBed } from '@angular/core/testing';
-
-import { ConfigEventComponent } from './config-event.component';
-
-describe('ConfigEventComponent', () => {
- let component: ConfigEventComponent;
- let fixture: ComponentFixture<ConfigEventComponent>;
-
- beforeEach(async(() => {
- TestBed.configureTestingModule({
- declarations: [ ConfigEventComponent ]
- })
- .compileComponents();
- }));
-
- beforeEach(() => {
- fixture = TestBed.createComponent(ConfigEventComponent);
- component = fixture.componentInstance;
- fixture.detectChanges();
- });
-
- it('should create', () => {
- expect(component).toBeTruthy();
- });
-});
+++ /dev/null
-/*-
- * ========================LICENSE_START=================================
- * O-RAN-SC
- * %%
- * Copyright (C) 2019 AT&T Intellectual Property
- * %%
- * 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 { Component, OnInit } from '@angular/core';
-import { FormControl, Validators } from '@angular/forms';
-import { StatsService } from '../../services/stats/stats.service';
-
-@Component({
- selector: 'rd-app-config-event',
- templateUrl: './config-event.component.html',
- styleUrls: ['./config-event.component.scss']
-})
-export class ConfigEventComponent implements OnInit {
-
- public renderValue;
-
- contactFormModalJsonUrl = new FormControl('', Validators.required);
- contactFormModalHost = new FormControl('', Validators.required);
- contactFormModalMetrics = new FormControl('', Validators.required);
- contactFormModalDelay = new FormControl('', Validators.required);
- contactFormModalLoad = new FormControl('', Validators.required);
- contactFormModalDelayMax = new FormControl('', Validators.required);
- contactFormModalLoadMax = new FormControl('', Validators.required);
- onOpened(event: any) {
- this.service.loadConfig();
- this.contactFormModalJsonUrl.setValue(this.service.jsonURL);
- this.contactFormModalHost.setValue(this.service.hostURL);
- this.contactFormModalMetrics.setValue(this.service.metricsPath);
- this.contactFormModalDelay.setValue(this.service.delayPath);
- this.contactFormModalLoad.setValue(this.service.loadPath);
- this.contactFormModalDelayMax.setValue(this.service.delayMax);
- this.contactFormModalLoadMax.setValue(this.service.loadMax);
- console.log(event);
- }
-
-
- constructor(private service: StatsService) { }
-
- ngOnInit() {
- // load from file
- this.service.loadConfig();
- // console.log(this.service.hostURL);
- //this.contactFormModalHost.setValue(this.service.hostURL);
- //this.contactFormModalJsonUrl.setValue(this.service.jsonURL);
- }
-
- save() {
- // save to file
- this.service.saveConfig('jsonURL', this.contactFormModalJsonUrl.value);
- this.service.saveConfig('host', this.contactFormModalHost.value);
- this.service.saveConfig('metricspath', this.contactFormModalMetrics.value);
- this.service.saveConfig('delaypath', this.contactFormModalDelay.value);
- this.service.saveConfig('loadpath', this.contactFormModalLoad.value);
- this.service.saveConfig('delaymax', this.contactFormModalDelayMax.value);
- this.service.saveConfig('loadmax', this.contactFormModalLoadMax.value);
- this.service.loadConfig();
- }
-
-
-}
+++ /dev/null
-<!--
- ========================LICENSE_START=================================
- O-RAN-SC
- %%
- Copyright (C) 2019 AT&T Intellectual Property
- %%
- 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===================================
- -->
-<button type="button" mdbBtn color="default" rounded="true" data-toggle="modal" data-target="#basicExample"
- (click)="frame.show()" mdbWavesEffect>Deploy</button>
-
-<div mdbModal #frame="mdbModal" class="modal fade left" id="frameModalTop" tabindex="-1" role="dialog"
- aria-labelledby="myModalLabel" aria-hidden="true" (opened)="onOpened($event)">
- <div class="modal-dialog modal-notify modal-info modal-side modal-top-left" role="document">
- <!--Content-->
- <div class="modal-content">
- <!--Header-->
- <div class="modal-header">
- <p class="heading lead">xApp Info</p>
-
- <button type="button" class="close" data-dismiss="modal" aria-label="Close" (click)="frame.hide()">
- <span aria-hidden="true" class="white-text">×</span>
- </button>
- </div>
-
- <!--Body-->
- <div class="modal-body">
-
- <img src="../../../assets/intelligence.png" alt=""
- class="img-fluid">
-
- <div class="text-center">
- <p>xApp Manager Params</p>
- <div class="md-form">
- <textarea type="text" id="form8" class="md-textarea form-control" rows="1" mdbInput
- [formControl]="contactFormModalHelm"></textarea>
- <label data-error="wrong" data-success="right" for="form8">Delay</label>
- </div>
- <div class="md-form">
- <textarea type="text" id="form8" class="md-textarea form-control" rows="1" mdbInput
- [formControl]="contactFormModalHelm"></textarea>
- <label data-error="wrong" data-success="right" for="form8">Load</label>
- </div>
- </div>
- </div>
-
- <!--Footer-->
- <div class="modal-footer justify-content-center">
- <a type="button" mdbBtn color="primary" class="waves-effect" mdbWavesEffect>
- <mat-icon style="vertical-align: -21%;">launch</mat-icon> Deploy
- </a>
- <a type="button" mdbBtn color="primary" outline="true" class="waves-effect" mdbWavesEffect (click)="frame.hide()"
- data-dismiss="modal">
- <mat-icon style="vertical-align: -21%; size: 1em">close</mat-icon> Cancel</a>
- </div>
- </div>
- <!--/.Content-->
- </div>
-</div>
+++ /dev/null
-/*-
- * ========================LICENSE_START=================================
- * O-RAN-SC
- * %%
- * Copyright (C) 2019 AT&T Intellectual Property
- * %%
- * 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 { async, ComponentFixture, TestBed } from '@angular/core/testing';
-
-import { ModalEventComponent } from './modal-event.component';
-
-describe('ModalEventComponent', () => {
- let component: ModalEventComponent;
- let fixture: ComponentFixture<ModalEventComponent>;
-
- beforeEach(async(() => {
- TestBed.configureTestingModule({
- declarations: [ ModalEventComponent ]
- })
- .compileComponents();
- }));
-
- beforeEach(() => {
- fixture = TestBed.createComponent(ModalEventComponent);
- component = fixture.componentInstance;
- fixture.detectChanges();
- });
-
- it('should create', () => {
- expect(component).toBeTruthy();
- });
-});
+++ /dev/null
-/*-
- * ========================LICENSE_START=================================
- * O-RAN-SC
- * %%
- * Copyright (C) 2019 AT&T Intellectual Property
- * %%
- * 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 { Component, Input, OnInit , Output, EventEmitter } from '@angular/core';
-import { FormControl, Validators } from '@angular/forms';
-
-@Component({
- selector: 'rd-modal-event',
- templateUrl: './modal-event.component.html',
- styleUrls: ['./modal-event.component.scss']
-})
-export class ModalEventComponent implements OnInit {
-
- public renderValue;
-
- @Input() value;
- @Input() rowData: any;
- @Output() save: EventEmitter<any> = new EventEmitter();
- contactFormModalHelm = new FormControl('', Validators.required);
- onOpened(event: any) {
- console.log(event);
- }
-
-
- constructor() { }
-
- ngOnInit() {
- this.renderValue = this.value;
- }
-
- example() {
- alert(this.renderValue);
- }
-
- onDeployxApp() {
- this.save.emit(this.rowData);
- }
-
-}