From 31a4a014db386cf3957a4a440791ac48a1e88cf1 Mon Sep 17 00:00:00 2001 From: vishesh92 Date: Tue, 31 Mar 2026 15:18:32 +0530 Subject: [PATCH] Add some more unit tests --- .../cloudstack/ca/CAManagerImplTest.java | 114 +++++++++++++++++- 1 file changed, 113 insertions(+), 1 deletion(-) diff --git a/server/src/test/java/org/apache/cloudstack/ca/CAManagerImplTest.java b/server/src/test/java/org/apache/cloudstack/ca/CAManagerImplTest.java index 8e5a7950b43..34b5d05d416 100644 --- a/server/src/test/java/org/apache/cloudstack/ca/CAManagerImplTest.java +++ b/server/src/test/java/org/apache/cloudstack/ca/CAManagerImplTest.java @@ -41,11 +41,27 @@ import org.mockito.Spy; import org.mockito.junit.MockitoJUnitRunner; import java.lang.reflect.Field; +import java.lang.reflect.Method; import java.math.BigInteger; import java.security.KeyPair; import java.security.cert.X509Certificate; import java.util.Collections; import java.util.List; +import java.util.Map; +import java.util.HashMap; + + +import org.mockito.MockedStatic; +import org.mockito.MockedConstruction; +import com.cloud.utils.ssh.SSHCmdHelper; +import com.cloud.host.HostVO; +import com.cloud.vm.VMInstanceVO; +import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService; +import org.apache.cloudstack.framework.config.dao.ConfigurationDao; +import com.cloud.vm.dao.VMInstanceDao; +import com.trilead.ssh2.Connection; +import com.cloud.agent.api.routing.NetworkElementCommand; +import org.apache.cloudstack.api.ApiConstants; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; @@ -65,7 +81,12 @@ public class CAManagerImplTest { private AgentManager agentManager; @Mock private CAProvider caProvider; - + @Mock + private VMInstanceDao vmInstanceDao; + @Mock + private NetworkOrchestrationService networkOrchestrationService; + @Mock + private ConfigurationDao configDao; @InjectMocks @Spy private CAManagerImpl caManager = new CAManagerImpl(); @@ -216,4 +237,95 @@ public class CAManagerImplTest { Assert.assertFalse(caManager.getActiveCertificatesMap().containsKey("10.0.0.1")); Assert.assertFalse(caManager.getActiveCertificatesMap().containsKey("192.168.0.1")); } + @Test + public void testProvisionCertificateViaSsh() throws Exception { + Connection sshConnection = Mockito.mock(Connection.class); + final String agentIp = "192.168.1.1"; + final String agentHostname = "host1"; + final String caProviderStr = "root"; + + try (MockedStatic sshCmdHelperMock = Mockito.mockStatic(SSHCmdHelper.class)) { + SSHCmdHelper.SSHCmdResult successResult = new SSHCmdHelper.SSHCmdResult(0, "someCsr", ""); + sshCmdHelperMock.when(() -> SSHCmdHelper.sshExecuteCmdWithResult(Mockito.eq(sshConnection), Mockito.anyString())) + .thenReturn(successResult); + + final KeyPair keyPair = CertUtils.generateRandomKeyPair(1024); + final X509Certificate x509 = CertUtils.generateV3Certificate(null, keyPair, keyPair.getPublic(), "CN=ca", "SHA256withRSA", 365, null, null); + Mockito.doReturn(new Certificate(x509, null, Collections.singletonList(x509))) + .when(caManager).issueCertificate(Mockito.anyString(), Mockito.anyList(), Mockito.anyList(), Mockito.nullable(Integer.class), Mockito.anyString()); + + caManager.provisionCertificateViaSsh(sshConnection, agentIp, agentHostname, caProviderStr); + + sshCmdHelperMock.verify(() -> SSHCmdHelper.sshExecuteCmdWithResult(Mockito.eq(sshConnection), Mockito.contains("keystore-setup")), Mockito.times(1)); + sshCmdHelperMock.verify(() -> SSHCmdHelper.sshExecuteCmdWithResult(Mockito.eq(sshConnection), Mockito.contains("keystore-cert-import")), Mockito.times(1)); + } + } + + @Test + public void testProvisionKvmHostViaSsh() throws Exception { + HostVO host = Mockito.mock(HostVO.class); + Mockito.when(host.getPrivateIpAddress()).thenReturn("192.168.1.1"); + Mockito.when(host.getName()).thenReturn("host1"); + Mockito.when(host.getClusterId()).thenReturn(1L); + + Mockito.doNothing().when(hostDao).loadDetails(host); + Mockito.when(host.getDetail(ApiConstants.USERNAME)).thenReturn("root"); + Mockito.when(host.getDetail(ApiConstants.PASSWORD)).thenReturn("password"); + + Mockito.when(configDao.getValue("ssh.privatekey")).thenReturn("privatekey"); + + try (MockedConstruction ignored = Mockito.mockConstruction(Connection.class, + (mock, context) -> { + // Do nothing on connect + }); + MockedStatic sshCmdHelperMock = Mockito.mockStatic(SSHCmdHelper.class)) { + sshCmdHelperMock.when(() -> SSHCmdHelper.acquireAuthorizedConnectionWithPublicKey(Mockito.any(Connection.class), Mockito.anyString(), Mockito.anyString())) + .thenReturn(true); + + Mockito.doNothing().when(caManager).provisionCertificateViaSsh(Mockito.any(Connection.class), Mockito.anyString(), Mockito.anyString(), Mockito.anyString()); + + Method method = CAManagerImpl.class.getDeclaredMethod("provisionKvmHostViaSsh", Host.class, String.class); + method.setAccessible(true); + boolean result = (Boolean) method.invoke(caManager, host, "root"); + + Assert.assertTrue(result); + Mockito.verify(caManager, Mockito.times(1)).provisionCertificateViaSsh(Mockito.any(Connection.class), Mockito.eq("192.168.1.1"), Mockito.eq("host1"), Mockito.eq("root")); + sshCmdHelperMock.verify(() -> SSHCmdHelper.sshExecuteCmd(Mockito.any(Connection.class), Mockito.eq("sudo service cloudstack-agent restart")), Mockito.times(1)); + } + } + + @Test + public void testProvisionSystemVmViaSsh() throws Exception { + Host host = Mockito.mock(Host.class); + Mockito.when(host.getName()).thenReturn("v-1-VM"); + + VMInstanceVO vm = Mockito.mock(VMInstanceVO.class); + Mockito.when(vm.getHostId()).thenReturn(1L); + Mockito.when(vm.getHostName()).thenReturn("host1"); + Mockito.when(vm.getInstanceName()).thenReturn("v-1-VM"); + Mockito.when(vmInstanceDao.findVMByInstanceName("v-1-VM")).thenReturn(vm); + + Map accessDetails = new HashMap<>(); + accessDetails.put(NetworkElementCommand.ROUTER_IP, "192.168.1.2"); + Mockito.when(networkOrchestrationService.getSystemVMAccessDetails(vm)).thenReturn(accessDetails); + + HostVO hypervisorHost = Mockito.mock(HostVO.class); + Mockito.when(hostDao.findById(1L)).thenReturn(hypervisorHost); + + final KeyPair keyPair = CertUtils.generateRandomKeyPair(1024); + final X509Certificate x509 = CertUtils.generateV3Certificate(null, keyPair, keyPair.getPublic(), "CN=ca", "SHA256withRSA", 365, null, null); + Certificate cert = new Certificate(x509, null, Collections.singletonList(x509)); + Mockito.doReturn(cert) + .when(caManager).issueCertificate(Mockito.nullable(String.class), Mockito.anyList(), Mockito.anyList(), Mockito.nullable(Integer.class), Mockito.anyString()); + + Mockito.doReturn(true) + .when(caManager).deployCertificate(Mockito.eq(hypervisorHost), Mockito.eq(cert), Mockito.anyBoolean(), Mockito.eq(accessDetails)); + + Method method = CAManagerImpl.class.getDeclaredMethod("provisionSystemVmViaSsh", Host.class, Boolean.class, String.class); + method.setAccessible(true); + boolean result = (Boolean) method.invoke(caManager, host, true, "root"); + + Assert.assertTrue(result); + Mockito.verify(caManager, Mockito.times(1)).deployCertificate(Mockito.eq(hypervisorHost), Mockito.eq(cert), Mockito.eq(true), Mockito.eq(accessDetails)); + } }