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

Reply via email to