def manage_fsm(tgt_raw_path, tgt_full_path, command, argument, options, tree=None): path, port = rtctree.path.parse_path(tgt_full_path) if port: raise rts_exceptions.NotAComponentError(tgt_raw_path) if not path[-1]: raise rts_exceptions.NotAComponentError(tgt_raw_path) if not tree: tree = rtctree.tree.RTCTree(paths=path, filter=[path]) if not tree.has_path(path): raise rts_exceptions.NoSuchObjectError(path) rtc = tree.get_node(path) if rtc.is_zombie: raise rts_exceptions.ZombieObjectError(path) if not rtc.is_component: raise rts_exceptions.NotAComponentError(path) fsm = rtc.get_extended_fsm_service() try: cmdfunc = FSM_CMDS[command] return cmdfunc(fsm, argument) except KeyError: raise Exception('unknown command: {0}'.format(command))
def cat_target(cmd_path, full_path, options, tree=None): use_colour = rtctree.utils.colour_supported(sys.stdout) path, port = rtctree.path.parse_path(full_path) if not path[-1]: # There was a trailing slash trailing_slash = True path = path[:-1] else: trailing_slash = False if not tree: if options.long > 0: # Longer output needs to look around the tree, so don't filter filter = [] else: filter = [path] tree = rtctree.tree.RTCTree(paths=path, filter=filter) if not tree.has_path(path): raise rts_exceptions.NoSuchObjectError(cmd_path) object = tree.get_node(path) if port: if not object.is_component: raise rts_exceptions.NotAComponentError(cmd_path) if trailing_slash: raise rts_exceptions.NoSuchObjectError(cmd_path) p = object.get_port_by_name(port) if not p: raise rts_exceptions.PortNotFoundError(path, port) return format_port(p, object, start_indent=0, use_colour=use_colour, long=options.long) else: if object.is_component: if trailing_slash: raise rts_exceptions.NoSuchObjectError(cmd_path) return format_component(object, tree, use_colour=use_colour, long=options.long) elif object.is_manager: return format_manager(object, use_colour=use_colour, long=options.long) elif object.is_zombie: raise rts_exceptions.ZombieObjectError(cmd_path) else: raise rts_exceptions.NoSuchObjectError(cmd_path)
def print_logs(paths, options, tree=None): global counter for p in paths: path, port = rtctree.path.parse_path(p[1]) if port: raise rts_exceptions.NotAComponentError(p[0]) if not path[-1]: raise rts_exceptions.NotAComponentError(p[0]) p.append(path) if not tree: parsed = [p[2] for p in paths] tree = rtctree.tree.RTCTree(paths=parsed, filter=parsed) rtcs = [] event = Event() for p in paths: if not tree.has_path(p[2]): raise rts_exceptions.NoSuchObjectError(p[0]) rtc = tree.get_node(p[2]) if rtc.is_zombie: raise rts_exceptions.ZombieObjectError(p[0]) if not rtc.is_component: raise rts_exceptions.NotAComponentError(p[0]) rtc.dynamic = True if len(options.filters) == 0 or 'ALL' in options.filters: for (k,v) in filtermap.items(): rtc.add_callback(v[0], v[1], [event]) else: for f in options.filters: try: v = filtermap[f] rtc.add_callback(v[0], v[1], [event]) except KeyError: print('Unknown filter: {0}'.format(f)) rtcs.append(rtc) # Wait for a keyboard interrupt counter = 0 atexit.register(clean_events, rtcs) while True: if options.number > 0 and counter >= options.number: break try: event.wait() except KeyboardInterrupt: break event.clear() clean_events(rtcs)
def print_logs(paths, options, tree=None): for p in paths: path, port = rtctree.path.parse_path(p[1]) if port: raise rts_exceptions.NotAComponentError(p[0]) if not path[-1]: raise rts_exceptions.NotAComponentError(p[0]) p.append(path) if not tree: parsed = [p[2] for p in paths] tree = rtctree.tree.RTCTree(paths=parsed, filter=parsed) filters = ','.join(options.filters) ids = [] try: for p in paths: if not tree.has_path(p[2]): raise rts_exceptions.NoSuchObjectError(p[0]) rtc = tree.get_node(p[2]) if rtc.is_zombie: raise rts_exceptions.ZombieObjectError(p[0]) if not rtc.is_component: raise rts_exceptions.NotAComponentError(p[0]) id = rtc.add_logger(log_cb, level=options.level, filters=filters) ids.append((rtc, id)) except rtctree.exceptions.AddLoggerError as e: # Remove all the loggers that were added for i in ids: i[0].remove_logger(i[1]) # Re-raise raise e # Wait for a keyboard interrupt try: while True: if sys.version_info[0] == 3: input() else: raw_input('') except KeyboardInterrupt: pass # Remove all the loggers that were added for i in ids: i[0].remove_logger(i[1])
def disconnect_ports(paths, options, tree=None): cmd_paths, fps = list(zip(*paths)) pathports = [rtctree.path.parse_path(fp) for fp in fps] for ii, p in enumerate(pathports): if not p[1]: raise rts_exceptions.NotAPortError(cmd_paths[ii]) if not p[0][-1]: raise rts_exceptions.NotAPortError(cmd_paths[ii]) paths, ports = list(zip(*pathports)) if not tree: tree = rtctree.tree.RTCTree(paths=paths, filter=paths) port_objs = [] for ii, p in enumerate(pathports): obj = tree.get_node(p[0]) if not obj: raise rts_exceptions.NoSuchObjectError(cmd_paths[ii]) if obj.is_zombie: raise rts_exceptions.ZombieObjectError(cmd_paths[ii]) if not obj.is_component: raise rts_exceptions.NotAComponentError(cmd_paths[ii]) port_obj = obj.get_port_by_name(p[1]) if not port_obj: raise rts_exceptions.PortNotFoundError(p[0], p[1]) port_objs.append(port_obj) if len(port_objs) < 2: raise rts_exceptions.NoDestPortError if options.id: all_conns = port_objs[0].get_connections_by_dests(port_objs[1:]) conns = [] for c in all_conns: if c.id == options.id: conns.append(c) else: conns = port_objs[0].get_connections_by_dests(port_objs[1:]) if not conns: if options.id: raise rts_exceptions.ConnectionIDNotFoundError(options.id, cmd_paths[0]) else: raise rts_exceptions.MultiConnectionNotFoundError for c in conns: c.disconnect()
def get_manager(cmd_path, full_path, tree=None): path, port = rtctree.path.parse_path(full_path) if port: raise rts_exceptions.NotAManagerError(cmd_path) if not path[-1]: # There was a trailing slash - ignore it path = path[:-1] if not tree: tree = rtctree.tree.RTCTree(paths=path, filter=[path]) object = tree.get_node(path) if not object: raise rts_exceptions.NoSuchObjectError(cmd_path) if object.is_zombie: raise rts_exceptions.ZombieObjectError(cmd_path) if not object.is_manager: raise rts_exceptions.NotAManagerError(cmd_path) return tree, object
def get_comp(cmd_path, full_path, tree=None): path, port = rtctree.path.parse_path(full_path) if port: # Can't configure a port raise rts_exceptions.NotAComponentError(cmd_path) if not path[-1]: # There was a trailing slash raise rts_exceptions.NoSuchObjectError(cmd_path) if not tree: tree = rtctree.tree.RTCTree(paths=path, filter=[path]) comp = tree.get_node(path) if not comp: raise rts_exceptions.NoSuchObjectError(cmd_path) if comp.is_zombie: raise rts_exceptions.ZombieObjectError(cmd_path) if not comp.is_component: raise rts_exceptions.NotAComponentError(cmd_path) return tree, comp
def exit_target(cmd_path, full_path, options, tree=None): path, port = rtctree.path.parse_path(full_path) if port: raise rts_exceptions.NotAComponentError(cmd_path) trailing_slash = False if not path[-1]: raise rts_exceptions.NotAComponentError(cmd_path) if not tree: tree = rtctree.tree.RTCTree(paths=path, filter=[path]) if not tree.has_path(path): raise rts_exceptions.NoSuchObjectError(cmd_path) object = tree.get_node(path) if object.is_zombie: raise rts_exceptions.ZombieObjectError(cmd_path) if not object.is_component: raise rts_exceptions.NotAComponentError(cmd_path) object.exit()
def get_docs(cmd_path, full_path, options, tree=None): path, port = rtctree.path.parse_path(full_path) if not path[-1]: # There was a trailing slash raise rts_exceptions.NotAComponentError(cmd_path) if port: raise rts_exceptions.NotAComponentError(cmd_path) if not tree: tree = rtctree.tree.RTCTree(paths=path) if not tree.has_path(path): raise rts_exceptions.NoSuchObjectError(cmd_path) object = tree.get_node(path) if object.is_component: return get_comp_docs(object, tree, options) elif object.is_zombie: raise rts_exceptions.ZombieObjectError(cmd_path) else: raise rts_exceptions.NotAComponentError(cmd_path)
def alter_component_states(action, paths, options, tree=None): cmd_paths, fps = list(zip(*paths)) pathports = [rtctree.path.parse_path(fp) for fp in fps] for ii, p in enumerate(pathports): if p[1]: raise rts_exceptions.NotAComponentError(cmd_paths[ii]) if not p[0][-1]: raise rts_exceptions.NotAComponentError(cmd_paths[ii]) paths, ports = list(zip(*pathports)) if not tree: tree = rtctree.tree.RTCTree(paths=paths, filter=paths) for ii, p in enumerate(paths): if not tree.has_path(p): raise rts_exceptions.NoSuchObjectError(cmd_paths[ii]) object_ = tree.get_node(p) if object_.is_zombie: raise rts_exceptions.ZombieObjectError(cmd_paths[ii]) if not object_.is_component: raise rts_exceptions.NotAComponentError(cmd_paths[ii]) action(object_, options.ec_index)
def connect_ports(paths, options, tree=None): '''connect_ports This should raise exception: >>> connect_ports([ ... ('Std0.rtc', '/localhost/local.host_cxt/Std0.rtc'), ... ('Output0.rtc:out', '/localhost/local.host_cxt/Output0.rtc:out') ... ], {}) Traceback (most recent call last): ... NoSourcePortError: No source port specified. >>> connect_ports([ ... ('Std0.rtc:in', '/localhost/local.host_cxt/Std0.rtc:in'), ... ('Output0.rtc', '/localhost/local.host_cxt/Output0.rtc') ... ], {}) Traceback (most recent call last): ... NoDestPortError: No destination port specified. ''' cmd_paths, fps = list(zip(*paths)) pathports = [rtctree.path.parse_path(fp) for fp in fps] for ii, p in enumerate(pathports): if not p[1]: if ii == 0: raise rts_exceptions.NoSourcePortError(cmd_paths[ii]) else: raise rts_exceptions.NoDestPortError(cmd_paths[ii]) if not p[0][-1]: raise rts_exceptions.NotAPortError(cmd_paths[ii]) paths, ports = list(zip(*pathports)) if not tree: tree = rtctree.tree.RTCTree(paths=paths, filter=paths) port_objs = [] for ii, p in enumerate(pathports): obj = tree.get_node(p[0]) if not obj: raise rts_exceptions.NoSuchObjectError(cmd_paths[ii]) if obj.is_zombie: raise rts_exceptions.ZombieObjectError(cmd_paths[ii]) if not obj.is_component: raise rts_exceptions.NotAComponentError(cmd_paths[ii]) port_obj = obj.get_port_by_name(p[1]) if not port_obj: raise rts_exceptions.PortNotFoundError(p[0], p[1]) port_objs.append(port_obj) conn_name = options.name if options.name else None if options.no_dups: for p in port_objs: if p.get_connection_by_name(conn_name): raise rts_exceptions.DuplicateConnectionNameError( conn_name, p.name) if options.id: if p.get_connection_by_id(options.id): raise rts_exceptions.DuplicateConnectionIDError(options.id) if port_objs[0].get_connections_by_dests(port_objs[1:]): raise rts_exceptions.DuplicateConnectionError(cmd_paths) port_objs[0].connect(port_objs[1:], name=conn_name, id=options.id, props=options.properties)