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

Reply via email to