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