1
2
3
4
5
6
7
8
9
10
11 import sys
12 import logging
13 logging.basicConfig()
14 root = logging.getLogger()
15 root.setLevel(logging.CRITICAL)
16
17 import Globals
18
19 from utils import importClass, importClasses
20 from Products.ZenRelations.Exceptions import ZenSchemaError
21
23 """
24 Lookup the schema definition for a relationship.
25 All base classes are checked until RelationshipManager is found.
26 """
27 for name, schema in cls._relations:
28 if name == relname: return schema
29 raise ZenSchemaError("Schema for relation %s not found on %s" %
30 (relname, cls.__name__))
31
32
34 """
35 Walk all relationship schema definitions and confirm that they
36 have reciprical peers on the remote class.
37 """
38 for relname, rel in cls._relations:
39 try:
40 remoteClass = importClass(rel.remoteClass, None)
41 except AttributeError, e:
42 logging.critical("RemoteClass '%s' from '%s.%s' not found",
43 rel.remoteClass, cls.__name__, relname)
44 continue
45 try:
46 rschema = lookupSchema(remoteClass, rel.remoteName)
47 except ZenSchemaError, e:
48 logging.critical("Inverse def '%s' for '%s.%s' not found on '%s'",
49 rel.remoteName, cls.__name__, relname,rel.remoteClass)
50 continue
51 except Exception, e:
52 logging.critical("RemoteClass '%s' for '%s.%s' problem.",
53 rel.remoteName, cls.__name__, relname)
54 logging.critical(e)
55 continue
56 try:
57 localClass = importClass(rschema.remoteClass, None)
58 except AttributeError, e:
59 logging.critical(e)
60 if not issubclass(cls, localClass):
61 logging.critical("Inverse def '%s' from '%s.%s' wrong "
62 "remoteClass: '%s'", rel.remoteName, cls.__name__,
63 relname,rschema.remoteClass)
64 if rschema.remoteName != relname:
65 logging.critical("Inverse def '%s' from '%s.%s' wrong "
66 "remoteName: '%s'", rel.remoteName, cls.__name__, relname,
67 rschema.remoteName)
68 if rel.remoteType != rschema.__class__:
69 logging.critical("'%s.%s' inverse '%s' type %s != %s",
70 cls.__name__, relname, rel.remoteName,
71 rschema.__class__.__name__, rel.remoteType.__name__)
72
73
74 baseModule = None
75 if len(sys.argv) > 1:
76 baseModule = sys.argv[1]
77
78 classList = importClasses(basemodule=baseModule,
79 skipnames=("ZentinelPortal", "ZDeviceLoader"))
80
81 for classdef in classList:
82 if hasattr(classdef, '_relations'):
83 logging.info("checking class %s...", classdef.__name__)
84 checkRelationshipSchema(classdef, baseModule)
85