Sahina Bose has uploaded a new change for review.

Change subject: engine: VDS commands for volume geo-rep status and detail
......................................................................

engine: VDS commands for volume geo-rep status and detail

VDS commands to retrieve status of geo-rep sessions
associated with a volume and geo-rep status detail
for a session

Change-Id: Id313742c9f3c036a0017fe37bd818af1bed0e081
Bug-Url: https://bugzilla.redhat.com/1138116
Signed-off-by: Sahina Bose <[email protected]>
---
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllErrors.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/VDSCommandType.java
A 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/gluster/GlusterVolumeGeoRepSessionVDSParameters.java
M 
backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterDBUtils.java
M backend/manager/modules/dal/src/main/resources/bundles/VdsmErrors.properties
M 
backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/gluster/AbstractGlusterBrokerCommand.java
A 
backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/gluster/GetGlusterVolumeGeoRepStatusDetailVDSCommand.java
A 
backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/gluster/GetGlusterVolumeGeoRepStatusVDSCommand.java
A 
backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/gluster/GlusterVolumeGeoRepStatusDetailForXmlRpc.java
A 
backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/gluster/GlusterVolumeGeoRepStatusForXmlRpc.java
M 
backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/jsonrpc/JsonRpcVdsServer.java
M 
backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/IVdsServer.java
M 
backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerConnector.java
M 
backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerWrapper.java
M 
frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/VdsmErrors.java
15 files changed, 432 insertions(+), 1 deletion(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/77/39377/1

diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllErrors.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllErrors.java
index 72c5ef9..a2d67ba 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllErrors.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllErrors.java
@@ -399,6 +399,8 @@
     GlfsStatvfsException(4571),
     GlfsInitException(4572),
     GlfsFiniException(4573),
+    GlusterVolumeGeoRepStatusFailed(4599),
+    GlusterVolumeGeoRepStatusDetailFailed(4600),
 
     UnicodeArgumentException(4900),
 
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/VDSCommandType.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/VDSCommandType.java
index 5bb1b87..c33079c 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/VDSCommandType.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/VDSCommandType.java
@@ -158,6 +158,8 @@
     GetDiskAlignment("org.ovirt.engine.core.vdsbroker.vdsbroker"),
     GlusterTasksList("org.ovirt.engine.core.vdsbroker.gluster"),
     
GetGlusterVolumeRemoveBricksStatus("org.ovirt.engine.core.vdsbroker.gluster"),
+    GetGlusterVolumeGeoRepStatus("org.ovirt.engine.core.vdsbroker.gluster"),
+    
GetGlusterVolumeGeoRepStatusDetail("org.ovirt.engine.core.vdsbroker.gluster"),
     SetNumberOfCpus("org.ovirt.engine.core.vdsbroker"),
     UpdateVmPolicy("org.ovirt.engine.core.vdsbroker"),
     List("org.ovirt.engine.core.vdsbroker.vdsbroker"),           // get a list 
of VMs with status only
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/gluster/GlusterVolumeGeoRepSessionVDSParameters.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/gluster/GlusterVolumeGeoRepSessionVDSParameters.java
new file mode 100644
index 0000000..d099b29
--- /dev/null
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/gluster/GlusterVolumeGeoRepSessionVDSParameters.java
@@ -0,0 +1,39 @@
+package org.ovirt.engine.core.common.vdscommands.gluster;
+
+import org.ovirt.engine.core.compat.Guid;
+
+public class GlusterVolumeGeoRepSessionVDSParameters extends 
GlusterVolumeVDSParameters {
+
+    private String slaveHost;
+    private String slaveVolume;
+
+    public GlusterVolumeGeoRepSessionVDSParameters() {
+
+    }
+
+    public GlusterVolumeGeoRepSessionVDSParameters(Guid serverId, String 
volumeName) {
+        super(serverId, volumeName);
+    }
+
+    public GlusterVolumeGeoRepSessionVDSParameters(Guid serverId, String 
volumeName, String slaveHost, String slaveVolume) {
+        super(serverId, volumeName);
+        this.slaveHost = slaveHost;
+        this.slaveVolume = slaveVolume;
+    }
+
+    public String getSlaveHost() {
+        return slaveHost;
+    }
+
+    public void setSlaveHost(String slaveHost) {
+        this.slaveHost = slaveHost;
+    }
+
+    public String getSlaveVolume() {
+        return slaveVolume;
+    }
+
+    public void setSlaveVolume(String slaveVolume) {
+        this.slaveVolume = slaveVolume;
+    }
+}
diff --git 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterDBUtils.java
 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterDBUtils.java
index 855a30f..82fa4a9 100644
--- 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterDBUtils.java
+++ 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterDBUtils.java
@@ -79,7 +79,8 @@
     }
 
     /**
-     * Returns a server from the given cluster, having given UUID
+     * Returns a server from the given cluster, having given
+     * gluster server UUID
      *
      * @return GlusterServer object for the said server if found, else null
      */
@@ -165,4 +166,16 @@
         }
         return hostName;
     }
+
+    public GlusterBrickEntity getGlusterBrickByServerUuidAndBrickDir(Guid 
serverId, String brickDir)
+    {
+        return getGlusterBrickDao().getBrickByServerIdAndDirectory(serverId, 
brickDir);
+    }
+
+    public GlusterVolumeEntity getVolumeByNameAndHostId(String volumeName, 
Guid hostId) {
+        VdsStatic vds = getVdsStaticDao().get(hostId);
+        Guid vdsGroupId = vds.getVdsGroupId();
+        return getGlusterVolumeDao().getByName(vdsGroupId, volumeName);
+    }
+
 }
diff --git 
a/backend/manager/modules/dal/src/main/resources/bundles/VdsmErrors.properties 
b/backend/manager/modules/dal/src/main/resources/bundles/VdsmErrors.properties
index f3b06a9..0582156 100644
--- 
a/backend/manager/modules/dal/src/main/resources/bundles/VdsmErrors.properties
+++ 
b/backend/manager/modules/dal/src/main/resources/bundles/VdsmErrors.properties
@@ -368,6 +368,8 @@
 GlusterServiceActionNotSupported=Gluster service action not supported
 GlusterVolumeStatusAllFailedException=Failed to get gluster tasks list
 GlusterVolumeRebalanceStatusFailedException=Failed to get gluster volume 
rebalance status
+GlusterVolumeGeoRepStatusFailedException=Failed to get status information of 
geo-replication session(s) on gluster volume
+GlusterVolumeGeoRepStatusDetailFailedException=Failed to get detailed status 
information of geo-replication session(s) on gluster volume
 GlusterLibgfapiException=Command failed due to gluster libgfapi exception
 GlfsStatvfsException=Failed to get gluster volume size info
 GlfsInitException=Command failed while mounting gluster volume
diff --git 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/gluster/AbstractGlusterBrokerCommand.java
 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/gluster/AbstractGlusterBrokerCommand.java
index 2b2d573..7796a8c 100644
--- 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/gluster/AbstractGlusterBrokerCommand.java
+++ 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/gluster/AbstractGlusterBrokerCommand.java
@@ -66,6 +66,8 @@
         case GlusterVolumeRemoveBricksStopFailed:
         case GlusterVolumeRemoveBrickStatusFailed:
         case GlusterVolumeRemoveBricksCommitFailed:
+        case GlusterVolumeGeoRepStatusFailed:
+        case GlusterVolumeGeoRepStatusDetailFailed:
         case GlusterLibgfapiException:
         case GlfsStatvfsException:
         case GlfsInitException:
diff --git 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/gluster/GetGlusterVolumeGeoRepStatusDetailVDSCommand.java
 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/gluster/GetGlusterVolumeGeoRepStatusDetailVDSCommand.java
new file mode 100644
index 0000000..a770d6a
--- /dev/null
+++ 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/gluster/GetGlusterVolumeGeoRepStatusDetailVDSCommand.java
@@ -0,0 +1,28 @@
+package org.ovirt.engine.core.vdsbroker.gluster;
+
+import 
org.ovirt.engine.core.common.vdscommands.gluster.GlusterVolumeGeoRepSessionVDSParameters;
+import org.ovirt.engine.core.vdsbroker.vdsbroker.StatusForXmlRpc;
+
+public class GetGlusterVolumeGeoRepStatusDetailVDSCommand<P extends 
GlusterVolumeGeoRepSessionVDSParameters> extends 
AbstractGlusterBrokerCommand<P> {
+    GlusterVolumeGeoRepStatusDetailForXmlRpc result;
+
+    public GetGlusterVolumeGeoRepStatusDetailVDSCommand(P parameters) {
+        super(parameters);
+    }
+
+    @Override
+    protected StatusForXmlRpc getReturnStatus() {
+        return result.mStatus;
+    }
+
+    @Override
+    protected void executeVdsBrokerCommand() {
+        GlusterVolumeGeoRepSessionVDSParameters parameter = getParameters();
+        result = 
getBroker().glusterVolumeGeoRepStatusDetail(parameter.getVolumeName(), 
parameter.getSlaveHost(), parameter.getSlaveVolume());
+        proceedProxyReturnValue();
+        if (getVDSReturnValue().getSucceeded()) {
+            setReturnValue(result.getGeoRepSessions());
+        }
+    }
+
+}
diff --git 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/gluster/GetGlusterVolumeGeoRepStatusVDSCommand.java
 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/gluster/GetGlusterVolumeGeoRepStatusVDSCommand.java
new file mode 100644
index 0000000..0dca615
--- /dev/null
+++ 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/gluster/GetGlusterVolumeGeoRepStatusVDSCommand.java
@@ -0,0 +1,34 @@
+package org.ovirt.engine.core.vdsbroker.gluster;
+
+import 
org.ovirt.engine.core.common.vdscommands.gluster.GlusterVolumeGeoRepSessionVDSParameters;
+import org.ovirt.engine.core.vdsbroker.vdsbroker.StatusForXmlRpc;
+
+public class GetGlusterVolumeGeoRepStatusVDSCommand<P extends 
GlusterVolumeGeoRepSessionVDSParameters> extends 
AbstractGlusterBrokerCommand<P> {
+    GlusterVolumeGeoRepStatusForXmlRpc result;
+
+    public GetGlusterVolumeGeoRepStatusVDSCommand(P parameters) {
+        super(parameters);
+    }
+
+    @Override
+    protected StatusForXmlRpc getReturnStatus() {
+        return result.mStatus;
+    }
+
+    @Override
+    protected void executeVdsBrokerCommand() {
+        GlusterVolumeGeoRepSessionVDSParameters parameter = getParameters();
+        if (parameter.getVolumeName() == null) {
+            result = getBroker().glusterVolumeGeoRepStatus();
+        } else if (parameter.getSlaveHost() == null || 
parameter.getSlaveVolume() == null) {
+            result = 
getBroker().glusterVolumeGeoRepStatus(parameter.getVolumeName());
+        } else {
+            result = 
getBroker().glusterVolumeGeoRepStatus(parameter.getVolumeName(), 
parameter.getSlaveHost(), parameter.getSlaveVolume());
+        }
+        proceedProxyReturnValue();
+        if (getVDSReturnValue().getSucceeded()) {
+            setReturnValue(result.getGeoRepSessions());
+        }
+    }
+
+}
diff --git 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/gluster/GlusterVolumeGeoRepStatusDetailForXmlRpc.java
 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/gluster/GlusterVolumeGeoRepStatusDetailForXmlRpc.java
new file mode 100644
index 0000000..b8bfa98
--- /dev/null
+++ 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/gluster/GlusterVolumeGeoRepStatusDetailForXmlRpc.java
@@ -0,0 +1,74 @@
+package org.ovirt.engine.core.vdsbroker.gluster;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import 
org.ovirt.engine.core.common.businessentities.gluster.GlusterGeoRepSession;
+import 
org.ovirt.engine.core.common.businessentities.gluster.GlusterGeoRepSessionDetails;
+
+public class GlusterVolumeGeoRepStatusDetailForXmlRpc extends 
GlusterVolumeGeoRepStatusForXmlRpc {
+
+    private static final String FILES_SYNCED = "filesSyncd";
+    private static final String FILES_PENDING = "filesPending";
+    private static final String BYTES_PENDING = "bytesPending";
+    private static final String DELETES_PENDING = "deletesPending";
+    private static final String FILES_SKIPPED = "filesSkipped";
+
+    private final ArrayList<GlusterGeoRepSessionDetails> geoRepDetails = new 
ArrayList<GlusterGeoRepSessionDetails>();
+    private final List<GlusterGeoRepSession> geoRepSessions = new 
ArrayList<GlusterGeoRepSession>();
+
+    private GlusterGeoRepSessionDetails populatePairDetails(Map<String, 
Object> innerMap, GlusterGeoRepSession session) {
+        GlusterGeoRepSessionDetails details = getSessionDetails(innerMap, 
session);
+        Long filesSynced =
+                innerMap.containsKey(FILES_SYNCED) ? 
Long.parseLong(innerMap.get(FILES_SYNCED).toString()) : null;
+        Long filesPending =
+                innerMap.containsKey(FILES_PENDING) ? 
Long.parseLong(innerMap.get(FILES_PENDING).toString()) : null;
+        Long bytesPending =
+                innerMap.containsKey(BYTES_PENDING) ? 
Long.parseLong(innerMap.get(BYTES_PENDING).toString()) : null;
+        Long deletesPending =
+                innerMap.containsKey(DELETES_PENDING) ? 
Long.parseLong(innerMap.get(DELETES_PENDING).toString()) : null;
+        Long filesSkipped =
+                innerMap.containsKey(FILES_SKIPPED) ? 
Long.parseLong(innerMap.get(FILES_SKIPPED).toString()) : null;
+
+        details.setFilesPending(filesPending);
+        details.setFilesSkipped(filesSkipped);
+        details.setFilesSynced(filesSynced);
+        details.setBytesPending(bytesPending);
+        details.setDeletesPending(deletesPending);
+        return details;
+    }
+
+    @SuppressWarnings("unchecked")
+    private void populateSessionDetails(Map<String, Object> innerMap) {
+        if (innerMap.containsKey(VOLUME_NAME)) {
+            String masterVolumeName = (String) innerMap.get(VOLUME_NAME);
+            GlusterGeoRepSession session = getSession(masterVolumeName, 
innerMap);
+
+            if (innerMap.containsKey(GEO_REP_PAIRS)) {
+                for (Object sessionPair : (Object[]) 
innerMap.get(GEO_REP_PAIRS)) {
+                    geoRepDetails.add(populatePairDetails((Map<String, 
Object>) sessionPair, session));
+                }
+            }
+            session.setSessionDetails(geoRepDetails);
+            geoRepSessions.add(session);
+        }
+    }
+
+    public GlusterVolumeGeoRepStatusDetailForXmlRpc(Map<String, Object> 
innerMap) {
+        super(innerMap);
+        if (innerMap.containsKey(GEO_REP)) {
+            populateSessionDetails((Map<String, Object>) 
innerMap.get(GEO_REP));
+        }
+    }
+
+    public List<GlusterGeoRepSessionDetails> getGeoRepDetails() {
+        return geoRepDetails;
+    }
+
+    @Override
+    public List<GlusterGeoRepSession> getGeoRepSessions() {
+        return geoRepSessions;
+    }
+
+}
diff --git 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/gluster/GlusterVolumeGeoRepStatusForXmlRpc.java
 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/gluster/GlusterVolumeGeoRepStatusForXmlRpc.java
new file mode 100644
index 0000000..30d0e5f
--- /dev/null
+++ 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/gluster/GlusterVolumeGeoRepStatusForXmlRpc.java
@@ -0,0 +1,131 @@
+package org.ovirt.engine.core.vdsbroker.gluster;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import org.ovirt.engine.core.common.businessentities.gluster.GeoRepCrawlStatus;
+import 
org.ovirt.engine.core.common.businessentities.gluster.GeoRepSessionStatus;
+import 
org.ovirt.engine.core.common.businessentities.gluster.GlusterBrickEntity;
+import 
org.ovirt.engine.core.common.businessentities.gluster.GlusterGeoRepSession;
+import 
org.ovirt.engine.core.common.businessentities.gluster.GlusterGeoRepSessionDetails;
+import org.ovirt.engine.core.common.businessentities.gluster.GlusterServer;
+import org.ovirt.engine.core.compat.Guid;
+import org.ovirt.engine.core.dao.gluster.GlusterDBUtils;
+import org.ovirt.engine.core.utils.log.Log;
+import org.ovirt.engine.core.utils.log.LogFactory;
+import org.ovirt.engine.core.vdsbroker.irsbroker.StatusReturnForXmlRpc;
+
+public class GlusterVolumeGeoRepStatusForXmlRpc extends StatusReturnForXmlRpc {
+    protected static final String GEO_REP = "geo-rep";
+    protected static final String VOLUME_NAME = "volumeName";
+    protected static final String GEO_REP_PAIRS = "pairs";
+    private static final String SESSIONS = "sessions";
+    private static final String SESSION_SLAVE = "sessionSlave";
+    private static final String MASTER_NODE_UUID = "masterNodeUuid";
+    private static final String MASTER_BRICK = "masterBrick";
+    private static final String SLAVE = "slave";
+    private static final String STATUS = "status";
+    private static final String CHECK_POINT_STATUS = "checkpointStatus";
+    private static final String CRAWL_STATUS = "crawlStatus";
+
+    private final List<GlusterGeoRepSession> geoRepSessions = new 
ArrayList<GlusterGeoRepSession>();
+
+    private static final Log log = 
LogFactory.getLog(GlusterVolumesListReturnForXmlRpc.class);
+
+    protected GlusterGeoRepSessionDetails getSessionDetails(Map<String, 
Object> innerMap, GlusterGeoRepSession session) {
+        GlusterGeoRepSessionDetails details = new 
GlusterGeoRepSessionDetails();
+        details.setSessionId(session.getId());
+        Guid masterNodeGlusterId;
+        if (innerMap.containsKey(MASTER_NODE_UUID)) {
+            masterNodeGlusterId = new 
Guid(innerMap.get(MASTER_NODE_UUID).toString());
+        } else {
+            log.error("Master node uuid is not available");
+            return null;
+        }
+        String masterBrickDir = (innerMap.containsKey(MASTER_BRICK)) ? 
innerMap.get(MASTER_BRICK).toString() : null;
+        GlusterServer glusterServer = 
getDbUtils().getServerByUuid(masterNodeGlusterId);
+        if (glusterServer != null) {
+            GlusterBrickEntity brick =
+                    
getDbUtils().getGlusterBrickByServerUuidAndBrickDir(glusterServer.getId(), 
masterBrickDir);
+            if (brick != null) {
+                details.setMasterBrickId(brick.getId());
+            }
+        }
+        if (details.getMasterBrickId() == null) {
+            log.errorFormat("Brick information could not be retrieved for 
gluster host id %1 and brick dir %2",
+                    masterNodeGlusterId,
+                    masterBrickDir);
+        }
+
+        String slave = innerMap.containsKey(SLAVE) ? 
innerMap.get(SLAVE).toString() : null;
+        String[] slaveSplit = (slave != null) ? slave.split("([://]+)") : null;
+        if (slaveSplit != null && slaveSplit.length >= 2) {
+            details.setSlaveHostName(slaveSplit[slaveSplit.length - 2]);
+        }
+        details.setStatus(GeoRepSessionStatus.from((String) 
innerMap.get(STATUS)));
+        details.setCrawlStatus(GeoRepCrawlStatus.from((String) 
innerMap.get(CRAWL_STATUS)));
+        details.setCheckPointStatus((String) innerMap.get(CHECK_POINT_STATUS));
+        return details;
+    }
+
+    protected GlusterGeoRepSession getSession(String masterVolumeName, 
Map<String, Object> innerMap) {
+        GlusterGeoRepSession geoRepSession = new GlusterGeoRepSession();
+        // sessionslave in the form -
+        // 
<session_slave>11ae7a03-e793-4270-8fc4-b42def8b3051:ssh://192.168.122.14::slave2</session_slave>
+        String sessionKey = (String) innerMap.get(SESSION_SLAVE);
+        String sessSplit[] = sessionKey.split("([://]+)");
+        String sessionId = sessSplit[0];
+        String slaveNode = sessSplit[sessSplit.length - 2];
+        String slaveVolume = sessSplit[sessSplit.length - 1];
+        geoRepSession.setId(Guid.createGuidFromString(sessionId));
+        geoRepSession.setSlaveHostName(slaveNode);
+        geoRepSession.setSlaveVolumeName(slaveVolume);
+        geoRepSession.setSessionKey(sessionKey);
+        geoRepSession.setMasterVolumeName(masterVolumeName);
+        return geoRepSession;
+    }
+
+    private GlusterDBUtils getDbUtils() {
+        return GlusterDBUtils.getInstance();
+    }
+
+    @SuppressWarnings("unchecked")
+    private void populateSessions(Object[] geoRepVolSessions) {
+        for (Object geoRepVolSession : geoRepVolSessions) {
+            Map<String, Object> innerMap = (Map<String, Object>) 
geoRepVolSession;
+            if (innerMap.containsKey(VOLUME_NAME)) {
+                String masterVolName = (String) innerMap.get(VOLUME_NAME);
+                if (innerMap.containsKey(SESSIONS)) {
+                    for (Object session : (Object[]) innerMap.get(SESSIONS)) {
+                        geoRepSessions.add(populateSession(masterVolName, 
(Map<String, Object>) session));
+                    }
+                }
+            }
+        }
+    }
+
+    private GlusterGeoRepSession populateSession(String volumeName, 
Map<String, Object> innerMap) {
+        GlusterGeoRepSession geoRepSession = getSession(volumeName, innerMap);
+        ArrayList<GlusterGeoRepSessionDetails> geoRepSessionDetails = new 
ArrayList<GlusterGeoRepSessionDetails>();
+        if (innerMap.containsKey(GEO_REP_PAIRS)) {
+            for (Object sessionPair : (Object[]) innerMap.get(GEO_REP_PAIRS)) {
+                geoRepSessionDetails.add(getSessionDetails((Map<String, 
Object>) sessionPair, geoRepSession));
+            }
+        }
+        geoRepSession.setSessionDetails(geoRepSessionDetails);
+        return geoRepSession;
+    }
+
+    public GlusterVolumeGeoRepStatusForXmlRpc(Map<String, Object> innerMap) {
+        super(innerMap);
+        if (innerMap.containsKey(GEO_REP)) {
+            populateSessions((Object[]) innerMap.get(GEO_REP));
+        }
+    }
+
+    public List<GlusterGeoRepSession> getGeoRepSessions() {
+        return geoRepSessions;
+    }
+
+}
diff --git 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/jsonrpc/JsonRpcVdsServer.java
 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/jsonrpc/JsonRpcVdsServer.java
index 732cf7a..8842329 100644
--- 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/jsonrpc/JsonRpcVdsServer.java
+++ 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/jsonrpc/JsonRpcVdsServer.java
@@ -18,6 +18,8 @@
 import org.ovirt.engine.core.vdsbroker.gluster.GlusterServicesReturnForXmlRpc;
 import org.ovirt.engine.core.vdsbroker.gluster.GlusterTaskInfoReturnForXmlRpc;
 import org.ovirt.engine.core.vdsbroker.gluster.GlusterTasksListReturnForXmlRpc;
+import 
org.ovirt.engine.core.vdsbroker.gluster.GlusterVolumeGeoRepStatusForXmlRpc;
+import 
org.ovirt.engine.core.vdsbroker.gluster.GlusterVolumeGeoRepStatusDetailForXmlRpc;
 import 
org.ovirt.engine.core.vdsbroker.gluster.GlusterVolumeOptionsInfoReturnForXmlRpc;
 import 
org.ovirt.engine.core.vdsbroker.gluster.GlusterVolumeProfileInfoReturnForXmlRpc;
 import 
org.ovirt.engine.core.vdsbroker.gluster.GlusterVolumeStatusReturnForXmlRpc;
@@ -1438,6 +1440,40 @@
     }
 
     @Override
+    public GlusterVolumeGeoRepStatusForXmlRpc glusterVolumeGeoRepStatus() {
+        JsonRpcRequest request = new 
RequestBuilder("GlusterVolume.geoRepStatus").build();
+        Map<String, Object> response = new FutureMap(this.client, 
request).withIgnoreResponseKey();
+        return new GlusterVolumeGeoRepStatusForXmlRpc(response);
+    }
+
+    @Override
+    public GlusterVolumeGeoRepStatusForXmlRpc glusterVolumeGeoRepStatus(String 
volumeName) {
+        JsonRpcRequest request = new 
RequestBuilder("GlusterVolume.geoRepStatus")
+                    .withParameter("volName", volumeName)
+                    .build();
+        Map<String, Object> response = new FutureMap(this.client, 
request).withIgnoreResponseKey();
+        return new GlusterVolumeGeoRepStatusForXmlRpc(response);
+    }
+
+    @Override
+    public GlusterVolumeGeoRepStatusForXmlRpc glusterVolumeGeoRepStatus(String 
volumeName, String slaveHost, String slaveVolumeName) {
+        JsonRpcRequest request = new 
RequestBuilder("GlusterVolume.geoRepStatus").withParameter("volName", 
volumeName)
+                .withParameter("remoteHost", slaveHost)
+                .withParameter("remoteVolName", slaveVolumeName).build();
+        Map<String, Object> response = new FutureMap(this.client, 
request).withIgnoreResponseKey();
+        return new GlusterVolumeGeoRepStatusForXmlRpc(response);
+    }
+
+    @Override
+    public GlusterVolumeGeoRepStatusDetailForXmlRpc 
glusterVolumeGeoRepStatusDetail(String volumeName, String slaveHost, String 
slaveVolumeName) {
+        JsonRpcRequest request = new 
RequestBuilder("GlusterVolume.geoRepStatusDetail").withParameter("volName", 
volumeName)
+                .withParameter("remoteHost", slaveHost)
+                .withParameter("remoteVolName", slaveVolumeName).build();
+        Map<String, Object> response = new FutureMap(this.client, 
request).withIgnoreResponseKey();
+        return new GlusterVolumeGeoRepStatusDetailForXmlRpc(response);
+    }
+
+    @Override
     public GlusterVolumeTaskReturnForXmlRpc 
glusterVolumeRemoveBrickStatus(String volumeName, String[] bricksList) {
         JsonRpcRequest request =
                 new 
RequestBuilder("GlusterVolume.removeBrickStatus").withParameter("volumeName", 
volumeName)
diff --git 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/IVdsServer.java
 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/IVdsServer.java
index 89f3404..ad81acd 100644
--- 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/IVdsServer.java
+++ 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/IVdsServer.java
@@ -13,6 +13,8 @@
 import org.ovirt.engine.core.vdsbroker.gluster.GlusterServicesReturnForXmlRpc;
 import org.ovirt.engine.core.vdsbroker.gluster.GlusterTaskInfoReturnForXmlRpc;
 import org.ovirt.engine.core.vdsbroker.gluster.GlusterTasksListReturnForXmlRpc;
+import 
org.ovirt.engine.core.vdsbroker.gluster.GlusterVolumeGeoRepStatusForXmlRpc;
+import 
org.ovirt.engine.core.vdsbroker.gluster.GlusterVolumeGeoRepStatusDetailForXmlRpc;
 import 
org.ovirt.engine.core.vdsbroker.gluster.GlusterVolumeOptionsInfoReturnForXmlRpc;
 import 
org.ovirt.engine.core.vdsbroker.gluster.GlusterVolumeProfileInfoReturnForXmlRpc;
 import 
org.ovirt.engine.core.vdsbroker.gluster.GlusterVolumeStatusReturnForXmlRpc;
@@ -306,6 +308,14 @@
 
     GlusterVolumeTaskReturnForXmlRpc glusterVolumeRebalanceStatus(String 
volumeName);
 
+    GlusterVolumeGeoRepStatusForXmlRpc glusterVolumeGeoRepStatus();
+
+    GlusterVolumeGeoRepStatusForXmlRpc glusterVolumeGeoRepStatus(String 
volumeName);
+
+    GlusterVolumeGeoRepStatusForXmlRpc glusterVolumeGeoRepStatus(String 
volumeName, String slaveHost, String slaveVolumeName);
+
+    GlusterVolumeGeoRepStatusDetailForXmlRpc 
glusterVolumeGeoRepStatusDetail(String volumeName, String slaveHost, String 
slaveVolumeName);
+
     GlusterVolumeTaskReturnForXmlRpc glusterVolumeRemoveBrickStatus(String 
volumeName, String[] bricksList);
 
     StatusOnlyReturnForXmlRpc setNumberOfCpus(String vmId, String 
numberOfCpus);
diff --git 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerConnector.java
 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerConnector.java
index cc778ae..0ab88d9 100644
--- 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerConnector.java
+++ 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerConnector.java
@@ -289,6 +289,14 @@
 
     public Map<String, Object> glusterVolumeRebalanceStatus(String volumeName);
 
+    public Map<String, Object> glusterVolumeGeoRepStatus();
+
+    public Map<String, Object> glusterVolumeGeoRepStatus(String volumeName);
+
+    public Map<String, Object> glusterVolumeGeoRepStatus(String volumeName, 
String slaveHost, String slaveVolumeName);
+
+    public Map<String, Object> glusterVolumeGeoRepStatusDetail(String 
volumeName, String slaveHost, String slaveVolumeName);
+
     public Map<String, Object> glusterVolumeRemoveBrickStatus(String 
volumeName, String[] bricksList);
 
     public Map<String, Object> setNumberOfCpus(String vmId, String 
numberOfCpus);
diff --git 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerWrapper.java
 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerWrapper.java
index 5f43faf..322d4c1 100644
--- 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerWrapper.java
+++ 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerWrapper.java
@@ -14,6 +14,8 @@
 import org.ovirt.engine.core.vdsbroker.gluster.GlusterServicesReturnForXmlRpc;
 import org.ovirt.engine.core.vdsbroker.gluster.GlusterTaskInfoReturnForXmlRpc;
 import org.ovirt.engine.core.vdsbroker.gluster.GlusterTasksListReturnForXmlRpc;
+import 
org.ovirt.engine.core.vdsbroker.gluster.GlusterVolumeGeoRepStatusForXmlRpc;
+import 
org.ovirt.engine.core.vdsbroker.gluster.GlusterVolumeGeoRepStatusDetailForXmlRpc;
 import 
org.ovirt.engine.core.vdsbroker.gluster.GlusterVolumeOptionsInfoReturnForXmlRpc;
 import 
org.ovirt.engine.core.vdsbroker.gluster.GlusterVolumeProfileInfoReturnForXmlRpc;
 import 
org.ovirt.engine.core.vdsbroker.gluster.GlusterVolumeStatusReturnForXmlRpc;
@@ -1371,6 +1373,48 @@
     }
 
     @Override
+    public GlusterVolumeGeoRepStatusForXmlRpc glusterVolumeGeoRepStatus() {
+        try {
+            Map<String, Object> response = 
vdsServer.glusterVolumeGeoRepStatus();
+            return new GlusterVolumeGeoRepStatusForXmlRpc(response);
+        } catch (UndeclaredThrowableException ute) {
+            throw new XmlRpcRunTimeException(ute);
+        }
+    }
+
+    @Override
+    public GlusterVolumeGeoRepStatusForXmlRpc glusterVolumeGeoRepStatus(String 
volumeName) {
+        try {
+            Map<String, Object> response;
+            response = vdsServer.glusterVolumeGeoRepStatus(volumeName);
+            return new GlusterVolumeGeoRepStatusForXmlRpc(response);
+        } catch (UndeclaredThrowableException ute) {
+            throw new XmlRpcRunTimeException(ute);
+        }
+    }
+
+    @Override
+    public GlusterVolumeGeoRepStatusForXmlRpc glusterVolumeGeoRepStatus(String 
volumeName, String slaveHost, String slaveVolumeName) {
+        try {
+            Map<String, Object> response;
+            response = vdsServer.glusterVolumeGeoRepStatus(volumeName, 
slaveHost, slaveVolumeName);
+            return new GlusterVolumeGeoRepStatusForXmlRpc(response);
+        } catch (UndeclaredThrowableException ute) {
+            throw new XmlRpcRunTimeException(ute);
+        }
+    }
+
+    @Override
+    public GlusterVolumeGeoRepStatusDetailForXmlRpc 
glusterVolumeGeoRepStatusDetail(String volumeName, String slaveHost, String 
slaveVolumeName) {
+        try {
+            Map<String, Object> response = 
vdsServer.glusterVolumeGeoRepStatusDetail(volumeName, slaveHost, 
slaveVolumeName);
+            return new GlusterVolumeGeoRepStatusDetailForXmlRpc(response);
+        } catch (UndeclaredThrowableException ute) {
+            throw new XmlRpcRunTimeException(ute);
+        }
+    }
+
+    @Override
     public GlusterVolumeTaskReturnForXmlRpc 
glusterVolumeRemoveBrickStatus(String volumeName, String[] bricksList) {
         try {
             Map<String, Object> xmlRpcReturnValue = 
vdsServer.glusterVolumeRemoveBrickStatus(volumeName, bricksList);
diff --git 
a/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/VdsmErrors.java
 
b/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/VdsmErrors.java
index b99a183..184d0b4 100644
--- 
a/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/VdsmErrors.java
+++ 
b/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/VdsmErrors.java
@@ -800,6 +800,12 @@
     @DefaultStringValue("Failed to get gluster volume rebalance status")
     String GlusterVolumeRebalanceStatusFailedException();
 
+    @DefaultStringValue("Failed to get status information of geo-replication 
session(s) on gluster volume")
+    String GlusterVolumeGeoRepStatusFailed();
+
+    @DefaultStringValue("Failed to get detailed status information of 
geo-replication session(s) on gluster volume")
+    String GlusterVolumeGeoRepStatusDetailFailed();
+
     @DefaultStringValue("Failed to get status of gluster volume remove bricks")
     String GlusterVolumeRemoveBrickStatusFailed();
 


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

Gerrit-MessageType: newchange
Gerrit-Change-Id: Id313742c9f3c036a0017fe37bd818af1bed0e081
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: ovirt-engine-3.5-gluster
Gerrit-Owner: Sahina Bose <[email protected]>
_______________________________________________
Engine-patches mailing list
[email protected]
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to