Closes #13808: render-config API endpoint for virtual machines

This commit is contained in:
Lukasz Polanski 2023-11-16 16:20:15 +02:00
parent d52a6d3b10
commit 2ea3a51ff4

View File

@ -1,8 +1,12 @@
from rest_framework.decorators import action
from rest_framework.renderers import JSONRenderer
from rest_framework.response import Response
from rest_framework.routers import APIRootView from rest_framework.routers import APIRootView
from dcim.models import Device from dcim.models import Device
from extras.api.mixins import ConfigContextQuerySetMixin from extras.api.mixins import ConfigContextQuerySetMixin, ConfigTemplateRenderMixin
from netbox.api.viewsets import NetBoxModelViewSet from netbox.api.viewsets import NetBoxModelViewSet
from netbox.api.renderers import TextRenderer
from utilities.utils import count_related from utilities.utils import count_related
from virtualization import filtersets from virtualization import filtersets
from virtualization.models import Cluster, ClusterGroup, ClusterType, VirtualMachine, VMInterface from virtualization.models import Cluster, ClusterGroup, ClusterType, VirtualMachine, VMInterface
@ -52,7 +56,7 @@ class ClusterViewSet(NetBoxModelViewSet):
# Virtual machines # Virtual machines
# #
class VirtualMachineViewSet(ConfigContextQuerySetMixin, NetBoxModelViewSet): class VirtualMachineViewSet(ConfigContextQuerySetMixin, NetBoxModelViewSet, ConfigTemplateRenderMixin):
queryset = VirtualMachine.objects.prefetch_related( queryset = VirtualMachine.objects.prefetch_related(
'site', 'cluster', 'device', 'role', 'tenant', 'platform', 'primary_ip4', 'primary_ip6', 'tags' 'site', 'cluster', 'device', 'role', 'tenant', 'platform', 'primary_ip4', 'primary_ip6', 'tags'
) )
@ -78,6 +82,23 @@ class VirtualMachineViewSet(ConfigContextQuerySetMixin, NetBoxModelViewSet):
return serializers.VirtualMachineWithConfigContextSerializer return serializers.VirtualMachineWithConfigContextSerializer
@action(detail=True, methods=['post'], url_path='render-config', renderer_classes=[JSONRenderer, TextRenderer])
def render_config(self, request, pk):
"""
Resolve and render the preferred ConfigTemplate for this virtual machine.
"""
vm = self.get_object()
configtemplate = vm.get_config_template()
if not configtemplate:
return Response({'error': 'No config template found for this virtualmachine.'}, status=HTTP_400_BAD_REQUEST)
# Compile context data
context_data = vm.get_config_context()
context_data.update(request.data)
context_data.update({'virtualmachine': vm})
return self.render_configtemplate(request, configtemplate, context_data)
class VMInterfaceViewSet(NetBoxModelViewSet): class VMInterfaceViewSet(NetBoxModelViewSet):
queryset = VMInterface.objects.prefetch_related( queryset = VMInterface.objects.prefetch_related(