Daniel Erez has uploaded a new change for review. Change subject: webadmin: warning message - move disks file to block ......................................................................
webadmin: warning message - move disks 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/1099083 Signed-off-by: Daniel Erez <[email protected]> --- M frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/editor/generic/EntityModelTextAreaLabel.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 6 files changed, 153 insertions(+), 5 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/16/27916/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/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..db3106b 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,54 @@ } @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) { + StorageDomain storageDomain = (StorageDomain) ((ListModel) sender).getSelectedItem(); + if (storageDomain.getStorageType().isBlockDomain()) { + problematicDisks.add(diskModel.getDisk().getDiskAlias()); + } + else { + problematicDisks.remove(diskModel.getDisk().getDiskAlias()); + } + + 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 9d535ec..8d09d85 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/27916 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I08fb316c76a9132467d26bbc5305a30a9883d38e Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Daniel Erez <[email protected]> _______________________________________________ Engine-patches mailing list [email protected] http://lists.ovirt.org/mailman/listinfo/engine-patches
