2121from cliff import lister
2222from cliff import show
2323
24+ from openstackclient .common import exceptions
25+
2426
2527class BaseCommand (object ):
2628 json_indent = None
@@ -34,28 +36,72 @@ def dumps(self, value, indent=None):
3436 pass
3537 return json .dumps (to_primitive (value ))
3638
37- def format_data (self , data ):
38- # Modify data to make it more readable
39+ def format_row (self , data ):
40+ row = []
3941 for k , v in data .iteritems ():
4042 if k in self .matters :
41- data [ k ] = self .matters [k ](v )
43+ row . append ( self .matters [k ](v ) )
4244 elif isinstance (v , list ):
4345 value = '\n ' .join (self .dumps (
4446 i , indent = self .json_indent ) if isinstance (i , dict )
4547 else str (i ) for i in v )
46- data [k ] = value
48+ row .append (value )
49+ elif isinstance (v , dict ):
50+ row .append (self .dumps (v , indent = self .json_indent ))
51+ elif v is None :
52+ row .append ('' )
53+ else :
54+ row .append (v )
55+ return row
56+
57+ def data_formatter (self , data ):
58+ d = {}
59+ for k , v in data .iteritems ():
60+ if k in self .matters :
61+ d [k ] = self .matters [k ](v )
62+ elif isinstance (v , list ):
63+ d [k ] = ',' .join (self .dumps (
64+ i , indent = self .json_indent ) if isinstance (i , dict )
65+ else str (i ) for i in v )
4766 elif isinstance (v , dict ):
48- value = self .dumps (v , indent = self .json_indent )
49- data [k ] = value
67+ d [k ] = self .dumps (v , indent = self .json_indent )
5068 elif v is None :
51- data [k ] = ''
52- return data
69+ d [k ] = ''
70+ else :
71+ d [k ] = v
72+ return d
73+
74+ def get_list_method (self ):
75+ return getattr (self .app .client_manager .network ,
76+ "list_%s" % self .resources )
77+
78+ def find_resource (self , name ):
79+ client = self .app .client_manager .network
80+ list_method = self .get_list_method ()
81+ data = list_method (name = name , fields = 'id' )
82+ info = data [self .resources ]
83+ if len (info ) == 1 :
84+ return info [0 ]['id' ]
85+ if len (info ) > 1 :
86+ msg = "More than one %s exists with the name '%s'." % \
87+ (self .resource , name )
88+ raise exceptions .CommandError (msg )
89+ data = list_method (id = name , fields = 'id' )
90+ info = data [self .resources ]
91+ if len (info ) == 1 :
92+ return info [0 ]['id' ]
93+ msg = "No %s with a name or ID of '%s' exists." % \
94+ (self .resource , name )
95+ raise exceptions .CommandError (msg )
5396
5497
5598class CreateCommand (show .ShowOne , BaseCommand ):
5699
57100 log = logging .getLogger (__name__ + '.CreateCommand' )
58101
102+ def get_client (self ):
103+ return self .app .client_manager .network
104+
59105 def get_parser (self , prog_name ):
60106 parser = super (CreateCommand , self ).get_parser (prog_name )
61107 parser .add_argument (
@@ -72,42 +118,54 @@ def take_action(self, parsed_args):
72118 return neuter .take_action (parsed_args )
73119
74120
75- class DeleteCommand (command .Command ):
121+ class DeleteCommand (command .Command , BaseCommand ):
76122
77123 log = logging .getLogger (__name__ + '.DeleteCommand' )
78- name = "id"
79- metavar = "<id>"
80- help_text = "Identifier of object to delete"
124+ allow_names = True
125+
126+ def __init__ (self , app , app_args ):
127+ super (DeleteCommand , self ).__init__ (app , app_args )
128+ self .resources = getattr (self , 'resources' , (self .resource + "s" ))
129+ self .metavar = "<" + self .resource + ">"
130+ self .help_text = getattr (self , 'help_text' , "Name or identifier " + \
131+ "of " + self .resource .replace ('_' , ' ' ) + " to delete" )
132+ self .func = getattr (self , 'func' , self .resource )
133+ self .response = self .resource
81134
82- def get_client (self ):
83- return self .app .client_manager .network
84135
85136 def get_parser (self , prog_name ):
86137 parser = super (DeleteCommand , self ).get_parser (prog_name )
87138 parser .add_argument (
88- self . name ,
139+ 'identifier' ,
89140 metavar = self .metavar ,
90- help = self .help_text ,
141+ help = self .help_text
91142 )
92143 return parser
93144
94145 def take_action (self , parsed_args ):
95146 self .log .debug ('take_action(%s)' % parsed_args )
96- neuter = self .clazz (self .app , self .app_args )
97- neuter .get_client = self .get_client
98- parsed_args .request_format = 'json'
99- return neuter .run (parsed_args )
147+ if self .allow_names :
148+ _id = self .find_resource (parsed_args .identifier )
149+ else :
150+ _id = parsed_args .identifier
151+ delete_method = getattr (self .app .client_manager .network , "delete_" +
152+ self .func )
153+ delete_method (_id )
154+ print >> self .app .stdout , ('Deleted %(resource)s: %(id)s'
155+ % {'id' : parsed_args .identifier , 'resource' : self .resource })
156+ return
100157
101158
102- class ListCommand (lister .Lister ):
159+ class ListCommand (lister .Lister , BaseCommand ):
103160
104161 log = logging .getLogger (__name__ + '.ListCommand' )
105162 columns = []
163+ report_filter = {}
106164
107165 def __init__ (self , app , app_args ):
108166 super (ListCommand , self ).__init__ (app , app_args )
109- self .func = self .resource
110- self .name = self . resource
167+ self .resources = getattr ( self , 'resources' , ( self .resource + "s" ))
168+ self .func = getattr ( self , 'func' , self . resources )
111169
112170 def get_parser (self , prog_name ):
113171 parser = super (ListCommand , self ).get_parser (prog_name )
@@ -122,24 +180,26 @@ def get_parser(self, prog_name):
122180
123181 def take_action (self , parsed_args ):
124182 self .log .debug ('take_action(%s)' % parsed_args )
125- method = getattr ( self .app . client_manager . network , "list_" + self . func )
126- data = method ( )[self .resource ]
183+ list_method = self .get_list_method ( )
184+ data = list_method ( ** self . report_filter )[self .resources ]
127185 if not self .columns :
128186 self .columns = len (data ) > 0 and data [0 ].keys () or []
129187 self .columns = [w .replace (':' , ' ' ) for w in self .columns ]
130- return (self .columns , (self .format_data (item ) for item in data ))
188+ return (self .columns , (self .format_row (item ) for item in data ))
131189
132190
133- class SetCommand (command .Command ):
191+ class SetCommand (command .Command , BaseCommand ):
134192
135193 log = logging .getLogger (__name__ + '.SetCommand' )
194+ allow_names = True
136195
137196 def __init__ (self , app , app_args ):
138197 super (SetCommand , self ).__init__ (app , app_args )
139- self .metavar = "<" + self .name + ">"
140- self .help_text = "Name or identifier of " + \
141- self .name .replace ('_' , ' ' ) + " to set"
142- self .func = self .name
198+ self .resources = getattr (self , 'resources' , (self .resource + "s" ))
199+ self .metavar = "<" + self .resource + ">"
200+ self .help_text = getattr (self , 'help_text' , "Name or identifier " + \
201+ "of " + self .resource .replace ('_' , ' ' ) + " to set" )
202+ self .func = getattr (self , 'func' , self .resource )
143203 self .body = {}
144204
145205 def get_parser (self , prog_name ):
@@ -158,21 +218,31 @@ def get_parser(self, prog_name):
158218 def take_action (self , parsed_args ):
159219 self .log .debug ('take_action(%s)' % parsed_args )
160220 _manager = self .app .client_manager .network
161- method = getattr (_manager , "update_" + self .func )
162- return method (parsed_args .identifier , self .body )
221+ if self .allow_names :
222+ _id = self .find_resource (parsed_args .identifier )
223+ else :
224+ _id = parsed_args .identifier
225+ update_method = getattr (_manager , "update_" + self .func )
226+ update_method (_id , self .body )
227+ print >> self .app .stdout , ('Updated %(resource)s: %(id)s' %
228+ {'id' : parsed_args .identifier , 'resource' : self .resource })
229+ return
230+
163231
164232
165233class ShowCommand (show .ShowOne , BaseCommand ):
166234
167235 log = logging .getLogger (__name__ + '.ShowCommand' )
236+ allow_names = True
168237
169238 def __init__ (self , app , app_args ):
170239 super (ShowCommand , self ).__init__ (app , app_args )
171- self .metavar = "<" + self .name + ">"
172- self .help_text = "Name or identifier of " + \
173- self .name .replace ('_' , ' ' ) + " to show"
174- self .func = self .name
175- self .response = self .name
240+ self .resources = getattr (self , 'resources' , (self .resource + "s" ))
241+ self .metavar = "<" + self .resource + ">"
242+ self .help_text = getattr (self , 'help_text' , "Name or identifier " + \
243+ "of " + self .resource .replace ('_' , ' ' ) + " to show" )
244+ self .func = getattr (self , 'func' , self .resource )
245+ self .response = self .resource
176246
177247 def get_parser (self , prog_name ):
178248 parser = super (ShowCommand , self ).get_parser (prog_name )
@@ -185,8 +255,13 @@ def get_parser(self, prog_name):
185255
186256 def take_action (self , parsed_args ):
187257 self .log .debug ('take_action(%s)' % parsed_args )
188- method = getattr (self .app .client_manager .network , "show_" + self .func )
189- data = self .format_data (method (parsed_args .identifier ))
258+ if self .allow_names :
259+ _id = self .find_resource (parsed_args .identifier )
260+ else :
261+ _id = parsed_args .identifier
262+ show_method = getattr (self .app .client_manager .network ,
263+ "show_" + self .func )
264+ data = self .data_formatter (show_method (_id )[self .resource ])
190265 return zip (* sorted (six .iteritems (data )))
191266
192267
0 commit comments