From 640e687f3ea99bfdb5ea77285d058c16a96da4f4 Mon Sep 17 00:00:00 2001 From: Ben Thomasson Date: Wed, 17 May 2017 16:05:20 -0400 Subject: [PATCH] Adds JSON and YAML export of the network topology. Adds views that export the entire network topology as JSON and YAML. --- awx/network_ui/serializers.py | 12 ++++++-- .../templates/network_ui/index.html | 11 ++++++++ awx/network_ui/templates/prototype/index.html | 11 -------- awx/network_ui/urls.py | 4 ++- awx/network_ui/views.py | 28 +++++++++++++++++++ awx/urls.py | 1 + 6 files changed, 53 insertions(+), 14 deletions(-) create mode 100644 awx/network_ui/templates/network_ui/index.html delete mode 100644 awx/network_ui/templates/prototype/index.html diff --git a/awx/network_ui/serializers.py b/awx/network_ui/serializers.py index 05732f5fe4..4d1f533c20 100644 --- a/awx/network_ui/serializers.py +++ b/awx/network_ui/serializers.py @@ -2,6 +2,7 @@ from awx.network_ui.models import Topology, Device, Link, Interface from django.db.models import Q import yaml +import json NetworkAnnotatedInterface = Interface.objects.values('name', 'id', @@ -13,7 +14,7 @@ NetworkAnnotatedInterface = Interface.objects.values('name', 'to_link__from_interface__name') -def yaml_serialize_topology(topology_id): +def topology_data(topology_id): data = dict(devices=[], links=[]) @@ -54,5 +55,12 @@ def yaml_serialize_topology(topology_id): from_interface_id=link.from_interface.id, to_interface_id=link.to_interface.id, network=link.pk)) + return data - return yaml.safe_dump(data, default_flow_style=False) + +def yaml_serialize_topology(topology_id): + return yaml.safe_dump(topology_data(topology_id), default_flow_style=False) + + +def json_serialize_topology(topology_id): + return json.dumps(topology_data(topology_id)) diff --git a/awx/network_ui/templates/network_ui/index.html b/awx/network_ui/templates/network_ui/index.html new file mode 100644 index 0000000000..fbee2cdc9b --- /dev/null +++ b/awx/network_ui/templates/network_ui/index.html @@ -0,0 +1,11 @@ + diff --git a/awx/network_ui/templates/prototype/index.html b/awx/network_ui/templates/prototype/index.html deleted file mode 100644 index ea2f523719..0000000000 --- a/awx/network_ui/templates/prototype/index.html +++ /dev/null @@ -1,11 +0,0 @@ - diff --git a/awx/network_ui/urls.py b/awx/network_ui/urls.py index 204960f74a..fa560e4df8 100644 --- a/awx/network_ui/urls.py +++ b/awx/network_ui/urls.py @@ -6,6 +6,8 @@ import awx.network_ui.routing app_name = 'network_ui' urlpatterns = [ - url(r'^$', views.index, name='index'), + url(r'^topology.json$', views.json_topology_data, name='json_topology_data'), + url(r'^topology.yaml$', views.yaml_topology_data, name='json_topology_data'), + url(r'^$', views.index, name='index'), ] diff --git a/awx/network_ui/views.py b/awx/network_ui/views.py index ef79e47b69..aba5958147 100644 --- a/awx/network_ui/views.py +++ b/awx/network_ui/views.py @@ -1,8 +1,36 @@ from django.shortcuts import render +from django import forms +from django.http import JsonResponse, HttpResponseBadRequest, HttpResponse +import yaml + # Create your views here. from .models import Topology +from .serializers import topology_data def index(request): return render(request, "network_ui/index.html", dict(topologies=Topology.objects.all().order_by('-pk'))) + + +class TopologyForm(forms.Form): + topology_id = forms.IntegerField() + + +def json_topology_data(request): + form = TopologyForm(request.GET) + if form.is_valid(): + return JsonResponse(topology_data(form.cleaned_data['topology_id'])) + else: + return HttpResponseBadRequest(form.errors) + + +def yaml_topology_data(request): + form = TopologyForm(request.GET) + if form.is_valid(): + return HttpResponse(yaml.safe_dump(topology_data(form.cleaned_data['topology_id']), + default_flow_style=False), + content_type='application/yaml') + else: + return HttpResponseBadRequest(form.errors) + diff --git a/awx/urls.py b/awx/urls.py index 554eb2c813..57a97fdae5 100644 --- a/awx/urls.py +++ b/awx/urls.py @@ -15,6 +15,7 @@ urlpatterns = [ url(r'^api/', include('awx.api.urls', namespace='api')), url(r'^sso/', include('awx.sso.urls', namespace='sso')), url(r'^sso/', include('social_django.urls', namespace='social')), + url(r'^network_ui/', include('awx.network_ui.urls', namespace='network_uiui', app_name='network_ui')), url(r'^(?:api/)?400.html$', handle_400), url(r'^(?:api/)?403.html$', handle_403), url(r'^(?:api/)?404.html$', handle_404),