Router lists display availability zone information
When 'availability_zone'-extension is enabled, we present the user with a column showing the availability zones for which the router is scheduled in. Change-Id: I87f6bfcee1f129a77e6bf9efa973a79bfa2afe14 Partial-bug: #1716638
This commit is contained in:
parent
80643ca53f
commit
59021766b8
|
@ -55,4 +55,4 @@ class RoutersTable(r_tables.RoutersTable):
|
|||
table_actions = (DeleteRouter, AdminRoutersFilterAction)
|
||||
row_actions = (EditRouter, DeleteRouter,)
|
||||
columns = ('tenant', 'name', 'status', 'distributed', 'ext_net',
|
||||
'ha', 'admin_state',)
|
||||
'ha', 'availability_zones', 'admin_state',)
|
||||
|
|
|
@ -35,7 +35,8 @@ class RouterTests(test.BaseAdminViewTests, r_test.RouterTests):
|
|||
lookup_l3=True)
|
||||
return res
|
||||
|
||||
@test.create_stubs({api.neutron: ('router_list', 'network_list'),
|
||||
@test.create_stubs({api.neutron: ('router_list', 'network_list',
|
||||
'is_extension_supported'),
|
||||
api.keystone: ('tenant_list',)})
|
||||
def test_index(self):
|
||||
tenants = self.tenants.list()
|
||||
|
@ -43,6 +44,9 @@ class RouterTests(test.BaseAdminViewTests, r_test.RouterTests):
|
|||
IsA(http.HttpRequest)).AndReturn(self.routers.list())
|
||||
api.keystone.tenant_list(IsA(http.HttpRequest))\
|
||||
.AndReturn([tenants, False])
|
||||
api.neutron.is_extension_supported(IsA(http.HttpRequest),
|
||||
"router_availability_zone")\
|
||||
.AndReturn(True)
|
||||
self._mock_external_network_list()
|
||||
|
||||
self.mox.ReplayAll()
|
||||
|
@ -53,11 +57,15 @@ class RouterTests(test.BaseAdminViewTests, r_test.RouterTests):
|
|||
routers = res.context['table'].data
|
||||
self.assertItemsEqual(routers, self.routers.list())
|
||||
|
||||
@test.create_stubs({api.neutron: ('router_list',),
|
||||
@test.create_stubs({api.neutron: ('router_list',
|
||||
'is_extension_supported'),
|
||||
api.keystone: ('tenant_list',)})
|
||||
def test_index_router_list_exception(self):
|
||||
api.neutron.router_list(
|
||||
IsA(http.HttpRequest)).AndRaise(self.exceptions.neutron)
|
||||
api.neutron.is_extension_supported(IsA(http.HttpRequest),
|
||||
"router_availability_zone")\
|
||||
.AndReturn(True)
|
||||
self.mox.ReplayAll()
|
||||
|
||||
res = self.client.get(self.INDEX_URL)
|
||||
|
@ -68,7 +76,8 @@ class RouterTests(test.BaseAdminViewTests, r_test.RouterTests):
|
|||
|
||||
@test.create_stubs({api.neutron: ('agent_list',
|
||||
'router_list_on_l3_agent',
|
||||
'network_list'),
|
||||
'network_list',
|
||||
'is_extension_supported'),
|
||||
api.keystone: ('tenant_list',)})
|
||||
def test_list_by_l3_agent(self):
|
||||
tenants = self.tenants.list()
|
||||
|
@ -82,6 +91,9 @@ class RouterTests(test.BaseAdminViewTests, r_test.RouterTests):
|
|||
search_opts=None).AndReturn(self.routers.list())
|
||||
api.keystone.tenant_list(IsA(http.HttpRequest))\
|
||||
.AndReturn([tenants, False])
|
||||
api.neutron.is_extension_supported(IsA(http.HttpRequest),
|
||||
"router_availability_zone")\
|
||||
.AndReturn(True)
|
||||
self._mock_external_network_list()
|
||||
|
||||
self.mox.ReplayAll()
|
||||
|
@ -93,12 +105,16 @@ class RouterTests(test.BaseAdminViewTests, r_test.RouterTests):
|
|||
routers = res.context['table'].data
|
||||
self.assertItemsEqual(routers, self.routers.list())
|
||||
|
||||
@test.create_stubs({api.neutron: ('router_list', 'network_list'),
|
||||
@test.create_stubs({api.neutron: ('router_list', 'network_list',
|
||||
'is_extension_supported'),
|
||||
api.keystone: ('tenant_list',)})
|
||||
def test_set_external_network_empty(self):
|
||||
router = self.routers.first()
|
||||
api.neutron.router_list(
|
||||
IsA(http.HttpRequest)).AndReturn([router])
|
||||
api.neutron.is_extension_supported(IsA(http.HttpRequest),
|
||||
"router_availability_zone")\
|
||||
.AndReturn(True)
|
||||
api.keystone.tenant_list(IsA(http.HttpRequest))\
|
||||
.AndReturn([self.tenants.list(), False])
|
||||
self._mock_external_network_list(alter_ids=True)
|
||||
|
@ -114,7 +130,8 @@ class RouterTests(test.BaseAdminViewTests, r_test.RouterTests):
|
|||
self.assertMessageCount(res, error=1)
|
||||
|
||||
@test.create_stubs({api.neutron: ('router_list', 'network_list',
|
||||
'port_list', 'router_delete',),
|
||||
'port_list', 'router_delete',
|
||||
'is_extension_supported'),
|
||||
api.keystone: ('tenant_list',)})
|
||||
def test_router_delete(self):
|
||||
router = self.routers.first()
|
||||
|
@ -126,6 +143,9 @@ class RouterTests(test.BaseAdminViewTests, r_test.RouterTests):
|
|||
self._mock_external_network_list()
|
||||
api.neutron.router_list(
|
||||
IsA(http.HttpRequest)).AndReturn(self.routers.list())
|
||||
api.neutron.is_extension_supported(IsA(http.HttpRequest),
|
||||
"router_availability_zone")\
|
||||
.MultipleTimes().AndReturn(True)
|
||||
api.keystone.tenant_list(IsA(http.HttpRequest))\
|
||||
.AndReturn([tenants, False])
|
||||
self._mock_external_network_list()
|
||||
|
@ -151,7 +171,8 @@ class RouterTests(test.BaseAdminViewTests, r_test.RouterTests):
|
|||
|
||||
@test.create_stubs({api.neutron: ('router_list', 'network_list',
|
||||
'port_list', 'router_remove_interface',
|
||||
'router_delete',),
|
||||
'router_delete',
|
||||
'is_extension_supported'),
|
||||
api.keystone: ('tenant_list',)})
|
||||
def test_router_with_interface_delete(self):
|
||||
router = self.routers.first()
|
||||
|
@ -164,6 +185,9 @@ class RouterTests(test.BaseAdminViewTests, r_test.RouterTests):
|
|||
self._mock_external_network_list()
|
||||
api.neutron.router_list(
|
||||
IsA(http.HttpRequest)).AndReturn(self.routers.list())
|
||||
api.neutron.is_extension_supported(IsA(http.HttpRequest),
|
||||
"router_availability_zone")\
|
||||
.MultipleTimes().AndReturn(True)
|
||||
api.keystone.tenant_list(IsA(http.HttpRequest))\
|
||||
.AndReturn([tenants, False])
|
||||
self._mock_external_network_list()
|
||||
|
@ -190,8 +214,14 @@ class RouterTests(test.BaseAdminViewTests, r_test.RouterTests):
|
|||
self.assertIn('Deleted Router: ' + router.name,
|
||||
res.content.decode('utf-8'))
|
||||
|
||||
@test.create_stubs({api.neutron: ('is_extension_supported',)})
|
||||
@test.update_settings(FILTER_DATA_FIRST={'admin.routers': True})
|
||||
def test_routers_list_with_admin_filter_first(self):
|
||||
api.neutron.is_extension_supported(IsA(http.HttpRequest),
|
||||
"router_availability_zone")\
|
||||
.MultipleTimes().AndReturn(True)
|
||||
self.mox.ReplayAll()
|
||||
|
||||
res = self.client.get(self.INDEX_URL)
|
||||
self.assertTemplateUsed(res, INDEX_TEMPLATE)
|
||||
routers = res.context['table'].data
|
||||
|
|
|
@ -197,6 +197,13 @@ def get_external_network(router):
|
|||
return _("-")
|
||||
|
||||
|
||||
def get_availability_zones(router):
|
||||
if 'availability_zones' in router and router.availability_zones:
|
||||
return ', '.join(router.availability_zones)
|
||||
else:
|
||||
return _("-")
|
||||
|
||||
|
||||
class RoutersFilterAction(tables.FilterAction):
|
||||
name = 'filter_project_routers'
|
||||
filter_type = 'server'
|
||||
|
@ -236,6 +243,8 @@ class RoutersTable(tables.DataTable):
|
|||
admin_state = tables.Column("admin_state",
|
||||
verbose_name=_("Admin State"),
|
||||
display_choices=ADMIN_STATE_DISPLAY_CHOICES)
|
||||
availability_zones = tables.Column(get_availability_zones,
|
||||
verbose_name=_("Availability Zones"))
|
||||
|
||||
def __init__(self, request, data=None, needs_form_wrapper=None, **kwargs):
|
||||
super(RoutersTable, self).__init__(
|
||||
|
@ -247,6 +256,9 @@ class RoutersTable(tables.DataTable):
|
|||
del self.columns["distributed"]
|
||||
if not api.neutron.get_feature_permission(request, "l3-ha", "get"):
|
||||
del self.columns["ha"]
|
||||
if not api.neutron.is_extension_supported(request,
|
||||
"router_availability_zone"):
|
||||
del self.columns["availability_zones"]
|
||||
|
||||
def get_object_display(self, obj):
|
||||
return obj.name
|
||||
|
|
|
@ -38,6 +38,9 @@ class RouterMixin(object):
|
|||
support_l3_agent=True):
|
||||
api.neutron.is_extension_supported(IsA(http.HttpRequest), 'extraroute')\
|
||||
.MultipleTimes().AndReturn(extraroute)
|
||||
api.neutron.is_extension_supported(IsA(http.HttpRequest),
|
||||
"router_availability_zone")\
|
||||
.MultipleTimes().AndReturn(True)
|
||||
if lookup_l3:
|
||||
api.neutron.is_extension_supported(IsA(http.HttpRequest),
|
||||
'l3_agent_scheduler')\
|
||||
|
@ -90,7 +93,8 @@ class RouterTests(RouterMixin, test.TestCase):
|
|||
INDEX_URL = reverse('horizon:%s:routers:index' % DASHBOARD)
|
||||
DETAIL_PATH = 'horizon:%s:routers:detail' % DASHBOARD
|
||||
|
||||
@test.create_stubs({api.neutron: ('router_list', 'network_list'),
|
||||
@test.create_stubs({api.neutron: ('router_list', 'network_list',
|
||||
'is_extension_supported'),
|
||||
quotas: ('tenant_quota_usages',)})
|
||||
def test_index(self):
|
||||
quota_data = self.neutron_quota_usages.first()
|
||||
|
@ -100,6 +104,9 @@ class RouterTests(RouterMixin, test.TestCase):
|
|||
quotas.tenant_quota_usages(
|
||||
IsA(http.HttpRequest), targets=('routers', )) \
|
||||
.MultipleTimes().AndReturn(quota_data)
|
||||
api.neutron.is_extension_supported(IsA(http.HttpRequest),
|
||||
"router_availability_zone")\
|
||||
.AndReturn(True)
|
||||
self._mock_external_network_list()
|
||||
self.mox.ReplayAll()
|
||||
|
||||
|
@ -109,7 +116,8 @@ class RouterTests(RouterMixin, test.TestCase):
|
|||
routers = res.context['table'].data
|
||||
self.assertItemsEqual(routers, self.routers.list())
|
||||
|
||||
@test.create_stubs({api.neutron: ('router_list', 'network_list'),
|
||||
@test.create_stubs({api.neutron: ('router_list', 'network_list',
|
||||
'is_extension_supported'),
|
||||
quotas: ('tenant_quota_usages',)})
|
||||
def test_index_router_list_exception(self):
|
||||
quota_data = self.neutron_quota_usages.first()
|
||||
|
@ -120,6 +128,9 @@ class RouterTests(RouterMixin, test.TestCase):
|
|||
quotas.tenant_quota_usages(
|
||||
IsA(http.HttpRequest), targets=('routers', )) \
|
||||
.MultipleTimes().AndReturn(quota_data)
|
||||
api.neutron.is_extension_supported(IsA(http.HttpRequest),
|
||||
"router_availability_zone")\
|
||||
.AndReturn(True)
|
||||
self._mock_external_network_list()
|
||||
self.mox.ReplayAll()
|
||||
|
||||
|
@ -129,7 +140,8 @@ class RouterTests(RouterMixin, test.TestCase):
|
|||
self.assertEqual(len(res.context['table'].data), 0)
|
||||
self.assertMessageCount(res, error=1)
|
||||
|
||||
@test.create_stubs({api.neutron: ('router_list', 'network_list'),
|
||||
@test.create_stubs({api.neutron: ('router_list', 'network_list',
|
||||
'is_extension_supported'),
|
||||
quotas: ('tenant_quota_usages',)})
|
||||
def test_set_external_network_empty(self):
|
||||
router = self.routers.first()
|
||||
|
@ -140,6 +152,9 @@ class RouterTests(RouterMixin, test.TestCase):
|
|||
quotas.tenant_quota_usages(
|
||||
IsA(http.HttpRequest), targets=('routers', )) \
|
||||
.MultipleTimes().AndReturn(quota_data)
|
||||
api.neutron.is_extension_supported(IsA(http.HttpRequest),
|
||||
"router_availability_zone")\
|
||||
.AndReturn(True)
|
||||
self._mock_external_network_list(alter_ids=True)
|
||||
self.mox.ReplayAll()
|
||||
|
||||
|
@ -173,7 +188,8 @@ class RouterTests(RouterMixin, test.TestCase):
|
|||
self.assertRedirectsNoFollow(res, self.INDEX_URL)
|
||||
|
||||
@test.create_stubs({api.neutron: ('router_list', 'network_list',
|
||||
'port_list', 'router_delete',),
|
||||
'port_list', 'router_delete',
|
||||
'is_extension_supported'),
|
||||
quotas: ('tenant_quota_usages',)})
|
||||
def test_router_delete(self):
|
||||
router = self.routers.first()
|
||||
|
@ -184,6 +200,9 @@ class RouterTests(RouterMixin, test.TestCase):
|
|||
quotas.tenant_quota_usages(
|
||||
IsA(http.HttpRequest), targets=('routers', )) \
|
||||
.MultipleTimes().AndReturn(quota_data)
|
||||
api.neutron.is_extension_supported(IsA(http.HttpRequest),
|
||||
"router_availability_zone")\
|
||||
.MultipleTimes().AndReturn(True)
|
||||
self._mock_external_network_list()
|
||||
api.neutron.router_list(
|
||||
IsA(http.HttpRequest),
|
||||
|
@ -210,7 +229,8 @@ class RouterTests(RouterMixin, test.TestCase):
|
|||
|
||||
@test.create_stubs({api.neutron: ('router_list', 'network_list',
|
||||
'port_list', 'router_remove_interface',
|
||||
'router_delete',),
|
||||
'router_delete',
|
||||
'is_extension_supported'),
|
||||
quotas: ('tenant_quota_usages',)})
|
||||
def test_router_with_interface_delete(self):
|
||||
router = self.routers.first()
|
||||
|
@ -222,6 +242,9 @@ class RouterTests(RouterMixin, test.TestCase):
|
|||
quotas.tenant_quota_usages(
|
||||
IsA(http.HttpRequest), targets=('routers', )) \
|
||||
.MultipleTimes().AndReturn(quota_data)
|
||||
api.neutron.is_extension_supported(IsA(http.HttpRequest),
|
||||
"router_availability_zone")\
|
||||
.MultipleTimes().AndReturn(True)
|
||||
self._mock_external_network_list()
|
||||
api.neutron.router_list(
|
||||
IsA(http.HttpRequest),
|
||||
|
@ -797,7 +820,8 @@ class RouterViewTests(RouterMixin, test.TestCase):
|
|||
DASHBOARD = 'project'
|
||||
INDEX_URL = reverse('horizon:%s:routers:index' % DASHBOARD)
|
||||
|
||||
@test.create_stubs({api.neutron: ('router_list', 'network_list'),
|
||||
@test.create_stubs({api.neutron: ('router_list', 'network_list',
|
||||
'is_extension_supported'),
|
||||
quotas: ('tenant_quota_usages',)})
|
||||
def test_create_button_disabled_when_quota_exceeded(self):
|
||||
quota_data = self.neutron_quota_usages.first()
|
||||
|
@ -808,6 +832,9 @@ class RouterViewTests(RouterMixin, test.TestCase):
|
|||
quotas.tenant_quota_usages(
|
||||
IsA(http.HttpRequest), targets=('routers', )) \
|
||||
.MultipleTimes().AndReturn(quota_data)
|
||||
api.neutron.is_extension_supported(IsA(http.HttpRequest),
|
||||
"router_availability_zone")\
|
||||
.AndReturn(True)
|
||||
|
||||
self._mock_external_network_list()
|
||||
self.mox.ReplayAll()
|
||||
|
@ -824,7 +851,8 @@ class RouterViewTests(RouterMixin, test.TestCase):
|
|||
self.assertEqual('Create Router (Quota exceeded)',
|
||||
create_action.verbose_name)
|
||||
|
||||
@test.create_stubs({api.neutron: ('router_list', 'network_list'),
|
||||
@test.create_stubs({api.neutron: ('router_list', 'network_list',
|
||||
'is_extension_supported'),
|
||||
quotas: ('tenant_quota_usages',)})
|
||||
def test_create_button_shown_when_quota_disabled(self):
|
||||
quota_data = self.neutron_quota_usages.first()
|
||||
|
@ -835,6 +863,9 @@ class RouterViewTests(RouterMixin, test.TestCase):
|
|||
quotas.tenant_quota_usages(
|
||||
IsA(http.HttpRequest), targets=('routers', )) \
|
||||
.MultipleTimes().AndReturn(quota_data)
|
||||
api.neutron.is_extension_supported(IsA(http.HttpRequest),
|
||||
"router_availability_zone")\
|
||||
.AndReturn(True)
|
||||
|
||||
self._mock_external_network_list()
|
||||
self.mox.ReplayAll()
|
||||
|
@ -851,7 +882,8 @@ class RouterViewTests(RouterMixin, test.TestCase):
|
|||
self.assertEqual('Create Router',
|
||||
create_action.verbose_name)
|
||||
|
||||
@test.create_stubs({api.neutron: ('router_list', 'network_list'),
|
||||
@test.create_stubs({api.neutron: ('router_list', 'network_list',
|
||||
'is_extension_supported'),
|
||||
quotas: ('tenant_quota_usages',)})
|
||||
def test_create_button_attributes(self):
|
||||
quota_data = self.neutron_quota_usages.first()
|
||||
|
@ -862,6 +894,9 @@ class RouterViewTests(RouterMixin, test.TestCase):
|
|||
quotas.tenant_quota_usages(
|
||||
IsA(http.HttpRequest), targets=('routers', )) \
|
||||
.MultipleTimes().AndReturn(quota_data)
|
||||
api.neutron.is_extension_supported(IsA(http.HttpRequest),
|
||||
"router_availability_zone")\
|
||||
.AndReturn(True)
|
||||
|
||||
self._mock_external_network_list()
|
||||
self.mox.ReplayAll()
|
||||
|
|
Loading…
Reference in New Issue