Omer Frenkel has uploaded a new change for review.

Change subject: core: handle hot-set and update running vm
......................................................................

core: handle hot-set and update running vm

since the numOfSockets field was updateable, the infrastructure of
update-running-vm didn't take it into account,
when this was the only changed field, we had couple of issue:
1. the UI dialog didn't show, user cant choose if to apply now or later
2. next_run snapshot wasn't created

this fix is changine the field to updateableOnStatus, to handle above
issues, but since the user can choose if to use hot plug or not, a new
field introduced to the annotation, to mark fields that can be hot-set.

Bug-Url: https://bugzilla.redhat.com/show_bug.cgi?id=1128443
Change-Id: I1c7f9b26ac4ddda6b446244b1fd85e2023809630
Signed-off-by: Omer Frenkel <ofren...@redhat.com>
---
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateVmCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmHandler.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/EditableOnVmStatusField.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VmBase.java
M 
backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/ObjectIdentityChecker.java
M 
backend/manager/modules/utils/src/test/java/org/ovirt/engine/core/utils/ObjectIdentityCheckerTest.java
6 files changed, 71 insertions(+), 9 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/99/32399/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 379dea2..24eaa6a 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
@@ -128,6 +128,7 @@
 
         // save user selected value for hotplug before overriding with db 
values (when updating running vm)
         int cpuPerSocket = newVmStatic.getCpuPerSocket();
+        int numOfSockets = newVmStatic.getNumOfSockets();
 
         if (newVmStatic.getCreationDate().equals(DateTime.getMinValue())) {
             newVmStatic.setCreationDate(new Date());
@@ -143,7 +144,7 @@
 
         UpdateVmNetworks();
         if (!getParameters().isApplyChangesLater()) {
-            hotSetCpus(cpuPerSocket);
+            hotSetCpus(cpuPerSocket, numOfSockets);
         }
         getVmStaticDAO().update(newVmStatic);
         if (getVm().isNotRunning()) {
@@ -219,23 +220,22 @@
         return DbFacade.getInstance().getSnapshotDao();
     }
 
-    private void hotSetCpus(int cpuPerSocket) {
+    private void hotSetCpus(int cpuPerSocket, int newNumOfSockets) {
         int currentSockets = getVm().getNumOfSockets();
-        int newSockets = newVmStatic.getNumOfSockets();
         int currentCpuPerSocket = getVm().getCpuPerSocket();
 
         // try hotplug only if topology (cpuPerSocket) hasn't changed
-        if (getVm().getStatus() == VMStatus.Up && currentSockets != newSockets
+        if (getVm().getStatus() == VMStatus.Up && currentSockets != 
newNumOfSockets
                 && currentCpuPerSocket == cpuPerSocket) {
             HotSetNumerOfCpusParameters params =
                     new HotSetNumerOfCpusParameters(
                             newVmStatic,
-                            currentSockets < newSockets ? PlugAction.PLUG : 
PlugAction.UNPLUG);
+                            currentSockets < newNumOfSockets ? PlugAction.PLUG 
: PlugAction.UNPLUG);
             setNumberOfCpusResult =
                     runInternalAction(
                             VdcActionType.HotSetNumberOfCpus,
                             params, cloneContextAndDetachFromParent());
-            newVmStatic.setNumOfSockets(setNumberOfCpusResult.getSucceeded() ? 
newSockets : currentSockets);
+            newVmStatic.setNumOfSockets(setNumberOfCpusResult.getSucceeded() ? 
newNumOfSockets : currentSockets);
             auditLogHotSetCpusCandos(params);
         }
     }
@@ -595,7 +595,8 @@
         return getVm().isNextRunConfigurationExists() ||
                 !VmHandler.isUpdateValid(getVm().getStaticData(),
                         getParameters().getVmStaticData(),
-                        getVm().getStatus()) ||
+                        getVm().getStatus(),
+                        !getParameters().isApplyChangesLater()) ||
                 !VmHandler.isUpdateValidForVmDevices(getVmId(), 
getVm().getStatus(), getParameters());
     }
 
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmHandler.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmHandler.java
index 520e780..acf6b49 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmHandler.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmHandler.java
@@ -113,6 +113,9 @@
         for (Pair<EditableOnVmStatusField, Field> pair : 
BaseHandler.extractAnnotatedFields(EditableOnVmStatusField.class,
                 inspectedClassNames)) {
             
mUpdateVmsStatic.AddField(Arrays.asList(pair.getFirst().statuses()), 
pair.getSecond().getName());
+            if (pair.getFirst().isHotsetAllowed()) {
+                mUpdateVmsStatic.AddHotsetFields(pair.getSecond().getName());
+            }
         }
 
         for (Pair<EditableDeviceOnVmStatusField, Field> pair : 
BaseHandler.extractAnnotatedFields(EditableDeviceOnVmStatusField.class,
@@ -142,6 +145,10 @@
         return mUpdateVmsStatic.IsUpdateValid(source, destination, status);
     }
 
+    public static boolean isUpdateValid(VmStatic source, VmStatic destination, 
VMStatus status, boolean hotsetEnabled) {
+        return mUpdateVmsStatic.IsUpdateValid(source, destination, status, 
hotsetEnabled);
+    }
+
     public static boolean isUpdateValid(VmStatic source, VmStatic destination) 
{
         return mUpdateVmsStatic.IsUpdateValid(source, destination);
     }
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/EditableOnVmStatusField.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/EditableOnVmStatusField.java
index e08bfd2..ed7d7a7 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/EditableOnVmStatusField.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/EditableOnVmStatusField.java
@@ -11,4 +11,5 @@
 
     VMStatus[] statuses() default { VMStatus.Down };
 
+    boolean isHotsetAllowed() default false;
 }
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 f6afc3c..1a1a621 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
@@ -72,7 +72,8 @@
     @EditableOnTemplate
     private int memSizeMb;
 
-    @EditableField
+    @EditableOnVmStatusField(isHotsetAllowed = true)
+    @EditableOnTemplate
     @CopyOnNewVersion
     private int numOfSockets;
 
diff --git 
a/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/ObjectIdentityChecker.java
 
b/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/ObjectIdentityChecker.java
index a58ff8e..d032d36 100644
--- 
a/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/ObjectIdentityChecker.java
+++ 
b/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/ObjectIdentityChecker.java
@@ -24,6 +24,7 @@
     private Map<Enum<?>, Set<String>> dictionary =
             new HashMap<Enum<?>, Set<String>>();
     private Set<String> permitted = new HashSet<String>();
+    private Set<String> hotsetAllowedFields = new HashSet<String>();
 
     public ObjectIdentityChecker(Class<?> type) {
         identities.put(type, this);
@@ -83,11 +84,21 @@
         }
     }
 
+    public final void AddHotsetFields(String... fieldNames) {
+        for (String fieldName : fieldNames) {
+            hotsetAllowedFields.add(fieldName);
+        }
+    }
+
     public final boolean IsFieldUpdatable(String name) {
         return permitted.contains(name);
     }
 
     public boolean IsFieldUpdatable(Enum<?> status, String name, Object 
fieldContainer) {
+        return IsFieldUpdatable(status, name, fieldContainer, false);
+    }
+
+    public boolean IsFieldUpdatable(Enum<?> status, String name, Object 
fieldContainer, boolean hotsetEnabled) {
         boolean returnValue = true;
         if (!IsFieldUpdatable(name)) {
             if (fieldContainer != null && container != null
@@ -96,6 +107,11 @@
             } else {
                 Set<String> values = dictionary.get(status);
                 returnValue = values != null ? values.contains(name) : false;
+
+                // if field is not updateable in this status, check if hotset 
request and its an hotset allowed field
+                if (!returnValue && hotsetEnabled) {
+                    returnValue = hotsetAllowedFields.contains(name);
+                }
             }
             if (!returnValue) {
                 LogError(name, status);
@@ -147,11 +163,15 @@
     }
 
     public final boolean IsUpdateValid(Object source, Object destination, 
Enum<?> status) {
+        return IsUpdateValid(source, destination, status, false);
+    }
+
+    public final boolean IsUpdateValid(Object source, Object destination, 
Enum<?> status, boolean hotsetEnabled) {
         if (source.getClass() != destination.getClass()) {
             return false;
         }
         for (String fieldName : GetChangedFields(source, destination)) {
-            if (!IsFieldUpdatable(status, fieldName, null)) {
+            if (!IsFieldUpdatable(status, fieldName, null, hotsetEnabled)) {
                 log.warn(String.format("ObjectIdentityChecker.IsUpdateValid:: 
Not updatable field '%1$s' was updated",
                         fieldName));
                 return false;
diff --git 
a/backend/manager/modules/utils/src/test/java/org/ovirt/engine/core/utils/ObjectIdentityCheckerTest.java
 
b/backend/manager/modules/utils/src/test/java/org/ovirt/engine/core/utils/ObjectIdentityCheckerTest.java
index cdd01b6..0bb62a3 100644
--- 
a/backend/manager/modules/utils/src/test/java/org/ovirt/engine/core/utils/ObjectIdentityCheckerTest.java
+++ 
b/backend/manager/modules/utils/src/test/java/org/ovirt/engine/core/utils/ObjectIdentityCheckerTest.java
@@ -7,6 +7,7 @@
 import java.util.List;
 
 import org.junit.Test;
+import org.ovirt.engine.core.common.businessentities.VMStatus;
 
 public class ObjectIdentityCheckerTest {
     @Test
@@ -48,4 +49,35 @@
         changed = oic.IsFieldsUpdated(jedi1, jedi2, 
Arrays.asList("saberColor"));
         assertTrue("1 Change", changed);
     }
+
+    @Test
+    public void testHotsetUpdateableWhenHotsetRequested() {
+        ObjectIdentityChecker oic = new ObjectIdentityChecker(Jedi.class);
+        oic.AddHotsetFields("name");
+        assertTrue("hot set requested for hot set fields should be true", 
oic.IsFieldUpdatable(null, "name", null, true));
+    }
+
+    @Test
+    public void testHotsetNotUpdateableWhenHotsetNotRequested() {
+        ObjectIdentityChecker oic = new ObjectIdentityChecker(Jedi.class);
+        assertFalse("Should be false by default", 
oic.IsFieldUpdatable("name"));
+        oic.AddHotsetFields("name");
+        assertFalse("hot set not requested should return false even if field 
is hot set", oic.IsFieldUpdatable(null, "name", null, false));
+    }
+
+    @Test
+    public void testHotsetUpdateableWhenHotsetRequestedWithStatus() {
+        ObjectIdentityChecker oic = new ObjectIdentityChecker(Jedi.class);
+        oic.AddField(VMStatus.Down, "name");
+        oic.AddHotsetFields("name");
+        assertTrue("hot set requested for hot set fields should be true", 
oic.IsFieldUpdatable(VMStatus.Down, "name", null, true));
+    }
+
+    @Test
+    public void testHotsetUpdateableWhenHotsetNotRequestedWithStatus() {
+        ObjectIdentityChecker oic = new ObjectIdentityChecker(Jedi.class);
+        oic.AddField(VMStatus.Down, "name");
+        oic.AddHotsetFields("name");
+        assertTrue("hot set not requested field should be updateable according 
to status", oic.IsFieldUpdatable(VMStatus.Down, "name", null, false));
+    }
 }


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

Gerrit-MessageType: newchange
Gerrit-Change-Id: I1c7f9b26ac4ddda6b446244b1fd85e2023809630
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: ovirt-engine-3.5
Gerrit-Owner: Omer Frenkel <ofren...@redhat.com>
_______________________________________________
Engine-patches mailing list
Engine-patches@ovirt.org
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to