Adding admin lookup of routers per l3 agent

This change allows admin users to find out which routers are
located on which neutron l3 agent.

Partially implements: blueprint admin-neutron-l3-agents

Change-Id: I078ba0a1e6545196c578c8e59d35720c499c301f
This commit is contained in:
eric 2016-04-22 13:40:24 -06:00 committed by Eric Peterson
parent 063271755c
commit 25b1aa86fb
5 changed files with 78 additions and 1 deletions

View File

@ -966,6 +966,13 @@ def router_list(request, **params):
return [Router(r) for r in routers]
def router_list_on_l3_agent(request, l3_agent_id, **params):
routers = neutronclient(request).\
list_routers_on_l3_agent(l3_agent_id,
**params).get('routers')
return [Router(r) for r in routers]
def router_delete(request, router_id):
neutronclient(request).delete_router(router_id)

View File

@ -10,6 +10,7 @@
# License for the specific language governing permissions and limitations
# under the License.
from django.core import urlresolvers
from django import template
from django.template import defaultfilters as filters
from django.utils.translation import pgettext_lazy
@ -164,6 +165,20 @@ def get_network_agent_state(agent):
return _('Down')
class NetworkL3AgentRoutersLinkAction(tables.LinkAction):
name = "l3_agent_router_link"
verbose_name = _("View Routers")
def allowed(self, request, datum):
# Determine whether this action is allowed for the current request.
return datum.agent_type == "L3 agent"
def get_link_url(self, datum=None):
obj_id = datum.id
return urlresolvers.reverse("horizon:admin:routers:l3_agent_list",
args=(obj_id,))
class NetworkAgentsTable(tables.DataTable):
agent_type = tables.Column('agent_type', verbose_name=_('Type'))
binary = tables.Column("binary", verbose_name=_('Name'))
@ -183,7 +198,8 @@ class NetworkAgentsTable(tables.DataTable):
class Meta(object):
name = "network_agents"
verbose_name = _("Network Agents")
table_actions = (NetworkAgentsFilterAction,)
table_actions = (NetworkAgentsFilterAction, )
row_actions = (NetworkL3AgentRoutersLinkAction, )
multi_select = False

View File

@ -61,6 +61,33 @@ class RouterTests(test.BaseAdminViewTests, r_test.RouterTests):
self.assertEqual(len(res.context['table'].data), 0)
self.assertMessageCount(res, error=1)
@test.create_stubs({api.neutron: ('agent_list',
'router_list_on_l3_agent',
'network_list'),
api.keystone: ('tenant_list',)})
def test_list_by_l3_agent(self):
tenants = self.tenants.list()
agent = self.agents.list()[1]
api.neutron.agent_list(
IsA(http.HttpRequest),
id=agent.id).AndReturn([agent])
api.neutron.router_list_on_l3_agent(
IsA(http.HttpRequest),
agent.id,
search_opts=None).AndReturn(self.routers.list())
api.keystone.tenant_list(IsA(http.HttpRequest))\
.AndReturn([tenants, False])
self._mock_external_network_list()
self.mox.ReplayAll()
l3_list_url = reverse('horizon:admin:routers:l3_agent_list',
args=[agent.id])
res = self.client.get(l3_list_url)
self.assertTemplateUsed(res, '%s/routers/index.html' % self.DASHBOARD)
routers = res.context['table'].data
self.assertItemsEqual(routers, self.routers.list())
@test.create_stubs({api.neutron: ('router_list', 'network_list'),
api.keystone: ('tenant_list',)})
def test_set_external_network_empty(self):

View File

@ -28,4 +28,7 @@ urlpatterns = [
url(ROUTER_URL % 'update',
views.UpdateView.as_view(),
name='update'),
url(r'^(?P<l3_agent_id>[^/]+)/l3_agent_list',
views.L3AgentView.as_view(),
name='l3_agent_list'),
]

View File

@ -40,6 +40,10 @@ class IndexView(r_views.IndexView, n_views.IndexView):
routers = []
exceptions.handle(self.request,
_('Unable to retrieve router list.'))
self._set_router_tenant_info(routers)
return routers
def _set_router_tenant_info(self, routers):
if routers:
tenant_dict = self._get_tenant_list()
ext_net_dict = self._list_external_networks()
@ -76,3 +80,23 @@ class UpdateView(r_views.UpdateView):
template_name = 'project/routers/update.html'
success_url = reverse_lazy("horizon:admin:routers:index")
submit_url = "horizon:admin:routers:update"
class L3AgentView(IndexView):
def _get_routers(self, search_opts=None):
try:
agent_id = self.kwargs['l3_agent_id']
agents = api.neutron.agent_list(self.request, id=agent_id)
if agents:
self.page_title = _("Routers on %(host)s") % {'host':
agents[0].host}
routers = api.neutron.\
router_list_on_l3_agent(self.request, agent_id,
search_opts=search_opts)
except Exception:
routers = []
exceptions.handle(self.request,
_('Unable to retrieve router list.'))
self._set_router_tenant_info(routers)
return routers