package org.ovirt.engine.ui.uicommonweb.models.vms; import org.ovirt.engine.core.common.businessentities.GraphicsInfo; import org.ovirt.engine.core.common.businessentities.GraphicsType; import org.ovirt.engine.core.common.businessentities.VM; import org.ovirt.engine.core.common.console.ConsoleOptions; import org.ovirt.engine.core.common.queries.ConfigurationValues; import org.ovirt.engine.core.common.queries.ConfigureConsoleOptionsParams; import org.ovirt.engine.core.common.queries.VdcQueryReturnValue; import org.ovirt.engine.core.common.queries.VdcQueryType; import org.ovirt.engine.ui.frontend.Frontend; import org.ovirt.engine.ui.frontend.utils.FrontendUrlUtils; import org.ovirt.engine.ui.uicommonweb.BaseCommandTarget; import org.ovirt.engine.ui.uicommonweb.ConsoleUtils; import org.ovirt.engine.ui.uicommonweb.DynamicMessages; import org.ovirt.engine.ui.uicommonweb.ShowErrorAsyncQuery; import org.ovirt.engine.ui.uicommonweb.TypeResolver; import org.ovirt.engine.ui.uicommonweb.UICommand; import org.ovirt.engine.ui.uicommonweb.dataprovider.AsyncDataProvider; import org.ovirt.engine.ui.uicommonweb.models.Model; import org.ovirt.engine.ui.uicompat.ConstantsManager; public class VncConsoleModel extends ConsoleModel { public enum ClientConsoleMode { Native, NoVnc } private static final DynamicMessages dynamicMessages = (DynamicMessages) TypeResolver.getInstance().resolve(DynamicMessages.class); private ClientConsoleMode consoleMode; private ConsoleClient vncImpl; public VncConsoleModel(VM myVm, Model parentModel) { super(myVm, parentModel); setTitle(ConstantsManager.getInstance().getConstants().vncTitle()); boolean webBasedClientsSupported = ((ConsoleUtils) TypeResolver.getInstance().resolve(ConsoleUtils.class)).webBasedClientsSupported(); ClientConsoleMode desiredMode = readDefaultConsoleClientMode(); if (desiredMode == ClientConsoleMode.NoVnc && !webBasedClientsSupported) { desiredMode = ClientConsoleMode.Native; // fallback } setVncImplementation(desiredMode); } /** * Safely determine the default client mode for VNC. * @return default VNC client mode read from engine config or 'Native' if there is a problem when retrieving the value. */ private ClientConsoleMode readDefaultConsoleClientMode() { try { return ClientConsoleMode.valueOf((String) AsyncDataProvider.getInstance().getConfigValuePreConverted(ConfigurationValues.ClientModeVncDefault)); } catch (Exception e) { return ClientConsoleMode.Native; } } public void setVncImplementation(ClientConsoleMode consoleMode) { Class implClass = consoleMode == ClientConsoleMode.NoVnc ? INoVnc.class : IVncNative.class; this.consoleMode = consoleMode; this.vncImpl = (ConsoleClient) TypeResolver.getInstance().resolve(implClass); } public ConsoleClient getVncImpl() { return vncImpl; } public ClientConsoleMode getClientConsoleMode() { return consoleMode; } @Override protected void connect() { if (getEntity() == null || getEntity().getRunOnVds() == null) { return; } getLogger().debug("VNC console info..."); //$NON-NLS-1$ UICommand invokeConsoleCommand = new UICommand("invokeConsoleCommand", new BaseCommandTarget() { //$NON-NLS-1$ @Override public void executeCommand(UICommand uiCommand) { invokeConsole(); } }); executeCommandWithConsoleSafenessWarning(invokeConsoleCommand); } @Override public boolean canBeSelected() { return getEntity().getGraphicsInfos().containsKey(GraphicsType.VNC); } private void invokeConsole() { final GraphicsInfo vncInfo = getEntity().getGraphicsInfos().get(GraphicsType.VNC); if (vncInfo == null) { throw new IllegalStateException("Trying to invoke VNC console but VM GraphicsInfo is null."); //$NON-NLS-1$ } vncImpl.getOptions().setVmId(getEntity().getId()); ConfigureConsoleOptionsParams parameters = new ConfigureConsoleOptionsParams(vncImpl.getOptions(), true); parameters.setEngineBaseUrl(FrontendUrlUtils.getRootURL()); parameters.setConsoleClientResourcesUrl(dynamicMessages.consoleClientResourcesUrl()); Frontend.getInstance().runQuery( VdcQueryType.ConfigureConsoleOptions, parameters, new ShowErrorAsyncQuery(returnValue -> { ConsoleOptions configuredOptions = ((VdcQueryReturnValue) returnValue).getReturnValue(); // overriding global server settings by frontend settings configuredOptions.setRemapCtrlAltDelete(vncImpl.getOptions().isRemapCtrlAltDelete()); vncImpl.setOptions(configuredOptions); vncImpl.getOptions().setTitle(getClientTitle()); vncImpl.getOptions().setVmName(getEntity().getName()); vncImpl.invokeClient(); })); } }