blob: 9cde0ed6e58ad8af66311dc7e3585d8e3022763f [file] [log] [blame]
Sapan Bhatiad7425452013-09-03 11:45:15 -04001#!/usr/bin/python
2
3import os
4import pdb
5import sys
6import json
7
8sys.path.append('.')
9
Scott Baker2125dab2015-02-18 11:29:05 -080010os.environ.setdefault("DJANGO_SETTINGS_MODULE", "xos.settings")
Sapan Bhatiad7425452013-09-03 11:45:15 -040011
12from django.db.models.fields.related import ForeignKey
Sapan Bhatiad7425452013-09-03 11:45:15 -040013
Scott Bakerf731a622015-12-31 13:24:55 -080014# try to make sure we're running from the right place
15if (not os.path.exists("core")):
16 if (os.path.exists("../core")):
17 os.chdir("..")
18 else:
19 print >> sys.stderr, "Are you sure you're running dmdot from the root of an XOS installation"
20 sys.exit(-1)
21
Scott Bakerceb464b2014-04-03 11:03:11 -070022# defaults
Scott Baker16d4ac32016-06-13 11:48:41 -070023apps = ["core", "services.hpc", "services.requestrouter", "services.onos"]
Scott Bakerceb464b2014-04-03 11:03:11 -070024output = "-json"
Sapan Bhatiad7425452013-09-03 11:45:15 -040025
Scott Bakerceb464b2014-04-03 11:03:11 -070026# syntax: dmdot [-json | -dot] [app_name]
27
28# poor man's argument parser
29for arg in sys.argv[1:]:
30 if arg.startswith("-"):
31 output = arg
32 else:
Sapan Bhatia2e3d03b2015-10-21 17:03:33 +020033 apps+= [arg]
Scott Bakerceb464b2014-04-03 11:03:11 -070034
Sapan Bhatiad7425452013-09-03 11:45:15 -040035model_classes = []
36class_names = []
Scott Bakerceb464b2014-04-03 11:03:11 -070037lower_class_names = {}
Sapan Bhatia6f350ac2015-08-26 11:43:10 -040038synonyms = {
39 'user':'creator'
40}
41
42for app in apps:
43 app = app + ".models"
44 #models_module = imp.load_source(app, ".")
45 models_module = __import__(app)
46 for part in app.split(".")[1:]:
47 if hasattr(models_module, "PlCoreBase"):
48 break
49 models_module = getattr(models_module,part)
50
51 PlCoreBase = getattr(models_module,"PlCoreBase")
52
Sapan Bhatia6f350ac2015-08-26 11:43:10 -040053 for classname in dir(models_module):
54 c = getattr(models_module, classname, None)
55 if type(c)==type(PlCoreBase):
56 model_classes.append(c)
57 class_names.append(c.__name__)
58 lower_class_names[c.__name__.lower()] = c
59 try:
60 synonym = synonyms[c.__name__.lower()]
61 lower_class_names[synonym] = c
62 except:
63 pass
64
Sapan Bhatiad7425452013-09-03 11:45:15 -040065
Scott Bakerceb464b2014-04-03 11:03:11 -070066# django doesn't use the correct case in field.name.title() for objects that
67# have CamelCased class names. So, compare everything in lower case.
Sapan Bhatiad7425452013-09-03 11:45:15 -040068
69if (output=='-dot'):
Sapan Bhatia5ef878c2015-01-29 20:40:13 +000070 print "digraph plstack {";
71 for c in model_classes:
72 fields = c._meta.fields
73
74 for f in fields:
Sapan Bhatia6731db92015-09-02 11:49:51 -040075 if type(f)==ForeignKey and f.name.lower().split('_') in lower_class_names:
Scott Bakerceb464b2014-04-03 11:03:11 -070076 linked_class = lower_class_names[f.name.lower()]
Sapan Bhatia6731db92015-09-02 11:49:51 -040077 if ('backref' in f.name):
78 print '\t"%s"->"%s";'%(linked_class.__name__,c.__name__)
79 else:
80 print '\t"%s"->"%s";'%(c.__name__,linked_class.__name__)
Sapan Bhatia5ef878c2015-01-29 20:40:13 +000081 print "}\n";
Sapan Bhatiad7425452013-09-03 11:45:15 -040082elif (output=='-json'):
Sapan Bhatia5ef878c2015-01-29 20:40:13 +000083 d = {}
84 for c in model_classes:
85 fields = c._meta.fields
Sapan Bhatia6731db92015-09-02 11:49:51 -040086
Sapan Bhatia5ef878c2015-01-29 20:40:13 +000087 for f in fields:
Sapan Bhatia6731db92015-09-02 11:49:51 -040088 field_type = f.name.lower().split('_')[0]
89 if type(f)==ForeignKey and field_type in lower_class_names:
90 linked_class = lower_class_names[field_type]
91 if ('backref' in f.name.lower()):
92 a = linked_class.__name__
93 b = c.__name__
94 else:
95 b = linked_class.__name__
96 a = c.__name__
97
Sapan Bhatia5ef878c2015-01-29 20:40:13 +000098 try:
Sapan Bhatia6731db92015-09-02 11:49:51 -040099 if (b not in d[a]):
100 d[a].append(b)
Sapan Bhatia5ef878c2015-01-29 20:40:13 +0000101 except KeyError:
102 d[c.__name__]=[linked_class.__name__]
103 #d['ControllerNetwork'].append('SliceDeployments')
104 print json.dumps(d,indent=4)
105
106