summaryrefslogtreecommitdiffstats
path: root/Testcases/cfgm_common/dependency_tracker.py
diff options
context:
space:
mode:
authorStuart Mackie <wsmackie@juniper.net>2016-01-29 16:00:57 -0800
committerStuart Mackie <wsmackie@juniper.net>2016-01-29 16:00:57 -0800
commit82f1a7eb5535b30a95b1e71ff18c315d40d1e6f0 (patch)
treef930c90f75846ec8d8e33cf27325ff8fafc85d5c /Testcases/cfgm_common/dependency_tracker.py
parent5c04f2e22eb6b5e7a671bc02ba53a438eb66e90d (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.py50
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