1515import argparse
1616
1717from cliff import command
18+ from cliff import lister
19+ from oslo_utils import timeutils
1820
1921from cloudkittyclient import utils
2022
@@ -40,3 +42,75 @@ def take_action(self, parsed_args):
4042 utils .get_client_from_osc (self ).dataframes .add_dataframes (
4143 dataframes = dataframes ,
4244 )
45+
46+
47+ class CliDataframesGet (lister .Lister ):
48+ """Get dataframes from the storage backend."""
49+ columns = [
50+ ('begin' , 'Begin' ),
51+ ('end' , 'End' ),
52+ ('metric' , 'Metric Type' ),
53+ ('unit' , 'Unit' ),
54+ ('qty' , 'Quantity' ),
55+ ('price' , 'Price' ),
56+ ('groupby' , 'Group By' ),
57+ ('metadata' , 'Metadata' ),
58+ ]
59+
60+ def get_parser (self , prog_name ):
61+ parser = super (CliDataframesGet , self ).get_parser (prog_name )
62+
63+ def filter_ (elem ):
64+ if len (elem .split (':' )) != 2 :
65+ raise TypeError
66+ return str (elem )
67+
68+ parser .add_argument ('--offset' , type = int , default = 0 ,
69+ help = 'Index of the first dataframe' )
70+ parser .add_argument ('--limit' , type = int , default = 100 ,
71+ help = 'Maximal number of dataframes' )
72+ parser .add_argument ('--filter' , type = filter_ , action = 'append' ,
73+ help = "Optional filter, in 'key:value' format. Can "
74+ "be specified several times." )
75+ parser .add_argument ('-b' , '--begin' , type = timeutils .parse_isotime ,
76+ help = "Start of the period to query, in iso8601 "
77+ "format. Example: 2019-05-01T00:00:00Z." )
78+ parser .add_argument ('-e' , '--end' , type = timeutils .parse_isotime ,
79+ help = "End of the period to query, in iso8601 "
80+ "format. Example: 2019-06-01T00:00:00Z." )
81+
82+ return parser
83+
84+ def take_action (self , parsed_args ):
85+ filters = dict (elem .split (':' ) for elem in (parsed_args .filter or []))
86+
87+ dataframes = utils .get_client_from_osc (self ).dataframes .get_dataframes (
88+ offset = parsed_args .offset ,
89+ limit = parsed_args .limit ,
90+ begin = parsed_args .begin ,
91+ end = parsed_args .end ,
92+ filters = filters ,
93+ ).get ('dataframes' , [])
94+
95+ def format_ (d ):
96+ return ' ' .join ([
97+ '{}="{}"' .format (k , v ) for k , v in (d or {}).items ()])
98+
99+ values = []
100+ for df in dataframes :
101+ period = df ['period' ]
102+ usage = df ['usage' ]
103+ for metric_type , points in usage .items ():
104+ for point in points :
105+ values .append ([
106+ period ['begin' ],
107+ period ['end' ],
108+ metric_type ,
109+ point ['vol' ]['unit' ],
110+ point ['vol' ]['qty' ],
111+ point ['rating' ]['price' ],
112+ format_ (point .get ('groupby' , {})),
113+ format_ (point .get ('metadata' , {})),
114+ ])
115+
116+ return [col [1 ] for col in self .columns ], values
0 commit comments