Source code for fastiot.cli.commands.stop

""" Implements some stop commands for e.g. environments. """
import getpass
import logging
import os
import subprocess
from typing import Optional, List

import typer

from fastiot.cli.commands.deploy import _deployment_completion
from fastiot.cli.constants import DEPLOYMENTS_CONFIG_DIR
from fastiot.cli.model.project import ProjectContext
from fastiot.cli.typer_app import DEFAULT_CONTEXT_SETTINGS, app


[docs]@app.command(context_settings=DEFAULT_CONTEXT_SETTINGS) def stop(deployment_name: Optional[str] = typer.Argument(default=None, shell_complete=_deployment_completion, help="Select the environment to stop."), service_names: Optional[List[str]] = typer.Argument(default=None, help="Optionally specify services to be stopped " "from the environment. This will only stop " "the services but not remove the containers." "(docker-compose stop instead of down)"), project_name: Optional[str] = typer.Option(None, help="Manually set project name for docker-compose"), use_test_deployment: Optional[bool] = typer.Option(False, help="Explicitly set the environment to the " "test environment specified in the project. " "Useful for the CI runner") ): """ Stops the selected environment. """ context = ProjectContext.default if use_test_deployment: deployment_name = context.integration_test_deployment if not deployment_name: logging.warning("No `integration_test_deployment` configured. Exiting.") raise typer.Exit(0) if deployment_name is None: logging.error("You have to define an environment to stop or use the optional argument --use-test-deployment!") raise typer.Exit(1) cwd = os.path.join(context.project_root_dir, context.build_dir, DEPLOYMENTS_CONFIG_DIR, deployment_name) cmd = "docker-compose " project_name = project_name or getpass.getuser() + "__" + context.project_namespace + "__" + deployment_name cmd += "--project-name=" + project_name if service_names is not None and len(service_names) > 0: cmd += " rm --stop --force " + " ".join(service_names) else: cmd += " down" if use_test_deployment or deployment_name == context.integration_test_deployment: cmd += " --volumes" # Remove test volumes right away logging.debug("Running command to stop the environment: %s in path %s", cmd, cwd) env = os.environ.copy() env['COMPOSE_HTTP_TIMEOUT'] = '300' exit_code = subprocess.call(f"{cmd}".split(), cwd=cwd, env=env) if exit_code != 0: logging.error("Stopping the environment failed with exit code %s", str(exit_code)) raise typer.Exit(exit_code)