From 615a80362868fa7a181df29c25cf8ec1a99178b2 Mon Sep 17 00:00:00 2001 From: Xavi Leon Date: Thu, 8 Dec 2011 14:03:40 -0500 Subject: [PATCH] Cgroups common interface. Used by sliver_libvirt and coresched. --- cgroups.py | 75 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 cgroups.py diff --git a/cgroups.py b/cgroups.py new file mode 100644 index 0000000..cf6ca98 --- /dev/null +++ b/cgroups.py @@ -0,0 +1,75 @@ +# Simple wrapper arround cgroups so we don't have to worry the type of +# virtualization the sliver runs on (lxc, qemu/kvm, etc.) managed by libvirt +# +# Xavi Leon + +import os +import pyinotify +import logger + +# Base dir for libvirt +BASE_DIR = '/cgroup/libvirt/' +VIRT_TECHS = ['lxc'] + +# Global cgroup mapping. +CGROUPS = dict() + +class CgroupWatch(pyinotify.ProcessEvent): + + def process_IN_CREATE(self, event): + path = os.path.join(event.path, event.name) + CGROUPS[event.name] = path + logger.verbose("Cgroup Notify: Created cgroup %s on %s" % \ + (event.name, event.path)) + + def process_IN_DELETE(self, event): + try: + del CGROUPS[event.name] + except: + logger.verbose("Cgroup Notify: Cgroup %s does not exist, continuing..."%event.name) + logger.verbose("Cgroup Notify: Deleted cgroup %s on %s" % \ + (event.name, event.path)) + + +logger.verbose("Cgroups: Recognizing already existing cgroups...") +for virt in VIRT_TECHS: + filenames = os.listdir(os.path.join(BASE_DIR, virt)) + for filename in filenames: + path = os.path.join(BASE_DIR, virt, filename) + if os.path.isdir(path): + CGROUPS[filename] = path + +logger.verbose("Cgroups: Initializing watchers...") +wm = pyinotify.WatchManager() +notifier = pyinotify.ThreadedNotifier(wm, CgroupWatch()) +for virt in VIRT_TECHS: + wdd = wm.add_watch(os.path.join(BASE_DIR, virt), + pyinotify.IN_DELETE | pyinotify.IN_CREATE, + rec=False) +notifier.daemon = True +notifier.start() + +def get_cgroup_path(name): + """ Returns the base path for the cgroup with a specific name """ + assert CGROUPS.has_key(name), \ + "No sliver %s managed by libvirt through cgroup!" % name + return CGROUPS[name] + +def get_base_path(): + return BASE_DIR + +def get_cgroups(): + """ Returns the list of cgroups active at this moment on the node """ + return CGROUPS.keys() + +def write(name, key, value): + """ Writes a value to the file key with the cgroup with name """ + base_path = get_cgroup_path(name) + with open(os.path.join(base_path, key), 'w') as f: + print >>f, value + +def append(name, key, value): + """ Appends a value to the file key with the cgroup with name """ + base_path = get_cgroup_path(name) + with open(os.path.join(base_path, key), 'a') as f: + print >>f, value -- 2.43.0