Hello Fred Rolland,

I'd like you to do a code review.  Please visit

    https://gerrit.ovirt.org/41398

to review the following change.

Change subject: webadmin: Add support of refresh LUN size in UI
......................................................................

webadmin: Add support of refresh LUN size in UI

Add a new column in "Edit Domain" of iSCSI Domain.
The column is available on ly in "LUNs->Targets" view.

Add a new cell renderer of type toggle button.

Change-Id: I84c83f07f53d286f62fb6104f62fbfb37feb2b42
Relates-To: https://bugzilla.redhat.com/609689
Signed-off-by: Fred Rolland <froll...@redhat.com>
---
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/GetLunsByVgIdQuery.java
M backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties
M 
frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/AppErrors.java
M 
frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/CommonApplicationConstants.java
A 
frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/table/cell/AbstractToggleButtonCell.java
A 
frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/table/column/AbstractLunAvailableSizeColumn.java
M 
frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/storage/SanStorageLunToTargetList.java
M 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/LunModel.java
M 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/SanStorageModel.java
M 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/StorageListModel.java
M 
frontend/webadmin/modules/userportal-gwtp/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties
11 files changed, 207 insertions(+), 0 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/98/41398/1

diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/GetLunsByVgIdQuery.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/GetLunsByVgIdQuery.java
index 92aecb5..054b43f 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/GetLunsByVgIdQuery.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/GetLunsByVgIdQuery.java
@@ -48,6 +48,7 @@
             if (lunFromDeviceList != null) {
                 lun.setPathsDictionary(lunFromDeviceList.getPathsDictionary());
                 lun.setPathsCapacity(lunFromDeviceList.getPathsCapacity());
+                lun.setPvSize(lunFromDeviceList.getPvSize());
             }
         }
 
diff --git 
a/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties 
b/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties
index 9bf07b6..8f9b01b 100644
--- 
a/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties
+++ 
b/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties
@@ -805,6 +805,7 @@
 DATA_CENTER_POSIX_STORAGE_NOT_SUPPORTED_IN_CURRENT_VERSION="File based 
storage" is not supported with data center compatibility version.
 DATA_CENTER_GLUSTER_STORAGE_NOT_SUPPORTED_IN_CURRENT_VERSION="Gluster based 
storage" is not supported with current data center compatibility version.
 DATA_CENTER_CINDER_STORAGE_NOT_SUPPORTED_IN_CURRENT_VERSION=Cinder based 
storage is not supported with current data center compatibility version.
+ACTION_TYPE_FAILED_REFRESH_LUNS_UNSUPPORTED_ACTION=Extend LUN size is not 
supported with current data center compatibility version.
 VDS_CANNOT_UPDATE_CLUSTER=Updating Host's Cluster cannot be performed through 
update Host action, please use Change Host Cluster action instead.
 VM_CANNOT_UPDATE_CLUSTER=Updating VM's Cluster cannot be performed through 
update VM action, please use Change VM Cluster action instead.
 VM_STATUS_NOT_VALID_FOR_UPDATE=Cannot update a VM in this status. Try stopping 
the VM first.
diff --git 
a/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/AppErrors.java
 
b/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/AppErrors.java
index 2d1f427..7f8eba9 100644
--- 
a/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/AppErrors.java
+++ 
b/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/AppErrors.java
@@ -2186,6 +2186,9 @@
     @DefaultStringValue("Cinder based storage is not supported with current 
data center compatibility version.")
     String DATA_CENTER_CINDER_STORAGE_NOT_SUPPORTED_IN_CURRENT_VERSION();
 
+    @DefaultStringValue("Extend LUN size is not supported with current data 
center compatibility version.")
+    String ACTION_TYPE_FAILED_REFRESH_LUNS_UNSUPPORTED_ACTION();
+
     @DefaultStringValue("Updating Host's Cluster cannot be performed through 
update Host action, please use Change Host Cluster action instead.")
     String VDS_CANNOT_UPDATE_CLUSTER();
 
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 19a3a92..ddfeacd 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
@@ -1378,6 +1378,9 @@
     @DefaultStringValue("Dev. Size")
     String devSizeSanStorage();
 
+    @DefaultStringValue("Add. Size")
+    String devAdditionalSizeSanStorage();
+
     @DefaultStringValue("#path")
     String pathSanStorage();
 
diff --git 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/table/cell/AbstractToggleButtonCell.java
 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/table/cell/AbstractToggleButtonCell.java
new file mode 100644
index 0000000..4777fd8
--- /dev/null
+++ 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/table/cell/AbstractToggleButtonCell.java
@@ -0,0 +1,68 @@
+package org.ovirt.engine.ui.common.widget.table.cell;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.ovirt.engine.ui.common.CommonApplicationResources;
+import org.ovirt.engine.ui.common.gin.AssetProvider;
+
+import com.google.gwt.cell.client.ValueUpdater;
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.dom.client.BrowserEvents;
+import com.google.gwt.dom.client.Element;
+import com.google.gwt.dom.client.NativeEvent;
+import com.google.gwt.safehtml.client.SafeHtmlTemplates;
+import com.google.gwt.safehtml.shared.SafeHtml;
+
+public abstract class AbstractToggleButtonCell<T> extends AbstractCell<T> {
+
+    public interface ToggleButtonCellTemplate extends SafeHtmlTemplates {
+
+        @Template("<span id=\"{0}\" style=\"padding-left: 1px;\">{1}</span>")
+        public SafeHtml span(String id, SafeHtml html);
+
+        @Template("<input id=\"{2}\" style=\"background: transparent; border: 
0px; width: 95%; {1}\"" +
+                "readonly=\"readonly\" type=\"text\" value=\"{0}\" 
tabindex=\"-1\"></input>")
+        public SafeHtml disabled(String value, String customStyle, String id);
+
+        @Template("<button id=\"{0}\" tabindex='-1' type=\"button\" 
style=\"border-radius:2px;color:black\" " +
+                "class=\"gwt-ToggleButton gwt-ToggleButton-up\" 
tabindex=\"-1\" aria-pressed=\"true\">{1}</button>")
+        public SafeHtml toggledUp(String id, String value);
+
+        @Template("<button id=\"{0}\" tabindex='-1' type=\"button\" 
style=\"border-radius:2px\" " +
+                "class=\"gwt-ToggleButton gwt-ToggleButton-down\" 
tabindex=\"-1\" aria-pressed=\"false\">{1}</button>")
+        public SafeHtml toggledDown(String id, String value);
+    }
+
+    protected static final ToggleButtonCellTemplate templates = 
GWT.create(ToggleButtonCellTemplate.class);
+
+    private final static CommonApplicationResources resources = 
AssetProvider.getResources();
+
+    public AbstractToggleButtonCell() {
+    }
+
+
+    @Override
+    public Set<String> getConsumedEvents() {
+        Set<String> set = new HashSet<>(super.getConsumedEvents());
+        set.add(BrowserEvents.CLICK);
+        return set;
+    }
+
+    @Override
+    public void onBrowserEvent(Context context,
+                               Element parent,
+                               T model,
+                               SafeHtml tooltipContent,
+                               NativeEvent event,
+                               ValueUpdater<T> valueUpdater) {
+
+        super.onBrowserEvent(context, parent, model, tooltipContent, event, 
valueUpdater);
+        if (!BrowserEvents.CLICK.equals(event.getType())) {
+            return;
+        }
+        onClickEvent(model);
+    }
+
+    public abstract void onClickEvent(T model);
+}
diff --git 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/table/column/AbstractLunAvailableSizeColumn.java
 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/table/column/AbstractLunAvailableSizeColumn.java
new file mode 100644
index 0000000..62450ba
--- /dev/null
+++ 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/table/column/AbstractLunAvailableSizeColumn.java
@@ -0,0 +1,49 @@
+package org.ovirt.engine.ui.common.widget.table.column;
+
+import com.google.gwt.safehtml.shared.SafeHtml;
+import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
+import org.ovirt.engine.ui.common.widget.table.cell.AbstractToggleButtonCell;
+import org.ovirt.engine.ui.uicommonweb.models.storage.LunModel;
+
+import com.google.gwt.user.cellview.client.Column;
+
+public abstract class AbstractLunAvailableSizeColumn extends Column<LunModel, 
LunModel> {
+
+    public AbstractLunAvailableSizeColumn() {
+        super(new AbstractToggleButtonCell<LunModel>() {
+            @Override
+            public void onClickEvent(LunModel lunModel) {
+                if (lunModel !=null) {
+                    
lunModel.setAdditionalAvailableSizeSelected(!lunModel.isAdditionalAvailableSizeSelected());
+                }
+            }
+            @Override
+            public void render(Context context, LunModel value, 
SafeHtmlBuilder sb, String id) {
+                boolean isGrayedOut = value.getIsGrayedOut();
+                String inputId = id + "_input"; //$NON-NLS-1$
+
+                SafeHtml input = null;
+
+                int additionalAvailableSizeSize = 
value.getAdditionalAvailableSize();
+                String additionalAvailableSizeSizeString = "+ " + //$NON-NLS-1$
+                        additionalAvailableSizeSize + " GB"; //$NON-NLS-1$
+
+                if (additionalAvailableSizeSize == 0 ) {
+                    input = templates.disabled("", "color:gray", inputId); 
//$NON-NLS-1$
+                }
+                else if (!isGrayedOut) {
+                    input = 
templates.disabled(additionalAvailableSizeSizeString, "color:black", inputId); 
//$NON-NLS-1$
+                }
+                else if (value.isAdditionalAvailableSizeSelected()) {
+                    input = templates.toggledDown(inputId, 
additionalAvailableSizeSizeString);
+                }
+                else {
+                    input = templates.toggledUp(inputId, 
additionalAvailableSizeSizeString);
+                }
+
+                sb.append(templates.span(id, input));
+
+            }
+        });
+    }
+}
diff --git 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/storage/SanStorageLunToTargetList.java
 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/storage/SanStorageLunToTargetList.java
index 734c23f..1b3e128 100644
--- 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/storage/SanStorageLunToTargetList.java
+++ 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/storage/SanStorageLunToTargetList.java
@@ -7,6 +7,7 @@
 import org.ovirt.engine.ui.common.gin.AssetProvider;
 import org.ovirt.engine.ui.common.widget.editor.EntityModelCellTable;
 import org.ovirt.engine.ui.common.widget.table.cell.CheckboxCell;
+import 
org.ovirt.engine.ui.common.widget.table.column.AbstractLunAvailableSizeColumn;
 import 
org.ovirt.engine.ui.common.widget.table.column.AbstractLunSelectionColumn;
 import org.ovirt.engine.ui.common.widget.table.column.AbstractLunTextColumn;
 import org.ovirt.engine.ui.uicommonweb.models.EntityModel;
@@ -220,6 +221,13 @@
             }
         }, constants.devSizeSanStorage(), "70px"); //$NON-NLS-1$
 
+        table.addColumn(new AbstractLunAvailableSizeColumn() {
+            @Override
+            public LunModel getValue(LunModel object) {
+                return object;
+            }
+        }, constants.devAdditionalSizeSanStorage(), "70px"); //$NON-NLS-1$
+
         table.addColumn(new AbstractLunTextColumn() {
             @Override
             public String getRawValue(LunModel model) {
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/LunModel.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/LunModel.java
index 01c362b..cf00c76 100644
--- 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/LunModel.java
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/LunModel.java
@@ -93,6 +93,38 @@
         }
     }
 
+    private int additionalAvailableSize;
+
+    public int getAdditionalAvailableSize()
+    {
+        return additionalAvailableSize;
+    }
+
+    public void setAdditionalAvailableSize(int value)
+    {
+        if (additionalAvailableSize != value)
+        {
+            additionalAvailableSize = value;
+            onPropertyChanged(new PropertyChangedEventArgs("AdditionalSize")); 
//$NON-NLS-1$
+        }
+    }
+
+    private boolean additionalAvailableSizeSelected;
+
+    public boolean isAdditionalAvailableSizeSelected()
+    {
+        return additionalAvailableSizeSelected;
+    }
+
+    public void setAdditionalAvailableSizeSelected(boolean value)
+    {
+        if (additionalAvailableSizeSelected != value)
+        {
+            additionalAvailableSizeSelected = value;
+            onPropertyChanged(new 
PropertyChangedEventArgs("AdditionalAvailableSizeSelected")); //$NON-NLS-1$
+        }
+    }
+
     private int multipathing;
 
     public int getMultipathing()
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/SanStorageModel.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/SanStorageModel.java
index 0817bfc..fc2346c 100644
--- 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/SanStorageModel.java
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/SanStorageModel.java
@@ -241,6 +241,8 @@
                 lunModel.setMultipathing(a.getPathCount());
                 lunModel.setTargets(targets);
                 lunModel.setSize(a.getDeviceSize());
+                
lunModel.setAdditionalAvailableSize(getAdditionalAvailableSize(a));
+                lunModel.setAdditionalAvailableSizeSelected(false);
                 lunModel.setIsAccessible(a.getAccessible());
                 lunModel.setStatus(a.getStatus());
                 lunModel.setIsIncluded(isIncluded);
@@ -263,6 +265,11 @@
 
         initializeItems(newItems, null);
         proposeDiscover();
+    }
+
+    private int getAdditionalAvailableSize(LUNs lun) {
+        int additionalAvailableSize = lun.getDeviceSize() - lun.getPvSize() -1;
+        return additionalAvailableSize;
     }
 
     private boolean containsLun(LunModel lunModel, Collection<EntityModel<?>> 
models, boolean isIncluded) {
@@ -458,6 +465,8 @@
                     currLun.setMultipathing(lun.getMultipathing());
                     currLun.setTargets(createTargetModelList((LUNs) 
lun.getEntity()));
                     currLun.setSize(lun.getSize());
+                    
currLun.setAdditionalAvailableSize(lun.getAdditionalAvailableSize());
+                    
currLun.setAdditionalAvailableSizeSelected(lun.isAdditionalAvailableSizeSelected());
                     currLun.setIsAccessible(lun.getIsAccessible());
                     currLun.setStatus(lun.getStatus());
                     currLun.setIsIncluded(lun.getIsIncluded());
@@ -634,6 +643,24 @@
         return luns;
     }
 
+    public ArrayList<LunModel> getLunsToRefresh()
+    {
+        ArrayList<LunModel> luns = new ArrayList<LunModel>();
+        if (!getIsGrouppedByTarget()) {
+            List<LunModel> items = (List<LunModel>) getItems();
+            for (LunModel lun : items)
+            {
+                if (lun.getIsIncluded() && 
lun.isAdditionalAvailableSizeSelected()
+                        && Linq.firstOrDefault(luns, new 
Linq.LunPredicate(lun)) == null)
+                {
+                    luns.add(lun);
+                }
+            }
+        }
+
+        return luns;
+    }
+
     public ArrayList<String> getUsedLunsMessages() {
         ArrayList<String> usedLunsMessages = new ArrayList<String>();
         UIMessages messages = ConstantsManager.getInstance().getMessages();
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/StorageListModel.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/StorageListModel.java
index dcb9afd..12152ee 100644
--- 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/StorageListModel.java
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/StorageListModel.java
@@ -1596,7 +1596,21 @@
                             new 
ExtendSANStorageDomainParameters(storageDomain1.getId(), lunIds, force),
                             null, this);
                     }
+
+                    ArrayList<String> lunToRefreshIds = new 
ArrayList<String>();
+
+                    for (LunModel lun : sanStorageModel.getLunsToRefresh()) {
+                        lunToRefreshIds.add(lun.getLunId());
+                    }
+
+                    if (lunToRefreshIds.size() > 0) {
+                        
Frontend.getInstance().runAction(VdcActionType.RefreshLunsSize,
+                                new 
ExtendSANStorageDomainParameters(storageDomain1.getId(), lunToRefreshIds, 
false),
+                                null, this);
+                    }
+
                     storageListModel.onFinish(storageListModel.context, true, 
storageListModel.storageModel);
+
                 }
             }, this);
         }
diff --git 
a/frontend/webadmin/modules/userportal-gwtp/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties
 
b/frontend/webadmin/modules/userportal-gwtp/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties
index 97e1f20..20a72a6 100644
--- 
a/frontend/webadmin/modules/userportal-gwtp/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties
+++ 
b/frontend/webadmin/modules/userportal-gwtp/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties
@@ -718,6 +718,7 @@
 DATA_CENTER_POSIX_STORAGE_NOT_SUPPORTED_IN_CURRENT_VERSION="File based 
storage" is not supported with data center compatibility version.
 DATA_CENTER_GLUSTER_STORAGE_NOT_SUPPORTED_IN_CURRENT_VERSION="Gluster based 
storage" is not supported with current data center compatibility version.
 DATA_CENTER_CINDER_STORAGE_NOT_SUPPORTED_IN_CURRENT_VERSION=Cinder based 
storage is not supported with current data center compatibility version.
+ACTION_TYPE_FAILED_REFRESH_LUNS_UNSUPPORTED_ACTION=Extend LUN size is not 
supported with current data center compatibility version.
 VDS_CANNOT_UPDATE_CLUSTER=Updating Host's Cluster cannot be performed through 
update Host action, please use Change Host Cluster action instead.
 VM_CANNOT_UPDATE_CLUSTER=Updating VM's Cluster cannot be performed through 
update VM action, please use Change VM Cluster action instead.
 VM_STATUS_NOT_VALID_FOR_UPDATE=Cannot update a VM in this status. Try stopping 
the VM first.


-- 
To view, visit https://gerrit.ovirt.org/41398
To unsubscribe, visit https://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I84c83f07f53d286f62fb6104f62fbfb37feb2b42
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Freddy Rolland <froll...@redhat.com>
Gerrit-Reviewer: Fred Rolland <froll...@redhat.com>
_______________________________________________
Engine-patches mailing list
Engine-patches@ovirt.org
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to