Source code for idmtools_platform_local.infrastructure.redis
"""idmtools redis service.
Copyright 2021, Bill & Melinda Gates Foundation. All rights reserved.
"""
import os
import platform
from dataclasses import dataclass
from logging import getLogger, DEBUG
from idmtools.core.system_information import get_system_information
from idmtools_platform_local.infrastructure.base_service_container import BaseServiceContainer
logger = getLogger(__name__)
[docs]@dataclass
class RedisContainer(BaseServiceContainer):
    """
    Provides the redis container for local platform.
    """
    host_data_directory: str = None
    mem_limit: str = '256m'
    mem_reservation: str = '64m'
    run_as: str = None
    port: int = 6379
    image: str = 'redis:5.0.4-alpine'
    data_volume_name: str = os.getenv("IDMTOOLS_REDIS_DATA_MOUNT_BY_VOLUMENAME", None)
    container_name: str = 'idmtools_redis'
    config_prefix: str = 'redis_'
    def __post_init__(self):
        """Constructor."""
        system_info = get_system_information()
        if self.run_as is None:
            self.run_as = system_info.user_group_str
[docs]    def get_configuration(self) -> dict:
        """
        Get our configuration to run redis.
        Returns:
            Redis config.
        """
        # check if we are using the host data path or using a data volume to mount data
        if self.data_volume_name:
            logger.debug(f"Specifying Data directory using named volume {self.data_volume_name}")
            data_dir = f'{self.data_volume_name}'
        else:
            data_dir = os.path.join(self.host_data_directory, 'redis-data')
            logger.debug(f'Creating redis data directory at {data_dir}')
            os.makedirs(data_dir, exist_ok=True)
        redis_volumes = {
            data_dir: dict(bind='/data', mode='rw')
        }
        port_bindings = self._get_optional_port_bindings(self.port, 6379)
        container_config = self.get_common_config(container_name=self.container_name, image=self.image,
                                                  mem_limit=self.mem_limit, mem_reservation=self.mem_reservation,
                                                  network=self.network, port_bindings=port_bindings,
                                                  volumes=redis_volumes)
        # if we are are unix based systems we should
        if platform.system() in ["Linux", "Darwin"]:
            container_config['user'] = self.run_as
        if logger.isEnabledFor(DEBUG):
            logger.debug(f"Redis Config: {container_config}")
        return container_config