From a7e527033600010afd4f87d495a3ef2558d593dd Mon Sep 17 00:00:00 2001 From: Daman Arora Date: Tue, 6 Jan 2026 10:26:41 -0500 Subject: [PATCH] Implement getAffinityGroupNodeTypeMap in kubernetes service helper --- .../cluster/KubernetesServiceHelper.java | 1 + .../java/com/cloud/vm/VmDetailConstants.java | 1 + .../cluster/KubernetesServiceHelperImpl.java | 60 +++++++++++++++++++ .../cluster/CreateKubernetesClusterCmd.java | 10 +++- 4 files changed, 69 insertions(+), 3 deletions(-) diff --git a/api/src/main/java/com/cloud/kubernetes/cluster/KubernetesServiceHelper.java b/api/src/main/java/com/cloud/kubernetes/cluster/KubernetesServiceHelper.java index 37b8907b454..a9f76c174b5 100644 --- a/api/src/main/java/com/cloud/kubernetes/cluster/KubernetesServiceHelper.java +++ b/api/src/main/java/com/cloud/kubernetes/cluster/KubernetesServiceHelper.java @@ -36,5 +36,6 @@ public interface KubernetesServiceHelper extends Adapter { boolean isValidNodeType(String nodeType); Map getServiceOfferingNodeTypeMap(Map> serviceOfferingNodeTypeMap); Map getTemplateNodeTypeMap(Map> templateNodeTypeMap); + Map getAffinityGroupNodeTypeMap(Map> affinityGroupNodeTypeMap); void cleanupForAccount(Account account); } diff --git a/api/src/main/java/com/cloud/vm/VmDetailConstants.java b/api/src/main/java/com/cloud/vm/VmDetailConstants.java index 596c861218f..217e9f9224c 100644 --- a/api/src/main/java/com/cloud/vm/VmDetailConstants.java +++ b/api/src/main/java/com/cloud/vm/VmDetailConstants.java @@ -93,6 +93,7 @@ public interface VmDetailConstants { String CKS_NODE_TYPE = "node"; String OFFERING = "offering"; String TEMPLATE = "template"; + String AFFINITY_GROUP = "affinitygroup"; // VMware to KVM VM migrations specific String VMWARE_TO_KVM_PREFIX = "vmware-to-kvm"; diff --git a/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/KubernetesServiceHelperImpl.java b/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/KubernetesServiceHelperImpl.java index 30465c99780..62e190b35bd 100644 --- a/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/KubernetesServiceHelperImpl.java +++ b/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/KubernetesServiceHelperImpl.java @@ -24,6 +24,8 @@ import java.util.Objects; import javax.inject.Inject; +import org.apache.cloudstack.affinity.AffinityGroup; +import org.apache.cloudstack.affinity.dao.AffinityGroupDao; import com.cloud.exception.InvalidParameterValueException; import com.cloud.offering.ServiceOffering; import com.cloud.service.dao.ServiceOfferingDao; @@ -66,6 +68,8 @@ public class KubernetesServiceHelperImpl extends AdapterBase implements Kubernet @Inject protected VMTemplateDao vmTemplateDao; @Inject + protected AffinityGroupDao affinityGroupDao; + @Inject KubernetesClusterService kubernetesClusterService; protected void setEventTypeEntityDetails(Class eventTypeDefinedClass, Class entityClass) { @@ -244,6 +248,62 @@ public class KubernetesServiceHelperImpl extends AdapterBase implements Kubernet return mapping; } + protected void checkNodeTypeAffinityGroupEntryCompleteness(String nodeTypeStr, String affinityGroupUuid) { + if (StringUtils.isAnyBlank(nodeTypeStr, affinityGroupUuid)) { + String error = String.format("Any Node Type to Affinity Group entry should have a valid '%s' and '%s' values", + VmDetailConstants.CKS_NODE_TYPE, VmDetailConstants.AFFINITY_GROUP); + logger.error(error); + throw new InvalidParameterValueException(error); + } + } + + protected void checkNodeTypeAffinityGroupEntryValues(String nodeTypeStr, AffinityGroup affinityGroup, String affinityGroupUuid) { + if (!isValidNodeType(nodeTypeStr)) { + String error = String.format("The provided value '%s' for Node Type is invalid", nodeTypeStr); + logger.error(error); + throw new InvalidParameterValueException(String.format(error)); + } + if (affinityGroup == null) { + String error = String.format("Cannot find an affinity group with ID %s", affinityGroupUuid); + logger.error(error); + throw new InvalidParameterValueException(error); + } + } + + protected void addNodeTypeAffinityGroupEntry(String nodeTypeStr, String affinityGroupUuid, AffinityGroup affinityGroup, Map mapping) { + if (logger.isDebugEnabled()) { + logger.debug(String.format("Node Type: '%s' should use affinity group ID: '%s'", nodeTypeStr, affinityGroupUuid)); + } + KubernetesClusterNodeType nodeType = KubernetesClusterNodeType.valueOf(nodeTypeStr.toUpperCase()); + mapping.put(nodeType.name(), affinityGroup.getId()); + } + + protected void processNodeTypeAffinityGroupEntryAndAddToMappingIfValid(Map entry, Map mapping) { + if (MapUtils.isEmpty(entry)) { + return; + } + String nodeTypeStr = entry.get(VmDetailConstants.CKS_NODE_TYPE); + String affinityGroupUuid = entry.get(VmDetailConstants.AFFINITY_GROUP); + checkNodeTypeAffinityGroupEntryCompleteness(nodeTypeStr, affinityGroupUuid); + + AffinityGroup affinityGroup = affinityGroupDao.findByUuid(affinityGroupUuid); + checkNodeTypeAffinityGroupEntryValues(nodeTypeStr, affinityGroup, affinityGroupUuid); + + addNodeTypeAffinityGroupEntry(nodeTypeStr, affinityGroupUuid, affinityGroup, mapping); + } + + @Override + public Map getAffinityGroupNodeTypeMap(Map> affinityGroupNodeTypeMap) { + Map mapping = new HashMap<>(); + if (MapUtils.isNotEmpty(affinityGroupNodeTypeMap)) { + for (Map entry : affinityGroupNodeTypeMap.values()) { + processNodeTypeAffinityGroupEntryAndAddToMappingIfValid(entry, mapping); + } + } + return mapping; + } + + public void cleanupForAccount(Account account) { kubernetesClusterService.cleanupForAccount(account); } diff --git a/plugins/integrations/kubernetes-service/src/main/java/org/apache/cloudstack/api/command/user/kubernetes/cluster/CreateKubernetesClusterCmd.java b/plugins/integrations/kubernetes-service/src/main/java/org/apache/cloudstack/api/command/user/kubernetes/cluster/CreateKubernetesClusterCmd.java index be68b33f1fe..4e458bbe6d7 100644 --- a/plugins/integrations/kubernetes-service/src/main/java/org/apache/cloudstack/api/command/user/kubernetes/cluster/CreateKubernetesClusterCmd.java +++ b/plugins/integrations/kubernetes-service/src/main/java/org/apache/cloudstack/api/command/user/kubernetes/cluster/CreateKubernetesClusterCmd.java @@ -79,7 +79,7 @@ public class CreateKubernetesClusterCmd extends BaseAsyncCreateCmd { @Inject public KubernetesClusterService kubernetesClusterService; @Inject - protected KubernetesServiceHelper kubernetesClusterHelper; + protected KubernetesServiceHelper kubernetesServiceHelper; @Inject private ConfigurationDao configurationDao; @Inject @@ -320,11 +320,15 @@ public class CreateKubernetesClusterCmd extends BaseAsyncCreateCmd { } public Map getServiceOfferingNodeTypeMap() { - return kubernetesClusterHelper.getServiceOfferingNodeTypeMap(serviceOfferingNodeTypeMap); + return kubernetesServiceHelper.getServiceOfferingNodeTypeMap(serviceOfferingNodeTypeMap); } public Map getTemplateNodeTypeMap() { - return kubernetesClusterHelper.getTemplateNodeTypeMap(templateNodeTypeMap); + return kubernetesServiceHelper.getTemplateNodeTypeMap(templateNodeTypeMap); + } + + public Map getAffinityGroupNodeTypeMap() { + return kubernetesServiceHelper.getAffinityGroupNodeTypeMap(affinityGroupNodeTypeMap); } public Hypervisor.HypervisorType getHypervisorType() {