Source code for acore_server.fleet
# -*- coding: utf-8 -*-
"""
todo: doc string
"""
import typing as T
import dataclasses
from func_args import NOTHING, resolve_kwargs
from boto_session_manager import BotoSesManager
from acore_server_metadata.api import Server as ServerMetadata
from acore_server_config.api import ConfigLoader
from .server import Server
[docs]@dataclasses.dataclass
class Fleet: # pragma: no cover
"""
Fleet of server for a given environment.
It is just a dictionary containing all servers' data. key is ``server_id``
value is the :class:`Server` object.
Usage:
.. code-block:: python
>>> fleet = Fleet.get(bsm=..., env_name="sbx", ...)
>>> server = fleet.get_server(server_id="sbx-blue")
"""
servers: T.Dict[str, Server] = dataclasses.field(init=False)
[docs] @classmethod
def get(
cls,
bsm: BotoSesManager,
env_name: str,
parameter_name_prefix: T.Optional[str] = NOTHING,
s3folder_config: T.Optional[str] = NOTHING,
):
"""
Load all servers' data for a given environment efficiently.
"""
# get acore_server_config
config_loader = ConfigLoader.new(
**resolve_kwargs(
env_name=env_name,
parameter_name_prefix=parameter_name_prefix,
s3folder_config=s3folder_config,
bsm=bsm,
)
)
server_id_list = [server.id for _, server in config_loader.iter_servers()]
# get acore_server_metadata
server_metadata_mapper = ServerMetadata.batch_get_server(
ids=server_id_list,
ec2_client=bsm.ec2_client,
rds_client=bsm.rds_client,
)
# put them together
servers = dict()
for server_id in server_id_list:
server_name = server_id.split("-", 1)[1]
metadata = server_metadata_mapper.get(server_id)
if metadata is None:
metadata = ServerMetadata(id=server_id)
server = Server(
config=config_loader.get_server(server_name=server_name),
metadata=metadata,
)
servers[server_id] = server
fleet = cls()
fleet.servers = servers
return fleet
[docs] def get_server(self, server_id: str) -> Server:
"""
Get a server by its id.
"""
return self.servers[server_id]