def cmd_logs(follow: bool): from localstack import config from localstack.utils.docker_utils import DOCKER_CLIENT container_name = config.MAIN_CONTAINER_NAME if not DOCKER_CLIENT.is_container_running(container_name): console.print("localstack container not running") sys.exit(1) if follow: for line in DOCKER_CLIENT.stream_container_logs(container_name): print(line.decode("utf-8").rstrip("\r\n")) else: print(DOCKER_CLIENT.get_container_logs(container_name))
def wait_container_is_ready(timeout: Optional[float] = None): """Blocks until the localstack main container is running and the ready marker has been printed.""" container_name = config.MAIN_CONTAINER_NAME started = time.time() def is_container_running(): return DOCKER_CLIENT.is_container_running(container_name) if not poll_condition(is_container_running, timeout=timeout): return False stream = DOCKER_CLIENT.stream_container_logs(container_name) # create a timer that will terminate the log stream after the remaining timeout timer = None if timeout: waited = time.time() - started remaining = timeout - waited # check the rare case that the timeout has already been reached if remaining <= 0: stream.close() return False timer = threading.Timer(remaining, stream.close) timer.start() try: for line in stream: line = line.decode("utf-8").strip() if line == constants.READY_MARKER_OUTPUT: return True # EOF was reached or the stream was closed return False finally: call_safe(stream.close) if timer: # make sure the timer is stopped (does nothing if it has already run) timer.cancel()