From 250e3bdd6f39bda375dcf0e1349c8135bf59c6cc Mon Sep 17 00:00:00 2001 From: Piotr Pekala Date: Tue, 29 Jan 2019 02:14:32 -0800 Subject: [PATCH] Managing templates for VPCS --- src/app/app-routing.module.ts | 8 ++- src/app/app.module.ts | 10 ++- .../add-qemu-vm-template.component.ts | 6 +- .../qemu-vm-template-details.component.ts | 4 +- .../qemu-vm-templates.component.ts | 2 +- .../add-vpcs-template.component.html | 15 +++++ .../add-vpcs-template.component.scss | 3 + .../add-vpcs-template.component.spec.ts | 0 .../add-vpcs-template.component.ts | 64 +++++++++++++++++++ .../vpcs-template-details.component.html | 41 ++++++++++++ .../vpcs-template-details.component.scss | 8 +++ .../vpcs-template-details.component.spec.ts | 0 .../vpcs-template-details.component.ts | 50 +++++++++++++++ .../vpcs-templates.component.ts | 17 +++-- .../add-blank-project-dialog.component.ts | 1 + src/app/services/vpcs.service.ts | 12 ++++ 16 files changed, 227 insertions(+), 14 deletions(-) create mode 100644 src/app/components/preferences/vpcs/add-vpcs-template/add-vpcs-template.component.html create mode 100644 src/app/components/preferences/vpcs/add-vpcs-template/add-vpcs-template.component.scss create mode 100644 src/app/components/preferences/vpcs/add-vpcs-template/add-vpcs-template.component.spec.ts create mode 100644 src/app/components/preferences/vpcs/add-vpcs-template/add-vpcs-template.component.ts create mode 100644 src/app/components/preferences/vpcs/vpcs-template-details/vpcs-template-details.component.html create mode 100644 src/app/components/preferences/vpcs/vpcs-template-details/vpcs-template-details.component.scss create mode 100644 src/app/components/preferences/vpcs/vpcs-template-details/vpcs-template-details.component.spec.ts create mode 100644 src/app/components/preferences/vpcs/vpcs-template-details/vpcs-template-details.component.ts diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts index 5a29a1b5..4d0bee06 100644 --- a/src/app/app-routing.module.ts +++ b/src/app/app-routing.module.ts @@ -15,6 +15,8 @@ import { AddQemuVmTemplateComponent } from './components/preferences/qemu/add-qe import { GeneralPreferencesComponent } from './components/preferences/general/general-preferences.component'; import { VpcsPreferencesComponent } from './components/preferences/vpcs/vpcs-preferences/vpcs-preferences.component'; import { VpcsTemplatesComponent } from './components/preferences/vpcs/vpcs-templates/vpcs-templates.component'; +import { AddVpcsTemplateComponent } from './components/preferences/vpcs/add-vpcs-template/add-vpcs-template.component'; +import { VpcsTemplateDetailsComponent } from './components/preferences/vpcs/vpcs-template-details/vpcs-template-details.component'; const routes: Routes = [ { @@ -34,8 +36,10 @@ const routes: Routes = [ { path: 'server/:server_id/preferences/qemu/templates/:template_id', component: QemuVmTemplateDetailsComponent }, { path: 'server/:server_id/preferences/qemu/addtemplate', component: AddQemuVmTemplateComponent }, // temporary disabled - //{ path: 'server/:server_id/preferences/vpcs', component: VpcsPreferencesComponent } - { path: 'server/:server_id/preferences/vpcs/templates', component: VpcsTemplatesComponent } + // { path: 'server/:server_id/preferences/vpcs', component: VpcsPreferencesComponent }, + { path: 'server/:server_id/preferences/vpcs/templates', component: VpcsTemplatesComponent }, + { path: 'server/:server_id/preferences/vpcs/templates/:template_id', component: VpcsTemplateDetailsComponent}, + { path: 'server/:server_id/preferences/vpcs/addtemplate', component: AddVpcsTemplateComponent } ] }, { path: 'server/:server_id/project/:project_id', component: ProjectMapComponent } diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 69ee6784..dc7a09a2 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -99,6 +99,9 @@ import { QemuService } from './services/qemu.service'; import { GeneralPreferencesComponent } from './components/preferences/general/general-preferences.component'; import { VpcsPreferencesComponent } from './components/preferences/vpcs/vpcs-preferences/vpcs-preferences.component'; import { VpcsTemplatesComponent } from './components/preferences/vpcs/vpcs-templates/vpcs-templates.component'; +import { VpcsService } from './services/vpcs.service'; +import { AddVpcsTemplateComponent } from './components/preferences/vpcs/add-vpcs-template/add-vpcs-template.component'; +import { VpcsTemplateDetailsComponent } from './components/preferences/vpcs/vpcs-template-details/vpcs-template-details.component'; if (environment.production) { Raven.config('https://b2b1cfd9b043491eb6b566fd8acee358@sentry.io/842726', { @@ -158,7 +161,9 @@ if (environment.production) { QemuVmTemplateDetailsComponent, GeneralPreferencesComponent, VpcsPreferencesComponent, - VpcsTemplatesComponent + VpcsTemplatesComponent, + AddVpcsTemplateComponent, + VpcsTemplateDetailsComponent ], imports: [ BrowserModule, @@ -206,7 +211,8 @@ if (environment.production) { ProjectNameValidator, ToolsService, ServerSettingsService, - QemuService + QemuService, + VpcsService ], entryComponents: [ AddServerDialogComponent, diff --git a/src/app/components/preferences/qemu/add-qemu-vm-template/add-qemu-vm-template.component.ts b/src/app/components/preferences/qemu/add-qemu-vm-template/add-qemu-vm-template.component.ts index 949c96aa..849c6aae 100644 --- a/src/app/components/preferences/qemu/add-qemu-vm-template/add-qemu-vm-template.component.ts +++ b/src/app/components/preferences/qemu/add-qemu-vm-template/add-qemu-vm-template.component.ts @@ -55,15 +55,15 @@ export class AddQemuVmTemplateComponent implements OnInit { }); } - setDiskImage(value: string){ + setDiskImage(value: string) { this.newImageSelected = value === "newImage"; } - uploadImageFile(event){ + uploadImageFile(event) { this.chosenImage = event.target.files[0].name; } - addTemplate(){ + addTemplate() { if (!(this.templateName && this.selectedBinary && this.ramMemory && this.selectedConsoleType && (this.selectedImage || this.chosenImage))) { let qemuTemplate = new QemuTemplate(); diff --git a/src/app/components/preferences/qemu/qemu-vm-template-details/qemu-vm-template-details.component.ts b/src/app/components/preferences/qemu/qemu-vm-template-details/qemu-vm-template-details.component.ts index 2f7d94e5..eef1e917 100644 --- a/src/app/components/preferences/qemu/qemu-vm-template-details/qemu-vm-template-details.component.ts +++ b/src/app/components/preferences/qemu/qemu-vm-template-details/qemu-vm-template-details.component.ts @@ -61,7 +61,7 @@ export class QemuVmTemplateDetailsComponent implements OnInit { "very low"]; binaries: QemuBinary[] = []; activateCpuThrottling: boolean = true; - isConfiguratorOpened: boolean = true; + isConfiguratorOpened: boolean = false; adapters: CustomAdapter[] = []; displayedColumns: string[] = ['adapter_number', 'port_name', 'adapter_type']; @@ -126,7 +126,7 @@ export class QemuVmTemplateDetailsComponent implements OnInit { } this.qemuService.saveTemplate(this.server, this.qemuTemplate).subscribe((savedTemplate: QemuTemplate) => { - this.toasterService.success("Changes saved") + this.toasterService.success("Changes saved"); }); } } diff --git a/src/app/components/preferences/qemu/qemu-vm-templates/qemu-vm-templates.component.ts b/src/app/components/preferences/qemu/qemu-vm-templates/qemu-vm-templates.component.ts index c1d7bc3b..be889697 100644 --- a/src/app/components/preferences/qemu/qemu-vm-templates/qemu-vm-templates.component.ts +++ b/src/app/components/preferences/qemu/qemu-vm-templates/qemu-vm-templates.component.ts @@ -34,7 +34,7 @@ export class QemuVmTemplatesComponent implements OnInit { this.server = server; this.qemuService.getTemplates(server).subscribe((qemuTemplates: QemuTemplate[]) => { qemuTemplates.forEach((template) => { - if ((template.template_type = 'qemu') && !template.builtin) { + if ((template.template_type === 'qemu') && !template.builtin) { this.qemuTemplates.push(template); } }); diff --git a/src/app/components/preferences/vpcs/add-vpcs-template/add-vpcs-template.component.html b/src/app/components/preferences/vpcs/add-vpcs-template/add-vpcs-template.component.html new file mode 100644 index 00000000..3d61ea21 --- /dev/null +++ b/src/app/components/preferences/vpcs/add-vpcs-template/add-vpcs-template.component.html @@ -0,0 +1,15 @@ +
+
+
+

New VPCS node template

+
+
+
+ + + +
+ +
+
+
diff --git a/src/app/components/preferences/vpcs/add-vpcs-template/add-vpcs-template.component.scss b/src/app/components/preferences/vpcs/add-vpcs-template/add-vpcs-template.component.scss new file mode 100644 index 00000000..00630795 --- /dev/null +++ b/src/app/components/preferences/vpcs/add-vpcs-template/add-vpcs-template.component.scss @@ -0,0 +1,3 @@ +.row { + width: 100%; +} diff --git a/src/app/components/preferences/vpcs/add-vpcs-template/add-vpcs-template.component.spec.ts b/src/app/components/preferences/vpcs/add-vpcs-template/add-vpcs-template.component.spec.ts new file mode 100644 index 00000000..e69de29b diff --git a/src/app/components/preferences/vpcs/add-vpcs-template/add-vpcs-template.component.ts b/src/app/components/preferences/vpcs/add-vpcs-template/add-vpcs-template.component.ts new file mode 100644 index 00000000..33a690fc --- /dev/null +++ b/src/app/components/preferences/vpcs/add-vpcs-template/add-vpcs-template.component.ts @@ -0,0 +1,64 @@ +import { Component, OnInit } from "@angular/core"; +import { Server } from '../../../../models/server'; +import { ActivatedRoute, ParamMap, Router } from '@angular/router'; +import { ServerService } from '../../../../services/server.service'; +import { switchMap } from 'rxjs/operators'; +import { VpcsService } from '../../../../services/vpcs.service'; +import { VpcsTemplate } from '../../../../models/templates/vpcs-template'; +import { ToasterService } from '../../../../services/toaster.service'; +import { v4 as uuid } from 'uuid'; + + +@Component({ + selector: 'app-add-vpcs-template', + templateUrl: './add-vpcs-template.component.html', + styleUrls: ['./add-vpcs-template.component.scss'] +}) +export class AddVpcsTemplateComponent implements OnInit { + server: Server; + templateName: string = ''; + + constructor( + private route: ActivatedRoute, + private serverService: ServerService, + private vpcsService: VpcsService, + private router: Router, + private toasterService: ToasterService + ) {} + + ngOnInit() { + this.route.paramMap + .pipe( + switchMap((params: ParamMap) => { + const server_id = params.get('server_id'); + return this.serverService.get(parseInt(server_id, 10)); + }) + ) + .subscribe((server: Server) => { + this.server = server; + }); + } + + addTemplate() { + if (this.templateName) { + let vpcsTemplate: VpcsTemplate = { + base_script_file: 'vpcs_base_config.txt', + builtin: false, + category: 'guest', + compute_id: 'local', + console_auto_start: false, + console_type: 'telnet', + default_name_format: 'PC{0}', + name: this.templateName, + symbol: ':/symbols/vpcs_guest.svg', + template_id: uuid(), + template_type: 'vpcs' + }; + this.vpcsService.addTemplate(this.server, vpcsTemplate).subscribe((vpcsTemplate) => { + this.router.navigate(['/server', this.server.id, 'preferences', 'vpcs', 'templates']); + }); + } else { + this.toasterService.error(`Fill all required fields`); + } + } +} diff --git a/src/app/components/preferences/vpcs/vpcs-template-details/vpcs-template-details.component.html b/src/app/components/preferences/vpcs/vpcs-template-details/vpcs-template-details.component.html new file mode 100644 index 00000000..e07a0d69 --- /dev/null +++ b/src/app/components/preferences/vpcs/vpcs-template-details/vpcs-template-details.component.html @@ -0,0 +1,41 @@ +
+
+
+

VPCS device configuration

+
+
+
+ + + + + + + + + + + + + + + + {{category[0]}} + + + + + + + {{type}} + + + + + Auto start console + +
+
+
+
+
diff --git a/src/app/components/preferences/vpcs/vpcs-template-details/vpcs-template-details.component.scss b/src/app/components/preferences/vpcs/vpcs-template-details/vpcs-template-details.component.scss new file mode 100644 index 00000000..ceb5950c --- /dev/null +++ b/src/app/components/preferences/vpcs/vpcs-template-details/vpcs-template-details.component.scss @@ -0,0 +1,8 @@ +.row { + width: 100%; + margin-left: 0px; +} + +.select { + width: 100%; +} diff --git a/src/app/components/preferences/vpcs/vpcs-template-details/vpcs-template-details.component.spec.ts b/src/app/components/preferences/vpcs/vpcs-template-details/vpcs-template-details.component.spec.ts new file mode 100644 index 00000000..e69de29b diff --git a/src/app/components/preferences/vpcs/vpcs-template-details/vpcs-template-details.component.ts b/src/app/components/preferences/vpcs/vpcs-template-details/vpcs-template-details.component.ts new file mode 100644 index 00000000..0aee5eb5 --- /dev/null +++ b/src/app/components/preferences/vpcs/vpcs-template-details/vpcs-template-details.component.ts @@ -0,0 +1,50 @@ +import { Component, OnInit } from "@angular/core"; +import { ActivatedRoute, ParamMap } from '@angular/router'; +import { ServerService } from '../../../../services/server.service'; +import { Server } from '../../../../models/server'; +import { ToasterService } from '../../../../services/toaster.service'; +import { VpcsService } from '../../../../services/vpcs.service'; +import { VpcsTemplate } from '../../../../models/templates/vpcs-template'; + + +@Component({ + selector: 'app-vpcs-template-details', + templateUrl: './vpcs-template-details.component.html', + styleUrls: ['./vpcs-template-details.component.scss'] +}) +export class VpcsTemplateDetailsComponent implements OnInit { + server: Server; + vpcsTemplate: VpcsTemplate; + + consoleTypes: string[] = ['telnet', 'none']; + categories = [["Default", "guest"], + ["Routers", "routers"], + ["Switches", "switches"], + ["End devices", "end_devices"], + ["Security devices", "security_devices"]]; + + constructor( + private route: ActivatedRoute, + private serverService: ServerService, + private vpcsService: VpcsService, + private toasterService: ToasterService + ) {} + + 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.vpcsService.getTemplate(this.server, template_id).subscribe((vpcsTemplate: VpcsTemplate) => { + this.vpcsTemplate = vpcsTemplate; + }); + }); + } + + onSave() { + this.vpcsService.saveTemplate(this.server, this.vpcsTemplate).subscribe((vpcsTemaple: VpcsTemplate) => { + this.toasterService.success("Changes saved"); + }); + } +} diff --git a/src/app/components/preferences/vpcs/vpcs-templates/vpcs-templates.component.ts b/src/app/components/preferences/vpcs/vpcs-templates/vpcs-templates.component.ts index 46389ce8..be527cb2 100644 --- a/src/app/components/preferences/vpcs/vpcs-templates/vpcs-templates.component.ts +++ b/src/app/components/preferences/vpcs/vpcs-templates/vpcs-templates.component.ts @@ -3,8 +3,8 @@ import { Server } from '../../../../models/server'; import { ActivatedRoute, ParamMap } from '@angular/router'; import { ServerService } from '../../../../services/server.service'; import { switchMap } from 'rxjs/operators'; -import { QemuTemplate } from '../../../../models/templates/qemu-template'; -import { QemuService } from '../../../../services/qemu.service'; +import { VpcsService } from '../../../../services/vpcs.service'; +import { VpcsTemplate } from '../../../../models/templates/vpcs-template'; @Component({ @@ -14,11 +14,12 @@ import { QemuService } from '../../../../services/qemu.service'; }) export class VpcsTemplatesComponent implements OnInit { server: Server; - vpcsTemplates: QemuTemplate[] = []; + vpcsTemplates: VpcsTemplate[] = []; constructor( private route: ActivatedRoute, - private serverService: ServerService + private serverService: ServerService, + private vpcsService: VpcsService ) {} ngOnInit() { @@ -31,6 +32,14 @@ export class VpcsTemplatesComponent implements OnInit { ) .subscribe((server: Server) => { this.server = server; + + this.vpcsService.getTemplates(this.server).subscribe((vpcsTemplates: VpcsTemplate[]) => { + vpcsTemplates.forEach((template) => { + if ((template.template_type === 'vpcs') && !template.builtin) { + this.vpcsTemplates.push(template); + } + }); + }); }); } } diff --git a/src/app/components/projects/add-blank-project-dialog/add-blank-project-dialog.component.ts b/src/app/components/projects/add-blank-project-dialog/add-blank-project-dialog.component.ts index 8d899e70..2874130d 100644 --- a/src/app/components/projects/add-blank-project-dialog/add-blank-project-dialog.component.ts +++ b/src/app/components/projects/add-blank-project-dialog/add-blank-project-dialog.component.ts @@ -10,6 +10,7 @@ import { ConfirmationDialogComponent } from '../confirmation-dialog/confirmation import { ProjectNameValidator } from '../models/projectNameValidator'; import { ToasterService } from '../../../services/toaster.service'; + @Component({ selector: 'app-add-blank-project-dialog', templateUrl: './add-blank-project-dialog.component.html', diff --git a/src/app/services/vpcs.service.ts b/src/app/services/vpcs.service.ts index 63ef4aea..33cdd9d6 100644 --- a/src/app/services/vpcs.service.ts +++ b/src/app/services/vpcs.service.ts @@ -11,4 +11,16 @@ export class VpcsService { 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: VpcsTemplate): Observable { + return this.httpServer.post(server, `/templates`, vpcsTemplate) as Observable; + } + + saveTemplate(server: Server, vpcsTemplate: VpcsTemplate): Observable { + return this.httpServer.put(server, `/templates/${vpcsTemplate.template_id}`, vpcsTemplate) as Observable; + } }