Esempio n. 1
0
def reset():
    utils.print_bold('Trying to wipe the database')
    command = [
        'docker-compose',
        '-f',
        constants.FULL_COMPOSE_PATH,
        'run',
        'initializer',
        'python3',
        '/app/scripts/reset_db.py',
    ]
    subprocess.run(
        command,
        cwd=constants.BASE_DIR,
        stdout=subprocess.DEVNULL,
        check=False,
    )

    utils.print_bold('Bringing down services')
    command = [
        'docker-compose',
        '-f',
        constants.FULL_COMPOSE_PATH,
        'down',
        '-v',
        '--remove-orphans',
    ]
    utils.run_command(command, cwd=constants.BASE_DIR)
    utils.print_success('Done!')
Esempio n. 2
0
def validate(full: bool):
    if full:
        utils.print_bold('Validating full configuration for local deploy')
        utils.load_config()
    else:
        utils.print_bold('Validating basic configuration for local deploy')
        utils.load_basic_config()
    utils.print_success('Configuration is valid!')
Esempio n. 3
0
def reset(ctx: click.Context):
    utils.print_bold('Removing skaffold-created resources')
    utils.run_command(['skaffold', 'delete', '-f', 'deploy/skaffold.yml'],
                      cwd=BASE_DIR)

    utils.print_bold('Cleaning up')
    ctx.invoke(clean)

    utils.print_success('Done!')
Esempio n. 4
0
def start(dev: bool, **_kwargs):
    utils.print_bold('Deploying using skaffold')
    cmd = ['skaffold', 'dev' if dev else 'run', '-f', 'deploy/skaffold.yml']
    utils.run_command(cmd, cwd=BASE_DIR)
    utils.print_success('Deployed successfully!')

    utils.print_bold('Fetching the address for deployment')
    service_resource = get_resource_description(resource='service',
                                                name='nginx')
    ip = service_resource['status']['loadBalancer']['ingress'][0]['ip']
    utils.print_success(f'You can access ForcAD at http://{ip}')
Esempio n. 5
0
def validate(full: bool, yandex: bool):
    if full:
        utils.print_bold('Validating full configuration for kubernetes')
        config = utils.load_config()
        if yandex:
            check_admin_for_yandex(config.admin)
    else:
        utils.print_bold('Validating basic configuration for kubernetes')
        config = utils.load_basic_config()
        if yandex and config.admin:
            check_admin_for_yandex(config.admin)

    utils.print_success('Configuration is valid!')
Esempio n. 6
0
def setup_rabbitmq(config: models.RabbitMQConfig):
    management_url = f'http://{config.user}:{config.password}@{config.host}:15672/api/'
    rabbitmq_config = [
        "# THIS FILE IS MANAGED BY 'control.py'",
        f'RABBITMQ_HOST={config.host}',
        f'RABBITMQ_PORT={config.port}',
        f'RABBITMQ_DEFAULT_USER={config.user}',
        f'RABBITMQ_DEFAULT_PASS={config.password}',
        f'RABBITMQ_DEFAULT_VHOST={config.vhost}',
        f'BROKER_API_URL={management_url}',
    ]

    utils.print_bold(f'Writing broker env to {constants.RABBITMQ_ENV_PATH}')
    constants.RABBITMQ_ENV_PATH.write_text('\n'.join(rabbitmq_config))
Esempio n. 7
0
def create(ctx: click.Context):
    ctx.invoke(validate, full=False, yandex=True)
    utils.backup_config()
    basic_config = utils.load_basic_config()
    config = utils.setup_auxiliary_structure(basic_config)

    utils.dump_config(config)

    utils.run_command(['terraform', 'init'], cwd=constants.TERRAFORM_DIR)

    if not constants.TF_CREDENTIALS_PATH.exists():
        zone_choices = click.Choice([f'ru-central1-{c}' for c in 'abc'])

        data = {
            "yandex_cloud_token":
            click.prompt('Enter your YC OAuth token'),
            "yandex_cloud_id":
            click.prompt('Enter your YC cloud id'),
            "yandex_folder_id":
            click.prompt('Enter your YC folder id'),
            "yandex_zone":
            click.prompt(
                'In which zone will you deploy ForcAD?',
                type=zone_choices,
                default=zone_choices.choices[0],
            ),
        }
    else:
        data = json.loads(constants.TF_CREDENTIALS_PATH.read_text())

    data['db_password'] = config.storages.db.password
    data['db_user'] = config.storages.db.user
    data['db_name'] = config.storages.db.dbname

    constants.TF_CREDENTIALS_PATH.write_text(json.dumps(data))

    utils.run_command(['terraform', 'plan'], cwd=constants.TERRAFORM_DIR)
    click.confirm(
        click.style('Does the plan above look ok?', bold=True),
        abort=True,
    )

    utils.print_bold('Applying the plan with Terraform')
    utils.run_command(
        ['terraform', 'apply', '-auto-approve'],
        cwd=constants.TERRAFORM_DIR,
    )

    tf_out = get_terraform_outputs()
    cluster_id = tf_out['cluster-id']['value']
    folder_id = tf_out['folder-id']['value']
    registry_id = tf_out['registry-id']['value']
    postgres_fqdn = tf_out['postgres-fqdn']['value']
    redis_fqdn = tf_out['redis-fqdn']['value']

    utils.print_bold('Adding cluster config to kubectl')
    cmd = [
        'yc',
        'managed-kubernetes',
        'cluster',
        'get-credentials',
        '--id',
        cluster_id,
        '--folder-id',
        folder_id,
        '--context-name',
        'yc-forcad',
        '--external',
        '--force',
    ]
    utils.run_command(cmd)

    utils.print_bold('New kubectl config:')
    utils.run_command(['kubectl', 'config', 'view'])

    utils.print_bold('Configuring local docker to authenticate in YC registry')
    utils.run_command(['yc', 'container', 'registry', 'configure-docker'])

    repo = f'cr.yandex/{registry_id}'
    utils.print_bold(f'Configuring skaffold to use repo {repo} by default')
    utils.run_command(['skaffold', 'config', 'set', 'default-repo', repo])

    database = f'{postgres_fqdn}:6432'
    redis = f'{redis_fqdn}:6379'

    utils.print_bold(f'Postgres full address is {database}')
    utils.print_bold(f'Redis full address is {redis}')

    ctx.invoke(setup, database=database, redis=redis, rabbitmq=None)