Sahina Bose has uploaded a new change for review.

Change subject: engine: Changes to brick sync for storage network
......................................................................

engine: Changes to brick sync for storage network

Added changes to brick sync to take into account, a
different network that may have been used while adding
the brick.

Change-Id: I99f1ed0d9718be79ffac2ac04a36999c93a79ef2
Bug-Url: https://bugzilla.redhat.com/1049994
Signed-off-by: Sahina Bose <sab...@redhat.com>
---
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GlusterSyncJob.java
M 
backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterBrickDao.java
M 
backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterBrickDaoDbFacadeImpl.java
M 
backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/gluster/GlusterBrickDaoTest.java
M 
backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/gluster/GlusterVolumesListReturnForXmlRpc.java
M packaging/dbscripts/gluster_volumes_sp.sql
6 files changed, 115 insertions(+), 3 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/48/38148/1

diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GlusterSyncJob.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GlusterSyncJob.java
index 334f06b..3c6b302 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GlusterSyncJob.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GlusterSyncJob.java
@@ -10,6 +10,7 @@
 import java.util.Objects;
 import java.util.Set;
 
+import org.apache.commons.lang.StringUtils;
 import org.ovirt.engine.core.bll.Backend;
 import org.ovirt.engine.core.bll.job.ExecutionHandler;
 import org.ovirt.engine.core.common.AuditLogType;
@@ -19,6 +20,7 @@
 import org.ovirt.engine.core.common.businessentities.VDS;
 import org.ovirt.engine.core.common.businessentities.VDSGroup;
 import org.ovirt.engine.core.common.businessentities.VDSStatus;
+import org.ovirt.engine.core.common.businessentities.VdsStatic;
 import org.ovirt.engine.core.common.businessentities.gluster.BrickDetails;
 import org.ovirt.engine.core.common.businessentities.gluster.BrickProperties;
 import 
org.ovirt.engine.core.common.businessentities.gluster.GlusterBrickEntity;
@@ -30,10 +32,12 @@
 import 
org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeOptionEntity;
 import org.ovirt.engine.core.common.businessentities.gluster.PeerStatus;
 import org.ovirt.engine.core.common.businessentities.gluster.TransportType;
+import org.ovirt.engine.core.common.businessentities.network.Network;
 import 
org.ovirt.engine.core.common.businessentities.network.VdsNetworkInterface;
 import org.ovirt.engine.core.common.constants.gluster.GlusterConstants;
 import org.ovirt.engine.core.common.gluster.GlusterFeatureSupported;
 import org.ovirt.engine.core.common.utils.ListUtils;
+import org.ovirt.engine.core.common.utils.ObjectUtils;
 import org.ovirt.engine.core.common.utils.gluster.GlusterCoreUtil;
 import org.ovirt.engine.core.common.vdscommands.RemoveVdsVDSCommandParameters;
 import org.ovirt.engine.core.common.vdscommands.VDSCommandType;
@@ -43,6 +47,7 @@
 import 
org.ovirt.engine.core.common.vdscommands.gluster.GlusterVolumesListVDSParameters;
 import org.ovirt.engine.core.compat.Guid;
 import org.ovirt.engine.core.compat.TransactionScopeOption;
+import org.ovirt.engine.core.dal.dbbroker.DbFacade;
 import org.ovirt.engine.core.dao.gluster.GlusterDBUtils;
 import org.ovirt.engine.core.utils.lock.EngineLock;
 import org.ovirt.engine.core.utils.timer.OnTimerMethodAnnotation;
@@ -542,9 +547,48 @@
                     fetchedVolume.getName());
             return;
         }
+        // updateNetworkOnFetchedBricks(fetchedBricks);
 
         removeDeletedBricks(existingVolume, fetchedBricks);
         updateExistingAndNewBricks(existingVolume, fetchedBricks);
+    }
+
+    private void updateNetworkOnFetchedBricks(List<GlusterBrickEntity> 
fetchedBricks) {
+        for (GlusterBrickEntity brick : fetchedBricks) {
+            if (!StringUtils.isEmpty(brick.getNetworkAddress())) {
+                VdsStatic server = 
DbFacade.getInstance().getVdsStaticDao().get(brick.getServerId());
+                Network network = getGlusterNetworkId(server, 
brick.getNetworkAddress());
+                if (network != null) {
+                    brick.setNetworkId(network.getId());
+                }
+            }
+        }
+
+    }
+
+    private Network getGlusterNetworkId(VdsStatic server, String 
networkAddress) {
+        List<Network> allNetworksInCluster =
+                
DbFacade.getInstance().getNetworkDao().getAllForCluster(server.getVdsGroupId());
+
+        for (Network network : allNetworksInCluster) {
+            if (network.getCluster().isGluster()
+                    && isSameNetworkAddress(server.getId(), network.getName(), 
networkAddress)) {
+                return network;
+            }
+        }
+        return null;
+    }
+
+    private Boolean isSameNetworkAddress(Guid hostId, String 
glusterNetworkName, String networkAddress) {
+        final List<VdsNetworkInterface> nics =
+                
DbFacade.getInstance().getInterfaceDao().getAllInterfacesForVds(hostId);
+
+        for (VdsNetworkInterface nic : nics) {
+            if (glusterNetworkName.equals(nic.getNetworkName())) {
+                return networkAddress.equals(nic.getAddress());
+            }
+        }
+        return false;
     }
 
     @SuppressWarnings("serial")
@@ -605,6 +649,13 @@
                             fetchedBrick.getBrickOrder());
                     getBrickDao().updateBrickOrder(existingBrick.getId(), 
fetchedBrick.getBrickOrder());
                 }
+                // update network id, if different
+                if (!ObjectUtils.objectsEqual(existingBrick.getNetworkId(), 
fetchedBrick.getNetworkId())) {
+                    log.info("Network address for brick '{}' detected as  
'{}'. Updating engine DB accordingly.",
+                            existingBrick.getQualifiedName(),
+                            fetchedBrick.getNetworkAddress());
+                    getBrickDao().updateBrickNetworkId(existingBrick.getId(), 
fetchedBrick.getNetworkId());
+                }
             }
         }
     }
diff --git 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterBrickDao.java
 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterBrickDao.java
index 74c3de1..a804aca 100644
--- 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterBrickDao.java
+++ 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterBrickDao.java
@@ -62,4 +62,6 @@
     public void updateBrickProperties(BrickProperties brickProperties);
 
     public void updateBrickProperties(List<GlusterBrickEntity> bricks);
+
+    public void updateBrickNetworkId(Guid brickId, Guid networkId);
 }
diff --git 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterBrickDaoDbFacadeImpl.java
 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterBrickDaoDbFacadeImpl.java
index 25ae268..bfa7f10 100644
--- 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterBrickDaoDbFacadeImpl.java
+++ 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterBrickDaoDbFacadeImpl.java
@@ -267,6 +267,14 @@
     }
 
     @Override
+    public void updateBrickNetworkId(Guid brickId, Guid networkId) {
+        
getCallsHandler().executeModification("UpdateGlusterVolumeBrickNetworkId",
+                getCustomMapSqlParameterSource().
+                        addValue("id", brickId).
+                        addValue("network_id", networkId));
+    }
+
+    @Override
     public void 
updateAllBrickTasksByHostIdBrickDirInBatch(Collection<GlusterBrickEntity> 
bricks) {
         
getCallsHandler().executeStoredProcAsBatch("UpdateGlusterBrickTaskByServerIdBrickDir",
                 bricks, getBatchMapper());
diff --git 
a/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/gluster/GlusterBrickDaoTest.java
 
b/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/gluster/GlusterBrickDaoTest.java
index 49032e2..b2afc20 100644
--- 
a/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/gluster/GlusterBrickDaoTest.java
+++ 
b/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/gluster/GlusterBrickDaoTest.java
@@ -394,4 +394,17 @@
         assertEquals(FixturesTool.GLUSTER_ASYNC_TASK_ID1, 
newEntity1.getAsyncTask().getTaskId());
         assertEquals(FixturesTool.GLUSTER_ASYNC_TASK_ID1, 
newEntity2.getAsyncTask().getTaskId());
     }
+
+    @Test
+    public void testUpdateBrickNetworkId() {
+        GlusterBrickEntity existingBrick = 
dao.getById(FixturesTool.GLUSTER_BRICK_UUID1);
+        assertNotNull(existingBrick);
+        assertNull(existingBrick.getNetworkId());
+
+        dao.updateBrickNetworkId(FixturesTool.GLUSTER_BRICK_UUID1, 
FixturesTool.NETWORK_ENGINE);
+
+        existingBrick = dao.getById(FixturesTool.GLUSTER_BRICK_UUID1);
+        assertNotNull(existingBrick);
+        assertEquals(FixturesTool.NETWORK_ENGINE, 
existingBrick.getNetworkId());
+    }
 }
diff --git 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/gluster/GlusterVolumesListReturnForXmlRpc.java
 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/gluster/GlusterVolumesListReturnForXmlRpc.java
index 0e96c72..c7e8f42 100644
--- 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/gluster/GlusterVolumesListReturnForXmlRpc.java
+++ 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/gluster/GlusterVolumesListReturnForXmlRpc.java
@@ -12,6 +12,7 @@
 import org.ovirt.engine.core.common.businessentities.gluster.GlusterStatus;
 import 
org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeEntity;
 import org.ovirt.engine.core.common.businessentities.gluster.TransportType;
+import org.ovirt.engine.core.common.businessentities.network.Network;
 import org.ovirt.engine.core.compat.Guid;
 import org.ovirt.engine.core.dal.dbbroker.DbFacade;
 import org.ovirt.engine.core.dao.gluster.GlusterDBUtils;
@@ -176,7 +177,7 @@
             return null;
         }
 
-        return getBrickEntity(clusterId, volumeId, brickOrder, server, 
brickDir);
+        return getBrickEntity(clusterId, volumeId, brickOrder, server, 
brickDir, null, null);
     }
 
     private GlusterBrickEntity getBrick(Guid clusterId, Guid volumeId, 
Map<String, Object> brickInfoMap, int brickOrder) {
@@ -189,6 +190,7 @@
 
         String hostUuid = (String) brickInfoMap.get(HOST_UUID);
         String brickDir = brickParts[1];
+        String hostAddress = brickParts[0];
 
         GlusterServer glusterServer = 
dbUtils.getServerByUuid(Guid.createGuidFromString(hostUuid));
         if (glusterServer == null) {
@@ -196,14 +198,25 @@
             return null;
         }
         VdsStatic server = 
DbFacade.getInstance().getVdsStaticDao().get(glusterServer.getId());
-        return getBrickEntity(clusterId, volumeId, brickOrder, server, 
brickDir);
+        String networkAddress = null;
+        Guid networkId = null;
+        if (!server.getHostName().equals(hostAddress)) {
+            networkAddress = hostAddress;
+            Network network = getGlusterNetworkId(server, networkAddress);
+            if (network != null) {
+                networkId = network.getId();
+            }
+        }
+        return getBrickEntity(clusterId, volumeId, brickOrder, server, 
brickDir, networkAddress, networkId);
     }
 
     private GlusterBrickEntity getBrickEntity(Guid clusterId,
             Guid volumeId,
             int brickOrder,
             VdsStatic server,
-            String brickDir) {
+            String brickDir,
+            String networkAddress,
+            Guid networkId) {
         GlusterBrickEntity brick = new GlusterBrickEntity();
         brick.setVolumeId(volumeId);
         brick.setBrickOrder(brickOrder);
@@ -212,9 +225,24 @@
         brick.setServerId(server.getId());
         brick.setServerName(server.getHostName());
 
+        brick.setNetworkAddress(networkAddress);
+        brick.setNetworkId(networkId);
+
         return brick;
     }
 
+    private Network getGlusterNetworkId(VdsStatic server, String 
networkAddress) {
+        List<Network> allNetworksInCluster =
+                
DbFacade.getInstance().getNetworkDao().getAllForCluster(server.getVdsGroupId());
+
+        for (Network network : allNetworksInCluster) {
+            if (network.getCluster().isGluster()) {
+                return network;
+            }
+        }
+        return null;
+    }
+
     public Map<Guid, GlusterVolumeEntity> getVolumes() {
         return volumes;
     }
diff --git a/packaging/dbscripts/gluster_volumes_sp.sql 
b/packaging/dbscripts/gluster_volumes_sp.sql
index 62931cd..89e1e94 100644
--- a/packaging/dbscripts/gluster_volumes_sp.sql
+++ b/packaging/dbscripts/gluster_volumes_sp.sql
@@ -518,6 +518,16 @@
 END; $procedure$
 LANGUAGE plpgsql;
 
+Create or replace FUNCTION UpdateGlusterVolumeBrickNetworkId(v_id UUID, 
v_network_id UUID)
+    RETURNS VOID
+    AS $procedure$
+BEGIN
+    UPDATE  gluster_volume_bricks
+    SET     network_id = v_network_id,
+            _update_date = LOCALTIMESTAMP
+    WHERE   id = v_id;
+END; $procedure$
+LANGUAGE plpgsql;
 
 Create or replace FUNCTION UpdateGlusterVolumeStatus(v_volume_id UUID,
                                                     v_status VARCHAR(32))


-- 
To view, visit https://gerrit.ovirt.org/38148
To unsubscribe, visit https://gerrit.ovirt.org/settings

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

Reply via email to