Merge "type should be required for v2.0 service create"
This commit is contained in:
openstackclient
@@ -15,6 +15,7 @@
|
|||||||
|
|
||||||
"""Service action implementations"""
|
"""Service action implementations"""
|
||||||
|
|
||||||
|
import argparse
|
||||||
import logging
|
import logging
|
||||||
import six
|
import six
|
||||||
|
|
||||||
@@ -36,15 +37,20 @@ class CreateService(show.ShowOne):
|
|||||||
def get_parser(self, prog_name):
|
def get_parser(self, prog_name):
|
||||||
parser = super(CreateService, self).get_parser(prog_name)
|
parser = super(CreateService, self).get_parser(prog_name)
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
'name',
|
'type_or_name',
|
||||||
metavar='<service-name>',
|
metavar='<type>',
|
||||||
help=_('New service name'),
|
help=_('New service type (compute, image, identity, volume, etc)'),
|
||||||
)
|
)
|
||||||
parser.add_argument(
|
type_or_name_group = parser.add_mutually_exclusive_group()
|
||||||
|
type_or_name_group.add_argument(
|
||||||
'--type',
|
'--type',
|
||||||
metavar='<service-type>',
|
metavar='<service-type>',
|
||||||
required=True,
|
help=argparse.SUPPRESS,
|
||||||
help=_('New service type (compute, image, identity, volume, etc)'),
|
)
|
||||||
|
type_or_name_group.add_argument(
|
||||||
|
'--name',
|
||||||
|
metavar='<name>',
|
||||||
|
help=_('New service name'),
|
||||||
)
|
)
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
'--description',
|
'--description',
|
||||||
@@ -57,9 +63,28 @@ class CreateService(show.ShowOne):
|
|||||||
self.log.debug('take_action(%s)', parsed_args)
|
self.log.debug('take_action(%s)', parsed_args)
|
||||||
identity_client = self.app.client_manager.identity
|
identity_client = self.app.client_manager.identity
|
||||||
|
|
||||||
|
type_or_name = parsed_args.type_or_name
|
||||||
|
name = parsed_args.name
|
||||||
|
type = parsed_args.type
|
||||||
|
|
||||||
|
# If only a single positional is present, it's a <type>.
|
||||||
|
# This is not currently legal so it is considered a new case.
|
||||||
|
if not type and not name:
|
||||||
|
type = type_or_name
|
||||||
|
# If --type option is present then positional is handled as <name>;
|
||||||
|
# display deprecation message.
|
||||||
|
elif type:
|
||||||
|
name = type_or_name
|
||||||
|
self.log.warning(_('The argument --type is deprecated, use service'
|
||||||
|
' create --name <service-name> type instead.'))
|
||||||
|
# If --name option is present the positional is handled as <type>.
|
||||||
|
# Making --type optional is new, but back-compatible
|
||||||
|
elif name:
|
||||||
|
type = type_or_name
|
||||||
|
|
||||||
service = identity_client.services.create(
|
service = identity_client.services.create(
|
||||||
parsed_args.name,
|
name,
|
||||||
parsed_args.type,
|
type,
|
||||||
parsed_args.description)
|
parsed_args.description)
|
||||||
|
|
||||||
info = {}
|
info = {}
|
||||||
|
@@ -44,14 +44,80 @@ class TestServiceCreate(TestService):
|
|||||||
# Get the command object to test
|
# Get the command object to test
|
||||||
self.cmd = service.CreateService(self.app, None)
|
self.cmd = service.CreateService(self.app, None)
|
||||||
|
|
||||||
def test_service_create_name_type(self):
|
def test_service_create_with_type_positional(self):
|
||||||
|
arglist = [
|
||||||
|
identity_fakes.service_type,
|
||||||
|
]
|
||||||
|
verifylist = [
|
||||||
|
('type_or_name', identity_fakes.service_type),
|
||||||
|
('type', None),
|
||||||
|
('description', None),
|
||||||
|
('name', None),
|
||||||
|
]
|
||||||
|
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, service_type, description)
|
||||||
|
self.services_mock.create.assert_called_with(
|
||||||
|
None,
|
||||||
|
identity_fakes.service_type,
|
||||||
|
None,
|
||||||
|
)
|
||||||
|
|
||||||
|
collist = ('description', 'id', 'name', 'type')
|
||||||
|
self.assertEqual(columns, collist)
|
||||||
|
datalist = (
|
||||||
|
identity_fakes.service_description,
|
||||||
|
identity_fakes.service_id,
|
||||||
|
identity_fakes.service_name,
|
||||||
|
identity_fakes.service_type,
|
||||||
|
)
|
||||||
|
self.assertEqual(data, datalist)
|
||||||
|
|
||||||
|
def test_service_create_with_type_option(self):
|
||||||
arglist = [
|
arglist = [
|
||||||
'--type', identity_fakes.service_type,
|
'--type', identity_fakes.service_type,
|
||||||
identity_fakes.service_name,
|
identity_fakes.service_name,
|
||||||
]
|
]
|
||||||
verifylist = [
|
verifylist = [
|
||||||
|
('type_or_name', identity_fakes.service_name),
|
||||||
('type', identity_fakes.service_type),
|
('type', identity_fakes.service_type),
|
||||||
('description', None),
|
('description', None),
|
||||||
|
('name', None),
|
||||||
|
]
|
||||||
|
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, service_type, description)
|
||||||
|
self.services_mock.create.assert_called_with(
|
||||||
|
identity_fakes.service_name,
|
||||||
|
identity_fakes.service_type,
|
||||||
|
None,
|
||||||
|
)
|
||||||
|
|
||||||
|
collist = ('description', 'id', 'name', 'type')
|
||||||
|
self.assertEqual(columns, collist)
|
||||||
|
datalist = (
|
||||||
|
identity_fakes.service_description,
|
||||||
|
identity_fakes.service_id,
|
||||||
|
identity_fakes.service_name,
|
||||||
|
identity_fakes.service_type,
|
||||||
|
)
|
||||||
|
self.assertEqual(data, datalist)
|
||||||
|
|
||||||
|
def test_service_create_with_name_option(self):
|
||||||
|
arglist = [
|
||||||
|
'--name', identity_fakes.service_name,
|
||||||
|
identity_fakes.service_type,
|
||||||
|
]
|
||||||
|
verifylist = [
|
||||||
|
('type_or_name', identity_fakes.service_type),
|
||||||
|
('type', None),
|
||||||
|
('description', None),
|
||||||
('name', identity_fakes.service_name),
|
('name', identity_fakes.service_name),
|
||||||
]
|
]
|
||||||
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
||||||
@@ -78,12 +144,13 @@ class TestServiceCreate(TestService):
|
|||||||
|
|
||||||
def test_service_create_description(self):
|
def test_service_create_description(self):
|
||||||
arglist = [
|
arglist = [
|
||||||
'--type', identity_fakes.service_type,
|
'--name', identity_fakes.service_name,
|
||||||
'--description', identity_fakes.service_description,
|
'--description', identity_fakes.service_description,
|
||||||
identity_fakes.service_name,
|
identity_fakes.service_type,
|
||||||
]
|
]
|
||||||
verifylist = [
|
verifylist = [
|
||||||
('type', identity_fakes.service_type),
|
('type_or_name', identity_fakes.service_type),
|
||||||
|
('type', None),
|
||||||
('description', identity_fakes.service_description),
|
('description', identity_fakes.service_description),
|
||||||
('name', identity_fakes.service_name),
|
('name', identity_fakes.service_name),
|
||||||
]
|
]
|
||||||
|
Reference in New Issue
Block a user