summaryrefslogtreecommitdiff
path: root/openstackclient
diff options
context:
space:
mode:
Diffstat (limited to 'openstackclient')
-rw-r--r--openstackclient/compute/client.py1
-rw-r--r--openstackclient/identity/v3/domain.py24
-rw-r--r--openstackclient/identity/v3/group.py36
-rw-r--r--openstackclient/identity/v3/role_assignment.py12
-rw-r--r--openstackclient/identity/v3/service.py14
-rw-r--r--openstackclient/tests/identity/v3/fakes.py2
-rw-r--r--openstackclient/tests/identity/v3/test_service.py87
-rw-r--r--openstackclient/volume/v1/volume.py41
8 files changed, 171 insertions, 46 deletions
diff --git a/openstackclient/compute/client.py b/openstackclient/compute/client.py
index 3725350a..166747d5 100644
--- a/openstackclient/compute/client.py
+++ b/openstackclient/compute/client.py
@@ -50,6 +50,7 @@ def make_client(instance):
extensions=extensions,
http_log_debug=http_log_debug,
timings=instance.timing,
+ region_name=instance._region_name,
)
return client
diff --git a/openstackclient/identity/v3/domain.py b/openstackclient/identity/v3/domain.py
index 9e50fe54..727f5b18 100644
--- a/openstackclient/identity/v3/domain.py
+++ b/openstackclient/identity/v3/domain.py
@@ -29,7 +29,7 @@ from openstackclient.i18n import _ # noqa
class CreateDomain(show.ShowOne):
- """Create domain command"""
+ """Create new domain"""
log = logging.getLogger(__name__ + '.CreateDomain')
@@ -42,7 +42,7 @@ class CreateDomain(show.ShowOne):
)
parser.add_argument(
'--description',
- metavar='<domain-description>',
+ metavar='<description>',
help='New domain description',
)
enable_group = parser.add_mutually_exclusive_group()
@@ -87,7 +87,7 @@ class CreateDomain(show.ShowOne):
class DeleteDomain(command.Command):
- """Delete domain command"""
+ """Delete domain"""
log = logging.getLogger(__name__ + '.DeleteDomain')
@@ -96,7 +96,7 @@ class DeleteDomain(command.Command):
parser.add_argument(
'domain',
metavar='<domain>',
- help='Name or ID of domain to delete',
+ help='Domain to delete (name or ID)',
)
return parser
@@ -110,7 +110,7 @@ class DeleteDomain(command.Command):
class ListDomain(lister.Lister):
- """List domain command"""
+ """List domains"""
log = logging.getLogger(__name__ + '.ListDomain')
@@ -126,7 +126,7 @@ class ListDomain(lister.Lister):
class SetDomain(command.Command):
- """Set domain command"""
+ """Set domain properties"""
log = logging.getLogger(__name__ + '.SetDomain')
@@ -135,16 +135,16 @@ class SetDomain(command.Command):
parser.add_argument(
'domain',
metavar='<domain>',
- help='Name or ID of domain to change',
+ help='Domain to modify (name or ID)',
)
parser.add_argument(
'--name',
- metavar='<new-domain-name>',
+ metavar='<name>',
help='New domain name',
)
parser.add_argument(
'--description',
- metavar='<domain-description>',
+ metavar='<description>',
help='New domain description',
)
enable_group = parser.add_mutually_exclusive_group()
@@ -152,7 +152,7 @@ class SetDomain(command.Command):
'--enable',
dest='enabled',
action='store_true',
- help='Enable domain (default)',
+ help='Enable domain',
)
enable_group.add_argument(
'--disable',
@@ -185,7 +185,7 @@ class SetDomain(command.Command):
class ShowDomain(show.ShowOne):
- """Show domain command"""
+ """Show domain details"""
log = logging.getLogger(__name__ + '.ShowDomain')
@@ -194,7 +194,7 @@ class ShowDomain(show.ShowOne):
parser.add_argument(
'domain',
metavar='<domain>',
- help='Name or ID of domain to display',
+ help='Domain to display (name or ID)',
)
return parser
diff --git a/openstackclient/identity/v3/group.py b/openstackclient/identity/v3/group.py
index 327a64d5..fbd8dd72 100644
--- a/openstackclient/identity/v3/group.py
+++ b/openstackclient/identity/v3/group.py
@@ -39,12 +39,12 @@ class AddUserToGroup(command.Command):
parser.add_argument(
'group',
metavar='<group>',
- help='Group name or ID that user will be added to',
+ help='Group that user will be added to (name or ID)',
)
parser.add_argument(
'user',
metavar='<user>',
- help='User name or ID to add to group',
+ help='User to add to group (name or ID)',
)
return parser
@@ -68,7 +68,7 @@ class AddUserToGroup(command.Command):
class CheckUserInGroup(command.Command):
- """Checks that user is in a specific group"""
+ """Check user in group"""
log = logging.getLogger(__name__ + '.CheckUserInGroup')
@@ -77,12 +77,12 @@ class CheckUserInGroup(command.Command):
parser.add_argument(
'group',
metavar='<group>',
- help='Group name or ID that user will be added to',
+ help='Group to check if user belongs to (name or ID)',
)
parser.add_argument(
'user',
metavar='<user>',
- help='User name or ID to add to group',
+ help='User to check (name or ID)',
)
return parser
@@ -106,7 +106,7 @@ class CheckUserInGroup(command.Command):
class CreateGroup(show.ShowOne):
- """Create group command"""
+ """Create new group"""
log = logging.getLogger(__name__ + '.CreateGroup')
@@ -118,11 +118,11 @@ class CreateGroup(show.ShowOne):
help='New group name')
parser.add_argument(
'--description',
- metavar='<group-description>',
+ metavar='<description>',
help='New group description')
parser.add_argument(
'--domain',
- metavar='<group-domain>',
+ metavar='<domain>',
help='References the domain ID or name which owns the group')
parser.add_argument(
'--or-show',
@@ -268,12 +268,12 @@ class RemoveUserFromGroup(command.Command):
parser.add_argument(
'group',
metavar='<group>',
- help='Group name or ID that user will be removed from',
+ help='Group that user will be removed from (name or ID)',
)
parser.add_argument(
'user',
metavar='<user>',
- help='User name or ID to remove from group',
+ help='User to remove from group (name or ID)',
)
return parser
@@ -297,7 +297,7 @@ class RemoveUserFromGroup(command.Command):
class SetGroup(command.Command):
- """Set group command"""
+ """Set group properties"""
log = logging.getLogger(__name__ + '.SetGroup')
@@ -306,18 +306,18 @@ class SetGroup(command.Command):
parser.add_argument(
'group',
metavar='<group>',
- help='Name or ID of group to change')
+ help='Group to modify (name or ID)')
parser.add_argument(
'--name',
- metavar='<new-group-name>',
+ metavar='<name>',
help='New group name')
parser.add_argument(
'--domain',
- metavar='<group-domain>',
- help='New domain name or ID that will now own the group')
+ metavar='<domain>',
+ help='New domain that will now own the group (name or ID)')
parser.add_argument(
'--description',
- metavar='<group-description>',
+ metavar='<description>',
help='New group description')
return parser
@@ -341,7 +341,7 @@ class SetGroup(command.Command):
class ShowGroup(show.ShowOne):
- """Show group command"""
+ """Show group details"""
log = logging.getLogger(__name__ + '.ShowGroup')
@@ -350,7 +350,7 @@ class ShowGroup(show.ShowOne):
parser.add_argument(
'group',
metavar='<group>',
- help='Name or ID of group to display',
+ help='Group to display (name or ID)',
)
parser.add_argument(
'--domain',
diff --git a/openstackclient/identity/v3/role_assignment.py b/openstackclient/identity/v3/role_assignment.py
index 5cc97e8d..f053b608 100644
--- a/openstackclient/identity/v3/role_assignment.py
+++ b/openstackclient/identity/v3/role_assignment.py
@@ -21,7 +21,7 @@ from openstackclient.common import utils
class ListRoleAssignment(lister.Lister):
- """Lists role assignments according to the given filters"""
+ """List role assignments"""
log = logging.getLogger(__name__ + '.ListRoleAssignment')
@@ -36,29 +36,29 @@ class ListRoleAssignment(lister.Lister):
parser.add_argument(
'--role',
metavar='<role>',
- help='Name or ID of role to filter',
+ help='Role to filter (name or ID)',
)
user_or_group = parser.add_mutually_exclusive_group()
user_or_group.add_argument(
'--user',
metavar='<user>',
- help='Name or ID of user to filter',
+ help='User to filter (name or ID)',
)
user_or_group.add_argument(
'--group',
metavar='<group>',
- help='Name or ID of group to filter',
+ help='Group to filter (name or ID)',
)
domain_or_project = parser.add_mutually_exclusive_group()
domain_or_project.add_argument(
'--domain',
metavar='<domain>',
- help='Name or ID of domain to filter',
+ help='Domain to filter (name or ID)',
)
domain_or_project.add_argument(
'--project',
metavar='<project>',
- help='Name or ID of project to filter',
+ help='Project to filter (name or ID)',
)
return parser
diff --git a/openstackclient/identity/v3/service.py b/openstackclient/identity/v3/service.py
index 4f622269..f4c5d426 100644
--- a/openstackclient/identity/v3/service.py
+++ b/openstackclient/identity/v3/service.py
@@ -43,6 +43,11 @@ class CreateService(show.ShowOne):
metavar='<service-name>',
help='New service name',
)
+ parser.add_argument(
+ '--description',
+ metavar='<description>',
+ help='New service description',
+ )
enable_group = parser.add_mutually_exclusive_group()
enable_group.add_argument(
'--enable',
@@ -67,6 +72,7 @@ class CreateService(show.ShowOne):
service = identity_client.services.create(
name=parsed_args.name,
type=parsed_args.type,
+ description=parsed_args.description,
enabled=enabled,
)
@@ -137,6 +143,11 @@ class SetService(command.Command):
metavar='<service-name>',
help='New service name',
)
+ parser.add_argument(
+ '--description',
+ metavar='<description>',
+ help='New service description',
+ )
enable_group = parser.add_mutually_exclusive_group()
enable_group.add_argument(
'--enable',
@@ -156,6 +167,7 @@ class SetService(command.Command):
if (not parsed_args.name
and not parsed_args.type
+ and not parsed_args.description
and not parsed_args.enable
and not parsed_args.disable):
return
@@ -167,6 +179,8 @@ class SetService(command.Command):
kwargs['type'] = parsed_args.type
if parsed_args.name:
kwargs['name'] = parsed_args.name
+ if parsed_args.description:
+ kwargs['description'] = parsed_args.description
if parsed_args.enable:
kwargs['enabled'] = True
if parsed_args.disable:
diff --git a/openstackclient/tests/identity/v3/fakes.py b/openstackclient/tests/identity/v3/fakes.py
index 7acaa7f1..fbdac4ed 100644
--- a/openstackclient/tests/identity/v3/fakes.py
+++ b/openstackclient/tests/identity/v3/fakes.py
@@ -147,11 +147,13 @@ ROLE = {
service_id = 's-123'
service_name = 'Texaco'
service_type = 'gas'
+service_description = 'oil brand'
SERVICE = {
'id': service_id,
'name': service_name,
'type': service_type,
+ 'description': service_description,
'enabled': True,
'links': base_url + 'services/' + service_id,
}
diff --git a/openstackclient/tests/identity/v3/test_service.py b/openstackclient/tests/identity/v3/test_service.py
index 57db77b1..5e4dc585 100644
--- a/openstackclient/tests/identity/v3/test_service.py
+++ b/openstackclient/tests/identity/v3/test_service.py
@@ -51,6 +51,7 @@ class TestServiceCreate(TestService):
]
verifylist = [
('name', identity_fakes.service_name),
+ ('description', None),
('enable', False),
('disable', False),
('type', identity_fakes.service_type),
@@ -64,12 +65,50 @@ class TestServiceCreate(TestService):
self.services_mock.create.assert_called_with(
name=identity_fakes.service_name,
type=identity_fakes.service_type,
+ description=None,
enabled=True,
)
- collist = ('enabled', 'id', 'name', 'type')
+ collist = ('description', 'enabled', 'id', 'name', 'type')
self.assertEqual(columns, collist)
datalist = (
+ identity_fakes.service_description,
+ True,
+ identity_fakes.service_id,
+ identity_fakes.service_name,
+ identity_fakes.service_type,
+ )
+ self.assertEqual(data, datalist)
+
+ def test_service_create_description(self):
+ arglist = [
+ '--description', identity_fakes.service_description,
+ identity_fakes.service_type,
+ ]
+ verifylist = [
+ ('name', None),
+ ('description', identity_fakes.service_description),
+ ('enable', False),
+ ('disable', False),
+ ('type', identity_fakes.service_type),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # DisplayCommandBase.take_action() returns two tuples
+ columns, data = self.cmd.take_action(parsed_args)
+
+ # ServiceManager.create(name=, type=, enabled=, **kwargs)
+ self.services_mock.create.assert_called_with(
+ name=None,
+ type=identity_fakes.service_type,
+ description=identity_fakes.service_description,
+ enabled=True,
+ )
+
+ collist = ('description', 'enabled', 'id', 'name', 'type')
+ self.assertEqual(columns, collist)
+ datalist = (
+ identity_fakes.service_description,
True,
identity_fakes.service_id,
identity_fakes.service_name,
@@ -84,6 +123,7 @@ class TestServiceCreate(TestService):
]
verifylist = [
('name', None),
+ ('description', None),
('enable', True),
('disable', False),
('type', identity_fakes.service_type),
@@ -97,12 +137,14 @@ class TestServiceCreate(TestService):
self.services_mock.create.assert_called_with(
name=None,
type=identity_fakes.service_type,
+ description=None,
enabled=True,
)
- collist = ('enabled', 'id', 'name', 'type')
+ collist = ('description', 'enabled', 'id', 'name', 'type')
self.assertEqual(columns, collist)
datalist = (
+ identity_fakes.service_description,
True,
identity_fakes.service_id,
identity_fakes.service_name,
@@ -117,6 +159,7 @@ class TestServiceCreate(TestService):
]
verifylist = [
('name', None),
+ ('description', None),
('enable', False),
('disable', True),
('type', identity_fakes.service_type),
@@ -130,12 +173,14 @@ class TestServiceCreate(TestService):
self.services_mock.create.assert_called_with(
name=None,
type=identity_fakes.service_type,
+ description=None,
enabled=False,
)
- collist = ('enabled', 'id', 'name', 'type')
+ collist = ('description', 'enabled', 'id', 'name', 'type')
self.assertEqual(columns, collist)
datalist = (
+ identity_fakes.service_description,
True,
identity_fakes.service_id,
identity_fakes.service_name,
@@ -239,6 +284,7 @@ class TestServiceSet(TestService):
verifylist = [
('type', None),
('name', None),
+ ('description', None),
('enable', False),
('disable', False),
('service', identity_fakes.service_name),
@@ -256,6 +302,7 @@ class TestServiceSet(TestService):
verifylist = [
('type', identity_fakes.service_type),
('name', None),
+ ('description', None),
('enable', False),
('disable', False),
('service', identity_fakes.service_name),
@@ -283,6 +330,7 @@ class TestServiceSet(TestService):
verifylist = [
('type', None),
('name', identity_fakes.service_name),
+ ('description', None),
('enable', False),
('disable', False),
('service', identity_fakes.service_name),
@@ -302,6 +350,34 @@ class TestServiceSet(TestService):
**kwargs
)
+ def test_service_set_description(self):
+ arglist = [
+ '--description', identity_fakes.service_description,
+ identity_fakes.service_name,
+ ]
+ verifylist = [
+ ('type', None),
+ ('name', None),
+ ('description', identity_fakes.service_description),
+ ('enable', False),
+ ('disable', False),
+ ('service', identity_fakes.service_name),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ result = self.cmd.run(parsed_args)
+ self.assertEqual(result, 0)
+
+ # Set expected values
+ kwargs = {
+ 'description': identity_fakes.service_description,
+ }
+ # ServiceManager.update(service, name=, type=, enabled=, **kwargs)
+ self.services_mock.update.assert_called_with(
+ identity_fakes.service_id,
+ **kwargs
+ )
+
def test_service_set_enable(self):
arglist = [
'--enable',
@@ -310,6 +386,7 @@ class TestServiceSet(TestService):
verifylist = [
('type', None),
('name', None),
+ ('description', None),
('enable', True),
('disable', False),
('service', identity_fakes.service_name),
@@ -337,6 +414,7 @@ class TestServiceSet(TestService):
verifylist = [
('type', None),
('name', None),
+ ('description', None),
('enable', False),
('disable', True),
('service', identity_fakes.service_name),
@@ -388,9 +466,10 @@ class TestServiceShow(TestService):
identity_fakes.service_name,
)
- collist = ('enabled', 'id', 'name', 'type')
+ collist = ('description', 'enabled', 'id', 'name', 'type')
self.assertEqual(columns, collist)
datalist = (
+ identity_fakes.service_description,
True,
identity_fakes.service_id,
identity_fakes.service_name,
diff --git a/openstackclient/volume/v1/volume.py b/openstackclient/volume/v1/volume.py
index 73ae3a7f..d82f6b4b 100644
--- a/openstackclient/volume/v1/volume.py
+++ b/openstackclient/volume/v1/volume.py
@@ -223,6 +223,25 @@ class ListVolume(lister.Lister):
def take_action(self, parsed_args):
self.log.debug('take_action(%s)', parsed_args)
+ volume_client = self.app.client_manager.volume
+ compute_client = self.app.client_manager.compute
+
+ def _format_attach(attachments):
+ """Return a formatted string of a volume's attached instances
+
+ :param volume: a volume.attachments field
+ :rtype: a string of formatted instances
+ """
+
+ msg = ''
+ for attachment in attachments:
+ server = attachment['server_id']
+ if server in server_cache.keys():
+ server = server_cache[server].name
+ device = attachment['device']
+ msg += 'Attached to %s on %s ' % (server, device)
+ return msg
+
if parsed_args.long:
columns = (
'ID',
@@ -231,7 +250,7 @@ class ListVolume(lister.Lister):
'Size',
'Volume Type',
'Bootable',
- 'Attached to',
+ 'Attachments',
'Metadata',
)
column_headers = (
@@ -241,7 +260,7 @@ class ListVolume(lister.Lister):
'Size',
'Type',
'Bootable',
- 'Attached',
+ 'Attached to',
'Properties',
)
else:
@@ -250,28 +269,38 @@ class ListVolume(lister.Lister):
'Display Name',
'Status',
'Size',
- 'Attached to',
+ 'Attachments',
)
column_headers = (
'ID',
'Display Name',
'Status',
'Size',
- 'Attached',
+ 'Attached to',
)
+
+ # Cache the server list
+ server_cache = {}
+ try:
+ for s in compute_client.servers.list():
+ server_cache[s.id] = s
+ except Exception:
+ # Just forget it if there's any trouble
+ pass
+
search_opts = {
'all_tenants': parsed_args.all_projects,
'display_name': parsed_args.name,
'status': parsed_args.status,
}
- volume_client = self.app.client_manager.volume
data = volume_client.volumes.list(search_opts=search_opts)
return (column_headers,
(utils.get_item_properties(
s, columns,
- formatters={'Metadata': utils.format_dict},
+ formatters={'Metadata': utils.format_dict,
+ 'Attachments': _format_attach},
) for s in data))