Copilot commented on code in PR #11601:
URL: https://github.com/apache/cloudstack/pull/11601#discussion_r2336264800


##########
server/src/test/java/org/apache/cloudstack/consoleproxy/ConsoleAccessManagerImplTest.java:
##########
@@ -311,4 +330,411 @@ public void listConsoleSessionByIdTestShouldCallDbLayer() 
{
         consoleAccessManager.listConsoleSessionById(1L);
         Mockito.verify(consoleSessionDaoMock).findByIdIncludingRemoved(1L);
     }
+
+    @Test
+    public void returnsNullWhenAnswerIsNull() {
+        VirtualMachine vm = Mockito.mock(VirtualMachine.class);
+        HostVO host = Mockito.mock(HostVO.class);
+        ConsoleConnectionDetails details = new ConsoleConnectionDetails("sid", 
"en", "tag", "displayName");
+
+        Mockito.when(managementServer.getExternalVmConsole(vm, 
host)).thenReturn(null);
+
+        ConsoleConnectionDetails result = 
consoleAccessManager.getConsoleConnectionDetailsFoxExternalVm(details, vm, 
host);

Review Comment:
   The method name contains a typo: 'Fox' should be 'For'. The method should be 
named 'getConsoleConnectionDetailsForExternalVm'.



##########
server/src/test/java/org/apache/cloudstack/consoleproxy/ConsoleAccessManagerImplTest.java:
##########
@@ -311,4 +330,411 @@ public void listConsoleSessionByIdTestShouldCallDbLayer() 
{
         consoleAccessManager.listConsoleSessionById(1L);
         Mockito.verify(consoleSessionDaoMock).findByIdIncludingRemoved(1L);
     }
+
+    @Test
+    public void returnsNullWhenAnswerIsNull() {
+        VirtualMachine vm = Mockito.mock(VirtualMachine.class);
+        HostVO host = Mockito.mock(HostVO.class);
+        ConsoleConnectionDetails details = new ConsoleConnectionDetails("sid", 
"en", "tag", "displayName");
+
+        Mockito.when(managementServer.getExternalVmConsole(vm, 
host)).thenReturn(null);
+
+        ConsoleConnectionDetails result = 
consoleAccessManager.getConsoleConnectionDetailsFoxExternalVm(details, vm, 
host);
+
+        Assert.assertNull(result);
+    }
+
+    @Test
+    public void returnsNullWhenAnswerResultIsFalse() {
+        VirtualMachine vm = Mockito.mock(VirtualMachine.class);
+        HostVO host = Mockito.mock(HostVO.class);
+        ConsoleConnectionDetails details = new ConsoleConnectionDetails("sid", 
"en", "tag", "displayName");
+        Answer answer = Mockito.mock(Answer.class);
+
+        Mockito.when(answer.getResult()).thenReturn(false);
+        Mockito.when(answer.getDetails()).thenReturn("Error details");
+        Mockito.when(managementServer.getExternalVmConsole(vm, 
host)).thenReturn(answer);
+
+        ConsoleConnectionDetails result = 
consoleAccessManager.getConsoleConnectionDetailsFoxExternalVm(details, vm, 
host);

Review Comment:
   The method name contains a typo: 'Fox' should be 'For'. The method should be 
named 'getConsoleConnectionDetailsForExternalVm'.



##########
server/src/test/java/org/apache/cloudstack/consoleproxy/ConsoleAccessManagerImplTest.java:
##########
@@ -311,4 +330,411 @@ public void listConsoleSessionByIdTestShouldCallDbLayer() 
{
         consoleAccessManager.listConsoleSessionById(1L);
         Mockito.verify(consoleSessionDaoMock).findByIdIncludingRemoved(1L);
     }
+
+    @Test
+    public void returnsNullWhenAnswerIsNull() {
+        VirtualMachine vm = Mockito.mock(VirtualMachine.class);
+        HostVO host = Mockito.mock(HostVO.class);
+        ConsoleConnectionDetails details = new ConsoleConnectionDetails("sid", 
"en", "tag", "displayName");
+
+        Mockito.when(managementServer.getExternalVmConsole(vm, 
host)).thenReturn(null);
+
+        ConsoleConnectionDetails result = 
consoleAccessManager.getConsoleConnectionDetailsFoxExternalVm(details, vm, 
host);
+
+        Assert.assertNull(result);
+    }
+
+    @Test
+    public void returnsNullWhenAnswerResultIsFalse() {
+        VirtualMachine vm = Mockito.mock(VirtualMachine.class);
+        HostVO host = Mockito.mock(HostVO.class);
+        ConsoleConnectionDetails details = new ConsoleConnectionDetails("sid", 
"en", "tag", "displayName");
+        Answer answer = Mockito.mock(Answer.class);
+
+        Mockito.when(answer.getResult()).thenReturn(false);
+        Mockito.when(answer.getDetails()).thenReturn("Error details");
+        Mockito.when(managementServer.getExternalVmConsole(vm, 
host)).thenReturn(answer);
+
+        ConsoleConnectionDetails result = 
consoleAccessManager.getConsoleConnectionDetailsFoxExternalVm(details, vm, 
host);
+
+        Assert.assertNull(result);
+    }
+
+    @Test
+    public void returnsNullWhenAnswerIsNotOfTypeGetExternalConsoleAnswer() {
+        VirtualMachine vm = Mockito.mock(VirtualMachine.class);
+        HostVO host = Mockito.mock(HostVO.class);
+        ConsoleConnectionDetails details = new ConsoleConnectionDetails("sid", 
"en", "tag", "displayName");
+        Answer answer = Mockito.mock(Answer.class);
+
+        Mockito.when(answer.getResult()).thenReturn(true);
+        Mockito.when(managementServer.getExternalVmConsole(vm, 
host)).thenReturn(answer);
+
+        ConsoleConnectionDetails result = 
consoleAccessManager.getConsoleConnectionDetailsFoxExternalVm(details, vm, 
host);
+
+        Assert.assertNull(result);
+    }
+
+    @Test
+    public void setsDetailsWhenAnswerIsValid() {
+        VirtualMachine vm = Mockito.mock(VirtualMachine.class);
+        HostVO host = Mockito.mock(HostVO.class);
+        ConsoleConnectionDetails details = new ConsoleConnectionDetails("sid", 
"en", "tag", "displayName");
+        GetExternalConsoleAnswer answer = 
Mockito.mock(GetExternalConsoleAnswer.class);
+
+        String expectedHost = "10.0.0.1";
+        int expectedPort = 5900;
+        String expectedPassword = "password";
+
+        Mockito.when(answer.getResult()).thenReturn(true);
+        Mockito.when(answer.getHost()).thenReturn(expectedHost);
+        Mockito.when(answer.getPort()).thenReturn(expectedPort);
+        Mockito.when(answer.getPassword()).thenReturn(expectedPassword);
+        Mockito.when(managementServer.getExternalVmConsole(vm, 
host)).thenReturn(answer);
+
+        ConsoleConnectionDetails result = 
consoleAccessManager.getConsoleConnectionDetailsFoxExternalVm(details, vm, 
host);
+
+        Assert.assertNotNull(result);
+        Assert.assertEquals(expectedHost, result.getHost());
+        Assert.assertEquals(expectedPort, result.getPort());
+        Assert.assertEquals(expectedPassword, result.getSid());
+    }
+
+    @Test
+    public void doesNotSetSidWhenPasswordIsBlank() {
+        VirtualMachine vm = Mockito.mock(VirtualMachine.class);
+        HostVO host = Mockito.mock(HostVO.class);
+        ConsoleConnectionDetails details = new ConsoleConnectionDetails("sid", 
"en", "tag", "displayName");
+        GetExternalConsoleAnswer answer = 
Mockito.mock(GetExternalConsoleAnswer.class);
+
+        Mockito.when(answer.getResult()).thenReturn(true);
+        Mockito.when(answer.getHost()).thenReturn("10.0.0.1");
+        Mockito.when(answer.getPort()).thenReturn(5900);
+        Mockito.when(answer.getPassword()).thenReturn("");
+        Mockito.when(managementServer.getExternalVmConsole(vm, 
host)).thenReturn(answer);
+
+        ConsoleConnectionDetails result = 
consoleAccessManager.getConsoleConnectionDetailsFoxExternalVm(details, vm, 
host);

Review Comment:
   The method name contains a typo: 'Fox' should be 'For'. The method should be 
named 'getConsoleConnectionDetailsForExternalVm'.



##########
server/src/main/java/org/apache/cloudstack/consoleproxy/ConsoleAccessManagerImpl.java:
##########
@@ -427,67 +425,109 @@ private ConsoleEndpoint generateAccessEndpoint(Long 
vmId, String sessionUuid, St
         return consoleEndpoint;
     }
 
-    private ConsoleEndpoint composeConsoleAccessEndpoint(String rootUrl, 
VirtualMachine vm, HostVO hostVo, String addr,
-                                                         String sessionUuid, 
String extraSecurityToken) {
-        String host = hostVo.getPrivateIpAddress();
-
-        Pair<String, Integer> portInfo = null;
-        if (hostVo.getHypervisorType() == Hypervisor.HypervisorType.KVM &&
-                
(hostVo.getResourceState().equals(ResourceState.ErrorInMaintenance) ||
-                        
hostVo.getResourceState().equals(ResourceState.ErrorInPrepareForMaintenance))) {
-            VMInstanceDetailVO detailAddress = 
vmInstanceDetailsDao.findDetail(vm.getId(), VmDetailConstants.KVM_VNC_ADDRESS);
-            VMInstanceDetailVO detailPort = 
vmInstanceDetailsDao.findDetail(vm.getId(), VmDetailConstants.KVM_VNC_PORT);
-            if (detailAddress != null && detailPort != null) {
-                portInfo = new Pair<>(detailAddress.getValue(), 
Integer.valueOf(detailPort.getValue()));
-            } else {
-                logger.warn("KVM Host in 
ErrorInMaintenance/ErrorInPrepareForMaintenance but " +
-                        "no VNC Address/Port was available. Falling back to 
default one from MS.");
-            }
+    protected ConsoleConnectionDetails 
getConsoleConnectionDetailsFoxExternalVm(ConsoleConnectionDetails details,

Review Comment:
   The method name contains a typo: 'Fox' should be 'For'. The method should be 
named 'getConsoleConnectionDetailsForExternalVm'.
   ```suggestion
       protected ConsoleConnectionDetails 
getConsoleConnectionDetailsForExternalVm(ConsoleConnectionDetails details,
   ```



##########
server/src/test/java/org/apache/cloudstack/consoleproxy/ConsoleAccessManagerImplTest.java:
##########
@@ -311,4 +330,411 @@ public void listConsoleSessionByIdTestShouldCallDbLayer() 
{
         consoleAccessManager.listConsoleSessionById(1L);
         Mockito.verify(consoleSessionDaoMock).findByIdIncludingRemoved(1L);
     }
+
+    @Test
+    public void returnsNullWhenAnswerIsNull() {
+        VirtualMachine vm = Mockito.mock(VirtualMachine.class);
+        HostVO host = Mockito.mock(HostVO.class);
+        ConsoleConnectionDetails details = new ConsoleConnectionDetails("sid", 
"en", "tag", "displayName");
+
+        Mockito.when(managementServer.getExternalVmConsole(vm, 
host)).thenReturn(null);
+
+        ConsoleConnectionDetails result = 
consoleAccessManager.getConsoleConnectionDetailsFoxExternalVm(details, vm, 
host);
+
+        Assert.assertNull(result);
+    }
+
+    @Test
+    public void returnsNullWhenAnswerResultIsFalse() {
+        VirtualMachine vm = Mockito.mock(VirtualMachine.class);
+        HostVO host = Mockito.mock(HostVO.class);
+        ConsoleConnectionDetails details = new ConsoleConnectionDetails("sid", 
"en", "tag", "displayName");
+        Answer answer = Mockito.mock(Answer.class);
+
+        Mockito.when(answer.getResult()).thenReturn(false);
+        Mockito.when(answer.getDetails()).thenReturn("Error details");
+        Mockito.when(managementServer.getExternalVmConsole(vm, 
host)).thenReturn(answer);
+
+        ConsoleConnectionDetails result = 
consoleAccessManager.getConsoleConnectionDetailsFoxExternalVm(details, vm, 
host);
+
+        Assert.assertNull(result);
+    }
+
+    @Test
+    public void returnsNullWhenAnswerIsNotOfTypeGetExternalConsoleAnswer() {
+        VirtualMachine vm = Mockito.mock(VirtualMachine.class);
+        HostVO host = Mockito.mock(HostVO.class);
+        ConsoleConnectionDetails details = new ConsoleConnectionDetails("sid", 
"en", "tag", "displayName");
+        Answer answer = Mockito.mock(Answer.class);
+
+        Mockito.when(answer.getResult()).thenReturn(true);
+        Mockito.when(managementServer.getExternalVmConsole(vm, 
host)).thenReturn(answer);
+
+        ConsoleConnectionDetails result = 
consoleAccessManager.getConsoleConnectionDetailsFoxExternalVm(details, vm, 
host);
+
+        Assert.assertNull(result);
+    }
+
+    @Test
+    public void setsDetailsWhenAnswerIsValid() {
+        VirtualMachine vm = Mockito.mock(VirtualMachine.class);
+        HostVO host = Mockito.mock(HostVO.class);
+        ConsoleConnectionDetails details = new ConsoleConnectionDetails("sid", 
"en", "tag", "displayName");
+        GetExternalConsoleAnswer answer = 
Mockito.mock(GetExternalConsoleAnswer.class);
+
+        String expectedHost = "10.0.0.1";
+        int expectedPort = 5900;
+        String expectedPassword = "password";
+
+        Mockito.when(answer.getResult()).thenReturn(true);
+        Mockito.when(answer.getHost()).thenReturn(expectedHost);
+        Mockito.when(answer.getPort()).thenReturn(expectedPort);
+        Mockito.when(answer.getPassword()).thenReturn(expectedPassword);
+        Mockito.when(managementServer.getExternalVmConsole(vm, 
host)).thenReturn(answer);
+
+        ConsoleConnectionDetails result = 
consoleAccessManager.getConsoleConnectionDetailsFoxExternalVm(details, vm, 
host);

Review Comment:
   The method name contains a typo: 'Fox' should be 'For'. The method should be 
named 'getConsoleConnectionDetailsForExternalVm'.



##########
server/src/test/java/org/apache/cloudstack/consoleproxy/ConsoleAccessManagerImplTest.java:
##########
@@ -311,4 +330,411 @@ public void listConsoleSessionByIdTestShouldCallDbLayer() 
{
         consoleAccessManager.listConsoleSessionById(1L);
         Mockito.verify(consoleSessionDaoMock).findByIdIncludingRemoved(1L);
     }
+
+    @Test
+    public void returnsNullWhenAnswerIsNull() {
+        VirtualMachine vm = Mockito.mock(VirtualMachine.class);
+        HostVO host = Mockito.mock(HostVO.class);
+        ConsoleConnectionDetails details = new ConsoleConnectionDetails("sid", 
"en", "tag", "displayName");
+
+        Mockito.when(managementServer.getExternalVmConsole(vm, 
host)).thenReturn(null);
+
+        ConsoleConnectionDetails result = 
consoleAccessManager.getConsoleConnectionDetailsFoxExternalVm(details, vm, 
host);
+
+        Assert.assertNull(result);
+    }
+
+    @Test
+    public void returnsNullWhenAnswerResultIsFalse() {
+        VirtualMachine vm = Mockito.mock(VirtualMachine.class);
+        HostVO host = Mockito.mock(HostVO.class);
+        ConsoleConnectionDetails details = new ConsoleConnectionDetails("sid", 
"en", "tag", "displayName");
+        Answer answer = Mockito.mock(Answer.class);
+
+        Mockito.when(answer.getResult()).thenReturn(false);
+        Mockito.when(answer.getDetails()).thenReturn("Error details");
+        Mockito.when(managementServer.getExternalVmConsole(vm, 
host)).thenReturn(answer);
+
+        ConsoleConnectionDetails result = 
consoleAccessManager.getConsoleConnectionDetailsFoxExternalVm(details, vm, 
host);
+
+        Assert.assertNull(result);
+    }
+
+    @Test
+    public void returnsNullWhenAnswerIsNotOfTypeGetExternalConsoleAnswer() {
+        VirtualMachine vm = Mockito.mock(VirtualMachine.class);
+        HostVO host = Mockito.mock(HostVO.class);
+        ConsoleConnectionDetails details = new ConsoleConnectionDetails("sid", 
"en", "tag", "displayName");
+        Answer answer = Mockito.mock(Answer.class);
+
+        Mockito.when(answer.getResult()).thenReturn(true);
+        Mockito.when(managementServer.getExternalVmConsole(vm, 
host)).thenReturn(answer);
+
+        ConsoleConnectionDetails result = 
consoleAccessManager.getConsoleConnectionDetailsFoxExternalVm(details, vm, 
host);

Review Comment:
   The method name contains a typo: 'Fox' should be 'For'. The method should be 
named 'getConsoleConnectionDetailsForExternalVm'.



##########
server/src/main/java/org/apache/cloudstack/consoleproxy/ConsoleAccessManagerImpl.java:
##########
@@ -427,67 +425,109 @@ private ConsoleEndpoint generateAccessEndpoint(Long 
vmId, String sessionUuid, St
         return consoleEndpoint;
     }
 
-    private ConsoleEndpoint composeConsoleAccessEndpoint(String rootUrl, 
VirtualMachine vm, HostVO hostVo, String addr,
-                                                         String sessionUuid, 
String extraSecurityToken) {
-        String host = hostVo.getPrivateIpAddress();
-
-        Pair<String, Integer> portInfo = null;
-        if (hostVo.getHypervisorType() == Hypervisor.HypervisorType.KVM &&
-                
(hostVo.getResourceState().equals(ResourceState.ErrorInMaintenance) ||
-                        
hostVo.getResourceState().equals(ResourceState.ErrorInPrepareForMaintenance))) {
-            VMInstanceDetailVO detailAddress = 
vmInstanceDetailsDao.findDetail(vm.getId(), VmDetailConstants.KVM_VNC_ADDRESS);
-            VMInstanceDetailVO detailPort = 
vmInstanceDetailsDao.findDetail(vm.getId(), VmDetailConstants.KVM_VNC_PORT);
-            if (detailAddress != null && detailPort != null) {
-                portInfo = new Pair<>(detailAddress.getValue(), 
Integer.valueOf(detailPort.getValue()));
-            } else {
-                logger.warn("KVM Host in 
ErrorInMaintenance/ErrorInPrepareForMaintenance but " +
-                        "no VNC Address/Port was available. Falling back to 
default one from MS.");
-            }
+    protected ConsoleConnectionDetails 
getConsoleConnectionDetailsFoxExternalVm(ConsoleConnectionDetails details,
+                                VirtualMachine vm, HostVO host) {
+        Answer answer = managementServer.getExternalVmConsole(vm, host);
+        if (answer == null) {
+            logger.error("Unable to get console access details for external {} 
on {}: answer is null.", vm, host);
+            return null;
         }
-
-        if (portInfo == null) {
-            portInfo = managementServer.getVncPort(vm);
+        if (!answer.getResult()) {
+            logger.error("Unable to get console access details for external {} 
on {}: answer result is false. Reason: {}", vm, host, answer.getDetails());
+            return null;
         }
-
-        if (logger.isDebugEnabled())
-            logger.debug("Port info " + portInfo.first());
-
-        Ternary<String, String, String> parsedHostInfo = 
parseHostInfo(portInfo.first());
-
-        int port = -1;
-        if (portInfo.second() == -9) {
-            //for hyperv
-            port = 
Integer.parseInt(managementServer.findDetail(hostVo.getId(), 
"rdp.server.port").getValue());
-        } else {
-            port = portInfo.second();
+        if (!(answer instanceof GetExternalConsoleAnswer)) {
+            logger.error("Unable to get console access details for external {} 
on {}: answer is not of type GetExternalConsoleAnswer.", vm, host);
+            return null;
         }
+        GetExternalConsoleAnswer getExternalConsoleAnswer = 
(GetExternalConsoleAnswer) answer;
+        details.setHost(getExternalConsoleAnswer.getHost());
+        details.setPort(getExternalConsoleAnswer.getPort());
+        if (StringUtils.isNotBlank(getExternalConsoleAnswer.getPassword())) {
+            details.setSid(getExternalConsoleAnswer.getPassword());
+        }
+        return details;
+    }
 
-        String sid = vm.getVncPassword();
-        VMInstanceDetailVO details = 
vmInstanceDetailsDao.findDetail(vm.getId(), VmDetailConstants.KEYBOARD);
+    protected Pair<String, Integer> 
getHostAndPortForKVMMaintenanceHostIfNeeded(HostVO host,
+                            Map<String, String> vmDetails) {
+        if (!Hypervisor.HypervisorType.KVM.equals(host.getHypervisorType())) {
+            return null;
+        }
+        if(!MAINTENANCE_RESOURCE_STATES.contains(host.getResourceState())) {
+            return null;
+        }
+        String address = vmDetails.get(VmDetailConstants.KVM_VNC_ADDRESS);
+        String port = vmDetails.get(VmDetailConstants.KVM_VNC_PORT);
+        if (ObjectUtils.allNotNull(address, port)) {
+            return new Pair<>(address, Integer.valueOf(port));
+        }
+        logger.warn("KVM Host in 
ErrorInMaintenance/ErrorInPrepareForMaintenance but " +
+                "no VNC Address/Port was available. Falling back to default 
one from MS.");
+        return null;
+    }
 
+    protected ConsoleConnectionDetails 
getConsoleConnectionDetails(VirtualMachine vm, HostVO host) {
+        String locale = null;
         String tag = vm.getUuid();
         String displayName = vm.getHostName();
         if (vm instanceof UserVm) {
             displayName = ((UserVm) vm).getDisplayName();
         }
+        Map<String, String> vmDetails = 
vmInstanceDetailsDao.listDetailsKeyPairs(vm.getId(),
+                List.of(VmDetailConstants.KEYBOARD, 
VmDetailConstants.KVM_VNC_ADDRESS, VmDetailConstants.KVM_VNC_PORT));
+        if (vmDetails.get(VmDetailConstants.KEYBOARD) != null) {
+            locale = vmDetails.get(VmDetailConstants.KEYBOARD);
+        }
+        ConsoleConnectionDetails details = new 
ConsoleConnectionDetails(vm.getVncPassword(), locale, tag, displayName);
+        if 
(Hypervisor.HypervisorType.External.equals(host.getHypervisorType())) {
+            return getConsoleConnectionDetailsFoxExternalVm(details, vm, host);

Review Comment:
   The method name contains a typo: 'Fox' should be 'For'. The method should be 
named 'getConsoleConnectionDetailsForExternalVm'.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscr...@cloudstack.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org

Reply via email to