- def do_netrefs(self, fail_if_undefined = False):
- COMPONENT_GETTERS = {
- 'addr':
- lambda testbed, guid, index, name:
- testbed.get_address(guid, index, name),
- 'route' :
- lambda testbed, guid, index, name:
- testbed.get_route(guid, index, name),
- 'trace' :
- lambda testbed, guid, index, name:
- testbed.trace(guid, index, name),
- '' :
- lambda testbed, guid, index, name:
- testbed.get(guid, name),
- }
-
+ _NETREF_COMPONENT_GETTERS = {
+ 'addr':
+ lambda testbed, guid, index, name:
+ testbed.get_address(guid, index, name),
+ 'route' :
+ lambda testbed, guid, index, name:
+ testbed.get_route(guid, index, name),
+ 'trace' :
+ lambda testbed, guid, index, name:
+ testbed.trace(guid, index, name),
+ '' :
+ lambda testbed, guid, index, name:
+ testbed.get(guid, name),
+ }
+
+ def resolve_netref_value(self, value):
+ match = ATTRIBUTE_PATTERN_BASE.search(value)
+ if match:
+ label = match.group("label")
+ if label.startswith('GUID-'):
+ ref_guid = int(label[5:])
+ if ref_guid:
+ expr = match.group("expr")
+ component = match.group("component")[1:] # skip the dot
+ attribute = match.group("attribute")
+
+ # split compound components into component kind and index
+ # eg: 'addr[0]' -> ('addr', '0')
+ component, component_index = self._netref_component_split(component)
+
+ # find object and resolve expression
+ for ref_testbed in self._testbeds.itervalues():
+ if component not in self._NETREF_COMPONENT_GETTERS:
+ raise ValueError, "Malformed netref: %r - unknown component" % (expr,)
+ else:
+ ref_value = self._NETREF_COMPONENT_GETTERS[component](
+ ref_testbed, ref_guid, component_index, attribute)
+ if ref_value:
+ return value.replace(match.group(), ref_value)
+ # couldn't find value
+ return None
+
+ def do_netrefs(self, data, fail_if_undefined = False):
+ # element netrefs