Skip to content

Commit d7c4b06

Browse files
author
Corneil du Plessis
committed
Added k8s requests and limits for ephemeral-storage , hugepages-2Mi and hugepages-1Gi
Fixes spring-attic#441
1 parent ff82f6f commit d7c4b06

File tree

3 files changed

+189
-36
lines changed

3 files changed

+189
-36
lines changed

spring-cloud-deployer-kubernetes/src/main/java/org/springframework/cloud/deployer/spi/kubernetes/DeploymentPropertiesResolver.java

Lines changed: 54 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import java.util.Map;
2424
import java.util.Optional;
2525
import java.util.Properties;
26+
import java.util.function.Supplier;
2627
import java.util.regex.Matcher;
2728
import java.util.regex.Pattern;
2829
import java.util.stream.Collectors;
@@ -147,6 +148,14 @@ List<Volume> getVolumes(Map<String, String> kubernetesDeployerProperties) {
147148

148149
return volumes;
149150
}
151+
private <T> String deducePropertyValue(Map<String, String> deployerProps, String propNameSansPrefix, Supplier<String> defaultValue) {
152+
String propName = this.propertyPrefix + propNameSansPrefix;
153+
String propValue = PropertyParserUtils.getDeploymentPropertyValue(deployerProps, propName);
154+
if (!StringUtils.hasText(propValue)) {
155+
propValue = defaultValue.get();
156+
}
157+
return propValue;
158+
}
150159

151160
/**
152161
* Get the resource limits for the deployment request. A Pod can define its maximum needed resources by setting the
@@ -159,33 +168,19 @@ List<Volume> getVolumes(Map<String, String> kubernetesDeployerProperties) {
159168
* @return the resource limits to use
160169
*/
161170
Map<String, Quantity> deduceResourceLimits(Map<String, String> kubernetesDeployerProperties) {
162-
String memory = PropertyParserUtils.getDeploymentPropertyValue(kubernetesDeployerProperties,
163-
this.propertyPrefix + ".limits.memory");
164-
165-
if (!StringUtils.hasText(memory)) {
166-
memory = properties.getLimits().getMemory();
167-
}
171+
String memory = deducePropertyValue(kubernetesDeployerProperties, ".limits.memory", () -> properties.getLimits().getMemory());
168172

169-
String cpu = PropertyParserUtils.getDeploymentPropertyValue(kubernetesDeployerProperties,
170-
this.propertyPrefix + ".limits.cpu");
173+
String cpu = deducePropertyValue(kubernetesDeployerProperties, ".limits.cpu", () -> properties.getLimits().getCpu());
171174

172-
if (!StringUtils.hasText(cpu)) {
173-
cpu = properties.getLimits().getCpu();
174-
}
175+
String ephemeralStorage = deducePropertyValue(kubernetesDeployerProperties, ".limits.ephemeral-storage", () -> properties.getLimits().getEphemeralStorage());
175176

176-
String gpuVendor = PropertyParserUtils.getDeploymentPropertyValue(kubernetesDeployerProperties,
177-
this.propertyPrefix + ".limits.gpuVendor");
177+
String hugePages2Mi = deducePropertyValue(kubernetesDeployerProperties, ".limits.hugepages-2Mi", () -> properties.getLimits().getHugepages2Mi());
178178

179-
if (!StringUtils.hasText(gpuVendor)) {
180-
gpuVendor = properties.getLimits().getGpuVendor();
181-
}
179+
String hugePages1Gi = deducePropertyValue(kubernetesDeployerProperties, ".limits.hugepages-1Gi", () -> properties.getLimits().getHugepages1Gi());
182180

183-
String gpuCount = PropertyParserUtils.getDeploymentPropertyValue(kubernetesDeployerProperties,
184-
this.propertyPrefix + ".limits.gpuCount");
181+
String gpuVendor = deducePropertyValue(kubernetesDeployerProperties, ".limits.gpuVendor", () -> properties.getLimits().getGpuVendor());
185182

186-
if (!StringUtils.hasText(gpuCount)) {
187-
gpuCount = properties.getLimits().getGpuCount();
188-
}
183+
String gpuCount = deducePropertyValue(kubernetesDeployerProperties, ".limits.gpuCount", () -> properties.getLimits().getGpuCount());
189184

190185
Map<String,Quantity> limits = new HashMap<String,Quantity>();
191186

@@ -197,10 +192,25 @@ Map<String, Quantity> deduceResourceLimits(Map<String, String> kubernetesDeploye
197192
limits.put("cpu", new Quantity(cpu));
198193
}
199194

195+
if(StringUtils.hasText(ephemeralStorage)) {
196+
limits.put("ephemeral-storage", new Quantity(ephemeralStorage));
197+
}
198+
199+
if(StringUtils.hasText(hugePages2Mi)) {
200+
limits.put("hugepages-2Mi", new Quantity(hugePages2Mi));
201+
}
202+
203+
if(StringUtils.hasText(hugePages1Gi)) {
204+
limits.put("hugepages-1Gi", new Quantity(hugePages1Gi));
205+
}
206+
200207
if (StringUtils.hasText(gpuVendor) && StringUtils.hasText(gpuCount)) {
201208
limits.put(gpuVendor + "/gpu", new Quantity(gpuCount));
202209
}
203210

211+
if(logger.isDebugEnabled()) {
212+
logger.debug("limits:" + limits);
213+
}
204214
return limits;
205215
}
206216

@@ -240,22 +250,19 @@ ImagePullPolicy deduceImagePullPolicy(Map<String, String> kubernetesDeployerProp
240250
* @return the resource requests to use
241251
*/
242252
Map<String, Quantity> deduceResourceRequests(Map<String, String> kubernetesDeployerProperties) {
243-
String memOverride = PropertyParserUtils.getDeploymentPropertyValue(kubernetesDeployerProperties,
244-
this.propertyPrefix + ".requests.memory");
253+
String memOverride = deducePropertyValue(kubernetesDeployerProperties, ".requests.memory", () -> properties.getRequests().getMemory());
245254

246-
if (memOverride == null) {
247-
memOverride = properties.getRequests().getMemory();
248-
}
255+
String cpuOverride = deducePropertyValue(kubernetesDeployerProperties, ".requests.cpu", () -> properties.getRequests().getCpu());
249256

257+
String ephemeralStorage = deducePropertyValue(kubernetesDeployerProperties, ".requests.ephemeral-storage", () -> properties.getLimits().getEphemeralStorage());
250258

251-
String cpuOverride = PropertyParserUtils.getDeploymentPropertyValue(kubernetesDeployerProperties,
252-
this.propertyPrefix + ".requests.cpu");
259+
String hugePages2Mi = deducePropertyValue(kubernetesDeployerProperties, ".requests.hugepages-2Mi", () -> properties.getLimits().getHugepages2Mi());
253260

254-
if (cpuOverride == null) {
255-
cpuOverride = properties.getRequests().getCpu();
256-
}
261+
String hugePages1Gi = deducePropertyValue(kubernetesDeployerProperties, ".requests.hugepages-1Gi", () -> properties.getLimits().getHugepages1Gi());
257262

258-
logger.debug("Using requests - cpu: " + cpuOverride + " mem: " + memOverride);
263+
if(logger.isDebugEnabled()) {
264+
logger.debug("Using requests - cpu: " + cpuOverride + " mem: " + memOverride + " ephemeral-storage:" + ephemeralStorage + " hugepages-2Mi:" + hugePages2Mi + " hugepages-1Gi:" + hugePages1Gi);
265+
}
259266

260267
Map<String,Quantity> requests = new HashMap<String, Quantity>();
261268

@@ -267,6 +274,21 @@ Map<String, Quantity> deduceResourceRequests(Map<String, String> kubernetesDeplo
267274
requests.put("cpu", new Quantity(cpuOverride));
268275
}
269276

277+
if(StringUtils.hasText(ephemeralStorage)) {
278+
requests.put("ephemeral-storage", new Quantity(ephemeralStorage));
279+
}
280+
281+
if(StringUtils.hasText(hugePages2Mi)) {
282+
requests.put("hugepages-2Mi", new Quantity(hugePages2Mi));
283+
}
284+
285+
if(StringUtils.hasText(hugePages1Gi)) {
286+
requests.put("hugepages-1Gi", new Quantity(hugePages1Gi));
287+
}
288+
289+
if(logger.isDebugEnabled()) {
290+
logger.debug("requests:" + requests);
291+
}
270292
return requests;
271293
}
272294

spring-cloud-deployer-kubernetes/src/main/java/org/springframework/cloud/deployer/spi/kubernetes/KubernetesDeployerProperties.java

Lines changed: 87 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,20 @@ public static class LimitsResources {
9090
*/
9191
private String memory;
9292

93+
/**
94+
* Container resource ephemeral-storage limit.
95+
*/
96+
private String ephemeralStorage;
97+
98+
/**
99+
* Container resource hugepages-2Mi limit.
100+
*/
101+
private String hugepages2Mi;
102+
103+
/**
104+
* Container resource hugepages-1Gi limit.
105+
*/
106+
private String hugepages1Gi;
93107
/**
94108
* Container GPU vendor name for limit
95109
*/
@@ -113,9 +127,12 @@ public LimitsResources() {
113127
* Use the default constructor and set() methods instead.
114128
*/
115129
@Deprecated
116-
public LimitsResources(String cpu, String memory) {
130+
public LimitsResources(String cpu, String memory, String ephemeralStorage, String hugepages2Mi, String hugepages1Gi) {
117131
this.cpu = cpu;
118132
this.memory = memory;
133+
this.ephemeralStorage = ephemeralStorage;
134+
this.hugepages2Mi = hugepages2Mi;
135+
this.hugepages1Gi = hugepages1Gi;
119136
}
120137

121138
public String getCpu() {
@@ -134,6 +151,30 @@ public void setMemory(String memory) {
134151
this.memory = memory;
135152
}
136153

154+
public String getEphemeralStorage() {
155+
return ephemeralStorage;
156+
}
157+
158+
public void setEphemeralStorage(String ephemeralStorage) {
159+
this.ephemeralStorage = ephemeralStorage;
160+
}
161+
162+
public String getHugepages2Mi() {
163+
return hugepages2Mi;
164+
}
165+
166+
public void setHugepages2Mi(String hugepages2Mi) {
167+
this.hugepages2Mi = hugepages2Mi;
168+
}
169+
170+
public String getHugepages1Gi() {
171+
return hugepages1Gi;
172+
}
173+
174+
public void setHugepages1Gi(String hugepages1Gi) {
175+
this.hugepages1Gi = hugepages1Gi;
176+
}
177+
137178
public String getGpuVendor() {
138179
return gpuVendor;
139180
}
@@ -157,21 +198,39 @@ public void setGpuCount(String gpuCount) {
157198
public static class RequestsResources {
158199

159200
/**
160-
* Container request limit.
201+
* Container cpu request.
161202
*/
162203
private String cpu;
163204

164205
/**
165-
* Container memory limit.
206+
* Container memory request.
166207
*/
167208
private String memory;
168209

210+
/**
211+
* Container resource ephemeral-storage request.
212+
*/
213+
private String ephemeralStorage;
214+
215+
/**
216+
* Container resource hugepages-2Mi request.
217+
*/
218+
private String hugepages2Mi;
219+
220+
/**
221+
* Container resource hugepages-1Gi request.
222+
*/
223+
private String hugepages1Gi;
224+
169225
public RequestsResources() {
170226
}
171227

172-
public RequestsResources(String cpu, String memory) {
228+
public RequestsResources(String cpu, String memory, String ephemeralStorage, String hugepages2Mi, String hugepages1Gi) {
173229
this.cpu = cpu;
174230
this.memory = memory;
231+
this.ephemeralStorage = ephemeralStorage;
232+
this.hugepages2Mi = hugepages2Mi;
233+
this.hugepages1Gi = hugepages1Gi;
175234
}
176235

177236
public String getCpu() {
@@ -189,6 +248,30 @@ public String getMemory() {
189248
public void setMemory(String memory) {
190249
this.memory = memory;
191250
}
251+
252+
public String getEphemeralStorage() {
253+
return ephemeralStorage;
254+
}
255+
256+
public void setEphemeralStorage(String ephemeralStorage) {
257+
this.ephemeralStorage = ephemeralStorage;
258+
}
259+
260+
public String getHugepages2Mi() {
261+
return hugepages2Mi;
262+
}
263+
264+
public void setHugepages2Mi(String hugepages2Mi) {
265+
this.hugepages2Mi = hugepages2Mi;
266+
}
267+
268+
public String getHugepages1Gi() {
269+
return hugepages1Gi;
270+
}
271+
272+
public void setHugepages1Gi(String hugepages1Gi) {
273+
this.hugepages1Gi = hugepages1Gi;
274+
}
192275
}
193276

194277
public static class StatefulSet {

spring-cloud-deployer-kubernetes/src/test/java/org/springframework/cloud/deployer/spi/kubernetes/RunAbstractKubernetesDeployerTests.java

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,4 +170,52 @@ public void requestMemory_deploymentProperty_usesDeploymentProperty() {
170170
Map<String, Quantity> requests = this.deploymentPropertiesResolver.deduceResourceRequests(deploymentRequest.getDeploymentProperties());
171171
assertThat(requests.get("memory")).isEqualTo(new Quantity("256Mi"));
172172
}
173+
174+
@Test
175+
public void requestEphemeralStorage_deploymentProperty_usesDeploymentProperty() {
176+
kubernetesDeployerProperties.getRequests().setEphemeralStorage("2Gi");
177+
deploymentProperties.put("spring.cloud.deployer.kubernetes.requests.ephemeral-storage", "2Gi");
178+
Map<String, Quantity> requests = this.deploymentPropertiesResolver.deduceResourceRequests(deploymentRequest.getDeploymentProperties());
179+
assertThat(requests.get("ephemeral-storage")).isEqualTo(new Quantity("2Gi"));
180+
}
181+
182+
@Test
183+
public void limitEphemeralStorage_deploymentProperty_usesDeploymentProperty() {
184+
kubernetesDeployerProperties.getLimits().setEphemeralStorage("2Gi");
185+
deploymentProperties.put("spring.cloud.deployer.kubernetes.limits.ephemeral-storage", "2Gi");
186+
Map<String, Quantity> limits = this.deploymentPropertiesResolver.deduceResourceLimits(deploymentRequest.getDeploymentProperties());
187+
assertThat(limits.get("ephemeral-storage")).isEqualTo(new Quantity("2Gi"));
188+
}
189+
190+
@Test
191+
public void requestHugepages1Gi_deploymentProperty_usesDeploymentProperty() {
192+
kubernetesDeployerProperties.getRequests().setHugepages1Gi("4");
193+
deploymentProperties.put("spring.cloud.deployer.kubernetes.requests.hugepages-1Gi", "4");
194+
Map<String, Quantity> requests = this.deploymentPropertiesResolver.deduceResourceRequests(deploymentRequest.getDeploymentProperties());
195+
assertThat(requests.get("hugepages-1Gi")).isEqualTo(new Quantity("4"));
196+
}
197+
198+
@Test
199+
public void limitHugepages1Gi_deploymentProperty_usesDeploymentProperty() {
200+
kubernetesDeployerProperties.getLimits().setHugepages1Gi("4");
201+
deploymentProperties.put("spring.cloud.deployer.kubernetes.limits.hugepages-1Gi", "4");
202+
Map<String, Quantity> limits = this.deploymentPropertiesResolver.deduceResourceLimits(deploymentRequest.getDeploymentProperties());
203+
assertThat(limits.get("hugepages-1Gi")).isEqualTo(new Quantity("4"));
204+
}
205+
206+
@Test
207+
public void requestHugepages2Mi_deploymentProperty_usesDeploymentProperty() {
208+
kubernetesDeployerProperties.getRequests().setHugepages2Mi("40");
209+
deploymentProperties.put("spring.cloud.deployer.kubernetes.requests.hugepages-2Mi", "40");
210+
Map<String, Quantity> requests = this.deploymentPropertiesResolver.deduceResourceRequests(deploymentRequest.getDeploymentProperties());
211+
assertThat(requests.get("hugepages-2Mi")).isEqualTo(new Quantity("40"));
212+
}
213+
214+
@Test
215+
public void limitHugepages2Mi_deploymentProperty_usesDeploymentProperty() {
216+
kubernetesDeployerProperties.getLimits().setHugepages2Mi("40");
217+
deploymentProperties.put("spring.cloud.deployer.kubernetes.limits.hugepages-2Mi", "40");
218+
Map<String, Quantity> limits = this.deploymentPropertiesResolver.deduceResourceLimits(deploymentRequest.getDeploymentProperties());
219+
assertThat(limits.get("hugepages-2Mi")).isEqualTo(new Quantity("40"));
220+
}
173221
}

0 commit comments

Comments
 (0)