Skip to content

Commit 5dc8151

Browse files
Jenkinsopenstack-gerrit
authored andcommitted
Merge "Add network segment create, delete and set support"
2 parents 69c4f60 + 4f23a77 commit 5dc8151

8 files changed

Lines changed: 660 additions & 26 deletions

File tree

doc/source/command-objects/network-segment.rst

Lines changed: 100 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,75 @@ within a network may not be guaranteed.
99

1010
Network v2
1111

12+
network segment create
13+
----------------------
14+
15+
Create new network segment
16+
17+
.. caution:: This is a beta command and subject to change.
18+
Use global option ``--os-beta-command`` to
19+
enable this command.
20+
21+
.. program:: network segment create
22+
.. code:: bash
23+
24+
os network segment create
25+
[--description <description>]
26+
[--physical-network <physical-network>]
27+
[--segment <segment>]
28+
--network <network>
29+
--network-type <network-type>
30+
<name>
31+
32+
.. option:: --description <description>
33+
34+
Network segment description
35+
36+
.. option:: --physical-network <physical-network>
37+
38+
Physical network name of this network segment
39+
40+
.. option:: --segment <segment>
41+
42+
Segment identifier for this network segment which is
43+
based on the network type, VLAN ID for vlan network
44+
type and tunnel ID for geneve, gre and vxlan network
45+
types
46+
47+
.. option:: --network <network>
48+
49+
Network this network segment belongs to (name or ID)
50+
51+
.. option:: --network-type <network-type>
52+
53+
Network type of this network segment
54+
(flat, geneve, gre, local, vlan or vxlan)
55+
56+
.. _network_segment_create-name:
57+
.. describe:: <name>
58+
59+
New network segment name
60+
61+
network segment delete
62+
----------------------
63+
64+
Delete network segment(s)
65+
66+
.. caution:: This is a beta command and subject to change.
67+
Use global option ``--os-beta-command`` to
68+
enable this command.
69+
70+
.. program:: network segment delete
71+
.. code:: bash
72+
73+
os network segment delete
74+
<network-segment> [<network-segment> ...]
75+
76+
.. _network_segment_delete-segment:
77+
.. describe:: <network-segment>
78+
79+
Network segment(s) to delete (name or ID)
80+
1281
network segment list
1382
--------------------
1483

@@ -33,6 +102,36 @@ List network segments
33102

34103
List network segments that belong to this network (name or ID)
35104

105+
network segment set
106+
-------------------
107+
108+
Set network segment properties
109+
110+
.. caution:: This is a beta command and subject to change.
111+
Use global option ``--os-beta-command`` to
112+
enable this command.
113+
114+
.. program:: network segment set
115+
.. code:: bash
116+
117+
os network segment set
118+
[--description <description>]
119+
[--name <name>]
120+
<network-segment>
121+
122+
.. option:: --description <description>
123+
124+
Set network segment description
125+
126+
.. option:: --name <name>
127+
128+
Set network segment name
129+
130+
.. _network_segment_set-segment:
131+
.. describe:: <network-segment>
132+
133+
Network segment to modify (name or ID)
134+
36135
network segment show
37136
--------------------
38137

@@ -51,4 +150,4 @@ Display network segment details
51150
.. _network_segment_show-segment:
52151
.. describe:: <network-segment>
53152

54-
Network segment to display (ID only)
153+
Network segment to display (name or ID)

openstackclient/network/v2/network_segment.py

Lines changed: 159 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,129 @@
1313

1414
"""Network segment action implementations"""
1515

16-
# TODO(rtheis): Add description and name properties when support is available.
16+
import logging
1717

1818
from osc_lib.command import command
19+
from osc_lib import exceptions
1920
from osc_lib import utils
2021

2122
from 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+
24139
class 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+
89246
class 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

openstackclient/tests/functional/base.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,11 @@ def get_openstack_configuration_value(cls, configuration):
5757
opts = cls.get_opts([configuration])
5858
return cls.openstack('configuration show ' + opts)
5959

60+
@classmethod
61+
def get_openstack_extention_names(cls):
62+
opts = cls.get_opts(['Name'])
63+
return cls.openstack('extension list ' + opts)
64+
6065
@classmethod
6166
def get_opts(cls, fields, format='value'):
6267
return ' -f {0} {1}'.format(format,

0 commit comments

Comments
 (0)