Use clamped requirements for broker

Go through the resource broker for node candidates again.

Ask for >= x, <= 2*x when we have requirement x (for cpu, memory).  This
gives us some flexibility in case no image precisely fulfills the
requirements, but rules out nodes that are outrageously big.

Change-Id: I35d0b4207b2b76b212f5e584f932b8aaf579a0e9
This commit is contained in:
Rudi Schlatte
2024-04-04 13:54:08 +02:00
parent 7798bf3a38
commit da7805282c
3 changed files with 186 additions and 65 deletions

View File

@@ -165,7 +165,7 @@ public class NebulousAppDeployer {
// ------------------------------------------------------------
// 1. Extract node requirements
Map<String, List<Requirement>> componentRequirements = KubevelaAnalyzer.getRequirements(kubevela);
Map<String, List<Requirement>> componentRequirements = KubevelaAnalyzer.getClampedRequirements(kubevela);
Map<String, Integer> nodeCounts = KubevelaAnalyzer.getNodeCount(kubevela);
List<Requirement> controllerRequirements = getControllerRequirements(appUUID);
@@ -177,7 +177,7 @@ public class NebulousAppDeployer {
// 2. Find node candidates
// TODO: filter by app resources (check enabled: true in resources array)
List<NodeCandidate> controllerCandidates = conn.findNodeCandidatesFromSal(controllerRequirements, appUUID);
List<NodeCandidate> controllerCandidates = conn.findNodeCandidates(controllerRequirements, appUUID);
if (controllerCandidates.isEmpty()) {
log.error("Could not find node candidates for requirements: {}",
controllerRequirements, keyValue("appId", appUUID), keyValue("clusterName", clusterName));
@@ -189,7 +189,7 @@ public class NebulousAppDeployer {
String nodeName = e.getKey();
List<Requirement> requirements = e.getValue();
// TODO: filter by app resources (check enabled: true in resources array)
List<NodeCandidate> candidates = conn.findNodeCandidatesFromSal(requirements, appUUID);
List<NodeCandidate> candidates = conn.findNodeCandidates(requirements, appUUID);
if (candidates.isEmpty()) {
log.error("Could not find node candidates for for node {}, requirements: {}", nodeName, requirements,
keyValue("appId", appUUID), keyValue("clusterName", clusterName));
@@ -415,7 +415,7 @@ public class NebulousAppDeployer {
// ------------------------------------------------------------
// 1. Extract node requirements
Map<String, List<Requirement>> componentRequirements = KubevelaAnalyzer.getRequirements(kubevela);
Map<String, List<Requirement>> componentRequirements = KubevelaAnalyzer.getClampedRequirements(kubevela);
Map<String, Integer> componentReplicaCounts = KubevelaAnalyzer.getNodeCount(kubevela);
Map<String, List<Requirement>> oldComponentRequirements = app.getComponentRequirements();
@@ -444,7 +444,7 @@ public class NebulousAppDeployer {
log.debug("Adding {} nodes to component {}", nAdd, componentName,
keyValue("appId", appUUID), keyValue("clusterName", clusterName));
// TODO: filter by app resources (check enabled: true in resources array)
List<NodeCandidate> candidates = conn.findNodeCandidatesFromSal(newR, appUUID);
List<NodeCandidate> candidates = conn.findNodeCandidates(newR, appUUID);
if (candidates.isEmpty()) {
log.error("Could not find node candidates for requirements: {}",
newR, keyValue("appId", appUUID), keyValue("clusterName", clusterName));
@@ -500,7 +500,7 @@ public class NebulousAppDeployer {
log.debug("Redeploying all nodes of component {}", componentName,
keyValue("appId", appUUID), keyValue("clusterName", clusterName));
// TODO: filter by app resources (check enabled: true in resources array)
List<NodeCandidate> candidates = conn.findNodeCandidatesFromSal(newR, appUUID);
List<NodeCandidate> candidates = conn.findNodeCandidates(newR, appUUID);
if (candidates.size() == 0) {
log.error("Empty node candidate list for component {}, continuing without creating node", componentName,
keyValue("appId", appUUID), keyValue("clusterName", clusterName));