Fix parsing of cpu attributes

CPU numbers were given as strings, so we skipped them..  Parse string in
all cases, and catch any NumberFormatException.

Fixes 9cbab36

Change-Id: Idd358b4d24ce86f097892eeafca5292fc4e775ca
This commit is contained in:
Rudi Schlatte
2024-01-30 15:21:36 +01:00
parent fd719d4e1f
commit 3b6ba806d2

View File

@@ -53,7 +53,10 @@ public class NebulousAppDeployer {
if (t.at("/type").asText().equals("scaler") if (t.at("/type").asText().equals("scaler")
&& t.at("/properties/replicas").canConvertToExactIntegral()) && t.at("/properties/replicas").canConvertToExactIntegral())
{ {
result.put(c.get("name").asText(), t.at("/properties/replicas").asInt()); // Note this can be 0, in case we want to balance
// between e.g. cloud and edge
result.put(c.get("name").asText(),
t.at("/properties/replicas").asInt());
} }
} }
} }
@@ -86,10 +89,6 @@ public class NebulousAppDeployer {
* nearest integer and ask for "this or more" cores, since we might end * nearest integer and ask for "this or more" cores, since we might end
* up with “strange” numbers of cores. <p> * up with “strange” numbers of cores. <p>
* *
* - We should use `traits.*.properties.replicas` if `traits.*.type` ==
* "scaler" to create multiple instances -- but that's propably a
* separate method
*
* @param kubevela the parsed KubeVela file. * @param kubevela the parsed KubeVela file.
* @return a map of component name to (potentially empty) list of * @return a map of component name to (potentially empty) list of
* requirements for that component. No requirements mean any node will * requirements for that component. No requirements mean any node will
@@ -99,21 +98,31 @@ public class NebulousAppDeployer {
Map<String, List<Requirement>> result = new HashMap<>(); Map<String, List<Requirement>> result = new HashMap<>();
ArrayNode components = kubevela.withArray("/spec/components"); ArrayNode components = kubevela.withArray("/spec/components");
for (final JsonNode c : components) { for (final JsonNode c : components) {
String componentName = c.get("name").asText();
ArrayList<Requirement> reqs = new ArrayList<>(); ArrayList<Requirement> reqs = new ArrayList<>();
reqs.add(new AttributeRequirement("image", "operatingSystem.family", reqs.add(new AttributeRequirement("image", "operatingSystem.family",
RequirementOperator.IN, OperatingSystemFamily.UBUNTU.toString())); RequirementOperator.IN, OperatingSystemFamily.UBUNTU.toString()));
JsonNode cpu = c.at("/properties/cpu"); JsonNode cpu = c.at("/properties/cpu");
if (cpu.isMissingNode()) cpu = c.at("/properties/resources/requests/cpu"); if (cpu.isMissingNode()) cpu = c.at("/properties/resources/requests/cpu");
if (!cpu.isMissingNode() && cpu.isNumber()) { if (!cpu.isMissingNode()) {
// KubeVela has fractional core /cpu requirements // KubeVela has fractional core /cpu requirements, and the
double kubevela_cpu = Double.parseDouble(cpu.asText()); // value might be given as a string instead of a number, so
// parse string in all cases.
double kubevela_cpu = -1;
try {
kubevela_cpu = Double.parseDouble(cpu.asText());
} catch (NumberFormatException e) {
log.warn("CPU spec in {} is not a number, value seen is {}",
componentName, cpu.asText());
}
long sal_cores = Math.round(Math.ceil(kubevela_cpu)); long sal_cores = Math.round(Math.ceil(kubevela_cpu));
if (sal_cores > 0) { if (sal_cores > 0) {
reqs.add(new AttributeRequirement("hardware", "cores", reqs.add(new AttributeRequirement("hardware", "cores",
RequirementOperator.GEQ, Long.toString(sal_cores))); RequirementOperator.GEQ, Long.toString(sal_cores)));
} else { } else {
// floatValue returns 0.0 if node is not numeric // floatValue returns 0.0 if node is not numeric
log.warn("CPU of component {} is 0 or not a number", c.get("name").asText()); log.warn("CPU of component {} is 0 or not a number, value seen is {}",
componentName, cpu.asText());
} }
} }
JsonNode memory = c.at("/properties/memory"); JsonNode memory = c.at("/properties/memory");
@@ -126,7 +135,7 @@ public class NebulousAppDeployer {
sal_memory = String.valueOf(Integer.parseInt(sal_memory.substring(0, sal_memory.length() - 2)) * 1024); sal_memory = String.valueOf(Integer.parseInt(sal_memory.substring(0, sal_memory.length() - 2)) * 1024);
} else if (!memory.isNumber()) { } else if (!memory.isNumber()) {
log.warn("Unsupported memory specification in component {} :{} (wanted 'Mi' or 'Gi') ", log.warn("Unsupported memory specification in component {} :{} (wanted 'Mi' or 'Gi') ",
c.get("name").asText(), componentName,
memory.asText()); memory.asText());
sal_memory = null; sal_memory = null;
} }
@@ -141,7 +150,7 @@ public class NebulousAppDeployer {
// Check for node affinity / geoLocation / country // Check for node affinity / geoLocation / country
} }
// Finally, add requirements for this job to the map // Finally, add requirements for this job to the map
result.put(c.get("name").asText(), reqs); result.put(componentName, reqs);
} }
return result; return result;
} }