Initial commit
This commit is contained in:
commit
4ff9eac274
45 files changed
+2911
No files matched your search
Whitespace-only changes.
@@ -0,0 +1,36 @@
|
||||
from rest_framework import serializers
|
||||
|
||||
from netbox.api.serializers import NetBoxModelSerializer
|
||||
|
||||
from ..models import Service, ServiceTemplate
|
||||
|
||||
|
||||
class ServiceTemplateSerializer(NetBoxModelSerializer):
|
||||
url = serializers.HyperlinkedIdentityField(
|
||||
view_name="plugins-api:netbox_services-api:servicetemplate-detail",
|
||||
)
|
||||
|
||||
class Meta:
|
||||
model = ServiceTemplate
|
||||
fields = (
|
||||
"id", "url", "display", "name", "status",
|
||||
"tree", "description", "comments", "tags",
|
||||
"created", "last_updated",
|
||||
)
|
||||
brief_fields = ("id", "url", "display", "name", "status")
|
||||
|
||||
|
||||
class ServiceSerializer(NetBoxModelSerializer):
|
||||
url = serializers.HyperlinkedIdentityField(
|
||||
view_name="plugins-api:netbox_services-api:service-detail",
|
||||
)
|
||||
service_template = ServiceTemplateSerializer(nested=True)
|
||||
|
||||
class Meta:
|
||||
model = Service
|
||||
fields = (
|
||||
"id", "url", "display", "name", "service_template",
|
||||
"tenant", "status", "description", "comments", "tags",
|
||||
"created", "last_updated",
|
||||
)
|
||||
brief_fields = ("id", "url", "display", "name", "status")
|
||||
@@ -0,0 +1,9 @@
|
||||
from netbox.api.routers import NetBoxRouter
|
||||
|
||||
from .views import ServiceTemplateViewSet, ServiceViewSet
|
||||
|
||||
router = NetBoxRouter()
|
||||
router.register("service-templates", ServiceTemplateViewSet)
|
||||
router.register("services", ServiceViewSet)
|
||||
|
||||
urlpatterns = router.urls
|
||||
@@ -0,0 +1,62 @@
|
||||
from rest_framework import status
|
||||
from rest_framework.decorators import action
|
||||
from rest_framework.response import Response
|
||||
|
||||
from netbox.api.viewsets import NetBoxModelViewSet
|
||||
|
||||
from ..engine.resolver import Resolver
|
||||
from ..models import Service, ServiceTemplate
|
||||
from .serializers import ServiceSerializer, ServiceTemplateSerializer
|
||||
|
||||
|
||||
class ServiceTemplateViewSet(NetBoxModelViewSet):
|
||||
queryset = ServiceTemplate.objects.all()
|
||||
serializer_class = ServiceTemplateSerializer
|
||||
|
||||
|
||||
class ServiceViewSet(NetBoxModelViewSet):
|
||||
queryset = Service.objects.all()
|
||||
serializer_class = ServiceSerializer
|
||||
|
||||
@action(detail=True, methods=["post"])
|
||||
def resolve(self, request, pk=None):
|
||||
"""Resolve a service's requirement tree.
|
||||
|
||||
Request body: ``{"mode": "dry_run" | "commit"}``
|
||||
"""
|
||||
service = self.get_object()
|
||||
mode = request.data.get("mode", "dry_run")
|
||||
|
||||
resolver = Resolver()
|
||||
try:
|
||||
result = resolver.resolve(service, mode=mode, user=request.user)
|
||||
except Exception as exc:
|
||||
return Response(
|
||||
{"error": str(exc)},
|
||||
status=status.HTTP_400_BAD_REQUEST,
|
||||
)
|
||||
|
||||
planned_data = []
|
||||
for node_name, obj in result.planned_objects:
|
||||
ct = obj.__class__._meta
|
||||
planned_data.append({
|
||||
"node": node_name,
|
||||
"object_type": f"{ct.app_label}.{ct.model_name}",
|
||||
"object_id": obj.pk,
|
||||
"object": str(obj),
|
||||
})
|
||||
|
||||
response_data = {
|
||||
"mode": mode,
|
||||
"succeeded": result.succeeded,
|
||||
"total_planned": result.total_planned,
|
||||
"total_current": result.total_current,
|
||||
"to_add": len(result.to_add),
|
||||
"to_remove": len(result.to_remove),
|
||||
"planned": planned_data,
|
||||
"errors": result.errors,
|
||||
"warnings": result.warnings,
|
||||
"summary": result.summary,
|
||||
}
|
||||
|
||||
return Response(response_data)
|
||||
Reference in new issue
Block a user