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 <[email protected]>
---
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 <[email protected]>
_______________________________________________
Engine-patches mailing list
[email protected]
http://lists.ovirt.org/mailman/listinfo/engine-patches