Tomas Jelinek has uploaded a new change for review.

Change subject: engine,frontend: disable new vm button if no DC is up
......................................................................

engine,frontend: disable new vm button if no DC is up

Following changes done to achive this:
- created a query to find out if there is at least one UP DC (not doing this on
  FE to avoid loading all the DCs just to get one boolean)
- added a support for setExecuteProhibitionReasons also for action buttons
- added a convenient method to set the ExecuteProhibitionReasons not using
  list but varargs

Change-Id: Id537ac56bd2d963999c5c77ea3e92b3987d82525
Bug-Url: https://bugzilla.redhat.com/show_bug.cgi?id=990059
Signed-off-by: Tomas Jelinek <tjeli...@redhat.com>
---
A 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/IsSomeStoragePoolUpByClusterServiceQuery.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java
M 
frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/action/AbstractActionPanel.java
M 
frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/action/AbstractButtonDefinition.java
M 
frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/action/ActionButtonDefinition.java
M 
frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/action/UiCommandButtonDefinition.java
M 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/UICommand.java
M 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/userportal/UserPortalListModel.java
M 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/NewVmModelBehavior.java
M 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/VmListModel.java
M 
frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/UIConstants.java
11 files changed, 153 insertions(+), 11 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/85/18885/1

diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/IsSomeStoragePoolUpByClusterServiceQuery.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/IsSomeStoragePoolUpByClusterServiceQuery.java
new file mode 100644
index 0000000..cfe59b8
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/IsSomeStoragePoolUpByClusterServiceQuery.java
@@ -0,0 +1,32 @@
+package org.ovirt.engine.core.bll.storage;
+
+import java.util.List;
+import org.ovirt.engine.core.bll.QueriesCommandBase;
+import org.ovirt.engine.core.common.businessentities.StoragePool;
+import org.ovirt.engine.core.common.businessentities.StoragePoolStatus;
+import 
org.ovirt.engine.core.common.queries.GetStoragePoolsByClusterServiceParameters;
+
+public class IsSomeStoragePoolUpByClusterServiceQuery<P extends 
GetStoragePoolsByClusterServiceParameters> extends QueriesCommandBase<P> {
+
+    public IsSomeStoragePoolUpByClusterServiceQuery(P parameters) {
+        super(parameters);
+    }
+
+    @Override
+    protected void executeQueryCommand() {
+        List<StoragePool> storagePools = getDbFacade().getStoragePoolDao()
+                .getDataCentersByClusterService(
+                        getParameters().isSupportsVirtService(),
+                        getParameters().isSupportsGlusterService());
+
+        boolean foundUpStoragePool = false;
+        for (StoragePool storagePool : storagePools) {
+            if (storagePool.getstatus() == StoragePoolStatus.Up) {
+                foundUpStoragePool = true;
+                break;
+            }
+        }
+
+        getQueryReturnValue().setReturnValue(foundUpStoragePool);
+    }
+}
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java
index cd67bbe..6059111 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java
@@ -208,6 +208,7 @@
     GetStorageDomainByIdAndStoragePoolId,
     GetStoragePoolsByStorageDomainId,
     GetStoragePoolsByClusterService(VdcQueryAuthType.User),
+    IsSomeStoragePoolUpByClusterService(VdcQueryAuthType.User),
     GetStorageDomainListById,
     GetLunsByVgId,
     GetPermittedStorageDomainsByStoragePoolId(VdcQueryAuthType.User),
diff --git 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/action/AbstractActionPanel.java
 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/action/AbstractActionPanel.java
index 1b927cc..49c3763 100644
--- 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/action/AbstractActionPanel.java
+++ 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/action/AbstractActionPanel.java
@@ -287,7 +287,18 @@
     void updateActionButton(ActionButton button, ActionButtonDefinition<T> 
buttonDef) {
         
button.asWidget().setVisible(buttonDef.isAccessible(getSelectedItems()) && 
buttonDef.isVisible(getSelectedItems()));
         button.setEnabled(buttonDef.isEnabled(getSelectedItems()));
-        button.setTitle(buttonDef.getButtonToolTip() != null ? 
buttonDef.getButtonToolTip() : buttonDef.getTitle());
+        String tooltip = buttonDef.getButtonToolTip() != null ? 
buttonDef.getButtonToolTip() : buttonDef.getTitle();
+        if (!buttonDef.isEnabled(getSelectedItems()) && 
!buttonDef.getDisabledReasons(getSelectedItems()).isEmpty()) {
+            String reasons = " "; //$NON-NLS-1$
+            for(String reason : 
buttonDef.getDisabledReasons(getSelectedItems())) {
+                reasons += reason + ", "; //$NON-NLS-1$
+            }
+
+            reasons = reasons.substring(0, reasons.length() - 2);
+
+            tooltip = tooltip + reasons;
+        }
+        button.setTitle(tooltip);
     }
 
     /**
diff --git 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/action/AbstractButtonDefinition.java
 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/action/AbstractButtonDefinition.java
index 2a1a106..19e0f36 100644
--- 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/action/AbstractButtonDefinition.java
+++ 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/action/AbstractButtonDefinition.java
@@ -1,6 +1,7 @@
 package org.ovirt.engine.ui.common.widget.action;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 
 import com.google.gwt.event.logical.shared.InitializeEvent;
@@ -92,6 +93,14 @@
         return reg;
     }
 
+    /**
+     * An empty default implementation
+     */
+    @Override
+    public List<String> getDisabledReasons(List<T> selectedItems) {
+        return Collections.emptyList();
+    }
+
     @Override
     public boolean isVisible(List<T> selectedItems) {
         return true;
diff --git 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/action/ActionButtonDefinition.java
 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/action/ActionButtonDefinition.java
index 48efec8..81385ca 100644
--- 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/action/ActionButtonDefinition.java
+++ 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/action/ActionButtonDefinition.java
@@ -24,6 +24,13 @@
     boolean isEnabled(List<T> selectedItems);
 
     /**
+     * If the isEnabled returns false, this may return also the reasons why is 
this button not enabled or
+     * an empty list if the reasons are not specified
+     * If the isEnabled returns true, this will always return an empty list
+     */
+    public List<String> getDisabledReasons(List<T> selectedItems);
+
+    /**
      * Checks whether or not the current user has the right to access this 
action button.
      */
     boolean isAccessible(List<T> selectedItems);
diff --git 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/action/UiCommandButtonDefinition.java
 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/action/UiCommandButtonDefinition.java
index fc2731f..d770414 100644
--- 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/action/UiCommandButtonDefinition.java
+++ 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/action/UiCommandButtonDefinition.java
@@ -1,5 +1,6 @@
 package org.ovirt.engine.ui.common.widget.action;
 
+import java.util.Collections;
 import java.util.List;
 
 import org.ovirt.engine.ui.common.uicommon.model.UiCommonInitEvent;
@@ -139,6 +140,15 @@
     }
 
     @Override
+    public List<String> getDisabledReasons(List<T> selectedItems) {
+        if (command == null || command.getExecuteProhibitionReasons() == null) 
{
+            return Collections.emptyList();
+        }
+
+        return command.getExecuteProhibitionReasons();
+    }
+
+    @Override
     public void onClick(List<T> selectedItems) {
         command.execute();
     }
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/UICommand.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/UICommand.java
index 7a25edb..f9baf67 100644
--- 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/UICommand.java
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/UICommand.java
@@ -1,5 +1,7 @@
 package org.ovirt.engine.ui.uicommonweb;
 
+import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 
 import org.ovirt.engine.ui.uicommonweb.models.Model;
@@ -29,8 +31,8 @@
      */
     public void setIsExecutionAllowed(boolean value)
     {
-        if (isExecutionAllowed != value)
-        {
+//        if (isExecutionAllowed != value)
+//        {
             isExecutionAllowed = value;
             if (value)
             {
@@ -38,7 +40,7 @@
             }
 
             onPropertyChanged(new 
PropertyChangedEventArgs("IsExecutionAllowed")); //$NON-NLS-1$
-        }
+//        }
     }
 
     private List<String> privateExecuteProhibitionReasons;
@@ -48,6 +50,11 @@
         return privateExecuteProhibitionReasons;
     }
 
+    public void setExecuteProhibitionReasons(String... values) {
+        // the new ArrayList is to make it a modifiable list
+        setExecuteProhibitionReasons(new 
ArrayList<String>(Arrays.asList(values)));
+    }
+
     public void setExecuteProhibitionReasons(List<String> value)
     {
         privateExecuteProhibitionReasons = value;
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/userportal/UserPortalListModel.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/userportal/UserPortalListModel.java
index 8f12e80..e3e0614 100644
--- 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/userportal/UserPortalListModel.java
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/userportal/UserPortalListModel.java
@@ -30,6 +30,9 @@
 import org.ovirt.engine.core.common.businessentities.VmTemplate;
 import org.ovirt.engine.core.common.businessentities.VmType;
 import 
org.ovirt.engine.core.common.businessentities.comparators.NameableComparator;
+import org.ovirt.engine.core.common.interfaces.SearchType;
+import 
org.ovirt.engine.core.common.queries.GetStoragePoolsByClusterServiceParameters;
+import org.ovirt.engine.core.common.queries.SearchParameters;
 import org.ovirt.engine.core.common.queries.VdcQueryParametersBase;
 import org.ovirt.engine.core.common.queries.VdcQueryReturnValue;
 import org.ovirt.engine.core.common.queries.VdcQueryType;
@@ -83,8 +86,9 @@
 import org.ovirt.engine.ui.uicompat.ObservableCollection;
 import org.ovirt.engine.ui.uicompat.PropertyChangedEventArgs;
 
-public class UserPortalListModel extends IUserPortalListModel implements 
IVmPoolResolutionService
-{
+public class UserPortalListModel extends IUserPortalListModel implements 
IVmPoolResolutionService {
+
+    private boolean isSomeDataCenterUp;
 
     public static EventDefinition SearchCompletedEventDefinition;
     private Event privateSearchCompletedEvent;
@@ -313,9 +317,31 @@
     }
 
     @Override
-    protected void syncSearch()
-    {
+    protected void syncSearch() {
         super.syncSearch();
+
+        final GetStoragePoolsByClusterServiceParameters parameters = new 
GetStoragePoolsByClusterServiceParameters();
+        parameters.setSupportsVirtService(true);
+        parameters.setSupportsGlusterService(false);
+
+        AsyncQuery query = new AsyncQuery(this,
+                new INewAsyncCallback() {
+                    @Override
+                    public void onSuccess(Object target, Object returnValue) {
+                        isSomeDataCenterUp = ((VdcQueryReturnValue) 
returnValue).getReturnValue();
+
+                        SearchParameters tempVar = new 
SearchParameters(getSearchString(), SearchType.VM);
+                        tempVar.setMaxCount(getSearchPageSize());
+                        doUpdateVmsAndPools();
+                    }
+                });
+
+
+
+        Frontend.RunQuery(VdcQueryType.IsSomeStoragePoolUpByClusterService, 
parameters, query);
+    }
+
+    private void doUpdateVmsAndPools() {
         VdcQueryParametersBase queryParameters = new VdcQueryParametersBase();
         queryParameters.setRefresh(getIsQueryFirstTime());
         Frontend.RunQuery(VdcQueryType.GetAllVmsAndVmPools, queryParameters,
@@ -686,6 +712,12 @@
     {
         UserPortalItemModel selectedItem = (UserPortalItemModel) 
getSelectedItem();
 
+        if (!isSomeDataCenterUp) {
+            
getNewVmCommand().setExecuteProhibitionReasons(ConstantsManager.getInstance().getConstants().newVmOnlyIfUpDC());
+        }
+
+        getNewVmCommand().setIsExecutionAllowed(isSomeDataCenterUp);
+
         getEditCommand().setIsExecutionAllowed(selectedItem != null && 
!selectedItem.isPool());
 
         getRemoveCommand().setIsExecutionAllowed(selectedItem != null
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/NewVmModelBehavior.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/NewVmModelBehavior.java
index 2edf060..4048f10 100644
--- 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/NewVmModelBehavior.java
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/NewVmModelBehavior.java
@@ -46,6 +46,7 @@
                                 dataCenters.add(a);
                             }
                         }
+
                         AsyncDataProvider.getClusterListByService(
                                 new AsyncQuery(getModel(), new 
INewAsyncCallback() {
 
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/VmListModel.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/VmListModel.java
index c9f19b8..9a19051 100644
--- 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/VmListModel.java
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/VmListModel.java
@@ -45,9 +45,11 @@
 import org.ovirt.engine.core.common.businessentities.VmWatchdogType;
 import org.ovirt.engine.core.common.interfaces.SearchType;
 import org.ovirt.engine.core.common.mode.ApplicationMode;
+import 
org.ovirt.engine.core.common.queries.GetStoragePoolsByClusterServiceParameters;
 import org.ovirt.engine.core.common.queries.IdQueryParameters;
 import org.ovirt.engine.core.common.queries.SearchParameters;
 import org.ovirt.engine.core.common.queries.VdcQueryParametersBase;
+import org.ovirt.engine.core.common.queries.VdcQueryReturnValue;
 import org.ovirt.engine.core.common.queries.VdcQueryType;
 import org.ovirt.engine.core.compat.Guid;
 import org.ovirt.engine.core.compat.StringHelper;
@@ -98,6 +100,8 @@
 
 public class VmListModel extends VmBaseListModel<VM> implements 
ISupportSystemTreeContext, UserSelectedDisplayProtocolManager
 {
+
+    private boolean isSomeDataCenterUp;
 
     public static final Version BALLOON_DEVICE_MIN_VERSION = Version.v3_2;
     private UICommand newVMCommand;
@@ -645,9 +649,27 @@
     @Override
     protected void syncSearch()
     {
-        SearchParameters tempVar = new SearchParameters(getSearchString(), 
SearchType.VM);
-        tempVar.setMaxCount(getSearchPageSize());
-        super.syncSearch(VdcQueryType.Search, tempVar);
+        final GetStoragePoolsByClusterServiceParameters parameters = new 
GetStoragePoolsByClusterServiceParameters();
+        parameters.setSupportsVirtService(true);
+        parameters.setSupportsGlusterService(false);
+
+        AsyncQuery query = new AsyncQuery(this,
+                new INewAsyncCallback() {
+                    @Override
+                    public void onSuccess(Object target, Object returnValue) {
+                        isSomeDataCenterUp = ((VdcQueryReturnValue) 
returnValue).getReturnValue();
+
+                        SearchParameters tempVar = new 
SearchParameters(getSearchString(), SearchType.VM);
+                        tempVar.setMaxCount(getSearchPageSize());
+                        VmListModel.super.syncSearch(VdcQueryType.Search, 
tempVar);
+                    }
+                });
+
+
+
+        Frontend.RunQuery(VdcQueryType.IsSomeStoragePoolUpByClusterService, 
parameters, query);
+
+
     }
 
     private void updateConsoleModels() {
@@ -2297,6 +2319,13 @@
                 getSelectedItems() != null && getSelectedItem() != null ? 
getSelectedItems()
                         : new ArrayList();
 
+
+        if (!isSomeDataCenterUp) {
+            
getNewVmCommand().setExecuteProhibitionReasons(ConstantsManager.getInstance().getConstants().newVmOnlyIfUpDC());
+        }
+
+        getNewVmCommand().setIsExecutionAllowed(isSomeDataCenterUp);
+
         
getEditCommand().setIsExecutionAllowed(isEditCommandExecutionAllowed(items));
         getRemoveCommand().setIsExecutionAllowed(items.size() > 0
                 && VdcActionUtils.CanExecute(items, VM.class, 
VdcActionType.RemoveVm));
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 7f351be..2035d75 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
@@ -114,6 +114,9 @@
     @DefaultStringValue("New Virtual Machine")
     String newVmTitle();
 
+    @DefaultStringValue("Available only if at least one DC is UP.")
+    String newVmOnlyIfUpDC();
+
     @DefaultStringValue("Edit Virtual Machine")
     String editVmTitle();
 


-- 
To view, visit http://gerrit.ovirt.org/18885
To unsubscribe, visit http://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Id537ac56bd2d963999c5c77ea3e92b3987d82525
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Tomas Jelinek <tjeli...@redhat.com>
_______________________________________________
Engine-patches mailing list
Engine-patches@ovirt.org
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to