Skip to content

Commit bee9890

Browse files
author
Alexander Garagatyi
authored
CODENVY-1443: fix incorrect usage of non bind-mount volumes (eclipse-che#3877)
Add other minor fixes Signed-off-by: Alexander Garagatyi <agaragatyi@codenvy.com>
1 parent 6c02978 commit bee9890

10 files changed

Lines changed: 333 additions & 88 deletions

File tree

plugins/plugin-docker/che-plugin-docker-client/src/main/java/org/eclipse/che/plugin/docker/client/json/Volume.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,4 +30,15 @@ public class Volume {
3030
public String toString() {
3131
return "{}";
3232
}
33+
34+
@Override
35+
public int hashCode() {
36+
return 19;
37+
}
38+
39+
@Override
40+
public boolean equals(Object o) {
41+
if (this == o) return true;
42+
return o instanceof Volume;
43+
}
3344
}

plugins/plugin-docker/che-plugin-docker-machine/src/main/java/org/eclipse/che/plugin/docker/machine/MachineProviderImpl.java

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
import org.eclipse.che.plugin.docker.client.json.ContainerConfig;
4646
import org.eclipse.che.plugin.docker.client.json.HostConfig;
4747
import org.eclipse.che.plugin.docker.client.json.PortBinding;
48+
import org.eclipse.che.plugin.docker.client.json.Volume;
4849
import org.eclipse.che.plugin.docker.client.json.container.NetworkingConfig;
4950
import org.eclipse.che.plugin.docker.client.json.network.ConnectContainer;
5051
import org.eclipse.che.plugin.docker.client.json.network.EndpointConfig;
@@ -496,15 +497,13 @@ private String createContainer(String workspaceId,
496497
endpointConfig));
497498

498499
HostConfig hostConfig = new HostConfig();
499-
hostConfig.withBinds(toArrayIfNotNull(service.getVolumes()))
500-
.withMemorySwap(machineMemorySwap)
500+
hostConfig.withMemorySwap(machineMemorySwap)
501501
.withMemory(service.getMemLimit())
502502
.withNetworkMode(networkName)
503503
.withLinks(toArrayIfNotNull(service.getLinks()))
504504
.withPortBindings(service.getPorts()
505505
.stream()
506-
.collect(toMap(Function.identity(),
507-
value -> new PortBinding[0])))
506+
.collect(toMap(Function.identity(), value -> new PortBinding[0])))
508507
.withVolumesFrom(toArrayIfNotNull(service.getVolumesFrom()));
509508

510509
ContainerConfig config = new ContainerConfig();
@@ -524,6 +523,19 @@ private String createContainer(String workspaceId,
524523
.map(entry -> entry.getKey() + "=" + entry.getValue())
525524
.toArray(String[]::new));
526525

526+
List<String> bindMountVolumes = new ArrayList<>();
527+
Map<String, Volume> nonBindMountVolumes = new HashMap<>();
528+
for (String volume : service.getVolumes()) {
529+
// If volume contains colon then it is bind volume, otherwise - non bind-mount volume.
530+
if (volume.contains(":")) {
531+
bindMountVolumes.add(volume);
532+
} else {
533+
nonBindMountVolumes.put(volume, new Volume());
534+
}
535+
}
536+
hostConfig.setBinds(bindMountVolumes.toArray(new String[bindMountVolumes.size()]));
537+
config.setVolumes(nonBindMountVolumes);
538+
527539
addStaticDockerConfiguration(config);
528540

529541
return docker.createContainer(CreateContainerParams.create(config)

plugins/plugin-docker/che-plugin-docker-machine/src/main/java/org/eclipse/che/plugin/docker/machine/local/LocalCheInfrastructureProvisioner.java

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,14 @@
1212

1313
import com.google.common.base.Strings;
1414

15-
import org.eclipse.che.api.core.model.workspace.Environment;
16-
import org.eclipse.che.api.core.model.workspace.ExtendedMachine;
1715
import org.eclipse.che.api.core.util.SystemInfo;
1816
import org.eclipse.che.api.environment.server.AgentConfigApplier;
1917
import org.eclipse.che.api.environment.server.DefaultInfrastructureProvisioner;
2018
import org.eclipse.che.api.environment.server.exception.EnvironmentException;
2119
import org.eclipse.che.api.environment.server.model.CheServiceImpl;
2220
import org.eclipse.che.api.environment.server.model.CheServicesEnvironmentImpl;
21+
import org.eclipse.che.api.workspace.server.model.impl.EnvironmentImpl;
22+
import org.eclipse.che.api.workspace.server.model.impl.ExtendedMachineImpl;
2323
import org.eclipse.che.commons.annotation.Nullable;
2424
import org.eclipse.che.commons.lang.os.WindowsPathEscaper;
2525
import org.eclipse.che.inject.CheBootstrap;
@@ -31,6 +31,8 @@
3131
import javax.inject.Inject;
3232
import javax.inject.Named;
3333
import java.io.IOException;
34+
import java.util.ArrayList;
35+
import java.util.HashMap;
3436
import java.util.List;
3537

3638
import static java.lang.String.format;
@@ -74,14 +76,20 @@ public LocalCheInfrastructureProvisioner(AgentConfigApplier agentConfigApplier,
7476
}
7577

7678
@Override
77-
public void provision(Environment envConfig, CheServicesEnvironmentImpl internalEnv) throws EnvironmentException {
79+
public void provision(EnvironmentImpl envConfig, CheServicesEnvironmentImpl internalEnv)
80+
throws EnvironmentException {
7881
String devMachineName = getDevMachineName(envConfig);
7982
if (devMachineName == null) {
8083
throw new EnvironmentException("ws-machine is not found on agents applying");
8184
}
8285

8386
CheServiceImpl devMachine = internalEnv.getServices().get(devMachineName);
84-
List<String> devMachineVolumes = devMachine.getVolumes();
87+
88+
for (CheServiceImpl machine : internalEnv.getServices().values()) {
89+
ArrayList<String> volumes = new ArrayList<>(machine.getVolumes());
90+
volumes.add(terminalVolumeProvider.get());
91+
machine.setVolumes(volumes);
92+
}
8593

8694
// add bind-mount volume for projects in a workspace
8795
String projectFolderVolume;
@@ -93,6 +101,7 @@ public void provision(Environment envConfig, CheServicesEnvironmentImpl internal
93101
throw new EnvironmentException("Error occurred on resolving path to files of workspace " +
94102
internalEnv.getWorkspaceId());
95103
}
104+
List<String> devMachineVolumes = devMachine.getVolumes();
96105
devMachineVolumes.add(SystemInfo.isWindows() ? pathEscaper.escapePath(projectFolderVolume)
97106
: projectFolderVolume);
98107
// add volume with ws-agent archive
@@ -102,19 +111,17 @@ public void provision(Environment envConfig, CheServicesEnvironmentImpl internal
102111
if (dockerExtConfVolume != null) {
103112
devMachineVolumes.add(dockerExtConfVolume);
104113
}
105-
devMachine.getEnvironment().put(CheBootstrap.CHE_LOCAL_CONF_DIR,
106-
DockerExtConfBindingProvider.EXT_CHE_LOCAL_CONF_DIR);
107-
108-
for (CheServiceImpl machine : internalEnv.getServices().values()) {
109-
machine.getVolumes().add(terminalVolumeProvider.get());
110-
}
114+
HashMap<String, String> environmentVars = new HashMap<>(devMachine.getEnvironment());
115+
environmentVars.put(CheBootstrap.CHE_LOCAL_CONF_DIR, DockerExtConfBindingProvider.EXT_CHE_LOCAL_CONF_DIR);
116+
devMachine.setEnvironment(environmentVars);
111117

112118
// apply basic infra (e.g. agents)
113119
super.provision(envConfig, internalEnv);
114120
}
115121

116122
@Override
117-
public void provision(ExtendedMachine machineConfig, CheServiceImpl internalMachine) throws EnvironmentException {
123+
public void provision(ExtendedMachineImpl machineConfig, CheServiceImpl internalMachine)
124+
throws EnvironmentException {
118125
internalMachine.getVolumes().add(terminalVolumeProvider.get());
119126

120127
super.provision(machineConfig, internalMachine);

0 commit comments

Comments
 (0)