Skip to content

Commit ce079d2

Browse files
namnh68Ha Van Tu
andcommitted
Add '--project' and '--project-domain' options to os cmds
This patch added '--project' and '--project-domain' options to filter subnets resulted by 'os subnet list', 'os floating ip create' and 'os security group list' commands. Co-Authored-By: Ha Van Tu <tuhv@vn.fujitsu.com> Change-Id: I727663d49ffa6aa042fdeb60797f18bb753b0372 Closes-Bug: #1613231 Closes-Bug: #1610909 Closes-Bug: #1613629 Partially-Implements: blueprint network-commands-options
1 parent d6e058f commit ce079d2

10 files changed

Lines changed: 222 additions & 2 deletions

File tree

doc/source/command-objects/floating-ip.rst

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ Create floating IP
1818
[--floating-ip-address <floating-ip-address>]
1919
[--fixed-ip-address <fixed-ip-address>]
2020
[--description <description>]
21+
[--project <project> [--project-domain <project-domain>]]
2122
<network>
2223
2324
.. option:: --subnet <subnet>
@@ -45,6 +46,19 @@ Create floating IP
4546
Set floating IP description
4647
*Network version 2 only*
4748
49+
.. option:: --project <project>
50+
51+
Owner's project (name or ID)
52+
53+
*Network version 2 only*
54+
55+
.. option:: --project-domain <project-domain>
56+
57+
Domain the project belongs to (name or ID).
58+
This can be used in case collisions between project names exist.
59+
60+
*Network version 2 only*
61+
4862
.. describe:: <network>
4963
5064
Network to allocate floating IP from (name or ID)

doc/source/command-objects/router.rst

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,7 @@ List routers
137137
[--name <name>]
138138
[--enable | --disable]
139139
[--long]
140+
[--project <project> [--project-domain <project-domain>]]
140141
141142
.. option:: --long
142143
@@ -154,6 +155,15 @@ List routers
154155
155156
List disabled routers
156157
158+
.. option:: --project <project>
159+
160+
List routers according to their project (name or ID)
161+
162+
.. option:: --project-domain <project-domain>
163+
164+
Domain the project belongs to (name or ID).
165+
This can be used in case collisions between project names exist.
166+
157167
router remove port
158168
------------------
159169

doc/source/command-objects/security-group.rst

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ List security groups
6767
6868
os security group list
6969
[--all-projects]
70+
[--project <project> [--project-domain <project-domain>]]
7071
7172
.. option:: --all-projects
7273
@@ -75,6 +76,19 @@ List security groups
7576
*Network version 2 ignores this option and will always display information*
7677
*for all projects (admin only).*
7778
79+
.. option:: --project <project>
80+
81+
List security groups according to the project (name or ID)
82+
83+
*Network version 2 only*
84+
85+
.. option:: --project-domain <project-domain>
86+
87+
Domain the project belongs to (name or ID).
88+
This can be used in case collisions between project names exist.
89+
90+
*Network version 2 only*
91+
7892
security group set
7993
------------------
8094

openstackclient/network/v2/floating_ip.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
from osc_lib import utils
1919

2020
from openstackclient.i18n import _
21+
from openstackclient.identity import common as identity_common
2122
from openstackclient.network import common
2223
from openstackclient.network import sdk_utils
2324

@@ -66,6 +67,15 @@ def _get_attrs(client_manager, parsed_args):
6667
if parsed_args.description is not None:
6768
attrs['description'] = parsed_args.description
6869

70+
if parsed_args.project:
71+
identity_client = client_manager.identity
72+
project_id = identity_common.find_project(
73+
identity_client,
74+
parsed_args.project,
75+
parsed_args.project_domain,
76+
).id
77+
attrs['tenant_id'] = project_id
78+
6979
return attrs
7080

7181

@@ -113,6 +123,12 @@ def update_parser_network(self, parser):
113123
metavar='<description>',
114124
help=_('Set floating IP description')
115125
)
126+
parser.add_argument(
127+
'--project',
128+
metavar='<project>',
129+
help=_("Owner's project (name or ID)")
130+
)
131+
identity_common.add_project_domain_option_to_parser(parser)
116132
return parser
117133

118134
def take_action_network(self, client, parsed_args):

openstackclient/network/v2/router.py

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -282,11 +282,17 @@ def get_parser(self, prog_name):
282282
default=False,
283283
help=_("List additional fields in output")
284284
)
285+
parser.add_argument(
286+
'--project',
287+
metavar='<project>',
288+
help=_("List routers according to their project (name or ID)")
289+
)
290+
identity_common.add_project_domain_option_to_parser(parser)
285291
return parser
286292

287293
def take_action(self, parsed_args):
294+
identity_client = self.app.client_manager.identity
288295
client = self.app.client_manager.network
289-
290296
columns = (
291297
'id',
292298
'name',
@@ -316,6 +322,13 @@ def take_action(self, parsed_args):
316322
elif parsed_args.disable:
317323
args['admin_state_up'] = False
318324

325+
if parsed_args.project:
326+
project_id = identity_common.find_project(
327+
identity_client,
328+
parsed_args.project,
329+
parsed_args.project_domain,
330+
).id
331+
args['tenant_id'] = project_id
319332
if parsed_args.long:
320333
columns = columns + (
321334
'routes',

openstackclient/network/v2/security_group.py

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,13 @@ def update_parser_network(self, parser):
201201
default=False,
202202
help=argparse.SUPPRESS,
203203
)
204+
parser.add_argument(
205+
'--project',
206+
metavar='<project>',
207+
help=_("List security groups according to the project "
208+
"(name or ID)")
209+
)
210+
identity_common.add_project_domain_option_to_parser(parser)
204211
return parser
205212

206213
def update_parser_compute(self, parser):
@@ -228,7 +235,16 @@ def _get_return_data(self, data, include_project=True):
228235
) for s in data))
229236

230237
def take_action_network(self, client, parsed_args):
231-
return self._get_return_data(client.security_groups())
238+
filters = {}
239+
if parsed_args.project:
240+
identity_client = self.app.client_manager.identity
241+
project_id = identity_common.find_project(
242+
identity_client,
243+
parsed_args.project,
244+
parsed_args.project_domain,
245+
).id
246+
filters['tenant_id'] = project_id
247+
return self._get_return_data(client.security_groups(**filters))
232248

233249
def take_action_compute(self, client, parsed_args):
234250
search = {'all_tenants': parsed_args.all_projects}

openstackclient/tests/unit/network/v2/test_floating_ip.py

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
from openstackclient.network.v2 import floating_ip
2020
from openstackclient.tests.unit.compute.v2 import fakes as compute_fakes
21+
from openstackclient.tests.unit.identity.v3 import fakes as identity_fakes_v3
2122
from openstackclient.tests.unit.network.v2 import fakes as network_fakes
2223
from openstackclient.tests.unit import utils as tests_utils
2324

@@ -31,6 +32,7 @@ def setUp(self):
3132

3233
# Get a shortcut to the network client
3334
self.network = self.app.client_manager.network
35+
self.projects_mock = self.app.client_manager.identity.projects
3436

3537

3638
class TestCreateFloatingIPNetwork(TestFloatingIPNetwork):
@@ -145,6 +147,54 @@ def test_create_all_options(self):
145147
self.assertEqual(self.columns, columns)
146148
self.assertEqual(self.data, data)
147149

150+
def test_floating_ip_create_project(self):
151+
project = identity_fakes_v3.FakeProject.create_one_project()
152+
self.projects_mock.get.return_value = project
153+
arglist = [
154+
'--project', project.id,
155+
self.floating_ip.floating_network_id,
156+
]
157+
verifylist = [
158+
('network', self.floating_ip.floating_network_id),
159+
('project', project.id),
160+
]
161+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
162+
163+
columns, data = self.cmd.take_action(parsed_args)
164+
165+
self.network.create_ip.assert_called_once_with(**{
166+
'floating_network_id': self.floating_ip.floating_network_id,
167+
'tenant_id': project.id,
168+
})
169+
self.assertEqual(self.columns, columns)
170+
self.assertEqual(self.data, data)
171+
172+
def test_floating_ip_create_project_domain(self):
173+
project = identity_fakes_v3.FakeProject.create_one_project()
174+
domain = identity_fakes_v3.FakeDomain.create_one_domain()
175+
self.projects_mock.get.return_value = project
176+
arglist = [
177+
"--project", project.name,
178+
"--project-domain", domain.name,
179+
self.floating_ip.floating_network_id,
180+
]
181+
verifylist = [
182+
('network', self.floating_ip.floating_network_id),
183+
('project', project.name),
184+
('project_domain', domain.name),
185+
]
186+
187+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
188+
189+
columns, data = self.cmd.take_action(parsed_args)
190+
191+
self.network.create_ip.assert_called_once_with(**{
192+
'floating_network_id': self.floating_ip.floating_network_id,
193+
'tenant_id': project.id,
194+
})
195+
self.assertEqual(self.columns, columns)
196+
self.assertEqual(self.data, data)
197+
148198

149199
class TestDeleteFloatingIPNetwork(TestFloatingIPNetwork):
150200

openstackclient/tests/unit/network/v2/test_router.py

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
from osc_lib import utils as osc_utils
1919

2020
from openstackclient.network.v2 import router
21+
from openstackclient.tests.unit.identity.v3 import fakes as identity_fakes_v3
2122
from openstackclient.tests.unit.network.v2 import fakes as network_fakes
2223
from openstackclient.tests.unit import utils as tests_utils
2324

@@ -29,6 +30,7 @@ def setUp(self):
2930

3031
# Get a shortcut to the network client
3132
self.network = self.app.client_manager.network
33+
self.projects_mock = self.app.client_manager.identity.projects
3234

3335

3436
class TestAddPortToRouter(TestRouter):
@@ -476,6 +478,45 @@ def test_router_list_disable(self):
476478
self.network.routers.assert_called_once_with(
477479
**{'admin_state_up': False}
478480
)
481+
482+
self.assertEqual(self.columns, columns)
483+
self.assertEqual(self.data, list(data))
484+
485+
def test_router_list_project(self):
486+
project = identity_fakes_v3.FakeProject.create_one_project()
487+
self.projects_mock.get.return_value = project
488+
arglist = [
489+
'--project', project.id,
490+
]
491+
verifylist = [
492+
('project', project.id),
493+
]
494+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
495+
496+
columns, data = self.cmd.take_action(parsed_args)
497+
filters = {'tenant_id': project.id}
498+
499+
self.network.routers.assert_called_once_with(**filters)
500+
self.assertEqual(self.columns, columns)
501+
self.assertEqual(self.data, list(data))
502+
503+
def test_router_list_project_domain(self):
504+
project = identity_fakes_v3.FakeProject.create_one_project()
505+
self.projects_mock.get.return_value = project
506+
arglist = [
507+
'--project', project.id,
508+
'--project-domain', project.domain_id,
509+
]
510+
verifylist = [
511+
('project', project.id),
512+
('project_domain', project.domain_id),
513+
]
514+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
515+
516+
columns, data = self.cmd.take_action(parsed_args)
517+
filters = {'tenant_id': project.id}
518+
519+
self.network.routers.assert_called_once_with(**filters)
479520
self.assertEqual(self.columns, columns)
480521
self.assertEqual(self.data, list(data))
481522

openstackclient/tests/unit/network/v2/test_security_group.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -444,6 +444,44 @@ def test_security_group_list_all_projects(self):
444444
self.assertEqual(self.columns, columns)
445445
self.assertEqual(self.data, list(data))
446446

447+
def test_security_group_list_project(self):
448+
project = identity_fakes.FakeProject.create_one_project()
449+
self.projects_mock.get.return_value = project
450+
arglist = [
451+
'--project', project.id,
452+
]
453+
verifylist = [
454+
('project', project.id),
455+
]
456+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
457+
458+
columns, data = self.cmd.take_action(parsed_args)
459+
filters = {'tenant_id': project.id}
460+
461+
self.network.security_groups.assert_called_once_with(**filters)
462+
self.assertEqual(self.columns, columns)
463+
self.assertEqual(self.data, list(data))
464+
465+
def test_security_group_list_project_domain(self):
466+
project = identity_fakes.FakeProject.create_one_project()
467+
self.projects_mock.get.return_value = project
468+
arglist = [
469+
'--project', project.id,
470+
'--project-domain', project.domain_id,
471+
]
472+
verifylist = [
473+
('project', project.id),
474+
('project_domain', project.domain_id),
475+
]
476+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
477+
478+
columns, data = self.cmd.take_action(parsed_args)
479+
filters = {'tenant_id': project.id}
480+
481+
self.network.security_groups.assert_called_once_with(**filters)
482+
self.assertEqual(self.columns, columns)
483+
self.assertEqual(self.data, list(data))
484+
447485

448486
class TestListSecurityGroupCompute(TestSecurityGroupCompute):
449487

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
---
2+
features:
3+
- |
4+
Add ``--project`` and ``--project-domain`` options to the ``router list``,
5+
``floating ip create`` and ``security group list`` commands.
6+
[Bug `1613231 <https://bugs.launchpad.net/bugs/1613231>`_]
7+
[Bug `1613629 <https://bugs.launchpad.net/bugs/1613629>`_]
8+
[Bug `1610909 <https://bugs.launchpad.net/bugs/1610909>`_]

0 commit comments

Comments
 (0)