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

Reply via email to