summaryrefslogtreecommitdiff
path: root/openstackclient
diff options
context:
space:
mode:
Diffstat (limited to 'openstackclient')
-rw-r--r--openstackclient/common/logs.py (renamed from openstackclient/common/context.py)0
-rw-r--r--openstackclient/compute/v2/flavor.py13
-rw-r--r--openstackclient/compute/v2/server.py73
-rw-r--r--openstackclient/compute/v2/service.py22
-rw-r--r--openstackclient/identity/client.py2
-rw-r--r--openstackclient/identity/v3/credential.py31
-rw-r--r--openstackclient/identity/v3/region.py22
-rw-r--r--openstackclient/shell.py10
-rw-r--r--openstackclient/tests/api/fakes.py2
-rw-r--r--openstackclient/tests/api/test_image_v1.py2
-rw-r--r--openstackclient/tests/api/test_image_v2.py2
-rw-r--r--openstackclient/tests/api/test_network_v2.py2
-rw-r--r--openstackclient/tests/api/test_object_store_v1.py2
-rw-r--r--openstackclient/tests/common/test_logs.py (renamed from openstackclient/tests/common/test_context.py)64
-rw-r--r--openstackclient/tests/compute/v2/fakes.py4
-rw-r--r--openstackclient/tests/compute/v2/test_flavor.py20
-rw-r--r--openstackclient/tests/compute/v2/test_server.py28
-rw-r--r--openstackclient/tests/compute/v2/test_service.py54
-rw-r--r--openstackclient/tests/fakes.py2
-rw-r--r--openstackclient/tests/identity/v3/fakes.py6
-rw-r--r--openstackclient/tests/identity/v3/test_credential.py112
-rw-r--r--openstackclient/tests/identity/v3/test_region.py79
-rw-r--r--openstackclient/tests/object/v1/fakes.py2
-rw-r--r--openstackclient/volume/v1/volume.py2
-rw-r--r--openstackclient/volume/v2/volume.py6
25 files changed, 374 insertions, 188 deletions
diff --git a/openstackclient/common/context.py b/openstackclient/common/logs.py
index 6d1aec13..6d1aec13 100644
--- a/openstackclient/common/context.py
+++ b/openstackclient/common/logs.py
diff --git a/openstackclient/compute/v2/flavor.py b/openstackclient/compute/v2/flavor.py
index 3458cf79..7474580b 100644
--- a/openstackclient/compute/v2/flavor.py
+++ b/openstackclient/compute/v2/flavor.py
@@ -181,6 +181,15 @@ class ListFlavor(lister.Lister):
action='store_true',
default=False,
help='List additional fields in output')
+ parser.add_argument(
+ '--marker',
+ metavar="<marker>",
+ help='The last flavor ID of the previous page')
+ parser.add_argument(
+ '--limit',
+ type=int,
+ metavar="<limit>",
+ help='Maximum number of flavors to display')
return parser
def take_action(self, parsed_args):
@@ -202,7 +211,9 @@ class ListFlavor(lister.Lister):
# and flavors from their own projects only.
is_public = None if parsed_args.all else parsed_args.public
- data = compute_client.flavors.list(is_public=is_public)
+ data = compute_client.flavors.list(is_public=is_public,
+ marker=parsed_args.marker,
+ limit=parsed_args.limit)
if parsed_args.long:
columns = columns + (
diff --git a/openstackclient/compute/v2/server.py b/openstackclient/compute/v2/server.py
index 661ce847..b5e7f004 100644
--- a/openstackclient/compute/v2/server.py
+++ b/openstackclient/compute/v2/server.py
@@ -43,7 +43,7 @@ from openstackclient.network import common
def _format_servers_list_networks(networks):
"""Return a formatted string of a server's networks
- :param server: a Server.networks field
+ :param networks: a Server.networks field
:rtype: a string of formatted network addresses
"""
output = []
@@ -607,7 +607,7 @@ class DeleteServer(command.Command):
def get_parser(self, prog_name):
parser = super(DeleteServer, self).get_parser(prog_name)
parser.add_argument(
- 'servers',
+ 'server',
metavar='<server>',
nargs="+",
help=_('Server(s) to delete (name or ID)'),
@@ -622,7 +622,7 @@ class DeleteServer(command.Command):
@utils.log_method(log)
def take_action(self, parsed_args):
compute_client = self.app.client_manager.compute
- for server in parsed_args.servers:
+ for server in parsed_args.server:
server_obj = utils.find_resource(
compute_client.servers, server)
compute_client.servers.delete(server_obj.id)
@@ -735,7 +735,7 @@ class ListServer(lister.Lister):
user_id = None
if parsed_args.user:
- user_id = identity_common.find_project(
+ user_id = identity_common.find_user(
identity_client,
parsed_args.user,
parsed_args.user_domain,
@@ -915,7 +915,7 @@ class MigrateServer(command.Command):
class PauseServer(command.Command):
- """Pause server"""
+ """Pause server(s)"""
log = logging.getLogger(__name__ + '.PauseServer')
@@ -924,18 +924,19 @@ class PauseServer(command.Command):
parser.add_argument(
'server',
metavar='<server>',
- help=_('Server (name or ID)'),
+ nargs='+',
+ help=_('Server(s) to pause (name or ID)'),
)
return parser
@utils.log_method(log)
def take_action(self, parsed_args):
-
compute_client = self.app.client_manager.compute
- utils.find_resource(
- compute_client.servers,
- parsed_args.server,
- ).pause()
+ for server in parsed_args.server:
+ utils.find_resource(
+ compute_client.servers,
+ server
+ ).pause()
class RebootServer(command.Command):
@@ -1483,6 +1484,56 @@ class SshServer(command.Command):
os.system(cmd % (login, ip_address))
+class StartServer(command.Command):
+ """Start server(s)."""
+
+ log = logging.getLogger(__name__ + '.StartServer')
+
+ def get_parser(self, prog_name):
+ parser = super(StartServer, self).get_parser(prog_name)
+ parser.add_argument(
+ 'server',
+ metavar='<server>',
+ nargs="+",
+ help=_('Server(s) to start (name or ID)'),
+ )
+ return parser
+
+ @utils.log_method(log)
+ def take_action(self, parsed_args):
+ compute_client = self.app.client_manager.compute
+ for server in parsed_args.server:
+ utils.find_resource(
+ compute_client.servers,
+ server,
+ ).start()
+
+
+class StopServer(command.Command):
+ """Stop server(s)."""
+
+ log = logging.getLogger(__name__ + '.StopServer')
+
+ def get_parser(self, prog_name):
+ parser = super(StopServer, self).get_parser(prog_name)
+ parser.add_argument(
+ 'server',
+ metavar='<server>',
+ nargs="+",
+ help=_('Server(s) to stop (name or ID)'),
+ )
+ return parser
+
+ @utils.log_method(log)
+ def take_action(self, parsed_args):
+ compute_client = self.app.client_manager.compute
+ for server in parsed_args.server:
+ utils.find_resource(
+ compute_client.servers,
+ server,
+ ).stop()
+
+
class SuspendServer(command.Command):
"""Suspend server"""
diff --git a/openstackclient/compute/v2/service.py b/openstackclient/compute/v2/service.py
index 3a031bff..c2d51c2a 100644
--- a/openstackclient/compute/v2/service.py
+++ b/openstackclient/compute/v2/service.py
@@ -17,11 +17,33 @@
import logging
+from cliff import command
from cliff import lister
from openstackclient.common import utils
+class DeleteService(command.Command):
+ """Delete service command"""
+
+ log = logging.getLogger(__name__ + ".DeleteService")
+
+ def get_parser(self, prog_name):
+ parser = super(DeleteService, self).get_parser(prog_name)
+ parser.add_argument(
+ "service",
+ metavar="<service>",
+ help="Compute service to delete (ID only)")
+ return parser
+
+ def take_action(self, parsed_args):
+ self.log.debug("take_action(%s)", parsed_args)
+ compute_client = self.app.client_manager.compute
+
+ compute_client.services.delete(parsed_args.service)
+ return
+
+
class ListService(lister.Lister):
"""List service command"""
diff --git a/openstackclient/identity/client.py b/openstackclient/identity/client.py
index b8bb33f4..bd882ce8 100644
--- a/openstackclient/identity/client.py
+++ b/openstackclient/identity/client.py
@@ -21,7 +21,7 @@ from openstackclient.common import utils
LOG = logging.getLogger(__name__)
-DEFAULT_API_VERSION = '2'
+DEFAULT_API_VERSION = '3'
API_VERSION_OPTION = 'os_identity_api_version'
API_NAME = 'identity'
API_VERSIONS = {
diff --git a/openstackclient/identity/v3/credential.py b/openstackclient/identity/v3/credential.py
index dbd73e2e..f22092d4 100644
--- a/openstackclient/identity/v3/credential.py
+++ b/openstackclient/identity/v3/credential.py
@@ -17,7 +17,6 @@
import logging
import six
-import sys
from cliff import command
from cliff import lister
@@ -130,17 +129,20 @@ class SetCredential(command.Command):
parser.add_argument(
'--user',
metavar='<user>',
+ required=True,
help='Name or ID of user that owns the credential',
)
parser.add_argument(
'--type',
metavar='<type>',
choices=['ec2', 'cert'],
+ required=True,
help='New credential type',
)
parser.add_argument(
'--data',
metavar='<data>',
+ required=True,
help='New credential data',
)
parser.add_argument(
@@ -153,25 +155,22 @@ class SetCredential(command.Command):
@utils.log_method(log)
def take_action(self, parsed_args):
identity_client = self.app.client_manager.identity
- kwargs = {}
- if parsed_args.user:
- user_id = utils.find_resource(identity_client.users,
- parsed_args.user).id
- if user_id:
- kwargs['user'] = user_id
- if parsed_args.type:
- kwargs['type'] = parsed_args.type
- if parsed_args.data:
- kwargs['data'] = parsed_args.data
+
+ user_id = utils.find_resource(identity_client.users,
+ parsed_args.user).id
+
if parsed_args.project:
project = utils.find_resource(identity_client.projects,
parsed_args.project).id
- kwargs['project'] = project
+ else:
+ project = None
+
+ identity_client.credentials.update(parsed_args.credential,
+ user=user_id,
+ type=parsed_args.type,
+ blob=parsed_args.data,
+ project=project)
- if not kwargs:
- sys.stdout.write("Credential not updated, no arguments present")
- return
- identity_client.credentials.update(parsed_args.credential, **kwargs)
return
diff --git a/openstackclient/identity/v3/region.py b/openstackclient/identity/v3/region.py
index eb4c084c..1ff0b8c0 100644
--- a/openstackclient/identity/v3/region.py
+++ b/openstackclient/identity/v3/region.py
@@ -48,12 +48,6 @@ class CreateRegion(show.ShowOne):
metavar='<description>',
help=_('New region description'),
)
- parser.add_argument(
- '--url',
- metavar='<url>',
- help=_('New region url'),
- )
-
return parser
@utils.log_method(log)
@@ -62,7 +56,6 @@ class CreateRegion(show.ShowOne):
region = identity_client.regions.create(
id=parsed_args.region,
- url=parsed_args.url,
parent_region=parsed_args.parent_region,
description=parsed_args.description,
)
@@ -117,8 +110,8 @@ class ListRegion(lister.Lister):
if parsed_args.parent_region:
kwargs['parent_region_id'] = parsed_args.parent_region
- columns_headers = ('Region', 'Parent Region', 'Description', 'URL')
- columns = ('ID', 'Parent Region Id', 'Description', 'URL')
+ columns_headers = ('Region', 'Parent Region', 'Description')
+ columns = ('ID', 'Parent Region Id', 'Description')
data = identity_client.regions.list(**kwargs)
return (columns_headers,
@@ -150,25 +143,16 @@ class SetRegion(command.Command):
metavar='<description>',
help=_('New region description'),
)
- parser.add_argument(
- '--url',
- metavar='<url>',
- help=_('New region url'),
- )
return parser
@utils.log_method(log)
def take_action(self, parsed_args):
identity_client = self.app.client_manager.identity
- if (not parsed_args.url
- and not parsed_args.parent_region
- and not parsed_args.description):
+ if not parsed_args.parent_region and not parsed_args.description:
return
kwargs = {}
- if parsed_args.url:
- kwargs['url'] = parsed_args.url
if parsed_args.description:
kwargs['description'] = parsed_args.description
if parsed_args.parent_region:
diff --git a/openstackclient/shell.py b/openstackclient/shell.py
index 1a5055bd..5b4939a2 100644
--- a/openstackclient/shell.py
+++ b/openstackclient/shell.py
@@ -30,8 +30,8 @@ from oslo_utils import strutils
import openstackclient
from openstackclient.common import clientmanager
from openstackclient.common import commandmanager
-from openstackclient.common import context
from openstackclient.common import exceptions as exc
+from openstackclient.common import logs
from openstackclient.common import timing
from openstackclient.common import utils
@@ -103,7 +103,7 @@ class OpenStackShell(app.App):
def configure_logging(self):
"""Configure logging for the app."""
- self.log_configurator = context.LogConfigurator(self.options)
+ self.log_configurator = logs.LogConfigurator(self.options)
self.dump_stack_trace = self.log_configurator.dump_trace
def run(self, argv):
@@ -241,6 +241,10 @@ class OpenStackShell(app.App):
},
)
+ # TODO(thowe): Change cliff so the default value for debug
+ # can be set to None.
+ if not self.options.debug:
+ self.options.debug = None
self.cloud = cc.get_one_cloud(
cloud=self.options.cloud,
argparse=self.options,
@@ -276,7 +280,7 @@ class OpenStackShell(app.App):
for mod in clientmanager.PLUGIN_MODULES:
default_version = getattr(mod, 'DEFAULT_API_VERSION', None)
option = mod.API_VERSION_OPTION.replace('os_', '')
- version_opt = self.cloud.config.get(option, default_version)
+ version_opt = str(self.cloud.config.get(option, default_version))
if version_opt:
api = mod.API_NAME
self.api_version[api] = version_opt
diff --git a/openstackclient/tests/api/fakes.py b/openstackclient/tests/api/fakes.py
index 85617ab7..e285a61c 100644
--- a/openstackclient/tests/api/fakes.py
+++ b/openstackclient/tests/api/fakes.py
@@ -15,7 +15,7 @@
from requests_mock.contrib import fixture
-from keystoneclient import session
+from keystoneauth1 import session
from openstackclient.tests import utils
diff --git a/openstackclient/tests/api/test_image_v1.py b/openstackclient/tests/api/test_image_v1.py
index 34fcfca4..f3479756 100644
--- a/openstackclient/tests/api/test_image_v1.py
+++ b/openstackclient/tests/api/test_image_v1.py
@@ -15,7 +15,7 @@
from requests_mock.contrib import fixture
-from keystoneclient import session
+from keystoneauth1 import session
from openstackclient.api import image_v1
from openstackclient.tests import utils
diff --git a/openstackclient/tests/api/test_image_v2.py b/openstackclient/tests/api/test_image_v2.py
index ddb160ee..77063997 100644
--- a/openstackclient/tests/api/test_image_v2.py
+++ b/openstackclient/tests/api/test_image_v2.py
@@ -15,7 +15,7 @@
from requests_mock.contrib import fixture
-from keystoneclient import session
+from keystoneauth1 import session
from openstackclient.api import image_v2
from openstackclient.tests import utils
diff --git a/openstackclient/tests/api/test_network_v2.py b/openstackclient/tests/api/test_network_v2.py
index 13c5d6ea..80f1d9de 100644
--- a/openstackclient/tests/api/test_network_v2.py
+++ b/openstackclient/tests/api/test_network_v2.py
@@ -15,7 +15,7 @@
from requests_mock.contrib import fixture
-from keystoneclient import session
+from keystoneauth1 import session
from openstackclient.api import network_v2 as network
from openstackclient.tests import utils
diff --git a/openstackclient/tests/api/test_object_store_v1.py b/openstackclient/tests/api/test_object_store_v1.py
index 0f7c4559..992bf261 100644
--- a/openstackclient/tests/api/test_object_store_v1.py
+++ b/openstackclient/tests/api/test_object_store_v1.py
@@ -17,7 +17,7 @@ import mock
from requests_mock.contrib import fixture
-from keystoneclient import session
+from keystoneauth1 import session
from openstackclient.api import object_store_v1 as object_store
from openstackclient.tests import utils
diff --git a/openstackclient/tests/common/test_context.py b/openstackclient/tests/common/test_logs.py
index 55e42851..fe054a3b 100644
--- a/openstackclient/tests/common/test_context.py
+++ b/openstackclient/tests/common/test_logs.py
@@ -14,7 +14,7 @@
import logging
import mock
-from openstackclient.common import context
+from openstackclient.common import logs
from openstackclient.tests import utils
@@ -23,51 +23,51 @@ class TestContext(utils.TestCase):
def test_log_level_from_options(self):
opts = mock.Mock()
opts.verbose_level = 0
- self.assertEqual(logging.ERROR, context.log_level_from_options(opts))
+ self.assertEqual(logging.ERROR, logs.log_level_from_options(opts))
opts.verbose_level = 1
- self.assertEqual(logging.WARNING, context.log_level_from_options(opts))
+ self.assertEqual(logging.WARNING, logs.log_level_from_options(opts))
opts.verbose_level = 2
- self.assertEqual(logging.INFO, context.log_level_from_options(opts))
+ self.assertEqual(logging.INFO, logs.log_level_from_options(opts))
opts.verbose_level = 3
- self.assertEqual(logging.DEBUG, context.log_level_from_options(opts))
+ self.assertEqual(logging.DEBUG, logs.log_level_from_options(opts))
def test_log_level_from_config(self):
cfg = {'verbose_level': 0}
- self.assertEqual(logging.ERROR, context.log_level_from_config(cfg))
+ self.assertEqual(logging.ERROR, logs.log_level_from_config(cfg))
cfg = {'verbose_level': 1}
- self.assertEqual(logging.WARNING, context.log_level_from_config(cfg))
+ self.assertEqual(logging.WARNING, logs.log_level_from_config(cfg))
cfg = {'verbose_level': 2}
- self.assertEqual(logging.INFO, context.log_level_from_config(cfg))
+ self.assertEqual(logging.INFO, logs.log_level_from_config(cfg))
cfg = {'verbose_level': 3}
- self.assertEqual(logging.DEBUG, context.log_level_from_config(cfg))
+ self.assertEqual(logging.DEBUG, logs.log_level_from_config(cfg))
cfg = {'verbose_level': 1, 'log_level': 'critical'}
- self.assertEqual(logging.CRITICAL, context.log_level_from_config(cfg))
+ self.assertEqual(logging.CRITICAL, logs.log_level_from_config(cfg))
cfg = {'verbose_level': 1, 'log_level': 'error'}
- self.assertEqual(logging.ERROR, context.log_level_from_config(cfg))
+ self.assertEqual(logging.ERROR, logs.log_level_from_config(cfg))
cfg = {'verbose_level': 1, 'log_level': 'warning'}
- self.assertEqual(logging.WARNING, context.log_level_from_config(cfg))
+ self.assertEqual(logging.WARNING, logs.log_level_from_config(cfg))
cfg = {'verbose_level': 1, 'log_level': 'info'}
- self.assertEqual(logging.INFO, context.log_level_from_config(cfg))
+ self.assertEqual(logging.INFO, logs.log_level_from_config(cfg))
cfg = {'verbose_level': 1, 'log_level': 'debug'}
- self.assertEqual(logging.DEBUG, context.log_level_from_config(cfg))
+ self.assertEqual(logging.DEBUG, logs.log_level_from_config(cfg))
cfg = {'verbose_level': 1, 'log_level': 'bogus'}
- self.assertEqual(logging.WARNING, context.log_level_from_config(cfg))
+ self.assertEqual(logging.WARNING, logs.log_level_from_config(cfg))
cfg = {'verbose_level': 1, 'log_level': 'info', 'debug': True}
- self.assertEqual(logging.DEBUG, context.log_level_from_config(cfg))
+ self.assertEqual(logging.DEBUG, logs.log_level_from_config(cfg))
@mock.patch('warnings.simplefilter')
def test_set_warning_filter(self, simplefilter):
- context.set_warning_filter(logging.ERROR)
+ logs.set_warning_filter(logging.ERROR)
simplefilter.assert_called_with("ignore")
- context.set_warning_filter(logging.WARNING)
+ logs.set_warning_filter(logging.WARNING)
simplefilter.assert_called_with("ignore")
- context.set_warning_filter(logging.INFO)
+ logs.set_warning_filter(logging.INFO)
simplefilter.assert_called_with("once")
class TestFileFormatter(utils.TestCase):
def test_nothing(self):
- formatter = context._FileFormatter()
+ formatter = logs._FileFormatter()
self.assertEqual(('%(asctime)s.%(msecs)03d %(process)d %(levelname)s '
'%(name)s %(message)s'), formatter.fmt)
@@ -77,7 +77,7 @@ class TestFileFormatter(utils.TestCase):
os_project_name = 'projecty'
username = 'usernamey'
options = Opts()
- formatter = context._FileFormatter(options=options)
+ formatter = logs._FileFormatter(options=options)
self.assertEqual(('%(asctime)s.%(msecs)03d %(process)d %(levelname)s '
'%(name)s [cloudy usernamey projecty] %(message)s'),
formatter.fmt)
@@ -86,7 +86,7 @@ class TestFileFormatter(utils.TestCase):
config = mock.Mock()
config.config = {'cloud': 'cloudy'}
config.auth = {'project_name': 'projecty', 'username': 'usernamey'}
- formatter = context._FileFormatter(config=config)
+ formatter = logs._FileFormatter(config=config)
self.assertEqual(('%(asctime)s.%(msecs)03d %(process)d %(levelname)s '
'%(name)s [cloudy usernamey projecty] %(message)s'),
formatter.fmt)
@@ -119,7 +119,7 @@ class TestLogConfigurator(utils.TestCase):
@mock.patch('logging.StreamHandler')
@mock.patch('logging.getLogger')
- @mock.patch('openstackclient.common.context.set_warning_filter')
+ @mock.patch('openstackclient.common.logs.set_warning_filter')
def test_init(self, warning_filter, getLogger, handle):
getLogger.side_effect = self.loggers
console_logger = mock.Mock()
@@ -127,7 +127,7 @@ class TestLogConfigurator(utils.TestCase):
console_logger.setLevel = mock.Mock()
handle.return_value = console_logger
- configurator = context.LogConfigurator(self.options)
+ configurator = logs.LogConfigurator(self.options)
getLogger.assert_called_with('iso8601') # last call
warning_filter.assert_called_with(logging.WARNING)
@@ -140,12 +140,12 @@ class TestLogConfigurator(utils.TestCase):
self.assertEqual(False, configurator.dump_trace)
@mock.patch('logging.getLogger')
- @mock.patch('openstackclient.common.context.set_warning_filter')
+ @mock.patch('openstackclient.common.logs.set_warning_filter')
def test_init_no_debug(self, warning_filter, getLogger):
getLogger.side_effect = self.loggers
self.options.debug = True
- configurator = context.LogConfigurator(self.options)
+ configurator = logs.LogConfigurator(self.options)
warning_filter.assert_called_with(logging.DEBUG)
self.requests_log.setLevel.assert_called_with(logging.DEBUG)
@@ -153,8 +153,8 @@ class TestLogConfigurator(utils.TestCase):
@mock.patch('logging.FileHandler')
@mock.patch('logging.getLogger')
- @mock.patch('openstackclient.common.context.set_warning_filter')
- @mock.patch('openstackclient.common.context._FileFormatter')
+ @mock.patch('openstackclient.common.logs.set_warning_filter')
+ @mock.patch('openstackclient.common.logs._FileFormatter')
def test_init_log_file(self, formatter, warning_filter, getLogger, handle):
getLogger.side_effect = self.loggers
self.options.log_file = '/tmp/log_file'
@@ -165,7 +165,7 @@ class TestLogConfigurator(utils.TestCase):
mock_formatter = mock.Mock()
formatter.return_value = mock_formatter
- context.LogConfigurator(self.options)
+ logs.LogConfigurator(self.options)
handle.assert_called_with(filename=self.options.log_file)
self.root_logger.addHandler.assert_called_with(file_logger)
@@ -174,11 +174,11 @@ class TestLogConfigurator(utils.TestCase):
@mock.patch('logging.FileHandler')
@mock.patch('logging.getLogger')
- @mock.patch('openstackclient.common.context.set_warning_filter')
- @mock.patch('openstackclient.common.context._FileFormatter')
+ @mock.patch('openstackclient.common.logs.set_warning_filter')
+ @mock.patch('openstackclient.common.logs._FileFormatter')
def test_configure(self, formatter, warning_filter, getLogger, handle):
getLogger.side_effect = self.loggers
- configurator = context.LogConfigurator(self.options)
+ configurator = logs.LogConfigurator(self.options)
cloud_config = mock.Mock()
config_log = '/tmp/config_log'
cloud_config.config = {
diff --git a/openstackclient/tests/compute/v2/fakes.py b/openstackclient/tests/compute/v2/fakes.py
index e798bd40..08eb5afa 100644
--- a/openstackclient/tests/compute/v2/fakes.py
+++ b/openstackclient/tests/compute/v2/fakes.py
@@ -25,6 +25,8 @@ from openstackclient.tests import utils
server_id = 'serv1'
server_name = 'waiter'
+service_id = '1'
+
SERVER = {
'id': server_id,
'name': server_name,
@@ -85,6 +87,8 @@ class FakeComputev2Client(object):
self.images.resource_class = fakes.FakeResource(None, {})
self.servers = mock.Mock()
self.servers.resource_class = fakes.FakeResource(None, {})
+ self.services = mock.Mock()
+ self.services.resource_class = fakes.FakeResource(None, {})
self.extensions = mock.Mock()
self.extensions.resource_class = fakes.FakeResource(None, {})
self.flavors = mock.Mock()
diff --git a/openstackclient/tests/compute/v2/test_flavor.py b/openstackclient/tests/compute/v2/test_flavor.py
index 19be8124..523104f0 100644
--- a/openstackclient/tests/compute/v2/test_flavor.py
+++ b/openstackclient/tests/compute/v2/test_flavor.py
@@ -76,7 +76,9 @@ class TestFlavorList(TestFlavor):
# Set expected values
kwargs = {
- 'is_public': True
+ 'is_public': True,
+ 'limit': None,
+ 'marker': None
}
self.flavors_mock.list.assert_called_with(
@@ -119,7 +121,9 @@ class TestFlavorList(TestFlavor):
# Set expected values
kwargs = {
- 'is_public': None
+ 'is_public': None,
+ 'limit': None,
+ 'marker': None
}
self.flavors_mock.list.assert_called_with(
@@ -162,7 +166,9 @@ class TestFlavorList(TestFlavor):
# Set expected values
kwargs = {
- 'is_public': False
+ 'is_public': False,
+ 'limit': None,
+ 'marker': None
}
self.flavors_mock.list.assert_called_with(
@@ -205,7 +211,9 @@ class TestFlavorList(TestFlavor):
# Set expected values
kwargs = {
- 'is_public': True
+ 'is_public': True,
+ 'limit': None,
+ 'marker': None
}
self.flavors_mock.list.assert_called_with(
@@ -248,7 +256,9 @@ class TestFlavorList(TestFlavor):
# Set expected values
kwargs = {
- 'is_public': True
+ 'is_public': True,
+ 'limit': None,
+ 'marker': None
}
self.flavors_mock.list.assert_called_with(
diff --git a/openstackclient/tests/compute/v2/test_server.py b/openstackclient/tests/compute/v2/test_server.py
index 1e99bcd0..f420ff0a 100644
--- a/openstackclient/tests/compute/v2/test_server.py
+++ b/openstackclient/tests/compute/v2/test_server.py
@@ -85,10 +85,10 @@ class TestServerCreate(TestServer):
def test_server_create_no_options(self):
arglist = [
- compute_fakes.server_id,
+ compute_fakes.server_name,
]
verifylist = [
- ('server_name', compute_fakes.server_id),
+ ('server_name', compute_fakes.server_name),
]
try:
# Missing required args should bail here
@@ -100,13 +100,13 @@ class TestServerCreate(TestServer):
arglist = [
'--image', 'image1',
'--flavor', 'flavor1',
- compute_fakes.server_id,
+ compute_fakes.server_name,
]
verifylist = [
('image', 'image1'),
('flavor', 'flavor1'),
('config_drive', False),
- ('server_name', compute_fakes.server_id),
+ ('server_name', compute_fakes.server_name),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
@@ -131,7 +131,7 @@ class TestServerCreate(TestServer):
)
# ServerManager.create(name, image, flavor, **kwargs)
self.servers_mock.create.assert_called_with(
- compute_fakes.server_id,
+ compute_fakes.server_name,
self.image,
self.flavor,
**kwargs
@@ -154,14 +154,14 @@ class TestServerCreate(TestServer):
'--flavor', 'flavor1',
'--nic', 'net-id=net1',
'--nic', 'port-id=port1',
- compute_fakes.server_id,
+ compute_fakes.server_name,
]
verifylist = [
('image', 'image1'),
('flavor', 'flavor1'),
('nic', ['net-id=net1', 'port-id=port1']),
('config_drive', False),
- ('server_name', compute_fakes.server_id),
+ ('server_name', compute_fakes.server_name),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
@@ -207,7 +207,7 @@ class TestServerCreate(TestServer):
)
# ServerManager.create(name, image, flavor, **kwargs)
self.servers_mock.create.assert_called_with(
- compute_fakes.server_id,
+ compute_fakes.server_name,
self.image,
self.flavor,
**kwargs
@@ -234,14 +234,14 @@ class TestServerCreate(TestServer):
'--image', 'image1',
'--flavor', 'flavor1',
'--user-data', 'userdata.sh',
- compute_fakes.server_id,
+ compute_fakes.server_name,
]
verifylist = [
('image', 'image1'),
('flavor', 'flavor1'),
('user_data', 'userdata.sh'),
('config_drive', False),
- ('server_name', compute_fakes.server_id),
+ ('server_name', compute_fakes.server_name),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
@@ -272,7 +272,7 @@ class TestServerCreate(TestServer):
)
# ServerManager.create(name, image, flavor, **kwargs)
self.servers_mock.create.assert_called_with(
- compute_fakes.server_id,
+ compute_fakes.server_name,
self.image,
self.flavor,
**kwargs
@@ -311,7 +311,7 @@ class TestServerDelete(TestServer):
compute_fakes.server_id,
]
verifylist = [
- ('servers', [compute_fakes.server_id]),
+ ('server', [compute_fakes.server_id]),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
@@ -328,7 +328,7 @@ class TestServerDelete(TestServer):
compute_fakes.server_id, '--wait'
]
verifylist = [
- ('servers', [compute_fakes.server_id]),
+ ('server', [compute_fakes.server_id]),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
@@ -351,7 +351,7 @@ class TestServerDelete(TestServer):
compute_fakes.server_id, '--wait'
]
verifylist = [
- ('servers', [compute_fakes.server_id]),
+ ('server', [compute_fakes.server_id]),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
diff --git a/openstackclient/tests/compute/v2/test_service.py b/openstackclient/tests/compute/v2/test_service.py
new file mode 100644
index 00000000..c6db30ac
--- /dev/null
+++ b/openstackclient/tests/compute/v2/test_service.py
@@ -0,0 +1,54 @@
+# Copyright 2015 Mirantis, Inc.
+#
+# 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.
+#
+
+from openstackclient.compute.v2 import service
+from openstackclient.tests.compute.v2 import fakes as compute_fakes
+
+
+class TestService(compute_fakes.TestComputev2):
+
+ def setUp(self):
+ super(TestService, self).setUp()
+
+ # Get a shortcut to the ServiceManager Mock
+ self.service_mock = self.app.client_manager.compute.services
+ self.service_mock.reset_mock()
+
+
+class TestServiceDelete(TestService):
+
+ def setUp(self):
+ super(TestServiceDelete, self).setUp()
+
+ self.service_mock.delete.return_value = None
+
+ # Get the command object to test
+ self.cmd = service.DeleteService(self.app, None)
+
+ def test_service_delete_no_options(self):
+ arglist = [
+ compute_fakes.service_id,
+ ]
+ verifylist = [
+ ('service', compute_fakes.service_id),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # DisplayCommandBase.take_action() returns two tuples
+ self.cmd.take_action(parsed_args)
+
+ self.service_mock.delete.assert_called_with(
+ compute_fakes.service_id,
+ )
diff --git a/openstackclient/tests/fakes.py b/openstackclient/tests/fakes.py
index 979f9481..357c470f 100644
--- a/openstackclient/tests/fakes.py
+++ b/openstackclient/tests/fakes.py
@@ -17,7 +17,7 @@ import json
import six
import sys
-from keystoneclient import fixture
+from keystoneauth1 import fixture
import requests
diff --git a/openstackclient/tests/identity/v3/fakes.py b/openstackclient/tests/identity/v3/fakes.py
index 9c4de9cc..61e74f9c 100644
--- a/openstackclient/tests/identity/v3/fakes.py
+++ b/openstackclient/tests/identity/v3/fakes.py
@@ -123,13 +123,11 @@ PROJECT_2 = {
}
region_id = 'region_one'
-region_url = 'http://localhost:1111'
region_parent_region_id = 'region_two'
region_description = 'region one'
REGION = {
'id': region_id,
- 'url': region_url,
'description': region_description,
'parent_region_id': region_parent_region_id,
'links': base_url + 'regions/' + region_id,
@@ -195,6 +193,8 @@ SERVICE_WITHOUT_NAME = {
'links': base_url + 'services/' + service_id,
}
+credential_id = 'c-123'
+
endpoint_id = 'e-123'
endpoint_url = 'http://127.0.0.1:35357'
endpoint_region = 'RegionOne'
@@ -400,6 +400,8 @@ class FakeIdentityv3Client(object):
def __init__(self, **kwargs):
self.domains = mock.Mock()
self.domains.resource_class = fakes.FakeResource(None, {})
+ self.credentials = mock.Mock()
+ self.credentials.resource_class = fakes.FakeResource(None, {})
self.endpoints = mock.Mock()
self.endpoints.resource_class = fakes.FakeResource(None, {})
self.groups = mock.Mock()
diff --git a/openstackclient/tests/identity/v3/test_credential.py b/openstackclient/tests/identity/v3/test_credential.py
new file mode 100644
index 00000000..e2e690c3
--- /dev/null
+++ b/openstackclient/tests/identity/v3/test_credential.py
@@ -0,0 +1,112 @@
+# 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 json
+
+from openstackclient.identity.v3 import credential
+from openstackclient.tests.identity.v3 import fakes as identity_fakes
+from openstackclient.tests import utils
+
+
+class TestCredential(identity_fakes.TestIdentityv3):
+ data = {
+ "access": "abc123",
+ "secret": "hidden-message",
+ "trust_id": None
+ }
+
+ def __init__(self, *args):
+ super(TestCredential, self).__init__(*args)
+
+ self.json_data = json.dumps(self.data)
+
+ def setUp(self):
+ super(TestCredential, self).setUp()
+
+ # Get a shortcut to the CredentialManager Mock
+ self.credentials_mock = self.app.client_manager.identity.credentials
+ self.credentials_mock.reset_mock()
+
+ # Get a shortcut to the UserManager Mock
+ self.users_mock = self.app.client_manager.identity.users
+ self.users_mock.reset_mock()
+
+ # Get a shortcut to the ProjectManager Mock
+ self.projects_mock = self.app.client_manager.identity.projects
+ self.projects_mock.reset_mock()
+
+
+class TestCredentialSet(TestCredential):
+ def setUp(self):
+ super(TestCredentialSet, self).setUp()
+ self.cmd = credential.SetCredential(self.app, None)
+
+ def test_credential_set_no_options(self):
+ arglist = [
+ identity_fakes.credential_id,
+ ]
+
+ self.assertRaises(utils.ParserException,
+ self.check_parser, self.cmd, arglist, [])
+
+ def test_credential_set_missing_user(self):
+ arglist = [
+ '--type', 'ec2',
+ '--data', self.json_data,
+ identity_fakes.credential_id,
+ ]
+
+ self.assertRaises(utils.ParserException,
+ self.check_parser, self.cmd, arglist, [])
+
+ def test_credential_set_missing_type(self):
+ arglist = [
+ '--user', identity_fakes.user_name,
+ '--data', self.json_data,
+ identity_fakes.credential_id,
+ ]
+
+ self.assertRaises(utils.ParserException,
+ self.check_parser, self.cmd, arglist, [])
+
+ def test_credential_set_missing_data(self):
+ arglist = [
+ '--user', identity_fakes.user_name,
+ '--type', 'ec2',
+ identity_fakes.credential_id,
+ ]
+
+ self.assertRaises(utils.ParserException,
+ self.check_parser, self.cmd, arglist, [])
+
+ def test_credential_set_valid(self):
+ arglist = [
+ '--user', identity_fakes.user_name,
+ '--type', 'ec2',
+ '--data', self.json_data,
+ identity_fakes.credential_id,
+ ]
+
+ parsed_args = self.check_parser(self.cmd, arglist, [])
+ self.cmd.take_action(parsed_args)
+
+ def test_credential_set_valid_with_project(self):
+ arglist = [
+ '--user', identity_fakes.user_name,
+ '--type', 'ec2',
+ '--data', self.json_data,
+ '--project', identity_fakes.project_name,
+ identity_fakes.credential_id,
+ ]
+
+ parsed_args = self.check_parser(self.cmd, arglist, [])
+ self.cmd.take_action(parsed_args)
diff --git a/openstackclient/tests/identity/v3/test_region.py b/openstackclient/tests/identity/v3/test_region.py
index 7f6ced9f..0ebbbecf 100644
--- a/openstackclient/tests/identity/v3/test_region.py
+++ b/openstackclient/tests/identity/v3/test_region.py
@@ -61,19 +61,17 @@ class TestRegionCreate(TestRegion):
'description': identity_fakes.region_description,
'id': identity_fakes.region_id,
'parent_region': None,
- 'url': None,
}
self.regions_mock.create.assert_called_with(
**kwargs
)
- collist = ('description', 'parent_region', 'region', 'url')
+ collist = ('description', 'parent_region', 'region')
self.assertEqual(collist, columns)
datalist = (
identity_fakes.region_description,
identity_fakes.region_parent_region_id,
identity_fakes.region_id,
- identity_fakes.region_url,
)
self.assertEqual(datalist, data)
@@ -94,19 +92,17 @@ class TestRegionCreate(TestRegion):
'description': None,
'id': identity_fakes.region_id,
'parent_region': None,
- 'url': None,
}
self.regions_mock.create.assert_called_with(
**kwargs
)
- collist = ('description', 'parent_region', 'region', 'url')
+ collist = ('description', 'parent_region', 'region')
self.assertEqual(collist, columns)
datalist = (
identity_fakes.region_description,
identity_fakes.region_parent_region_id,
identity_fakes.region_id,
- identity_fakes.region_url,
)
self.assertEqual(datalist, data)
@@ -129,54 +125,17 @@ class TestRegionCreate(TestRegion):
'description': None,
'id': identity_fakes.region_id,
'parent_region': identity_fakes.region_parent_region_id,
- 'url': None,
}
self.regions_mock.create.assert_called_with(
**kwargs
)
- collist = ('description', 'parent_region', 'region', 'url')
+ collist = ('description', 'parent_region', 'region')
self.assertEqual(collist, columns)
datalist = (
identity_fakes.region_description,
identity_fakes.region_parent_region_id,
identity_fakes.region_id,
- identity_fakes.region_url,
- )
- self.assertEqual(datalist, data)
-
- def test_region_create_url(self):
- arglist = [
- identity_fakes.region_id,
- '--url', identity_fakes.region_url,
- ]
- verifylist = [
- ('region', identity_fakes.region_id),
- ('url', identity_fakes.region_url),
- ]
- parsed_args = self.check_parser(self.cmd, arglist, verifylist)
-
- # DisplayCommandBase.take_action() returns two tuples
- columns, data = self.cmd.take_action(parsed_args)
-
- # Set expected values
- kwargs = {
- 'description': None,
- 'id': identity_fakes.region_id,
- 'parent_region': None,
- 'url': identity_fakes.region_url,
- }
- self.regions_mock.create.assert_called_with(
- **kwargs
- )
-
- collist = ('description', 'parent_region', 'region', 'url')
- self.assertEqual(collist, columns)
- datalist = (
- identity_fakes.region_description,
- identity_fakes.region_parent_region_id,
- identity_fakes.region_id,
- identity_fakes.region_url,
)
self.assertEqual(datalist, data)
@@ -233,13 +192,12 @@ class TestRegionList(TestRegion):
columns, data = self.cmd.take_action(parsed_args)
self.regions_mock.list.assert_called_with()
- collist = ('Region', 'Parent Region', 'Description', 'URL')
+ collist = ('Region', 'Parent Region', 'Description')
self.assertEqual(collist, columns)
datalist = ((
identity_fakes.region_id,
identity_fakes.region_parent_region_id,
identity_fakes.region_description,
- identity_fakes.region_url,
), )
self.assertEqual(datalist, tuple(data))
@@ -257,13 +215,12 @@ class TestRegionList(TestRegion):
self.regions_mock.list.assert_called_with(
parent_region_id=identity_fakes.region_parent_region_id)
- collist = ('Region', 'Parent Region', 'Description', 'URL')
+ collist = ('Region', 'Parent Region', 'Description')
self.assertEqual(collist, columns)
datalist = ((
identity_fakes.region_id,
identity_fakes.region_parent_region_id,
identity_fakes.region_description,
- identity_fakes.region_url,
), )
self.assertEqual(datalist, tuple(data))
@@ -319,29 +276,6 @@ class TestRegionSet(TestRegion):
**kwargs
)
- def test_region_set_url(self):
- arglist = [
- '--url', 'new url',
- identity_fakes.region_id,
- ]
- verifylist = [
- ('url', 'new url'),
- ('region', identity_fakes.region_id),
- ]
- parsed_args = self.check_parser(self.cmd, arglist, verifylist)
-
- result = self.cmd.run(parsed_args)
- self.assertEqual(0, result)
-
- # Set expected values
- kwargs = {
- 'url': 'new url',
- }
- self.regions_mock.update.assert_called_with(
- identity_fakes.region_id,
- **kwargs
- )
-
def test_region_set_parent_region_id(self):
arglist = [
'--parent-region', 'new_parent',
@@ -395,12 +329,11 @@ class TestRegionShow(TestRegion):
identity_fakes.region_id,
)
- collist = ('description', 'parent_region', 'region', 'url')
+ collist = ('description', 'parent_region', 'region')
self.assertEqual(collist, columns)
datalist = (
identity_fakes.region_description,
identity_fakes.region_parent_region_id,
identity_fakes.region_id,
- identity_fakes.region_url,
)
self.assertEqual(datalist, data)
diff --git a/openstackclient/tests/object/v1/fakes.py b/openstackclient/tests/object/v1/fakes.py
index 6aef05b1..986ab2f3 100644
--- a/openstackclient/tests/object/v1/fakes.py
+++ b/openstackclient/tests/object/v1/fakes.py
@@ -13,7 +13,7 @@
# under the License.
#
-from keystoneclient import session
+from keystoneauth1 import session
from openstackclient.api import object_store_v1 as object_store
from openstackclient.tests import utils
diff --git a/openstackclient/volume/v1/volume.py b/openstackclient/volume/v1/volume.py
index 92afe8b0..0691d884 100644
--- a/openstackclient/volume/v1/volume.py
+++ b/openstackclient/volume/v1/volume.py
@@ -239,7 +239,7 @@ class ListVolume(lister.Lister):
def _format_attach(attachments):
"""Return a formatted string of a volume's attached instances
- :param volume: a volume.attachments field
+ :param attachments: a volume.attachments field
:rtype: a string of formatted instances
"""
diff --git a/openstackclient/volume/v2/volume.py b/openstackclient/volume/v2/volume.py
index f59567cc..f34198dc 100644
--- a/openstackclient/volume/v2/volume.py
+++ b/openstackclient/volume/v2/volume.py
@@ -304,9 +304,9 @@ class ListVolume(lister.Lister):
user_id = None
if parsed_args.user:
- user_id = identity_common.find_project(identity_client,
- parsed_args.user,
- parsed_args.user_domain)
+ user_id = identity_common.find_user(identity_client,
+ parsed_args.user,
+ parsed_args.user_domain)
search_opts = {
'all_tenants': parsed_args.all_projects,