package org.zstack.kvm;
import org.springframework.beans.factory.annotation.Autowired;
import org.zstack.core.cloudbus.CloudBus;
import org.zstack.core.cloudbus.CloudBusCallBack;
import org.zstack.core.db.DatabaseFacade;
import org.zstack.core.db.SimpleQuery;
import org.zstack.core.db.SimpleQuery.Op;
import org.zstack.core.errorcode.ErrorFacade;
import org.zstack.core.timeout.ApiTimeoutManager;
import org.zstack.header.console.ConsoleHypervisorBackend;
import org.zstack.header.core.ReturnValueCompletion;
import org.zstack.header.host.HostConstant;
import org.zstack.header.host.HostVO;
import org.zstack.header.host.HostVO_;
import org.zstack.header.host.HypervisorType;
import org.zstack.header.message.MessageReply;
import org.zstack.header.vm.VmInstanceInventory;
import org.zstack.kvm.KVMAgentCommands.GetVncPortResponse;
import org.zstack.utils.Utils;
import org.zstack.utils.logging.CLogger;
import static org.zstack.core.Platform.operr;
import java.net.URI;
import java.net.URISyntaxException;
/**
* Created with IntelliJ IDEA.
* User: frank
* Time: 9:25 PM
* To change this template use File | Settings | File Templates.
*/
public class KVMConsoleHypervisorBackend implements ConsoleHypervisorBackend {
private static final CLogger logger = Utils.getLogger(KVMConsoleHypervisorBackend.class);
@Autowired
private DatabaseFacade dbf;
@Autowired
private CloudBus bus;
@Autowired
private ErrorFacade errf;
@Autowired
private ApiTimeoutManager timeoutMgr;
@Override
public HypervisorType getConsoleBackendHypervisorType() {
return HypervisorType.valueOf(KVMConstant.KVM_HYPERVISOR_TYPE);
}
@Override
public void generateConsoleUrl(final VmInstanceInventory vm, final ReturnValueCompletion<URI> complete) {
KVMAgentCommands.GetVncPortCmd cmd = new KVMAgentCommands.GetVncPortCmd();
cmd.setVmUuid(vm.getUuid());
KVMHostAsyncHttpCallMsg msg = new KVMHostAsyncHttpCallMsg();
msg.setHostUuid(vm.getHostUuid());
msg.setCommand(cmd);
msg.setCommandTimeout(timeoutMgr.getTimeout(cmd.getClass(), "5m"));
msg.setPath(KVMConstant.KVM_GET_VNC_PORT_PATH);
bus.makeTargetServiceIdByResourceUuid(msg, HostConstant.SERVICE_ID, vm.getHostUuid());
bus.send(msg, new CloudBusCallBack(complete) {
@Override
public void run(MessageReply reply) {
if (!reply.isSuccess()) {
complete.fail(reply.getError());
return;
}
KVMHostAsyncHttpCallReply kreply = reply.castReply();
GetVncPortResponse rsp = kreply.toResponse(GetVncPortResponse.class);
if (!rsp.isSuccess()) {
complete.fail(operr(rsp.getError()));
return;
}
SimpleQuery<HostVO> q = dbf.createQuery(HostVO.class);
q.select(HostVO_.managementIp);
q.add(HostVO_.uuid, Op.EQ, vm.getHostUuid());
String mgmtIp = q.findValue();
try {
URI uri = new URI(String.format("http://%s:%s/", mgmtIp, rsp.getPort()));
complete.success(uri);
} catch (URISyntaxException e) {
complete.fail(errf.throwableToInternalError(e));
}
}
});
}
}