package org.ovirt.engine.core.vdsbroker.vdsbroker;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.Map;
import org.ovirt.engine.core.common.businessentities.storage.DiskImage;
import org.ovirt.engine.core.common.businessentities.storage.ImageStatus;
import org.ovirt.engine.core.common.businessentities.storage.VolumeFormat;
import org.ovirt.engine.core.common.businessentities.storage.VolumeType;
import org.ovirt.engine.core.common.utils.EnumUtils;
import org.ovirt.engine.core.common.vdscommands.GetVolumeInfoVDSCommandParameters;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.core.vdsbroker.irsbroker.IrsProperties;
public class GetVolumeInfoVDSCommand<P extends GetVolumeInfoVDSCommandParameters> extends VdsBrokerCommand<P> {
private VolumeInfoReturn result;
public GetVolumeInfoVDSCommand(P parameters) {
super(parameters);
}
@Override
protected void executeVdsBrokerCommand() {
GetVolumeInfoVDSCommandParameters params = getParameters();
result = getBroker().getVolumeInfo(
params.getStorageDomainId().toString(),
params.getStoragePoolId().toString(),
params.getImageGroupId().toString(),
params.getImageId().toString());
proceedProxyReturnValue();
setReturnValue(buildImageEntity(result.getVolumeInfo()));
getVDSReturnValue().setSucceeded(getReturnValue() != null);
}
@Override
protected Status getReturnStatus() {
return result.getStatus();
}
@Override
protected Object getReturnValueFromBroker() {
return result;
}
private static Date makeDTFromCTime(long ctime) {
return new Date(ctime * 1000L);
}
public DiskImage buildImageEntity(Map<String, Object> struct) {
DiskImage newImage = new DiskImage();
try {
newImage.setImageId(new Guid((String) struct.get(IrsProperties.uuid)));
newImage.setParentId(new Guid((String) struct.get(IrsProperties.parent)));
newImage.setDescription((String) struct.get(IrsProperties.description));
newImage.setImageStatus(EnumUtils.valueOf(ImageStatus.class,
(String) struct.get(IrsProperties.ImageStatus), true));
if (struct.containsKey(IrsProperties.size)) {
newImage.setSize(Long.parseLong(struct.get(IrsProperties.size).toString()) * 512);
}
if (struct.containsKey("capacity")) {
newImage.setSize(Long.parseLong(struct.get("capacity").toString()));
}
if (struct.containsKey("truesize")) {
newImage.setActualSizeInBytes(Long.parseLong(struct.get("truesize").toString()));
}
if (struct.containsKey("ctime")) {
long secsSinceEpoch = Long.parseLong(struct.get("ctime").toString());
newImage.setCreationDate(makeDTFromCTime(secsSinceEpoch));
}
if (struct.containsKey("mtime")) {
long secsSinceEpoch = Long.parseLong(struct.get("mtime").toString());
newImage.setLastModifiedDate(makeDTFromCTime(secsSinceEpoch));
}
if (struct.containsKey("domain")) {
newImage.setStorageIds(new ArrayList<>(Arrays.asList(new Guid(struct.get("domain").toString()))));
}
if (struct.containsKey("image")) {
newImage.setId(new Guid(struct.get("image").toString()));
}
if (struct.containsKey("type")) {
newImage.setVolumeType(EnumUtils.valueOf(VolumeType.class, struct.get("type").toString(),
true));
}
if (struct.containsKey("format")) {
newImage.setVolumeFormat(EnumUtils.valueOf(VolumeFormat.class, struct.get("format")
.toString(), true));
}
if (struct.containsKey("lease") && struct.get("lease") != null) {
Map<String, Object> leaseStatus = (Map<String, Object>) struct.get("lease");
newImage.getImage().setLeaseStatus(VdsBrokerObjectsBuilder.buildLeaseStatus(leaseStatus));
}
if (struct.containsKey("generation")) {
newImage.getImage().setGeneration(Integer.valueOf(struct.get("generation").toString()));
}
} catch (RuntimeException ex) {
log.error("Failed building DiskImage: {}", ex.getMessage());
printReturnValue();
log.debug("Exception", ex);
newImage = null;
}
return newImage;
}
}