summaryrefslogtreecommitdiff
path: root/openstackclient
diff options
context:
space:
mode:
Diffstat (limited to 'openstackclient')
-rw-r--r--openstackclient/identity/v2_0/catalog.py4
-rw-r--r--openstackclient/identity/v3/catalog.py2
-rw-r--r--openstackclient/identity/v3/identity_provider.py3
-rw-r--r--openstackclient/identity/v3/service_provider.py3
-rw-r--r--openstackclient/shell.py5
-rw-r--r--openstackclient/tests/compute/v2/fakes.py59
-rw-r--r--openstackclient/tests/compute/v2/test_service.py115
-rw-r--r--openstackclient/tests/fakes.py4
-rw-r--r--openstackclient/tests/identity/v2_0/test_catalog.py16
-rw-r--r--openstackclient/tests/identity/v3/test_catalog.py11
-rw-r--r--openstackclient/tests/identity/v3/test_identity_provider.py1
-rw-r--r--openstackclient/tests/identity/v3/test_service_provider.py1
-rw-r--r--openstackclient/tests/volume/v2/fakes.py38
-rw-r--r--openstackclient/tests/volume/v2/test_volume.py21
14 files changed, 193 insertions, 90 deletions
diff --git a/openstackclient/identity/v2_0/catalog.py b/openstackclient/identity/v2_0/catalog.py
index 669b04f3..53a6fe34 100644
--- a/openstackclient/identity/v2_0/catalog.py
+++ b/openstackclient/identity/v2_0/catalog.py
@@ -25,7 +25,9 @@ def _format_endpoints(eps=None):
return ""
ret = ''
for index, ep in enumerate(eps):
- region = eps[index].get('region', '<none>')
+ region = eps[index].get('region')
+ if region is None:
+ region = '<none>'
ret += region + '\n'
for endpoint_type in ['publicURL', 'internalURL', 'adminURL']:
url = eps[index].get(endpoint_type)
diff --git a/openstackclient/identity/v3/catalog.py b/openstackclient/identity/v3/catalog.py
index 38a57d90..78d71f59 100644
--- a/openstackclient/identity/v3/catalog.py
+++ b/openstackclient/identity/v3/catalog.py
@@ -25,7 +25,7 @@ def _format_endpoints(eps=None):
return ""
ret = ''
for ep in eps:
- region = ep.get('region_id') or ep.get('region', '<none>')
+ region = ep.get('region_id') or ep.get('region') or '<none>'
ret += region + '\n'
ret += " %s: %s\n" % (ep['interface'], ep['url'])
return ret
diff --git a/openstackclient/identity/v3/identity_provider.py b/openstackclient/identity/v3/identity_provider.py
index 276a7f57..39f440f4 100644
--- a/openstackclient/identity/v3/identity_provider.py
+++ b/openstackclient/identity/v3/identity_provider.py
@@ -214,7 +214,8 @@ class ShowIdentityProvider(command.ShowOne):
identity_client = self.app.client_manager.identity
idp = utils.find_resource(
identity_client.federation.identity_providers,
- parsed_args.identity_provider)
+ parsed_args.identity_provider,
+ id=parsed_args.identity_provider)
idp._info.pop('links', None)
remote_ids = utils.format_list(idp._info.pop('remote_ids', []))
diff --git a/openstackclient/identity/v3/service_provider.py b/openstackclient/identity/v3/service_provider.py
index e3a22ebb..8b433b4d 100644
--- a/openstackclient/identity/v3/service_provider.py
+++ b/openstackclient/identity/v3/service_provider.py
@@ -192,7 +192,8 @@ class ShowServiceProvider(command.ShowOne):
service_client = self.app.client_manager.identity
service_provider = utils.find_resource(
service_client.federation.service_providers,
- parsed_args.service_provider)
+ parsed_args.service_provider,
+ id=parsed_args.service_provider)
service_provider._info.pop('links', None)
return zip(*sorted(six.iteritems(service_provider._info)))
diff --git a/openstackclient/shell.py b/openstackclient/shell.py
index b96fb089..9968d73f 100644
--- a/openstackclient/shell.py
+++ b/openstackclient/shell.py
@@ -250,6 +250,11 @@ class OpenStackShell(app.App):
action='store_true',
help="Print API call timing info",
)
+ parser.add_argument(
+ '--enable-beta-commands',
+ action='store_true',
+ help="Enable beta commands which are subject to change",
+ )
# osprofiler HMAC key argument
if osprofiler_profiler:
diff --git a/openstackclient/tests/compute/v2/fakes.py b/openstackclient/tests/compute/v2/fakes.py
index 70fc386f..62a46b1d 100644
--- a/openstackclient/tests/compute/v2/fakes.py
+++ b/openstackclient/tests/compute/v2/fakes.py
@@ -76,17 +76,6 @@ QUOTA = {
QUOTA_columns = tuple(sorted(QUOTA))
QUOTA_data = tuple(QUOTA[x] for x in sorted(QUOTA))
-service_host = 'host_test'
-service_binary = 'compute_test'
-service_status = 'enabled'
-service_disabled_reason = 'earthquake'
-SERVICE = {
- 'host': service_host,
- 'binary': service_binary,
- 'status': service_status,
- 'disabled_reason': service_disabled_reason,
-}
-
class FakeAggregate(object):
"""Fake one aggregate."""
@@ -523,6 +512,54 @@ class FakeServer(object):
return mock.MagicMock(side_effect=servers)
+class FakeService(object):
+ """Fake one or more services."""
+
+ @staticmethod
+ def create_one_service(attrs=None):
+ """Create a fake service.
+
+ :param Dictionary attrs:
+ A dictionary with all attributes
+ :return:
+ A FakeResource object, with id, name, ram, vcpus, properties
+ """
+ attrs = attrs or {}
+
+ # Set default attributes.
+ service_info = {
+ 'host': 'host-' + uuid.uuid4().hex,
+ 'binary': 'binary-' + uuid.uuid4().hex,
+ 'status': 'enabled',
+ 'disabled_reason': 'earthquake',
+ }
+
+ # Overwrite default attributes.
+ service_info.update(attrs)
+
+ service = fakes.FakeResource(info=copy.deepcopy(service_info),
+ loaded=True)
+
+ return service
+
+ @staticmethod
+ def create_services(attrs=None, count=2):
+ """Create multiple fake services.
+
+ :param Dictionary attrs:
+ A dictionary with all attributes
+ :param int count:
+ The number of services to fake
+ :return:
+ A list of FakeResource objects faking the services
+ """
+ services = []
+ for i in range(0, count):
+ services.append(FakeService.create_one_service(attrs))
+
+ return services
+
+
class FakeFlavor(object):
"""Fake one or more flavors."""
diff --git a/openstackclient/tests/compute/v2/test_service.py b/openstackclient/tests/compute/v2/test_service.py
index db097204..7a5a840f 100644
--- a/openstackclient/tests/compute/v2/test_service.py
+++ b/openstackclient/tests/compute/v2/test_service.py
@@ -13,12 +13,10 @@
# under the License.
#
-import copy
import mock
from openstackclient.compute.v2 import service
from openstackclient.tests.compute.v2 import fakes as compute_fakes
-from openstackclient.tests import fakes
class TestService(compute_fakes.TestComputev2):
@@ -36,6 +34,8 @@ class TestServiceDelete(TestService):
def setUp(self):
super(TestServiceDelete, self).setUp()
+ self.service = compute_fakes.FakeService.create_one_service()
+
self.service_mock.delete.return_value = None
# Get the command object to test
@@ -43,17 +43,17 @@ class TestServiceDelete(TestService):
def test_service_delete_no_options(self):
arglist = [
- compute_fakes.service_binary,
+ self.service.binary,
]
verifylist = [
- ('service', compute_fakes.service_binary),
+ ('service', self.service.binary),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
result = self.cmd.take_action(parsed_args)
self.service_mock.delete.assert_called_with(
- compute_fakes.service_binary,
+ self.service.binary,
)
self.assertIsNone(result)
@@ -63,23 +63,21 @@ class TestServiceList(TestService):
def setUp(self):
super(TestServiceList, self).setUp()
- self.service_mock.list.return_value = [fakes.FakeResource(
- None,
- copy.deepcopy(compute_fakes.SERVICE),
- loaded=True,
- )]
+ self.service = compute_fakes.FakeService.create_one_service()
+
+ self.service_mock.list.return_value = [self.service]
# Get the command object to test
self.cmd = service.ListService(self.app, None)
def test_service_list(self):
arglist = [
- '--host', compute_fakes.service_host,
- '--service', compute_fakes.service_binary,
+ '--host', self.service.host,
+ '--service', self.service.binary,
]
verifylist = [
- ('host', compute_fakes.service_host),
- ('service', compute_fakes.service_binary),
+ ('host', self.service.host),
+ ('service', self.service.binary),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
@@ -89,22 +87,22 @@ class TestServiceList(TestService):
columns, data = self.cmd.take_action(parsed_args)
self.service_mock.list.assert_called_with(
- compute_fakes.service_host,
- compute_fakes.service_binary,
+ self.service.host,
+ self.service.binary,
)
self.assertNotIn("Disabled Reason", columns)
- self.assertNotIn(compute_fakes.service_disabled_reason, list(data)[0])
+ self.assertNotIn(self.service.disabled_reason, list(data)[0])
def test_service_list_with_long_option(self):
arglist = [
- '--host', compute_fakes.service_host,
- '--service', compute_fakes.service_binary,
+ '--host', self.service.host,
+ '--service', self.service.binary,
'--long'
]
verifylist = [
- ('host', compute_fakes.service_host),
- ('service', compute_fakes.service_binary),
+ ('host', self.service.host),
+ ('service', self.service.binary),
('long', True)
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
@@ -115,7 +113,7 @@ class TestServiceList(TestService):
columns, data = self.cmd.take_action(parsed_args)
self.assertIn("Disabled Reason", columns)
- self.assertIn(compute_fakes.service_disabled_reason, list(data)[0])
+ self.assertIn(self.service.disabled_reason, list(data)[0])
class TestServiceSet(TestService):
@@ -123,59 +121,52 @@ class TestServiceSet(TestService):
def setUp(self):
super(TestServiceSet, self).setUp()
- self.service_mock.enable.return_value = [fakes.FakeResource(
- None,
- copy.deepcopy(compute_fakes.SERVICE),
- loaded=True,
- )]
+ self.service = compute_fakes.FakeService.create_one_service()
- self.service_mock.disable.return_value = [fakes.FakeResource(
- None,
- copy.deepcopy(compute_fakes.SERVICE),
- loaded=True,
- )]
+ self.service_mock.enable.return_value = self.service
+ self.service_mock.disable.return_value = self.service
self.cmd = service.SetService(self.app, None)
def test_service_set_enable(self):
arglist = [
'--enable',
- compute_fakes.service_host,
- compute_fakes.service_binary,
+ self.service.host,
+ self.service.binary,
]
verifylist = [
('enabled', True),
- ('host', compute_fakes.service_host),
- ('service', compute_fakes.service_binary),
+ ('host', self.service.host),
+ ('service', self.service.binary),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
result = self.cmd.take_action(parsed_args)
self.service_mock.enable.assert_called_with(
- compute_fakes.service_host,
- compute_fakes.service_binary,
+ self.service.host,
+ self.service.binary
)
self.assertIsNone(result)
def test_service_set_disable(self):
arglist = [
'--disable',
- compute_fakes.service_host,
- compute_fakes.service_binary,
+ self.service.host,
+ self.service.binary,
]
verifylist = [
('enabled', False),
- ('host', compute_fakes.service_host),
- ('service', compute_fakes.service_binary),
+ ('host', self.service.host),
+ ('service', self.service.binary),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
result = self.cmd.take_action(parsed_args)
self.service_mock.disable.assert_called_with(
- compute_fakes.service_host,
- compute_fakes.service_binary,
+ self.service.host,
+ self.service.binary
)
self.assertIsNone(result)
@@ -184,22 +175,22 @@ class TestServiceSet(TestService):
arglist = [
'--disable',
'--disable-reason', reason,
- compute_fakes.service_host,
- compute_fakes.service_binary,
+ self.service.host,
+ self.service.binary,
]
verifylist = [
('enabled', False),
('disable_reason', reason),
- ('host', compute_fakes.service_host),
- ('service', compute_fakes.service_binary),
+ ('host', self.service.host),
+ ('service', self.service.binary),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
result = self.cmd.take_action(parsed_args)
self.service_mock.disable_log_reason.assert_called_with(
- compute_fakes.service_host,
- compute_fakes.service_binary,
+ self.service.host,
+ self.service.binary,
reason
)
self.assertIsNone(result)
@@ -208,14 +199,14 @@ class TestServiceSet(TestService):
reason = 'earthquake'
arglist = [
'--disable-reason', reason,
- compute_fakes.service_host,
- compute_fakes.service_binary,
+ self.service.host,
+ self.service.binary,
]
verifylist = [
('enabled', True),
('disable_reason', reason),
- ('host', compute_fakes.service_host),
- ('service', compute_fakes.service_binary),
+ ('host', self.service.host),
+ ('service', self.service.binary),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
@@ -226,8 +217,8 @@ class TestServiceSet(TestService):
mock_log.assert_called_once_with(msg)
self.service_mock.enable.assert_called_with(
- compute_fakes.service_host,
- compute_fakes.service_binary
+ self.service.host,
+ self.service.binary
)
self.assertIsNone(result)
@@ -236,14 +227,14 @@ class TestServiceSet(TestService):
arglist = [
'--enable',
'--disable-reason', reason,
- compute_fakes.service_host,
- compute_fakes.service_binary,
+ self.service.host,
+ self.service.binary,
]
verifylist = [
('enabled', True),
('disable_reason', reason),
- ('host', compute_fakes.service_host),
- ('service', compute_fakes.service_binary),
+ ('host', self.service.host),
+ ('service', self.service.binary),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
@@ -254,7 +245,7 @@ class TestServiceSet(TestService):
mock_log.assert_called_once_with(msg)
self.service_mock.enable.assert_called_with(
- compute_fakes.service_host,
- compute_fakes.service_binary
+ self.service.host,
+ self.service.binary
)
self.assertIsNone(result)
diff --git a/openstackclient/tests/fakes.py b/openstackclient/tests/fakes.py
index 46f983dc..229b4652 100644
--- a/openstackclient/tests/fakes.py
+++ b/openstackclient/tests/fakes.py
@@ -189,6 +189,10 @@ class FakeResource(object):
def keys(self):
return self._info.keys()
+ @property
+ def info(self):
+ return self._info
+
class FakeResponse(requests.Response):
diff --git a/openstackclient/tests/identity/v2_0/test_catalog.py b/openstackclient/tests/identity/v2_0/test_catalog.py
index 1e27bb3c..d9ae6a80 100644
--- a/openstackclient/tests/identity/v2_0/test_catalog.py
+++ b/openstackclient/tests/identity/v2_0/test_catalog.py
@@ -36,6 +36,12 @@ class TestCatalog(utils.TestCommand):
'internalURL': 'https://internal.two.example.com',
'adminURL': 'https://admin.two.example.com',
},
+ {
+ 'region': None,
+ 'publicURL': 'https://public.none.example.com',
+ 'internalURL': 'https://internal.none.example.com',
+ 'adminURL': 'https://admin.none.example.com',
+ },
],
}
@@ -87,7 +93,10 @@ class TestCatalogList(TestCatalog):
'adminURL: https://admin.one.example.com\n'
'two\n publicURL: https://public.two.example.com\n '
'internalURL: https://internal.two.example.com\n '
- 'adminURL: https://admin.two.example.com\n',
+ 'adminURL: https://admin.two.example.com\n'
+ '<none>\n publicURL: https://public.none.example.com\n '
+ 'internalURL: https://internal.none.example.com\n '
+ 'adminURL: https://admin.none.example.com\n',
), )
self.assertEqual(datalist, tuple(data))
@@ -164,7 +173,10 @@ class TestCatalogShow(TestCatalog):
'adminURL: https://admin.one.example.com\n'
'two\n publicURL: https://public.two.example.com\n '
'internalURL: https://internal.two.example.com\n '
- 'adminURL: https://admin.two.example.com\n',
+ 'adminURL: https://admin.two.example.com\n'
+ '<none>\n publicURL: https://public.none.example.com\n '
+ 'internalURL: https://internal.none.example.com\n '
+ 'adminURL: https://admin.none.example.com\n',
'qwertyuiop',
'supernova',
'compute',
diff --git a/openstackclient/tests/identity/v3/test_catalog.py b/openstackclient/tests/identity/v3/test_catalog.py
index a03c9d3e..1b8fa085 100644
--- a/openstackclient/tests/identity/v3/test_catalog.py
+++ b/openstackclient/tests/identity/v3/test_catalog.py
@@ -38,6 +38,11 @@ class TestCatalog(utils.TestCommand):
'url': 'https://internal.example.com',
'interface': 'internal',
},
+ {
+ 'region': None,
+ 'url': 'https://none.example.com',
+ 'interface': 'none',
+ },
],
}
@@ -81,7 +86,8 @@ class TestCatalogList(TestCatalog):
'compute',
'onlyone\n public: https://public.example.com\n'
'onlyone\n admin: https://admin.example.com\n'
- '<none>\n internal: https://internal.example.com\n',
+ '<none>\n internal: https://internal.example.com\n'
+ '<none>\n none: https://none.example.com\n',
), )
self.assertEqual(datalist, tuple(data))
@@ -114,7 +120,8 @@ class TestCatalogShow(TestCatalog):
datalist = (
'onlyone\n public: https://public.example.com\nonlyone\n'
' admin: https://admin.example.com\n'
- '<none>\n internal: https://internal.example.com\n',
+ '<none>\n internal: https://internal.example.com\n'
+ '<none>\n none: https://none.example.com\n',
'qwertyuiop',
'supernova',
'compute',
diff --git a/openstackclient/tests/identity/v3/test_identity_provider.py b/openstackclient/tests/identity/v3/test_identity_provider.py
index 465e79ba..3ff79812 100644
--- a/openstackclient/tests/identity/v3/test_identity_provider.py
+++ b/openstackclient/tests/identity/v3/test_identity_provider.py
@@ -616,6 +616,7 @@ class TestIdentityProviderShow(TestIdentityProvider):
self.identity_providers_mock.get.assert_called_with(
identity_fakes.idp_id,
+ id='test_idp'
)
collist = ('description', 'enabled', 'id', 'remote_ids')
diff --git a/openstackclient/tests/identity/v3/test_service_provider.py b/openstackclient/tests/identity/v3/test_service_provider.py
index 80d60c5a..99ea1f75 100644
--- a/openstackclient/tests/identity/v3/test_service_provider.py
+++ b/openstackclient/tests/identity/v3/test_service_provider.py
@@ -408,6 +408,7 @@ class TestServiceProviderShow(TestServiceProvider):
self.service_providers_mock.get.assert_called_with(
service_fakes.sp_id,
+ id='BETA'
)
collist = ('auth_url', 'description', 'enabled', 'id', 'sp_url')
diff --git a/openstackclient/tests/volume/v2/fakes.py b/openstackclient/tests/volume/v2/fakes.py
index eadbe5e8..181552d9 100644
--- a/openstackclient/tests/volume/v2/fakes.py
+++ b/openstackclient/tests/volume/v2/fakes.py
@@ -451,6 +451,44 @@ class FakeVolume(object):
return mock.MagicMock(side_effect=volumes)
+ @staticmethod
+ def get_volume_columns(volume=None):
+ """Get the volume columns from a faked volume object.
+
+ :param volume:
+ A FakeResource objects faking volume
+ :return
+ A tuple which may include the following keys:
+ ('id', 'name', 'description', 'status', 'size', 'volume_type',
+ 'metadata', 'snapshot', 'availability_zone', 'attachments')
+ """
+ if volume is not None:
+ return tuple(k for k in sorted(volume.keys()))
+ return tuple([])
+
+ @staticmethod
+ def get_volume_data(volume=None):
+ """Get the volume data from a faked volume object.
+
+ :param volume:
+ A FakeResource objects faking volume
+ :return
+ A tuple which may include the following values:
+ ('ce26708d', 'fake_volume', 'fake description', 'available',
+ 20, 'fake_lvmdriver-1', "Alpha='a', Beta='b', Gamma='g'",
+ 1, 'nova', [{'device': '/dev/ice', 'server_id': '1233'}])
+ """
+ data_list = []
+ if volume is not None:
+ for x in sorted(volume.keys()):
+ if x == 'tags':
+ # The 'tags' should be format_list
+ data_list.append(
+ common_utils.format_list(volume.info.get(x)))
+ else:
+ data_list.append(volume.info.get(x))
+ return tuple(data_list)
+
class FakeAvailabilityZone(object):
"""Fake one or more volume availability zones (AZs)."""
diff --git a/openstackclient/tests/volume/v2/test_volume.py b/openstackclient/tests/volume/v2/test_volume.py
index 5689d008..85ff6142 100644
--- a/openstackclient/tests/volume/v2/test_volume.py
+++ b/openstackclient/tests/volume/v2/test_volume.py
@@ -772,27 +772,30 @@ class TestVolumeShow(TestVolume):
def setUp(self):
super(TestVolumeShow, self).setUp()
- self.volumes_mock.get.return_value = fakes.FakeResource(
- None,
- copy.deepcopy(volume_fakes.VOLUME),
- loaded=True)
+ self._volume = volume_fakes.FakeVolume.create_one_volume()
+ self.volumes_mock.get.return_value = self._volume
# Get the command object to test
self.cmd = volume.ShowVolume(self.app, None)
def test_volume_show(self):
arglist = [
- volume_fakes.volume_id
+ self._volume.id
]
verifylist = [
- ("volume", volume_fakes.volume_id)
+ ("volume", self._volume.id)
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
columns, data = self.cmd.take_action(parsed_args)
- self.volumes_mock.get.assert_called_with(volume_fakes.volume_id)
+ self.volumes_mock.get.assert_called_with(self._volume.id)
+
+ self.assertEqual(
+ volume_fakes.FakeVolume.get_volume_columns(self._volume),
+ columns)
- self.assertEqual(volume_fakes.VOLUME_columns, columns)
- self.assertEqual(volume_fakes.VOLUME_data, data)
+ self.assertEqual(
+ volume_fakes.FakeVolume.get_volume_data(self._volume),
+ data)
class TestVolumeSet(TestVolume):