Shubhendu Tripathi has uploaded a new change for review. Change subject: restapi: WIP-Introduced statistics for glustervolumes ......................................................................
restapi: WIP-Introduced statistics for glustervolumes Introduced statistics under glustervolumes resource. This would be used for listing the volume capacity details like used, free and total capacity of the volume. Change-Id: I6b17170f403c6ac320829b23b8e2d03b537b8ff2 Signed-off-by: Shubhendu Tripathi <shtri...@redhat.com> --- M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GetGlusterVolumeSizeInfoQuery.java M backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/gluster/GlusterVolumeResource.java M backend/manager/modules/restapi/interface/definition/src/main/resources/api.xsd A backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/VolumeStatisticalQuery.java M backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/gluster/BackendGlusterVolumeResource.java 5 files changed, 140 insertions(+), 1 deletion(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/79/22579/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GetGlusterVolumeSizeInfoQuery.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GetGlusterVolumeSizeInfoQuery.java index 744e0f1..438f9e6 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GetGlusterVolumeSizeInfoQuery.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GetGlusterVolumeSizeInfoQuery.java @@ -39,6 +39,13 @@ } getQueryReturnValue().setReturnValue(fetchVolumeCapacityDetails()); +// List<GlusterVolumeSizeInfo> lst = new ArrayList<>(); +// GlusterVolumeSizeInfo info = new GlusterVolumeSizeInfo(); +// info.setFreeSize(1024L); +// info.setUsedSize(1024L); +// info.setTotalSize(2048L); +// lst.add(info); +// getQueryReturnValue().setReturnValue(lst); } private List<GlusterVolumeSizeInfo> fetchVolumeCapacityDetails() { diff --git a/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/gluster/GlusterVolumeResource.java b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/gluster/GlusterVolumeResource.java index a340bb2..c538942 100644 --- a/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/gluster/GlusterVolumeResource.java +++ b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/gluster/GlusterVolumeResource.java @@ -14,12 +14,13 @@ import org.ovirt.engine.api.model.GlusterVolume; import org.ovirt.engine.api.resource.ActionResource; import org.ovirt.engine.api.resource.ApiMediaType; +import org.ovirt.engine.api.resource.MeasurableResource; /** * Resource interface for the "clusters/{cluster_id}/glustervolumes/{volume_id}" resource */ @Produces({ ApiMediaType.APPLICATION_XML, ApiMediaType.APPLICATION_JSON, ApiMediaType.APPLICATION_X_YAML }) -public interface GlusterVolumeResource { +public interface GlusterVolumeResource extends MeasurableResource { @GET @Formatted public GlusterVolume get(); diff --git a/backend/manager/modules/restapi/interface/definition/src/main/resources/api.xsd b/backend/manager/modules/restapi/interface/definition/src/main/resources/api.xsd index e261939..09ed41f 100644 --- a/backend/manager/modules/restapi/interface/definition/src/main/resources/api.xsd +++ b/backend/manager/modules/restapi/interface/definition/src/main/resources/api.xsd @@ -327,6 +327,7 @@ <xs:element ref="vm" minOccurs="0" maxOccurs="1"/> <xs:element ref="brick" minOccurs="0" maxOccurs="1"/> <xs:element ref="step" minOccurs="0" maxOccurs="1"/> + <xs:element ref="gluster_volume" minOccurs="0" maxOccurs="1"/> </xs:sequence> </xs:extension> </xs:complexContent> @@ -3338,6 +3339,7 @@ <xs:element ref="bricks" minOccurs="0" maxOccurs="1"/> <xs:element ref="options" minOccurs="0" maxOccurs="1"/> <xs:element ref="status" minOccurs="0" maxOccurs="1"/> + <xs:element ref="volume_capacity" minOccurs="0" maxOccurs="1"/> </xs:sequence> </xs:extension> </xs:complexContent> @@ -3455,6 +3457,31 @@ </xs:complexContent> </xs:complexType> + <xs:element name="volume_capacity" type="VolumeCapacity"/> + <xs:complexType name="VolumeCapacity"> + <xs:sequence> + <xs:element name="total_size" type="xs:long" minOccurs="0" maxOccurs="1"/> + <xs:element name="free_size" type="xs:long" minOccurs="0" maxOccurs="1"/> + <xs:element name="used_size" type="xs:long" minOccurs="0" maxOccurs="1"/> + </xs:sequence> + </xs:complexType> + + <xs:element name="volume_capacities" type="VolumeCapacities"/> + <xs:complexType name="VolumeCapacities"> + <xs:complexContent> + <xs:extension base="BaseResources"> + <xs:sequence> + <xs:annotation> + <xs:appinfo> + <jaxb:property name="VolumeCapacities"/> + </xs:appinfo> + </xs:annotation> + <xs:element ref="volume_capacity" minOccurs="0" maxOccurs="unbounded"/> + </xs:sequence> + </xs:extension> + </xs:complexContent> + </xs:complexType> + <xs:element name="brick_memoryinfo" type="GlusterBrickMemoryInfo"/> <xs:complexType name="GlusterBrickMemoryInfo"> <xs:sequence> diff --git a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/VolumeStatisticalQuery.java b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/VolumeStatisticalQuery.java new file mode 100644 index 0000000..579406b --- /dev/null +++ b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/VolumeStatisticalQuery.java @@ -0,0 +1,63 @@ +package org.ovirt.engine.api.restapi.resource; + +import java.util.ArrayList; +import java.util.List; + +import org.ovirt.engine.api.model.GlusterVolume; +import org.ovirt.engine.api.model.Statistic; +import org.ovirt.engine.api.model.ValueType; +import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeEntity; +import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeSizeInfo; +import org.ovirt.engine.core.compat.Guid; + +public class VolumeStatisticalQuery extends AbstractStatisticalQuery<GlusterVolume, GlusterVolumeEntity> { + private final static Statistic MEM_TOTAL_SIZE = create("memory.total.size", "Total size", GAUGE, BYTES, ValueType.INTEGER); + private final static Statistic MEM_FREE_SIZE = create("memory.free.size", "Free size", GAUGE, BYTES, ValueType.INTEGER); + private final static Statistic MEM_USED_SIZE = create("memory.used.size", "Used size", GAUGE, BYTES, ValueType.INTEGER); + + public VolumeStatisticalQuery(GlusterVolume parent ) { + this(null, parent); + } + + public VolumeStatisticalQuery(AbstractBackendResource<GlusterVolume, GlusterVolumeEntity>.EntityIdResolver<Guid> entityResolver, GlusterVolume parent) { + super(GlusterVolume.class, parent, entityResolver); + } + + @Override + public List<Statistic> getStatistics(GlusterVolumeEntity entity) { + GlusterVolumeSizeInfo sizeInfo = entity.getCapacityDetails(); + if (sizeInfo == null) { + return new ArrayList<Statistic>(); + } + return asList(setDatum(clone(MEM_TOTAL_SIZE), sizeInfo.getTotalSize() * Mb), + setDatum(clone(MEM_FREE_SIZE), sizeInfo.getFreeSize() * Mb), + setDatum(clone(MEM_USED_SIZE), sizeInfo.getUsedSize() * Mb)); + + } + + @Override + public Statistic adopt(Statistic statistic) { + statistic.setGlusterVolume(clone(parent)); + return statistic; + } + + private GlusterVolume clone(GlusterVolume volume) { + GlusterVolume cloned = new GlusterVolume(); + cloned.setId(volume.getId()); + cloned.setBricks(volume.getBricks()); + cloned.setCluster(volume.getCluster()); + cloned.setComment(volume.getComment()); + cloned.setCreationStatus(volume.getCreationStatus()); + cloned.setDescription(volume.getDescription()); + cloned.setHref(volume.getHref()); + cloned.setName(volume.getName()); + cloned.setOptions(volume.getOptions()); + cloned.setReplicaCount(volume.getReplicaCount()); + cloned.setStatus(volume.getStatus()); + cloned.setStripeCount(volume.getStripeCount()); + cloned.setTransportTypes(volume.getTransportTypes()); + cloned.setVolumeType(volume.getVolumeType()); + cloned.setVolumeCapacity(volume.getVolumeCapacity()); + return cloned; + } +} diff --git a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/gluster/BackendGlusterVolumeResource.java b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/gluster/BackendGlusterVolumeResource.java index 0cd2978..6edb263 100644 --- a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/gluster/BackendGlusterVolumeResource.java +++ b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/gluster/BackendGlusterVolumeResource.java @@ -1,13 +1,20 @@ package org.ovirt.engine.api.restapi.resource.gluster; +import java.util.ArrayList; +import java.util.List; + +import javax.ws.rs.Path; import javax.ws.rs.core.Response; import org.ovirt.engine.api.model.Action; import org.ovirt.engine.api.model.GlusterVolume; import org.ovirt.engine.api.model.Option; +import org.ovirt.engine.api.resource.StatisticsResource; import org.ovirt.engine.api.resource.gluster.GlusterBricksResource; import org.ovirt.engine.api.resource.gluster.GlusterVolumeResource; import org.ovirt.engine.api.restapi.resource.AbstractBackendActionableResource; +import org.ovirt.engine.api.restapi.resource.BackendStatisticsResource; +import org.ovirt.engine.api.restapi.resource.VolumeStatisticalQuery; import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.action.gluster.GlusterVolumeActionParameters; import org.ovirt.engine.core.common.action.gluster.GlusterVolumeOptionParameters; @@ -15,8 +22,11 @@ import org.ovirt.engine.core.common.action.gluster.ResetGlusterVolumeOptionsParameters; import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeEntity; import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeOptionEntity; +import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeSizeInfo; import org.ovirt.engine.core.common.queries.IdQueryParameters; import org.ovirt.engine.core.common.queries.VdcQueryType; +import org.ovirt.engine.core.common.queries.gluster.GlusterVolumeCapacityQueryParameters; +import org.ovirt.engine.core.compat.Guid; /** * Implementation of the "glustervolumes/{id}" resource @@ -127,4 +137,35 @@ public String getId() { return this.id; } + + @Override + @Path("statistics") + public StatisticsResource getStatisticsResource() { + EntityIdResolver<Guid> resolver = + new QueryIdResolver<Guid>(VdcQueryType.GetGlusterVolumeById, IdQueryParameters.class) { + + @Override + public GlusterVolumeEntity lookupEntity(Guid id) throws BackendFailureException { + GlusterVolumeEntity volumeEntity = getEntity(GlusterVolumeEntity.class, + VdcQueryType.GetGlusterVolumeById, + new IdQueryParameters(id), + null, + true); + List<Guid> guids = new ArrayList<>(); + guids.add(volumeEntity.getId()); + List<GlusterVolumeSizeInfo> sizeInfos = + runQuery(VdcQueryType.GetGlusterVolumeSizeInfo, + new GlusterVolumeCapacityQueryParameters(volumeEntity.getClusterId(), guids)).getReturnValue(); + if (sizeInfos != null && sizeInfos.size() > 0) { + volumeEntity.setCapacityDetails(sizeInfos.get(0)); + } + return volumeEntity; + } + + }; + VolumeStatisticalQuery query = new VolumeStatisticalQuery(resolver, newModel(id)); + return inject(new BackendStatisticsResource<GlusterVolume, GlusterVolumeEntity>(GlusterVolumeEntity.class, + guid, + query)); + } } -- To view, visit http://gerrit.ovirt.org/22579 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I6b17170f403c6ac320829b23b8e2d03b537b8ff2 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Shubhendu Tripathi <shtri...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches