Skip to content

Commit a1a4706

Browse files
author
Tang Chen
committed
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
1 parent f48f939 commit a1a4706

4 files changed

Lines changed: 86 additions & 4 deletions

File tree

doc/source/command-objects/subnet-pool.rst

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ Create subnet pool
1717
[--default-prefix-length <default-prefix-length>]
1818
[--min-prefix-length <min-prefix-length>]
1919
[--max-prefix-length <max-prefix-length>]
20+
[--project <project> [--project-domain <project-domain>]]
2021
<name>
2122
2223
.. option:: --pool-prefix <pool-prefix>
@@ -36,6 +37,15 @@ Create subnet pool
3637
3738
Set subnet pool maximum prefix length
3839
40+
.. option:: --project <project>
41+
42+
Owner's project (name or ID)
43+
44+
.. option:: --project-domain <project-domain>
45+
46+
Domain the project belongs to (name or ID). This can be used in case
47+
collisions between project names exist.
48+
3949
.. _subnet_pool_create-name:
4050
.. describe:: <name>
4151

openstackclient/network/v2/subnet_pool.py

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
from openstackclient.common import exceptions
1818
from openstackclient.common import parseractions
1919
from openstackclient.common import utils
20+
from openstackclient.identity import common as identity_common
2021

2122

2223
def _get_columns(item):
@@ -32,7 +33,7 @@ def _get_columns(item):
3233
}
3334

3435

35-
def _get_attrs(parsed_args):
36+
def _get_attrs(client_manager, parsed_args):
3637
attrs = {}
3738
if parsed_args.name is not None:
3839
attrs['name'] = str(parsed_args.name)
@@ -45,6 +46,16 @@ def _get_attrs(parsed_args):
4546
if parsed_args.max_prefix_length is not None:
4647
attrs['max_prefixlen'] = parsed_args.max_prefix_length
4748

49+
# "subnet pool set" command doesn't support setting project.
50+
if 'project' in parsed_args and parsed_args.project is not None:
51+
identity_client = client_manager.identity
52+
project_id = identity_common.find_project(
53+
identity_client,
54+
parsed_args.project,
55+
parsed_args.project_domain,
56+
).id
57+
attrs['tenant_id'] = project_id
58+
4859
return attrs
4960

5061

@@ -84,16 +95,22 @@ def get_parser(self, prog_name):
8495
parser = super(CreateSubnetPool, self).get_parser(prog_name)
8596
parser.add_argument(
8697
'name',
87-
metavar="<name>",
98+
metavar='<name>',
8899
help='Name of the new subnet pool'
89100
)
90101
_add_prefix_options(parser)
102+
parser.add_argument(
103+
'--project',
104+
metavar='<project>',
105+
help="Owner's project (name or ID)",
106+
)
107+
identity_common.add_project_domain_option_to_parser(parser)
91108

92109
return parser
93110

94111
def take_action(self, parsed_args):
95112
client = self.app.client_manager.network
96-
attrs = _get_attrs(parsed_args)
113+
attrs = _get_attrs(self.app.client_manager, parsed_args)
97114
obj = client.create_subnet_pool(**attrs)
98115
columns = _get_columns(obj)
99116
data = utils.get_item_properties(obj, columns, formatters=_formatters)
@@ -192,7 +209,7 @@ def take_action(self, parsed_args):
192209
obj = client.find_subnet_pool(parsed_args.subnet_pool,
193210
ignore_missing=False)
194211

195-
attrs = _get_attrs(parsed_args)
212+
attrs = _get_attrs(self.app.client_manager, parsed_args)
196213
if attrs == {}:
197214
msg = "Nothing specified to be set"
198215
raise exceptions.CommandError(msg)

openstackclient/tests/network/v2/test_subnet_pool.py

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,14 @@
1212
#
1313

1414
import argparse
15+
import copy
1516
import mock
1617

1718
from openstackclient.common import exceptions
1819
from openstackclient.common import utils
1920
from openstackclient.network.v2 import subnet_pool
21+
from openstackclient.tests import fakes
22+
from openstackclient.tests.identity.v3 import fakes as identity_fakes_v3
2023
from openstackclient.tests.network.v2 import fakes as network_fakes
2124
from openstackclient.tests import utils as tests_utils
2225

@@ -73,6 +76,30 @@ def setUp(self):
7376
# Get the command object to test
7477
self.cmd = subnet_pool.CreateSubnetPool(self.app, self.namespace)
7578

79+
# Set identity client. And get a shortcut to Identity client.
80+
identity_client = identity_fakes_v3.FakeIdentityv3Client(
81+
endpoint=fakes.AUTH_URL,
82+
token=fakes.AUTH_TOKEN,
83+
)
84+
self.app.client_manager.identity = identity_client
85+
self.identity = self.app.client_manager.identity
86+
87+
# Get a shortcut to the ProjectManager Mock
88+
self.projects_mock = self.identity.projects
89+
self.projects_mock.get.return_value = fakes.FakeResource(
90+
None,
91+
copy.deepcopy(identity_fakes_v3.PROJECT),
92+
loaded=True,
93+
)
94+
95+
# Get a shortcut to the DomainManager Mock
96+
self.domains_mock = self.identity.domains
97+
self.domains_mock.get.return_value = fakes.FakeResource(
98+
None,
99+
copy.deepcopy(identity_fakes_v3.DOMAIN),
100+
loaded=True,
101+
)
102+
76103
def test_create_no_options(self):
77104
arglist = []
78105
verifylist = []
@@ -140,6 +167,31 @@ def test_create_len_negative(self):
140167
self.assertRaises(argparse.ArgumentTypeError, self.check_parser,
141168
self.cmd, arglist, verifylist)
142169

170+
def test_create_project_domain(self):
171+
arglist = [
172+
'--pool-prefix', '10.0.10.0/24',
173+
"--project", identity_fakes_v3.project_name,
174+
"--project-domain", identity_fakes_v3.domain_name,
175+
self._subnet_pool.name,
176+
]
177+
verifylist = [
178+
('prefixes', ['10.0.10.0/24']),
179+
('project', identity_fakes_v3.project_name),
180+
('project_domain', identity_fakes_v3.domain_name),
181+
('name', self._subnet_pool.name),
182+
]
183+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
184+
185+
columns, data = (self.cmd.take_action(parsed_args))
186+
187+
self.network.create_subnet_pool.assert_called_once_with(**{
188+
'prefixes': ['10.0.10.0/24'],
189+
'tenant_id': identity_fakes_v3.project_id,
190+
'name': self._subnet_pool.name,
191+
})
192+
self.assertEqual(self.columns, columns)
193+
self.assertEqual(self.data, data)
194+
143195

144196
class TestDeleteSubnetPool(TestSubnetPool):
145197

releasenotes/notes/bug-1544586-0e6ca9a09dac0726.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,6 @@
22
features:
33
- Add ``subnet pool create`` command.
44
[Bug `1544586 <https://bugs.launchpad.net/python-openstackclient/+bug/1544586>`_]
5+
- Command ``subnet pool create`` now supports ``--project`` and
6+
``--project-domain`` options.
7+
[Bug `1544586 <https://bugs.launchpad.net/python-openstackclient/+bug/1544586>`_]

0 commit comments

Comments
 (0)