diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java
index 11317afe5e2..a7777cc3140 100755
--- a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java
+++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java
@@ -2140,6 +2140,7 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv
if (data instanceof VolumeObjectTO) {
final VolumeObjectTO volumeObjectTO = (VolumeObjectTO)data;
+ disk.setSerial(diskUuidToSerial(volumeObjectTO.getUuid()));
if (volumeObjectTO.getBytesReadRate() != null && volumeObjectTO.getBytesReadRate() > 0) {
disk.setBytesReadRate(volumeObjectTO.getBytesReadRate());
}
@@ -2419,6 +2420,11 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv
}
}
+ public String diskUuidToSerial(String uuid) {
+ String uuidWithoutHyphen = uuid.replace("-","");
+ return uuidWithoutHyphen.substring(0, Math.min(uuidWithoutHyphen.length(), 20));
+ }
+
private String getIqn() {
try {
final String textToFind = "InitiatorName=";
diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtVMDef.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtVMDef.java
index 5ab842948df..fb1b1340115 100644
--- a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtVMDef.java
+++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtVMDef.java
@@ -419,7 +419,7 @@ public class LibvirtVMDef {
public static class DiskDef {
public enum DeviceType {
- FLOPPY("floppy"), DISK("disk"), CDROM("cdrom");
+ FLOPPY("floppy"), DISK("disk"), CDROM("cdrom"), LUN("lun");
String _type;
DeviceType(String type) {
@@ -524,6 +524,7 @@ public class LibvirtVMDef {
private Long _iopsReadRate;
private Long _iopsWriteRate;
private DiskCacheMode _diskCacheMode;
+ private String _serial;
private boolean qemuDriver = true;
public void setDeviceType(DeviceType deviceType) {
@@ -708,6 +709,10 @@ public class LibvirtVMDef {
this.qemuDriver = qemuDriver;
}
+ public void setSerial(String serial) {
+ this._serial = serial;
+ }
+
@Override
public String toString() {
StringBuilder diskBuilder = new StringBuilder();
@@ -761,6 +766,10 @@ public class LibvirtVMDef {
}
diskBuilder.append("/>\n");
+ if (_serial != null && !_serial.isEmpty() && _deviceType != DeviceType.LUN) {
+ diskBuilder.append("" + _serial + "");
+ }
+
if ((_deviceType != DeviceType.CDROM) &&
(s_libvirtVersion >= 9008) &&
(s_qemuVersion >= 1001000) &&
diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/KVMStorageProcessor.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/KVMStorageProcessor.java
index 08ce05ad3ea..995941346c6 100644
--- a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/KVMStorageProcessor.java
+++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/KVMStorageProcessor.java
@@ -950,7 +950,7 @@ public class KVMStorageProcessor implements StorageProcessor {
return null;
}
- protected synchronized String attachOrDetachDisk(final Connect conn, final boolean attach, final String vmName, final KVMPhysicalDisk attachingDisk, final int devId) throws LibvirtException,
+ protected synchronized String attachOrDetachDisk(final Connect conn, final boolean attach, final String vmName, final KVMPhysicalDisk attachingDisk, final int devId, final String serial) throws LibvirtException,
InternalErrorException {
List disks = null;
Domain dm = null;
@@ -986,6 +986,7 @@ public class KVMStorageProcessor implements StorageProcessor {
}
} else {
diskdef = new DiskDef();
+ diskdef.setSerial(serial);
if (attachingPool.getType() == StoragePoolType.RBD) {
if(resource.getHypervisorType() == Hypervisor.HypervisorType.LXC){
// For LXC, map image to host and then attach to Vm
@@ -1028,6 +1029,7 @@ public class KVMStorageProcessor implements StorageProcessor {
final VolumeObjectTO vol = (VolumeObjectTO)disk.getData();
final PrimaryDataStoreTO primaryStore = (PrimaryDataStoreTO)vol.getDataStore();
final String vmName = cmd.getVmName();
+ final String serial = resource.diskUuidToSerial(vol.getUuid());
try {
final Connect conn = LibvirtConnection.getConnectionByVmName(vmName);
@@ -1035,7 +1037,7 @@ public class KVMStorageProcessor implements StorageProcessor {
final KVMPhysicalDisk phyDisk = storagePoolMgr.getPhysicalDisk(primaryStore.getPoolType(), primaryStore.getUuid(), vol.getPath());
- attachOrDetachDisk(conn, true, vmName, phyDisk, disk.getDiskSeq().intValue());
+ attachOrDetachDisk(conn, true, vmName, phyDisk, disk.getDiskSeq().intValue(), serial);
return new AttachAnswer(disk);
} catch (final LibvirtException e) {
@@ -1054,12 +1056,13 @@ public class KVMStorageProcessor implements StorageProcessor {
final VolumeObjectTO vol = (VolumeObjectTO)disk.getData();
final PrimaryDataStoreTO primaryStore = (PrimaryDataStoreTO)vol.getDataStore();
final String vmName = cmd.getVmName();
+ final String serial = resource.diskUuidToSerial(vol.getUuid());
try {
final Connect conn = LibvirtConnection.getConnectionByVmName(vmName);
final KVMPhysicalDisk phyDisk = storagePoolMgr.getPhysicalDisk(primaryStore.getPoolType(), primaryStore.getUuid(), vol.getPath());
- attachOrDetachDisk(conn, false, vmName, phyDisk, disk.getDiskSeq().intValue());
+ attachOrDetachDisk(conn, false, vmName, phyDisk, disk.getDiskSeq().intValue(), serial);
storagePoolMgr.disconnectPhysicalDisk(primaryStore.getPoolType(), primaryStore.getUuid(), vol.getPath());
diff --git a/plugins/hypervisors/kvm/test/com/cloud/hypervisor/kvm/resource/LibvirtComputingResourceTest.java b/plugins/hypervisors/kvm/test/com/cloud/hypervisor/kvm/resource/LibvirtComputingResourceTest.java
index b15e1488b8c..e0d99525f83 100644
--- a/plugins/hypervisors/kvm/test/com/cloud/hypervisor/kvm/resource/LibvirtComputingResourceTest.java
+++ b/plugins/hypervisors/kvm/test/com/cloud/hypervisor/kvm/resource/LibvirtComputingResourceTest.java
@@ -389,6 +389,14 @@ public class LibvirtComputingResourceTest {
assertNotNull(stats);
}
+ @Test
+ public void diskUuidToSerialTest() {
+ String uuid = "38400000-8cf0-11bd-b24e-10b96e4ef00d";
+ String expected = "384000008cf011bdb24e";
+ LibvirtComputingResource lcr = new LibvirtComputingResource();
+ Assert.assertEquals(expected, lcr.diskUuidToSerial(uuid));
+ }
+
@Test
public void testUUID() {
String uuid = "1";