From 7c171e74c36fddbc4b2bc2a178d5123ea987bb1b Mon Sep 17 00:00:00 2001 From: Daniel Hokka Zakrisson Date: Fri, 13 Jul 2007 15:20:45 +0000 Subject: [PATCH] get rid of update_resources, simply use self.config directly --- python/vserver.py | 80 +++++++++++++++++++---------------------------- 1 file changed, 32 insertions(+), 48 deletions(-) diff --git a/python/vserver.py b/python/vserver.py index a352427..be76a50 100644 --- a/python/vserver.py +++ b/python/vserver.py @@ -64,26 +64,13 @@ class NoSuchVServer(Exception): pass class VServerConfig: - mapping = { - 'S_CONTEXT': 'context', - 'VS_WHITELISTED': 'whitelisted', - 'CPULIMIT': 'sched/fill-rate2', - 'CPUGUARANTEED': 'sched/fill-rate', - 'VS_DISK_MAX': 'dlimits/0/space_total', - } - def __init__(self, name, directory): - global RLIMITS - for i in RLIMITS.keys(): - for j in ('HARD', 'SOFT', 'MINIMUM'): - self.mapping['VS_%s_%s' % (i, j)] = 'rlimits/%s.%s' % (i.lower(), j.replace('MINIMUM', 'min').lower()) self.name = name self.dir = directory def get(self, option, default = None): try: - filename = self.mapping[option] - f = open(os.path.join(self.dir, filename), "r") + f = open(os.path.join(self.dir, option), "r") buf = f.readline().rstrip() f.close() return buf @@ -96,21 +83,23 @@ class VServerConfig: else: raise KeyError, "Key %s is not set for %s" % (option, self.name) - def update(self, vars): - for (option, value) in vars.iteritems(): + def update(self, option, value): + try: + old_umask = os.umask(0022) + filename = os.path.join(self.dir, option) try: - old_umask = os.umask(0022) - filename = os.path.join(self.dir, self.mapping[option]) - try: - os.makedirs(os.path.dirname(filename), 0755) - except: - pass - f = open(filename, 'w') + os.makedirs(os.path.dirname(filename), 0755) + except: + pass + f = open(filename, 'w') + if isinstance(value, list): + f.write("%s\n" % "\n".join(value)) + else: f.write("%s\n" % value) - f.close() - os.umask(old_umask) - except KeyError, e: - raise KeyError, "Don't know how to handle %s, sorry" % option + f.close() + os.umask(old_umask) + except KeyError, e: + raise KeyError, "Don't know how to handle %s, sorry" % option class VServer: @@ -129,7 +118,7 @@ class VServer: self.config = VServerConfig(name, "/etc/vservers/%s" % name) self.remove_caps = ~vserverimpl.CAP_SAFE; if vm_id == None: - vm_id = int(self.config.get('S_CONTEXT')) + vm_id = int(self.config.get('context')) self.ctx = vm_id if vm_running == None: vm_running = self.is_running() @@ -159,15 +148,12 @@ class VServer: def set_rlimit_config(self,type,hard,soft,minimum): """Generic set resource limit function for vserver""" - resources = {} if hard <> VC_LIM_KEEP: - resources["VS_%s_HARD"%type] = hard + self.config.update('rlimits/%s.hard' % type.lower(), hard) if soft <> VC_LIM_KEEP: - resources["VS_%s_SOFT"%type] = soft + self.config.update('rlimits/%s.soft' % type.lower(), soft) if minimum <> VC_LIM_KEEP: - resources["VS_%s_MINIMUM"%type] = minimum - if len(resources)>0: - self.update_resources(resources) + self.config.update('rlimits/%s.min' % type.lower(), minimum) self.set_rlimit_limit(type,hard,soft,minimum) def get_rlimit_limit(self,type): @@ -183,14 +169,13 @@ class VServer: def get_rlimit_config(self,type): """Generic get resource configuration function for vserver""" - hard = int(self.config.get("VS_%s_HARD"%type,VC_LIM_KEEP)) - soft = int(self.config.get("VS_%s_SOFT"%type,VC_LIM_KEEP)) - minimum = int(self.config.get("VS_%s_MINIMUM"%type,VC_LIM_KEEP)) + hard = int(self.config.get("rlimits/%s.hard"%type.lower(),VC_LIM_KEEP)) + soft = int(self.config.get("rlimits/%s.soft"%type.lower(),VC_LIM_KEEP)) + minimum = int(self.config.get("rlimits/%s.min"%type.lower(),VC_LIM_KEEP)) return (hard,soft,minimum) def set_WHITELISTED_config(self,whitelisted): - resources = {'VS_WHITELISTED': whitelisted} - self.update_resources(resources) + self.config.update('whitelisted', whitelisted) def __do_chroot(self): @@ -244,8 +229,7 @@ class VServer: print "Unexpected error with setdlimit for context %d" % self.ctx - resources = {'VS_DISK_MAX': block_limit} - self.update_resources(resources) + self.config.update('dlimits/0/space_total', block_limit) def is_running(self): return vserverimpl.isrunning(self.ctx) @@ -269,9 +253,13 @@ class VServer: configuration file. This method does not modify the kernel CPU scheduling parameters for this context. """ - cpu_guaranteed = sched_flags & SCHED_CPU_GUARANTEED - cpu_config = { "CPULIMIT": cpu_share, "CPUGUARANTEED": cpu_guaranteed } - self.update_resources(cpu_config) + if sched_flags & SCHED_CPU_GUARANTEED: + cpu_guaranteed = cpu_share + else: + cpu_guaranteed = 0 + self.config.update('sched/fill-rate2', cpu_share) + self.config.update('sched/fill-rate', cpu_guaranteed) + if self.vm_running: self.set_sched(cpu_share, sched_flags) @@ -417,10 +405,6 @@ class VServer: pass - def update_resources(self, resources): - - self.config.update(resources) - def init_disk_info(self): cmd = "/usr/sbin/vdu --script --space --inodes --blocksize 1024 --xid %d %s" % (self.ctx, self.dir) (child_stdin, child_stdout, child_stderr) = os.popen3(cmd) -- 2.43.0