From 074b1d840e9da0187065631f0880785d628bee2c Mon Sep 17 00:00:00 2001 From: Piotr Pekala Date: Wed, 18 Sep 2019 05:37:51 -0700 Subject: [PATCH] Support for managing traceng templates added --- src/app/app-routing.module.ts | 9 +++ src/app/app.module.ts | 14 +++- .../preferences/preferences.component.html | 3 + .../add-traceng-template.component.html | 23 ++++++ .../add-traceng-template.component.scss | 0 .../add-traceng-template.component.ts | 67 +++++++++++++++++ .../traceng-preferences.component.html | 12 ++++ .../traceng-preferences.component.scss | 3 + .../traceng-preferences.component.ts | 32 +++++++++ .../traceng-template-details.component.html | 40 +++++++++++ .../traceng-template-details.component.scss | 0 .../traceng-template-details.component.ts | 71 +++++++++++++++++++ .../traceng-templates.component.html | 32 +++++++++ .../traceng-templates.component.scss | 0 .../traceng-templates.component.ts | 46 ++++++++++++ src/app/models/templates/traceng-template.ts | 12 ++++ src/app/services/template-mocks.service.ts | 18 +++++ src/app/services/traceng.service.spec.ts | 0 src/app/services/traceng.service.ts | 27 +++++++ 19 files changed, 407 insertions(+), 2 deletions(-) create mode 100644 src/app/components/preferences/traceng/add-traceng/add-traceng-template.component.html create mode 100644 src/app/components/preferences/traceng/add-traceng/add-traceng-template.component.scss create mode 100644 src/app/components/preferences/traceng/add-traceng/add-traceng-template.component.ts create mode 100644 src/app/components/preferences/traceng/traceng-preferences/traceng-preferences.component.html create mode 100644 src/app/components/preferences/traceng/traceng-preferences/traceng-preferences.component.scss create mode 100644 src/app/components/preferences/traceng/traceng-preferences/traceng-preferences.component.ts create mode 100644 src/app/components/preferences/traceng/traceng-template-details/traceng-template-details.component.html create mode 100644 src/app/components/preferences/traceng/traceng-template-details/traceng-template-details.component.scss create mode 100644 src/app/components/preferences/traceng/traceng-template-details/traceng-template-details.component.ts create mode 100644 src/app/components/preferences/traceng/traceng-templates/traceng-templates.component.html create mode 100644 src/app/components/preferences/traceng/traceng-templates/traceng-templates.component.scss create mode 100644 src/app/components/preferences/traceng/traceng-templates/traceng-templates.component.ts create mode 100644 src/app/models/templates/traceng-template.ts create mode 100644 src/app/services/traceng.service.spec.ts create mode 100644 src/app/services/traceng.service.ts diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts index 25db77e8..1dcf6b05 100644 --- a/src/app/app-routing.module.ts +++ b/src/app/app-routing.module.ts @@ -53,6 +53,10 @@ import { CopyIouTemplateComponent } from './components/preferences/ios-on-unix/c import { ListOfSnapshotsComponent } from './components/snapshots/list-of-snapshots/list-of-snapshots.component'; import { ConsoleComponent } from './components/settings/console/console.component'; import { HelpComponent } from './components/help/help.component'; +import { TracengPreferencesComponent } from './components/preferences/traceng/traceng-preferences/traceng-preferences.component'; +import { TracengTemplatesComponent } from './components/preferences/traceng/traceng-templates/traceng-templates.component'; +import { AddTracengTemplateComponent } from './components/preferences/traceng/add-traceng/add-traceng-template.component'; +import { TracengTemplateDetailsComponent } from './components/preferences/traceng/traceng-template-details/traceng-template-details.component'; const routes: Routes = [ { @@ -111,6 +115,11 @@ const routes: Routes = [ { path: 'server/:server_id/preferences/vmware/templates/:template_id', component: VmwareTemplateDetailsComponent }, { path: 'server/:server_id/preferences/vmware/addtemplate', component: AddVmwareTemplateComponent }, + // { path: 'server/:server_id/preferences/traceng', component: TracengPreferencesComponent }, + // { path: 'server/:server_id/preferences/traceng/templates', component: TracengTemplatesComponent }, + // { path: 'server/:server_id/preferences/traceng/templates/:template_id', component: TracengTemplateDetailsComponent }, + // { path: 'server/:server_id/preferences/traceng/addtemplate', component: AddTracengTemplateComponent }, + { path: 'server/:server_id/preferences/docker/templates', component: DockerTemplatesComponent }, { path: 'server/:server_id/preferences/docker/templates/:template_id', component: DockerTemplateDetailsComponent }, { path: 'server/:server_id/preferences/docker/templates/:template_id/copy', component: CopyDockerTemplateComponent }, diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 8aca20e1..5ce47b8e 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -229,6 +229,11 @@ import { ConfiguratorDialogIosComponent } from './components/project-map/node-ed import { ConfiguratorDialogDockerComponent } from './components/project-map/node-editors/configurator/docker/configurator-docker.component'; import { ConfiguratorDialogNatComponent } from './components/project-map/node-editors/configurator/nat/configurator-nat.component'; import { ConfiguratorDialogTracengComponent } from './components/project-map/node-editors/configurator/traceng/configurator-traceng.component'; +import { AddTracengTemplateComponent } from './components/preferences/traceng/add-traceng/add-traceng-template.component'; +import { TracengPreferencesComponent } from './components/preferences/traceng/traceng-preferences/traceng-preferences.component'; +import { TracengTemplatesComponent } from './components/preferences/traceng/traceng-templates/traceng-templates.component'; +import { TracengService } from './services/traceng.service'; +import { TracengTemplateDetailsComponent } from './components/preferences/traceng/traceng-template-details/traceng-template-details.component'; if (environment.production) { Raven.config('https://b2b1cfd9b043491eb6b566fd8acee358@sentry.io/842726', { @@ -385,7 +390,11 @@ if (environment.production) { ConfiguratorDialogIosComponent, ConfiguratorDialogDockerComponent, ConfiguratorDialogNatComponent, - ConfiguratorDialogTracengComponent + ConfiguratorDialogTracengComponent, + AddTracengTemplateComponent, + TracengPreferencesComponent, + TracengTemplatesComponent, + TracengTemplateDetailsComponent ], imports: [ BrowserModule, @@ -464,7 +473,8 @@ if (environment.production) { RotationValidator, MapSettingsService, InfoService, - ComputeService + ComputeService, + TracengService ], entryComponents: [ AddServerDialogComponent, diff --git a/src/app/components/preferences/preferences.component.html b/src/app/components/preferences/preferences.component.html index 7a23d808..3f4246a7 100644 --- a/src/app/components/preferences/preferences.component.html +++ b/src/app/components/preferences/preferences.component.html @@ -31,6 +31,9 @@ Docker + diff --git a/src/app/components/preferences/traceng/add-traceng/add-traceng-template.component.html b/src/app/components/preferences/traceng/add-traceng/add-traceng-template.component.html new file mode 100644 index 00000000..96359baa --- /dev/null +++ b/src/app/components/preferences/traceng/add-traceng/add-traceng-template.component.html @@ -0,0 +1,23 @@ +
+
+
+

New VPCS node template

+
+
+
+ +
+ + + + + + +
+
+
+ + +
+
+
diff --git a/src/app/components/preferences/traceng/add-traceng/add-traceng-template.component.scss b/src/app/components/preferences/traceng/add-traceng/add-traceng-template.component.scss new file mode 100644 index 00000000..e69de29b diff --git a/src/app/components/preferences/traceng/add-traceng/add-traceng-template.component.ts b/src/app/components/preferences/traceng/add-traceng/add-traceng-template.component.ts new file mode 100644 index 00000000..70fd2a10 --- /dev/null +++ b/src/app/components/preferences/traceng/add-traceng/add-traceng-template.component.ts @@ -0,0 +1,67 @@ +import { Component, OnInit } from "@angular/core"; +import { Server } from '../../../../models/server'; +import { ActivatedRoute, Router } from '@angular/router'; +import { ServerService } from '../../../../services/server.service'; +import { ToasterService } from '../../../../services/toaster.service'; +import { v4 as uuid } from 'uuid'; +import { TemplateMocksService } from '../../../../services/template-mocks.service'; +import { FormGroup, FormBuilder, FormControl, Validators } from '@angular/forms'; +import { TracengService } from '../../../../services/traceng.service'; +import { TracengTemplate } from '../../../../models/templates/traceng-template'; + + +@Component({ + selector: 'app-add-traceng-template', + templateUrl: './add-traceng-template.component.html', + styleUrls: ['./add-traceng-template.component.scss', '../../preferences.component.scss'] +}) +export class AddTracengTemplateComponent implements OnInit { + server: Server; + templateName: string = ''; + ipAddress: string = ''; + templateNameForm: FormGroup + + constructor( + private route: ActivatedRoute, + private serverService: ServerService, + private tracengService: TracengService, + private router: Router, + private toasterService: ToasterService, + private templateMocksService: TemplateMocksService, + private formBuilder: FormBuilder + ) { + this.templateNameForm = this.formBuilder.group({ + templateName: new FormControl(null, [Validators.required]), + ipAddress: new FormControl(null, [Validators.required]) + }); + } + + ngOnInit() { + const server_id = this.route.snapshot.paramMap.get("server_id"); + this.serverService.get(parseInt(server_id, 10)).then((server: Server) => { + this.server = server; + }); + } + + goBack() { + this.router.navigate(['/server', this.server.id, 'preferences', 'traceng', 'templates']); + } + + addTemplate() { + if (!this.templateNameForm.invalid) { + this.templateName = this.templateNameForm.get('templateName').value; + this.ipAddress = this.templateNameForm.get('ipAddress').value; + let tracengTemplate: TracengTemplate = this.templateMocksService.getTracengTemplate(); + + tracengTemplate.template_id = uuid(); + tracengTemplate.name = this.templateName; + tracengTemplate.ip_address = this.ipAddress; + + this.tracengService.addTemplate(this.server, tracengTemplate).subscribe(() => { + this.goBack(); + }); + } else { + this.toasterService.error(`Fill all required fields`); + } + } +} diff --git a/src/app/components/preferences/traceng/traceng-preferences/traceng-preferences.component.html b/src/app/components/preferences/traceng/traceng-preferences/traceng-preferences.component.html new file mode 100644 index 00000000..4e94dbb2 --- /dev/null +++ b/src/app/components/preferences/traceng/traceng-preferences/traceng-preferences.component.html @@ -0,0 +1,12 @@ +
+
+
+

TraceNG preferences

+
+
+
+ + + +
+
diff --git a/src/app/components/preferences/traceng/traceng-preferences/traceng-preferences.component.scss b/src/app/components/preferences/traceng/traceng-preferences/traceng-preferences.component.scss new file mode 100644 index 00000000..9c2173c2 --- /dev/null +++ b/src/app/components/preferences/traceng/traceng-preferences/traceng-preferences.component.scss @@ -0,0 +1,3 @@ +.form-field { + width: 100%; +} diff --git a/src/app/components/preferences/traceng/traceng-preferences/traceng-preferences.component.ts b/src/app/components/preferences/traceng/traceng-preferences/traceng-preferences.component.ts new file mode 100644 index 00000000..a698d8af --- /dev/null +++ b/src/app/components/preferences/traceng/traceng-preferences/traceng-preferences.component.ts @@ -0,0 +1,32 @@ +import { Component, OnInit } from "@angular/core"; +import { ActivatedRoute } from '@angular/router'; +import { Server } from '../../../../models/server'; +import { ServerService } from '../../../../services/server.service'; + + +@Component({ + selector: 'app-traceng-preferences', + templateUrl: './traceng-preferences.component.html', + styleUrls: ['./traceng-preferences.component.scss'] +}) +export class TracengPreferencesComponent implements OnInit { + server: Server; + tracengExecutable: string; + + constructor( + private route: ActivatedRoute, + private serverService: ServerService + ) {} + + ngOnInit() { + const server_id = this.route.snapshot.paramMap.get("server_id"); + + this.serverService.get(parseInt(server_id, 10)).then((server: Server) => { + this.server = server; + }); + } + + restoreDefaults(){ + this.tracengExecutable = ''; + } +} diff --git a/src/app/components/preferences/traceng/traceng-template-details/traceng-template-details.component.html b/src/app/components/preferences/traceng/traceng-template-details/traceng-template-details.component.html new file mode 100644 index 00000000..01e1acdc --- /dev/null +++ b/src/app/components/preferences/traceng/traceng-template-details/traceng-template-details.component.html @@ -0,0 +1,40 @@ +
+
+
+

TraceNG device configuration

+
+
+
+ +
+ + + + + + + + + +

+
+
+
+ + +
+
+
+ diff --git a/src/app/components/preferences/traceng/traceng-template-details/traceng-template-details.component.scss b/src/app/components/preferences/traceng/traceng-template-details/traceng-template-details.component.scss new file mode 100644 index 00000000..e69de29b diff --git a/src/app/components/preferences/traceng/traceng-template-details/traceng-template-details.component.ts b/src/app/components/preferences/traceng/traceng-template-details/traceng-template-details.component.ts new file mode 100644 index 00000000..3042bfce --- /dev/null +++ b/src/app/components/preferences/traceng/traceng-template-details/traceng-template-details.component.ts @@ -0,0 +1,71 @@ +import { Component, OnInit } from "@angular/core"; +import { ActivatedRoute, Router } from '@angular/router'; +import { ServerService } from '../../../../services/server.service'; +import { Server } from '../../../../models/server'; +import { ToasterService } from '../../../../services/toaster.service'; +import { FormBuilder, FormGroup, Validators, FormControl } from '@angular/forms'; +import { TracengService } from '../../../../services/traceng.service'; +import { TracengTemplate } from '../../../../models/templates/traceng-template'; + + +@Component({ + selector: 'app-traceng-template-details', + templateUrl: './traceng-template-details.component.html', + styleUrls: ['./traceng-template-details.component.scss', '../../preferences.component.scss'] +}) +export class TracengTemplateDetailsComponent implements OnInit { + server: Server; + tracengTemplate: TracengTemplate; + inputForm: FormGroup; + isSymbolSelectionOpened: boolean = false; + + constructor( + private route: ActivatedRoute, + private serverService: ServerService, + private tracengService: TracengService, + private toasterService: ToasterService, + private formBuilder: FormBuilder, + private router: Router + ) { + this.inputForm = this.formBuilder.group({ + templateName: new FormControl('', Validators.required), + defaultName: new FormControl('', Validators.required), + symbol: new FormControl('', Validators.required) + }); + } + + ngOnInit() { + const server_id = this.route.snapshot.paramMap.get("server_id"); + const template_id = this.route.snapshot.paramMap.get("template_id"); + this.serverService.get(parseInt(server_id, 10)).then((server: Server) => { + this.server = server; + + this.tracengService.getTemplate(this.server, template_id).subscribe((tracengTemplate: TracengTemplate) => { + this.tracengTemplate = tracengTemplate; + }); + }); + } + + goBack() { + this.router.navigate(['/server', this.server.id, 'preferences', 'traceng', 'templates']); + } + + onSave() { + if (this.inputForm.invalid) { + this.toasterService.error(`Fill all required fields`); + } else { + this.tracengService.saveTemplate(this.server, this.tracengTemplate).subscribe((tracengTemplate: TracengTemplate) => { + this.toasterService.success("Changes saved"); + }); + } + } + + chooseSymbol() { + this.isSymbolSelectionOpened = !this.isSymbolSelectionOpened; + } + + symbolChanged(chosenSymbol: string) { + this.isSymbolSelectionOpened = !this.isSymbolSelectionOpened; + this.tracengTemplate.symbol = chosenSymbol; + } +} diff --git a/src/app/components/preferences/traceng/traceng-templates/traceng-templates.component.html b/src/app/components/preferences/traceng/traceng-templates/traceng-templates.component.html new file mode 100644 index 00000000..af922d9f --- /dev/null +++ b/src/app/components/preferences/traceng/traceng-templates/traceng-templates.component.html @@ -0,0 +1,32 @@ +
+
+
+

TraceNG node templates

+ + +
+
+ +
+
+ +
+ {{template.name}} + + + + +
+
+
+
+
+ + diff --git a/src/app/components/preferences/traceng/traceng-templates/traceng-templates.component.scss b/src/app/components/preferences/traceng/traceng-templates/traceng-templates.component.scss new file mode 100644 index 00000000..e69de29b diff --git a/src/app/components/preferences/traceng/traceng-templates/traceng-templates.component.ts b/src/app/components/preferences/traceng/traceng-templates/traceng-templates.component.ts new file mode 100644 index 00000000..b640193c --- /dev/null +++ b/src/app/components/preferences/traceng/traceng-templates/traceng-templates.component.ts @@ -0,0 +1,46 @@ +import { Component, OnInit, ViewChild } from "@angular/core"; +import { Server } from '../../../../models/server'; +import { ActivatedRoute } from '@angular/router'; +import { ServerService } from '../../../../services/server.service'; +import { DeleteTemplateComponent } from '../../common/delete-template-component/delete-template.component'; +import { TracengTemplate } from '../../../../models/templates/traceng-template'; +import { TracengService } from '../../../../services/traceng.service'; + +@Component({ + selector: 'app-traceng-templates', + templateUrl: './traceng-templates.component.html', + styleUrls: ['./traceng-templates.component.scss', '../../preferences.component.scss'] +}) +export class TracengTemplatesComponent implements OnInit { + server: Server; + tracengTemplates: TracengTemplate[] = []; + @ViewChild(DeleteTemplateComponent, {static: false}) deleteComponent: DeleteTemplateComponent; + + constructor( + private route: ActivatedRoute, + private serverService: ServerService, + private tracengService: TracengService + ) {} + + ngOnInit() { + const server_id = this.route.snapshot.paramMap.get("server_id"); + this.serverService.get(parseInt(server_id, 10)).then((server: Server) => { + this.server = server; + this.getTemplates(); + }); + } + + getTemplates() { + this.tracengService.getTemplates(this.server).subscribe((tracengTemplates: TracengTemplate[]) => { + this.tracengTemplates = tracengTemplates.filter((elem) => elem.template_type === 'traceng' && !elem.builtin); + }); + } + + deleteTemplate(template: TracengTemplate) { + this.deleteComponent.deleteItem(template.name, template.template_id); + } + + onDeleteEvent() { + this.getTemplates(); + } +} diff --git a/src/app/models/templates/traceng-template.ts b/src/app/models/templates/traceng-template.ts new file mode 100644 index 00000000..00eeb3c6 --- /dev/null +++ b/src/app/models/templates/traceng-template.ts @@ -0,0 +1,12 @@ +export interface TracengTemplate { + builtin: boolean; + category: string; + compute_id: string; + console_type: string; + default_name_format: string; + ip_address: string; + name: string; + symbol: string; + template_id: string; + template_type: string; +} diff --git a/src/app/services/template-mocks.service.ts b/src/app/services/template-mocks.service.ts index c61a0c02..e746ef0f 100644 --- a/src/app/services/template-mocks.service.ts +++ b/src/app/services/template-mocks.service.ts @@ -11,9 +11,27 @@ import { VmwareTemplate } from '../models/templates/vmware-template'; import { DockerTemplate } from '../models/templates/docker-template'; import { CustomAdapter } from '../models/qemu/qemu-custom-adapter'; import { IouTemplate } from '../models/templates/iou-template'; +import { TracengTemplate } from '../models/templates/traceng-template'; @Injectable() export class TemplateMocksService { + getTracengTemplate() : TracengTemplate { + let template: TracengTemplate = { + builtin: false, + category: 'guest', + compute_id: 'local', + console_type: 'none', + default_name_format: 'TraceNG{0}', + ip_address: '', + name: '', + symbol: ':/symbols/classic/traceng.svg', + template_id: '', + template_type: 'traceng' + }; + + return template; + } + getQemuTemplate() : Observable { let template : QemuTemplate = { adapter_type: 'e1000', diff --git a/src/app/services/traceng.service.spec.ts b/src/app/services/traceng.service.spec.ts new file mode 100644 index 00000000..e69de29b diff --git a/src/app/services/traceng.service.ts b/src/app/services/traceng.service.ts new file mode 100644 index 00000000..2c33f12e --- /dev/null +++ b/src/app/services/traceng.service.ts @@ -0,0 +1,27 @@ +import { Injectable } from "@angular/core"; +import { HttpServer } from './http-server.service'; +import { Server } from '../models/server'; +import { Observable } from 'rxjs'; +import { HttpHeaders } from '@angular/common/http'; +import { TracengTemplate } from '../models/templates/traceng-template'; + +@Injectable() +export class TracengService { + constructor(private httpServer: HttpServer) {} + + getTemplates(server: Server): Observable { + return this.httpServer.get(server, '/templates') as Observable; + } + + getTemplate(server: Server, template_id: string): Observable { + return this.httpServer.get(server, `/templates/${template_id}`) as Observable; + } + + addTemplate(server: Server, vpcsTemplate: TracengTemplate): Observable { + return this.httpServer.post(server, `/templates`, vpcsTemplate) as Observable; + } + + saveTemplate(server: Server, vpcsTemplate: TracengTemplate): Observable { + return this.httpServer.put(server, `/templates/${vpcsTemplate.template_id}`, vpcsTemplate) as Observable; + } +}