Martin Beták has uploaded a new change for review.

Change subject: fontend: Correct host list on New Storage Domain creation
......................................................................

fontend: Correct host list on New Storage Domain creation

Only show hosts from cluster with virt-service enabled.

Previously implemented by various search and getAllVds queries, depending on DC
type and its selection. Now unified into a single command/stored procedure.

Change-Id: Ifd2b1e7882c8527a80c8f340c4b0c363ba0b0f32
Bug-Url: https://bugzilla.redhat.com/show_bug.cgi?id=882928
Signed-off-by: Martin Betak <mbe...@redhat.com>
---
M backend/manager/dbscripts/vds_sp.sql
A 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/GetSpmCandidatesQuery.java
A 
backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/GetSpmCandidatesQueryTest.java
A 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/GetSpmCandidatesQueryParameters.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java
M 
backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VdsDAO.java
M 
backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VdsDAODbFacadeImpl.java
M 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/dataprovider/AsyncDataProvider.java
M 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/StorageModel.java
9 files changed, 139 insertions(+), 73 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/97/15397/1

diff --git a/backend/manager/dbscripts/vds_sp.sql 
b/backend/manager/dbscripts/vds_sp.sql
index 823eab9..fe2a6b4 100644
--- a/backend/manager/dbscripts/vds_sp.sql
+++ b/backend/manager/dbscripts/vds_sp.sql
@@ -880,6 +880,22 @@
 END; $procedure$
 LANGUAGE plpgsql;
 
+CREATE OR REPLACE FUNCTION getSpmCandidates(v_storage_pool_id UUID, 
v_local_fs_only BOOLEAN) RETURNS SETOF vds
+   AS $procedure$
+BEGIN
+    BEGIN
+        RETURN QUERY SELECT vds.*
+        FROM vds
+        LEFT JOIN vds_groups vg ON vds.vds_group_id = vg.vds_group_id
+        LEFT JOIN storage_pool sp ON vds.storage_pool_id = sp.id
+        WHERE (v_storage_pool_id IS NULL OR vds.storage_pool_id = 
v_storage_pool_id)
+        AND (vg.virt_service = true)
+        AND (NOT v_local_fs_only OR sp.storage_pool_type = 4)
+        AND (v_storage_pool_id IS NOT NULL OR vds.status = 3); -- if DC is 
unspecified return only hosts with status = UP
+    END;
+    RETURN;
+END; $procedure$
+LANGUAGE plpgsql;
 
 Create or replace FUNCTION UpdateVdsDynamicStatus(
         v_vds_guid UUID,
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/GetSpmCandidatesQuery.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/GetSpmCandidatesQuery.java
new file mode 100644
index 0000000..bc23cb0
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/GetSpmCandidatesQuery.java
@@ -0,0 +1,15 @@
+package org.ovirt.engine.core.bll;
+
+import org.ovirt.engine.core.common.queries.GetSpmCandidatesQueryParameters;
+
+public class GetSpmCandidatesQuery<P extends GetSpmCandidatesQueryParameters> 
extends QueriesCommandBase<P> {
+    public GetSpmCandidatesQuery(P parameters) {
+        super(parameters);
+    }
+
+    @Override
+    protected void executeQueryCommand() {
+        
getQueryReturnValue().setReturnValue(getDbFacade().getVdsDao().getSpmCandidates(
+                getParameters().getStoragePoolId(), 
getParameters().isLocalFsOnly()));
+    }
+}
diff --git 
a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/GetSpmCandidatesQueryTest.java
 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/GetSpmCandidatesQueryTest.java
new file mode 100644
index 0000000..114df77
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/GetSpmCandidatesQueryTest.java
@@ -0,0 +1,41 @@
+package org.ovirt.engine.core.bll;
+
+import org.junit.Test;
+import org.ovirt.engine.core.common.businessentities.VDS;
+import org.ovirt.engine.core.common.queries.GetSpmCandidatesQueryParameters;
+import org.ovirt.engine.core.compat.Guid;
+import org.ovirt.engine.core.dao.VdsDAO;
+
+import java.util.Collections;
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+public class GetSpmCandidatesQueryTest extends 
AbstractUserQueryTest<GetSpmCandidatesQueryParameters, 
GetSpmCandidatesQuery<GetSpmCandidatesQueryParameters>> {
+
+    @Test
+    public void testExecuteQueryCommand() {
+        // Prepare the parameters
+        Guid spId = Guid.NewGuid();
+        when(getQueryParameters().getStoragePoolId()).thenReturn(spId);
+        when(getQueryParameters().isLocalFsOnly()).thenReturn(false);
+
+        // Prepare the result
+        VDS vds = new VDS();
+        vds.setStoragePoolId(spId);
+        List<VDS> result = Collections.singletonList(vds);
+
+        // Mock the DAO
+        VdsDAO vdsDAOMock = mock(VdsDAO.class);
+        when(vdsDAOMock.getSpmCandidates(spId, 
getQueryParameters().isLocalFsOnly())).thenReturn(result);
+        when(getDbFacadeMockInstance().getVdsDao()).thenReturn(vdsDAOMock);
+
+        // Execute the query
+        getQuery().executeQueryCommand();
+
+        // Check the result
+        assertEquals("Wrong roles returned", result, 
getQuery().getQueryReturnValue().getReturnValue());
+    }
+}
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/GetSpmCandidatesQueryParameters.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/GetSpmCandidatesQueryParameters.java
new file mode 100644
index 0000000..00c2c6e
--- /dev/null
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/GetSpmCandidatesQueryParameters.java
@@ -0,0 +1,17 @@
+package org.ovirt.engine.core.common.queries;
+
+import org.ovirt.engine.core.compat.Guid;
+
+public class GetSpmCandidatesQueryParameters extends 
StoragePoolQueryParametersBase {
+
+    private boolean localFsOnly;
+
+    public GetSpmCandidatesQueryParameters(Guid storagePoolId, boolean 
localFsOnly) {
+        super(storagePoolId);
+        this.localFsOnly = localFsOnly;
+    }
+
+    public boolean isLocalFsOnly() {
+        return localFsOnly;
+    }
+}
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 072e58a..e5c5c3d 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
@@ -31,6 +31,7 @@
     IsDisplayAddressConsistentInCluster,
     GetAllVdsByStoragePool(VdcQueryAuthType.User),
     GetHostListFromExternalProvider(),
+    GetSpmCandidates,
 
     // Vds Networks
     GetVdsInterfacesByVdsId(VdcQueryAuthType.User),
diff --git 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VdsDAO.java
 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VdsDAO.java
index 909b1d8..29e308f 100644
--- 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VdsDAO.java
+++ 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VdsDAO.java
@@ -199,4 +199,15 @@
      * @return the list of VDS instances
      */
     List<VDS> getAllWithoutNetwork(Guid networkId);
+
+    /**
+     * Retrieves all VDS instances that can be used as SPM in given Storage 
Pool
+     *
+     * @param storagePoolId
+     *          Id of selected Storage Pool or null if querying for all
+     * @param localFsOnly
+     *          true if selecting candidates for LocalFS storage domain
+     * @return the list of VDS instances
+     */
+    List<VDS> getSpmCandidates(Guid storagePoolId, boolean localFsOnly);
 }
diff --git 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VdsDAODbFacadeImpl.java
 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VdsDAODbFacadeImpl.java
index efd9ced..9e9e11d 100644
--- 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VdsDAODbFacadeImpl.java
+++ 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VdsDAODbFacadeImpl.java
@@ -131,6 +131,17 @@
     }
 
     @Override
+    public List<VDS> getSpmCandidates(Guid storagePoolId, boolean localFsOnly) 
{
+        // normalize to uniquely represent in DB that we want candidates from 
all DC's
+        storagePoolId = storagePoolId.equals(Guid.Empty) ? null : 
storagePoolId;
+        return getCallsHandler().executeReadList("getSpmCandidates",
+                VdsRowMapper.instance,
+                getCustomMapSqlParameterSource()
+                    .addValue("storage_pool_id", storagePoolId)
+                    .addValue("local_fs_only", localFsOnly));
+    }
+
+    @Override
     public List<VDS> getAllForStoragePool(Guid storagePool) {
         return getAllForStoragePool(storagePool, null, false);
     }
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/dataprovider/AsyncDataProvider.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/dataprovider/AsyncDataProvider.java
index 0f7dded..f0dc089 100644
--- 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/dataprovider/AsyncDataProvider.java
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/dataprovider/AsyncDataProvider.java
@@ -76,6 +76,7 @@
 import 
org.ovirt.engine.core.common.queries.GetImagesListByStoragePoolIdParameters;
 import org.ovirt.engine.core.common.queries.GetLunsByVgIdParameters;
 import 
org.ovirt.engine.core.common.queries.GetPermittedStorageDomainsByStoragePoolIdParameters;
+import org.ovirt.engine.core.common.queries.GetSpmCandidatesQueryParameters;
 import 
org.ovirt.engine.core.common.queries.GetStorageDomainsByConnectionParameters;
 import 
org.ovirt.engine.core.common.queries.GetStorageDomainsByVmTemplateIdQueryParameters;
 import 
org.ovirt.engine.core.common.queries.GetStoragePoolsByClusterServiceParameters;
@@ -1058,6 +1059,23 @@
         Frontend.RunQuery(VdcQueryType.Search, searchParameters, aQuery);
     }
 
+    public static void getSpmCandidates(AsyncQuery aQuery, Guid storagePoolId, 
boolean localFsOnly) {
+        aQuery.converterCallback = new IAsyncConverter() {
+            @Override
+            public Object Convert(Object source, AsyncQuery _asyncQuery)
+            {
+                if (source != null)
+                {
+                    ArrayList<VDS> list = Linq.<VDS> 
cast((ArrayList<IVdcQueryable>) source);
+                    return list;
+                }
+
+                return new ArrayList<VDS>();
+            }
+        };
+        Frontend.RunQuery(VdcQueryType.GetSpmCandidates, new 
GetSpmCandidatesQueryParameters(storagePoolId, localFsOnly), aQuery);
+    }
+
     public static void getVolumeList(AsyncQuery aQuery, String clusterName) {
 
         if ((ApplicationModeHelper.getUiMode().getValue() & 
ApplicationMode.GlusterOnly.getValue()) == 0) {
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/StorageModel.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/StorageModel.java
index 94926e9..71aceb4 100644
--- 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/StorageModel.java
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/StorageModel.java
@@ -19,10 +19,7 @@
 import org.ovirt.engine.core.common.businessentities.VDSStatus;
 import org.ovirt.engine.core.common.businessentities.VDSType;
 import org.ovirt.engine.core.common.businessentities.VdsSpmStatus;
-import org.ovirt.engine.core.common.interfaces.SearchType;
 import org.ovirt.engine.core.common.queries.ConfigurationValues;
-import org.ovirt.engine.core.common.queries.SearchParameters;
-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;
@@ -518,78 +515,17 @@
 
         StoragePool dataCenter = (StoragePool) 
getDataCenter().getSelectedItem();
 
-        if (getSelectedItem() instanceof LocalStorageModel
-                && (dataCenter == null || 
dataCenter.getId().equals(UnassignedDataCenterId)))
-        {
-            ArrayList<StoragePool> dataCenterList =
-                    (ArrayList<StoragePool>) getDataCenter().getItems();
-            ArrayList<StoragePool> localDCList = new ArrayList<StoragePool>();
-            StringBuilder dataCenterQueryLine = new StringBuilder();
+        boolean localFsOnly = getSelectedItem() instanceof LocalStorageModel;
+        Guid dataCenterId = dataCenter == null ? null : dataCenter.getId();
 
-            for (StoragePool storagePool : dataCenterList)
-            {
-                if (storagePool.getstorage_pool_type() == StorageType.LOCALFS)
-                {
-                    localDCList.add(storagePool);
-                }
+        AsyncDataProvider.getSpmCandidates(new AsyncQuery(this, new 
INewAsyncCallback() {
+            @Override
+            public void onSuccess(Object model, Object returnValue) {
+                StorageModel storageModel = (StorageModel) model;
+                Iterable<VDS> hosts = (Iterable<VDS>) returnValue;
+                storageModel.postUpdateHost(hosts);
             }
-
-            if (localDCList.size() > 0)
-            {
-                int i = 0;
-                for (; i < localDCList.size() - 1; i++)
-                {
-                    
dataCenterQueryLine.append("datacenter=").append(localDCList.get(i).getname()).append("
 or "); //$NON-NLS-1$ //$NON-NLS-2$
-                }
-                
dataCenterQueryLine.append("datacenter=").append(localDCList.get(i).getname()); 
//$NON-NLS-1$
-
-                AsyncQuery _asyncQuery = new AsyncQuery();
-                _asyncQuery.setModel(this);
-                _asyncQuery.setContext(getHash());
-                _asyncQuery.asyncCallback = new INewAsyncCallback() {
-                    @Override
-                    public void onSuccess(Object model, Object ReturnValue)
-                    {
-                        StorageModel storageModel = (StorageModel) model;
-                        Iterable<VDS> hosts =
-                                (ArrayList<VDS>) ((VdcQueryReturnValue) 
ReturnValue).getReturnValue();
-                        storageModel.postUpdateHost(hosts);
-                    }
-                };
-                Frontend.RunQuery(VdcQueryType.Search, new 
SearchParameters("Hosts: status=Up " + dataCenterQueryLine.toString(), 
//$NON-NLS-1$
-                        SearchType.VDS), _asyncQuery);
-            }
-        }
-        else
-        {
-            if (dataCenter == null || 
dataCenter.getId().equals(UnassignedDataCenterId))
-            {
-                AsyncDataProvider.getHostList(new AsyncQuery(this,
-                        new INewAsyncCallback() {
-                            @Override
-                            public void onSuccess(Object target, Object 
returnValue) {
-
-                                StorageModel storageModel = (StorageModel) 
target;
-                                Iterable<VDS> hosts = (Iterable<VDS>) 
returnValue;
-                                storageModel.postUpdateHost(hosts);
-                            }
-                        }, getHash()));
-            }
-            else
-            {
-                AsyncDataProvider.getHostListByDataCenter(new AsyncQuery(this,
-                        new INewAsyncCallback() {
-                            @Override
-                            public void onSuccess(Object target, Object 
returnValue) {
-
-                                StorageModel storageModel = (StorageModel) 
target;
-                                Iterable<VDS> hosts = (Iterable<VDS>) 
returnValue;
-                                storageModel.postUpdateHost(hosts);
-
-                            }
-                        }, getHash()), dataCenter.getId());
-            }
-        }
+        }, getHash()), dataCenterId, localFsOnly);
     }
 
     public void postUpdateHost(Iterable<VDS> hosts)


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

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ifd2b1e7882c8527a80c8f340c4b0c363ba0b0f32
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Martin Beták <mbe...@redhat.com>
_______________________________________________
Engine-patches mailing list
Engine-patches@ovirt.org
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to