Replaced virsh() by python-libvirt functions

Signed-off-by: Rene Diepstraten <rene@renediepstraten.nl>
This commit is contained in:
Rene Diepstraten 2013-07-25 15:45:27 +02:00 committed by Wido den Hollander
parent 2c5388afac
commit 211b180d55
3 changed files with 101 additions and 35 deletions

2
debian/control vendored
View File

@ -22,7 +22,7 @@ Description: CloudStack server library
Package: cloudstack-agent Package: cloudstack-agent
Architecture: all 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 Conflicts: cloud-agent, cloud-agent-libs, cloud-agent-deps, cloud-agent-scripts
Description: CloudStack agent Description: CloudStack agent
The CloudStack agent is in charge of managing shared computing resources in The CloudStack agent is in charge of managing shared computing resources in

View File

@ -122,6 +122,7 @@ Requires: jsvc
Requires: jakarta-commons-daemon Requires: jakarta-commons-daemon
Requires: jakarta-commons-daemon-jsvc Requires: jakarta-commons-daemon-jsvc
Requires: perl Requires: perl
Requires: libvirt-python
Provides: cloud-agent Provides: cloud-agent
Obsoletes: cloud-agent < 4.1.0 Obsoletes: cloud-agent < 4.1.0
Obsoletes: cloud-agent-libs < 4.1.0 Obsoletes: cloud-agent-libs < 4.1.0

View File

@ -26,11 +26,11 @@ import xml.dom.minidom
from optparse import OptionParser, OptionGroup, OptParseError, BadOptionError, OptionError, OptionConflictError, OptionValueError from optparse import OptionParser, OptionGroup, OptParseError, BadOptionError, OptionError, OptionConflictError, OptionValueError
import re import re
import traceback import traceback
import libvirt
logpath = "/var/run/cloud/" # FIXME: Logs should reside in /var/log/cloud logpath = "/var/run/cloud/" # FIXME: Logs should reside in /var/log/cloud
iptables = Command("iptables") iptables = Command("iptables")
bash = Command("/bin/bash") bash = Command("/bin/bash")
virsh = Command("virsh")
ebtablessave = Command("ebtables-save") ebtablessave = Command("ebtables-save")
ebtables = Command("ebtables") ebtables = Command("ebtables")
def execute(cmd): def execute(cmd):
@ -83,6 +83,78 @@ def ipset(ipsetname, proto, start, end, ips):
return result 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): def destroy_network_rules_for_vm(vm_name, vif=None):
vmchain = vm_name vmchain = vm_name
@ -509,13 +581,9 @@ def get_rule_log_for_vm(vmName):
return ','.join([_vmName, _vmID, _vmIP, _domID, _signature, _seqno]) return ','.join([_vmName, _vmID, _vmIP, _domID, _signature, _seqno])
def check_domid_changed(vmName): def check_domid_changed(vmName):
curr_domid = '-1'
try:
curr_domid = getvmId(vmName) curr_domid = getvmId(vmName)
if (curr_domid is None) or (not curr_domid.isdigit()): if (curr_domid is None) or (not curr_domid.isdigit()):
curr_domid = '-1' curr_domid = '-1'
except:
pass
vm_name = vmName; vm_name = vmName;
logfilename = logpath + vm_name + ".log" logfilename = logpath + vm_name + ".log"
@ -592,8 +660,7 @@ def network_rules_for_rebooted_vm(vmName):
return True return True
def get_rule_logs_for_vms(): def get_rule_logs_for_vms():
cmd = "virsh list|awk '/running/ {print $2}'" vms = virshlist('running')
vms = bash("-c", cmd).stdout.split("\n")
result = [] result = []
try: try:
@ -623,11 +690,7 @@ def cleanup_rules():
if 1 in [ chain.startswith(c) for c in ['r-', 'i-', 's-', 'v-'] ]: if 1 in [ chain.startswith(c) for c in ['r-', 'i-', 's-', 'v-'] ]:
vm_name = chain vm_name = chain
cmd = "virsh list |awk '/" + vm_name + "/ {print $3}'" result = virshdomstate(vm_name)
try:
result = execute(cmd).strip()
except:
result = None
if result == None or len(result) == 0: if result == None or len(result) == 0:
logging.debug("chain " + chain + " does not correspond to a vm, cleaning up iptable rules") 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-'] ]: if 1 in [ chain.startswith(c) for c in ['r-', 'i-', 's-', 'v-'] ]:
vm_name = chain vm_name = chain
cmd = "virsh list |awk '/" + vm_name + "/ {print $3}'" result = virshdomstate(vm_name)
try:
result = execute(cmd).strip()
except:
result = None
if result == None or len(result) == 0: if result == None or len(result) == 0:
logging.debug("chain " + chain + " does not correspond to a vm, cleaning up ebtable rules") 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 vmName = vm_name
domId = getvmId(vmName) domId = getvmId(vmName)
changes = [] changes = []
changes = check_rule_log_for_vm(vmName, vm_id, vm_ip, domId, signature, seqno) 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): def getVifs(vmName):
vifs = [] vifs = []
try: xmlfile = virshdumpxml(vmName)
xmlfile = virsh("dumpxml", vmName).stdout if xmlfile == None:
except:
return vifs return vifs
dom = xml.dom.minidom.parseString(xmlfile) dom = xml.dom.minidom.parseString(xmlfile)
@ -841,9 +896,8 @@ def getVifs(vmName):
def getVifsForBridge(vmName, brname): def getVifsForBridge(vmName, brname):
vifs = [] vifs = []
try: xmlfile = virshdumpxml(vmName)
xmlfile = virsh("dumpxml", vmName).stdout if xmlfile == None:
except:
return vifs return vifs
dom = xml.dom.minidom.parseString(xmlfile) dom = xml.dom.minidom.parseString(xmlfile)
@ -858,9 +912,8 @@ def getVifsForBridge(vmName, brname):
def getBridges(vmName): def getBridges(vmName):
bridges = [] bridges = []
try: xmlfile = virshdumpxml(vmName)
xmlfile = virsh("dumpxml", vmName).stdout if xmlfile == None:
except:
return bridges return bridges
dom = xml.dom.minidom.parseString(xmlfile) dom = xml.dom.minidom.parseString(xmlfile)
@ -871,8 +924,20 @@ def getBridges(vmName):
return list(set(bridges)) return list(set(bridges))
def getvmId(vmName): 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): def addFWFramework(brname):
try: try: