package org.ovirt.engine.core.common.businessentities;
import java.util.Objects;
import java.util.Set;
import org.codehaus.jackson.annotate.JsonIgnore;
import org.ovirt.engine.core.common.businessentities.storage.StorageType;
import org.ovirt.engine.core.common.errors.EngineError;
import org.ovirt.engine.core.common.utils.SizeConverter;
import org.ovirt.engine.core.common.utils.ToStringBuilder;
import org.ovirt.engine.core.compat.Guid;
public class StorageDomain implements IVdcQueryable, BusinessEntityWithStatus<Guid, StorageDomainStatus>, Nameable, Commented {
private static final long serialVersionUID = -6162192446628804305L;
private Boolean supportsDiscard;
private Boolean supportsDiscardZeroesData;
public StorageDomain() {
staticData = new StorageDomainStatic();
dynamicData = new StorageDomainDynamic();
setStoragePoolIsoMapData(new StoragePoolIsoMap());
storageDomainSharedStatus = StorageDomainSharedStatus.Unattached;
hostedEngineStorage = false;
}
private Set<EngineError> alerts;
/**
* @return the alerts
*/
public Set<EngineError> getAlerts() {
return alerts;
}
/**
* @param alerts the alerts to set
*/
public void setAlerts(Set<EngineError> alerts) {
this.alerts = alerts;
}
private StoragePoolIsoMap storagePoolIsoMapData;
public StoragePoolIsoMap getStoragePoolIsoMapData() {
return storagePoolIsoMapData;
}
public void setStoragePoolIsoMapData(StoragePoolIsoMap storagePoolIsoMap) {
storagePoolIsoMapData = storagePoolIsoMap;
}
private StorageDomainStatic staticData;
public StorageDomainStatic getStorageStaticData() {
return staticData;
}
public void setStorageStaticData(StorageDomainStatic staticData) {
this.staticData = staticData;
}
private StorageDomainDynamic dynamicData;
public StorageDomainDynamic getStorageDynamicData() {
return dynamicData;
}
public void setStorageDynamicData(StorageDomainDynamic dynamicData) {
this.dynamicData = dynamicData;
}
@Override
public Guid getId() {
return getStorageStaticData() == null ? null : getStorageStaticData().getId();
}
@Override
public void setId(Guid id) {
getStorageStaticData().setId(id);
getStorageDynamicData().setId(id);
getStoragePoolIsoMapData().setStorageId(id);
}
public String getStorage() {
return getStorageStaticData().getStorage();
}
public void setStorage(String storage) {
getStorageStaticData().setStorage(storage);
}
/**
* Returns the first device of the domain metadata LV for block domains.
* Currently its required that the metadata first extent will be 0, therefore
* modifications of that device should be inspected carefully.
*/
public String getFirstMetadataDevice() {
return getStorageStaticData().getFirstMetadataDevice();
}
public void setFirstMetadataDevice(String firstMetadataDevice) {
getStorageStaticData().setFirstMetadataDevice(firstMetadataDevice);
}
public String getVgMetadataDevice() {
return getStorageStaticData().getVgMetadataDevice();
}
public void setVgMetadataDevice(String vgMetadataDevice) {
getStorageStaticData().setVgMetadataDevice(vgMetadataDevice);
}
@JsonIgnore
@Override
public String getName() {
return getStorageName();
}
public String getStorageName() {
return getStorageStaticData().getStorageName();
}
public void setStorageName(String storageName) {
getStorageStaticData().setStorageName(storageName);
}
public String getDescription() {
return getStorageStaticData().getDescription();
}
public void setDescription(String description) {
getStorageStaticData().setDescription(description);
}
@Override
public String getComment() {
return getStorageStaticData().getComment();
}
@Override
public void setComment(String value) {
getStorageStaticData().setComment(value);
}
public Guid getStoragePoolId() {
return getStoragePoolIsoMapData().getStoragePoolId();
}
public void setStoragePoolId(Guid storagePoolId) {
getStoragePoolIsoMapData().setStoragePoolId(storagePoolId);
}
public Integer getAvailableDiskSize() {
return getStorageDynamicData().getAvailableDiskSize();
}
@JsonIgnore
public Long getAvailableDiskSizeInBytes() {
Integer availableSize = getAvailableDiskSize();
return availableSize != null ? availableSize * SizeConverter.BYTES_IN_GB : null;
}
public Integer getWarningLowSpaceIndicator() {
return staticData == null ? null : staticData.getWarningLowSpaceIndicator();
}
public void setWarningLowSpaceIndicator(Integer warningLowSpaceIndicator) {
staticData.setWarningLowSpaceIndicator(warningLowSpaceIndicator);
}
public int getWarningLowSpaceSize() {
return getWarningLowSpaceIndicator() == null || getTotalDiskSize() == null ?
0 : getTotalDiskSize() * getWarningLowSpaceIndicator() / 100;
}
public Integer getCriticalSpaceActionBlocker() {
return staticData.getCriticalSpaceActionBlocker();
}
public void setCriticalSpaceActionBlocker(Integer criticalSpaceActionBlocker) {
staticData.setCriticalSpaceActionBlocker(criticalSpaceActionBlocker);
}
public void setAvailableDiskSize(Integer availableDiskSize) {
getStorageDynamicData().setAvailableDiskSize(availableDiskSize);
updateTotalDiskSize();
updateOverCommitPercent();
}
private void updateOverCommitPercent() {
if (getAvailableDiskSize() == null || getAvailableDiskSize() == 0) {
setStorageDomainOverCommitPercent(0);
}
else {
setStorageDomainOverCommitPercent((getCommittedDiskSize() - getActualImagesSize()) * 100
/ getAvailableDiskSize());
}
}
private int storageDomainOverCommitPercent;
public int getStorageDomainOverCommitPercent() {
return storageDomainOverCommitPercent;
}
public void setStorageDomainOverCommitPercent(int storageDomainOverCommitPercent) {
this.storageDomainOverCommitPercent = storageDomainOverCommitPercent;
}
private int committedDiskSize;
public int getCommittedDiskSize() {
return committedDiskSize;
}
public void setCommittedDiskSize(int committedDiskSize) {
this.committedDiskSize = committedDiskSize;
updateOverCommitPercent();
}
private int actualImagesSize;
public int getActualImagesSize() {
return actualImagesSize;
}
public void setActualImagesSize(int actualImagesSize) {
this.actualImagesSize = actualImagesSize;
updateOverCommitPercent();
}
public Integer getUsedDiskSize() {
return getStorageDynamicData().getUsedDiskSize();
}
public void setUsedDiskSize(Integer usedDiskSize) {
getStorageDynamicData().setUsedDiskSize(usedDiskSize);
updateTotalDiskSize();
}
private void updateTotalDiskSize() {
Integer available = getStorageDynamicData() == null ? null : getStorageDynamicData().getAvailableDiskSize();
Integer used = getStorageDynamicData() == null ? null : getStorageDynamicData().getUsedDiskSize();
if (available != null && used != null) {
setTotalDiskSize(available + used);
} else {
setTotalDiskSize(null);
}
}
private Integer totalDiskSize;
public Integer getTotalDiskSize() {
updateTotalDiskSize();
return totalDiskSize;
}
public void setTotalDiskSize(Integer value) {
totalDiskSize = value;
}
@Override
public StorageDomainStatus getStatus() {
return getStoragePoolIsoMapData().getStatus();
}
@Override
public void setStatus(StorageDomainStatus status) {
getStoragePoolIsoMapData().setStatus(status);
}
public ExternalStatus getExternalStatus() {
return dynamicData.getExternalStatus();
}
public void setExternalStatus(ExternalStatus externalStatus) {
dynamicData.setExternalStatus(externalStatus);
}
private String storagePoolName;
public String getStoragePoolName() {
return storagePoolName;
}
public void setStoragePoolName(String storagePoolName) {
this.storagePoolName = storagePoolName;
}
public StorageType getStorageType() {
return getStorageStaticData().getStorageType();
}
public void setStorageType(StorageType storageType) {
getStorageStaticData().setStorageType(storageType);
}
public boolean isLocal() {
return getStorageType().isLocal();
}
public boolean isShared() {
return getStorageType().isShared();
}
private StorageDomainSharedStatus storageDomainSharedStatus;
public StorageDomainSharedStatus getStorageDomainSharedStatus() {
return storageDomainSharedStatus;
}
public void setStorageDomainSharedStatus(StorageDomainSharedStatus storageDomainSharedStatus) {
this.storageDomainSharedStatus = storageDomainSharedStatus;
}
public StorageDomainType getStorageDomainType() {
return getStorageStaticData().getStorageDomainType();
}
public void setStorageDomainType(StorageDomainType storageDomainType) {
getStorageStaticData().setStorageDomainType(storageDomainType);
}
public StorageFormatType getStorageFormat() {
return getStorageStaticData().getStorageFormat();
}
public void setStorageFormat(StorageFormatType storageFormatType) {
getStorageStaticData().setStorageFormat(storageFormatType);
}
@Override
public Object getQueryableId() {
return getId();
}
public boolean isAutoRecoverable() {
return staticData.isAutoRecoverable();
}
public void setAutoRecoverable(boolean autoRecoverable) {
staticData.setAutoRecoverable(autoRecoverable);
}
public boolean isContainsUnregisteredEntities() {
return dynamicData.isContainsUnregisteredEntities();
}
public void setContainsUnregisteredEntities(boolean containsUnregisteredEntities) {
dynamicData.setContainsUnregisteredEntities(containsUnregisteredEntities);
}
public long getLastTimeUsedAsMaster() {
return staticData.getLastTimeUsedAsMaster();
}
public void setLastTimeUsedAsMaster(long lastTimeUsedAsMaster) {
staticData.setLastTimeUsedAsMaster(lastTimeUsedAsMaster);
}
public Boolean getWipeAfterDelete() {
return staticData.getWipeAfterDelete();
}
public void setWipeAfterDelete(Boolean wipeAfterDelete) {
staticData.setWipeAfterDelete(wipeAfterDelete);
}
public boolean isDiscardAfterDelete() {
return staticData.isDiscardAfterDelete();
}
public void setDiscardAfterDelete(boolean discardAfterDelete) {
staticData.setDiscardAfterDelete(discardAfterDelete);
}
public Boolean getSupportsDiscard() {
return supportsDiscard;
}
public void setSupportsDiscard(Boolean supportsDiscard) {
this.supportsDiscard = supportsDiscard;
}
public Boolean getSupportsDiscardZeroesData() {
return supportsDiscardZeroesData;
}
public void setSupportsDiscardZeroesData(Boolean supportsDiscardZeroesData) {
this.supportsDiscardZeroesData = supportsDiscardZeroesData;
}
private boolean hostedEngineStorage;
public boolean isHostedEngineStorage() {
return hostedEngineStorage;
}
public void setHostedEngineStorage(boolean hostedEngineStorage) {
this.hostedEngineStorage = hostedEngineStorage;
}
@Override
public int hashCode() {
return Objects.hash(
getId(),
committedDiskSize,
dynamicData,
staticData,
storageDomainSharedStatus,
storageDomainOverCommitPercent,
storagePoolIsoMapData,
totalDiskSize,
supportsDiscard,
supportsDiscardZeroesData,
hostedEngineStorage
);
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (!(obj instanceof StorageDomain)) {
return false;
}
StorageDomain other = (StorageDomain) obj;
return Objects.equals(getId(), other.getId())
&& committedDiskSize == other.committedDiskSize
&& storageDomainSharedStatus == other.storageDomainSharedStatus
&& storageDomainOverCommitPercent == other.storageDomainOverCommitPercent
&& Objects.equals(totalDiskSize, other.totalDiskSize)
&& Objects.equals(supportsDiscard, other.supportsDiscard)
&& Objects.equals(supportsDiscardZeroesData, other.supportsDiscardZeroesData)
&& hostedEngineStorage == other.hostedEngineStorage;
}
@Override
public String toString() {
// Since the static data arrives from external source it's not guarenteed not to be null so a null check is
// mandatory in order to avoid NPE when invoking toString by the logger
return ToStringBuilder.forInstance(this)
.append("domainName", staticData == null ? null : staticData.getName())
.append("domainId", staticData == null ? null : staticData.getId())
.build();
}
}