summaryrefslogtreecommitdiffstats
path: root/src/pdmgen.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/pdmgen.py')
-rwxr-xr-xsrc/pdmgen.py190
1 files changed, 189 insertions, 1 deletions
diff --git a/src/pdmgen.py b/src/pdmgen.py
index 48d4589..c4184fc 100755
--- a/src/pdmgen.py
+++ b/src/pdmgen.py
@@ -354,6 +354,17 @@ class Instance(ConfigEntry):
super(Instance, self).setup(objs)
+class PathInstance(ConfigEntry):
+ '''Path association.'''
+
+ def __init__(self, *a, **kw):
+ super(PathInstance, self).__init__(**kw)
+
+ def setup(self, objs):
+ '''Resolve elements to indices.'''
+ self.path = self.name['path']['path']
+ self.pathmeta = self.name['path']['meta']
+ super(PathInstance, self).setup(objs)
class Group(ConfigEntry):
'''Pop the members keyword for groups.'''
@@ -468,6 +479,27 @@ class GroupOfInstances(ImplicitGroup):
super(GroupOfInstances, self).setup(objs)
+class GroupOfPathInstances(ImplicitGroup):
+ '''A group of path instances.'''
+
+ def __init__(self, *a, **kw):
+ super(GroupOfPathInstances, self).__init__(**kw)
+
+ def setup(self, objs):
+ '''Resolve group members.'''
+
+ def map_member(x):
+ path = get_index(objs, 'pathname', x['path']['path'])
+ pathmeta = get_index(objs, 'meta', x['path']['meta'])
+ pathinstance = get_index(objs, 'pathinstance', x)
+ return (path, pathmeta, pathinstance)
+
+ self.members = map(
+ map_member,
+ self.members)
+
+ super(GroupOfPathInstances, self).setup(objs)
+
class HasPropertyIndex(ConfigEntry):
'''Handle config file directives that require an index to be
@@ -531,6 +563,54 @@ class HasPropertyIndex(ConfigEntry):
super(HasPropertyIndex, self).setup(objs)
+class HasPathIndex(ConfigEntry):
+ '''Handle config file directives that require an index to be
+ constructed.'''
+
+ def __init__(self, *a, **kw):
+ self.paths = kw.pop('paths')
+ super(HasPathIndex, self).__init__(**kw)
+
+ def factory(self, objs):
+ '''Create a group of instances for this index.'''
+
+ members = []
+ path_group = get_index(
+ objs, 'pathgroup', self.paths, config=self.configfile)
+
+ for path in objs['pathgroup'][path_group].members:
+ member = {
+ 'path': path,
+ }
+ members.append(member)
+
+ args = {
+ 'members': members,
+ 'class': 'pathinstancegroup',
+ 'pathinstancegroup': 'pathinstance',
+ 'name': '{0}'.format(self.paths)
+ }
+
+ group = GroupOfPathInstances(configfile=self.configfile, **args)
+ add_unique(group, objs, config=self.configfile)
+ group.factory(objs)
+
+ super(HasPathIndex, self).factory(objs)
+
+ def setup(self, objs):
+ '''Resolve path and instance groups.'''
+
+ self.pathinstances = get_index(
+ objs,
+ 'pathinstancegroup',
+ '{0}'.format(self.paths),
+ config=self.configfile)
+ self.paths = get_index(
+ objs,
+ 'pathgroup',
+ self.paths,
+ config=self.configfile)
+ super(HasPathIndex, self).setup(objs)
class PropertyWatch(HasPropertyIndex):
'''Handle the property watch config file directive.'''
@@ -551,6 +631,23 @@ class PropertyWatch(HasPropertyIndex):
super(PropertyWatch, self).setup(objs)
+class PathWatch(HasPathIndex):
+ '''Handle the path watch config file directive.'''
+
+ def __init__(self, *a, **kw):
+ self.pathcallback = kw.pop('pathcallback', None)
+ super(PathWatch, self).__init__(**kw)
+
+ def setup(self, objs):
+ '''Resolve optional callback.'''
+ if self.pathcallback:
+ self.pathcallback = get_index(
+ objs,
+ 'pathcallback',
+ self.pathcallback,
+ config=self.configfile)
+ super(PathWatch, self).setup(objs)
+
class Callback(HasPropertyIndex):
'''Interface and common logic for callbacks.'''
@@ -558,6 +655,11 @@ class Callback(HasPropertyIndex):
def __init__(self, *a, **kw):
super(Callback, self).__init__(**kw)
+class PathCallback(HasPathIndex):
+ '''Interface and common logic for callbacks.'''
+
+ def __init__(self, *a, **kw):
+ super(PathCallback, self).__init__(**kw)
class ConditionCallback(ConfigEntry, Renderer):
'''Handle the journal callback config file directive.'''
@@ -718,6 +820,19 @@ class Event(Callback, Renderer):
c=self,
indent=indent)
+class EventPath(PathCallback, Renderer):
+ '''Handle the event path callback config file directive.'''
+
+ def __init__(self, *a, **kw):
+ self.eventType = kw.pop('eventType')
+ super(EventPath, self).__init__(**kw)
+
+ def construct(self, loader, indent):
+ return self.render(
+ loader,
+ 'eventpath.mako.cpp',
+ c=self,
+ indent=indent)
class ElogWithMetadata(Callback, Renderer):
'''Handle the elog_with_metadata callback config file directive.'''
@@ -854,6 +969,24 @@ class CallbackGraphEntry(Group):
super(CallbackGraphEntry, self).setup(objs)
+class PathCallbackGraphEntry(Group):
+ '''An entry in a traversal list for groups of callbacks.'''
+
+ def __init__(self, *a, **kw):
+ super(PathCallbackGraphEntry, self).__init__(**kw)
+
+ def setup(self, objs):
+ '''Resolve group members.'''
+
+ def map_member(x):
+ return get_index(
+ objs, 'pathcallback', x, config=self.configfile)
+
+ self.members = map(
+ map_member,
+ self.members)
+
+ super(PathCallbackGraphEntry, self).setup(objs)
class GroupOfCallbacks(ConfigEntry, Renderer):
'''Handle the callback group config file directive.'''
@@ -893,6 +1026,42 @@ class GroupOfCallbacks(ConfigEntry, Renderer):
c=self,
indent=indent)
+class GroupOfPathCallbacks(ConfigEntry, Renderer):
+ '''Handle the callback group config file directive.'''
+
+ def __init__(self, *a, **kw):
+ self.members = kw.pop('members')
+ super(GroupOfPathCallbacks, self).__init__(**kw)
+
+ def factory(self, objs):
+ '''Create a graph instance for this group of callbacks.'''
+
+ args = {
+ 'configfile': self.configfile,
+ 'members': self.members,
+ 'class': 'pathcallbackgroup',
+ 'pathcallbackgroup': 'pathcallback',
+ 'name': self.members
+ }
+
+ entry = PathCallbackGraphEntry(**args)
+ add_unique(entry, objs, config=self.configfile)
+ super(GroupOfPathCallbacks, self).factory(objs)
+
+ def setup(self, objs):
+ '''Resolve graph entry.'''
+
+ self.graph = get_index(
+ objs, 'callbackpathgroup', self.members, config=self.configfile)
+
+ super(GroupOfPathCallbacks, self).setup(objs)
+
+ def construct(self, loader, indent):
+ return self.render(
+ loader,
+ 'callbackpathgroup.mako.cpp',
+ c=self,
+ indent=indent)
class Everything(Renderer):
'''Parse/render entry point.'''
@@ -901,7 +1070,6 @@ class Everything(Renderer):
def classmap(cls, sub=None):
'''Map render item class and subclass entries to the appropriate
handler methods.'''
-
class_map = {
'path': {
'element': Path,
@@ -918,9 +1086,15 @@ class Everything(Renderer):
'watch': {
'property': PropertyWatch,
},
+ 'pathwatch': {
+ 'path': PathWatch,
+ },
'instance': {
'element': Instance,
},
+ 'pathinstance': {
+ 'element': PathInstance,
+ },
'callback': {
'journal': Journal,
'elog': Elog,
@@ -930,6 +1104,10 @@ class Everything(Renderer):
'method': Method,
'resolve callout': ResolveCallout,
},
+ 'pathcallback': {
+ 'eventpath': EventPath,
+ 'grouppath': GroupOfPathCallbacks,
+ },
'condition': {
'count': CountCondition,
},
@@ -1020,10 +1198,15 @@ class Everything(Renderer):
self.propertynames = kw.pop('propertyname', [])
self.propertygroups = kw.pop('propertygroup', [])
self.instances = kw.pop('instance', [])
+ self.pathinstances = kw.pop('pathinstance', [])
self.instancegroups = kw.pop('instancegroup', [])
+ self.pathinstancegroups = kw.pop('pathinstancegroup', [])
self.watches = kw.pop('watch', [])
+ self.pathwatches = kw.pop('pathwatch', [])
self.callbacks = kw.pop('callback', [])
+ self.pathcallbacks = kw.pop('pathcallback', [])
self.callbackgroups = kw.pop('callbackgroup', [])
+ self.pathcallbackgroups = kw.pop('pathcallbackgroup', [])
self.conditions = kw.pop('condition', [])
super(Everything, self).__init__(**kw)
@@ -1047,10 +1230,15 @@ class Everything(Renderer):
pathgroups=self.pathgroups,
propertygroups=self.propertygroups,
instances=self.instances,
+ pathinstances=self.pathinstances,
watches=self.watches,
+ pathwatches=self.pathwatches,
instancegroups=self.instancegroups,
+ pathinstancegroups=self.pathinstancegroups,
callbacks=self.callbacks,
+ pathcallbacks=self.pathcallbacks,
callbackgroups=self.callbackgroups,
+ pathcallbackgroups=self.pathcallbackgroups,
conditions=self.conditions,
indent=Indent()))
OpenPOWER on IntegriCloud