Skip to content

Commit dd07d7d

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

File tree

2 files changed

+80
-12
lines changed

2 files changed

+80
-12
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: 64 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@
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;
21+
import com.cloud.kubernetes.cluster.KubernetesClusterManagerImpl;
2222
import com.cloud.kubernetes.cluster.dao.KubernetesClusterVmMapDao;
2323
import com.cloud.offering.ServiceOffering;
2424
import com.cloud.service.ServiceOfferingVO;
@@ -29,15 +29,17 @@
2929
import org.junit.Assert;
3030
import org.junit.Before;
3131
import org.junit.Test;
32+
3233
import org.junit.runner.RunWith;
3334
import org.mockito.Mock;
3435
import org.mockito.Mockito;
3536
import org.mockito.junit.MockitoJUnitRunner;
3637

38+
import java.util.Arrays;
3739
import java.util.List;
3840

39-
import static com.cloud.kubernetes.cluster.KubernetesServiceHelper.KubernetesClusterNodeType.DEFAULT;
4041
import static com.cloud.kubernetes.cluster.KubernetesServiceHelper.KubernetesClusterNodeType.CONTROL;
42+
import static com.cloud.kubernetes.cluster.KubernetesServiceHelper.KubernetesClusterNodeType.DEFAULT;
4143

4244
@RunWith(MockitoJUnitRunner.class)
4345
public class KubernetesClusterScaleWorkerTest {
@@ -125,4 +127,64 @@ public void testCalculateNewClusterCountAndCapacityNodeTypeScaleControlOffering(
125127
Assert.assertEquals(expectedCores, newClusterCapacity.first().longValue());
126128
Assert.assertEquals(expectedMemory, newClusterCapacity.second().longValue());
127129
}
130+
131+
132+
@Test
133+
public void testGetWorkerNodesToRemoveForDownsize_singleRemoval() {
134+
KubernetesCluster kubernetesCluster = Mockito.mock(KubernetesCluster.class);
135+
KubernetesClusterManagerImpl clusterManager = Mockito.mock(KubernetesClusterManagerImpl.class);
136+
KubernetesClusterScaleWorker worker = new KubernetesClusterScaleWorker(kubernetesCluster, new java.util.HashMap<>(), 2L, null, false, null, null, clusterManager);
137+
KubernetesClusterScaleWorker spyWorker = Mockito.spy(worker);
138+
139+
KubernetesClusterVmMapVO vm1 = Mockito.mock(KubernetesClusterVmMapVO.class);
140+
Mockito.when(vm1.isExternalNode()).thenReturn(false);
141+
Mockito.when(vm1.isControlNode()).thenReturn(false);
142+
Mockito.when(vm1.isEtcdNode()).thenReturn(false);
143+
144+
KubernetesClusterVmMapVO vm2 = Mockito.mock(KubernetesClusterVmMapVO.class);
145+
Mockito.when(vm2.isExternalNode()).thenReturn(false);
146+
Mockito.when(vm2.isControlNode()).thenReturn(false);
147+
Mockito.when(vm2.isEtcdNode()).thenReturn(false);
148+
149+
KubernetesClusterVmMapVO vm3 = Mockito.mock(KubernetesClusterVmMapVO.class);
150+
Mockito.when(vm3.isExternalNode()).thenReturn(false);
151+
Mockito.when(vm3.isControlNode()).thenReturn(false);
152+
Mockito.when(vm3.isEtcdNode()).thenReturn(false);
153+
154+
Mockito.doReturn(Arrays.asList(vm1, vm2, vm3)).when(spyWorker).getKubernetesClusterVMMaps();
155+
156+
List<KubernetesClusterVmMapVO> toRemove = spyWorker.getWorkerNodesToRemove();
157+
158+
Assert.assertEquals(1, toRemove.size());
159+
Assert.assertSame(vm3, toRemove.get(0));
160+
}
161+
162+
@Test
163+
public void testGetWorkerNodesToRemoveForDownsize_noRemoval() {
164+
KubernetesCluster kubernetesCluster = Mockito.mock(KubernetesCluster.class);
165+
166+
KubernetesClusterScaleWorker worker = new KubernetesClusterScaleWorker(kubernetesCluster, new java.util.HashMap<>(), 3L, null, false, null, null, clusterManager);
167+
KubernetesClusterScaleWorker spyWorker = Mockito.spy(worker);
168+
169+
KubernetesClusterVmMapVO vm1 = Mockito.mock(KubernetesClusterVmMapVO.class);
170+
Mockito.when(vm1.isExternalNode()).thenReturn(false);
171+
Mockito.when(vm1.isControlNode()).thenReturn(false);
172+
Mockito.when(vm1.isEtcdNode()).thenReturn(false);
173+
174+
KubernetesClusterVmMapVO vm2 = Mockito.mock(KubernetesClusterVmMapVO.class);
175+
Mockito.when(vm2.isExternalNode()).thenReturn(false);
176+
Mockito.when(vm2.isControlNode()).thenReturn(false);
177+
Mockito.when(vm2.isEtcdNode()).thenReturn(false);
178+
179+
KubernetesClusterVmMapVO vm3 = Mockito.mock(KubernetesClusterVmMapVO.class);
180+
Mockito.when(vm3.isExternalNode()).thenReturn(false);
181+
Mockito.when(vm3.isControlNode()).thenReturn(false);
182+
Mockito.when(vm3.isEtcdNode()).thenReturn(false);
183+
184+
Mockito.doReturn(Arrays.asList(vm1, vm2, vm3)).when(spyWorker).getKubernetesClusterVMMaps();
185+
186+
List<KubernetesClusterVmMapVO> toRemove = spyWorker.getWorkerNodesToRemove();
187+
188+
Assert.assertTrue(toRemove.isEmpty());
189+
}
128190
}

0 commit comments

Comments
 (0)