示例#1
0
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)
示例#2
0
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()
示例#3
0
    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"),
                )
示例#4
0
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()
示例#5
0
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]