Skip to content

Commit a0f9ef5

Browse files
committed
Adding mem and cpu requests/limits
1 parent ed7859c commit a0f9ef5

File tree

5 files changed

+65
-14
lines changed

5 files changed

+65
-14
lines changed

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@
177177
<dependency>
178178
<groupId>com.spotify</groupId>
179179
<artifactId>docker-client</artifactId>
180-
<version>8.11.2</version>
180+
<version>8.15.2</version>
181181
</dependency>
182182
<!-- Jersey, a dependency of docker-client with wonky version constraints -->
183183
<dependency>

src/main/java/eu/openanalytics/containerproxy/backend/docker/DockerEngineBackend.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,9 +58,17 @@ protected Container startContainer(ContainerSpec spec, Proxy proxy) throws Excep
5858
}
5959
hostConfigBuilder.portBindings(portBindings);
6060

61-
Optional.ofNullable(memoryToBytes(spec.getMemory())).ifPresent(l -> hostConfigBuilder.memory(l));
62-
Optional.ofNullable(spec.getNetwork()).ifPresent(n -> hostConfigBuilder.networkMode(spec.getNetwork()));
61+
hostConfigBuilder.memoryReservation(memoryToBytes(spec.getMemoryRequest()));
62+
hostConfigBuilder.memory(memoryToBytes(spec.getMemoryLimit()));
63+
if (spec.getCpuLimit() != null) {
64+
// Workaround, see https://github.com/spotify/docker-client/issues/959
65+
long period = 100000;
66+
long quota = (long) (period * Float.parseFloat(spec.getCpuLimit()));
67+
hostConfigBuilder.cpuPeriod(period);
68+
hostConfigBuilder.cpuQuota(quota);
69+
}
6370

71+
Optional.ofNullable(spec.getNetwork()).ifPresent(n -> hostConfigBuilder.networkMode(spec.getNetwork()));
6472
Optional.ofNullable(spec.getDns()).ifPresent(dns -> hostConfigBuilder.dns(dns));
6573
Optional.ofNullable(spec.getVolumes()).ifPresent(v -> hostConfigBuilder.binds(v));
6674
hostConfigBuilder.privileged(spec.isPrivileged());

src/main/java/eu/openanalytics/containerproxy/backend/kubernetes/KubernetesBackend.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,10 @@
3636
import java.util.function.BiConsumer;
3737
import java.util.stream.Collectors;
3838

39-
import com.google.common.base.Splitter;
4039
import org.apache.commons.io.IOUtils;
4140

41+
import com.google.common.base.Splitter;
42+
4243
import eu.openanalytics.containerproxy.ContainerProxyException;
4344
import eu.openanalytics.containerproxy.backend.AbstractContainerBackend;
4445
import eu.openanalytics.containerproxy.model.runtime.Container;
@@ -54,6 +55,8 @@
5455
import io.fabric8.kubernetes.api.model.LocalObjectReference;
5556
import io.fabric8.kubernetes.api.model.Pod;
5657
import io.fabric8.kubernetes.api.model.PodSpec;
58+
import io.fabric8.kubernetes.api.model.Quantity;
59+
import io.fabric8.kubernetes.api.model.ResourceRequirementsBuilder;
5760
import io.fabric8.kubernetes.api.model.SecretKeySelectorBuilder;
5861
import io.fabric8.kubernetes.api.model.SecurityContext;
5962
import io.fabric8.kubernetes.api.model.SecurityContextBuilder;
@@ -165,6 +168,12 @@ protected Container startContainer(ContainerSpec spec, Proxy proxy) throws Excep
165168
.withPrivileged(spec.isPrivileged())
166169
.build();
167170

171+
ResourceRequirementsBuilder resourceRequirementsBuilder = new ResourceRequirementsBuilder();
172+
resourceRequirementsBuilder.addToRequests("cpu", Optional.ofNullable(spec.getCpuRequest()).map(s -> new Quantity(s)).orElse(null));
173+
resourceRequirementsBuilder.addToLimits("cpu", Optional.ofNullable(spec.getCpuLimit()).map(s -> new Quantity(s)).orElse(null));
174+
resourceRequirementsBuilder.addToRequests("memory", Optional.ofNullable(spec.getMemoryRequest()).map(s -> new Quantity(s)).orElse(null));
175+
resourceRequirementsBuilder.addToLimits("memory", Optional.ofNullable(spec.getMemoryLimit()).map(s -> new Quantity(s)).orElse(null));
176+
168177
List<ContainerPort> containerPorts = spec.getPortMapping().values().stream()
169178
.map(p -> new ContainerPortBuilder().withContainerPort(p).build())
170179
.collect(Collectors.toList());
@@ -176,6 +185,7 @@ protected Container startContainer(ContainerSpec spec, Proxy proxy) throws Excep
176185
.withPorts(containerPorts)
177186
.withVolumeMounts(volumeMounts)
178187
.withSecurityContext(security)
188+
.withResources(resourceRequirementsBuilder.build())
179189
.withEnv(envVars);
180190

181191
String imagePullPolicy = getProperty(PROPERTY_IMG_PULL_POLICY);

src/main/java/eu/openanalytics/containerproxy/model/spec/ContainerSpec.java

Lines changed: 32 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,11 @@ public class ContainerSpec {
3535
private String[] dns;
3636
private String[] volumes;
3737
private Map<String, Integer> portMapping = new HashMap<>();
38-
private String memory;
3938
private boolean privileged;
39+
private String memoryRequest;
40+
private String memoryLimit;
41+
private String cpuRequest;
42+
private String cpuLimit;
4043
private Map<String, String> settings = new HashMap<>();
4144

4245
public String getImage() {
@@ -93,18 +96,36 @@ public Map<String, Integer> getPortMapping() {
9396
public void setPortMapping(Map<String, Integer> portMapping) {
9497
this.portMapping = portMapping;
9598
}
96-
public String getMemory() {
97-
return memory;
98-
}
99-
public void setMemory(String memory) {
100-
this.memory = memory;
101-
}
10299
public boolean isPrivileged() {
103100
return privileged;
104101
}
105102
public void setPrivileged(boolean privileged) {
106103
this.privileged = privileged;
107104
}
105+
public String getMemoryRequest() {
106+
return memoryRequest;
107+
}
108+
public void setMemoryRequest(String memoryRequest) {
109+
this.memoryRequest = memoryRequest;
110+
}
111+
public String getMemoryLimit() {
112+
return memoryLimit;
113+
}
114+
public void setMemoryLimit(String memoryLimit) {
115+
this.memoryLimit = memoryLimit;
116+
}
117+
public String getCpuRequest() {
118+
return cpuRequest;
119+
}
120+
public void setCpuRequest(String cpuRequest) {
121+
this.cpuRequest = cpuRequest;
122+
}
123+
public String getCpuLimit() {
124+
return cpuLimit;
125+
}
126+
public void setCpuLimit(String cpuLimit) {
127+
this.cpuLimit = cpuLimit;
128+
}
108129
public Map<String, String> getSettings() {
109130
return settings;
110131
}
@@ -128,7 +149,10 @@ public void copy(ContainerSpec target) {
128149
if (target.getPortMapping() == null) target.setPortMapping(new HashMap<>());
129150
target.getPortMapping().putAll(portMapping);
130151
}
131-
target.setMemory(memory);
152+
target.setMemoryRequest(memoryRequest);
153+
target.setMemoryLimit(memoryLimit);
154+
target.setCpuRequest(cpuRequest);
155+
target.setCpuLimit(cpuLimit);
132156
target.setPrivileged(privileged);
133157
if (settings != null) {
134158
if (target.getSettings() == null) target.setSettings(new HashMap<>());

src/main/java/eu/openanalytics/containerproxy/spec/expression/ExpressionAwareContainerSpec.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,8 +77,17 @@ public String[] getVolumes() {
7777
public Map<String, Integer> getPortMapping() {
7878
return source.getPortMapping();
7979
}
80-
public String getMemory() {
81-
return resolve(source.getMemory());
80+
public String getMemoryRequest() {
81+
return resolve(source.getMemoryRequest());
82+
}
83+
public String getMemoryLimit() {
84+
return resolve(source.getMemoryLimit());
85+
}
86+
public String getCpuRequest() {
87+
return resolve(source.getCpuRequest());
88+
}
89+
public String getCpuLimit() {
90+
return resolve(source.getCpuLimit());
8291
}
8392
public boolean isPrivileged() {
8493
return source.isPrivileged();

0 commit comments

Comments
 (0)