Managing templates for VPCS

This commit is contained in:
Piotr Pekala 2019-01-29 02:14:32 -08:00
parent e55c273f3c
commit 250e3bdd6f
16 changed files with 227 additions and 14 deletions

View File

@ -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 }

View File

@ -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,

View File

@ -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();

View File

@ -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");
});
}
}

View File

@ -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);
}
});

View File

@ -0,0 +1,15 @@
<div class="content">
<div class="default-header">
<div class="row">
<h1 class="col">New VPCS node template</h1>
</div>
</div>
<div class="default-content">
<mat-form-field class="row">
<input matInput type="text" [(ngModel)]="templateName" placeholder="Template name">
</mat-form-field>
<div class="buttons-bar">
<button mat-raised-button color="primary" (click)="addTemplate()">Add template</button>
</div>
</div>
</div>

View File

@ -0,0 +1,3 @@
.row {
width: 100%;
}

View File

@ -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`);
}
}
}

View File

@ -0,0 +1,41 @@
<div class="content" [ngClass]="{ shadowed: isConfiguratorOpened }" [ngClass]="{ nonshadowed: !isConfiguratorOpened }">
<div class="default-header">
<div class="row">
<h1 class="col">VPCS device configuration</h1>
</div>
</div>
<div class="default-content" *ngIf="vpcsTemplate">
<mat-form-field class="row">
<input matInput type="text" [(ngModel)]="vpcsTemplate.name" placeholder="Template name">
</mat-form-field>
<mat-form-field class="row">
<input matInput type="text" [(ngModel)]="vpcsTemplate.default_name_format" placeholder="Default name format">
</mat-form-field>
<mat-form-field class="row">
<input matInput type="text" [(ngModel)]="vpcsTemplate.base_script_file" placeholder="Base script file">
</mat-form-field>
<mat-form-field class="row">
<input matInput type="text" [(ngModel)]="vpcsTemplate.symbol" placeholder="Symbol">
</mat-form-field>
<mat-form-field class="row">
<mat-select placeholder="Category" [(ngModel)]="vpcsTemplate.category">
<mat-option *ngFor="let category of categories" [value]="category[1]">
{{category[0]}}
</mat-option>
</mat-select>
</mat-form-field>
<mat-form-field class="select">
<mat-select placeholder="Console type" [(ngModel)]="vpcsTemplate.console_type">
<mat-option *ngFor="let type of consoleTypes" [value]="type">
{{type}}
</mat-option>
</mat-select>
</mat-form-field>
<mat-checkbox [(ngModel)]="vpcsTemplate.console_auto_start">
Auto start console
</mat-checkbox>
<div class="buttons-bar">
<button mat-raised-button color="primary" (click)="onSave()">Save</button><br/>
</div>
</div>
</div>

View File

@ -0,0 +1,8 @@
.row {
width: 100%;
margin-left: 0px;
}
.select {
width: 100%;
}

View File

@ -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");
});
}
}

View File

@ -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);
}
});
});
});
}
}

View File

@ -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',

View File

@ -11,4 +11,16 @@ export class VpcsService {
getTemplates(server: Server): Observable<VpcsTemplate[]> {
return this.httpServer.get<VpcsTemplate[]>(server, '/templates') as Observable<VpcsTemplate[]>;
}
getTemplate(server: Server, template_id: string): Observable<VpcsTemplate> {
return this.httpServer.get<VpcsTemplate>(server, `/templates/${template_id}`) as Observable<VpcsTemplate>;
}
addTemplate(server: Server, vpcsTemplate: VpcsTemplate): Observable<VpcsTemplate> {
return this.httpServer.post<VpcsTemplate>(server, `/templates`, vpcsTemplate) as Observable<VpcsTemplate>;
}
saveTemplate(server: Server, vpcsTemplate: VpcsTemplate): Observable<VpcsTemplate> {
return this.httpServer.put<VpcsTemplate>(server, `/templates/${vpcsTemplate.template_id}`, vpcsTemplate) as Observable<VpcsTemplate>;
}
}