package org.ovirt.engine.core.vdsbroker.gluster;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import org.ovirt.engine.core.common.businessentities.gluster.BlockStats;
import org.ovirt.engine.core.common.businessentities.gluster.BrickProfileDetails;
import org.ovirt.engine.core.common.businessentities.gluster.FopStats;
import org.ovirt.engine.core.common.businessentities.gluster.GlusterBrickEntity;
import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeEntity;
import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeProfileInfo;
import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeProfileStats;
import org.ovirt.engine.core.common.businessentities.gluster.ProfileStatsType;
import org.ovirt.engine.core.common.businessentities.gluster.StatsInfo;
import org.ovirt.engine.core.common.utils.Pair;
import org.ovirt.engine.core.common.utils.TimeConverter;
import org.ovirt.engine.core.common.utils.gluster.GlusterCoreUtil;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.core.dal.dbbroker.DbFacade;
import org.ovirt.engine.core.dao.gluster.GlusterVolumeDao;
import org.ovirt.engine.core.vdsbroker.irsbroker.StatusReturn;
import org.ovirt.engine.core.vdsbroker.vdsbroker.Status;
@SuppressWarnings("unchecked")
public final class GlusterVolumeProfileInfoReturn extends StatusReturn {
private static final String STATUS = "status";
private static final String PROFILE_INFO = "profileInfo";
private static final String VOLUME_NAME = "volumeName";
private static final String BRICKS = "bricks";
private static final String BRICK = "brick";
private static final String CUMULATIVE_STATS = "cumulativeStats";
private static final String BLOCK_STATS = "blockStats";
private static final String FOP_STATS = "fopStats";
private static final String DURATION = "duration";
private static final String TOTAL_READ = "totalRead";
private static final String TOTAL_WRITE = "totalWrite";
private static final String INTERVAL_STATS = "intervalStats";
private static final String SIZE = "size";
private static final String READ = "read";
private static final String WRITE = "write";
private static final String NAME = "name";
private static final String HITS = "hits";
private static final String LATENCY_AVG = "latencyAvg";
private static final String LATENCY_MIN = "latencyMin";
private static final String LATENCY_MAX = "latencyMax";
private static final String NFSSERVERS = "nfsServers";
private static final String NFS = "nfs";
private Status status;
private GlusterVolumeProfileInfo glusterVolumeProfileInfo = new GlusterVolumeProfileInfo();
public GlusterVolumeProfileInfo getGlusterVolumeProfileInfo() {
return glusterVolumeProfileInfo;
}
public GlusterVolumeProfileInfoReturn(Guid clusterId, Map<String, Object> innerMap) {
super(innerMap);
status = new Status((Map<String, Object>) innerMap.get(STATUS));
Map<String, Object> profileInfo = (Map<String, Object>) innerMap.get(PROFILE_INFO);
if (profileInfo != null) {
String volumeName = (String) profileInfo.get(VOLUME_NAME);
GlusterVolumeEntity volume = getGlusterVolumeDao().getByName(clusterId, volumeName);
glusterVolumeProfileInfo.setVolumeId(volume.getId());
if(profileInfo.containsKey(BRICKS)) {
glusterVolumeProfileInfo.setBrickProfileDetails(prepareBrickProfileDetails(volume,
(Object[]) profileInfo.get(BRICKS)));
} else if(profileInfo.containsKey(NFSSERVERS)){
glusterVolumeProfileInfo.setNfsProfileDetails(prepareNfsProfileDetails((Object[]) profileInfo.get(NFSSERVERS)));
}
}
}
private List<GlusterVolumeProfileStats> prepareNfsProfileDetails(Object[] nfsServerProfileDetails) {
List<GlusterVolumeProfileStats> nfsProfileDetails = new ArrayList<>();
for(Object nfsObject : nfsServerProfileDetails) {
GlusterVolumeProfileStats nfsDetails = new GlusterVolumeProfileStats();
Map<String, Object> nfsProfile = (Map<String, Object>) nfsObject;
nfsDetails.setIdentity((String) nfsProfile.get(NFS));
List<StatsInfo> statsInfo = new ArrayList<>();
statsInfo.add(getStatInfo((Map<String, Object>) nfsProfile.get(CUMULATIVE_STATS), CUMULATIVE_STATS));
statsInfo.add(getStatInfo((Map<String, Object>) nfsProfile.get(INTERVAL_STATS), INTERVAL_STATS));
nfsDetails.setProfileStats(statsInfo);
nfsProfileDetails.add(nfsDetails);
}
return nfsProfileDetails;
}
private List<BrickProfileDetails> prepareBrickProfileDetails(GlusterVolumeEntity volume,
Object[] brickProfileDetails) {
List<BrickProfileDetails> brickProfileDetailsList = new ArrayList<>();
for (Object brickProfileObj : brickProfileDetails) {
BrickProfileDetails brickProfileDetail = new BrickProfileDetails();
Map<String, Object> brickProfile = (Map<String, Object>) brickProfileObj;
GlusterBrickEntity brick =
GlusterCoreUtil.getBrickByQualifiedName(volume.getBricks(), (String) brickProfile.get(BRICK));
if (brick != null) {
brickProfileDetail.setBrickId(brick.getId());
}
List<StatsInfo> statsInfo = new ArrayList<>();
statsInfo.add(getStatInfo((Map<String, Object>) brickProfile.get(CUMULATIVE_STATS), CUMULATIVE_STATS));
statsInfo.add(getStatInfo((Map<String, Object>) brickProfile.get(INTERVAL_STATS), INTERVAL_STATS));
brickProfileDetail.setProfileStats(statsInfo);
brickProfileDetailsList.add(brickProfileDetail);
}
return brickProfileDetailsList;
}
private StatsInfo getStatInfo(Map<String, Object> statsInfoMap, String statType) {
StatsInfo statsInfo = new StatsInfo();
int statsDuration = Integer.parseInt((String) statsInfoMap.get(DURATION));
statsInfo.setDuration(statsDuration);
Pair<Long, TimeUnit> statsDurationFormatted = TimeConverter.autoConvert(statsDuration, TimeUnit.SECONDS);
statsInfo.setDurationFormatted(new Pair<>(statsDurationFormatted.getFirst().intValue(), statsDurationFormatted.getSecond().toString()));
statsInfo.setTotalWrite(Long.parseLong((String) statsInfoMap.get(TOTAL_WRITE)));
statsInfo.setTotalRead(Long.parseLong((String) statsInfoMap.get(TOTAL_READ)));
statsInfo.setBlockStats(getBlockStats((Object[]) statsInfoMap.get(BLOCK_STATS)));
statsInfo.setFopStats(getFopStats((Object[]) statsInfoMap.get(FOP_STATS)));
statsInfo.setProfileStatsType(statType.equals(CUMULATIVE_STATS) ? ProfileStatsType.CUMULATIVE
: ProfileStatsType.INTERVAL);
return statsInfo;
}
private List<FopStats> getFopStats(Object[] fopStatsObjects) {
List<FopStats> fopStatsList = new ArrayList<>();
for (Object fopStatsObj : fopStatsObjects) {
FopStats fopStats = new FopStats();
Map<String, Object> fopStatsMap = (Map<String, Object>) fopStatsObj;
fopStats.setHits(Integer.parseInt((String) fopStatsMap.get(HITS)));
fopStats.setName((String) fopStatsMap.get(NAME));
Double minLatency = Double.valueOf((String) fopStatsMap.get(LATENCY_MIN));
fopStats.setMinLatency(minLatency);
Pair<Long, TimeUnit> minLatencyConverted = TimeConverter.autoConvert(minLatency.longValue(), TimeUnit.MICROSECONDS);
fopStats.setMinLatencyFormatted(new Pair<>(minLatencyConverted.getFirst().doubleValue(), minLatencyConverted.getSecond().toString()));
Double maxLatency = Double.valueOf((String) fopStatsMap.get(LATENCY_MAX));
fopStats.setMaxLatency(maxLatency);
Pair<Long, TimeUnit> maxLatencyConverted = TimeConverter.autoConvert(maxLatency.longValue(), TimeUnit.MICROSECONDS);
fopStats.setMaxLatencyFormatted(new Pair<>(maxLatencyConverted.getFirst().doubleValue(), maxLatencyConverted.getSecond().toString()));
Double avgLatency = Double.valueOf((String) fopStatsMap.get(LATENCY_AVG));
fopStats.setAvgLatency(avgLatency);
Pair<Long, TimeUnit> avgLatencyConverted = TimeConverter.autoConvert(avgLatency.longValue(), TimeUnit.MICROSECONDS);
fopStats.setAvgLatencyFormatted(new Pair<>(avgLatencyConverted.getFirst().doubleValue(), avgLatencyConverted.getSecond().toString()));
fopStatsList.add(fopStats);
}
return fopStatsList;
}
private List<BlockStats> getBlockStats(Object[] blockStatsObjects) {
List<BlockStats> blockStatsList = new ArrayList<>();
for (Object blockStatsObj : blockStatsObjects) {
BlockStats blockStats = new BlockStats();
Map<String, Object> blockStatsMap = (Map<String, Object>) blockStatsObj;
blockStats.setSize(Double.valueOf((String) blockStatsMap.get(SIZE)));
blockStats.setBlockRead(Double.valueOf((String) blockStatsMap.get(READ)));
blockStats.setBlockWrite(Double.valueOf((String) blockStatsMap.get(WRITE)));
blockStatsList.add(blockStats);
}
return blockStatsList;
}
protected GlusterVolumeDao getGlusterVolumeDao() {
return DbFacade.getInstance().getGlusterVolumeDao();
}
public Status getStatus() {
return status;
}
public void setStatus(Status status) {
this.status = status;
}
}