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.StorageDomainStatus;
import org.ovirt.engine.core.common.businessentities.storage_domains;
import org.ovirt.engine.core.common.errors.VdcBllErrors;
import org.ovirt.engine.core.common.utils.EnumUtils;
import org.ovirt.engine.core.common.vdscommands.GetStorageDomainStatsVDSCommandParameters;
import org.ovirt.engine.core.compat.LogCompat;
import org.ovirt.engine.core.compat.LogFactoryCompat;
import org.ovirt.engine.core.compat.StringHelper;
import org.ovirt.engine.core.vdsbroker.irsbroker.IrsBrokerCommand;
import org.ovirt.engine.core.vdsbroker.xmlrpc.XmlRpcObjectDescriptor;
import org.ovirt.engine.core.vdsbroker.xmlrpc.XmlRpcStruct;
public class GetStorageDomainStatsVDSCommand<P extends GetStorageDomainStatsVDSCommandParameters>
extends VdsBrokerCommand<P> {
private OneStorageDomainStatsReturnForXmlRpc _result;
public GetStorageDomainStatsVDSCommand(P parameters) {
super(parameters);
}
@Override
protected void ExecuteVdsBrokerCommand() {
_result = getBroker().getStorageDomainStats(getParameters().getStorageDomainId().toString());
ProceedProxyReturnValue();
storage_domains domain = BuildStorageDynamicFromXmlRpcStruct(_result.mStorageStats);
domain.setid(getParameters().getStorageDomainId());
setReturnValue(domain);
}
@Override
protected StatusForXmlRpc getReturnStatus() {
return _result.mStatus;
}
public static storage_domains BuildStorageDynamicFromXmlRpcStruct(XmlRpcStruct xmlRpcStruct) {
try {
storage_domains domain = new storage_domains();
if (xmlRpcStruct.contains("status")) {
// VB & C# TO JAVA CONVERTER NOTE: The following 'switch'
// operated on a string member and was converted to Java
// 'if-else' logic:
// switch (xmlRpcStruct["status"].toString())
// ORIGINAL LINE: case "Attached":
if (StringHelper.EqOp(xmlRpcStruct.getItem("status").toString(), "Attached")) {
domain.setstatus(StorageDomainStatus.InActive);
} else {
domain.setstatus(EnumUtils.valueOf(StorageDomainStatus.class, xmlRpcStruct.getItem("status")
.toString(), true));
}
}
Long size = IrsBrokerCommand.AssignLongValue(xmlRpcStruct, "diskfree");
domain.setavailable_disk_size((size == null) ? null : (int) (size / IrsBrokerCommand.BYTES_TO_GB));
size = IrsBrokerCommand.AssignLongValue(xmlRpcStruct, "disktotal");
domain.setused_disk_size((size == null || domain.getavailable_disk_size() == null) ? null :
(int) (size / IrsBrokerCommand.BYTES_TO_GB) - domain.getavailable_disk_size());
if (xmlRpcStruct.contains("alerts")) {
Object[] rawAlerts = (Object[]) xmlRpcStruct.getItem("alerts");
Set<VdcBllErrors> alerts = new HashSet<VdcBllErrors>(rawAlerts.length);
for (Object rawAlert : rawAlerts) {
XmlRpcStruct alert = new XmlRpcStruct((Map<String, Object>) rawAlert);
Integer alertCode = (Integer) alert.getItem("code");
if (alertCode == null || VdcBllErrors.forValue(alertCode) == null) {
log.warnFormat("Unrecognized alert code: {0}.", alertCode);
StringBuilder alertStringBuilder = new StringBuilder();
XmlRpcObjectDescriptor.ToStringBuilder(alert, alertStringBuilder);
log.infoFormat("The received alert is: {0}", alertStringBuilder.toString());
} else {
alerts.add(VdcBllErrors.forValue(alertCode));
}
}
domain.setAlerts(alerts);
}
return domain;
} catch (RuntimeException ex) {
log.errorFormat(
"vdsBroker::BuildStorageDynamicFromXmlRpcStruct::Failed building Storage dynamic, xmlRpcStruct = {0}",
xmlRpcStruct.toString());
VDSErrorException outEx = new VDSErrorException(ex);
log.error(outEx);
throw outEx;
}
}
@Override
protected Object getReturnValueFromBroker() {
return _result;
}
private static LogCompat log = LogFactoryCompat.getLog(GetStorageDomainStatsVDSCommand.class);
}