def handle_error(self): try: msglog.warn("%s handling error. Please check whether the peer is up and supports the %s protocol" % (self, self.protocol)) msglog.exception(prefix="handled") msglog.inform("%s closing due to error." % self) finally: self.close()
def _evaluate(self, value_map): try: answer = eval(self.compiled_statement, globals(), value_map) except: msglog.warn("%s evaluate failed with inputs: %r." % (self, value_map)) raise return answer
def add_target(self, target): if not isinstance(target, str): targeturl = as_node_url(target) else: targeturl = target try: target = self.nodespace.as_node(targeturl) except KeyError: target = None if targeturl == "/": raise ValueError("Invalid trigger target: %r" % target) self.synclock.acquire() try: if targeturl not in self.targets: self.targets.add(targeturl) if target: self.targetmap[targeturl] = target else: message = "Trigger %r added unresolvable target: %r" msglog.warn(message % (self.name, targeturl)) added = True else: added = False message = "Trigger %r not adding target %r: already exists." msglog.warn(message % (self.name, targeturl)) finally: self.synclock.release() return added
def get_targets(self, unresolved=False): #get targets targets = [] for targeturl in self.targets: target = self.targetmap.get(targeturl) if target and not target.parent: message = "Trigger %s resetting pruned target: %r." msglog.warn(message % (self.name, targeturl)) self.targetmap.pop(targeturl) target = None if not target: try: target = self.nodespace.as_node(targeturl) except KeyError: if targeturl not in self.unresolvable: message = "Trigger %s Unable to resolve target: %r." msglog.warn(message % (self.name, targeturl)) self.unresolvable.add(targeturl) else: self.targetmap[targeturl] = target self.unresolvable.discard(targeturl) if target: targets.append(target) elif unresolved: targets.append(targeturl) return targets
def add_target(self, target): if not isinstance(target, str): targeturl = as_node_url(target) else: targeturl = target try: target = self.nodespace.as_node(targeturl) except KeyError: target = None if targeturl == "/": raise ValueError("Invalid trigger target: %r" % target) self.synclock.acquire() try: if targeturl not in self.targets: self.targets.add(targeturl) if target: self.targetmap[targeturl] = target else: message = "Trigger %r added unresolvable target: %r" msglog.warn(message % (self.name, targeturl)) added = True else: added = False message = "Trigger %r not adding target %r: already exists." msglog.warn(message % (self.name, targeturl)) finally: self.synclock.release() return added
def get_targets(self, unresolved=False): #get targets targets = [] for targeturl in self.targets: target = self.targetmap.get(targeturl) if target and not target.parent: message = "Trigger %s resetting pruned target: %r." msglog.warn(message % (self.name, targeturl)) self.targetmap.pop(targeturl) target = None if not target: try: target = self.nodespace.as_node(targeturl) except KeyError: if targeturl not in self.unresolvable: message = "Trigger %s Unable to resolve target: %r." msglog.warn(message % (self.name, targeturl)) self.unresolvable.add(targeturl) else: self.targetmap[targeturl] = target self.unresolvable.discard(targeturl) if target: targets.append(target) elif unresolved: targets.append(targeturl) return targets
def _evaluate(self, value_map): try: answer = eval(self.compiled_statement, globals(), value_map) except: msglog.warn("%s evaluate failed with inputs: %r." % (self, value_map)) raise return answer
def __getattr__(self, name): self.log_debug("__getattr__(%r)", name) if self.ssl: try: attribute = getattr(self.ssl, name) except AttributeError: msglog.warn("Failed attribute lookup: %r." % name) else: return attribute return HTTPChannel.__getattr__(self, name)
def parent(self): path = self.as_remote_path() if path == "/": return self.host elif path.endswith("/"): msglog.warn("Path ends with '/': %r" % path) path = path[0: -1] head,sep,tail = path.rpartition("/") ppath = head if head else "/" return self.host.as_remote_node(ppath)
def setup_context(self): running = self.inputs.is_running() if running: self.inputs.stop() for child in self.inputs.children_nodes(): msglog.warn("Pruning input child: %s." % child) child.prune() context = super(CachingCalculator, self).setup_context() if running: self.inputs.start() return context
def setup_context(self): running = self.inputs.is_running() if running: self.inputs.stop() for child in self.inputs.children_nodes(): msglog.warn("Pruning input child: %s." % child) child.prune() context = super(CachingCalculator, self).setup_context() if running: self.inputs.start() return context
def decode(self, data): state = cPickle.loads(data) decoder = IPickles(state) try: obj = decoder(True) except: message = "Decoder %s failed to decode state: %r." msglog.warn(message % (decoder, state)) msglog.exception() raise return obj
def clear(self, source, *args, **kw): result = self._source_clear(source, *args, **kw) if not isinstance(source, str): source = as_node_url(source) for target in self.get_targets(): try: target.clear(source, *args, **kw) except: message = "%s failed to clear target: %s." msglog.warn(message % (self, target)) msglog.exception(prefix="handled") return result
def _terminate_events(self, events, reason): for event in events: try: event.terminate("Alarm %r" % self.name, reason) except: message = "Failed to terminate: %s." msglog.warn("Failed to terminate: %s." % event) msglog.exception(prefix="handled") else: message = "Alarm %r terminated event %s: %s." msglog.inform(message % (self.name, event, reason)) return events
def clear(self, source, *args, **kw): result = self._source_clear(source, *args, **kw) if not isinstance(source, str): source = as_node_url(source) for target in self.get_targets(): try: target.clear(source, *args, **kw) except: message = "%s failed to clear target: %s." msglog.warn(message % (self, target)) msglog.exception(prefix="handled") return result
def register_session(self, session): try: fd = session.socket.fileno() host,port = session.socket.getpeername() except: msglog.warn("Failed to add session: %r" % session) msglog.exception(prefix="handled") registered = False else: self.hosts[fd] = host self.sessions[fd] = session self.connections.setdefault(host, set()).add(fd) self.descriptors.add(fd) self.notify_poll() registered = True return registered
def register_session(self, session): try: fd = session.socket.fileno() host, port = session.socket.getpeername() except: msglog.warn("Failed to add session: %r" % session) msglog.exception(prefix="handled") registered = False else: self.hosts[fd] = host self.sessions[fd] = session self.connections.setdefault(host, set()).add(fd) self.descriptors.add(fd) self.notify_poll() registered = True return registered
def find_targets(self, extended=True): managers = [self._as_node("/services/Alarm Manager")] if extended: try: remote_managers = self._as_node("/services/Alarm Managers") except KeyError: msglog.warn("No Alarm Managers container defined.") else: managers.extend(remote_managers.children_nodes()) targets = [] for manager in managers: try: targets.extend(manager.children_nodes()) except: msglog.warn("Unable to get targets from: %s." % manager) msglog.exception(prefix="handled") return map(as_node_url, targets)
def find_targets(self, extended=True): managers = [self._as_node("/services/Alarm Manager")] if extended: try: remote_managers = self._as_node("/services/Alarm Managers") except KeyError: msglog.warn("No Alarm Managers container defined.") else: managers.extend(remote_managers.children_nodes()) targets = [] for manager in managers: try: targets.extend(manager.children_nodes()) except: msglog.warn("Unable to get targets from: %s." % manager) msglog.exception(prefix="handled") return map(as_node_url, targets)
def __exit__(self, type, error, traceback): """ Catch ERNATimeout type exceptions and automatically set resource status to unavailable; else, set status to available. RNA commands invoked within Resource context are leveraged to update resource availability. """ try: if isinstance(error, ERNATimeout): msglog.warn("Resource %s operation timed out." % self) self.notify_unavailable() else: self.notify_available() finally: self.unlock()
def refresh_children(self): # See CSCtq56038 re: assumptions to reduce network chattiness. communicating = False present_value = self.get().values() was_online = present_value[0] and present_value[1] for node in [self.lic_node, self.fw_node, self.net_node]: try: communicating = node.refresh_value() except: msglog.warn("Failed to refresh host information: %s" % node) if communicating and was_online: # we can break early, remains online. break self.refreshed(True) if not self._scheduled or not self._scheduled.executable(): self.schedule_refresh(self.period) self.update_cache()
def handle_session_input(self, fd): pfx = 'RNA_Scan_Thread.handle_session_input' unregister = False session = self.get_session(fd) try: rna_header = RNAHeader(session.socket) protocol = _protocol_factory(rna_header.protocol) protocol.setup(session, rna_header) command = protocol.recv_command() result = _invoke_command(command) protocol.send_result(command, result) except EInvalidMessage, error: if not error.message: unregister = True msglog.warn("Removing client-closed session: %s" % session) else: unregister = False msglog.exception(prefix="handled")
def handle_session_input(self, fd): pfx = 'RNA_Scan_Thread.handle_session_input' unregister = False session = self.get_session(fd) try: rna_header = RNAHeader(session.socket) protocol = _protocol_factory(rna_header.protocol) protocol.setup(session, rna_header) command = protocol.recv_command() result = _invoke_command(command) protocol.send_result(command, result) except EInvalidMessage, error: if not error.message: unregister = True msglog.warn("Removing client-closed session: %s" % session) else: unregister = False msglog.exception(prefix="handled")
def __call__(self, local=False): if self.__source is None: state = self.__state if local: state["origin"] = Event.LOCALORIGIN if state['type'] == 'EventSource': self.__source = state['source'] elif state['type'] == 'Event': self.__source = Event.get_event(state['GUID']) if local and not self.__source.is_local(): message = "%s overriding source %s origin to local." msglog.warn(message % (self, self.__source)) self.__source.set_local() elif state['origin'] == Event.LOCALORIGIN: self.__source = as_node(state['URL']) else: self.__dict__.update(state['config']) self.__source = self return self.__source
def compact(): storages = [] for storagemap in MapStorage.filesysmap.values(): for storage in storagemap.values(): if isinstance(storage, MapStorage): storages.append(storage) for storage in storages: if storage.opened() and hasattr(storage.database, "reorganize"): storage.storagelock.acquire() try: packed = storage.database.reorganize() except: msglog.warn("Compact DBM file %r failed." % storage.filepath) msglog.exception(prefix="handled") else: msglog.inform("Compacted DBM file %r." % storage.filepath) finally: storage.storagelock.release() return len(storages)
def compact(): storages = [] for storagemap in MapStorage.filesysmap.values(): for storage in storagemap.values(): if isinstance(storage, MapStorage): storages.append(storage) for storage in storages: if storage.opened() and hasattr(storage.database, "reorganize"): storage.storagelock.acquire() try: packed = storage.database.reorganize() except: msglog.warn("Compact DBM file %r failed." % storage.filepath) msglog.exception(prefix="handled") else: msglog.inform("Compacted DBM file %r." % storage.filepath) finally: storage.storagelock.release() return len(storages)
def _trim_events(self): trimmed = [] expiration = uptime.secs() - self.ttl while self.closed and self.closed[0][0] < expiration: closed,guid = self.closed.popleft() try: item = self.items.pop(guid) except KeyError: msglog.warn("Failed to remove closed event. Error follows: ") msglog.exception(prefix="handled") else: self.created.remove(guid) self.byname[item["name"]].remove(guid) self.bystate[item["state"]].remove(guid) self.byorigin[item["origin"]].remove(guid) self.bypriority[item["priority"]].remove(guid) for client in self.clients.values(): client.remove(item) trimmed.append(guid) return trimmed
def connect_ssl(self, address): """ Deprecated: trying to fix other issue by pulling SSL wrapping out of handle-connect. Left here in case it's useful. """ self.connected = False self.socket.setblocking(1) try: self.socket.connect(address) except: msglog.warn("%s connect failed.") self.handle_error() else: self.addr = address self.ssl = socket.ssl(self.socket) self.message("%s set up SSL wrapper: %s." % (self, self.ssl)) self.handle_connect() finally: self.socket.setblocking(0)
def as_node_input(self, name, node): if not node.has_method("get"): # The above if statement fails when nodes don't resolve. raise ValueError("node has no 'get' method: %s" % node) source = as_node_url(node) if self.inputs.has_child(name): node = self.inputs.get_child(name) if source != node.source: raise ValueError("Input with name exists: %r" % name) msglog.warn("Input exists: %r, %r" % (name, source)) else: running = self.inputs.is_running() if running: self.inputs.stop() node = CachedPoint() node.configure({"name": name, "source": source, "parent": self.inputs}) if running: self.inputs.start() return super(CachingCalculator, self).as_node_input(name, node)
def remove_target(self, target): if not isinstance(target, str): targeturl = as_node_url(target) else: targeturl = target self.synclock.acquire() try: self.targets.remove(targeturl) except KeyError: removed = False message = "Target %s not removed from %s: does not exist." msglog.warn(message % (target, self)) else: try: self.targetmap.pop(targeturl) except KeyError: pass removed = True msglog.inform("Target %s removed from %s." % (target, self)) finally: self.synclock.release() return removed
def remove_target(self, target): if not isinstance(target, str): targeturl = as_node_url(target) else: targeturl = target self.synclock.acquire() try: self.targets.remove(targeturl) except KeyError: removed = False message = "Target %s not removed from %s: does not exist." msglog.warn(message % (target, self)) else: try: self.targetmap.pop(targeturl) except KeyError: pass removed = True msglog.inform("Target %s removed from %s." % (target, self)) finally: self.synclock.release() return removed
def run(self): rna_service = self.rna_service msglog.log('broadway', msglog.types.INFO, 'RNA thread starting.') try: rna_service.transport.listen() except: msglog.exception() self._cleanup() return nexceptions = 0 texceptions = 0 if rna_service.state is rna_service.PENDING: rna_service.state = rna_service.RUNNING while rna_service.state is rna_service.RUNNING: if not self.rna_scan_thread.is_running(): msglog.warn("%s scan thread not running: exiting." % self) break try: session = rna_service.transport.accept_session() self.rna_scan_thread.register_session(session) except: msglog.exception(prefix='handled') self._cleanup(msglog.types.INFO)
def destroy(self, manager=None): if not manager: manager = self.subscription_manager if manager and self.subscribed(): if self.timeout_occurred: message = ("Batch %s destruction leaving remote" " subscription: timeout had occurred.") msglog.warn(message % self) else: try: manager.destroy(self.sid) except: message = "%s failed to destroy subscription %s on %s." msglog.log("broadway", msglog.types.WARN, message % (self, self.sid, manager)) msglog.exception(prefix="handled") else: if debug: message = "Batch %s destroyed remote subscription." msglog.debug(message % self) self.clear() self.sid = None self.subscription_manager = None
def as_node_input(self, name, node): if not node.has_method("get"): # The above if statement fails when nodes don't resolve. raise ValueError("node has no 'get' method: %s" % node) source = as_node_url(node) if self.inputs.has_child(name): node = self.inputs.get_child(name) if source != node.source: raise ValueError("Input with name exists: %r" % name) msglog.warn("Input exists: %r, %r" % (name, source)) else: running = self.inputs.is_running() if running: self.inputs.stop() node = CachedPoint() node.configure({ "name": name, "source": source, "parent": self.inputs }) if running: self.inputs.start() return super(CachingCalculator, self).as_node_input(name, node)
def run(self): rna_service = self.rna_service msglog.log('broadway', msglog.types.INFO, 'RNA thread starting.') try: rna_service.transport.listen() except: msglog.exception() self._cleanup() return nexceptions = 0 texceptions = 0 if rna_service.state is rna_service.PENDING: rna_service.state = rna_service.RUNNING while rna_service.state is rna_service.RUNNING: if not self.rna_scan_thread.is_running(): msglog.warn("%s scan thread not running: exiting." % self) break try: session = rna_service.transport.accept_session() self.rna_scan_thread.register_session(session) except: msglog.exception(prefix='handled') self._cleanup(msglog.types.INFO)
def run(self): pfx = 'RNA_Scan_Thread.run:' cmdfd = self.trigger_channel.fileno() enqueue = self.work_queue.queue_noresult handle_session = self.handle_session_input clear_notifications = self.clear_notifications while self.bPollRun: try: descriptors = self.descriptors.copy() if cmdfd not in descriptors: msglog.warn("Command channel FD removed!") descriptors.add(cmdfd) r,w,e = select.select(descriptors, [], descriptors, 1) for fd in e: if fd == cmdfd: message = "%s internal polling error. Must restart." msglog.error(message % pfx) raise TypeError("command channel OOB data") try: self.unregister_session(self.get_session(fd)) except: msglog.warn("%s I/O event handling error." % pfx) msglog.exception(prefix="handled") for fd in r: if fd in self.descriptors: try: if fd == cmdfd: clear_notifications() else: self.descriptors.discard(fd) enqueue(handle_session, fd) except: msglog.warn("%s I/O event handling error." % pfx) msglog.exception(prefix="handled") except: msglog.warn("%s loop error." % pfx) msglog.exception(prefix="handled") msglog.inform("%s exiting." % pfx)
def run(self): pfx = 'RNA_Scan_Thread.run:' cmdfd = self.trigger_channel.fileno() enqueue = self.work_queue.queue_noresult handle_session = self.handle_session_input clear_notifications = self.clear_notifications while self.bPollRun: try: descriptors = self.descriptors.copy() if cmdfd not in descriptors: msglog.warn("Command channel FD removed!") descriptors.add(cmdfd) r, w, e = select.select(descriptors, [], descriptors, 1) for fd in e: if fd == cmdfd: message = "%s internal polling error. Must restart." msglog.error(message % pfx) raise TypeError("command channel OOB data") try: self.unregister_session(self.get_session(fd)) except: msglog.warn("%s I/O event handling error." % pfx) msglog.exception(prefix="handled") for fd in r: if fd in self.descriptors: try: if fd == cmdfd: clear_notifications() else: self.descriptors.discard(fd) enqueue(handle_session, fd) except: msglog.warn("%s I/O event handling error." % pfx) msglog.exception(prefix="handled") except: msglog.warn("%s loop error." % pfx) msglog.exception(prefix="handled") msglog.inform("%s exiting." % pfx)
def Trigger(*args, **kw): """ Factory method for reverse compatibility. """ msglog.warn("Depcreated Trigger factory used: use Calculated instead.") return Calculated(*args, **kw)
def handle_request(self, request): exceptions = [] userobject = request.user_object() if not userobject: username = request.get_cookie("NBMUSER", None) if not username: raise Unauthorized("User unknown") address = request.get_address() if not self._cloud_manager.is_host_in_formation(address): raise Unauthorized("Address unrecognized: " + address) message = "Getting user because address/usrename: %r, %r" msglog.debug(message % (address, username)) userobject = self.user_manager.get_user(username) request_data = request.get_post_data_as_dictionary() request_data.update(request.get_query_string_as_dictionary()) if request_data.has_key('command') and request_data.has_key('guid'): exceptions = [] path = request.get_path() username = userobject.name() method = request.get_command() protocol = request.get_protocol() command = request_data['command'][0] user = self.user_service.user_from_object(userobject) origins = {} for guid in request_data['guid']: try: event = AlarmEvent.get_event(guid) except KeyError: msglog.warn("Attempt to get event %r failed." % guid) else: origins.setdefault(event.origin, []).append(event) for origin, events in origins.items(): if origin == AlarmEvent.LOCALORIGIN: for event in events: message = "User '%s'" % username if self.secured: event = query_multi_adapter((event, user), ISecure) try: event.notify(command, self, time.time(), message) except Exception, error: msg = "Notify %r of %r failed." % (event, command) msglog.log("broadway", msglog.types.WARN, msg) msglog.exception(prefix="handled") # CSCte94039 - form the proper error msg exceptions.append((command, str(error))) else: headers = {"Cookie": "NBMUSER=%s" % userobject.name()} guids = [event.GUID for event in events] parameters = [("command", command)] parameters.extend([("guid", guid) for guid in guids]) data = urllib.urlencode(parameters) url = '%s://%s%s' % (protocol, origin, path) if method == "GET": url = "?".join([url, data]) data = None redirect = urllib2.Request(url, data, headers) try: urllib2.urlopen(redirect).read() except Exception, error: message = "'%s' remote events on '%s' failed." msglog.warn(message % (command, origin)) msglog.exception(prefix="handled") exceptions.append((origin, command, error))
resolved = False exceptions.append(sys.exc_info()) else: value = self.as_node_input(name, node) else: if isinstance(definition, str): # Attempt integer conversion because float worked. try: value = int(definition) except ValueError: pass if not resolved: # Log input resolution for definition once. if self._failed.get(name) != definition: message = "%s cannot resolve %r: %r. Exceptions follow." msglog.warn(message % (self, name, definition)) while exceptions: error = exceptions.pop() msglog.exception(prefix="handled", exc_info=error) self._failed[name] = definition raise ValueError("Unable to resolve definition: %r" % definition) else: self._failed.pop(name, None) return value def setup_context(self): context = {} for variable in self.variables: name = variable['vn'] definition = variable['node_reference'] if context.has_key(name):
position = int(name) if position >= 0 and position <= 9: # Property name is integer position, # strip from params dict and place in # args sequence. value = params.pop(name) argitems.append((position, value)) # Place remaining properties into kwargs. kwargs.update(params) # Create sequence of positional args specified # by digit property name in params hash map. args.extend([val for pos, val in sorted(argitems)]) elif isinstance(params, (list, tuple)): args.extend(params) else: msglog.warn("Unknown param type: %r" % (params, )) try: result = method(*args, **kwargs) except ValueError, error: response["error"] = {"code": -32602} msglog.exception(prefix="handled") except Exception, error: response["error"] = {"code": -32603} msglog.exception(prefix="handled") if error: errordict = response.setdefault("error", {"code": -32603}) message = error.message if not message: # Some silly internal errors don't include # a message. This should be fixed. Example: # as_node("/interfaces/relay1").set('a').
def Trigger(*args, **kw): """ Factory method for reverse compatibility. """ msglog.warn("Depcreated Trigger factory used: use Calculated instead.") return Calculated(*args, **kw)
position = int(name) if position >= 0 and position <= 9: # Property name is integer position, # strip from params dict and place in # args sequence. value = params.pop(name) argitems.append((position, value)) # Place remaining properties into kwargs. kwargs.update(params) # Create sequence of positional args specified # by digit property name in params hash map. args.extend([val for pos,val in sorted(argitems)]) elif isinstance(params, (list, tuple)): args.extend(params) else: msglog.warn("Unknown param type: %r" % (params,)) try: result = method(*args, **kwargs) except ValueError, error: response["error"] = {"code": -32602} msglog.exception(prefix="handled") except Exception, error: response["error"] = {"code": -32603} msglog.exception(prefix="handled") if error: errordict = response.setdefault("error", {"code": -32603}) message = error.message if not message: # Some silly internal errors don't include # a message. This should be fixed. Example: # as_node("/interfaces/relay1").set('a').
def handle_request(self, request): exceptions = [] userobject = request.user_object() if not userobject: username = request.get_cookie("NBMUSER", None) if not username: raise Unauthorized("User unknown") address = request.get_address() if not self._cloud_manager.is_host_in_formation(address): raise Unauthorized("Address unrecognized: " + address) message = "Getting user because address/usrename: %r, %r" msglog.debug(message % (address, username)) userobject = self.user_manager.get_user(username) request_data = request.get_post_data_as_dictionary() request_data.update(request.get_query_string_as_dictionary()) if request_data.has_key("command") and request_data.has_key("guid"): exceptions = [] path = request.get_path() username = userobject.name() method = request.get_command() protocol = request.get_protocol() command = request_data["command"][0] user = self.user_service.user_from_object(userobject) origins = {} for guid in request_data["guid"]: try: event = AlarmEvent.get_event(guid) except KeyError: msglog.warn("Attempt to get event %r failed." % guid) else: origins.setdefault(event.origin, []).append(event) for origin, events in origins.items(): if origin == AlarmEvent.LOCALORIGIN: for event in events: message = "User '%s'" % username if self.secured: event = query_multi_adapter((event, user), ISecure) try: event.notify(command, self, time.time(), message) except Exception, error: msg = "Notify %r of %r failed." % (event, command) msglog.log("broadway", msglog.types.WARN, msg) msglog.exception(prefix="handled") # CSCte94039 - form the proper error msg exceptions.append((command, str(error))) else: headers = {"Cookie": "NBMUSER=%s" % userobject.name()} guids = [event.GUID for event in events] parameters = [("command", command)] parameters.extend([("guid", guid) for guid in guids]) data = urllib.urlencode(parameters) url = "%s://%s%s" % (protocol, origin, path) if method == "GET": url = "?".join([url, data]) data = None redirect = urllib2.Request(url, data, headers) try: urllib2.urlopen(redirect).read() except Exception, error: message = "'%s' remote events on '%s' failed." msglog.warn(message % (command, origin)) msglog.exception(prefix="handled") exceptions.append((origin, command, error))
resolved = False exceptions.append(sys.exc_info()) else: value = self.as_node_input(name, node) else: if isinstance(definition, str): # Attempt integer conversion because float worked. try: value = int(definition) except ValueError: pass if not resolved: # Log input resolution for definition once. if self._failed.get(name) != definition: message = "%s cannot resolve %r: %r. Exceptions follow." msglog.warn(message % (self, name, definition)) while exceptions: error = exceptions.pop() msglog.exception(prefix="handled", exc_info=error) self._failed[name] = definition raise ValueError("Unable to resolve definition: %r" % definition) else: self._failed.pop(name, None) return value def setup_context(self): context = {} for variable in self.variables: name = variable['vn'] definition = variable['node_reference'] if context.has_key(name): raise EInvalidValue('variable', name, 'Duplicate name')