1515
1616"""Usage action implementations"""
1717
18- import collections
1918import datetime
2019import functools
2120
2221from cliff import columns as cliff_columns
23- from novaclient import api_versions
2422from osc_lib .command import command
2523from osc_lib import utils
2624
@@ -58,7 +56,7 @@ def human_readable(self):
5856class CountColumn (cliff_columns .FormattableColumn ):
5957
6058 def human_readable (self ):
61- return len (self ._value )
59+ return len (self ._value ) if self . _value is not None else None
6260
6361
6462class FloatColumn (cliff_columns .FormattableColumn ):
@@ -69,7 +67,7 @@ def human_readable(self):
6967
7068def _formatters (project_cache ):
7169 return {
72- 'tenant_id ' : functools .partial (
70+ 'project_id ' : functools .partial (
7371 ProjectColumn , project_cache = project_cache ),
7472 'server_usages' : CountColumn ,
7573 'total_memory_mb_usage' : FloatColumn ,
@@ -102,10 +100,10 @@ def _merge_usage(usage, next_usage):
102100
103101def _merge_usage_list (usages , next_usage_list ):
104102 for next_usage in next_usage_list :
105- if next_usage .tenant_id in usages :
106- _merge_usage (usages [next_usage .tenant_id ], next_usage )
103+ if next_usage .project_id in usages :
104+ _merge_usage (usages [next_usage .project_id ], next_usage )
107105 else :
108- usages [next_usage .tenant_id ] = next_usage
106+ usages [next_usage .project_id ] = next_usage
109107
110108
111109class ListUsage (command .Lister ):
@@ -138,9 +136,9 @@ def _format_project(project):
138136 else :
139137 return project
140138
141- compute_client = self .app .client_manager .compute
139+ compute_client = self .app .client_manager .sdk_connection . compute
142140 columns = (
143- "tenant_id " ,
141+ "project_id " ,
144142 "server_usages" ,
145143 "total_memory_mb_usage" ,
146144 "total_vcpus_usage" ,
@@ -154,36 +152,25 @@ def _format_project(project):
154152 "Disk GB-Hours"
155153 )
156154
157- dateformat = "%Y-%m-%d"
155+ date_cli_format = "%Y-%m-%d"
156+ date_api_format = "%Y-%m-%dT%H:%M:%S"
158157 now = datetime .datetime .utcnow ()
159158
160159 if parsed_args .start :
161- start = datetime .datetime .strptime (parsed_args .start , dateformat )
160+ start = datetime .datetime .strptime (
161+ parsed_args .start , date_cli_format )
162162 else :
163163 start = now - datetime .timedelta (weeks = 4 )
164164
165165 if parsed_args .end :
166- end = datetime .datetime .strptime (parsed_args .end , dateformat )
166+ end = datetime .datetime .strptime (parsed_args .end , date_cli_format )
167167 else :
168168 end = now + datetime .timedelta (days = 1 )
169169
170- if compute_client .api_version < api_versions .APIVersion ("2.40" ):
171- usage_list = compute_client .usage .list (start , end , detailed = True )
172- else :
173- # If the number of instances used to calculate the usage is greater
174- # than CONF.api.max_limit, the usage will be split across multiple
175- # requests and the responses will need to be merged back together.
176- usages = collections .OrderedDict ()
177- usage_list = compute_client .usage .list (start , end , detailed = True )
178- _merge_usage_list (usages , usage_list )
179- marker = _get_usage_list_marker (usage_list )
180- while marker :
181- next_usage_list = compute_client .usage .list (
182- start , end , detailed = True , marker = marker )
183- marker = _get_usage_list_marker (next_usage_list )
184- if marker :
185- _merge_usage_list (usages , next_usage_list )
186- usage_list = list (usages .values ())
170+ usage_list = list (compute_client .usages (
171+ start = start .strftime (date_api_format ),
172+ end = end .strftime (date_api_format ),
173+ detailed = True ))
187174
188175 # Cache the project list
189176 project_cache = {}
@@ -196,8 +183,8 @@ def _format_project(project):
196183
197184 if parsed_args .formatter == 'table' and len (usage_list ) > 0 :
198185 self .app .stdout .write (_ ("Usage from %(start)s to %(end)s: \n " ) % {
199- "start" : start .strftime (dateformat ),
200- "end" : end .strftime (dateformat ),
186+ "start" : start .strftime (date_cli_format ),
187+ "end" : end .strftime (date_cli_format ),
201188 })
202189
203190 return (
@@ -239,17 +226,19 @@ def get_parser(self, prog_name):
239226
240227 def take_action (self , parsed_args ):
241228 identity_client = self .app .client_manager .identity
242- compute_client = self .app .client_manager .compute
243- dateformat = "%Y-%m-%d"
229+ compute_client = self .app .client_manager .sdk_connection .compute
230+ date_cli_format = "%Y-%m-%d"
231+ date_api_format = "%Y-%m-%dT%H:%M:%S"
244232 now = datetime .datetime .utcnow ()
245233
246234 if parsed_args .start :
247- start = datetime .datetime .strptime (parsed_args .start , dateformat )
235+ start = datetime .datetime .strptime (
236+ parsed_args .start , date_cli_format )
248237 else :
249238 start = now - datetime .timedelta (weeks = 4 )
250239
251240 if parsed_args .end :
252- end = datetime .datetime .strptime (parsed_args .end , dateformat )
241+ end = datetime .datetime .strptime (parsed_args .end , date_cli_format )
253242 else :
254243 end = now + datetime .timedelta (days = 1 )
255244
@@ -262,19 +251,21 @@ def take_action(self, parsed_args):
262251 # Get the project from the current auth
263252 project = self .app .client_manager .auth_ref .project_id
264253
265- usage = compute_client .usage .get (project , start , end )
254+ usage = compute_client .get_usage (
255+ project = project , start = start .strftime (date_api_format ),
256+ end = end .strftime (date_api_format ))
266257
267258 if parsed_args .formatter == 'table' :
268259 self .app .stdout .write (_ (
269260 "Usage from %(start)s to %(end)s on project %(project)s: \n "
270261 ) % {
271- "start" : start .strftime (dateformat ),
272- "end" : end .strftime (dateformat ),
262+ "start" : start .strftime (date_cli_format ),
263+ "end" : end .strftime (date_cli_format ),
273264 "project" : project ,
274265 })
275266
276267 columns = (
277- "tenant_id " ,
268+ "project_id " ,
278269 "server_usages" ,
279270 "total_memory_mb_usage" ,
280271 "total_vcpus_usage" ,
0 commit comments