diff --git a/netbox/dcim/graphql/schema.py b/netbox/dcim/graphql/schema.py index 1d5b6a580..eba311420 100644 --- a/netbox/dcim/graphql/schema.py +++ b/netbox/dcim/graphql/schema.py @@ -2,6 +2,7 @@ import graphene from netbox.graphql.fields import ObjectField, ObjectListField from .types import * +from .types import VirtualDeviceContextType class DCIMQuery(graphene.ObjectType): @@ -121,3 +122,6 @@ class DCIMQuery(graphene.ObjectType): virtual_chassis = ObjectField(VirtualChassisType) virtual_chassis_list = ObjectListField(VirtualChassisType) + + virtual_device_context = ObjectField(VirtualDeviceContextType) + virtual_device_context_list = ObjectListField(VirtualDeviceContextType) diff --git a/netbox/dcim/graphql/types.py b/netbox/dcim/graphql/types.py index bb414ed00..e737f4566 100644 --- a/netbox/dcim/graphql/types.py +++ b/netbox/dcim/graphql/types.py @@ -500,3 +500,12 @@ class VirtualChassisType(NetBoxObjectType): model = models.VirtualChassis fields = '__all__' filterset_class = filtersets.VirtualChassisFilterSet + + + +class VirtualDeviceContextType(NetBoxObjectType): + + class Meta: + model = models.VirtualDeviceContext + fields = '__all__' + filterset_class = filtersets.VirtualDeviceContextFilterSet diff --git a/netbox/dcim/models/devices.py b/netbox/dcim/models/devices.py index 6d2ea42cf..176b72273 100644 --- a/netbox/dcim/models/devices.py +++ b/netbox/dcim/models/devices.py @@ -1206,3 +1206,14 @@ class VirtualDeviceContext(NetBoxModel): def get_absolute_url(self): return reverse('dcim:virtualdevicecontext', kwargs={'pk': self.pk}) + + @property + def primary_ip(self): + if ConfigItem('PREFER_IPV4')() and self.primary_ip4: + return self.primary_ip4 + elif self.primary_ip6: + return self.primary_ip6 + elif self.primary_ip4: + return self.primary_ip4 + else: + return None diff --git a/netbox/templates/tenancy/tenant.html b/netbox/templates/tenancy/tenant.html index e8dc4b23a..6fb454391 100644 --- a/netbox/templates/tenancy/tenant.html +++ b/netbox/templates/tenancy/tenant.html @@ -61,6 +61,10 @@
Devices
+Virtual Device Contexts
+Cables
diff --git a/netbox/tenancy/views.py b/netbox/tenancy/views.py index d95568a22..228e8cd3f 100644 --- a/netbox/tenancy/views.py +++ b/netbox/tenancy/views.py @@ -2,7 +2,7 @@ from django.contrib.contenttypes.models import ContentType from django.shortcuts import get_object_or_404 from circuits.models import Circuit -from dcim.models import Cable, Device, Location, Rack, RackReservation, Site +from dcim.models import Cable, Device, Location, Rack, RackReservation, Site, VirtualDeviceContext from ipam.models import Aggregate, IPAddress, IPRange, Prefix, VLAN, VRF, ASN from netbox.views import generic from utilities.utils import count_related @@ -109,6 +109,7 @@ class TenantView(generic.ObjectView): 'rackreservation_count': RackReservation.objects.restrict(request.user, 'view').filter(tenant=instance).count(), 'location_count': Location.objects.restrict(request.user, 'view').filter(tenant=instance).count(), 'device_count': Device.objects.restrict(request.user, 'view').filter(tenant=instance).count(), + 'vdc_count': VirtualDeviceContext.objects.restrict(request.user, 'view').filter(tenant=instance).count(), 'vrf_count': VRF.objects.restrict(request.user, 'view').filter(tenant=instance).count(), 'aggregate_count': Aggregate.objects.restrict(request.user, 'view').filter(tenant=instance).count(), 'prefix_count': Prefix.objects.restrict(request.user, 'view').filter(tenant=instance).count(),