Frank Kobzik has uploaded a new change for review.

Change subject: engine: Integrate noVNC support
......................................................................

engine: Integrate noVNC support

This patch integrates noVNC support in the engine.
For this to work, there must be oVirt websocket proxy deployed.

The behavior of VNC console invocation now depends on configuration in db -
option noVncProxy. The possible values are:
 - 'Off' - feature is turned off
 - 'Host' - feature is on - engine assumes the proxy is deployed on each host on
   port 6080
 - 'Engine' - feature is on - engine assumes the proxy is deployed on itself,
   this is default
 - host:port - feature is on, engine then assumes that the proxy is deployed on
   the machine specified by host:port

Change-Id: I44e9870b88537360a1886e89c08f18865eae2ef0
Signed-off-by: Frantisek Kobzik <[email protected]>
---
M backend/manager/dbscripts/upgrade/pre_upgrade/0000_config.sql
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/config/ConfigValues.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/ConfigurationValues.java
A 
frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/uicommon/AbstractVnc.java
A 
frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/uicommon/NoVncImpl.java
M 
frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/uicommon/UiCommonDefaultTypeResolver.java
A 
frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/uicommon/VncNativeImpl.java
M 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/Configurator.java
A 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/INoVnc.java
A 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/IVnc.java
A 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/IVncNative.java
M 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/VncConsoleModel.java
12 files changed, 278 insertions(+), 22 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/31/13931/1

diff --git a/backend/manager/dbscripts/upgrade/pre_upgrade/0000_config.sql 
b/backend/manager/dbscripts/upgrade/pre_upgrade/0000_config.sql
index b55c6b3..fcff1af 100644
--- a/backend/manager/dbscripts/upgrade/pre_upgrade/0000_config.sql
+++ b/backend/manager/dbscripts/upgrade/pre_upgrade/0000_config.sql
@@ -514,6 +514,8 @@
 select fn_db_add_config_value('AutoRecoveryAllowedTypes','{\"storage 
domains\":\"true\",\"hosts\":\"true\"}','general');
 -- Client console mode settings (Auto, Native, Plugin)
 select fn_db_add_config_value('ClientConsoleModeDefault','Auto','general');
+-- NoVNC proxy configuration (Off, Engine, Host or ip/hostname:port of 
websockets proxy)
+select fn_db_add_config_value('NoVncProxy','Engine','general');
 -- Gluster refresh rates (in seconds)
 select fn_db_add_config_value('GlusterRefreshRateLight', '5', 'general');
 select fn_db_add_config_value('GlusterRefreshRateHeavy', '300', 'general');
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/config/ConfigValues.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/config/ConfigValues.java
index 467b9ab..89e9f28 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/config/ConfigValues.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/config/ConfigValues.java
@@ -1347,6 +1347,10 @@
     @DefaultValueAttribute("false")
     MigrationNetworkEnabled(502),
 
+    @TypeConverterAttribute(String.class)
+    @DefaultValueAttribute("Engine")
+    NoVncProxy(503),
+
     Invalid(65535);
 
     private int intValue;
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/ConfigurationValues.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/ConfigurationValues.java
index fc2dd12..e68be9a 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/ConfigurationValues.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/ConfigurationValues.java
@@ -26,6 +26,7 @@
     SpiceToggleFullScreenKeys(ConfigAuthType.User),
     SpiceProxyDefault(ConfigAuthType.User),
     ClientConsoleModeDefault(ConfigAuthType.User),
+    NoVncProxy(ConfigAuthType.User),
     HighUtilizationForEvenlyDistribute(ConfigAuthType.User),
     SpiceUsbAutoShare(ConfigAuthType.User),
     ImportDefaultPath,
diff --git 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/uicommon/AbstractVnc.java
 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/uicommon/AbstractVnc.java
new file mode 100644
index 0000000..429a83a
--- /dev/null
+++ 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/uicommon/AbstractVnc.java
@@ -0,0 +1,42 @@
+package org.ovirt.engine.ui.common.uicommon;
+
+public class AbstractVnc {
+
+    private String vncHost;
+    private String vncPort;
+    private String ticket;
+    private String title;
+
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    public String getVncHost() {
+        return vncHost;
+    }
+
+    public String getVncPort() {
+        return vncPort;
+    }
+
+    public String getTicket() {
+        return ticket;
+    }
+
+    public void setVncHost(String vncHost) {
+        this.vncHost = vncHost;
+    }
+
+    public void setVncPort(String vncPort) {
+        this.vncPort = vncPort;
+    }
+
+    public void setTicket(String ticket) {
+        this.ticket = ticket;
+    }
+
+}
diff --git 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/uicommon/NoVncImpl.java
 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/uicommon/NoVncImpl.java
new file mode 100644
index 0000000..8a34d67
--- /dev/null
+++ 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/uicommon/NoVncImpl.java
@@ -0,0 +1,125 @@
+package org.ovirt.engine.ui.common.uicommon;
+
+import org.ovirt.engine.core.common.queries.ConfigurationValues;
+import org.ovirt.engine.ui.uicommonweb.Configurator;
+import org.ovirt.engine.ui.uicommonweb.TypeResolver;
+import org.ovirt.engine.ui.uicommonweb.dataprovider.AsyncDataProvider;
+import org.ovirt.engine.ui.uicommonweb.models.vms.INoVnc;
+
+import com.google.gwt.user.client.Window.Location;
+
+public class NoVncImpl extends AbstractVnc implements INoVnc {
+
+    private boolean listensOnPostMessage = false;
+    private final NoVncProxyConfig config;
+
+    private String getTargetOrigin() {
+        return "https://"; + getProxyHost() + ":" + 
getProxyPort();//$NON-NLS-1$//$NON-NLS-2$
+    }
+
+    public String getProxyHost() {
+        return config.getProxyHost();
+    }
+
+    public String getProxyPort() {
+        return config.getProxyPort();
+    }
+
+    private boolean matchesHostColonPort(String s) {
+        if (s == null) {
+            return false;
+        }
+
+        return s.matches("\\S+:\\d+");//$NON-NLS-1$
+    }
+
+    public void setListensOnPostMessage(boolean listensOnPostMessage) {
+        this.listensOnPostMessage = listensOnPostMessage;
+    }
+
+    private String getClientUrl() {
+        return getTargetOrigin() + "/vnc_auto.html?host=" + getProxyHost() + 
"&port=" + getProxyPort();//$NON-NLS-1$//$NON-NLS-2$
+    }
+
+    public NoVncImpl() {
+        super();
+        this.config = new NoVncProxyConfig((String) 
AsyncDataProvider.GetConfigValuePreConverted(ConfigurationValues.NoVncProxy));
+    }
+
+    @Override
+    public native void invokeClient()/*-{
+       if 
([email protected]::isClientUnsupportedExplorer()())
 {
+           alert("NoVnc console is not supported on Internet Explorer < 10");
+       }
+
+       var that = this;
+
+       function postVncMessage(target) {
+           var vncData = {
+               vnc_host: 
[email protected]::getVncHost()(),
+               vnc_port: 
[email protected]::getVncPort()(),
+               ticket: 
[email protected]::getTicket()()
+           };
+
+           var targetOrigin = 
[email protected]::getTargetOrigin()();
+           target.postMessage(JSON.stringify(vncData), targetOrigin);
+       }
+
+       var clientUrl = 
[email protected]::getClientUrl()();
+
+       if 
([email protected]::listensOnPostMessage) {
+           
[email protected]::listensOnPostMessage = 
true;
+           $wnd.addEventListener("message", postVncMessage, false);
+       }
+
+       var win = $wnd.open(clientUrl, "_blank", 
"width=940,height=400,status=1,resizeable=1,scrollbars=1");
+       win.focus();//try removing this line
+
+       setTimeout(function() {
+         postVncMessage(win);
+       }, 1000);
+
+       }-*/;
+
+    private boolean isClientUnsupportedExplorer() {
+        
return((Configurator)TypeResolver.getInstance().Resolve(Configurator.class)).isClientWindowsExplorer();
+    }
+
+    private class NoVncProxyConfig {
+        private final String configValue;
+        private static final String proxyPortDefault = "6080"; //$NON-NLS-1$
+
+        private static final String HOST = "Host";//$NON-NLS-1$
+        private static final String ENGINE = "Engine";//$NON-NLS-1$
+
+        public NoVncProxyConfig(String configValue) {
+            this.configValue = configValue;
+        }
+
+        public String getProxyHost() {
+            if (HOST.equals(configValue)) {
+                return getVncHost();
+            } else if (ENGINE.equals(configValue)) {
+                String host = Location.getHostName();
+                return Location.getHostName();
+            } else if (matchesHostColonPort(configValue)) {
+                return configValue.split(":")[0];//$NON-NLS-1$
+            } else {
+                throw new IllegalArgumentException("Illegal NoVncImpl 
configuration.");//$NON-NLS-1$
+            }
+        }
+
+        public String getProxyPort() {
+            if (HOST.equals(configValue) || ENGINE.equals(configValue)) {
+                return proxyPortDefault;
+            } else if (matchesHostColonPort(configValue)) {
+                return configValue.split(":")[1];//$NON-NLS-1$
+            } else {
+                throw new IllegalArgumentException("Illegal NoVncImpl 
configuration.");//$NON-NLS-1$
+            }
+        }
+
+    }
+
+}
+
diff --git 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/uicommon/UiCommonDefaultTypeResolver.java
 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/uicommon/UiCommonDefaultTypeResolver.java
index 64e08c0..8288eec 100644
--- 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/uicommon/UiCommonDefaultTypeResolver.java
+++ 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/uicommon/UiCommonDefaultTypeResolver.java
@@ -8,9 +8,11 @@
 import org.ovirt.engine.ui.uicommonweb.ILogger;
 import org.ovirt.engine.ui.uicommonweb.ITimer;
 import org.ovirt.engine.ui.uicommonweb.ITypeResolver;
+import org.ovirt.engine.ui.uicommonweb.models.vms.INoVnc;
 import org.ovirt.engine.ui.uicommonweb.models.vms.IRdp;
 import org.ovirt.engine.ui.uicommonweb.models.vms.ISpiceNative;
 import org.ovirt.engine.ui.uicommonweb.models.vms.ISpicePlugin;
+import org.ovirt.engine.ui.uicommonweb.models.vms.IVncNative;
 
 import com.google.inject.Inject;
 
@@ -49,6 +51,10 @@
             return new SpicePluginImpl();
         } else if (type == ISpiceNative.class) {
             return new SpiceNativeImpl();
+        } else if (type == INoVnc.class) {
+            return new NoVncImpl();
+        } else if (type == IVncNative.class) {
+            return new VncNativeImpl();
         } else if (type == IRdp.class) {
             return new IRdpImpl();
         } else if (type == ConsoleOptionsFrontendPersister.class) {
diff --git 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/uicommon/VncNativeImpl.java
 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/uicommon/VncNativeImpl.java
new file mode 100644
index 0000000..bf5eca2
--- /dev/null
+++ 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/uicommon/VncNativeImpl.java
@@ -0,0 +1,20 @@
+package org.ovirt.engine.ui.common.uicommon;
+
+import org.ovirt.engine.ui.uicommonweb.models.vms.ConsoleModel;
+import org.ovirt.engine.ui.uicommonweb.models.vms.IVnc;
+
+public class VncNativeImpl extends AbstractVnc implements IVnc {
+
+    @Override
+    public void invokeClient() {
+        StringBuilder configBuilder = new StringBuilder("[virt-viewer]"); 
//$NON-NLS-1$
+        configBuilder.append("\ntype=vnc") //$NON-NLS-1$
+                .append("\nhost=").append(getVncHost()) //$NON-NLS-1$
+                .append("\nport=").append(getVncPort()) //$NON-NLS-1$
+                .append("\npassword=").append(getTicket()) //$NON-NLS-1$
+                .append("\ntitle=").append(getTitle()); //$NON-NLS-1$
+
+        ConsoleModel.makeConsoleConfigRequest("console.vv", 
"application/x-virt-viewer; charset=UTF-8", configBuilder.toString()); 
//$NON-NLS-1$ $NON-NLS-2$
+    }
+
+}
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/Configurator.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/Configurator.java
index 70b21dd..0d33065 100644
--- 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/Configurator.java
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/Configurator.java
@@ -358,6 +358,10 @@
         return clientOsType().equalsIgnoreCase("Linux") && 
clientBrowserType().equalsIgnoreCase("Firefox"); //$NON-NLS-1$ //$NON-NLS-2$
     }
 
+    public boolean isClientWindowExplorerWithWebsockets() {
+        return isClientWindowsExplorer(); //TODO add check for ie 10
+    }
+
     public boolean isClientWindowsExplorer() {
         return isClientWindows() && 
clientBrowserType().equalsIgnoreCase("Explorer"); //$NON-NLS-1$ //$NON-NLS-2$
     }
@@ -381,6 +385,7 @@
 
     protected abstract void onUpdateDocumentationBaseURL();
 
+
     public boolean isSpiceProxyDefined() {
         String spiceProxy = (String) 
AsyncDataProvider.GetConfigValuePreConverted(ConfigurationValues.SpiceProxyDefault);
         return spiceProxy != null && !"".equals(spiceProxy); //$NON-NLS-1$
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/INoVnc.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/INoVnc.java
new file mode 100644
index 0000000..1e668fa
--- /dev/null
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/INoVnc.java
@@ -0,0 +1,9 @@
+package org.ovirt.engine.ui.uicommonweb.models.vms;
+
+/**
+ *
+ * NoVnc client invoker interface.
+ *
+ */
+public interface INoVnc extends IVnc {
+}
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/IVnc.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/IVnc.java
new file mode 100644
index 0000000..3d58739
--- /dev/null
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/IVnc.java
@@ -0,0 +1,12 @@
+package org.ovirt.engine.ui.uicommonweb.models.vms;
+
+public interface IVnc {
+
+    void setVncHost(String host);
+    void setVncPort(String port);
+    void setTicket(String ticket);
+    void setTitle(String title);
+
+    void invokeClient();
+
+}
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/IVncNative.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/IVncNative.java
new file mode 100644
index 0000000..efe20d5
--- /dev/null
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/IVncNative.java
@@ -0,0 +1,5 @@
+package org.ovirt.engine.ui.uicommonweb.models.vms;
+
+public interface IVncNative extends IVnc {
+
+}
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/VncConsoleModel.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/VncConsoleModel.java
index 1fa6465..135f0ea 100644
--- 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/VncConsoleModel.java
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/VncConsoleModel.java
@@ -5,6 +5,7 @@
 import org.ovirt.engine.core.common.action.VdcReturnValueBase;
 import org.ovirt.engine.core.common.businessentities.DisplayType;
 import org.ovirt.engine.core.common.businessentities.VMStatus;
+import org.ovirt.engine.core.common.queries.ConfigurationValues;
 import org.ovirt.engine.core.common.queries.IdQueryParameters;
 import org.ovirt.engine.core.common.queries.VdcQueryReturnValue;
 import org.ovirt.engine.core.common.queries.VdcQueryType;
@@ -13,25 +14,50 @@
 import org.ovirt.engine.ui.frontend.Frontend;
 import org.ovirt.engine.ui.frontend.INewAsyncCallback;
 import org.ovirt.engine.ui.uicommonweb.BaseCommandTarget;
+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.uicompat.ConstantsManager;
 import org.ovirt.engine.ui.uicompat.FrontendActionAsyncResult;
 import org.ovirt.engine.ui.uicompat.IFrontendActionAsyncCallback;
 
-@SuppressWarnings("unused")
-public class VncConsoleModel extends ConsoleModel
-{
-    String otp64 = null;
-    private static final int seconds = 120;
+public class VncConsoleModel extends ConsoleModel {
 
-    public VncConsoleModel()
-    {
+    private static final int TICKET_VALIDITY_SECONDS = 120;
+
+    private String host;
+
+    private String otp64 = null;
+
+    private final IVnc vncImpl;
+
+    private String getPort() {
+        if (getEntity() == null && getEntity().getDisplay() == null) {
+            return null;
+        }
+
+        return getEntity().getDisplay().toString();
+    }
+
+    private String getHost() {
+        return host;
+    }
+
+    private String getOtp64() {
+        return otp64;
+    }
+
+    public VncConsoleModel() {
         setTitle(ConstantsManager.getInstance().getConstants().VNCTitle());
+
+        String noVncConfig = (String) 
AsyncDataProvider.GetConfigValuePreConverted(ConfigurationValues.NoVncProxy);
+        this.vncImpl = StringHelper.isNullOrEmpty(noVncConfig) || 
noVncConfig.equals("Off") ? // $NON-NLS-1$
+            (IVnc) TypeResolver.getInstance().Resolve(IVncNative.class) :
+            (IVnc) TypeResolver.getInstance().Resolve(INoVnc.class);
     }
 
     @Override
-    protected void Connect()
-    {
+    protected void Connect() {
         if (getEntity() == null || getEntity().getRunOnVds() == null) {
             return;
         }
@@ -50,7 +76,7 @@
     private void setVmTicket() {
         Frontend.RunAction(VdcActionType.SetVmTicket, new 
SetVmTicketParameters(getEntity().getId(),
                     null,
-                    seconds), new IFrontendActionAsyncCallback() {
+                    TICKET_VALIDITY_SECONDS), new 
IFrontendActionAsyncCallback() {
 
                 @Override
                 public void Executed(FrontendActionAsyncResult result) {
@@ -70,7 +96,8 @@
                                 public void OnSuccess(Object model, Object 
ReturnValue)
                                 {
                                     VncConsoleModel consoleModel = 
(VncConsoleModel) model;
-                                    consoleModel.postGetHost((String) 
((VdcQueryReturnValue) ReturnValue).getReturnValue());
+                                    VncConsoleModel.this.host = (String) 
((VdcQueryReturnValue) ReturnValue).getReturnValue();
+                                    consoleModel.setAndInvokeClient();
                                 }
                             };
 
@@ -78,27 +105,25 @@
                                     new 
IdQueryParameters(getEntity().getId()), _asyncQuery);
                         }
                         else {
-                            postGetHost(getEntity().getDisplayIp());
+                            VncConsoleModel.this.host = 
getEntity().getDisplayIp();
+                            setAndInvokeClient();
                         }
                     }
                 }
             });
     }
 
-    protected void postGetHost(String hostName) {
-        StringBuilder configBuilder = new StringBuilder("[virt-viewer]"); 
//$NON-NLS-1$
-        configBuilder.append("\ntype=vnc") //$NON-NLS-1$
-            .append("\nhost=").append(hostName) //$NON-NLS-1$
-            .append("\nport=").append(getEntity().getDisplay().toString()) 
//$NON-NLS-1$
-            .append("\npassword=").append(otp64) //$NON-NLS-1$
-            .append("\ntitle=").append(getTitle()); //$NON-NLS-1$
+    private void setAndInvokeClient() {
+        vncImpl.setVncHost(getHost());
+        vncImpl.setVncPort(getPort());
+        vncImpl.setTicket(getOtp64());
+        vncImpl.setTitle(getTitle());
 
-        ConsoleModel.makeConsoleConfigRequest("console.vv", 
"application/x-virt-viewer; charset=UTF-8", configBuilder.toString()); 
//$NON-NLS-1$ $NON-NLS-2$
+        vncImpl.invokeClient();
     }
 
     @Override
-    protected void UpdateActionAvailability()
-    {
+    protected void UpdateActionAvailability() {
         super.UpdateActionAvailability();
 
         getConnectCommand().setIsExecutionAllowed(getEntity() != null


--
To view, visit http://gerrit.ovirt.org/13931
To unsubscribe, visit http://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I44e9870b88537360a1886e89c08f18865eae2ef0
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Frank Kobzik <[email protected]>
_______________________________________________
Engine-patches mailing list
[email protected]
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to