From dd9b1634f7b6dca01ff74b6baf5cb20b73877108 Mon Sep 17 00:00:00 2001 From: Kelven Yang Date: Tue, 23 Nov 2010 12:23:45 -0800 Subject: [PATCH] Allow host behind cluster to return real VNC host IP address --- .../com/cloud/agent/api/GetVncPortAnswer.java | 12 ++++++++++++ .../src/com/cloud/server/ManagementServer.java | 2 +- .../com/cloud/server/ManagementServerImpl.java | 14 ++++++-------- .../com/cloud/servlet/ConsoleProxyServlet.java | 16 ++++++++++------ 4 files changed, 29 insertions(+), 15 deletions(-) diff --git a/core/src/com/cloud/agent/api/GetVncPortAnswer.java b/core/src/com/cloud/agent/api/GetVncPortAnswer.java index 7a1f359a999..b4a7cff6e84 100644 --- a/core/src/com/cloud/agent/api/GetVncPortAnswer.java +++ b/core/src/com/cloud/agent/api/GetVncPortAnswer.java @@ -18,6 +18,8 @@ package com.cloud.agent.api; public class GetVncPortAnswer extends Answer { + // when host is behind a cluster, address field will allow us to return the real host IP that VM is running at + String address; int port; protected GetVncPortAnswer() { @@ -28,10 +30,20 @@ public class GetVncPortAnswer extends Answer { this.port = port; } + public GetVncPortAnswer(GetVncPortCommand cmd, String address, int port) { + super(cmd, true, null); + this.address = address; + this.port = port; + } + public GetVncPortAnswer(GetVncPortCommand cmd, String details) { super(cmd, false, details); } + public String getAddress() { + return address; + } + public int getPort() { return port; } diff --git a/server/src/com/cloud/server/ManagementServer.java b/server/src/com/cloud/server/ManagementServer.java index da1078e9e46..a7f9b141e46 100755 --- a/server/src/com/cloud/server/ManagementServer.java +++ b/server/src/com/cloud/server/ManagementServer.java @@ -420,7 +420,7 @@ public interface ManagementServer extends ManagementService { * @param VirtualMachine vm * @return the vnc port if found; -1 if unable to find. */ - int getVncPort(VirtualMachine vm); + Pair getVncPort(VirtualMachine vm); /** * find the domain Id associated with the given account diff --git a/server/src/com/cloud/server/ManagementServerImpl.java b/server/src/com/cloud/server/ManagementServerImpl.java index 4ced7f1f5f5..26030f138b8 100755 --- a/server/src/com/cloud/server/ManagementServerImpl.java +++ b/server/src/com/cloud/server/ManagementServerImpl.java @@ -3454,22 +3454,20 @@ public class ManagementServerImpl implements ManagementServer { } @Override - public int getVncPort(VirtualMachine vm) { + public Pair getVncPort(VirtualMachine vm) { if (vm.getHostId() == null) { s_logger.warn("VM " + vm.getHostName() + " does not have host, return -1 for its VNC port"); - return -1; + return new Pair(null, -1); } if(s_logger.isTraceEnabled()) s_logger.trace("Trying to retrieve VNC port from agent about VM " + vm.getHostName()); GetVncPortAnswer answer = (GetVncPortAnswer) _agentMgr.easySend(vm.getHostId(), new GetVncPortCommand(vm.getId(), vm.getInstanceName())); - int port = answer == null ? -1 : answer.getPort(); - - if(s_logger.isTraceEnabled()) - s_logger.trace("Retrieved VNC port about VM " + vm.getHostName() + " is " + port); - - return port; + if(answer != null) + return new Pair(answer.getAddress(), answer.getPort()); + + return new Pair(null, -1); } @Override diff --git a/server/src/com/cloud/servlet/ConsoleProxyServlet.java b/server/src/com/cloud/servlet/ConsoleProxyServlet.java index 4e148a617c5..b43bae7fdb7 100644 --- a/server/src/com/cloud/servlet/ConsoleProxyServlet.java +++ b/server/src/com/cloud/servlet/ConsoleProxyServlet.java @@ -260,13 +260,15 @@ public class ConsoleProxyServlet extends HttpServlet { StringBuffer sb = new StringBuffer(rootUrl); String host = hostVo.getPrivateIpAddress(); - int port = _ms.getVncPort(vm); + Pair portInfo = _ms.getVncPort(vm); + if(portInfo.first() != null) + host = portInfo.first(); String sid = vm.getVncPassword(); long tag = vm.getId(); - String ticket = URLEncoder.encode(genAccessTicket(host, String.valueOf(port), sid, String.valueOf(tag))); + String ticket = URLEncoder.encode(genAccessTicket(host, String.valueOf(portInfo.second()), sid, String.valueOf(tag))); sb.append("/getscreen?host=").append(host); - sb.append("&port=").append(port); + sb.append("&port=").append(portInfo.second()); sb.append("&sid=").append(sid); sb.append("&w=").append(w).append("&h=").append(h); sb.append("&tag=").append(tag); @@ -281,13 +283,15 @@ public class ConsoleProxyServlet extends HttpServlet { StringBuffer sb = new StringBuffer(rootUrl); String host = hostVo.getPrivateIpAddress(); - int port = _ms.getVncPort(vm); + Pair portInfo = _ms.getVncPort(vm); + if(portInfo.first() != null) + host = portInfo.first(); String sid = vm.getVncPassword(); long tag = vm.getId(); - String ticket = URLEncoder.encode(genAccessTicket(host, String.valueOf(port), sid, String.valueOf(tag))); + String ticket = URLEncoder.encode(genAccessTicket(host, String.valueOf(portInfo.second()), sid, String.valueOf(tag))); sb.append("/ajax?host=").append(host); - sb.append("&port=").append(port); + sb.append("&port=").append(portInfo.second()); sb.append("&sid=").append(sid); sb.append("&tag=").append(tag); sb.append("&ticket=").append(ticket);