package org.ovirt.engine.core.vdsbroker.vdsbroker;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.ovirt.engine.core.common.businessentities.StorageDomain;
import org.ovirt.engine.core.common.businessentities.StorageDomainStatus;
import org.ovirt.engine.core.common.errors.EngineError;
import org.ovirt.engine.core.common.utils.EnumUtils;
import org.ovirt.engine.core.common.utils.SizeConverter;
import org.ovirt.engine.core.common.vdscommands.GetStorageDomainStatsVDSCommandParameters;
import org.ovirt.engine.core.vdsbroker.ObjectDescriptor;
import org.ovirt.engine.core.vdsbroker.irsbroker.IrsBrokerCommand;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class GetStorageDomainStatsVDSCommand<P extends GetStorageDomainStatsVDSCommandParameters>
extends VdsBrokerCommand<P> {
private static final Logger log = LoggerFactory.getLogger(GetStorageDomainStatsVDSCommand.class);
private OneStorageDomainStatsReturn result;
public GetStorageDomainStatsVDSCommand(P parameters) {
super(parameters);
}
@Override
protected void executeVdsBrokerCommand() {
result = getBroker().getStorageDomainStats(getParameters().getStorageDomainId().toString());
proceedProxyReturnValue();
StorageDomain domain = buildStorageDynamicStruct(result.storageStats);
domain.setId(getParameters().getStorageDomainId());
setReturnValue(domain);
}
@Override
protected Status getReturnStatus() {
return result.getStatus();
}
@SuppressWarnings("unchecked")
public static StorageDomain buildStorageDynamicStruct(Map<String, Object> struct) {
try {
StorageDomain domain = new StorageDomain();
if (struct.containsKey("status")) {
if ("Attached".equals(struct.get("status").toString())) {
domain.setStatus(StorageDomainStatus.Inactive);
} else {
domain.setStatus(EnumUtils.valueOf(StorageDomainStatus.class, struct.get("status")
.toString(), true));
}
}
Long size = IrsBrokerCommand.assignLongValue(struct, "diskfree");
domain.setAvailableDiskSize((size == null) ? null : (int) (size / SizeConverter.BYTES_IN_GB));
size = IrsBrokerCommand.assignLongValue(struct, "disktotal");
domain.setUsedDiskSize((size == null || domain.getAvailableDiskSize() == null) ? null :
(int) (size / SizeConverter.BYTES_IN_GB) - domain.getAvailableDiskSize());
if (struct.containsKey("alerts")) {
Object[] rawAlerts = (Object[]) struct.get("alerts");
Set<EngineError> alerts = new HashSet<>(rawAlerts.length);
for (Object rawAlert : rawAlerts) {
Map<String, Object> alert = (Map<String, Object>) rawAlert;
Integer alertCode = (Integer) alert.get("code");
if (alertCode == null || EngineError.forValue(alertCode) == null) {
log.warn("Unrecognized alert code: {}.", alertCode);
StringBuilder alertStringBuilder = new StringBuilder();
ObjectDescriptor.toStringBuilder(alert, alertStringBuilder);
log.info("The received alert is: {}", alertStringBuilder);
} else {
alerts.add(EngineError.forValue(alertCode));
}
}
domain.setAlerts(alerts);
}
return domain;
} catch (RuntimeException ex) {
log.error(
"vdsBroker::buildStorageDynamicFromStruct::Failed building Storage dynamic, struct = {}",
struct);
VDSErrorException outEx = new VDSErrorException(ex);
log.error("Exception", outEx);
throw outEx;
}
}
@Override
protected Object getReturnValueFromBroker() {
return result;
}
}