Allow host behind cluster to return real VNC host IP address

This commit is contained in:
Kelven Yang 2010-11-23 12:23:45 -08:00
parent fd1beef28b
commit dd9b1634f7
4 changed files with 29 additions and 15 deletions

View File

@ -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;
}

View File

@ -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

View File

@ -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

View File

@ -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);