This commit was manufactured by cvs2svn to create branch
[util-vserver.git] / python / cpulimit.py
diff --git a/python/cpulimit.py b/python/cpulimit.py
new file mode 100755 (executable)
index 0000000..708f092
--- /dev/null
@@ -0,0 +1,117 @@
+#!/usr/bin/python2 -u
+
+import sys, os, re, string
+
+
+TCBASE="/rcfs/taskclass/"
+RULES="/rcfs/ce/rules/"
+
+SYSCLASS=TCBASE + "system"
+SYSRULE=RULES + "system"
+SYSCPUSHARE=100
+DEFAULTMAXCPUSHARE=8192
+
+def checkckrm():
+    checks = [ "/rcfs", TCBASE, RULES ]
+
+    for check in checks:
+        try:
+            answer = os.stat(check)
+        except:
+            print "%s does not exist" % check
+            return False
+    
+    return True
+
+def checkclass(tc):
+    try:
+        answer = os.stat(TCBASE + tc)
+        return True
+
+    except:
+        print "%s class does not exist" % tc
+        return False
+
+def getxid(name):
+    xid = -1
+    fp = open('/etc/passwd')
+    for line in fp.readlines():
+        rec = string.splitfields(line,':')
+        if rec[0] == name:
+            xid = int(rec[2])
+            break
+
+    fp.close()
+    
+    if xid == -1:
+        # raise an exception
+        pass
+
+    return xid
+
+def write(filename,s):
+    fp = os.open(filename,os.O_WRONLY|os.O_CREAT)
+    os.write(fp,s)
+    os.close(fp)
+
+def vs2ckrm_on(tc):
+    xid = getxid(tc)
+
+    try:
+        os.mkdir(TCBASE + tc)
+    except OSError:
+        pass # ignore oserror for file exists
+    
+    s = "xid=%d,class=%s" % (xid,TCBASE+tc)
+    fname = RULES + tc
+    write(fname, s)
+
+def vs2ckrm_off(tc):
+    fname = TCBASE + tc + "/members"
+    for i in range(1,15):
+        fp = open(fname)
+        lines = fp.readlines()
+        try:
+            lines.remove("No data to display\n")
+        except ValueError:
+            pass
+        if len(lines) == 0:
+            try:
+                answer = os.stat(RULES + tc)
+                os.unlink(RULES + tc)
+                answer = os.stat(TCBASE + tc)                
+                os.rmdir(TCBASE + tc)
+            except:
+                pass
+            break
+
+        else:
+            print "enter context 1 and kill processes", lines
+        
+
+def cpulimit(tc,limit):
+    global TCBASE
+
+    fname = TCBASE + tc + "/shares"
+    s = "res=cpu,guarantee=%d\n" % limit
+    write(fname,s)
+
+def cpuinit():
+    global TCBASE
+
+    fname = TCBASE + "shares"
+    s = "res=cpu,total_guarantee=%d\n" % DEFAULTMAXCPUSHARE
+    write(fname,s)
+
+if __name__ == "__main__":
+    try:
+        name = sys.argv[1]
+        limit = int(sys.argv[2])
+    except:
+        print "caught exception"
+
+    if checkckrm() is True:
+        cpuinit()
+        vs2ckrm_on(name)
+        cpulimit(name,limit)
+        vs2ckrm_off(name)