Skip to content

Commit 4f23a77

Browse files
committed
Add network segment create, delete and set support
Add network segment create, delete and set in support of routed networks. This patch set includes documentation, unit tests and functional tests for the following new commands: - "os network segment create" - "os network segment delete" - "os network segment set" This patch set also includes support for the name and description properties. These new commands are currently marked as beta commands. Change-Id: I86bc223c4adc5b5fe1b1ee5c9253e43ba52fb5ed Depends-On: Ib194125162057fccb4e951587c2fa4ec2e2f098c Partially-Implements: blueprint routed-networks
1 parent bee0491 commit 4f23a77

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)