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

Reply via email to