package org.ovirt.engine.core.bll;
import java.io.IOException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
import javax.inject.Inject;
import org.codehaus.jackson.map.ObjectMapper;
import org.ovirt.engine.core.common.businessentities.GraphicsInfo;
import org.ovirt.engine.core.common.businessentities.VM;
import org.ovirt.engine.core.common.errors.EngineError;
import org.ovirt.engine.core.common.errors.EngineException;
import org.ovirt.engine.core.common.queries.GetSignedWebsocketProxyTicketParams;
import org.ovirt.engine.core.common.queries.SignStringParameters;
import org.ovirt.engine.core.common.queries.VdcQueryType;
import org.ovirt.engine.core.dao.VmDao;
/**
* It returns a signed ticket that allows to connect to websocket proxy (ovirt-websocket-proxy.py)
*
* @see SignStringQuery
* @see org.ovirt.engine.ui.common.uicommon.WebClientConsoleInvoker
*/
public class GetSignedWebsocketProxyTicketQuery<P extends GetSignedWebsocketProxyTicketParams> extends QueriesCommandBase<P> {
@Inject
private VmDao vmDao;
public GetSignedWebsocketProxyTicketQuery(P parameters) {
super(parameters);
}
@Override protected void executeQueryCommand() {
try {
executeQueryCommandChecked();
} catch (IOException ex) {
throw new EngineException(EngineError.FailedToCreateWebsocketProxyTicket, new RuntimeException(ex));
}
}
private void executeQueryCommandChecked() throws IOException {
final GraphicsInfo graphicsInfo = getGraphicsInfo();
final Map<String, Object> ticketModel = createTicket(graphicsInfo);
final String jsonTicket = new ObjectMapper().writeValueAsString(ticketModel);
final String encodedTicket = URLEncoder.encode(jsonTicket, StandardCharsets.UTF_8.name());
final String signedTicket = Backend.getInstance()
.runInternalQuery(VdcQueryType.SignString, new SignStringParameters(encodedTicket))
.getReturnValue();
setReturnValue(signedTicket);
}
private GraphicsInfo getGraphicsInfo() {
final VM vm = vmDao.get(getParameters().getVmId(), getUserID(), getParameters().isFiltered());
if (vm == null) {
throw new EngineException(EngineError.VMCantBeObtained,
String.format("vmid=%s", getParameters().getVmId()));
}
final GraphicsInfo graphicsInfo = vm.getGraphicsInfos().get(getParameters().getGraphicsType());
if (graphicsInfo == null) {
throw new EngineException(EngineError.GraphicsConsoleCantBeObtained,
String.format(
"vmid=%s console=%s", getParameters().getVmId(), getParameters().getGraphicsType()));
}
return graphicsInfo;
}
private Map<String, Object> createTicket(GraphicsInfo graphicsInfo) {
Map<String, Object> jsonModel = new HashMap<>();
jsonModel.put("host", graphicsInfo.getIp());
Integer tlsPort = graphicsInfo.getTlsPort();
boolean useSsl = tlsPort != null ? tlsPort != -1 : false;
int port = useSsl ? tlsPort : graphicsInfo.getPort();
jsonModel.put("port", String.valueOf(port));
jsonModel.put("ssl_target", useSsl);
return jsonModel;
}
}