f079b5b9c4
User's don't know what a plugin is. * Internally, os_auth_type and/or auth_type represents what the user supplied. * auth_plugin_name is the name of the selected plugin * auth_plugin is the actual plugin object Plugin selection process: * if --os-auth-type is supplied: * if it matches against an available plugin, done * (if it can map to an availble plugin type, done; TODO in a followup) * if --os-auth-type is not supplied: * if --os-url and --os-token are supplied, select 'token_endpoint' * if --os-username supplied, select identity_api_version + 'password' * if --os-token supplied, select identity_api_version + 'token' Change-Id: Ice4535214e311ebf924087cf77f6d84d76f5f3ee
534 lines
18 KiB
Python
534 lines
18 KiB
Python
# Copyright 2012-2013 OpenStack, LLC.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
# not use this file except in compliance with the License. You may obtain
|
|
# a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
# License for the specific language governing permissions and limitations
|
|
# under the License.
|
|
#
|
|
|
|
import mock
|
|
import os
|
|
|
|
from openstackclient import shell
|
|
from openstackclient.tests import utils
|
|
|
|
|
|
DEFAULT_AUTH_URL = "http://127.0.0.1:5000/v2.0/"
|
|
DEFAULT_PROJECT_ID = "xxxx-yyyy-zzzz"
|
|
DEFAULT_PROJECT_NAME = "project"
|
|
DEFAULT_DOMAIN_ID = "aaaa-bbbb-cccc"
|
|
DEFAULT_DOMAIN_NAME = "domain"
|
|
DEFAULT_USER_DOMAIN_ID = "aaaa-bbbb-cccc"
|
|
DEFAULT_USER_DOMAIN_NAME = "domain"
|
|
DEFAULT_PROJECT_DOMAIN_ID = "aaaa-bbbb-cccc"
|
|
DEFAULT_PROJECT_DOMAIN_NAME = "domain"
|
|
DEFAULT_USERNAME = "username"
|
|
DEFAULT_PASSWORD = "password"
|
|
DEFAULT_REGION_NAME = "ZZ9_Plural_Z_Alpha"
|
|
DEFAULT_TOKEN = "token"
|
|
DEFAULT_SERVICE_URL = "http://127.0.0.1:8771/v3.0/"
|
|
DEFAULT_AUTH_PLUGIN = "v2password"
|
|
|
|
|
|
DEFAULT_COMPUTE_API_VERSION = "2"
|
|
DEFAULT_IDENTITY_API_VERSION = "2.0"
|
|
DEFAULT_IMAGE_API_VERSION = "v2"
|
|
DEFAULT_VOLUME_API_VERSION = "1"
|
|
DEFAULT_NETWORK_API_VERSION = "2"
|
|
|
|
LIB_COMPUTE_API_VERSION = "2"
|
|
LIB_IDENTITY_API_VERSION = "2.0"
|
|
LIB_IMAGE_API_VERSION = "1"
|
|
LIB_VOLUME_API_VERSION = "1"
|
|
LIB_NETWORK_API_VERSION = "2"
|
|
|
|
|
|
def make_shell():
|
|
"""Create a new command shell and mock out some bits."""
|
|
_shell = shell.OpenStackShell()
|
|
_shell.command_manager = mock.Mock()
|
|
|
|
return _shell
|
|
|
|
|
|
def fake_execute(shell, cmd):
|
|
"""Pretend to execute shell commands."""
|
|
return shell.run(cmd.split())
|
|
|
|
|
|
class TestShell(utils.TestCase):
|
|
def setUp(self):
|
|
super(TestShell, self).setUp()
|
|
patch = "openstackclient.shell.OpenStackShell.run_subcommand"
|
|
self.cmd_patch = mock.patch(patch)
|
|
self.cmd_save = self.cmd_patch.start()
|
|
self.app = mock.Mock("Test Shell")
|
|
|
|
def tearDown(self):
|
|
super(TestShell, self).tearDown()
|
|
self.cmd_patch.stop()
|
|
|
|
def _assert_password_auth(self, cmd_options, default_args):
|
|
with mock.patch("openstackclient.shell.OpenStackShell.initialize_app",
|
|
self.app):
|
|
_shell, _cmd = make_shell(), cmd_options + " list project"
|
|
fake_execute(_shell, _cmd)
|
|
|
|
self.app.assert_called_with(["list", "project"])
|
|
self.assertEqual(_shell.options.os_auth_url,
|
|
default_args["auth_url"])
|
|
self.assertEqual(_shell.options.os_project_id,
|
|
default_args["project_id"])
|
|
self.assertEqual(_shell.options.os_project_name,
|
|
default_args["project_name"])
|
|
self.assertEqual(_shell.options.os_domain_id,
|
|
default_args["domain_id"])
|
|
self.assertEqual(_shell.options.os_domain_name,
|
|
default_args["domain_name"])
|
|
self.assertEqual(_shell.options.os_user_domain_id,
|
|
default_args["user_domain_id"])
|
|
self.assertEqual(_shell.options.os_user_domain_name,
|
|
default_args["user_domain_name"])
|
|
self.assertEqual(_shell.options.os_project_domain_id,
|
|
default_args["project_domain_id"])
|
|
self.assertEqual(_shell.options.os_project_domain_name,
|
|
default_args["project_domain_name"])
|
|
self.assertEqual(_shell.options.os_username,
|
|
default_args["username"])
|
|
self.assertEqual(_shell.options.os_password,
|
|
default_args["password"])
|
|
self.assertEqual(_shell.options.os_region_name,
|
|
default_args["region_name"])
|
|
self.assertEqual(_shell.options.os_trust_id,
|
|
default_args["trust_id"])
|
|
self.assertEqual(_shell.options.os_auth_type,
|
|
default_args['auth_type'])
|
|
|
|
def _assert_token_auth(self, cmd_options, default_args):
|
|
with mock.patch("openstackclient.shell.OpenStackShell.initialize_app",
|
|
self.app):
|
|
_shell, _cmd = make_shell(), cmd_options + " list role"
|
|
fake_execute(_shell, _cmd)
|
|
|
|
self.app.assert_called_with(["list", "role"])
|
|
self.assertEqual(_shell.options.os_token, default_args["os_token"])
|
|
self.assertEqual(_shell.options.os_auth_url,
|
|
default_args["os_auth_url"])
|
|
|
|
def _assert_cli(self, cmd_options, default_args):
|
|
with mock.patch("openstackclient.shell.OpenStackShell.initialize_app",
|
|
self.app):
|
|
_shell, _cmd = make_shell(), cmd_options + " list server"
|
|
fake_execute(_shell, _cmd)
|
|
|
|
self.app.assert_called_with(["list", "server"])
|
|
self.assertEqual(_shell.options.os_compute_api_version,
|
|
default_args["compute_api_version"])
|
|
self.assertEqual(_shell.options.os_identity_api_version,
|
|
default_args["identity_api_version"])
|
|
self.assertEqual(_shell.options.os_image_api_version,
|
|
default_args["image_api_version"])
|
|
self.assertEqual(_shell.options.os_volume_api_version,
|
|
default_args["volume_api_version"])
|
|
self.assertEqual(_shell.options.os_network_api_version,
|
|
default_args["network_api_version"])
|
|
|
|
|
|
class TestShellHelp(TestShell):
|
|
"""Test the deferred help flag"""
|
|
def setUp(self):
|
|
super(TestShellHelp, self).setUp()
|
|
self.orig_env, os.environ = os.environ, {}
|
|
|
|
def tearDown(self):
|
|
super(TestShellHelp, self).tearDown()
|
|
os.environ = self.orig_env
|
|
|
|
def test_help_options(self):
|
|
flag = "-h list server"
|
|
kwargs = {
|
|
"deferred_help": True,
|
|
}
|
|
with mock.patch("openstackclient.shell.OpenStackShell.initialize_app",
|
|
self.app):
|
|
_shell, _cmd = make_shell(), flag
|
|
fake_execute(_shell, _cmd)
|
|
|
|
self.assertEqual(_shell.options.deferred_help,
|
|
kwargs["deferred_help"])
|
|
|
|
|
|
class TestShellPasswordAuth(TestShell):
|
|
def setUp(self):
|
|
super(TestShellPasswordAuth, self).setUp()
|
|
self.orig_env, os.environ = os.environ, {}
|
|
|
|
def tearDown(self):
|
|
super(TestShellPasswordAuth, self).tearDown()
|
|
os.environ = self.orig_env
|
|
|
|
def test_only_url_flow(self):
|
|
flag = "--os-auth-url " + DEFAULT_AUTH_URL
|
|
kwargs = {
|
|
"auth_url": DEFAULT_AUTH_URL,
|
|
"project_id": "",
|
|
"project_name": "",
|
|
"user_domain_id": "",
|
|
"domain_id": "",
|
|
"domain_name": "",
|
|
"user_domain_name": "",
|
|
"project_domain_id": "",
|
|
"project_domain_name": "",
|
|
"username": "",
|
|
"password": "",
|
|
"region_name": "",
|
|
"trust_id": "",
|
|
"auth_type": "",
|
|
}
|
|
self._assert_password_auth(flag, kwargs)
|
|
|
|
def test_only_project_id_flow(self):
|
|
flag = "--os-project-id " + DEFAULT_PROJECT_ID
|
|
kwargs = {
|
|
"auth_url": "",
|
|
"project_id": DEFAULT_PROJECT_ID,
|
|
"project_name": "",
|
|
"domain_id": "",
|
|
"domain_name": "",
|
|
"user_domain_id": "",
|
|
"user_domain_name": "",
|
|
"project_domain_id": "",
|
|
"project_domain_name": "",
|
|
"username": "",
|
|
"password": "",
|
|
"region_name": "",
|
|
"trust_id": "",
|
|
"auth_type": "",
|
|
}
|
|
self._assert_password_auth(flag, kwargs)
|
|
|
|
def test_only_project_name_flow(self):
|
|
flag = "--os-project-name " + DEFAULT_PROJECT_NAME
|
|
kwargs = {
|
|
"auth_url": "",
|
|
"project_id": "",
|
|
"project_name": DEFAULT_PROJECT_NAME,
|
|
"domain_id": "",
|
|
"domain_name": "",
|
|
"user_domain_id": "",
|
|
"user_domain_name": "",
|
|
"project_domain_id": "",
|
|
"project_domain_name": "",
|
|
"username": "",
|
|
"password": "",
|
|
"region_name": "",
|
|
"trust_id": "",
|
|
"auth_type": "",
|
|
}
|
|
self._assert_password_auth(flag, kwargs)
|
|
|
|
def test_only_domain_id_flow(self):
|
|
flag = "--os-domain-id " + DEFAULT_DOMAIN_ID
|
|
kwargs = {
|
|
"auth_url": "",
|
|
"project_id": "",
|
|
"project_name": "",
|
|
"domain_id": DEFAULT_DOMAIN_ID,
|
|
"domain_name": "",
|
|
"user_domain_id": "",
|
|
"user_domain_name": "",
|
|
"project_domain_id": "",
|
|
"project_domain_name": "",
|
|
"username": "",
|
|
"password": "",
|
|
"region_name": "",
|
|
"trust_id": "",
|
|
"auth_type": "",
|
|
}
|
|
self._assert_password_auth(flag, kwargs)
|
|
|
|
def test_only_domain_name_flow(self):
|
|
flag = "--os-domain-name " + DEFAULT_DOMAIN_NAME
|
|
kwargs = {
|
|
"auth_url": "",
|
|
"project_id": "",
|
|
"project_name": "",
|
|
"domain_id": "",
|
|
"domain_name": DEFAULT_DOMAIN_NAME,
|
|
"user_domain_id": "",
|
|
"user_domain_name": "",
|
|
"project_domain_id": "",
|
|
"project_domain_name": "",
|
|
"username": "",
|
|
"password": "",
|
|
"region_name": "",
|
|
"trust_id": "",
|
|
"auth_type": "",
|
|
}
|
|
self._assert_password_auth(flag, kwargs)
|
|
|
|
def test_only_user_domain_id_flow(self):
|
|
flag = "--os-user-domain-id " + DEFAULT_USER_DOMAIN_ID
|
|
kwargs = {
|
|
"auth_url": "",
|
|
"project_id": "",
|
|
"project_name": "",
|
|
"domain_id": "",
|
|
"domain_name": "",
|
|
"user_domain_id": DEFAULT_USER_DOMAIN_ID,
|
|
"user_domain_name": "",
|
|
"project_domain_id": "",
|
|
"project_domain_name": "",
|
|
"username": "",
|
|
"password": "",
|
|
"region_name": "",
|
|
"trust_id": "",
|
|
"auth_type": "",
|
|
}
|
|
self._assert_password_auth(flag, kwargs)
|
|
|
|
def test_only_user_domain_name_flow(self):
|
|
flag = "--os-user-domain-name " + DEFAULT_USER_DOMAIN_NAME
|
|
kwargs = {
|
|
"auth_url": "",
|
|
"project_id": "",
|
|
"project_name": "",
|
|
"domain_id": "",
|
|
"domain_name": "",
|
|
"user_domain_id": "",
|
|
"user_domain_name": DEFAULT_USER_DOMAIN_NAME,
|
|
"project_domain_id": "",
|
|
"project_domain_name": "",
|
|
"username": "",
|
|
"password": "",
|
|
"region_name": "",
|
|
"trust_id": "",
|
|
"auth_type": "",
|
|
}
|
|
self._assert_password_auth(flag, kwargs)
|
|
|
|
def test_only_project_domain_id_flow(self):
|
|
flag = "--os-project-domain-id " + DEFAULT_PROJECT_DOMAIN_ID
|
|
kwargs = {
|
|
"auth_url": "",
|
|
"project_id": "",
|
|
"project_name": "",
|
|
"domain_id": "",
|
|
"domain_name": "",
|
|
"user_domain_id": "",
|
|
"user_domain_name": "",
|
|
"project_domain_id": DEFAULT_PROJECT_DOMAIN_ID,
|
|
"project_domain_name": "",
|
|
"username": "",
|
|
"password": "",
|
|
"region_name": "",
|
|
"trust_id": "",
|
|
"auth_type": "",
|
|
}
|
|
self._assert_password_auth(flag, kwargs)
|
|
|
|
def test_only_project_domain_name_flow(self):
|
|
flag = "--os-project-domain-name " + DEFAULT_PROJECT_DOMAIN_NAME
|
|
kwargs = {
|
|
"auth_url": "",
|
|
"project_id": "",
|
|
"project_name": "",
|
|
"domain_id": "",
|
|
"domain_name": "",
|
|
"user_domain_id": "",
|
|
"user_domain_name": "",
|
|
"project_domain_id": "",
|
|
"project_domain_name": DEFAULT_PROJECT_DOMAIN_NAME,
|
|
"username": "",
|
|
"password": "",
|
|
"region_name": "",
|
|
"trust_id": "",
|
|
"auth_type": "",
|
|
}
|
|
self._assert_password_auth(flag, kwargs)
|
|
|
|
def test_only_username_flow(self):
|
|
flag = "--os-username " + DEFAULT_USERNAME
|
|
kwargs = {
|
|
"auth_url": "",
|
|
"project_id": "",
|
|
"project_name": "",
|
|
"domain_id": "",
|
|
"domain_name": "",
|
|
"user_domain_id": "",
|
|
"user_domain_name": "",
|
|
"project_domain_id": "",
|
|
"project_domain_name": "",
|
|
"username": DEFAULT_USERNAME,
|
|
"password": "",
|
|
"region_name": "",
|
|
"trust_id": "",
|
|
"auth_type": "",
|
|
}
|
|
self._assert_password_auth(flag, kwargs)
|
|
|
|
def test_only_password_flow(self):
|
|
flag = "--os-password " + DEFAULT_PASSWORD
|
|
kwargs = {
|
|
"auth_url": "",
|
|
"project_id": "",
|
|
"project_name": "",
|
|
"domain_id": "",
|
|
"domain_name": "",
|
|
"user_domain_id": "",
|
|
"user_domain_name": "",
|
|
"project_domain_id": "",
|
|
"project_domain_name": "",
|
|
"username": "",
|
|
"password": DEFAULT_PASSWORD,
|
|
"region_name": "",
|
|
"trust_id": "",
|
|
"auth_type": "",
|
|
}
|
|
self._assert_password_auth(flag, kwargs)
|
|
|
|
def test_only_region_name_flow(self):
|
|
flag = "--os-region-name " + DEFAULT_REGION_NAME
|
|
kwargs = {
|
|
"auth_url": "",
|
|
"project_id": "",
|
|
"project_name": "",
|
|
"domain_id": "",
|
|
"domain_name": "",
|
|
"user_domain_id": "",
|
|
"user_domain_name": "",
|
|
"project_domain_id": "",
|
|
"project_domain_name": "",
|
|
"username": "",
|
|
"password": "",
|
|
"region_name": DEFAULT_REGION_NAME,
|
|
"trust_id": "",
|
|
"auth_type": "",
|
|
}
|
|
self._assert_password_auth(flag, kwargs)
|
|
|
|
def test_only_trust_id_flow(self):
|
|
flag = "--os-trust-id " + "1234"
|
|
kwargs = {
|
|
"auth_url": "",
|
|
"project_id": "",
|
|
"project_name": "",
|
|
"domain_id": "",
|
|
"domain_name": "",
|
|
"user_domain_id": "",
|
|
"user_domain_name": "",
|
|
"project_domain_id": "",
|
|
"project_domain_name": "",
|
|
"username": "",
|
|
"password": "",
|
|
"region_name": "",
|
|
"trust_id": "1234",
|
|
"auth_type": "",
|
|
}
|
|
self._assert_password_auth(flag, kwargs)
|
|
|
|
def test_only_auth_type_flow(self):
|
|
flag = "--os-auth-type " + "v2password"
|
|
kwargs = {
|
|
"auth_url": "",
|
|
"project_id": "",
|
|
"project_name": "",
|
|
"domain_id": "",
|
|
"domain_name": "",
|
|
"user_domain_id": "",
|
|
"user_domain_name": "",
|
|
"project_domain_id": "",
|
|
"project_domain_name": "",
|
|
"username": "",
|
|
"password": "",
|
|
"region_name": "",
|
|
"trust_id": "",
|
|
"auth_type": DEFAULT_AUTH_PLUGIN
|
|
}
|
|
self._assert_password_auth(flag, kwargs)
|
|
|
|
|
|
class TestShellTokenAuth(TestShell):
|
|
def setUp(self):
|
|
super(TestShellTokenAuth, self).setUp()
|
|
env = {
|
|
"OS_TOKEN": DEFAULT_TOKEN,
|
|
"OS_AUTH_URL": DEFAULT_SERVICE_URL,
|
|
}
|
|
self.orig_env, os.environ = os.environ, env.copy()
|
|
|
|
def tearDown(self):
|
|
super(TestShellTokenAuth, self).tearDown()
|
|
os.environ = self.orig_env
|
|
|
|
def test_default_auth(self):
|
|
flag = ""
|
|
kwargs = {
|
|
"os_token": DEFAULT_TOKEN,
|
|
"os_auth_url": DEFAULT_SERVICE_URL
|
|
}
|
|
self._assert_token_auth(flag, kwargs)
|
|
|
|
def test_empty_auth(self):
|
|
os.environ = {}
|
|
flag = ""
|
|
kwargs = {
|
|
"os_token": "",
|
|
"os_auth_url": ""
|
|
}
|
|
self._assert_token_auth(flag, kwargs)
|
|
|
|
|
|
class TestShellCli(TestShell):
|
|
def setUp(self):
|
|
super(TestShellCli, self).setUp()
|
|
env = {
|
|
"OS_COMPUTE_API_VERSION": DEFAULT_COMPUTE_API_VERSION,
|
|
"OS_IDENTITY_API_VERSION": DEFAULT_IDENTITY_API_VERSION,
|
|
"OS_IMAGE_API_VERSION": DEFAULT_IMAGE_API_VERSION,
|
|
"OS_VOLUME_API_VERSION": DEFAULT_VOLUME_API_VERSION,
|
|
"OS_NETWORK_API_VERSION": DEFAULT_NETWORK_API_VERSION,
|
|
}
|
|
self.orig_env, os.environ = os.environ, env.copy()
|
|
|
|
def tearDown(self):
|
|
super(TestShellCli, self).tearDown()
|
|
os.environ = self.orig_env
|
|
|
|
def test_shell_args(self):
|
|
_shell = make_shell()
|
|
with mock.patch("openstackclient.shell.OpenStackShell.initialize_app",
|
|
self.app):
|
|
fake_execute(_shell, "list user")
|
|
self.app.assert_called_with(["list", "user"])
|
|
|
|
def test_default_env(self):
|
|
flag = ""
|
|
kwargs = {
|
|
"compute_api_version": DEFAULT_COMPUTE_API_VERSION,
|
|
"identity_api_version": DEFAULT_IDENTITY_API_VERSION,
|
|
"image_api_version": DEFAULT_IMAGE_API_VERSION,
|
|
"volume_api_version": DEFAULT_VOLUME_API_VERSION,
|
|
"network_api_version": DEFAULT_NETWORK_API_VERSION,
|
|
}
|
|
self._assert_cli(flag, kwargs)
|
|
|
|
def test_empty_env(self):
|
|
os.environ = {}
|
|
flag = ""
|
|
kwargs = {
|
|
"compute_api_version": LIB_COMPUTE_API_VERSION,
|
|
"identity_api_version": LIB_IDENTITY_API_VERSION,
|
|
"image_api_version": LIB_IMAGE_API_VERSION,
|
|
"volume_api_version": LIB_VOLUME_API_VERSION,
|
|
"network_api_version": LIB_NETWORK_API_VERSION
|
|
}
|
|
self._assert_cli(flag, kwargs)
|