Vitor de Lima has uploaded a new change for review.

Change subject: core, engine, webadmin: Retrieve Capabilities for each 
Architecture
......................................................................

core, engine, webadmin: Retrieve Capabilities for each Architecture

This change introduces code to determine if a certain processor
architecture supports live migration, memory snapshots or suspension.
This is used in changes #21522, #21523, #21657, #21658, #21643, #21644,
#24015 and #24016 to block unsupported features in the ppc64
architecture.

Change-Id: Ied1a97f5bdd42382f0dc832a3fe3abd56d3c89dd
Bug-Url: https://bugzilla.redhat.com/show_bug.cgi?id=1057178
Signed-off-by: Vitor de Lima <[email protected]>
---
A 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/GetArchitectureCapabilitiesQuery.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/FeatureSupported.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/config/ConfigValues.java
A 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/ArchCapabilitiesParameters.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/ConfigurationValues.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java
M 
backend/manager/modules/restapi/interface/definition/src/main/resources/api.xsd
M 
backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendCapabilitiesResource.java
M 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/dataprovider/AsyncDataProvider.java
M packaging/dbscripts/upgrade/pre_upgrade/0000_config.sql
10 files changed, 312 insertions(+), 1 deletion(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/45/25045/1

diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/GetArchitectureCapabilitiesQuery.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/GetArchitectureCapabilitiesQuery.java
new file mode 100644
index 0000000..62b412f
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/GetArchitectureCapabilitiesQuery.java
@@ -0,0 +1,75 @@
+package org.ovirt.engine.core.bll;
+
+import java.util.EnumMap;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.ovirt.engine.core.common.FeatureSupported;
+import org.ovirt.engine.core.common.businessentities.ArchitectureType;
+import org.ovirt.engine.core.common.queries.ArchCapabilitiesParameters;
+import 
org.ovirt.engine.core.common.queries.ArchCapabilitiesParameters.ArchCapabilitiesVerb;
+import org.ovirt.engine.core.compat.Version;
+
+public class GetArchitectureCapabilitiesQuery<P extends 
ArchCapabilitiesParameters> extends QueriesCommandBase<P> {
+
+    private static final Map<ArchCapabilitiesVerb, Map<ArchitectureType, 
Map<Version, Boolean>>> verbMap =
+            new EnumMap<ArchCapabilitiesVerb, Map<ArchitectureType, 
Map<Version, Boolean>>>(ArchCapabilitiesVerb.class);
+
+    public GetArchitectureCapabilitiesQuery(P parameters) {
+        super(parameters);
+    }
+
+    @Override
+    protected void executeQueryCommand() {
+        setReturnValue(getMap(getParameters().getArchCapabilitiesVerb()));
+    }
+
+    private synchronized Map<ArchitectureType, Map<Version, Boolean>> 
getMap(ArchCapabilitiesVerb archCapabilitiesVerb) {
+
+        if (verbMap.containsKey(archCapabilitiesVerb)) {
+            return verbMap.get(archCapabilitiesVerb);
+        } else {
+            Map<ArchitectureType, Map<Version, Boolean>> supportMap =
+                    new EnumMap<ArchitectureType, Map<Version, 
Boolean>>(ArchitectureType.class);
+
+            for (ArchitectureType arch : ArchitectureType.values()) {
+                Map<Version, Boolean> archMap = new HashMap<Version, 
Boolean>();
+
+                for (Version version : Version.ALL) {
+                    boolean isSupported = isSupported(archCapabilitiesVerb, 
arch, version);
+
+                    archMap.put(version, isSupported);
+                }
+
+                supportMap.put(arch, archMap);
+            }
+
+            verbMap.put(archCapabilitiesVerb, supportMap);
+
+            return supportMap;
+        }
+    }
+
+    /**
+     * Checks if a feature is supported
+     *
+     * @param archCapabilitiesVerb
+     *            The feature
+     * @param architecture
+     *            The CPU Architecture
+     * @param version
+     *            The cluster compatibility version
+     * @return
+     */
+    private boolean isSupported(ArchCapabilitiesVerb archCapabilitiesVerb, 
ArchitectureType architecture, Version version) {
+        switch (archCapabilitiesVerb) {
+        case GetMigrationSupport:
+            return FeatureSupported.isMigrationSupported(architecture, 
version);
+        case GetMemorySnapshotSupport:
+            return 
FeatureSupported.isMemorySnapshotSupportedByArchitecture(architecture, version);
+        case GetSuspendSupport:
+            return 
FeatureSupported.isSuspendSupportedByArchitecture(architecture, version);
+        }
+        return false;
+    }
+}
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/FeatureSupported.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/FeatureSupported.java
index cccdaa6..04c5fe2 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/FeatureSupported.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/FeatureSupported.java
@@ -220,4 +220,43 @@
     public static boolean getFileStats(Version version) {
         return supportedInConfig(ConfigValues.GetFileStats, version);
     }
+
+    /**
+     * Checks if migration is supported by the given CPU architecture
+     *
+     * @param architecture
+     *            The CPU architecture
+     * @param version
+     *            Compatibility version to check for.
+     * @return
+     */
+    public static boolean isMigrationSupported(ArchitectureType architecture, 
Version version) {
+        return supportedInConfig(ConfigValues.IsMigrationSupported, version, 
architecture);
+    }
+
+    /**
+     * Checks if memory snapshot is supported by architecture
+     *
+     * @param architecture
+     *            The CPU architecture
+     * @param version
+     *            Compatibility version to check for.
+     * @return
+     */
+    public static boolean 
isMemorySnapshotSupportedByArchitecture(ArchitectureType architecture, Version 
version) {
+        return supportedInConfig(ConfigValues.IsMemorySnapshotSupported, 
version, architecture);
+    }
+
+    /**
+     * Checks if suspend is supported by architecture
+     *
+     * @param architecture
+     *            The CPU architecture
+     * @param version
+     *            Compatibility version to check for.
+     * @return
+     */
+    public static boolean isSuspendSupportedByArchitecture(ArchitectureType 
architecture, Version version) {
+        return supportedInConfig(ConfigValues.IsSuspendSupported, version, 
architecture);
+    }
 }
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 757c36b..142799c 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
@@ -1631,5 +1631,17 @@
     @DefaultValueAttribute("true")
     GetFileStats,
 
+    @TypeConverterAttribute(Map.class)
+    
@DefaultValueAttribute("{\"undefined\":\"true\",\"x86_64\":\"true\",\"ppc64\":\"false\"}")
+    IsMigrationSupported,
+
+    @TypeConverterAttribute(Map.class)
+    
@DefaultValueAttribute("{\"undefined\":\"true\",\"x86_64\":\"true\",\"ppc64\":\"false\"}")
+    IsMemorySnapshotSupported,
+
+    @TypeConverterAttribute(Map.class)
+    
@DefaultValueAttribute("{\"undefined\":\"true\",\"x86_64\":\"true\",\"ppc64\":\"false\"}")
+    IsSuspendSupported,
+
     Invalid;
 }
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/ArchCapabilitiesParameters.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/ArchCapabilitiesParameters.java
new file mode 100644
index 0000000..160ca1f
--- /dev/null
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/ArchCapabilitiesParameters.java
@@ -0,0 +1,26 @@
+package org.ovirt.engine.core.common.queries;
+
+public class ArchCapabilitiesParameters extends VdcQueryParametersBase {
+
+    private static final long serialVersionUID = -7091068258018831149L;
+
+    private ArchCapabilitiesVerb archCapabilitiesVerb;
+
+    public ArchCapabilitiesParameters() {
+
+    }
+
+    public ArchCapabilitiesParameters(ArchCapabilitiesVerb verb) {
+        this.archCapabilitiesVerb = verb;
+    }
+
+    public ArchCapabilitiesVerb getArchCapabilitiesVerb() {
+        return archCapabilitiesVerb;
+    }
+
+    public enum ArchCapabilitiesVerb {
+        GetMigrationSupport,
+        GetMemorySnapshotSupport,
+        GetSuspendSupport
+    }
+}
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 108f45e..b0310ab 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
@@ -114,7 +114,10 @@
     SchedulerAllowOverBooking,
     SchedulerOverBookingThreshold,
     UserSessionTimeOutInterval(ConfigAuthType.User),
-    DefaultMaximumMigrationDowntime;
+    DefaultMaximumMigrationDowntime,
+    IsMigrationSupported(ConfigAuthType.User),
+    IsMemorySnapshotSupported(ConfigAuthType.User),
+    IsSuspendSupported(ConfigAuthType.User);
 
     public static enum ConfigAuthType {
         Admin,
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java
index cbc567d..d0afd57 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java
@@ -290,6 +290,7 @@
 
     GetDefaultConfigurationVersion(VdcQueryAuthType.User),
     OsRepository(VdcQueryAuthType.User),
+    GetArchitectureCapabilities(VdcQueryAuthType.User),
 
     // Providers
     GetAllProviders,
diff --git 
a/backend/manager/modules/restapi/interface/definition/src/main/resources/api.xsd
 
b/backend/manager/modules/restapi/interface/definition/src/main/resources/api.xsd
index a849751..4551f89 100644
--- 
a/backend/manager/modules/restapi/interface/definition/src/main/resources/api.xsd
+++ 
b/backend/manager/modules/restapi/interface/definition/src/main/resources/api.xsd
@@ -631,6 +631,7 @@
           <xs:element ref="hook_states" minOccurs="0" />
           <xs:element ref="stages" minOccurs="0" />
           <xs:element ref="sso_methods" minOccurs="0"/>
+          <xs:element ref="architecture_capabilities" minOccurs="0"/>
         </xs:sequence>
       </xs:extension>
     </xs:complexContent>
@@ -1044,6 +1045,37 @@
     </xs:sequence>
   </xs:complexType>
 
+  <!-- Architecture Capabilities -->
+
+  <xs:element name="architecture_feature" type="ArchitectureFeature"/>
+
+  <xs:complexType name="ArchitectureFeature">
+    <xs:sequence>
+      <xs:element name="name" type="xs:string" minOccurs="1" maxOccurs="1"/>
+
+      <xs:element name="architectures" type="xs:string" minOccurs="0" 
maxOccurs="unbounded">
+        <xs:annotation>
+          <xs:appinfo>
+            <jaxb:property name="Architectures"/>
+          </xs:appinfo>
+        </xs:annotation>
+      </xs:element>
+    </xs:sequence>
+  </xs:complexType>
+
+  <xs:element name="architecture_capabilities" 
type="ArchitectureCapabilities"/>
+
+  <xs:complexType name="ArchitectureCapabilities">
+    <xs:sequence>
+      <xs:annotation>
+        <xs:appinfo>
+            <jaxb:property name="Capabilities"/>
+        </xs:appinfo>
+      </xs:annotation>
+      <xs:element ref="architecture_feature" maxOccurs="unbounded"/>
+    </xs:sequence>
+  </xs:complexType>
+
   <!-- Common to all resources -->
 
   <xs:complexType name="ActionableResource">
diff --git 
a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendCapabilitiesResource.java
 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendCapabilitiesResource.java
index 90bcf98..13b1ee1 100644
--- 
a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendCapabilitiesResource.java
+++ 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendCapabilitiesResource.java
@@ -5,6 +5,8 @@
 import java.util.Set;
 
 import org.ovirt.engine.api.common.util.LinkHelper;
+import org.ovirt.engine.api.model.ArchitectureCapabilities;
+import org.ovirt.engine.api.model.ArchitectureFeature;
 import org.ovirt.engine.api.model.BootDevice;
 import org.ovirt.engine.api.model.BootDevices;
 import org.ovirt.engine.api.model.BootProtocol;
@@ -119,6 +121,8 @@
 import org.ovirt.engine.api.restapi.util.VersionHelper;
 import org.ovirt.engine.api.restapi.utils.CustomPropertiesParser;
 import org.ovirt.engine.api.restapi.utils.VersionUtils;
+import org.ovirt.engine.core.common.FeatureSupported;
+import org.ovirt.engine.core.common.businessentities.ArchitectureType;
 import org.ovirt.engine.core.common.businessentities.NonOperationalReason;
 import org.ovirt.engine.core.common.businessentities.ServerCpu;
 import org.ovirt.engine.core.common.businessentities.VmPauseStatus;
@@ -248,6 +252,7 @@
         addConfigurationTypes(version, ConfigurationType.values());
         addSnapshotStatuses(version, SnapshotStatus.values());
         addPayloadEncodings(version, PayloadEncoding.values());
+        addArchitectureCapabilities(version);
 
         // External tasks types
         addStepEnumTypes(version, StepEnum.values());
@@ -266,6 +271,49 @@
         return version;
     }
 
+    private void addArchitectureCapabilities(VersionCaps version) {
+        org.ovirt.engine.core.compat.Version backendVersion =
+                new org.ovirt.engine.core.compat.Version(version.getMajor(), 
version.getMinor());
+
+        version.setArchitectureCapabilities(new ArchitectureCapabilities());
+
+        ArchitectureFeature migrationFeature = new ArchitectureFeature();
+
+        migrationFeature.setName("migration");
+
+        for (ArchitectureType arch : ArchitectureType.values()) {
+            if (FeatureSupported.isMigrationSupported(arch, backendVersion)) {
+                migrationFeature.getArchitectures().add(arch.name());
+            }
+        }
+
+        
version.getArchitectureCapabilities().getCapabilities().add(migrationFeature);
+
+        ArchitectureFeature memorySnapshotFeature = new ArchitectureFeature();
+
+        memorySnapshotFeature.setName("memory snapshot");
+
+        for (ArchitectureType arch : ArchitectureType.values()) {
+            if (FeatureSupported.isMemorySnapshotSupportedByArchitecture(arch, 
backendVersion)) {
+                memorySnapshotFeature.getArchitectures().add(arch.name());
+            }
+        }
+
+        
version.getArchitectureCapabilities().getCapabilities().add(memorySnapshotFeature);
+
+        ArchitectureFeature suspendFeature = new ArchitectureFeature();
+
+        suspendFeature.setName("suspend");
+
+        for (ArchitectureType arch : ArchitectureType.values()) {
+            if (FeatureSupported.isSuspendSupportedByArchitecture(arch, 
backendVersion)) {
+                suspendFeature.getArchitectures().add(arch.name());
+            }
+        }
+
+        
version.getArchitectureCapabilities().getCapabilities().add(suspendFeature);
+    }
+
     private void addSnapshotStatuses(VersionCaps version, SnapshotStatus[] 
values) {
         if (VersionUtils.greaterOrEqual(version, VERSION_3_2)) {
             version.setSnapshotStatuses(new SnapshotStatuses());
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/dataprovider/AsyncDataProvider.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/dataprovider/AsyncDataProvider.java
index 56376e6..2d55a49 100644
--- 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/dataprovider/AsyncDataProvider.java
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/dataprovider/AsyncDataProvider.java
@@ -80,6 +80,8 @@
 import 
org.ovirt.engine.core.common.businessentities.network.ExternalSubnet.IpVersion;
 import org.ovirt.engine.core.common.interfaces.SearchType;
 import org.ovirt.engine.core.common.mode.ApplicationMode;
+import org.ovirt.engine.core.common.queries.ArchCapabilitiesParameters;
+import 
org.ovirt.engine.core.common.queries.ArchCapabilitiesParameters.ArchCapabilitiesVerb;
 import org.ovirt.engine.core.common.queries.CommandVersionsInfo;
 import org.ovirt.engine.core.common.queries.ConfigurationValues;
 import 
org.ovirt.engine.core.common.queries.GetAgentFenceOptionsQueryParameters;
@@ -197,6 +199,15 @@
     // cached os's support for display types (given compatibility version)
     private static Map<Integer, Map<Version, List<DisplayType>>> displayTypes;
 
+    // cached architecture support for live migration
+    private static Map<ArchitectureType, Map<Version, Boolean>> 
migrationSupport;
+
+    // cached architecture support for memory snapshot
+    private static Map<ArchitectureType, Map<Version, Boolean>> 
memorySnapshotSupport;
+
+    // cached architecture support for VM suspend
+    private static Map<ArchitectureType, Map<Version, Boolean>> suspendSupport;
+
     public static String getDefaultConfigurationVersion() {
         return _defaultConfigurationVersion;
     }
@@ -238,6 +249,9 @@
         initDiskHotpluggableInterfacesMap();
         initOsArchitecture();
         initDefaultOSes();
+        initMigrationSupportMap();
+        initMemorySnapshotSupportMap();
+        initSuspendSupportMap();
     }
 
     public static void initDefaultOSes() {
@@ -253,6 +267,57 @@
                 OsRepositoryVerb.GetDefaultOSes), callback);
     }
 
+    public static Boolean isMigrationSupported(ArchitectureType architecture, 
Version version) {
+        return migrationSupport.get(architecture).get(version);
+    }
+
+    public static Boolean 
isMemorySnapshotSupportedByArchitecture(ArchitectureType architecture, Version 
version) {
+        return memorySnapshotSupport.get(architecture).get(version);
+    }
+
+    public static Boolean isSuspendSupportedByArchitecture(ArchitectureType 
architecture, Version version) {
+        return suspendSupport.get(architecture).get(version);
+    }
+
+    private static void initMigrationSupportMap() {
+        AsyncQuery callback = new AsyncQuery();
+        callback.asyncCallback = new INewAsyncCallback() {
+            @Override
+            public void onSuccess(Object model, Object returnValue) {
+                migrationSupport = ((VdcQueryReturnValue) 
returnValue).getReturnValue();
+            }
+        };
+        
Frontend.getInstance().runQuery(VdcQueryType.GetArchitectureCapabilities,
+                new 
ArchCapabilitiesParameters(ArchCapabilitiesVerb.GetMigrationSupport),
+                callback);
+    }
+
+    private static void initMemorySnapshotSupportMap() {
+        AsyncQuery callback = new AsyncQuery();
+        callback.asyncCallback = new INewAsyncCallback() {
+            @Override
+            public void onSuccess(Object model, Object returnValue) {
+                memorySnapshotSupport = ((VdcQueryReturnValue) 
returnValue).getReturnValue();
+            }
+        };
+        
Frontend.getInstance().runQuery(VdcQueryType.GetArchitectureCapabilities,
+                new 
ArchCapabilitiesParameters(ArchCapabilitiesVerb.GetMemorySnapshotSupport),
+                callback);
+    }
+
+    private static void initSuspendSupportMap() {
+        AsyncQuery callback = new AsyncQuery();
+        callback.asyncCallback = new INewAsyncCallback() {
+            @Override
+            public void onSuccess(Object model, Object returnValue) {
+                suspendSupport = ((VdcQueryReturnValue) 
returnValue).getReturnValue();
+            }
+        };
+        
Frontend.getInstance().runQuery(VdcQueryType.GetArchitectureCapabilities,
+                new 
ArchCapabilitiesParameters(ArchCapabilitiesVerb.GetSuspendSupport),
+                callback);
+    }
+
     public static void initNicHotplugSupportMap() {
         AsyncQuery callback = new AsyncQuery();
         callback.asyncCallback = new INewAsyncCallback() {
diff --git a/packaging/dbscripts/upgrade/pre_upgrade/0000_config.sql 
b/packaging/dbscripts/upgrade/pre_upgrade/0000_config.sql
index 85c7d9a..5e8f9d4 100644
--- a/packaging/dbscripts/upgrade/pre_upgrade/0000_config.sql
+++ b/packaging/dbscripts/upgrade/pre_upgrade/0000_config.sql
@@ -164,6 +164,16 @@
 select 
fn_db_add_config_value('HotPlugCpuEnabled','{\"x86_64\":\"false\",\"ppc64\":\"false\"}','3.2');
 select 
fn_db_add_config_value('HotPlugCpuEnabled','{\"x86_64\":\"false\",\"ppc64\":\"false\"}','3.3');
 select 
fn_db_add_config_value('HotPlugCpuEnabled','{\"x86_64\":\"true\",\"ppc64\":\"false\"}','3.4');
+
+-- migration support per architecture
+select fn_db_add_config_value('IsMigrationSupported','{"undefined": "true", 
"x86_64": "true", "ppc64" : "false" }','general');
+
+-- snapshot support per architecture
+select fn_db_add_config_value('IsMemorySnapshotSupported','{"undefined": 
"true", "x86_64": "true", "ppc64" : "false" }','general');
+
+-- suspend support per architecture
+select fn_db_add_config_value('IsSuspendSupported','{"undefined": "true", 
"x86_64": "true", "ppc64" : "false" }','general');
+
 select fn_db_add_config_value('MigrationSupportForNativeUsb','false','3.0');
 select fn_db_add_config_value('MigrationSupportForNativeUsb','false','3.1');
 select fn_db_add_config_value('NetworkLinkingSupported','false','3.0');


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

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ied1a97f5bdd42382f0dc832a3fe3abd56d3c89dd
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: ovirt-engine-3.4
Gerrit-Owner: Vitor de Lima <[email protected]>
_______________________________________________
Engine-patches mailing list
[email protected]
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to