You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by bh...@apache.org on 2016/11/24 17:42:52 UTC

[1/2] git commit: updated refs/heads/master to 16c2761

Repository: cloudstack
Updated Branches:
  refs/heads/master f07081dfc -> 16c2761ce


CLOUDSTACK-8715: Add channel to Instances for Qemu Guest Agent

This commit adds a additional VirtIO channel with the name
'org.qemu.guest_agent.0' to all Instances.

With the Qemu Guest Agent the Hypervisor gains more control over the Instance if
these tools are present inside the Instance, for example:

* Power control
* Flushing filesystems
* Fetching Network information

In the future this should allow safer snapshots on KVM since we can instruct the
Instance to flush the filesystems prior to snapshotting the disk.

More information: http://wiki.qemu.org/Features/QAPI/GuestAgent

Keep in mind that on Ubuntu AppArmor still needs to be disabled since the default
AppArmor profile doesn't allow libvirt to write into /var/lib/libvirt/qemu

This commit does not add any communication methods through API-calls, it merely
adds the channel to the Instances and installs the Guest Agent in the SSVMs.

With the addition of the Qemu Guest Agent channel a second channel appears in /dev
on a SSVM as a VirtIO port.

The order in which the ports are defined in the XML matters for the naming inside
the SSVM VM and by not relying on /dev/vportXX but looking for a static name the
SSVM still boots properly if the order in the XML definition is changed.

A SSVM with both ports attached will have something like this:

  root@v-215-VM:~# ls -l /dev/virtio-ports
  total 0
  lrwxrwxrwx 1 root root 11 May 13 21:41 org.qemu.guest_agent.0 -> ../vport0p2
  lrwxrwxrwx 1 root root 11 May 13 21:41 v-215-VM.vport -> ../vport0p1
  root@v-215-VM:~# ls -l /dev/vport*
  crw------- 1 root root 251, 1 May 13 21:41 /dev/vport0p1
  crw------- 1 root root 251, 2 May 13 21:41 /dev/vport0p2
  root@v-215-VM:~#

In this case the SSVM port points to /dev/vport0p1, but if the order in the XML
is different it might point to /dev/vport0p2

By looking for a portname with a pre-defined pattern in /dev/virtio-ports we
do not rely on the order in the XML definition.

Signed-off-by: Wido den Hollander <wi...@widodh.nl>


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/2a5f37c1
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/2a5f37c1
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/2a5f37c1

Branch: refs/heads/master
Commit: 2a5f37c1b10ba4e5acaf7fbb30ce0b016b04d082
Parents: 9bec703
Author: Wido den Hollander <wi...@widodh.nl>
Authored: Fri May 13 11:04:49 2016 +0200
Committer: Wido den Hollander <wi...@widodh.nl>
Committed: Wed Nov 23 16:01:08 2016 +0100

----------------------------------------------------------------------
 agent/conf/agent.properties                     |  5 ++
 .../kvm/resource/LibvirtComputingResource.java  | 21 ++++-
 .../kvm/resource/LibvirtDomainXMLParser.java    | 29 ++++++
 .../hypervisor/kvm/resource/LibvirtVMDef.java   | 93 +++++++++++++++++---
 .../resource/LibvirtComputingResourceTest.java  | 14 +++
 .../resource/LibvirtDomainXMLParserTest.java    | 33 ++++++-
 .../kvm/resource/LibvirtVMDefTest.java          | 19 +++-
 .../debian/config/etc/init.d/cloud-early-config | 12 ++-
 .../install_systemvm_packages.sh                |  2 +-
 9 files changed, 208 insertions(+), 20 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2a5f37c1/agent/conf/agent.properties
----------------------------------------------------------------------
diff --git a/agent/conf/agent.properties b/agent/conf/agent.properties
index 1a3412e..c15b78e 100644
--- a/agent/conf/agent.properties
+++ b/agent/conf/agent.properties
@@ -56,6 +56,11 @@ zone=default
 # local storage path, by default, it's /var/lib/libvirt/images/
 #local.storage.path=/var/lib/libvirt/images/
 
+# Qemu socket path, directory where Qemu sockets are placed.
+# These sockets are for the Qemu Guest Agent and SSVM privisioning
+# Make sure that AppArmor or SELinux allow libvirt to write there
+#qemu.sockets.path=/var/lib/libvirt/qemu
+
 # The UUID for the local storage pool, this is mandatory!
 # Generate with "uuidgen"
 local.storage.uuid=

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2a5f37c1/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 7173f0a..38dabda 100644
--- a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java
+++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java
@@ -97,6 +97,7 @@ import com.cloud.dc.Vlan;
 import com.cloud.exception.InternalErrorException;
 import com.cloud.host.Host.Type;
 import com.cloud.hypervisor.Hypervisor.HypervisorType;
+import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.ChannelDef;
 import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.ClockDef;
 import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.ConsoleDef;
 import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.CpuModeDef;
@@ -116,7 +117,6 @@ import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.InterfaceDef.GuestNetType;
 import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.SerialDef;
 import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.TermPolicy;
 import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.VideoDef;
-import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.VirtioSerialDef;
 import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.RngDef;
 import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.RngDef.RngBackendModel;
 import com.cloud.hypervisor.kvm.resource.wrapper.LibvirtRequestWrapper;
@@ -139,6 +139,7 @@ import com.cloud.storage.resource.StorageSubsystemCommandHandler;
 import com.cloud.storage.resource.StorageSubsystemCommandHandlerBase;
 import com.cloud.utils.ExecutionResult;
 import com.cloud.utils.NumbersUtil;
+import com.cloud.utils.StringUtils;
 import com.cloud.utils.Pair;
 import com.cloud.utils.PropertiesUtil;
 import com.cloud.utils.exception.CloudRuntimeException;
@@ -253,6 +254,8 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv
     protected String _rngPath = "/dev/random";
     protected int _rngRatePeriod = 1000;
     protected int _rngRateBytes = 2048;
+    private File _qemuSocketsPath;
+    private final String _qemuGuestAgentSocketName = "org.qemu.guest_agent.0";
 
     private final Map <String, String> _pifs = new HashMap<String, String>();
     private final Map<String, VmStats> _vmStats = new ConcurrentHashMap<String, VmStats>();
@@ -777,6 +780,13 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv
             _localStoragePath = "/var/lib/libvirt/images/";
         }
 
+        /* Directory to use for Qemu sockets like for the Qemu Guest Agent */
+        _qemuSocketsPath = new File("/var/lib/libvirt/qemu");
+        String _qemuSocketsPathVar = (String)params.get("qemu.sockets.path");
+        if (_qemuSocketsPathVar != null && StringUtils.isNotBlank(_qemuSocketsPathVar)) {
+            _qemuSocketsPath = new File(_qemuSocketsPathVar);
+        }
+
         final File storagePath = new File(_localStoragePath);
         _localStoragePath = storagePath.getAbsolutePath();
 
@@ -2008,9 +2018,10 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv
         final SerialDef serial = new SerialDef("pty", null, (short)0);
         devices.addDevice(serial);
 
+        /* Add a VirtIO channel for SystemVMs for communication and provisioning */
         if (vmTO.getType() != VirtualMachine.Type.User) {
-            final VirtioSerialDef vserial = new VirtioSerialDef(vmTO.getName(), null);
-            devices.addDevice(vserial);
+            devices.addDevice(new ChannelDef(vmTO.getName() + ".vport", ChannelDef.ChannelType.UNIX,
+                              new File(_qemuSocketsPath + "/" + vmTO.getName() + ".agent")));
         }
 
         if (_rngEnable) {
@@ -2018,6 +2029,10 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv
             devices.addDevice(rngDevice);
         }
 
+        /* Add a VirtIO channel for the Qemu Guest Agent tools */
+        devices.addDevice(new ChannelDef(_qemuGuestAgentSocketName, ChannelDef.ChannelType.UNIX,
+                          new File(_qemuSocketsPath + "/" + vmTO.getName() + "." + _qemuGuestAgentSocketName)));
+
         final VideoDef videoCard = new VideoDef(_videoHw, _videoRam);
         devices.addDevice(videoCard);
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2a5f37c1/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtDomainXMLParser.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtDomainXMLParser.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtDomainXMLParser.java
index b77c1c8..3c4dc11 100644
--- a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtDomainXMLParser.java
+++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtDomainXMLParser.java
@@ -16,9 +16,11 @@
 // under the License.
 package com.cloud.hypervisor.kvm.resource;
 
+import java.io.File;
 import java.io.IOException;
 import java.io.StringReader;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 
 import javax.xml.parsers.DocumentBuilder;
@@ -34,6 +36,8 @@ import org.w3c.dom.NodeList;
 import org.xml.sax.InputSource;
 import org.xml.sax.SAXException;
 
+import com.cloud.utils.StringUtils;
+import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.ChannelDef;
 import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.DiskDef;
 import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.InterfaceDef;
 import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.InterfaceDef.NicModel;
@@ -45,6 +49,7 @@ public class LibvirtDomainXMLParser {
     private final List<InterfaceDef> interfaces = new ArrayList<InterfaceDef>();
     private final List<DiskDef> diskDefs = new ArrayList<DiskDef>();
     private final List<RngDef> rngDefs = new ArrayList<RngDef>();
+    private final List<ChannelDef> channels = new ArrayList<ChannelDef>();
     private Integer vncPort;
     private String desc;
 
@@ -175,6 +180,26 @@ public class LibvirtDomainXMLParser {
                 interfaces.add(def);
             }
 
+            NodeList ports = devices.getElementsByTagName("channel");
+            for (int i = 0; i < ports.getLength(); i++) {
+                Element channel = (Element)ports.item(i);
+
+                String type = channel.getAttribute("type");
+                String path = getAttrValue("source", "path", channel);
+                String name = getAttrValue("target", "name", channel);
+                String state = getAttrValue("target", "state", channel);
+
+                ChannelDef def = null;
+                if (!StringUtils.isNotBlank(state)) {
+                    def = new ChannelDef(name, ChannelDef.ChannelType.valueOf(type.toUpperCase()), new File(path));
+                } else {
+                    def = new ChannelDef(name, ChannelDef.ChannelType.valueOf(type.toUpperCase()),
+                            ChannelDef.ChannelState.valueOf(state.toUpperCase()), new File(path));
+                }
+
+                channels.add(def);
+            }
+
             Element graphic = (Element)devices.getElementsByTagName("graphics").item(0);
 
             if (graphic != null) {
@@ -261,6 +286,10 @@ public class LibvirtDomainXMLParser {
         return rngDefs;
     }
 
+    public List<ChannelDef> getChannels() {
+        return Collections.unmodifiableList(channels);
+    }
+
     public String getDescription() {
         return desc;
     }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2a5f37c1/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtVMDef.java
----------------------------------------------------------------------
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 157d711..ec5d6a7 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
@@ -20,6 +20,7 @@ import com.google.common.collect.Maps;
 import org.apache.commons.lang.StringEscapeUtils;
 import org.apache.log4j.Logger;
 
+import java.io.File;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -1209,25 +1210,95 @@ public class LibvirtVMDef {
         }
     }
 
-    public static class VirtioSerialDef {
-        private final String _name;
-        private String _path;
+    public final static class ChannelDef {
+        enum ChannelType {
+            UNIX("unix"), SERIAL("serial");
+            String type;
 
-        public VirtioSerialDef(String name, String path) {
-            _name = name;
-            _path = path;
+            ChannelType(String type) {
+                this.type = type;
+            }
+
+            @Override
+            public String toString() {
+                return this.type;
+            }
+        }
+
+        enum ChannelState {
+            DISCONNECTED("disconnected"), CONNECTED("connected");
+            String type;
+
+            ChannelState(String type) {
+                this.type = type;
+            }
+
+            @Override
+            public String toString() {
+                return type;
+            }
+        }
+
+        private final String name;
+        private File path = new File("");
+        private final ChannelType type;
+        private ChannelState state;
+
+        public ChannelDef(String name, ChannelType type) {
+            this.name = name;
+            this.type = type;
+        }
+
+        public ChannelDef(String name, ChannelType type, File path) {
+            this.name = name;
+            this.path = path;
+            this.type = type;
+        }
+
+        public ChannelDef(String name, ChannelType type, ChannelState state) {
+            this.name = name;
+            this.state = state;
+            this.type = type;
+        }
+
+        public ChannelDef(String name, ChannelType type, ChannelState state, File path) {
+            this.name = name;
+            this.path = path;
+            this.state = state;
+            this.type = type;
+        }
+
+        public ChannelType getChannelType() {
+            return type;
+        }
+
+        public ChannelState getChannelState() {
+            return state;
+        }
+
+        public String getName() {
+            return name;
+        }
+
+        public File getPath() {
+            return path;
         }
 
         @Override
         public String toString() {
             StringBuilder virtioSerialBuilder = new StringBuilder();
-            if (_path == null) {
-                _path = "/var/lib/libvirt/qemu";
+            virtioSerialBuilder.append("<channel type='" + type.toString() + "'>\n");
+            if (path == null) {
+                virtioSerialBuilder.append("<source mode='bind'/>\n");
+            } else {
+                virtioSerialBuilder.append("<source mode='bind' path='" + path.toString() + "'/>\n");
             }
-            virtioSerialBuilder.append("<channel type='unix'>\n");
-            virtioSerialBuilder.append("<source mode='bind' path='" + _path + "/" + _name + ".agent'/>\n");
-            virtioSerialBuilder.append("<target type='virtio' name='" + _name + ".vport'/>\n");
             virtioSerialBuilder.append("<address type='virtio-serial'/>\n");
+            if (state == null) {
+                virtioSerialBuilder.append("<target type='virtio' name='" + name + "'/>\n");
+            } else {
+                virtioSerialBuilder.append("<target type='virtio' name='" + name + "' state='" + state.toString() + "'/>\n");
+            }
             virtioSerialBuilder.append("</channel>\n");
             return virtioSerialBuilder.toString();
         }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2a5f37c1/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 b4e1375..6b322d7 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
@@ -150,6 +150,7 @@ import com.cloud.agent.api.to.VolumeTO;
 import com.cloud.agent.resource.virtualnetwork.VirtualRoutingResource;
 import com.cloud.exception.InternalErrorException;
 import com.cloud.hypervisor.kvm.resource.KVMHABase.NfsStoragePool;
+import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.ChannelDef;
 import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.DiskDef;
 import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.InterfaceDef;
 import com.cloud.hypervisor.kvm.resource.wrapper.LibvirtRequestWrapper;
@@ -336,6 +337,19 @@ public class LibvirtComputingResourceTest {
         assertXpath(domainDoc, "/domain/devices/input/@type", "tablet");
         assertXpath(domainDoc, "/domain/devices/input/@bus", "usb");
 
+        assertNodeExists(domainDoc, "/domain/devices/channel");
+        assertXpath(domainDoc, "/domain/devices/channel/@type", ChannelDef.ChannelType.UNIX.toString());
+
+        /*
+           The configure() method of LibvirtComputingResource has not been called, so the default path for the sockets
+           hasn't been initialized. That's why we check for 'null'
+
+           Calling configure is also not possible since that looks for certain files on the system which are not present
+           during testing
+         */
+        assertXpath(domainDoc, "/domain/devices/channel/source/@path", "null/" + to.getName() + ".org.qemu.guest_agent.0");
+        assertXpath(domainDoc, "/domain/devices/channel/target/@name", "org.qemu.guest_agent.0");
+
         assertXpath(domainDoc, "/domain/memory/text()", String.valueOf( to.getMaxRam() / 1024 ));
         assertXpath(domainDoc, "/domain/currentMemory/text()", String.valueOf( to.getMinRam() / 1024 ));
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2a5f37c1/plugins/hypervisors/kvm/test/com/cloud/hypervisor/kvm/resource/LibvirtDomainXMLParserTest.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/kvm/test/com/cloud/hypervisor/kvm/resource/LibvirtDomainXMLParserTest.java b/plugins/hypervisors/kvm/test/com/cloud/hypervisor/kvm/resource/LibvirtDomainXMLParserTest.java
index a71232c..f32f7fd 100644
--- a/plugins/hypervisors/kvm/test/com/cloud/hypervisor/kvm/resource/LibvirtDomainXMLParserTest.java
+++ b/plugins/hypervisors/kvm/test/com/cloud/hypervisor/kvm/resource/LibvirtDomainXMLParserTest.java
@@ -20,10 +20,13 @@
 package com.cloud.hypervisor.kvm.resource;
 
 import junit.framework.TestCase;
+
+import java.io.File;
 import java.util.List;
 import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.DiskDef;
 import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.InterfaceDef;
 import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.RngDef;
+import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.ChannelDef;
 
 public class LibvirtDomainXMLParserTest extends TestCase {
 
@@ -39,6 +42,13 @@ public class LibvirtDomainXMLParserTest extends TestCase {
         InterfaceDef.NicModel ifModel = InterfaceDef.NicModel.VIRTIO;
         InterfaceDef.GuestNetType ifType = InterfaceDef.GuestNetType.BRIDGE;
 
+        ChannelDef.ChannelType channelType = ChannelDef.ChannelType.UNIX;
+        ChannelDef.ChannelState channelState = ChannelDef.ChannelState.DISCONNECTED;
+        String ssvmAgentPath =  "/var/lib/libvirt/qemu/s-2970-VM.agent";
+        String ssvmAgentName = "s-2970-VM.vport";
+        String guestAgentPath = "/var/lib/libvirt/qemu/guest-agent.org.qemu.guest_agent.0";
+        String guestAgentName = "org.qemu.guest_agent.0";
+
         String diskLabel ="vda";
         String diskPath = "/var/lib/libvirt/images/my-test-image.qcow2";
 
@@ -145,7 +155,7 @@ public class LibvirtDomainXMLParserTest extends TestCase {
                      "</console>" +
                      "<channel type='unix'>" +
                      "<source mode='bind' path='/var/lib/libvirt/qemu/s-2970-VM.agent'/>" +
-                     "<target type='virtio' name='s-2970-VM.vport'/>" +
+                     "<target type='virtio' name='s-2970-VM.vport' state='disconnected'/>" +
                      "<alias name='channel0'/>" +
                      "<address type='virtio-serial' controller='0' bus='0' port='1'/>" +
                      "</channel>" +
@@ -169,6 +179,12 @@ public class LibvirtDomainXMLParserTest extends TestCase {
                      "<rate period='5000' bytes='4096' />" +
                      "<backend model='random'>/dev/random</backend>" +
                      "</rng>" +
+                     "<channel type='unix'>" +
+                     "<source mode='bind' path='" + guestAgentPath + "'/>" +
+                     "<target type='virtio' name='" + guestAgentName + "'/>" +
+                     "<alias name='channel0'/>" +
+                     "<address type='virtio-serial' controller='0' bus='0' port='1'/>" +
+                     "</channel>" +
                      "</devices>" +
                      "<seclabel type='none'/>" +
                      "</domain>";
@@ -190,6 +206,21 @@ public class LibvirtDomainXMLParserTest extends TestCase {
         assertEquals(deviceType, disks.get(diskId).getDeviceType());
         assertEquals(diskFormat, disks.get(diskId).getDiskFormatType());
 
+        List<ChannelDef> channels = parser.getChannels();
+        for (int i = 0; i < channels.size(); i++) {
+            assertEquals(channelType, channels.get(i).getChannelType());
+            assertEquals(channelType, channels.get(i).getChannelType());
+        }
+
+        /* SSVM provisioning port/channel */
+        assertEquals(channelState, channels.get(0).getChannelState());
+        assertEquals(new File(ssvmAgentPath), channels.get(0).getPath());
+        assertEquals(ssvmAgentName, channels.get(0).getName());
+
+        /* Qemu Guest Agent port/channel */
+        assertEquals(new File(guestAgentPath), channels.get(1).getPath());
+        assertEquals(guestAgentName, channels.get(1).getName());
+
         List<InterfaceDef> ifs = parser.getInterfaces();
         for (int i = 0; i < ifs.size(); i++) {
             assertEquals(ifModel, ifs.get(i).getModel());

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2a5f37c1/plugins/hypervisors/kvm/test/com/cloud/hypervisor/kvm/resource/LibvirtVMDefTest.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/kvm/test/com/cloud/hypervisor/kvm/resource/LibvirtVMDefTest.java b/plugins/hypervisors/kvm/test/com/cloud/hypervisor/kvm/resource/LibvirtVMDefTest.java
index f0d1b5b..b8ecdc3 100644
--- a/plugins/hypervisors/kvm/test/com/cloud/hypervisor/kvm/resource/LibvirtVMDefTest.java
+++ b/plugins/hypervisors/kvm/test/com/cloud/hypervisor/kvm/resource/LibvirtVMDefTest.java
@@ -21,8 +21,11 @@ package com.cloud.hypervisor.kvm.resource;
 
 import junit.framework.TestCase;
 import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.DiskDef;
+import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.ChannelDef;
 import com.cloud.utils.Pair;
 
+import java.io.File;
+
 public class LibvirtVMDefTest extends TestCase {
 
     public void testInterfaceEtehrnet() {
@@ -118,7 +121,7 @@ public class LibvirtVMDefTest extends TestCase {
         assertTrue((hostOsVersion.first() == 6 && hostOsVersion.second() >= 5) || (hostOsVersion.first() >= 7));
     }
 
-    public void testChannelDef() {
+    public void testRngDef() {
         LibvirtVMDef.RngDef.RngBackendModel backendModel = LibvirtVMDef.RngDef.RngBackendModel.RANDOM;
         String path = "/dev/random";
         int period = 2000;
@@ -132,4 +135,18 @@ public class LibvirtVMDefTest extends TestCase {
         assertEquals(def.getRngRatePeriod(), period);
     }
 
+    public void testChannelDef() {
+        ChannelDef.ChannelType type = ChannelDef.ChannelType.UNIX;
+        ChannelDef.ChannelState state = ChannelDef.ChannelState.CONNECTED;
+        String name = "v-136-VM.vport";
+        File path = new File("/var/lib/libvirt/qemu/" + name);
+
+        ChannelDef channelDef = new ChannelDef(name, type, state, path);
+
+        assertEquals(state, channelDef.getChannelState());
+        assertEquals(type, channelDef.getChannelType());
+        assertEquals(name, channelDef.getName());
+        assertEquals(path, channelDef.getPath());
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2a5f37c1/systemvm/patches/debian/config/etc/init.d/cloud-early-config
----------------------------------------------------------------------
diff --git a/systemvm/patches/debian/config/etc/init.d/cloud-early-config b/systemvm/patches/debian/config/etc/init.d/cloud-early-config
index cd42bb0..1435806 100755
--- a/systemvm/patches/debian/config/etc/init.d/cloud-early-config
+++ b/systemvm/patches/debian/config/etc/init.d/cloud-early-config
@@ -114,8 +114,14 @@ get_boot_params() {
           sed -i "s/%/ /g" /var/cache/cloud/cmdline
           ;;
      kvm)
-          if [ ! -e /dev/vport0p1 ]; then
-            log_it "/dev/vport0p1 not loaded, perhaps guest kernel is too old." && exit 2
+          VPORT=$(find /dev/virtio-ports -type l -name '*.vport' 2>/dev/null|head -1)
+
+          if [ -z "$VPORT" ]; then
+            log_it "No suitable VirtIO port was found in /dev/virtio-ports" && exit 2
+          fi
+
+          if [ ! -e "$VPORT" ]; then
+            log_it "${VPORT} not loaded, perhaps guest kernel is too old." && exit 2
           fi
 
 	      local factor=2
@@ -131,7 +137,7 @@ get_boot_params() {
 	            echo $pubkey > /var/cache/cloud/authorized_keys
 	            echo $pubkey > /root/.ssh/authorized_keys
               fi
-	        done < /dev/vport0p1
+	        done < $VPORT
 	        # In case of reboot we do not send the boot args again.
 	        # So, no need to wait for them, as the boot args are already set at startup
 	        if [ -s /var/cache/cloud/cmdline  ]

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2a5f37c1/tools/appliance/definitions/systemvmtemplate/install_systemvm_packages.sh
----------------------------------------------------------------------
diff --git a/tools/appliance/definitions/systemvmtemplate/install_systemvm_packages.sh b/tools/appliance/definitions/systemvmtemplate/install_systemvm_packages.sh
index f5f871b..491ac74 100644
--- a/tools/appliance/definitions/systemvmtemplate/install_systemvm_packages.sh
+++ b/tools/appliance/definitions/systemvmtemplate/install_systemvm_packages.sh
@@ -75,7 +75,7 @@ function install_packages() {
     radvd \
     sharutils
 
-  ${apt_get} -t wheezy-backports install keepalived irqbalance open-vm-tools
+  ${apt_get} -t wheezy-backports install keepalived irqbalance open-vm-tools qemu-guest-agent
 
   # hold on installed openswan version, upgrade rest of the packages (if any)
   apt-mark hold openswan


[2/2] git commit: updated refs/heads/master to 16c2761

Posted by bh...@apache.org.
Merge PR #1545

CLOUDSTACK-8715: Add channel to Instances for Qemu Guest Agent

Signed-off-by: Rohit Yadav <ro...@shapeblue.com>


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/16c2761c
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/16c2761c
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/16c2761c

Branch: refs/heads/master
Commit: 16c2761cea7566163485369adcefd9a452cbd066
Parents: f07081d 2a5f37c
Author: Rohit Yadav <ro...@shapeblue.com>
Authored: Thu Nov 24 23:11:50 2016 +0530
Committer: Rohit Yadav <ro...@shapeblue.com>
Committed: Thu Nov 24 23:12:07 2016 +0530

----------------------------------------------------------------------
 agent/conf/agent.properties                     |  5 ++
 .../kvm/resource/LibvirtComputingResource.java  | 21 ++++-
 .../kvm/resource/LibvirtDomainXMLParser.java    | 29 ++++++
 .../hypervisor/kvm/resource/LibvirtVMDef.java   | 93 +++++++++++++++++---
 .../resource/LibvirtComputingResourceTest.java  | 14 +++
 .../resource/LibvirtDomainXMLParserTest.java    | 33 ++++++-
 .../kvm/resource/LibvirtVMDefTest.java          | 19 +++-
 .../debian/config/etc/init.d/cloud-early-config | 12 ++-
 .../install_systemvm_packages.sh                |  2 +-
 9 files changed, 208 insertions(+), 20 deletions(-)
----------------------------------------------------------------------