class TestDeviceDB(unittest.TestCase): def setUp(self): self.ddb_file = tempfile.NamedTemporaryFile(mode="w+", suffix=".py", delete=False) print(DUMMY_DDB_FILE, file=self.ddb_file, flush=True) self.ddb = DeviceDB(self.ddb_file.name) def tearDown(self): self.ddb_file.close() os.unlink(self.ddb_file.name) def test_get(self): core = self.ddb.get("core") self.assertEqual(core["class"], "Core") def test_get_alias(self): with self.assertRaises(TypeError): # str indexing on str self.ddb.get("core_alias")["class"] self.assertEqual(self.ddb.get("core_alias", resolve_alias=True), self.ddb.get("core")) def test_get_unresolved_alias(self): with self.assertRaisesRegex(KeyError, "dummy"): self.ddb.get("unresolved_alias", resolve_alias=True) def test_update(self): with self.assertRaises(KeyError): self.ddb.get("core_log") update = """ device_db["core_log"] = { "type": "controller", "host": "::1", "port": 1068, "command": "aqctl_corelog -p {port} --bind {bind} ::1", }""" print(update, file=self.ddb_file, flush=True) self.ddb.scan() self.assertEqual(self.ddb.get("core_log")["type"], "controller") def test_get_ddb(self): ddb = self.ddb.get_device_db() raw = file_import(self.ddb_file.name).device_db self.assertEqual(ddb, raw)
def main(): args = get_argparser().parse_args() common_args.init_logger_from_args(args) if args.device is None: ddb = DeviceDB(args.device_db) core_addr = ddb.get("core", resolve_alias=True)["arguments"]["host"] else: core_addr = args.device mgmt = CommMgmt(core_addr) if args.tool == "log": if args.action == "set_level": mgmt.set_log_level(args.level) if args.action == "set_uart_level": mgmt.set_uart_log_level(args.level) if args.action == "clear": mgmt.clear_log() if args.action == None: print(mgmt.get_log(), end="") if args.tool == "config": if args.action == "read": value = mgmt.config_read(args.key) if not value: print("Key {} does not exist".format(args.key)) else: print(value) if args.action == "write": for key, value in args.string: mgmt.config_write(key, value.encode("utf-8")) for key, filename in args.file: with open(filename, "rb") as fi: mgmt.config_write(key, fi.read()) if args.action == "remove": for key in args.key: mgmt.config_remove(key) if args.action == "erase": mgmt.config_erase() if args.tool == "reboot": mgmt.reboot() if args.tool == "debug": if args.action == "allocator": mgmt.debug_allocator()
def test_import_same_level(self): with tempfile.TemporaryDirectory() as tmpdir: # make sure both files land in the same directory # tempfiles are cleanup together with tmpdir args = dict(mode="w+", suffix=".py", dir=tmpdir, delete=False) with tempfile.NamedTemporaryFile( **args) as fileA, tempfile.NamedTemporaryFile( **args) as fileB: print(DUMMY_DDB_FILE, file=fileA, flush=True) print( f""" from {Path(fileA.name).stem} import device_db device_db["new_core_alias"] = "core" """, file=fileB, flush=True, ) ddb = DeviceDB(fileB.name) self.assertEqual( ddb.get("new_core_alias", resolve_alias=True), DeviceDB(fileA.name).get("core"), )
def main(): args = get_argparser().parse_args() common_args.init_logger_from_args(args) if args.device is None: ddb = DeviceDB(args.device_db) core_addr = ddb.get("core", resolve_alias=True)["arguments"]["host"] else: core_addr = args.device mgmt = CommMgmt(core_addr) if args.tool == "log": if args.action == "set_level": mgmt.set_log_level(args.level) if args.action == "set_uart_level": mgmt.set_uart_log_level(args.level) if args.action == "clear": mgmt.clear_log() if args.action == None: print(mgmt.get_log(), end="") if args.tool == "config": if args.action == "read": value = mgmt.config_read(args.key) if not value: print("Key {} does not exist".format(args.key)) else: print(value) if args.action == "write": for key, value in args.string: mgmt.config_write(key, value.encode("utf-8")) for key, filename in args.file: with open(filename, "rb") as fi: mgmt.config_write(key, fi.read()) if args.action == "remove": for key in args.key: mgmt.config_remove(key) if args.action == "erase": mgmt.config_erase() if args.tool == "reboot": mgmt.reboot() if args.tool == "hotswap": mgmt.hotswap(args.image.read()) if args.tool == "profile": if args.action == "start": mgmt.start_profiler(args.interval, args.hits_size, args.edges_size) elif args.action == "stop": mgmt.stop_profiler() elif args.action == "save": hits, edges = mgmt.get_profile() writer = CallgrindWriter(args.output, args.firmware, "or1k-linux", args.compression, args.demangle) writer.header() for addr, count in hits.items(): writer.hit(addr, count) for (caller, callee), count in edges.items(): writer.edge(caller, callee, count) if args.tool == "debug": if args.action == "allocator": mgmt.debug_allocator()
class ControllerCase(unittest.TestCase): def setUp(self): self.device_db = DeviceDB(os.path.join(artiq_root, "device_db.pyon")) self.device_mgr = DeviceManager(self.device_db) self.controllers = {} def tearDown(self): self.device_mgr.close_devices() for name in list(self.controllers): self.stop_controller(name) def start_controller(self, name, sleep=1): if name in self.controllers: raise ValueError("controller `{}` already started".format(name)) try: entry = self.device_db.get(name) except KeyError: raise unittest.SkipTest( "controller `{}` not found".format(name)) entry["command"] = entry["command"].format( name=name, bind=entry["host"], port=entry["port"]) proc = subprocess.Popen(shlex.split(entry["command"])) self.controllers[name] = entry, proc time.sleep(sleep) def stop_controller(self, name, default_timeout=1): desc, proc = self.controllers[name] t = desc.get("term_timeout", default_timeout) target_name = desc.get("target_name", None) if target_name is None: target_name = AutoTarget try: try: client = Client(desc["host"], desc["port"], target_name, t) try: client.terminate() finally: client.close_rpc() proc.wait(t) return except (socket.timeout, subprocess.TimeoutExpired): logger.warning("Controller %s failed to exit on request", name) try: proc.terminate() except ProcessLookupError: pass try: proc.wait(t) return except subprocess.TimeoutExpired: logger.warning("Controller %s failed to exit on terminate", name) try: proc.kill() except ProcessLookupError: pass try: proc.wait(t) return except subprocess.TimeoutExpired: logger.warning("Controller %s failed to die on kill", name) finally: del self.controllers[name]