wido commented on a change in pull request #2795: kvm: Properly report available memory to Management Server URL: https://github.com/apache/cloudstack/pull/2795#discussion_r209557883
########## File path: plugins/hypervisors/kvm/src/main/java/org/apache/cloudstack/utils/linux/KVMHostInfo.java ########## @@ -0,0 +1,132 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package org.apache.cloudstack.utils.linux; + +import com.cloud.hypervisor.kvm.resource.LibvirtCapXMLParser; +import com.cloud.hypervisor.kvm.resource.LibvirtConnection; +import org.apache.commons.io.IOUtils; +import org.apache.log4j.Logger; +import org.libvirt.Connect; +import org.libvirt.LibvirtException; +import org.libvirt.NodeInfo; + +import java.io.FileReader; +import java.io.IOException; +import java.io.Reader; +import java.util.ArrayList; +import java.util.List; + +public class KVMHostInfo { + + private static final Logger LOGGER = Logger.getLogger(KVMHostInfo.class); + + private int cpus; + private int cpusockets; + private long cpuSpeed; + private long totalMemory; + private long reservedMemory; + private long overCommitMemory; + private List<String> capabilities = new ArrayList<>(); + + public KVMHostInfo(long reservedMemory, long overCommitMemory) { + this.reservedMemory = reservedMemory; + this.overCommitMemory = overCommitMemory; + this.getHostInfoFromLibvirt(); + this.totalMemory = new MemStat(this.getReservedMemory(), this.getOverCommitMemory()).getTotal(); + } + + public int getCpus() { + return this.cpus; + } + + public int getCpuSockets() { + return this.cpusockets; + } + + public long getCpuSpeed() { + return this.cpuSpeed; + } + + public long getTotalMemory() { + return this.totalMemory; + } + + public long getReservedMemory() { + return this.reservedMemory; + } + + public long getOverCommitMemory() { + return this.overCommitMemory; + } + + public List<String> getCapabilities() { + return this.capabilities; + } + + protected static long getCpuSpeed(final NodeInfo nodeInfo) { + try (final Reader reader = new FileReader( + "/sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq")) { + return Long.parseLong(IOUtils.toString(reader).trim()) / 1000; + } catch (IOException | NumberFormatException e) { + LOGGER.info("Could not read cpuinfo_max_freq, falling back on libvirt"); + return nodeInfo.mhz; + } + } + + private void getHostInfoFromLibvirt() { + try { + final Connect conn = LibvirtConnection.getConnection(); + final NodeInfo hosts = conn.nodeInfo(); + this.cpuSpeed = getCpuSpeed(hosts); + + /* + * Some CPUs report a single socket and multiple NUMA cells. + * We need to multiply them to get the correct socket count. + */ + this.cpusockets = hosts.sockets; + if (hosts.nodes > 0) { + this.cpusockets = hosts.sockets * hosts.nodes; + } + this.cpus = hosts.cpus; + + final LibvirtCapXMLParser parser = new LibvirtCapXMLParser(); + parser.parseCapabilitiesXML(conn.getCapabilities()); + final ArrayList<String> oss = parser.getGuestOsType(); + for (final String s : oss) { Review comment: Yes, they will. But what I did is take the original code and use it. I didn't modify the logic behind the capabilities. I would make that a different PR if we want to do that. ---------------------------------------------------------------- This is an automated message from the Apache Git Service. To respond to the message, please log on GitHub and use the URL above to go to the specific comment. For queries about this service, please contact Infrastructure at: us...@infra.apache.org With regards, Apache Git Services