Updated Branches: refs/heads/master ded8d6592 -> b33a8371b
fix long cast to double - the result of dividing long with long resulted in loss of precision both for network and IO - unit tests included Signed-off-by: Laszlo Hornyak <[email protected]> Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/b2f06aae Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/b2f06aae Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/b2f06aae Branch: refs/heads/master Commit: b2f06aae68b0da523fe274c78222abe809af92a7 Parents: ded8d65 Author: Laszlo Hornyak <[email protected]> Authored: Fri Nov 8 23:15:19 2013 +0100 Committer: Laszlo Hornyak <[email protected]> Committed: Sat Nov 9 09:04:05 2013 +0100 ---------------------------------------------------------------------- .../kvm/resource/LibvirtComputingResource.java | 10 +- .../resource/LibvirtComputingResourceTest.java | 109 +++++++++++++++++-- 2 files changed, 105 insertions(+), 14 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b2f06aae/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java ---------------------------------------------------------------------- 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 63bd5dc..eda311f 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 @@ -4776,7 +4776,7 @@ ServerResource { Calendar _timestamp; } - private VmStatsEntry getVmStat(Connect conn, String vmName) + VmStatsEntry getVmStat(Connect conn, String vmName) throws LibvirtException { Domain dm = null; try { @@ -4821,10 +4821,10 @@ ServerResource { } if (oldStats != null) { - long deltarx = rx - oldStats._rx; + double deltarx = rx - oldStats._rx; if (deltarx > 0) stats.setNetworkReadKBs(deltarx / 1024); - long deltatx = tx - oldStats._tx; + double deltatx = tx - oldStats._tx; if (deltatx > 0) stats.setNetworkWriteKBs(deltatx / 1024); } @@ -4850,10 +4850,10 @@ ServerResource { long deltaiowr = io_wr - oldStats._io_wr; if (deltaiowr > 0) stats.setDiskWriteIOs(deltaiowr); - long deltabytesrd = bytes_rd - oldStats._bytes_rd; + double deltabytesrd = bytes_rd - oldStats._bytes_rd; if (deltabytesrd > 0) stats.setDiskReadKBs(deltabytesrd / 1024); - long deltabyteswr = bytes_wr - oldStats._bytes_wr; + double deltabyteswr = bytes_wr - oldStats._bytes_wr; if (deltabyteswr > 0) stats.setDiskWriteKBs(deltabyteswr / 1024); } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b2f06aae/plugins/hypervisors/kvm/test/com/cloud/hypervisor/kvm/resource/LibvirtComputingResourceTest.java ---------------------------------------------------------------------- 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 d6e8dc2..803ac32 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 @@ -19,21 +19,37 @@ package com.cloud.hypervisor.kvm.resource; -import com.cloud.agent.api.to.VirtualMachineTO; -import com.cloud.template.VirtualMachineTemplate.BootloaderType; -import com.cloud.utils.Pair; -import com.cloud.vm.VirtualMachine; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +import java.util.Arrays; +import java.util.List; +import java.util.Random; +import java.util.UUID; import junit.framework.Assert; + import org.apache.commons.lang.SystemUtils; import org.junit.Assume; import org.junit.Test; +import org.libvirt.Connect; +import org.libvirt.Domain; +import org.libvirt.DomainBlockStats; +import org.libvirt.DomainInfo; +import org.libvirt.DomainInterfaceStats; +import org.libvirt.LibvirtException; +import org.libvirt.NodeInfo; +import org.mockito.Mockito; +import org.mockito.invocation.InvocationOnMock; +import org.mockito.stubbing.Answer; -import java.util.Random; -import java.util.UUID; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; +import com.cloud.agent.api.VmStatsEntry; +import com.cloud.agent.api.to.VirtualMachineTO; +import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.DiskDef; +import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.InterfaceDef; +import com.cloud.template.VirtualMachineTemplate.BootloaderType; +import com.cloud.utils.Pair; +import com.cloud.vm.VirtualMachine; public class LibvirtComputingResourceTest { @@ -210,4 +226,79 @@ public class LibvirtComputingResourceTest { uuid = lcr.getUuid(uuid); Assert.assertTrue(uuid.equals(oldUuid)); } + + private static final String VMNAME = "test"; + + @Test + public void testGetVmStat() throws LibvirtException { + Connect connect = Mockito.mock(Connect.class); + Domain domain = Mockito.mock(Domain.class); + DomainInfo domainInfo = new DomainInfo(); + Mockito.when(domain.getInfo()).thenReturn(domainInfo); + Mockito.when(connect.domainLookupByName(VMNAME)).thenReturn(domain); + NodeInfo nodeInfo = new NodeInfo(); + nodeInfo.cpus = 8; + nodeInfo.memory = 8 * 1024 * 1024; + nodeInfo.sockets = 2; + nodeInfo.threads = 2; + nodeInfo.model = "Foo processor"; + Mockito.when(connect.nodeInfo()).thenReturn(nodeInfo); + // this is testing the interface stats, returns an increasing number of sent and received bytes + Mockito.when(domain.interfaceStats(Mockito.anyString())).thenAnswer(new Answer<DomainInterfaceStats>() { + // increment with less than a KB, so this should be less than 1 KB + final static int increment = 1000; + int rx_bytes = 1000; + int tx_bytes = 1000; + + @Override + public DomainInterfaceStats answer(InvocationOnMock invocation) throws Throwable { + DomainInterfaceStats domainInterfaceStats = new DomainInterfaceStats(); + domainInterfaceStats.rx_bytes = (this.rx_bytes += increment); + domainInterfaceStats.tx_bytes = (this.tx_bytes += increment); + return domainInterfaceStats; + + } + + }); + + Mockito.when(domain.blockStats(Mockito.anyString())).thenAnswer(new Answer<DomainBlockStats>() { + // a little less than a KB + final static int increment = 1000; + + int rd_bytes = 0; + int wr_bytes = 1024; + @Override + public DomainBlockStats answer(InvocationOnMock invocation) throws Throwable { + DomainBlockStats domainBlockStats = new DomainBlockStats(); + + domainBlockStats.rd_bytes = (rd_bytes += increment); + domainBlockStats.wr_bytes = (wr_bytes += increment); + return domainBlockStats; + } + + }); + + LibvirtComputingResource libvirtComputingResource = new LibvirtComputingResource() { + @Override + protected List<InterfaceDef> getInterfaces(Connect conn, String vmName) { + InterfaceDef interfaceDef = new InterfaceDef(); + return Arrays.asList(interfaceDef); + } + + @Override + public List<DiskDef> getDisks(Connect conn, String vmName) { + DiskDef diskDef = new DiskDef(); + return Arrays.asList(diskDef); + } + + }; + libvirtComputingResource.getVmStat(connect, VMNAME); + VmStatsEntry vmStat = libvirtComputingResource.getVmStat(connect, VMNAME); + // network traffic as generated by the logic above, must be greater than zero + Assert.assertTrue(vmStat.getNetworkReadKBs() > 0); + Assert.assertTrue(vmStat.getNetworkWriteKBs() > 0); + // IO traffic as generated by the logic above, must be greater than zero + Assert.assertTrue(vmStat.getDiskReadKBs() > 0); + Assert.assertTrue(vmStat.getDiskWriteKBs() > 0); + } }
