Omer Frenkel has uploaded a new change for review. Change subject: WIP: webadmin: add warning when updating running vm ......................................................................
WIP: webadmin: add warning when updating running vm Change-Id: I94196ca4fef946900412be99075b1d5b94072430 Signed-off-by: Omer Frenkel <ofren...@redhat.com> --- M frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/CommonApplicationConstants.java M frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/VmListModel.java 2 files changed, 182 insertions(+), 79 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/70/27370/1 diff --git a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/CommonApplicationConstants.java b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/CommonApplicationConstants.java index 556908a..4f8b702 100644 --- a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/CommonApplicationConstants.java +++ b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/CommonApplicationConstants.java @@ -1598,6 +1598,9 @@ @DefaultStringValue("Server in Preview") String serverInPreview(); + @DefaultStringValue("Newer configuration exists for next run") + String nextConfigurationExists(); + @DefaultStringValue("Run Once") String runOnce(); diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/VmListModel.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/VmListModel.java index c230e12..c2f6009 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/VmListModel.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/VmListModel.java @@ -24,6 +24,7 @@ import org.ovirt.engine.core.common.businessentities.Disk; import org.ovirt.engine.core.common.businessentities.Disk.DiskStorageType; import org.ovirt.engine.core.common.businessentities.DiskImage; +import org.ovirt.engine.core.common.businessentities.EditableOnVmStatusField; import org.ovirt.engine.core.common.businessentities.HaMaintenanceMode; import org.ovirt.engine.core.common.businessentities.StorageDomain; import org.ovirt.engine.core.common.businessentities.StoragePool; @@ -31,6 +32,7 @@ import org.ovirt.engine.core.common.businessentities.VDS; import org.ovirt.engine.core.common.businessentities.VDSGroup; import org.ovirt.engine.core.common.businessentities.VM; +import org.ovirt.engine.core.common.businessentities.VmBase; import org.ovirt.engine.core.common.businessentities.VmTemplate; import org.ovirt.engine.core.common.businessentities.VmType; import org.ovirt.engine.core.common.businessentities.VmWatchdog; @@ -93,6 +95,7 @@ import org.ovirt.engine.ui.uicompat.PropertyChangedEventArgs; import org.ovirt.engine.ui.uicompat.UIConstants; +import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -1964,24 +1967,9 @@ } private void onSave() { - final VmInterfaceCreatingManager defaultNetworkCreatingManager = - new VmInterfaceCreatingManager(new VmInterfaceCreatingManager.PostVnicCreatedCallback() { - @Override - public void vnicCreated(Guid vmId) { - getWindow().stopProgress(); - cancel(); - updateActionAvailability(); - } - - @Override - public void queryFailed() { - getWindow().stopProgress(); - cancel(); - } - }); + final VmInterfaceCreatingManager defaultNetworkCreatingManager = getVmInterfaceCreatingManager(); final UnitVmModel model = (UnitVmModel) getWindow(); - VM selectedItem = (VM) getSelectedItem(); // Save changes. buildVmOnSave(model, getcurrentVm()); @@ -2123,74 +2111,178 @@ return; } - // explicitly pass non-editable field from the original VM - getcurrentVm().setCreatedByUserId(selectedItem.getCreatedByUserId()); - - // runEditVM: should be true if Cluster hasn't changed or if - // Cluster has changed and Editing it in the Backend has succeeded: - Guid oldClusterID = selectedItem.getVdsGroupId(); - Guid newClusterID = model.getSelectedCluster().getId(); - if (oldClusterID.equals(newClusterID) == false) - { - ChangeVMClusterParameters parameters = - new ChangeVMClusterParameters(newClusterID, getcurrentVm().getId()); - - model.startProgress(null); - - Frontend.getInstance().runAction(VdcActionType.ChangeVMCluster, parameters, - new IFrontendActionAsyncCallback() { - @Override - public void executed(FrontendActionAsyncResult result) { - - final VmListModel vmListModel = (VmListModel) result.getState(); - VdcReturnValueBase returnValueBase = result.getReturnValue(); - if (returnValueBase != null && returnValueBase.getSucceeded()) - { - VM vm = vmListModel.getcurrentVm(); - vm.setUseLatestVersion(constants.latestTemplateVersionName().equals(model.getTemplate().getSelectedItem().getTemplateVersionName())); - - VmManagementParametersBase updateVmParams = new VmManagementParametersBase(vm); - setVmWatchdogToParams(model, updateVmParams); - updateVmParams.setSoundDeviceEnabled(model.getIsSoundcardEnabled() - .getEntity()); - updateVmParams.setBalloonEnabled(balloonEnabled(model)); - updateVmParams.setVirtioScsiEnabled(model.getIsVirtioScsiEnabled().getEntity()); - - Frontend.getInstance().runAction(VdcActionType.UpdateVm, - updateVmParams, new UnitVmModelNetworkAsyncCallback(model, defaultNetworkCreatingManager, vm.getId()), vmListModel); - } - else - { - vmListModel.getWindow().stopProgress(); - } - - } - }, - this); + // check if need to show warning to the user + if (!warnEditRunningVm()) { + OnEditRunningVmOk(); } - else + + + } + } + + private VmInterfaceCreatingManager getVmInterfaceCreatingManager() { + return new VmInterfaceCreatingManager(new VmInterfaceCreatingManager.PostVnicCreatedCallback() { + @Override + public void vnicCreated(Guid vmId) { + getWindow().stopProgress(); + cancel(); + updateActionAvailability(); + } + + @Override + public void queryFailed() { + getWindow().stopProgress(); + cancel(); + } + }); + } + + private void OnEditRunningVmOk() { + final VmInterfaceCreatingManager defaultNetworkCreatingManager = getVmInterfaceCreatingManager(); + final UnitVmModel model = (UnitVmModel) getWindow(); + VM selectedItem = (VM) getSelectedItem(); + // explicitly pass non-editable field from the original VM + getcurrentVm().setCreatedByUserId(selectedItem.getCreatedByUserId()); + + // runEditVM: should be true if Cluster hasn't changed or if + // Cluster has changed and Editing it in the Backend has succeeded: + Guid oldClusterID = selectedItem.getVdsGroupId(); + Guid newClusterID = model.getSelectedCluster().getId(); + if (oldClusterID.equals(newClusterID) == false) + { + ChangeVMClusterParameters parameters = + new ChangeVMClusterParameters(newClusterID, getcurrentVm().getId()); + + model.startProgress(null); + + Frontend.getInstance().runAction(VdcActionType.ChangeVMCluster, parameters, + new IFrontendActionAsyncCallback() { + @Override + public void executed(FrontendActionAsyncResult result) { + + final VmListModel vmListModel = (VmListModel) result.getState(); + VdcReturnValueBase returnValueBase = result.getReturnValue(); + if (returnValueBase != null && returnValueBase.getSucceeded()) + { + VM vm = vmListModel.getcurrentVm(); + vm.setUseLatestVersion(constants.latestTemplateVersionName().equals(model.getTemplate().getSelectedItem().getTemplateVersionName())); + + VmManagementParametersBase updateVmParams = new VmManagementParametersBase(vm); + setVmWatchdogToParams(model, updateVmParams); + updateVmParams.setSoundDeviceEnabled(model.getIsSoundcardEnabled() + .getEntity()); + updateVmParams.setBalloonEnabled(balloonEnabled(model)); + updateVmParams.setVirtioScsiEnabled(model.getIsVirtioScsiEnabled().getEntity()); + + Frontend.getInstance().runAction(VdcActionType.UpdateVm, + updateVmParams, new UnitVmModelNetworkAsyncCallback(model, defaultNetworkCreatingManager, vm.getId()), vmListModel); + } + else + { + vmListModel.getWindow().stopProgress(); + } + + } + }, + this); + } + else + { + if (model.getProgress() != null) { - if (model.getProgress() != null) - { - return; + return; + } + + model.startProgress(null); + + VM vm = getcurrentVm(); + vm.setUseLatestVersion(constants.latestTemplateVersionName().equals(model.getTemplate().getSelectedItem().getTemplateVersionName())); + + VmManagementParametersBase updateVmParams = new VmManagementParametersBase(vm); + + setVmWatchdogToParams(model, updateVmParams); + updateVmParams.setSoundDeviceEnabled(model.getIsSoundcardEnabled().getEntity()); + updateVmParams.setConsoleEnabled(model.getIsConsoleDeviceEnabled().getEntity()); + updateVmParams.setBalloonEnabled(balloonEnabled(model)); + updateVmParams.setVirtioScsiEnabled(model.getIsVirtioScsiEnabled().getEntity()); + + Frontend.getInstance().runAction(VdcActionType.UpdateVm, updateVmParams, new UnitVmModelNetworkAsyncCallback(model, defaultNetworkCreatingManager, getcurrentVm().getId()), this); + } + } + + /** + * this method display a warning to the user, + * if vm is running and field that cannot be applied (has the @EditableOnVmStatusField) has changed + */ + private boolean warnEditRunningVm() { + VmBase originalVm = ((VM) getSelectedItem()).getStaticData(); + VmBase newVm = getcurrentVm().getStaticData(); + boolean updateOnStatusFieldChanged = false; + + if (((VM) getSelectedItem()).isNotRunning()) { + return false; + } + + boolean cpuChanged = originalVm.getNumOfCpus() != newVm.getNumOfCpus() || + originalVm.getNumOfSockets() != newVm.getNumOfSockets(); + + Class<?> srcCls = originalVm.getClass(); + Class<?> dstCls = newVm.getClass(); + try { + while (!updateOnStatusFieldChanged && !srcCls.equals(Object.class)) { + for (Field srcFld : srcCls.getDeclaredFields()) { + // if field has the editable on status annotation check if changed + if (srcFld.getAnnotation(EditableOnVmStatusField.class) != null) { + srcFld.setAccessible(true); + Field dstFld = dstCls.getDeclaredField(srcFld.getName()); + dstFld.setAccessible(true); + + // if value changed need to warn user + if (!srcFld.get(originalVm).equals(dstFld.get(newVm))) { + updateOnStatusFieldChanged = true; + break; + } + } } - - model.startProgress(null); - - VM vm = getcurrentVm(); - vm.setUseLatestVersion(constants.latestTemplateVersionName().equals(model.getTemplate().getSelectedItem().getTemplateVersionName())); - - VmManagementParametersBase updateVmParams = new VmManagementParametersBase(vm); - - setVmWatchdogToParams(model, updateVmParams); - updateVmParams.setSoundDeviceEnabled(model.getIsSoundcardEnabled().getEntity()); - updateVmParams.setConsoleEnabled(model.getIsConsoleDeviceEnabled().getEntity()); - updateVmParams.setBalloonEnabled(balloonEnabled(model)); - updateVmParams.setVirtioScsiEnabled(model.getIsVirtioScsiEnabled().getEntity()); - - Frontend.getInstance().runAction(VdcActionType.UpdateVm, updateVmParams, new UnitVmModelNetworkAsyncCallback(model, defaultNetworkCreatingManager, getcurrentVm().getId()), this); + srcCls = srcCls.getSuperclass(); + dstCls = dstCls.getSuperclass(); } } + catch (Exception e) { + //TODO display warning? + } + + // no need to warn + if (!updateOnStatusFieldChanged) { + return false; + } + + ConfirmationModel confirmModel = new ConfirmationModel(); + setConfirmWindow(confirmModel); + confirmModel.setTitle(ConstantsManager.getInstance().getConstants().powerManagementConfigurationTitle()); + confirmModel.setHelpTag(HelpTag.power_management_configuration); + confirmModel.setHashName("power_management_configuration"); //$NON-NLS-1$ + confirmModel.setMessage(ConstantsManager.getInstance().getConstants().youHavntConfigPmMsg()); + confirmModel.getForce().setIsAvailable(true); + + UICommand command; + + command = new UICommand("OnEditRunningVmOk", this); //$NON-NLS-1$ //$NON-NLS-2$ + command.setTitle(ConstantsManager.getInstance().getConstants().ok()); + command.setIsDefault(true); + confirmModel.getCommands().add(command); + + command = new UICommand("OnEditRunningVmCancel", this); //$NON-NLS-1$ + command.setTitle(ConstantsManager.getInstance().getConstants().configurePowerManagement()); + command.setIsCancel(true); + confirmModel.getCommands().add(command); + + return true; + } + + public void OnEditRunningVmCancel() + { + setConfirmWindow(null); } protected static void buildVmOnSave(UnitVmModel model, VM vm) { @@ -2584,6 +2676,14 @@ "OnEditConsoleSave".equals(command.getName())) { //$NON-NLS-1$ setWindow(null); } + else if ("OnEditRunningVmCancel".equals(command.getName())) //$NON-NLS-1$ + { + OnEditRunningVmCancel(); + } + else if ("OnEditRunningVmOk".equals(command.getName())) //$NON-NLS-1$ + { + OnEditRunningVmOk(); + } } -- To view, visit http://gerrit.ovirt.org/27370 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I94196ca4fef946900412be99075b1d5b94072430 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Omer Frenkel <ofren...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches