diff --git a/dashboard/src/app/workspaces/workspace-details/environments/list-servers/edit-server-dialog/edit-server-dialog.controller.ts b/dashboard/src/app/workspaces/workspace-details/environments/list-servers/edit-server-dialog/edit-server-dialog.controller.ts index 3a558d0d77..4832f2ade2 100644 --- a/dashboard/src/app/workspaces/workspace-details/environments/list-servers/edit-server-dialog/edit-server-dialog.controller.ts +++ b/dashboard/src/app/workspaces/workspace-details/environments/list-servers/edit-server-dialog/edit-server-dialog.controller.ts @@ -9,8 +9,8 @@ * Codenvy, S.A. - initial API and implementation */ 'use strict'; -import {IServer} from '../server'; import {ListServersController} from '../list-servers.controller'; +import {IEnvironmentManagerMachineServer} from '../../../../../../components/api/environment/environment-manager-machine'; /** * @ngdoc controller @@ -26,7 +26,7 @@ export class EditServerDialogController { toEdit: string; servers: { - [reference: string]: IServer + [reference: string]: IEnvironmentManagerMachineServer }; usedPorts: number[]; @@ -53,8 +53,8 @@ export class EditServerDialogController { if (this.toEdit && serversCopy[this.toEdit]) { delete serversCopy[this.toEdit]; } - this.usedPorts = this.lodash.map(serversCopy, (server: IServer) => { - return parseInt(server.port, 10); + this.usedPorts = this.lodash.map(serversCopy, (server: IEnvironmentManagerMachineServer) => { + return parseInt(server.port, 10); }); this.usedReferences = Object.keys(serversCopy); diff --git a/dashboard/src/app/workspaces/workspace-details/environments/list-servers/list-servers.controller.ts b/dashboard/src/app/workspaces/workspace-details/environments/list-servers/list-servers.controller.ts index 86dc336ea3..7e1227781a 100644 --- a/dashboard/src/app/workspaces/workspace-details/environments/list-servers/list-servers.controller.ts +++ b/dashboard/src/app/workspaces/workspace-details/environments/list-servers/list-servers.controller.ts @@ -9,9 +9,9 @@ * Codenvy, S.A. - initial API and implementation */ 'use strict'; -import {IServer} from './server'; +import {IEnvironmentManagerMachineServer} from '../../../../../components/api/environment/environment-manager-machine'; -interface IServerListItem extends IServer { +interface IServerListItem extends IEnvironmentManagerMachineServer { reference: string; } @@ -32,9 +32,9 @@ export class ListServersController { } = {}; serversSelectedNumber: number = 0; serversOrderBy: string = 'reference'; - server: IServer; + server: IEnvironmentManagerMachineServer; servers: { - [reference: string]: IServer + [reference: string]: IEnvironmentManagerMachineServer }; serversList: IServerListItem[]; @@ -55,7 +55,7 @@ export class ListServersController { * Build list of servers */ buildServersList(): void { - this.serversList = this.lodash.map(this.servers, (server: IServer, reference: string) => { + this.serversList = this.lodash.map(this.servers, (server: IEnvironmentManagerMachineServer, reference: string) => { let serverItem: IServerListItem = angular.extend({}, {reference: reference}, server); serverItem.protocol = serverItem.protocol ? serverItem.protocol : 'http'; return serverItem; @@ -63,7 +63,7 @@ export class ListServersController { } /** - * Update port selected status + * Update server selected status */ updateSelectedStatus(): void { this.serversSelectedNumber = 0; @@ -80,7 +80,7 @@ export class ListServersController { /** * @param {string} name */ - changePortSelection(name: string): void { + changeServerSelection(name: string): void { this.serversSelectedStatus[name] = !this.serversSelectedStatus[name]; this.updateSelectedStatus(); } @@ -90,28 +90,32 @@ export class ListServersController { */ changeBulkSelection(): void { if (this.isBulkChecked) { - this.deselectAllPorts(); + this.deselectAllServers(); this.isBulkChecked = false; return; } - this.selectAllPorts(); + this.selectAllServers(); this.isBulkChecked = true; } /** - * Check all ports in list + * Check all servers in list */ - selectAllPorts(): void { - this.serversSelectedNumber = this.serversList.length; + selectAllServers(): void { + this.serversSelectedNumber = 0; this.serversList.forEach((serverListItem: IServerListItem) => { + if (serverListItem.userScope === false) { + return; + } + this.serversSelectedNumber++; this.serversSelectedStatus[serverListItem.reference] = true; }); } /** - * Uncheck all ports in list + * Uncheck all servers in list */ - deselectAllPorts(): void { + deselectAllServers(): void { this.serversSelectedStatus = {}; this.serversSelectedNumber = 0; } @@ -124,7 +128,11 @@ export class ListServersController { * @param {string} protocol */ addServer(reference: string, port: number, protocol: string): void { - this.servers[reference] = {'port': port, 'protocol': protocol}; + this.servers[reference] = { + port: port, + protocol: protocol, + userScope: true + }; this.updateSelectedStatus(); this.serversOnChange(); @@ -146,7 +154,7 @@ export class ListServersController { } /** - * Show dialog to add new or edit existing port + * Show dialog to add new or edit existing server * * @param {MouseEvent} $event * @param {string=} reference @@ -168,14 +176,14 @@ export class ListServersController { } /** - * Removes selected ports + * Removes selected servers */ - deleteSelectedPorts(): void { + deleteSelectedServers(): void { this.showDeleteConfirmation(this.serversSelectedNumber).then(() => { - this.lodash.forEach(this.serversSelectedStatus, (server: IServer, name: string) => { + this.lodash.forEach(this.serversSelectedStatus, (server: IEnvironmentManagerMachineServer, name: string) => { delete this.servers[name]; }); - this.deselectAllPorts(); + this.deselectAllServers(); this.isBulkChecked = false; this.serversOnChange(); this.buildServersList(); @@ -183,20 +191,20 @@ export class ListServersController { } /** - * Show confirmation popup before port to delete + * Show confirmation popup before server to delete * @param {number} numberToDelete * @returns {angular.IPromise} */ showDeleteConfirmation(numberToDelete: number): ng.IPromise { let confirmTitle = 'Would you like to delete '; if (numberToDelete > 1) { - confirmTitle += 'these ' + numberToDelete + ' ports?'; + confirmTitle += 'these ' + numberToDelete + ' servers?'; } else { - confirmTitle += 'this selected port?'; + confirmTitle += 'this selected server?'; } let confirm = this.$mdDialog.confirm() .title(confirmTitle) - .ariaLabel('Remove port') + .ariaLabel('Remove server') .ok('Delete!') .cancel('Cancel') .clickOutsideToClose(true); diff --git a/dashboard/src/app/workspaces/workspace-details/environments/list-servers/list-servers.html b/dashboard/src/app/workspaces/workspace-details/environments/list-servers/list-servers.html index 3a6dd67504..ebad5dac4c 100755 --- a/dashboard/src/app/workspaces/workspace-details/environments/list-servers/list-servers.html +++ b/dashboard/src/app/workspaces/workspace-details/environments/list-servers/list-servers.html @@ -54,7 +54,7 @@ + ng-repeat="server in listServersController.serversList | orderBy:['-userScope', listServersController.serversOrderBy]">
@@ -111,7 +113,7 @@
+ ng-click="listServersController.deleteSelectedServers()">
diff --git a/dashboard/src/app/workspaces/workspace-details/environments/list-servers/server.ts b/dashboard/src/app/workspaces/workspace-details/environments/list-servers/server.ts deleted file mode 100644 index e8eabba299..0000000000 --- a/dashboard/src/app/workspaces/workspace-details/environments/list-servers/server.ts +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Copyright (c) 2015-2017 Codenvy, S.A. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Codenvy, S.A. - initial API and implementation - */ -export interface IServer { - port: number|string; - protocol: string; - properties?: { - [propName: string]: string - }; - runtimeUrl?: string; -} - - diff --git a/dashboard/src/components/api/environment/compose-environment-manager.spec.ts b/dashboard/src/components/api/environment/compose-environment-manager.spec.ts index c9715dd9f9..4544db9782 100644 --- a/dashboard/src/components/api/environment/compose-environment-manager.spec.ts +++ b/dashboard/src/components/api/environment/compose-environment-manager.spec.ts @@ -11,7 +11,7 @@ 'use strict'; import {ComposeEnvironmentManager} from './compose-environment-manager'; -import {IEnvironmentManagerMachine} from './environment-manager-machine'; +import {IEnvironmentManagerMachine, IEnvironmentManagerMachineServer} from './environment-manager-machine'; /** * Test the environment manager for compose based recipes @@ -61,7 +61,11 @@ describe('ComposeEnvironmentManager', () => { }); let servers = envManager.getServers(machine); - let expectedServers = environment.machines[machineName].servers; + let expectedServers = <{[serverRef: string]: IEnvironmentManagerMachineServer}> environment.machines[machineName].servers; + Object.keys(expectedServers).forEach((serverRef: string) => { + expectedServers[serverRef].userScope = true; + }); + expect(servers).toEqual(expectedServers); }); diff --git a/dashboard/src/components/api/environment/docker-image-environment-manager.spec.ts b/dashboard/src/components/api/environment/docker-image-environment-manager.spec.ts index e332f887ff..92552601df 100644 --- a/dashboard/src/components/api/environment/docker-image-environment-manager.spec.ts +++ b/dashboard/src/components/api/environment/docker-image-environment-manager.spec.ts @@ -69,6 +69,10 @@ describe('DockerImageEnvironmentManager', () => { let servers = envManager.getServers(machines[0]); let expectedServers = environment.machines['dev-machine'].servers; + Object.keys(expectedServers).forEach((serverRef: string) => { + expectedServers[serverRef].userScope = true; + }); + expect(servers).toEqual(expectedServers); }); diff --git a/dashboard/src/components/api/environment/environment-manager-machine.ts b/dashboard/src/components/api/environment/environment-manager-machine.ts index b9ca0ccf7a..c98636d4db 100644 --- a/dashboard/src/components/api/environment/environment-manager-machine.ts +++ b/dashboard/src/components/api/environment/environment-manager-machine.ts @@ -17,6 +17,7 @@ export interface IEnvironmentManagerMachine extends che.IEnvironmentMachine { }; } -interface IEnvironmentManagerMachineServer extends che.IEnvironmentMachineServer { - runtimeUrl?: string; +export interface IEnvironmentManagerMachineServer extends che.IEnvironmentMachineServer { + userScope?: boolean; // indicates a server added by user + runtime?: che.IWorkspaceRuntimeMachineServer; } diff --git a/dashboard/src/components/api/environment/environment-manager.ts b/dashboard/src/components/api/environment/environment-manager.ts index 95d253bcfb..2769ebda8a 100644 --- a/dashboard/src/components/api/environment/environment-manager.ts +++ b/dashboard/src/components/api/environment/environment-manager.ts @@ -9,7 +9,7 @@ * Codenvy, S.A. - initial API and implementation */ 'use strict'; -import {IEnvironmentManagerMachine} from './environment-manager-machine'; +import {IEnvironmentManagerMachine, IEnvironmentManagerMachineServer} from './environment-manager-machine'; /** * This is base class, which describes the environment manager. @@ -58,12 +58,12 @@ export class EnvironmentManager { let machines: IEnvironmentManagerMachine[] = []; runtime.machines.forEach((runtimeMachine: any) => { let name = runtimeMachine.config.name, - machine: any = { - name: name, - runtime: { - servers: runtimeMachine.runtime.servers - } - }; + machine: any = {name: name}; + if (runtimeMachine.runtime && runtimeMachine.runtime.servers) { + machine.runtime = { + servers: runtimeMachine.runtime.servers + }; + } machines.push(machine); }); @@ -161,27 +161,61 @@ export class EnvironmentManager { } } - getServers(machine: IEnvironmentManagerMachine): {[serverName: string]: che.IEnvironmentMachineServer} { + getServers(machine: IEnvironmentManagerMachine): {[serverName: string]: IEnvironmentManagerMachineServer} { if (!machine.servers) { return {}; } + Object.keys(machine.servers).forEach((serverName: string) => { + machine.servers[serverName].userScope = true; + }); + if (!machine.runtime) { return machine.servers; } - Object.keys(machine.runtime.servers).forEach((serverName: string) => { - let runtimeServer = machine.runtime.servers[serverName]; - if (machine.servers[runtimeServer.ref]) { - machine.servers[runtimeServer.ref].runtimeUrl = runtimeServer.url; + Object.keys(machine.runtime.servers).forEach((runtimeServerName: string) => { + let runtimeServer: che.IWorkspaceRuntimeMachineServer = machine.runtime.servers[runtimeServerName], + runtimeServerReference = runtimeServer.ref; + + if (machine.servers[runtimeServerReference]) { + machine.servers[runtimeServerReference].runtime = runtimeServer; + } else { + let port; + if (runtimeServer.port) { + port = runtimeServer.port; + } else { + [port, ] = runtimeServerName.split('/'); + } + machine.servers[runtimeServerReference] = { + userScope: false, + port: port, + protocol: runtimeServer.protocol, + runtime: runtimeServer + }; } }); return machine.servers; } - setServers(machine: IEnvironmentManagerMachine, servers: {[serverRef: string]: che.IEnvironmentMachineServer}): void { - machine.servers = angular.copy(servers); + setServers(machine: IEnvironmentManagerMachine, _servers: {[serverRef: string]: IEnvironmentManagerMachineServer}): void { + let servers = angular.copy(_servers); + + Object.keys(_servers).forEach((serverName: string) => { + // remove system defined servers + if (!_servers[serverName].userScope) { + delete servers[serverName]; + return; + } + + // remove unnecessary keys from user defined servers + let server = servers[serverName]; + delete server.userScope; + delete server.runtime; + }); + + machine.servers = servers; } getAgents(machine: IEnvironmentManagerMachine): string[] { diff --git a/dashboard/src/components/typings/che.d.ts b/dashboard/src/components/typings/che.d.ts index bc9e9cf6c0..5f26951b9d 100644 --- a/dashboard/src/components/typings/che.d.ts +++ b/dashboard/src/components/typings/che.d.ts @@ -78,6 +78,7 @@ declare namespace _che { [propName: string]: string | number; }; config: IWorkspaceConfig; + runtime?: IWorkspaceRuntime; } export interface IWorkspaceConfig { @@ -121,6 +122,38 @@ declare namespace _che { }; } + export interface IWorkspaceRuntime { + activeEnv: string; + devMachine: IWorkspaceRuntimeMachine; + links: any[]; + machines: IWorkspaceRuntimeMachine[]; + rootFolder: string; + } + + export interface IWorkspaceRuntimeMachine { + config: any; + envName: string; + id: string; + links: any[]; + owner: string; + runtime: { + envVariables: { [envVarName: string]: string }; + properties: { [propName: string]: string }; + servers: { [serverName: string]: IWorkspaceRuntimeMachineServer }; + }; + status: string; + workspaceId: string; + } + + export interface IWorkspaceRuntimeMachineServer { + address: string; + properties: { [propName: string]: string; }; + protocol: string; + port: string; + ref: string; + url: string; + } + export interface IProject { name: string; displayName: string;