def run(self): import lease self.dbthr.postinit() for thr in [ self.svrthr, self.sslsvrthr, self.dbthr, self.httpsvrthr ]: thr.start() heartbeat = 0 gm = gmetric.gmetric() gaddr = self.conf.gangliaaddr gport = self.conf.gangliaport gheartbeat = self.conf.gangliaheartbeat nodemgr_tag = self.conf.nodemgr_tag leases_tag = self.conf.leases_tag slivers_tag = self.conf.slivers_tag while 1: now = time.asctime(time.gmtime()) leases = "" for leasedata in self.dbthr.getleases(): l = lease.lease(leasedata) leases = leases + " " + l.slice leases = leases.strip() slivers = "" for s in self.dbthr.getslivers(): slivers = slivers + " " + s slivers = slivers.strip() gm.sendsimple(gaddr, gport, nodemgr_tag, `heartbeat`, gheartbeat, gheartbeat) if leases != "": gm.send(gaddr, gport, leases_tag, leases, gheartbeat, gheartbeat, self.ip) if slivers != "": gm.send(gaddr, gport, slivers_tag, slivers, gheartbeat, gheartbeat, self.ip) time.sleep(gheartbeat) heartbeat += 1
def lookupsliver(self, slice): self.nodemgr.rlock.acquire() if slice in self.sliverdb.keys(): l = lease.lease(self.sliverdb[slice]) else: l = None self.nodemgr.rlock.release() return l
def getleases(self, args, flags): ip = args[0] principle = digest.sha1file(self.clientconf.pubkey) leasesdata = nodemgrproxy.nodemgrproxy(ip, nodemgr.PORT).getleases() for leasedata in leasesdata: l = lease.lease(leasedata) if re.match(principle, l.principle): print leasedata return 0
def cleanleases(self, dir, now): expiredleaseips = [] for ip in os.listdir(dir): f = open("%s/%s" % (dir, ip)) leasedata = f.read() f.close() l = lease.lease(leasedata) if calendar.timegm(now) > calendar.timegm(l.end): expiredleaseips.append(ip) self.deleteleases(dir, expiredleaseips)
def postinit(self): for slice in self.leasedb.keys(): leasedata = self.leasedb[slice] l = lease.lease(leasedata) expiration = calendar.timegm(time.strptime(l.end_time, "%Y-%m-%d %H:%M:%S")) sslsvr = self.nodemgr.sslsvrthr.server e = event.leaseexpevent(expiration, leasedata, sslsvr) self.events[leasedata] = e self.eventqueue.put(e) self.nodemgr.logfile.log("Adding a lease expiration for slice %s at %s" % (l.slice, expiration))
def _deleteleases(self, leasesdata): import lease try: self.nodemgr.rlock.acquire() for leasedata in leasesdata: l = lease.lease(leasedata) if self.nodemgr.dbthr.lookupsliver(l.slice): self.nodemgr.deletesliver(l.slice) self.dbthr.removesliver(l.slice) self.dbthr.removelease(leasedata) finally: self.nodemgr.rlock.release()
def removelease(self, leasedata): self.nodemgr.rlock.acquire() l = lease.lease(leasedata) if not l.slice in self.leasedb.keys(): self.nodemgr.rlock.release() return del self.leasedb[l.slice] self.leasedb.sync() del self.events[leasedata] self.nodemgr.rlock.release() self.nodemgr.logfile.log("Removed lease (%d seconds) for slice %s" % (l.leaselen, l.slice))
def expirations(self, args, flags): """Print expiration times for slivers in slice.""" slice = args[0] self.setdirs(slice) if not os.path.exists(self.vmsdir): sys.stderr.write("No slivers for slice %s\n" % slice) return ips = os.listdir(self.vmsdir) for ip in ips: leasefile = "%s/%s" % (self.vmsdir, ip) l = lease.lease(open(leasefile).read()) print "Sliver for slice %s expires %s UTC on %s" % (l.slice, l.end_time, ip) return 0
def newvm(self, principle, subject, args): import lease try: self.nodemgr.rlock.acquire() l = lease.lease(args[0]["leasedata"]) privatekey = args[0]["privatekey"] publickey = args[0]["publickey"] self.newvm_checkargs(principle, l) self.nodemgr.createsliver(l.slice, privatekey, publickey) self.nodemgr.dbthr.addsliver(l.slice, l.data, subject) finally: self.nodemgr.rlock.release() return 1
def postinit(self): for slice in self.leasedb.keys(): leasedata = self.leasedb[slice] l = lease.lease(leasedata) expiration = calendar.timegm( time.strptime(l.end_time, "%Y-%m-%d %H:%M:%S")) sslsvr = self.nodemgr.sslsvrthr.server e = event.leaseexpevent(expiration, leasedata, sslsvr) self.events[leasedata] = e self.eventqueue.put(e) self.nodemgr.logfile.log( "Adding a lease expiration for slice %s at %s" % (l.slice, expiration))
def addlease(self, leasedata, subject): self.nodemgr.rlock.acquire() l = lease.lease(leasedata) self.leasedb[l.slice] = leasedata self.leasedb.sync() expiration = calendar.timegm(time.strptime(l.end_time, "%Y-%m-%d %H:%M:%S")) sslsvr = self.nodemgr.sslsvrthr.server e = event.leaseexpevent(expiration, leasedata, sslsvr) self.events[leasedata] = e self.eventqueue.put(e) self.nodemgr.rlock.release() self.wakeup() self.nodemgr.logfile.log("Added lease (%d seconds) for slice %s for \"%s\"" % (l.leaselen, l.slice, subject))
def addlease(self, leasedata, subject): self.nodemgr.rlock.acquire() l = lease.lease(leasedata) self.leasedb[l.slice] = leasedata self.leasedb.sync() expiration = calendar.timegm( time.strptime(l.end_time, "%Y-%m-%d %H:%M:%S")) sslsvr = self.nodemgr.sslsvrthr.server e = event.leaseexpevent(expiration, leasedata, sslsvr) self.events[leasedata] = e self.eventqueue.put(e) self.nodemgr.rlock.release() self.wakeup() self.nodemgr.logfile.log( "Added lease (%d seconds) for slice %s for \"%s\"" % (l.leaselen, l.slice, subject))
def setleases(self): import lease self.doc.append(HTMLgen.Heading(3, "Leases")) self.doc.append(HTMLgen.P()) leasesdata = self.nodemgr.dbthr.getleases() if len(leasesdata) == 0: self.doc.append("No leases.") return table = HTMLgen.TableLite(border = "1", cellpadding = "2", cellspacing = "2") tr = HTMLgen.TR(HTMLgen.TD("Slice"), HTMLgen.TD("IP"), HTMLgen.TD("StartTime"), HTMLgen.TD("EndTime")) table.append(tr) for leasedata in leasesdata: t = lease.lease(leasedata) tr = HTMLgen.TR(HTMLgen.TD(t.slice), HTMLgen.TD(t.ip), HTMLgen.TD(t.start_time + " UTC"), HTMLgen.TD(t.end_time + " UTC")) table.append(tr) self.doc.append(table, HTMLgen.P())
def newvms(self, args, flags): """Create set of distributed VMs using leases on nodes.""" slice = args[0] self.setdirs(slice) leasefiles = args[1:] ips = [] inargs = {} outargs = {} privatekeyfile = "%s/identity" % self.slicekeypairdir publickeyfile = "%s/identity.pub" % self.slicekeypairdir privatekey = open(privatekeyfile).read() publickey = open(publickeyfile).read() for leasefile in leasefiles: leasedata = open(leasefile).read() l = lease.lease(leasedata) ips.append(l.ip) inargs[l.ip] = (leasedata, privatekey, publickey) rval = self.doparallel(ips, "newvm", inargs, outargs, flags) self.renameleases(self.leasesdir, self.vmsdir, outargs.keys()) return rval
def saveleases(self, leasesdata): for leasedata in leasesdata: l = lease.lease(leasedata) f = open("%s/%s" % (self.leasesdir, l.ip), "w") f.write(leasedata) f.close()