diff --git a/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/KubernetesClusterManagerImpl.java b/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/KubernetesClusterManagerImpl.java index 035554e38237..71ce96398a55 100644 --- a/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/KubernetesClusterManagerImpl.java +++ b/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/KubernetesClusterManagerImpl.java @@ -1442,6 +1442,15 @@ protected void validateServiceOfferingsForNodeTypesScale(Map map, } } + protected void setNodeServiceOfferingIds(KubernetesClusterVO cluster, Map serviceOfferingNodeTypeMap) { + Long defaultServiceOfferingId = cluster.getServiceOfferingId(); + cluster.setWorkerNodeServiceOfferingId(serviceOfferingNodeTypeMap.getOrDefault(WORKER.name(), defaultServiceOfferingId)); + cluster.setControlNodeServiceOfferingId(serviceOfferingNodeTypeMap.getOrDefault(CONTROL.name(), defaultServiceOfferingId)); + if (cluster.getEtcdNodeCount() > 0) { + cluster.setEtcdNodeServiceOfferingId(serviceOfferingNodeTypeMap.getOrDefault(ETCD.name(), defaultServiceOfferingId)); + } + } + private Long getExistingServiceOfferingIdForNodeType(String key, KubernetesClusterVO kubernetesCluster) { if (key.equalsIgnoreCase(WORKER.name())) { return kubernetesCluster.getWorkerNodeServiceOfferingId(); @@ -1674,19 +1683,11 @@ public KubernetesClusterVO doInTransaction(TransactionStatus status) { cniConfigDetails = cmd.getCniConfigDetails().toString(); } newCluster.setCniConfigDetails(cniConfigDetails); - if (serviceOfferingNodeTypeMap.containsKey(WORKER.name())) { - newCluster.setWorkerNodeServiceOfferingId(serviceOfferingNodeTypeMap.get(WORKER.name())); - } - if (serviceOfferingNodeTypeMap.containsKey(CONTROL.name())) { - newCluster.setControlNodeServiceOfferingId(serviceOfferingNodeTypeMap.get(CONTROL.name())); - } if (etcdNodes > 0) { newCluster.setEtcdNodeTemplateId(etcdNodeTemplate.getId()); newCluster.setEtcdNodeCount(etcdNodes); - if (serviceOfferingNodeTypeMap.containsKey(ETCD.name())) { - newCluster.setEtcdNodeServiceOfferingId(serviceOfferingNodeTypeMap.get(ETCD.name())); - } } + setNodeServiceOfferingIds(newCluster, serviceOfferingNodeTypeMap); newCluster.setWorkerNodeTemplateId(workerNodeTemplate.getId()); newCluster.setControlNodeTemplateId(controlNodeTemplate.getId()); if (zone.isSecurityGroupEnabled()) { diff --git a/plugins/integrations/kubernetes-service/src/test/java/com/cloud/kubernetes/cluster/KubernetesClusterManagerImplTest.java b/plugins/integrations/kubernetes-service/src/test/java/com/cloud/kubernetes/cluster/KubernetesClusterManagerImplTest.java index 2a381f282de2..22f8dc2f65f7 100644 --- a/plugins/integrations/kubernetes-service/src/test/java/com/cloud/kubernetes/cluster/KubernetesClusterManagerImplTest.java +++ b/plugins/integrations/kubernetes-service/src/test/java/com/cloud/kubernetes/cluster/KubernetesClusterManagerImplTest.java @@ -107,6 +107,58 @@ public class KubernetesClusterManagerImplTest { @InjectMocks KubernetesClusterManagerImpl kubernetesClusterManager; + @Test + public void testSetNodeServiceOfferingIdsWithDefaultOffering() { + KubernetesClusterVO cluster = new KubernetesClusterVO(); + cluster.setServiceOfferingId(1L); + + kubernetesClusterManager.setNodeServiceOfferingIds(cluster, Collections.emptyMap()); + + Assert.assertEquals(Long.valueOf(1L), cluster.getWorkerNodeServiceOfferingId()); + Assert.assertEquals(Long.valueOf(1L), cluster.getControlNodeServiceOfferingId()); + Assert.assertNull(cluster.getEtcdNodeServiceOfferingId()); + } + + @Test + public void testSetNodeServiceOfferingIdsWithPartialOverrides() { + KubernetesClusterVO cluster = new KubernetesClusterVO(); + cluster.setServiceOfferingId(1L); + cluster.setEtcdNodeCount(3L); + + kubernetesClusterManager.setNodeServiceOfferingIds(cluster, Map.of(WORKER.name(), 2L)); + + Assert.assertEquals(Long.valueOf(2L), cluster.getWorkerNodeServiceOfferingId()); + Assert.assertEquals(Long.valueOf(1L), cluster.getControlNodeServiceOfferingId()); + Assert.assertEquals(Long.valueOf(1L), cluster.getEtcdNodeServiceOfferingId()); + } + + @Test + public void testSetNodeServiceOfferingIdsWithOnlyExplicitOfferings() { + KubernetesClusterVO cluster = new KubernetesClusterVO(); + cluster.setEtcdNodeCount(3L); + + kubernetesClusterManager.setNodeServiceOfferingIds(cluster, + Map.of(WORKER.name(), 2L, CONTROL.name(), 3L, ETCD.name(), 4L)); + + Assert.assertEquals(Long.valueOf(2L), cluster.getWorkerNodeServiceOfferingId()); + Assert.assertEquals(Long.valueOf(3L), cluster.getControlNodeServiceOfferingId()); + Assert.assertEquals(Long.valueOf(4L), cluster.getEtcdNodeServiceOfferingId()); + Assert.assertNull(cluster.getServiceOfferingId()); + } + + @Test + public void testSetNodeServiceOfferingIdsWithoutSeparateEtcdNodes() { + KubernetesClusterVO cluster = new KubernetesClusterVO(); + cluster.setServiceOfferingId(1L); + + kubernetesClusterManager.setNodeServiceOfferingIds(cluster, + Map.of(WORKER.name(), 2L, CONTROL.name(), 3L, ETCD.name(), 4L)); + + Assert.assertEquals(Long.valueOf(2L), cluster.getWorkerNodeServiceOfferingId()); + Assert.assertEquals(Long.valueOf(3L), cluster.getControlNodeServiceOfferingId()); + Assert.assertNull(cluster.getEtcdNodeServiceOfferingId()); + } + @Test public void testValidateVpcTierAllocated() { Network network = Mockito.mock(Network.class);