Merge pull request #1356 from GNS3/enhancement/1353

Enhancement/1353
This commit is contained in:
Jeremy Grossmann
2022-07-23 00:41:15 +02:00
committed by GitHub
436 changed files with 4069 additions and 4064 deletions

View File

@ -2,7 +2,7 @@ name: Build
on: on:
push: push:
branches: branches:
- '**' - '**'
pull_request: pull_request:
branches: branches:
- master - master
@ -10,14 +10,17 @@ on:
jobs: jobs:
build: build:
runs-on: windows-latest runs-on: ubuntu-latest
strategy:
matrix:
node: [ 14, 16, 18 ]
name: Node ${{ matrix.node }}
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v3
- name: Setup node 14 - name: Setup ${{ matrix.node }}
uses: actions/setup-node@v2 uses: actions/setup-node@v3
with: with:
node-version: 14.x node-version: ${{ matrix.node }}
- uses: c-hive/gha-yarn-cache@v1 - uses: c-hive/gha-yarn-cache@v1
- name: Install JS dependencies - name: Install JS dependencies
run: yarn install run: yarn install

View File

@ -0,0 +1,43 @@
import { TestHelper } from './helpers/common.po';
import { ControllersPage } from './helpers/controller.po';
describe('Controllers page', () => {
let page: ControllersPage;
let helper: TestHelper;
beforeEach(() => {
page = new ControllersPage();
helper = new TestHelper();
});
xit('user should have possibility to add controller', async () => {
// arrange
page.maximizeWindow();
await page.navigateToControllersPage();
// act
let text = await page.getAddControllerNotificationText();
// assert
expect(text).toBe("We've discovered GNS3 controller on 127.0.0.1:3080, would you like to add to the list?");
});
it('user should see added controller in the list', async () => {
// arrange
page.maximizeWindow();
await page.navigateToControllersPage();
await page.clickAddController();
helper.sleep(1000);
// act
let firstRowOfControllersTable = await page.checkControllersTable();
let controllerData = [];
await helper.asyncForEach(firstRowOfControllersTable, async (element) => {
controllerData.push(await element.getText());
});
// assert
expect(controllerData).toContain('127.0.0.1');
expect(controllerData).toContain('3080');
});
});

View File

@ -1,41 +1,41 @@
import { browser, by } from 'protractor'; import { browser, by } from 'protractor';
import { TestHelper } from './common.po'; import { TestHelper } from './common.po';
export class ServersPage { export class ControllersPage {
helper = new TestHelper(); helper = new TestHelper();
maximizeWindow() { maximizeWindow() {
browser.driver.manage().window().maximize(); browser.driver.manage().window().maximize();
} }
navigateToServersPage() { navigateToControllersPage() {
return browser.get('/servers'); return browser.get('/controllers');
} }
getAddServerNotificationText() { getAddControllerNotificationText() {
return browser.driver.findElement(by.className('mat-card-content')).getText(); return browser.driver.findElement(by.className('mat-card-content')).getText();
} }
async clickAddServer() { async clickAddController() {
let serversTable = await this.checkServersTable(); let controllerTable = await this.checkControllersTable();
if (serversTable.length === 0) { if (controllerTable.length === 0) {
let buttons = await browser.driver.findElements(by.className('mat-button mat-button-base')); let buttons = await browser.driver.findElements(by.className('mat-button mat-button-base'));
await buttons[3].click(); await buttons[3].click();
} }
} }
checkServersTable() { checkControllersTable() {
return browser.driver.findElements(by.css('mat-cell')); return browser.driver.findElements(by.css('mat-cell'));
} }
async navigateToServerProjects() { async navigateToControllerProjects() {
this.helper.sleep(2000); this.helper.sleep(2000);
let hyperlinks = await browser.driver.findElements(by.css('a.table-link')); let hyperlinks = await browser.driver.findElements(by.css('a.table-link'));
let serverLink; let controllerLink;
await this.helper.asyncForEach(hyperlinks, async (element) => { await this.helper.asyncForEach(hyperlinks, async (element) => {
let text = await element.getText(); let text = await element.getText();
if (text === '127.0.0.1') serverLink = element; if (text === '127.0.0.1') controllerLink = element;
}); });
await serverLink.click(); await controllerLink.click();
} }
} }

View File

@ -1,24 +1,24 @@
import { TestHelper } from './helpers/common.po'; import { TestHelper } from './helpers/common.po';
import { ProjectMapPage } from './helpers/project-map.po'; import { ProjectMapPage } from './helpers/project-map.po';
import { ProjectsPage } from './helpers/project.po'; import { ProjectsPage } from './helpers/project.po';
import { ServersPage } from './helpers/server.po'; import { ControllersPage } from './helpers/controller.po';
describe('Project map page', () => { describe('Project map page', () => {
let serversPage: ServersPage; let controllersPage: ControllersPage;
let projectsPage: ProjectsPage; let projectsPage: ProjectsPage;
let projectMapPage: ProjectMapPage; let projectMapPage: ProjectMapPage;
let helper: TestHelper; let helper: TestHelper;
beforeEach(async () => { beforeEach(async () => {
serversPage = new ServersPage(); controllersPage = new ControllersPage();
projectsPage = new ProjectsPage(); projectsPage = new ProjectsPage();
projectMapPage = new ProjectMapPage(); projectMapPage = new ProjectMapPage();
helper = new TestHelper(); helper = new TestHelper();
serversPage.maximizeWindow(); controllersPage.maximizeWindow();
await serversPage.navigateToServersPage(); await controllersPage.navigateToControllersPage();
await serversPage.clickAddServer(); await controllersPage.clickAddController();
await serversPage.navigateToServerProjects(); await controllersPage.navigateToControllerProjects();
await projectsPage.openAddProjectDialog(); await projectsPage.openAddProjectDialog();
helper.sleep(2000); helper.sleep(2000);
await projectsPage.createProject(); await projectsPage.createProject();

View File

@ -1,24 +1,24 @@
import { TestHelper } from './helpers/common.po'; import { TestHelper } from './helpers/common.po';
import { ProjectsPage } from './helpers/project.po'; import { ProjectsPage } from './helpers/project.po';
import { ServersPage } from './helpers/server.po'; import { ControllersPage } from './helpers/controller.po';
describe('Projects page', () => { describe('Projects page', () => {
let serversPage: ServersPage; let controllersPage: ControllersPage;
let projectsPage: ProjectsPage; let projectsPage: ProjectsPage;
let helper: TestHelper; let helper: TestHelper;
beforeEach(() => { beforeEach(() => {
serversPage = new ServersPage(); controllersPage = new ControllersPage();
projectsPage = new ProjectsPage(); projectsPage = new ProjectsPage();
helper = new TestHelper(); helper = new TestHelper();
}); });
it('user should have possibility to create new project', async () => { it('user should have possibility to create new project', async () => {
// arrange // arrange
serversPage.maximizeWindow(); controllersPage.maximizeWindow();
await serversPage.navigateToServersPage(); await controllersPage.navigateToControllersPage();
await serversPage.clickAddServer(); await controllersPage.clickAddController();
await serversPage.navigateToServerProjects(); await controllersPage.navigateToControllerProjects();
helper.sleep(2000); helper.sleep(2000);
//act //act
@ -28,6 +28,6 @@ describe('Projects page', () => {
helper.sleep(2000); helper.sleep(2000);
//assert //assert
expect(helper.getCurrentUrl()).toMatch('server/1/project/'); expect(helper.getCurrentUrl()).toMatch('controller/1/project/');
}); });
}); });

View File

@ -1,43 +0,0 @@
import { TestHelper } from './helpers/common.po';
import { ServersPage } from './helpers/server.po';
describe('Servers page', () => {
let page: ServersPage;
let helper: TestHelper;
beforeEach(() => {
page = new ServersPage();
helper = new TestHelper();
});
xit('user should have possibility to add server', async () => {
// arrange
page.maximizeWindow();
await page.navigateToServersPage();
// act
let text = await page.getAddServerNotificationText();
// assert
expect(text).toBe("We've discovered GNS3 server on 127.0.0.1:3080, would you like to add to the list?");
});
it('user should see added server in the list', async () => {
// arrange
page.maximizeWindow();
await page.navigateToServersPage();
await page.clickAddServer();
helper.sleep(1000);
// act
let firstRowOfServersTable = await page.checkServersTable();
let serverData = [];
await helper.asyncForEach(firstRowOfServersTable, async (element) => {
serverData.push(await element.getText());
});
// assert
expect(serverData).toContain('127.0.0.1');
expect(serverData).toContain('3080');
});
});

View File

@ -15,7 +15,7 @@ files:
- renderer.js - renderer.js
- sentry.js - sentry.js
- installed-software.js - installed-software.js
- local-server.js - local-controller.js
- console-executor.js - console-executor.js
- package.json - package.json

View File

@ -8,9 +8,9 @@ const { app } = require('electron')
const isWin = /^win/.test(process.platform); const isWin = /^win/.test(process.platform);
let runningServers = {}; let runningControllers = {};
exports.getLocalServerPath = async () => { exports.getLocalControllerPath = async () => {
let binary = isWin ? 'gns3server.exe': 'gns3server'; let binary = isWin ? 'gns3server.exe': 'gns3server';
return findBinary('exe.', binary); return findBinary('exe.', binary);
} }
@ -20,27 +20,27 @@ exports.getUbridgePath = async () => {
return findBinary('ubridge', binary); return findBinary('ubridge', binary);
} }
exports.startLocalServer = async (server) => { exports.startLocalController = async (controller) => {
return await run(server, { return await run(controller, {
logStdout: true logStdout: true
}); });
} }
exports.stopLocalServer = async (server) => { exports.stopLocalController = async (controller) => {
return await stop(server.name); return await stop(controller.name);
} }
exports.getRunningServers = () => { exports.getRunningControllers = () => {
return Object.keys(runningServers); return Object.keys(runningControllers);
} }
exports.stopAllLocalServers = async () => { exports.stopAllLocalControllers = async () => {
return await stopAll(); return await stopAll();
} }
async function findBinary(binaryDirectory, filename) { async function findBinary(binaryDirectory, filename) {
const lookupDirectories = [ const lookupDirectories = [
__dirname, __dirname,
path.dirname(app.getPath('exe')) path.dirname(app.getPath('exe'))
]; ];
@ -60,7 +60,7 @@ async function findBinaryInDirectory(baseDirectory, binaryDirectory, filename) {
} }
const files = fs.readdirSync(distDirectory); const files = fs.readdirSync(distDirectory);
let binaryPath = null; let binaryPath = null;
files.forEach((directory) => { files.forEach((directory) => {
@ -77,33 +77,33 @@ async function findBinaryInDirectory(baseDirectory, binaryDirectory, filename) {
} }
function getServerArguments(server, overrides, configPath) { function getControllerArguments(controller, overrides, configPath) {
let serverArguments = []; let controllerArguments = [];
if(server.host) { if(controller.host) {
serverArguments.push('--host'); controllerArguments.push('--host');
serverArguments.push(server.host); controllerArguments.push(controller.host);
} }
if(server.port) { if(controller.port) {
serverArguments.push('--port'); controllerArguments.push('--port');
serverArguments.push(server.port); controllerArguments.push(controller.port);
} }
serverArguments.push('--local'); controllerArguments.push('--local');
if(configPath) { if(configPath) {
serverArguments.push('--config'); controllerArguments.push('--config');
serverArguments.push(configPath); controllerArguments.push(configPath);
} }
return serverArguments; return controllerArguments;
} }
function getChannelForServer(server) { function getChannelForController(controller) {
return `local-server-run-${server.name}`; return `local-controller-run-${controller.name}`;
} }
function notifyStatus(status) { function notifyStatus(status) {
ipcMain.emit('local-server-status-events', status); ipcMain.emit('local-controller-status-events', status);
} }
function filterOutput(line) { function filterOutput(line) {
@ -120,44 +120,44 @@ function filterOutput(line) {
} }
async function stopAll() { async function stopAll() {
for(var serverName in runningServers) { for(var controllerName in runningControllers) {
let result, error = await stop(serverName); let result, error = await stop(controllerName);
} }
console.log(`Stopped all servers`); console.log(`Stopped all controllers`);
} }
async function stop(serverName) { async function stop(controllerName) {
let pid = undefined; let pid = undefined;
const runningServer = runningServers[serverName]; const runningController = runningControllers[controllerName];
if(runningServer !== undefined && runningServer.process) { if(runningController !== undefined && runningController.process) {
pid = runningServer.process.pid; pid = runningController.process.pid;
} }
console.log(`Stopping '${serverName}' with PID='${pid}'`); console.log(`Stopping '${controllerName}' with PID='${pid}'`);
const stopped = new Promise((resolve, reject) => { const stopped = new Promise((resolve, reject) => {
if(pid === undefined) { if(pid === undefined) {
resolve(`Server '${serverName} is already stopped`); resolve(`Controller '${controllerName} is already stopped`);
delete runningServers[serverName]; delete runningControllers[controllerName];
return; return;
} }
kill(pid, (error) => { kill(pid, (error) => {
if(error) { if(error) {
console.error(`Error occured during stopping '${serverName}' with PID='${pid}'`); console.error(`Error occured during stopping '${controllerName}' with PID='${pid}'`);
reject(error); reject(error);
} }
else { else {
delete runningServers[serverName]; delete runningControllers[controllerName];
console.log(`Stopped '${serverName}' with PID='${pid}'`); console.log(`Stopped '${controllerName}' with PID='${pid}'`);
resolve(`Stopped '${serverName}' with PID='${pid}'`); resolve(`Stopped '${controllerName}' with PID='${pid}'`);
notifyStatus({ notifyStatus({
serverName: serverName, controllerName: controllerName,
status: 'stopped', status: 'stopped',
message: `Server '${serverName}' stopped'` message: `Controller '${controllerName}' stopped'`
}); });
} }
}); });
@ -166,11 +166,11 @@ async function stop(serverName) {
return stopped; return stopped;
} }
async function getIniFile(server) { async function getIniFile(controller) {
return path.join(app.getPath('userData'), `gns3_server_${server.id}.ini`); return path.join(app.getPath('userData'), `gns3_controller_${controller.id}.ini`);
} }
async function configure(configPath, server) { async function configure(configPath, controller) {
if(!fs.existsSync(configPath)) { if(!fs.existsSync(configPath)) {
fs.closeSync(fs.openSync(configPath, 'w')); fs.closeSync(fs.openSync(configPath, 'w'));
console.log(`Configuration file '${configPath}' has been created.`); console.log(`Configuration file '${configPath}' has been created.`);
@ -178,20 +178,20 @@ async function configure(configPath, server) {
var config = ini.parse(fs.readFileSync(configPath, 'utf-8')); var config = ini.parse(fs.readFileSync(configPath, 'utf-8'));
if(server.path) { if(controller.path) {
config.path = server.path; config.path = controller.path;
} }
if(server.host) { if(controller.host) {
config.host = server.host; config.host = controller.host;
} }
if(server.port) { if(controller.port) {
config.port = server.port; config.port = controller.port;
} }
if(server.ubridge_path) { if(controller.ubridge_path) {
config.ubridge_path = server.ubridge_path; config.ubridge_path = controller.ubridge_path;
} }
fs.writeFileSync(configPath, ini.stringify(config, { section: 'Server' })); fs.writeFileSync(configPath, ini.stringify(config, { section: 'Controller' }));
} }
async function setPATHEnv() { async function setPATHEnv() {
@ -216,7 +216,7 @@ async function setPATHEnv() {
process.env.PATH = extra.join(";"); process.env.PATH = extra.join(";");
} }
async function run(server, options) { async function run(controller, options) {
if(!options) { if(!options) {
options = {}; options = {};
} }
@ -226,34 +226,34 @@ async function run(server, options) {
console.log(`Configuring`); console.log(`Configuring`);
const configPath = await getIniFile(server); const configPath = await getIniFile(controller);
await configure(configPath, server); await configure(configPath, controller);
console.log(`Setting up PATH`); console.log(`Setting up PATH`);
await setPATHEnv(); await setPATHEnv();
console.log(`Running '${server.path}'`); console.log(`Running '${controller.path}'`);
let serverProcess = spawn(server.path, getServerArguments(server, {}, configPath)); let controllerProcess = spawn(controller.path, getControllerArguments(controller, {}, configPath));
notifyStatus({ notifyStatus({
serverName: server.name, controllerName: controller.name,
status: 'started', status: 'started',
message: `Server '${server.name}' started'` message: `Controller '${controller.name}' started'`
}); });
runningServers[server.name] = { runningControllers[controller.name] = {
process: serverProcess process: controllerProcess
}; };
serverProcess.stdout.on('data', function(data) { controllerProcess.stdout.on('data', function(data) {
const line = data.toString(); const line = data.toString();
const { isCritical, errorMessage } = filterOutput(line); const { isCritical, errorMessage } = filterOutput(line);
if(isCritical) { if(isCritical) {
notifyStatus({ notifyStatus({
serverName: server.name, controllerName: controller.name,
status: 'stderr', status: 'stderr',
message: `Server reported error: '${errorMessage}` message: `Controller reported error: '${errorMessage}`
}); });
} }
@ -262,25 +262,25 @@ async function run(server, options) {
} }
}); });
serverProcess.stderr.on('data', function(data) { controllerProcess.stderr.on('data', function(data) {
if(logSterr) { if(logSterr) {
console.log(data.toString()); console.log(data.toString());
} }
}); });
serverProcess.on('exit', (code, signal) => { controllerProcess.on('exit', (code, signal) => {
notifyStatus({ notifyStatus({
serverName: server.name, controllerName: controller.name,
status: 'errored', status: 'errored',
message: `Server '${server.name}' has exited with status='${code}'` message: `controller '${controller.name}' has exited with status='${code}'`
}); });
}); });
serverProcess.on('error', (err) => { controllerProcess.on('error', (err) => {
notifyStatus({ notifyStatus({
serverName: server.name, controllerName: controller.name,
status: 'errored', status: 'errored',
message: `Server errored: '${err}` message: `Controller errored: '${err}`
}); });
}); });
@ -297,9 +297,9 @@ async function main() {
} }
if(ipcMain) { if(ipcMain) {
ipcMain.on('local-server-run', async function (event, server) { ipcMain.on('local-controller-run', async function (event, controller) {
const responseChannel = getChannelForServer(); const responseChannel = getChannelForController();
await run(server); await run(controller);
event.sender.send(responseChannel, { event.sender.send(responseChannel, {
success: true success: true
}); });
@ -318,4 +318,4 @@ if (require.main === module) {
}); });
main(); main();
} }

View File

@ -67,7 +67,7 @@ GNS3 Web UI 2020.2.0-beta.4
Bug Fixes Bug Fixes
- New port setting for GNS3 VM preferences - New port setting for GNS3 VM preferences
- Option to auto-hide menu toolbar on the left side - Option to auto-hide menu toolbar on the left side
- Server type in template preferences -Controller type in template preferences
- Error when selecting existing Docker image - Error when selecting existing Docker image
- Default values in templates - Default values in templates
- TypeError: Cannot read property 'message' of undefined - TypeError: Cannot read property 'message' of undefined

View File

@ -1,6 +1,6 @@
import { NgModule } from '@angular/core'; import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router'; import { RouterModule, Routes } from '@angular/router';
import { BundledServerFinderComponent } from './components/bundled-server-finder/bundled-server-finder.component'; import { BundledControllerFinderComponent } from './components/bundled-controller-finder/bundled-controller-finder.component';
import { DirectLinkComponent } from './components/direct-link/direct-link.component'; import { DirectLinkComponent } from './components/direct-link/direct-link.component';
import { HelpComponent } from './components/help/help.component'; import { HelpComponent } from './components/help/help.component';
import { InstalledSoftwareComponent } from './components/installed-software/installed-software.component'; import { InstalledSoftwareComponent } from './components/installed-software/installed-software.component';
@ -44,7 +44,7 @@ import { VpcsTemplateDetailsComponent } from './components/preferences/vpcs/vpcs
import { VpcsTemplatesComponent } from './components/preferences/vpcs/vpcs-templates/vpcs-templates.component'; import { VpcsTemplatesComponent } from './components/preferences/vpcs/vpcs-templates/vpcs-templates.component';
import { ProjectMapComponent } from './components/project-map/project-map.component'; import { ProjectMapComponent } from './components/project-map/project-map.component';
import { ProjectsComponent } from './components/projects/projects.component'; import { ProjectsComponent } from './components/projects/projects.component';
import { ServersComponent } from './components/servers/servers.component'; import { ControllersComponent } from './components/controllers/controllers.component';
import { ConsoleComponent } from './components/settings/console/console.component'; import { ConsoleComponent } from './components/settings/console/console.component';
import { SettingsComponent } from './components/settings/settings.component'; import { SettingsComponent } from './components/settings/settings.component';
import { ListOfSnapshotsComponent } from './components/snapshots/list-of-snapshots/list-of-snapshots.component'; import { ListOfSnapshotsComponent } from './components/snapshots/list-of-snapshots/list-of-snapshots.component';
@ -53,7 +53,7 @@ import { WebConsoleFullWindowComponent } from './components/web-console-full-win
import { ConsoleGuard } from './guards/console-guard'; import { ConsoleGuard } from './guards/console-guard';
import { LoginGuard } from './guards/login-guard'; import { LoginGuard } from './guards/login-guard';
import { DefaultLayoutComponent } from './layouts/default-layout/default-layout.component'; import { DefaultLayoutComponent } from './layouts/default-layout/default-layout.component';
import { ServerResolve } from './resolvers/server-resolve'; import { ControllerResolve } from './resolvers/controller-resolve';
import { UserManagementComponent } from './components/user-management/user-management.component'; import { UserManagementComponent } from './components/user-management/user-management.component';
import { LoggedUserComponent } from './components/users/logged-user/logged-user.component'; import { LoggedUserComponent } from './components/users/logged-user/logged-user.component';
import { ImageManagerComponent } from './components/image-manager/image-manager.component'; import { ImageManagerComponent } from './components/image-manager/image-manager.component';
@ -80,151 +80,150 @@ const routes: Routes = [
path: '', path: '',
component: DefaultLayoutComponent, component: DefaultLayoutComponent,
children: [ children: [
{ path: '', redirectTo: 'servers', pathMatch: 'full' }, { path: '', redirectTo: 'controllers', pathMatch: 'full' },
{ path: 'servers', component: ServersComponent }, { path: 'controllers', component: ControllersComponent },
{ path: 'bundled', component: BundledServerFinderComponent }, { path: 'bundled', component: BundledControllerFinderComponent },
{ path: 'server/:server_id/login', component: LoginComponent }, { path: 'controller/:controller_id/login', component: LoginComponent },
{ path: 'server/:server_id/loggeduser', component: LoggedUserComponent }, { path: 'controller/:controller_id/loggeduser', component: LoggedUserComponent },
{path : 'server/:server_id/image-manager', component: ImageManagerComponent}, {path : 'controller/:controller_id/image-manager', component: ImageManagerComponent},
{ {
path: 'server/:server_id/projects', path: 'controller/:controller_id/projects',
component: ProjectsComponent, component: ProjectsComponent,
canActivate: [LoginGuard], canActivate: [LoginGuard],
resolve: { server: ServerResolve }, resolve: { controller: ControllerResolve },
}, },
{ path: 'help', component: HelpComponent }, { path: 'help', component: HelpComponent },
{ path: 'settings', component: SettingsComponent }, { path: 'settings', component: SettingsComponent },
{ path: 'settings/console', component: ConsoleComponent }, { path: 'settings/console', component: ConsoleComponent },
{ {
path: 'server/:server_id/management/users/:user_id', path: 'controller/:controller_id/management/users/:user_id',
component: UserDetailComponent, component: UserDetailComponent,
canActivate: [LoginGuard], canActivate: [LoginGuard],
resolve: { resolve: {
user: UserDetailResolver, user: UserDetailResolver,
groups: UserGroupsResolver, groups: UserGroupsResolver,
permissions: UserPermissionsResolver, permissions: UserPermissionsResolver,
server: ServerResolve}, controller: ControllerResolve},
}, },
{ path: 'installed-software', component: InstalledSoftwareComponent }, { path: 'installed-software', component: InstalledSoftwareComponent },
{ path: 'server/:server_id/systemstatus', component: SystemStatusComponent, canActivate: [LoginGuard] }, { path: 'controller/:controller_id/systemstatus', component: SystemStatusComponent, canActivate: [LoginGuard] },
{ path: 'server/:server_ip/:server_port/project/:project_id', component: DirectLinkComponent, canActivate: [LoginGuard] }, { path: 'controller/:controller_ip/:controller_port/project/:project_id', component: DirectLinkComponent, canActivate: [LoginGuard] },
{ {
path: 'server/:server_id/project/:project_id/snapshots', path: 'controller/:controller_id/project/:project_id/snapshots',
component: ListOfSnapshotsComponent, component: ListOfSnapshotsComponent,
canActivate: [LoginGuard], canActivate: [LoginGuard],
resolve: { server: ServerResolve }, resolve: { controller: ControllerResolve },
}, },
{ path: 'server/:server_id/preferences', component: PreferencesComponent, canActivate: [LoginGuard] }, { path: 'controller/:controller_id/preferences', component: PreferencesComponent, canActivate: [LoginGuard] },
// { path: 'server/:server_id/preferences/general', component: GeneralPreferencesComponent }, // { path: 'controller/:controller_id/preferences/general', component: GeneralPreferencesComponent },
{ path: 'server/:server_id/preferences/builtin', component: BuiltInPreferencesComponent, canActivate: [LoginGuard] }, { path: 'controller/:controller_id/preferences/builtin', component: BuiltInPreferencesComponent, canActivate: [LoginGuard] },
{ path: 'server/:server_id/preferences/builtin/ethernet-hubs', component: EthernetHubsTemplatesComponent, canActivate: [LoginGuard] }, { path: 'controller/:controller_id/preferences/builtin/ethernet-hubs', component: EthernetHubsTemplatesComponent, canActivate: [LoginGuard] },
{ {
path: 'server/:server_id/preferences/builtin/ethernet-hubs/addtemplate', path: 'controller/:controller_id/preferences/builtin/ethernet-hubs/addtemplate',
component: EthernetHubsAddTemplateComponent, component: EthernetHubsAddTemplateComponent,
canActivate: [LoginGuard] canActivate: [LoginGuard]
}, },
{ {
path: 'server/:server_id/preferences/builtin/ethernet-hubs/:template_id', path: 'controller/:controller_id/preferences/builtin/ethernet-hubs/:template_id',
component: EthernetHubsTemplateDetailsComponent, component: EthernetHubsTemplateDetailsComponent,
canActivate: [LoginGuard] canActivate: [LoginGuard]
}, },
{ {
path: 'server/:server_id/preferences/builtin/ethernet-switches', path: 'controller/:controller_id/preferences/builtin/ethernet-switches',
component: EthernetSwitchesTemplatesComponent, component: EthernetSwitchesTemplatesComponent,
canActivate: [LoginGuard] canActivate: [LoginGuard]
}, },
{ {
path: 'server/:server_id/preferences/builtin/ethernet-switches/addtemplate', path: 'controller/:controller_id/preferences/builtin/ethernet-switches/addtemplate',
component: EthernetSwitchesAddTemplateComponent, component: EthernetSwitchesAddTemplateComponent,
canActivate: [LoginGuard] canActivate: [LoginGuard]
}, },
{ {
path: 'server/:server_id/preferences/builtin/ethernet-switches/:template_id', path: 'controller/:controller_id/preferences/builtin/ethernet-switches/:template_id',
component: EthernetSwitchesTemplateDetailsComponent, component: EthernetSwitchesTemplateDetailsComponent,
canActivate: [LoginGuard] canActivate: [LoginGuard]
}, },
{ path: 'server/:server_id/preferences/builtin/cloud-nodes', component: CloudNodesTemplatesComponent, canActivate: [LoginGuard] }, { path: 'controller/:controller_id/preferences/builtin/cloud-nodes', component: CloudNodesTemplatesComponent, canActivate: [LoginGuard] },
{ {
path: 'server/:server_id/preferences/builtin/cloud-nodes/addtemplate', path: 'controller/:controller_id/preferences/builtin/cloud-nodes/addtemplate',
component: CloudNodesAddTemplateComponent, component: CloudNodesAddTemplateComponent,
canActivate: [LoginGuard] canActivate: [LoginGuard]
}, },
{ {
path: 'server/:server_id/preferences/builtin/cloud-nodes/:template_id', path: 'controller/:controller_id/preferences/builtin/cloud-nodes/:template_id',
component: CloudNodesTemplateDetailsComponent, component: CloudNodesTemplateDetailsComponent,
canActivate: [LoginGuard] canActivate: [LoginGuard]
}, },
//{ path: 'server/:server_id/preferences/dynamips', component: DynamipsPreferencesComponent }, //{ path: 'controller/:controller_id/preferences/dynamips', component: DynamipsPreferencesComponent },
{ path: 'server/:server_id/preferences/dynamips/templates', component: IosTemplatesComponent, canActivate: [LoginGuard] }, { path: 'controller/:controller_id/preferences/dynamips/templates', component: IosTemplatesComponent, canActivate: [LoginGuard] },
{ path: 'server/:server_id/preferences/dynamips/templates/addtemplate', component: AddIosTemplateComponent, canActivate: [LoginGuard] }, { path: 'controller/:controller_id/preferences/dynamips/templates/addtemplate', component: AddIosTemplateComponent, canActivate: [LoginGuard] },
{ path: 'server/:server_id/preferences/dynamips/templates/:template_id', component: IosTemplateDetailsComponent, canActivate: [LoginGuard] }, { path: 'controller/:controller_id/preferences/dynamips/templates/:template_id', component: IosTemplateDetailsComponent, canActivate: [LoginGuard] },
{ {
path: 'server/:server_id/preferences/dynamips/templates/:template_id/copy', path: 'controller/:controller_id/preferences/dynamips/templates/:template_id/copy',
component: CopyIosTemplateComponent, component: CopyIosTemplateComponent,
canActivate: [LoginGuard] canActivate: [LoginGuard]
}, },
// { path: 'server/:server_id/preferences/qemu', component: QemuPreferencesComponent }, // { path: 'controller/:controller_id/preferences/qemu', component: QemuPreferencesComponent },
{ path: 'server/:server_id/preferences/qemu/templates', component: QemuVmTemplatesComponent, canActivate: [LoginGuard] }, { path: 'controller/:controller_id/preferences/qemu/templates', component: QemuVmTemplatesComponent, canActivate: [LoginGuard] },
{ {
path: 'server/:server_id/preferences/qemu/templates/:template_id/copy', path: 'controller/:controller_id/preferences/qemu/templates/:template_id/copy',
component: CopyQemuVmTemplateComponent, component: CopyQemuVmTemplateComponent,
canActivate: [LoginGuard] canActivate: [LoginGuard]
}, },
{ path: 'server/:server_id/preferences/qemu/templates/:template_id', component: QemuVmTemplateDetailsComponent, canActivate: [LoginGuard] }, { path: 'controller/:controller_id/preferences/qemu/templates/:template_id', component: QemuVmTemplateDetailsComponent, canActivate: [LoginGuard] },
{ path: 'server/:server_id/preferences/qemu/addtemplate', component: AddQemuVmTemplateComponent, canActivate: [LoginGuard] }, { path: 'controller/:controller_id/preferences/qemu/addtemplate', component: AddQemuVmTemplateComponent, canActivate: [LoginGuard] },
// { path: 'server/:server_id/preferences/vpcs', component: VpcsPreferencesComponent }, // { path: 'controller/:controller_id/preferences/vpcs', component: VpcsPreferencesComponent },
{ path: 'server/:server_id/preferences/vpcs/templates', component: VpcsTemplatesComponent, canActivate: [LoginGuard] }, { path: 'controller/:controller_id/preferences/vpcs/templates', component: VpcsTemplatesComponent, canActivate: [LoginGuard] },
{ path: 'server/:server_id/preferences/vpcs/templates/:template_id', component: VpcsTemplateDetailsComponent, canActivate: [LoginGuard] }, { path: 'controller/:controller_id/preferences/vpcs/templates/:template_id', component: VpcsTemplateDetailsComponent, canActivate: [LoginGuard] },
{ path: 'server/:server_id/preferences/vpcs/addtemplate', component: AddVpcsTemplateComponent, canActivate: [LoginGuard] }, { path: 'controller/:controller_id/preferences/vpcs/addtemplate', component: AddVpcsTemplateComponent, canActivate: [LoginGuard] },
// { path: 'server/:server_id/preferences/virtualbox', component: VirtualBoxPreferencesComponent }, // { path: 'controller/:controller_id/preferences/virtualbox', component: VirtualBoxPreferencesComponent },
{ path: 'server/:server_id/preferences/virtualbox/templates', component: VirtualBoxTemplatesComponent, canActivate: [LoginGuard] }, { path: 'controller/:controller_id/preferences/virtualbox/templates', component: VirtualBoxTemplatesComponent, canActivate: [LoginGuard] },
{ {
path: 'server/:server_id/preferences/virtualbox/templates/:template_id', path: 'controller/:controller_id/preferences/virtualbox/templates/:template_id',
component: VirtualBoxTemplateDetailsComponent, component: VirtualBoxTemplateDetailsComponent,
canActivate: [LoginGuard] canActivate: [LoginGuard]
}, },
{ path: 'server/:server_id/preferences/virtualbox/addtemplate', component: AddVirtualBoxTemplateComponent, canActivate: [LoginGuard] }, { path: 'controller/:controller_id/preferences/virtualbox/addtemplate', component: AddVirtualBoxTemplateComponent, canActivate: [LoginGuard] },
// { path: 'server/:server_id/preferences/vmware', component: VmwarePreferencesComponent }, // { path: 'controller/:controller_id/preferences/vmware', component: VmwarePreferencesComponent },
{ path: 'server/:server_id/preferences/vmware/templates', component: VmwareTemplatesComponent, canActivate: [LoginGuard] }, { path: 'controller/:controller_id/preferences/vmware/templates', component: VmwareTemplatesComponent, canActivate: [LoginGuard] },
{ {
path: 'server/:server_id/preferences/vmware/templates/:template_id', path: 'controller/:controller_id/preferences/vmware/templates/:template_id',
component: VmwareTemplateDetailsComponent, component: VmwareTemplateDetailsComponent,
canActivate: [LoginGuard] canActivate: [LoginGuard]
}, },
{ path: 'server/:server_id/preferences/vmware/addtemplate', component: AddVmwareTemplateComponent, canActivate: [LoginGuard] }, { path: 'controller/:controller_id/preferences/vmware/addtemplate', component: AddVmwareTemplateComponent, canActivate: [LoginGuard] },
{ path: 'server/:server_id/preferences/docker/templates', component: DockerTemplatesComponent, canActivate: [LoginGuard] }, { path: 'controller/:controller_id/preferences/docker/templates', component: DockerTemplatesComponent, canActivate: [LoginGuard] },
{ {
path: 'server/:server_id/preferences/docker/templates/:template_id', path: 'controller/:controller_id/preferences/docker/templates/:template_id',
component: DockerTemplateDetailsComponent, component: DockerTemplateDetailsComponent,
canActivate: [LoginGuard] canActivate: [LoginGuard]
}, },
{ {
path: 'server/:server_id/preferences/docker/templates/:template_id/copy', path: 'controller/:controller_id/preferences/docker/templates/:template_id/copy',
component: CopyDockerTemplateComponent, component: CopyDockerTemplateComponent,
canActivate: [LoginGuard] canActivate: [LoginGuard]
}, },
{ path: 'server/:server_id/preferences/docker/addtemplate', component: AddDockerTemplateComponent, canActivate: [LoginGuard] }, { path: 'controller/:controller_id/preferences/docker/addtemplate', component: AddDockerTemplateComponent, canActivate: [LoginGuard] },
{ path: 'controller/:controller_id/preferences/iou/templates', component: IouTemplatesComponent, canActivate: [LoginGuard] },
{ path: 'server/:server_id/preferences/iou/templates', component: IouTemplatesComponent, canActivate: [LoginGuard] }, { path: 'controller/:controller_id//preferences/iou/templates/:template_id', component: IouTemplateDetailsComponent, canActivate: [LoginGuard] },
{ path: 'server/:server_id/preferences/iou/templates/:template_id', component: IouTemplateDetailsComponent, canActivate: [LoginGuard] },
{ {
path: 'server/:server_id/preferences/iou/templates/:template_id/copy', path: 'controller/:controller_id/preferences/iou/templates/:template_id/copy',
component: CopyIouTemplateComponent, component: CopyIouTemplateComponent,
canActivate: [LoginGuard] canActivate: [LoginGuard]
}, },
{ path: 'server/:server_id/preferences/iou/addtemplate', component: AddIouTemplateComponent, canActivate: [LoginGuard] }, { path: 'controller/:controller_id/preferences/iou/addtemplate', component: AddIouTemplateComponent, canActivate: [LoginGuard] },
{ {
path: 'server/:server_id/management', path: 'controller/:controller_id/management',
component: ManagementComponent, component: ManagementComponent,
children: [ children: [
{ {
@ -239,63 +238,64 @@ const routes: Routes = [
path: 'roles', path: 'roles',
component: RoleManagementComponent component: RoleManagementComponent
}, },
{path: 'permissions', {
component: PermissionsManagementComponent path: 'permissions',
component: PermissionsManagementComponent
} }
] ]
}, },
{ {
path: 'server/:server_id/management/groups/:user_group_id', path: 'controller/:controller_id/management/groups/:user_group_id',
component: GroupDetailsComponent, component: GroupDetailsComponent,
resolve: { resolve: {
members: GroupMembersResolver, members: GroupMembersResolver,
server: ServerResolve, controller: ControllerResolve,
group: GroupResolver, group: GroupResolver,
roles: GroupRoleResolver roles: GroupRoleResolver
} }
}, },
{ {
path: 'server/:server_id/management/roles/:role_id', path: 'controller/:controller_id/management/roles/:role_id',
component: RoleDetailComponent, component: RoleDetailComponent,
resolve: { resolve: {
role: RoleDetailResolver, role: RoleDetailResolver,
server: ServerResolve controller: ControllerResolve
} }
}, },
{ {
path: 'server/:server_id/management/roles/:role_id/permissions', path: 'controller/:controller_id/management/roles/:role_id/permissions',
component: RolePermissionsComponent, component: RolePermissionsComponent,
resolve: { resolve: {
role: RoleDetailResolver, role: RoleDetailResolver,
server: ServerResolve, controller: ControllerResolve,
permissions: PermissionResolver permissions: PermissionResolver
} }
}, },
{ {
path: 'server/:server_id/management/users/:user_id/permissions', path: 'controller/:controller_id/management/users/:user_id/permissions',
component: UserPermissionsComponent, component: UserPermissionsComponent,
resolve: { resolve: {
user: UserDetailResolver, user: UserDetailResolver,
userPermissions: UserPermissionsResolver, userPermissions: UserPermissionsResolver,
server: ServerResolve, controller: ControllerResolve,
permissions: PermissionResolver permissions: PermissionResolver
} }
} }
], ],
}, },
{ {
path: 'server/:server_id/project/:project_id', path: 'controller/:controller_id/project/:project_id',
component: ProjectMapComponent, component: ProjectMapComponent,
canActivate: [LoginGuard], canActivate: [LoginGuard],
canDeactivate: [ConsoleGuard], canDeactivate: [ConsoleGuard],
}, },
{ {
path: 'server/:server_id/project/:project_id/nodes/:node_id', path: 'controller/:controller_id/project/:project_id/nodes/:node_id',
component: WebConsoleFullWindowComponent, component: WebConsoleFullWindowComponent,
canActivate: [LoginGuard] canActivate: [LoginGuard]
}, },
{ {
path: 'static/web-ui/server/:server_id/project/:project_id/nodes/:node_id', path: 'static/web-ui/controller/:controller_id/project/:project_id/nodes/:node_id',
component: WebConsoleFullWindowComponent, component: WebConsoleFullWindowComponent,
canActivate: [LoginGuard] canActivate: [LoginGuard]
}, },

View File

@ -30,7 +30,7 @@ import { ProgressDialogService } from './common/progress-dialog/progress-dialog.
import { ProgressComponent } from './common/progress/progress.component'; import { ProgressComponent } from './common/progress/progress.component';
import { ProgressService } from './common/progress/progress.service'; import { ProgressService } from './common/progress/progress.service';
import { AdbutlerComponent } from './components/adbutler/adbutler.component'; import { AdbutlerComponent } from './components/adbutler/adbutler.component';
import { BundledServerFinderComponent } from './components/bundled-server-finder/bundled-server-finder.component'; import { BundledControllerFinderComponent } from './components/bundled-controller-finder/bundled-controller-finder.component';
import { InformationDialogComponent } from './components/dialogs/information-dialog.component'; import { InformationDialogComponent } from './components/dialogs/information-dialog.component';
import { DirectLinkComponent } from './components/direct-link/direct-link.component'; import { DirectLinkComponent } from './components/direct-link/direct-link.component';
import { DrawingAddedComponent } from './components/drawings-listeners/drawing-added/drawing-added.component'; import { DrawingAddedComponent } from './components/drawings-listeners/drawing-added/drawing-added.component';
@ -188,9 +188,9 @@ import { ProjectNameValidator } from './components/projects/models/projectNameVa
import { NavigationDialogComponent } from './components/projects/navigation-dialog/navigation-dialog.component'; import { NavigationDialogComponent } from './components/projects/navigation-dialog/navigation-dialog.component';
import { ProjectsComponent } from './components/projects/projects.component'; import { ProjectsComponent } from './components/projects/projects.component';
import { SaveProjectDialogComponent } from './components/projects/save-project-dialog/save-project-dialog.component'; import { SaveProjectDialogComponent } from './components/projects/save-project-dialog/save-project-dialog.component';
import { AddServerDialogComponent } from './components/servers/add-server-dialog/add-server-dialog.component'; import { AddControllerDialogComponent } from './components/controllers/add-controller-dialog/add-controller-dialog.component';
import { ServerDiscoveryComponent } from './components/servers/server-discovery/server-discovery.component'; import { ControllerDiscoveryComponent } from './components/controllers/controller-discovery/controller-discovery.component';
import { ServersComponent } from './components/servers/servers.component'; import { ControllersComponent } from './components/controllers/controllers.component';
import { ConsoleComponent } from './components/settings/console/console.component'; import { ConsoleComponent } from './components/settings/console/console.component';
import { SettingsComponent } from './components/settings/settings.component'; import { SettingsComponent } from './components/settings/settings.component';
import { CreateSnapshotDialogComponent } from './components/snapshots/create-snapshot-dialog/create-snapshot-dialog.component'; import { CreateSnapshotDialogComponent } from './components/snapshots/create-snapshot-dialog/create-snapshot-dialog.component';
@ -215,7 +215,7 @@ import { LoginGuard } from './guards/login-guard';
import { ProjectWebServiceHandler } from './handlers/project-web-service-handler'; import { ProjectWebServiceHandler } from './handlers/project-web-service-handler';
import { DefaultLayoutComponent } from './layouts/default-layout/default-layout.component'; import { DefaultLayoutComponent } from './layouts/default-layout/default-layout.component';
import { MATERIAL_IMPORTS } from './material.imports'; import { MATERIAL_IMPORTS } from './material.imports';
import { ServerResolve } from './resolvers/server-resolve'; import { ControllerResolve } from './resolvers/controller-resolve';
import { ApplianceService } from './services/appliances.service'; import { ApplianceService } from './services/appliances.service';
import { BuiltInTemplatesConfigurationService } from './services/built-in-templates-configuration.service'; import { BuiltInTemplatesConfigurationService } from './services/built-in-templates-configuration.service';
import { BuiltInTemplatesService } from './services/built-in-templates.service'; import { BuiltInTemplatesService } from './services/built-in-templates.service';
@ -225,7 +225,7 @@ import { DockerService } from './services/docker.service';
import { DrawingService } from './services/drawing.service'; import { DrawingService } from './services/drawing.service';
import { ExternalSoftwareDefinitionService } from './services/external-software-definition.service'; import { ExternalSoftwareDefinitionService } from './services/external-software-definition.service';
import { GoogleAnalyticsService } from './services/google-analytics.service'; import { GoogleAnalyticsService } from './services/google-analytics.service';
import { HttpServer, ServerErrorHandler } from './services/http-server.service'; import { HttpController, ControllerErrorHandler } from './services/http-controller.service';
import { InfoService } from './services/info.service'; import { InfoService } from './services/info.service';
import { InstalledSoftwareService } from './services/installed-software.service'; import { InstalledSoftwareService } from './services/installed-software.service';
import { IosConfigurationService } from './services/ios-configuration.service'; import { IosConfigurationService } from './services/ios-configuration.service';
@ -244,10 +244,10 @@ import { ProjectService } from './services/project.service';
import { QemuConfigurationService } from './services/qemu-configuration.service'; import { QemuConfigurationService } from './services/qemu-configuration.service';
import { QemuService } from './services/qemu.service'; import { QemuService } from './services/qemu.service';
import { RecentlyOpenedProjectService } from './services/recentlyOpenedProject.service'; import { RecentlyOpenedProjectService } from './services/recentlyOpenedProject.service';
import { ServerManagementService } from './services/server-management.service'; import { ControllerManagementService } from './services/controller-management.service';
import { ServerSettingsService } from './services/server-settings.service'; import { ControllerSettingsService } from './services/controller-settings.service';
import { ServerDatabase } from './services/server.database'; import { ControllerDatabase } from './services/controller.database';
import { ServerService } from './services/server.service'; import { ControllerService } from './services/controller.service';
import { SettingsService } from './services/settings.service'; import { SettingsService } from './services/settings.service';
import { ConsoleService } from './services/settings/console.service'; import { ConsoleService } from './services/settings/console.service';
import { DefaultConsoleService } from './services/settings/default-console.service'; import { DefaultConsoleService } from './services/settings/default-console.service';
@ -329,8 +329,8 @@ import { NodesMenuConfirmationDialogComponent } from './components/project-map/n
LoggedUserComponent, LoggedUserComponent,
ProjectMapComponent, ProjectMapComponent,
LoginComponent, LoginComponent,
ServersComponent, ControllersComponent,
AddServerDialogComponent, AddControllerDialogComponent,
CreateSnapshotDialogComponent, CreateSnapshotDialogComponent,
SnapshotMenuItemComponent, SnapshotMenuItemComponent,
ProjectsComponent, ProjectsComponent,
@ -361,9 +361,9 @@ import { NodesMenuConfirmationDialogComponent } from './components/project-map/n
SuspendLinkActionComponent, SuspendLinkActionComponent,
SettingsComponent, SettingsComponent,
PreferencesComponent, PreferencesComponent,
BundledServerFinderComponent, BundledControllerFinderComponent,
ProgressComponent, ProgressComponent,
ServerDiscoveryComponent, ControllerDiscoveryComponent,
NodeSelectInterfaceComponent, NodeSelectInterfaceComponent,
DrawLinkToolComponent, DrawLinkToolComponent,
InstalledSoftwareComponent, InstalledSoftwareComponent,
@ -593,12 +593,12 @@ import { NodesMenuConfirmationDialogComponent } from './components/project-map/n
VersionService, VersionService,
ProjectService, ProjectService,
SymbolService, SymbolService,
ServerService, ControllerService,
TemplateService, TemplateService,
NodeService, NodeService,
LinkService, LinkService,
DrawingService, DrawingService,
HttpServer, HttpController,
SnapshotService, SnapshotService,
ProgressDialogService, ProgressDialogService,
ToasterService, ToasterService,
@ -611,11 +611,11 @@ import { NodesMenuConfirmationDialogComponent } from './components/project-map/n
SelectionManager, SelectionManager,
InRectangleHelper, InRectangleHelper,
DrawingsDataSource, DrawingsDataSource,
ServerErrorHandler, ControllerErrorHandler,
ServerDatabase, ControllerDatabase,
ProjectNameValidator, ProjectNameValidator,
ToolsService, ToolsService,
ServerSettingsService, ControllerSettingsService,
QemuService, QemuService,
VpcsService, VpcsService,
TemplateMocksService, TemplateMocksService,
@ -637,7 +637,7 @@ import { NodesMenuConfirmationDialogComponent } from './components/project-map/n
IouService, IouService,
IouConfigurationService, IouConfigurationService,
RecentlyOpenedProjectService, RecentlyOpenedProjectService,
ServerManagementService, ControllerManagementService,
MapScaleService, MapScaleService,
ConsoleService, ConsoleService,
DefaultConsoleService, DefaultConsoleService,
@ -652,7 +652,7 @@ import { NodesMenuConfirmationDialogComponent } from './components/project-map/n
ThemeService, ThemeService,
GoogleAnalyticsService, GoogleAnalyticsService,
NodeConsoleService, NodeConsoleService,
ServerResolve, ControllerResolve,
LoginGuard, LoginGuard,
ConsoleGuard, ConsoleGuard,
Title, Title,
@ -662,7 +662,7 @@ import { NodesMenuConfirmationDialogComponent } from './components/project-map/n
UserService UserService
], ],
entryComponents: [ entryComponents: [
AddServerDialogComponent, AddControllerDialogComponent,
CreateSnapshotDialogComponent, CreateSnapshotDialogComponent,
ProgressDialogComponent, ProgressDialogComponent,
TemplateListDialogComponent, TemplateListDialogComponent,

View File

@ -44,6 +44,6 @@
<app-drawing-resizing></app-drawing-resizing> <app-drawing-resizing></app-drawing-resizing>
<app-selection-control></app-selection-control> <app-selection-control></app-selection-control>
<app-selection-select></app-selection-select> <app-selection-select></app-selection-select>
<app-text-editor #textEditor [server]="server" [svg]="svg"></app-text-editor> <app-text-editor #textEditor [controller]="controller" [svg]="svg"></app-text-editor>
<app-draggable-selection [svg]="svg"></app-draggable-selection> <app-draggable-selection [svg]="svg"></app-draggable-selection>
<app-link-editing [svg]="svg"></app-link-editing> <app-link-editing [svg]="svg"></app-link-editing>

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@ -13,7 +13,7 @@ import { select, Selection } from 'd3-selection';
import { Subscription } from 'rxjs'; import { Subscription } from 'rxjs';
import { Link } from '../../../models/link'; import { Link } from '../../../models/link';
import { Project } from '../../../models/project'; import { Project } from '../../../models/project';
import { Server } from '../../../models/server'; import { Controller } from '../../../models/controller';
import { Symbol } from '../../../models/symbol'; import { Symbol } from '../../../models/symbol';
import { MapScaleService } from '../../../services/mapScale.service'; import { MapScaleService } from '../../../services/mapScale.service';
import { MapSettingsService } from '../../../services/mapsettings.service'; import { MapSettingsService } from '../../../services/mapsettings.service';
@ -43,7 +43,7 @@ export class D3MapComponent implements OnInit, OnChanges, OnDestroy {
@Input() drawings: Drawing[] = []; @Input() drawings: Drawing[] = [];
@Input() symbols: Symbol[] = []; @Input() symbols: Symbol[] = [];
@Input() project: Project; @Input() project: Project;
@Input() server: Server; @Input() controller: Controller;
@Input() width = 1500; @Input() width = 1500;
@Input() height = 600; @Input() height = 600;

View File

@ -13,7 +13,7 @@ import { select } from 'd3-selection';
import { Subscription } from 'rxjs'; import { Subscription } from 'rxjs';
import { StyleProperty } from '../../../components/project-map/drawings-editors/text-editor/text-editor.component'; import { StyleProperty } from '../../../components/project-map/drawings-editors/text-editor/text-editor.component';
import { Link } from '../../../models/link'; import { Link } from '../../../models/link';
import { Server } from '../../../models/server'; import { Controller } from '../../../models/controller';
import { LinkService } from '../../../services/link.service'; import { LinkService } from '../../../services/link.service';
import { MapScaleService } from '../../../services/mapScale.service'; import { MapScaleService } from '../../../services/mapScale.service';
import { ToolsService } from '../../../services/tools.service'; import { ToolsService } from '../../../services/tools.service';
@ -37,7 +37,7 @@ import { Node } from '../../models/node';
export class TextEditorComponent implements OnInit, OnDestroy { export class TextEditorComponent implements OnInit, OnDestroy {
@ViewChild('temporaryTextElement') temporaryTextElement: ElementRef; @ViewChild('temporaryTextElement') temporaryTextElement: ElementRef;
@Input('svg') svg: SVGSVGElement; @Input('svg') svg: SVGSVGElement;
@Input('server') server: Server; @Input('controller') controller: Controller;
leftPosition: string = '0px'; leftPosition: string = '0px';
topPosition: string = '0px'; topPosition: string = '0px';
@ -185,7 +185,7 @@ export class TextEditorComponent implements OnInit, OnDestroy {
let link: Link = this.linksDataSource.get(this.editedLink.linkId); let link: Link = this.linksDataSource.get(this.editedLink.linkId);
link.nodes.find((n) => n.node_id === this.editedNode.node_id).label.text = innerText; link.nodes.find((n) => n.node_id === this.editedNode.node_id).label.text = innerText;
this.linkService.updateLink(this.server, link).subscribe((link: Link) => { this.linkService.updateLink(this.controller, link).subscribe((link: Link) => {
rootElement rootElement
.selectAll<SVGTextElement, TextElement>('text.editingMode') .selectAll<SVGTextElement, TextElement>('text.editingMode')
.attr('visibility', 'visible') .attr('visibility', 'visible')

View File

@ -16,13 +16,13 @@ export class MapLink implements Indexed {
suspend: boolean; suspend: boolean;
link_style?: LinkStyle; link_style?: LinkStyle;
distance: number; // this is not from server distance: number; // this is not from controller
length: number; // this is not from server length: number; // this is not from controller
source: MapNode; // this is not from server source: MapNode; // this is not from controller
target: MapNode; // this is not from server target: MapNode; // this is not from controller
isSelected = false; // this is not from server isSelected = false; // this is not from controller
isMultiplied = false; // this is not from server isMultiplied = false; // this is not from controller
x: number; // this is not from server x: number; // this is not from controller
y: number; // this is not from server y: number; // this is not from controller
} }

View File

@ -22,7 +22,6 @@ export class UploadingProcessbarComponent implements OnInit {
ngOnInit() { ngOnInit() {
this.upload_file_type = this.data.upload_file_type this.upload_file_type = this.data.upload_file_type
debugger
this.subscription = this._US.currentCount.subscribe((count:number) => { this.subscription = this._US.currentCount.subscribe((count:number) => {
this.uploadProgress = count; this.uploadProgress = count;
if (this.uploadProgress === 100 || this.uploadProgress == null ) { if (this.uploadProgress === 100 || this.uploadProgress == null ) {

View File

@ -0,0 +1,64 @@
import { NO_ERRORS_SCHEMA } from '@angular/core';
import { ComponentFixture, fakeAsync, TestBed, tick } from '@angular/core/testing';
import { By } from '@angular/platform-browser';
import { Router } from '@angular/router';
import { RouterTestingModule } from '@angular/router/testing';
import { ProgressService } from '../../common/progress/progress.service';
import{ Controller } from '../../models/controller';
import { ControllerService } from '../../services/controller.service';
import { MockedControllerService } from '../../services/controller.service.spec';
import { MockedProgressService } from '../project-map/project-map.component.spec';
import { BundledControllerFinderComponent } from './bundled-controller-finder.component';
describe('BundledControllerFinderComponent', () => {
let component: BundledControllerFinderComponent;
let fixture: ComponentFixture<BundledControllerFinderComponent>;
let router: any;
let service: ControllerService;
let progressService: MockedProgressService = new MockedProgressService();
let controllerServiceMock: jasmine.SpyObj<ControllerService>;
beforeEach(async () => {
router = {
navigate: jasmine.createSpy('navigate'),
};
controllerServiceMock = jasmine.createSpyObj<ControllerService>([
"getLocalController"
]);
await TestBed.configureTestingModule({
providers: [
{ provide: Router, useValue: router },
{ provide: ControllerService, useValue: controllerServiceMock },
{ provide: ProgressService, useValue: progressService },
],
declarations: [BundledControllerFinderComponent],
schemas: [NO_ERRORS_SCHEMA],
}).compileComponents();
fixture = TestBed.createComponent(BundledControllerFinderComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create and redirect to controller', fakeAsync(() => {
const controller = new Controller ();
controller.id = 99;
controllerServiceMock.getLocalController.and.returnValue(
Promise.resolve(controller)
);
expect(component).toBeTruthy();
tick(101)
fixture.detectChanges()
fixture.whenStable().then(() => {
expect(controllerServiceMock.getLocalController).toHaveBeenCalledWith('vps3.gns3.net',3000);
expect(router.navigate).toHaveBeenCalledWith(['/controller', 99, 'projects']);
})
service = TestBed.inject(ControllerService);
}));
});

View File

@ -2,18 +2,18 @@ import { DOCUMENT } from '@angular/common';
import { Component, Inject, OnInit } from '@angular/core'; import { Component, Inject, OnInit } from '@angular/core';
import { Router } from '@angular/router'; import { Router } from '@angular/router';
import { ProgressService } from '../../common/progress/progress.service'; import { ProgressService } from '../../common/progress/progress.service';
import { Server } from '../../models/server'; import{ Controller } from '../../models/controller';
import { ServerService } from '../../services/server.service'; import { ControllerService } from '../../services/controller.service';
@Component({ @Component({
selector: 'app-bundled-server-finder', selector: 'app-bundled-controller-finder',
templateUrl: './bundled-server-finder.component.html', templateUrl: './bundled-controller-finder.component.html',
styleUrls: ['./bundled-server-finder.component.scss'], styleUrls: ['./bundled-controller-finder.component.scss'],
}) })
export class BundledServerFinderComponent implements OnInit { export class BundledControllerFinderComponent implements OnInit {
constructor( constructor(
private router: Router, private router: Router,
private serverService: ServerService, private controllerService: ControllerService,
private progressService: ProgressService, private progressService: ProgressService,
@Inject(DOCUMENT) private document @Inject(DOCUMENT) private document
) {} ) {}
@ -31,8 +31,8 @@ export class BundledServerFinderComponent implements OnInit {
port = 80; port = 80;
} }
this.serverService.getLocalServer(this.document.location.hostname, port).then((server: Server) => { this.controllerService.getLocalController(this.document.location.hostname, port).then((controller:Controller ) => {
this.router.navigate(['/server', server.id, 'projects']); this.router.navigate(['/controller', controller.id, 'projects']);
this.progressService.deactivate(); this.progressService.deactivate();
}); });
}, 100); }, 100);

View File

@ -1,67 +0,0 @@
import { NO_ERRORS_SCHEMA } from '@angular/core';
import { ComponentFixture, fakeAsync, TestBed, tick } from '@angular/core/testing';
import { By } from '@angular/platform-browser';
import { Router } from '@angular/router';
import { RouterTestingModule } from '@angular/router/testing';
import { ProgressService } from '../../common/progress/progress.service';
import { Server } from '../../models/server';
import { ServerService } from '../../services/server.service';
import { MockedServerService } from '../../services/server.service.spec';
import { MockedProgressService } from '../project-map/project-map.component.spec';
import { BundledServerFinderComponent } from './bundled-server-finder.component';
describe('BundledServerFinderComponent', () => {
let component: BundledServerFinderComponent;
let fixture: ComponentFixture<BundledServerFinderComponent>;
let router: any;
let service: ServerService;
let progressService: MockedProgressService = new MockedProgressService();
let serverServiceMock: jasmine.SpyObj<ServerService>;
beforeEach(async () => {
router = {
navigate: jasmine.createSpy('navigate'),
};
serverServiceMock = jasmine.createSpyObj<ServerService>([
"getLocalServer"
]);
// serverService = new MockedServerService();
// spyOn(serverService, 'getLocalServer').and.returnValue(Promise.resolve(server));
await TestBed.configureTestingModule({
providers: [
{ provide: Router, useValue: router },
{ provide: ServerService, useValue: serverServiceMock },
{ provide: ProgressService, useValue: progressService },
],
declarations: [BundledServerFinderComponent],
schemas: [NO_ERRORS_SCHEMA],
}).compileComponents();
fixture = TestBed.createComponent(BundledServerFinderComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create and redirect to server', fakeAsync(() => {
const server = new Server();
server.id = 99;
serverServiceMock.getLocalServer.and.returnValue(
Promise.resolve(server)
);
expect(component).toBeTruthy();
tick(101)
fixture.detectChanges()
fixture.whenStable().then(() => {
expect(serverServiceMock.getLocalServer).toHaveBeenCalledWith('vps3.gns3.net',3000);
expect(router.navigate).toHaveBeenCalledWith(['/server', 99, 'projects']);
})
service = TestBed.inject(ServerService);
}));
});

View File

@ -1,24 +1,24 @@
<h1 mat-dialog-title>Add server</h1> <h1 mat-dialog-title>Add controller</h1>
<form [formGroup]="serverForm"> <form [formGroup]="controllerForm">
<div mat-dialog-content> <div mat-dialog-content>
<mat-form-field> <mat-form-field>
<input matInput tabindex="1" formControlName="name" placeholder="Name" /> <input matInput tabindex="1" formControlName="name" placeholder="Name" />
<mat-error *ngIf="serverForm.get('name').hasError('required')">You must enter a value</mat-error> <mat-error *ngIf="controllerForm.get('name').hasError('required')">You must enter a value</mat-error>
</mat-form-field> </mat-form-field>
<mat-form-field> <!-- <mat-form-field>
<mat-select placeholder="Location" formControlName="location"> <mat-select placeholder="Location" formControlName="location">
<mat-option *ngFor="let location of locations" [value]="location.key"> {{ location.name }} </mat-option> <mat-option *ngFor="let location of locations" [value]="location.key"> {{ location.name }} </mat-option>
</mat-select> </mat-select>
</mat-form-field> -->
<!-- <mat-form-field *ngIf="controllerForm.get('location').value === 'local'">
<input matInput tabindex="1" formControlName="path" placeholder="Local controller path" />
</mat-form-field> </mat-form-field>
<mat-form-field *ngIf="serverForm.get('location').value === 'local'"> <mat-form-field *ngIf="controllerForm.get('location').value === 'local'">
<input matInput tabindex="1" formControlName="path" placeholder="Local server path" />
</mat-form-field>
<mat-form-field *ngIf="serverForm.get('location').value === 'local'">
<input matInput tabindex="1" formControlName="ubridge_path" placeholder="Ubridge path" /> <input matInput tabindex="1" formControlName="ubridge_path" placeholder="Ubridge path" />
</mat-form-field> </mat-form-field> -->
<mat-form-field> <mat-form-field>
<input matInput tabindex="1" formControlName="host" placeholder="Host" /> <input matInput tabindex="1" formControlName="host" placeholder="Host" />

View File

@ -2,22 +2,22 @@ import { Component, Inject, OnInit } from '@angular/core';
import { FormControl, FormGroup, Validators } from '@angular/forms'; import { FormControl, FormGroup, Validators } from '@angular/forms';
import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
import { ElectronService } from 'ngx-electron'; import { ElectronService } from 'ngx-electron';
import { Server } from '../../../models/server'; import { Controller } from '../../../models/controller';
import { ServerService } from '../../../services/server.service'; import { ControllerService } from '../../../services/controller.service';
import { ToasterService } from '../../../services/toaster.service'; import { ToasterService } from '../../../services/toaster.service';
@Component({ @Component({
selector: 'app-add-server-dialog', selector: 'app-add-controller-dialog',
templateUrl: 'add-server-dialog.component.html', templateUrl: 'add-controller-dialog.component.html',
}) })
export class AddServerDialogComponent implements OnInit { export class AddControllerDialogComponent implements OnInit {
protocols = [ protocols = [
{ key: 'http:', name: 'HTTP' }, { key: 'http:', name: 'HTTP' },
{ key: 'https:', name: 'HTTPS' }, { key: 'https:', name: 'HTTPS' },
]; ];
locations = []; locations = [];
serverForm = new FormGroup({ controllerForm = new FormGroup({
name: new FormControl('', [Validators.required]), name: new FormControl('', [Validators.required]),
location: new FormControl(''), location: new FormControl(''),
path: new FormControl(''), path: new FormControl(''),
@ -28,18 +28,18 @@ export class AddServerDialogComponent implements OnInit {
}); });
constructor( constructor(
public dialogRef: MatDialogRef<AddServerDialogComponent>, public dialogRef: MatDialogRef<AddControllerDialogComponent>,
private electronService: ElectronService, private electronService: ElectronService,
private serverService: ServerService, private controllerService: ControllerService,
private toasterService: ToasterService, private toasterService: ToasterService,
@Inject(MAT_DIALOG_DATA) public data: any @Inject(MAT_DIALOG_DATA) public data: any
) {} ) {}
async getLocations() { async getLocations() {
const localServers = await this.numberOfLocalServers(); const localControllers = await this.numberOfLocalControllers();
let locations = []; let locations = [];
if (this.electronService.isElectronApp && localServers === 0) { if (this.electronService.isElectronApp && localControllers === 0) {
locations.push({ key: 'local', name: 'Local' }); locations.push({ key: 'local', name: 'Local' });
} }
locations.push({ key: 'remote', name: 'Remote' }); locations.push({ key: 'remote', name: 'Remote' });
@ -47,17 +47,17 @@ export class AddServerDialogComponent implements OnInit {
} }
async getDefaultLocation() { async getDefaultLocation() {
const localServers = await this.numberOfLocalServers(); const localControllers = await this.numberOfLocalControllers();
if (this.electronService.isElectronApp && localServers === 0) { if (this.electronService.isElectronApp && localControllers === 0) {
return 'local'; return 'local';
} }
return 'remote'; return 'remote';
} }
async numberOfLocalServers() { async numberOfLocalControllers() {
const servers = await this.serverService.findAll(); const controllers = await this.controllerService.findAll();
return servers.filter((server) => server.location === 'local').length; return controllers.filter((controller) => controller.location === 'local').length;
} }
getDefaultHost() { getDefaultHost() {
@ -68,16 +68,16 @@ export class AddServerDialogComponent implements OnInit {
return 3080; return 3080;
} }
async getDefaultLocalServerPath() { async getDefaultLocalControllerPath() {
if (this.electronService.isElectronApp) { if (this.electronService.isElectronApp) {
return await this.electronService.remote.require('./local-server.js').getLocalServerPath(); return await this.electronService.remote.require('./local-controller.js').getLocalControllerPath();
} }
return; return;
} }
async getDefaultUbridgePath() { async getDefaultUbridgePath() {
if (this.electronService.isElectronApp) { if (this.electronService.isElectronApp) {
return await this.electronService.remote.require('./local-server.js').getUbridgePath(); return await this.electronService.remote.require('./local-controller.js').getUbridgePath();
} }
return; return;
} }
@ -85,15 +85,15 @@ export class AddServerDialogComponent implements OnInit {
async ngOnInit() { async ngOnInit() {
this.locations = await this.getLocations(); this.locations = await this.getLocations();
const defaultLocalServerPath = await this.getDefaultLocalServerPath(); const defaultLocalControllerPath = await this.getDefaultLocalControllerPath();
const defaultUbridgePath = await this.getDefaultUbridgePath(); const defaultUbridgePath = await this.getDefaultUbridgePath();
this.serverForm.get('location').valueChanges.subscribe((location: string) => { this.controllerForm.get('location').valueChanges.subscribe((location: string) => {
const pathControl = this.serverForm.get('path'); const pathControl = this.controllerForm.get('path');
const ubridgePathControl = this.serverForm.get('ubridge_path'); const ubridgePathControl = this.controllerForm.get('ubridge_path');
if (location === 'local') { if (location === 'local') {
pathControl.setValue(defaultLocalServerPath); pathControl.setValue(defaultLocalControllerPath);
pathControl.setValidators([Validators.required]); pathControl.setValidators([Validators.required]);
ubridgePathControl.setValue(defaultUbridgePath); ubridgePathControl.setValue(defaultUbridgePath);
@ -114,29 +114,29 @@ export class AddServerDialogComponent implements OnInit {
}); });
const defaultLocation = await this.getDefaultLocation(); const defaultLocation = await this.getDefaultLocation();
this.serverForm.get('location').setValue(defaultLocation); this.controllerForm.get('location').setValue(defaultLocation);
this.serverForm.get('host').setValue(this.getDefaultHost()); this.controllerForm.get('host').setValue(this.getDefaultHost());
this.serverForm.get('port').setValue(this.getDefaultPort()); this.controllerForm.get('port').setValue(this.getDefaultPort());
} }
onAddClick(): void { onAddClick(): void {
if (!this.serverForm.valid) { if (!this.controllerForm.valid) {
return; return;
} }
const server: Server = Object.assign({}, this.serverForm.value); const controller:Controller = Object.assign({}, this.controllerForm.value);
this.serverService.checkServerVersion(server).subscribe( this.controllerService.checkControllerVersion(controller).subscribe(
(serverInfo) => { (controllerInfo) => {
if (serverInfo.version.split('.')[0] >= 3) { if (controllerInfo.version.split('.')[0] >= 3) {
this.dialogRef.close(server); this.dialogRef.close(controller);
this.toasterService.success(`Server ${server.name} added.`); this.toasterService.success(`Controller ${controller.name} added.`);
} else { } else {
this.dialogRef.close(); this.dialogRef.close();
this.toasterService.error(`Server version is not supported.`); this.toasterService.error(`Controller version is not supported.`);
} }
}, },
(error) => { (error) => {
this.toasterService.error('Cannot connect to the server: ' + error); this.toasterService.error('Cannot connect to the controller: ' + error);
} }
); );
} }

View File

@ -0,0 +1,12 @@
<mat-card class="info" *ngIf="discoveredController">
<mat-card-content align="center">
We've discovered GNS3 controller on <b>{{ discoveredController?.host }}:{{ discoveredController?.port }}</b
>, would you like to add to the list?
</mat-card-content>
<mat-card-actions align="right">
<button mat-button color="accent" (click)="ignore(discoveredController)">NO</button>
<button mat-button (click)="accept(discoveredController)">YES</button>
</mat-card-actions>
</mat-card>
<mat-divider *ngIf="discoveredController"></mat-divider>

View File

@ -0,0 +1,171 @@
import { ComponentFixture, fakeAsync, TestBed, tick } from '@angular/core/testing';
import { MatCardModule } from '@angular/material/card';
import { MatDividerModule } from '@angular/material/divider';
import { Observable } from 'rxjs/Rx';
import{ Controller } from '../../../models/controller';
import { Version } from '../../../models/version';
import { ControllerDatabase } from '../../../services/controller.database';
import { ControllerService } from '../../../services/controller.service';
import { MockedControllerService } from '../../../services/controller.service.spec';
import { VersionService } from '../../../services/version.service';
import { MockedVersionService } from '../../../services/version.service.spec';
import { ControllerDiscoveryComponent } from './controller-discovery.component';
xdescribe('ControllerDiscoveryComponent', () => {
let component: ControllerDiscoveryComponent;
let fixture: ComponentFixture<ControllerDiscoveryComponent>;
let mockedVersionService: MockedVersionService;
let mockedControllerService: MockedControllerService;
beforeEach(async () => {
mockedControllerService = new MockedControllerService();
mockedVersionService = new MockedVersionService();
await TestBed.configureTestingModule({
imports: [MatCardModule, MatDividerModule],
providers: [
{ provide: VersionService, useFactory: () => mockedVersionService },
{ provide: ControllerService, useFactory: () => mockedControllerService },
ControllerDatabase,
],
declarations: [ControllerDiscoveryComponent],
}).compileComponents();
});
beforeEach(() => {
fixture = TestBed.createComponent(ControllerDiscoveryComponent);
component = fixture.componentInstance;
// we don't really want to run it during testing
spyOn(component, 'ngOnInit').and.returnValue(null);
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
describe('isAvailable', () => {
it('should return controller object when controller is available', () => {
const version = new Version();
version.version = '2.1.8';
const getVersionSpy = spyOn(mockedVersionService, 'get').and.returnValue(Observable.of(version));
component.isControllerAvailable('127.0.0.1', 3080).subscribe((s) => {
expect(s.host).toEqual('127.0.0.1');
expect(s.port).toEqual(3080);
});
const controller = new Controller ();
controller.host = '127.0.0.1';
controller.port = 3080;
expect(getVersionSpy).toHaveBeenCalledWith(controller);
});
it('should throw error once controller is not available', () => {
const controller = new Controller ();
controller.host = '127.0.0.1';
controller.port = 3080;
const getVersionSpy = spyOn(mockedVersionService, 'get').and.returnValue(
Observable.throwError(new Error('controller is unavailable'))
);
let hasExecuted = false;
component.isControllerAvailable('127.0.0.1', 3080).subscribe(
(ver) => { },
(err) => {
hasExecuted = true;
expect(err.toString()).toEqual('Error: controller is unavailable');
}
);
expect(getVersionSpy).toHaveBeenCalledWith(controller);
expect(hasExecuted).toBeTruthy();
});
});
describe('discovery', () => {
it('should discovery all controllers available', (done) => {
const version = new Version();
version.version = '2.1.8';
spyOn(component, 'isControllerAvailable').and.callFake((ip, port) => {
const controller = new Controller ();
controller.host = ip;
controller.port = port;
return Observable.of(controller);
});
component.discovery().subscribe((discovered) => {
expect(discovered[0].host).toEqual('127.0.0.1');
expect(discovered[0].port).toEqual(3080);
expect(discovered.length).toEqual(1);
done();
});
});
});
describe('discoverFirstAvailableController', () => {
let controller:Controller ;
beforeEach(function () {
controller = new Controller ();
(controller.host = '199.111.111.1'), (controller.port = 3333);
spyOn(component, 'discovery').and.callFake(() => {
return Observable.of([controller]);
});
});
it('should get first controller from discovered and with no added before', fakeAsync(() => {
expect(component.discoveredController).toBeUndefined();
component.discoverFirstAvailableController();
tick();
expect(component.discoveredController.host).toEqual('199.111.111.1');
expect(component.discoveredController.port).toEqual(3333);
}));
it('should get first controller from discovered and with already added', fakeAsync(() => {
mockedControllerService.controllers.push(controller);
expect(component.discoveredController).toBeUndefined();
component.discoverFirstAvailableController();
tick();
expect(component.discoveredController).toBeUndefined();
}));
});
describe('accepting and ignoring found controller', () => {
let controller:Controller ;
beforeEach(() => {
controller = new Controller ();
(controller.host = '199.111.111.1'), (controller.port = 3333);
component.discoveredController = controller;
});
describe('accept', () => {
it('should add new controller', fakeAsync(() => {
component.accept(controller);
tick();
expect(component.discoveredController).toBeNull();
expect(mockedControllerService.controllers[0].host).toEqual('199.111.111.1');
expect(mockedControllerService.controllers[0].name).toEqual('199.111.111.1');
expect(mockedControllerService.controllers[0].location).toEqual('remote');
}));
});
describe('ignore', () => {
it('should reject controller', fakeAsync(() => {
component.ignore(controller);
tick();
expect(component.discoveredController).toBeNull();
}));
});
});
});

View File

@ -0,0 +1,132 @@
import { Component, OnInit } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
import { forkJoin, from } from 'rxjs';
import { map } from 'rxjs//operators';
import { Observable } from 'rxjs/Rx';
import { Controller, ControllerProtocol } from '../../../models/controller';
import { Version } from '../../../models/version';
import { ControllerDatabase } from '../../../services/controller.database';
import { ControllerService } from '../../../services/controller.service';
import { VersionService } from '../../../services/version.service';
@Component({
selector: 'app-controller-discovery',
templateUrl: './controller-discovery.component.html',
styleUrls: ['./controller-discovery.component.scss'],
})
export class ControllerDiscoveryComponent implements OnInit {
private defaultControllers = [
{
host: '127.0.0.1',
port: 3080,
},
];
discoveredController: Controller;
constructor(
private versionService: VersionService,
private controllerService: ControllerService,
private controllerDatabase: ControllerDatabase,
private route: ActivatedRoute
) {}
ngOnInit() {
if (this.controllerService.isServiceInitialized) this.discoverFirstController();
this.controllerService.serviceInitialized.subscribe(async (value: boolean) => {
if (value) {
this.discoverFirstController();
}
});
}
async discoverFirstController() {
let discovered = await this.discoverControllers();
let local = await this.controllerService.findAll();
local.forEach((added) => {
discovered = discovered.filter((controller) => {
return !(controller.host == added.host && controller.port == added.port);
});
});
if (discovered.length > 0) {
this.discoveredController = discovered.shift();
}
}
async discoverControllers() {
let discoveredControllers: Controller[] = [];
this.defaultControllers.forEach(async (testController) => {
const controller = new Controller();
controller.host = testController.host;
controller.port = testController.port;
let version = await this.versionService
.get(controller)
.toPromise()
.catch((error) => null);
if (version) discoveredControllers.push(controller);
});
return discoveredControllers;
}
discoverFirstAvailableController() {
forkJoin([from(this.controllerService.findAll()).pipe(map((s: Controller[]) => s)), this.discovery()]).subscribe(
([local, discovered]) => {
local.forEach((added) => {
discovered = discovered.filter((controller) => {
return !(controller.host == added.host && controller.port == added.port);
});
});
if (discovered.length > 0) {
this.discoveredController = discovered.shift();
}
},
(error) => {}
);
}
discovery(): Observable<Controller[]> {
const queries: Observable<Controller>[] = [];
this.defaultControllers.forEach((testController) => {
queries.push(
this.isControllerAvailable(testController.host, testController.port).catch((err) => {
return Observable.of(null);
})
);
});
return new Observable<Controller[]>((observer) => {
forkJoin(queries).subscribe((discoveredControllers) => {
observer.next(discoveredControllers.filter((s) => s != null));
observer.complete();
});
});
}
isControllerAvailable(ip: string, port: number): Observable<Controller> {
const controller = new Controller();
controller.host = ip;
controller.port = port;
return this.versionService.get(controller).flatMap((version: Version) => Observable.of(controller));
}
ignore(controller: Controller) {
this.discoveredController = null;
}
accept(controller: Controller) {
if (controller.name == null) {
controller.name = controller.host;
}
controller.location = 'remote';
controller.protocol = location.protocol as ControllerProtocol;
this.controllerService.create(controller).then((created: Controller) => {
this.controllerDatabase.addController(created);
this.discoveredController = null;
});
}
}

View File

@ -1,7 +1,7 @@
<div class="content"> <div class="content">
<div class="default-header"><h1>Servers</h1></div> <div class="default-header"><h1>Controllers</h1></div>
<div class="default-content"> <div class="default-content">
<app-server-discovery></app-server-discovery> <app-controller-discovery></app-controller-discovery>
<div class="mat-elevation-z8"> <div class="mat-elevation-z8">
<mat-table #table [dataSource]="dataSource"> <mat-table #table [dataSource]="dataSource">
@ -14,13 +14,13 @@
<mat-header-cell *matHeaderCellDef> Name </mat-header-cell> <mat-header-cell *matHeaderCellDef> Name </mat-header-cell>
<mat-cell *matCellDef="let row"> <mat-cell *matCellDef="let row">
<a <a
*ngIf="getServerStatus(row) === 'running' || row.location === 'remote' || row.location === 'bundled'" *ngIf="getControllerStatus(row) === 'running' || row.location === 'remote' || row.location === 'bundled'"
[routerLink]="['/server', row.id, 'login']" [routerLink]="['/controller', row.id, 'login']"
class="table-link" class="table-link"
>{{ row.name }}</a >{{ row.name }}</a
> >
<span <span
*ngIf="getServerStatus(row) != 'running' && row.location !== 'remote' && row.location !== 'bundled'" *ngIf="getControllerStatus(row) != 'running' && row.location !== 'remote' && row.location !== 'bundled'"
>{{ row.name }}</span >{{ row.name }}</span
> >
</mat-cell> </mat-cell>
@ -49,43 +49,43 @@
matTooltip="Go to projects" matTooltip="Go to projects"
matTooltipClass="custom-tooltip" matTooltipClass="custom-tooltip"
(click)="openProjects(row)" (click)="openProjects(row)"
*ngIf="getServerStatus(row) === 'running' || row.location === 'remote' || row.location === 'bundled'" *ngIf="getControllerStatus(row) === 'running' || row.location === 'remote' || row.location === 'bundled'"
> >
<mat-icon aria-label="Go to projects">arrow_forward</mat-icon> <mat-icon aria-label="Go to projects">arrow_forward</mat-icon>
</button> </button>
<button <button
mat-icon-button mat-icon-button
matTooltip="Start server" matTooltip="Start controller"
matTooltipClass="custom-tooltip" matTooltipClass="custom-tooltip"
(click)="startServer(row)" (click)="startController(row)"
*ngIf="row.location === 'local' && getServerStatus(row) === 'stopped'" *ngIf="row.location === 'local' && getControllerStatus(row) === 'stopped'"
> >
<mat-icon aria-label="Start server">play_arrow</mat-icon> <mat-icon aria-label="Start controller">play_arrow</mat-icon>
</button> </button>
<button <button
mat-icon-button mat-icon-button
matTooltip="Stop server" matTooltip="Stop controller"
matTooltipClass="custom-tooltip" matTooltipClass="custom-tooltip"
(click)="stopServer(row)" (click)="stopController(row)"
*ngIf="row.location === 'local' && getServerStatus(row) === 'running'" *ngIf="row.location === 'local' && getControllerStatus(row) === 'running'"
> >
<mat-icon aria-label="Stop server">stop</mat-icon> <mat-icon aria-label="Stop controller">stop</mat-icon>
</button> </button>
<mat-spinner <mat-spinner
[diameter]="24" [diameter]="24"
*ngIf="row.location === 'local' && getServerStatus(row) === 'starting'" *ngIf="row.location === 'local' && getControllerStatus(row) === 'starting'"
></mat-spinner> ></mat-spinner>
<button <button
mat-icon-button mat-icon-button
matTooltip="Remove server" matTooltip="Remove controller"
matTooltipClass="custom-tooltip" matTooltipClass="custom-tooltip"
(click)="deleteServer(row)" (click)="deleteController(row)"
> >
<mat-icon aria-label="Remove server">delete</mat-icon> <mat-icon aria-label="Remove controller">delete</mat-icon>
</button> </button>
</mat-cell> </mat-cell>
</ng-container> </ng-container>
@ -96,10 +96,10 @@
</div> </div>
<div class="buttons-bar"> <div class="buttons-bar">
<button *ngIf="isElectronApp" mat-raised-button class="button" (click)="startLocalServer()"> <button *ngIf="isElectronApp" mat-raised-button class="button" (click)="startLocalController()">
Start local server Start local controller
</button> </button>
<button mat-raised-button class="button" color="primary" (click)="createModal()">Add server</button> <button mat-raised-button class="button" color="primary" (click)="createModal()">Add Controller</button>
</div> </div>
</div> </div>
</div> </div>

View File

@ -0,0 +1,14 @@
.buttons-bar {
padding-top: 0px;
}
.button {
margin: 20px !important;
}
table {
width: 100%;
}
mat-header-cell, mat-cell {
justify-content: center;
}

View File

@ -4,11 +4,11 @@ import { MatDialog, MatDialogModule } from '@angular/material/dialog';
import { MatIconModule } from '@angular/material/icon'; import { MatIconModule } from '@angular/material/icon';
import { MatMenuModule } from '@angular/material/menu'; import { MatMenuModule } from '@angular/material/menu';
import { MatToolbarModule } from '@angular/material/toolbar'; import { MatToolbarModule } from '@angular/material/toolbar';
import { ServerDatabase } from '../../services/server.database'; import { ControllerDatabase } from '../../services/controller.database';
import { ServerService } from '../../services/server.service'; import { ControllerService } from '../../services/controller.service';
import { MockedServerService } from 'app/services/server.service.spec'; import { MockedControllerService } from 'app/services/controller.service.spec';
import { ServersComponent } from './servers.component'; import { ControllersComponent } from './controllers.component';
import { ServerManagementService } from 'app/services/server-management.service'; import { ControllerManagementService } from '../../services/controller-management.service';
import { ElectronService } from 'ngx-electron'; import { ElectronService } from 'ngx-electron';
import { ChildProcessService } from 'ngx-childprocess'; import { ChildProcessService } from 'ngx-childprocess';
import { MatBottomSheet, MatBottomSheetModule } from '@angular/material/bottom-sheet'; import { MatBottomSheet, MatBottomSheetModule } from '@angular/material/bottom-sheet';
@ -18,16 +18,16 @@ import { RouterTestingModule } from '@angular/router/testing';
import { ChangeDetectorRef } from '@angular/core'; import { ChangeDetectorRef } from '@angular/core';
import { MockedRouter } from 'app/common/progress/progress.component.spec'; import { MockedRouter } from 'app/common/progress/progress.component.spec';
describe('ServersComponent', () => { describe('ControllersComponent', () => {
let component: ServersComponent; let component: ControllersComponent;
let fixture: ComponentFixture<ServersComponent>; let fixture: ComponentFixture<ControllersComponent>;
let serverMockedService: MockedServerService let controllerMockedService: MockedControllerService
let mockedActivatedRoute: MockedActivatedRoute let mockedActivatedRoute: MockedActivatedRoute
let mockedRouter : MockedRouter let mockedRouter : MockedRouter
beforeEach(async () => { beforeEach(async () => {
await TestBed.configureTestingModule({ await TestBed.configureTestingModule({
declarations: [ServersComponent], declarations: [ControllersComponent],
imports: [ imports: [
MatDialogModule, MatDialogModule,
RouterTestingModule, RouterTestingModule,
@ -35,13 +35,13 @@ describe('ServersComponent', () => {
], ],
providers: [ providers: [
MatDialog, MatDialog,
ServerDatabase, ControllerDatabase,
ServerManagementService, ControllerManagementService,
ElectronService, ElectronService,
MatBottomSheet, MatBottomSheet,
ChildProcessService, ChildProcessService,
ChangeDetectorRef, ChangeDetectorRef,
{ provide: ServerService, useValue: serverMockedService }, { provide: ControllerService, useValue: controllerMockedService },
{ provide: ActivatedRoute, useValue: mockedActivatedRoute }, { provide: ActivatedRoute, useValue: mockedActivatedRoute },
{ provide: Router, useValue: mockedRouter }, { provide: Router, useValue: mockedRouter },
] ]
@ -49,7 +49,7 @@ describe('ServersComponent', () => {
}); });
beforeEach(() => { beforeEach(() => {
fixture = TestBed.createComponent(ServersComponent); fixture = TestBed.createComponent(ControllersComponent);
component = fixture.componentInstance; component = fixture.componentInstance;
fixture.detectChanges(); fixture.detectChanges();
}); });

View File

@ -0,0 +1,177 @@
import { DataSource } from '@angular/cdk/collections';
import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';
import { MatBottomSheet } from '@angular/material/bottom-sheet';
import { MatDialog } from '@angular/material/dialog';
import { ActivatedRoute, Router } from '@angular/router';
import { ChildProcessService } from 'ngx-childprocess';
import { ElectronService } from 'ngx-electron';
import { merge, Observable, Subscription } from 'rxjs';
import { map } from 'rxjs/operators';
import {Controller , ControllerProtocol } from '../../models/controller';
import { ControllerManagementService } from '../../services/controller-management.service';
import { ControllerDatabase } from '../../services/controller.database';
import { ControllerService } from '../../services/controller.service';
import { ConfirmationBottomSheetComponent } from '../projects/confirmation-bottomsheet/confirmation-bottomsheet.component';
import { AddControllerDialogComponent } from './add-controller-dialog/add-controller-dialog.component';
@Component({
selector: 'app-controller-list',
templateUrl: './controllers.component.html',
styleUrls: ['./controllers.component.scss'],
})
export class ControllersComponent implements OnInit, OnDestroy {
dataSource: ControllerDataSource;
displayedColumns = ['id', 'name', 'location', 'ip', 'port', 'actions'];
controllerStatusSubscription: Subscription;
isElectronApp: boolean = false;
constructor(
private dialog: MatDialog,
private controllerService: ControllerService,
private controllerDatabase: ControllerDatabase,
private controllerManagement: ControllerManagementService,
private changeDetector: ChangeDetectorRef,
private electronService: ElectronService,
private childProcessService: ChildProcessService,
private bottomSheet: MatBottomSheet,
private route: ActivatedRoute,
private router: Router
) { }
getControllers() {
const runningControllerNames = this.controllerManagement.getRunningControllers();
this.controllerService.findAll().then((controllers:Controller []) => {
controllers.forEach((controller) => {
const controllerIndex = runningControllerNames.findIndex((controllerName) => controller.name === controllerName);
if (controllerIndex >= 0) {
controller.status = 'running';
}
});
controllers.forEach((controller) => {
this.controllerService.checkControllerVersion(controller).subscribe(
(controllerInfo) => {
if (controllerInfo.version.split('.')[0] >= 3) {
if (!controller.protocol) controller.protocol = location.protocol as ControllerProtocol;
if (!this.controllerDatabase.find(controller.name)) this.controllerDatabase.addController(controller);
}
},
(error) => { }
);
});
});
}
ngOnInit() {
this.isElectronApp = this.electronService.isElectronApp;
if (this.controllerService && this.controllerService.isServiceInitialized) this.getControllers();
if (this.controllerService && this.controllerService.isServiceInitialized) {
this.controllerService.serviceInitialized.subscribe(async (value: boolean) => {
if (value) {
this.getControllers();
}
});
}
this.dataSource = new ControllerDataSource(this.controllerDatabase);
this.controllerStatusSubscription = this.controllerManagement.controllerStatusChanged.subscribe((controllerStatus) => {
const controller = this.controllerDatabase.find(controllerStatus.controllerName);
if (!controller) {
return;
}
if (controllerStatus.status === 'starting') {
controller.status = 'starting';
}
if (controllerStatus.status === 'stopped') {
controller.status = 'stopped';
}
if (controllerStatus.status === 'errored') {
controller.status = 'stopped';
}
if (controllerStatus.status === 'started') {
controller.status = 'running';
}
this.controllerDatabase.update(controller);
this.changeDetector.detectChanges();
});
}
ngOnDestroy() {
this.controllerStatusSubscription.unsubscribe();
}
startLocalController() {
const controller = this.controllerDatabase.data.find((n) => n.location === 'bundled' || 'local');
this.startController(controller);
}
openProjects(controller) {
this.router.navigate(['/controller', controller.id, 'projects']);
}
createModal() {
const dialogRef = this.dialog.open(AddControllerDialogComponent, {
width: '350px',
autoFocus: false,
disableClose: true,
});
dialogRef.afterClosed().subscribe((controller) => {
if (controller) {
this.controllerService.create(controller).then((created:Controller ) => {
this.controllerDatabase.addController(created);
});
}
});
}
getControllerStatus(controller:Controller ) {
if (controller.location === 'local') {
if (controller.status === undefined) {
return 'stopped';
}
return controller.status;
}
}
deleteController(controller:Controller ) {
this.bottomSheet.open(ConfirmationBottomSheetComponent);
let bottomSheetRef = this.bottomSheet._openedBottomSheetRef;
bottomSheetRef.instance.message = 'Do you want to delete the controller?';
const bottomSheetSubscription = bottomSheetRef.afterDismissed().subscribe((result: boolean) => {
if (result) {
this.controllerService.delete(controller).then(() => {
this.controllerDatabase.remove(controller);
});
}
});
}
async startController(controller:Controller ) {
await this.controllerManagement.start(controller);
}
async stopController(controller:Controller ) {
await this.controllerManagement.stop(controller);
}
}
export class ControllerDataSource extends DataSource<Controller> {
constructor(private controllerDatabase: ControllerDatabase) {
super();
}
connect(): Observable< Controller[] > {
return merge(this.controllerDatabase.dataChange).pipe(
map(() => {
return this.controllerDatabase.data;
})
);
}
disconnect() { }
}

View File

@ -1,23 +1,23 @@
<div [hidden]="!serverOptionsVisibility" class="content"> <div [hidden]="!controllerOptionsVisibility" class="content">
<div class="default-header"> <div class="default-header">
<div class="row"> <div class="row">
<h1 class="col">Add new server</h1> <h1 class="col">Add new controller</h1>
</div> </div>
</div> </div>
<div class="default-content"> <div class="default-content">
<mat-card class="matCard"> <mat-card class="matCard">
<form [formGroup]="serverForm"> <form [formGroup]="controllerForm">
<mat-form-field> <mat-form-field>
<input matInput tabindex="1" formControlName="name" placeholder="Name" /> <input matInput tabindex="1" formControlName="name" placeholder="Name" />
<mat-error *ngIf="serverForm.get('name').hasError('required')">You must enter a value</mat-error> <mat-error *ngIf="controllerForm.get('name').hasError('required')">You must enter a value</mat-error>
</mat-form-field> </mat-form-field>
<mat-form-field> <mat-form-field>
<mat-select placeholder="Location" formControlName="location"> <mat-select placeholder="Location" formControlName="location">
<mat-option *ngFor="let location of locations" [value]="location.key"> {{ location.name }} </mat-option> <mat-option *ngFor="let location of locations" [value]="location.key"> {{ location.name }} </mat-option>
</mat-select> </mat-select>
</mat-form-field> </mat-form-field>
<mat-form-field> <mat-form-field>
<mat-select placeholder="Protocol" formControlName="protocol"> <mat-select placeholder="Protocol" formControlName="protocol">
<mat-option *ngFor="let protocol of protocols" [value]="protocol.key"> {{ protocol.name }} </mat-option> <mat-option *ngFor="let protocol of protocols" [value]="protocol.key"> {{ protocol.name }} </mat-option>
@ -26,7 +26,7 @@
</form> </form>
</mat-card> </mat-card>
<div class="buttons-bar"> <div class="buttons-bar">
<button mat-raised-button color="primary" (click)="createServer()">Add server</button> <button mat-raised-button color="primary" (click)="createController()">Add controller</button>
</div> </div>
</div> </div>
</div> </div>

View File

@ -1,9 +1,9 @@
import { Component, OnInit, ViewEncapsulation } from '@angular/core'; import { Component, OnInit, ViewEncapsulation } from '@angular/core';
import { FormControl, FormGroup, Validators } from '@angular/forms'; import { FormControl, FormGroup, Validators } from '@angular/forms';
import { ActivatedRoute, Router } from '@angular/router'; import { ActivatedRoute, Router } from '@angular/router';
import { Server } from '../../models/server'; import{ Controller } from '../../models/controller';
import { ServerDatabase } from '../../services/server.database'; import { ControllerDatabase } from '../../services/controller.database';
import { ServerService } from '../../services/server.service'; import { ControllerService } from '../../services/controller.service';
import { ToasterService } from '../../services/toaster.service'; import { ToasterService } from '../../services/toaster.service';
@Component({ @Component({
@ -13,9 +13,9 @@ import { ToasterService } from '../../services/toaster.service';
encapsulation: ViewEncapsulation.None, encapsulation: ViewEncapsulation.None,
}) })
export class DirectLinkComponent implements OnInit { export class DirectLinkComponent implements OnInit {
public serverOptionsVisibility = false; public controllerOptionsVisibility = false;
public serverIp; public controllerIp;
public serverPort; public controllerPort;
public projectId; public projectId;
protocols = [ protocols = [
@ -27,61 +27,61 @@ export class DirectLinkComponent implements OnInit {
{ key: 'remote', name: 'Remote' }, { key: 'remote', name: 'Remote' },
]; ];
serverForm = new FormGroup({ controllerForm = new FormGroup({
name: new FormControl('', [Validators.required]), name: new FormControl('', [Validators.required]),
location: new FormControl(''), location: new FormControl(''),
protocol: new FormControl('http:') protocol: new FormControl('http:')
}); });
constructor( constructor(
private serverService: ServerService, private controllerService: ControllerService,
private serverDatabase: ServerDatabase, private controllerDatabase: ControllerDatabase,
private route: ActivatedRoute, private route: ActivatedRoute,
private router: Router, private router: Router,
private toasterService: ToasterService private toasterService: ToasterService
) {} ) {}
async ngOnInit() { async ngOnInit() {
if (this.serverService.isServiceInitialized) this.getServers(); if (this.controllerService.isServiceInitialized) this.getControllers();
this.serverService.serviceInitialized.subscribe(async (value: boolean) => { this.controllerService.serviceInitialized.subscribe(async (value: boolean) => {
if (value) { if (value) {
this.getServers(); this.getControllers();
} }
}); });
} }
private async getServers() { private async getControllers() {
this.serverIp = this.route.snapshot.paramMap.get('server_ip'); this.controllerIp = this.route.snapshot.paramMap.get('controller_ip');
this.serverPort = +this.route.snapshot.paramMap.get('server_port'); this.controllerPort = +this.route.snapshot.paramMap.get('controller_port');
this.projectId = this.route.snapshot.paramMap.get('project_id'); this.projectId = this.route.snapshot.paramMap.get('project_id');
const servers = await this.serverService.findAll(); const controllers = await this.controllerService.findAll();
const server = servers.filter((server) => server.host === this.serverIp && server.port === this.serverPort)[0]; const controller = controllers.filter((controller) => controller.host === this.controllerIp && controller.port === this.controllerPort)[0];
if (server) { if (controller) {
this.router.navigate(['/server', server.id, 'project', this.projectId]); this.router.navigate(['/controller', controller.id, 'project', this.projectId]);
} else { } else {
this.serverOptionsVisibility = true; this.controllerOptionsVisibility = true;
} }
} }
public createServer() { public createController() {
if (!this.serverForm.get('name').hasError && !this.serverForm.get('location').hasError && !this.serverForm.get('protocol').hasError) { if (!this.controllerForm.get('name').hasError && !this.controllerForm.get('location').hasError && !this.controllerForm.get('protocol').hasError) {
this.toasterService.error('Please use correct values'); this.toasterService.error('Please use correct values');
return; return;
} }
let serverToAdd: Server = new Server(); let controllerToAdd:Controller = new Controller ();
serverToAdd.host = this.serverIp; controllerToAdd.host = this.controllerIp;
serverToAdd.port = this.serverPort; controllerToAdd.port = this.controllerPort;
serverToAdd.name = this.serverForm.get('name').value; controllerToAdd.name = this.controllerForm.get('name').value;
serverToAdd.location = this.serverForm.get('location').value; controllerToAdd.location = this.controllerForm.get('location').value;
serverToAdd.protocol = this.serverForm.get('protocol').value; controllerToAdd.protocol = this.controllerForm.get('protocol').value;
this.serverService.create(serverToAdd).then((addedServer: Server) => { this.controllerService.create(controllerToAdd).then((addedController:Controller ) => {
this.router.navigate(['/server', addedServer.id, 'project', this.projectId]); this.router.navigate(['/controller', addedController.id, 'project', this.projectId]);
}); });
} }
} }

View File

@ -7,7 +7,7 @@ import { AddedDataEvent } from '../../../cartography/events/event-source';
import { DefaultDrawingsFactory } from '../../../cartography/helpers/default-drawings-factory'; import { DefaultDrawingsFactory } from '../../../cartography/helpers/default-drawings-factory';
import { Drawing } from '../../../cartography/models/drawing'; import { Drawing } from '../../../cartography/models/drawing';
import { Project } from '../../../models/project'; import { Project } from '../../../models/project';
import { Server } from '../../../models/server'; import{ Controller } from '../../../models/controller';
import { DrawingService } from '../../../services/drawing.service'; import { DrawingService } from '../../../services/drawing.service';
@Component({ @Component({
@ -16,7 +16,7 @@ import { DrawingService } from '../../../services/drawing.service';
styleUrls: ['./drawing-added.component.scss'], styleUrls: ['./drawing-added.component.scss'],
}) })
export class DrawingAddedComponent implements OnInit, OnDestroy { export class DrawingAddedComponent implements OnInit, OnDestroy {
@Input() server: Server; @Input() controller: Controller
@Input() project: Project; @Input() project: Project;
@Input() selectedDrawing: string; @Input() selectedDrawing: string;
@Output() drawingSaved = new EventEmitter<boolean>(); @Output() drawingSaved = new EventEmitter<boolean>();
@ -49,9 +49,9 @@ export class DrawingAddedComponent implements OnInit, OnDestroy {
let svgText = this.mapDrawingToSvgConverter.convert(drawing); let svgText = this.mapDrawingToSvgConverter.convert(drawing);
this.drawingService this.drawingService
.add(this.server, this.project.project_id, evt.x, evt.y, svgText) .add(this.controller, this.project.project_id, evt.x, evt.y, svgText)
.subscribe((serverDrawing: Drawing) => { .subscribe((controllerDrawing: Drawing) => {
this.drawingsDataSource.add(serverDrawing); this.drawingsDataSource.add(controllerDrawing);
this.drawingSaved.emit(true); this.drawingSaved.emit(true);
}); });
} }

View File

@ -6,7 +6,7 @@ import { DraggedDataEvent } from '../../../cartography/events/event-source';
import { Drawing } from '../../../cartography/models/drawing'; import { Drawing } from '../../../cartography/models/drawing';
import { MapDrawing } from '../../../cartography/models/map/map-drawing'; import { MapDrawing } from '../../../cartography/models/map/map-drawing';
import { Project } from '../../../models/project'; import { Project } from '../../../models/project';
import { Server } from '../../../models/server'; import{ Controller } from '../../../models/controller';
import { DrawingService } from '../../../services/drawing.service'; import { DrawingService } from '../../../services/drawing.service';
@Component({ @Component({
@ -15,7 +15,7 @@ import { DrawingService } from '../../../services/drawing.service';
styleUrls: ['./drawing-dragged.component.scss'], styleUrls: ['./drawing-dragged.component.scss'],
}) })
export class DrawingDraggedComponent implements OnInit, OnDestroy { export class DrawingDraggedComponent implements OnInit, OnDestroy {
@Input() server: Server; @Input() controller:Controller ;
@Input() project: Project; @Input() project: Project;
private drawingDragged: Subscription; private drawingDragged: Subscription;
@ -35,9 +35,9 @@ export class DrawingDraggedComponent implements OnInit, OnDestroy {
drawing.y += draggedEvent.dy; drawing.y += draggedEvent.dy;
this.drawingService this.drawingService
.updatePosition(this.server, this.project, drawing, drawing.x, drawing.y) .updatePosition(this.controller, this.project, drawing, drawing.x, drawing.y)
.subscribe((serverDrawing: Drawing) => { .subscribe((controllerDrawing: Drawing) => {
this.drawingsDataSource.update(serverDrawing); this.drawingsDataSource.update(controllerDrawing);
}); });
} }

View File

@ -6,7 +6,7 @@ import { DrawingsEventSource } from '../../../cartography/events/drawings-event-
import { ResizedDataEvent } from '../../../cartography/events/event-source'; import { ResizedDataEvent } from '../../../cartography/events/event-source';
import { Drawing } from '../../../cartography/models/drawing'; import { Drawing } from '../../../cartography/models/drawing';
import { MapDrawing } from '../../../cartography/models/map/map-drawing'; import { MapDrawing } from '../../../cartography/models/map/map-drawing';
import { Server } from '../../../models/server'; import{ Controller } from '../../../models/controller';
import { DrawingService } from '../../../services/drawing.service'; import { DrawingService } from '../../../services/drawing.service';
@Component({ @Component({
@ -15,7 +15,7 @@ import { DrawingService } from '../../../services/drawing.service';
styleUrls: ['./drawing-resized.component.scss'], styleUrls: ['./drawing-resized.component.scss'],
}) })
export class DrawingResizedComponent implements OnInit, OnDestroy { export class DrawingResizedComponent implements OnInit, OnDestroy {
@Input() server: Server; @Input() controller:Controller ;
private drawingResized: Subscription; private drawingResized: Subscription;
constructor( constructor(
@ -34,9 +34,9 @@ export class DrawingResizedComponent implements OnInit, OnDestroy {
let svgString = this.mapDrawingToSvgConverter.convert(resizedEvent.datum); let svgString = this.mapDrawingToSvgConverter.convert(resizedEvent.datum);
this.drawingService this.drawingService
.updateSizeAndPosition(this.server, drawing, resizedEvent.x, resizedEvent.y, svgString) .updateSizeAndPosition(this.controller, drawing, resizedEvent.x, resizedEvent.y, svgString)
.subscribe((serverDrawing: Drawing) => { .subscribe((controllerDrawing: Drawing) => {
this.drawingsDataSource.update(serverDrawing); this.drawingsDataSource.update(controllerDrawing);
}); });
} }

View File

@ -5,7 +5,7 @@ import { DraggedDataEvent } from '../../../cartography/events/event-source';
import { LinksEventSource } from '../../../cartography/events/links-event-source'; import { LinksEventSource } from '../../../cartography/events/links-event-source';
import { MapLinkNode } from '../../../cartography/models/map/map-link-node'; import { MapLinkNode } from '../../../cartography/models/map/map-link-node';
import { Link } from '../../../models/link'; import { Link } from '../../../models/link';
import { Server } from '../../../models/server'; import{ Controller } from '../../../models/controller';
import { LinkService } from '../../../services/link.service'; import { LinkService } from '../../../services/link.service';
@Component({ @Component({
@ -14,7 +14,7 @@ import { LinkService } from '../../../services/link.service';
styleUrls: ['./interface-label-dragged.component.scss'], styleUrls: ['./interface-label-dragged.component.scss'],
}) })
export class InterfaceLabelDraggedComponent { export class InterfaceLabelDraggedComponent {
@Input() server: Server; @Input() controller:Controller ;
private interfaceDragged: Subscription; private interfaceDragged: Subscription;
constructor( constructor(
@ -40,8 +40,8 @@ export class InterfaceLabelDraggedComponent {
link.nodes[1].label.y += draggedEvent.dy; link.nodes[1].label.y += draggedEvent.dy;
} }
this.linkService.updateNodes(this.server, link, link.nodes).subscribe((serverLink: Link) => { this.linkService.updateNodes(this.controller, link, link.nodes).subscribe((controllerLink: Link) => {
this.linksDataSource.update(serverLink); this.linksDataSource.update(controllerLink);
}); });
} }

View File

@ -7,7 +7,7 @@ import { MapLinkCreated } from '../../../cartography/events/links';
import { LinksEventSource } from '../../../cartography/events/links-event-source'; import { LinksEventSource } from '../../../cartography/events/links-event-source';
import { Link } from '../../../models/link'; import { Link } from '../../../models/link';
import { Project } from '../../../models/project'; import { Project } from '../../../models/project';
import { Server } from '../../../models/server'; import{ Controller } from '../../../models/controller';
import { LinkService } from '../../../services/link.service'; import { LinkService } from '../../../services/link.service';
import { ProjectService } from '../../../services/project.service'; import { ProjectService } from '../../../services/project.service';
@ -17,7 +17,7 @@ import { ProjectService } from '../../../services/project.service';
styleUrls: ['./link-created.component.scss'], styleUrls: ['./link-created.component.scss'],
}) })
export class LinkCreatedComponent implements OnInit, OnDestroy { export class LinkCreatedComponent implements OnInit, OnDestroy {
@Input() server: Server; @Input() controller:Controller ;
@Input() project: Project; @Input() project: Project;
private linkCreated: Subscription; private linkCreated: Subscription;
@ -87,7 +87,7 @@ export class LinkCreatedComponent implements OnInit, OnDestroy {
this.linkService this.linkService
.createLink( .createLink(
this.server, this.controller,
sourceNode, sourceNode,
sourcePort, sourcePort,
targetNode, targetNode,
@ -98,7 +98,7 @@ export class LinkCreatedComponent implements OnInit, OnDestroy {
yLabelTargetNode yLabelTargetNode
) )
.subscribe(() => { .subscribe(() => {
this.projectService.links(this.server, this.project.project_id).subscribe((links: Link[]) => { this.projectService.links(this.controller, this.project.project_id).subscribe((links: Link[]) => {
this.linksDataSource.set(links); this.linksDataSource.set(links);
}); });
}); });

View File

@ -6,7 +6,7 @@ import { NodesEventSource } from '../../../cartography/events/nodes-event-source
import { MapNode } from '../../../cartography/models/map/map-node'; import { MapNode } from '../../../cartography/models/map/map-node';
import { Node } from '../../../cartography/models/node'; import { Node } from '../../../cartography/models/node';
import { Project } from '../../../models/project'; import { Project } from '../../../models/project';
import { Server } from '../../../models/server'; import{ Controller } from '../../../models/controller';
import { NodeService } from '../../../services/node.service'; import { NodeService } from '../../../services/node.service';
@Component({ @Component({
@ -15,7 +15,7 @@ import { NodeService } from '../../../services/node.service';
styleUrls: ['./node-dragged.component.scss'], styleUrls: ['./node-dragged.component.scss'],
}) })
export class NodeDraggedComponent implements OnInit, OnDestroy { export class NodeDraggedComponent implements OnInit, OnDestroy {
@Input() server: Server; @Input() controller:Controller ;
@Input() project: Project; @Input() project: Project;
private nodeDragged: Subscription; private nodeDragged: Subscription;
@ -34,8 +34,8 @@ export class NodeDraggedComponent implements OnInit, OnDestroy {
node.x += draggedEvent.dx; node.x += draggedEvent.dx;
node.y += draggedEvent.dy; node.y += draggedEvent.dy;
this.nodeService.updatePosition(this.server, this.project, node, node.x, node.y).subscribe((serverNode: Node) => { this.nodeService.updatePosition(this.controller, this.project, node, node.x, node.y).subscribe((controllerNode: Node) => {
this.nodesDataSource.update(serverNode); this.nodesDataSource.update(controllerNode);
}); });
} }

View File

@ -6,7 +6,7 @@ import { DraggedDataEvent } from '../../../cartography/events/event-source';
import { NodesEventSource } from '../../../cartography/events/nodes-event-source'; import { NodesEventSource } from '../../../cartography/events/nodes-event-source';
import { MapLabel } from '../../../cartography/models/map/map-label'; import { MapLabel } from '../../../cartography/models/map/map-label';
import { Node } from '../../../cartography/models/node'; import { Node } from '../../../cartography/models/node';
import { Server } from '../../../models/server'; import{ Controller } from '../../../models/controller';
import { NodeService } from '../../../services/node.service'; import { NodeService } from '../../../services/node.service';
@Component({ @Component({
@ -15,7 +15,7 @@ import { NodeService } from '../../../services/node.service';
styleUrls: ['./node-label-dragged.component.scss'], styleUrls: ['./node-label-dragged.component.scss'],
}) })
export class NodeLabelDraggedComponent implements OnInit, OnDestroy { export class NodeLabelDraggedComponent implements OnInit, OnDestroy {
@Input() server: Server; @Input() controller:Controller ;
private nodeLabelDragged: Subscription; private nodeLabelDragged: Subscription;
constructor( constructor(
@ -38,8 +38,8 @@ export class NodeLabelDraggedComponent implements OnInit, OnDestroy {
const label = this.mapLabelToLabel.convert(mapLabel); const label = this.mapLabelToLabel.convert(mapLabel);
node.label = label; node.label = label;
this.nodeService.updateLabel(this.server, node, node.label).subscribe((serverNode: Node) => { this.nodeService.updateLabel(this.controller, node, node.label).subscribe((controllerNode: Node) => {
this.nodesDataSource.update(serverNode); this.nodesDataSource.update(controllerNode);
}); });
} }

View File

@ -9,7 +9,7 @@ import { Context } from '../../../cartography/models/context';
import { Drawing } from '../../../cartography/models/drawing'; import { Drawing } from '../../../cartography/models/drawing';
import { TextElement } from '../../../cartography/models/drawings/text-element'; import { TextElement } from '../../../cartography/models/drawings/text-element';
import { Project } from '../../../models/project'; import { Project } from '../../../models/project';
import { Server } from '../../../models/server'; import{ Controller } from '../../../models/controller';
import { DrawingService } from '../../../services/drawing.service'; import { DrawingService } from '../../../services/drawing.service';
@Component({ @Component({
@ -18,7 +18,7 @@ import { DrawingService } from '../../../services/drawing.service';
styleUrls: ['./text-added.component.scss'], styleUrls: ['./text-added.component.scss'],
}) })
export class TextAddedComponent implements OnInit, OnDestroy { export class TextAddedComponent implements OnInit, OnDestroy {
@Input() server: Server; @Input() controller: Controller;
@Input() project: Project; @Input() project: Project;
@Output() drawingSaved = new EventEmitter<boolean>(); @Output() drawingSaved = new EventEmitter<boolean>();
private textAdded: Subscription; private textAdded: Subscription;
@ -43,7 +43,7 @@ export class TextAddedComponent implements OnInit, OnDestroy {
this.drawingService this.drawingService
.add( .add(
this.server, this.controller,
this.project.project_id, this.project.project_id,
(evt.x - (this.context.getZeroZeroTransformationPoint().x + this.context.transformation.x)) / (evt.x - (this.context.getZeroZeroTransformationPoint().x + this.context.transformation.x)) /
this.context.transformation.k, this.context.transformation.k,
@ -51,8 +51,8 @@ export class TextAddedComponent implements OnInit, OnDestroy {
this.context.transformation.k, this.context.transformation.k,
svgText svgText
) )
.subscribe((serverDrawing: Drawing) => { .subscribe((controllerDrawing: Drawing) => {
this.drawingsDataSource.add(serverDrawing); this.drawingsDataSource.add(controllerDrawing);
this.drawingSaved.emit(true); this.drawingSaved.emit(true);
}); });
} }

View File

@ -7,7 +7,7 @@ import { TextEditedDataEvent } from '../../../cartography/events/event-source';
import { Drawing } from '../../../cartography/models/drawing'; import { Drawing } from '../../../cartography/models/drawing';
import { TextElement } from '../../../cartography/models/drawings/text-element'; import { TextElement } from '../../../cartography/models/drawings/text-element';
import { MapDrawing } from '../../../cartography/models/map/map-drawing'; import { MapDrawing } from '../../../cartography/models/map/map-drawing';
import { Server } from '../../../models/server'; import{ Controller } from '../../../models/controller';
import { DrawingService } from '../../../services/drawing.service'; import { DrawingService } from '../../../services/drawing.service';
@Component({ @Component({
@ -16,7 +16,7 @@ import { DrawingService } from '../../../services/drawing.service';
styleUrls: ['./text-edited.component.scss'], styleUrls: ['./text-edited.component.scss'],
}) })
export class TextEditedComponent implements OnInit, OnDestroy { export class TextEditedComponent implements OnInit, OnDestroy {
@Input() server: Server; @Input() controller: Controller;
private textEdited: Subscription; private textEdited: Subscription;
constructor( constructor(
@ -38,8 +38,8 @@ export class TextEditedComponent implements OnInit, OnDestroy {
let drawing = this.drawingsDataSource.get(evt.textDrawingId); let drawing = this.drawingsDataSource.get(evt.textDrawingId);
this.drawingService.updateText(this.server, drawing, svgString).subscribe((serverDrawing: Drawing) => { this.drawingService.updateText(this.controller, drawing, svgString).subscribe((controllerDrawing: Drawing) => {
this.drawingsDataSource.update(serverDrawing); this.drawingsDataSource.update(controllerDrawing);
this.drawingsEventSource.textSaved.emit(true); this.drawingsEventSource.textSaved.emit(true);
}); });
} }

View File

@ -21,7 +21,7 @@
<mat-form-field class="input-full-width"> <mat-form-field class="input-full-width">
<mat-select formControlName="compression" (selectionChange)="selectCompression($event)" required> <mat-select formControlName="compression" (selectionChange)="selectCompression($event)" required>
<mat-option *ngFor="let compressionValue of compression_methods" [value]="compressionValue">{{ <mat-option *ngFor="let compressionValue of compression_methods" [value]="compressionValue">{{
compressionValue.name compressionValue?.name
}}</mat-option> }}</mat-option>
</mat-select> </mat-select>
</mat-form-field> </mat-form-field>

View File

@ -2,7 +2,7 @@ import { Component, Inject, OnInit } from '@angular/core';
import { FormBuilder, FormGroup, Validators } from '@angular/forms'; import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
import { Project } from '../../models/project'; import { Project } from '../../models/project';
import { Server } from '../../models/server'; import{ Controller } from '../../models/controller';
import { ProjectService } from '../../services/project.service'; import { ProjectService } from '../../services/project.service';
@Component({ @Component({
@ -16,7 +16,7 @@ export class ExportPortableProjectComponent implements OnInit {
compression_methods: any = []; compression_methods: any = [];
compression_level: any = []; compression_level: any = [];
compression_filter_value: any = []; compression_filter_value: any = [];
server: Server; controller:Controller ;
project: Project; project: Project;
index: number = 4; index: number = 4;
fileName: string; fileName: string;
@ -30,7 +30,7 @@ export class ExportPortableProjectComponent implements OnInit {
) {} ) {}
async ngOnInit() { async ngOnInit() {
this.server = this.data.serverDetails; this.controller = this.data.controllerDetails;
this.project = this.data.projectDetails; this.project = this.data.projectDetails;
this.fileName = this.project.name + '.gns3project'; this.fileName = this.project.name + '.gns3project';
await this.formControls(); await this.formControls();
@ -65,7 +65,7 @@ export class ExportPortableProjectComponent implements OnInit {
exportPortableProject() { exportPortableProject() {
this.isExport = true; this.isExport = true;
this.export_project_form.value.compression = this.export_project_form.value.compression.value ?? 'zstd'; this.export_project_form.value.compression = this.export_project_form.value.compression.value ?? 'zstd';
window.location.assign(this.projectService.getexportPortableProjectPath(this.server, this.project.project_id, this.export_project_form.value)) window.location.assign(this.projectService.getexportPortableProjectPath(this.controller, this.project.project_id, this.export_project_form.value))
this.dialogRef.close(); this.dialogRef.close();
} }
} }

View File

@ -14,7 +14,7 @@ import {Component, Inject, OnInit} from '@angular/core';
import {BehaviorSubject, forkJoin, timer} from "rxjs"; import {BehaviorSubject, forkJoin, timer} from "rxjs";
import {User} from "@models/users/user"; import {User} from "@models/users/user";
import {MAT_DIALOG_DATA, MatDialogRef} from "@angular/material/dialog"; import {MAT_DIALOG_DATA, MatDialogRef} from "@angular/material/dialog";
import {Server} from "@models/server"; import {Controller} from "@models/controller";
import {Group} from "@models/groups/group"; import {Group} from "@models/groups/group";
import {UserService} from "@services/user.service"; import {UserService} from "@services/user.service";
import {GroupService} from "@services/group.service"; import {GroupService} from "@services/group.service";
@ -35,7 +35,7 @@ export class AddRoleToGroupComponent implements OnInit {
loading = false; loading = false;
constructor(private dialog: MatDialogRef<AddRoleToGroupComponent>, constructor(private dialog: MatDialogRef<AddRoleToGroupComponent>,
@Inject(MAT_DIALOG_DATA) public data: { server: Server; group: Group }, @Inject(MAT_DIALOG_DATA) public data: { controller: Controller; group: Group },
private groupService: GroupService, private groupService: GroupService,
private roleService: RoleService, private roleService: RoleService,
private toastService: ToasterService) { private toastService: ToasterService) {
@ -58,8 +58,8 @@ export class AddRoleToGroupComponent implements OnInit {
getRoles() { getRoles() {
forkJoin([ forkJoin([
this.roleService.get(this.data.server), this.roleService.get(this.data.controller),
this.groupService.getGroupRole(this.data.server, this.data.group.user_group_id) this.groupService.getGroupRole(this.data.controller, this.data.group.user_group_id)
]).subscribe((results) => { ]).subscribe((results) => {
const [globalRoles, groupRoles] = results; const [globalRoles, groupRoles] = results;
const roles = globalRoles.filter((role: Role) => { const roles = globalRoles.filter((role: Role) => {
@ -76,7 +76,7 @@ export class AddRoleToGroupComponent implements OnInit {
addRole(role: Role) { addRole(role: Role) {
this.loading = true; this.loading = true;
this.groupService this.groupService
.addRoleToGroup(this.data.server, this.data.group, role) .addRoleToGroup(this.data.controller, this.data.group, role)
.subscribe(() => { .subscribe(() => {
this.toastService.success(`role ${role.name} was added`); this.toastService.success(`role ${role.name} was added`);
this.getRoles(); this.getRoles();

View File

@ -13,7 +13,7 @@
import {Component, Inject, OnInit} from '@angular/core'; import {Component, Inject, OnInit} from '@angular/core';
import {MAT_DIALOG_DATA, MatDialogRef} from "@angular/material/dialog"; import {MAT_DIALOG_DATA, MatDialogRef} from "@angular/material/dialog";
import {UserService} from "@services/user.service"; import {UserService} from "@services/user.service";
import {Server} from "@models/server"; import {Controller} from "@models/controller";
import {BehaviorSubject, forkJoin, observable, Observable, timer} from "rxjs"; import {BehaviorSubject, forkJoin, observable, Observable, timer} from "rxjs";
import {User} from "@models/users/user"; import {User} from "@models/users/user";
import {GroupService} from "@services/group.service"; import {GroupService} from "@services/group.service";
@ -34,7 +34,7 @@ export class AddUserToGroupDialogComponent implements OnInit {
loading = false; loading = false;
constructor(private dialog: MatDialogRef<AddUserToGroupDialogComponent>, constructor(private dialog: MatDialogRef<AddUserToGroupDialogComponent>,
@Inject(MAT_DIALOG_DATA) public data: { server: Server; group: Group }, @Inject(MAT_DIALOG_DATA) public data: { controller: Controller; group: Group },
private userService: UserService, private userService: UserService,
private groupService: GroupService, private groupService: GroupService,
private toastService: ToasterService) { private toastService: ToasterService) {
@ -57,8 +57,8 @@ export class AddUserToGroupDialogComponent implements OnInit {
getUsers() { getUsers() {
forkJoin([ forkJoin([
this.userService.list(this.data.server), this.userService.list(this.data.controller),
this.groupService.getGroupMember(this.data.server, this.data.group.user_group_id) this.groupService.getGroupMember(this.data.controller, this.data.group.user_group_id)
]).subscribe((results) => { ]).subscribe((results) => {
const [userList, members] = results; const [userList, members] = results;
const users = userList.filter((user: User) => { const users = userList.filter((user: User) => {
@ -75,7 +75,7 @@ export class AddUserToGroupDialogComponent implements OnInit {
addUser(user: User) { addUser(user: User) {
this.loading = true; this.loading = true;
this.groupService this.groupService
.addMemberToGroup(this.data.server, this.data.group, user) .addMemberToGroup(this.data.controller, this.data.group, user)
.subscribe(() => { .subscribe(() => {
this.toastService.success(`user ${user.username} was added`); this.toastService.success(`user ${user.username} was added`);
this.getUsers(); this.getUsers();

View File

@ -5,7 +5,7 @@
mat-icon-button mat-icon-button
matTooltip="Back to group management" matTooltip="Back to group management"
matTooltipClass="custom-tooltip" matTooltipClass="custom-tooltip"
[routerLink]="['/server', server.id, 'management', 'groups']"> [routerLink]="['/controller', controller.id, 'management', 'groups']">
<mat-icon aria-label="Back to group management">keyboard_arrow_left</mat-icon> <mat-icon aria-label="Back to group management">keyboard_arrow_left</mat-icon>
</a> </a>
<h1 class="col">Groups {{group.name}} details</h1> <h1 class="col">Groups {{group.name}} details</h1>
@ -47,7 +47,7 @@
</mat-form-field> </mat-form-field>
</div> </div>
<div *ngFor="let user of members | membersFilter: searchMembers | paginator: pageEvent"> <div *ngFor="let user of members | membersFilter: searchMembers | paginator: pageEvent">
<a href="/server/{{server.id}}/management/users/{{user.user_id}}"> <a href="/controller/{{controller.id}}/management/users/{{user.user_id}}">
<div>{{user.username}}</div> <div>{{user.username}}</div>
</a> </a>
<mat-icon class="clickable" (click)="openRemoveUserDialog(user)">delete</mat-icon> <mat-icon class="clickable" (click)="openRemoveUserDialog(user)">delete</mat-icon>

View File

@ -12,7 +12,7 @@
*/ */
import {Component, OnInit} from '@angular/core'; import {Component, OnInit} from '@angular/core';
import {ActivatedRoute} from "@angular/router"; import {ActivatedRoute} from "@angular/router";
import {Server} from "@models/server"; import {Controller} from "@models/controller";
import {Group} from "@models/groups/group"; import {Group} from "@models/groups/group";
import {User} from "@models/users/user"; import {User} from "@models/users/user";
import {FormControl, FormGroup} from "@angular/forms"; import {FormControl, FormGroup} from "@angular/forms";
@ -31,7 +31,7 @@ import {AddRoleToGroupComponent} from "@components/group-details/add-role-to-gro
styleUrls: ['./group-details.component.scss'] styleUrls: ['./group-details.component.scss']
}) })
export class GroupDetailsComponent implements OnInit { export class GroupDetailsComponent implements OnInit {
server: Server; controller: Controller;
group: Group; group: Group;
members: User[]; members: User[];
editGroupForm: FormGroup; editGroupForm: FormGroup;
@ -48,9 +48,9 @@ export class GroupDetailsComponent implements OnInit {
groupname: new FormControl(''), groupname: new FormControl(''),
}); });
this.route.data.subscribe((d: { server: Server; group: Group, members: User[], roles: Role[] }) => { this.route.data.subscribe((d: { controller: Controller; group: Group, members: User[], roles: Role[] }) => {
this.server = d.server; this.controller = d.controller;
this.group = d.group; this.group = d.group;
this.roles = d.roles; this.roles = d.roles;
this.members = d.members.sort((a: User, b: User) => a.username.toLowerCase().localeCompare(b.username.toLowerCase())); this.members = d.members.sort((a: User, b: User) => a.username.toLowerCase().localeCompare(b.username.toLowerCase()));
@ -63,7 +63,7 @@ export class GroupDetailsComponent implements OnInit {
} }
onUpdate() { onUpdate() {
this.groupService.update(this.server, this.group) this.groupService.update(this.controller, this.group)
.subscribe(() => { .subscribe(() => {
this.toastService.success(`group updated`); this.toastService.success(`group updated`);
}, (error) => { }, (error) => {
@ -77,7 +77,7 @@ export class GroupDetailsComponent implements OnInit {
.open<AddRoleToGroupComponent>(AddRoleToGroupComponent, .open<AddRoleToGroupComponent>(AddRoleToGroupComponent,
{ {
width: '700px', height: '500px', width: '700px', height: '500px',
data: {server: this.server, group: this.group} data: {controller: this.controller, group: this.group}
}) })
.afterClosed() .afterClosed()
.subscribe(() => { .subscribe(() => {
@ -89,7 +89,7 @@ export class GroupDetailsComponent implements OnInit {
.open<AddUserToGroupDialogComponent>(AddUserToGroupDialogComponent, .open<AddUserToGroupDialogComponent>(AddUserToGroupDialogComponent,
{ {
width: '700px', height: '500px', width: '700px', height: '500px',
data: {server: this.server, group: this.group} data: {controller: this.controller, group: this.group}
}) })
.afterClosed() .afterClosed()
.subscribe(() => { .subscribe(() => {
@ -103,7 +103,7 @@ export class GroupDetailsComponent implements OnInit {
.afterClosed() .afterClosed()
.subscribe((confirm: boolean) => { .subscribe((confirm: boolean) => {
if (confirm) { if (confirm) {
this.groupService.removeUser(this.server, this.group, user) this.groupService.removeUser(this.controller, this.group, user)
.subscribe(() => { .subscribe(() => {
this.toastService.success(`User ${user.username} was removed`); this.toastService.success(`User ${user.username} was removed`);
this.reloadMembers(); this.reloadMembers();
@ -123,7 +123,7 @@ export class GroupDetailsComponent implements OnInit {
.afterClosed() .afterClosed()
.subscribe((confirm: string) => { .subscribe((confirm: string) => {
if (confirm) { if (confirm) {
this.groupService.removeRole(this.server, this.group, role) this.groupService.removeRole(this.controller, this.group, role)
.subscribe(() => { .subscribe(() => {
this.toastService.success(`Role ${role.name} was removed`); this.toastService.success(`Role ${role.name} was removed`);
this.reloadRoles(); this.reloadRoles();
@ -137,14 +137,14 @@ export class GroupDetailsComponent implements OnInit {
} }
reloadMembers() { reloadMembers() {
this.groupService.getGroupMember(this.server, this.group.user_group_id) this.groupService.getGroupMember(this.controller, this.group.user_group_id)
.subscribe((members: User[]) => { .subscribe((members: User[]) => {
this.members = members; this.members = members;
}); });
} }
reloadRoles() { reloadRoles() {
this.groupService.getGroupRole(this.server, this.group.user_group_id) this.groupService.getGroupRole(this.controller, this.group.user_group_id)
.subscribe((roles: Role[]) => { .subscribe((roles: Role[]) => {
this.roles = roles; this.roles = roles;
}); });

View File

@ -16,7 +16,7 @@ import {FormBuilder, FormControl, FormGroup, Validators} from "@angular/forms";
import {groupNameAsyncValidator} from "@components/group-management/add-group-dialog/groupNameAsyncValidator"; import {groupNameAsyncValidator} from "@components/group-management/add-group-dialog/groupNameAsyncValidator";
import {GroupNameValidator} from "@components/group-management/add-group-dialog/GroupNameValidator"; import {GroupNameValidator} from "@components/group-management/add-group-dialog/GroupNameValidator";
import {GroupService} from "../../../services/group.service"; import {GroupService} from "../../../services/group.service";
import {Server} from "../../../models/server"; import {Controller} from "../../../models/controller";
import {BehaviorSubject, forkJoin, timer} from "rxjs"; import {BehaviorSubject, forkJoin, timer} from "rxjs";
import {User} from "@models/users/user"; import {User} from "@models/users/user";
import {UserService} from "@services/user.service"; import {UserService} from "@services/user.service";
@ -35,7 +35,7 @@ import {map, startWith} from "rxjs/operators";
export class AddGroupDialogComponent implements OnInit { export class AddGroupDialogComponent implements OnInit {
groupNameForm: FormGroup; groupNameForm: FormGroup;
server: Server; controller: Controller;
users: User[]; users: User[];
usersToAdd: Set<User> = new Set([]); usersToAdd: Set<User> = new Set([]);
@ -46,7 +46,7 @@ export class AddGroupDialogComponent implements OnInit {
constructor(private dialogRef: MatDialogRef<AddGroupDialogComponent>, constructor(private dialogRef: MatDialogRef<AddGroupDialogComponent>,
@Inject(MAT_DIALOG_DATA) public data: { server: Server }, @Inject(MAT_DIALOG_DATA) public data: { controller: Controller },
private formBuilder: FormBuilder, private formBuilder: FormBuilder,
private groupNameValidator: GroupNameValidator, private groupNameValidator: GroupNameValidator,
private groupService: GroupService, private groupService: GroupService,
@ -55,15 +55,15 @@ export class AddGroupDialogComponent implements OnInit {
} }
ngOnInit(): void { ngOnInit(): void {
this.server = this.data.server; this.controller = this.data.controller;
this.groupNameForm = this.formBuilder.group({ this.groupNameForm = this.formBuilder.group({
groupName: new FormControl( groupName: new FormControl(
null, null,
[Validators.required, this.groupNameValidator.get], [Validators.required, this.groupNameValidator.get],
[groupNameAsyncValidator(this.data.server, this.groupService)] [groupNameAsyncValidator(this.data.controller, this.groupService)]
), ),
}); });
this.userService.list(this.server) this.userService.list(this.controller)
.subscribe((users: User[]) => { .subscribe((users: User[]) => {
this.users = users; this.users = users;
this.filteredUsers = this.autocompleteControl.valueChanges.pipe( this.filteredUsers = this.autocompleteControl.valueChanges.pipe(
@ -91,10 +91,10 @@ export class AddGroupDialogComponent implements OnInit {
const toAdd = Array.from(this.usersToAdd.values()); const toAdd = Array.from(this.usersToAdd.values());
this.groupService.addGroup(this.server, groupName) this.groupService.addGroup(this.controller, groupName)
.subscribe((group) => { .subscribe((group) => {
toAdd.forEach((user: User) => { toAdd.forEach((user: User) => {
this.groupService.addMemberToGroup(this.server, group, user) this.groupService.addMemberToGroup(this.controller, group, user)
.subscribe(() => { .subscribe(() => {
this.toasterService.success(`user ${user.username} was added`); this.toasterService.success(`user ${user.username} was added`);
}, },

View File

@ -12,14 +12,14 @@
*/ */
import { FormControl } from '@angular/forms'; import { FormControl } from '@angular/forms';
import { timer } from 'rxjs'; import { timer } from 'rxjs';
import {map, switchMap, tap} from 'rxjs/operators'; import { map, switchMap, tap } from 'rxjs/operators';
import {Server} from "../../../models/server"; import { Controller } from "../../../models/controller";
import {GroupService} from "../../../services/group.service"; import { GroupService } from "../../../services/group.service";
export const groupNameAsyncValidator = (server: Server, groupService: GroupService) => { export const groupNameAsyncValidator = (controller: Controller, groupService: GroupService) => {
return (control: FormControl) => { return (control: FormControl) => {
return timer(500).pipe( return timer(500).pipe(
switchMap(() => groupService.getGroups(server)), switchMap(() => groupService.getGroups(controller)),
map((response) => { map((response) => {
console.log(response); console.log(response);
return (response.find((n) => n.name === control.value) ? { projectExist: true } : null); return (response.find((n) => n.name === control.value) ? { projectExist: true } : null);

View File

@ -37,7 +37,7 @@
<ng-container matColumnDef="name"> <ng-container matColumnDef="name">
<th mat-header-cell *matHeaderCellDef mat-sort-header> Name</th> <th mat-header-cell *matHeaderCellDef mat-sort-header> Name</th>
<td mat-cell *matCellDef="let element"><a class="table-link" routerLink="/server/{{server.id}}/management/groups/{{element.user_group_id}}">{{element.name}}</a> </td> <td mat-cell *matCellDef="let element"><a class="table-link" routerLink="/controller/{{controller.id}}/management/groups/{{element.user_group_id}}">{{element.name}}</a> </td>
</ng-container> </ng-container>
<ng-container matColumnDef="created_at"> <ng-container matColumnDef="created_at">

View File

@ -12,10 +12,10 @@
*/ */
import {Component, OnInit, QueryList, ViewChild, ViewChildren} from '@angular/core'; import {Component, OnInit, QueryList, ViewChild, ViewChildren} from '@angular/core';
import {ActivatedRoute, Router} from "@angular/router"; import {ActivatedRoute, Router} from "@angular/router";
import {ServerService} from "../../services/server.service"; import {ControllerService} from "../../services/controller.service";
import {ToasterService} from "../../services/toaster.service"; import {ToasterService} from "../../services/toaster.service";
import {GroupService} from "../../services/group.service"; import {GroupService} from "../../services/group.service";
import {Server} from "../../models/server"; import {Controller} from "../../models/controller";
import {Group} from "../../models/groups/group"; import {Group} from "../../models/groups/group";
import {MatSort, Sort} from "@angular/material/sort"; import {MatSort, Sort} from "@angular/material/sort";
import {MatDialog} from "@angular/material/dialog"; import {MatDialog} from "@angular/material/dialog";
@ -33,7 +33,7 @@ import {MatTableDataSource} from "@angular/material/table";
styleUrls: ['./group-management.component.scss'] styleUrls: ['./group-management.component.scss']
}) })
export class GroupManagementComponent implements OnInit { export class GroupManagementComponent implements OnInit {
server: Server; controller: Controller;
@ViewChildren('groupsPaginator') groupsPaginator: QueryList<MatPaginator>; @ViewChildren('groupsPaginator') groupsPaginator: QueryList<MatPaginator>;
@ViewChildren('groupsSort') groupsSort: QueryList<MatSort>; @ViewChildren('groupsSort') groupsSort: QueryList<MatSort>;
@ -47,7 +47,7 @@ export class GroupManagementComponent implements OnInit {
constructor( constructor(
private route: ActivatedRoute, private route: ActivatedRoute,
private serverService: ServerService, private controllerService: ControllerService,
private toasterService: ToasterService, private toasterService: ToasterService,
public groupService: GroupService, public groupService: GroupService,
public dialog: MatDialog public dialog: MatDialog
@ -56,9 +56,9 @@ export class GroupManagementComponent implements OnInit {
ngOnInit(): void { ngOnInit(): void {
const serverId = this.route.parent.snapshot.paramMap.get('server_id'); const controllerId = this.route.parent.snapshot.paramMap.get('controller_id');
this.serverService.get(+serverId).then((server: Server) => { this.controllerService.get(+controllerId).then((controller: Controller) => {
this.server = server; this.controller = controller;
this.refresh(); this.refresh();
}); });
} }
@ -95,7 +95,7 @@ export class GroupManagementComponent implements OnInit {
addGroup() { addGroup() {
this.dialog this.dialog
.open(AddGroupDialogComponent, {width: '600px', height: '500px', data: {server: this.server}}) .open(AddGroupDialogComponent, {width: '600px', height: '500px', data: {controller: this.controller}})
.afterClosed() .afterClosed()
.subscribe((added: boolean) => { .subscribe((added: boolean) => {
if (added) { if (added) {
@ -105,7 +105,7 @@ export class GroupManagementComponent implements OnInit {
} }
refresh() { refresh() {
this.groupService.getGroups(this.server).subscribe((groups: Group[]) => { this.groupService.getGroups(this.controller).subscribe((groups: Group[]) => {
this.isReady = true; this.isReady = true;
this.groups = groups; this.groups = groups;
this.dataSource.data = groups; this.dataSource.data = groups;
@ -119,7 +119,7 @@ export class GroupManagementComponent implements OnInit {
.afterClosed() .afterClosed()
.subscribe((isDeletedConfirm) => { .subscribe((isDeletedConfirm) => {
if (isDeletedConfirm) { if (isDeletedConfirm) {
const observables = groupsToDelete.map((group: Group) => this.groupService.delete(this.server, group.user_group_id)); const observables = groupsToDelete.map((group: Group) => this.groupService.delete(this.controller, group.user_group_id));
forkJoin(observables) forkJoin(observables)
.subscribe(() => { .subscribe(() => {
this.refresh(); this.refresh();

View File

@ -5,10 +5,10 @@ import { MatIconModule } from '@angular/material/icon';
import { MatMenuModule } from '@angular/material/menu'; import { MatMenuModule } from '@angular/material/menu';
import { MatToolbarModule } from '@angular/material/toolbar'; import { MatToolbarModule } from '@angular/material/toolbar';
import { ImageManagerService } from 'app/services/image-manager.service'; import { ImageManagerService } from 'app/services/image-manager.service';
import { ServerService } from '../../../services/server.service'; import { ControllerService } from '../../../services/controller.service';
import { MockedServerService } from '../../../services/server.service.spec'; import { MockedControllerService } from '../../../services/controller.service.spec';
import { of } from 'rxjs'; import { of } from 'rxjs';
import { Server } from '../../../models/server'; import{ Controller } from '../../../models/controller';
import { AddImageDialogComponent } from './add-image-dialog.component'; import { AddImageDialogComponent } from './add-image-dialog.component';
import { NO_ERRORS_SCHEMA } from '@angular/core'; import { NO_ERRORS_SCHEMA } from '@angular/core';
@ -17,7 +17,7 @@ import { MockedToasterService } from 'app/services/toaster.service.spec';
import { MatSnackBarModule } from '@angular/material/snack-bar'; import { MatSnackBarModule } from '@angular/material/snack-bar';
export class MockedImageManagerService { export class MockedImageManagerService {
public getImages(server: Server) { public getImages(controller:Controller ) {
return of(); return of();
} }
@ -26,8 +26,8 @@ export class MockedImageManagerService {
describe('AddImageDialogComponent', () => { describe('AddImageDialogComponent', () => {
let component: AddImageDialogComponent; let component: AddImageDialogComponent;
let fixture: ComponentFixture<AddImageDialogComponent>; let fixture: ComponentFixture<AddImageDialogComponent>;
let mockedServerService = new MockedServerService(); let mockedControllerService = new MockedControllerService();
let mockedImageManagerService = new MockedImageManagerService() let mockedImageManagerService = new MockedImageManagerService()
let mockedToasterService = new MockedToasterService() let mockedToasterService = new MockedToasterService()
@ -42,7 +42,7 @@ describe('AddImageDialogComponent', () => {
MatSnackBarModule MatSnackBarModule
], ],
providers: [ providers: [
{ provide: ServerService, useValue: mockedServerService }, { provide: ControllerService, useValue: mockedControllerService },
{ provide: ImageManagerService, useValue: mockedImageManagerService }, { provide: ImageManagerService, useValue: mockedImageManagerService },
{ provide: MAT_DIALOG_DATA, useValue: {} }, { provide: MAT_DIALOG_DATA, useValue: {} },
{ provide: MatDialogRef, useValue: {} }, { provide: MatDialogRef, useValue: {} },

View File

@ -3,7 +3,7 @@ import { Component, Inject, OnInit } from '@angular/core';
import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
import { UploadServiceService } from 'app/common/uploading-processbar/upload-service.service'; import { UploadServiceService } from 'app/common/uploading-processbar/upload-service.service';
import { FileItem, FileUploader, ParsedResponseHeaders } from 'ng2-file-upload'; import { FileItem, FileUploader, ParsedResponseHeaders } from 'ng2-file-upload';
import { Server } from '../../../models/server'; import{ Controller } from '../../../models/controller';
import { ImageManagerService } from '../../../services/image-manager.service'; import { ImageManagerService } from '../../../services/image-manager.service';
import { ToasterService } from '../../../services/toaster.service'; import { ToasterService } from '../../../services/toaster.service';
@ -20,7 +20,7 @@ import { ToasterService } from '../../../services/toaster.service';
], ],
}) })
export class AddImageDialogComponent implements OnInit { export class AddImageDialogComponent implements OnInit {
server: Server; controller:Controller ;
isInstallAppliance: boolean = false; isInstallAppliance: boolean = false;
install_appliance: boolean = false; install_appliance: boolean = false;
selectFile: any = []; selectFile: any = [];
@ -36,7 +36,7 @@ export class AddImageDialogComponent implements OnInit {
) {} ) {}
public ngOnInit() { public ngOnInit() {
this.server = this.data; this.controller =this.data;
this.uploaderImage = new FileUploader({}); this.uploaderImage = new FileUploader({});
this.uploaderImage.onAfterAddingFile = (file) => { this.uploaderImage.onAfterAddingFile = (file) => {
@ -98,11 +98,11 @@ export class AddImageDialogComponent implements OnInit {
let file = event; let file = event;
let fileReader: FileReader = new FileReader(); let fileReader: FileReader = new FileReader();
fileReader.onloadend = () => { fileReader.onloadend = () => {
const url = this.imageService.getImagePath(this.server, this.install_appliance, fileName); const url = this.imageService.getImagePath(this.controller, this.install_appliance, fileName);
const itemToUpload = this.uploaderImage.queue[i]; const itemToUpload = this.uploaderImage.queue[i];
itemToUpload.url = url; itemToUpload.url = url;
if ((itemToUpload as any).options) (itemToUpload as any).options.disableMultipart = true; if ((itemToUpload as any).options) (itemToUpload as any).options.disableMultipart = true;
(itemToUpload as any).options.headers = [{ name: 'Authorization', value: 'Bearer ' + this.server.authToken }]; (itemToUpload as any).options.headers = [{ name: 'Authorization', value: 'Bearer ' + this.controller.authToken }];
this.uploaderImage.uploadItem(itemToUpload); this.uploaderImage.uploadItem(itemToUpload);
}; };
fileReader.readAsText(file); fileReader.readAsText(file);

View File

@ -10,14 +10,14 @@ import { MockedToasterService } from 'app/services/toaster.service.spec';
import { Server } from 'http'; import { Server } from 'http';
import { of } from 'rxjs'; import { of } from 'rxjs';
import { ImageManagerService } from '../../../services/image-manager.service'; import { ImageManagerService } from '../../../services/image-manager.service';
import { ServerService } from '../../../services/server.service'; import { ControllerService } from '../../../services/controller.service';
import { MockedServerService } from '../../../services/server.service.spec'; import { MockedControllerService } from '../../../services/controller.service.spec';
import { ImageManagerComponent } from '../image-manager.component'; import { ImageManagerComponent } from '../image-manager.component';
import { DeleteAllImageFilesDialogComponent } from './deleteallfiles-dialog.component'; import { DeleteAllImageFilesDialogComponent } from './deleteallfiles-dialog.component';
export class MockedImageManagerService { export class MockedImageManagerService {
public deleteALLFile(server: Server, image_path) { public deleteALLFile(controller:Server , image_path) {
return of(); return of();
} }
} }
@ -25,7 +25,7 @@ export class MockedImageManagerService {
describe('DeleteAllImageFilesDialogComponent', () => { describe('DeleteAllImageFilesDialogComponent', () => {
let component: DeleteAllImageFilesDialogComponent; let component: DeleteAllImageFilesDialogComponent;
let fixture: ComponentFixture<DeleteAllImageFilesDialogComponent>; let fixture: ComponentFixture<DeleteAllImageFilesDialogComponent>;
let mockedServerService = new MockedServerService(); let mockedControllerService = new MockedControllerService();
let mockedImageManagerService = new MockedImageManagerService() let mockedImageManagerService = new MockedImageManagerService()
let mockedToasterService = new MockedToasterService() let mockedToasterService = new MockedToasterService()
@ -39,7 +39,7 @@ export class MockedImageManagerService {
MatDialogModule, MatDialogModule,
], ],
providers: [ providers: [
{ provide: ServerService, useValue: mockedServerService }, { provide: ControllerService, useValue: mockedControllerService },
{ provide: ImageManagerService, useValue: mockedImageManagerService }, { provide: ImageManagerService, useValue: mockedImageManagerService },
{ provide: MAT_DIALOG_DATA, useValue: {} }, { provide: MAT_DIALOG_DATA, useValue: {} },
{ provide: MatDialogRef, useValue: {} }, { provide: MatDialogRef, useValue: {} },

View File

@ -35,7 +35,7 @@ export class DeleteAllImageFilesDialogComponent implements OnInit {
deleteFile() { deleteFile() {
const calls = []; const calls = [];
this.deleteData.deleteFilesPaths.forEach(pathElement => { this.deleteData.deleteFilesPaths.forEach(pathElement => {
calls.push(this.imageService.deleteFile(this.deleteData.server, pathElement.filename).pipe(catchError(error => of(error)))) calls.push(this.imageService.deleteFile(this.deleteData.controller, pathElement.filename).pipe(catchError(error => of(error))))
}); });
Observable.forkJoin(calls).subscribe(responses => { Observable.forkJoin(calls).subscribe(responses => {
this.deleteFliesDetails = responses.filter(x => x !== null) this.deleteFliesDetails = responses.filter(x => x !== null)

View File

@ -20,14 +20,14 @@ export class imageDatabase {
} }
export class imageDataSource extends DataSource<Image> { export class imageDataSource extends DataSource<Image> {
constructor(private serverDatabase: imageDatabase) { constructor(private controllerDatabase: imageDatabase) {
super(); super();
} }
connect(): Observable<Image[]> { connect(): Observable<Image[]> {
return merge(this.serverDatabase.dataChange).pipe( return merge(this.controllerDatabase.dataChange).pipe(
map(() => { map(() => {
return this.serverDatabase.data; return this.controllerDatabase.data;
}) })
); );
} }

View File

@ -15,7 +15,7 @@
</div> </div>
<div class="default-content"> <div class="default-content">
<app-server-discovery></app-server-discovery> <app-controller-discovery></app-controller-discovery>
<div class="mat-elevation-z8"> <div class="mat-elevation-z8">
<mat-table #table [dataSource]="dataSource"> <mat-table #table [dataSource]="dataSource">

View File

@ -6,10 +6,10 @@ import { MatIconModule } from '@angular/material/icon';
import { MatMenuModule } from '@angular/material/menu'; import { MatMenuModule } from '@angular/material/menu';
import { MatToolbarModule } from '@angular/material/toolbar'; import { MatToolbarModule } from '@angular/material/toolbar';
import { ImageManagerService } from 'app/services/image-manager.service'; import { ImageManagerService } from 'app/services/image-manager.service';
import { ServerService } from 'app/services/server.service'; import { ControllerService } from 'app/services/controller.service';
import { MockedServerService } from 'app/services/server.service.spec'; import { MockedControllerService } from 'app/services/controller.service.spec';
import { of } from 'rxjs'; import { of } from 'rxjs';
import { Server } from '../../models/server'; import{ Controller } from '../../models/controller';
import { ImageManagerComponent } from './image-manager.component'; import { ImageManagerComponent } from './image-manager.component';
import { Image } from '../../models/images'; import { Image } from '../../models/images';
@ -23,11 +23,11 @@ import { ToasterService } from 'app/services/toaster.service';
import { MockedToasterService } from 'app/services/toaster.service.spec'; import { MockedToasterService } from 'app/services/toaster.service.spec';
export class MockedImageManagerService { export class MockedImageManagerService {
public getImages(server: Server) { public getImages(controller:Controller ) {
return of(); return of();
} }
public deleteFile(server: Server, image_path) { public deleteFile(controller:Controller , image_path) {
return of(); return of();
} }
@ -37,7 +37,7 @@ describe('ImageManagerComponent', () => {
let component: ImageManagerComponent; let component: ImageManagerComponent;
let fixture: ComponentFixture<ImageManagerComponent>; let fixture: ComponentFixture<ImageManagerComponent>;
let mockedServerService = new MockedServerService(); let mockedControllerService = new MockedControllerService();
let mockedImageManagerService = new MockedImageManagerService() let mockedImageManagerService = new MockedImageManagerService()
let mockedProgressService = new MockedProgressService() let mockedProgressService = new MockedProgressService()
let mockedVersionService = new MockedVersionService() let mockedVersionService = new MockedVersionService()
@ -59,7 +59,7 @@ describe('ImageManagerComponent', () => {
provide: ActivatedRoute, provide: ActivatedRoute,
useValue: activatedRoute, useValue: activatedRoute,
}, },
{ provide: ServerService, useValue: mockedServerService }, { provide: ControllerService, useValue: mockedControllerService },
{ provide: ImageManagerService, useValue: mockedImageManagerService }, { provide: ImageManagerService, useValue: mockedImageManagerService },
{ provide: ProgressService, useValue: mockedProgressService }, { provide: ProgressService, useValue: mockedProgressService },
{ provide: VersionService, useValue: mockedVersionService }, { provide: VersionService, useValue: mockedVersionService },

View File

@ -1,10 +1,10 @@
import { Component, OnInit } from '@angular/core'; import { Component, OnInit } from '@angular/core';
import { ActivatedRoute } from '@angular/router'; import { ActivatedRoute } from '@angular/router';
import { ServerService } from '../../services/server.service'; import { ControllerService } from '../../services/controller.service';
import { VersionService } from '../../services/version.service'; import { VersionService } from '../../services/version.service';
import { ProgressService } from 'app/common/progress/progress.service'; import { ProgressService } from 'app/common/progress/progress.service';
import { Image } from '../../models/images'; import { Image } from '../../models/images';
import { Server } from '../../models/server'; import{ Controller } from '../../models/controller';
import { ImageManagerService } from "../../services/image-manager.service"; import { ImageManagerService } from "../../services/image-manager.service";
import { DataSource, SelectionModel } from '@angular/cdk/collections'; import { DataSource, SelectionModel } from '@angular/cdk/collections';
import { AddImageDialogComponent } from './add-image-dialog/add-image-dialog.component'; import { AddImageDialogComponent } from './add-image-dialog/add-image-dialog.component';
@ -19,7 +19,7 @@ import { imageDataSource, imageDatabase } from "./image-database-file";
styleUrls: ['./image-manager.component.scss'] styleUrls: ['./image-manager.component.scss']
}) })
export class ImageManagerComponent implements OnInit { export class ImageManagerComponent implements OnInit {
server: Server; controller:Controller ;
public version: string; public version: string;
dataSource: imageDataSource; dataSource: imageDataSource;
imageDatabase = new imageDatabase(); imageDatabase = new imageDatabase();
@ -32,7 +32,7 @@ export class ImageManagerComponent implements OnInit {
private imageService: ImageManagerService, private imageService: ImageManagerService,
private progressService: ProgressService, private progressService: ProgressService,
private route: ActivatedRoute, private route: ActivatedRoute,
private serverService: ServerService, private controllerService: ControllerService,
private versionService: VersionService, private versionService: VersionService,
private dialog: MatDialog, private dialog: MatDialog,
private toasterService: ToasterService, private toasterService: ToasterService,
@ -40,13 +40,13 @@ export class ImageManagerComponent implements OnInit {
) { } ) { }
ngOnInit(): void { ngOnInit(): void {
let server_id = parseInt(this.route.snapshot.paramMap.get('server_id')); let controller_id = parseInt(this.route.snapshot.paramMap.get('controller_id'));
this.serverService.get(server_id).then((server: Server) => { this.controllerService.get(controller_id).then((controller:Controller ) => {
this.server = server; this.controller = controller;
if (server.authToken) { if (controller.authToken) {
this.getImages() this.getImages()
} }
// this.versionService.get(this.server).subscribe((version: Version) => { // this.versionService.get(this.controller).subscribe((version: Version) => {
// this.version = version.version; // this.version = version.version;
// }); // });
}); });
@ -54,7 +54,7 @@ export class ImageManagerComponent implements OnInit {
} }
getImages() { getImages() {
this.imageService.getImages(this.server).subscribe( this.imageService.getImages(this.controller).subscribe(
(images: Image[]) => { (images: Image[]) => {
this.imageDatabase.addImages(images) this.imageDatabase.addImages(images)
}, },
@ -66,7 +66,7 @@ export class ImageManagerComponent implements OnInit {
} }
deleteFile(path) { deleteFile(path) {
this.imageService.deleteFile(this.server, path).subscribe( this.imageService.deleteFile(this.controller, path).subscribe(
(res) => { (res) => {
this.getImages() this.getImages()
this.unChecked() this.unChecked()
@ -106,7 +106,7 @@ export class ImageManagerComponent implements OnInit {
maxHeight: '550px', maxHeight: '550px',
autoFocus: false, autoFocus: false,
disableClose: true, disableClose: true,
data: this.server data: this.controller
}); });
dialogRef.afterClosed().subscribe((isAddes: boolean) => { dialogRef.afterClosed().subscribe((isAddes: boolean) => {
@ -128,7 +128,7 @@ export class ImageManagerComponent implements OnInit {
autoFocus: false, autoFocus: false,
disableClose: true, disableClose: true,
data: { data: {
server: this.server, controller: this.controller,
deleteFilesPaths: this.selection.selected deleteFilesPaths: this.selection.selected
} }
}); });

View File

@ -2,11 +2,11 @@ import { Component, DoCheck, OnInit, ViewEncapsulation } from '@angular/core';
import { FormControl, FormGroup, Validators } from '@angular/forms'; import { FormControl, FormGroup, Validators } from '@angular/forms';
import { ActivatedRoute, Router } from '@angular/router'; import { ActivatedRoute, Router } from '@angular/router';
import { AuthResponse } from '../../models/authResponse'; import { AuthResponse } from '../../models/authResponse';
import { Server } from '../../models/server'; import{ Controller } from '../../models/controller';
import { Version } from '../../models/version'; import { Version } from '../../models/version';
import { LoginService } from '../../services/login.service'; import { LoginService } from '../../services/login.service';
import { ServerDatabase } from '../../services/server.database'; import { ControllerDatabase } from '../../services/controller.database';
import { ServerService } from '../../services/server.service'; import { ControllerService } from '../../services/controller.service';
import { ThemeService } from '../../services/theme.service'; import { ThemeService } from '../../services/theme.service';
import { ToasterService } from '../../services/toaster.service'; import { ToasterService } from '../../services/toaster.service';
import { VersionService } from '../../services/version.service'; import { VersionService } from '../../services/version.service';
@ -18,7 +18,7 @@ import { VersionService } from '../../services/version.service';
encapsulation: ViewEncapsulation.None, encapsulation: ViewEncapsulation.None,
}) })
export class LoginComponent implements OnInit, DoCheck { export class LoginComponent implements OnInit, DoCheck {
private server: Server; private controller:Controller ;
public version: string; public version: string;
public isLightThemeEnabled: boolean = false; public isLightThemeEnabled: boolean = false;
public loginError: boolean = false; public loginError: boolean = false;
@ -33,8 +33,8 @@ export class LoginComponent implements OnInit, DoCheck {
constructor( constructor(
private loginService: LoginService, private loginService: LoginService,
private serverService: ServerService, private controllerService: ControllerService,
private serverDatabase: ServerDatabase, private controllerDatabase: ControllerDatabase,
private route: ActivatedRoute, private route: ActivatedRoute,
private router: Router, private router: Router,
private toasterService: ToasterService, private toasterService: ToasterService,
@ -43,16 +43,16 @@ export class LoginComponent implements OnInit, DoCheck {
) {} ) {}
async ngOnInit() { async ngOnInit() {
const server_id = this.route.snapshot.paramMap.get('server_id'); const controller_id = this.route.snapshot.paramMap.get('controller_id');
this.returnUrl = this.route.snapshot.queryParams['returnUrl'] || '/'; this.returnUrl = this.route.snapshot.queryParams['returnUrl'] || '/';
this.serverService.get(parseInt(server_id, 10)).then((server: Server) => { this.controllerService.get(parseInt(controller_id, 10)).then((controller:Controller ) => {
this.server = server; this.controller = controller;
if (server.authToken) { if (controller.authToken) {
this.router.navigate(['/server', this.server.id, 'projects']); this.router.navigate(['/controller', this.controller.id, 'projects']);
} }
this.versionService.get(this.server).subscribe((version: Version) => { this.versionService.get(this.controller).subscribe((version: Version) => {
this.version = version.version; this.version = version.version;
}); });
}); });
@ -78,17 +78,17 @@ export class LoginComponent implements OnInit, DoCheck {
let username = this.loginForm.get('username').value; let username = this.loginForm.get('username').value;
let password = this.loginForm.get('password').value; let password = this.loginForm.get('password').value;
this.loginService.login(this.server, username, password).subscribe( this.loginService.login(this.controller, username, password).subscribe(
async (response: AuthResponse) => { async (response: AuthResponse) => {
let server = this.server; let controller = this.controller;
server.authToken = response.access_token; controller.authToken = response.access_token;
server.username = username; controller.username = username;
server.password = password; controller.password = password;
server.tokenExpired = false; controller.tokenExpired = false;
await this.serverService.update(server); await this.controllerService.update(controller);
if (this.returnUrl.length <= 1) { if (this.returnUrl.length <= 1) {
this.router.navigate(['/server', this.server.id, 'projects']); this.router.navigate(['/controller', this.controller.id, 'projects']);
} else { } else {
this.router.navigateByUrl(this.returnUrl); this.router.navigateByUrl(this.returnUrl);
} }

View File

@ -12,8 +12,8 @@
*/ */
import { Component, OnInit } from '@angular/core'; import { Component, OnInit } from '@angular/core';
import {ActivatedRoute, Router} from "@angular/router"; import {ActivatedRoute, Router} from "@angular/router";
import {Server} from "@models/server"; import {Controller} from "@models/controller";
import {ServerService} from "@services/server.service"; import {ControllerService} from "@services/controller.service";
@Component({ @Component({
selector: 'app-management', selector: 'app-management',
@ -22,19 +22,19 @@ import {ServerService} from "@services/server.service";
}) })
export class ManagementComponent implements OnInit { export class ManagementComponent implements OnInit {
server: Server; controller: Controller;
links = ['users', 'groups', 'roles', 'permissions']; links = ['users', 'groups', 'roles', 'permissions'];
activeLink: string = this.links[0]; activeLink: string = this.links[0];
constructor( constructor(
private route: ActivatedRoute, private route: ActivatedRoute,
public router: Router, public router: Router,
private serverService: ServerService) { } private controllerService: ControllerService) { }
ngOnInit(): void { ngOnInit(): void {
const serverId = this.route.snapshot.paramMap.get('server_id'); const controllerId = this.route.snapshot.paramMap.get('controller_id');
this.serverService.get(+serverId).then((server: Server) => { this.controllerService.get(+controllerId).then((controller: Controller) => {
this.server = server; this.controller = controller;
}); });
} }
} }

View File

@ -2,6 +2,6 @@
<div class="default-header"> <div class="default-header">
<br /> <br />
<h1>404 Page not found</h1> <h1>404 Page not found</h1>
<button mat-button routerLink="/servers">Navigate to homepage</button> <button mat-button routerLink="/controllers">Navigate to homepage</button>
</div> </div>
</div> </div>

View File

@ -4,7 +4,7 @@
<div class="information-box"> <div class="information-box">
<div> <div>
<app-path-auto-complete <app-path-auto-complete
[server]="server" [controller]="controller"
(update)="permission.path = $event"></app-path-auto-complete> (update)="permission.path = $event"></app-path-auto-complete>
</div> </div>
<div class="methods"> <div class="methods">

View File

@ -5,7 +5,7 @@ import {ApiInformationService} from "@services/ApiInformation/api-information.se
import {PermissionsService} from "@services/permissions.service"; import {PermissionsService} from "@services/permissions.service";
import {ToasterService} from "@services/toaster.service"; import {ToasterService} from "@services/toaster.service";
import {Methods, Permission, PermissionActions} from "@models/api/permission"; import {Methods, Permission, PermissionActions} from "@models/api/permission";
import {Server} from "@models/server"; import {Controller} from "@models/controller";
import {Observable, of, throwError} from "rxjs"; import {Observable, of, throwError} from "rxjs";
import {HttpErrorResponse} from "@angular/common/http"; import {HttpErrorResponse} from "@angular/common/http";
@ -79,7 +79,7 @@ describe('AddPermissionLineComponent', () => {
comp.permission.action = PermissionActions.DENY; comp.permission.action = PermissionActions.DENY;
comp.permission.description = "john doe is here"; comp.permission.description = "john doe is here";
permissionService.add = (server: Server, permission: Permission): Observable<Permission> => { permissionService.add = (controller: Controller, permission: Permission): Observable<Permission> => {
return of(permission); return of(permission);
}; };
@ -111,12 +111,12 @@ describe('AddPermissionLineComponent', () => {
let errorMessage: string; let errorMessage: string;
permissionService.add = (server: Server, permission: Permission): Observable<Permission> => { permissionService.add = (controller: Controller, permission: Permission): Observable<Permission> => {
const error = new HttpErrorResponse({ const error = new HttpErrorResponse({
error: new Error("An error occur"), error: new Error("An error occur"),
headers: undefined, headers: undefined,
status: 500, status: 500,
statusText: 'error from server' statusText: 'error from controller'
}); });
return throwError(error); return throwError(error);
}; };

View File

@ -11,7 +11,7 @@
* Author: Sylvain MATHIEU, Elise LEBEAU * Author: Sylvain MATHIEU, Elise LEBEAU
*/ */
import {Component, EventEmitter, Input, OnInit, Output} from '@angular/core'; import {Component, EventEmitter, Input, OnInit, Output} from '@angular/core';
import {Server} from "@models/server"; import {Controller} from "@models/controller";
import {ApiInformationService} from "@services/ApiInformation/api-information.service"; import {ApiInformationService} from "@services/ApiInformation/api-information.service";
import {Methods, Permission, PermissionActions} from "@models/api/permission"; import {Methods, Permission, PermissionActions} from "@models/api/permission";
import {PermissionsService} from "@services/permissions.service"; import {PermissionsService} from "@services/permissions.service";
@ -25,7 +25,7 @@ import {HttpErrorResponse} from "@angular/common/http";
}) })
export class AddPermissionLineComponent implements OnInit { export class AddPermissionLineComponent implements OnInit {
@Input() server: Server; @Input() controller: Controller;
@Output() addPermissionEvent = new EventEmitter<void>(); @Output() addPermissionEvent = new EventEmitter<void>();
permission: Permission = { permission: Permission = {
action: PermissionActions.ALLOW, action: PermissionActions.ALLOW,
@ -69,7 +69,7 @@ export class AddPermissionLineComponent implements OnInit {
} }
save() { save() {
this.permissionService.add(this.server, this.permission) this.permissionService.add(this.controller, this.permission)
.subscribe(() => { .subscribe(() => {
this.toasterService.success(`permission was created`); this.toasterService.success(`permission was created`);
this.reset(); this.reset();

View File

@ -12,7 +12,7 @@
*/ */
import {Component, EventEmitter, Input, OnInit, Output} from '@angular/core'; import {Component, EventEmitter, Input, OnInit, Output} from '@angular/core';
import {ApiInformationService} from "@services/ApiInformation/api-information.service"; import {ApiInformationService} from "@services/ApiInformation/api-information.service";
import {Server} from "@models/server"; import {Controller} from "@models/controller";
import {PermissionPath} from "@components/permissions-management/add-permission-line/path-auto-complete/PermissionPath"; import {PermissionPath} from "@components/permissions-management/add-permission-line/path-auto-complete/PermissionPath";
import {SubPath} from "@components/permissions-management/add-permission-line/path-auto-complete/SubPath"; import {SubPath} from "@components/permissions-management/add-permission-line/path-auto-complete/SubPath";
import {IGenericApiObject} from "@services/ApiInformation/IGenericApiObject"; import {IGenericApiObject} from "@services/ApiInformation/IGenericApiObject";
@ -26,7 +26,7 @@ export class PathAutoCompleteComponent implements OnInit {
@Output() update = new EventEmitter<string>(); @Output() update = new EventEmitter<string>();
@Input() server: Server; @Input() controller: Controller;
path: PermissionPath = new PermissionPath(); path: PermissionPath = new PermissionPath();
values: string[] = []; values: string[] = [];
private completeData: { data: IGenericApiObject[]; key: string }; private completeData: { data: IGenericApiObject[]; key: string };
@ -73,7 +73,7 @@ export class PathAutoCompleteComponent implements OnInit {
valueChanged(value: string) { valueChanged(value: string) {
if (value.match(this.apiInformationService.bracketIdRegex) && !this.path.containStar()) { if (value.match(this.apiInformationService.bracketIdRegex) && !this.path.containStar()) {
this.apiInformationService.getListByObjectId(this.server, value, undefined, this.path.getVariables()) this.apiInformationService.getListByObjectId(this.controller, value, undefined, this.path.getVariables())
.subscribe((data) => { .subscribe((data) => {
this.mode = 'COMPLETE'; this.mode = 'COMPLETE';
this.completeData = {data, key: value}; this.completeData = {data, key: value};

View File

@ -1,7 +1,7 @@
import {async, fakeAsync, TestBed, tick} from "@angular/core/testing"; import {async, fakeAsync, TestBed, tick} from "@angular/core/testing";
import {DisplayPathPipe} from "@components/permissions-management/display-path.pipe"; import {DisplayPathPipe} from "@components/permissions-management/display-path.pipe";
import {ApiInformationService} from "@services/ApiInformation/api-information.service"; import {ApiInformationService} from "@services/ApiInformation/api-information.service";
import {Server} from "@models/server"; import {Controller} from "@models/controller";
import {Observable, of} from "rxjs"; import {Observable, of} from "rxjs";
import {IExtraParams} from "@services/ApiInformation/IExtraParams"; import {IExtraParams} from "@services/ApiInformation/IExtraParams";
import {IGenericApiObject} from "@services/ApiInformation/IGenericApiObject"; import {IGenericApiObject} from "@services/ApiInformation/IGenericApiObject";
@ -33,7 +33,7 @@ describe('DisplayPathPipe', () => {
}; };
apiService apiService
.getListByObjectId = (server: Server, key: string, value?: string, extraParams?: IExtraParams[]): Observable<IGenericApiObject[]> => { .getListByObjectId = (controller: Controller, key: string, value?: string, extraParams?: IExtraParams[]): Observable<IGenericApiObject[]> => {
if (key === 'project_id') { if (key === 'project_id') {
return of([{id: '1111-2222-3333', name: 'myProject'}]); return of([{id: '1111-2222-3333', name: 'myProject'}]);
} }
@ -44,9 +44,9 @@ describe('DisplayPathPipe', () => {
let result: string; let result: string;
const server = new Server(); const controller = new Controller();
comp comp
.transform('/project/1111-2222-3333/nodes/2222-2222-2222', server) .transform('/project/1111-2222-3333/nodes/2222-2222-2222', controller)
.subscribe((res: string) => { .subscribe((res: string) => {
result = res; result = res;
}); });

View File

@ -14,7 +14,7 @@ import {Pipe, PipeTransform} from '@angular/core';
import {map, switchMap} from "rxjs/operators"; import {map, switchMap} from "rxjs/operators";
import {forkJoin, Observable, of} from "rxjs"; import {forkJoin, Observable, of} from "rxjs";
import {ApiInformationService} from "@services/ApiInformation/api-information.service"; import {ApiInformationService} from "@services/ApiInformation/api-information.service";
import {Server} from "@models/server"; import {Controller} from "@models/controller";
@Pipe({ @Pipe({
name: 'displayPath' name: 'displayPath'
@ -24,8 +24,8 @@ export class DisplayPathPipe implements PipeTransform {
constructor(private apiInformation: ApiInformationService) { constructor(private apiInformation: ApiInformationService) {
} }
transform(originalPath: string, server: Server): Observable<string> { transform(originalPath: string, controller: Controller): Observable<string> {
if (!server) { if (!controller) {
return of(originalPath); return of(originalPath);
} }
return this.apiInformation return this.apiInformation
@ -34,7 +34,7 @@ export class DisplayPathPipe implements PipeTransform {
if (values.length === 0) { if (values.length === 0) {
return of([]); return of([]);
} }
const obs = values.map((k) => this.apiInformation.getListByObjectId(server, k.key, k.value, values)); const obs = values.map((k) => this.apiInformation.getListByObjectId(controller, k.key, k.value, values));
return forkJoin(obs); return forkJoin(obs);
}), }),
map((values: { id: string; name: string }[][]) => { map((values: { id: string; name: string }[][]) => {

View File

@ -18,9 +18,9 @@
</div> </div>
<div> <div>
<div <div
[matTooltip]="permission.path | displayPath: server | async" [matTooltip]="permission.path | displayPath: controller | async"
matTooltipClass="custom-tooltip"> matTooltipClass="custom-tooltip">
{{permission.path | displayPath: server | async}} {{permission.path | displayPath: controller | async}}
</div> </div>
</div> </div>
<div> <div>

View File

@ -12,7 +12,7 @@
*/ */
import {Component, EventEmitter, Input, OnInit, Output} from '@angular/core'; import {Component, EventEmitter, Input, OnInit, Output} from '@angular/core';
import {Methods, Permission} from "@models/api/permission"; import {Methods, Permission} from "@models/api/permission";
import {Server} from '@models/server'; import {Controller} from '@models/controller';
import {ApiInformationService} from "@services/ApiInformation/api-information.service"; import {ApiInformationService} from "@services/ApiInformation/api-information.service";
import {PermissionsService} from "@services/permissions.service"; import {PermissionsService} from "@services/permissions.service";
import {ToasterService} from "@services/toaster.service"; import {ToasterService} from "@services/toaster.service";
@ -26,7 +26,7 @@ import {DeletePermissionDialogComponent} from "@components/permissions-managemen
}) })
export class PermissionEditLineComponent { export class PermissionEditLineComponent {
@Input() permission: Permission; @Input() permission: Permission;
@Input() server: Server; @Input() controller: Controller;
isEditable = false; isEditable = false;
@Output() update = new EventEmitter<void>(); @Output() update = new EventEmitter<void>();
@ -44,7 +44,7 @@ export class PermissionEditLineComponent {
.afterClosed() .afterClosed()
.subscribe((confirm: boolean) => { .subscribe((confirm: boolean) => {
if (confirm) { if (confirm) {
this.permissionService.delete(this.server, this.permission.permission_id) this.permissionService.delete(this.controller, this.permission.permission_id)
.subscribe(() => { .subscribe(() => {
this.toasterService.success(`Permission was deleted`); this.toasterService.success(`Permission was deleted`);
this.update.emit(); this.update.emit();
@ -58,7 +58,7 @@ export class PermissionEditLineComponent {
} }
onSave() { onSave() {
this.permissionService.update(this.server, this.permission) this.permissionService.update(this.controller, this.permission)
.subscribe(() => { .subscribe(() => {
this.toasterService.success(`Permission was updated`); this.toasterService.success(`Permission was updated`);
this.update.emit(); this.update.emit();

View File

@ -1,7 +1,7 @@
<div class="content" *ngIf="isReady; else loading"> <div class="content" *ngIf="isReady; else loading">
<div class="add"> <div class="add">
<app-add-permission-line <app-add-permission-line
[server]="server" [controller]="controller"
(addPermissionEvent)="refresh()"></app-add-permission-line> (addPermissionEvent)="refresh()"></app-add-permission-line>
</div> </div>
<div class="permission-content default-content"> <div class="permission-content default-content">
@ -22,7 +22,7 @@
<div *ngFor="let permission of permissions | permissionsFilter: searchPermissions?.id | paginator: pageEvent"> <div *ngFor="let permission of permissions | permissionsFilter: searchPermissions?.id | paginator: pageEvent">
<app-permission-add-edit-line <app-permission-add-edit-line
[permission]="permission" [permission]="permission"
[server]="server" [controller]="controller"
(update)="refresh()"></app-permission-add-edit-line> (update)="refresh()"></app-permission-add-edit-line>
</div> </div>
<mat-paginator [length]="permissions.length" (page)="pageEvent = $event" <mat-paginator [length]="permissions.length" (page)="pageEvent = $event"

View File

@ -12,12 +12,12 @@
*/ */
import {Component, ComponentFactoryResolver, OnInit, ViewChild, ViewContainerRef} from '@angular/core'; import {Component, ComponentFactoryResolver, OnInit, ViewChild, ViewContainerRef} from '@angular/core';
import {ActivatedRoute, Router} from "@angular/router"; import {ActivatedRoute, Router} from "@angular/router";
import {Server} from "@models/server"; import {Controller} from "@models/controller";
import {PermissionsService} from "@services/permissions.service"; import {PermissionsService} from "@services/permissions.service";
import {ProgressService} from "../../common/progress/progress.service"; import {ProgressService} from "../../common/progress/progress.service";
import {Permission} from "@models/api/permission"; import {Permission} from "@models/api/permission";
import {AddPermissionLineComponent} from "@components/permissions-management/add-permission-line/add-permission-line.component"; import {AddPermissionLineComponent} from "@components/permissions-management/add-permission-line/add-permission-line.component";
import {ServerService} from "@services/server.service"; import {ControllerService} from "@services/controller.service";
import {PageEvent} from "@angular/material/paginator"; import {PageEvent} from "@angular/material/paginator";
import {ApiInformationService} from "@services/ApiInformation/api-information.service"; import {ApiInformationService} from "@services/ApiInformation/api-information.service";
import {IGenericApiObject} from "@services/ApiInformation/IGenericApiObject"; import {IGenericApiObject} from "@services/ApiInformation/IGenericApiObject";
@ -28,7 +28,7 @@ import {IGenericApiObject} from "@services/ApiInformation/IGenericApiObject";
styleUrls: ['./permissions-management.component.scss'] styleUrls: ['./permissions-management.component.scss']
}) })
export class PermissionsManagementComponent implements OnInit { export class PermissionsManagementComponent implements OnInit {
server: Server; controller: Controller;
permissions: Permission[]; permissions: Permission[];
addPermissionLineComp = AddPermissionLineComponent; addPermissionLineComp = AddPermissionLineComponent;
newPermissionEdit = false; newPermissionEdit = false;
@ -46,19 +46,19 @@ export class PermissionsManagementComponent implements OnInit {
private router: Router, private router: Router,
private permissionService: PermissionsService, private permissionService: PermissionsService,
private progressService: ProgressService, private progressService: ProgressService,
private serverService: ServerService, private controllerService: ControllerService,
private apiInformationService: ApiInformationService) { } private apiInformationService: ApiInformationService) { }
ngOnInit(): void { ngOnInit(): void {
const serverId = this.route.parent.snapshot.paramMap.get('server_id'); const controllerId = this.route.parent.snapshot.paramMap.get('controller_id');
this.serverService.get(+serverId).then((server: Server) => { this.controllerService.get(+controllerId).then((controller: Controller) => {
this.server = server; this.controller = controller;
this.refresh(); this.refresh();
}); });
} }
refresh() { refresh() {
this.permissionService.list(this.server).subscribe( this.permissionService.list(this.controller).subscribe(
(permissions: Permission[]) => { (permissions: Permission[]) => {
this.permissions = permissions; this.permissions = permissions;
this.isReady = true; this.isReady = true;

View File

@ -2,7 +2,7 @@
<div class="default-header"> <div class="default-header">
<div class="row"> <div class="row">
<h1 class="col">Built-in preferences</h1> <h1 class="col">Built-in preferences</h1>
<button class="top-button" class="cancel-button" routerLink="/server/{{ serverId }}/preferences" mat-button> <button class="top-button" class="cancel-button" routerLink="/controller/{{ controllerId }}/preferences" mat-button>
Back Back
</button> </button>
</div> </div>
@ -10,13 +10,13 @@
<div class="default-content"> <div class="default-content">
<div class="listcontainer mat-elevation-z8"> <div class="listcontainer mat-elevation-z8">
<mat-nav-list> <mat-nav-list>
<mat-list-item routerLink="/server/{{ serverId }}/preferences/builtin/ethernet-hubs"> <mat-list-item routerLink="/controller/{{ controllerId }}/preferences/builtin/ethernet-hubs">
Ethernet hubs Ethernet hubs
</mat-list-item> </mat-list-item>
<mat-list-item routerLink="/server/{{ serverId }}/preferences/builtin/ethernet-switches"> <mat-list-item routerLink="/controller/{{ controllerId }}/preferences/builtin/ethernet-switches">
Ethernet switches Ethernet switches
</mat-list-item> </mat-list-item>
<mat-list-item routerLink="/server/{{ serverId }}/preferences/builtin/cloud-nodes"> Cloud nodes </mat-list-item> <mat-list-item routerLink="/controller/{{ controllerId }}/preferences/builtin/cloud-nodes"> Cloud nodes </mat-list-item>
</mat-nav-list> </mat-nav-list>
</div> </div>
</div> </div>

View File

@ -48,7 +48,7 @@ describe('BuiltInPreferencesComponent', () => {
expect(component).toBeTruthy(); expect(component).toBeTruthy();
}); });
it('should set correct server id', () => { it('should set correct controller id', () => {
expect(component.serverId).toBe('1'); expect(component.controllerId).toBe('1');
}); });
}); });

View File

@ -7,11 +7,11 @@ import { ActivatedRoute } from '@angular/router';
styleUrls: ['./built-in-preferences.component.scss', '../preferences.component.scss'], styleUrls: ['./built-in-preferences.component.scss', '../preferences.component.scss'],
}) })
export class BuiltInPreferencesComponent implements OnInit { export class BuiltInPreferencesComponent implements OnInit {
public serverId: string = ''; public controllerId: string = '';
constructor(private route: ActivatedRoute) {} constructor(private route: ActivatedRoute) {}
ngOnInit() { ngOnInit() {
this.serverId = this.route.snapshot.paramMap.get('server_id'); this.controllerId = this.route.snapshot.paramMap.get('controller_id');
} }
} }

View File

@ -7,7 +7,7 @@
<div class="default-content"> <div class="default-content">
<mat-card class="matCard"> <mat-card class="matCard">
<mat-radio-group class="radio-group"> <mat-radio-group class="radio-group">
<mat-radio-button class="radio-button" value="1" (click)="setServerType('local')" checked <mat-radio-button class="radio-button" value="1" (click)="setControllerType('local')" checked
>Run the cloud node locally</mat-radio-button >Run the cloud node locally</mat-radio-button
> >
</mat-radio-group> </mat-radio-group>

View File

@ -10,12 +10,12 @@ import { NoopAnimationsModule } from '@angular/platform-browser/animations';
import { ActivatedRoute } from '@angular/router'; import { ActivatedRoute } from '@angular/router';
import { RouterTestingModule } from '@angular/router/testing'; import { RouterTestingModule } from '@angular/router/testing';
import { of } from 'rxjs'; import { of } from 'rxjs';
import { Server } from '../../../../../models/server'; import{ Controller } from '../../../../../models/controller';
import { CloudTemplate } from '../../../../../models/templates/cloud-template'; import { CloudTemplate } from '../../../../../models/templates/cloud-template';
import { BuiltInTemplatesService } from '../../../../../services/built-in-templates.service'; import { BuiltInTemplatesService } from '../../../../../services/built-in-templates.service';
import { ComputeService } from '../../../../../services/compute.service'; import { ComputeService } from '../../../../../services/compute.service';
import { ServerService } from '../../../../../services/server.service'; import { ControllerService } from '../../../../../services/controller.service';
import { MockedServerService } from '../../../../../services/server.service.spec'; import { MockedControllerService } from '../../../../../services/controller.service.spec';
import { TemplateMocksService } from '../../../../../services/template-mocks.service'; import { TemplateMocksService } from '../../../../../services/template-mocks.service';
import { ToasterService } from '../../../../../services/toaster.service'; import { ToasterService } from '../../../../../services/toaster.service';
import { MockedToasterService } from '../../../../../services/toaster.service.spec'; import { MockedToasterService } from '../../../../../services/toaster.service.spec';
@ -24,7 +24,7 @@ import { MockedActivatedRoute } from '../../../preferences.component.spec';
import { CloudNodesAddTemplateComponent } from './cloud-nodes-add-template.component'; import { CloudNodesAddTemplateComponent } from './cloud-nodes-add-template.component';
export class MockedBuiltInTemplatesService { export class MockedBuiltInTemplatesService {
public addTemplate(server: Server, cloudTemplate: CloudTemplate) { public addTemplate(controller:Controller , cloudTemplate: CloudTemplate) {
return of(cloudTemplate); return of(cloudTemplate);
} }
} }
@ -33,7 +33,7 @@ describe('CloudNodesAddTemplateComponent', () => {
let component: CloudNodesAddTemplateComponent; let component: CloudNodesAddTemplateComponent;
let fixture: ComponentFixture<CloudNodesAddTemplateComponent>; let fixture: ComponentFixture<CloudNodesAddTemplateComponent>;
let mockedServerService = new MockedServerService(); let mockedControllerService = new MockedControllerService();
let mockedBuiltInTemplatesService = new MockedBuiltInTemplatesService(); let mockedBuiltInTemplatesService = new MockedBuiltInTemplatesService();
let mockedToasterService = new MockedToasterService(); let mockedToasterService = new MockedToasterService();
let mockedComputeService = new MockedComputeService(); let mockedComputeService = new MockedComputeService();
@ -51,12 +51,12 @@ describe('CloudNodesAddTemplateComponent', () => {
CommonModule, CommonModule,
NoopAnimationsModule, NoopAnimationsModule,
RouterTestingModule.withRoutes([ RouterTestingModule.withRoutes([
{ path: 'server/1/preferences/builtin/cloud-nodes', component: CloudNodesAddTemplateComponent }, { path: 'controller/1/preferences/builtin/cloud-nodes', component: CloudNodesAddTemplateComponent },
]), ]),
], ],
providers: [ providers: [
{ provide: ActivatedRoute, useValue: activatedRoute }, { provide: ActivatedRoute, useValue: activatedRoute },
{ provide: ServerService, useValue: mockedServerService }, { provide: ControllerService, useValue: mockedControllerService },
{ provide: BuiltInTemplatesService, useValue: mockedBuiltInTemplatesService }, { provide: BuiltInTemplatesService, useValue: mockedBuiltInTemplatesService },
{ provide: ToasterService, useValue: mockedToasterService }, { provide: ToasterService, useValue: mockedToasterService },
{ provide: ComputeService, useValue: mockedComputeService }, { provide: ComputeService, useValue: mockedComputeService },
@ -80,7 +80,7 @@ describe('CloudNodesAddTemplateComponent', () => {
it('should call add template', () => { it('should call add template', () => {
spyOn(mockedBuiltInTemplatesService, 'addTemplate').and.returnValue(of({} as CloudTemplate)); spyOn(mockedBuiltInTemplatesService, 'addTemplate').and.returnValue(of({} as CloudTemplate));
component.templateName = 'sample name'; component.templateName = 'sample name';
component.server = { id: 1 } as Server; component.controller = { id: 1 } as Controller ;
component.formGroup.controls['templateName'].setValue('template name'); component.formGroup.controls['templateName'].setValue('template name');
component.addTemplate(); component.addTemplate();
@ -92,7 +92,7 @@ describe('CloudNodesAddTemplateComponent', () => {
spyOn(mockedBuiltInTemplatesService, 'addTemplate').and.returnValue(of({} as CloudTemplate)); spyOn(mockedBuiltInTemplatesService, 'addTemplate').and.returnValue(of({} as CloudTemplate));
spyOn(mockedToasterService, 'error'); spyOn(mockedToasterService, 'error');
component.templateName = ''; component.templateName = '';
component.server = { id: 1 } as Server; component.controller = { id: 1 } as Controller ;
component.addTemplate(); component.addTemplate();

View File

@ -3,11 +3,11 @@ import { FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms'
import { ActivatedRoute, Router } from '@angular/router'; import { ActivatedRoute, Router } from '@angular/router';
import { v4 as uuid } from 'uuid'; import { v4 as uuid } from 'uuid';
import { Compute } from '../../../../../models/compute'; import { Compute } from '../../../../../models/compute';
import { Server } from '../../../../../models/server'; import{ Controller } from '../../../../../models/controller';
import { CloudTemplate } from '../../../../../models/templates/cloud-template'; import { CloudTemplate } from '../../../../../models/templates/cloud-template';
import { BuiltInTemplatesService } from '../../../../../services/built-in-templates.service'; import { BuiltInTemplatesService } from '../../../../../services/built-in-templates.service';
import { ComputeService } from '../../../../../services/compute.service'; import { ComputeService } from '../../../../../services/compute.service';
import { ServerService } from '../../../../../services/server.service'; import { ControllerService } from '../../../../../services/controller.service';
import { TemplateMocksService } from '../../../../../services/template-mocks.service'; import { TemplateMocksService } from '../../../../../services/template-mocks.service';
import { ToasterService } from '../../../../../services/toaster.service'; import { ToasterService } from '../../../../../services/toaster.service';
@ -17,14 +17,14 @@ import { ToasterService } from '../../../../../services/toaster.service';
styleUrls: ['./cloud-nodes-add-template.component.scss', '../../../preferences.component.scss'], styleUrls: ['./cloud-nodes-add-template.component.scss', '../../../preferences.component.scss'],
}) })
export class CloudNodesAddTemplateComponent implements OnInit { export class CloudNodesAddTemplateComponent implements OnInit {
server: Server; controller:Controller ;
templateName: string = ''; templateName: string = '';
formGroup: FormGroup; formGroup: FormGroup;
isLocalComputerChosen: boolean = true; isLocalComputerChosen: boolean = true;
constructor( constructor(
private route: ActivatedRoute, private route: ActivatedRoute,
private serverService: ServerService, private controllerService: ControllerService,
private builtInTemplatesService: BuiltInTemplatesService, private builtInTemplatesService: BuiltInTemplatesService,
private router: Router, private router: Router,
private toasterService: ToasterService, private toasterService: ToasterService,
@ -38,20 +38,20 @@ export class CloudNodesAddTemplateComponent implements OnInit {
} }
ngOnInit() { ngOnInit() {
const server_id = this.route.snapshot.paramMap.get('server_id'); const controller_id = this.route.snapshot.paramMap.get('controller_id');
this.serverService.get(parseInt(server_id, 10)).then((server: Server) => { this.controllerService.get(parseInt(controller_id, 10)).then((controller:Controller ) => {
this.server = server; this.controller = controller;
}); });
} }
setServerType(serverType: string) { setControllerType(controllerType: string) {
if (serverType === 'local') { if (controllerType === 'local') {
this.isLocalComputerChosen = true; this.isLocalComputerChosen = true;
} }
} }
goBack() { goBack() {
this.router.navigate(['/server', this.server.id, 'preferences', 'builtin', 'cloud-nodes']); this.router.navigate(['/controller', this.controller.id, 'preferences', 'builtin', 'cloud-nodes']);
} }
addTemplate() { addTemplate() {
@ -66,7 +66,7 @@ export class CloudNodesAddTemplateComponent implements OnInit {
cloudTemplate.name = this.formGroup.get('templateName').value; cloudTemplate.name = this.formGroup.get('templateName').value;
cloudTemplate.compute_id = 'local'; cloudTemplate.compute_id = 'local';
this.builtInTemplatesService.addTemplate(this.server, cloudTemplate).subscribe((cloudNodeTemplate) => { this.builtInTemplatesService.addTemplate(this.controller, cloudTemplate).subscribe((cloudNodeTemplate) => {
this.goBack(); this.goBack();
}); });
} else { } else {

View File

@ -181,7 +181,7 @@
</div> </div>
<app-symbols-menu <app-symbols-menu
*ngIf="isSymbolSelectionOpened && cloudNodeTemplate" *ngIf="isSymbolSelectionOpened && cloudNodeTemplate"
[server]="server" [controller]="controller"
[symbol]="cloudNodeTemplate.symbol" [symbol]="cloudNodeTemplate.symbol"
(symbolChangedEmitter)="symbolChanged($event)" (symbolChangedEmitter)="symbolChanged($event)"
></app-symbols-menu> ></app-symbols-menu>

View File

@ -11,23 +11,23 @@ import { NoopAnimationsModule } from '@angular/platform-browser/animations';
import { ActivatedRoute } from '@angular/router'; import { ActivatedRoute } from '@angular/router';
import { RouterTestingModule } from '@angular/router/testing'; import { RouterTestingModule } from '@angular/router/testing';
import { of } from 'rxjs'; import { of } from 'rxjs';
import { Server } from '../../../../../models/server'; import{ Controller } from '../../../../../models/controller';
import { CloudTemplate } from '../../../../../models/templates/cloud-template'; import { CloudTemplate } from '../../../../../models/templates/cloud-template';
import { BuiltInTemplatesConfigurationService } from '../../../../../services/built-in-templates-configuration.service'; import { BuiltInTemplatesConfigurationService } from '../../../../../services/built-in-templates-configuration.service';
import { BuiltInTemplatesService } from '../../../../../services/built-in-templates.service'; import { BuiltInTemplatesService } from '../../../../../services/built-in-templates.service';
import { ServerService } from '../../../../../services/server.service'; import { ControllerService } from '../../../../../services/controller.service';
import { MockedServerService } from '../../../../../services/server.service.spec'; import { MockedControllerService } from '../../../../../services/controller.service.spec';
import { ToasterService } from '../../../../../services/toaster.service'; import { ToasterService } from '../../../../../services/toaster.service';
import { MockedToasterService } from '../../../../../services/toaster.service.spec'; import { MockedToasterService } from '../../../../../services/toaster.service.spec';
import { MockedActivatedRoute } from '../../../preferences.component.spec'; import { MockedActivatedRoute } from '../../../preferences.component.spec';
import { CloudNodesTemplateDetailsComponent } from './cloud-nodes-template-details.component'; import { CloudNodesTemplateDetailsComponent } from './cloud-nodes-template-details.component';
export class MockedBuiltInTemplatesService { export class MockedBuiltInTemplatesService {
public getTemplate(server: Server, template_id: string) { public getTemplate(controller:Controller , template_id: string) {
return of({ ports_mapping: [] } as CloudTemplate); return of({ ports_mapping: [] } as CloudTemplate);
} }
public saveTemplate(server: Server, cloudTemplate: CloudTemplate) { public saveTemplate(controller:Controller , cloudTemplate: CloudTemplate) {
return of(cloudTemplate); return of(cloudTemplate);
} }
} }
@ -36,7 +36,7 @@ describe('CloudNodesTemplateDetailsComponent', () => {
let component: CloudNodesTemplateDetailsComponent; let component: CloudNodesTemplateDetailsComponent;
let fixture: ComponentFixture<CloudNodesTemplateDetailsComponent>; let fixture: ComponentFixture<CloudNodesTemplateDetailsComponent>;
let mockedServerService = new MockedServerService(); let mockedControllerService = new MockedControllerService();
let mockedBuiltInTemplatesService = new MockedBuiltInTemplatesService(); let mockedBuiltInTemplatesService = new MockedBuiltInTemplatesService();
let mockedToasterService = new MockedToasterService(); let mockedToasterService = new MockedToasterService();
let activatedRoute = new MockedActivatedRoute().get(); let activatedRoute = new MockedActivatedRoute().get();
@ -60,7 +60,7 @@ describe('CloudNodesTemplateDetailsComponent', () => {
provide: ActivatedRoute, provide: ActivatedRoute,
useValue: activatedRoute, useValue: activatedRoute,
}, },
{ provide: ServerService, useValue: mockedServerService }, { provide: ControllerService, useValue: mockedControllerService },
{ provide: BuiltInTemplatesService, useValue: mockedBuiltInTemplatesService }, { provide: BuiltInTemplatesService, useValue: mockedBuiltInTemplatesService },
{ provide: ToasterService, useValue: mockedToasterService }, { provide: ToasterService, useValue: mockedToasterService },
{ provide: BuiltInTemplatesConfigurationService, useClass: BuiltInTemplatesConfigurationService }, { provide: BuiltInTemplatesConfigurationService, useClass: BuiltInTemplatesConfigurationService },

View File

@ -1,11 +1,11 @@
import { Component, OnInit } from '@angular/core'; import { Component, OnInit } from '@angular/core';
import { ActivatedRoute, Router } from '@angular/router'; import { ActivatedRoute, Router } from '@angular/router';
import { PortsMappingEntity } from '../../../../../models/ethernetHub/ports-mapping-enity'; import { PortsMappingEntity } from '../../../../../models/ethernetHub/ports-mapping-enity';
import { Server } from '../../../../../models/server'; import{ Controller } from '../../../../../models/controller';
import { CloudTemplate } from '../../../../../models/templates/cloud-template'; import { CloudTemplate } from '../../../../../models/templates/cloud-template';
import { BuiltInTemplatesConfigurationService } from '../../../../../services/built-in-templates-configuration.service'; import { BuiltInTemplatesConfigurationService } from '../../../../../services/built-in-templates-configuration.service';
import { BuiltInTemplatesService } from '../../../../../services/built-in-templates.service'; import { BuiltInTemplatesService } from '../../../../../services/built-in-templates.service';
import { ServerService } from '../../../../../services/server.service'; import { ControllerService } from '../../../../../services/controller.service';
import { ToasterService } from '../../../../../services/toaster.service'; import { ToasterService } from '../../../../../services/toaster.service';
@Component({ @Component({
@ -14,7 +14,7 @@ import { ToasterService } from '../../../../../services/toaster.service';
styleUrls: ['./cloud-nodes-template-details.component.scss', '../../../preferences.component.scss'], styleUrls: ['./cloud-nodes-template-details.component.scss', '../../../preferences.component.scss'],
}) })
export class CloudNodesTemplateDetailsComponent implements OnInit { export class CloudNodesTemplateDetailsComponent implements OnInit {
server: Server; controller:Controller ;
cloudNodeTemplate: CloudTemplate; cloudNodeTemplate: CloudTemplate;
isSymbolSelectionOpened: boolean = false; isSymbolSelectionOpened: boolean = false;
@ -34,7 +34,7 @@ export class CloudNodesTemplateDetailsComponent implements OnInit {
constructor( constructor(
private route: ActivatedRoute, private route: ActivatedRoute,
private serverService: ServerService, private controllerService: ControllerService,
private builtInTemplatesService: BuiltInTemplatesService, private builtInTemplatesService: BuiltInTemplatesService,
private toasterService: ToasterService, private toasterService: ToasterService,
private builtInTemplatesConfigurationService: BuiltInTemplatesConfigurationService, private builtInTemplatesConfigurationService: BuiltInTemplatesConfigurationService,
@ -47,14 +47,14 @@ export class CloudNodesTemplateDetailsComponent implements OnInit {
} }
ngOnInit() { ngOnInit() {
const server_id = this.route.snapshot.paramMap.get('server_id'); const controller_id = this.route.snapshot.paramMap.get('controller_id');
const template_id = this.route.snapshot.paramMap.get('template_id'); const template_id = this.route.snapshot.paramMap.get('template_id');
this.serverService.get(parseInt(server_id, 10)).then((server: Server) => { this.controllerService.get(parseInt(controller_id, 10)).then((controller:Controller ) => {
this.server = server; this.controller = controller;
this.getConfiguration(); this.getConfiguration();
this.builtInTemplatesService this.builtInTemplatesService
.getTemplate(this.server, template_id) .getTemplate(this.controller, template_id)
.subscribe((cloudNodeTemplate: CloudTemplate) => { .subscribe((cloudNodeTemplate: CloudTemplate) => {
this.cloudNodeTemplate = cloudNodeTemplate; this.cloudNodeTemplate = cloudNodeTemplate;
@ -70,7 +70,7 @@ export class CloudNodesTemplateDetailsComponent implements OnInit {
} }
goBack() { goBack() {
this.router.navigate(['/server', this.server.id, 'preferences', 'builtin', 'cloud-nodes']); this.router.navigate(['/controller', this.controller.id, 'preferences', 'builtin', 'cloud-nodes']);
} }
getConfiguration() { getConfiguration() {
@ -114,7 +114,7 @@ export class CloudNodesTemplateDetailsComponent implements OnInit {
this.cloudNodeTemplate.ports_mapping = [...this.portsMappingEthernet, ...this.portsMappingTap]; this.cloudNodeTemplate.ports_mapping = [...this.portsMappingEthernet, ...this.portsMappingTap];
this.builtInTemplatesService this.builtInTemplatesService
.saveTemplate(this.server, this.cloudNodeTemplate) .saveTemplate(this.controller, this.cloudNodeTemplate)
.subscribe((cloudNodeTemplate: CloudTemplate) => { .subscribe((cloudNodeTemplate: CloudTemplate) => {
this.toasterService.success('Changes saved'); this.toasterService.success('Changes saved');
}); });

View File

@ -3,18 +3,18 @@
<div class="row"> <div class="row">
<h1 class="col">Cloud nodes templates</h1> <h1 class="col">Cloud nodes templates</h1>
<button <button
*ngIf="server" *ngIf="controller"
class="top-button" class="top-button"
class="cancel-button" class="cancel-button"
routerLink="/server/{{ server.id }}/preferences/builtin" routerLink="/controller/{{ controller.id }}/preferences/builtin"
mat-button mat-button
> >
Back Back
</button> </button>
<button <button
*ngIf="server" *ngIf="controller"
class="top-button" class="top-button"
routerLink="/server/{{ server.id }}/preferences/builtin/cloud-nodes/addtemplate" routerLink="/controller/{{ controller.id }}/preferences/builtin/cloud-nodes/addtemplate"
mat-raised-button mat-raised-button
color="primary" color="primary"
> >
@ -25,7 +25,7 @@
<app-empty-templates-list *ngIf="!cloudNodesTemplates.length"></app-empty-templates-list> <app-empty-templates-list *ngIf="!cloudNodesTemplates.length"></app-empty-templates-list>
<div class="default-content" *ngIf="cloudNodesTemplates.length"> <div class="default-content" *ngIf="cloudNodesTemplates.length">
<div class="listcontainer mat-elevation-z8"> <div class="listcontainer mat-elevation-z8">
<mat-nav-list *ngIf="server"> <mat-nav-list *ngIf="controller">
<div class="list-item" *ngFor="let template of cloudNodesTemplates"> <div class="list-item" *ngFor="let template of cloudNodesTemplates">
<mat-list-item class="template-name" routerLink="{{ template.template_id }}">{{ <mat-list-item class="template-name" routerLink="{{ template.template_id }}">{{
template.name template.name
@ -43,4 +43,4 @@
</div> </div>
</div> </div>
</div> </div>
<app-delete-template #deleteComponent [server]="server" (deleteEvent)="onDeleteEvent()"> </app-delete-template> <app-delete-template #deleteComponent [controller]="controller" (deleteEvent)="onDeleteEvent()"> </app-delete-template>

View File

@ -9,16 +9,16 @@ import { NoopAnimationsModule } from '@angular/platform-browser/animations';
import { ActivatedRoute } from '@angular/router'; import { ActivatedRoute } from '@angular/router';
import { RouterTestingModule } from '@angular/router/testing'; import { RouterTestingModule } from '@angular/router/testing';
import { of } from 'rxjs'; import { of } from 'rxjs';
import { Server } from '../../../../../models/server'; import{ Controller } from '../../../../../models/controller';
import { CloudTemplate } from '../../../../../models/templates/cloud-template'; import { CloudTemplate } from '../../../../../models/templates/cloud-template';
import { BuiltInTemplatesService } from '../../../../../services/built-in-templates.service'; import { BuiltInTemplatesService } from '../../../../../services/built-in-templates.service';
import { ServerService } from '../../../../../services/server.service'; import { ControllerService } from '../../../../../services/controller.service';
import { MockedServerService } from '../../../../../services/server.service.spec'; import { MockedControllerService } from '../../../../../services/controller.service.spec';
import { MockedActivatedRoute } from '../../../preferences.component.spec'; import { MockedActivatedRoute } from '../../../preferences.component.spec';
import { CloudNodesTemplatesComponent } from './cloud-nodes-templates.component'; import { CloudNodesTemplatesComponent } from './cloud-nodes-templates.component';
export class MockedBuiltInTemplatesService { export class MockedBuiltInTemplatesService {
public getTemplates(server: Server) { public getTemplates(controller:Controller ) {
return of([{} as CloudTemplate]); return of([{} as CloudTemplate]);
} }
} }
@ -27,7 +27,7 @@ describe('CloudNodesTemplatesComponent', () => {
let component: CloudNodesTemplatesComponent; let component: CloudNodesTemplatesComponent;
let fixture: ComponentFixture<CloudNodesTemplatesComponent>; let fixture: ComponentFixture<CloudNodesTemplatesComponent>;
let mockedServerService = new MockedServerService(); let mockedControllerService = new MockedControllerService();
let mockedBuiltInTemplatesService = new MockedBuiltInTemplatesService(); let mockedBuiltInTemplatesService = new MockedBuiltInTemplatesService();
let activatedRoute = new MockedActivatedRoute().get(); let activatedRoute = new MockedActivatedRoute().get();
@ -47,7 +47,7 @@ describe('CloudNodesTemplatesComponent', () => {
provide: ActivatedRoute, provide: ActivatedRoute,
useValue: activatedRoute, useValue: activatedRoute,
}, },
{ provide: ServerService, useValue: mockedServerService }, { provide: ControllerService, useValue: mockedControllerService },
{ provide: BuiltInTemplatesService, useValue: mockedBuiltInTemplatesService }, { provide: BuiltInTemplatesService, useValue: mockedBuiltInTemplatesService },
], ],
declarations: [CloudNodesTemplatesComponent], declarations: [CloudNodesTemplatesComponent],

View File

@ -1,9 +1,9 @@
import { Component, OnInit, ViewChild } from '@angular/core'; import { Component, OnInit, ViewChild } from '@angular/core';
import { ActivatedRoute } from '@angular/router'; import { ActivatedRoute } from '@angular/router';
import { Server } from '../../../../../models/server'; import{ Controller } from '../../../../../models/controller';
import { CloudTemplate } from '../../../../../models/templates/cloud-template'; import { CloudTemplate } from '../../../../../models/templates/cloud-template';
import { BuiltInTemplatesService } from '../../../../../services/built-in-templates.service'; import { BuiltInTemplatesService } from '../../../../../services/built-in-templates.service';
import { ServerService } from '../../../../../services/server.service'; import { ControllerService } from '../../../../../services/controller.service';
import { DeleteTemplateComponent } from '../../../common/delete-template-component/delete-template.component'; import { DeleteTemplateComponent } from '../../../common/delete-template-component/delete-template.component';
@Component({ @Component({
@ -12,26 +12,26 @@ import { DeleteTemplateComponent } from '../../../common/delete-template-compone
styleUrls: ['./cloud-nodes-templates.component.scss', '../../../preferences.component.scss'], styleUrls: ['./cloud-nodes-templates.component.scss', '../../../preferences.component.scss'],
}) })
export class CloudNodesTemplatesComponent implements OnInit { export class CloudNodesTemplatesComponent implements OnInit {
server: Server; controller:Controller ;
cloudNodesTemplates: CloudTemplate[] = []; cloudNodesTemplates: CloudTemplate[] = [];
@ViewChild(DeleteTemplateComponent) deleteComponent: DeleteTemplateComponent; @ViewChild(DeleteTemplateComponent) deleteComponent: DeleteTemplateComponent;
constructor( constructor(
private route: ActivatedRoute, private route: ActivatedRoute,
private serverService: ServerService, private controllerService: ControllerService,
private builtInTemplatesService: BuiltInTemplatesService private builtInTemplatesService: BuiltInTemplatesService
) {} ) {}
ngOnInit() { ngOnInit() {
const server_id = this.route.snapshot.paramMap.get('server_id'); const controller_id = this.route.snapshot.paramMap.get('controller_id');
this.serverService.get(parseInt(server_id, 10)).then((server: Server) => { this.controllerService.get(parseInt(controller_id, 10)).then((controller:Controller ) => {
this.server = server; this.controller = controller;
this.getTemplates(); this.getTemplates();
}); });
} }
getTemplates() { getTemplates() {
this.builtInTemplatesService.getTemplates(this.server).subscribe((cloudNodesTemplates: CloudTemplate[]) => { this.builtInTemplatesService.getTemplates(this.controller).subscribe((cloudNodesTemplates: CloudTemplate[]) => {
this.cloudNodesTemplates = cloudNodesTemplates.filter((elem) => elem.template_type === 'cloud' && !elem.builtin); this.cloudNodesTemplates = cloudNodesTemplates.filter((elem) => elem.template_type === 'cloud' && !elem.builtin);
}); });
} }

View File

@ -7,7 +7,7 @@
<div class="default-content"> <div class="default-content">
<mat-card class="matCard"> <mat-card class="matCard">
<mat-radio-group class="radio-group"> <mat-radio-group class="radio-group">
<mat-radio-button class="radio-button" value="1" (click)="setServerType('local')" checked <mat-radio-button class="radio-button" value="1" (click)="setControllerType('local')" checked
>Run the Ethernet Hub locally</mat-radio-button >Run the Ethernet Hub locally</mat-radio-button
> >
</mat-radio-group> </mat-radio-group>

View File

@ -10,12 +10,12 @@ import { NoopAnimationsModule } from '@angular/platform-browser/animations';
import { ActivatedRoute } from '@angular/router'; import { ActivatedRoute } from '@angular/router';
import { RouterTestingModule } from '@angular/router/testing'; import { RouterTestingModule } from '@angular/router/testing';
import { of } from 'rxjs'; import { of } from 'rxjs';
import { Server } from '../../../../../models/server'; import{ Controller } from '../../../../../models/controller';
import { EthernetHubTemplate } from '../../../../../models/templates/ethernet-hub-template'; import { EthernetHubTemplate } from '../../../../../models/templates/ethernet-hub-template';
import { BuiltInTemplatesService } from '../../../../../services/built-in-templates.service'; import { BuiltInTemplatesService } from '../../../../../services/built-in-templates.service';
import { ComputeService } from '../../../../../services/compute.service'; import { ComputeService } from '../../../../../services/compute.service';
import { ServerService } from '../../../../../services/server.service'; import { ControllerService } from '../../../../../services/controller.service';
import { MockedServerService } from '../../../../../services/server.service.spec'; import { MockedControllerService } from '../../../../../services/controller.service.spec';
import { TemplateMocksService } from '../../../../../services/template-mocks.service'; import { TemplateMocksService } from '../../../../../services/template-mocks.service';
import { ToasterService } from '../../../../../services/toaster.service'; import { ToasterService } from '../../../../../services/toaster.service';
import { MockedToasterService } from '../../../../../services/toaster.service.spec'; import { MockedToasterService } from '../../../../../services/toaster.service.spec';
@ -24,7 +24,7 @@ import { MockedActivatedRoute } from '../../../preferences.component.spec';
import { EthernetHubsAddTemplateComponent } from './ethernet-hubs-add-template.component'; import { EthernetHubsAddTemplateComponent } from './ethernet-hubs-add-template.component';
export class MockedBuiltInTemplatesService { export class MockedBuiltInTemplatesService {
public addTemplate(server: Server, ethernetHubTemplate: EthernetHubTemplate) { public addTemplate(controller:Controller , ethernetHubTemplate: EthernetHubTemplate) {
return of(ethernetHubTemplate); return of(ethernetHubTemplate);
} }
} }
@ -33,7 +33,7 @@ describe('EthernetHubsAddTemplateComponent', () => {
let component: EthernetHubsAddTemplateComponent; let component: EthernetHubsAddTemplateComponent;
let fixture: ComponentFixture<EthernetHubsAddTemplateComponent>; let fixture: ComponentFixture<EthernetHubsAddTemplateComponent>;
let mockedServerService = new MockedServerService(); let mockedControllerService = new MockedControllerService();
let mockedBuiltInTemplatesService = new MockedBuiltInTemplatesService(); let mockedBuiltInTemplatesService = new MockedBuiltInTemplatesService();
let mockedToasterService = new MockedToasterService(); let mockedToasterService = new MockedToasterService();
let mockedComputeService = new MockedComputeService(); let mockedComputeService = new MockedComputeService();
@ -51,7 +51,7 @@ describe('EthernetHubsAddTemplateComponent', () => {
CommonModule, CommonModule,
NoopAnimationsModule, NoopAnimationsModule,
RouterTestingModule.withRoutes([ RouterTestingModule.withRoutes([
{ path: 'server/1/preferences/builtin/ethernet-hubs', component: EthernetHubsAddTemplateComponent }, { path: 'controller/1/preferences/builtin/ethernet-hubs', component: EthernetHubsAddTemplateComponent },
]), ]),
], ],
providers: [ providers: [
@ -59,7 +59,7 @@ describe('EthernetHubsAddTemplateComponent', () => {
provide: ActivatedRoute, provide: ActivatedRoute,
useValue: activatedRoute, useValue: activatedRoute,
}, },
{ provide: ServerService, useValue: mockedServerService }, { provide: ControllerService, useValue: mockedControllerService },
{ provide: BuiltInTemplatesService, useValue: mockedBuiltInTemplatesService }, { provide: BuiltInTemplatesService, useValue: mockedBuiltInTemplatesService },
{ provide: ToasterService, useValue: mockedToasterService }, { provide: ToasterService, useValue: mockedToasterService },
{ provide: ComputeService, useValue: mockedComputeService }, { provide: ComputeService, useValue: mockedComputeService },
@ -83,7 +83,7 @@ describe('EthernetHubsAddTemplateComponent', () => {
it('should call add template', () => { it('should call add template', () => {
spyOn(mockedBuiltInTemplatesService, 'addTemplate').and.returnValue(of({} as EthernetHubTemplate)); spyOn(mockedBuiltInTemplatesService, 'addTemplate').and.returnValue(of({} as EthernetHubTemplate));
component.templateName = 'sample name'; component.templateName = 'sample name';
component.server = { id: 1 } as Server; component.controller = { id: 1 } as Controller ;
component.formGroup.controls['templateName'].setValue('template name'); component.formGroup.controls['templateName'].setValue('template name');
component.formGroup.controls['numberOfPorts'].setValue('1'); component.formGroup.controls['numberOfPorts'].setValue('1');
@ -96,7 +96,7 @@ describe('EthernetHubsAddTemplateComponent', () => {
spyOn(mockedBuiltInTemplatesService, 'addTemplate').and.returnValue(of({} as EthernetHubTemplate)); spyOn(mockedBuiltInTemplatesService, 'addTemplate').and.returnValue(of({} as EthernetHubTemplate));
spyOn(mockedToasterService, 'error'); spyOn(mockedToasterService, 'error');
component.templateName = ''; component.templateName = '';
component.server = { id: 1 } as Server; component.controller = { id: 1 } as Controller ;
component.addTemplate(); component.addTemplate();
@ -108,7 +108,7 @@ describe('EthernetHubsAddTemplateComponent', () => {
spyOn(mockedBuiltInTemplatesService, 'addTemplate').and.returnValue(of({} as EthernetHubTemplate)); spyOn(mockedBuiltInTemplatesService, 'addTemplate').and.returnValue(of({} as EthernetHubTemplate));
spyOn(mockedToasterService, 'error'); spyOn(mockedToasterService, 'error');
component.templateName = 'sample name'; component.templateName = 'sample name';
component.server = { id: 1 } as Server; component.controller = { id: 1 } as Controller ;
component.addTemplate(); component.addTemplate();

View File

@ -3,11 +3,11 @@ import { FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms'
import { ActivatedRoute, Router } from '@angular/router'; import { ActivatedRoute, Router } from '@angular/router';
import { v4 as uuid } from 'uuid'; import { v4 as uuid } from 'uuid';
import { Compute } from '../../../../../models/compute'; import { Compute } from '../../../../../models/compute';
import { Server } from '../../../../../models/server'; import{ Controller } from '../../../../../models/controller';
import { EthernetHubTemplate } from '../../../../../models/templates/ethernet-hub-template'; import { EthernetHubTemplate } from '../../../../../models/templates/ethernet-hub-template';
import { BuiltInTemplatesService } from '../../../../../services/built-in-templates.service'; import { BuiltInTemplatesService } from '../../../../../services/built-in-templates.service';
import { ComputeService } from '../../../../../services/compute.service'; import { ComputeService } from '../../../../../services/compute.service';
import { ServerService } from '../../../../../services/server.service'; import { ControllerService } from '../../../../../services/controller.service';
import { TemplateMocksService } from '../../../../../services/template-mocks.service'; import { TemplateMocksService } from '../../../../../services/template-mocks.service';
import { ToasterService } from '../../../../../services/toaster.service'; import { ToasterService } from '../../../../../services/toaster.service';
@ -17,14 +17,14 @@ import { ToasterService } from '../../../../../services/toaster.service';
styleUrls: ['./ethernet-hubs-add-template.component.scss', '../../../preferences.component.scss'], styleUrls: ['./ethernet-hubs-add-template.component.scss', '../../../preferences.component.scss'],
}) })
export class EthernetHubsAddTemplateComponent implements OnInit { export class EthernetHubsAddTemplateComponent implements OnInit {
server: Server; controller:Controller ;
templateName: string = ''; templateName: string = '';
formGroup: FormGroup; formGroup: FormGroup;
isLocalComputerChosen: boolean = true; isLocalComputerChosen: boolean = true;
constructor( constructor(
private route: ActivatedRoute, private route: ActivatedRoute,
private serverService: ServerService, private controllerService: ControllerService,
private builtInTemplatesService: BuiltInTemplatesService, private builtInTemplatesService: BuiltInTemplatesService,
private router: Router, private router: Router,
private toasterService: ToasterService, private toasterService: ToasterService,
@ -39,20 +39,20 @@ export class EthernetHubsAddTemplateComponent implements OnInit {
} }
ngOnInit() { ngOnInit() {
const server_id = this.route.snapshot.paramMap.get('server_id'); const controller_id = this.route.snapshot.paramMap.get('controller_id');
this.serverService.get(parseInt(server_id, 10)).then((server: Server) => { this.controllerService.get(parseInt(controller_id, 10)).then((controller:Controller ) => {
this.server = server; this.controller = controller;
}); });
} }
setServerType(serverType: string) { setControllerType(controllerType: string) {
if (serverType === 'local') { if (controllerType === 'local') {
this.isLocalComputerChosen = true; this.isLocalComputerChosen = true;
} }
} }
goBack() { goBack() {
this.router.navigate(['/server', this.server.id, 'preferences', 'builtin', 'ethernet-hubs']); this.router.navigate(['/controller', this.controller.id, 'preferences', 'builtin', 'ethernet-hubs']);
} }
addTemplate() { addTemplate() {
@ -74,7 +74,7 @@ export class EthernetHubsAddTemplateComponent implements OnInit {
}); });
} }
this.builtInTemplatesService.addTemplate(this.server, ethernetHubTemplate).subscribe(() => { this.builtInTemplatesService.addTemplate(this.controller, ethernetHubTemplate).subscribe(() => {
this.goBack(); this.goBack();
}); });
} else { } else {

View File

@ -65,7 +65,7 @@
</div> </div>
<app-symbols-menu <app-symbols-menu
*ngIf="isSymbolSelectionOpened && ethernetHubTemplate" *ngIf="isSymbolSelectionOpened && ethernetHubTemplate"
[server]="server" [controller]="controller"
[symbol]="ethernetHubTemplate.symbol" [symbol]="ethernetHubTemplate.symbol"
(symbolChangedEmitter)="symbolChanged($event)" (symbolChangedEmitter)="symbolChanged($event)"
></app-symbols-menu> ></app-symbols-menu>

View File

@ -11,23 +11,23 @@ import { NoopAnimationsModule } from '@angular/platform-browser/animations';
import { ActivatedRoute } from '@angular/router'; import { ActivatedRoute } from '@angular/router';
import { RouterTestingModule } from '@angular/router/testing'; import { RouterTestingModule } from '@angular/router/testing';
import { of } from 'rxjs'; import { of } from 'rxjs';
import { Server } from '../../../../../models/server'; import{ Controller } from '../../../../../models/controller';
import { EthernetHubTemplate } from '../../../../../models/templates/ethernet-hub-template'; import { EthernetHubTemplate } from '../../../../../models/templates/ethernet-hub-template';
import { BuiltInTemplatesConfigurationService } from '../../../../../services/built-in-templates-configuration.service'; import { BuiltInTemplatesConfigurationService } from '../../../../../services/built-in-templates-configuration.service';
import { BuiltInTemplatesService } from '../../../../../services/built-in-templates.service'; import { BuiltInTemplatesService } from '../../../../../services/built-in-templates.service';
import { ServerService } from '../../../../../services/server.service'; import { ControllerService } from '../../../../../services/controller.service';
import { MockedServerService } from '../../../../../services/server.service.spec'; import { MockedControllerService } from '../../../../../services/controller.service.spec';
import { ToasterService } from '../../../../../services/toaster.service'; import { ToasterService } from '../../../../../services/toaster.service';
import { MockedToasterService } from '../../../../../services/toaster.service.spec'; import { MockedToasterService } from '../../../../../services/toaster.service.spec';
import { MockedActivatedRoute } from '../../../preferences.component.spec'; import { MockedActivatedRoute } from '../../../preferences.component.spec';
import { EthernetHubsTemplateDetailsComponent } from './ethernet-hubs-template-details.component'; import { EthernetHubsTemplateDetailsComponent } from './ethernet-hubs-template-details.component';
export class MockedBuiltInTemplatesService { export class MockedBuiltInTemplatesService {
public getTemplate(server: Server, template_id: string) { public getTemplate(controller:Controller , template_id: string) {
return of({ ports_mapping: [] } as EthernetHubTemplate); return of({ ports_mapping: [] } as EthernetHubTemplate);
} }
public saveTemplate(server: Server, cloudTemplate: EthernetHubTemplate) { public saveTemplate(controller:Controller , cloudTemplate: EthernetHubTemplate) {
return of(cloudTemplate); return of(cloudTemplate);
} }
} }
@ -36,7 +36,7 @@ describe('EthernetHubsTemplateDetailsComponent', () => {
let component: EthernetHubsTemplateDetailsComponent; let component: EthernetHubsTemplateDetailsComponent;
let fixture: ComponentFixture<EthernetHubsTemplateDetailsComponent>; let fixture: ComponentFixture<EthernetHubsTemplateDetailsComponent>;
let mockedServerService = new MockedServerService(); let mockedControllerService = new MockedControllerService();
let mockedBuiltInTemplatesService = new MockedBuiltInTemplatesService(); let mockedBuiltInTemplatesService = new MockedBuiltInTemplatesService();
let mockedToasterService = new MockedToasterService(); let mockedToasterService = new MockedToasterService();
let activatedRoute = new MockedActivatedRoute().get(); let activatedRoute = new MockedActivatedRoute().get();
@ -60,7 +60,7 @@ describe('EthernetHubsTemplateDetailsComponent', () => {
provide: ActivatedRoute, provide: ActivatedRoute,
useValue: activatedRoute, useValue: activatedRoute,
}, },
{ provide: ServerService, useValue: mockedServerService }, { provide: ControllerService, useValue: mockedControllerService },
{ provide: BuiltInTemplatesService, useValue: mockedBuiltInTemplatesService }, { provide: BuiltInTemplatesService, useValue: mockedBuiltInTemplatesService },
{ provide: ToasterService, useValue: mockedToasterService }, { provide: ToasterService, useValue: mockedToasterService },
{ provide: BuiltInTemplatesConfigurationService, useClass: BuiltInTemplatesConfigurationService }, { provide: BuiltInTemplatesConfigurationService, useClass: BuiltInTemplatesConfigurationService },

View File

@ -1,11 +1,11 @@
import { Component, OnInit } from '@angular/core'; import { Component, OnInit } from '@angular/core';
import { FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms'; import { FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms';
import { ActivatedRoute, Router } from '@angular/router'; import { ActivatedRoute, Router } from '@angular/router';
import { Server } from '../../../../../models/server'; import{ Controller } from '../../../../../models/controller';
import { EthernetHubTemplate } from '../../../../../models/templates/ethernet-hub-template'; import { EthernetHubTemplate } from '../../../../../models/templates/ethernet-hub-template';
import { BuiltInTemplatesConfigurationService } from '../../../../../services/built-in-templates-configuration.service'; import { BuiltInTemplatesConfigurationService } from '../../../../../services/built-in-templates-configuration.service';
import { BuiltInTemplatesService } from '../../../../../services/built-in-templates.service'; import { BuiltInTemplatesService } from '../../../../../services/built-in-templates.service';
import { ServerService } from '../../../../../services/server.service'; import { ControllerService } from '../../../../../services/controller.service';
import { ToasterService } from '../../../../../services/toaster.service'; import { ToasterService } from '../../../../../services/toaster.service';
@Component({ @Component({
@ -14,7 +14,7 @@ import { ToasterService } from '../../../../../services/toaster.service';
styleUrls: ['./ethernet-hubs-template-details.component.scss', '../../../preferences.component.scss'], styleUrls: ['./ethernet-hubs-template-details.component.scss', '../../../preferences.component.scss'],
}) })
export class EthernetHubsTemplateDetailsComponent implements OnInit { export class EthernetHubsTemplateDetailsComponent implements OnInit {
server: Server; controller:Controller ;
ethernetHubTemplate: EthernetHubTemplate; ethernetHubTemplate: EthernetHubTemplate;
numberOfPorts: number; numberOfPorts: number;
inputForm: FormGroup; inputForm: FormGroup;
@ -24,7 +24,7 @@ export class EthernetHubsTemplateDetailsComponent implements OnInit {
constructor( constructor(
private route: ActivatedRoute, private route: ActivatedRoute,
private serverService: ServerService, private controllerService: ControllerService,
private builtInTemplatesService: BuiltInTemplatesService, private builtInTemplatesService: BuiltInTemplatesService,
private toasterService: ToasterService, private toasterService: ToasterService,
private formBuilder: FormBuilder, private formBuilder: FormBuilder,
@ -39,14 +39,14 @@ export class EthernetHubsTemplateDetailsComponent implements OnInit {
} }
ngOnInit() { ngOnInit() {
const server_id = this.route.snapshot.paramMap.get('server_id'); const controller_id = this.route.snapshot.paramMap.get('controller_id');
const template_id = this.route.snapshot.paramMap.get('template_id'); const template_id = this.route.snapshot.paramMap.get('template_id');
this.serverService.get(parseInt(server_id, 10)).then((server: Server) => { this.controllerService.get(parseInt(controller_id, 10)).then((controller:Controller ) => {
this.server = server; this.controller = controller;
this.categories = this.builtInTemplatesConfigurationService.getCategoriesForEthernetHubs(); this.categories = this.builtInTemplatesConfigurationService.getCategoriesForEthernetHubs();
this.builtInTemplatesService this.builtInTemplatesService
.getTemplate(this.server, template_id) .getTemplate(this.controller, template_id)
.subscribe((ethernetHubTemplate: EthernetHubTemplate) => { .subscribe((ethernetHubTemplate: EthernetHubTemplate) => {
this.ethernetHubTemplate = ethernetHubTemplate; this.ethernetHubTemplate = ethernetHubTemplate;
this.numberOfPorts = this.ethernetHubTemplate.ports_mapping.length; this.numberOfPorts = this.ethernetHubTemplate.ports_mapping.length;
@ -55,7 +55,7 @@ export class EthernetHubsTemplateDetailsComponent implements OnInit {
} }
goBack() { goBack() {
this.router.navigate(['/server', this.server.id, 'preferences', 'builtin', 'ethernet-hubs']); this.router.navigate(['/controller', this.controller.id, 'preferences', 'builtin', 'ethernet-hubs']);
} }
onSave() { onSave() {
@ -71,7 +71,7 @@ export class EthernetHubsTemplateDetailsComponent implements OnInit {
} }
this.builtInTemplatesService this.builtInTemplatesService
.saveTemplate(this.server, this.ethernetHubTemplate) .saveTemplate(this.controller, this.ethernetHubTemplate)
.subscribe((ethernetHubTemplate: EthernetHubTemplate) => { .subscribe((ethernetHubTemplate: EthernetHubTemplate) => {
this.toasterService.success('Changes saved'); this.toasterService.success('Changes saved');
}); });

View File

@ -3,18 +3,18 @@
<div class="row"> <div class="row">
<h1 class="col">Ethernet hubs templates</h1> <h1 class="col">Ethernet hubs templates</h1>
<button <button
*ngIf="server" *ngIf="controller"
class="top-button" class="top-button"
class="cancel-button" class="cancel-button"
routerLink="/server/{{ server.id }}/preferences/builtin" routerLink="/controller/{{ controller.id }}/preferences/builtin"
mat-button mat-button
> >
Back Back
</button> </button>
<button <button
*ngIf="server" *ngIf="controller"
class="top-button" class="top-button"
routerLink="/server/{{ server.id }}/preferences/builtin/ethernet-hubs/addtemplate" routerLink="/controller/{{ controller.id }}/preferences/builtin/ethernet-hubs/addtemplate"
mat-raised-button mat-raised-button
color="primary" color="primary"
> >
@ -25,7 +25,7 @@
<app-empty-templates-list *ngIf="!ethernetHubsTemplates.length"></app-empty-templates-list> <app-empty-templates-list *ngIf="!ethernetHubsTemplates.length"></app-empty-templates-list>
<div class="default-content" *ngIf="ethernetHubsTemplates.length"> <div class="default-content" *ngIf="ethernetHubsTemplates.length">
<div class="listcontainer mat-elevation-z8"> <div class="listcontainer mat-elevation-z8">
<mat-nav-list *ngIf="server"> <mat-nav-list *ngIf="controller">
<div class="list-item" *ngFor="let template of ethernetHubsTemplates"> <div class="list-item" *ngFor="let template of ethernetHubsTemplates">
<mat-list-item class="template-name" routerLink="{{ template.template_id }}">{{ <mat-list-item class="template-name" routerLink="{{ template.template_id }}">{{
template.name template.name
@ -43,4 +43,4 @@
</div> </div>
</div> </div>
</div> </div>
<app-delete-template #deleteComponent [server]="server" (deleteEvent)="onDeleteEvent()"> </app-delete-template> <app-delete-template #deleteComponent [controller]="controller" (deleteEvent)="onDeleteEvent()"> </app-delete-template>

View File

@ -9,16 +9,16 @@ import { NoopAnimationsModule } from '@angular/platform-browser/animations';
import { ActivatedRoute } from '@angular/router'; import { ActivatedRoute } from '@angular/router';
import { RouterTestingModule } from '@angular/router/testing'; import { RouterTestingModule } from '@angular/router/testing';
import { of } from 'rxjs'; import { of } from 'rxjs';
import { Server } from '../../../../../models/server'; import{ Controller } from '../../../../../models/controller';
import { EthernetHubTemplate } from '../../../../../models/templates/ethernet-hub-template'; import { EthernetHubTemplate } from '../../../../../models/templates/ethernet-hub-template';
import { BuiltInTemplatesService } from '../../../../../services/built-in-templates.service'; import { BuiltInTemplatesService } from '../../../../../services/built-in-templates.service';
import { ServerService } from '../../../../../services/server.service'; import { ControllerService } from '../../../../../services/controller.service';
import { MockedServerService } from '../../../../../services/server.service.spec'; import { MockedControllerService } from '../../../../../services/controller.service.spec';
import { MockedActivatedRoute } from '../../../preferences.component.spec'; import { MockedActivatedRoute } from '../../../preferences.component.spec';
import { EthernetHubsTemplatesComponent } from './ethernet-hubs-templates.component'; import { EthernetHubsTemplatesComponent } from './ethernet-hubs-templates.component';
export class MockedBuiltInTemplatesService { export class MockedBuiltInTemplatesService {
public getTemplates(server: Server) { public getTemplates(controller:Controller ) {
return of([{} as EthernetHubTemplate]); return of([{} as EthernetHubTemplate]);
} }
} }
@ -27,7 +27,7 @@ describe('EthernetHubsTemplatesComponent', () => {
let component: EthernetHubsTemplatesComponent; let component: EthernetHubsTemplatesComponent;
let fixture: ComponentFixture<EthernetHubsTemplatesComponent>; let fixture: ComponentFixture<EthernetHubsTemplatesComponent>;
let mockedServerService = new MockedServerService(); let mockedControllerService = new MockedControllerService();
let mockedBuiltInTemplatesService = new MockedBuiltInTemplatesService(); let mockedBuiltInTemplatesService = new MockedBuiltInTemplatesService();
let activatedRoute = new MockedActivatedRoute().get(); let activatedRoute = new MockedActivatedRoute().get();
@ -47,7 +47,7 @@ describe('EthernetHubsTemplatesComponent', () => {
provide: ActivatedRoute, provide: ActivatedRoute,
useValue: activatedRoute, useValue: activatedRoute,
}, },
{ provide: ServerService, useValue: mockedServerService }, { provide: ControllerService, useValue: mockedControllerService },
{ provide: BuiltInTemplatesService, useValue: mockedBuiltInTemplatesService }, { provide: BuiltInTemplatesService, useValue: mockedBuiltInTemplatesService },
], ],
declarations: [EthernetHubsTemplatesComponent], declarations: [EthernetHubsTemplatesComponent],

View File

@ -1,9 +1,9 @@
import { Component, OnInit, ViewChild } from '@angular/core'; import { Component, OnInit, ViewChild } from '@angular/core';
import { ActivatedRoute } from '@angular/router'; import { ActivatedRoute } from '@angular/router';
import { Server } from '../../../../../models/server'; import{ Controller } from '../../../../../models/controller';
import { EthernetHubTemplate } from '../../../../../models/templates/ethernet-hub-template'; import { EthernetHubTemplate } from '../../../../../models/templates/ethernet-hub-template';
import { BuiltInTemplatesService } from '../../../../../services/built-in-templates.service'; import { BuiltInTemplatesService } from '../../../../../services/built-in-templates.service';
import { ServerService } from '../../../../../services/server.service'; import { ControllerService } from '../../../../../services/controller.service';
import { DeleteTemplateComponent } from '../../../common/delete-template-component/delete-template.component'; import { DeleteTemplateComponent } from '../../../common/delete-template-component/delete-template.component';
@Component({ @Component({
@ -12,26 +12,26 @@ import { DeleteTemplateComponent } from '../../../common/delete-template-compone
styleUrls: ['./ethernet-hubs-templates.component.scss', '../../../preferences.component.scss'], styleUrls: ['./ethernet-hubs-templates.component.scss', '../../../preferences.component.scss'],
}) })
export class EthernetHubsTemplatesComponent implements OnInit { export class EthernetHubsTemplatesComponent implements OnInit {
server: Server; controller:Controller ;
ethernetHubsTemplates: EthernetHubTemplate[] = []; ethernetHubsTemplates: EthernetHubTemplate[] = [];
@ViewChild(DeleteTemplateComponent) deleteComponent: DeleteTemplateComponent; @ViewChild(DeleteTemplateComponent) deleteComponent: DeleteTemplateComponent;
constructor( constructor(
private route: ActivatedRoute, private route: ActivatedRoute,
private serverService: ServerService, private controllerService: ControllerService,
private builtInTemplatesService: BuiltInTemplatesService private builtInTemplatesService: BuiltInTemplatesService
) {} ) {}
ngOnInit() { ngOnInit() {
const server_id = this.route.snapshot.paramMap.get('server_id'); const controller_id = this.route.snapshot.paramMap.get('controller_id');
this.serverService.get(parseInt(server_id, 10)).then((server: Server) => { this.controllerService.get(parseInt(controller_id, 10)).then((controller:Controller ) => {
this.server = server; this.controller = controller;
this.getTemplates(); this.getTemplates();
}); });
} }
getTemplates() { getTemplates() {
this.builtInTemplatesService.getTemplates(this.server).subscribe((ethernetHubsTemplates: EthernetHubTemplate[]) => { this.builtInTemplatesService.getTemplates(this.controller).subscribe((ethernetHubsTemplates: EthernetHubTemplate[]) => {
this.ethernetHubsTemplates = ethernetHubsTemplates.filter( this.ethernetHubsTemplates = ethernetHubsTemplates.filter(
(elem) => elem.template_type === 'ethernet_hub' && !elem.builtin (elem) => elem.template_type === 'ethernet_hub' && !elem.builtin
); );

View File

@ -7,7 +7,7 @@
<div class="default-content"> <div class="default-content">
<mat-card class="matCard"> <mat-card class="matCard">
<mat-radio-group class="radio-group"> <mat-radio-group class="radio-group">
<mat-radio-button class="radio-button" value="1" (click)="setServerType('local')" checked <mat-radio-button class="radio-button" value="1" (click)="setControllerType('local')" checked
>Run the Ethernet switch locally</mat-radio-button >Run the Ethernet switch locally</mat-radio-button
> >
</mat-radio-group> </mat-radio-group>

View File

@ -10,12 +10,12 @@ import { NoopAnimationsModule } from '@angular/platform-browser/animations';
import { ActivatedRoute } from '@angular/router'; import { ActivatedRoute } from '@angular/router';
import { RouterTestingModule } from '@angular/router/testing'; import { RouterTestingModule } from '@angular/router/testing';
import { of } from 'rxjs'; import { of } from 'rxjs';
import { Server } from '../../../../../models/server'; import{ Controller } from '../../../../../models/controller';
import { EthernetSwitchTemplate } from '../../../../../models/templates/ethernet-switch-template'; import { EthernetSwitchTemplate } from '../../../../../models/templates/ethernet-switch-template';
import { BuiltInTemplatesService } from '../../../../../services/built-in-templates.service'; import { BuiltInTemplatesService } from '../../../../../services/built-in-templates.service';
import { ComputeService } from '../../../../../services/compute.service'; import { ComputeService } from '../../../../../services/compute.service';
import { ServerService } from '../../../../../services/server.service'; import { ControllerService } from '../../../../../services/controller.service';
import { MockedServerService } from '../../../../../services/server.service.spec'; import { MockedControllerService } from '../../../../../services/controller.service.spec';
import { TemplateMocksService } from '../../../../../services/template-mocks.service'; import { TemplateMocksService } from '../../../../../services/template-mocks.service';
import { ToasterService } from '../../../../../services/toaster.service'; import { ToasterService } from '../../../../../services/toaster.service';
import { MockedToasterService } from '../../../../../services/toaster.service.spec'; import { MockedToasterService } from '../../../../../services/toaster.service.spec';
@ -24,7 +24,7 @@ import { MockedActivatedRoute } from '../../../preferences.component.spec';
import { EthernetSwitchesAddTemplateComponent } from './ethernet-switches-add-template.component'; import { EthernetSwitchesAddTemplateComponent } from './ethernet-switches-add-template.component';
export class MockedBuiltInTemplatesService { export class MockedBuiltInTemplatesService {
public addTemplate(server: Server, ethernetHubTemplate: EthernetSwitchTemplate) { public addTemplate(controller:Controller , ethernetHubTemplate: EthernetSwitchTemplate) {
return of(ethernetHubTemplate); return of(ethernetHubTemplate);
} }
} }
@ -33,7 +33,7 @@ describe('EthernetSwitchesAddTemplateComponent', () => {
let component: EthernetSwitchesAddTemplateComponent; let component: EthernetSwitchesAddTemplateComponent;
let fixture: ComponentFixture<EthernetSwitchesAddTemplateComponent>; let fixture: ComponentFixture<EthernetSwitchesAddTemplateComponent>;
let mockedServerService = new MockedServerService(); let mockedControllerService = new MockedControllerService();
let mockedBuiltInTemplatesService = new MockedBuiltInTemplatesService(); let mockedBuiltInTemplatesService = new MockedBuiltInTemplatesService();
let mockedToasterService = new MockedToasterService(); let mockedToasterService = new MockedToasterService();
let mockedComputeService = new MockedComputeService(); let mockedComputeService = new MockedComputeService();
@ -51,7 +51,7 @@ describe('EthernetSwitchesAddTemplateComponent', () => {
CommonModule, CommonModule,
NoopAnimationsModule, NoopAnimationsModule,
RouterTestingModule.withRoutes([ RouterTestingModule.withRoutes([
{ path: 'server/1/preferences/builtin/ethernet-switches', component: EthernetSwitchesAddTemplateComponent }, { path: 'controller/1/preferences/builtin/ethernet-switches', component: EthernetSwitchesAddTemplateComponent },
]), ]),
], ],
providers: [ providers: [
@ -59,7 +59,7 @@ describe('EthernetSwitchesAddTemplateComponent', () => {
provide: ActivatedRoute, provide: ActivatedRoute,
useValue: activatedRoute, useValue: activatedRoute,
}, },
{ provide: ServerService, useValue: mockedServerService }, { provide: ControllerService, useValue: mockedControllerService },
{ provide: BuiltInTemplatesService, useValue: mockedBuiltInTemplatesService }, { provide: BuiltInTemplatesService, useValue: mockedBuiltInTemplatesService },
{ provide: ToasterService, useValue: mockedToasterService }, { provide: ToasterService, useValue: mockedToasterService },
{ provide: ComputeService, useValue: mockedComputeService }, { provide: ComputeService, useValue: mockedComputeService },
@ -83,7 +83,7 @@ describe('EthernetSwitchesAddTemplateComponent', () => {
it('should call add template', () => { it('should call add template', () => {
spyOn(mockedBuiltInTemplatesService, 'addTemplate').and.returnValue(of({} as EthernetSwitchTemplate)); spyOn(mockedBuiltInTemplatesService, 'addTemplate').and.returnValue(of({} as EthernetSwitchTemplate));
component.templateName = 'sample name'; component.templateName = 'sample name';
component.server = { id: 1 } as Server; component.controller = { id: 1 } as Controller ;
component.formGroup.controls['templateName'].setValue('template name'); component.formGroup.controls['templateName'].setValue('template name');
component.formGroup.controls['numberOfPorts'].setValue('1'); component.formGroup.controls['numberOfPorts'].setValue('1');
@ -96,7 +96,7 @@ describe('EthernetSwitchesAddTemplateComponent', () => {
spyOn(mockedBuiltInTemplatesService, 'addTemplate').and.returnValue(of({} as EthernetSwitchTemplate)); spyOn(mockedBuiltInTemplatesService, 'addTemplate').and.returnValue(of({} as EthernetSwitchTemplate));
spyOn(mockedToasterService, 'error'); spyOn(mockedToasterService, 'error');
component.formGroup.controls['numberOfPorts'].setValue('1'); component.formGroup.controls['numberOfPorts'].setValue('1');
component.server = { id: 1 } as Server; component.controller = { id: 1 } as Controller ;
component.addTemplate(); component.addTemplate();
@ -108,7 +108,7 @@ describe('EthernetSwitchesAddTemplateComponent', () => {
spyOn(mockedBuiltInTemplatesService, 'addTemplate').and.returnValue(of({} as EthernetSwitchTemplate)); spyOn(mockedBuiltInTemplatesService, 'addTemplate').and.returnValue(of({} as EthernetSwitchTemplate));
spyOn(mockedToasterService, 'error'); spyOn(mockedToasterService, 'error');
component.formGroup.controls['templateName'].setValue('template name'); component.formGroup.controls['templateName'].setValue('template name');
component.server = { id: 1 } as Server; component.controller = { id: 1 } as Controller ;
component.addTemplate(); component.addTemplate();

View File

@ -3,11 +3,11 @@ import { FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms'
import { ActivatedRoute, Router } from '@angular/router'; import { ActivatedRoute, Router } from '@angular/router';
import { v4 as uuid } from 'uuid'; import { v4 as uuid } from 'uuid';
import { Compute } from '../../../../../models/compute'; import { Compute } from '../../../../../models/compute';
import { Server } from '../../../../../models/server'; import{ Controller } from '../../../../../models/controller';
import { EthernetSwitchTemplate } from '../../../../../models/templates/ethernet-switch-template'; import { EthernetSwitchTemplate } from '../../../../../models/templates/ethernet-switch-template';
import { BuiltInTemplatesService } from '../../../../../services/built-in-templates.service'; import { BuiltInTemplatesService } from '../../../../../services/built-in-templates.service';
import { ComputeService } from '../../../../../services/compute.service'; import { ComputeService } from '../../../../../services/compute.service';
import { ServerService } from '../../../../../services/server.service'; import { ControllerService } from '../../../../../services/controller.service';
import { TemplateMocksService } from '../../../../../services/template-mocks.service'; import { TemplateMocksService } from '../../../../../services/template-mocks.service';
import { ToasterService } from '../../../../../services/toaster.service'; import { ToasterService } from '../../../../../services/toaster.service';
@ -17,14 +17,14 @@ import { ToasterService } from '../../../../../services/toaster.service';
styleUrls: ['./ethernet-switches-add-template.component.scss', '../../../preferences.component.scss'], styleUrls: ['./ethernet-switches-add-template.component.scss', '../../../preferences.component.scss'],
}) })
export class EthernetSwitchesAddTemplateComponent implements OnInit { export class EthernetSwitchesAddTemplateComponent implements OnInit {
server: Server; controller:Controller ;
templateName: string = ''; templateName: string = '';
formGroup: FormGroup; formGroup: FormGroup;
isLocalComputerChosen: boolean = true; isLocalComputerChosen: boolean = true;
constructor( constructor(
private route: ActivatedRoute, private route: ActivatedRoute,
private serverService: ServerService, private controllerService: ControllerService,
private builtInTemplatesService: BuiltInTemplatesService, private builtInTemplatesService: BuiltInTemplatesService,
private router: Router, private router: Router,
private toasterService: ToasterService, private toasterService: ToasterService,
@ -39,18 +39,18 @@ export class EthernetSwitchesAddTemplateComponent implements OnInit {
} }
ngOnInit() { ngOnInit() {
const server_id = this.route.snapshot.paramMap.get('server_id'); const controller_id = this.route.snapshot.paramMap.get('controller_id');
this.serverService.get(parseInt(server_id, 10)).then((server: Server) => { this.controllerService.get(parseInt(controller_id, 10)).then((controller:Controller ) => {
this.server = server; this.controller = controller;
}); });
} }
goBack() { goBack() {
this.router.navigate(['/server', this.server.id, 'preferences', 'builtin', 'ethernet-switches']); this.router.navigate(['/controller', this.controller.id, 'preferences', 'builtin', 'ethernet-switches']);
} }
setServerType(serverType: string) { setControllerType(controllerType: string) {
if (serverType === 'local') { if (controllerType === 'local') {
this.isLocalComputerChosen = true; this.isLocalComputerChosen = true;
} }
} }
@ -78,7 +78,7 @@ export class EthernetSwitchesAddTemplateComponent implements OnInit {
} }
this.builtInTemplatesService this.builtInTemplatesService
.addTemplate(this.server, ethernetSwitchTemplate) .addTemplate(this.controller, ethernetSwitchTemplate)
.subscribe((ethernetSwitchTemplate) => { .subscribe((ethernetSwitchTemplate) => {
this.goBack(); this.goBack();
}); });

View File

@ -78,7 +78,7 @@
</div> </div>
<app-symbols-menu <app-symbols-menu
*ngIf="isSymbolSelectionOpened && ethernetSwitchTemplate" *ngIf="isSymbolSelectionOpened && ethernetSwitchTemplate"
[server]="server" [controller]="controller"
[symbol]="ethernetSwitchTemplate.symbol" [symbol]="ethernetSwitchTemplate.symbol"
(symbolChangedEmitter)="symbolChanged($event)" (symbolChangedEmitter)="symbolChanged($event)"
></app-symbols-menu> ></app-symbols-menu>

View File

@ -11,12 +11,12 @@ import { NoopAnimationsModule } from '@angular/platform-browser/animations';
import { ActivatedRoute } from '@angular/router'; import { ActivatedRoute } from '@angular/router';
import { RouterTestingModule } from '@angular/router/testing'; import { RouterTestingModule } from '@angular/router/testing';
import { of } from 'rxjs'; import { of } from 'rxjs';
import { Server } from '../../../../../models/server'; import{ Controller } from '../../../../../models/controller';
import { EthernetSwitchTemplate } from '../../../../../models/templates/ethernet-switch-template'; import { EthernetSwitchTemplate } from '../../../../../models/templates/ethernet-switch-template';
import { BuiltInTemplatesConfigurationService } from '../../../../../services/built-in-templates-configuration.service'; import { BuiltInTemplatesConfigurationService } from '../../../../../services/built-in-templates-configuration.service';
import { BuiltInTemplatesService } from '../../../../../services/built-in-templates.service'; import { BuiltInTemplatesService } from '../../../../../services/built-in-templates.service';
import { ServerService } from '../../../../../services/server.service'; import { ControllerService } from '../../../../../services/controller.service';
import { MockedServerService } from '../../../../../services/server.service.spec'; import { MockedControllerService } from '../../../../../services/controller.service.spec';
import { ToasterService } from '../../../../../services/toaster.service'; import { ToasterService } from '../../../../../services/toaster.service';
import { MockedToasterService } from '../../../../../services/toaster.service.spec'; import { MockedToasterService } from '../../../../../services/toaster.service.spec';
import { PortsComponent } from '../../../common/ports/ports.component'; import { PortsComponent } from '../../../common/ports/ports.component';
@ -24,11 +24,11 @@ import { MockedActivatedRoute } from '../../../preferences.component.spec';
import { EthernetSwitchesTemplateDetailsComponent } from './ethernet-switches-template-details.component'; import { EthernetSwitchesTemplateDetailsComponent } from './ethernet-switches-template-details.component';
export class MockedBuiltInTemplatesService { export class MockedBuiltInTemplatesService {
public getTemplate(server: Server, template_id: string) { public getTemplate(controller:Controller , template_id: string) {
return of({ ports_mapping: [] } as EthernetSwitchTemplate); return of({ ports_mapping: [] } as EthernetSwitchTemplate);
} }
public saveTemplate(server: Server, cloudTemplate: EthernetSwitchTemplate) { public saveTemplate(controller:Controller , cloudTemplate: EthernetSwitchTemplate) {
return of(cloudTemplate); return of(cloudTemplate);
} }
} }
@ -37,7 +37,7 @@ describe('EthernetSwitchesTemplateDetailsComponent', () => {
let component: EthernetSwitchesTemplateDetailsComponent; let component: EthernetSwitchesTemplateDetailsComponent;
let fixture: ComponentFixture<EthernetSwitchesTemplateDetailsComponent>; let fixture: ComponentFixture<EthernetSwitchesTemplateDetailsComponent>;
let mockedServerService = new MockedServerService(); let mockedControllerService = new MockedControllerService();
let mockedBuiltInTemplatesService = new MockedBuiltInTemplatesService(); let mockedBuiltInTemplatesService = new MockedBuiltInTemplatesService();
let mockedToasterService = new MockedToasterService(); let mockedToasterService = new MockedToasterService();
let activatedRoute = new MockedActivatedRoute().get(); let activatedRoute = new MockedActivatedRoute().get();
@ -61,7 +61,7 @@ describe('EthernetSwitchesTemplateDetailsComponent', () => {
provide: ActivatedRoute, provide: ActivatedRoute,
useValue: activatedRoute, useValue: activatedRoute,
}, },
{ provide: ServerService, useValue: mockedServerService }, { provide: ControllerService, useValue: mockedControllerService },
{ provide: BuiltInTemplatesService, useValue: mockedBuiltInTemplatesService }, { provide: BuiltInTemplatesService, useValue: mockedBuiltInTemplatesService },
{ provide: ToasterService, useValue: mockedToasterService }, { provide: ToasterService, useValue: mockedToasterService },
{ provide: BuiltInTemplatesConfigurationService, useClass: BuiltInTemplatesConfigurationService }, { provide: BuiltInTemplatesConfigurationService, useClass: BuiltInTemplatesConfigurationService },

Some files were not shown because too many files have changed in this diff Show More