From: Xavi Leon Date: Thu, 8 Dec 2011 19:04:39 +0000 (-0500) Subject: Cgroup common interface. Used by coresched.py and sliver_libvirt.py. X-Git-Tag: nodemanager-2.1-1~20 X-Git-Url: http://git.onelab.eu/?p=nodemanager.git;a=commitdiff_plain;h=5c7013aa253dc92ae430f6d07bcce71a009198ab Cgroup common interface. Used by coresched.py and sliver_libvirt.py. --- diff --git a/coresched.py b/coresched.py index 3954da9..3959e48 100644 --- a/coresched.py +++ b/coresched.py @@ -7,6 +7,7 @@ import logger import os +import cgroups glo_coresched_simulate = False @@ -40,8 +41,8 @@ class CoreSched: assert(filename!=None or name!=None) if filename==None: - filename="/dev/cgroup/" + name - + # filename="/dev/cgroup/" + name + filename=cgroups.get_base_path() + name data = open(filename).readline().strip() if not data: @@ -113,12 +114,13 @@ class CoreSched: this might change as vservers are instantiated, so always compute it dynamically. """ - cgroups = [] - filenames = os.listdir("/dev/cgroup") - for filename in filenames: - if os.path.isdir(os.path.join("/dev/cgroup", filename)): - cgroups.append(filename) - return cgroups + return cgroups.get_cgroups() + #cgroups = [] + #filenames = os.listdir("/dev/cgroup") + #for filename in filenames: + # if os.path.isdir(os.path.join("/dev/cgroup", filename)): + # cgroups.append(filename) + #return cgroups def decodeCoreSpec (self, cores): """ Decode the value of the core attribute. It's a number, followed by @@ -245,16 +247,18 @@ class CoreSched: if glo_coresched_simulate: print "R", "/dev/cgroup/" + cgroup + "/" + var_name, self.listToRange(cpus) else: - file("/dev/cgroup/" + cgroup + "/" + var_name, "w").write( self.listToRange(cpus) + "\n" ) + cgroups.write(cgroup, var_name, self.listToRange(cpus)) + #file("/dev/cgroup/" + cgroup + "/" + var_name, "w").write( self.listToRange(cpus) + "\n" ) def reserveDefault (self, var_name, cpus): - if not os.path.exists("/etc/vservers/.defaults/cgroup"): - os.makedirs("/etc/vservers/.defaults/cgroup") - - if glo_coresched_simulate: - print "RDEF", "/etc/vservers/.defaults/cgroup/" + var_name, self.listToRange(cpus) - else: - file("/etc/vservers/.defaults/cgroup/" + var_name, "w").write( self.listToRange(cpus) + "\n" ) + #if not os.path.exists("/etc/vservers/.defaults/cgroup"): + # os.makedirs("/etc/vservers/.defaults/cgroup") + + #if glo_coresched_simulate: + # print "RDEF", "/etc/vservers/.defaults/cgroup/" + var_name, self.listToRange(cpus) + #else: + # file("/etc/vservers/.defaults/cgroup/" + var_name, "w").write( self.listToRange(cpus) + "\n" ) + pass def listToRange (self, list): """ take a list of items [1,2,3,5,...] and return it as a range: "1-3,5" diff --git a/sliver_libvirt.py b/sliver_libvirt.py index 990695e..52c8bde 100644 --- a/sliver_libvirt.py +++ b/sliver_libvirt.py @@ -11,6 +11,7 @@ import libvirt import sys import shutil import bwlimit +import cgroups from string import Template @@ -24,9 +25,6 @@ STATES = { libvirt.VIR_DOMAIN_CRASHED: 'crashed', } -REF_IMG_BASE_DIR = '/vservers/.lvref' -CON_BASE_DIR = '/vservers' - connections = dict() # Helper methods @@ -117,9 +115,9 @@ class Sliver_Libvirt(accounts.Account): def configure(self, rec): #sliver.[LXC/QEMU] tolower case - sliver_type = rec['type'].split('.')[1].lower() + #sliver_type = rec['type'].split('.')[1].lower() - BASE_DIR = '/cgroup/libvirt/%s/%s/'%(sliver_type, self.name) + #BASE_DIR = '/cgroup/libvirt/%s/%s/'%(sliver_type, self.name) # Disk allocation # No way through cgroups... figure out how to do that with user/dir quotas. @@ -142,20 +140,17 @@ class Sliver_Libvirt(accounts.Account): # Memory allocation if rec.has_key('memlock_hard'): mem = rec['memlock_hard'] * 1024 # hard limit in bytes - with open(os.path.join(BASE_DIR, 'memory.limit_in_bytes'), 'w') as f: - print >>f, mem + cgroups.write(self.name, 'memory.limit_in_bytes', mem) if rec.has_key('memlock_soft'): mem = rec['memlock_soft'] * 1024 # soft limit in bytes - with open(os.path.join(BASE_DIR, 'memory.soft_limit_in_bytes'), 'w') as f: - print >>f, mem + cgroups.write(self.name, 'memory.soft_limit_in_bytes', mem) # CPU allocation # Only cpu_shares until figure out how to provide limits and guarantees # (RT_SCHED?) if rec.has_key('cpu_share'): cpu_share = rec['cpu_share'] - with open(os.path.join(BASE_DIR, 'cpu.shares'), 'w') as f: - print >>f, cpu_share + cgroups.write(self.name, 'cpu.shares', cpu_share) # Call the upper configure method (ssh keys...) accounts.Account.configure(self, rec) diff --git a/sliver_lxc.py b/sliver_lxc.py index 5a0d52f..4eb5229 100644 --- a/sliver_lxc.py +++ b/sliver_lxc.py @@ -56,8 +56,8 @@ class Sliver_LXC(lv.Sliver_Libvirt): # TODO: set quotas... # Set hostname. A valid hostname cannot have '_' - with open(os.path.join(containerDir, 'etc/hostname'), 'w') as f: - print >>f, name.replace('_', '-') + #with open(os.path.join(containerDir, 'etc/hostname'), 'w') as f: + # print >>f, name.replace('_', '-') # Add slices group if not already present command = ['/usr/sbin/groupadd', 'slices']