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