Skip to content

Commit ce63fa0

Browse files
Jenkinsopenstack-gerrit
authored andcommitted
Merge "Add ability to set key value pairs in projects"
2 parents 65f094e + 70e6333 commit ce63fa0

4 files changed

Lines changed: 178 additions & 0 deletions

File tree

‎openstackclient/identity/v2_0/project.py‎

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
from cliff import lister
2323
from cliff import show
2424

25+
from openstackclient.common import parseractions
2526
from openstackclient.common import utils
2627

2728

@@ -53,6 +54,13 @@ def get_parser(self, prog_name):
5354
action='store_true',
5455
help='Disable project',
5556
)
57+
parser.add_argument(
58+
'--property',
59+
metavar='<key=value>',
60+
action=parseractions.KeyValueAction,
61+
help='Property to add for this project '
62+
'(repeat option to set multiple properties)',
63+
)
5664
return parser
5765

5866
def take_action(self, parsed_args):
@@ -62,11 +70,15 @@ def take_action(self, parsed_args):
6270
enabled = True
6371
if parsed_args.disable:
6472
enabled = False
73+
kwargs = {}
74+
if parsed_args.property:
75+
kwargs = parsed_args.property.copy()
6576

6677
project = identity_client.tenants.create(
6778
parsed_args.name,
6879
description=parsed_args.description,
6980
enabled=enabled,
81+
**kwargs
7082
)
7183

7284
info = {}
@@ -163,6 +175,13 @@ def get_parser(self, prog_name):
163175
action='store_true',
164176
help='Disable project',
165177
)
178+
parser.add_argument(
179+
'--property',
180+
metavar='<key=value>',
181+
action=parseractions.KeyValueAction,
182+
help='Property to add for this project '
183+
'(repeat option to set multiple properties)',
184+
)
166185
return parser
167186

168187
def take_action(self, parsed_args):
@@ -172,6 +191,7 @@ def take_action(self, parsed_args):
172191
if (not parsed_args.name
173192
and not parsed_args.description
174193
and not parsed_args.enable
194+
and not parsed_args.property
175195
and not parsed_args.disable):
176196
return
177197

@@ -189,6 +209,8 @@ def take_action(self, parsed_args):
189209
kwargs['enabled'] = True
190210
if parsed_args.disable:
191211
kwargs['enabled'] = False
212+
if parsed_args.property:
213+
kwargs.update(parsed_args.property)
192214
if 'id' in kwargs:
193215
del kwargs['id']
194216
if 'name' in kwargs:

‎openstackclient/identity/v3/project.py‎

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
from cliff import lister
2323
from cliff import show
2424

25+
from openstackclient.common import parseractions
2526
from openstackclient.common import utils
2627

2728

@@ -58,6 +59,13 @@ def get_parser(self, prog_name):
5859
action='store_true',
5960
help='Disable project',
6061
)
62+
parser.add_argument(
63+
'--property',
64+
metavar='<key=value>',
65+
action=parseractions.KeyValueAction,
66+
help='Property to add for this project '
67+
'(repeat option to set multiple properties)',
68+
)
6169
return parser
6270

6371
def take_action(self, parsed_args):
@@ -75,12 +83,16 @@ def take_action(self, parsed_args):
7583
enabled = True
7684
if parsed_args.disable:
7785
enabled = False
86+
kwargs = {}
87+
if parsed_args.property:
88+
kwargs = parsed_args.property.copy()
7889

7990
project = identity_client.projects.create(
8091
parsed_args.name,
8192
domain,
8293
description=parsed_args.description,
8394
enabled=enabled,
95+
**kwargs
8496
)
8597

8698
info = {}
@@ -182,6 +194,13 @@ def get_parser(self, prog_name):
182194
action='store_true',
183195
help='Disable project',
184196
)
197+
parser.add_argument(
198+
'--property',
199+
metavar='<key=value>',
200+
action=parseractions.KeyValueAction,
201+
help='Property to add for this project '
202+
'(repeat option to set multiple properties)',
203+
)
185204
return parser
186205

187206
def take_action(self, parsed_args):
@@ -192,6 +211,7 @@ def take_action(self, parsed_args):
192211
and not parsed_args.description
193212
and not parsed_args.domain
194213
and not parsed_args.enable
214+
and not parsed_args.property
195215
and not parsed_args.disable):
196216
return
197217

@@ -214,6 +234,8 @@ def take_action(self, parsed_args):
214234
kwargs['enabled'] = True
215235
if parsed_args.disable:
216236
kwargs['enabled'] = False
237+
if parsed_args.property:
238+
kwargs.update(parsed_args.property)
217239
if 'id' in kwargs:
218240
del kwargs['id']
219241
if 'domain_id' in kwargs:

‎openstackclient/tests/identity/v2_0/test_project.py‎

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,43 @@ def test_project_create_disable(self):
182182
)
183183
self.assertEqual(data, datalist)
184184

185+
def test_project_create_property(self):
186+
arglist = [
187+
'--property', 'fee=fi',
188+
'--property', 'fo=fum',
189+
identity_fakes.project_name,
190+
]
191+
verifylist = [
192+
('property', {'fee': 'fi', 'fo': 'fum'}),
193+
('name', identity_fakes.project_name),
194+
]
195+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
196+
197+
# DisplayCommandBase.take_action() returns two tuples
198+
columns, data = self.cmd.take_action(parsed_args)
199+
200+
# Set expected values
201+
kwargs = {
202+
'description': None,
203+
'enabled': True,
204+
'fee': 'fi',
205+
'fo': 'fum',
206+
}
207+
self.projects_mock.create.assert_called_with(
208+
identity_fakes.project_name,
209+
**kwargs
210+
)
211+
212+
collist = ('description', 'enabled', 'id', 'name')
213+
self.assertEqual(columns, collist)
214+
datalist = (
215+
identity_fakes.project_description,
216+
True,
217+
identity_fakes.project_id,
218+
identity_fakes.project_name,
219+
)
220+
self.assertEqual(data, datalist)
221+
185222

186223
class TestProjectDelete(TestProject):
187224

@@ -412,6 +449,34 @@ def test_project_set_disable(self):
412449
**kwargs
413450
)
414451

452+
def test_project_set_property(self):
453+
arglist = [
454+
'--property', 'fee=fi',
455+
'--property', 'fo=fum',
456+
identity_fakes.project_name,
457+
]
458+
verifylist = [
459+
('property', {'fee': 'fi', 'fo': 'fum'}),
460+
('project', identity_fakes.project_name),
461+
]
462+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
463+
464+
result = self.cmd.run(parsed_args)
465+
self.assertEqual(result, 0)
466+
467+
# Set expected values
468+
kwargs = {
469+
'description': identity_fakes.project_description,
470+
'enabled': True,
471+
'tenant_name': identity_fakes.project_name,
472+
'fee': 'fi',
473+
'fo': 'fum',
474+
}
475+
self.projects_mock.update.assert_called_with(
476+
identity_fakes.project_id,
477+
**kwargs
478+
)
479+
415480

416481
class TestProjectShow(TestProject):
417482

‎openstackclient/tests/identity/v3/test_project.py‎

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,46 @@ def test_project_create_disable(self):
245245
)
246246
self.assertEqual(data, datalist)
247247

248+
def test_project_create_property(self):
249+
arglist = [
250+
'--property', 'fee=fi',
251+
'--property', 'fo=fum',
252+
identity_fakes.project_name,
253+
]
254+
verifylist = [
255+
('property', {'fee': 'fi', 'fo': 'fum'}),
256+
('name', identity_fakes.project_name),
257+
]
258+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
259+
260+
# DisplayCommandBase.take_action() returns two tuples
261+
columns, data = self.cmd.take_action(parsed_args)
262+
263+
# Set expected values
264+
kwargs = {
265+
'description': None,
266+
'enabled': True,
267+
'fee': 'fi',
268+
'fo': 'fum',
269+
}
270+
# ProjectManager.create(name, domain, description=, enabled=, **kwargs)
271+
self.projects_mock.create.assert_called_with(
272+
identity_fakes.project_name,
273+
None,
274+
**kwargs
275+
)
276+
277+
collist = ('description', 'domain_id', 'enabled', 'id', 'name')
278+
self.assertEqual(columns, collist)
279+
datalist = (
280+
identity_fakes.project_description,
281+
identity_fakes.domain_id,
282+
True,
283+
identity_fakes.project_id,
284+
identity_fakes.project_name,
285+
)
286+
self.assertEqual(data, datalist)
287+
248288

249289
class TestProjectDelete(TestProject):
250290

@@ -488,6 +528,35 @@ def test_project_set_disable(self):
488528
**kwargs
489529
)
490530

531+
def test_project_set_property(self):
532+
arglist = [
533+
'--property', 'fee=fi',
534+
'--property', 'fo=fum',
535+
identity_fakes.project_name,
536+
]
537+
verifylist = [
538+
('property', {'fee': 'fi', 'fo': 'fum'}),
539+
('project', identity_fakes.project_name),
540+
]
541+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
542+
543+
result = self.cmd.run(parsed_args)
544+
self.assertEqual(result, 0)
545+
546+
# Set expected values
547+
kwargs = {
548+
'description': identity_fakes.project_description,
549+
'domain': identity_fakes.domain_id,
550+
'enabled': True,
551+
'name': identity_fakes.project_name,
552+
'fee': 'fi',
553+
'fo': 'fum',
554+
}
555+
self.projects_mock.update.assert_called_with(
556+
identity_fakes.project_id,
557+
**kwargs
558+
)
559+
491560

492561
class TestProjectShow(TestProject):
493562

0 commit comments

Comments
 (0)