Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -441,16 +441,30 @@ private void scaleDownKubernetesClusterSize() throws CloudRuntimeException {
if (this.nodeIds != null) {
vmList = getKubernetesClusterVMMapsForNodes(this.nodeIds).stream().filter(vm -> !vm.isExternalNode()).collect(Collectors.toList());
} else {
vmList = getKubernetesClusterVMMaps();
vmList = vmList.stream()
.filter(vm -> !vm.isExternalNode() && !vm.isControlNode() && !vm.isEtcdNode())
.collect(Collectors.toList());
vmList = vmList.subList((int) (kubernetesCluster.getControlNodeCount() + clusterSize - 1), vmList.size());
vmList = getWorkerNodesToRemove();
if (vmList.isEmpty()) {
logger.info("No nodes to remove from Kubernetes cluster: {}", kubernetesCluster);
return;
}
}
Collections.reverse(vmList);
removeNodesFromCluster(vmList);
}

public List<KubernetesClusterVmMapVO> getWorkerNodesToRemove() {
List<KubernetesClusterVmMapVO> workerVMsMap = getKubernetesClusterVMMaps().stream()
.filter(vm -> !vm.isExternalNode() && !vm.isControlNode() && !vm.isEtcdNode())
.collect(Collectors.toList());
int totalWorkerNodes = workerVMsMap.size();
int desiredWorkerNodes = clusterSize == null ? (int) kubernetesCluster.getNodeCount() : clusterSize.intValue();
int toRemoveCount = Math.max(0, totalWorkerNodes - desiredWorkerNodes);
if (toRemoveCount == 0) {
return new ArrayList<>();
}
int startIndex = Math.max(0, totalWorkerNodes - toRemoveCount);
return new ArrayList<>(workerVMsMap.subList(startIndex, totalWorkerNodes));
}

private void scaleUpKubernetesClusterSize(final long newVmCount) throws CloudRuntimeException {
if (!kubernetesCluster.getState().equals(KubernetesCluster.State.Scaling)) {
stateTransitTo(kubernetesCluster.getId(), KubernetesCluster.Event.ScaleUpRequested);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,8 @@
package com.cloud.kubernetes.cluster.actionworkers;

import com.cloud.kubernetes.cluster.KubernetesCluster;
import com.cloud.kubernetes.cluster.KubernetesClusterManagerImpl;
import com.cloud.kubernetes.cluster.KubernetesClusterVmMapVO;
import com.cloud.kubernetes.cluster.KubernetesClusterManagerImpl;
import com.cloud.kubernetes.cluster.dao.KubernetesClusterVmMapDao;
import com.cloud.offering.ServiceOffering;
import com.cloud.service.ServiceOfferingVO;
Expand All @@ -29,15 +29,17 @@
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;

import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.junit.MockitoJUnitRunner;

import java.util.Arrays;
import java.util.List;

import static com.cloud.kubernetes.cluster.KubernetesServiceHelper.KubernetesClusterNodeType.DEFAULT;
import static com.cloud.kubernetes.cluster.KubernetesServiceHelper.KubernetesClusterNodeType.CONTROL;
import static com.cloud.kubernetes.cluster.KubernetesServiceHelper.KubernetesClusterNodeType.DEFAULT;

@RunWith(MockitoJUnitRunner.class)
public class KubernetesClusterScaleWorkerTest {
Expand Down Expand Up @@ -125,4 +127,64 @@ public void testCalculateNewClusterCountAndCapacityNodeTypeScaleControlOffering(
Assert.assertEquals(expectedCores, newClusterCapacity.first().longValue());
Assert.assertEquals(expectedMemory, newClusterCapacity.second().longValue());
}


@Test
public void testGetWorkerNodesToRemoveForDownsize_singleRemoval() {
KubernetesCluster kubernetesCluster = Mockito.mock(KubernetesCluster.class);
KubernetesClusterManagerImpl clusterManager = Mockito.mock(KubernetesClusterManagerImpl.class);
KubernetesClusterScaleWorker worker = new KubernetesClusterScaleWorker(kubernetesCluster, new java.util.HashMap<>(), 2L, null, false, null, null, clusterManager);
KubernetesClusterScaleWorker spyWorker = Mockito.spy(worker);

KubernetesClusterVmMapVO vm1 = Mockito.mock(KubernetesClusterVmMapVO.class);
Mockito.when(vm1.isExternalNode()).thenReturn(false);
Mockito.when(vm1.isControlNode()).thenReturn(false);
Mockito.when(vm1.isEtcdNode()).thenReturn(false);

KubernetesClusterVmMapVO vm2 = Mockito.mock(KubernetesClusterVmMapVO.class);
Mockito.when(vm2.isExternalNode()).thenReturn(false);
Mockito.when(vm2.isControlNode()).thenReturn(false);
Mockito.when(vm2.isEtcdNode()).thenReturn(false);

KubernetesClusterVmMapVO vm3 = Mockito.mock(KubernetesClusterVmMapVO.class);
Mockito.when(vm3.isExternalNode()).thenReturn(false);
Mockito.when(vm3.isControlNode()).thenReturn(false);
Mockito.when(vm3.isEtcdNode()).thenReturn(false);

Mockito.doReturn(Arrays.asList(vm1, vm2, vm3)).when(spyWorker).getKubernetesClusterVMMaps();

List<KubernetesClusterVmMapVO> toRemove = spyWorker.getWorkerNodesToRemove();

Assert.assertEquals(1, toRemove.size());
Assert.assertSame(vm3, toRemove.get(0));
}

@Test
public void testGetWorkerNodesToRemoveForDownsize_noRemoval() {
KubernetesCluster kubernetesCluster = Mockito.mock(KubernetesCluster.class);

KubernetesClusterScaleWorker worker = new KubernetesClusterScaleWorker(kubernetesCluster, new java.util.HashMap<>(), 3L, null, false, null, null, clusterManager);
KubernetesClusterScaleWorker spyWorker = Mockito.spy(worker);

KubernetesClusterVmMapVO vm1 = Mockito.mock(KubernetesClusterVmMapVO.class);
Mockito.when(vm1.isExternalNode()).thenReturn(false);
Mockito.when(vm1.isControlNode()).thenReturn(false);
Mockito.when(vm1.isEtcdNode()).thenReturn(false);

KubernetesClusterVmMapVO vm2 = Mockito.mock(KubernetesClusterVmMapVO.class);
Mockito.when(vm2.isExternalNode()).thenReturn(false);
Mockito.when(vm2.isControlNode()).thenReturn(false);
Mockito.when(vm2.isEtcdNode()).thenReturn(false);

KubernetesClusterVmMapVO vm3 = Mockito.mock(KubernetesClusterVmMapVO.class);
Mockito.when(vm3.isExternalNode()).thenReturn(false);
Mockito.when(vm3.isControlNode()).thenReturn(false);
Mockito.when(vm3.isEtcdNode()).thenReturn(false);

Mockito.doReturn(Arrays.asList(vm1, vm2, vm3)).when(spyWorker).getKubernetesClusterVMMaps();

List<KubernetesClusterVmMapVO> toRemove = spyWorker.getWorkerNodesToRemove();

Assert.assertTrue(toRemove.isEmpty());
}
}
Loading