Daniel Erez has uploaded a new change for review. Change subject: webadmin: warning on move disks from file to block ......................................................................
webadmin: warning on move disks from file to block Moving raw/thin disks that reside on a file domain to a block domain will cause them to become preallocated. Hence, it may consume considerably more space on the target domain. To warn the user, added an appropriate message to the move disks dialog. Screenshot - http://i.imgur.com/gyMwXy9.jpg Change-Id: I08fb316c76a9132467d26bbc5305a30a9883d38e Bug-Url: https://bugzilla.redhat.com/1102784 Signed-off-by: Daniel Erez <de...@redhat.com> --- M frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/editor/generic/EntityModelTextAreaLabel.java M frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/editor/generic/EntityModelTextAreaLabelEditor.java M frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/DisksAllocationModel.java M frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/MoveDiskModel.java M frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/UIMessages.java M frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/storage/DisksAllocationPopupView.java M frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/storage/DisksAllocationPopupView.ui.xml 7 files changed, 171 insertions(+), 5 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/12/28312/1 diff --git a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/editor/generic/EntityModelTextAreaLabel.java b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/editor/generic/EntityModelTextAreaLabel.java index 4ddb014..0c00dbb 100644 --- a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/editor/generic/EntityModelTextAreaLabel.java +++ b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/editor/generic/EntityModelTextAreaLabel.java @@ -25,4 +25,9 @@ getElement().getStyle().setBorderWidth(0, Unit.PX); } + public void addContentWidgetStyleName(String style) { + if (style != null) { + getElement().getElementsByTagName("textarea").getItem(0).addClassName(style); //$NON-NLS-1$ + } + } } diff --git a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/editor/generic/EntityModelTextAreaLabelEditor.java b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/editor/generic/EntityModelTextAreaLabelEditor.java index 348aa68..ec93eff 100644 --- a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/editor/generic/EntityModelTextAreaLabelEditor.java +++ b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/editor/generic/EntityModelTextAreaLabelEditor.java @@ -35,4 +35,10 @@ } }); } + + public void setCustomStyle(final String customStyle) { + if (customStyle != null) { + getElement().getElementsByTagName("textarea").getItem(0).addClassName(customStyle); //$NON-NLS-1$ + } + } } diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/DisksAllocationModel.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/DisksAllocationModel.java index 798af1a..c624a2f 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/DisksAllocationModel.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/DisksAllocationModel.java @@ -133,6 +133,9 @@ public DisksAllocationModel() { setImageToDestinationDomainMap(new HashMap<Guid, DiskImage>()); + + setDynamicWarning(new EntityModel<String>()); + getDynamicWarning().setIsAvailable(false); } private void updateQuota(Guid storageDomainId, final ListModel isItem) { @@ -309,4 +312,16 @@ this.isWarningAvailable = isWarningAvailable; } + private EntityModel<String> dynamicWarning; + + public EntityModel<String> getDynamicWarning() + { + return dynamicWarning; + } + + public void setDynamicWarning(EntityModel<String> value) + { + dynamicWarning = value; + } + } diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/MoveDiskModel.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/MoveDiskModel.java index f4e0171..7bf8a0b 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/MoveDiskModel.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/MoveDiskModel.java @@ -12,14 +12,20 @@ import org.ovirt.engine.core.common.businessentities.Disk.DiskStorageType; import org.ovirt.engine.core.common.businessentities.DiskImage; import org.ovirt.engine.core.common.businessentities.StorageDomain; +import org.ovirt.engine.core.common.businessentities.VolumeFormat; +import org.ovirt.engine.core.common.businessentities.VolumeType; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.compat.StringHelper; import org.ovirt.engine.ui.frontend.AsyncQuery; import org.ovirt.engine.ui.frontend.Frontend; import org.ovirt.engine.ui.frontend.INewAsyncCallback; import org.ovirt.engine.ui.uicommonweb.dataprovider.AsyncDataProvider; +import org.ovirt.engine.ui.uicommonweb.models.ListModel; import org.ovirt.engine.ui.uicommonweb.models.storage.MoveOrCopyDiskModel; +import org.ovirt.engine.ui.uicompat.Event; +import org.ovirt.engine.ui.uicompat.EventArgs; import org.ovirt.engine.ui.uicompat.FrontendActionAsyncResult; +import org.ovirt.engine.ui.uicompat.IEventListener; import org.ovirt.engine.ui.uicompat.IFrontendActionAsyncCallback; public class MoveDiskModel extends MoveOrCopyDiskModel @@ -64,6 +70,66 @@ } @Override + protected void postInitStorageDomains() { + super.postInitStorageDomains(); + + // Add warning for raw/thin disks that reside on a file domain + // and selected to be cold moved to a block domain (as it will cause + // the disks to become preallocated, and it may consume considerably + // more space on the target domain). + final List<String> problematicDisks = new ArrayList<String>(); + for (final DiskModel diskModel : getDisks()) { + if (diskModel.isPluggedToRunningVm()) { + continue; + } + + ListModel<StorageDomain> sourceStorageDomains = diskModel.getSourceStorageDomain(); + if (sourceStorageDomains.getItems().iterator().hasNext() && + !sourceStorageDomains.getItems().iterator().next().getStorageType().isFileDomain()) { + continue; + } + + DiskImage diskImage = (DiskImage) diskModel.getDisk(); + if (diskImage.getVolumeType() != VolumeType.Sparse || diskImage.getVolumeFormat() != VolumeFormat.RAW) { + continue; + } + + diskModel.getStorageDomain().getSelectedItemChangedEvent().addListener(new IEventListener() { + @Override + public void eventRaised(Event ev, Object sender, EventArgs args) { + updateProblematicDisk(diskModel); + } + }); + updateProblematicDisk(diskModel); + } + } + + private void updateProblematicDisk(DiskModel diskModel) { + StorageDomain storageDomain = (StorageDomain) diskModel.getStorageDomain().getSelectedItem(); + if (storageDomain == null) { + return; + } + + String diskAlias = diskModel.getDisk().getDiskAlias(); + if (storageDomain.getStorageType().isBlockDomain()) { + if (!problematicDisks.contains(diskAlias)) { + problematicDisks.add(diskAlias); + } + } + else { + problematicDisks.remove(diskAlias); + } + + if (!problematicDisks.isEmpty()) { + getDynamicWarning().setEntity(messages.moveDisksPreallocatedWarning( + StringHelper.join(", ", problematicDisks.toArray()))); //$NON-NLS-1$ + getDynamicWarning().setIsAvailable(true); + } else { + getDynamicWarning().setIsAvailable(false); + } + } + + @Override protected VdcActionType getActionType() { return VdcActionType.MoveDisks; } diff --git a/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/UIMessages.java b/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/UIMessages.java index 69d9031..df5cfc4 100644 --- a/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/UIMessages.java +++ b/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/UIMessages.java @@ -319,6 +319,9 @@ @DefaultMessage("The following disks cannot be copied: {0}") String cannotCopyDisks(String disks); + @DefaultMessage("The following disks will become preallocated, and may consume considerably more space on the target: {0}") + String moveDisksPreallocatedWarning(String disks); + @DefaultMessage("Error connecting to {0} using {1} protocol") String errorConnectingToConsole(String name, String s); diff --git a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/storage/DisksAllocationPopupView.java b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/storage/DisksAllocationPopupView.java index 127e085..6ad2dc7 100644 --- a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/storage/DisksAllocationPopupView.java +++ b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/storage/DisksAllocationPopupView.java @@ -1,14 +1,23 @@ package org.ovirt.engine.ui.webadmin.section.main.view.popup.storage; +import com.google.gwt.editor.client.SimpleBeanEditorDriver; +import com.google.gwt.resources.client.CssResource; import com.google.gwt.safehtml.shared.SafeHtml; import com.google.gwt.safehtml.shared.SafeHtmlUtils; import com.google.gwt.user.client.ui.AbstractImagePrototype; import com.google.gwt.user.client.ui.HTML; +import com.google.gwt.user.client.ui.HorizontalPanel; import org.ovirt.engine.ui.common.CommonApplicationTemplates; import org.ovirt.engine.ui.common.view.popup.AbstractModelBoundPopupView; import org.ovirt.engine.ui.common.widget.dialog.SimpleDialogPanel; +import org.ovirt.engine.ui.common.widget.editor.generic.StringEntityModelTextAreaLabelEditor; import org.ovirt.engine.ui.common.widget.uicommon.storage.DisksAllocationView; +import org.ovirt.engine.ui.uicommonweb.models.EntityModel; import org.ovirt.engine.ui.uicommonweb.models.storage.DisksAllocationModel; +import org.ovirt.engine.ui.uicompat.Event; +import org.ovirt.engine.ui.uicompat.EventArgs; +import org.ovirt.engine.ui.uicompat.IEventListener; +import org.ovirt.engine.ui.uicompat.PropertyChangedEventArgs; import org.ovirt.engine.ui.webadmin.ApplicationConstants; import org.ovirt.engine.ui.webadmin.ApplicationResources; import org.ovirt.engine.ui.webadmin.section.main.presenter.popup.storage.DisksAllocationPopupPresenterWidget; @@ -26,12 +35,28 @@ ViewUiBinder uiBinder = GWT.create(ViewUiBinder.class); } + interface Driver extends SimpleBeanEditorDriver<DisksAllocationModel, DisksAllocationPopupView> { + } + final CommonApplicationTemplates templates = GWT.create(CommonApplicationTemplates.class); + + final Driver driver = GWT.create(Driver.class); + + + @UiField + WidgetStyle style; SafeHtml warningImage; @UiField FlowPanel messagePanel; + + @UiField + HorizontalPanel warningPanel; + + @UiField(provided = true) + @Path(value = "dynamicWarning.entity") + StringEntityModelTextAreaLabelEditor dynamicWarningLabel; @UiField(provided = true) @Ignore @@ -47,17 +72,42 @@ resources.logWarningImage()).getHTML()); disksAllocationView = new DisksAllocationView(constants); + dynamicWarningLabel = new StringEntityModelTextAreaLabelEditor(); + initWidget(ViewUiBinder.uiBinder.createAndBindUi(this)); + + addStyles(); + driver.initialize(this); } @Override public void edit(DisksAllocationModel object) { + driver.edit(object); + disksAllocationView.edit(object); disksAllocationModel = object; + + object.getDynamicWarning().getPropertyChangedEvent().addListener(new IEventListener() { + @Override + public void eventRaised(Event ev, Object sender, EventArgs args) { + EntityModel ownerModel = (EntityModel) sender; + String propName = ((PropertyChangedEventArgs) args).propertyName; + + if ("IsAvailable".equals(propName)) { //$NON-NLS-1$ + warningPanel.setVisible(ownerModel.getIsAvailable()); + } + } + }); + } + + private void addStyles() { + dynamicWarningLabel.setCustomStyle(style.dynamicWarningTextArea()); + dynamicWarningLabel.hideLabel(); } @Override public DisksAllocationModel flush() { + driver.flush(); return disksAllocationView.flush(); } @@ -72,4 +122,9 @@ messagePanel.setVisible(messagePanel.iterator().hasNext()); } + interface WidgetStyle extends CssResource { + String messagePanel(); + + String dynamicWarningTextArea(); + } } diff --git a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/storage/DisksAllocationPopupView.ui.xml b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/storage/DisksAllocationPopupView.ui.xml index 4be42bc..6dd193c 100644 --- a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/storage/DisksAllocationPopupView.ui.xml +++ b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/storage/DisksAllocationPopupView.ui.xml @@ -2,23 +2,39 @@ <!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:d="urn:import:org.ovirt.engine.ui.common.widget.dialog" - xmlns:e="urn:import:org.ovirt.engine.ui.webadmin.widget.editor" xmlns:w="urn:import:org.ovirt.engine.ui.common.widget.uicommon.storage"> + xmlns:ge="urn:import:org.ovirt.engine.ui.common.widget.editor.generic" xmlns:w="urn:import:org.ovirt.engine.ui.common.widget.uicommon.storage"> - <ui:style> + <ui:with field='resources' type='org.ovirt.engine.ui.common.CommonApplicationResources' /> + + <ui:style type="org.ovirt.engine.ui.webadmin.section.main.view.popup.storage.DisksAllocationPopupView.WidgetStyle"> .messagePanel { color: #CD2127; position: absolute; bottom: 0; - height: 50px; + height: 60px; + width: 100%; overflow: auto; } + + .dynamicWarningTextArea { + color: #CD2127; + width: 480px !important; + height: 50px; + resize: none; + } </ui:style> - <d:SimpleDialogPanel width="540px" height="400px"> + <d:SimpleDialogPanel width="540px" height="410px"> <d:content> <g:FlowPanel> <w:DisksAllocationView ui:field="disksAllocationView" listHeight="230px" listWidth="525px" showSource="true" /> - <g:FlowPanel ui:field="messagePanel" visible="false" addStyleNames="{style.messagePanel}" /> + <g:FlowPanel addStyleNames="{style.messagePanel}" > + <g:FlowPanel ui:field="messagePanel" visible="false" /> + <g:HorizontalPanel ui:field="warningPanel" visible="false"> + <g:Image resource='{resources.logWarningImage}' /> + <ge:StringEntityModelTextAreaLabelEditor ui:field="dynamicWarningLabel" /> + </g:HorizontalPanel> + </g:FlowPanel> </g:FlowPanel> </d:content> </d:SimpleDialogPanel> -- To view, visit http://gerrit.ovirt.org/28312 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I08fb316c76a9132467d26bbc5305a30a9883d38e Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: ovirt-engine-3.4 Gerrit-Owner: Daniel Erez <de...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches