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:
		@@ -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;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user