diff options
author | Stuart Mackie <wsmackie@juniper.net> | 2016-01-29 16:00:57 -0800 |
---|---|---|
committer | Stuart Mackie <wsmackie@juniper.net> | 2016-01-29 16:00:57 -0800 |
commit | 82f1a7eb5535b30a95b1e71ff18c315d40d1e6f0 (patch) | |
tree | f930c90f75846ec8d8e33cf27325ff8fafc85d5c /Testcases/cfgm_common/dependency_tracker.py | |
parent | 5c04f2e22eb6b5e7a671bc02ba53a438eb66e90d (diff) |
OpenContrail test suitestable/colorado
Change-Id: I61168093a2a05d47377ef47c8638ae1554b1a999
Signed-off-by: Stuart Mackie <wsmackie@juniper.net>
Diffstat (limited to 'Testcases/cfgm_common/dependency_tracker.py')
-rw-r--r-- | Testcases/cfgm_common/dependency_tracker.py | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/Testcases/cfgm_common/dependency_tracker.py b/Testcases/cfgm_common/dependency_tracker.py new file mode 100644 index 0000000..dafc4f9 --- /dev/null +++ b/Testcases/cfgm_common/dependency_tracker.py @@ -0,0 +1,50 @@ +# +# Copyright (c) 2014 Juniper Networks, Inc. All rights reserved. +# + +""" +This file contains implementation of dependency tracker +for physical router configuration manager +""" + + +class DependencyTracker(object): + + def __init__(self, object_class_map, reaction_map): + self._reaction_map = reaction_map + self._object_class_map = object_class_map + self.resources = {} + # end __init__ + + def _add_resource(self, obj_type, obj_uuid): + if obj_type in self.resources: + if obj_uuid in self.resources[obj_type]: + # already visited + return False + self.resources[obj_type].append(obj_uuid) + else: + self.resources[obj_type] = [obj_uuid] + return True + # end _add_resource + + def evaluate(self, obj_type, obj, from_type='self'): + if obj_type not in self._reaction_map: + return + if not self._add_resource(obj_type, obj.uuid): + return + + for ref_type in self._reaction_map[obj_type][from_type]: + ref = getattr(obj, ref_type, None) + if ref is None: + refs = getattr(obj, ref_type+'s', []) + else: + refs = [ref] + + ref_class = self._object_class_map[ref_type] + for ref in refs: + ref_obj = ref_class.get(ref) + if ref_obj is None: + return + self.evaluate(ref_type, ref_obj, obj_type) + # end evaluate +# end DependencyTracker |