Daniel Erez has uploaded a new change for review.

Change subject: webadmin: preview partial snapshot confirmation dialog
......................................................................

webadmin: preview partial snapshot confirmation dialog

When selecting to preview a snapshot that contains only
a subset of the VM disks, a 'Preview Partial Snapshot'
dialog should be displayed. The dialog suggests a couple
of options to the user for proceeding (see screenshot).

Screenshot: http://i.imgur.com/m7wsgB8.png

Change-Id: Iabd59025d7c7b96ae92898efe34e20985d2e9750
Bug-Url: https://bugzilla.redhat.com/1095808
Signed-off-by: Daniel Erez <de...@redhat.com>
---
M 
frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/CommonApplicationConstants.java
M 
frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/CommonApplicationMessages.java
M 
frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/popup/vm/VmSnapshotPreviewPopupWidget.java
M 
frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/popup/vm/VmSnapshotPreviewPopupWidget.ui.xml
M 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/Linq.java
M 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/help/HelpTag.java
M 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/SnapshotModel.java
M 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/VmSnapshotListModel.java
M 
frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/UIConstants.java
M 
frontend/webadmin/modules/userportal-gwtp/src/main/java/org/ovirt/engine/ui/userportal/section/main/view/popup/vm/VmSnapshotPreviewPopupView.java
M 
frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/vm/VmSnapshotPreviewPopupView.java
11 files changed, 305 insertions(+), 60 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/69/33869/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 f5090fc..d9ffe37 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
@@ -1802,6 +1802,12 @@
     @DefaultStringValue("Excluded disks will be deleted when the snapshot is 
committed.")
     String snapshotPreviewWithExcludedDisksWarning();
 
+    @DefaultStringValue("You chose to preview a snapshot that contains only a 
subset of these disks")
+    String previewPartialSnapshotSubsetDisksLabel();
+
+    @DefaultStringValue("What would you like to do?")
+    String previewPartialSnapshotQuestionLabel();
+
     @DefaultStringValue("Import as Template")
     String importAsTemplate();
 
diff --git 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/CommonApplicationMessages.java
 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/CommonApplicationMessages.java
index 2f9cf3e..15f4615 100644
--- 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/CommonApplicationMessages.java
+++ 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/CommonApplicationMessages.java
@@ -154,6 +154,12 @@
     @DefaultMessage("{0} (Previewing: {1})")
     String snapshotPreviewing(String snapshotDescription, String diskAliases);
 
+    @DefaultMessage("The VM contains {0} disk(s): {1}")
+    String vmDisksLabel(int numOfDisks, String diskAliases);
+
+    @DefaultMessage("(The snapshot contains {0} disk(s): {1})")
+    String snapshotDisksLabel(int numOfDisks, String diskAliases);
+
     //Numa messages
     @DefaultMessage("{0}_NUMA{1}")
     String vNumaName(String name, int index);
diff --git 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/popup/vm/VmSnapshotPreviewPopupWidget.java
 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/popup/vm/VmSnapshotPreviewPopupWidget.java
index 9942c94..b590664 100644
--- 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/popup/vm/VmSnapshotPreviewPopupWidget.java
+++ 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/popup/vm/VmSnapshotPreviewPopupWidget.java
@@ -1,11 +1,17 @@
 package org.ovirt.engine.ui.common.widget.uicommon.popup.vm;
 
+import com.google.gwt.dom.client.Style;
+import com.google.gwt.user.client.ui.Label;
+import com.google.gwt.user.client.ui.SimplePanel;
 import org.ovirt.engine.ui.common.CommonApplicationConstants;
+import org.ovirt.engine.ui.common.CommonApplicationMessages;
 import org.ovirt.engine.ui.common.idhandler.ElementIdHandler;
 import org.ovirt.engine.ui.common.idhandler.WithElementId;
 import org.ovirt.engine.ui.common.widget.Align;
+import org.ovirt.engine.ui.common.widget.editor.ListModelRadioGroupEditor;
 import 
org.ovirt.engine.ui.common.widget.editor.generic.EntityModelCheckBoxEditor;
 import 
org.ovirt.engine.ui.common.widget.uicommon.popup.AbstractModelBoundPopupWidget;
+import org.ovirt.engine.ui.uicommonweb.Linq;
 import org.ovirt.engine.ui.uicommonweb.models.vms.SnapshotModel;
 
 import com.google.gwt.core.client.GWT;
@@ -13,7 +19,7 @@
 import com.google.gwt.uibinder.client.UiBinder;
 import com.google.gwt.uibinder.client.UiField;
 import com.google.gwt.user.client.ui.FlowPanel;
-import com.google.gwt.user.client.ui.Label;
+import org.ovirt.engine.ui.uicompat.external.StringUtils;
 
 public class VmSnapshotPreviewPopupWidget extends 
AbstractModelBoundPopupWidget<SnapshotModel> {
 
@@ -29,6 +35,28 @@
     }
 
     @UiField
+    FlowPanel partialSnapshotWarningPanel;
+
+    @UiField
+    @Ignore
+    Label vmDisksLabel;
+
+    @UiField
+    @Ignore
+    Label snapshotDisksLabel;
+
+    @UiField
+    @Path(value = "partialPreviewSnapshotOptions.selectedItem")
+    public 
ListModelRadioGroupEditor<SnapshotModel.PreivewPartialSnapshotOption> 
partialPreviewSnapshotOptionEditor;
+
+
+    @UiField
+    FlowPanel memoryWarningPanel;
+
+    @UiField
+    SimplePanel horizontalSeparator;
+
+    @UiField
     @Ignore
     Label messageLabel;
 
@@ -38,8 +66,10 @@
     public EntityModelCheckBoxEditor memoryEditor;
 
     private final Driver driver = GWT.create(Driver.class);
+    private final CommonApplicationMessages messages;
 
-    public VmSnapshotPreviewPopupWidget(CommonApplicationConstants constants) {
+    public VmSnapshotPreviewPopupWidget(CommonApplicationConstants constants, 
CommonApplicationMessages messages) {
+        this.messages = messages;
         initEditors();
         initWidget(ViewUiBinder.uiBinder.createAndBindUi(this));
         localize(constants);
@@ -59,6 +89,21 @@
     @Override
     public void edit(final SnapshotModel model) {
         driver.edit(model);
+
+        if (model.isShowMemorySnapshotWarning() && 
!model.isShowPartialSnapshotWarning()) {
+            Style dialogStyle = 
getParent().getParent().getParent().getElement().getStyle();
+            dialogStyle.setWidth(450, Style.Unit.PX);
+            dialogStyle.setHeight(200, Style.Unit.PX);
+        }
+
+        
partialSnapshotWarningPanel.setVisible(model.isShowPartialSnapshotWarning());
+        memoryWarningPanel.setVisible(model.isShowMemorySnapshotWarning());
+        horizontalSeparator.setVisible(model.isShowPartialSnapshotWarning() && 
model.isShowMemorySnapshotWarning());
+
+        vmDisksLabel.setText(messages.vmDisksLabel(model.getVmDisks().size(),
+                StringUtils.join(Linq.getDiskAliases(model.getVmDisks()), ", 
"))); //$NON-NLS-1$
+        
snapshotDisksLabel.setText(messages.snapshotDisksLabel(model.getDisks().size(),
+                StringUtils.join(Linq.getDiskAliases(model.getDisks()), ", 
"))); //$NON-NLS-1$
     }
 
     @Override
diff --git 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/popup/vm/VmSnapshotPreviewPopupWidget.ui.xml
 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/popup/vm/VmSnapshotPreviewPopupWidget.ui.xml
index 542169f..cb4278f 100644
--- 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/popup/vm/VmSnapshotPreviewPopupWidget.ui.xml
+++ 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/popup/vm/VmSnapshotPreviewPopupWidget.ui.xml
@@ -1,25 +1,54 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent";>
 <ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder" 
xmlns:g="urn:import:com.google.gwt.user.client.ui"
-    xmlns:ge="urn:import:org.ovirt.engine.ui.common.widget.editor.generic">
+    xmlns:ge="urn:import:org.ovirt.engine.ui.common.widget.editor.generic" 
xmlns:e="urn:import:org.ovirt.engine.ui.common.widget.editor">
+
+    <ui:with field='constants' 
type='org.ovirt.engine.ui.common.CommonApplicationConstants' />
 
     <ui:style>
+        .container {
+            padding: 20px;
+        }
 
         .memoryEditor {
             width: 100%;
         }
 
-        .messageLabel {
-            padding-top: 15px;
-            padding-left: 10px;
-            padding-right: 5px;
-            height: 40%;
+        .horizontalSeparator {
+            width: 100%;
+            border-bottom: 1px solid black;
+            margin: 15px 0;
+        }
+
+        .staticDisksLabel {
+            font-weight: bold;
+        }
+
+        .staticQuestionLabel {
+            font-weight: bold !important;
+            padding-top: 20px;
+        }
+
+        .partialPreviewSnapshotOptionEditor {
+            width: 100%;
+            padding: 0;
         }
     </ui:style>
 
-    <g:FlowPanel>
-        <g:Label ui:field="messageLabel" addStyleNames="{style.messageLabel}" 
/>
-        <ge:EntityModelCheckBoxEditor ui:field="memoryEditor" 
addStyleNames="{style.memoryEditor}" />
+    <g:FlowPanel addStyleNames="{style.container}">
+        <g:FlowPanel ui:field="partialSnapshotWarningPanel">
+            <g:Label ui:field="vmDisksLabel" />
+            <g:Label text="{constants.previewPartialSnapshotSubsetDisksLabel}" 
addStyleNames="{style.staticDisksLabel}" />
+            <g:Label ui:field="snapshotDisksLabel" />
+            <e:ListModelRadioGroupEditor 
ui:field="partialPreviewSnapshotOptionEditor" 
addStyleNames="{style.partialPreviewSnapshotOptionEditor} 
dvrg_radioGroup_pfly_fix"
+                                         
label="{constants.previewPartialSnapshotQuestionLabel}" 
labelStyleName="{style.staticQuestionLabel}"
+                                         
contentWidgetStyleName="{style.partialPreviewSnapshotOptionEditor}"/>
+        </g:FlowPanel>
+        <g:SimplePanel ui:field="horizontalSeparator" 
addStyleNames="{style.horizontalSeparator}"/>
+        <g:FlowPanel ui:field="memoryWarningPanel">
+            <g:Label ui:field="messageLabel" />
+            <ge:EntityModelCheckBoxEditor ui:field="memoryEditor" 
addStyleNames="{style.memoryEditor}" />
+        </g:FlowPanel>
     </g:FlowPanel>
 
 </ui:UiBinder>
\ No newline at end of file
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/Linq.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/Linq.java
index a4549dc..e803b9c 100644
--- 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/Linq.java
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/Linq.java
@@ -849,6 +849,25 @@
         return aliases;
     }
 
+    public static List<DiskImage> imagesSubtract(Iterable<DiskImage> images, 
Iterable<DiskImage> imagesToSubtract) {
+        List<DiskImage> subtract = new ArrayList<DiskImage>();
+        for (DiskImage image : images) {
+            if (Linq.getDiskImageById(image.getId(), imagesToSubtract) == 
null) {
+                subtract.add(image);
+            }
+        }
+        return subtract;
+    }
+
+    private static DiskImage getDiskImageById(Guid id, Iterable<DiskImage> 
diskImages) {
+        for (DiskImage diskImage : diskImages) {
+            if (diskImage.getId().equals(id)) {
+                return diskImage;
+            }
+        }
+        return null;
+    }
+
     public final static class TimeZonePredicate implements 
IPredicate<TimeZoneModel>
     {
         private final String timeZone;
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/help/HelpTag.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/help/HelpTag.java
index b57bec6..c785cba 100644
--- 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/help/HelpTag.java
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/help/HelpTag.java
@@ -332,6 +332,8 @@
 
     preview_snapshot("preview_snapshot", HelpTagType.COMMON, "VMs main tab -> 
Snapshots sub-tab -> 'Preview Snapshot' dialog"), //$NON-NLS-1$ //$NON-NLS-2$
 
+    preview_partial_snapshot("preview_partial_snapshot", HelpTagType.COMMON, 
"VMs main tab -> Snapshots sub-tab -> 'Preview Partial Snapshot' dialog"), 
//$NON-NLS-1$ //$NON-NLS-2$
+
     profiles("profiles", HelpTagType.UNKNOWN), //$NON-NLS-1$
 
     providers("providers", HelpTagType.UNKNOWN), //$NON-NLS-1$
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/SnapshotModel.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/SnapshotModel.java
index b915c21..a2e0272 100644
--- 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/SnapshotModel.java
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/SnapshotModel.java
@@ -56,17 +56,27 @@
 
     private ArrayList<DiskImage> disks;
 
-    public ArrayList<DiskImage> getDisks()
-    {
+    public ArrayList<DiskImage> getDisks() {
         return disks;
     }
 
-    public void setDisks(ArrayList<DiskImage> value)
-    {
-        if (disks != value)
-        {
+    public void setDisks(ArrayList<DiskImage> value) {
+        if (disks != value) {
             disks = value;
             onPropertyChanged(new PropertyChangedEventArgs("Disks")); 
//$NON-NLS-1$
+        }
+    }
+
+    private List<DiskImage> vmDisks;
+
+    public List<DiskImage> getVmDisks() {
+        return vmDisks;
+    }
+
+    public void setVmDisks(List<DiskImage> value) {
+        if (vmDisks != value) {
+            vmDisks = value;
+            onPropertyChanged(new PropertyChangedEventArgs("VmDisks")); 
//$NON-NLS-1$
         }
     }
 
@@ -148,10 +158,44 @@
         snapshotDisks = value;
     }
 
+    private boolean showMemorySnapshotWarning;
+
+    public boolean isShowMemorySnapshotWarning()
+    {
+        return showMemorySnapshotWarning;
+    }
+
+    public void setShowMemorySnapshotWarning(boolean value)
+    {
+        showMemorySnapshotWarning = value;
+    }
+
+    private boolean showPartialSnapshotWarning;
+
+    public boolean isShowPartialSnapshotWarning()
+    {
+        return showPartialSnapshotWarning;
+    }
+
+    public void setShowPartialSnapshotWarning(boolean value)
+    {
+        showPartialSnapshotWarning = value;
+    }
+
+    private ListModel<PreivewPartialSnapshotOption> 
partialPreviewSnapshotOptions;
+
+    public ListModel<PreivewPartialSnapshotOption> 
getPartialPreviewSnapshotOptions() {
+        return partialPreviewSnapshotOptions;
+    }
+
+    private void 
setPartialPreviewSnapshotOptions(ListModel<PreivewPartialSnapshotOption> value) 
{
+        partialPreviewSnapshotOptions = value;
+    }
+
     private UICommand cancelCommand;
 
     public UICommand getCancelCommand() {
-        return cancelCommand;
+        return cancelCommand != null ? cancelCommand : 
super.getCancelCommand();
     }
 
     public void setCancelCommand(UICommand cancelCommand) {
@@ -165,8 +209,11 @@
         setDisks(new ArrayList<DiskImage>());
         setNics(new ArrayList<VmNetworkInterface>());
         setApps(new ArrayList<String>());
-
         setSnapshotDisks(new ListModel<DiskImage>());
+
+        ListModel<PreivewPartialSnapshotOption> partialPreviewSnapshotOptions 
= new ListModel<PreivewPartialSnapshotOption>();
+        
partialPreviewSnapshotOptions.setItems(Arrays.asList(PreivewPartialSnapshotOption.values()));
+        setPartialPreviewSnapshotOptions(partialPreviewSnapshotOptions);
     }
 
     public static SnapshotModel createNewSnapshotModel(ICommandTarget 
cancelCommandTarget) {
@@ -383,4 +430,20 @@
                 }, this);
     }
 
+    public enum PreivewPartialSnapshotOption {
+        
preserveActiveDisks(ConstantsManager.getInstance().getConstants().preserveActiveDisks()),
+        
excludeActiveDisks(ConstantsManager.getInstance().getConstants().excludeActiveDisks()),
+        
openCustomPreviewDialog(ConstantsManager.getInstance().getConstants().openCustomPreviewDialog());
+
+        private String description;
+
+        private PreivewPartialSnapshotOption(String description) {
+            this.description = description;
+        }
+
+        @Override
+        public String toString() {
+            return description;
+        }
+    }
 }
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/VmSnapshotListModel.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/VmSnapshotListModel.java
index 143f7ce..bd97d1b 100644
--- 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/VmSnapshotListModel.java
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/VmSnapshotListModel.java
@@ -220,6 +220,16 @@
         }
     }
 
+    private List<DiskImage> vmDisks;
+
+    public List<DiskImage> getVmDisks() {
+        return vmDisks;
+    }
+
+    public void setVmDisks(List<DiskImage> value) {
+        vmDisks = value;
+    }
+
     public VmSnapshotListModel()
     {
         
setTitle(ConstantsManager.getInstance().getConstants().snapshotsTitle());
@@ -238,6 +248,7 @@
         getCanSelectSnapshot().setEntity(true);
 
         setSnapshotsMap(new HashMap<Guid, SnapshotModel>());
+        setVmDisks(new ArrayList<DiskImage>());
     }
 
     @Override
@@ -286,14 +297,12 @@
     }
 
     @Override
-    public void setEntity(Object value)
-    {
+    public void setEntity(Object value) {
         updateIsMemorySnapshotSupported(value);
         updateIsLiveMergeSupported(value);
-
         super.setEntity(value);
-
         updateIsCloneVmSupported();
+        updateVmActiveDisks();
     }
 
     @Override
@@ -409,55 +418,79 @@
         }
     }
 
-    private void preview()
-    {
+    private void preview() {
         VM vm = (VM) getEntity();
         if (vm == null) {
             return;
         }
 
-        Snapshot snapshot = (Snapshot) getSelectedItem();
-        // if snapshot doesn't have memory, just trigger preview without 
showing popup
-        if (!isMemorySnapshotSupported() || 
snapshot.getMemoryVolume().isEmpty()) {
-            
Frontend.getInstance().runAction(VdcActionType.TryBackToAllSnapshotsOfVm,
-                    new TryBackToAllSnapshotsOfVmParameters(vm.getId(), 
snapshot.getId()),
-                    null);
-        }
-        // otherwise, show a popup asking whether to use the memory or not
-        else {
-            SnapshotModel model = new SnapshotModel();
-            setWindow(model);
+        final Snapshot snapshot = (Snapshot) getSelectedItem();
+        AsyncDataProvider.getInstance().getVmConfigurationBySnapshot(new 
AsyncQuery(this, new INewAsyncCallback() {
+            @Override
+            public void onSuccess(Object target, Object returnValue) {
+                VM vm = (VM) returnValue;
+                ArrayList<DiskImage> snapshotDisks = vm.getDiskList();
+                List<DiskImage> disksExcludedFromSnapshot = 
Linq.imagesSubtract(getVmDisks(), snapshotDisks);
 
-            
model.setTitle(ConstantsManager.getInstance().getConstants().previewSnapshotTitle());
-            model.setHelpTag(HelpTag.preview_snapshot);
-            model.setHashName("preview_snapshot"); //$NON-NLS-1$
+                boolean showMemorySnapshotWarning = 
isMemorySnapshotSupported() && !snapshot.getMemoryVolume().isEmpty();
+                boolean showPartialSnapshotWarning = 
!disksExcludedFromSnapshot.isEmpty();
 
-            addCommands(model, "OnPreview"); //$NON-NLS-1$
-        }
+                if (showMemorySnapshotWarning || showPartialSnapshotWarning) {
+                    SnapshotModel model = new SnapshotModel();
+                    model.setVmDisks(getVmDisks());
+                    model.setDisks(snapshotDisks);
+                    
model.setShowMemorySnapshotWarning(showMemorySnapshotWarning);
+                    
model.setShowPartialSnapshotWarning(showPartialSnapshotWarning);
+                    setWindow(model);
+
+                    model.setTitle(showPartialSnapshotWarning ?
+                            
ConstantsManager.getInstance().getConstants().previewPartialSnapshotTitle() :
+                            
ConstantsManager.getInstance().getConstants().previewSnapshotTitle());
+                    model.setHelpTag(showPartialSnapshotWarning ? 
HelpTag.preview_partial_snapshot : HelpTag.preview_snapshot);
+                    model.setHashName(showPartialSnapshotWarning ? 
"preview_partial_snapshot" : "preview_snapshot"); //$NON-NLS-1$ //$NON-NLS-2$
+
+                    addCommands(model, "OnPreview"); //$NON-NLS-1$
+                } else {
+                    runTryBackToAllSnapshotsOfVm(null, vm, snapshot, false, 
null);
+                }
+            }
+        }), snapshot.getId());
     }
 
-    private void updatePreviewedDiskSnapshots(final List<Snapshot> snapshots) {
+    private void updateVmActiveDisks() {
+        VM vm = (VM) getEntity();
+        if (vm == null) {
+            return;
+        }
+
         AsyncDataProvider.getInstance().getVmDiskList(new AsyncQuery(this, new 
INewAsyncCallback() {
             @Override
             public void onSuccess(Object target, Object returnValue) {
                 ArrayList<Disk> disks = (ArrayList<Disk>) returnValue;
+                getVmDisks().clear();
                 for (Disk disk : disks) {
                     if (disk.getDiskStorageType() == Disk.DiskStorageType.LUN) 
{
                         continue;
                     }
 
                     DiskImage diskImage = (DiskImage) disk;
-                    if (diskImage.getSnapshots().size() <= 1) {
-                        continue;
-                    }
-
-                    Guid snapshotId = 
diskImage.getSnapshots().get(1).getVmSnapshotId();
-                    
snapshotsMap.get(snapshotId).getEntity().getDiskImages().add(diskImage);
+                    getVmDisks().add(diskImage);
                 }
-
-                updateItems(snapshots);
             }
-        }), ((VM) getEntity()).getId());
+        }), vm.getId());
+    }
+
+    private void updatePreviewedDiskSnapshots(final List<Snapshot> snapshots) {
+        for (DiskImage diskImage : getVmDisks()) {
+            if (diskImage.getSnapshots().size() <= 1) {
+                continue;
+            }
+
+            Guid snapshotId = 
diskImage.getSnapshots().get(1).getVmSnapshotId();
+            
getSnapshotsMap().get(snapshotId).getEntity().getDiskImages().add(diskImage);
+        }
+
+        updateItems(snapshots);
     }
 
     private void customPreview()
@@ -488,7 +521,6 @@
 
     private void onPreview() {
         Snapshot snapshot = (Snapshot) getSelectedItem();
-
         if (snapshot == null) {
             cancel();
             return;
@@ -496,9 +528,32 @@
 
         VM vm = (VM) getEntity();
         SnapshotModel snapshotModel = (SnapshotModel) getWindow();
-        boolean memory = (Boolean) snapshotModel.getMemory().getEntity();
+        boolean memory = false;
+        List<DiskImage> disks = null;
 
-        runTryBackToAllSnapshotsOfVm(snapshotModel, vm, snapshot, memory, 
null);
+        if (snapshotModel.isShowPartialSnapshotWarning()) {
+            switch 
(snapshotModel.getPartialPreviewSnapshotOptions().getSelectedItem()) {
+                case preserveActiveDisks:
+                    // get snapshot disks
+                    disks = snapshotModel.getDisks();
+                    // add active disks missed from snapshot
+                    disks.addAll(Linq.imagesSubtract(getVmDisks(), disks));
+                    break;
+                case excludeActiveDisks:
+                    // nothing to do - default behaviour
+                    break;
+                case openCustomPreviewDialog:
+                    setWindow(null);
+                    getCustomPreviewCommand().execute();
+                    return;
+            }
+        }
+
+        if (snapshotModel.isShowMemorySnapshotWarning()) {
+            memory = snapshotModel.getMemory().getEntity();
+        }
+
+        runTryBackToAllSnapshotsOfVm(snapshotModel, vm, snapshot, memory, 
disks);
     }
 
     private void onCustomPreview() {
@@ -512,13 +567,19 @@
     }
 
     private void runTryBackToAllSnapshotsOfVm(final Model model, VM vm, 
Snapshot snapshot, boolean memory, List<DiskImage> disks) {
-        model.startProgress(null);
+        if (model != null) {
+            model.startProgress(null);
+        }
+
         
Frontend.getInstance().runAction(VdcActionType.TryBackToAllSnapshotsOfVm, new 
TryBackToAllSnapshotsOfVmParameters(
             vm.getId(), snapshot.getId(), memory, disks),
             new IFrontendActionAsyncCallback() {
                 @Override
                 public void executed(FrontendActionAsyncResult result) {
-                    model.stopProgress();
+                    if (model != null) {
+                        model.stopProgress();
+                    }
+
                     if (result.getReturnValue().getSucceeded()) {
                         cancel();
                     }
diff --git 
a/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/UIConstants.java
 
b/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/UIConstants.java
index 88d5837..26f2ce9 100644
--- 
a/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/UIConstants.java
+++ 
b/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/UIConstants.java
@@ -623,6 +623,18 @@
     @DefaultStringValue("Custom Preview Snapshot")
     String customPreviewSnapshotTitle();
 
+    @DefaultStringValue("Preview Partial Snapshot")
+    String previewPartialSnapshotTitle();
+
+    @DefaultStringValue("Include in the previewed VM all disks (keep the disks 
that are not included in the snapshot as-is).")
+    String preserveActiveDisks();
+
+    @DefaultStringValue("Include in the previewed VM only the disks that are 
included in the snapshot.")
+    String excludeActiveDisks();
+
+    @DefaultStringValue("None of the above, take me to the 'Custom Preview 
Snapshot' dialog.")
+    String openCustomPreviewDialog();
+
     @DefaultStringValue("Applications")
     String applicationsTitle();
 
diff --git 
a/frontend/webadmin/modules/userportal-gwtp/src/main/java/org/ovirt/engine/ui/userportal/section/main/view/popup/vm/VmSnapshotPreviewPopupView.java
 
b/frontend/webadmin/modules/userportal-gwtp/src/main/java/org/ovirt/engine/ui/userportal/section/main/view/popup/vm/VmSnapshotPreviewPopupView.java
index 4bb8229..701e203 100644
--- 
a/frontend/webadmin/modules/userportal-gwtp/src/main/java/org/ovirt/engine/ui/userportal/section/main/view/popup/vm/VmSnapshotPreviewPopupView.java
+++ 
b/frontend/webadmin/modules/userportal-gwtp/src/main/java/org/ovirt/engine/ui/userportal/section/main/view/popup/vm/VmSnapshotPreviewPopupView.java
@@ -5,6 +5,7 @@
 import 
org.ovirt.engine.ui.common.widget.uicommon.popup.vm.VmSnapshotPreviewPopupWidget;
 import org.ovirt.engine.ui.uicommonweb.models.vms.SnapshotModel;
 import org.ovirt.engine.ui.userportal.ApplicationConstants;
+import org.ovirt.engine.ui.userportal.ApplicationMessages;
 import org.ovirt.engine.ui.userportal.ApplicationResources;
 import 
org.ovirt.engine.ui.userportal.section.main.presenter.popup.vm.VmSnapshotPreviewPopupPresenterWidget;
 
@@ -19,8 +20,8 @@
     }
 
     @Inject
-    public VmSnapshotPreviewPopupView(EventBus eventBus, ApplicationResources 
resources, ApplicationConstants constants) {
-        super(eventBus, resources, new 
VmSnapshotPreviewPopupWidget(constants), "410px", "200px"); //$NON-NLS-1$ 
//$NON-NLS-2$
+    public VmSnapshotPreviewPopupView(EventBus eventBus, ApplicationResources 
resources, ApplicationConstants constants, ApplicationMessages messages) {
+        super(eventBus, resources, new VmSnapshotPreviewPopupWidget(constants, 
messages), "750px", "450px"); //$NON-NLS-1$ //$NON-NLS-2$
         ViewIdHandler.idHandler.generateAndSetIds(this);
     }
 }
diff --git 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/vm/VmSnapshotPreviewPopupView.java
 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/vm/VmSnapshotPreviewPopupView.java
index 1d9b305..948c08a 100644
--- 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/vm/VmSnapshotPreviewPopupView.java
+++ 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/vm/VmSnapshotPreviewPopupView.java
@@ -5,6 +5,7 @@
 import 
org.ovirt.engine.ui.common.widget.uicommon.popup.vm.VmSnapshotPreviewPopupWidget;
 import org.ovirt.engine.ui.uicommonweb.models.vms.SnapshotModel;
 import org.ovirt.engine.ui.webadmin.ApplicationConstants;
+import org.ovirt.engine.ui.webadmin.ApplicationMessages;
 import org.ovirt.engine.ui.webadmin.ApplicationResources;
 import 
org.ovirt.engine.ui.webadmin.section.main.presenter.popup.vm.VmSnapshotPreviewPopupPresenterWidget;
 
@@ -19,8 +20,8 @@
     }
 
     @Inject
-    public VmSnapshotPreviewPopupView(EventBus eventBus, ApplicationResources 
resources, ApplicationConstants constants) {
-        super(eventBus, resources, new 
VmSnapshotPreviewPopupWidget(constants), "410px", "200px"); //$NON-NLS-1$ 
//$NON-NLS-2$
+    public VmSnapshotPreviewPopupView(EventBus eventBus, ApplicationResources 
resources, ApplicationConstants constants, ApplicationMessages messages) {
+        super(eventBus, resources, new VmSnapshotPreviewPopupWidget(constants, 
messages), "750px", "450px"); //$NON-NLS-1$ //$NON-NLS-2$
         ViewIdHandler.idHandler.generateAndSetIds(this);
     }
 }


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

Gerrit-MessageType: newchange
Gerrit-Change-Id: Iabd59025d7c7b96ae92898efe34e20985d2e9750
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Daniel Erez <de...@redhat.com>
_______________________________________________
Engine-patches mailing list
Engine-patches@ovirt.org
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to