CHE-3615: display system servers in the list of servers

Signed-off-by: Oleksii Kurinnyi <okurinnyi@codenvy.com>
6.19.x
Oleksii Kurinnyi 2017-01-06 15:56:00 +02:00
parent 09353bc7a4
commit 4d1bd9b0b2
9 changed files with 136 additions and 70 deletions

View File

@ -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(<string>server.port, 10);
this.usedPorts = this.lodash.map(serversCopy, (server: IEnvironmentManagerMachineServer) => {
return parseInt(<string>server.port, 10);
});
this.usedReferences = Object.keys(serversCopy);

View File

@ -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<any>}
*/
showDeleteConfirmation(numberToDelete: number): ng.IPromise<any> {
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);

View File

@ -54,7 +54,7 @@
<che-list flex>
<che-list-item ng-mouseover="hover=true" ng-mouseout="hover=false"
ng-repeat="server in listServersController.serversList | orderBy:listServersController.serversOrderBy">
ng-repeat="server in listServersController.serversList | orderBy:['-userScope', listServersController.serversOrderBy]">
<div flex="100"
layout="row"
layout-align="start stretch"
@ -64,6 +64,7 @@
class="che-checkbox-area">
<che-list-item-checked ng-model="listServersController.serversSelectedStatus[server.reference]"
che-aria-label-checkbox="Port {{server.reference}}"
ng-if="server.userScope"
ng-click="listServersController.updateSelectedStatus()"></che-list-item-checked>
</div>
<div flex
@ -85,12 +86,13 @@
</div>
<div flex="50"
class="che-list-item-name">
<span class="che-hover">
<a href="{{server.runtimeUrl}}" target="_blank">{{server.runtimeUrl}}</a>
<span class="che-hover" ng-if="server.runtime">
<a href="{{server.runtime.url}}" target="_blank">{{server.runtime.url}}</a>
</span>
</div>
<div flex="10">
<div class="che-list-actions"
ng-if="server.userScope"
ng-click="listServersController.showEditDialog($event,server.reference)">
<i class="fa fa-pencil" tooltip="Edit"></i>
</div>
@ -111,7 +113,7 @@
<div flex-offset="5" ng-if="listServersController.serversList.length > 0">
<che-button-primary-flat ng-disabled="(listServersController.serversSelectedNumber === 0)"
che-button-title="Delete" name="deleteButton"
ng-click="listServersController.deleteSelectedPorts()"></che-button-primary-flat>
ng-click="listServersController.deleteSelectedServers()"></che-button-primary-flat>
</div>
</div>
</div>

View File

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

View File

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

View File

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

View File

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

View File

@ -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[] {

View File

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