package org.ovirt.engine.api.restapi.types;
import java.util.ArrayList;
import org.ovirt.engine.api.model.Disk;
import org.ovirt.engine.api.model.DiskFormat;
import org.ovirt.engine.api.model.DiskInterface;
import org.ovirt.engine.api.model.DiskProfile;
import org.ovirt.engine.api.model.DiskStatus;
import org.ovirt.engine.api.model.DiskStorageType;
import org.ovirt.engine.api.model.HostStorage;
import org.ovirt.engine.api.model.OpenStackVolumeType;
import org.ovirt.engine.api.model.QcowVersion;
import org.ovirt.engine.api.model.Quota;
import org.ovirt.engine.api.model.ScsiGenericIO;
import org.ovirt.engine.api.model.Snapshot;
import org.ovirt.engine.api.model.StorageDomain;
import org.ovirt.engine.api.model.StorageDomains;
import org.ovirt.engine.api.restapi.utils.GuidUtils;
import org.ovirt.engine.core.common.businessentities.storage.CinderDisk;
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.LunDisk;
import org.ovirt.engine.core.common.businessentities.storage.PropagateErrors;
import org.ovirt.engine.core.common.businessentities.storage.QcowCompat;
import org.ovirt.engine.core.common.businessentities.storage.VolumeFormat;
import org.ovirt.engine.core.common.businessentities.storage.VolumeType;
import org.ovirt.engine.core.compat.Guid;
public class DiskMapper {
@Mapping(from = Disk.class, to = org.ovirt.engine.core.common.businessentities.storage.Disk.class)
public static org.ovirt.engine.core.common.businessentities.storage.Disk map(Disk disk, org.ovirt.engine.core.common.businessentities.storage.Disk template) {
org.ovirt.engine.core.common.businessentities.storage.Disk engineDisk = template;
if (engineDisk == null) {
if (disk.isSetLunStorage()) {
engineDisk = new LunDisk();
} else if (disk.getStorageType() != null) {
DiskStorageType diskStorageType = disk.getStorageType();
switch (diskStorageType) {
case CINDER:
engineDisk = new CinderDisk();
break;
case IMAGE:
engineDisk = new DiskImage();
break;
}
}
if (engineDisk == null) {
engineDisk = new DiskImage();
}
}
// name is depreciated, use alias instead.
if (disk.isSetName()) {
engineDisk.setDiskAlias(disk.getName());
}
if (disk.isSetAlias()) {
engineDisk.setDiskAlias(disk.getAlias());
}
if (disk.isSetId()) {
engineDisk.setId(GuidUtils.asGuid(disk.getId()));
}
if (disk.isSetPropagateErrors()) {
engineDisk.setPropagateErrors(disk.isPropagateErrors() ? PropagateErrors.On
: PropagateErrors.Off);
}
if (disk.isSetWipeAfterDelete()) {
engineDisk.setWipeAfterDelete(disk.isWipeAfterDelete());
}
if (disk.isSetLogicalName()) {
engineDisk.setLogicalName(disk.getLogicalName());
}
if (disk.isSetDescription()) {
engineDisk.setDiskDescription(disk.getDescription());
}
if (disk.isSetShareable()) {
engineDisk.setShareable(disk.isShareable());
}
if (!engineDisk.getDiskStorageType().isInternal()) {
if (disk.isSetLunStorage()) {
((LunDisk) engineDisk).setLun(StorageLogicalUnitMapper.map(disk.getLunStorage(), null));
}
if (disk.isSetSgio()) {
engineDisk.setSgio(map(disk.getSgio(), null));
}
} else {
mapDiskToDiskImageProperties(disk, (DiskImage) engineDisk);
}
return engineDisk;
}
private static void mapDiskToDiskImageProperties(Disk disk,
DiskImage diskImage) {
if (disk.isSetImageId()) {
diskImage.setImageId(GuidUtils.asGuid(disk.getImageId()));
}
if (disk.isSetProvisionedSize()) {
diskImage.setSize(disk.getProvisionedSize());
}
if (disk.isSetFormat()) {
diskImage.setVolumeFormat(map(disk.getFormat(), null));
}
if (disk.isSetQcowVersion()) {
diskImage.setQcowCompat(mapQcowVersion(disk.getQcowVersion()));
}
if (disk.isSetStatus()) {
diskImage.setImageStatus(mapDiskStatus(disk.getStatus()));
}
if (disk.isSetSnapshot() && disk.getSnapshot().isSetId()) {
diskImage.setVmSnapshotId(GuidUtils.asGuid(disk.getSnapshot().getId()));
}
if (disk.isSetSparse()) {
diskImage.setVolumeType(disk.isSparse() ? VolumeType.Sparse : VolumeType.Preallocated);
}
// TODO: relevant when adding disk, needs to be removed when the initial size will be passed in the parameters.
if (disk.isSetInitialSize()) {
diskImage.setActualSizeInBytes(disk.getInitialSize());
}
if (disk.isSetStorageDomains() && disk.getStorageDomains().isSetStorageDomains()
&& disk.getStorageDomains().getStorageDomains().get(0).isSetId()) {
StorageDomain storageDomain = disk.getStorageDomains().getStorageDomains().get(0);
diskImage.setStorageIds(new ArrayList<>());
diskImage.getStorageIds().add(Guid.createGuidFromStringDefaultEmpty(storageDomain.getId()));
}
if (disk.isSetQuota() && disk.getQuota().isSetId()) {
diskImage.setQuotaId(GuidUtils.asGuid(disk.getQuota().getId()));
}
if (disk.isSetDiskProfile() && disk.getDiskProfile().isSetId()) {
diskImage.setDiskProfileId(GuidUtils.asGuid(disk.getDiskProfile().getId()));
}
if (disk.isSetOpenstackVolumeType() && disk.getOpenstackVolumeType().isSetName()) {
diskImage.setCinderVolumeType(disk.getOpenstackVolumeType().getName());
}
}
@Mapping(from = org.ovirt.engine.core.common.businessentities.storage.Disk.class, to = Disk.class)
public static Disk map(org.ovirt.engine.core.common.businessentities.storage.Disk entity, Disk template) {
Disk model = template != null ? template : new Disk();
// name is depreciated, use alias instead.
model.setName(entity.getDiskAlias());
model.setAlias(entity.getDiskAlias());
if (entity.getId() != null) {
model.setId(entity.getId().toString());
}
model.setPropagateErrors(PropagateErrors.On == entity.getPropagateErrors());
model.setWipeAfterDelete(entity.isWipeAfterDelete());
model.setShareable(entity.isShareable());
model.setDescription(entity.getDiskDescription());
model.setLogicalName(entity.getLogicalName());
model.setStorageType(map(entity.getDiskStorageType()));
if (entity.getDiskStorageType() == org.ovirt.engine.core.common.businessentities.storage.DiskStorageType.IMAGE ||
entity.getDiskStorageType() == org.ovirt.engine.core.common.businessentities.storage.DiskStorageType.CINDER) {
mapDiskImageToDiskFields((DiskImage) entity, model);
} else {
model.setLunStorage(StorageLogicalUnitMapper.map(((LunDisk) entity).getLun(), new HostStorage()));
if (entity.getSgio() != null) {
model.setSgio(map(entity.getSgio(), null));
}
}
return model;
}
private static void mapDiskImageToDiskFields(DiskImage entity, Disk model) {
if (entity.getImageId() != null) {
model.setImageId(entity.getImageId().toString());
}
model.setProvisionedSize(entity.getSize());
if (entity.hasActualSize()) {
model.setActualSize(entity.getActualSizeInBytes());
}
if (entity.getSnapshotId() != null) {
model.setSnapshot(new Snapshot());
model.getSnapshot().setId(entity.getSnapshotId().toString());
}
if (entity.getVolumeFormat() != null) {
model.setFormat(map(entity.getVolumeFormat(), null));
}
if (entity.getQcowCompat() != null) {
model.setQcowVersion(mapQcowCompat(entity.getQcowCompat()));
}
if (entity.getImageStatus() != null) {
model.setStatus(mapDiskStatus(entity.getImageStatus()));
}
model.setSparse(VolumeType.Sparse == entity.getVolumeType());
if (entity.getStorageIds() != null && entity.getStorageIds().size() > 0) {
if (!model.isSetStorageDomains()) {
model.setStorageDomains(new StorageDomains());
}
for (Guid id : entity.getStorageIds()){
StorageDomain storageDomain = new StorageDomain();
storageDomain.setId(id.toString());
model.getStorageDomains().getStorageDomains().add(storageDomain);
}
}
if (entity.getQuotaId()!=null) {
Quota quota = new Quota();
quota.setId(entity.getQuotaId().toString());
model.setQuota(quota);
}
if (entity.getDiskProfileId() != null) {
DiskProfile diskProfile = new DiskProfile();
diskProfile.setId(entity.getDiskProfileId().toString());
model.setDiskProfile(diskProfile);
}
if (entity.getCinderVolumeType() != null) {
OpenStackVolumeType volumeType = model.getOpenstackVolumeType();
if (volumeType == null) {
volumeType = new OpenStackVolumeType();
model.setOpenstackVolumeType(volumeType);
}
volumeType.setName(entity.getCinderVolumeType());
}
}
@Mapping(from = DiskFormat.class, to = String.class)
public static VolumeFormat map(DiskFormat diskFormat, VolumeFormat template) {
switch (diskFormat) {
case COW:
return VolumeFormat.COW;
case RAW:
return VolumeFormat.RAW;
default:
return VolumeFormat.Unassigned;
}
}
@Mapping(from = VolumeFormat.class, to = DiskFormat.class)
public static DiskFormat map(VolumeFormat volumeFormat, DiskFormat template) {
switch (volumeFormat) {
case COW:
return DiskFormat.COW;
case RAW:
return DiskFormat.RAW;
default:
return null;
}
}
public static QcowCompat mapQcowVersion(QcowVersion qcowVersion) {
switch (qcowVersion) {
case QCOW2_V2:
return QcowCompat.QCOW2_V2;
case QCOW2_V3:
return QcowCompat.QCOW2_V3;
default:
return QcowCompat.Undefined;
}
}
public static QcowVersion mapQcowCompat(QcowCompat qcowCompat) {
switch (qcowCompat) {
case QCOW2_V2:
return QcowVersion.QCOW2_V2;
case QCOW2_V3:
return QcowVersion.QCOW2_V3;
default:
return null;
}
}
@Mapping(from = ScsiGenericIO.class, to = org.ovirt.engine.core.common.businessentities.storage.ScsiGenericIO.class)
public static org.ovirt.engine.core.common.businessentities.storage.ScsiGenericIO map(
ScsiGenericIO scsiGenericIO,
org.ovirt.engine.core.common.businessentities.storage.ScsiGenericIO template) {
switch (scsiGenericIO) {
case FILTERED:
return org.ovirt.engine.core.common.businessentities.storage.ScsiGenericIO.FILTERED;
case UNFILTERED:
return org.ovirt.engine.core.common.businessentities.storage.ScsiGenericIO.UNFILTERED;
default:
return null;
}
}
@Mapping(from = org.ovirt.engine.core.common.businessentities.storage.ScsiGenericIO.class, to = ScsiGenericIO.class)
public static ScsiGenericIO map(org.ovirt.engine.core.common.businessentities.storage.ScsiGenericIO scsiGenericIO, ScsiGenericIO template) {
switch (scsiGenericIO) {
case FILTERED:
return ScsiGenericIO.FILTERED;
case UNFILTERED:
return ScsiGenericIO.UNFILTERED;
default:
return null;
}
}
@Mapping(from = org.ovirt.engine.core.common.businessentities.storage.DiskStorageType.class, to = DiskStorageType.class)
public static DiskStorageType map(org.ovirt.engine.core.common.businessentities.storage.DiskStorageType diskStorageType) {
switch (diskStorageType) {
case IMAGE:
return DiskStorageType.IMAGE;
case CINDER:
return DiskStorageType.CINDER;
case LUN:
return DiskStorageType.LUN;
default:
return null;
}
}
private static ImageStatus mapDiskStatus(DiskStatus status) {
if (status == null) {
return null;
}
switch (status) {
case ILLEGAL:
return ImageStatus.ILLEGAL;
case LOCKED:
return ImageStatus.LOCKED;
case OK:
return ImageStatus.OK;
default:
return null;
}
}
private static DiskStatus mapDiskStatus(ImageStatus status) {
switch (status) {
case ILLEGAL:
return DiskStatus.ILLEGAL;
case LOCKED:
return DiskStatus.LOCKED;
case OK:
return DiskStatus.OK;
default:
return null;
}
}
@Mapping(from = org.ovirt.engine.core.common.businessentities.StorageDomainType.class, to = DiskStorageType.class)
public static DiskStorageType map(org.ovirt.engine.core.common.businessentities.StorageDomainType storageDomainType) {
switch (storageDomainType) {
case Volume:
return DiskStorageType.CINDER;
default:
return DiskStorageType.IMAGE;
}
}
public static org.ovirt.engine.core.common.businessentities.storage.DiskInterface mapInterface(DiskInterface diskInterface) {
if (diskInterface == null) {
return null;
}
switch (diskInterface) {
case IDE:
return org.ovirt.engine.core.common.businessentities.storage.DiskInterface.IDE;
case VIRTIO:
return org.ovirt.engine.core.common.businessentities.storage.DiskInterface.VirtIO;
case VIRTIO_SCSI:
return org.ovirt.engine.core.common.businessentities.storage.DiskInterface.VirtIO_SCSI;
case SPAPR_VSCSI:
return org.ovirt.engine.core.common.businessentities.storage.DiskInterface.SPAPR_VSCSI;
default:
throw new IllegalArgumentException("Unknown disk interface \"" + diskInterface + "\"");
}
}
public static DiskInterface mapInterface(org.ovirt.engine.core.common.businessentities.storage.DiskInterface diskInterface) {
if (diskInterface == null) {
return null;
}
switch (diskInterface) {
case IDE:
return DiskInterface.IDE;
case VirtIO:
return DiskInterface.VIRTIO;
case VirtIO_SCSI:
return DiskInterface.VIRTIO_SCSI;
case SPAPR_VSCSI:
return DiskInterface.SPAPR_VSCSI;
default:
throw new IllegalArgumentException("Unknown disk interface \"" + diskInterface + "\"");
}
}
}