Add ip_addresses relation on InterfaceType, VMInterfaceType

This commit is contained in:
jeremystretch 2021-08-03 09:54:06 -04:00
parent 8bdfa34c7d
commit 0df67dbc12
4 changed files with 22 additions and 4 deletions

View File

@ -1,4 +1,5 @@
from dcim import filtersets, models from dcim import filtersets, models
from ipam.graphql.mixins import IPAddressesMixin
from netbox.graphql.types import BaseObjectType, ObjectType, TaggedObjectType from netbox.graphql.types import BaseObjectType, ObjectType, TaggedObjectType
__all__ = ( __all__ = (
@ -158,7 +159,7 @@ class FrontPortTemplateType(BaseObjectType):
filterset_class = filtersets.FrontPortTemplateFilterSet filterset_class = filtersets.FrontPortTemplateFilterSet
class InterfaceType(TaggedObjectType): class InterfaceType(IPAddressesMixin, TaggedObjectType):
class Meta: class Meta:
model = models.Interface model = models.Interface

View File

@ -0,0 +1,12 @@
import graphene
__all__ = (
'IPAddressesMixin',
)
class IPAddressesMixin:
ip_addresses = graphene.List('ipam.graphql.types.IPAddressType')
def resolve_ip_addresses(self, info):
return self.ip_addresses.restrict(info.context.user, 'view')

View File

@ -5,7 +5,7 @@ from django.contrib.auth.models import User
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from django.urls import reverse from django.urls import reverse
from django.test import override_settings from django.test import override_settings
from graphene.types.dynamic import Dynamic from graphene.types import Dynamic as GQLDynamic, List as GQLList
from rest_framework import status from rest_framework import status
from rest_framework.test import APIClient from rest_framework.test import APIClient
@ -446,9 +446,13 @@ class APIViewTestCases:
# Compile list of fields to include # Compile list of fields to include
fields_string = '' fields_string = ''
for field_name, field in type_class._meta.fields.items(): for field_name, field in type_class._meta.fields.items():
if type(field) is Dynamic: if type(field) is GQLDynamic:
# Dynamic fields must specify a subselection # Dynamic fields must specify a subselection
fields_string += f'{field_name} {{ id }}\n' fields_string += f'{field_name} {{ id }}\n'
elif type(field.type) is GQLList and field_name not in ('tags', 'choices'):
# TODO: Come up with something more elegant
# Temporary hack to support automated testing of reverse generic relations
fields_string += f'{field_name} {{ id }}\n'
else: else:
fields_string += f'{field_name}\n' fields_string += f'{field_name}\n'

View File

@ -1,3 +1,4 @@
from ipam.graphql.mixins import IPAddressesMixin
from virtualization import filtersets, models from virtualization import filtersets, models
from netbox.graphql.types import ObjectType, TaggedObjectType from netbox.graphql.types import ObjectType, TaggedObjectType
@ -42,7 +43,7 @@ class VirtualMachineType(TaggedObjectType):
filterset_class = filtersets.VirtualMachineFilterSet filterset_class = filtersets.VirtualMachineFilterSet
class VMInterfaceType(TaggedObjectType): class VMInterfaceType(IPAddressesMixin, TaggedObjectType):
class Meta: class Meta:
model = models.VMInterface model = models.VMInterface