mirror of https://github.com/apache/cloudstack.git
Allow host behind cluster to return real VNC host IP address
This commit is contained in:
parent
fd1beef28b
commit
dd9b1634f7
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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<String, Integer> getVncPort(VirtualMachine vm);
|
||||
|
||||
/**
|
||||
* find the domain Id associated with the given account
|
||||
|
|
|
|||
|
|
@ -3454,22 +3454,20 @@ public class ManagementServerImpl implements ManagementServer {
|
|||
}
|
||||
|
||||
@Override
|
||||
public int getVncPort(VirtualMachine vm) {
|
||||
public Pair<String, Integer> 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<String, Integer>(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<String, Integer>(answer.getAddress(), answer.getPort());
|
||||
|
||||
return new Pair<String, Integer>(null, -1);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
|||
|
|
@ -260,13 +260,15 @@ public class ConsoleProxyServlet extends HttpServlet {
|
|||
StringBuffer sb = new StringBuffer(rootUrl);
|
||||
|
||||
String host = hostVo.getPrivateIpAddress();
|
||||
int port = _ms.getVncPort(vm);
|
||||
Pair<String, Integer> 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<String, Integer> 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);
|
||||
|
|
|
|||
Loading…
Reference in New Issue