Merge "Router lists display availability zone information"

This commit is contained in:
Zuul 2017-10-20 23:51:56 +00:00 committed by Gerrit Code Review
commit b488cbb2d9
4 changed files with 92 additions and 15 deletions

View File

@ -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',)

View File

@ -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

View File

@ -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

View File

@ -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),
@ -856,7 +879,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()
@ -867,6 +891,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()
@ -883,7 +910,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()
@ -894,6 +922,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()
@ -910,7 +941,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()
@ -921,6 +953,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()