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
