diff --git a/peeringdb_server/management/commands/pdb_api_test.py b/peeringdb_server/management/commands/pdb_api_test.py index 889f2e18..3481858a 100644 --- a/peeringdb_server/management/commands/pdb_api_test.py +++ b/peeringdb_server/management/commands/pdb_api_test.py @@ -826,6 +826,16 @@ class TestJSON(unittest.TestCase): data = self.db_guest.all("poc", visible="Private", limit=100) self.assertEqual(0, len(data)) + ########################################################################## + + def test_user_001_GET_as_set(self): + data = self.db_guest.all("as_set") + networks = Network.objects.filter(status="ok") + print(data) + for net in networks: + self.assertEqual(data[0].get(u"{}".format(net.asn)), net.irr_as_set) + + ########################################################################## # TESTS WITH USER THAT IS ORGANIZATION MEMBER ########################################################################## @@ -1042,6 +1052,28 @@ class TestJSON(unittest.TestCase): ########################################################################## + def test_org_admin_002_POST_PUT_DELETE_as_set(self): + + """ + The as-set endpoint is readonly, so all of these should + fail + """ + data = self.make_data_net(asn=9000900) + + with self.assertRaises(Exception) as exc: + r_data = self.assert_create(self.db_org_admin,"as_set",data) + self.assertIn("You do not have permission", str(exc.exception)) + + with self.assertRaises(Exception) as exc: + self.db_org_admin.update("as_set", {"9000900":"AS-XXX"}) + self.assertIn("You do not have permission", str(exc.exception)) + + with self.assertRaises(Exception) as exc: + self.db_org_admin.rm("as_set", SHARED["net_rw_ok"].asn) + self.assertIn("You do not have permission", str(exc.exception)) + + ########################################################################## + def test_org_admin_002_POST_net_bogon_asn(self): # Test bogon asn failure diff --git a/peeringdb_server/models.py b/peeringdb_server/models.py index 9ca2d165..6d07d099 100644 --- a/peeringdb_server/models.py +++ b/peeringdb_server/models.py @@ -1943,6 +1943,16 @@ class Network(pdb_models.NetworkBase): q = NetworkIXLan.handleref.select_related("ixlan").filter(**filt) return qset.exclude(id__in=[i.network_id for i in q]) + + @classmethod + def as_set_map(cls, qset=None): + """ + Returns a dict mapping asns to their irr_as_set value + """ + if not qset: + qset = cls.objects.filter(status="ok").order_by("asn") + return dict([(net.asn, net.irr_as_set) for net in qset]) + @property def search_result_name(self): """ diff --git a/peeringdb_server/rest.py b/peeringdb_server/rest.py index 6a1d6dcf..f572eac6 100644 --- a/peeringdb_server/rest.py +++ b/peeringdb_server/rest.py @@ -697,18 +697,52 @@ NetworkIXLanViewSet = model_view_set('NetworkIXLan') OrganizationViewSet = model_view_set('Organization') -class NetworkASNViewSet(NetworkViewSet): +class ReadOnlyMixin(object): + + def destroy(self, request, pk, format=None): + """ + This endpoint is readonly + """ + return Response(status=status.HTTP_405_METHOD_NOT_ALLOWED) + + def create(self, request, *args, **kwargs): + """ + This endpoint is readonly + """ + return Response(status=status.HTTP_405_METHOD_NOT_ALLOWED) + + def update(self, request, *args, **kwargs): + """ + This endpoint is readonly + """ + return Response(status=status.HTTP_405_METHOD_NOT_ALLOWED) + + def patch(self, request, *args, **kwargs): + """ + This endpoint is readonly + """ + return Response(status=status.HTTP_405_METHOD_NOT_ALLOWED) + + + +class ASSetViewSet(ReadOnlyMixin, viewsets.ModelViewSet): """ - Rest API end point for Networks (by ASN, readonly) + AS-SET endpoint + + lists all as sets mapped by asn """ lookup_field = "asn" + http_method_names = ["get"] + model = Network + + def get_queryset(self): + return Network.objects.filter(status="ok").exclude(irr_as_set="") + + def list(self, request): + return Response(Network.as_set_map(self.get_queryset())) def retrieve(self, request, asn): - """ - Get network by asn - """ - try: network = Network.objects.get(asn=int(asn)) except ValueError: @@ -716,28 +750,11 @@ class NetworkASNViewSet(NetworkViewSet): data={"detail": "Invalid ASN"}) except ObjectDoesNotExist: return Response(status=status.HTTP_404_NOT_FOUND) - return super(NetworkViewSet, self).retrieve(request, network.id) - - def destroy(self, request, pk, format=None): - """ - The asn endpoint is readonly, use the /net endpoint to make changes to Network objects - """ - return Response(status=status.HTTP_405_METHOD_NOT_ALLOWED) - - def create(self, request, *args, **kwargs): - """ - The asn endpoint is readonly, use the /net endpoint to make changes to Network objects - """ - return Response(status=status.HTTP_405_METHOD_NOT_ALLOWED) - - def update(self, request, *args, **kwargs): - """ - The asn endpoint is readonly, use the /net endpoint to make changes to Network objects - """ - return Response(status=status.HTTP_405_METHOD_NOT_ALLOWED) + return Response({network.asn : network.irr_as_set}) -# router.register('asn', NetworkASNViewSet, base_name='asn') + +router.register('as_set', ASSetViewSet, base_name='as_set') # set here in case we want to add more urls later urls = router.urls diff --git a/peeringdb_server/templates/site/advanced-search-net.html b/peeringdb_server/templates/site/advanced-search-net.html index 599966aa..555205ee 100644 --- a/peeringdb_server/templates/site/advanced-search-net.html +++ b/peeringdb_server/templates/site/advanced-search-net.html @@ -65,7 +65,7 @@
-
{% trans "IRR Macro" %}
+
{% trans "IRR as-set/route-set" %}
-
{% trans "IRR Record" %}
+
{% trans "IRR as-set/route-set" %}
diff --git a/peeringdb_server/templates/site/view_suggest_net.html b/peeringdb_server/templates/site/view_suggest_net.html index 8982d2e4..e661f67d 100644 --- a/peeringdb_server/templates/site/view_suggest_net.html +++ b/peeringdb_server/templates/site/view_suggest_net.html @@ -61,7 +61,7 @@ Thank you for your suggestion.
-
{% trans "IRR Record" %}
+
{% trans "IRR as-set/route-set" %}
diff --git a/peeringdb_server/views.py b/peeringdb_server/views.py index e02a6f3f..b03f8206 100644 --- a/peeringdb_server/views.py +++ b/peeringdb_server/views.py @@ -1247,7 +1247,7 @@ def view_network(request, id): "value": network_d.get("asn", dismiss) }, { "name": "irr_as_set", - "label": _("IRR Record"), + "label": _("IRR as-set/route-set"), "notify_incomplete": True, "value": network_d.get("irr_as_set", dismiss) }, {