Arik Hadas has uploaded a new change for review.

Change subject: core: query for getting 'updateable on next run' fields
......................................................................

core: query for getting 'updateable on next run' fields

Add query that gets two versions of VMs and returns the names of the
fields which are different between those versions and could be updated
only when the VM will be restarted.

Change-Id: I6fd7133770aafee5b2bc551d3cffc8951f5d58df
Signed-off-by: Arik Hadas <[email protected]>
---
A 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/GetVmUpdatesOnNextRunQuery.java
A 
backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/GetVmUpdatesOnNextRunQueryTest.java
A 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/GetVmUpdatesOnNextRunParameters.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java
4 files changed, 179 insertions(+), 0 deletions(-)


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

diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/GetVmUpdatesOnNextRunQuery.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/GetVmUpdatesOnNextRunQuery.java
new file mode 100644
index 0000000..50776b8
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/GetVmUpdatesOnNextRunQuery.java
@@ -0,0 +1,61 @@
+package org.ovirt.engine.core.bll;
+
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.ovirt.engine.core.common.businessentities.EditableOnVmStatusField;
+import org.ovirt.engine.core.common.businessentities.VMStatus;
+import org.ovirt.engine.core.common.businessentities.VmStatic;
+import org.ovirt.engine.core.common.queries.GetVmUpdatesOnNextRunParameters;
+import org.ovirt.engine.core.common.utils.ObjectUtils;
+
+public class GetVmUpdatesOnNextRunQuery<P extends 
GetVmUpdatesOnNextRunParameters>
+        extends QueriesCommandBase<P>{
+
+    /** fields that cannot be changed while the VM is running */
+    private static List<Field> updateableOnNextRunFields = new ArrayList<>();
+
+    static {
+        Class<?> clazz = VmStatic.class;
+        while (clazz != null && clazz != Object.class) {
+            for (Field field : clazz.getDeclaredFields()) {
+                EditableOnVmStatusField ann = 
field.getAnnotation(EditableOnVmStatusField.class);
+                if (ann != null && 
!Arrays.asList(ann.statuses()).contains(VMStatus.Up)) {
+                    field.setAccessible(true);
+                    updateableOnNextRunFields.add(field);
+                }
+            }
+            clazz = clazz.getSuperclass();
+        }
+    }
+
+    public GetVmUpdatesOnNextRunQuery(P parameters) {
+        super(parameters);
+    }
+
+    @Override
+    protected void executeQueryCommand() {
+        VmStatic src = getParameters().getOriginal().getStaticData();
+        VmStatic dst = getParameters().getUpdated().getStaticData();
+
+        List<String> nextRunFieldNames = new ArrayList<>();
+
+        for (Field field : updateableOnNextRunFields) {
+            if (!compareFieldInObjects(field, src, dst)) {
+                nextRunFieldNames.add(field.getName());
+            }
+        }
+
+        setReturnValue(nextRunFieldNames);
+    }
+
+    private boolean compareFieldInObjects(Field field, Object src, Object dst) 
{
+        try {
+            return ObjectUtils.objectsEqual(field.get(src), field.get(dst));
+        } catch (IllegalArgumentException | IllegalAccessException e) {
+            return false;
+        }
+    }
+}
diff --git 
a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/GetVmUpdatesOnNextRunQueryTest.java
 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/GetVmUpdatesOnNextRunQueryTest.java
new file mode 100644
index 0000000..40b6d7c
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/GetVmUpdatesOnNextRunQueryTest.java
@@ -0,0 +1,83 @@
+package org.ovirt.engine.core.bll;
+
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.when;
+
+import java.util.List;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.runners.MockitoJUnitRunner;
+import org.ovirt.engine.core.common.businessentities.UsbPolicy;
+import org.ovirt.engine.core.common.businessentities.VM;
+import org.ovirt.engine.core.common.queries.GetVmUpdatesOnNextRunParameters;
+
+@RunWith(MockitoJUnitRunner.class)
+public class GetVmUpdatesOnNextRunQueryTest extends 
AbstractQueryTest<GetVmUpdatesOnNextRunParameters, GetVmUpdatesOnNextRunQuery<? 
extends GetVmUpdatesOnNextRunParameters>> {
+
+    @Test
+    public void testEqualVms() {
+        VM srcVm = new VM();
+        VM dstVm = new VM();
+
+        when(getQueryParameters().getOriginal()).thenReturn(srcVm);
+        when(getQueryParameters().getUpdated()).thenReturn(dstVm);
+
+        getQuery().executeQueryCommand();
+
+        List<String> fieldNames = (List<String>) 
getQuery().getQueryReturnValue().getReturnValue();
+        assertTrue(fieldNames.isEmpty());
+    }
+
+    @Test
+    public void testDifferentCpuPerSocketOnly() {
+        VM srcVm = new VM();
+        VM dstVm = new VM();
+        srcVm.setCpuPerSocket(4);
+        dstVm.setCpuPerSocket(5);
+
+        when(getQueryParameters().getOriginal()).thenReturn(srcVm);
+        when(getQueryParameters().getUpdated()).thenReturn(dstVm);
+
+        getQuery().executeQueryCommand();
+
+        List<String> fieldNames = (List<String>) 
getQuery().getQueryReturnValue().getReturnValue();
+        assertEquals(fieldNames.size(), 1);
+    }
+
+    @Test
+    public void testDifferentVms() {
+        VM srcVm = new VM();
+        VM dstVm = new VM();
+        // field that should not count
+        srcVm.setUseHostCpuFlags(true);
+        dstVm.setUseHostCpuFlags(false);
+        srcVm.setUseLatestVersion(false);
+        dstVm.setUseLatestVersion(true);
+        srcVm.setName("a");
+        dstVm.setName("b");
+        // some equal fields
+        srcVm.setComment("my comment..");
+        dstVm.setComment("my comment..");
+        srcVm.setOriginalTemplateName("template4");
+        dstVm.setOriginalTemplateName("template4");
+        srcVm.setVmMemSizeMb(128);
+        dstVm.setVmMemSizeMb(128);
+        // changes for next run
+        srcVm.setCustomProperties("prop=value");
+        dstVm.setCustomProperties("prop=value2");
+        srcVm.setUsbPolicy(UsbPolicy.DISABLED);
+        dstVm.setUsbPolicy(UsbPolicy.ENABLED_LEGACY);
+        srcVm.setStateless(true);
+        dstVm.setStateless(false);
+
+        when(getQueryParameters().getOriginal()).thenReturn(srcVm);
+        when(getQueryParameters().getUpdated()).thenReturn(dstVm);
+
+        getQuery().executeQueryCommand();
+
+        List<String> fieldNames = (List<String>) 
getQuery().getQueryReturnValue().getReturnValue();
+        assertEquals(fieldNames.size(), 3);
+    }
+}
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/GetVmUpdatesOnNextRunParameters.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/GetVmUpdatesOnNextRunParameters.java
new file mode 100644
index 0000000..6f2cf1f
--- /dev/null
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/GetVmUpdatesOnNextRunParameters.java
@@ -0,0 +1,34 @@
+package org.ovirt.engine.core.common.queries;
+
+import org.ovirt.engine.core.common.businessentities.VM;
+
+public class GetVmUpdatesOnNextRunParameters extends VdcQueryParametersBase {
+
+    private VM original;
+
+    private VM updated;
+
+    public GetVmUpdatesOnNextRunParameters() {
+    }
+
+    public GetVmUpdatesOnNextRunParameters(VM original, VM updated) {
+        this.original = original;
+        this.updated = updated;
+    }
+
+    public VM getOriginal() {
+        return original;
+    }
+
+    public VM getUpdated() {
+        return updated;
+    }
+
+    public void setOriginal(VM original) {
+        this.original = original;
+    }
+
+    public void setUpdated(VM updated) {
+        this.updated = updated;
+    }
+}
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 3b49a36..cceedbd 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
@@ -24,6 +24,7 @@
     GetTemplatesByVnicProfileId,
     GetVirtioScsiControllers(VdcQueryAuthType.User),
     GetVmsInit,
+    GetVmUpdatesOnNextRun,
 
     // Vds queries
     GetVdsByVdsId,


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

Gerrit-MessageType: newchange
Gerrit-Change-Id: I6fd7133770aafee5b2bc551d3cffc8951f5d58df
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Arik Hadas <[email protected]>
_______________________________________________
Engine-patches mailing list
[email protected]
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to