Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

making the cli use AWXKIT_CREDENTIAL_FILE #9491

Merged
merged 1 commit into from
Oct 13, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
add credential file support
Signed-off-by: sezanzeb <[email protected]>
  • Loading branch information
sezanzeb committed Sep 12, 2021
commit cbe612baa5e785c8a70ca93f3583bce960a3cb69
24 changes: 22 additions & 2 deletions awxkit/awxkit/cli/format.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,22 @@
import yaml

from awxkit.cli.utils import colored
from awxkit import config


def get_config_credentials():
"""Load username and password from config.credentials.default.

In order to respect configurations from AWXKIT_CREDENTIAL_FILE.
"""
default_username = 'admin'
default_password = 'password'

if not hasattr(config, 'credentials'):
return default_username, default_password

default = config.credentials.get('default', {})
return (default.get('username', default_username), default.get('password', default_password))


def add_authentication_arguments(parser, env):
Expand All @@ -20,16 +36,20 @@ def add_authentication_arguments(parser, env):
help='an OAuth2.0 token (get one by using `awx login`)',
metavar='TEXT',
)

config_username, config_password = get_config_credentials()
# options configured via cli args take higher precedence than those from the config
auth.add_argument(
'--conf.username',
default=env.get('CONTROLLER_USERNAME', env.get('TOWER_USERNAME', 'admin')),
default=env.get('CONTROLLER_USERNAME', env.get('TOWER_USERNAME', config_username)),
metavar='TEXT',
)
auth.add_argument(
'--conf.password',
default=env.get('CONTROLLER_PASSWORD', env.get('TOWER_PASSWORD', 'password')),
default=env.get('CONTROLLER_PASSWORD', env.get('TOWER_PASSWORD', config_password)),
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the default won't show in the help text, will it?

(sorry for the surface-level question, I'm just starting to go over this)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

no, not as long argparse.ArgumentDefaultsHelpFormatter is not used

image

metavar='TEXT',
)

auth.add_argument(
'-k',
'--conf.insecure',
Expand Down
57 changes: 57 additions & 0 deletions awxkit/test/cli/test_config.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import os
import json
import pytest
from requests.exceptions import ConnectionError

Expand Down Expand Up @@ -49,3 +51,58 @@ def test_config_precedence():

assert config.credentials.default.username == 'mary'
assert config.credentials.default.password == 'secret'


def test_config_file_precedence():
"""Ignores AWXKIT_CREDENTIAL_FILE if cli args are set"""
os.makedirs('/tmp/awx-test/', exist_ok=True)
with open('/tmp/awx-test/config.json', 'w') as f:
json.dump({'default': {'username': 'IGNORE', 'password': 'IGNORE'}}, f)

cli = CLI()
cli.parse_args(
['awx', '--conf.username', 'mary', '--conf.password', 'secret'],
env={
'AWXKIT_CREDENTIAL_FILE': '/tmp/awx-test/config.json',
},
)
with pytest.raises(ConnectionError):
cli.connect()

assert config.credentials.default.username == 'mary'
assert config.credentials.default.password == 'secret'


def test_config_file_precedence_2():
"""Ignores AWXKIT_CREDENTIAL_FILE if TOWER_* vars are set."""
os.makedirs('/tmp/awx-test/', exist_ok=True)
with open('/tmp/awx-test/config.json', 'w') as f:
json.dump({'default': {'username': 'IGNORE', 'password': 'IGNORE'}}, f)

cli = CLI()
cli.parse_args(['awx'], env={'AWXKIT_CREDENTIAL_FILE': '/tmp/awx-test/config.json', 'TOWER_USERNAME': 'mary', 'TOWER_PASSWORD': 'secret'})
with pytest.raises(ConnectionError):
cli.connect()

assert config.credentials.default.username == 'mary'
assert config.credentials.default.password == 'secret'


def test_config_file():
"""Reads username and password from AWXKIT_CREDENTIAL_FILE."""
os.makedirs('/tmp/awx-test/', exist_ok=True)
with open('/tmp/awx-test/config.json', 'w') as f:
json.dump({'default': {'username': 'mary', 'password': 'secret'}}, f)

cli = CLI()
cli.parse_args(
['awx'],
env={
'AWXKIT_CREDENTIAL_FILE': '/tmp/awx-test/config.json',
},
)
with pytest.raises(ConnectionError):
cli.connect()

assert config.credentials.default.username == 'mary'
assert config.credentials.default.password == 'secret'