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
