Skip to content

Commit 779fa79

Browse files
committed
extract common code and check node-type offering if present during upgrade and scale
1 parent 21b76ea commit 779fa79

1 file changed

Lines changed: 41 additions & 16 deletions

File tree

plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/KubernetesClusterManagerImpl.java

Lines changed: 41 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1418,14 +1418,10 @@ protected void validateServiceOfferingsForNodeTypesScale(Map<String, Long> map,
14181418
throw new InvalidParameterValueException("Failed to find service offering ID: " + serviceOfferingId);
14191419
}
14201420
checkServiceOfferingForNodesScale(serviceOffering, kubernetesCluster, clusterVersion);
1421-
Long nodeTypeOfferingId = getExistingServiceOfferingIdForNodeType(key, kubernetesCluster);
1422-
if (nodeTypeOfferingId == null) {
1423-
if (getNodeCountForType(KubernetesClusterNodeType.valueOf(key), kubernetesCluster) <=0) {
1424-
continue;
1425-
}
1426-
nodeTypeOfferingId = kubernetesCluster.getServiceOfferingId();
1421+
final ServiceOffering existingServiceOffering = getEffectiveServiceOfferingForNodeType(key, kubernetesCluster);
1422+
if (existingServiceOffering == null) {
1423+
continue;
14271424
}
1428-
final ServiceOffering existingServiceOffering = serviceOfferingDao.findById(nodeTypeOfferingId);
14291425
if (KubernetesCluster.State.Running.equals(kubernetesCluster.getState()) && (serviceOffering.getRamSize() < existingServiceOffering.getRamSize() ||
14301426
serviceOffering.getCpu() * serviceOffering.getSpeed() < existingServiceOffering.getCpu() * existingServiceOffering.getSpeed())) {
14311427
logAndThrow(Level.WARN, String.format("Kubernetes cluster cannot be scaled down for service offering. Service offering : %s offers lesser resources as compared to service offering : %s of Kubernetes cluster : %s",
@@ -1446,6 +1442,33 @@ private Long getExistingServiceOfferingIdForNodeType(String key, KubernetesClust
14461442
return kubernetesCluster.getServiceOfferingId();
14471443
}
14481444

1445+
// Resolves the offering backing a node type, falling back to the legacy cluster-wide offering; null if the cluster has no nodes of this type.
1446+
protected ServiceOffering getEffectiveServiceOfferingForNodeType(String key, KubernetesClusterVO kubernetesCluster) {
1447+
if (getNodeCountForType(KubernetesClusterNodeType.valueOf(key), kubernetesCluster) <= 0) {
1448+
return null;
1449+
}
1450+
Long offeringId = getExistingServiceOfferingIdForNodeType(key, kubernetesCluster);
1451+
if (offeringId == null) {
1452+
offeringId = kubernetesCluster.getServiceOfferingId();
1453+
}
1454+
if (offeringId == null) {
1455+
return null;
1456+
}
1457+
return serviceOfferingDao.findByIdIncludingRemoved(offeringId);
1458+
}
1459+
1460+
// Effective offerings for every node type actually present on the cluster.
1461+
protected List<ServiceOffering> getEffectiveServiceOfferingsForCluster(KubernetesClusterVO kubernetesCluster) {
1462+
List<ServiceOffering> offerings = new ArrayList<>();
1463+
for (String key : CLUSTER_NODES_TYPES_LIST) {
1464+
ServiceOffering offering = getEffectiveServiceOfferingForNodeType(key, kubernetesCluster);
1465+
if (offering != null) {
1466+
offerings.add(offering);
1467+
}
1468+
}
1469+
return offerings;
1470+
}
1471+
14491472
protected void checkServiceOfferingForNodesScale(ServiceOffering serviceOffering, KubernetesClusterVO kubernetesCluster, KubernetesSupportedVersion clusterVersion) {
14501473
if (serviceOffering.isDynamic()) {
14511474
throw new InvalidParameterValueException(String.format("Custom service offerings are not supported for Kubernetes clusters. Kubernetes cluster : %s, service offering : %s", kubernetesCluster.getName(), serviceOffering.getName()));
@@ -1510,17 +1533,19 @@ private void validateKubernetesClusterUpgradeParameters(UpgradeKubernetesCluster
15101533
throw new InvalidParameterValueException(String.format("Invalid Kubernetes version associated with cluster : %s",
15111534
kubernetesCluster.getName()));
15121535
}
1513-
final ServiceOffering serviceOffering = serviceOfferingDao.findByIdIncludingRemoved(kubernetesCluster.getServiceOfferingId());
1514-
if (serviceOffering == null) {
1536+
final List<ServiceOffering> effectiveServiceOfferings = getEffectiveServiceOfferingsForCluster(kubernetesCluster);
1537+
if (CollectionUtils.isEmpty(effectiveServiceOfferings)) {
15151538
throw new CloudRuntimeException(String.format("Invalid service offering associated with Kubernetes cluster : %s", kubernetesCluster.getName()));
15161539
}
1517-
if (serviceOffering.getCpu() < upgradeVersion.getMinimumCpu()) {
1518-
throw new InvalidParameterValueException(String.format("Kubernetes cluster : %s cannot be upgraded with Kubernetes version : %s which needs minimum %d vCPUs while associated service offering : %s offers only %d vCPUs",
1519-
kubernetesCluster.getName(), upgradeVersion.getName(), upgradeVersion.getMinimumCpu(), serviceOffering.getName(), serviceOffering.getCpu()));
1520-
}
1521-
if (serviceOffering.getRamSize() < upgradeVersion.getMinimumRamSize()) {
1522-
throw new InvalidParameterValueException(String.format("Kubernetes cluster : %s cannot be upgraded with Kubernetes version : %s which needs minimum %d MB RAM while associated service offering : %s offers only %d MB RAM",
1523-
kubernetesCluster.getName(), upgradeVersion.getName(), upgradeVersion.getMinimumRamSize(), serviceOffering.getName(), serviceOffering.getRamSize()));
1540+
for (ServiceOffering serviceOffering : effectiveServiceOfferings) {
1541+
if (serviceOffering.getCpu() < upgradeVersion.getMinimumCpu()) {
1542+
throw new InvalidParameterValueException(String.format("Kubernetes cluster : %s cannot be upgraded with Kubernetes version : %s which needs minimum %d vCPUs while associated service offering : %s offers only %d vCPUs",
1543+
kubernetesCluster.getName(), upgradeVersion.getName(), upgradeVersion.getMinimumCpu(), serviceOffering.getName(), serviceOffering.getCpu()));
1544+
}
1545+
if (serviceOffering.getRamSize() < upgradeVersion.getMinimumRamSize()) {
1546+
throw new InvalidParameterValueException(String.format("Kubernetes cluster : %s cannot be upgraded with Kubernetes version : %s which needs minimum %d MB RAM while associated service offering : %s offers only %d MB RAM",
1547+
kubernetesCluster.getName(), upgradeVersion.getName(), upgradeVersion.getMinimumRamSize(), serviceOffering.getName(), serviceOffering.getRamSize()));
1548+
}
15241549
}
15251550
// Check upgradeVersion is either patch upgrade or immediate minor upgrade
15261551
try {

0 commit comments

Comments
 (0)