Dhandapani Gopal has uploaded a new change for review.

Change subject: engine:[WIP] Storage device listing feature
......................................................................

engine:[WIP] Storage device listing feature

 -TODO: VDSM Dependency

Change-Id: I98f632a7aadfc57964d42e90b6a25c604330ab41
Signed-off-by: Dhandapani <[email protected]>
---
A backend/manager/dbscripts/storage_device_sp.sql
A backend/manager/dbscripts/upgrade/03_02_0050_add_storage_device_list_table.sql
A 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/ContentType.java
A 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/DeviceStatus.java
A 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/DeviceType.java
A 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/StorageDeviceList.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/VDSCommandType.java
M 
backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dal/dbbroker/DbFacade.java
A 
backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/StorageDeviceDao.java
A 
backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/StorageDeviceDaoDbFacadeImpl.java
A 
backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/StorageDeviceDaoTest.java
M backend/manager/modules/dal/src/test/resources/fixtures.xml
A 
backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/StorageDeviceListReturnForXmlRpc.java
A 
backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/StorageDeviceListVDSCommand.java
M 
backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/IVdsServer.java
M 
backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerConnector.java
M 
backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerWrapper.java
17 files changed, 1,255 insertions(+), 0 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/58/10058/1

diff --git a/backend/manager/dbscripts/storage_device_sp.sql 
b/backend/manager/dbscripts/storage_device_sp.sql
new file mode 100644
index 0000000..a0ae2c1
--- /dev/null
+++ b/backend/manager/dbscripts/storage_device_sp.sql
@@ -0,0 +1,128 @@
+/* ----------------------------------------------------------------
+ Stored procedures for database operations on Storage Device
+----------------------------------------------------------------*/
+
+Create or replace FUNCTION InsertStorageDevice(v_id UUID, v_vds_id UUID,
+                                                v_device_name VARCHAR(1000),
+                                                v_container VARCHAR(1000),
+                                                v_content_type VARCHAR(32),
+                                                v_flag_list VARCHAR(1000),
+                                                v_fs_size INTEGER,
+                                                v_fs_size_free INTEGER,
+                                                v_fs_type VARCHAR(256),
+                                                v_fs_uuid UUID,
+                                                v_uuid UUID,
+                                                v_members VARCHAR(1000),
+                                                model VARCHAR(1000),
+                                                mount_point VARCHAR(1000),
+                                                origin VARCHAR(256),
+                                                parent VARCHAR(256),
+                                                partitions VARCHAR(256),
+                                                size INTEGER,
+                                                free_size INTEGER,
+                                                start_size INTEGER,
+                                                end_size INTEGER,
+                                                status VARCHAR(256),
+                                                table_type VARCHAR(256),
+                                                type VARCHAR(256),
+                                                vendor VARCHAR(256))
+    RETURNS VOID
+    AS $procedure$
+BEGIN
+    INSERT INTO storage_device_list (id, vds_id, device_name, container,
+            content_type, flag_list, fs_size, fs_size_free, fs_type, 
+            fs_uuid, uuid, members, model, mount_point, origin, parent, 
+            partitions, size, free_size, start_size, end_size, status, 
table_type, type, vendor)
+    VALUES (v_id,  v_vds_id, v_device_name, v_container,
+        v_content_type, v_flag_list,  v_fs_size, v_fs_size_free, v_fs_type, 
+        v_fs_uuid, v_uuid, v_members, v_model, v_mount_point, v_origin, 
v_parent, 
+        v_partitions, v_size, v_free_size, v_start_size, v_end_size, v_status, 
v_table_type, v_type, v_vendor);
+END; $procedure$
+LANGUAGE plpgsql;
+
+Create or replace FUNCTION UpdateStorageDevice(v_id UUID, v_vds_id UUID,
+                                                v_device_name VARCHAR(1000),
+                                                v_container VARCHAR(1000),
+                                                v_content_type VARCHAR(32),
+                                                v_flag_list VARCHAR(1000),
+                                                v_fs_size INTEGER,
+                                                v_fs_size_free INTEGER,
+                                                v_fs_type VARCHAR(256),
+                                                v_fs_uuid UUID,
+                                                v_uuid UUID,
+                                                v_members VARCHAR(1000),
+                                                model VARCHAR(1000),
+                                                mount_point VARCHAR(1000),
+                                                origin VARCHAR(256),
+                                                parent VARCHAR(256),
+                                                partitions VARCHAR(256),
+                                                size INTEGER,
+                                                free_size INTEGER,
+                                                start_size INTEGER,
+                                                end_size INTEGER,
+                                                status VARCHAR(256),
+                                                table_type VARCHAR(256),
+                                                type VARCHAR(256),
+                                                vendor VARCHAR(256))
+        RETURNS VOID
+        AS $procedure$
+BEGIN
+    UPDATE storage_device_list 
+    SET vds_id = v_vds_id,
+        device_name = v_device_name,
+        container = v_container,
+        content_type = v_content_type,
+        flag_list = v_flag_list,
+        fs_size = v_fs_size,
+        fs_size_free = v_fs_size_free,
+        fs_type = v_fs_type,
+        fs_uuid = v_fs_uuid,
+        uuid = v_uuid,
+        members = v_members,
+        model = v_model,
+        mount_point = v_mount_point,
+        origin = v_origin,
+        parent = v_parent,
+        partitions = v_partitions,
+        size = v_size,
+        free_size = v_free_size,
+        start_size = v_start_size,
+        end_size = v_end_size,
+        status = v_status,
+        table_type = v_table_type,
+        type = v_type,
+        vendor = v_vendor
+        _update_date = LOCALTIMESTAMP
+    WHERE id = v_id;
+END; $procedure$
+LANGUAGE plpgsql;
+
+Create or replace FUNCTION GetStorageDeviceById(v_id UUID)
+    RETURNS SETOF storage_device_list
+    AS $procedure$
+BEGIN
+    RETURN QUERY SELECT *
+    FROM storage_device_list
+    WHERE id = v_id;
+END; $procedure$
+LANGUAGE plpgsql;
+
+
+Create or replace FUNCTION GetStorageDevicesByHostId(v_vds_id UUID)
+    RETURNS SETOF storage_device_list
+    AS $procedure$
+BEGIN
+    RETURN QUERY SELECT *
+    FROM  storage_device_list
+    WHERE vds_id = v_vds_id;
+END; $procedure$
+LANGUAGE plpgsql;
+
+Create or replace FUNCTION DeleteStorageDeviceByGuid(v_id UUID)
+    RETURNS VOID
+    AS $procedure$
+BEGIN
+    DELETE FROM storage_device_list
+    WHERE id = v_id;
+END; $procedure$
+LANGUAGE plpgsql;
diff --git 
a/backend/manager/dbscripts/upgrade/03_02_0050_add_storage_device_list_table.sql
 
b/backend/manager/dbscripts/upgrade/03_02_0050_add_storage_device_list_table.sql
new file mode 100644
index 0000000..e0be92e
--- /dev/null
+++ 
b/backend/manager/dbscripts/upgrade/03_02_0050_add_storage_device_list_table.sql
@@ -0,0 +1,46 @@
+Create or replace FUNCTION __temp_fn_db_add_storage_device_list() returns void
+AS $procedure$
+BEGIN
+
+-- Add storage_device_list table which reflects the meta data of a Storage 
Device
+if (not exists (select 1 from INFORMATION_SCHEMA.TABLES where 
table_name='storage_device_list')) then
+  begin
+    CREATE TABLE storage_device_list
+    (
+     id UUID NOT NULL,
+     vds_id uuid NOT NULL references vds_static (vds_id) on delete cascade,
+     device_name VARCHAR(1000) NOT NULL,
+     container VARCHAR(1000),
+     content_type VARCHAR(32) NOT NULL,
+     flag_list VARCHAR(1000),
+     fs_size NUMERIC NOT NULL DEFAULT 0,
+     fs_size_free NUMERIC NOT NULL DEFAULT 0,
+     fs_type VARCHAR(256),
+     fs_uuid UUID,
+     uuid UUID,
+     members VARCHAR(1000),
+     model VARCHAR(1000),
+     mount_point VARCHAR(1000),
+     origin VARCHAR(256),
+     parent VARCHAR(256),
+     partitions VARCHAR(256),
+     size NUMERIC NOT NULL DEFAULT 0,
+     free_size NUMERIC NOT NULL DEFAULT 0,
+     start_size NUMERIC NOT NULL DEFAULT 0,
+     end_size NUMERIC NOT NULL DEFAULT 0,
+     status VARCHAR(256) NOT NULL,
+     table_type VARCHAR(256),
+     type VARCHAR(256),
+     vendor VARCHAR(256),
+     _create_date TIMESTAMP WITH TIME ZONE NOT NULL default LOCALTIMESTAMP,
+     _update_date TIMESTAMP WITH TIME ZONE,
+     CONSTRAINT pk_storage_device_list PRIMARY KEY(id)
+    ) WITH OIDS;
+  end;
+end if;
+
+END; $procedure$
+LANGUAGE plpgsql;
+
+select __temp_fn_db_add_storage_device_list();
+drop function __temp_fn_db_add_storage_device_list();
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/ContentType.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/ContentType.java
new file mode 100644
index 0000000..bb0aff4
--- /dev/null
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/ContentType.java
@@ -0,0 +1,24 @@
+package org.ovirt.engine.core.common.businessentities;
+
+/**
+ * Enum for Device Type.
+ * @see StorageDeviceList
+ */
+public enum ContentType {
+    /**
+     * Can be used for data storage i.e. Bricks can be created on this device.
+     */
+    DATA,
+    /**
+     * Is a boot disk. Bricks should not be created on it.
+     */
+    BOOT,
+    /**
+     * Swap disk. Bricks should not be created on it.
+     */
+    SWAP,
+    /**
+     * Device type not known.
+     */
+    UNKNOWN
+}
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/DeviceStatus.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/DeviceStatus.java
new file mode 100644
index 0000000..578c8b2
--- /dev/null
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/DeviceStatus.java
@@ -0,0 +1,41 @@
+package org.ovirt.engine.core.common.businessentities;
+
+
+/**
+ * Enum for Device Status.
+ * @see StorageDeviceList
+ */
+public enum DeviceStatus {
+    /**
+     * Device has been formatted and mounted
+     */
+    MOUNTED,
+    /**
+     * Not yet fully initialized. Either not partitioned, or not formatted, or 
not mounted
+     */
+    UNINITIALIZED,
+    /**
+     * Device is currently initializing i.e. Partitioning, formatting or 
mounting in progress
+     */
+    INITIALIZING,
+    /**
+     * Device has been formatted, but not yet mounted
+     */
+    FORMATTED,
+    /**
+     * Device has been partitioned, but not yet formatted
+     */
+    PARTED,
+    /**
+     * Device unusable
+     */
+    UNUSABLE,
+    /**
+     * Device format is unsupported
+     */
+    FORMAT_UNSUPPORTED,
+    /**
+     * Device is not accessible due to IO errors
+     */
+    NA
+}
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/DeviceType.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/DeviceType.java
new file mode 100644
index 0000000..1e7774d
--- /dev/null
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/DeviceType.java
@@ -0,0 +1,13 @@
+package org.ovirt.engine.core.common.businessentities;
+
+/**
+ * Enum for Device Type.
+ * @see StorageDeviceList
+ */
+public enum DeviceType {
+    BLOCK,
+    MD,
+    LVM_VG,
+    LVM_LV,
+    LVM_LV_SNAPSHOT
+}
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/StorageDeviceList.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/StorageDeviceList.java
new file mode 100644
index 0000000..58f31b2
--- /dev/null
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/StorageDeviceList.java
@@ -0,0 +1,407 @@
+package org.ovirt.engine.core.common.businessentities;
+
+
+import java.util.List;
+
+import javax.validation.constraints.NotNull;
+
+import org.ovirt.engine.core.common.validation.group.CreateEntity;
+import org.ovirt.engine.core.common.validation.group.RemoveEntity;
+import org.ovirt.engine.core.compat.Guid;
+
+/**
+ * class representing a storage device List.
+ * @see DeviceStatus
+ * @see ContentType
+ * @see DeviceType
+ */
+public class StorageDeviceList  extends IVdcQueryable implements 
BusinessEntity<Guid> {
+    private static final long serialVersionUID = 5124373011638326818L;
+
+    @NotNull(message = "VALIDATION.STORAGE.DEVICE.ID.NOT_NULL", groups = { 
RemoveEntity.class })
+    private Guid deviceId;
+
+    @NotNull(message = "VALIDATION.STORAGE.DEVICE.HOST.ID.NOT_NULL", groups = 
{ CreateEntity.class })
+    private Guid hostId;
+
+    @NotNull(message = "VALIDATION.STORAGE.DEVICE.NAME.NOT_NULL", groups = 
{CreateEntity.class})
+    private String name;
+
+    private Guid fsId;
+
+    private DeviceType type;
+    private ContentType contentType;
+    private String model;
+    private String fsType;
+    private String hostName;
+    private String mountPoint;
+    private double space = 0.0;
+    private double freeSpace = 0.0;
+    private double fsSize = 0.0;
+    private double fsFreeSize = 0.0;
+    private DeviceStatus status;
+    private String vendor;
+    private List<String> partitionNames;
+    private String container;
+    private List<String> members;
+    private List<String> flagList;
+    private String origin;
+    private String parent;
+    private double startSize = 0.0;
+    private double endSize = 0.0;
+    private String tableType;
+    private Guid deviceUuid;
+
+
+    public StorageDeviceList() {
+    }
+
+    public StorageDeviceList(Guid deviceId,
+            String name,
+            DeviceType type,
+            ContentType contentType,
+            String model,
+            String fsType,
+            Guid hostId,
+            String hostName,
+            String mountPoint,
+            double space,
+            double freeSpace,
+            double fsSpace,
+            double fsFreeSpace,
+            DeviceStatus status,
+            String vendor,
+            String container,
+            List<String> partitionNames,
+            List<String> members,
+            List<String> flagList,
+            String origin,
+            String parent,
+            double startSize,
+            double endSize,
+            String tableType,
+            Guid deviceUuid,
+            Guid fsId) {
+        setId(deviceId);
+        setName(name);
+        setType(type);
+        setContentType(contentType);
+        setModel(model);
+        setFsType(fsType);
+        setHostId(hostId);
+        setHostName(hostName);
+        setMountPoint(mountPoint);
+        setSpace(space);
+        setFreeSpace(freeSpace);
+        setFsSize(fsSpace);
+        setFsFreeSize(fsFreeSpace);
+        setStatus(status);
+        setVendor(vendor);
+        setContainer(container);
+        setPartitionNames(partitionNames);
+        setMembers(members);
+        setFlagList(flagList);
+        setOrigin(origin);
+        setParent(parent);
+        setStartSize(startSize);
+        setEndSize(endSize);
+        setTableType(tableType);
+        setDeviceUuid(deviceUuid);
+        setFsId(fsId);
+    }
+
+    public double getSpace() {
+        return space;
+    }
+
+    public double getFreeSpace() {
+        return (getSpace() - getfreeSpace());
+    }
+
+    public void setSpace(double space) {
+        this.space = space;
+    }
+
+    public boolean isUninitialized() {
+        return getStatus() == DeviceStatus.UNINITIALIZED;
+    }
+
+    public boolean isInitialized() {
+        return getStatus() == DeviceStatus.MOUNTED;
+    }
+
+    public boolean isReady() {
+        return (getStatus() == DeviceStatus.MOUNTED && getContentType() == 
ContentType.DATA);
+    }
+
+    public DeviceStatus getStatus() {
+        return status;
+    }
+
+    public void setStatus(DeviceStatus status) {
+        this.status = status;
+    }
+
+    public double getfreeSpace() {
+        return freeSpace;
+    }
+
+    public void setFreeSpace(double freeSpace) {
+        this.freeSpace = freeSpace;
+    }
+
+    public String getHostName() {
+        return hostName;
+    }
+
+    public void setHostName(String hostName) {
+        this.hostName = hostName;
+    }
+
+    public void setMountPoint(String mountPoint) {
+        this.mountPoint = mountPoint;
+    }
+
+    public String getMountPoint() {
+        return mountPoint;
+    }
+
+    public ContentType getContentType() {
+        return contentType;
+    }
+
+    public void setContentType(ContentType contentType) {
+        this.contentType = contentType;
+    }
+
+    public String getFsType() {
+        return fsType;
+    }
+
+    public void setFsType(String fsType) {
+        this.fsType = fsType;
+    }
+
+    public String getQualifiedName() {
+        return getHostName() + ":" + getName();
+    }
+
+    public String getQualifiedBrickName(String volumeName) {
+        return getHostName() + ":" + getMountPoint() + "/" + volumeName;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+
+        if (!(obj instanceof StorageDeviceList)) {
+            return false;
+        }
+
+        StorageDeviceList device = (StorageDeviceList) obj;
+
+        String oldMountPoint = (getMountPoint() == null ? "" : 
getMountPoint());
+        String oldFsType = (getFsType() == null ? "" : getFsType());
+
+        String newMountPoint = (device.getMountPoint() == null ? "" : 
getMountPoint());
+        String newFsType = (device.getFsType() == null ? "" : getFsType());
+
+        String oldModel = (getModel() == null ? "" : getModel());
+        String newModel = (device.getModel() == null ? "" : getModel());
+
+        if (getName().equals(device.getName()) && 
getHostName().equals(device.getHostName())
+                && oldMountPoint.equals(newMountPoint) && getStatus() == 
device.getStatus()
+                && getSpace() == device.getSpace() && getfreeSpace() == 
device.getfreeSpace()
+                && oldFsType.equals(newFsType) && getType() == device.getType()
+                && getContentType() == device.getContentType() && getFsSize() 
== device.getFsSize()
+                && getFsFreeSize() == device.getFsFreeSize() && 
oldModel.equals(newModel)) {
+            return true;
+ }
+
+        return false;
+    }
+
+    public void copyFrom(StorageDeviceList newDevice) {
+        setName(newDevice.getName());
+        setId(newDevice.getId());
+        setMountPoint(newDevice.getMountPoint());
+        setHostName(newDevice.getHostName());
+        setStatus(newDevice.getStatus());
+        setFsType(newDevice.getFsType());
+        setType(newDevice.getType());
+        setSpace(newDevice.getSpace());
+        setFreeSpace(newDevice.getfreeSpace());
+        setFsSize(newDevice.getFsSize());
+        setFsFreeSize(newDevice.getFsFreeSize());
+        setContentType(newDevice.getContentType());
+        setModel(newDevice.getModel());
+        setHostId(newDevice.getHostId());
+        setVendor(newDevice.getVendor());
+        setContainer(newDevice.getContainer());
+        setMembers(newDevice.getMembers());
+        setPartitionNames(newDevice.getPartitionNames());
+        setFlagList(newDevice.getFlagList());
+        setOrigin(newDevice.getOrigin());
+        setParent(newDevice.getParent());
+        setStartSize(newDevice.getStartSize());
+        setEndSize(newDevice.getEndSize());
+        setTableType(newDevice.getTableType());
+        setDeviceUuid(newDevice.getDeviceUuid());
+        setFsId(newDevice.getFsId());
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setId(Guid deviceId) {
+        this.deviceId = deviceId;
+    }
+
+    public Guid getId() {
+        return deviceId;
+    }
+
+    public void setType(DeviceType type) {
+        this.type = type;
+    }
+
+    public DeviceType getType() {
+        return type;
+    }
+
+    public void setModel(String model) {
+        this.model = model;
+    }
+
+    public String getModel() {
+        return model;
+    }
+
+    public void setHostId(Guid hostId) {
+        this.hostId = hostId;
+    }
+
+    public Guid getHostId() {
+        return hostId;
+    }
+
+    public void setVendor(String vendor) {
+        this.vendor = vendor;
+    }
+
+    public String getVendor() {
+        return vendor;
+    }
+
+    public void setContainer(String container) {
+        this.container = container;
+    }
+
+    public String getContainer() {
+        return container;
+    }
+
+    public void setMembers(List<String> members) {
+        this.members = members;
+    }
+
+    public List<String> getMembers() {
+        return members;
+    }
+
+    public List<String> getPartitionNames() {
+        return partitionNames;
+    }
+
+    public void setPartitionNames(List<String> partitionNames) {
+        this.partitionNames = partitionNames;
+    }
+
+    public Guid getFsId() {
+        return fsId;
+    }
+
+    public void setFsId(Guid fsId) {
+        this.fsId = fsId;
+    }
+
+    public double getFsSize() {
+        return fsSize;
+    }
+
+    public void setFsSize(double fsSize) {
+        this.fsSize = fsSize;
+    }
+
+    public double getFsFreeSize() {
+        return fsFreeSize;
+    }
+
+    public void setFsFreeSize(double fsFreeSize) {
+        this.fsFreeSize = fsFreeSize;
+    }
+
+    public List<String> getFlagList() {
+        return flagList;
+    }
+
+    public void setFlagList(List<String> flagList) {
+        this.flagList = flagList;
+    }
+
+    public String getOrigin() {
+        return origin;
+    }
+
+    public void setOrigin(String origin) {
+        this.origin = origin;
+    }
+
+    public String getParent() {
+        return parent;
+    }
+
+    public void setParent(String parent) {
+        this.parent = parent;
+    }
+
+    public double getStartSize() {
+        return startSize;
+    }
+
+    public void setStartSize(double startSize) {
+        this.startSize = startSize;
+    }
+
+    public double getEndSize() {
+        return endSize;
+    }
+
+    public void setEndSize(double endSize) {
+        this.endSize = endSize;
+    }
+
+    public String getTableType() {
+        return tableType;
+    }
+
+    public void setTableType(String tableType) {
+        this.tableType = tableType;
+    }
+
+    public Guid getDeviceUuid() {
+        return deviceUuid;
+    }
+
+    public void setDeviceUuid(Guid deviceUuid) {
+        this.deviceUuid = deviceUuid;
+    }
+}
+
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/VDSCommandType.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/VDSCommandType.java
index 13479ac..8013d7e 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/VDSCommandType.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/VDSCommandType.java
@@ -140,6 +140,7 @@
     GetGlusterVolumeAdvancedDetails("org.ovirt.engine.core.vdsbroker.gluster"),
     GlusterVolumesList("org.ovirt.engine.core.vdsbroker.gluster"),
     GetGlusterVolumeProfileInfo("org.ovirt.engine.core.vdsbroker.gluster"),
+    StorageDeviceList("org.ovirt.engine.core.vdsbroker.irsbroker"),
     ;
 
     String packageName;
diff --git 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dal/dbbroker/DbFacade.java
 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dal/dbbroker/DbFacade.java
index 787b238..18922ad 100644
--- 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dal/dbbroker/DbFacade.java
+++ 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dal/dbbroker/DbFacade.java
@@ -74,6 +74,7 @@
 import org.ovirt.engine.core.dao.RoleGroupMapDAO;
 import org.ovirt.engine.core.dao.SnapshotDao;
 import org.ovirt.engine.core.dao.StepDao;
+import org.ovirt.engine.core.dao.StorageDeviceDao;
 import org.ovirt.engine.core.dao.StorageDomainDAO;
 import org.ovirt.engine.core.dao.StorageDomainDynamicDAO;
 import org.ovirt.engine.core.dao.StorageDomainStaticDAO;
@@ -858,6 +859,15 @@
         return getDao(GlusterOptionDao.class);
     }
 
+    /**
+     * Returns the singleton instance of {@link StorageDeviceDao}.
+     *
+     * @return the dao
+     */
+    public StorageDeviceDao getStorageDeviceDao() {
+        return getDao(StorageDeviceDao.class);
+    }
+
     public void setOnStartConnectionTimeout(int onStartConnectionTimeout) {
         this.onStartConnectionTimeout = onStartConnectionTimeout;
     }
diff --git 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/StorageDeviceDao.java
 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/StorageDeviceDao.java
new file mode 100644
index 0000000..ab8d2b0
--- /dev/null
+++ 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/StorageDeviceDao.java
@@ -0,0 +1,19 @@
+package org.ovirt.engine.core.dao;
+
+import java.util.List;
+
+import org.ovirt.engine.core.common.businessentities.StorageDeviceList;
+import org.ovirt.engine.core.compat.Guid;
+
+public interface StorageDeviceDao extends DAO, 
MassOperationsDao<StorageDeviceList, Guid> {
+
+    public StorageDeviceList getById(Guid deviceId);
+
+    public void save(StorageDeviceList device);
+
+    public void updateStorageDevice(StorageDeviceList device);
+
+    public List<StorageDeviceList> getStorageDevicesOfHost(Guid hostId);
+
+    public void remove(Guid id);
+}
diff --git 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/StorageDeviceDaoDbFacadeImpl.java
 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/StorageDeviceDaoDbFacadeImpl.java
new file mode 100644
index 0000000..b954811
--- /dev/null
+++ 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/StorageDeviceDaoDbFacadeImpl.java
@@ -0,0 +1,143 @@
+package org.ovirt.engine.core.dao;
+
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.Arrays;
+import java.util.List;
+
+import org.ovirt.engine.core.common.businessentities.ContentType;
+import org.ovirt.engine.core.common.businessentities.DeviceStatus;
+import org.ovirt.engine.core.common.businessentities.DeviceType;
+import org.ovirt.engine.core.common.businessentities.StorageDeviceList;
+import org.ovirt.engine.core.common.utils.EnumUtils;
+import org.ovirt.engine.core.compat.Guid;
+import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
+import org.springframework.jdbc.core.simple.ParameterizedRowMapper;
+
+
+
+public class StorageDeviceDaoDbFacadeImpl extends 
MassOperationsGenericDaoDbFacade<StorageDeviceList, Guid> implements 
StorageDeviceDao {
+
+    public StorageDeviceDaoDbFacadeImpl() {
+        super("StorageDevice");
+        setProcedureNameForGet("GetStorageDeviceById");
+        }
+
+    private static final ParameterizedRowMapper<StorageDeviceList> 
deviceRowMapper = new StorageDeviceRowMapper();
+
+
+    @Override
+    public List<StorageDeviceList> getStorageDevicesOfHost(Guid hostId) {
+        List<StorageDeviceList> devices =
+                getCallsHandler().executeReadList("GetStorageDevicesByHostId",
+                        deviceRowMapper,
+                        getCustomMapSqlParameterSource().addValue("vds_id", 
hostId));
+        return devices;
+    }
+
+    @Override
+    public void remove(Guid deviceId) {
+        getCallsHandler().executeModification("DeleteStorageDeviceByGuid",
+                createIdParameterMapper(deviceId));
+    }
+
+    public StorageDeviceList getById(Guid deviceId) {
+        StorageDeviceList device =
+                getCallsHandler().executeRead("GetStorageDeviceById",
+                        deviceRowMapper,
+                        createIdParameterMapper(deviceId));
+        return device;
+    }
+
+    @Override
+    public void save(StorageDeviceList device) {
+        getCallsHandler().executeModification("InsertStorageDevice", 
createFullParametersMapper(device));
+    }
+
+    @Override
+    public void updateStorageDevice(StorageDeviceList device) {
+        getCallsHandler().executeModification("UpdateStorageDevice", 
createFullParametersMapper(device));
+    }
+
+    protected MapSqlParameterSource 
createFullParametersMapper(StorageDeviceList device) {
+        return getCustomMapSqlParameterSource()
+                .addValue("id", device.getId())
+                .addValue("vds_id", device.getHostId())
+                .addValue("device_name", device.getName())
+                .addValue("container", device.getContainer())
+                .addValue("content_type", 
EnumUtils.nameOrNull(device.getContentType()))
+                .addValue("flag_list", device.getFlagList())
+                .addValue("fs_size", device.getFsSize())
+                .addValue("fs_size_free", device.getFsFreeSize())
+                .addValue("fs_type", device.getFsType())
+                .addValue("fs_uuid", device.getFsId())
+                .addValue("uuid", device.getDeviceUuid())
+                .addValue("members", device.getMembers())
+                .addValue("model", device.getModel())
+                .addValue("mount_point", device.getMountPoint())
+                .addValue("origin", device.getOrigin())
+                .addValue("parent", device.getParent())
+                .addValue("partitions", device.getPartitionNames())
+                .addValue("size", device.getSpace())
+                .addValue("free_size", device.getFreeSpace())
+                .addValue("start_size", device.getStartSize())
+                .addValue("end_size", device.getEndSize())
+                .addValue("status", EnumUtils.nameOrNull(device.getStatus()))
+                .addValue("table_type", device.getTableType())
+                .addValue("type", EnumUtils.nameOrNull(device.getType()))
+                .addValue("vendor", device.getVendor());
+    }
+
+    protected static class StorageDeviceRowMapper implements 
ParameterizedRowMapper<StorageDeviceList> {
+        @Override
+        public StorageDeviceList mapRow(ResultSet rs, int rowNum) throws 
SQLException {
+            StorageDeviceList deviceEntity = new StorageDeviceList();
+            
deviceEntity.setFsId(Guid.createGuidFromString(rs.getString("fs_id")));
+            
deviceEntity.setId(Guid.createGuidFromString(rs.getString("device_id")));
+            deviceEntity.setName(rs.getString("name"));
+            deviceEntity.setType(DeviceType.valueOf(rs.getString("type")));
+            
deviceEntity.setContentType(ContentType.valueOf(rs.getString("content_type")));
+            deviceEntity.setFsType(rs.getString("fs_type"));
+            deviceEntity.setModel(rs.getString("model"));
+            
deviceEntity.setHostId(Guid.createGuidFromString(rs.getString("host_id")));
+            deviceEntity.setMountPoint(rs.getString("mount_point"));
+            deviceEntity.setSpace(rs.getDouble("size"));
+            deviceEntity.setFreeSpace(rs.getDouble("free_size"));
+            deviceEntity.setFsSize(rs.getDouble("fs_size"));
+            deviceEntity.setFsFreeSize(rs.getDouble("fs_free_size"));
+            
deviceEntity.setStatus(DeviceStatus.valueOf(rs.getString("status")));
+            deviceEntity.setVendor(rs.getString("vendor"));
+            String partitions = rs.getString("partitions");
+            if (partitions != null) {
+                
deviceEntity.setPartitionNames(Arrays.asList(partitions.split("\\s*,\\s*")));
+            }
+            deviceEntity.setContainer(rs.getString("container"));
+            String members = rs.getString("members");
+            if (members != null) {
+                
deviceEntity.setMembers(Arrays.asList(members.split("\\s*,\\s*")));
+            }
+            String flagList = rs.getString("flag_list");
+            if (flagList != null) {
+                
deviceEntity.setFlagList(Arrays.asList(flagList.split("\\s*,\\s*")));
+            }
+            deviceEntity.setOrigin(rs.getString("origin"));
+            deviceEntity.setParent(rs.getString("parent"));
+            deviceEntity.setStartSize(rs.getDouble("start_size"));
+            deviceEntity.setEndSize(rs.getDouble("end_size"));
+            deviceEntity.setTableType(rs.getString("table_type"));
+            
deviceEntity.setDeviceUuid(Guid.createGuidFromString(rs.getString("uuid")));
+            return deviceEntity;
+        }
+    }
+
+    @Override
+    protected MapSqlParameterSource createIdParameterMapper(Guid id) {
+        return getCustomMapSqlParameterSource().addValue("id", id);
+    }
+
+    @Override
+    protected ParameterizedRowMapper<StorageDeviceList> 
createEntityRowMapper() {
+        return deviceRowMapper;
+    }
+}
+
diff --git 
a/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/StorageDeviceDaoTest.java
 
b/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/StorageDeviceDaoTest.java
new file mode 100644
index 0000000..c4ea864
--- /dev/null
+++ 
b/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/StorageDeviceDaoTest.java
@@ -0,0 +1,106 @@
+package org.ovirt.engine.core.dao;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.ovirt.engine.core.common.businessentities.ContentType;
+import org.ovirt.engine.core.common.businessentities.DeviceStatus;
+import org.ovirt.engine.core.common.businessentities.DeviceType;
+import org.ovirt.engine.core.common.businessentities.StorageDeviceList;
+import org.ovirt.engine.core.compat.Guid;
+
+/**
+ * Tests for Storage Device DAO
+ */
+public class StorageDeviceDaoTest extends BaseDAOTestCase {
+
+    private static final Guid HOST_ID = new 
Guid("afce7a39-8e8c-4819-ba9c-796d316592e6");
+    private static final Guid CLUSTER_ID = new 
Guid("ae956031-6be2-43d6-bb8f-5191c9253314");
+
+    private static final Guid EXISTING_DEVICE_ID = new 
Guid("b399944a-81ab-4ec5-8266-e19ba7c3c9d1");
+    private static final Guid DEVICE_ID = new 
Guid("b399944a-81ab-4ec5-8266-e19ba7c3c9d2");
+    private static final String DEVICE_NAME = "sda";
+    private StorageDeviceDao dao;
+    private StorageDeviceList newStorageDevice;
+    private StorageDeviceList existingStorageDevice;
+    private List<StorageDeviceList> existingStorageDevicesOfHost;
+
+    @Override
+    @Before
+    public void setUp() throws Exception {
+        super.setUp();
+        dao = dbFacade.getStorageDeviceDao();
+        existingStorageDevice = dao.getById(EXISTING_DEVICE_ID);
+        existingStorageDevicesOfHost = dao.getStorageDevicesOfHost(HOST_ID);
+    }
+
+    @Test
+    public void testSaveAndGetById() {
+        StorageDeviceList storageDevice = dao.getById(DEVICE_ID);
+        assertNull(storageDevice);
+        newStorageDevice = insertTestStorageDevice();
+        storageDevice = dao.getById(newStorageDevice.getId());
+        assertNotNull(storageDevice);
+        assertEquals(newStorageDevice, storageDevice);
+    }
+
+    private StorageDeviceList insertTestStorageDevice() {
+        StorageDeviceList storageDevice = new StorageDeviceList();
+        storageDevice.setId(Guid.NewGuid());
+        storageDevice.setName(DEVICE_NAME);
+        storageDevice.setHostId(HOST_ID);
+        storageDevice.setFsSize(1024.36);
+        storageDevice.setFsFreeSize(2048.25);
+        storageDevice.setFsType("ext4");
+        storageDevice.setMountPoint("/dev");
+        storageDevice.setPartitionNames(Arrays.asList("sda1", "sda2", "sda3"));
+        storageDevice.setSpace(25868987);
+        storageDevice.setStatus(DeviceStatus.MOUNTED);
+        storageDevice.setType(DeviceType.BLOCK);
+        storageDevice.setVendor("ATA");
+        dao.save(storageDevice);
+        return storageDevice;
+    }
+
+    @Test
+    public void testGetById() {
+        StorageDeviceList storageDevice = dao.getById(EXISTING_DEVICE_ID);
+        assertNotNull(storageDevice);
+        assertEquals(existingStorageDevice, storageDevice);
+    }
+
+    @Test
+    public void testUpdateStorageDevice() {
+        StorageDeviceList storageDeviceBefore = dao.getById(DEVICE_ID);
+        storageDeviceBefore.setContentType(ContentType.DATA);
+        dao.updateStorageDevice(storageDeviceBefore);
+
+        StorageDeviceList storageDeviceAfter = dao.getById(DEVICE_ID);
+        assertNotNull(storageDeviceAfter);
+        assertEquals(storageDeviceBefore, storageDeviceAfter);
+    }
+
+    @Test
+    public void testGetStorageDevicesOfHost() {
+        List<StorageDeviceList> storageDeviceList = 
dao.getStorageDevicesOfHost(HOST_ID);
+        assertNotNull(storageDeviceList);
+        assertEquals(existingStorageDevicesOfHost, storageDeviceList);
+    }
+
+    @Test
+    public void testRemove() {
+        dao.remove(EXISTING_DEVICE_ID);
+        List<StorageDeviceList> deviceList = 
dao.getStorageDevicesOfHost(HOST_ID);
+        assertTrue(deviceList.size() == 1);
+        assertFalse(deviceList.contains(EXISTING_DEVICE_ID));
+    }
+
+}
diff --git a/backend/manager/modules/dal/src/test/resources/fixtures.xml 
b/backend/manager/modules/dal/src/test/resources/fixtures.xml
index 78a9406..cb33137 100644
--- a/backend/manager/modules/dal/src/test/resources/fixtures.xml
+++ b/backend/manager/modules/dal/src/test/resources/fixtures.xml
@@ -3841,6 +3841,89 @@
             <value>RDMA</value>
         </row>
     </table>
+    <table name="storage_device_list">
+               <column>id</column>
+               <column>vds_id</column>
+               <column>device_name</column>
+               <column>container</column>
+               <column>content_type</column>
+               <column>flag_list</column>
+               <column>fs_size</column>
+               <column>fs_size_free</column>
+               <column>fs_type</column>
+               <column>fs_uuid</column>
+               <column>uuid</column>
+               <column>members</column>
+               <column>model</column>
+               <column>mount_point</column>
+               <column>origin</column>
+               <column>parent</column>
+               <column>partitions</column>
+               <column>size</column>
+               <column>free_size</column>
+               <column>start_size</column>
+               <column>end_size</column>
+               <column>status</column>
+               <column>table_type</column>
+               <column>type</column>
+               <column>vendor</column>
+
+        <!-- Storage Device for b399944a-81ab-4ec5-8266-e19ba7c3c9d1 -->
+        <row>
+            <value>b399944a-81ab-4ec5-8266-e19ba7c3c9d1</value>
+                       <value>afce7a39-8e8c-4819-ba9c-796d316592e6</value>
+                       <value>sda</value>
+                       <value></value>
+                       <value>DATA</value>
+                       <value></value>
+                       <value>1526.35</value>
+                       <value>30624</value>
+                       <value>ext4</value>
+                       <value></value>
+                       <value></value>
+                       <value></value>
+                       <value>ST320LT007-9ZV142</value>
+                       <value>/dev</value>
+                       <value></value>
+                       <value></value>
+                       <value>sda1,sda2</value>
+                       <value>568978</value>
+                       <value>65987</value>
+                       <value></value>
+                       <value></value>
+                       <value>MOUNTED</value>
+                       <value></value>
+                       <value>BLOCK</value>
+                       <value>ATA</value>
+        </row>
+        <row>
+            <value>b399944a-81ab-4ec5-8266-e19ba7c3c9d3</value>
+                       <value>afce7a39-8e8c-4819-ba9c-796d316592e6</value>
+                       <value>sda1</value>
+                       <value></value>
+                       <value>DATA</value>
+                       <value></value>
+                       <value>526.35</value>
+                       <value>1024</value>
+                       <value>ext4</value>
+                       <value></value>
+                       <value></value>
+                       <value></value>
+                       <value>ST320LT007-9ZV142</value>
+                       <value>/dev</value>
+                       <value></value>
+                       <value>sda</value>
+                       <value></value>
+                       <value>1024</value>
+                       <value>2048</value>
+                       <value></value>
+                       <value></value>
+                       <value>MOUNTED</value>
+                       <value></value>
+                       <value>BLOCK</value>
+                       <value>ATA</value>
+        </row>
+    </table>
     <table name="object_column_white_list">
         <column>object_name</column>
         <column>column_name</column>
diff --git 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/StorageDeviceListReturnForXmlRpc.java
 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/StorageDeviceListReturnForXmlRpc.java
new file mode 100644
index 0000000..b7d1695
--- /dev/null
+++ 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/StorageDeviceListReturnForXmlRpc.java
@@ -0,0 +1,192 @@
+package org.ovirt.engine.core.vdsbroker.irsbroker;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.ovirt.engine.core.common.businessentities.ContentType;
+import org.ovirt.engine.core.common.businessentities.DeviceStatus;
+import org.ovirt.engine.core.common.businessentities.DeviceType;
+import org.ovirt.engine.core.common.businessentities.StorageDeviceList;
+import org.ovirt.engine.core.compat.Guid;
+
+@SuppressWarnings("unchecked")
+public class StorageDeviceListReturnForXmlRpc extends StatusReturnForXmlRpc {
+    private static final String DEVICES = "devices";
+    private static final String STORAGE_DEVICE_LIST = "storage-device-list";
+    private static final String CONTAINER = "container";
+    private static final String CONTENT_TYPE ="contentType";
+    private static final String FLAG_LIST = "flagList";
+    private static final String FS_SIZE = "fsSize";
+    private static final String FS_FREE_SIZE = "fsSizeFree";
+    private static final String FS_TYPE = "fsType";
+    private static final String FS_UUID ="fsUuid";
+    private static final String MEMBERS = "members";
+    private static final String MODEL = "model";
+    private static final String MOUNT_POINT = "mountPoint";
+    private static final String DEVICE_NAME = "name";
+    private static final String ORIGIN = "origin";
+    private static final String PARENT = "parent";
+    private static final String PARTITIONS = "partitions";
+    private static final String SIZE = "size";
+    private static final String SIZE_FREE = "sizeFree";
+    private static final String START_SIZE = "startSize";
+    private static final String END_SIZE = "endSize";
+    private static final String STATUS = "status";
+    private static final String TABLE_TYPE = "tableType";
+    private static final String TYPE ="type";
+    private static final String UUID = "uuid";
+    private static final String VENDOR = "vendor";
+
+    private Map<String, StorageDeviceList> devices = new HashMap<String, 
StorageDeviceList>();
+
+    public StorageDeviceListReturnForXmlRpc(Map<String, Object> innerMap) {
+        super(innerMap);
+
+        if(mStatus.mCode != 0) {
+            return;
+        }
+
+        Map<String, Object> deviceListMap = (Map<String, Object>) 
innerMap.get(STORAGE_DEVICE_LIST);
+
+        for (Entry<String, Object> entry : deviceListMap.entrySet()) {
+            devices.put(entry.getKey(), populateDevice((Map<String, 
Object>)entry.getValue()));
+        }
+    }
+
+    private StorageDeviceList populateDevice(Map<String, Object> deviceMap) {
+        StorageDeviceList device = new StorageDeviceList();
+        if (deviceMap.containsKey(CONTAINER)) {
+            device.setContainer((String) deviceMap.get(CONTAINER));
+        }
+
+        if (deviceMap.containsKey(CONTENT_TYPE)) {
+            String contentType = (String) deviceMap.get(CONTENT_TYPE);
+            if (contentType.equals(ContentType.DATA)) {
+                device.setContentType(ContentType.DATA);
+            } else if (contentType.equals(ContentType.BOOT)) {
+                device.setContentType(ContentType.BOOT);
+            } else if (contentType.equals(ContentType.SWAP)) {
+                device.setContentType(ContentType.SWAP);
+            } else if (contentType.equals(ContentType.UNKNOWN)) {
+                device.setContentType(ContentType.UNKNOWN);
+            }
+        }
+
+        if (deviceMap.containsKey(FLAG_LIST)) {
+            device.setFlagList(Arrays.asList((String) 
deviceMap.get(FLAG_LIST)));
+        }
+
+        if (deviceMap.containsKey(FS_SIZE)) {
+            device.setFsSize(Double.parseDouble((String) 
deviceMap.get(FS_SIZE)));
+        }
+        if (deviceMap.containsKey(FS_FREE_SIZE)) {
+            device.setFsFreeSize(Double.parseDouble((String) 
deviceMap.get(FS_FREE_SIZE)));
+        }
+        if (deviceMap.containsKey(FS_TYPE)) {
+            device.setFsType((String) deviceMap.get(FS_TYPE));
+        }
+        if (deviceMap.containsKey(FS_UUID)) {
+            device.setFsId(new Guid((String) deviceMap.get(FS_UUID)));
+        }
+
+        if (deviceMap.containsKey(MEMBERS)) {
+            device.setMembers(new ArrayList<String>(Arrays.asList(((String) 
deviceMap.get(MEMBERS)).split(","))));
+        }
+
+        if (deviceMap.containsKey(MODEL)) {
+            device.setModel((String) deviceMap.get(MODEL));
+        }
+
+        if (deviceMap.containsKey(MOUNT_POINT)) {
+            device.setMountPoint((String) deviceMap.get(MOUNT_POINT));
+        }
+
+        if (deviceMap.containsKey(DEVICE_NAME)) {
+            device.setName((String) deviceMap.get(DEVICE_NAME));
+        }
+
+        if (deviceMap.containsKey(ORIGIN)) {
+            device.setOrigin((String) deviceMap.get(ORIGIN));
+        }
+
+        if (deviceMap.containsKey(PARENT)) {
+            device.setParent((String) deviceMap.get(PARENT));
+        }
+
+        if (deviceMap.containsKey(PARTITIONS)) {
+            device.setPartitionNames(new 
ArrayList<String>(Arrays.asList(((String) 
deviceMap.get(PARTITIONS)).split(","))));
+        }
+
+        if (deviceMap.containsKey(SIZE)) {
+            device.setSpace(Double.parseDouble((String) 
deviceMap.get(PARENT)));
+        }
+
+        if (deviceMap.containsKey(SIZE_FREE)) {
+            device.setFreeSpace(Double.parseDouble((String) 
deviceMap.get(SIZE_FREE)));
+        }
+
+        if (deviceMap.containsKey(START_SIZE)) {
+            device.setStartSize(Double.parseDouble((String) 
deviceMap.get(START_SIZE)));
+        }
+
+        if (deviceMap.containsKey(END_SIZE)) {
+            device.setEndSize(Double.parseDouble((String) 
deviceMap.get(END_SIZE)));
+        }
+
+        if (deviceMap.containsKey(STATUS)) {
+            String status = (String) deviceMap.get(STATUS);
+            if (status.equals(DeviceStatus.UNINITIALIZED)) {
+                device.setStatus(DeviceStatus.UNINITIALIZED);
+            } else if (status.equals(DeviceStatus.NA)) {
+                device.setStatus(DeviceStatus.NA);
+            } else if (status.equals(DeviceStatus.UNUSABLE)) {
+                device.setStatus(DeviceStatus.UNUSABLE);
+            } else if (status.equals(DeviceStatus.FORMAT_UNSUPPORTED)) {
+                device.setStatus(DeviceStatus.FORMAT_UNSUPPORTED);
+            } else if (status.equals(DeviceStatus.MOUNTED)) {
+                device.setStatus(DeviceStatus.MOUNTED);
+            } else if (status.equals(DeviceStatus.FORMATTED)) {
+                device.setStatus(DeviceStatus.FORMATTED);
+            } else if (status.equals(DeviceStatus.PARTED)) {
+                device.setStatus(DeviceStatus.PARTED);
+            } else if (status.equals(DeviceStatus.PARTED)) {
+                device.setStatus(DeviceStatus.PARTED);
+            }
+        }
+
+        if (deviceMap.containsKey(TABLE_TYPE)) {
+            device.setTableType((String) deviceMap.get(TABLE_TYPE));
+        }
+
+        if (deviceMap.containsKey(TYPE)) {
+            String deviceType = (String) deviceMap.get(TYPE);
+            if (deviceType.equals(DeviceType.MD)) {
+                device.setType(DeviceType.MD);
+            } else if (deviceType.equals(DeviceType.LVM_VG)) {
+                device.setType(DeviceType.LVM_VG);
+            } else if (deviceType.equals(DeviceType.LVM_LV)) {
+                device.setType(DeviceType.LVM_LV);
+            } else if (deviceType.equals(DeviceType.BLOCK)) {
+                device.setType(DeviceType.BLOCK);
+            } else if (deviceType.equals(DeviceType.LVM_LV_SNAPSHOT)) {
+                device.setType(DeviceType.LVM_LV_SNAPSHOT);
+            }
+        }
+
+        if (deviceMap.containsKey(UUID)) {
+            device.setDeviceUuid(new Guid((String) deviceMap.get(UUID)));
+        }
+
+        if (deviceMap.containsKey(VENDOR)) {
+            device.setVendor((String) deviceMap.get(VENDOR));
+        }
+        return device;
+    }
+
+    public Map<String, StorageDeviceList> getStorageDeviceList() {
+        return devices;
+    }
+}
diff --git 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/StorageDeviceListVDSCommand.java
 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/StorageDeviceListVDSCommand.java
new file mode 100644
index 0000000..99bc1ac
--- /dev/null
+++ 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/StorageDeviceListVDSCommand.java
@@ -0,0 +1,25 @@
+package org.ovirt.engine.core.vdsbroker.irsbroker;
+
+import org.ovirt.engine.core.common.vdscommands.VdsIdVDSCommandParametersBase;
+import org.ovirt.engine.core.vdsbroker.vdsbroker.StatusForXmlRpc;
+import org.ovirt.engine.core.vdsbroker.vdsbroker.VdsBrokerCommand;
+
+public class StorageDeviceListVDSCommand<P extends 
VdsIdVDSCommandParametersBase> extends VdsBrokerCommand<P> {
+    private StorageDeviceListReturnForXmlRpc result;
+
+    public StorageDeviceListVDSCommand(P parameters) {
+        super(parameters);
+    }
+
+    @Override
+    protected StatusForXmlRpc getReturnStatus() {
+        return result.mStatus;
+    }
+
+    @Override
+    protected void ExecuteVdsBrokerCommand() {
+        result = getBroker().storageDeviceList();
+        ProceedProxyReturnValue();
+        setReturnValue(result.getStorageDeviceList());
+    }
+}
diff --git 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/IVdsServer.java
 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/IVdsServer.java
index 6eab845..e701349 100644
--- 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/IVdsServer.java
+++ 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/IVdsServer.java
@@ -12,6 +12,7 @@
 import 
org.ovirt.engine.core.vdsbroker.irsbroker.GlusterVolumeStatusReturnForXmlRpc;
 import org.ovirt.engine.core.vdsbroker.irsbroker.IsoListReturnForXmlRpc;
 import org.ovirt.engine.core.vdsbroker.irsbroker.OneUuidReturnForXmlRpc;
+import 
org.ovirt.engine.core.vdsbroker.irsbroker.StorageDeviceListReturnForXmlRpc;
 import org.ovirt.engine.core.vdsbroker.xmlrpc.XmlRpcStruct;
 
 
@@ -243,4 +244,6 @@
     GlusterVolumesListReturnForXmlRpc glusterVolumesList(Guid clusterId);
 
     GlusterVolumeProfileInfoReturnForXmlRpc glusterVolumeProfileInfo(Guid 
clusterId, String volumeName);
+
+    StorageDeviceListReturnForXmlRpc storageDeviceList();
 }
diff --git 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerConnector.java
 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerConnector.java
index e42f931..f1fbaf8 100644
--- 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerConnector.java
+++ 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerConnector.java
@@ -232,4 +232,6 @@
     public Map<String, Object> glusterVolumeStatus(String volumeName, String 
brickName, String volumeStatusOption);
 
     public Map<String, Object> glusterVolumeProfileInfo(String volumeName);
+
+    public Map<String, Object> storageDeviceList();
 }
diff --git 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerWrapper.java
 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerWrapper.java
index e4e2360..595f46b 100644
--- 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerWrapper.java
+++ 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerWrapper.java
@@ -14,6 +14,7 @@
 import 
org.ovirt.engine.core.vdsbroker.irsbroker.GlusterVolumeStatusReturnForXmlRpc;
 import org.ovirt.engine.core.vdsbroker.irsbroker.IsoListReturnForXmlRpc;
 import org.ovirt.engine.core.vdsbroker.irsbroker.OneUuidReturnForXmlRpc;
+import 
org.ovirt.engine.core.vdsbroker.irsbroker.StorageDeviceListReturnForXmlRpc;
 import org.ovirt.engine.core.vdsbroker.xmlrpc.XmlRpcRunTimeException;
 import org.ovirt.engine.core.vdsbroker.xmlrpc.XmlRpcStruct;
 
@@ -1192,4 +1193,15 @@
             throw new XmlRpcRunTimeException(ute);
         }
     }
+
+    @Override
+    public StorageDeviceListReturnForXmlRpc storageDeviceList() {
+        try {
+            Map<String, Object> xmlRpcReturnValue = 
vdsServer.storageDeviceList();
+            StorageDeviceListReturnForXmlRpc wrapper = new 
StorageDeviceListReturnForXmlRpc(xmlRpcReturnValue);
+            return wrapper;
+        } catch (UndeclaredThrowableException ute) {
+            throw new XmlRpcRunTimeException(ute);
+        }
+    }
 }


--
To view, visit http://gerrit.ovirt.org/10058
To unsubscribe, visit http://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I98f632a7aadfc57964d42e90b6a25c604330ab41
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Dhandapani Gopal <[email protected]>
_______________________________________________
Engine-patches mailing list
[email protected]
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to