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:
parent
063271755c
commit
25b1aa86fb
|
@ -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)
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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'),
|
||||
]
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue