Lior Vernia has uploaded a new change for review. Change subject: webadmin: Don't display DCs that imported external network ......................................................................
webadmin: Don't display DCs that imported external network Changed the import networks dialog so that the choice of DC to import an external network to, will only include DCs where the network doesn't exist yet. This required modification of the backend query to not only retrieve all the external networks that exist on a provider, but also map each network to the set of DCs where that network had already been imported. This set is then used to efficiently check whether a certain external network had been imported to a certain DC. Change-Id: Ifd76b527500957ec47db6d60894b0d7316d17058 Bug-Url: https://bugzilla.redhat.com/989909 Signed-off-by: Lior Vernia <[email protected]> --- M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/provider/network/GetAllExternalNetworksOnProviderQuery.java M backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/provider/network/GetAllExternalNetworksOnProviderQueryTest.java M backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/StoragePoolDAO.java M backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/StoragePoolDAODbFacadeImpl.java M backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/FixturesTool.java M backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/StoragePoolDAOTest.java M backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/network/NetworkDaoTest.java M backend/manager/modules/dal/src/test/resources/fixtures.xml 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/networks/ImportNetworksModel.java M packaging/dbscripts/storages_sp.sql 11 files changed, 135 insertions(+), 18 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/05/20605/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/provider/network/GetAllExternalNetworksOnProviderQuery.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/provider/network/GetAllExternalNetworksOnProviderQuery.java index 0c16d80..777b90b 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/provider/network/GetAllExternalNetworksOnProviderQuery.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/provider/network/GetAllExternalNetworksOnProviderQuery.java @@ -1,9 +1,17 @@ package org.ovirt.engine.core.bll.provider.network; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + import org.ovirt.engine.core.bll.QueriesCommandBase; import org.ovirt.engine.core.bll.provider.ProviderProxyFactory; import org.ovirt.engine.core.common.businessentities.Provider; +import org.ovirt.engine.core.common.businessentities.network.Network; import org.ovirt.engine.core.common.queries.IdQueryParameters; +import org.ovirt.engine.core.compat.Guid; public class GetAllExternalNetworksOnProviderQuery<P extends IdQueryParameters> extends QueriesCommandBase<P> { @@ -14,10 +22,21 @@ @Override protected void executeQueryCommand() { Provider<?> provider = getDbFacade().getProviderDao().get(getParameters().getId()); - if (provider != null) { - NetworkProviderProxy client = getProviderProxyFactory().create(provider); - getQueryReturnValue().setReturnValue(client.getAll()); + if (provider == null) { + return; } + + NetworkProviderProxy client = getProviderProxyFactory().create(provider); + List<Network> externalNetworks = client.getAll(); + + Map<Network, Set<Guid>> externalNetworkToDcId = new HashMap<Network, Set<Guid>>(); + for (Network network : externalNetworks) { + List<Guid> dcIds = + getDbFacade().getStoragePoolDao().getDcIdByExternalNetworkId(network.getProvidedBy().getExternalId()); + externalNetworkToDcId.put(network, new HashSet<Guid>(dcIds)); + } + + getQueryReturnValue().setReturnValue(externalNetworkToDcId); } protected ProviderProxyFactory getProviderProxyFactory() { diff --git a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/provider/network/GetAllExternalNetworksOnProviderQueryTest.java b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/provider/network/GetAllExternalNetworksOnProviderQueryTest.java index 87f3c79..09aed45 100644 --- a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/provider/network/GetAllExternalNetworksOnProviderQueryTest.java +++ b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/provider/network/GetAllExternalNetworksOnProviderQueryTest.java @@ -6,7 +6,10 @@ import static org.mockito.Mockito.when; import java.util.Arrays; -import java.util.List; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; import org.junit.Test; import org.junit.runner.RunWith; @@ -17,8 +20,10 @@ import org.ovirt.engine.core.common.businessentities.Provider; import org.ovirt.engine.core.common.businessentities.Provider.AdditionalProperties; import org.ovirt.engine.core.common.businessentities.network.Network; +import org.ovirt.engine.core.common.businessentities.network.ProviderNetwork; import org.ovirt.engine.core.common.queries.IdQueryParameters; import org.ovirt.engine.core.compat.Guid; +import org.ovirt.engine.core.dao.StoragePoolDAO; import org.ovirt.engine.core.dao.provider.ProviderDao; @RunWith(MockitoJUnitRunner.class) @@ -30,6 +35,9 @@ @Mock private ProviderDao providerDao; + + @Mock + private StoragePoolDAO dcDao; @Mock private ProviderProxyFactory providerProxyFactory; @@ -46,8 +54,18 @@ when(getQuery().getProviderProxyFactory()).thenReturn(providerProxyFactory); when(providerProxyFactory.create(networkProvider)).thenReturn(client); - List<Network> expected = Arrays.asList(mock(Network.class)); - when(client.getAll()).thenReturn(expected); + Network network = mock(Network.class); + ProviderNetwork providerNetwork = mock(ProviderNetwork.class); + when(client.getAll()).thenReturn(Arrays.asList(network)); + when(network.getProvidedBy()).thenReturn(providerNetwork); + when(providerNetwork.getExternalId()).thenReturn(""); + + Guid id = mock(Guid.class); + when(getDbFacadeMockInstance().getStoragePoolDao()).thenReturn(dcDao); + when(dcDao.getDcIdByExternalNetworkId(any(String.class))).thenReturn(Arrays.asList(id)); + + Map<Network, Set<Guid>> expected = new HashMap<Network, Set<Guid>>(); + expected.put(network, Collections.singleton(id)); GetAllExternalNetworksOnProviderQuery<IdQueryParameters> query = getQuery(); query.executeQueryCommand(); diff --git a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/StoragePoolDAO.java b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/StoragePoolDAO.java index dd39c47..6a1c5c4 100644 --- a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/StoragePoolDAO.java +++ b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/StoragePoolDAO.java @@ -120,4 +120,13 @@ */ List<StoragePool> getDataCentersByClusterService(boolean supportsVirtService, boolean supportsGlusterService); + /** + * Retrieves the IDs of all data centers to which an external network has been imported. + * + * @param externalId + * the external network's external ID. + * @return the list of data center IDs. + */ + List<Guid> getDcIdByExternalNetworkId(String externalId); + } diff --git a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/StoragePoolDAODbFacadeImpl.java b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/StoragePoolDAODbFacadeImpl.java index 1fbd5c4..175c21f 100644 --- a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/StoragePoolDAODbFacadeImpl.java +++ b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/StoragePoolDAODbFacadeImpl.java @@ -230,4 +230,11 @@ return getCallsHandler().executeReadList("GetStoragePoolsByClusterService", mapper, parameterSource); } + @Override + public List<Guid> getDcIdByExternalNetworkId(String externalId) { + return getCallsHandler().executeReadList("GetDcIdByExternalNetworkId", + createGuidMapper(), + getCustomMapSqlParameterSource().addValue("external_id", externalId)); + } + } diff --git a/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/FixturesTool.java b/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/FixturesTool.java index 8ea1914..021789c 100644 --- a/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/FixturesTool.java +++ b/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/FixturesTool.java @@ -434,6 +434,9 @@ public static final Guid PROVIDER_ID = new Guid("1115c1c6-cb15-4832-b2a4-023770607111"); public static final ProviderType PROVIDER_TYPE = ProviderType.OPENSTACK_NETWORK; + + public static final String EXTERNAL_NETWORK_ID = "52d5c1c6-cb15-4832-b2a4-023770607200"; + /** * Cluster Policy */ diff --git a/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/StoragePoolDAOTest.java b/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/StoragePoolDAOTest.java index 8cfc220..e4d713e 100644 --- a/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/StoragePoolDAOTest.java +++ b/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/StoragePoolDAOTest.java @@ -226,6 +226,29 @@ } } + /** + * Ensures that multiple data centers are returned if an external network had been imported to more than one. + */ + @Test + public void testDataCentersByExternalNetworkId() { + List<Guid> result = dao.getDcIdByExternalNetworkId(FixturesTool.EXTERNAL_NETWORK_ID); + + assertNotNull(result); + assertTrue(result.size() > 1); + assertTrue(!result.get(0).equals(result.get(1))); + } + + /** + * Ensures that no data centers are returned for an external network that hadn't been imported. + */ + @Test + public void testNoDataCentersByExternalNetworkId() { + List<Guid> result = dao.getDcIdByExternalNetworkId("foo"); + + assertNotNull(result); + assertTrue(result.isEmpty()); + } + @Test public void testSave() { dao.save(newPool); diff --git a/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/network/NetworkDaoTest.java b/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/network/NetworkDaoTest.java index be1140b..c5a0477 100644 --- a/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/network/NetworkDaoTest.java +++ b/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/network/NetworkDaoTest.java @@ -23,7 +23,7 @@ private Network new_net; private static final String EXISTING_NETWORK_NAME1 = "engine"; private static final String EXISTING_NETWORK_NAME2 = "engine3"; - private static final int NUM_OF_NETWORKS = 5; + private static final int NUM_OF_NETWORKS = 6; @Override public void setUp() throws Exception { diff --git a/backend/manager/modules/dal/src/test/resources/fixtures.xml b/backend/manager/modules/dal/src/test/resources/fixtures.xml index 312610b..cbed639 100644 --- a/backend/manager/modules/dal/src/test/resources/fixtures.xml +++ b/backend/manager/modules/dal/src/test/resources/fixtures.xml @@ -890,6 +890,22 @@ <value>52d5c1c6-cb15-4832-b2a4-023770607200</value> </row> <row> + <value>58d5c1c6-cb15-4832-b2a4-023770607201</value> + <value>external</value> + <value>Some external network</value> + <null /> + <null /> + <null /> + <null /> + <null /> + <value>0</value> + <value>6d849ebf-755f-4552-ad09-9a090cda105e</value> + <value>0</value> + <value>true</value> + <value>1115c1c6-cb15-4832-b2a4-023770607111</value> + <value>52d5c1c6-cb15-4832-b2a4-023770607200</value> + </row> + <row> <value>58d5c1c6-cb15-4832-b2a4-023770607191</value> <value>engine4</value> <value>Management Network</value> 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 73ba1c2..1677314 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 @@ -10,6 +10,8 @@ import java.util.List; import java.util.Map; import java.util.MissingResourceException; +import java.util.Set; + import org.ovirt.engine.core.common.AuditLogType; import org.ovirt.engine.core.common.EventNotificationEntity; import org.ovirt.engine.core.common.TimeZoneType; @@ -3274,14 +3276,12 @@ } } - public static void GetExternalNetworkList(AsyncQuery aQuery, Guid providerId) { + public static void getExternalNetworkMap(AsyncQuery aQuery, Guid providerId) { aQuery.converterCallback = new IAsyncConverter() { @Override - public Object Convert(Object source, AsyncQuery _asyncQuery) - { - if (source == null) - { - return new ArrayList<Network>(); + public Object Convert(Object source, AsyncQuery _asyncQuery) { + if (source == null) { + return new HashMap<Network, Set<Guid>>(); } return source; } diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/networks/ImportNetworksModel.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/networks/ImportNetworksModel.java index d9b91d2..3e74686 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/networks/ImportNetworksModel.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/networks/ImportNetworksModel.java @@ -6,6 +6,7 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; +import java.util.Set; import org.ovirt.engine.core.common.action.AddNetworkStoragePoolParameters; import org.ovirt.engine.core.common.action.AttachNetworkToVdsGroupParameter; @@ -128,15 +129,24 @@ @Override public void onSuccess(Object model, Object returnValue) { - Iterable<Network> networks = (Iterable<Network>) returnValue; + Map<Network, Set<Guid>> externalNetworkToDataCenters = (Map<Network, Set<Guid>>) returnValue; List<ExternalNetwork> items = new LinkedList<ExternalNetwork>(); - for (Network network : networks) { + for (Network network : externalNetworkToDataCenters.keySet()) { ExternalNetwork externalNetwork = new ExternalNetwork(); externalNetwork.setNetwork(network); externalNetwork.setDisplayName(network.getName()); - externalNetwork.getDataCenters().setItems(dataCenters); - externalNetwork.getDataCenters().setSelectedItem(Linq.firstOrDefault(dataCenters)); externalNetwork.setPublicUse(true); + + Set<Guid> attachedDataCenters = externalNetworkToDataCenters.get(network); + List<StoragePool> availableDataCenters = new LinkedList<StoragePool>(); + for (StoragePool dc : dataCenters) { + if (!attachedDataCenters.contains(dc.getId())) { + availableDataCenters.add(dc); + } + } + externalNetwork.getDataCenters().setItems(availableDataCenters); + externalNetwork.getDataCenters().setSelectedItem(Linq.firstOrDefault(availableDataCenters)); + items.add(externalNetwork); } Collections.sort(items, new Linq.ExternalNetworkComparator()); @@ -155,7 +165,7 @@ dataCenters.addAll((Collection<StoragePool>) returnValue); Collections.sort(dataCenters, new NameableComparator()); - AsyncDataProvider.GetExternalNetworkList(networkQuery, provider.getId()); + AsyncDataProvider.getExternalNetworkMap(networkQuery, provider.getId()); } }; diff --git a/packaging/dbscripts/storages_sp.sql b/packaging/dbscripts/storages_sp.sql index b40ed16..bc349ee 100644 --- a/packaging/dbscripts/storages_sp.sql +++ b/packaging/dbscripts/storages_sp.sql @@ -723,3 +723,15 @@ ); END; $procedure$ LANGUAGE plpgsql; + + +CREATE OR REPLACE FUNCTION GetDcIdByExternalNetworkId(v_external_id text) +RETURNS SETOF UUID STABLE +AS $procedure$ +BEGIN + RETURN QUERY + SELECT storage_pool_id + FROM network + WHERE provider_network_external_id = v_external_id; +END; $procedure$ +LANGUAGE plpgsql; -- To view, visit http://gerrit.ovirt.org/20605 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Ifd76b527500957ec47db6d60894b0d7316d17058 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: ovirt-engine-3.3 Gerrit-Owner: Lior Vernia <[email protected]> _______________________________________________ Engine-patches mailing list [email protected] http://lists.ovirt.org/mailman/listinfo/engine-patches
