diff --git a/swiftclient/service.py b/swiftclient/service.py index f7f5815c..dfe20188 100644 --- a/swiftclient/service.py +++ b/swiftclient/service.py @@ -86,6 +86,12 @@ class SwiftError(Exception): def process_options(options): + # tolerate sloppy auth_version + if options.get('auth_version') == '3.0': + options['auth_version'] = '3' + elif options.get('auth_version') == '2': + options['auth_version'] = '2.0' + if (not (options.get('auth') and options.get('user') and options.get('key')) and options.get('auth_version') != '3'): diff --git a/swiftclient/shell.py b/swiftclient/shell.py index e3b08beb..34407f43 100755 --- a/swiftclient/shell.py +++ b/swiftclient/shell.py @@ -36,7 +36,7 @@ from swiftclient import __version__ as client_version from swiftclient.client import logger_settings as client_logger_settings, \ parse_header_string from swiftclient.service import SwiftService, SwiftError, \ - SwiftUploadObject, get_conn + SwiftUploadObject, get_conn, process_options from swiftclient.command_helpers import print_account_stats, \ print_container_stats, print_object_stats @@ -1190,40 +1190,8 @@ def parse_args(parser, args, enforce_requires=True): if args and args[0] == 'tempurl': return options, args - if options['auth_version'] == '3.0': - # tolerate sloppy auth_version - options['auth_version'] = '3' - - if (not (options['auth'] and options['user'] and options['key']) - and options['auth_version'] != '3'): - # Use keystone auth if any of the old-style args are missing - options['auth_version'] = '2.0' - - # Use new-style args if old ones not present - if not options['auth'] and options['os_auth_url']: - options['auth'] = options['os_auth_url'] - if not options['user'] and options['os_username']: - options['user'] = options['os_username'] - if not options['key'] and options['os_password']: - options['key'] = options['os_password'] - - # Specific OpenStack options - options['os_options'] = { - 'user_id': options['os_user_id'], - 'user_domain_id': options['os_user_domain_id'], - 'user_domain_name': options['os_user_domain_name'], - 'tenant_id': options['os_tenant_id'], - 'tenant_name': options['os_tenant_name'], - 'project_id': options['os_project_id'], - 'project_name': options['os_project_name'], - 'project_domain_id': options['os_project_domain_id'], - 'project_domain_name': options['os_project_domain_name'], - 'service_type': options['os_service_type'], - 'endpoint_type': options['os_endpoint_type'], - 'auth_token': options['os_auth_token'], - 'object_storage_url': options['os_storage_url'], - 'region_name': options['os_region_name'], - } + # Massage auth version; build out os_options subdict + process_options(options) if len(args) > 1 and args[0] == "capabilities": return options, args diff --git a/tests/unit/test_shell.py b/tests/unit/test_shell.py index 0b299522..f921721f 100644 --- a/tests/unit/test_shell.py +++ b/tests/unit/test_shell.py @@ -1522,6 +1522,43 @@ class TestParsing(TestBase): swiftclient.shell.main(args) self._verify_opts(result[0], opts, os_opts, os_opts_dict) + def test_sloppy_versions(self): + os_opts = {"password": "secret", + "username": "user", + "auth_url": "http://example.com:5000/v3", + "identity-api-version": "3.0"} + + # check os_identity_api_version is sufficient in place of auth_version + args = _make_args("stat", {}, os_opts, '-') + result = [None, None] + fake_command = self._make_fake_command(result) + with mock.patch.dict(os.environ, {}): + with mock.patch('swiftclient.shell.st_stat', fake_command): + swiftclient.shell.main(args) + expected_opts = {'auth_version': '3'} # NB: not '3.0' + expected_os_opts = {"password": "secret", + "username": "user", + "auth_url": "http://example.com:5000/v3"} + self._verify_opts(result[0], expected_opts, expected_os_opts, {}) + + os_opts = {"password": "secret", + "username": "user", + "auth_url": "http://example.com:5000/v2.0", + "identity-api-version": "2"} + + # check os_identity_api_version is sufficient in place of auth_version + args = _make_args("stat", {}, os_opts, '-') + result = [None, None] + fake_command = self._make_fake_command(result) + with mock.patch.dict(os.environ, {}): + with mock.patch('swiftclient.shell.st_stat', fake_command): + swiftclient.shell.main(args) + expected_opts = {'auth_version': '2.0'} # NB: not '2' + expected_os_opts = {"password": "secret", + "username": "user", + "auth_url": "http://example.com:5000/v2.0"} + self._verify_opts(result[0], expected_opts, expected_os_opts, {}) + def test_os_identity_api_version(self): os_opts = {"password": "secret", "username": "user",