def test_check_users_presence_success(mocker): mocker.patch("platform_resources.user_utils.find_namespace", return_value=NamespaceStatus.NOT_EXISTS) mocker.patch("platform_resources.user.User.get", return_value=user_data) assert check_users_presence(test_username) == UserState.ACTIVE mocker.patch("platform_resources.user_utils.find_namespace", return_value=NamespaceStatus.ACTIVE) assert check_users_presence(test_username) == UserState.ACTIVE
def test_check_users_presence_failure(mocker): mocker.patch("platform_resources.user_utils.find_namespace", return_value=NamespaceStatus.NOT_EXISTS) mocker.patch("platform_resources.user.User.get", return_value=user_data) assert check_users_presence(test_username + "_wrong") == UserState.NOT_EXISTS
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) if not is_current_user_administrator(): handle_error(logger, Texts.USER_NOT_ADMIN_ERROR_MSG, Texts.USER_NOT_ADMIN_ERROR_MSG) 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 = "" 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 don't step processing the command - config file generated here my 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)
def delete(state: State, username: str, purge: bool): """ Deletes a user with a name given as a parameter. :param username: name of a user that should be deleted :param purge: if set - command removes also all artifacts associated with a user """ try: click.echo(Texts.DELETION_CHECK_PRESENCE) user_state = check_users_presence(username) if user_state == UserState.NOT_EXISTS: handle_error(user_msg=Texts.USER_NOT_EXISTS_ERROR_MSG.format( username=username)) exit(1) if user_state == UserState.TERMINATING: handle_error(user_msg=Texts.USER_BEING_REMOVED_ERROR_MSG) exit(1) except Exception: handle_error(logger, Texts.USER_PRESENCE_VERIFICATION_ERROR_MSG, Texts.USER_PRESENCE_VERIFICATION_ERROR_MSG, add_verbosity_msg=state.verbosity == 0) exit(1) click.echo() if not click.confirm(Texts.DELETE_CONFIRM_MSG.format(username=username)): click.echo(Texts.DELETE_ABORT_MSG) exit(0) click.echo() try: click.echo(Texts.DELETION_START_DELETING) delete_user(username) patch_config_map_data(name=USER_DEL_CM, namespace=NAUTA_NAMESPACE, key=username, value="1") if purge: try: click.echo(Texts.DELETION_START_PURGING) # failure during purging a user doesn't mean that user wasn't deleted purge_user(username) except Exception: handle_error(logger, Texts.PURGE_ERROR_MSG, Texts.PURGE_ERROR_MSG) # CAN-616 - wait until user has been really deleted with spinner(text=Texts.DELETION_VERIFICATION_OF_DELETING ) as user_del_spinner: for i in range(60): user_state = check_users_presence(username) user_del_cm_content = get_config_map_data( name=USER_DEL_CM, namespace=NAUTA_NAMESPACE, request_timeout=1) if (not user_state or user_state == UserState.NOT_EXISTS) and \ (not user_del_cm_content or not user_del_cm_content.get(username)): break time.sleep(1) else: user_del_spinner.stop() click.echo() click.echo(Texts.DELETE_IN_PROGRESS_MSG) exit(0) click.echo() click.echo(Texts.DELETE_SUCCESS_MSG.format(username=username)) except K8sProxyCloseError: handle_error(logger, Texts.PROXY_ERROR_LOG_MSG, Texts.PROXY_ERROR_USER_MSG, add_verbosity_msg=state.verbosity == 0) exit(1) except Exception: handle_error(logger, Texts.OTHER_ERROR_LOG_MSG, Texts.OTHER_ERROR_USER_MSG, add_verbosity_msg=state.verbosity == 0) exit(1)