Dependency walker to support dependency-oriented model policies
authorSapan Bhatia <sapanb@cs.princeton.edu>
Wed, 5 Nov 2014 04:57:19 +0000 (23:57 -0500)
committerSapan Bhatia <sapanb@cs.princeton.edu>
Wed, 5 Nov 2014 04:57:19 +0000 (23:57 -0500)
planetstack/dependency_walker.py [new file with mode: 0755]

diff --git a/planetstack/dependency_walker.py b/planetstack/dependency_walker.py
new file mode 100755 (executable)
index 0000000..a4e9dc8
--- /dev/null
@@ -0,0 +1,86 @@
+#!/usr/bin/python
+
+import os
+import imp
+from planetstack.config import Config
+import inspect
+import time
+import traceback
+import commands
+import threading
+import json
+import pdb
+from core.models import *
+
+missing_links={}
+
+try:
+       dep_data = open(Config().dependency_graph).read()
+except:
+       dep_data = open('/opt/planetstack/model-deps').read()
+
+dependencies = json.loads(dep_data)
+
+inv_dependencies = {}
+for k, lst in dependencies.items():
+       for v in lst:
+               try:
+                       inv_dependencies[v].append(k)
+               except KeyError:
+                       inv_dependencies[v]=[k]
+       
+
+def plural(name):
+       if (name.endswith('s')):
+               return name+'es'
+       else:
+               return name+'s'
+
+
+
+def walk_inv_deps(fn, object):
+       model = object.__class__.__name__
+       try:    
+               deps = inv_dependencies[model]
+       except:
+               deps = []
+
+       for dep in deps:
+               #print "Checking dep %s"%dep
+               peer=None
+               link = dep.lower()
+               try:
+                       peer = getattr(object, link)
+               except AttributeError:
+                       link = plural(link)
+                       try:
+                               peer = getattr(object, link)
+                       except AttributeError:
+                               if not missing_links.has_key(model+'.'+link):
+                                       print "Model %s missing link for dependency %s"%(model, link)
+                                       missing_links[model+'.'+link]=True
+
+               if (peer):
+                       try:
+                               peer_objects = peer.all()
+                       except:
+                               peer_objects = [peer]
+
+                       for o in peer_objects:
+                               fn(o, object)
+                               # walk_inv_deps(fn, o)
+
+def p(x):
+       print x,x.__class__.__name__
+       return
+
+def main():
+       #pdb.set_trace()
+       import django
+       django.setup()
+       s = Site.objects.filter(login_base='onlab')
+       #pdb.set_trace()
+       walk_inv_deps(p,s[0])
+       
+if __name__=='__main__':
+       main()