NodeManager plugin to support mapping unused raw disks into a slice
authorMarc Fiuczynski <mef@cs.princeton.edu>
Thu, 16 Jul 2009 21:23:14 +0000 (21:23 +0000)
committerMarc Fiuczynski <mef@cs.princeton.edu>
Thu, 16 Jul 2009 21:23:14 +0000 (21:23 +0000)
that has the rawdisk sliver tag.

plugins/rawdisk.py [new file with mode: 0644]

diff --git a/plugins/rawdisk.py b/plugins/rawdisk.py
new file mode 100644 (file)
index 0000000..f81ca26
--- /dev/null
@@ -0,0 +1,67 @@
+#!/usr/bin/python -tt
+# vim:set ts=4 sw=4 expandtab:
+# NodeManager plugin to support mapping unused raw disks into a slice
+# that has the rawdisk sliver tag
+
+"""
+Raw disk support for NodeManager.
+
+Copies all unused devices into slices with the rawdisk attribute set.
+"""
+
+import errno
+import os
+import time
+import re
+
+import logger
+import tools
+
+def start(options, config):
+    logger.log("rawdisk plugin starting up...")
+
+def get_unused_devices():
+    devices = []
+    if os.path.exists("/dev/mapper/planetlab-rawdisk"):
+        devices.append("/dev/mapper/planetlab-rawdisk")
+    # Figure out which partitions are part of the VG
+    in_vg = []
+    for i in os.listdir("/sys/block"):
+        if not i.startswith("dm-"):
+            continue
+        in_vg.extend(os.listdir("/sys/block/%s/slaves" % i))
+    # Read the list of partitions
+    partitions = file("/proc/partitions", "r")
+    pat = re.compile("\s+")
+    while True:
+        buf = partitions.readline()
+        if buf == "":
+            break
+        buf = buf.strip()
+        fields = re.split(pat, buf)
+        print fields
+        dev = fields[-1]
+        if not dev.startswith("dm-") and dev.endswith("1") and dev not in in_vg:
+            devices.append("/dev/%s" % dev)
+    partitions.close()
+    return devices
+
+def GetSlivers(plc, data, conf):
+    if 'slivers' not in data: 
+        logger.log("sliverauth: getslivers data lack's sliver information. IGNORING!")
+        return
+
+    devices = get_unused_devices()
+    for sliver in data['slivers']:
+        for attribute in sliver['attributes']:
+           name = attribute.get('tagname',attribute.get('name',''))
+            if name == 'rawdisk':
+                for i in devices:
+                    st = os.stat(i)
+                    path = "/vservers/%s%s" % (sliver['name'], i)
+                    logger.log("Copying %s to %s" % (i, path))
+                    try:
+                        os.unlink(path)
+                    except:
+                        pass
+                    os.mknod(path, st.st_mode, st.st_rdev)