You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by ro...@apache.org on 2019/05/05 08:28:11 UTC

[cloudstack] branch master updated: kvm: Fix three issues with Ubuntu 16.04 hosts (#3227)

This is an automated email from the ASF dual-hosted git repository.

rohit pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cloudstack.git


The following commit(s) were added to refs/heads/master by this push:
     new 3729511  kvm: Fix three issues with Ubuntu 16.04 hosts (#3227)
3729511 is described below

commit 3729511c376ae1d3c2b9bb22e3e2988998e993a2
Author: ustcweizhou <us...@gmail.com>
AuthorDate: Sun May 5 10:27:58 2019 +0200

    kvm: Fix three issues with Ubuntu 16.04 hosts (#3227)
    
    * ubuntu16: fix unable to add host if cloudbrX is not configured
    
    while add a ubuntu16.04 host with native eth0 (cloudbrX is not configured),
    the operation failed and I got the following error in /var/log/cloudstack/agent/setup.log
    
    ```
    DEBUG:root:execute:ifconfig eth0
    DEBUG:root:[Errno 2] No such file or directory
      File "/usr/lib/python2.7/dist-packages/cloudutils/serviceConfig.py", line 38, in configration
        result = self.config()
      File "/usr/lib/python2.7/dist-packages/cloudutils/serviceConfig.py", line 211, in config
        super(networkConfigUbuntu, self).cfgNetwork()
      File "/usr/lib/python2.7/dist-packages/cloudutils/serviceConfig.py", line 108, in cfgNetwork
        device = self.netcfg.getDefaultNetwork()
      File "/usr/lib/python2.7/dist-packages/cloudutils/networkConfig.py", line 53, in getDefaultNetwork
        pdi = networkConfig.getDevInfo(dev)
      File "/usr/lib/python2.7/dist-packages/cloudutils/networkConfig.py", line 157, in getDevInfo
        elif networkConfig.isBridge(dev) or networkConfig.isOvsBridge(dev):
    ```
    
    The issue is caused by commit 9c7cd8c2485412bc847b2c2473b962fa01435b24
    2017-09-19 16:45 Sigert Goeminne ● CLOUDSTACK-10081: CloudUtils getDevInfo function will now return "bridge" instead o
    
    * ubuntu16: Stop service libvirt-bin.socket while add a host
    
    service libvirt-bin.socket will be started when add a ubuntu 16.04 host
    DEBUG:root:execute:sudo /usr/sbin/service libvirt-bin start
    
    However, libvirt-bin service will be broken by it after restarting
    Stopping service libvirt-bin.socket will fix the issue.
    
    An example is given as below.
    
    ```
    root@node32:~# /etc/init.d/libvirt-bin restart
    [ ok ] Restarting libvirt-bin (via systemctl): libvirt-bin.service.
    root@node32:~# virsh list
    error: failed to connect to the hypervisor
    error: no valid connection
    error: Failed to connect socket to '/var/run/libvirt/libvirt-sock': No such file or directory
    
    root@node32:~# systemctl stop libvirt-bin.socket
    
    root@node32:~# /etc/init.d/libvirt-bin restart
    [ ok ] Restarting libvirt-bin (via systemctl): libvirt-bin.service.
    root@node32:~# virsh list
     Id    Name                           State
    ----------------------------------------------------
    
    ```
    
    * ubuntu16: Diable libvirt default network
    
    By default, libvirt will create default network virbr0 on kvm hypervisors.
    If vm uses the same ip range 192.168.122.0/24, there will be some issues.
    
    In some cases, if we run tcpdump inside vm, we will see the ip of kvm hypervisor as source ip.
---
 .../hypervisor/kvm/resource/LibvirtComputingResource.java | 15 +++++++++++++++
 python/lib/cloudutils/networkConfig.py                    |  3 +++
 python/lib/cloudutils/serviceConfig.py                    |  2 ++
 3 files changed, 20 insertions(+)

diff --git a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java
index c07b2d9..1cdc1f0 100644
--- a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java
+++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java
@@ -72,6 +72,7 @@ import org.libvirt.DomainInterfaceStats;
 import org.libvirt.DomainSnapshot;
 import org.libvirt.LibvirtException;
 import org.libvirt.MemoryStatistic;
+import org.libvirt.Network;
 import org.libvirt.NodeInfo;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
@@ -925,6 +926,20 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv
             throw new CloudRuntimeException(e.getMessage());
         }
 
+        // destroy default network, see https://libvirt.org/sources/java/javadoc/org/libvirt/Network.html
+        try {
+            Network network = conn.networkLookupByName("default");
+            s_logger.debug("Found libvirt default network, destroying it and setting autostart to false");
+            if (network.isActive() == 1) {
+                network.destroy();
+            }
+            if (network.getAutostart()) {
+                network.setAutostart(false);
+            }
+        } catch (final LibvirtException e) {
+            s_logger.warn("Ignoring libvirt error.", e);
+        }
+
         if (HypervisorType.KVM == _hypervisorType) {
             /* Does node support HVM guest? If not, exit */
             if (!IsHVMEnabled(conn)) {
diff --git a/python/lib/cloudutils/networkConfig.py b/python/lib/cloudutils/networkConfig.py
index b3ae269..2798843 100644
--- a/python/lib/cloudutils/networkConfig.py
+++ b/python/lib/cloudutils/networkConfig.py
@@ -103,6 +103,9 @@ class networkConfig:
 
     @staticmethod
     def isOvsBridge(devName):
+        cmd = bash("which ovs-vsctl")
+        if not cmd.isSuccess():
+            return False
         try:
             return 0==subprocess.check_call(("ovs-vsctl", "br-exists", devName))
         except subprocess.CalledProcessError:
diff --git a/python/lib/cloudutils/serviceConfig.py b/python/lib/cloudutils/serviceConfig.py
index 994c822..cc7a22d 100755
--- a/python/lib/cloudutils/serviceConfig.py
+++ b/python/lib/cloudutils/serviceConfig.py
@@ -581,6 +581,8 @@ class libvirtConfigUbuntu(serviceCfgBase):
 
             self.syscfg.svo.stopService("libvirt-bin")
             self.syscfg.svo.enableService("libvirt-bin")
+            if os.path.exists("/lib/systemd/system/libvirt-bin.socket"):
+                bash("systemctl stop libvirt-bin.socket")
             return True
         except:
             raise