Roy Golan has uploaded a new change for review. Change subject: core: Hot set number of CPUs using update VM ......................................................................
core: Hot set number of CPUs using update VM Hot plug and unplug a CPU to a running VM * allow editing the number of cpus when the VM is UP * if the VM is up and Version is > 3.3 call VDSM's setNumberOfCpus * audit log on success, failure wiki: http://www.ovirt.org/Hot_plug_cpu Bug-url: https://bugzilla.redhat.com/show_bug.cgi?id=1036777 Change-Id: I464a3dda5f143d1fcef63fd903eb615b01efe081 Signed-off-by: Roy Golan <[email protected]> --- A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/HotSetNumberOfCpusCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateVmCommand.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/AuditLogType.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/action/VdcActionType.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VmBase.java 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/errors/VdcBllErrors.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.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/vdscommands/VDSCommandType.java M backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dal/dbbroker/auditloghandling/AuditLogDirector.java M backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties M backend/manager/modules/dal/src/main/resources/bundles/AuditLogMessages.properties A backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/SetNumberOfCpusVDSCommand.java M backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/BrokerCommandBase.java M backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/IVdsServer.java M backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsProperties.java M backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerConnector.java M backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerWrapper.java M backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VmInfoBuilderBase.java M packaging/dbscripts/upgrade/pre_upgrade/0000_config.sql 22 files changed, 219 insertions(+), 3 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/77/23477/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/HotSetNumberOfCpusCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/HotSetNumberOfCpusCommand.java new file mode 100644 index 0000000..aeb2732 --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/HotSetNumberOfCpusCommand.java @@ -0,0 +1,94 @@ +package org.ovirt.engine.core.bll; + +import org.ovirt.engine.core.bll.scheduling.SlaValidator; +import org.ovirt.engine.core.bll.validator.LocalizedVmStatus; +import org.ovirt.engine.core.common.AuditLogType; +import org.ovirt.engine.core.common.FeatureSupported; +import org.ovirt.engine.core.common.action.VmManagementParametersBase; +import org.ovirt.engine.core.common.businessentities.VMStatus; +import org.ovirt.engine.core.common.errors.VdcBllMessages; +import org.ovirt.engine.core.common.errors.VdcFault; +import org.ovirt.engine.core.common.vdscommands.VDSCommandType; +import org.ovirt.engine.core.common.vdscommands.VDSReturnValue; +import org.ovirt.engine.core.vdsbroker.SetNumberOfCpusVDSCommand; + +/** + * Set the number of CPU of a running VM also called hot plug or hot unplug, hot add, hot remove. + * This command behaviour varies between OS implementation. To that matter, the parameter of the desired + * number of CPUs will manifest as a hot plug or unplug, depending on the current cpu count at the Guest level. + * + * The execute will never throw an exception. it will rather wrap a return value in case of failure. + */ +@NonTransactiveCommandAttribute +public class HotSetNumberOfCpusCommand<T extends VmManagementParametersBase> extends VmManagementCommandBase<T> { + + public static final String LOGABLE_FIELD_NUMBER_OF_CPUS = "numberOfCpus"; + public static final String LOGABLE_FIELD_ERROR_MESSAGE = "ErrorMessage"; + + public HotSetNumberOfCpusCommand(T parameters) { + super(parameters); + } + + @Override + protected boolean canDoAction() { + boolean canDo = true; + if (getVm() == null) { + return failCanDoAction(VdcBllMessages.ACTION_TYPE_FAILED_VM_NOT_EXIST); + } + if (getVm().getStatus() != VMStatus.Up) { + canDo = failCanDoAction(VdcBllMessages.ACTION_TYPE_FAILED_VM_STATUS_ILLEGAL, + LocalizedVmStatus.from(getVm().getStatus())); + } + if (getParameters().getVm().getNumOfCpus() > SlaValidator.getEffectiveCpuCores(getVds())) { + canDo = failCanDoAction(VdcBllMessages.ACTION_TYPE_FAILED_VDS_VM_CPUS); + } + if (!FeatureSupported.hotPlugCpu(getVm().getVdsGroupCompatibilityVersion(), getVm().getClusterArch())) { + canDo = failCanDoAction(VdcBllMessages.HOT_PLUG_IS_NOT_SUPPORTED); + } + + return canDo; + } + + /** + * Execution shall perform a call to VDSM to set the number of CPUs. + * The guest OS will plug/unplug CPUs if the current guest configuration is lower/higher than + * the requested number respectively. + */ + @Override + protected void executeCommand() { + VDSReturnValue vdsReturnValue = runVdsCommand(VDSCommandType.SetNumberOfCpus, + new SetNumberOfCpusVDSCommand.Params( + getVm().getRunOnVds(), + getVm().getId(), + getParameters().getVm().getNumOfCpus())); + + if (vdsReturnValue.getSucceeded()) { + setSucceeded(true); + } else { + VdcFault fault = new VdcFault(); + fault.setError(vdsReturnValue.getVdsError().getCode()); + fault.setMessage(vdsReturnValue.getVdsError().getMessage()); + getReturnValue().setFault(fault); + } + + } + + @Override + public AuditLogType getAuditLogTypeValue() { + addCustomValue(LOGABLE_FIELD_NUMBER_OF_CPUS, String.valueOf(getParameters().getVm().getNumOfCpus())); + + if (getSucceeded()) { + return AuditLogType.HOT_SET_NUMBER_OF_CPUS; + } else { + addCustomValue(LOGABLE_FIELD_ERROR_MESSAGE, getReturnValue().getFault().getMessage()); + return AuditLogType.FAILED_HOT_SET_NUMBER_OF_CPUS; + } + + } + + @Override + protected void setActionMessageParameters() { + addCanDoActionMessage(VdcBllMessages.VAR__ACTION__HOT_SET_CPUS); + addCanDoActionMessage(VdcBllMessages.VAR__TYPE__VM); + } +} diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateVmCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateVmCommand.java index e77ae9a..987de31 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateVmCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateVmCommand.java @@ -21,6 +21,7 @@ import org.ovirt.engine.core.common.FeatureSupported; import org.ovirt.engine.core.common.VdcObjectType; import org.ovirt.engine.core.common.action.VdcActionType; +import org.ovirt.engine.core.common.action.VdcReturnValueBase; import org.ovirt.engine.core.common.action.VmManagementParametersBase; import org.ovirt.engine.core.common.action.WatchdogParameters; import org.ovirt.engine.core.common.businessentities.ActionGroup; @@ -28,6 +29,7 @@ import org.ovirt.engine.core.common.businessentities.DiskInterface; import org.ovirt.engine.core.common.businessentities.MigrationSupport; import org.ovirt.engine.core.common.businessentities.VM; +import org.ovirt.engine.core.common.businessentities.VMStatus; import org.ovirt.engine.core.common.businessentities.VmDevice; import org.ovirt.engine.core.common.businessentities.VmDeviceGeneralType; import org.ovirt.engine.core.common.businessentities.VmDeviceId; @@ -60,6 +62,8 @@ implements QuotaVdsDependent, RenamedEntityInfoProvider{ private VM oldVm; private boolean quotaSanityOnly = false; + private VmStatic newVmStatic; + private VdcReturnValueBase setNumberOfCpusResult; public UpdateVmCommand(T parameters) { super(parameters); @@ -83,18 +87,41 @@ oldVm = getVm(); VmHandler.warnMemorySizeLegal(getParameters().getVm().getStaticData(), getVdsGroup().getcompatibility_version()); getVmStaticDAO().incrementDbGeneration(getVm().getId()); - VmStatic newVmStatic = getParameters().getVmStaticData(); + newVmStatic = getParameters().getVmStaticData(); newVmStatic.setCreationDate(oldVm.getStaticData().getCreationDate()); if (newVmStatic.getCreationDate().equals(DateTime.getMinValue())) { newVmStatic.setCreationDate(new Date()); } UpdateVmNetworks(); + hotSetCpus(); getVmStaticDAO().update(newVmStatic); updateVmPayload(); VmDeviceUtils.updateVmDevices(getParameters(), oldVm); updateWatchdog(); checkTrustedService(); setSucceeded(true); + } + + private void hotSetCpus() { + int currentSockets = getVm().getNumOfSockets(); + int newSockets = newVmStatic.getNumOfSockets(); + + if (getVm().getStatus() == VMStatus.Up && currentSockets != newSockets) { + setNumberOfCpusResult = getBackend().runInternalAction( + VdcActionType.HotSetNumberOfCpus, new VmManagementParametersBase(newVmStatic)); + newVmStatic.setNumOfSockets(setNumberOfCpusResult.getSucceeded() ? newSockets : currentSockets); + auditLogHotSetCpusCandos(); + } + } + + private void auditLogHotSetCpusCandos() { + if (!setNumberOfCpusResult.getCanDoAction()) { + AuditLogableBase logable = new HotSetNumberOfCpusCommand<>(new VmManagementParametersBase(newVmStatic)); + List<String> canDos = getBackend().getErrorsTranslator(). + TranslateErrorText(setNumberOfCpusResult.getCanDoActionMessages()); + logable.addCustomValue(HotSetNumberOfCpusCommand.LOGABLE_FIELD_ERROR_MESSAGE, StringUtils.join(canDos, ",")); + AuditLogDirector.log(logable, AuditLogType.FAILED_HOT_SET_NUMBER_OF_CPUS); + } } private void checkTrustedService() { @@ -199,6 +226,7 @@ } } + @Override protected List<Class<?>> getValidationGroups() { addValidationGroup(UpdateEntity.class); diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/AuditLogType.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/AuditLogType.java index 9bf4842..f818873 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/AuditLogType.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/AuditLogType.java @@ -197,6 +197,8 @@ USER_EXPORT_IMAGE(2030), USER_EXPORT_IMAGE_FINISHED_SUCCESS(2031), USER_EXPORT_IMAGE_FINISHED_FAILURE(2032), + HOT_SET_NUMBER_OF_CPUS(2033), + FAILED_HOT_SET_NUMBER_OF_CPUS(2034), // Used only from SQL script, therefor should not have severity & message USER_RUN_UNLOCK_ENTITY_SCRIPT(2024), 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 7c64e04..d715ad2 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 @@ -1,8 +1,11 @@ package org.ovirt.engine.core.common; +import org.ovirt.engine.core.common.businessentities.ArchitectureType; import org.ovirt.engine.core.common.config.Config; import org.ovirt.engine.core.common.config.ConfigValues; import org.ovirt.engine.core.compat.Version; + +import java.util.Map; /** * Convenience class to check if a feature is supported or not in any given version.<br> @@ -12,6 +15,11 @@ public static boolean supportedInConfig(ConfigValues feature, Version version) { return Config.<Boolean> getValue(feature, version.getValue()); + } + + public static boolean supportedInConfig(ConfigValues feature, Version version, ArchitectureType arch) { + return Boolean.parseBoolean( + ((Map<String, String>) Config.<Map>getValue(feature, version.getValue())).get(arch.name())); } /** @@ -199,4 +207,8 @@ public static boolean hotPlugDiskSnapshot(Version version) { return supportedInConfig(ConfigValues.HotPlugDiskSnapshotSupported, version); } + + public static boolean hotPlugCpu(Version version, ArchitectureType arch) { + return supportedInConfig(ConfigValues.HotPlugCpuSupported, version, arch); + } } diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java index 22b2421..cf253f0 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java @@ -41,6 +41,7 @@ DetachDiskFromVm(181, ActionGroup.CONFIGURE_VM_STORAGE, false, QuotaDependency.NONE), HotPlugDiskToVm(182, ActionGroup.CONFIGURE_VM_STORAGE, false, QuotaDependency.NONE), HotUnPlugDiskFromVm(183, ActionGroup.CONFIGURE_VM_STORAGE, false, QuotaDependency.NONE), + HotSetNumberOfCpus(184, ActionGroup.EDIT_VM_PROPERTIES, false, QuotaDependency.NONE), ChangeFloppy(35, QuotaDependency.NONE), ImportVm(36, ActionGroup.IMPORT_EXPORT_VM, QuotaDependency.STORAGE), RemoveVmFromImportExport(37, ActionGroup.DELETE_VM, QuotaDependency.NONE), diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VmBase.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VmBase.java index b56f729..9ec7776 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VmBase.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VmBase.java @@ -67,7 +67,7 @@ @EditableOnTemplate private int memSizeMb; - @EditableOnVmStatusField + @EditableOnVmStatusField(statuses = {VMStatus.Down, VMStatus.Up} ) @EditableOnTemplate private int numOfSockets; 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 1aab2da..3f7f746 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 @@ -1615,5 +1615,9 @@ @DefaultValueAttribute("0") DefaultMaximumMigrationDowntime, + @TypeConverterAttribute(Map.class) + @DefaultValueAttribute("{\"x86_64\":\"true\",\"ppc64\":\"false\"}") + HotPlugCpuSupported, + Invalid; } diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllErrors.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllErrors.java index 8dc6d51..1eb3f70 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllErrors.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllErrors.java @@ -55,6 +55,7 @@ UpdateDevice(56), hwInfoErr(57), ResizeErr(58), + HOT_PLUG_UNPLUG_CPU_ERROR(60), recovery(99), GeneralException(100), StorageException(200), diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java index 76d94fc..d013143 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java @@ -101,6 +101,7 @@ VAR__ACTION__EXTEND_IMAGE_SIZE, VAR__ACTION__REMOVE_BRICKS_STOP, VAR__ACTION__REMOVE_BRICKS_COMMIT, + VAR__ACTION__HOT_SET_CPUS, // Host statuses replacements VAR__HOST_STATUS__UP, 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 8eba34f..8b886ac 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 @@ -67,6 +67,7 @@ ProductRPMVersion(ConfigAuthType.User), RhevhLocalFSPath, HotPlugEnabled(ConfigAuthType.User), + HotPlugCpuSupported(ConfigAuthType.User), NetworkLinkingSupported(ConfigAuthType.User), SupportBridgesReportByVDSM(ConfigAuthType.User), MaxMTU, diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/VDSCommandType.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/VDSCommandType.java index 8648cab..8c3d8a9 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/VDSCommandType.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/VDSCommandType.java @@ -153,7 +153,8 @@ GetGlusterVolumeRebalanceStatus("org.ovirt.engine.core.vdsbroker.gluster"), GetDiskAlignment("org.ovirt.engine.core.vdsbroker.vdsbroker"), GlusterTasksList("org.ovirt.engine.core.vdsbroker.gluster"), - GetGlusterVolumeRemoveBricksStatus("org.ovirt.engine.core.vdsbroker.gluster"); + GetGlusterVolumeRemoveBricksStatus("org.ovirt.engine.core.vdsbroker.gluster"), + SetNumberOfCpus("org.ovirt.engine.core.vdsbroker"); String packageName; diff --git a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dal/dbbroker/auditloghandling/AuditLogDirector.java b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dal/dbbroker/auditloghandling/AuditLogDirector.java index f58d39a..56067da 100644 --- a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dal/dbbroker/auditloghandling/AuditLogDirector.java +++ b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dal/dbbroker/auditloghandling/AuditLogDirector.java @@ -471,6 +471,8 @@ severities.put(AuditLogType.USER_EXPORT_IMAGE, AuditLogSeverity.NORMAL); severities.put(AuditLogType.USER_EXPORT_IMAGE_FINISHED_SUCCESS, AuditLogSeverity.NORMAL); severities.put(AuditLogType.USER_EXPORT_IMAGE_FINISHED_FAILURE, AuditLogSeverity.ERROR); + severities.put(AuditLogType.HOT_SET_NUMBER_OF_CPUS, AuditLogSeverity.NORMAL); + severities.put(AuditLogType.FAILED_HOT_SET_NUMBER_OF_CPUS, AuditLogSeverity.ERROR); } private static void initQuotaSeverities() { diff --git a/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties b/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties index ede6ab1..6dabc3f 100644 --- a/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties +++ b/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties @@ -312,6 +312,7 @@ VAR__ACTION__DESTROY_DOMAIN=$action destroy VAR__ACTION__HOT_PLUG=$action hot plug VAR__ACTION__HOT_UNPLUG=$action hot unplug +VAR__ACTION__HOT_SET_CPUS=$action hot set cpus VAR__ACTION__LOGON=$action log on VAR__ACTION__LOGOFF=$action log off VAR__ACTION__ASSIGN=$action assign diff --git a/backend/manager/modules/dal/src/main/resources/bundles/AuditLogMessages.properties b/backend/manager/modules/dal/src/main/resources/bundles/AuditLogMessages.properties index 051e1fc..afb27f8 100644 --- a/backend/manager/modules/dal/src/main/resources/bundles/AuditLogMessages.properties +++ b/backend/manager/modules/dal/src/main/resources/bundles/AuditLogMessages.properties @@ -90,6 +90,8 @@ USER_EXPORT_IMAGE=User ${UserName} exporting image ${RepoImageName} to domain ${DestinationStorageDomainName}. USER_EXPORT_IMAGE_FINISHED_SUCCESS=User ${UserName} successfully exported image ${RepoImageName} to domain ${DestinationStorageDomainName}. USER_EXPORT_IMAGE_FINISHED_FAILURE=User ${UserName} failed to export image ${RepoImageName} to domain ${DestinationStorageDomainName}. +HOT_SET_NUMBER_OF_CPUS=VM ${vmName} number of CPUs is hot set to ${numberOfCpus} +FAILED_HOT_SET_NUMBER_OF_CPUS= Faild to hot set number of CPUS to VM ${vmName}. Underlying error message: ${ErrorMessage} USER_MOVE_IMAGE_GROUP_FAILED_TO_DELETE_SRC_IMAGE=Possible failure while deleting ${DiskAlias} from the source Storage Domain ${StorageDomainName} during the move operation. The Storage Domain may be manually cleaned-up from possible leftovers (User:${UserName}). USER_MOVE_IMAGE_GROUP_FAILED_TO_DELETE_DST_IMAGE=Possible failure while clearing possible leftovers of ${DiskAlias} from the target Storage Domain ${StorageDomainName} after the move operation failed to copy the image to it properly. The Storage Domain may be manually cleaned-up from possible leftovers (User:${UserName}). USER_REMOVE_DISK_FROM_VM=Disk was removed from VM ${VmName} by ${UserName}. diff --git a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/SetNumberOfCpusVDSCommand.java b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/SetNumberOfCpusVDSCommand.java new file mode 100644 index 0000000..afce430 --- /dev/null +++ b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/SetNumberOfCpusVDSCommand.java @@ -0,0 +1,40 @@ +package org.ovirt.engine.core.vdsbroker; + +import org.ovirt.engine.core.common.vdscommands.VdsAndVmIDVDSParametersBase; +import org.ovirt.engine.core.compat.Guid; +import org.ovirt.engine.core.vdsbroker.vdsbroker.VdsBrokerCommand; + +public class SetNumberOfCpusVDSCommand<P extends SetNumberOfCpusVDSCommand.Params> extends VdsBrokerCommand<P> { + + public SetNumberOfCpusVDSCommand(P parameters) { + super(parameters); + } + + @Override + protected void executeVdsBrokerCommand() { + try { + status = getBroker().setNumberOfCpus( + getParameters().getVmId().toString(), + String.valueOf(getParameters().getNumberOfCpus())); + proceedProxyReturnValue(); + } catch (RuntimeException e) { + setVdsRuntimeError(e); + // prevent exception handler from rethrowing an exception + getVDSReturnValue().setExceptionString(null); + } + } + + public static class Params extends VdsAndVmIDVDSParametersBase{ + + private int numberOfCpus; + + public Params(Guid vdsId, Guid vmId, int numberOfCpus) { + super(vdsId, vmId); + this.numberOfCpus = numberOfCpus; + } + + public int getNumberOfCpus() { + return numberOfCpus; + } + } +} diff --git a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/BrokerCommandBase.java b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/BrokerCommandBase.java index 521d547..f8e18f4 100644 --- a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/BrokerCommandBase.java +++ b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/BrokerCommandBase.java @@ -169,6 +169,7 @@ case VOLUME_GROUP_BLOCK_SIZE_ERROR: case MIGRATION_DEST_INVALID_HOSTNAME: case ResourceTimeout: + case HOT_PLUG_UNPLUG_CPU_ERROR: case DEVICE_BLOCK_SIZE_NOT_SUPPORTED: if (this instanceof IrsBrokerCommand) { outEx = new IrsOperationFailedNoFailoverException(getReturnStatus().mMessage); diff --git a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/IVdsServer.java b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/IVdsServer.java index 3fa9d52..a67476f 100644 --- a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/IVdsServer.java +++ b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/IVdsServer.java @@ -297,4 +297,6 @@ GlusterVolumeTaskReturnForXmlRpc glusterVolumeRebalanceStatus(String volumeName); GlusterVolumeTaskReturnForXmlRpc glusterVolumeRemoveBrickStatus(String volumeName, String[] bricksList); + + StatusOnlyReturnForXmlRpc setNumberOfCpus(String vmId, String numberOfCpus); } diff --git a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsProperties.java b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsProperties.java index 010094a..2c7cd65 100644 --- a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsProperties.java +++ b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsProperties.java @@ -181,6 +181,7 @@ public static final String num_of_monitors = "spiceMonitors"; public static final String num_of_cpus = "smp"; public static final String cores_per_socket = "smpCoresPerSocket"; + public static final String max_number_of_cpus = "maxVCpus"; public static final String cpuPinning = "cpuPinning"; public static final String vm_name = "vmName"; public static final String vm_guid = "vmId"; diff --git a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerConnector.java b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerConnector.java index fb37e79..816de0f 100644 --- a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerConnector.java +++ b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerConnector.java @@ -281,4 +281,6 @@ public Map<String, Object> glusterVolumeRebalanceStatus(String volumeName); public Map<String, Object> glusterVolumeRemoveBrickStatus(String volumeName, String[] bricksList); + + public Map<String, Object> setNumberOfCpus(String vmId, String numberOfCpus); } diff --git a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerWrapper.java b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerWrapper.java index d826685..814b232 100644 --- a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerWrapper.java +++ b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerWrapper.java @@ -1360,6 +1360,15 @@ } @Override + public StatusOnlyReturnForXmlRpc setNumberOfCpus(String vmId, String numberOfCpus) { + try { + return new StatusOnlyReturnForXmlRpc(vdsServer.setNumberOfCpus(vmId, numberOfCpus)); + } catch (UndeclaredThrowableException ute) { + throw new XmlRpcRunTimeException(ute); + } + } + + @Override public StatusOnlyReturnForXmlRpc setMOMPolicyParameters(Map<String, Object> key_value_store) { try { Map<String, Object> xmlRpcReturnValue = vdsServer.setMOMPolicyParameters(key_value_store); diff --git a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VmInfoBuilderBase.java b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VmInfoBuilderBase.java index 446c12b..484bf97 100644 --- a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VmInfoBuilderBase.java +++ b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VmInfoBuilderBase.java @@ -12,6 +12,7 @@ import org.apache.commons.lang.StringUtils; import org.ovirt.engine.core.common.AuditLogType; +import org.ovirt.engine.core.common.FeatureSupported; import org.ovirt.engine.core.common.businessentities.Disk; import org.ovirt.engine.core.common.businessentities.DisplayType; import org.ovirt.engine.core.common.businessentities.VM; @@ -70,6 +71,11 @@ if (Config.<Boolean> getValue(ConfigValues.SendSMPOnRunVm)) { createInfo.put(VdsProperties.cores_per_socket, (Integer.toString(vm.getCpuPerSocket()))); + if (FeatureSupported.supportedInConfig(ConfigValues.HotPlugCpuSupported, + vm.getVdsGroupCompatibilityVersion(), vm.getClusterArch())) { + createInfo.put(VdsProperties.max_number_of_cpus, + String.valueOf(Config.<Integer> getValue(ConfigValues.MaxNumOfVmCpus, vm.getVdsGroupCompatibilityVersion().getValue()))); + } } final String compatibilityVersion = vm.getVdsGroupCompatibilityVersion().toString(); addCpuPinning(compatibilityVersion); diff --git a/packaging/dbscripts/upgrade/pre_upgrade/0000_config.sql b/packaging/dbscripts/upgrade/pre_upgrade/0000_config.sql index 5d85222..efa175d 100644 --- a/packaging/dbscripts/upgrade/pre_upgrade/0000_config.sql +++ b/packaging/dbscripts/upgrade/pre_upgrade/0000_config.sql @@ -159,6 +159,11 @@ select fn_db_add_config_value('HostPreparingForMaintenanceIdleTime', '300', 'general'); select fn_db_add_config_value('HostTimeDriftInSec','300','general'); select fn_db_add_config_value('HotPlugEnabled','false','3.0'); +select fn_db_add_config_value('HotPlugCpuEnabled','{\"x86_64\":\"false\",\"ppc64\":\"false\"}','3.0'); +select fn_db_add_config_value('HotPlugCpuEnabled','{\"x86_64\":\"false\",\"ppc64\":\"false\"}','3.1'); +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'); 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/23477 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I464a3dda5f143d1fcef63fd903eb615b01efe081 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: ovirt-engine-3.4 Gerrit-Owner: Roy Golan <[email protected]> _______________________________________________ Engine-patches mailing list [email protected] http://lists.ovirt.org/mailman/listinfo/engine-patches
