@@ -93,6 +93,64 @@ def take_action(self, parsed_args):
9393 return zip (* sorted (six .iteritems (info )))
9494
9595
96+ class CreateSecurityGroupRule (show .ShowOne ):
97+ """Create a new security group rule"""
98+
99+ log = logging .getLogger (__name__ + ".CreateSecurityGroupRule" )
100+
101+ def get_parser (self , prog_name ):
102+ parser = super (CreateSecurityGroupRule , self ).get_parser (prog_name )
103+ parser .add_argument (
104+ 'group' ,
105+ metavar = '<group>' ,
106+ help = 'Create rule in this security group (name or ID)' ,
107+ )
108+ parser .add_argument (
109+ "--proto" ,
110+ metavar = "<proto>" ,
111+ default = "tcp" ,
112+ help = "IP protocol (icmp, tcp, udp; default: tcp)" ,
113+ )
114+ parser .add_argument (
115+ "--src-ip" ,
116+ metavar = "<ip-address>" ,
117+ default = "0.0.0.0/0" ,
118+ help = "Source IP (may use CIDR notation; default: 0.0.0.0/0)" ,
119+ )
120+ parser .add_argument (
121+ "--dst-port" ,
122+ metavar = "<port-range>" ,
123+ default = (0 , 0 ),
124+ action = parseractions .RangeAction ,
125+ help = "Destination port, may be a range: 137:139 (default: 0; "
126+ "only required for proto tcp and udp)" ,
127+ )
128+ return parser
129+
130+ def take_action (self , parsed_args ):
131+ self .log .debug ("take_action(%s)" , parsed_args )
132+
133+ compute_client = self .app .client_manager .compute
134+ group = utils .find_resource (
135+ compute_client .security_groups ,
136+ parsed_args .group ,
137+ )
138+ if parsed_args .proto .lower () == 'icmp' :
139+ from_port , to_port = - 1 , - 1
140+ else :
141+ from_port , to_port = parsed_args .dst_port
142+ data = compute_client .security_group_rules .create (
143+ group .id ,
144+ parsed_args .proto ,
145+ from_port ,
146+ to_port ,
147+ parsed_args .src_ip ,
148+ )
149+
150+ info = _xform_security_group_rule (data ._info )
151+ return zip (* sorted (six .iteritems (info )))
152+
153+
96154class DeleteSecurityGroup (command .Command ):
97155 """Delete a security group"""
98156
@@ -119,6 +177,28 @@ def take_action(self, parsed_args):
119177 return
120178
121179
180+ class DeleteSecurityGroupRule (command .Command ):
181+ """Delete a security group rule"""
182+
183+ log = logging .getLogger (__name__ + '.DeleteSecurityGroupRule' )
184+
185+ def get_parser (self , prog_name ):
186+ parser = super (DeleteSecurityGroupRule , self ).get_parser (prog_name )
187+ parser .add_argument (
188+ 'rule' ,
189+ metavar = '<rule>' ,
190+ help = 'Security group rule to delete (ID only)' ,
191+ )
192+ return parser
193+
194+ @utils .log_method (log )
195+ def take_action (self , parsed_args ):
196+
197+ compute_client = self .app .client_manager .compute
198+ compute_client .security_group_rules .delete (parsed_args .rule )
199+ return
200+
201+
122202class ListSecurityGroup (lister .Lister ):
123203 """List security groups"""
124204
@@ -175,6 +255,49 @@ def _get_project(project_id):
175255 ) for s in data ))
176256
177257
258+ class ListSecurityGroupRule (lister .Lister ):
259+ """List security group rules"""
260+
261+ log = logging .getLogger (__name__ + ".ListSecurityGroupRule" )
262+
263+ def get_parser (self , prog_name ):
264+ parser = super (ListSecurityGroupRule , self ).get_parser (prog_name )
265+ parser .add_argument (
266+ 'group' ,
267+ metavar = '<group>' ,
268+ help = 'List all rules in this security group (name or ID)' ,
269+ )
270+ return parser
271+
272+ def take_action (self , parsed_args ):
273+ self .log .debug ("take_action(%s)" , parsed_args )
274+
275+ compute_client = self .app .client_manager .compute
276+ group = utils .find_resource (
277+ compute_client .security_groups ,
278+ parsed_args .group ,
279+ )
280+
281+ # Argh, the rules are not Resources...
282+ rules = []
283+ for rule in group .rules :
284+ rules .append (security_group_rules .SecurityGroupRule (
285+ compute_client .security_group_rules ,
286+ _xform_security_group_rule (rule ),
287+ ))
288+
289+ columns = column_headers = (
290+ "ID" ,
291+ "IP Protocol" ,
292+ "IP Range" ,
293+ "Port Range" ,
294+ )
295+ return (column_headers ,
296+ (utils .get_item_properties (
297+ s , columns ,
298+ ) for s in rules ))
299+
300+
178301class SetSecurityGroup (show .ShowOne ):
179302 """Set security group properties"""
180303
@@ -263,126 +386,3 @@ def take_action(self, parsed_args):
263386 )
264387
265388 return zip (* sorted (six .iteritems (info )))
266-
267-
268- class CreateSecurityGroupRule (show .ShowOne ):
269- """Create a new security group rule"""
270-
271- log = logging .getLogger (__name__ + ".CreateSecurityGroupRule" )
272-
273- def get_parser (self , prog_name ):
274- parser = super (CreateSecurityGroupRule , self ).get_parser (prog_name )
275- parser .add_argument (
276- 'group' ,
277- metavar = '<group>' ,
278- help = 'Create rule in this security group (name or ID)' ,
279- )
280- parser .add_argument (
281- "--proto" ,
282- metavar = "<proto>" ,
283- default = "tcp" ,
284- help = "IP protocol (icmp, tcp, udp; default: tcp)" ,
285- )
286- parser .add_argument (
287- "--src-ip" ,
288- metavar = "<ip-address>" ,
289- default = "0.0.0.0/0" ,
290- help = "Source IP (may use CIDR notation; default: 0.0.0.0/0)" ,
291- )
292- parser .add_argument (
293- "--dst-port" ,
294- metavar = "<port-range>" ,
295- default = (0 , 0 ),
296- action = parseractions .RangeAction ,
297- help = "Destination port, may be a range: 137:139 (default: 0; "
298- "only required for proto tcp and udp)" ,
299- )
300- return parser
301-
302- def take_action (self , parsed_args ):
303- self .log .debug ("take_action(%s)" , parsed_args )
304-
305- compute_client = self .app .client_manager .compute
306- group = utils .find_resource (
307- compute_client .security_groups ,
308- parsed_args .group ,
309- )
310- if parsed_args .proto .lower () == 'icmp' :
311- from_port , to_port = - 1 , - 1
312- else :
313- from_port , to_port = parsed_args .dst_port
314- data = compute_client .security_group_rules .create (
315- group .id ,
316- parsed_args .proto ,
317- from_port ,
318- to_port ,
319- parsed_args .src_ip ,
320- )
321-
322- info = _xform_security_group_rule (data ._info )
323- return zip (* sorted (six .iteritems (info )))
324-
325-
326- class DeleteSecurityGroupRule (command .Command ):
327- """Delete a security group rule"""
328-
329- log = logging .getLogger (__name__ + '.DeleteSecurityGroupRule' )
330-
331- def get_parser (self , prog_name ):
332- parser = super (DeleteSecurityGroupRule , self ).get_parser (prog_name )
333- parser .add_argument (
334- 'rule' ,
335- metavar = '<rule>' ,
336- help = 'Security group rule to delete (ID only)' ,
337- )
338- return parser
339-
340- @utils .log_method (log )
341- def take_action (self , parsed_args ):
342-
343- compute_client = self .app .client_manager .compute
344- compute_client .security_group_rules .delete (parsed_args .rule )
345- return
346-
347-
348- class ListSecurityGroupRule (lister .Lister ):
349- """List security group rules"""
350-
351- log = logging .getLogger (__name__ + ".ListSecurityGroupRule" )
352-
353- def get_parser (self , prog_name ):
354- parser = super (ListSecurityGroupRule , self ).get_parser (prog_name )
355- parser .add_argument (
356- 'group' ,
357- metavar = '<group>' ,
358- help = 'List all rules in this security group (name or ID)' ,
359- )
360- return parser
361-
362- def take_action (self , parsed_args ):
363- self .log .debug ("take_action(%s)" , parsed_args )
364-
365- compute_client = self .app .client_manager .compute
366- group = utils .find_resource (
367- compute_client .security_groups ,
368- parsed_args .group ,
369- )
370-
371- # Argh, the rules are not Resources...
372- rules = []
373- for rule in group .rules :
374- rules .append (security_group_rules .SecurityGroupRule (
375- compute_client .security_group_rules ,
376- _xform_security_group_rule (rule ),
377- ))
378-
379- columns = column_headers = (
380- "ID" ,
381- "IP Protocol" ,
382- "IP Range" ,
383- "Port Range" ,
384- )
385- return (column_headers ,
386- (utils .get_item_properties (
387- s , columns ,
388- ) for s in rules ))
0 commit comments