You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by wi...@apache.org on 2013/07/25 18:11:10 UTC

git commit: updated refs/heads/master to 211b180

Updated Branches:
  refs/heads/master 2c5388afa -> 211b180d5


Replaced virsh() by python-libvirt functions

Signed-off-by: Rene Diepstraten <re...@renediepstraten.nl>


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

Branch: refs/heads/master
Commit: 211b180d55591098d68666003d29d04866e5e11a
Parents: 2c5388a
Author: Rene Diepstraten <re...@renediepstraten.nl>
Authored: Thu Jul 25 15:45:27 2013 +0200
Committer: Wido den Hollander <wi...@widodh.nl>
Committed: Thu Jul 25 18:10:58 2013 +0200

----------------------------------------------------------------------
 debian/control                       |   2 +-
 packaging/centos63/cloud.spec        |   1 +
 scripts/vm/network/security_group.py | 133 ++++++++++++++++++++++--------
 3 files changed, 101 insertions(+), 35 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/211b180d/debian/control
----------------------------------------------------------------------
diff --git a/debian/control b/debian/control
index 46dd505..e6d1ef0 100644
--- a/debian/control
+++ b/debian/control
@@ -22,7 +22,7 @@ Description: CloudStack server library
 
 Package: cloudstack-agent
 Architecture: all
-Depends: openjdk-6-jre | openjdk-7-jre, cloudstack-common (= ${source:Version}), lsb-base (>= 3.2), libcommons-daemon-java, libjna-java, openssh-client, libvirt0, sysvinit-utils, qemu-kvm, libvirt-bin, uuid-runtime, rsync, grep, iproute, perl-base, perl-modules, ebtables, vlan, wget, jsvc, ipset
+Depends: openjdk-6-jre | openjdk-7-jre, cloudstack-common (= ${source:Version}), lsb-base (>= 3.2), libcommons-daemon-java, libjna-java, openssh-client, libvirt0, sysvinit-utils, qemu-kvm, libvirt-bin, uuid-runtime, rsync, grep, iproute, perl-base, perl-modules, ebtables, vlan, wget, jsvc, ipset, python-libvirt
 Conflicts: cloud-agent, cloud-agent-libs, cloud-agent-deps, cloud-agent-scripts
 Description: CloudStack agent
  The CloudStack agent is in charge of managing shared computing resources in

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/211b180d/packaging/centos63/cloud.spec
----------------------------------------------------------------------
diff --git a/packaging/centos63/cloud.spec b/packaging/centos63/cloud.spec
index 61e00bd..588b16f 100644
--- a/packaging/centos63/cloud.spec
+++ b/packaging/centos63/cloud.spec
@@ -122,6 +122,7 @@ Requires: jsvc
 Requires: jakarta-commons-daemon
 Requires: jakarta-commons-daemon-jsvc
 Requires: perl
+Requires: libvirt-python
 Provides: cloud-agent
 Obsoletes: cloud-agent < 4.1.0
 Obsoletes: cloud-agent-libs < 4.1.0

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/211b180d/scripts/vm/network/security_group.py
----------------------------------------------------------------------
diff --git a/scripts/vm/network/security_group.py b/scripts/vm/network/security_group.py
index 2ce558f..a23617e 100755
--- a/scripts/vm/network/security_group.py
+++ b/scripts/vm/network/security_group.py
@@ -26,11 +26,11 @@ import xml.dom.minidom
 from optparse import OptionParser, OptionGroup, OptParseError, BadOptionError, OptionError, OptionConflictError, OptionValueError
 import re
 import traceback
+import libvirt
 
 logpath = "/var/run/cloud/"        # FIXME: Logs should reside in /var/log/cloud
 iptables = Command("iptables")
 bash = Command("/bin/bash")
-virsh = Command("virsh")
 ebtablessave = Command("ebtables-save")
 ebtables = Command("ebtables")
 def execute(cmd):
@@ -83,6 +83,78 @@ def ipset(ipsetname, proto, start, end, ips):
 
     return result
 '''
+def virshlist(*states):
+
+    libvirt_states={ 'running'  : libvirt.VIR_DOMAIN_RUNNING,
+                     'shutoff'  : libvirt.VIR_DOMAIN_SHUTOFF,
+                     'shutdown' : libvirt.VIR_DOMAIN_SHUTDOWN,
+                     'paused'   : libvirt.VIR_DOMAIN_PAUSED,
+                     'nostate'  : libvirt.VIR_DOMAIN_NOSTATE,
+                     'blocked'  : libvirt.VIR_DOMAIN_BLOCKED,
+                     'crashed'  : libvirt.VIR_DOMAIN_CRASHED,
+    }
+
+    searchstates = list(libvirt_states[state] for state in states)
+
+    conn = libvirt.openReadOnly('qemu:///system')
+    if conn == None:
+       print 'Failed to open connection to the hypervisor'
+       sys.exit(3)
+
+    alldomains = map(conn.lookupByID, conn.listDomainsID())
+    alldomains += map(conn.lookupByName, conn.listDefinedDomains())
+
+    domains = []
+    for domain in alldomains:
+        if domain.info()[0] in searchstates:
+            domains.append(domain.name())
+
+    conn.close()
+
+    return domains
+
+def virshdomstate(domain):
+
+    libvirt_states={ libvirt.VIR_DOMAIN_RUNNING  : 'running',
+                     libvirt.VIR_DOMAIN_SHUTOFF  : 'shut off',
+                     libvirt.VIR_DOMAIN_SHUTDOWN : 'shut down',
+                     libvirt.VIR_DOMAIN_PAUSED   : 'paused',
+                     libvirt.VIR_DOMAIN_NOSTATE  : 'no state',
+                     libvirt.VIR_DOMAIN_BLOCKED  : 'blocked',
+                     libvirt.VIR_DOMAIN_CRASHED  : 'crashed',
+    }
+
+    conn = libvirt.openReadOnly('qemu:///system')
+    if conn == None:
+       print 'Failed to open connection to the hypervisor'
+       sys.exit(3)
+
+    try:
+        dom = (conn.lookupByName (domain))
+    except libvirt.libvirtError:
+        return None
+
+    state = libvirt_states[dom.info()[0]]
+    conn.close()
+
+    return state
+
+def virshdumpxml(domain):
+
+    conn = libvirt.openReadOnly('qemu:///system')
+    if conn == None:
+       print 'Failed to open connection to the hypervisor'
+       sys.exit(3)
+
+    try:
+        dom = (conn.lookupByName (domain))
+    except libvirt.libvirtError:
+        return None
+
+    xml = dom.XMLDesc(0)
+    conn.close()
+
+    return xml
 
 def destroy_network_rules_for_vm(vm_name, vif=None):
     vmchain = vm_name
@@ -509,13 +581,9 @@ def get_rule_log_for_vm(vmName):
     return ','.join([_vmName, _vmID, _vmIP, _domID, _signature, _seqno])
 
 def check_domid_changed(vmName):
-    curr_domid = '-1'
-    try:
-        curr_domid = getvmId(vmName)
-        if (curr_domid is None) or (not curr_domid.isdigit()):
-            curr_domid = '-1'
-    except:
-        pass
+    curr_domid = getvmId(vmName)
+    if (curr_domid is None) or (not curr_domid.isdigit()):
+        curr_domid = '-1'
 
     vm_name = vmName;
     logfilename = logpath + vm_name + ".log"
@@ -592,8 +660,7 @@ def network_rules_for_rebooted_vm(vmName):
     return True
 
 def get_rule_logs_for_vms():
-    cmd = "virsh list|awk '/running/ {print $2}'"
-    vms = bash("-c", cmd).stdout.split("\n")
+    vms = virshlist('running')
 
     result = []
     try:
@@ -623,11 +690,7 @@ def cleanup_rules():
             if 1 in [ chain.startswith(c) for c in ['r-', 'i-', 's-', 'v-'] ]:
                 vm_name = chain
 
-                cmd = "virsh list |awk '/" + vm_name + "/ {print $3}'"
-                try:
-                    result = execute(cmd).strip()
-                except:
-                    result = None
+                result = virshdomstate(vm_name)
 
                 if result == None or len(result) == 0:
                     logging.debug("chain " + chain + " does not correspond to a vm, cleaning up iptable rules")
@@ -643,11 +706,7 @@ def cleanup_rules():
             if 1 in [ chain.startswith(c) for c in ['r-', 'i-', 's-', 'v-'] ]:
                 vm_name = chain
 
-                cmd = "virsh list |awk '/" + vm_name + "/ {print $3}'"
-                try:
-                    result = execute(cmd).strip()
-                except:
-                    result = None
+                result = virshdomstate(vm_name)
 
                 if result == None or len(result) == 0:
                     logging.debug("chain " + chain + " does not correspond to a vm, cleaning up ebtable rules")
@@ -727,9 +786,6 @@ def add_network_rules(vm_name, vm_id, vm_ip, signature, seqno, vmMac, rules, vif
     vmName = vm_name
     domId = getvmId(vmName)
 
-
-
-
     changes = []
     changes = check_rule_log_for_vm(vmName, vm_id, vm_ip, domId, signature, seqno)
 
@@ -827,9 +883,8 @@ def add_network_rules(vm_name, vm_id, vm_ip, signature, seqno, vmMac, rules, vif
 
 def getVifs(vmName):
     vifs = []
-    try:
-        xmlfile = virsh("dumpxml", vmName).stdout
-    except:
+    xmlfile = virshdumpxml(vmName)
+    if xmlfile == None:
         return vifs
 
     dom = xml.dom.minidom.parseString(xmlfile)
@@ -841,9 +896,8 @@ def getVifs(vmName):
 
 def getVifsForBridge(vmName, brname):
     vifs = []
-    try:
-        xmlfile = virsh("dumpxml", vmName).stdout
-    except:
+    xmlfile = virshdumpxml(vmName)
+    if xmlfile == None:
         return vifs
 
     dom = xml.dom.minidom.parseString(xmlfile)
@@ -858,9 +912,8 @@ def getVifsForBridge(vmName, brname):
 
 def getBridges(vmName):
     bridges = []
-    try:
-        xmlfile = virsh("dumpxml", vmName).stdout
-    except:
+    xmlfile = virshdumpxml(vmName)
+    if xmlfile == None:
         return bridges
 
     dom = xml.dom.minidom.parseString(xmlfile)
@@ -871,8 +924,20 @@ def getBridges(vmName):
     return list(set(bridges))
 
 def getvmId(vmName):
-    cmd = "virsh list |awk '/" + vmName + "/ {print $1}'"
-    return bash("-c", cmd).stdout.strip()
+
+    conn = libvirt.openReadOnly('qemu:///system')
+    if conn == None:
+       print 'Failed to open connection to the hypervisor'
+       sys.exit(3)
+
+    try:
+        dom = (conn.lookupByName (domain))
+    except libvirt.libvirtError:
+        return None
+
+    conn.close()
+
+    return dom.ID()
 
 def addFWFramework(brname):
     try: