Sahina Bose has uploaded a new change for review. Change subject: restapi: Rest API for brick advanced details ......................................................................
restapi: Rest API for brick advanced details Brick advanced details are retrieved if All-Content is set to true in the header when the url /api/clusters/{id}/glustervolumes/{id}/bricks/{id} is invoked Change-Id: Ie219c7cf59fec8a21a54f34959ee5966eed7d524 Signed-off-by: Sahina Bose <sah...@gmail.com> --- A backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/gluster/GlusterBrickDetailsResource.java M backend/manager/modules/restapi/interface/definition/src/main/resources/api.xsd M backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/gluster/BackendGlusterBrickResource.java M backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/gluster/BackendGlusterBrickResourceTest.java A backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/GlusterBrickDetailMapper.java M backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/GlusterBrickMapper.java A backend/manager/modules/restapi/types/src/test/java/org/ovirt/engine/api/restapi/types/GlusterBrickDetailMapperTest.java 7 files changed, 484 insertions(+), 6 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/91/11391/1 diff --git a/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/gluster/GlusterBrickDetailsResource.java b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/gluster/GlusterBrickDetailsResource.java new file mode 100644 index 0000000..b1dccaf --- /dev/null +++ b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/gluster/GlusterBrickDetailsResource.java @@ -0,0 +1,17 @@ +package org.ovirt.engine.api.resource.gluster; + +import javax.ws.rs.GET; +import javax.ws.rs.Produces; + +import org.jboss.resteasy.annotations.providers.jaxb.Formatted; +import org.ovirt.engine.api.model.GlusterBrickAdvancedDetails; +import org.ovirt.engine.api.resource.MediaType; + +@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, MediaType.APPLICATION_X_YAML}) +public interface GlusterBrickDetailsResource { + + @GET + @Formatted + public GlusterBrickAdvancedDetails 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 dd5877b..5f8b65f 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 @@ -2910,10 +2910,106 @@ <xs:sequence> <xs:annotation> <xs:appinfo> - <jaxb:property name="GlusterVolumes"/> + <jaxb:property name="GlusterVolumes"/> </xs:appinfo> </xs:annotation> <xs:element ref="gluster_volume" minOccurs="0" maxOccurs="unbounded"/> + </xs:sequence> + </xs:extension> + </xs:complexContent> + </xs:complexType> + + <xs:complexType name="GlusterClient"> + <xs:sequence> + <xs:element name="host_name" type="xs:string" minOccurs="0" maxOccurs="1"/> + <xs:element name="client_port" type="xs:int" minOccurs="0" maxOccurs="1"/> + <xs:element name="bytes_read" type="xs:int" minOccurs="0" maxOccurs="1"/> + <xs:element name="bytes_written" type="xs:int" minOccurs="0" maxOccurs="1"/> + </xs:sequence> + </xs:complexType> + + <xs:complexType name="GlusterClients"> + <xs:sequence> + <xs:annotation> + <xs:appinfo> + <jaxb:property name="GlusterClients"/> + </xs:appinfo> + </xs:annotation> + <xs:element name="client" type="GlusterClient" minOccurs="0" maxOccurs="unbounded"/> + </xs:sequence> + </xs:complexType> + + <xs:complexType name="MemoryPool"> + <xs:sequence> + <xs:element name="name" type="xs:string" minOccurs="0" maxOccurs="1"/> + <xs:element name="hot_count" type="xs:int" minOccurs="0" maxOccurs="1"/> + <xs:element name="cold_count" type="xs:int" minOccurs="0" maxOccurs="1"/> + <xs:element name="padded_size" type="xs:int" minOccurs="0" maxOccurs="1"/> + <xs:element name="alloc_count" type="xs:int" minOccurs="0" maxOccurs="1"/> + <xs:element name="max_alloc" type="xs:int" minOccurs="0" maxOccurs="1"/> + <xs:element name="pool_misses" type="xs:int" minOccurs="0" maxOccurs="1"/> + <xs:element name="max_std_alloc" type="xs:int" minOccurs="0" maxOccurs="1"/> + </xs:sequence> + </xs:complexType> + + <xs:complexType name="MemoryPools"> + <xs:sequence> + <xs:annotation> + <xs:appinfo> + <jaxb:property name="MemoryPools"/> + </xs:appinfo> + </xs:annotation> + <xs:element name="memory_pool" type="MemoryPool" minOccurs="0" maxOccurs="unbounded"/> + </xs:sequence> + </xs:complexType> + + <xs:complexType name="GlusterBrickMemoryInfo"> + <xs:sequence> + <!-- equivalent to arena --> + <xs:element name="total_alloc" type="xs:int" minOccurs="0" maxOccurs="1"/> + <!-- equivalent to ord_blks --> + <xs:element name="free_blocks" type="xs:int" minOccurs="0" maxOccurs="1"/> + <!-- equivalent to sm_blks --> + <xs:element name="free_fast_bin" type="xs:int" minOccurs="0" maxOccurs="1"/> + <!-- equivalent to hblks --> + <xs:element name="mmapped_blks" type="xs:int" minOccurs="0" maxOccurs="1"/> + <!-- equivalent to hblkhd --> + <xs:element name="space_alloc_mmapped" type="xs:int" minOccurs="0" maxOccurs="1"/> + <!-- equivalent to usmblks --> + <xs:element name="max_total_alloc" type="xs:int" minOccurs="0" maxOccurs="1"/> + <!-- equivalent to fsmblks --> + <xs:element name="space_freed_fastbin" type="xs:int" minOccurs="0" maxOccurs="1"/> + <!-- equivalent to uordblks --> + <xs:element name="total_alloc_space" type="xs:int" minOccurs="0" maxOccurs="1"/> + <!-- equivalent to fordblks --> + <xs:element name="total_free_space" type="xs:int" minOccurs="0" maxOccurs="1"/> + <!-- equivalent to keepcost --> + <xs:element name="releasable_free_space" type="xs:int" minOccurs="0" maxOccurs="1"/> + <xs:element name="memory_pools" type="MemoryPools" minOccurs="0" maxOccurs="1"/> + </xs:sequence> + </xs:complexType> + + <xs:element name="brick_details" type="GlusterBrickAdvancedDetails" /> + <xs:complexType name="GlusterBrickAdvancedDetails"> + <xs:annotation> + <xs:appinfo> + <jaxb:class name="GlusterBrickAdvancedDetails"/> + </xs:appinfo> + </xs:annotation> + <xs:complexContent> + <xs:extension base="BaseResource"> + <xs:sequence> + <xs:element ref="status" minOccurs="0" maxOccurs="1"/> + <xs:element name="port" type="xs:int" minOccurs="0" maxOccurs="1"/> + <xs:element name="pid" type="xs:int" minOccurs="0" maxOccurs="1"/> + <xs:element name="total_size" type="xs:int" minOccurs="0" maxOccurs="1"/> + <xs:element name="free_size" type="xs:double" minOccurs="0" maxOccurs="1"/> + <xs:element name="device" type="xs:string" minOccurs="0" maxOccurs="1"/> + <xs:element name="block_size" type="xs:int" minOccurs="0" maxOccurs="1"/> + <xs:element name="mnt_options" type="xs:string" minOccurs="0" maxOccurs="1"/> + <xs:element name="fs_name" type="xs:string" minOccurs="0" maxOccurs="1"/> + <xs:element name="clients" type="GlusterClients" minOccurs="0" maxOccurs="1" /> + <xs:element name="memory_info" type="GlusterBrickMemoryInfo" minOccurs="0" maxOccurs="1"/> </xs:sequence> </xs:extension> </xs:complexContent> @@ -2923,7 +3019,7 @@ <xs:complexType name="GlusterBrick"> <xs:annotation> <xs:appinfo> - <jaxb:class name="GlusterBrick"/> + <jaxb:class name="GlusterBrick"/> </xs:appinfo> </xs:annotation> <xs:complexContent> @@ -2933,6 +3029,7 @@ <xs:element name="server_id" type="xs:string" minOccurs="0" maxOccurs="1"/> <xs:element name="brick_dir" type="xs:string" minOccurs="0" maxOccurs="1"/> <xs:element ref="status" minOccurs="0" maxOccurs="1"/> + <xs:element ref="brick_details" minOccurs="0" maxOccurs="1"/> </xs:sequence> </xs:extension> </xs:complexContent> @@ -2975,7 +3072,7 @@ <xs:element name="pm_proxy" type="PmProxy"/> <xs:complexType name="PmProxy"> <xs:sequence> - <xs:element name="type" type="xs:string" minOccurs="0" maxOccurs="1"/> + <xs:element name="type" type="xs:string" minOccurs="0" maxOccurs="1"/> </xs:sequence> </xs:complexType> - </xs:schema> +</xs:schema> \ No newline at end of file diff --git a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/gluster/BackendGlusterBrickResource.java b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/gluster/BackendGlusterBrickResource.java index a179184..1411d62 100644 --- a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/gluster/BackendGlusterBrickResource.java +++ b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/gluster/BackendGlusterBrickResource.java @@ -5,6 +5,7 @@ import org.ovirt.engine.api.model.Action; import org.ovirt.engine.api.model.Cluster; import org.ovirt.engine.api.model.GlusterBrick; +import org.ovirt.engine.api.model.GlusterBrickAdvancedDetails; import org.ovirt.engine.api.model.GlusterVolume; import org.ovirt.engine.api.resource.gluster.GlusterBrickResource; import org.ovirt.engine.api.restapi.resource.AbstractBackendActionableResource; @@ -13,12 +14,16 @@ import org.ovirt.engine.core.common.action.gluster.GlusterVolumeReplaceBrickActionParameters; import org.ovirt.engine.core.common.businessentities.gluster.GlusterBrickEntity; import org.ovirt.engine.core.common.businessentities.gluster.GlusterTaskOperation; +import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeAdvancedDetails; +import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeEntity; import org.ovirt.engine.core.common.queries.IdQueryParameters; import org.ovirt.engine.core.common.queries.VdcQueryType; +import org.ovirt.engine.core.common.queries.gluster.GlusterVolumeAdvancedDetailsParameters; public class BackendGlusterBrickResource extends AbstractBackendActionableResource<GlusterBrick, GlusterBrickEntity> implements GlusterBrickResource { + private BackendGlusterBricksResource parent; public BackendGlusterBrickResource(String brickId, BackendGlusterBricksResource parent) { @@ -32,7 +37,7 @@ @Override public GlusterBrick get() { - return performGet(VdcQueryType.GetGlusterBrickById, new IdQueryParameters(guid)); + return performGet(VdcQueryType.GetGlusterBrickById, new IdQueryParameters(guid)); } @Override @@ -79,6 +84,33 @@ @Override protected GlusterBrick doPopulate(GlusterBrick model, GlusterBrickEntity entity) { - return model; + return populateAdvancedDetails(model,entity); } + + private GlusterBrick populateAdvancedDetails(GlusterBrick model, GlusterBrickEntity entity) { + //TODO: check if advanced details could not be found, should this be ignored? + + GlusterVolumeEntity volumeEntity = getEntity(GlusterVolumeEntity.class, + VdcQueryType.GetGlusterVolumeById, + new IdQueryParameters(entity.getVolumeId()), + null, + true); + + GlusterVolumeAdvancedDetails detailsEntity = getEntity(GlusterVolumeAdvancedDetails.class, + VdcQueryType.GetGlusterVolumeAdvancedDetails, + new GlusterVolumeAdvancedDetailsParameters(volumeEntity.getClusterId(), + volumeEntity.getName(), + entity.getQualifiedName(),true), + null, + true); + + GlusterBrickAdvancedDetails detailsModel = getMapper(GlusterVolumeAdvancedDetails.class, GlusterBrickAdvancedDetails.class) + .map(detailsEntity, null); + model.setBrickDetails(detailsModel); + return model; + + } + + + } diff --git a/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/gluster/BackendGlusterBrickResourceTest.java b/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/gluster/BackendGlusterBrickResourceTest.java index bcea651..74fb57d 100644 --- a/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/gluster/BackendGlusterBrickResourceTest.java +++ b/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/gluster/BackendGlusterBrickResourceTest.java @@ -2,6 +2,10 @@ import static org.easymock.EasyMock.expect; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.Response; import javax.ws.rs.core.UriInfo; @@ -12,13 +16,19 @@ import org.ovirt.engine.api.model.GlusterBrick; import org.ovirt.engine.api.model.GlusterVolume; import org.ovirt.engine.api.resource.ClusterResource; +import org.ovirt.engine.api.restapi.resource.AbstractBackendResource; import org.ovirt.engine.api.restapi.resource.AbstractBackendSubResourceTest; import org.ovirt.engine.core.common.action.VdcActionParametersBase; import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.action.gluster.GlusterVolumeReplaceBrickActionParameters; +import org.ovirt.engine.core.common.businessentities.gluster.BrickDetails; +import org.ovirt.engine.core.common.businessentities.gluster.BrickProperties; import org.ovirt.engine.core.common.businessentities.gluster.GlusterBrickEntity; +import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeAdvancedDetails; +import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeEntity; import org.ovirt.engine.core.common.queries.IdQueryParameters; import org.ovirt.engine.core.common.queries.VdcQueryType; +import org.ovirt.engine.core.common.queries.gluster.GlusterVolumeAdvancedDetailsParameters; import org.ovirt.engine.core.compat.Guid; public class BackendGlusterBrickResourceTest extends AbstractBackendSubResourceTest<GlusterBrick, GlusterBrickEntity, BackendGlusterBrickResource> { @@ -27,6 +37,8 @@ private static final Guid clusterId = GUIDS[2]; private static final Guid serverId = GUIDS[3]; private static final String brickDir = "/export/vol1/brick1"; + private static final String brickName = "server:" + brickDir; + private static final String volumeName = "AnyVolume"; private ClusterResource clusterResourceMock; private BackendGlusterVolumesResource volumesResourceMock; private BackendGlusterVolumeResource volumeResourceMock; @@ -91,6 +103,35 @@ verifyActionResponse(resource.replace(action)); } + @Test + public void testPopulate() throws Exception { + setupParentExpectations(); + setUriInfo(setUpBasicUriExpectations()); + setUpGetEntityExpectationsAllContent(1,false); + + resource.setParent(bricksResourceMock); + control.replay(); + + verifyModel(resource.get(), 0); + + } + + @Test + public void testPopulateNotFound() throws Exception { + setUriInfo(setUpBasicUriExpectations()); + setUpGetEntityExpectationsAllContent(1,true); + + resource.setParent(bricksResourceMock); + control.replay(); + try { + resource.get(); + fail("expected WebApplicationException"); + }catch (WebApplicationException ex) { + verifyNotFoundException(ex); + } + + } + protected UriInfo setUpActionExpectations(VdcActionType task, Class<? extends VdcActionParametersBase> clz, String[] names, @@ -112,6 +153,7 @@ expect(entity.getId()).andReturn(GUIDS[index]).anyTimes(); expect(entity.getServerId()).andReturn(serverId).anyTimes(); expect(entity.getBrickDirectory()).andReturn(brickDir).anyTimes(); + expect(entity.getQualifiedName()).andReturn(brickName).anyTimes(); expect(entity.getVolumeId()).andReturn(volumeId).anyTimes(); return entity; } @@ -141,6 +183,46 @@ } } + private void setUpGetEntityExpectationsAllContent(int times, boolean notFound) throws Exception { + List<String> populateValue = new ArrayList<String>(); + populateValue.add("true"); + expect(httpHeaders.getRequestHeader(AbstractBackendResource.POPULATE)).andReturn(populateValue).anyTimes(); + + // the brick entity should be returned. We are not testing for not found on that. + setUpGetEntityExpectations(times,false); + while (times-- > 0) { + setUpGetEntityExpectations(VdcQueryType.GetGlusterVolumeById, + IdQueryParameters.class, + new String[] { "Id" }, + new Object[] { volumeId }, + getVolumeEntity(0)); + + setUpGetEntityExpectations(VdcQueryType.GetGlusterVolumeAdvancedDetails, + GlusterVolumeAdvancedDetailsParameters.class, + new String[] { "ClusterId", "VolumeName", "BrickName", "DetailRequired" }, + new Object[] { clusterId, volumeName, brickName, true }, + notFound ? null : getVolumeAdvancedDetailsEntity(0)); + } + } + + private GlusterVolumeEntity getVolumeEntity(int index) { + GlusterVolumeEntity entity = control.createMock(GlusterVolumeEntity.class); + expect(entity.getId()).andReturn(volumeId).anyTimes(); + expect(entity.getName()).andReturn(volumeName).anyTimes(); + expect(entity.getClusterId()).andReturn(clusterId).anyTimes(); + return entity; + } + + private GlusterVolumeAdvancedDetails getVolumeAdvancedDetailsEntity(int index) { + GlusterVolumeAdvancedDetails entity = control.createMock(GlusterVolumeAdvancedDetails.class); + + BrickDetails brickDetails = control.createMock(BrickDetails.class); + expect(brickDetails.getBrickProperties()).andReturn(control.createMock(BrickProperties.class)).anyTimes(); + List<BrickDetails> brickDetailsList = Arrays.asList(brickDetails); + expect(entity.getBrickDetails()).andReturn(brickDetailsList).anyTimes(); + return entity; + } + private void setupParentExpectations() { Cluster cluster = new Cluster(); cluster.setId(clusterId.toString()); diff --git a/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/GlusterBrickDetailMapper.java b/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/GlusterBrickDetailMapper.java new file mode 100644 index 0000000..21cab79 --- /dev/null +++ b/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/GlusterBrickDetailMapper.java @@ -0,0 +1,118 @@ +package org.ovirt.engine.api.restapi.types; + +import org.apache.commons.lang.StringUtils; +import org.ovirt.engine.api.model.GlusterBrickAdvancedDetails; +import org.ovirt.engine.api.model.GlusterBrickMemoryInfo; +import org.ovirt.engine.api.model.GlusterClient; +import org.ovirt.engine.api.model.GlusterClients; +import org.ovirt.engine.api.model.MemoryPool; +import org.ovirt.engine.api.model.MemoryPools; +import org.ovirt.engine.core.common.businessentities.gluster.BrickDetails; +import org.ovirt.engine.core.common.businessentities.gluster.BrickProperties; +import org.ovirt.engine.core.common.businessentities.gluster.GlusterClientInfo; +import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeAdvancedDetails; +import org.ovirt.engine.core.common.businessentities.gluster.MallInfo; +import org.ovirt.engine.core.common.businessentities.gluster.MemoryStatus; +import org.ovirt.engine.core.common.businessentities.gluster.Mempool; + +public class GlusterBrickDetailMapper { + + @Mapping (from=GlusterBrickAdvancedDetails.class, to=GlusterVolumeAdvancedDetails.class) + public static GlusterVolumeAdvancedDetails map(GlusterBrickAdvancedDetails model, GlusterVolumeAdvancedDetails toEntity) { + //AdvancedDetails is a read only from server and no support for setting these. + //Hence mapping from REST model to Business entity not required. + GlusterVolumeAdvancedDetails entity = (toEntity == null) ? new GlusterVolumeAdvancedDetails() : toEntity; + return entity; + } + + @Mapping (from=GlusterVolumeAdvancedDetails.class, to=GlusterBrickAdvancedDetails.class) + public static GlusterBrickAdvancedDetails map(GlusterVolumeAdvancedDetails fromEntity, GlusterBrickAdvancedDetails toModel) { + GlusterBrickAdvancedDetails model = (toModel == null) ? new GlusterBrickAdvancedDetails() : toModel; + + if (fromEntity.getBrickDetails() == null) return model; + //Since the getDetails call is for a single brick the list size should always be 1. + //TODO: check-Should Exception be thrown if greater? + BrickDetails detail = (fromEntity.getBrickDetails().size() > 0) ? fromEntity.getBrickDetails().get(0) : null; + + if (detail == null) return model; + + if (detail.getBrickProperties() != null) { + BrickProperties props = detail.getBrickProperties(); + model.setBlockSize(props.getBlockSize()); + if (StringUtils.isNotEmpty(props.getDevice())) + model.setDevice(props.getDevice()); + model.setFreeSize(props.getFreeSize()); + if (StringUtils.isNotEmpty(props.getFsName())) + model.setFsName(props.getFsName()); + if (StringUtils.isNotEmpty(props.getMntOptions())) + model.setMntOptions(props.getMntOptions()); + model.setPid(props.getPid()); + model.setPort(props.getPort()); + } + if (detail.getClients()!= null) { + model.setClients(new GlusterClients()); + for (GlusterClientInfo clientEntity : detail.getClients()) + model.getClients().getGlusterClients().add(map(clientEntity)); + } + + model.setMemoryInfo(map(detail.getMemoryStatus())); + + + return model; + } + + + @Mapping (from=GlusterClientInfo.class, to=GlusterClient.class) + public static GlusterClient map(GlusterClientInfo clientEntity) { + GlusterClient clientModel = new GlusterClient(); + clientModel.setBytesRead(clientEntity.getBytesRead()); + clientModel.setBytesWritten(clientEntity.getBytesWritten()); + clientModel.setClientPort(clientEntity.getClientPort()); + if (StringUtils.isNotEmpty(clientEntity.getHostname())) + clientModel.setHostName(clientEntity.getHostname()); + return clientModel; + } + + @Mapping (from=MemoryStatus.class, to=GlusterBrickMemoryInfo.class) + public static GlusterBrickMemoryInfo map(MemoryStatus memoryStatusEntity) { + + GlusterBrickMemoryInfo memInfo = new GlusterBrickMemoryInfo(); + if (memoryStatusEntity == null) return null; + + MallInfo mallInfo = memoryStatusEntity.getMallInfo(); + memInfo.setTotalAlloc(mallInfo.getArena()); + memInfo.setFreeBlocks(mallInfo.getOrdblks()); + memInfo.setFreeFastBin(mallInfo.getSmblks()); + memInfo.setMmappedBlks(mallInfo.getHblks()); + memInfo.setSpaceAllocMmapped(mallInfo.getHblkhd()); + memInfo.setMaxTotalAlloc(mallInfo.getUsmblks()); + memInfo.setSpaceFreedFastbin(mallInfo.getFsmblks()); + memInfo.setTotalAllocSpace(mallInfo.getUordblks()); + memInfo.setTotalFreeSpace(mallInfo.getFordblks()); + memInfo.setReleasableFreeSpace(mallInfo.getKeepcost()); + + memInfo.setMemoryPools(new MemoryPools()); + for (Mempool pool:memoryStatusEntity.getMemPools()) + memInfo.getMemoryPools().getMemoryPools().add(map(pool)); + return memInfo; + } + + @Mapping (from=Mempool.class, to=MemoryPool.class) + public static MemoryPool map(Mempool poolEntity) { + MemoryPool poolModel = new MemoryPool(); + + if (poolEntity == null) return null; + + poolModel.setName(poolEntity.getName()); + poolModel.setAllocCount(poolEntity.getAllocCount()); + poolModel.setColdCount(poolEntity.getColdCount()); + poolModel.setHotCount(poolEntity.getHotCount()); + poolModel.setMaxAlloc(poolEntity.getMaxAlloc()); + poolModel.setMaxStdAlloc(poolEntity.getMaxStdAlloc()); + poolModel.setPaddedSize(poolEntity.getPadddedSize()); + poolModel.setPoolMisses(poolEntity.getPoolMisses()); + return poolModel; + + } + +} diff --git a/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/GlusterBrickMapper.java b/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/GlusterBrickMapper.java index 6bbbd01..c806482 100644 --- a/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/GlusterBrickMapper.java +++ b/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/GlusterBrickMapper.java @@ -1,5 +1,6 @@ package org.ovirt.engine.api.restapi.types; +import org.apache.commons.lang.StringUtils; import org.ovirt.engine.api.common.util.StatusUtils; import org.ovirt.engine.api.model.GlusterBrick; import org.ovirt.engine.api.model.GlusterState; @@ -45,6 +46,10 @@ brick.setServerId(fromBrick.getServerId().toString()); } + if(StringUtils.isNotEmpty(fromBrick.getQualifiedName())) { + brick.setName(fromBrick.getQualifiedName()); + } + if(fromBrick.getBrickDirectory() != null) { brick.setBrickDir(fromBrick.getBrickDirectory()); } diff --git a/backend/manager/modules/restapi/types/src/test/java/org/ovirt/engine/api/restapi/types/GlusterBrickDetailMapperTest.java b/backend/manager/modules/restapi/types/src/test/java/org/ovirt/engine/api/restapi/types/GlusterBrickDetailMapperTest.java new file mode 100644 index 0000000..95f0b02 --- /dev/null +++ b/backend/manager/modules/restapi/types/src/test/java/org/ovirt/engine/api/restapi/types/GlusterBrickDetailMapperTest.java @@ -0,0 +1,127 @@ +package org.ovirt.engine.api.restapi.types; + +import java.util.ArrayList; +import java.util.List; + +import org.junit.Test; +import org.ovirt.engine.api.model.GlusterBrickAdvancedDetails; +import org.ovirt.engine.core.common.businessentities.gluster.BrickDetails; +import org.ovirt.engine.core.common.businessentities.gluster.BrickProperties; +import org.ovirt.engine.core.common.businessentities.gluster.GlusterClientInfo; +import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeAdvancedDetails; +import org.ovirt.engine.core.common.businessentities.gluster.MallInfo; +import org.ovirt.engine.core.common.businessentities.gluster.MemoryStatus; +import org.ovirt.engine.core.common.businessentities.gluster.Mempool; +import org.ovirt.engine.core.utils.RandomUtils; + +public class GlusterBrickDetailMapperTest extends AbstractInvertibleMappingTest<GlusterVolumeAdvancedDetails, + GlusterBrickAdvancedDetails, GlusterBrickAdvancedDetails> { + + private static final int blockSize = 14556; + + public GlusterBrickDetailMapperTest() { + super(GlusterVolumeAdvancedDetails.class, GlusterBrickAdvancedDetails.class, + GlusterBrickAdvancedDetails.class); + } + + @Override + protected void verify(GlusterVolumeAdvancedDetails model, GlusterVolumeAdvancedDetails transform) { + assertNotNull(transform); + } + + @Test + public void testWithAllDetails() { + GlusterVolumeAdvancedDetails volDetailsEntity = new GlusterVolumeAdvancedDetails(); + volDetailsEntity.setBrickDetails(getBrickDetails(1,2,4)); + GlusterBrickAdvancedDetails model = GlusterBrickDetailMapper.map(volDetailsEntity, null); + assertNotNull(model); + assertEquals(model.getClients().getGlusterClients().size(), 2); + assertEquals(model.getMntOptions(), volDetailsEntity.getBrickDetails().get(0).getBrickProperties().getMntOptions()); + assertEquals(model.getMemoryInfo().getMemoryPools().getMemoryPools().size(), volDetailsEntity.getBrickDetails().get(0).getMemoryStatus().getMemPools().size()); + + } + + @Test + public void testWithNoLists() { + GlusterVolumeAdvancedDetails volDetailsEntity = new GlusterVolumeAdvancedDetails(); + volDetailsEntity.setBrickDetails(getBrickDetails(0,0,0)); + GlusterBrickAdvancedDetails model = GlusterBrickDetailMapper.map(volDetailsEntity, null); + assertNotNull(model); + assertNull(model.getClients()); + assertNull(model.getMntOptions()); + } + + @Test + public void testWithMultipleClientLists() { + GlusterVolumeAdvancedDetails volDetailsEntity = new GlusterVolumeAdvancedDetails(); + volDetailsEntity.setBrickDetails(getBrickDetails(2,2,2)); + + GlusterBrickAdvancedDetails model = GlusterBrickDetailMapper.map(volDetailsEntity, null); + assertEquals(model.getClients().getGlusterClients().size(), 2); + assertEquals(model.getMntOptions(), volDetailsEntity.getBrickDetails().get(0).getBrickProperties().getMntOptions()); + assertEquals(model.getMemoryInfo().getMemoryPools().getMemoryPools().size(), volDetailsEntity.getBrickDetails().get(0).getMemoryStatus().getMemPools().size()); + + } + + @Test + public void testWithNullChildObjects() { + GlusterVolumeAdvancedDetails volDetailsEntity = new GlusterVolumeAdvancedDetails(); + volDetailsEntity.setBrickDetails(getBrickDetails(1,0,0)); + volDetailsEntity.getBrickDetails().get(0).setClients(null); + volDetailsEntity.getBrickDetails().get(0).setMemoryStatus(null); + + GlusterBrickAdvancedDetails model = GlusterBrickDetailMapper.map(volDetailsEntity, null); + assertNotNull(model); + assertNull(model.getClients()); + assertEquals(model.getMntOptions(), volDetailsEntity.getBrickDetails().get(0).getBrickProperties().getMntOptions()); + assertNull(model.getMemoryInfo()); + } + + private List<BrickDetails> getBrickDetails(int size, int clientListSize, int memPoolSize) { + ArrayList<BrickDetails> list = new ArrayList<BrickDetails>(); + for(int i=0; i < size ; i++) { + BrickDetails details = new BrickDetails(); + BrickProperties props = new BrickProperties(); + props.setBlockSize(blockSize); + props.setPid(88888); + props.setMntOptions("mntOption1"); + details.setBrickProperties(props); + details.setClients(getClientList(clientListSize)); + details.setMemoryStatus(getMemoryStatus(memPoolSize)); + list.add(details); + } + return list; + } + + private MemoryStatus getMemoryStatus(int listSize) { + MemoryStatus memStatus = new MemoryStatus(); + memStatus.setMallInfo(new MallInfo()); + + memStatus.getMallInfo().setArena(RandomUtils.instance().nextInt()); + memStatus.getMallInfo().setUordblks(RandomUtils.instance().nextInt()); + ArrayList<Mempool> memPoolsList = new ArrayList<Mempool>(); + for(int i=0; i < listSize ; i++) { + Mempool pool = new Mempool(); + pool.setAllocCount(RandomUtils.instance().nextInt()); + pool.setHotCount(0); + pool.setName(RandomUtils.instance().nextString(5)); + memPoolsList.add(pool); + } + memStatus.setMemPools(memPoolsList); + return memStatus; + } + + private List<GlusterClientInfo> getClientList(int listSize) { + ArrayList<GlusterClientInfo> list = new ArrayList<GlusterClientInfo>(); + for(int i=0; i < listSize ; i++) { + GlusterClientInfo clientInfo = new GlusterClientInfo(); + clientInfo.setBytesRead(RandomUtils.instance().nextInt()); + clientInfo.setBytesWritten(RandomUtils.instance().nextInt()); + clientInfo.setClientPort(RandomUtils.instance().nextInt()); + clientInfo.setHostname(RandomUtils.instance().nextString(7)); + list.add(clientInfo); + } + return list; + } + +} -- To view, visit http://gerrit.ovirt.org/11391 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Ie219c7cf59fec8a21a54f34959ee5966eed7d524 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Sahina Bose <sab...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches