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:
		@@ -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>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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>`_]
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user