Source code for fliswarm.actor

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# @Author: José Sánchez-Gallego (gallegoj@uw.edu)
# @Date: 2020-10-30
# @Filename: actor.py
# @License: BSD 3-clause (http://www.opensource.org/licenses/BSD-3-Clause)

import os

from typing import TypeVar

from clu import BaseActor
from clu.legacy import LegacyActor

from . import __version__
from .commands import command_parser
from .device import FlicameraDevice
from .node import Node


__all__ = ["FLISwarmActor"]


T = TypeVar("T", bound="FLISwarmActor")


[docs] class FLISwarmActor(LegacyActor): """FLISwarm actor.""" parser = command_parser def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.version = __version__ if self.model and self.model.schema: self.model.schema["additionalProperties"] = True self.observatory = os.environ["OBSERVATORY"] self.nodes = {} self.flicameras = {} self.timed_commands.add_command("status", delay=300)
[docs] async def connect_nodes(self): """Connects to the nodes.""" nconfig = self.config["nodes"][self.observatory] self.nodes = { name: Node( name, nconfig[name]["host"], daemon_addr=nconfig[name]["docker-client"], category=nconfig[name].get("category", None), ) for name in self.config["enabled_nodes"][self.observatory] } for node in self.nodes.values(): try: await node.connect() except ConnectionError: pass
[docs] async def start(self) -> BaseActor: """Starts the actor.""" await self.connect_nodes() for node in self.nodes.values(): self.flicameras[node.name] = FlicameraDevice( node.name, node.addr, self.config["nodes"][self.observatory][node.name]["port"], self, ) if await node.is_container_running(self.get_container_name(node)): try: await self.flicameras[node.name].start() except OSError: self.write( "w", text=f"{node.name}: failed to connect to the flicamera device.", ) self.parser_args = [self.nodes] return await super().start()
[docs] def get_container_name(self, node: Node): """Returns the name of the container for a node.""" return self.config["container_name"] + f"-{node.name}"