From 14bf4af313881052c6c786161c15e13c2ff86f24 Mon Sep 17 00:00:00 2001 From: Nathan Johnson Date: Sat, 11 Mar 2017 22:10:12 -0600 Subject: [PATCH] adding trim options --- .../quota/QuotaAlertManagerImplTest.java | 9 ++++-- .../resource/LibvirtComputingResource.java | 10 ++++++ .../hypervisor/kvm/resource/LibvirtVMDef.java | 32 ++++++++++++++++++- .../kvm/storage/KVMStorageProcessor.java | 6 ++++ 4 files changed, 54 insertions(+), 3 deletions(-) diff --git a/framework/quota/test/org/apache/cloudstack/quota/QuotaAlertManagerImplTest.java b/framework/quota/test/org/apache/cloudstack/quota/QuotaAlertManagerImplTest.java index 14244fc204d9..d898ef2be372 100644 --- a/framework/quota/test/org/apache/cloudstack/quota/QuotaAlertManagerImplTest.java +++ b/framework/quota/test/org/apache/cloudstack/quota/QuotaAlertManagerImplTest.java @@ -32,7 +32,6 @@ import org.apache.cloudstack.quota.dao.QuotaUsageDao; import org.apache.cloudstack.quota.vo.QuotaAccountVO; import org.apache.cloudstack.quota.vo.QuotaEmailTemplatesVO; -import org.joda.time.DateTime; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -47,8 +46,10 @@ import java.lang.reflect.Field; import java.math.BigDecimal; import java.util.ArrayList; +import java.util.Calendar; import java.util.Date; import java.util.List; +import java.util.TimeZone; @RunWith(MockitoJUnitRunner.class) public class QuotaAlertManagerImplTest extends TestCase { @@ -179,7 +180,11 @@ public void testSendQuotaAlert() throws UnsupportedEncodingException, MessagingE public void testGetDifferenceDays() { Date now = new Date(); assertTrue(QuotaAlertManagerImpl.getDifferenceDays(now, now) == 0L); - assertTrue(QuotaAlertManagerImpl.getDifferenceDays(now, new DateTime(now).plusDays(1).toDate()) == 1L); + Calendar c = Calendar.getInstance(); + c.setTimeZone(TimeZone.getTimeZone("UTC")); + Calendar c2 = (Calendar) c.clone(); + c2.add(Calendar.DATE, 1); + assertEquals(1L, QuotaAlertManagerImpl.getDifferenceDays(c.getTime(), c2.getTime())); } @Test 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 978500c9eab8..9491279b1bfb 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 @@ -100,6 +100,7 @@ import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.DevicesDef; import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.DiskDef; import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.DiskDef.DeviceType; +import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.DiskDef.DiscardType; import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.DiskDef.DiskProtocol; import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.FeaturesDef; import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.FilesystemDef; @@ -2124,6 +2125,11 @@ public int compare(final DiskTO arg0, final DiskTO arg1) { } else { final int devId = volume.getDiskSeq().intValue(); + if (diskBusType == DiskDef.DiskBus.SCSI ) { + disk.setQemuDriver(true); + disk.setDiscard(DiscardType.UNMAP); + } + if (pool.getType() == StoragePoolType.RBD) { /* For RBD pools we use the secret mechanism in libvirt. @@ -2322,6 +2328,10 @@ public synchronized String attachOrDetachDisk(final Connect conn, } diskdef = new DiskDef(); + if (busT == DiskDef.DiskBus.SCSI) { + diskdef.setQemuDriver(true); + diskdef.setDiscard(DiscardType.UNMAP); + } if (attachingPool.getType() == StoragePoolType.RBD) { diskdef.defNetworkBasedDisk(attachingDisk.getPath(), attachingPool.getSourceHost(), attachingPool.getSourcePort(), attachingPool.getAuthUserName(), attachingPool.getUuid(), devId, busT, DiskProtocol.RBD, DiskDef.DiskFmtType.RAW); 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 111d06c0c216..c9229649b44a 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 @@ -544,6 +544,23 @@ public String toString() { } } + public enum DiscardType { + IGNORE("ignore"), UNMAP("unmap"); + String _discardType; + DiscardType(String discardType) { + _discardType = discardType; + } + + @Override + public String toString() { + if (_discardType == null) { + return "ignore"; + } + return _discardType; + } + + } + private DeviceType _deviceType; /* floppy, disk, cdrom */ private DiskType _diskType; private DiskProtocol _diskProtocol; @@ -565,6 +582,15 @@ public String toString() { private DiskCacheMode _diskCacheMode; private String _serial; private boolean qemuDriver = true; + private DiscardType _discard = DiscardType.IGNORE; + + public DiscardType getDiscard() { + return _discard; + } + + public void setDiscard(DiscardType discard) { + this._discard = discard; + } public void setDeviceType(DeviceType deviceType) { _deviceType = deviceType; @@ -763,7 +789,11 @@ public String toString() { diskBuilder.append(">\n"); if(qemuDriver) { diskBuilder.append("\n"); + + "' cache='" + _diskCacheMode + "' "); + if(_discard != null && _discard != DiscardType.IGNORE) { + diskBuilder.append("discard='" + _discard.toString() + "' "); + } + diskBuilder.append("/>\n"); } if (_diskType == DiskType.FILE) { 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 2160a9772aea..71dbd987bbb3 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 @@ -87,6 +87,7 @@ import com.cloud.hypervisor.kvm.resource.LibvirtDomainXMLParser; import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.DiskDef; import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.DiskDef.DeviceType; +import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.DiskDef.DiscardType; import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.DiskDef.DiskProtocol; import com.cloud.storage.JavaStorageLayer; import com.cloud.storage.Storage.ImageFormat; @@ -995,6 +996,11 @@ protected synchronized String attachOrDetachDisk(final Connect conn, final boole } } diskdef = new DiskDef(); + if (busT == DiskDef.DiskBus.SCSI) { + diskdef.setQemuDriver(true); + diskdef.setDiscard(DiscardType.UNMAP); + } + diskdef.setSerial(serial); if (attachingPool.getType() == StoragePoolType.RBD) { if(resource.getHypervisorType() == Hypervisor.HypervisorType.LXC){