Add possibility to provide auth token via CLI
Python part of Manilaclient does support auth by token, but CLI part does not. Therefore, add two new optional args with related env vars: --os-token [OS_TOKEN] --bypass-url [MANILACLIENT_BYPASS_URL] Also, disable checks for other auth data if these two are provided. Change-Id: I567294dfb61e702410c3f0fadc15a04667075434 Closes-Bug: #1572095
This commit is contained in:
@@ -248,6 +248,22 @@ class OpenStackManilaShell(object):
|
|||||||
parser.add_argument('--os_region_name',
|
parser.add_argument('--os_region_name',
|
||||||
help=argparse.SUPPRESS)
|
help=argparse.SUPPRESS)
|
||||||
|
|
||||||
|
parser.add_argument('--os-token',
|
||||||
|
metavar='<token>',
|
||||||
|
default=cliutils.env('OS_TOKEN'),
|
||||||
|
help='Defaults to env[OS_TOKEN].')
|
||||||
|
parser.add_argument('--os_token',
|
||||||
|
help=argparse.SUPPRESS)
|
||||||
|
|
||||||
|
parser.add_argument('--bypass-url',
|
||||||
|
metavar='<bypass-url>',
|
||||||
|
default=cliutils.env('MANILACLIENT_BYPASS_URL'),
|
||||||
|
help=("Use this API endpoint instead of the "
|
||||||
|
"Service Catalog. Defaults to "
|
||||||
|
"env[MANILACLIENT_BYPASS_URL]."))
|
||||||
|
parser.add_argument('--bypass_url',
|
||||||
|
help=argparse.SUPPRESS)
|
||||||
|
|
||||||
parser.add_argument('--service-type',
|
parser.add_argument('--service-type',
|
||||||
metavar='<service-type>',
|
metavar='<service-type>',
|
||||||
help='Defaults to compute for most actions.')
|
help='Defaults to compute for most actions.')
|
||||||
@@ -489,16 +505,18 @@ class OpenStackManilaShell(object):
|
|||||||
project_domain_id=args.os_project_domain_id,
|
project_domain_id=args.os_project_domain_id,
|
||||||
project_domain_name=args.os_project_domain_name,
|
project_domain_name=args.os_project_domain_name,
|
||||||
cert=args.os_cert,
|
cert=args.os_cert,
|
||||||
|
input_auth_token=args.os_token,
|
||||||
|
service_catalog_url=args.bypass_url,
|
||||||
)
|
)
|
||||||
|
|
||||||
# Handle deprecated parameters
|
# Handle deprecated parameters
|
||||||
if args.share_service_name:
|
if args.share_service_name:
|
||||||
client_args['share_service_name'] = args.share_service_name
|
client_args['share_service_name'] = args.share_service_name
|
||||||
|
|
||||||
self._validate_required_options(args.os_tenant_name,
|
self._validate_required_options(
|
||||||
args.os_tenant_id,
|
args.os_tenant_name, args.os_tenant_id,
|
||||||
args.os_project_name,
|
args.os_project_name, args.os_project_id,
|
||||||
args.os_project_id,
|
args.os_token, args.bypass_url,
|
||||||
client_args['auth_url'])
|
client_args['auth_url'])
|
||||||
|
|
||||||
# This client is needed to discover the server api version.
|
# This client is needed to discover the server api version.
|
||||||
@@ -564,15 +582,12 @@ class OpenStackManilaShell(object):
|
|||||||
options.os_share_api_version)
|
options.os_share_api_version)
|
||||||
return api_version
|
return api_version
|
||||||
|
|
||||||
def _validate_required_options(self,
|
def _validate_required_options(self, tenant_name, tenant_id,
|
||||||
os_tenant_name,
|
project_name, project_id,
|
||||||
os_tenant_id,
|
token, service_catalog_url, auth_url):
|
||||||
os_project_name,
|
if token and service_catalog_url:
|
||||||
os_project_id,
|
return
|
||||||
os_auth_url):
|
if not (tenant_name or tenant_id or project_name or project_id):
|
||||||
|
|
||||||
if not (os_tenant_name or os_tenant_id or os_project_name or
|
|
||||||
os_project_id):
|
|
||||||
raise exc.CommandError(
|
raise exc.CommandError(
|
||||||
"You must provide a tenant_name, tenant_id, "
|
"You must provide a tenant_name, tenant_id, "
|
||||||
"project_id or project_name (with "
|
"project_id or project_name (with "
|
||||||
@@ -585,7 +600,7 @@ class OpenStackManilaShell(object):
|
|||||||
"--os-project-domain-name (env[OS_PROJECT_DOMAIN_NAME])."
|
"--os-project-domain-name (env[OS_PROJECT_DOMAIN_NAME])."
|
||||||
)
|
)
|
||||||
|
|
||||||
if not os_auth_url:
|
if not auth_url:
|
||||||
raise exc.CommandError(
|
raise exc.CommandError(
|
||||||
"You must provide an auth url "
|
"You must provide an auth url "
|
||||||
"via either --os-auth-url or env[OS_AUTH_URL]")
|
"via either --os-auth-url or env[OS_AUTH_URL]")
|
||||||
|
@@ -127,6 +127,69 @@ class OpenstackManilaShellTest(utils.TestCase):
|
|||||||
project_domain_id=env_vars['OS_PROJECT_DOMAIN_ID'],
|
project_domain_id=env_vars['OS_PROJECT_DOMAIN_ID'],
|
||||||
project_domain_name=env_vars['OS_PROJECT_DOMAIN_NAME'],
|
project_domain_name=env_vars['OS_PROJECT_DOMAIN_NAME'],
|
||||||
cert=env_vars['OS_CERT'],
|
cert=env_vars['OS_CERT'],
|
||||||
|
input_auth_token='',
|
||||||
|
service_catalog_url='',
|
||||||
|
)
|
||||||
|
|
||||||
|
@ddt.data(
|
||||||
|
{"env_vars": {"MANILACLIENT_BYPASS_URL": "http://foo.url",
|
||||||
|
"OS_TOKEN": "foo_token"},
|
||||||
|
"kwargs": {"--os-token": "bar_token",
|
||||||
|
"--bypass-url": "http://bar.url"},
|
||||||
|
"expected": {"input_auth_token": "bar_token",
|
||||||
|
"service_catalog_url": "http://bar.url"}},
|
||||||
|
{"env_vars": {},
|
||||||
|
"kwargs": {"--os-token": "bar_token",
|
||||||
|
"--bypass-url": "http://bar.url"},
|
||||||
|
"expected": {"input_auth_token": "bar_token",
|
||||||
|
"service_catalog_url": "http://bar.url"}},
|
||||||
|
{"env_vars": {"MANILACLIENT_BYPASS_URL": "http://foo.url",
|
||||||
|
"OS_TOKEN": "foo_token"},
|
||||||
|
"kwargs": {},
|
||||||
|
"expected": {"input_auth_token": "foo_token",
|
||||||
|
"service_catalog_url": "http://foo.url"}},
|
||||||
|
{"env_vars": {"OS_TOKEN": "foo_token"},
|
||||||
|
"kwargs": {"--bypass-url": "http://bar.url"},
|
||||||
|
"expected": {"input_auth_token": "foo_token",
|
||||||
|
"service_catalog_url": "http://bar.url"}},
|
||||||
|
)
|
||||||
|
@ddt.unpack
|
||||||
|
def test_main_success_with_token(self, env_vars, kwargs, expected):
|
||||||
|
self.set_env_vars(env_vars)
|
||||||
|
with mock.patch.object(shell, "client") as mock_client:
|
||||||
|
cmd = ""
|
||||||
|
for k, v in kwargs.items():
|
||||||
|
cmd += "%s=%s " % (k, v)
|
||||||
|
cmd += "list"
|
||||||
|
|
||||||
|
self.shell(cmd)
|
||||||
|
|
||||||
|
mock_client.Client.assert_called_with(
|
||||||
|
manilaclient.API_MAX_VERSION,
|
||||||
|
username="",
|
||||||
|
password="",
|
||||||
|
project_name="",
|
||||||
|
auth_url="",
|
||||||
|
insecure=False,
|
||||||
|
region_name="",
|
||||||
|
tenant_id="",
|
||||||
|
endpoint_type="publicURL",
|
||||||
|
extensions=mock.ANY,
|
||||||
|
service_type=constants.V1_SERVICE_TYPE,
|
||||||
|
service_name="",
|
||||||
|
retries=0,
|
||||||
|
http_log_debug=False,
|
||||||
|
cacert=None,
|
||||||
|
use_keyring=False,
|
||||||
|
force_new_token=False,
|
||||||
|
user_id="",
|
||||||
|
user_domain_id="",
|
||||||
|
user_domain_name="",
|
||||||
|
project_domain_id="",
|
||||||
|
project_domain_name="",
|
||||||
|
cert="",
|
||||||
|
input_auth_token=expected["input_auth_token"],
|
||||||
|
service_catalog_url=expected["service_catalog_url"],
|
||||||
)
|
)
|
||||||
|
|
||||||
def test_help_unknown_command(self):
|
def test_help_unknown_command(self):
|
||||||
|
Reference in New Issue
Block a user