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";