Example #1
0
def upgrade(ctx: click.Context):
    """
    Upgrade users after Nauta upgrade.
    """

    with spinner(text=Texts.UPGRADE_IN_PROGRESS):
        # noinspection PyBroadException
        try:
            # noinspection PyTypeChecker
            users: List[User] = User.list()

            with K8sProxy(NAUTAAppNames.GIT_REPO_MANAGER,
                          number_of_retries_wait_for_readiness=60) as proxy:
                grm_client = GitRepoManagerClient(host='127.0.0.1',
                                                  port=proxy.tunnel_port)

                for user in users:
                    grm_user = grm_client.get_user(user.name)
                    if not grm_user:
                        grm_client.add_nauta_user(user.name)
        except Exception:
            handle_error(logger,
                         Texts.UPGRADE_FAILED,
                         Texts.UPGRADE_FAILED,
                         add_verbosity_msg=ctx.obj.verbosity == 0)
            sys.exit(1)

    click.echo(Texts.UPGRADE_SUCCEEDED)
Example #2
0
def add_user_to_git_repo_manager(username: str, state):
    try:
        with K8sProxy(NAUTAAppNames.GIT_REPO_MANAGER, number_of_retries_wait_for_readiness=30) as proxy:
            grm_client = GitRepoManagerClient(host='127.0.0.1', port=proxy.tunnel_port)
            grm_client.add_nauta_user(username=username)
    except Exception:
        handle_error(logger, Texts.GIT_REPO_MANAGER_ERROR_MSG, Texts.GIT_REPO_MANAGER_ERROR_MSG,
                     add_verbosity_msg=state.verbosity == 0)
        raise
Example #3
0
def test_add_nauta_user(mocker, git_repo_manager: GitRepoManagerClient):
    generate_key = mocker.patch.object(git_repo_manager,
                                       '_generate_ssh_key',
                                       return_value=('private-key',
                                                     'public-key'))
    create_user = mocker.patch.object(git_repo_manager, 'create_user')
    add_key = mocker.patch.object(git_repo_manager, 'add_public_key_for_user')
    create_repo = mocker.patch.object(git_repo_manager, 'create_repository')
    create_secret = mocker.patch('git_repo_manager.client.create_secret')

    git_repo_manager.add_nauta_user(username='******')

    assert generate_key.call_count == 1
    assert create_user.call_count == 1
    assert add_key.call_count == 1
    assert create_repo.call_count == 1
    assert create_secret.call_count == 1
Example #4
0
def test_add_nauta_user_failure(mocker,
                                git_repo_manager: GitRepoManagerClient):
    generate_key = mocker.patch.object(git_repo_manager,
                                       '_generate_ssh_key',
                                       return_value=('private-key',
                                                     'public-key'))
    create_user = mocker.patch.object(git_repo_manager,
                                      'create_user',
                                      side_effect=RuntimeError)
    add_key = mocker.patch.object(git_repo_manager, 'add_public_key_for_user')
    create_repo = mocker.patch.object(git_repo_manager, 'create_repository')
    create_secret = mocker.patch('git_repo_manager.client.create_secret')

    with pytest.raises(RuntimeError):
        git_repo_manager.add_nauta_user(username='******')

    assert generate_key.call_count == 1
    assert create_user.call_count == 1
    assert add_key.call_count == 0
    assert create_repo.call_count == 0
    assert create_secret.call_count == 0
Example #5
0
def create(state: State, username: str, list_only: bool, filename: str):
    """
    Adds a new user with a name given as a parameter.

    :param username: name of a new user
    """

    if list_only and filename:
        handle_error(user_msg=Texts.F_L_OPTIONS_EXCLUSION_ERROR_MSG)
        exit(1)

    try:
        try:
            validate_user_name(username)
        except ValueError as exe:
            handle_error(
                logger,
                Texts.NAME_VALIDATION_ERROR_MSG.format(username=username),
                str(exe),
                add_verbosity_msg=state.verbosity == 0)
            exit(1)

        user_state = check_users_presence(username)

        if user_state == UserState.ACTIVE:
            handle_error(
                logger,
                Texts.USER_ALREADY_EXISTS_ERROR_MSG.format(username=username),
                Texts.USER_ALREADY_EXISTS_ERROR_MSG.format(username=username))
            exit(1)

        if user_state == UserState.TERMINATING:
            handle_error(
                logger,
                Texts.USER_BEING_REMOVED_ERROR_MSG.format(username=username),
                Texts.USER_BEING_REMOVED_ERROR_MSG.format(username=username))
            exit(1)

    except Exception:
        handle_error(
            logger,
            Texts.USER_VERIFICATION_ERROR_MSG.format(username=username),
            Texts.USER_VERIFICATION_ERROR_MSG.format(username=username),
            add_verbosity_msg=state.verbosity == 0)
        exit(1)

    try:
        with spinner(text=Texts.CREATING_USER_PROGRESS_MSG.format(
                username=username)):
            chart_location = os.path.join(Config().config_path,
                                          ADD_USER_CHART_NAME)

            nauta_config_map = NAUTAConfigMap()

            tiller_location = nauta_config_map.image_tiller
            tensorboard_service_location = nauta_config_map.image_tensorboard_service

            add_user_command = [
                "helm", "install", "--wait", "--namespace", username, "--name",
                username, chart_location, "--set", "global.nauta=nauta",
                "--set", f"username={username}", "--set",
                "TillerImage={}".format(tiller_location), "--set",
                f"TensorboardServiceImage={tensorboard_service_location}"
            ]
            env = os.environ.copy()
            env['PATH'] = Config().config_path + os.pathsep + env['PATH']
            _, err_code, log_output = execute_system_command(
                ' '.join(add_user_command), env=env, shell=True)

            if err_code:
                handle_error(logger,
                             log_output,
                             Texts.USER_ADD_ERROR_MSG,
                             add_verbosity_msg=state.verbosity == 0)

                if not delete_user(username):
                    handle_error(user_msg=Texts.REMOVE_USER_ERROR_MSG.format(
                        username=username))
                sys.exit(1)

            try:
                users_password = get_users_token(username)
            except Exception:
                handle_error(logger,
                             Texts.PASSWORD_GATHER_ERROR_MSG,
                             Texts.PASSWORD_GATHER_ERROR_MSG,
                             add_verbosity_msg=state.verbosity == 0)
                users_password = ""

            try:
                cert = get_certificate(username)
            except Exception:
                handle_error(logger,
                             Texts.CERT_GATHER_ERROR_MSG,
                             Texts.CERT_GATHER_ERROR_MSG,
                             add_verbosity_msg=state.verbosity == 0)
                cert = ""

            try:
                with K8sProxy(
                        NAUTAAppNames.GIT_REPO_MANAGER,
                        number_of_retries_wait_for_readiness=60) as proxy:
                    grm_client = GitRepoManagerClient(host='127.0.0.1',
                                                      port=proxy.tunnel_port)
                    grm_client.add_nauta_user(username=username)
            except Exception:
                handle_error(logger,
                             Texts.GIT_REPO_MANAGER_ERROR_MSG,
                             Texts.GIT_REPO_MANAGER_ERROR_MSG,
                             add_verbosity_msg=state.verbosity == 0)
                sys.exit(1)

    except Exception:
        handle_error(logger,
                     Texts.USER_ADD_ERROR_MSG.format(username=username),
                     Texts.USER_ADD_ERROR_MSG.format(username=username),
                     add_verbosity_msg=state.verbosity == 0)
        if not delete_user(username):
            handle_error(user_msg=Texts.REMOVE_USER_ERROR_MSG.format(
                username=username))
        sys.exit(1)

    if is_user_created(username, 90):
        click.echo(Texts.USER_CREATION_SUCCESS_MSG.format(username=username))
    else:
        # if during 90 seconds a user hasn't been created - app displays information about it
        # but doesn't stop processing the command - config file generated here may be useful later
        # when user has been created
        click.echo(Texts.USER_NOT_READY_ERROR_MSG.format(username=username))

    try:
        kubeconfig = generate_kubeconfig(username, username,
                                         get_kubectl_host(), users_password,
                                         cert)
    except Exception:
        handle_error(logger,
                     Texts.CONFIG_CREATION_ERROR_MSG,
                     Texts.CONFIG_CREATION_ERROR_MSG,
                     add_verbosity_msg=state.verbosity == 0)
        exit(1)

    if list_only:
        click.echo(Texts.LIST_ONLY_HEADER)
        click.echo(kubeconfig)
    else:
        if not filename:
            filename = DEFAULT_FILENAME.format(username)
        try:
            with open(filename, "w") as file:
                file.write(kubeconfig)

            click.echo(Texts.CONFIG_SAVE_SUCCESS_MSG.format(filename=filename))
        except Exception:
            handle_error(logger,
                         Texts.CONFIG_SAVE_FAIL_MSG,
                         Texts.CONFIG_SAVE_FAIL_MSG,
                         add_verbosity_msg=state.verbosity == 0)
            click.echo(Texts.CONFIG_SAVE_FAIL_INSTRUCTIONS_MSG)
            click.echo(kubeconfig)
            sys.exit(1)