Skip to content

Commit

Permalink
Issue netbox-community#14962 VM to merge directly related site context
Browse files Browse the repository at this point in the history
  • Loading branch information
Chris Carter committed Jan 29, 2024
1 parent 1b9e6be commit 2f19c79
Show file tree
Hide file tree
Showing 2 changed files with 111 additions and 9 deletions.
13 changes: 5 additions & 8 deletions netbox/extras/querysets.py
Original file line number Diff line number Diff line change
Expand Up @@ -120,17 +120,14 @@ def _get_config_context_filters(self):
if self.model._meta.model_name == 'device':
base_query.add((Q(locations=OuterRef('location')) | Q(locations=None)), Q.AND)
base_query.add((Q(device_types=OuterRef('device_type')) | Q(device_types=None)), Q.AND)
base_query.add((Q(roles=OuterRef('role')) | Q(roles=None)), Q.AND)
base_query.add((Q(sites=OuterRef('site')) | Q(sites=None)), Q.AND)
region_field = 'site__region'
sitegroup_field = 'site__group'

elif self.model._meta.model_name == 'virtualmachine':
base_query.add((Q(roles=OuterRef('role')) | Q(roles=None)), Q.AND)
base_query.add((Q(sites=OuterRef('cluster__site')) | Q(sites=None)), Q.AND)
base_query.add(Q(device_types=None), Q.AND)
region_field = 'cluster__site__region'
sitegroup_field = 'cluster__site__group'

base_query.add((Q(roles=OuterRef('role')) | Q(roles=None)), Q.AND)
base_query.add((Q(sites=OuterRef('site')) | Q(sites=None)), Q.AND)
region_field = 'site__region'
sitegroup_field = 'site__group'

base_query.add(
(Q(
Expand Down
107 changes: 106 additions & 1 deletion netbox/extras/tests/test_models.py
Original file line number Diff line number Diff line change
Expand Up @@ -270,7 +270,12 @@ def test_annotation_same_as_get_for_object_virtualmachine_relations(self):
tag = Tag.objects.first()
cluster_type = ClusterType.objects.create(name="Cluster Type")
cluster_group = ClusterGroup.objects.create(name="Cluster Group")
cluster = Cluster.objects.create(name="Cluster", group=cluster_group, type=cluster_type)
cluster = Cluster.objects.create(
name="Cluster",
group=cluster_group,
type=cluster_type,
site=site,
)

region_context = ConfigContext.objects.create(
name="region",
Expand Down Expand Up @@ -354,6 +359,106 @@ def test_annotation_same_as_get_for_object_virtualmachine_relations(self):
annotated_queryset = VirtualMachine.objects.filter(name=virtual_machine.name).annotate_config_context_data()
self.assertEqual(virtual_machine.get_config_context(), annotated_queryset[0].get_config_context())

def test_annotation_same_as_get_for_object_virtualmachine_relations_direct_site(self):
region = Region.objects.first()
sitegroup = SiteGroup.objects.first()
site = Site.objects.first()
platform = Platform.objects.first()
tenantgroup = TenantGroup.objects.first()
tenant = Tenant.objects.first()
tag = Tag.objects.first()
cluster_type = ClusterType.objects.create(name="Cluster Type")
cluster_group = ClusterGroup.objects.create(name="Cluster Group")
cluster = Cluster.objects.create(
name="Cluster",
group=cluster_group,
type=cluster_type,
site=site,
)

region_context = ConfigContext.objects.create(
name="region",
weight=100,
data={"region": 1}
)
region_context.regions.add(region)

sitegroup_context = ConfigContext.objects.create(
name="sitegroup",
weight=100,
data={"sitegroup": 1}
)
sitegroup_context.site_groups.add(sitegroup)

site_context = ConfigContext.objects.create(
name="site",
weight=100,
data={"site": 1}
)
site_context.sites.add(site)

platform_context = ConfigContext.objects.create(
name="platform",
weight=100,
data={"platform": 1}
)
platform_context.platforms.add(platform)

tenant_group_context = ConfigContext.objects.create(
name="tenant group",
weight=100,
data={"tenant_group": 1}
)
tenant_group_context.tenant_groups.add(tenantgroup)

tenant_context = ConfigContext.objects.create(
name="tenant",
weight=100,
data={"tenant": 1}
)
tenant_context.tenants.add(tenant)

tag_context = ConfigContext.objects.create(
name="tag",
weight=100,
data={"tag": 1}
)
tag_context.tags.add(tag)

cluster_type_context = ConfigContext.objects.create(
name="cluster type",
weight=100,
data={"cluster_type": 1}
)
cluster_type_context.cluster_types.add(cluster_type)

cluster_group_context = ConfigContext.objects.create(
name="cluster group",
weight=100,
data={"cluster_group": 1}
)
cluster_group_context.cluster_groups.add(cluster_group)

cluster_context = ConfigContext.objects.create(
name="cluster",
weight=100,
data={"cluster": 1}
)
cluster_context.clusters.add(cluster)

virtual_machine = VirtualMachine.objects.create(
name="VM 2",
site=site,
tenant=tenant,
platform=platform,
role=DeviceRole.objects.first()
)
virtual_machine.tags.add(tag)

annotated_queryset = VirtualMachine.objects.filter(name=virtual_machine.name).annotate_config_context_data()

self.assertEqual(virtual_machine.get_config_context(), annotated_queryset[0].get_config_context())

def test_multiple_tags_return_distinct_objects(self):
"""
Tagged items use a generic relationship, which results in duplicate rows being returned when queried.
Expand Down

0 comments on commit 2f19c79

Please sign in to comment.