Cgroups common interface. Used by sliver_libvirt and coresched.
authorXavi Leon <xleon@ac.upc.edu>
Thu, 8 Dec 2011 19:03:40 +0000 (14:03 -0500)
committerXavi Leon <xleon@ac.upc.edu>
Thu, 8 Dec 2011 19:03:40 +0000 (14:03 -0500)
cgroups.py [new file with mode: 0644]

diff --git a/cgroups.py b/cgroups.py
new file mode 100644 (file)
index 0000000..cf6ca98
--- /dev/null
@@ -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 <xleon@ac.upc.edu>
+
+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