Add --project to "subnet pool create"

This patch adds --project and --project-domain
options to "subnet pool create" command.

Change-Id: I2fe006013a194861299a9c77234a7cf988a8dad8
Partial-Bug: #1544586
This commit is contained in:
Tang Chen 2016-03-23 11:27:37 +08:00
parent f48f9398b8
commit a1a470693e
4 changed files with 86 additions and 4 deletions

View File

@ -17,6 +17,7 @@ Create subnet pool
[--default-prefix-length <default-prefix-length>] [--default-prefix-length <default-prefix-length>]
[--min-prefix-length <min-prefix-length>] [--min-prefix-length <min-prefix-length>]
[--max-prefix-length <max-prefix-length>] [--max-prefix-length <max-prefix-length>]
[--project <project> [--project-domain <project-domain>]]
<name> <name>
.. option:: --pool-prefix <pool-prefix> .. option:: --pool-prefix <pool-prefix>
@ -36,6 +37,15 @@ Create subnet pool
Set subnet pool maximum prefix length Set subnet pool maximum prefix length
.. option:: --project <project>
Owner's project (name or ID)
.. option:: --project-domain <project-domain>
Domain the project belongs to (name or ID). This can be used in case
collisions between project names exist.
.. _subnet_pool_create-name: .. _subnet_pool_create-name:
.. describe:: <name> .. describe:: <name>

View File

@ -17,6 +17,7 @@ from openstackclient.common import command
from openstackclient.common import exceptions from openstackclient.common import exceptions
from openstackclient.common import parseractions from openstackclient.common import parseractions
from openstackclient.common import utils from openstackclient.common import utils
from openstackclient.identity import common as identity_common
def _get_columns(item): def _get_columns(item):
@ -32,7 +33,7 @@ _formatters = {
} }
def _get_attrs(parsed_args): def _get_attrs(client_manager, parsed_args):
attrs = {} attrs = {}
if parsed_args.name is not None: if parsed_args.name is not None:
attrs['name'] = str(parsed_args.name) attrs['name'] = str(parsed_args.name)
@ -45,6 +46,16 @@ def _get_attrs(parsed_args):
if parsed_args.max_prefix_length is not None: if parsed_args.max_prefix_length is not None:
attrs['max_prefixlen'] = parsed_args.max_prefix_length attrs['max_prefixlen'] = parsed_args.max_prefix_length
# "subnet pool set" command doesn't support setting project.
if 'project' in parsed_args and parsed_args.project is not None:
identity_client = client_manager.identity
project_id = identity_common.find_project(
identity_client,
parsed_args.project,
parsed_args.project_domain,
).id
attrs['tenant_id'] = project_id
return attrs return attrs
@ -84,16 +95,22 @@ class CreateSubnetPool(command.ShowOne):
parser = super(CreateSubnetPool, self).get_parser(prog_name) parser = super(CreateSubnetPool, self).get_parser(prog_name)
parser.add_argument( parser.add_argument(
'name', 'name',
metavar="<name>", metavar='<name>',
help='Name of the new subnet pool' help='Name of the new subnet pool'
) )
_add_prefix_options(parser) _add_prefix_options(parser)
parser.add_argument(
'--project',
metavar='<project>',
help="Owner's project (name or ID)",
)
identity_common.add_project_domain_option_to_parser(parser)
return parser return parser
def take_action(self, parsed_args): def take_action(self, parsed_args):
client = self.app.client_manager.network client = self.app.client_manager.network
attrs = _get_attrs(parsed_args) attrs = _get_attrs(self.app.client_manager, parsed_args)
obj = client.create_subnet_pool(**attrs) obj = client.create_subnet_pool(**attrs)
columns = _get_columns(obj) columns = _get_columns(obj)
data = utils.get_item_properties(obj, columns, formatters=_formatters) data = utils.get_item_properties(obj, columns, formatters=_formatters)
@ -192,7 +209,7 @@ class SetSubnetPool(command.Command):
obj = client.find_subnet_pool(parsed_args.subnet_pool, obj = client.find_subnet_pool(parsed_args.subnet_pool,
ignore_missing=False) ignore_missing=False)
attrs = _get_attrs(parsed_args) attrs = _get_attrs(self.app.client_manager, parsed_args)
if attrs == {}: if attrs == {}:
msg = "Nothing specified to be set" msg = "Nothing specified to be set"
raise exceptions.CommandError(msg) raise exceptions.CommandError(msg)

View File

@ -12,11 +12,14 @@
# #
import argparse import argparse
import copy
import mock import mock
from openstackclient.common import exceptions from openstackclient.common import exceptions
from openstackclient.common import utils from openstackclient.common import utils
from openstackclient.network.v2 import subnet_pool from openstackclient.network.v2 import subnet_pool
from openstackclient.tests import fakes
from openstackclient.tests.identity.v3 import fakes as identity_fakes_v3
from openstackclient.tests.network.v2 import fakes as network_fakes from openstackclient.tests.network.v2 import fakes as network_fakes
from openstackclient.tests import utils as tests_utils from openstackclient.tests import utils as tests_utils
@ -73,6 +76,30 @@ class TestCreateSubnetPool(TestSubnetPool):
# Get the command object to test # Get the command object to test
self.cmd = subnet_pool.CreateSubnetPool(self.app, self.namespace) self.cmd = subnet_pool.CreateSubnetPool(self.app, self.namespace)
# Set identity client. And get a shortcut to Identity client.
identity_client = identity_fakes_v3.FakeIdentityv3Client(
endpoint=fakes.AUTH_URL,
token=fakes.AUTH_TOKEN,
)
self.app.client_manager.identity = identity_client
self.identity = self.app.client_manager.identity
# Get a shortcut to the ProjectManager Mock
self.projects_mock = self.identity.projects
self.projects_mock.get.return_value = fakes.FakeResource(
None,
copy.deepcopy(identity_fakes_v3.PROJECT),
loaded=True,
)
# Get a shortcut to the DomainManager Mock
self.domains_mock = self.identity.domains
self.domains_mock.get.return_value = fakes.FakeResource(
None,
copy.deepcopy(identity_fakes_v3.DOMAIN),
loaded=True,
)
def test_create_no_options(self): def test_create_no_options(self):
arglist = [] arglist = []
verifylist = [] verifylist = []
@ -140,6 +167,31 @@ class TestCreateSubnetPool(TestSubnetPool):
self.assertRaises(argparse.ArgumentTypeError, self.check_parser, self.assertRaises(argparse.ArgumentTypeError, self.check_parser,
self.cmd, arglist, verifylist) self.cmd, arglist, verifylist)
def test_create_project_domain(self):
arglist = [
'--pool-prefix', '10.0.10.0/24',
"--project", identity_fakes_v3.project_name,
"--project-domain", identity_fakes_v3.domain_name,
self._subnet_pool.name,
]
verifylist = [
('prefixes', ['10.0.10.0/24']),
('project', identity_fakes_v3.project_name),
('project_domain', identity_fakes_v3.domain_name),
('name', self._subnet_pool.name),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
columns, data = (self.cmd.take_action(parsed_args))
self.network.create_subnet_pool.assert_called_once_with(**{
'prefixes': ['10.0.10.0/24'],
'tenant_id': identity_fakes_v3.project_id,
'name': self._subnet_pool.name,
})
self.assertEqual(self.columns, columns)
self.assertEqual(self.data, data)
class TestDeleteSubnetPool(TestSubnetPool): class TestDeleteSubnetPool(TestSubnetPool):

View File

@ -2,3 +2,6 @@
features: features:
- Add ``subnet pool create`` command. - Add ``subnet pool create`` command.
[Bug `1544586 <https://bugs.launchpad.net/python-openstackclient/+bug/1544586>`_] [Bug `1544586 <https://bugs.launchpad.net/python-openstackclient/+bug/1544586>`_]
- Command ``subnet pool create`` now supports ``--project`` and
``--project-domain`` options.
[Bug `1544586 <https://bugs.launchpad.net/python-openstackclient/+bug/1544586>`_]