X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=sliver_vs.py;h=f93a4f057c6088ed30e1b23a32eb502692530ebf;hb=261dbf8d44fa2721bcad8855f292faec66433477;hp=1ada697ca3b2df2922605db409581a3e9dd3134e;hpb=114082fb689c7b39d66c1041df0256120321fca6;p=nodemanager.git diff --git a/sliver_vs.py b/sliver_vs.py index 1ada697..f93a4f0 100644 --- a/sliver_vs.py +++ b/sliver_vs.py @@ -18,6 +18,7 @@ don't have to guess if there is a running process or not. import errno import os +import time import vserver import accounts @@ -26,13 +27,18 @@ import tools class Sliver_VS(accounts.Account, vserver.VServer): - """This class wraps vserver.VServer to make its interface closer to what we need for the Node Manager.""" + """This class wraps vserver.VServer to make its interface closer to what we need.""" SHELL = '/bin/vsh' TYPE = 'sliver.VServer' def __init__(self, rec): - vserver.VServer.__init__(self, rec['name']) + try: + vserver.VServer.__init__(self, rec['name']) + except vserver.NoSuchVServer: + self.create(rec['name'], rec['type']) + vserver.VServer.__init__(self, rec['name']) + self.keys = '' self.rspec = {} self.initscript = '' @@ -40,7 +46,11 @@ class Sliver_VS(accounts.Account, vserver.VServer): self.configure(rec) @staticmethod - def create(name): logger.log_call('/usr/sbin/vuseradd', name) + def create(name, vref = None): + if vref is not None: + logger.log_call('/usr/sbin/vuseradd', '-t', vref, name) + else: + logger.log_call('/usr/sbin/vuseradd', name) @staticmethod def destroy(name): logger.log_call('/usr/sbin/vuserdel', name) @@ -65,13 +75,14 @@ class Sliver_VS(accounts.Account, vserver.VServer): accounts.Account.configure(self, rec) # install ssh keys - def start(self): + def start(self, delay=0): if self.rspec['enabled']: - logger.log('%s: starting' % self.name) + logger.log('%s: starting in %d seconds' % (self.name, delay)) child_pid = os.fork() if child_pid == 0: # VServer.start calls fork() internally, so just close the nonstandard fds and fork once to avoid creating zombies tools.close_nonstandard_fds() + time.sleep(delay) vserver.VServer.start(self, True) os._exit(0) else: os.waitpid(child_pid, 0) @@ -91,7 +102,9 @@ class Sliver_VS(accounts.Account, vserver.VServer): self.init_disk_info() self.disk_usage_initialized = True vserver.VServer.set_disklimit(self, disk_max) - except OSError: logger.log_exc() + except OSError: + logger.log('%s: failed to set max disk usage' % self.name) + logger.log_exc() net_limits = (self.rspec['net_min'], self.rspec['net_max'], self.rspec['net2_min'], self.rspec['net2_max'], self.rspec['net_share']) logger.log('%s: setting net limits to %s bps' % (self.name, net_limits[:-1])) @@ -101,7 +114,7 @@ class Sliver_VS(accounts.Account, vserver.VServer): cpu_min = self.rspec['cpu_min'] cpu_share = self.rspec['cpu_share'] if self.rspec['enabled']: - if cpu_min > 0: + if cpu_min >= 50: # at least 5%: keep people from shooting themselves in the foot logger.log('%s: setting cpu share to %d%% guaranteed' % (self.name, cpu_min/10.0)) self.set_sched_config(cpu_min, vserver.SCHED_CPU_GUARANTEED) else: