Skip to content

Commit aa2d006

Browse files
committed
extract code and add unit tests
1 parent 2affeaf commit aa2d006

File tree

2 files changed

+76
-104
lines changed

2 files changed

+76
-104
lines changed

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

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -441,24 +441,30 @@ private void scaleDownKubernetesClusterSize() throws CloudRuntimeException {
441441
if (this.nodeIds != null) {
442442
vmList = getKubernetesClusterVMMapsForNodes(this.nodeIds).stream().filter(vm -> !vm.isExternalNode()).collect(Collectors.toList());
443443
} else {
444-
List<KubernetesClusterVmMapVO> workerVMsMap = getKubernetesClusterVMMaps().stream()
445-
.filter(vm -> !vm.isExternalNode() && !vm.isControlNode() && !vm.isEtcdNode())
446-
.collect(Collectors.toList());
447-
int totalWorkerNodes = workerVMsMap.size();
448-
int desiredWorkerNodes = clusterSize == null ? (int) kubernetesCluster.getNodeCount() : clusterSize.intValue();
449-
int toRemoveCount = Math.max(0, totalWorkerNodes - desiredWorkerNodes);
450-
if (toRemoveCount == 0) {
444+
vmList = getWorkerNodesToRemove();
445+
if (vmList.isEmpty()) {
451446
logger.info("No nodes to remove from Kubernetes cluster: {}", kubernetesCluster);
452447
return;
453448
}
454-
455-
int startIndex = Math.max(0, totalWorkerNodes - toRemoveCount);
456-
vmList = new ArrayList<>(workerVMsMap.subList(startIndex, totalWorkerNodes));
457449
}
458450
Collections.reverse(vmList);
459451
removeNodesFromCluster(vmList);
460452
}
461453

454+
public List<KubernetesClusterVmMapVO> getWorkerNodesToRemove() {
455+
List<KubernetesClusterVmMapVO> workerVMsMap = getKubernetesClusterVMMaps().stream()
456+
.filter(vm -> !vm.isExternalNode() && !vm.isControlNode() && !vm.isEtcdNode())
457+
.collect(Collectors.toList());
458+
int totalWorkerNodes = workerVMsMap.size();
459+
int desiredWorkerNodes = clusterSize == null ? (int) kubernetesCluster.getNodeCount() : clusterSize.intValue();
460+
int toRemoveCount = Math.max(0, totalWorkerNodes - desiredWorkerNodes);
461+
if (toRemoveCount == 0) {
462+
return new ArrayList<>();
463+
}
464+
int startIndex = Math.max(0, totalWorkerNodes - toRemoveCount);
465+
return new ArrayList<>(workerVMsMap.subList(startIndex, totalWorkerNodes));
466+
}
467+
462468
private void scaleUpKubernetesClusterSize(final long newVmCount) throws CloudRuntimeException {
463469
if (!kubernetesCluster.getState().equals(KubernetesCluster.State.Scaling)) {
464470
stateTransitTo(kubernetesCluster.getId(), KubernetesCluster.Event.ScaleUpRequested);

plugins/integrations/kubernetes-service/src/test/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterScaleWorkerTest.java

Lines changed: 60 additions & 94 deletions
Original file line numberDiff line numberDiff line change
@@ -17,112 +17,78 @@
1717
package com.cloud.kubernetes.cluster.actionworkers;
1818

1919
import com.cloud.kubernetes.cluster.KubernetesCluster;
20-
import com.cloud.kubernetes.cluster.KubernetesClusterManagerImpl;
2120
import com.cloud.kubernetes.cluster.KubernetesClusterVmMapVO;
22-
import com.cloud.kubernetes.cluster.dao.KubernetesClusterVmMapDao;
23-
import com.cloud.offering.ServiceOffering;
24-
import com.cloud.service.ServiceOfferingVO;
25-
import com.cloud.service.dao.ServiceOfferingDao;
26-
import com.cloud.utils.Pair;
27-
import com.cloud.vm.UserVmVO;
28-
import com.cloud.vm.dao.UserVmDao;
21+
import com.cloud.kubernetes.cluster.KubernetesClusterManagerImpl;
2922
import org.junit.Assert;
30-
import org.junit.Before;
3123
import org.junit.Test;
32-
import org.junit.runner.RunWith;
33-
import org.mockito.Mock;
24+
3425
import org.mockito.Mockito;
35-
import org.mockito.junit.MockitoJUnitRunner;
3626

27+
import java.util.Arrays;
3728
import java.util.List;
3829

39-
import static com.cloud.kubernetes.cluster.KubernetesServiceHelper.KubernetesClusterNodeType.DEFAULT;
40-
import static com.cloud.kubernetes.cluster.KubernetesServiceHelper.KubernetesClusterNodeType.CONTROL;
41-
42-
@RunWith(MockitoJUnitRunner.class)
4330
public class KubernetesClusterScaleWorkerTest {
4431

45-
@Mock
46-
private KubernetesCluster kubernetesCluster;
47-
@Mock
48-
private KubernetesClusterManagerImpl clusterManager;
49-
@Mock
50-
private ServiceOfferingDao serviceOfferingDao;
51-
@Mock
52-
private KubernetesClusterVmMapDao kubernetesClusterVmMapDao;
53-
@Mock
54-
private UserVmDao userVmDao;
55-
56-
private KubernetesClusterScaleWorker worker;
57-
58-
private static final Long defaultOfferingId = 1L;
59-
60-
@Before
61-
public void setUp() {
62-
worker = new KubernetesClusterScaleWorker(kubernetesCluster, clusterManager);
63-
worker.serviceOfferingDao = serviceOfferingDao;
64-
worker.kubernetesClusterVmMapDao = kubernetesClusterVmMapDao;
65-
worker.userVmDao = userVmDao;
66-
}
67-
6832
@Test
69-
public void testCalculateNewClusterCountAndCapacityAllNodesScaleSize() {
70-
long controlNodes = 3L;
71-
long etcdNodes = 2L;
72-
Mockito.when(kubernetesCluster.getControlNodeCount()).thenReturn(controlNodes);
73-
Mockito.when(kubernetesCluster.getEtcdNodeCount()).thenReturn(etcdNodes);
74-
75-
ServiceOffering newOffering = Mockito.mock(ServiceOffering.class);
76-
int newCores = 4;
77-
int newMemory = 4096;
78-
Mockito.when(newOffering.getCpu()).thenReturn(newCores);
79-
Mockito.when(newOffering.getRamSize()).thenReturn(newMemory);
80-
81-
long newWorkerSize = 4L;
82-
Pair<Long, Long> newClusterCapacity = worker.calculateNewClusterCountAndCapacity(newWorkerSize, DEFAULT, newOffering);
83-
84-
long expectedCores = (newCores * newWorkerSize) + (newCores * controlNodes) + (newCores * etcdNodes);
85-
long expectedMemory = (newMemory * newWorkerSize) + (newMemory * controlNodes) + (newMemory * etcdNodes);
86-
Assert.assertEquals(expectedCores, newClusterCapacity.first().longValue());
87-
Assert.assertEquals(expectedMemory, newClusterCapacity.second().longValue());
33+
public void testGetWorkerNodesToRemoveForDownsize_singleRemoval() {
34+
KubernetesCluster kubernetesCluster = Mockito.mock(KubernetesCluster.class);
35+
Mockito.when(kubernetesCluster.getNodeCount()).thenReturn(3L);
36+
37+
KubernetesClusterManagerImpl clusterManager = Mockito.mock(KubernetesClusterManagerImpl.class);
38+
KubernetesClusterScaleWorker worker = new KubernetesClusterScaleWorker(kubernetesCluster, new java.util.HashMap<>(), 2L, null, false, null, null, clusterManager);
39+
KubernetesClusterScaleWorker spyWorker = Mockito.spy(worker);
40+
41+
KubernetesClusterVmMapVO vm1 = Mockito.mock(KubernetesClusterVmMapVO.class);
42+
Mockito.when(vm1.isExternalNode()).thenReturn(false);
43+
Mockito.when(vm1.isControlNode()).thenReturn(false);
44+
Mockito.when(vm1.isEtcdNode()).thenReturn(false);
45+
46+
KubernetesClusterVmMapVO vm2 = Mockito.mock(KubernetesClusterVmMapVO.class);
47+
Mockito.when(vm2.isExternalNode()).thenReturn(false);
48+
Mockito.when(vm2.isControlNode()).thenReturn(false);
49+
Mockito.when(vm2.isEtcdNode()).thenReturn(false);
50+
51+
KubernetesClusterVmMapVO vm3 = Mockito.mock(KubernetesClusterVmMapVO.class);
52+
Mockito.when(vm3.isExternalNode()).thenReturn(false);
53+
Mockito.when(vm3.isControlNode()).thenReturn(false);
54+
Mockito.when(vm3.isEtcdNode()).thenReturn(false);
55+
56+
Mockito.doReturn(Arrays.asList(vm1, vm2, vm3)).when(spyWorker).getKubernetesClusterVMMaps();
57+
58+
List<KubernetesClusterVmMapVO> toRemove = spyWorker.getWorkerNodesToRemove();
59+
60+
Assert.assertEquals(1, toRemove.size());
61+
Assert.assertSame(vm3, toRemove.get(0));
8862
}
8963

9064
@Test
91-
public void testCalculateNewClusterCountAndCapacityNodeTypeScaleControlOffering() {
92-
long controlNodes = 2L;
93-
long kubernetesClusterId = 10L;
94-
Mockito.when(kubernetesCluster.getId()).thenReturn(kubernetesClusterId);
95-
Mockito.when(kubernetesCluster.getControlNodeCount()).thenReturn(controlNodes);
96-
97-
ServiceOfferingVO existingOffering = Mockito.mock(ServiceOfferingVO.class);
98-
int existingCores = 2;
99-
int existingMemory = 2048;
100-
Mockito.when(existingOffering.getCpu()).thenReturn(existingCores);
101-
Mockito.when(existingOffering.getRamSize()).thenReturn(existingMemory);
102-
int remainingClusterCpu = 8;
103-
int remainingClusterMemory = 12288;
104-
Mockito.when(kubernetesCluster.getCores()).thenReturn(remainingClusterCpu + (controlNodes * existingCores));
105-
Mockito.when(kubernetesCluster.getMemory()).thenReturn(remainingClusterMemory + (controlNodes * existingMemory));
106-
107-
Mockito.when(serviceOfferingDao.findById(1L)).thenReturn(existingOffering);
108-
109-
ServiceOfferingVO newOffering = Mockito.mock(ServiceOfferingVO.class);
110-
int newCores = 4;
111-
int newMemory = 2048;
112-
Mockito.when(newOffering.getCpu()).thenReturn(newCores);
113-
Mockito.when(newOffering.getRamSize()).thenReturn(newMemory);
114-
115-
KubernetesClusterVmMapVO controlNodeVM1 = Mockito.mock(KubernetesClusterVmMapVO.class);
116-
Mockito.when(controlNodeVM1.getVmId()).thenReturn(10L);
117-
UserVmVO userVmVO = Mockito.mock(UserVmVO.class);
118-
Mockito.when(userVmVO.getServiceOfferingId()).thenReturn(defaultOfferingId);
119-
Mockito.when(userVmDao.findById(10L)).thenReturn(userVmVO);
120-
Mockito.when(kubernetesClusterVmMapDao.listByClusterIdAndVmType(kubernetesClusterId, CONTROL)).thenReturn(List.of(controlNodeVM1));
121-
Pair<Long, Long> newClusterCapacity = worker.calculateNewClusterCountAndCapacity(null, CONTROL, newOffering);
122-
123-
long expectedCores = remainingClusterCpu + (controlNodes * newCores);
124-
long expectedMemory = remainingClusterMemory + (controlNodes * newMemory);
125-
Assert.assertEquals(expectedCores, newClusterCapacity.first().longValue());
126-
Assert.assertEquals(expectedMemory, newClusterCapacity.second().longValue());
65+
public void testGetWorkerNodesToRemoveForDownsize_noRemoval() {
66+
KubernetesCluster kubernetesCluster = Mockito.mock(KubernetesCluster.class);
67+
Mockito.when(kubernetesCluster.getNodeCount()).thenReturn(3L);
68+
69+
KubernetesClusterManagerImpl clusterManager = Mockito.mock(KubernetesClusterManagerImpl.class);
70+
KubernetesClusterScaleWorker worker = new KubernetesClusterScaleWorker(kubernetesCluster, new java.util.HashMap<>(), 3L, null, false, null, null, clusterManager);
71+
KubernetesClusterScaleWorker spyWorker = Mockito.spy(worker);
72+
73+
KubernetesClusterVmMapVO vm1 = Mockito.mock(KubernetesClusterVmMapVO.class);
74+
Mockito.when(vm1.isExternalNode()).thenReturn(false);
75+
Mockito.when(vm1.isControlNode()).thenReturn(false);
76+
Mockito.when(vm1.isEtcdNode()).thenReturn(false);
77+
78+
KubernetesClusterVmMapVO vm2 = Mockito.mock(KubernetesClusterVmMapVO.class);
79+
Mockito.when(vm2.isExternalNode()).thenReturn(false);
80+
Mockito.when(vm2.isControlNode()).thenReturn(false);
81+
Mockito.when(vm2.isEtcdNode()).thenReturn(false);
82+
83+
KubernetesClusterVmMapVO vm3 = Mockito.mock(KubernetesClusterVmMapVO.class);
84+
Mockito.when(vm3.isExternalNode()).thenReturn(false);
85+
Mockito.when(vm3.isControlNode()).thenReturn(false);
86+
Mockito.when(vm3.isEtcdNode()).thenReturn(false);
87+
88+
Mockito.doReturn(Arrays.asList(vm1, vm2, vm3)).when(spyWorker).getKubernetesClusterVMMaps();
89+
90+
List<KubernetesClusterVmMapVO> toRemove = spyWorker.getWorkerNodesToRemove();
91+
92+
Assert.assertTrue(toRemove.isEmpty());
12793
}
12894
}

0 commit comments

Comments
 (0)