From 2374017ab650f6656893c7e450aec1539cb97cb1 Mon Sep 17 00:00:00 2001 From: Brad House Date: Mon, 9 Nov 2026 19:03:42 +0000 Subject: [PATCH] CKS: record a node's Kubernetes version, not the kubectl output After a node is upgraded, the version recorded for it was the whole output of the SSH command that checks it, such as "v1.33.1\n", and whatever the command wrote to stderr. listKubernetesClusters then returned kubernetesnodeversion with a "v" and a trailing newline for upgraded nodes, and without either for nodes created later. Record the version that matched, in the same form as for a new node. Signed-off-by: Brad House --- .../cluster/utils/KubernetesClusterUtil.java | 7 ++--- .../utils/KubernetesClusterUtilTest.java | 26 +++++++++++++++++++ 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/utils/KubernetesClusterUtil.java b/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/utils/KubernetesClusterUtil.java index 00625f6e076d..b360bb696a8d 100644 --- a/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/utils/KubernetesClusterUtil.java +++ b/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/utils/KubernetesClusterUtil.java @@ -348,9 +348,10 @@ public static boolean clusterNodeVersionMatches(final String version, Pair clusterVersionMatchesAndValue = clusterNodeVersionMatches(result, version); if (Boolean.TRUE.equals(clusterVersionMatchesAndValue.first())) { KubernetesClusterVmMapVO vmMapVO = vmMapDao.getClusterMapFromVmId(vmId); - String newNodeVersion = clusterVersionMatchesAndValue.second(); - LOGGER.debug(String.format("Updating node %s Kubernetes version to %s", hostName, newNodeVersion)); - vmMapVO.setNodeVersion(newNodeVersion); + // Record the version in the form a new node gets, not the command output, which ends with a + // newline and may hold more than the version + LOGGER.debug(String.format("Updating node %s Kubernetes version to %s", hostName, version)); + vmMapVO.setNodeVersion(version); vmMapDao.update(vmMapVO.getId(), vmMapVO); return true; } diff --git a/plugins/integrations/kubernetes-service/src/test/java/com/cloud/kubernetes/cluster/utils/KubernetesClusterUtilTest.java b/plugins/integrations/kubernetes-service/src/test/java/com/cloud/kubernetes/cluster/utils/KubernetesClusterUtilTest.java index 329f9b0e42ad..8e2f0f8c1a20 100644 --- a/plugins/integrations/kubernetes-service/src/test/java/com/cloud/kubernetes/cluster/utils/KubernetesClusterUtilTest.java +++ b/plugins/integrations/kubernetes-service/src/test/java/com/cloud/kubernetes/cluster/utils/KubernetesClusterUtilTest.java @@ -16,10 +16,17 @@ // under the License. package com.cloud.kubernetes.cluster.utils; +import java.io.File; + +import com.cloud.kubernetes.cluster.KubernetesClusterVmMapVO; +import com.cloud.kubernetes.cluster.dao.KubernetesClusterVmMapDao; import com.cloud.utils.Pair; +import com.cloud.utils.ssh.SshHelper; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.MockedStatic; +import org.mockito.Mockito; import org.mockito.junit.MockitoJUnitRunner; @RunWith(MockitoJUnitRunner.class) @@ -52,4 +59,23 @@ public void testClusterNodeVersionMatches() { executeThrowAndTestVersionMatch(); } + + @Test + public void testClusterNodeVersionMatchesRecordsVersion() { + KubernetesClusterVmMapDao vmMapDao = Mockito.mock(KubernetesClusterVmMapDao.class); + KubernetesClusterVmMapVO vmMapVO = new KubernetesClusterVmMapVO(1L, 2L, false); + vmMapVO.setNodeVersion("1.24.0"); + Mockito.when(vmMapDao.getClusterMapFromVmId(2L)).thenReturn(vmMapVO); + try (MockedStatic sshHelper = Mockito.mockStatic(SshHelper.class)) { + sshHelper.when(() -> SshHelper.sshExecute(Mockito.anyString(), Mockito.anyInt(), Mockito.anyString(), Mockito.any(), + Mockito.any(), Mockito.anyString(), Mockito.anyInt(), Mockito.anyInt(), Mockito.anyInt())) + .thenReturn(new Pair<>(true, "v1.25.1\n")); + + Assert.assertTrue(KubernetesClusterUtil.clusterNodeVersionMatches("1.25.1", "10.1.1.1", 2222, "cloud", + new File("id_rsa"), "node-1", System.currentTimeMillis() + 60000, 1, 2L, vmMapDao)); + } + // in the same form as for a new node, not the kubectl output + Assert.assertEquals("1.25.1", vmMapVO.getNodeVersion()); + Mockito.verify(vmMapDao).update(vmMapVO.getId(), vmMapVO); + } }