Frank Kobzik has uploaded a new change for review.

Change subject: frontend: Switching spice invoker implementation in console 
dialog
......................................................................

frontend: Switching spice invoker implementation in console dialog

This patch allows switching spice invoker implementation in console dialog.

Change-Id: Ib9fdc00931e3b25858b792b47339b3c5ab4a954c
Signed-off-by: Frantisek Kobzik <fkob...@redhat.com>
---
M 
frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/CommonApplicationConstants.java
M 
frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/presenter/popup/ConsolePopupPresenterWidget.java
M 
frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/utils/ConsoleOptionsFrontendPersisterImpl.java
M 
frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/utils/ConsoleUtilsImpl.java
M 
frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/view/popup/ConsolePopupView.java
M 
frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/view/popup/ConsolePopupView.ui.xml
M 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/ConsoleUtils.java
M 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/SpiceConsoleModel.java
8 files changed, 195 insertions(+), 16 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/53/13953/1

diff --git 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/CommonApplicationConstants.java
 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/CommonApplicationConstants.java
index 4d4745a..51e9685 100644
--- 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/CommonApplicationConstants.java
+++ 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/CommonApplicationConstants.java
@@ -1156,6 +1156,15 @@
     @DefaultStringValue("Spice")
     String spice();
 
+    @DefaultStringValue("Auto")
+    String spiceImplAuto();
+
+    @DefaultStringValue("Native client")
+    String spiceImplNative();
+
+    @DefaultStringValue("Browser plugin")
+    String spiceImplPlugin();
+
     @DefaultStringValue("Pass Ctrl-Alt-Del to virtual machine")
     String ctrlAltDel();
 
@@ -1170,6 +1179,9 @@
 
     @DefaultStringValue("Not supported for this client OS")
     String ctrlAltDeletIsNotSupportedOnWindows();
+
+    @DefaultStringValue("Your browser doesn't support SPICE plugin")
+    String pluginNotSupportedByBrowser();
 
     @DefaultStringValue("No SPICE proxy defined on system level")
     String spiceProxyCanBeEnabledOnlyWhenDefined();
@@ -1208,4 +1220,5 @@
 
     @DefaultStringValue("Details")
     String details();
+
 }
diff --git 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/presenter/popup/ConsolePopupPresenterWidget.java
 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/presenter/popup/ConsolePopupPresenterWidget.java
index b2edfad..2805631 100644
--- 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/presenter/popup/ConsolePopupPresenterWidget.java
+++ 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/presenter/popup/ConsolePopupPresenterWidget.java
@@ -9,6 +9,7 @@
 import org.ovirt.engine.ui.uicommonweb.models.ConsoleProtocol;
 import org.ovirt.engine.ui.uicommonweb.models.HasConsoleModel;
 import org.ovirt.engine.ui.uicommonweb.models.vms.ConsoleModel;
+import 
org.ovirt.engine.ui.uicommonweb.models.vms.ConsoleModel.ClientConsoleMode;
 import org.ovirt.engine.ui.uicommonweb.models.vms.ISpice;
 import org.ovirt.engine.ui.uicommonweb.models.vms.SpiceConsoleModel;
 import org.ovirt.engine.ui.uicommonweb.models.vms.VncConsoleModel;
@@ -44,6 +45,10 @@
 
         HasValueChangeHandlers<Boolean> getVncRadioButton();
 
+        HasValueChangeHandlers<Boolean> getSpiceAutoImplRadioButton();
+        HasValueChangeHandlers<Boolean> getSpiceNativeImplRadioButton();
+        HasValueChangeHandlers<Boolean> getSpicePluginImplRadioButton();
+
         void rdpSelected(boolean selected);
 
         void spiceSelected(boolean selected);
@@ -57,6 +62,10 @@
         void setAdditionalConsoleAvailable(boolean hasAdditionalConsole);
 
         void setSpiceConsoleAvailable(boolean available);
+
+        void selectSpiceImplementation(ClientConsoleMode consoleMode);
+
+        void setSpicePluginImplEnabled(boolean enabled, String reason);
 
         void selectWanOptionsEnabled(boolean selected);
 
@@ -186,6 +195,17 @@
             }
         }
 
+        if (!consoleUtils.isBrowserPluginSupported()) {
+            getView().setSpicePluginImplEnabled(false, 
constants.pluginNotSupportedByBrowser());
+        }
+
+        SpiceConsoleModel spiceModel = extractSpiceModel(model);
+        if (spiceModel != null) {
+            
getView().selectSpiceImplementation(spiceModel.getClientConsoleMode());
+        } else {
+            getView().selectSpiceImplementation(ClientConsoleMode.Auto);
+        }
+
         wanOptionsAvailable = 
consoleUtils.isWanOptionsAvailable(model.getModel());
         if (wanOptionsAvailable) {
             getView().setWanOptionsVisible(true);
@@ -259,16 +279,50 @@
                 }
             }
         }));
+
+        registerHandler(getView().getSpiceAutoImplRadioButton()
+                .addValueChangeHandler(new ValueChangeHandler<Boolean>() {
+                    @Override
+                    public void onValueChange(ValueChangeEvent<Boolean> event) 
{
+                        
getView().selectSpiceImplementation(ClientConsoleMode.Auto);
+                    }
+                }));
+
+        registerHandler(getView().getSpiceNativeImplRadioButton()
+                .addValueChangeHandler(new ValueChangeHandler<Boolean>() {
+                    @Override
+                    public void onValueChange(ValueChangeEvent<Boolean> event) 
{
+                        
getView().selectSpiceImplementation(ClientConsoleMode.Native);
+                    }
+                }));
+        registerHandler(getView().getSpicePluginImplRadioButton()
+                .addValueChangeHandler(new ValueChangeHandler<Boolean>() {
+                    @Override
+                    public void onValueChange(ValueChangeEvent<Boolean> event) 
{
+                        
getView().selectSpiceImplementation(ClientConsoleMode.Plugin);
+                    }
+                }));
+
     }
 
     protected ISpice extractSpice(ConsolePopupModel model) {
-        ConsoleModel consoleModel = model.getModel().getDefaultConsoleModel();
-        if (!(consoleModel instanceof SpiceConsoleModel)) {
-            return null;
+        SpiceConsoleModel spiceModel = extractSpiceModel(model);
+
+        if (spiceModel != null) {
+            return spiceModel.getspice();
         }
 
-        ISpice spice = ((SpiceConsoleModel) consoleModel).getspice();
-        return spice;
+        return null;
+    }
+
+    protected SpiceConsoleModel extractSpiceModel(ConsolePopupModel model) {
+        ConsoleModel consoleModel = model.getModel().getDefaultConsoleModel();
+
+        if (consoleModel instanceof SpiceConsoleModel) {
+            return (SpiceConsoleModel) consoleModel;
+        }
+
+        return null;
     }
 
 }
diff --git 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/utils/ConsoleOptionsFrontendPersisterImpl.java
 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/utils/ConsoleOptionsFrontendPersisterImpl.java
index e9d4797..589522b 100644
--- 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/utils/ConsoleOptionsFrontendPersisterImpl.java
+++ 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/utils/ConsoleOptionsFrontendPersisterImpl.java
@@ -5,6 +5,7 @@
 import org.ovirt.engine.ui.uicommonweb.ConsoleUtils;
 import org.ovirt.engine.ui.uicommonweb.models.ConsoleProtocol;
 import org.ovirt.engine.ui.uicommonweb.models.HasConsoleModel;
+import 
org.ovirt.engine.ui.uicommonweb.models.vms.ConsoleModel.ClientConsoleMode;
 import org.ovirt.engine.ui.uicommonweb.models.vms.IRdp;
 import org.ovirt.engine.ui.uicommonweb.models.vms.ISpice;
 import org.ovirt.engine.ui.uicommonweb.models.vms.RdpConsoleModel;
@@ -19,6 +20,7 @@
     private final ConsoleUtils consoleUtils;
 
     // spice options
+    private static final String SPICE_CLIENT_IMPLEMENTATION = 
"_spiceClientImplementation"; //$NON-NLS-1$
     private static final String CTRL_ALT_DEL = "_ctrlAltDel"; //$NON-NLS-1$
     private static final String OPEN_IN_FULL_SCREEN = "_openInFullScreen"; 
//$NON-NLS-1$
     private static final String SMARTCARD_ENABLED_OVERRIDDEN = 
"_smartcardEnabledOverridden"; //$NON-NLS-1$
@@ -53,7 +55,7 @@
         clientStorage.setLocalItem(keyMaker.make(SELECTED_PROTOCOL), 
selectedProtocol.toString());
 
         if (selectedProtocol == ConsoleProtocol.SPICE) {
-            storeSpiceData(asSpice(model), keyMaker);
+            storeSpiceData(model, keyMaker);
         } else if (selectedProtocol == ConsoleProtocol.RDP) {
             storeRdpData(asRdp(model), keyMaker);
         }
@@ -89,7 +91,13 @@
         return ((RdpConsoleModel) model.getAdditionalConsoleModel()).getrdp();
     }
 
-    protected void storeSpiceData(ISpice spice, KeyMaker keyMaker) {
+    protected void storeSpiceData(HasConsoleModel model, KeyMaker keyMaker) {
+        SpiceConsoleModel consoleModel = asSpiceConsoleModel(model);
+        ISpice spice = asSpice(model);
+
+        clientStorage.setLocalItem(keyMaker.make(SPICE_CLIENT_IMPLEMENTATION),
+                consoleModel.getClientConsoleMode().toString());
+
         storeBool(keyMaker.make(CTRL_ALT_DEL), spice.getSendCtrlAltDelete());
         storeBool(keyMaker.make(OPEN_IN_FULL_SCREEN), spice.isFullScreen());
         storeBool(keyMaker.make(SMARTCARD_ENABLED_OVERRIDDEN), 
spice.isSmartcardEnabledOverridden());
@@ -119,6 +127,12 @@
 
         model.setSelectedProtocol(ConsoleProtocol.SPICE);
 
+        try {
+            ClientConsoleMode consoleMode = 
ClientConsoleMode.valueOf(clientStorage.getLocalItem(keyMaker.make(SPICE_CLIENT_IMPLEMENTATION)));
+            asSpiceConsoleModel(model).setSpiceImplementation(consoleMode);
+        } catch (Exception e) {
+        }
+
         ISpice spice = asSpice(model);
 
         if (consoleUtils.isCtrlAltDelEnabled()) {
@@ -139,7 +153,11 @@
     }
 
     protected ISpice asSpice(HasConsoleModel model) {
-        return ((SpiceConsoleModel) model.getDefaultConsoleModel()).getspice();
+        return asSpiceConsoleModel(model).getspice();
+    }
+
+    protected SpiceConsoleModel asSpiceConsoleModel(HasConsoleModel model) {
+        return ((SpiceConsoleModel) model.getDefaultConsoleModel());
     }
 
     protected void storeRdpData(IRdp rdp, KeyMaker keyMaker) {
diff --git 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/utils/ConsoleUtilsImpl.java
 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/utils/ConsoleUtilsImpl.java
index 7aa164e..97c14fa 100644
--- 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/utils/ConsoleUtilsImpl.java
+++ 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/utils/ConsoleUtilsImpl.java
@@ -233,6 +233,10 @@
         return configurator.isSpiceProxyDefined();
     }
 
+    public boolean isBrowserPluginSupported() {
+        return configurator.isClientLinuxFirefox() || 
configurator.isClientWindowsExplorer();
+    }
+
     private native String getUserAgentString() /*-{
                                               var userAgent = 
navigator.userAgent;
                                               return userAgent;
diff --git 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/view/popup/ConsolePopupView.java
 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/view/popup/ConsolePopupView.java
index 80fdf0b..0ed1a50 100644
--- 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/view/popup/ConsolePopupView.java
+++ 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/view/popup/ConsolePopupView.java
@@ -14,6 +14,7 @@
 import org.ovirt.engine.ui.uicommonweb.models.ConsolePopupModel;
 import org.ovirt.engine.ui.uicommonweb.models.ConsoleProtocol;
 import org.ovirt.engine.ui.uicommonweb.models.vms.ConsoleModel;
+import 
org.ovirt.engine.ui.uicommonweb.models.vms.ConsoleModel.ClientConsoleMode;
 import org.ovirt.engine.ui.uicommonweb.models.vms.ISpice;
 import org.ovirt.engine.ui.uicommonweb.models.vms.RdpConsoleModel;
 import org.ovirt.engine.ui.uicommonweb.models.vms.SpiceConsoleModel;
@@ -61,6 +62,18 @@
     @UiField(provided = true)
     @WithElementId
     EntityModelRadioButtonEditor vncRadioButton;
+
+    @UiField(provided = true)
+    @WithElementId
+    EntityModelRadioButtonEditor spiceAutoImplRadioButton;
+
+    @UiField(provided = true)
+    @WithElementId
+    EntityModelRadioButtonEditor spiceNativeImplRadioButton;
+
+    @UiField(provided = true)
+    @WithElementId
+    EntityModelRadioButtonEditor spicePluginImplRadioButton;
 
     @UiField(provided = true)
     @WithElementId
@@ -116,6 +129,13 @@
 
         spiceRadioButton = new EntityModelRadioButtonEditor("1"); //$NON-NLS-1$
         spiceRadioButton.setLabel(constants.spice());
+
+        spiceAutoImplRadioButton = new EntityModelRadioButtonEditor("2"); 
//$NON-NLS-1$
+        spiceAutoImplRadioButton.setLabel(constants.spiceImplAuto());
+        spiceNativeImplRadioButton = new EntityModelRadioButtonEditor("2");// 
$NON-NLS-1$
+        spiceNativeImplRadioButton.setLabel(constants.spiceImplNative());
+        spicePluginImplRadioButton = new EntityModelRadioButtonEditor("2"); 
//$NON-NLS-1$
+        spicePluginImplRadioButton.setLabel(constants.spiceImplPlugin());
 
         disableSmartcard = new 
EntityModelValueCheckBoxEditor<ConsoleModel>(Align.RIGHT, new SpiceRenderer() {
 
@@ -286,12 +306,28 @@
 
         if (spiceRadioButton.asRadioButton().getValue()) {
             setSelectedProtocol(ConsoleProtocol.SPICE);
+            setSelectedSpiceImpl();
         } else if (remoteDesktopRadioButton.asRadioButton().getValue()) {
             setSelectedProtocol(ConsoleProtocol.RDP);
         } else if (vncRadioButton.asRadioButton().getValue()) {
             setSelectedProtocol(ConsoleProtocol.VNC);
         }
 
+    }
+
+    private void setSelectedSpiceImpl() {
+        SpiceConsoleModel spiceModel = null;
+        if (model.getModel().getDefaultConsoleModel() instanceof 
SpiceConsoleModel) {
+            spiceModel = (SpiceConsoleModel) 
model.getModel().getDefaultConsoleModel();
+        }
+
+        if (spiceAutoImplRadioButton.asRadioButton().getValue()) {
+            spiceModel.setSpiceImplementation(ClientConsoleMode.Auto);
+        } else if (spiceNativeImplRadioButton.asRadioButton().getValue()) {
+            spiceModel.setSpiceImplementation(ClientConsoleMode.Native);
+        } else if (spicePluginImplRadioButton.asRadioButton().getValue()) {
+            spiceModel.setSpiceImplementation(ClientConsoleMode.Plugin);
+        }
     }
 
     private void setSelectedProtocol(ConsoleProtocol selectedProtocol) {
@@ -439,4 +475,48 @@
         }
     }
 
+    @Override
+    public void setSpicePluginImplEnabled(boolean enabled, String reason) {
+        spicePluginImplRadioButton.setEnabled(enabled);
+        if (!enabled) {
+            spicePluginImplRadioButton.setTitle(reason);
+        }
+    }
+
+    @Override
+    public void selectSpiceImplementation(ClientConsoleMode consoleMode) {
+        switch (consoleMode) {
+        case Native:
+            spiceAutoImplRadioButton.asRadioButton().setValue(false);
+            spicePluginImplRadioButton.asRadioButton().setValue(false);
+            spiceNativeImplRadioButton.asRadioButton().setValue(true);
+            break;
+        case Plugin:
+            spiceAutoImplRadioButton.asRadioButton().setValue(false);
+            spicePluginImplRadioButton.asRadioButton().setValue(true);
+            spiceNativeImplRadioButton.asRadioButton().setValue(false);
+            break;
+        default:
+            spiceAutoImplRadioButton.asRadioButton().setValue(true);
+            spicePluginImplRadioButton.asRadioButton().setValue(false);
+            spiceNativeImplRadioButton.asRadioButton().setValue(false);
+            break;
+        }
+    }
+
+    @Override
+    public HasValueChangeHandlers<Boolean> getSpiceAutoImplRadioButton() {
+        return spiceAutoImplRadioButton.asRadioButton();
+    }
+
+    @Override
+    public HasValueChangeHandlers<Boolean> getSpiceNativeImplRadioButton() {
+        return spiceNativeImplRadioButton.asRadioButton();
+    }
+
+    @Override
+    public HasValueChangeHandlers<Boolean> getSpicePluginImplRadioButton() {
+        return spicePluginImplRadioButton.asRadioButton();
+    }
+
 }
diff --git 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/view/popup/ConsolePopupView.ui.xml
 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/view/popup/ConsolePopupView.ui.xml
index a2d4159..ee810d0 100644
--- 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/view/popup/ConsolePopupView.ui.xml
+++ 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/view/popup/ConsolePopupView.ui.xml
@@ -43,6 +43,9 @@
 
                                <g:FlowPanel ui:field="spicePanel" 
addStyleNames="{style.fullWidth}">
                                        <g:Label ui:field="spiceTitle" 
text="{constants.spiceOptions}" addStyleNames="{style.labelStyle}" />
+                                       <e:EntityModelRadioButtonEditor 
ui:field="spiceAutoImplRadioButton" />
+                                       <e:EntityModelRadioButtonEditor 
ui:field="spiceNativeImplRadioButton" />
+                                       <e:EntityModelRadioButtonEditor 
ui:field="spicePluginImplRadioButton" />
                                        <w:EntityModelValueCheckBoxEditor 
ui:field="ctrlAltDel" />
                                        <w:EntityModelValueCheckBoxEditor 
ui:field="enableUsbAutoshare" />
                                        <w:EntityModelValueCheckBoxEditor 
ui:field="openInFullScreen" />
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/ConsoleUtils.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/ConsoleUtils.java
index bb44800..c1d1969 100644
--- 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/ConsoleUtils.java
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/ConsoleUtils.java
@@ -36,5 +36,7 @@
 
     public boolean isWanOptionsAvailable(HasConsoleModel item);
 
+    public boolean isBrowserPluginSupported();
+
     public boolean isSpiceProxyDefined();
 }
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/SpiceConsoleModel.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/SpiceConsoleModel.java
index d053a19..c35443c 100644
--- 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/SpiceConsoleModel.java
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/SpiceConsoleModel.java
@@ -64,12 +64,12 @@
     private ISpice privatespice;
     private ClientConsoleMode consoleMode;
 
-    public ISpice getspice() {
-        return privatespice;
-    }
-
     public void setspice(ISpice value) {
         privatespice = value;
+    }
+
+    public ClientConsoleMode getClientConsoleMode() {
+        return consoleMode;
     }
 
     static {
@@ -83,10 +83,16 @@
 
     public SpiceConsoleModel() {
         setTitle(ConstantsManager.getInstance().getConstants().spiceTitle());
-        setSpiceImplementation();
+
+        setSpiceImplementation(
+                ClientConsoleMode.valueOf((String) 
AsyncDataProvider.GetConfigValuePreConverted(ConfigurationValues.ClientConsoleModeDefault)));
         getConfigurator().Configure(getspice());
 
         getspice().getConnectedEvent().addListener(this);
+    }
+
+    public ISpice getspice() {
+        return privatespice;
     }
 
     /**
@@ -99,9 +105,8 @@
      * installed).
      *
      */
-    private void setSpiceImplementation() {
-        consoleMode =
-                ClientConsoleMode.valueOf((String) 
AsyncDataProvider.GetConfigValuePreConverted(ConfigurationValues.ClientConsoleModeDefault));
+    public void setSpiceImplementation(ClientConsoleMode consoleMode) {
+        this.consoleMode = consoleMode;
 
         switch (consoleMode) {
             case Native:


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

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ib9fdc00931e3b25858b792b47339b3c5ab4a954c
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Frank Kobzik <fkob...@redhat.com>
_______________________________________________
Engine-patches mailing list
Engine-patches@ovirt.org
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to