Roy Golan has uploaded a new change for review.

Change subject: core: Hot set number of CPUs on update VM
......................................................................

core: Hot set number of CPUs on update VM

* allow editing the number of cpus in the when the VM is UP
* if the VM is up and Version is > 3.3 call VDSM's  setNumberOfCpus
* audit log on success, failure

Change-Id: I464a3dda5f143d1fcef63fd903eb615b01efe081
Signed-off-by: Roy Golan <rgo...@redhat.com>
---
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/businessentities/VmBase.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/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/IVdsServer.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
10 files changed, 86 insertions(+), 2 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/57/22757/1

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 921bef7..33b91b5 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
@@ -28,6 +28,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;
@@ -43,8 +44,11 @@
 import org.ovirt.engine.core.common.queries.VdcQueryType;
 import org.ovirt.engine.core.common.utils.Pair;
 import org.ovirt.engine.core.common.validation.group.UpdateEntity;
+import org.ovirt.engine.core.common.vdscommands.VDSCommandType;
+import org.ovirt.engine.core.common.vdscommands.VDSReturnValue;
 import org.ovirt.engine.core.compat.DateTime;
 import org.ovirt.engine.core.compat.Guid;
+import org.ovirt.engine.core.compat.Version;
 import org.ovirt.engine.core.dal.dbbroker.auditloghandling.AuditLogDirector;
 import org.ovirt.engine.core.dal.dbbroker.auditloghandling.AuditLogableBase;
 import org.ovirt.engine.core.dao.VmDeviceDAO;
@@ -53,6 +57,9 @@
 import 
org.ovirt.engine.core.utils.customprop.VmPropertiesUtils.VMCustomProperties;
 import org.ovirt.engine.core.utils.linq.LinqUtils;
 import org.ovirt.engine.core.utils.linq.Predicate;
+import org.ovirt.engine.core.vdsbroker.SetNumberOfCpusVdsCommand;
+
+import static org.ovirt.engine.core.vdsbroker.SetNumberOfCpusVdsCommand.*;
 
 @LockIdNameAttribute
 public class UpdateVmCommand<T extends VmManagementParametersBase> extends 
VmManagementCommandBase<T>
@@ -93,6 +100,7 @@
         VmDeviceUtils.updateVmDevices(getParameters(), oldVm);
         updateWatchdog();
         checkTrustedService();
+        hotPlugUnplugCpus();
         setSucceeded(true);
     }
 
@@ -198,6 +206,28 @@
         }
     }
 
+    private void hotPlugUnplugCpus() {
+        if (canHotPlugUnplugCpu()) {
+            VDSReturnValue vdsReturnValue = 
runVdsCommand(VDSCommandType.SetNumberOfCpus,
+                    new Params(
+                            getVm().getRunOnVds(),
+                            getVm().getId(),
+                            getParameters().getVm().getNumOfCpus()));
+
+            AuditLogableBase logable = new AuditLogableBase();
+            logable.setVmId(getVmId());
+            logable.addCustomValue("numberOfCpus", 
String.valueOf(getParameters().getVm().getNumOfCpus()));
+            AuditLogDirector.log(logable, vdsReturnValue.getSucceeded() ?
+                            AuditLogType.FAILED_SET_NUMBER_OF_CPUS : 
AuditLogType.SET_NUMBER_OF_CPUS);
+        }
+        
+    }
+
+    private boolean canHotPlugUnplugCpu() {
+        return 
getVm().getVdsGroupCompatibilityVersion().compareTo(Version.v3_3) > 0 &&
+                getVm().getNumOfCpus() != 
getParameters().getVm().getNumOfCpus();
+    }
+
     @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 b41f93f..9c5e4c4 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
@@ -194,6 +194,8 @@
     USER_EXPORT_IMAGE(2030),
     USER_EXPORT_IMAGE_FINISHED_SUCCESS(2031),
     USER_EXPORT_IMAGE_FINISHED_FAILURE(2032),
+    SET_NUMBER_OF_CPUS(2033),
+    FAILED_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/businessentities/VmBase.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VmBase.java
index c0cf842..b26efc0 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
@@ -66,7 +66,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/vdscommands/VDSCommandType.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/VDSCommandType.java
index 27b7ab0..c67c41a 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
@@ -152,7 +152,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 a76e936..04507b4 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
@@ -467,6 +467,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.SET_NUMBER_OF_CPUS, 
AuditLogSeverity.NORMAL);
+        severities.put(AuditLogType.FAILED_SET_NUMBER_OF_CPUS, 
AuditLogSeverity.ERROR);
     }
 
     private static void initQuotaSeverities() {
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 ef647fe..f5d569c 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}.
+SET_NUMBER_OF_CPUS=VM ${vmName} number of CPUs is hot set to ${numberOfCpus}
+FAILED_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..42e0ade
--- /dev/null
+++ 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/SetNumberOfCpusVdsCommand.java
@@ -0,0 +1,34 @@
+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() {
+        getBroker().setNumberOfCpus(
+                getParameters().getVmId().toString(),
+                String.valueOf(getParameters().getNumberOfCpus()));
+        proceedProxyReturnValue();
+    }
+
+    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/IVdsServer.java
 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/IVdsServer.java
index 8fa530d..f07e9e6 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
@@ -295,4 +295,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/VdsServerConnector.java
 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerConnector.java
index 0cd2d0f..676e018 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
@@ -279,4 +279,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 bc4ad53..870af62 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
@@ -1349,6 +1349,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);


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

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

Reply via email to