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

Reply via email to