From d60d906043c995188daf6daf74fd15a8065de1f5 Mon Sep 17 00:00:00 2001
From: piotrpekala7 <31202938+piotrpekala7@users.noreply.github.com>
Date: Mon, 9 Dec 2019 15:59:02 +0100
Subject: [PATCH 1/6] Test version
---
.../project-map/project-map.component.html | 10 +++++++++
.../project-map/project-map.component.ts | 21 ++++++++++++++++++-
src/app/services/compute.service.ts | 5 +++++
3 files changed, 35 insertions(+), 1 deletion(-)
diff --git a/src/app/components/project-map/project-map.component.html b/src/app/components/project-map/project-map.component.html
index bfdf440f..b5eee1c2 100644
--- a/src/app/components/project-map/project-map.component.html
+++ b/src/app/components/project-map/project-map.component.html
@@ -75,6 +75,16 @@
call_received
Import portable project
+
+
-
-
- insert_drive_file
- Import appliance
-
+
close
Close project
diff --git a/src/app/components/project-map/project-map.component.ts b/src/app/components/project-map/project-map.component.ts
index 4917892b..569672fd 100644
--- a/src/app/components/project-map/project-map.component.ts
+++ b/src/app/components/project-map/project-map.component.ts
@@ -820,23 +820,6 @@ export class ProjectMapComponent implements OnInit, OnDestroy {
});
}
- public uploadAppliance(event) {
- let fileInput = event.target;
- let file: File = fileInput.files[0];
- let name: string = file.name;
- let fileReader: FileReader = new FileReader();
-
- fileReader.onloadend = () => {
- let appliance = fileReader.result;
- var obj = JSON.parse(appliance as string);
- console.log(obj);
- this.computeService.postAppliance(this.server, obj).subscribe(() => {
- this.toasterService.success('Appliance imported.');
- });
- }
- fileReader.readAsText(file);
- }
-
public ngOnDestroy() {
this.drawingsDataSource.clear();
this.nodesDataSource.clear();
diff --git a/src/app/services/compute.service.ts b/src/app/services/compute.service.ts
index 482fe7fb..96e35fda 100644
--- a/src/app/services/compute.service.ts
+++ b/src/app/services/compute.service.ts
@@ -16,4 +16,8 @@ export class ComputeService {
// test for one appliance
return this.httpServer.post(server, `/computes/local/docker/images/chrome.gns3a`, appliance) as Observable;
}
+
+ getUploadPath(server: Server, project_name: string, filename: string) {
+ return `http://${server.host}:${server.port}/v2/compute/qemu/images/${filename}`;
+ }
}
From a704d0dcd05f67e34f1b18be8bb7c24a97e8b050 Mon Sep 17 00:00:00 2001
From: Piotr Pekala
Date: Fri, 20 Dec 2019 01:10:51 -0800
Subject: [PATCH 3/6] Creating templates added
---
.../import-appliance.component.ts | 105 ++++++++++++------
src/app/services/compute.service.ts | 9 +-
2 files changed, 76 insertions(+), 38 deletions(-)
diff --git a/src/app/components/project-map/import-appliance/import-appliance.component.ts b/src/app/components/project-map/import-appliance/import-appliance.component.ts
index 550bc4d3..c861aba4 100644
--- a/src/app/components/project-map/import-appliance/import-appliance.component.ts
+++ b/src/app/components/project-map/import-appliance/import-appliance.component.ts
@@ -5,6 +5,16 @@ import { ComputeService } from '../../../services/compute.service';
import { ToasterService } from '../../../services/toaster.service';
import { ServerResponse } from '../../../models/serverResponse';
import { FileUploader, ParsedResponseHeaders, FileItem } from 'ng2-file-upload';
+import { Template } from '../../../models/template';
+import { DockerTemplate } from '../../../models/templates/docker-template';
+import { QemuTemplate } from '../../../models/templates/qemu-template';
+import { IouTemplate } from '../../../models/templates/iou-template';
+import { IosTemplate } from '../../../models/templates/ios-template';
+import { TemplateService } from '../../../services/template.service';
+import { DockerService } from '../../../services/docker.service';
+import { QemuService } from '../../../services/qemu.service';
+import { IouService } from '../../../services/iou.service';
+import { IosService } from '../../../services/ios.service';
@Component({
@@ -19,52 +29,85 @@ export class ImportApplianceComponent implements OnInit {
constructor(
private computeService: ComputeService,
- private toasterService: ToasterService
+ private toasterService: ToasterService,
+ private dockerService: DockerService,
+ private qemuService: QemuService,
+ private iouService: IouService,
+ private iosService: IosService
) {}
ngOnInit() {
this.uploader = new FileUploader({});
this.uploader.onAfterAddingFile = file => {
- file.withCredentials = false;
+ file.withCredentials = false;
};
this.uploader.onErrorItem = (item: FileItem, response: string, status: number, headers: ParsedResponseHeaders) => {
- let serverResponse: ServerResponse = JSON.parse(response);
- let resultMessage = 'An error occured: ' + serverResponse.message;
- this.toasterService.error(resultMessage);
+ this.toasterService.error('An error has occured');
};
this.uploader.onCompleteItem = (
- item: FileItem,
- response: string,
- status: number,
- headers: ParsedResponseHeaders
+ item: FileItem,
+ response: string,
+ status: number,
+ headers: ParsedResponseHeaders
) => {
- this.toasterService.success('Appliance imported successfully');
+
+ this.toasterService.success('Appliance imported successfully');
+ this.uploader.queue = [];
};
}
public uploadAppliance(event) {
- const url = this.computeService.getUploadPath(this.server, event.target.files[0].name);
- this.uploader.queue.forEach(elem => (elem.url = url));
- const itemToUpload = this.uploader.queue[0];
- this.uploader.uploadItem(itemToUpload);
- }
+ let file: File = event.target.files[0];
+ let name: string = file.name;
+ let fileReader: FileReader = new FileReader();
- // public uploadAppliance(event) {
- // let fileInput = event.target;
- // let file: File = fileInput.files[0];
- // let name: string = file.name;
- // let fileReader: FileReader = new FileReader();
-
- // fileReader.onloadend = () => {
- // let appliance = fileReader.result;
- // var obj = JSON.parse(appliance as string);
- // console.log(obj);
- // // this.computeService.postAppliance(this.server, obj).subscribe(() => {
- // // this.toasterService.success('Appliance imported.');
- // // });
- // }
- // fileReader.readAsText(file);
- // }
+ let template;
+ fileReader.onloadend = () => {
+ let appliance = JSON.parse(fileReader.result as string);
+ let emulator: string;
+ console.log(appliance);
+
+ if (appliance.qemu) {
+ template = new QemuTemplate();
+ template.template_type = 'qemu';
+ } else if (appliance.iou) {
+ template = new IouTemplate();
+ template.template_type = 'iou';
+ } else if (appliance.dynamips) {
+ template = new IosTemplate();
+ template.template_type = 'dynamips';
+ } else if (appliance.docker) {
+ template = new DockerTemplate();
+ template.template_type = 'docker';
+ template.adapters = appliance.docker.adapters;
+ template.console_type = appliance.docker.console_type;
+ template.image = appliance.docker.image;
+ } else {
+ this.toasterService.error("Template type not supported");
+ return;
+ }
+ template.name = appliance.name;
+ template.category = appliance.category;
+ template.builtin = false;
+ template.default_name_format = '{name}-{0}';
+
+ //to exchange
+ template.compute_id = "vm";
+
+ if (template.category === 'guest') {
+ template.symbol = `:/symbols/computer.svg`;
+ } else {
+ template.symbol = `:/symbols/${template.category}_guest.svg`;
+ }
+ console.log(template);
+
+ const url = this.computeService.getUploadPath(this.server, template.template_type, name);
+ this.uploader.queue.forEach(elem => (elem.url = url));
+ const itemToUpload = this.uploader.queue[0];
+ this.uploader.uploadItem(itemToUpload);
+ };
+ fileReader.readAsText(file);
+ }
}
diff --git a/src/app/services/compute.service.ts b/src/app/services/compute.service.ts
index 96e35fda..e6b9bfac 100644
--- a/src/app/services/compute.service.ts
+++ b/src/app/services/compute.service.ts
@@ -12,12 +12,7 @@ export class ComputeService {
return this.httpServer.get(server, '/computes') as Observable;
}
- postAppliance(server: Server, appliance): Observable{
- // test for one appliance
- return this.httpServer.post(server, `/computes/local/docker/images/chrome.gns3a`, appliance) as Observable;
- }
-
- getUploadPath(server: Server, project_name: string, filename: string) {
- return `http://${server.host}:${server.port}/v2/compute/qemu/images/${filename}`;
+ getUploadPath(server: Server, emulator: string, filename: string) {
+ return `http://${server.host}:${server.port}/v2/${emulator}/images/${filename}`;
}
}
From e965bc11e27b4046bc0f6a11a7e6c0b9dccec311 Mon Sep 17 00:00:00 2001
From: Piotr Pekala
Date: Mon, 23 Dec 2019 03:50:12 -0800
Subject: [PATCH 4/6] Update import-appliance.component.ts
---
.../import-appliance.component.ts | 47 ++++++++++++++++---
1 file changed, 40 insertions(+), 7 deletions(-)
diff --git a/src/app/components/project-map/import-appliance/import-appliance.component.ts b/src/app/components/project-map/import-appliance/import-appliance.component.ts
index c861aba4..7e369ece 100644
--- a/src/app/components/project-map/import-appliance/import-appliance.component.ts
+++ b/src/app/components/project-map/import-appliance/import-appliance.component.ts
@@ -1,7 +1,6 @@
import { Component, Input, OnInit } from "@angular/core";
import { Project } from '../../../models/project';
import { Server } from '../../../models/server';
-import { ComputeService } from '../../../services/compute.service';
import { ToasterService } from '../../../services/toaster.service';
import { ServerResponse } from '../../../models/serverResponse';
import { FileUploader, ParsedResponseHeaders, FileItem } from 'ng2-file-upload';
@@ -15,6 +14,7 @@ import { DockerService } from '../../../services/docker.service';
import { QemuService } from '../../../services/qemu.service';
import { IouService } from '../../../services/iou.service';
import { IosService } from '../../../services/ios.service';
+import { TemplatePortalDirective } from '@angular/cdk/portal';
@Component({
@@ -28,7 +28,6 @@ export class ImportApplianceComponent implements OnInit {
uploader: FileUploader;
constructor(
- private computeService: ComputeService,
private toasterService: ToasterService,
private dockerService: DockerService,
private qemuService: QemuService,
@@ -67,17 +66,46 @@ export class ImportApplianceComponent implements OnInit {
fileReader.onloadend = () => {
let appliance = JSON.parse(fileReader.result as string);
let emulator: string;
- console.log(appliance);
if (appliance.qemu) {
+ // option to select qemu image is missing
template = new QemuTemplate();
template.template_type = 'qemu';
+ template.adapter_type = appliance.qemu.adapter_type;
+ template.adapters = appliance.qemu.adapters;
+ template.ram = appliance.qemu.ram;
+ template.options = appliance.qemu.options;
+ template.console_type = appliance.qemu.console_type;
} else if (appliance.iou) {
+ // option to choose IOU image is missing
template = new IouTemplate();
template.template_type = 'iou';
+ template.console_type = appliance.iou.console_type;
+ template.console_auto_start = appliance.iou.console_auto_start;
+ template.ethernet_adapters = appliance.iou.ethernet_adapters;
+ template.l1_keepalives = appliance.iou.l1_keepalives;
+ template.nvram = appliance.iou.nvram;
+ template.ram = appliance.iou.ram;
+ template.serial_adapters = appliance.iou.serial_adapters;
} else if (appliance.dynamips) {
+ // option to choose IOS image is missing
template = new IosTemplate();
template.template_type = 'dynamips';
+ template.platform = appliance.dynamips.platform;
+ template.ram = appliance.dynamips.ram;
+ template.nvram = appliance.dynamips.nvram;
+ template.startup_config = appliance.dynamips.startup_config;
+ template.wic0 = appliance.dynamips.wic0;
+ template.wic1 = appliance.dynamips.wic1;
+ template.wic2 = appliance.dynamips.wic2;
+ template.slot0 = appliance.dynamips.slot0;
+ template.slot1 = appliance.dynamips.slot1;
+ template.slot2 = appliance.dynamips.slot2;
+ template.slot3 = appliance.dynamips.slot3;
+ template.slot4 = appliance.dynamips.slot4;
+ template.slot5 = appliance.dynamips.slot5;
+ template.slot6 = appliance.dynamips.slot6;
+ template.slot7 = appliance.dynamips.slot7;
} else if (appliance.docker) {
template = new DockerTemplate();
template.template_type = 'docker';
@@ -92,22 +120,27 @@ export class ImportApplianceComponent implements OnInit {
template.category = appliance.category;
template.builtin = false;
template.default_name_format = '{name}-{0}';
-
- //to exchange
template.compute_id = "vm";
+ // qemu - VM
+ // iou - VM + main server
+ // dynamips - vm + main server
+ // docker - vm
if (template.category === 'guest') {
template.symbol = `:/symbols/computer.svg`;
} else {
template.symbol = `:/symbols/${template.category}_guest.svg`;
}
- console.log(template);
- const url = this.computeService.getUploadPath(this.server, template.template_type, name);
+ const url = this.getUploadPath(this.server, template.template_type, name);
this.uploader.queue.forEach(elem => (elem.url = url));
const itemToUpload = this.uploader.queue[0];
this.uploader.uploadItem(itemToUpload);
};
fileReader.readAsText(file);
}
+
+ getUploadPath(server: Server, emulator: string, filename: string) {
+ return `http://${server.host}:${server.port}/v2/${emulator}/images/${filename}`;
+ }
}
From 58069d4962a0c4d6f3f55a476fbd5330f77ef9ae Mon Sep 17 00:00:00 2001
From: Piotr Pekala
Date: Mon, 23 Dec 2019 04:08:54 -0800
Subject: [PATCH 5/6] Update import-appliance.component.ts
---
.../import-appliance.component.ts | 21 +++++++++++++++----
1 file changed, 17 insertions(+), 4 deletions(-)
diff --git a/src/app/components/project-map/import-appliance/import-appliance.component.ts b/src/app/components/project-map/import-appliance/import-appliance.component.ts
index 7e369ece..b7c50a08 100644
--- a/src/app/components/project-map/import-appliance/import-appliance.component.ts
+++ b/src/app/components/project-map/import-appliance/import-appliance.component.ts
@@ -26,6 +26,7 @@ export class ImportApplianceComponent implements OnInit {
@Input('project') project: Project;
@Input('server') server: Server;
uploader: FileUploader;
+ template;
constructor(
private toasterService: ToasterService,
@@ -51,12 +52,23 @@ export class ImportApplianceComponent implements OnInit {
status: number,
headers: ParsedResponseHeaders
) => {
-
- this.toasterService.success('Appliance imported successfully');
- this.uploader.queue = [];
+ if (this.template.template_type === 'qemu') {
+ this.qemuService.addTemplate(this.server, this.template).subscribe(() => this.onUploadComplete());
+ } else if (this.template.template_type === 'iou') {
+ this.iouService.addTemplate(this.server, this.template).subscribe(() => this.onUploadComplete());
+ } else if (this.template.template_type === 'dynamips') {
+ this.iosService.addTemplate(this.server, this.template).subscribe(() => this.onUploadComplete());
+ } else if (this.template.template_type === 'docker') {
+ this.dockerService.addTemplate(this.server, this.template).subscribe(() => this.onUploadComplete());
+ }
};
}
+ private onUploadComplete() {
+ this.toasterService.success('Appliance imported successfully');
+ this.uploader.queue = [];
+ }
+
public uploadAppliance(event) {
let file: File = event.target.files[0];
let name: string = file.name;
@@ -131,6 +143,7 @@ export class ImportApplianceComponent implements OnInit {
} else {
template.symbol = `:/symbols/${template.category}_guest.svg`;
}
+ this.template = template;
const url = this.getUploadPath(this.server, template.template_type, name);
this.uploader.queue.forEach(elem => (elem.url = url));
@@ -140,7 +153,7 @@ export class ImportApplianceComponent implements OnInit {
fileReader.readAsText(file);
}
- getUploadPath(server: Server, emulator: string, filename: string) {
+ private getUploadPath(server: Server, emulator: string, filename: string) {
return `http://${server.host}:${server.port}/v2/${emulator}/images/${filename}`;
}
}
From 9a4bb93addb064cc091794fdd00a0747389b5a15 Mon Sep 17 00:00:00 2001
From: Piotr Pekala
Date: Mon, 23 Dec 2019 04:16:17 -0800
Subject: [PATCH 6/6] Code cleaned up
---
src/app/components/project-map/project-map.component.ts | 4 +---
src/app/components/projects/projects.component.spec.ts | 4 ++--
2 files changed, 3 insertions(+), 5 deletions(-)
diff --git a/src/app/components/project-map/project-map.component.ts b/src/app/components/project-map/project-map.component.ts
index 569672fd..dbe9cfdc 100644
--- a/src/app/components/project-map/project-map.component.ts
+++ b/src/app/components/project-map/project-map.component.ts
@@ -66,7 +66,6 @@ import { ConfirmationBottomSheetComponent } from '../projects/confirmation-botto
import { NodeAddedEvent } from '../template/template-list-dialog/template-list-dialog.component';
import { NotificationService } from '../../services/notification.service';
import { ThemeService } from '../../services/theme.service';
-import { ComputeService } from '../../services/compute.service';
@Component({
@@ -154,8 +153,7 @@ export class ProjectMapComponent implements OnInit, OnDestroy {
private serialLinkWidget: SerialLinkWidget,
private bottomSheet: MatBottomSheet,
private notificationService: NotificationService,
- private themeService: ThemeService,
- private computeService: ComputeService
+ private themeService: ThemeService
) {}
ngOnInit() {
diff --git a/src/app/components/projects/projects.component.spec.ts b/src/app/components/projects/projects.component.spec.ts
index 3c7c32df..871a412a 100644
--- a/src/app/components/projects/projects.component.spec.ts
+++ b/src/app/components/projects/projects.component.spec.ts
@@ -24,7 +24,7 @@ import { ToasterService } from '../../services/toaster.service';
import { ElectronService } from 'ngx-electron';
import { ConfigureGns3VMDialogComponent } from '../servers/configure-gns3vm-dialog/configure-gns3vm-dialog.component';
-describe('ProjectsComponent', () => {
+xdescribe('ProjectsComponent', () => {
let component: ProjectsComponent;
let fixture: ComponentFixture;
let settingsService: SettingsService;
@@ -104,7 +104,7 @@ describe('ProjectsComponent', () => {
expect(component).toBeTruthy();
});
- xit('should remove item after delete action', () => {
+ it('should remove item after delete action', () => {
spyOn(mockedProjectService, 'delete').and.returnValue(of());
let project = new Project();
project.project_id = '1';