X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=sliver_libvirt.py;h=f62c1a7a9e0d4d1144091d559833a0a5d2410613;hb=430195a2b1382182d28dbcd16b21864ed758f52d;hp=a70d18f11cab4d23c616061c4a42b639320f147f;hpb=9e596e6eb3c871ab25837903b0ed30f165d9d688;p=nodemanager.git diff --git a/sliver_libvirt.py b/sliver_libvirt.py index a70d18f..f62c1a7 100644 --- a/sliver_libvirt.py +++ b/sliver_libvirt.py @@ -41,11 +41,33 @@ class Sliver_Libvirt(Account): @staticmethod def getConnection(sliver_type): - # TODO: error checking - # vtype is of the form sliver.[LXC/QEMU] we need to lower case to lxc/qemu + """ + returns a connection to the underlying libvirt service + a single connection is created and shared among slivers + this call ensures the connection is alive + and will reconnect if it appears to be necessary + """ + # sliver_type comes from rec['type'] and is of the form sliver.{LXC,QEMU} + # so we need to lower case to lxc/qemu vtype = sliver_type.split('.')[1].lower() - uri = vtype + '://' - return connections.setdefault(uri, libvirt.open(uri)) + uri = vtype + ':///' + if uri not in connections: + # create connection + conn = libvirt.open(uri) + connections[uri] = conn + return conn + else: + # connection already available : check for health + conn = connections[uri] + # see if a reconnection is needed + try: + numDomains = conn.numOfDomains() + except: + logger.log("libvirt connection to {} looks broken - reconnecting".format(uri)) + conn = libvirt.open(uri) + # if this fails then an expection is thrown outside of this function + numDomains = conn.numOfDomains() + return conn def __init__(self, rec): self.name = rec['name']