1313
1414"""Network segment action implementations"""
1515
16- # TODO(rtheis): Add description and name properties when support is available.
16+ import logging
1717
1818from osc_lib .command import command
19+ from osc_lib import exceptions
1920from osc_lib import utils
2021
2122from openstackclient .i18n import _
2223
2324
25+ LOG = logging .getLogger (__name__ )
26+
27+
28+ class CreateNetworkSegment (command .ShowOne ):
29+ """Create new network segment
30+
31+ (Caution: This is a beta command and subject to change.
32+ Use global option --os-beta-command to enable
33+ this command)
34+ """
35+
36+ def get_parser (self , prog_name ):
37+ parser = super (CreateNetworkSegment , self ).get_parser (prog_name )
38+ parser .add_argument (
39+ 'name' ,
40+ metavar = '<name>' ,
41+ help = _ ('New network segment name' )
42+ )
43+ parser .add_argument (
44+ '--description' ,
45+ metavar = '<description>' ,
46+ help = _ ('Network segment description' ),
47+ )
48+ parser .add_argument (
49+ '--physical-network' ,
50+ metavar = '<physical-network>' ,
51+ help = _ ('Physical network name of this network segment' ),
52+ )
53+ parser .add_argument (
54+ '--segment' ,
55+ metavar = '<segment>' ,
56+ type = int ,
57+ help = _ ('Segment identifier for this network segment which is '
58+ 'based on the network type, VLAN ID for vlan network '
59+ 'type and tunnel ID for geneve, gre and vxlan network '
60+ 'types' ),
61+ )
62+ parser .add_argument (
63+ '--network' ,
64+ metavar = '<network>' ,
65+ required = True ,
66+ help = _ ('Network this network segment belongs to (name or ID)' ),
67+ )
68+ parser .add_argument (
69+ '--network-type' ,
70+ metavar = '<network-type>' ,
71+ choices = ['flat' , 'geneve' , 'gre' , 'local' , 'vlan' , 'vxlan' ],
72+ required = True ,
73+ help = _ ('Network type of this network segment '
74+ '(flat, geneve, gre, local, vlan or vxlan)' ),
75+ )
76+ return parser
77+
78+ def take_action (self , parsed_args ):
79+ self .validate_os_beta_command_enabled ()
80+ client = self .app .client_manager .network
81+ attrs = {}
82+ attrs ['name' ] = parsed_args .name
83+ attrs ['network_id' ] = client .find_network (parsed_args .network ,
84+ ignore_missing = False ).id
85+ attrs ['network_type' ] = parsed_args .network_type
86+ if parsed_args .description is not None :
87+ attrs ['description' ] = parsed_args .description
88+ if parsed_args .physical_network is not None :
89+ attrs ['physical_network' ] = parsed_args .physical_network
90+ if parsed_args .segment is not None :
91+ attrs ['segmentation_id' ] = parsed_args .segment
92+ obj = client .create_segment (** attrs )
93+ columns = tuple (sorted (obj .keys ()))
94+ data = utils .get_item_properties (obj , columns )
95+ return (columns , data )
96+
97+
98+ class DeleteNetworkSegment (command .Command ):
99+ """Delete network segment(s)
100+
101+ (Caution: This is a beta command and subject to change.
102+ Use global option --os-beta-command to enable
103+ this command)
104+ """
105+
106+ def get_parser (self , prog_name ):
107+ parser = super (DeleteNetworkSegment , self ).get_parser (prog_name )
108+ parser .add_argument (
109+ 'network_segment' ,
110+ metavar = '<network-segment>' ,
111+ nargs = '+' ,
112+ help = _ ('Network segment(s) to delete (name or ID)' ),
113+ )
114+ return parser
115+
116+ def take_action (self , parsed_args ):
117+ self .validate_os_beta_command_enabled ()
118+ client = self .app .client_manager .network
119+
120+ result = 0
121+ for network_segment in parsed_args .network_segment :
122+ try :
123+ obj = client .find_segment (network_segment ,
124+ ignore_missing = False )
125+ client .delete_segment (obj )
126+ except Exception as e :
127+ result += 1
128+ LOG .error (_ ("Failed to delete network segment with "
129+ "ID '%(network_segment)s': %(e)s" )
130+ % {'network_segment' : network_segment , 'e' : e })
131+
132+ if result > 0 :
133+ total = len (parsed_args .network_segment )
134+ msg = (_ ("%(result)s of %(total)s network segments failed "
135+ "to delete." ) % {'result' : result , 'total' : total })
136+ raise exceptions .CommandError (msg )
137+
138+
24139class ListNetworkSegment (command .Lister ):
25140 """List network segments
26141
@@ -61,12 +176,14 @@ def take_action(self, parsed_args):
61176
62177 headers = (
63178 'ID' ,
179+ 'Name' ,
64180 'Network' ,
65181 'Network Type' ,
66182 'Segment' ,
67183 )
68184 columns = (
69185 'id' ,
186+ 'name' ,
70187 'network_id' ,
71188 'network_type' ,
72189 'segmentation_id' ,
@@ -86,6 +203,46 @@ def take_action(self, parsed_args):
86203 ) for s in data ))
87204
88205
206+ class SetNetworkSegment (command .Command ):
207+ """Set network segment properties
208+
209+ (Caution: This is a beta command and subject to change.
210+ Use global option --os-beta-command to enable
211+ this command)
212+ """
213+
214+ def get_parser (self , prog_name ):
215+ parser = super (SetNetworkSegment , self ).get_parser (prog_name )
216+ parser .add_argument (
217+ 'network_segment' ,
218+ metavar = '<network-segment>' ,
219+ help = _ ('Network segment to modify (name or ID)' ),
220+ )
221+ parser .add_argument (
222+ '--description' ,
223+ metavar = '<description>' ,
224+ help = _ ('Set network segment description' ),
225+ )
226+ parser .add_argument (
227+ '--name' ,
228+ metavar = '<name>' ,
229+ help = _ ('Set network segment name' ),
230+ )
231+ return parser
232+
233+ def take_action (self , parsed_args ):
234+ self .validate_os_beta_command_enabled ()
235+ client = self .app .client_manager .network
236+ obj = client .find_segment (parsed_args .network_segment ,
237+ ignore_missing = False )
238+ attrs = {}
239+ if parsed_args .description is not None :
240+ attrs ['description' ] = parsed_args .description
241+ if parsed_args .name is not None :
242+ attrs ['name' ] = parsed_args .name
243+ client .update_segment (obj , ** attrs )
244+
245+
89246class ShowNetworkSegment (command .ShowOne ):
90247 """Display network segment details
91248
@@ -99,7 +256,7 @@ def get_parser(self, prog_name):
99256 parser .add_argument (
100257 'network_segment' ,
101258 metavar = '<network-segment>' ,
102- help = _ ('Network segment to display (ID only )' ),
259+ help = _ ('Network segment to display (name or ID )' ),
103260 )
104261 return parser
105262
0 commit comments