package org.ovirt.engine.core.vdsbroker.gluster;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.TimeZone;
import org.ovirt.engine.core.common.businessentities.gluster.GlusterSnapshotStatus;
import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeEntity;
import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeSnapshotEntity;
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;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@SuppressWarnings("unchecked")
public final class GlusterVolumeSnapshotInfoReturn extends StatusReturn {
private static final String STATUS = "status";
private static final String SNAPSHOT_LIST = "snapshotList";
private static final String SNAPSHOTS = "snapshots";
private static final String NAME = "name";
private static final String DESCRIPTION = "description";
private static final String CREATETIME = "createTime";
private static final String EPOCH_TIME = "epochTime";
private static final String SNAPSHOT_ID = "id";
private static final String SNAP_VOLUME_STATUS = "snapVolumeStatus";
private Status status;
private static final Logger log = LoggerFactory.getLogger(GlusterVolumesListReturn.class);
private List<GlusterVolumeSnapshotEntity> glusterVolumeSnapshots = new ArrayList<>();
public List<GlusterVolumeSnapshotEntity> getSnapshots() {
return glusterVolumeSnapshots;
}
public GlusterVolumeSnapshotInfoReturn(Guid clusterId, Map<String, Object> innerMap) {
super(innerMap);
status = new Status((Map<String, Object>) innerMap.get(STATUS));
Map<String, Object> snapshots = (Map<String, Object>) innerMap.get(SNAPSHOT_LIST);
glusterVolumeSnapshots = prepareVolumeSnapshotsList(clusterId, snapshots);
}
private List<GlusterVolumeSnapshotEntity> prepareVolumeSnapshotsList(Guid clusterId, Map<String, Object> snapshots) {
List<GlusterVolumeSnapshotEntity> newSnapshotsList = new ArrayList<>();
for (Map.Entry<String, Object> entry : snapshots.entrySet()) {
String volumeName = entry.getKey();
Map<String, Object> snapshotInfo = (Map<String, Object>) entry.getValue();
Object[] volumeSnapshots = (Object[]) snapshotInfo.get(SNAPSHOTS);
GlusterVolumeEntity volumeEntity = getGlusterVolumeDao().getByName(clusterId, volumeName);
for (Object snapshot : volumeSnapshots) {
Map<String, Object> individualSnapshot = (Map<String, Object>) snapshot;
GlusterVolumeSnapshotEntity newSnapshot = new GlusterVolumeSnapshotEntity();
newSnapshot.setClusterId(clusterId);
newSnapshot.setVolumeId(volumeEntity.getId());
newSnapshot.setSnapshotId(Guid.createGuidFromString((String) individualSnapshot.get(SNAPSHOT_ID)));
newSnapshot.setSnapshotName((String) individualSnapshot.get(NAME));
newSnapshot.setDescription((String) individualSnapshot.get(DESCRIPTION));
newSnapshot.setStatus(GlusterSnapshotStatus.from((String) individualSnapshot.get(SNAP_VOLUME_STATUS)));
try {
Map<String, Object> createTimeDetail = (Map<String, Object>) individualSnapshot.get(CREATETIME);
long millis = (Integer) createTimeDetail.get(EPOCH_TIME) * 1000L;
Date createDate = new Date(millis);
// Convert to UTC
DateFormat format = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
format.setTimeZone(TimeZone.getTimeZone("Etc/UTC"));
String formattedCreateDate = format.format(createDate);
newSnapshot.setCreatedAt(new Date(formattedCreateDate));
} catch (Exception e) {
log.info("Could not populate creation time for snapshot '{}' of volume '{}' on cluster '{}': {}",
snapshotInfo.get(NAME),
volumeEntity.getName(),
clusterId,
e.getMessage());
log.debug("Exception", e);
}
newSnapshotsList.add(newSnapshot);
}
}
return newSnapshotsList;
}
private GlusterVolumeDao getGlusterVolumeDao() {
return DbFacade.getInstance().getGlusterVolumeDao();
}
public Status getStatus() {
return status;
}
public void setStatus(Status status) {
this.status = status;
}
}