Skip to content

Commit 82bf5ce

Browse files
authored
Merge pull request #39 from fdomain/cmdb-remove-all
Add endpoint removing all objects attached to a device
2 parents 665cca6 + 34be43a commit 82bf5ce

File tree

3 files changed

+63
-0
lines changed

3 files changed

+63
-0
lines changed

netbox_cmdb/netbox_cmdb/api/cmdb/__init__.py

Whitespace-only changes.
+57
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
from django.db import transaction
2+
from django.db.models import Q
3+
from drf_yasg import openapi
4+
from drf_yasg.openapi import Parameter
5+
from drf_yasg.utils import swagger_auto_schema
6+
from rest_framework import serializers, status
7+
from rest_framework.response import Response
8+
from rest_framework.views import APIView
9+
10+
from netbox.api.authentication import IsAuthenticatedOrLoginNotRequired
11+
from netbox_cmdb.models.bgp import BGPPeerGroup, BGPSession, DeviceBGPSession
12+
from netbox_cmdb.models.prefix_list import PrefixList
13+
from netbox_cmdb.models.route_policy import RoutePolicy
14+
from netbox_cmdb.models.snmp import SNMP
15+
16+
17+
class DeleteAllCMDBObjectsRelatedToDeviceSerializer(serializers.Serializer):
18+
device_name = serializers.CharField()
19+
20+
21+
class DeleteAllCMDBObjectsRelatedToDevice(APIView):
22+
23+
permission_classes = [IsAuthenticatedOrLoginNotRequired]
24+
25+
@swagger_auto_schema(
26+
request_body=DeleteAllCMDBObjectsRelatedToDeviceSerializer,
27+
responses={
28+
status.HTTP_200_OK: "Objects related to device have been deleted successfully",
29+
status.HTTP_400_BAD_REQUEST: "Bad Request: Device name is required",
30+
status.HTTP_500_INTERNAL_SERVER_ERROR: "Internal Server Error: Something went wrong on the server",
31+
},
32+
)
33+
def post(self, request):
34+
device_name = request.data.get("device_name", None)
35+
if device_name is None:
36+
return Response(
37+
{"error": "Device name is required"}, status=status.HTTP_400_BAD_REQUEST
38+
)
39+
40+
with transaction.atomic():
41+
try:
42+
# Delete objects in reverse order of dependencies
43+
BGPSession.objects.filter(
44+
Q(peer_a__device__name=device_name) | Q(peer_b__device__name=device_name)
45+
).delete()
46+
DeviceBGPSession.objects.filter(device__name=device_name).delete()
47+
BGPPeerGroup.objects.filter(device__name=device_name).delete()
48+
RoutePolicy.objects.filter(device__name=device_name).delete()
49+
PrefixList.objects.filter(device__name=device_name).delete()
50+
SNMP.objects.filter(device__name=device_name).delete()
51+
except Exception as e:
52+
return Response({"error": str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
53+
54+
return Response(
55+
{"message": f"Objects related to device {device_name} have been deleted successfully"},
56+
status=status.HTTP_200_OK,
57+
)

netbox_cmdb/netbox_cmdb/api/urls.py

+6
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
from netbox_cmdb.api.prefix_list.views import PrefixListViewSet
1414
from netbox_cmdb.api.route_policy.views import RoutePolicyViewSet
1515
from netbox_cmdb.api.snmp.views import SNMPCommunityViewSet, SNMPViewSet
16+
from netbox_cmdb.api.cmdb.views import DeleteAllCMDBObjectsRelatedToDevice
1617

1718
router = NetBoxRouter()
1819

@@ -33,5 +34,10 @@
3334
AvailableASNsView.as_view(),
3435
name="asns-available-asn",
3536
),
37+
path(
38+
"cmdb/delete-all-objects/",
39+
DeleteAllCMDBObjectsRelatedToDevice.as_view(),
40+
name="asns-available-asn",
41+
),
3642
]
3743
urlpatterns += router.urls

0 commit comments

Comments
 (0)