Skip to content
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
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
Copy Markdown
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
Copy Markdown
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'