diff --git a/plugins/hypervisors/kvm/src/main/java/org/apache/cloudstack/utils/linux/KVMHostInfo.java b/plugins/hypervisors/kvm/src/main/java/org/apache/cloudstack/utils/linux/KVMHostInfo.java index e34f39fde34..807b2541fd3 100644 --- a/plugins/hypervisors/kvm/src/main/java/org/apache/cloudstack/utils/linux/KVMHostInfo.java +++ b/plugins/hypervisors/kvm/src/main/java/org/apache/cloudstack/utils/linux/KVMHostInfo.java @@ -16,21 +16,33 @@ // under the License. package org.apache.cloudstack.utils.linux; -import com.cloud.hypervisor.kvm.resource.LibvirtCapXMLParser; -import com.cloud.hypervisor.kvm.resource.LibvirtConnection; -import com.cloud.utils.script.Script; +import java.io.FileReader; +import java.io.IOException; +import java.io.Reader; +import java.io.StringReader; +import java.util.ArrayList; +import java.util.List; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; + +import org.apache.cloudstack.utils.security.ParserUtils; import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; import org.libvirt.Connect; import org.libvirt.LibvirtException; import org.libvirt.NodeInfo; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.NamedNodeMap; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.InputSource; -import java.io.FileReader; -import java.io.IOException; -import java.io.Reader; -import java.util.ArrayList; -import java.util.List; +import com.cloud.hypervisor.kvm.resource.LibvirtCapXMLParser; +import com.cloud.hypervisor.kvm.resource.LibvirtConnection; +import com.cloud.utils.script.Script; public class KVMHostInfo { @@ -82,7 +94,7 @@ public class KVMHostInfo { return this.capabilities; } - protected static long getCpuSpeed(final NodeInfo nodeInfo) { + protected static long getCpuSpeed(final String cpabilities, final NodeInfo nodeInfo) { long speed = 0L; speed = getCpuSpeedFromCommandLscpu(); if(speed > 0L) { @@ -94,6 +106,11 @@ public class KVMHostInfo { return speed; } + speed = getCpuSpeedFromHostCapabilities(cpabilities); + if(speed > 0L) { + return speed; + } + LOGGER.info(String.format("Using the value [%s] provided by Libvirt.", nodeInfo.mhz)); speed = nodeInfo.mhz; return speed; @@ -125,12 +142,41 @@ public class KVMHostInfo { } } + protected static long getCpuSpeedFromHostCapabilities(final String capabilities) { + LOGGER.info("Fetching CPU speed from \"host capabilities\""); + long speed = 0L; + try { + DocumentBuilderFactory docFactory = ParserUtils.getSaferDocumentBuilderFactory(); + DocumentBuilder docBuilder = docFactory.newDocumentBuilder(); + Document doc = docBuilder.parse(new InputSource(new StringReader(capabilities))); + Element rootElement = doc.getDocumentElement(); + NodeList nodes = rootElement.getElementsByTagName("cpu"); + Node node = nodes.item(0); + nodes = ((Element)node).getElementsByTagName("counter"); + for (int i = 0; i < nodes.getLength(); i++) { + node = nodes.item(i); + NamedNodeMap attributes = node.getAttributes(); + Node nameNode = attributes.getNamedItem("name"); + Node freqNode = attributes.getNamedItem("frequency"); + if (nameNode != null && "tsc".equals(nameNode.getNodeValue()) && freqNode != null && StringUtils.isNotEmpty(freqNode.getNodeValue())) { + speed = Long.parseLong(freqNode.getNodeValue()) / 1000000; + LOGGER.info(String.format("Retrieved value [%s] from \"host capabilities\". This corresponds to a CPU speed of [%s] MHz.", freqNode.getNodeValue(), speed)); + } + } + } catch (Exception ex) { + LOGGER.error("Unable to fetch CPU speed from \"host capabilities\"", ex); + speed = 0L; + } + return speed; + } + private void getHostInfoFromLibvirt() { try { final Connect conn = LibvirtConnection.getConnection(); final NodeInfo hosts = conn.nodeInfo(); + final String capabilities = conn.getCapabilities(); if (this.cpuSpeed == 0) { - this.cpuSpeed = getCpuSpeed(hosts); + this.cpuSpeed = getCpuSpeed(capabilities, hosts); } else { LOGGER.debug(String.format("Using existing configured CPU frequency %s", this.cpuSpeed)); } @@ -146,7 +192,7 @@ public class KVMHostInfo { this.cpus = hosts.cpus; final LibvirtCapXMLParser parser = new LibvirtCapXMLParser(); - parser.parseCapabilitiesXML(conn.getCapabilities()); + parser.parseCapabilitiesXML(capabilities); final ArrayList oss = parser.getGuestOsType(); for (final String s : oss) { /* diff --git a/plugins/hypervisors/kvm/src/test/java/org/apache/cloudstack/utils/linux/KVMHostInfoTest.java b/plugins/hypervisors/kvm/src/test/java/org/apache/cloudstack/utils/linux/KVMHostInfoTest.java index 360f72579a6..67d3e011f81 100644 --- a/plugins/hypervisors/kvm/src/test/java/org/apache/cloudstack/utils/linux/KVMHostInfoTest.java +++ b/plugins/hypervisors/kvm/src/test/java/org/apache/cloudstack/utils/linux/KVMHostInfoTest.java @@ -16,23 +16,22 @@ // under the License. package org.apache.cloudstack.utils.linux; -import com.cloud.hypervisor.kvm.resource.LibvirtConnection; import org.apache.commons.lang.SystemUtils; - import org.hamcrest.Matchers; -import org.junit.Test; -import org.junit.Assume; import org.junit.Assert; +import org.junit.Assume; +import org.junit.Test; import org.junit.runner.RunWith; import org.libvirt.Connect; -import org.mockito.Mockito; - import org.libvirt.NodeInfo; +import org.mockito.Mockito; import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PowerMockIgnore; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; +import com.cloud.hypervisor.kvm.resource.LibvirtConnection; + @RunWith(PowerMockRunner.class) @PrepareForTest(value = {LibvirtConnection.class}) @PowerMockIgnore({"javax.xml.*", "org.w3c.dom.*", "org.apache.xerces.*", "org.xml.*"}) @@ -45,7 +44,21 @@ public class KVMHostInfoTest { Assume.assumeTrue(SystemUtils.IS_OS_LINUX); NodeInfo nodeInfo = Mockito.mock(NodeInfo.class); nodeInfo.mhz = 1000; - Assert.assertThat(KVMHostInfo.getCpuSpeed(nodeInfo), Matchers.greaterThan(0l)); + Assert.assertThat(KVMHostInfo.getCpuSpeed(null, nodeInfo), Matchers.greaterThan(0l)); + } + + @Test + public void getCpuSpeedFromHostCapabilities() { + String capabilities = "\n" + + "8a330742-345f-b0df-7954-c9960b88116c\n" + + " \n" + + " x86_64\n" + + " Opteron_G2\n" + + " AMD\n" + + " \n" + + " \n" + + "\n";; + Assert.assertEquals(2350L, KVMHostInfo.getCpuSpeedFromHostCapabilities(capabilities)); } @Test diff --git a/pom.xml b/pom.xml index bad2c6af644..87ca50537d4 100644 --- a/pom.xml +++ b/pom.xml @@ -623,6 +623,20 @@ org.opensaml opensaml ${cs.opensaml.version} + + + org.slf4j + jcl-over-slf4j + + + org.slf4j + jul-to-slf4j + + + org.slf4j + log4j-over-slf4j + + org.owasp.esapi diff --git a/server/src/main/java/com/cloud/configuration/ConfigurationManagerImpl.java b/server/src/main/java/com/cloud/configuration/ConfigurationManagerImpl.java index b297c760461..ff45b73509a 100755 --- a/server/src/main/java/com/cloud/configuration/ConfigurationManagerImpl.java +++ b/server/src/main/java/com/cloud/configuration/ConfigurationManagerImpl.java @@ -4640,7 +4640,7 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati } if (!StringUtils.isAllEmpty(ipv6Range, vlan.getIp6Range())) { String r1 = StringUtils.isEmpty(ipv6Range) ? NetUtils.getIpv6RangeFromCidr(vlanIp6Cidr) : ipv6Range; - String r2 = StringUtils.isEmpty(vlan.getIp6Range()) ? NetUtils.getIpv6RangeFromCidr(vlanIp6Cidr) : vlan.getIp6Range(); + String r2 = StringUtils.isEmpty(vlan.getIp6Range()) ? NetUtils.getIpv6RangeFromCidr(vlan.getIp6Cidr()) : vlan.getIp6Range(); if(NetUtils.isIp6RangeOverlap(r1, r2)) { throw new InvalidParameterValueException(String.format("The IPv6 range with tag: %s already has IPs that overlap with the new range.", vlan.getVlanTag())); diff --git a/ui/src/views/infra/network/IpRangesTabPublic.vue b/ui/src/views/infra/network/IpRangesTabPublic.vue index 36a5d6480a8..df78eba9935 100644 --- a/ui/src/views/infra/network/IpRangesTabPublic.vue +++ b/ui/src/views/infra/network/IpRangesTabPublic.vue @@ -239,7 +239,7 @@
{{ $t('label.set.reservation') }}
- +
@@ -555,12 +555,9 @@ export default { this.fetchDomains() }, handleShowAccountFields () { - if (this.showAccountFields === false) { - this.showAccountFields = true + if (this.showAccountFields) { this.fetchDomains() - return } - this.showAccountFields = false }, handleOpenAddIpRangeModal () { this.initAddIpRangeForm()