mirror of
https://github.com/GNS3/gns3-web-ui.git
synced 2025-02-21 02:01:19 +00:00
Managing templates for VPCS
This commit is contained in:
parent
e55c273f3c
commit
250e3bdd6f
@ -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 }
|
||||
|
@ -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,
|
||||
|
@ -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();
|
||||
|
@ -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");
|
||||
});
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
});
|
||||
|
@ -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>
|
@ -0,0 +1,3 @@
|
||||
.row {
|
||||
width: 100%;
|
||||
}
|
@ -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`);
|
||||
}
|
||||
}
|
||||
}
|
@ -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>
|
@ -0,0 +1,8 @@
|
||||
.row {
|
||||
width: 100%;
|
||||
margin-left: 0px;
|
||||
}
|
||||
|
||||
.select {
|
||||
width: 100%;
|
||||
}
|
@ -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");
|
||||
});
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
|
@ -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',
|
||||
|
@ -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>;
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user