Skip to content

Commit 5378322

Browse files
author
Dean Troyer
committed
Add tenant CRUD commands
* add {create|delete|set} tenant commands * move get_XXXX_properties() to common.utils.get_item_properties() add mixed_case_fields as an optional arg Change-Id: I7b3bd9cefb08e39730886b31213cbe422b5a8453
1 parent 712a8c7 commit 5378322

5 files changed

Lines changed: 186 additions & 104 deletions

File tree

‎openstackclient/common/utils.py‎

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,30 @@ def find_resource(manager, name_or_id):
5353
raise exceptions.CommandError(msg)
5454

5555

56+
def get_item_properties(item, fields, mixed_case_fields=[], formatters={}):
57+
"""Return a tuple containing the item properties.
58+
59+
:param item: a single item resource (e.g. Server, Tenant, etc)
60+
:param fields: tuple of strings with the desired field names
61+
:param mixed_case_fields: tuple of field names to preserve case
62+
:param formatters: dictionary mapping field names to callables
63+
to format the values
64+
"""
65+
row = []
66+
67+
for field in fields:
68+
if field in formatters:
69+
row.append(formatters[field](item))
70+
else:
71+
if field in mixed_case_fields:
72+
field_name = field.replace(' ', '_')
73+
else:
74+
field_name = field.lower().replace(' ', '_')
75+
data = getattr(item, field_name, '')
76+
row.append(data)
77+
return tuple(row)
78+
79+
5680
def string_to_bool(arg):
5781
return arg.strip().lower() in ('t', 'true', 'yes', '1')
5882

‎openstackclient/compute/v2/server.py‎

Lines changed: 1 addition & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -44,30 +44,6 @@ def _format_servers_list_networks(server):
4444
return '; '.join(output)
4545

4646

47-
def get_server_properties(server, fields, formatters={}):
48-
"""Return a tuple containing the server properties.
49-
50-
:param server: a single Server resource
51-
:param fields: tuple of strings with the desired field names
52-
:param formatters: dictionary mapping field names to callables
53-
to format the values
54-
"""
55-
row = []
56-
mixed_case_fields = ['serverId']
57-
58-
for field in fields:
59-
if field in formatters:
60-
row.append(formatters[field](server))
61-
else:
62-
if field in mixed_case_fields:
63-
field_name = field.replace(' ', '_')
64-
else:
65-
field_name = field.lower().replace(' ', '_')
66-
data = getattr(server, field_name, '')
67-
row.append(data)
68-
return tuple(row)
69-
70-
7147
class List_Server(command.OpenStackCommand, lister.Lister):
7248
"List server command."
7349

@@ -142,7 +118,7 @@ def get_data(self, parsed_args):
142118
columns = ('ID', 'Name', 'Status', 'Networks')
143119
data = nova_client.servers.list(search_opts=search_opts)
144120
return (columns,
145-
(get_server_properties(
121+
(utils.get_item_properties(
146122
s, columns,
147123
formatters={'Networks': _format_servers_list_networks},
148124
) for s in data),

‎openstackclient/identity/v2_0/service.py‎

Lines changed: 27 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -28,51 +28,27 @@
2828
from openstackclient.common import utils
2929

3030

31-
def get_service_properties(service, fields, formatters={}):
32-
"""Return a tuple containing the service properties.
33-
34-
:param server: a single Service resource
35-
:param fields: tuple of strings with the desired field names
36-
:param formatters: dictionary mapping field names to callables
37-
to format the values
38-
"""
39-
row = []
40-
mixed_case_fields = []
41-
42-
for field in fields:
43-
if field in formatters:
44-
row.append(formatters[field](service))
45-
else:
46-
if field in mixed_case_fields:
47-
field_name = field.replace(' ', '_')
48-
else:
49-
field_name = field.lower().replace(' ', '_')
50-
data = getattr(service, field_name, '')
51-
row.append(data)
52-
return tuple(row)
53-
54-
5531
class Create_Service(command.OpenStackCommand):
56-
"Create service command."
32+
"""Create service command"""
5733

34+
# FIXME(dtroyer): Service commands are still WIP
5835
api = 'identity'
5936
log = logging.getLogger(__name__)
6037

6138
def get_parser(self, prog_name):
6239
parser = super(Create_Service, self).get_parser(prog_name)
6340
parser.add_argument(
64-
'--long',
65-
action='store_true',
66-
default=False,
67-
help='Additional fields are listed in output')
41+
'service_name',
42+
metavar='<service-name>',
43+
help='New service name')
6844
return parser
6945

70-
def run(self, parsed_args):
71-
self.log.info('v2.Create_Service.run(%s)' % parsed_args)
46+
def get_data(self, parsed_args):
47+
self.log.info('v2.Create_Service.get_data(%s)' % parsed_args)
7248

7349

7450
class List_Service(command.OpenStackCommand, lister.Lister):
75-
"List service command."
51+
"""List service command"""
7652

7753
api = 'identity'
7854
log = logging.getLogger(__name__)
@@ -87,38 +63,43 @@ def get_parser(self, prog_name):
8763
return parser
8864

8965
def get_data(self, parsed_args):
90-
self.log.debug('v2.List_Service.run(%s)' % parsed_args)
66+
self.log.debug('v2.List_Service.get_data(%s)' % parsed_args)
9167
if parsed_args.long:
9268
columns = ('ID', 'Name', 'Type', 'Description')
9369
else:
9470
columns = ('ID', 'Name')
9571
data = self.app.client_manager.identity.services.list()
96-
print "data: %s" % data
9772
return (columns,
98-
(get_service_properties(
73+
(utils.get_item_properties(
9974
s, columns,
10075
formatters={},
10176
) for s in data),
10277
)
10378

104-
#def run(self, parsed_args):
105-
# self.log.info('v2.List_Service.run(%s)' % parsed_args)
10679

107-
108-
class Show_Service(command.OpenStackCommand):
109-
"Show service command."
80+
class Show_Service(command.OpenStackCommand, show.ShowOne):
81+
"""Show service command"""
11082

11183
api = 'identity'
11284
log = logging.getLogger(__name__)
11385

11486
def get_parser(self, prog_name):
11587
parser = super(Show_Service, self).get_parser(prog_name)
11688
parser.add_argument(
117-
'--long',
118-
action='store_true',
119-
default=False,
120-
help='Additional fields are listed in output')
89+
'service',
90+
metavar='<service>',
91+
help='Name or ID of service to display')
12192
return parser
12293

123-
def run(self, parsed_args):
124-
self.log.info('v2.Show_Service.run(%s)' % parsed_args)
94+
def get_data(self, parsed_args):
95+
self.log.info('v2.Show_Service.get_data(%s)' % parsed_args)
96+
identity_client = self.app.client_manager.identity
97+
service = utils.find_resource(
98+
identity_client.services, parsed_args.service)
99+
100+
info = {}
101+
info.update(user._info)
102+
103+
columns = sorted(info.keys())
104+
values = [info[c] for c in columns]
105+
return (columns, values)

‎openstackclient/identity/v2_0/tenant.py‎

Lines changed: 129 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -28,50 +28,149 @@
2828
from openstackclient.common import utils
2929

3030

31-
def get_tenant_properties(tenant, fields, formatters={}):
32-
"""Return a tuple containing the server properties.
33-
34-
:param server: a single Server resource
35-
:param fields: tuple of strings with the desired field names
36-
:param formatters: dictionary mapping field names to callables
37-
to format the values
38-
"""
39-
row = []
40-
mixed_case_fields = []
41-
42-
for field in fields:
43-
if field in formatters:
44-
row.append(formatters[field](tenant))
45-
else:
46-
if field in mixed_case_fields:
47-
field_name = field.replace(' ', '_')
48-
else:
49-
field_name = field.lower().replace(' ', '_')
50-
data = getattr(tenant, field_name, '')
51-
row.append(data)
52-
return tuple(row)
31+
class Create_Tenant(command.OpenStackCommand, show.ShowOne):
32+
"""Create tenant command"""
33+
34+
api = 'identity'
35+
log = logging.getLogger(__name__)
36+
37+
def get_parser(self, prog_name):
38+
parser = super(Create_Tenant, self).get_parser(prog_name)
39+
parser.add_argument(
40+
'tenant_name',
41+
metavar='<tenant-name>',
42+
help='New tenant name')
43+
parser.add_argument(
44+
'--description',
45+
metavar='<tenant-description>',
46+
help='New tenant description')
47+
parser.add_argument(
48+
'--enabled',
49+
metavar='<true|false>',
50+
default=True,
51+
help='Initial tenant enabled status (default true)')
52+
return parser
53+
54+
def get_data(self, parsed_args):
55+
self.log.debug('v2_0.Create_Tenant.get_data(%s)' % parsed_args)
56+
identity_client = self.app.client_manager.identity
57+
tenant = identity_client.tenants.create(
58+
parsed_args.tenant_name,
59+
description=parsed_args.description,
60+
enabled=parsed_args.enabled,
61+
)
62+
63+
info = {}
64+
info.update(tenant._info)
65+
66+
columns = sorted(info.keys())
67+
values = [info[c] for c in columns]
68+
return (columns, values)
69+
70+
71+
class Delete_Tenant(command.OpenStackCommand):
72+
"""Delete tenant command"""
73+
74+
api = 'identity'
75+
log = logging.getLogger(__name__)
76+
77+
def get_parser(self, prog_name):
78+
parser = super(Delete_Tenant, self).get_parser(prog_name)
79+
parser.add_argument(
80+
'tenant',
81+
metavar='<tenant>',
82+
help='Name or ID of tenant to delete')
83+
return parser
84+
85+
def run(self, parsed_args):
86+
self.log.debug('v2_0.Delete_Tenant.run(%s)' % parsed_args)
87+
identity_client = self.app.client_manager.identity
88+
tenant = utils.find_resource(
89+
identity_client.tenants, parsed_args.tenant)
90+
identity_client.tenants.delete(tenant.id)
91+
return
5392

5493

5594
class List_Tenant(command.OpenStackCommand, lister.Lister):
56-
"List tenant command."
95+
"""List tenant command"""
5796

5897
api = 'identity'
5998
log = logging.getLogger(__name__)
6099

100+
def get_parser(self, prog_name):
101+
parser = super(List_Tenant, self).get_parser(prog_name)
102+
parser.add_argument(
103+
'--long',
104+
action='store_true',
105+
default=False,
106+
help='Additional fields are listed in output')
107+
return parser
108+
61109
def get_data(self, parsed_args):
62-
self.log.debug('v2.List_Service.run(%s)' % parsed_args)
63-
columns = ('ID', 'Name', 'Enabled')
110+
self.log.debug('v2_0.List_Tenant.get_data(%s)' % parsed_args)
111+
if parsed_args.long:
112+
columns = ('ID', 'Name', 'Description', 'Enabled')
113+
else:
114+
columns = ('ID', 'Name')
64115
data = self.app.client_manager.identity.tenants.list()
65116
return (columns,
66-
(get_tenant_properties(
117+
(utils.get_item_properties(
67118
s, columns,
68119
formatters={},
69-
) for s in data),
70-
)
120+
) for s in data),
121+
)
122+
123+
124+
class Set_Tenant(command.OpenStackCommand):
125+
"""Set tenant command"""
126+
127+
api = 'identity'
128+
log = logging.getLogger(__name__)
129+
130+
def get_parser(self, prog_name):
131+
parser = super(Set_Tenant, self).get_parser(prog_name)
132+
parser.add_argument(
133+
'tenant',
134+
metavar='<tenant>',
135+
help='Name or ID of tenant to change')
136+
parser.add_argument(
137+
'--name',
138+
metavar='<new-tenant-name>',
139+
help='New tenant name')
140+
parser.add_argument(
141+
'--description',
142+
metavar='<tenant-description>',
143+
help='New tenant description')
144+
parser.add_argument(
145+
'--enabled',
146+
metavar='<true|false>',
147+
help='New tenant enabled status')
148+
return parser
149+
150+
def run(self, parsed_args):
151+
self.log.debug('v2_0.Set_Tenant.run(%s)' % parsed_args)
152+
identity_client = self.app.client_manager.identity
153+
tenant = utils.find_resource(
154+
identity_client.tenants, parsed_args.tenant)
155+
kwargs = {}
156+
if parsed_args.name:
157+
kwargs.update({'name': parsed_args.name})
158+
if parsed_args.description:
159+
kwargs.update({'description': parsed_args.description})
160+
if parsed_args.enabled:
161+
kwargs.update(
162+
{'enabled': utils.string_to_bool(parsed_args.enabled)},
163+
)
164+
165+
if kwargs == {}:
166+
print "Tenant not updated, no arguments present."
167+
return
168+
tenant.update(**kwargs)
169+
return
71170

72171

73172
class Show_Tenant(command.OpenStackCommand, show.ShowOne):
74-
"Show server command."
173+
"""Show tenant command"""
75174

76175
api = 'identity'
77176
log = logging.getLogger(__name__)
@@ -85,17 +184,14 @@ def get_parser(self, prog_name):
85184
return parser
86185

87186
def get_data(self, parsed_args):
88-
self.log.debug('v2.Show_Tenant.run(%s)' % parsed_args)
187+
self.log.debug('v2_0.Show_Tenant.get_data(%s)' % parsed_args)
89188
identity_client = self.app.client_manager.identity
90189
tenant = utils.find_resource(
91190
identity_client.tenants, parsed_args.tenant)
92191

93192
info = {}
94193
info.update(tenant._info)
95194

96-
# Remove a couple of values that are long and not too useful
97-
#info.pop('links', None)
98-
99195
columns = sorted(info.keys())
100196
values = [info[c] for c in columns]
101197
return (columns, values)

0 commit comments

Comments
 (0)