Skip to content

Commit 6158ebb

Browse files
committed
Router: Add "router create" command using SDK
This patch adds "router create" command to osc using sdk. NOTE: Test for --project needs support for fake identity client v2 and v3. These tests will be added in other patches. NOTE: external_gateway_info and routes are not supported to be passed to create command now. They will be supported in another tow patches. NOTE: Creating a ha router is not supported for now. Will support it in another patch. Change-Id: I7642295d27c27dd498331ae1da1c293706d8f6af Implements: blueprint neutron-client Partial-bug: #1519503
1 parent 1ee5191 commit 6158ebb

5 files changed

Lines changed: 186 additions & 1 deletion

File tree

doc/source/command-objects/router.rst

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,46 @@ router
44

55
Network v2
66

7+
router create
8+
--------------
9+
10+
Create new router
11+
12+
.. program:: router create
13+
.. code:: bash
14+
15+
os router create
16+
[--project <project> [--project-domain <project-domain>]]
17+
[--enable | --disable]
18+
[--distributed]
19+
<name>
20+
21+
.. option:: --project <project>
22+
23+
Owner's project (name or ID)
24+
25+
.. option:: --project-domain <project-domain>
26+
27+
Domain the project belongs to (name or ID).
28+
This can be used in case collisions between project names exist.
29+
30+
.. option:: --enable
31+
32+
Enable router (default)
33+
34+
.. option:: --disable
35+
36+
Disable router
37+
38+
.. option:: --distributed
39+
40+
Create a distributed router
41+
42+
.. _router_create-name:
43+
.. describe:: <name>
44+
45+
New router name
46+
747
router list
848
-----------
949

openstackclient/network/v2/router.py

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,10 @@
1717
import logging
1818

1919
from cliff import lister
20+
from cliff import show
2021

2122
from openstackclient.common import utils
23+
from openstackclient.identity import common as identity_common
2224

2325

2426
def _format_admin_state(state):
@@ -38,6 +40,83 @@ def _format_external_gateway_info(info):
3840
}
3941

4042

43+
def _get_attrs(client_manager, parsed_args):
44+
attrs = {}
45+
if parsed_args.name is not None:
46+
attrs['name'] = str(parsed_args.name)
47+
if parsed_args.admin_state_up is not None:
48+
attrs['admin_state_up'] = parsed_args.admin_state_up
49+
if parsed_args.distributed is not None:
50+
attrs['distributed'] = parsed_args.distributed
51+
if 'project' in parsed_args and parsed_args.project is not None:
52+
identity_client = client_manager.identity
53+
project_id = identity_common.find_project(
54+
identity_client,
55+
parsed_args.project,
56+
parsed_args.project_domain,
57+
).id
58+
attrs['tenant_id'] = project_id
59+
return attrs
60+
61+
62+
class CreateRouter(show.ShowOne):
63+
"""Create a new router"""
64+
65+
log = logging.getLogger(__name__ + '.CreateRouter')
66+
67+
def get_parser(self, prog_name):
68+
parser = super(CreateRouter, self).get_parser(prog_name)
69+
parser.add_argument(
70+
'name',
71+
metavar='<name>',
72+
help="New router name",
73+
)
74+
admin_group = parser.add_mutually_exclusive_group()
75+
admin_group.add_argument(
76+
'--enable',
77+
dest='admin_state_up',
78+
action='store_true',
79+
default=True,
80+
help="Enable router (default)",
81+
)
82+
admin_group.add_argument(
83+
'--disable',
84+
dest='admin_state_up',
85+
action='store_false',
86+
help="Disable router",
87+
)
88+
parser.add_argument(
89+
'--distributed',
90+
dest='distributed',
91+
action='store_true',
92+
default=False,
93+
help="Create a distributed router",
94+
)
95+
parser.add_argument(
96+
'--project',
97+
metavar='<poroject>',
98+
help="Owner's project (name or ID)",
99+
)
100+
identity_common.add_project_domain_option_to_parser(parser)
101+
return parser
102+
103+
def take_action(self, parsed_args):
104+
self.log.debug('take_action(%s)' % parsed_args)
105+
client = self.app.client_manager.network
106+
107+
attrs = _get_attrs(self.app.client_manager, parsed_args)
108+
obj = client.create_router(**attrs)
109+
110+
columns = sorted(obj.keys())
111+
data = utils.get_item_properties(obj, columns, formatters=_formatters)
112+
113+
if 'tenant_id' in columns:
114+
# Rename "tenant_id" to "project_id".
115+
index = columns.index('tenant_id')
116+
columns[index] = 'project_id'
117+
return (tuple(columns), data)
118+
119+
41120
class ListRouter(lister.Lister):
42121
"""List routers"""
43122

openstackclient/tests/network/v2/fakes.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,10 @@ def create_one_router(attrs={}, methods={}):
174174
router_attrs.update(attrs)
175175

176176
# Set default methods.
177-
router_methods = {}
177+
router_methods = {
178+
'keys': ['id', 'name', 'admin_state_up', 'distributed', 'ha',
179+
'tenant_id'],
180+
}
178181

179182
# Overwrite default methods.
180183
router_methods.update(methods)

openstackclient/tests/network/v2/test_router.py

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515

1616
from openstackclient.network.v2 import router
1717
from openstackclient.tests.network.v2 import fakes as network_fakes
18+
from openstackclient.tests import utils as tests_utils
1819

1920

2021
class TestRouter(network_fakes.TestNetworkV2):
@@ -26,6 +27,67 @@ def setUp(self):
2627
self.network = self.app.client_manager.network
2728

2829

30+
class TestCreateRouter(TestRouter):
31+
32+
# The new router created.
33+
new_router = network_fakes.FakeRouter.create_one_router()
34+
35+
columns = (
36+
'admin_state_up',
37+
'distributed',
38+
'ha',
39+
'id',
40+
'name',
41+
'project_id',
42+
)
43+
data = (
44+
router._format_admin_state(new_router.admin_state_up),
45+
new_router.distributed,
46+
new_router.ha,
47+
new_router.id,
48+
new_router.name,
49+
new_router.tenant_id,
50+
)
51+
52+
def setUp(self):
53+
super(TestCreateRouter, self).setUp()
54+
55+
self.network.create_router = mock.Mock(return_value=self.new_router)
56+
57+
# Get the command object to test
58+
self.cmd = router.CreateRouter(self.app, self.namespace)
59+
60+
def test_create_no_options(self):
61+
arglist = []
62+
verifylist = []
63+
64+
try:
65+
self.check_parser(self.cmd, arglist, verifylist)
66+
except tests_utils.ParserException:
67+
pass
68+
69+
def test_create_default_options(self):
70+
arglist = [
71+
self.new_router.name,
72+
]
73+
verifylist = [
74+
('name', self.new_router.name),
75+
('admin_state_up', True),
76+
('distributed', False),
77+
]
78+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
79+
80+
columns, data = (self.cmd.take_action(parsed_args))
81+
82+
self.network.create_router.assert_called_with(**{
83+
'admin_state_up': True,
84+
'name': self.new_router.name,
85+
'distributed': False,
86+
})
87+
self.assertEqual(self.columns, columns)
88+
self.assertEqual(self.data, data)
89+
90+
2991
class TestListRouter(TestRouter):
3092

3193
# The routers going to be listed up.

setup.cfg

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -332,6 +332,7 @@ openstack.network.v2 =
332332
network_list = openstackclient.network.v2.network:ListNetwork
333333
network_set = openstackclient.network.v2.network:SetNetwork
334334
network_show = openstackclient.network.v2.network:ShowNetwork
335+
router_create = openstackclient.network.v2.router:CreateRouter
335336
router_list = openstackclient.network.v2.router:ListRouter
336337

337338
openstack.object_store.v1 =

0 commit comments

Comments
 (0)