package org.ovirt.engine.core.vdsbroker.glusterbroker;
import java.util.Map;
import org.ovirt.engine.core.common.businessentities.GlusterVolumeEntity;
import org.ovirt.engine.core.common.businessentities.GlusterVolumeEntity.TRANSPORT_TYPE;
import org.ovirt.engine.core.common.businessentities.GlusterVolumeEntity.VOLUME_STATUS;
import org.ovirt.engine.core.vdsbroker.irsbroker.StatusReturnForXmlRpc;
public final class GlusterVolumeListReturnForXmlRpc extends StatusReturnForXmlRpc {
private static final String GLUSTER_VOLUMES = "volumes";
// We are ignoring missing fields after the status, because on failure it is
// not sent.
// [XmlRpcMissingMapping(MappingAction.Ignore), XmlRpcMember("volumes")]
public GlusterVolumeEntity[] volumes;
@SuppressWarnings("unchecked")
public GlusterVolumeListReturnForXmlRpc(Map<String, Object> innerMap) {
super(innerMap);
Object[] temp = (Object[]) innerMap.get(GLUSTER_VOLUMES);
if (temp != null) {
volumes = new GlusterVolumeEntity[temp.length];
for (int i = 0; i < temp.length; i++) {
volumes[i] = prepareVolumeEntity((Map<String, Object>)temp[i]);
}
}
}
private GlusterVolumeEntity prepareVolumeEntity(Map<String, Object> volumeMap) {
GlusterVolumeEntity volume = new GlusterVolumeEntity();
volume.setId(volumeMap.get("uuid").toString());
volume.setName(volumeMap.get("volumeName").toString());
volume.setVolumeType(volumeMap.get("volumeType").toString());
Object[] transportTypes = (Object[])volumeMap.get("transportType");
if(transportTypes != null && transportTypes.length > 0) {
// Though VDSM (gluster) can potentially return multiple transport types for a given volume,
// we are currently showing only one. This needs to be enhanced, starting with adding a list
// of transport types in the volume entity model instead of a single value
volume.setTransportType(TRANSPORT_TYPE.valueOf(transportTypes[0].toString()));
}
volume.setStatus(VOLUME_STATUS.valueOf(volumeMap.get("volumeStatus").toString()));
switch(volume.getVolumeType()) {
case REPLICATE:
case DISTRIBUTED_REPLICATE:
volume.setReplicaCount(Integer.valueOf(volumeMap.get("replicaCount").toString()));
break;
case STRIPE:
case DISTRIBUTED_STRIPE:
volume.setStripeCount(Integer.valueOf(volumeMap.get("stripeCount").toString()));
break;
}
Object[] bricksData = (Object[])volumeMap.get("bricks");
if(bricksData != null && bricksData.length > 0) {
for(Object brickData : bricksData) {
volume.addBrick(brickData.toString());
}
}
Map<String, Object> options = (Map<String, Object>)volumeMap.get("options");
if(options != null && options.size() > 0) {
for(String key : options.keySet()) {
volume.setOption(key, options.get(key).toString());
}
}
return volume;
}
}