1from django.test import TestCase
2
3from dcim.models import Device, DeviceRole, DeviceType, Interface, Location, Manufacturer, Rack, Region, Site, SiteGroup
4from ipam.choices import *
5from ipam.filtersets import *
6from ipam.models import *
7from utilities.testing import ChangeLoggedFilterSetTests
8from virtualization.models import Cluster, ClusterGroup, ClusterType, VirtualMachine, VMInterface
9from tenancy.models import Tenant, TenantGroup
10
11
12class VRFTestCase(TestCase, ChangeLoggedFilterSetTests):
13    queryset = VRF.objects.all()
14    filterset = VRFFilterSet
15
16    @classmethod
17    def setUpTestData(cls):
18
19        route_targets = (
20            RouteTarget(name='65000:1001'),
21            RouteTarget(name='65000:1002'),
22            RouteTarget(name='65000:1003'),
23        )
24        RouteTarget.objects.bulk_create(route_targets)
25
26        tenant_groups = (
27            TenantGroup(name='Tenant group 1', slug='tenant-group-1'),
28            TenantGroup(name='Tenant group 2', slug='tenant-group-2'),
29            TenantGroup(name='Tenant group 3', slug='tenant-group-3'),
30        )
31        for tenantgroup in tenant_groups:
32            tenantgroup.save()
33
34        tenants = (
35            Tenant(name='Tenant 1', slug='tenant-1', group=tenant_groups[0]),
36            Tenant(name='Tenant 2', slug='tenant-2', group=tenant_groups[1]),
37            Tenant(name='Tenant 3', slug='tenant-3', group=tenant_groups[2]),
38        )
39        Tenant.objects.bulk_create(tenants)
40
41        vrfs = (
42            VRF(name='VRF 1', rd='65000:100', tenant=tenants[0], enforce_unique=False),
43            VRF(name='VRF 2', rd='65000:200', tenant=tenants[0], enforce_unique=False),
44            VRF(name='VRF 3', rd='65000:300', tenant=tenants[1], enforce_unique=False),
45            VRF(name='VRF 4', rd='65000:400', tenant=tenants[1], enforce_unique=True),
46            VRF(name='VRF 5', rd='65000:500', tenant=tenants[2], enforce_unique=True),
47            VRF(name='VRF 6', rd='65000:600', tenant=tenants[2], enforce_unique=True),
48        )
49        VRF.objects.bulk_create(vrfs)
50        vrfs[0].import_targets.add(route_targets[0])
51        vrfs[0].export_targets.add(route_targets[0])
52        vrfs[1].import_targets.add(route_targets[1])
53        vrfs[1].export_targets.add(route_targets[1])
54        vrfs[2].import_targets.add(route_targets[2])
55        vrfs[2].export_targets.add(route_targets[2])
56
57    def test_name(self):
58        params = {'name': ['VRF 1', 'VRF 2']}
59        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
60
61    def test_rd(self):
62        params = {'rd': ['65000:100', '65000:200']}
63        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
64
65    def test_enforce_unique(self):
66        params = {'enforce_unique': 'true'}
67        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 3)
68        params = {'enforce_unique': 'false'}
69        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 3)
70
71    def test_import_target(self):
72        route_targets = RouteTarget.objects.all()[:2]
73        params = {'import_target_id': [route_targets[0].pk, route_targets[1].pk]}
74        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
75        params = {'import_target': [route_targets[0].name, route_targets[1].name]}
76        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
77
78    def test_export_target(self):
79        route_targets = RouteTarget.objects.all()[:2]
80        params = {'export_target_id': [route_targets[0].pk, route_targets[1].pk]}
81        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
82        params = {'export_target': [route_targets[0].name, route_targets[1].name]}
83        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
84
85    def test_tenant(self):
86        tenants = Tenant.objects.all()[:2]
87        params = {'tenant_id': [tenants[0].pk, tenants[1].pk]}
88        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
89        params = {'tenant': [tenants[0].slug, tenants[1].slug]}
90        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
91
92    def test_tenant_group(self):
93        tenant_groups = TenantGroup.objects.all()[:2]
94        params = {'tenant_group_id': [tenant_groups[0].pk, tenant_groups[1].pk]}
95        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
96        params = {'tenant_group': [tenant_groups[0].slug, tenant_groups[1].slug]}
97        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
98
99
100class RouteTargetTestCase(TestCase, ChangeLoggedFilterSetTests):
101    queryset = RouteTarget.objects.all()
102    filterset = RouteTargetFilterSet
103
104    @classmethod
105    def setUpTestData(cls):
106
107        tenant_groups = (
108            TenantGroup(name='Tenant group 1', slug='tenant-group-1'),
109            TenantGroup(name='Tenant group 2', slug='tenant-group-2'),
110            TenantGroup(name='Tenant group 3', slug='tenant-group-3'),
111        )
112        for tenantgroup in tenant_groups:
113            tenantgroup.save()
114
115        tenants = (
116            Tenant(name='Tenant 1', slug='tenant-1', group=tenant_groups[0]),
117            Tenant(name='Tenant 2', slug='tenant-2', group=tenant_groups[1]),
118            Tenant(name='Tenant 3', slug='tenant-3', group=tenant_groups[2]),
119        )
120        Tenant.objects.bulk_create(tenants)
121
122        route_targets = (
123            RouteTarget(name='65000:1001', tenant=tenants[0]),
124            RouteTarget(name='65000:1002', tenant=tenants[0]),
125            RouteTarget(name='65000:1003', tenant=tenants[0]),
126            RouteTarget(name='65000:1004', tenant=tenants[0]),
127            RouteTarget(name='65000:2001', tenant=tenants[1]),
128            RouteTarget(name='65000:2002', tenant=tenants[1]),
129            RouteTarget(name='65000:2003', tenant=tenants[1]),
130            RouteTarget(name='65000:2004', tenant=tenants[1]),
131            RouteTarget(name='65000:3001', tenant=tenants[2]),
132            RouteTarget(name='65000:3002', tenant=tenants[2]),
133            RouteTarget(name='65000:3003', tenant=tenants[2]),
134            RouteTarget(name='65000:3004', tenant=tenants[2]),
135        )
136        RouteTarget.objects.bulk_create(route_targets)
137
138        vrfs = (
139            VRF(name='VRF 1', rd='65000:100'),
140            VRF(name='VRF 2', rd='65000:200'),
141            VRF(name='VRF 3', rd='65000:300'),
142        )
143        VRF.objects.bulk_create(vrfs)
144        vrfs[0].import_targets.add(route_targets[0], route_targets[1])
145        vrfs[0].export_targets.add(route_targets[2], route_targets[3])
146        vrfs[1].import_targets.add(route_targets[4], route_targets[5])
147        vrfs[1].export_targets.add(route_targets[6], route_targets[7])
148
149    def test_name(self):
150        params = {'name': ['65000:1001', '65000:1002', '65000:1003']}
151        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 3)
152
153    def test_importing_vrf(self):
154        vrfs = VRF.objects.all()[:2]
155        params = {'importing_vrf_id': [vrfs[0].pk, vrfs[1].pk]}
156        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
157        params = {'importing_vrf': [vrfs[0].rd, vrfs[1].rd]}
158        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
159
160    def test_exporting_vrf(self):
161        vrfs = VRF.objects.all()[:2]
162        params = {'exporting_vrf_id': [vrfs[0].pk, vrfs[1].pk]}
163        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
164        params = {'exporting_vrf': [vrfs[0].rd, vrfs[1].rd]}
165        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
166
167    def test_tenant(self):
168        tenants = Tenant.objects.all()[:2]
169        params = {'tenant_id': [tenants[0].pk, tenants[1].pk]}
170        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 8)
171        params = {'tenant': [tenants[0].slug, tenants[1].slug]}
172        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 8)
173
174    def test_tenant_group(self):
175        tenant_groups = TenantGroup.objects.all()[:2]
176        params = {'tenant_group_id': [tenant_groups[0].pk, tenant_groups[1].pk]}
177        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 8)
178        params = {'tenant_group': [tenant_groups[0].slug, tenant_groups[1].slug]}
179        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 8)
180
181
182class RIRTestCase(TestCase, ChangeLoggedFilterSetTests):
183    queryset = RIR.objects.all()
184    filterset = RIRFilterSet
185
186    @classmethod
187    def setUpTestData(cls):
188
189        rirs = (
190            RIR(name='RIR 1', slug='rir-1', is_private=False, description='A'),
191            RIR(name='RIR 2', slug='rir-2', is_private=False, description='B'),
192            RIR(name='RIR 3', slug='rir-3', is_private=False, description='C'),
193            RIR(name='RIR 4', slug='rir-4', is_private=True, description='D'),
194            RIR(name='RIR 5', slug='rir-5', is_private=True, description='E'),
195            RIR(name='RIR 6', slug='rir-6', is_private=True, description='F'),
196        )
197        RIR.objects.bulk_create(rirs)
198
199    def test_name(self):
200        params = {'name': ['RIR 1', 'RIR 2']}
201        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
202
203    def test_slug(self):
204        params = {'slug': ['rir-1', 'rir-2']}
205        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
206
207    def test_description(self):
208        params = {'description': ['A', 'B']}
209        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
210
211    def test_is_private(self):
212        params = {'is_private': 'true'}
213        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 3)
214        params = {'is_private': 'false'}
215        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 3)
216
217
218class AggregateTestCase(TestCase, ChangeLoggedFilterSetTests):
219    queryset = Aggregate.objects.all()
220    filterset = AggregateFilterSet
221
222    @classmethod
223    def setUpTestData(cls):
224
225        rirs = (
226            RIR(name='RIR 1', slug='rir-1'),
227            RIR(name='RIR 2', slug='rir-2'),
228            RIR(name='RIR 3', slug='rir-3'),
229        )
230        RIR.objects.bulk_create(rirs)
231
232        tenant_groups = (
233            TenantGroup(name='Tenant group 1', slug='tenant-group-1'),
234            TenantGroup(name='Tenant group 2', slug='tenant-group-2'),
235            TenantGroup(name='Tenant group 3', slug='tenant-group-3'),
236        )
237        for tenantgroup in tenant_groups:
238            tenantgroup.save()
239
240        tenants = (
241            Tenant(name='Tenant 1', slug='tenant-1', group=tenant_groups[0]),
242            Tenant(name='Tenant 2', slug='tenant-2', group=tenant_groups[1]),
243            Tenant(name='Tenant 3', slug='tenant-3', group=tenant_groups[2]),
244        )
245        Tenant.objects.bulk_create(tenants)
246
247        aggregates = (
248            Aggregate(prefix='10.1.0.0/16', rir=rirs[0], tenant=tenants[0], date_added='2020-01-01'),
249            Aggregate(prefix='10.2.0.0/16', rir=rirs[0], tenant=tenants[1], date_added='2020-01-02'),
250            Aggregate(prefix='10.3.0.0/16', rir=rirs[1], tenant=tenants[2], date_added='2020-01-03'),
251            Aggregate(prefix='2001:db8:1::/48', rir=rirs[1], tenant=tenants[0], date_added='2020-01-04'),
252            Aggregate(prefix='2001:db8:2::/48', rir=rirs[2], tenant=tenants[1], date_added='2020-01-05'),
253            Aggregate(prefix='2001:db8:3::/48', rir=rirs[2], tenant=tenants[2], date_added='2020-01-06'),
254        )
255        Aggregate.objects.bulk_create(aggregates)
256
257    def test_family(self):
258        params = {'family': '4'}
259        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 3)
260
261    def test_date_added(self):
262        params = {'date_added': ['2020-01-01', '2020-01-02']}
263        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
264
265    # TODO: Test for multiple values
266    def test_prefix(self):
267        params = {'prefix': '10.1.0.0/16'}
268        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
269
270    def test_rir(self):
271        rirs = RIR.objects.all()[:2]
272        params = {'rir_id': [rirs[0].pk, rirs[1].pk]}
273        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
274        params = {'rir': [rirs[0].slug, rirs[1].slug]}
275        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
276
277    def test_tenant(self):
278        tenants = Tenant.objects.all()[:2]
279        params = {'tenant_id': [tenants[0].pk, tenants[1].pk]}
280        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
281        params = {'tenant': [tenants[0].slug, tenants[1].slug]}
282        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
283
284    def test_tenant_group(self):
285        tenant_groups = TenantGroup.objects.all()[:2]
286        params = {'tenant_group_id': [tenant_groups[0].pk, tenant_groups[1].pk]}
287        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
288        params = {'tenant_group': [tenant_groups[0].slug, tenant_groups[1].slug]}
289        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
290
291
292class RoleTestCase(TestCase, ChangeLoggedFilterSetTests):
293    queryset = Role.objects.all()
294    filterset = RoleFilterSet
295
296    @classmethod
297    def setUpTestData(cls):
298
299        roles = (
300            Role(name='Role 1', slug='role-1'),
301            Role(name='Role 2', slug='role-2'),
302            Role(name='Role 3', slug='role-3'),
303        )
304        Role.objects.bulk_create(roles)
305
306    def test_name(self):
307        params = {'name': ['Role 1', 'Role 2']}
308        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
309
310    def test_slug(self):
311        params = {'slug': ['role-1', 'role-2']}
312        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
313
314
315class PrefixTestCase(TestCase, ChangeLoggedFilterSetTests):
316    queryset = Prefix.objects.all()
317    filterset = PrefixFilterSet
318
319    @classmethod
320    def setUpTestData(cls):
321
322        regions = (
323            Region(name='Test Region 1', slug='test-region-1'),
324            Region(name='Test Region 2', slug='test-region-2'),
325            Region(name='Test Region 3', slug='test-region-3'),
326        )
327        for r in regions:
328            r.save()
329
330        site_groups = (
331            SiteGroup(name='Site Group 1', slug='site-group-1'),
332            SiteGroup(name='Site Group 2', slug='site-group-2'),
333            SiteGroup(name='Site Group 3', slug='site-group-3'),
334        )
335        for site_group in site_groups:
336            site_group.save()
337
338        sites = (
339            Site(name='Test Site 1', slug='test-site-1', region=regions[0], group=site_groups[0]),
340            Site(name='Test Site 2', slug='test-site-2', region=regions[1], group=site_groups[1]),
341            Site(name='Test Site 3', slug='test-site-3', region=regions[2], group=site_groups[2]),
342        )
343        Site.objects.bulk_create(sites)
344
345        route_targets = (
346            RouteTarget(name='65000:100'),
347            RouteTarget(name='65000:200'),
348            RouteTarget(name='65000:300'),
349        )
350        RouteTarget.objects.bulk_create(route_targets)
351
352        vrfs = (
353            VRF(name='VRF 1', rd='65000:100'),
354            VRF(name='VRF 2', rd='65000:200'),
355            VRF(name='VRF 3', rd='65000:300'),
356        )
357        VRF.objects.bulk_create(vrfs)
358        vrfs[0].import_targets.add(route_targets[0], route_targets[1], route_targets[2])
359        vrfs[1].export_targets.add(route_targets[1])
360        vrfs[2].export_targets.add(route_targets[2])
361
362        vlans = (
363            VLAN(vid=1, name='VLAN 1'),
364            VLAN(vid=2, name='VLAN 2'),
365            VLAN(vid=3, name='VLAN 3'),
366        )
367        VLAN.objects.bulk_create(vlans)
368
369        roles = (
370            Role(name='Role 1', slug='role-1'),
371            Role(name='Role 2', slug='role-2'),
372            Role(name='Role 3', slug='role-3'),
373        )
374        Role.objects.bulk_create(roles)
375
376        tenant_groups = (
377            TenantGroup(name='Tenant group 1', slug='tenant-group-1'),
378            TenantGroup(name='Tenant group 2', slug='tenant-group-2'),
379            TenantGroup(name='Tenant group 3', slug='tenant-group-3'),
380        )
381        for tenantgroup in tenant_groups:
382            tenantgroup.save()
383
384        tenants = (
385            Tenant(name='Tenant 1', slug='tenant-1', group=tenant_groups[0]),
386            Tenant(name='Tenant 2', slug='tenant-2', group=tenant_groups[1]),
387            Tenant(name='Tenant 3', slug='tenant-3', group=tenant_groups[2]),
388        )
389        Tenant.objects.bulk_create(tenants)
390
391        prefixes = (
392            Prefix(prefix='10.0.0.0/24', tenant=None, site=None, vrf=None, vlan=None, role=None, is_pool=True, mark_utilized=True),
393            Prefix(prefix='10.0.1.0/24', tenant=tenants[0], site=sites[0], vrf=vrfs[0], vlan=vlans[0], role=roles[0]),
394            Prefix(prefix='10.0.2.0/24', tenant=tenants[1], site=sites[1], vrf=vrfs[1], vlan=vlans[1], role=roles[1], status=PrefixStatusChoices.STATUS_DEPRECATED),
395            Prefix(prefix='10.0.3.0/24', tenant=tenants[2], site=sites[2], vrf=vrfs[2], vlan=vlans[2], role=roles[2], status=PrefixStatusChoices.STATUS_RESERVED),
396            Prefix(prefix='2001:db8::/64', tenant=None, site=None, vrf=None, vlan=None, role=None, is_pool=True, mark_utilized=True),
397            Prefix(prefix='2001:db8:0:1::/64', tenant=tenants[0], site=sites[0], vrf=vrfs[0], vlan=vlans[0], role=roles[0]),
398            Prefix(prefix='2001:db8:0:2::/64', tenant=tenants[1], site=sites[1], vrf=vrfs[1], vlan=vlans[1], role=roles[1], status=PrefixStatusChoices.STATUS_DEPRECATED),
399            Prefix(prefix='2001:db8:0:3::/64', tenant=tenants[2], site=sites[2], vrf=vrfs[2], vlan=vlans[2], role=roles[2], status=PrefixStatusChoices.STATUS_RESERVED),
400            Prefix(prefix='10.0.0.0/16'),
401            Prefix(prefix='2001:db8::/32'),
402        )
403        for prefix in prefixes:
404            prefix.save()
405
406    def test_family(self):
407        params = {'family': '6'}
408        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 5)
409
410    def test_prefix(self):
411        prefixes = Prefix.objects.all()[:2]
412        params = {'prefix': [prefixes[0].prefix, prefixes[1].prefix]}
413        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
414
415    def test_is_pool(self):
416        params = {'is_pool': 'true'}
417        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
418        params = {'is_pool': 'false'}
419        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 8)
420
421    def test_mark_utilized(self):
422        params = {'mark_utilized': 'true'}
423        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
424        params = {'mark_utilized': 'false'}
425        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 8)
426
427    def test_within(self):
428        params = {'within': '10.0.0.0/16'}
429        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
430
431    def test_within_include(self):
432        params = {'within_include': '10.0.0.0/16'}
433        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 5)
434
435    def test_contains(self):
436        params = {'contains': '10.0.1.0/24'}
437        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
438        params = {'contains': '2001:db8:0:1::/64'}
439        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
440
441    def test_depth(self):
442        params = {'depth': '0'}
443        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 8)
444        params = {'depth__gt': '0'}
445        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
446
447    def test_children(self):
448        params = {'children': '0'}
449        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 8)
450        params = {'children__gt': '0'}
451        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
452
453    def test_mask_length(self):
454        params = {'mask_length': ['24']}
455        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
456
457    def test_vrf(self):
458        vrfs = VRF.objects.all()[:2]
459        params = {'vrf_id': [vrfs[0].pk, vrfs[1].pk]}
460        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
461        params = {'vrf': [vrfs[0].rd, vrfs[1].rd]}
462        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
463
464    def test_present_in_vrf(self):
465        vrf1 = VRF.objects.get(name='VRF 1')
466        vrf2 = VRF.objects.get(name='VRF 2')
467        self.assertEqual(self.filterset({'present_in_vrf_id': vrf1.pk}, self.queryset).qs.count(), 6)
468        self.assertEqual(self.filterset({'present_in_vrf_id': vrf2.pk}, self.queryset).qs.count(), 2)
469        self.assertEqual(self.filterset({'present_in_vrf': vrf1.rd}, self.queryset).qs.count(), 6)
470        self.assertEqual(self.filterset({'present_in_vrf': vrf2.rd}, self.queryset).qs.count(), 2)
471
472    def test_region(self):
473        regions = Region.objects.all()[:2]
474        params = {'region_id': [regions[0].pk, regions[1].pk]}
475        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
476        params = {'region': [regions[0].slug, regions[1].slug]}
477        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
478
479    def test_site_group(self):
480        site_groups = SiteGroup.objects.all()[:2]
481        params = {'site_group_id': [site_groups[0].pk, site_groups[1].pk]}
482        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
483        params = {'site_group': [site_groups[0].slug, site_groups[1].slug]}
484        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
485
486    def test_site(self):
487        sites = Site.objects.all()[:2]
488        params = {'site_id': [sites[0].pk, sites[1].pk]}
489        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
490        params = {'site': [sites[0].slug, sites[1].slug]}
491        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
492
493    def test_vlan(self):
494        vlans = VLAN.objects.all()[:2]
495        params = {'vlan_id': [vlans[0].pk, vlans[1].pk]}
496        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
497        # TODO: Test for multiple values
498        params = {'vlan_vid': vlans[0].vid}
499        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
500
501    def test_role(self):
502        roles = Role.objects.all()[:2]
503        params = {'role_id': [roles[0].pk, roles[1].pk]}
504        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
505        params = {'role': [roles[0].slug, roles[1].slug]}
506        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
507
508    def test_status(self):
509        params = {'status': [PrefixStatusChoices.STATUS_DEPRECATED, PrefixStatusChoices.STATUS_RESERVED]}
510        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
511
512    def test_tenant(self):
513        tenants = Tenant.objects.all()[:2]
514        params = {'tenant_id': [tenants[0].pk, tenants[1].pk]}
515        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
516        params = {'tenant': [tenants[0].slug, tenants[1].slug]}
517        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
518
519    def test_tenant_group(self):
520        tenant_groups = TenantGroup.objects.all()[:2]
521        params = {'tenant_group_id': [tenant_groups[0].pk, tenant_groups[1].pk]}
522        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
523        params = {'tenant_group': [tenant_groups[0].slug, tenant_groups[1].slug]}
524        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
525
526
527class IPRangeTestCase(TestCase, ChangeLoggedFilterSetTests):
528    queryset = IPRange.objects.all()
529    filterset = IPRangeFilterSet
530
531    @classmethod
532    def setUpTestData(cls):
533
534        vrfs = (
535            VRF(name='VRF 1', rd='65000:100'),
536            VRF(name='VRF 2', rd='65000:200'),
537            VRF(name='VRF 3', rd='65000:300'),
538        )
539        VRF.objects.bulk_create(vrfs)
540
541        roles = (
542            Role(name='Role 1', slug='role-1'),
543            Role(name='Role 2', slug='role-2'),
544            Role(name='Role 3', slug='role-3'),
545        )
546        Role.objects.bulk_create(roles)
547
548        tenant_groups = (
549            TenantGroup(name='Tenant group 1', slug='tenant-group-1'),
550            TenantGroup(name='Tenant group 2', slug='tenant-group-2'),
551            TenantGroup(name='Tenant group 3', slug='tenant-group-3'),
552        )
553        for tenantgroup in tenant_groups:
554            tenantgroup.save()
555
556        tenants = (
557            Tenant(name='Tenant 1', slug='tenant-1', group=tenant_groups[0]),
558            Tenant(name='Tenant 2', slug='tenant-2', group=tenant_groups[1]),
559            Tenant(name='Tenant 3', slug='tenant-3', group=tenant_groups[2]),
560        )
561        Tenant.objects.bulk_create(tenants)
562
563        ip_ranges = (
564            IPRange(start_address='10.0.1.100/24', end_address='10.0.1.199/24', size=100, vrf=None, tenant=None, role=None, status=IPRangeStatusChoices.STATUS_ACTIVE),
565            IPRange(start_address='10.0.2.100/24', end_address='10.0.2.199/24', size=100, vrf=vrfs[0], tenant=tenants[0], role=roles[0], status=IPRangeStatusChoices.STATUS_ACTIVE),
566            IPRange(start_address='10.0.3.100/24', end_address='10.0.3.199/24', size=100, vrf=vrfs[1], tenant=tenants[1], role=roles[1], status=IPRangeStatusChoices.STATUS_DEPRECATED),
567            IPRange(start_address='10.0.4.100/24', end_address='10.0.4.199/24', size=100, vrf=vrfs[2], tenant=tenants[2], role=roles[2], status=IPRangeStatusChoices.STATUS_RESERVED),
568            IPRange(start_address='2001:db8:0:1::1/64', end_address='2001:db8:0:1::100/64', size=100, vrf=None, tenant=None, role=None, status=IPRangeStatusChoices.STATUS_ACTIVE),
569            IPRange(start_address='2001:db8:0:2::1/64', end_address='2001:db8:0:2::100/64', size=100, vrf=vrfs[0], tenant=tenants[0], role=roles[0], status=IPRangeStatusChoices.STATUS_ACTIVE),
570            IPRange(start_address='2001:db8:0:3::1/64', end_address='2001:db8:0:3::100/64', size=100, vrf=vrfs[1], tenant=tenants[1], role=roles[1], status=IPRangeStatusChoices.STATUS_DEPRECATED),
571            IPRange(start_address='2001:db8:0:4::1/64', end_address='2001:db8:0:4::100/64', size=100, vrf=vrfs[2], tenant=tenants[2], role=roles[2], status=IPRangeStatusChoices.STATUS_RESERVED),
572        )
573        IPRange.objects.bulk_create(ip_ranges)
574
575    def test_family(self):
576        params = {'family': '6'}
577        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
578
579    def test_contains(self):
580        params = {'contains': '10.0.1.150/24'}
581        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
582        params = {'contains': '2001:db8:0:1::50/64'}
583        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
584
585    def test_vrf(self):
586        vrfs = VRF.objects.all()[:2]
587        params = {'vrf_id': [vrfs[0].pk, vrfs[1].pk]}
588        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
589        params = {'vrf': [vrfs[0].rd, vrfs[1].rd]}
590        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
591
592    def test_role(self):
593        roles = Role.objects.all()[:2]
594        params = {'role_id': [roles[0].pk, roles[1].pk]}
595        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
596        params = {'role': [roles[0].slug, roles[1].slug]}
597        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
598
599    def test_status(self):
600        params = {'status': [PrefixStatusChoices.STATUS_DEPRECATED, PrefixStatusChoices.STATUS_RESERVED]}
601        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
602
603    def test_tenant(self):
604        tenants = Tenant.objects.all()[:2]
605        params = {'tenant_id': [tenants[0].pk, tenants[1].pk]}
606        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
607        params = {'tenant': [tenants[0].slug, tenants[1].slug]}
608        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
609
610    def test_tenant_group(self):
611        tenant_groups = TenantGroup.objects.all()[:2]
612        params = {'tenant_group_id': [tenant_groups[0].pk, tenant_groups[1].pk]}
613        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
614        params = {'tenant_group': [tenant_groups[0].slug, tenant_groups[1].slug]}
615        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
616
617
618class IPAddressTestCase(TestCase, ChangeLoggedFilterSetTests):
619    queryset = IPAddress.objects.all()
620    filterset = IPAddressFilterSet
621
622    @classmethod
623    def setUpTestData(cls):
624
625        vrfs = (
626            VRF(name='VRF 1', rd='65000:100'),
627            VRF(name='VRF 2', rd='65000:200'),
628            VRF(name='VRF 3', rd='65000:300'),
629        )
630        VRF.objects.bulk_create(vrfs)
631
632        site = Site.objects.create(name='Site 1', slug='site-1')
633        manufacturer = Manufacturer.objects.create(name='Manufacturer 1', slug='manufacturer-1')
634        device_type = DeviceType.objects.create(manufacturer=manufacturer, model='Device Type 1')
635        device_role = DeviceRole.objects.create(name='Device Role 1', slug='device-role-1')
636
637        devices = (
638            Device(device_type=device_type, name='Device 1', site=site, device_role=device_role),
639            Device(device_type=device_type, name='Device 2', site=site, device_role=device_role),
640            Device(device_type=device_type, name='Device 3', site=site, device_role=device_role),
641        )
642        Device.objects.bulk_create(devices)
643
644        interfaces = (
645            Interface(device=devices[0], name='Interface 1'),
646            Interface(device=devices[1], name='Interface 2'),
647            Interface(device=devices[2], name='Interface 3'),
648        )
649        Interface.objects.bulk_create(interfaces)
650
651        clustertype = ClusterType.objects.create(name='Cluster Type 1', slug='cluster-type-1')
652        cluster = Cluster.objects.create(type=clustertype, name='Cluster 1')
653
654        virtual_machines = (
655            VirtualMachine(name='Virtual Machine 1', cluster=cluster),
656            VirtualMachine(name='Virtual Machine 2', cluster=cluster),
657            VirtualMachine(name='Virtual Machine 3', cluster=cluster),
658        )
659        VirtualMachine.objects.bulk_create(virtual_machines)
660
661        vminterfaces = (
662            VMInterface(virtual_machine=virtual_machines[0], name='Interface 1'),
663            VMInterface(virtual_machine=virtual_machines[1], name='Interface 2'),
664            VMInterface(virtual_machine=virtual_machines[2], name='Interface 3'),
665        )
666        VMInterface.objects.bulk_create(vminterfaces)
667
668        tenant_groups = (
669            TenantGroup(name='Tenant group 1', slug='tenant-group-1'),
670            TenantGroup(name='Tenant group 2', slug='tenant-group-2'),
671            TenantGroup(name='Tenant group 3', slug='tenant-group-3'),
672        )
673        for tenantgroup in tenant_groups:
674            tenantgroup.save()
675
676        tenants = (
677            Tenant(name='Tenant 1', slug='tenant-1', group=tenant_groups[0]),
678            Tenant(name='Tenant 2', slug='tenant-2', group=tenant_groups[1]),
679            Tenant(name='Tenant 3', slug='tenant-3', group=tenant_groups[2]),
680        )
681        Tenant.objects.bulk_create(tenants)
682
683        ipaddresses = (
684            IPAddress(address='10.0.0.1/24', tenant=None, vrf=None, assigned_object=None, status=IPAddressStatusChoices.STATUS_ACTIVE, dns_name='ipaddress-a', description='foobar1'),
685            IPAddress(address='10.0.0.2/24', tenant=tenants[0], vrf=vrfs[0], assigned_object=interfaces[0], status=IPAddressStatusChoices.STATUS_ACTIVE, dns_name='ipaddress-b'),
686            IPAddress(address='10.0.0.3/24', tenant=tenants[1], vrf=vrfs[1], assigned_object=interfaces[1], status=IPAddressStatusChoices.STATUS_RESERVED, role=IPAddressRoleChoices.ROLE_VIP, dns_name='ipaddress-c'),
687            IPAddress(address='10.0.0.4/24', tenant=tenants[2], vrf=vrfs[2], assigned_object=interfaces[2], status=IPAddressStatusChoices.STATUS_DEPRECATED, role=IPAddressRoleChoices.ROLE_SECONDARY, dns_name='ipaddress-d'),
688            IPAddress(address='10.0.0.1/25', tenant=None, vrf=None, assigned_object=None, status=IPAddressStatusChoices.STATUS_ACTIVE),
689            IPAddress(address='2001:db8::1/64', tenant=None, vrf=None, assigned_object=None, status=IPAddressStatusChoices.STATUS_ACTIVE, dns_name='ipaddress-a', description='foobar2'),
690            IPAddress(address='2001:db8::2/64', tenant=tenants[0], vrf=vrfs[0], assigned_object=vminterfaces[0], status=IPAddressStatusChoices.STATUS_ACTIVE, dns_name='ipaddress-b'),
691            IPAddress(address='2001:db8::3/64', tenant=tenants[1], vrf=vrfs[1], assigned_object=vminterfaces[1], status=IPAddressStatusChoices.STATUS_RESERVED, role=IPAddressRoleChoices.ROLE_VIP, dns_name='ipaddress-c'),
692            IPAddress(address='2001:db8::4/64', tenant=tenants[2], vrf=vrfs[2], assigned_object=vminterfaces[2], status=IPAddressStatusChoices.STATUS_DEPRECATED, role=IPAddressRoleChoices.ROLE_SECONDARY, dns_name='ipaddress-d'),
693            IPAddress(address='2001:db8::1/65', tenant=None, vrf=None, assigned_object=None, status=IPAddressStatusChoices.STATUS_ACTIVE),
694        )
695        IPAddress.objects.bulk_create(ipaddresses)
696
697    def test_family(self):
698        params = {'family': '6'}
699        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 5)
700
701    def test_dns_name(self):
702        params = {'dns_name': ['ipaddress-a', 'ipaddress-b']}
703        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
704
705    def test_description(self):
706        params = {'description': ['foobar1', 'foobar2']}
707        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
708
709    def test_parent(self):
710        params = {'parent': '10.0.0.0/24'}
711        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 5)
712        params = {'parent': '2001:db8::/64'}
713        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 5)
714
715    def test_filter_address(self):
716        # Check IPv4 and IPv6, with and without a mask
717        params = {'address': ['10.0.0.1/24']}
718        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
719        params = {'address': ['10.0.0.1']}
720        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
721        params = {'address': ['10.0.0.1/24', '10.0.0.1/25']}
722        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
723        params = {'address': ['2001:db8::1/64']}
724        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
725        params = {'address': ['2001:db8::1']}
726        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
727        params = {'address': ['2001:db8::1/64', '2001:db8::1/65']}
728        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
729
730    def test_mask_length(self):
731        params = {'mask_length': '24'}
732        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
733
734    def test_vrf(self):
735        vrfs = VRF.objects.all()[:2]
736        params = {'vrf_id': [vrfs[0].pk, vrfs[1].pk]}
737        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
738        params = {'vrf': [vrfs[0].rd, vrfs[1].rd]}
739        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
740
741    def test_device(self):
742        devices = Device.objects.all()[:2]
743        params = {'device_id': [devices[0].pk, devices[1].pk]}
744        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
745        params = {'device': [devices[0].name, devices[1].name]}
746        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
747
748    def test_virtual_machine(self):
749        vms = VirtualMachine.objects.all()[:2]
750        params = {'virtual_machine_id': [vms[0].pk, vms[1].pk]}
751        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
752        params = {'virtual_machine': [vms[0].name, vms[1].name]}
753        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
754
755    def test_interface(self):
756        interfaces = Interface.objects.all()[:2]
757        params = {'interface_id': [interfaces[0].pk, interfaces[1].pk]}
758        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
759        params = {'interface': ['Interface 1', 'Interface 2']}
760        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
761
762    def test_vminterface(self):
763        vminterfaces = VMInterface.objects.all()[:2]
764        params = {'vminterface_id': [vminterfaces[0].pk, vminterfaces[1].pk]}
765        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
766        params = {'vminterface': ['Interface 1', 'Interface 2']}
767        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
768
769    def test_assigned_to_interface(self):
770        params = {'assigned_to_interface': 'true'}
771        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 6)
772        params = {'assigned_to_interface': 'false'}
773        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
774
775    def test_status(self):
776        params = {'status': [PrefixStatusChoices.STATUS_DEPRECATED, PrefixStatusChoices.STATUS_RESERVED]}
777        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
778
779    def test_role(self):
780        params = {'role': [IPAddressRoleChoices.ROLE_SECONDARY, IPAddressRoleChoices.ROLE_VIP]}
781        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
782
783    def test_tenant(self):
784        tenants = Tenant.objects.all()[:2]
785        params = {'tenant_id': [tenants[0].pk, tenants[1].pk]}
786        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
787        params = {'tenant': [tenants[0].slug, tenants[1].slug]}
788        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
789
790    def test_tenant_group(self):
791        tenant_groups = TenantGroup.objects.all()[:2]
792        params = {'tenant_group_id': [tenant_groups[0].pk, tenant_groups[1].pk]}
793        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
794        params = {'tenant_group': [tenant_groups[0].slug, tenant_groups[1].slug]}
795        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
796
797
798class VLANGroupTestCase(TestCase, ChangeLoggedFilterSetTests):
799    queryset = VLANGroup.objects.all()
800    filterset = VLANGroupFilterSet
801
802    @classmethod
803    def setUpTestData(cls):
804
805        region = Region(name='Region 1', slug='region-1')
806        region.save()
807
808        sitegroup = SiteGroup(name='Site Group 1', slug='site-group-1')
809        sitegroup.save()
810
811        site = Site(name='Site 1', slug='site-1')
812        site.save()
813
814        location = Location(name='Location 1', slug='location-1', site=site)
815        location.save()
816
817        rack = Rack(name='Rack 1', site=site)
818        rack.save()
819
820        clustertype = ClusterType(name='Cluster Type 1', slug='cluster-type-1')
821        clustertype.save()
822
823        clustergroup = ClusterGroup(name='Cluster Group 1', slug='cluster-group-1')
824        clustergroup.save()
825
826        cluster = Cluster(name='Cluster 1', type=clustertype)
827        cluster.save()
828
829        vlan_groups = (
830            VLANGroup(name='VLAN Group 1', slug='vlan-group-1', scope=region, description='A'),
831            VLANGroup(name='VLAN Group 2', slug='vlan-group-2', scope=sitegroup, description='B'),
832            VLANGroup(name='VLAN Group 3', slug='vlan-group-3', scope=site, description='C'),
833            VLANGroup(name='VLAN Group 4', slug='vlan-group-4', scope=location, description='D'),
834            VLANGroup(name='VLAN Group 5', slug='vlan-group-5', scope=rack, description='E'),
835            VLANGroup(name='VLAN Group 6', slug='vlan-group-6', scope=clustergroup, description='F'),
836            VLANGroup(name='VLAN Group 7', slug='vlan-group-7', scope=cluster, description='G'),
837            VLANGroup(name='VLAN Group 8', slug='vlan-group-8'),
838        )
839        VLANGroup.objects.bulk_create(vlan_groups)
840
841    def test_name(self):
842        params = {'name': ['VLAN Group 1', 'VLAN Group 2']}
843        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
844
845    def test_slug(self):
846        params = {'slug': ['vlan-group-1', 'vlan-group-2']}
847        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
848
849    def test_description(self):
850        params = {'description': ['A', 'B']}
851        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
852
853    def test_region(self):
854        params = {'region': Region.objects.first().pk}
855        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
856
857    def test_sitegroup(self):
858        params = {'sitegroup': SiteGroup.objects.first().pk}
859        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
860
861    def test_site(self):
862        params = {'site': Site.objects.first().pk}
863        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
864
865    def test_location(self):
866        params = {'location': Location.objects.first().pk}
867        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
868
869    def test_rack(self):
870        params = {'rack': Rack.objects.first().pk}
871        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
872
873    def test_clustergroup(self):
874        params = {'clustergroup': ClusterGroup.objects.first().pk}
875        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
876
877    def test_cluster(self):
878        params = {'cluster': Cluster.objects.first().pk}
879        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
880
881
882class VLANTestCase(TestCase, ChangeLoggedFilterSetTests):
883    queryset = VLAN.objects.all()
884    filterset = VLANFilterSet
885
886    @classmethod
887    def setUpTestData(cls):
888
889        regions = (
890            Region(name='Test Region 1', slug='test-region-1'),
891            Region(name='Test Region 2', slug='test-region-2'),
892            Region(name='Test Region 3', slug='test-region-3'),
893        )
894        for r in regions:
895            r.save()
896
897        site_groups = (
898            SiteGroup(name='Site Group 1', slug='site-group-1'),
899            SiteGroup(name='Site Group 2', slug='site-group-2'),
900            SiteGroup(name='Site Group 3', slug='site-group-3'),
901        )
902        for site_group in site_groups:
903            site_group.save()
904
905        sites = (
906            Site(name='Site 1', slug='site-1', region=regions[0], group=site_groups[0]),
907            Site(name='Site 2', slug='site-2', region=regions[1], group=site_groups[1]),
908            Site(name='Site 3', slug='site-3', region=regions[2], group=site_groups[2]),
909            Site(name='Site 4', slug='site-4', region=regions[0], group=site_groups[0]),
910            Site(name='Site 5', slug='site-5', region=regions[1], group=site_groups[1]),
911            Site(name='Site 6', slug='site-6', region=regions[2], group=site_groups[2]),
912        )
913        Site.objects.bulk_create(sites)
914
915        locations = (
916            Location(name='Location 1', slug='location-1', site=sites[0]),
917            Location(name='Location 2', slug='location-2', site=sites[1]),
918            Location(name='Location 3', slug='location-3', site=sites[2]),
919        )
920        for location in locations:
921            location.save()
922
923        racks = (
924            Rack(name='Rack 1', site=sites[0], location=locations[0]),
925            Rack(name='Rack 2', site=sites[1], location=locations[1]),
926            Rack(name='Rack 3', site=sites[2], location=locations[2]),
927        )
928        Rack.objects.bulk_create(racks)
929
930        manufacturer = Manufacturer.objects.create(name='Manufacturer 1', slug='manufacturer-1')
931        device_type = DeviceType.objects.create(manufacturer=manufacturer, model='Device Type 1')
932        device_role = DeviceRole.objects.create(name='Device Role 1', slug='device-role-1')
933        devices = (
934            Device(name='Device 1', site=sites[0], location=locations[0], rack=racks[0], device_type=device_type, device_role=device_role),
935            Device(name='Device 2', site=sites[1], location=locations[1], rack=racks[1], device_type=device_type, device_role=device_role),
936            Device(name='Device 3', site=sites[2], location=locations[2], rack=racks[2], device_type=device_type, device_role=device_role),
937        )
938        Device.objects.bulk_create(devices)
939
940        cluster_groups = (
941            ClusterGroup(name='Cluster Group 1', slug='cluster-group-1'),
942            ClusterGroup(name='Cluster Group 2', slug='cluster-group-2'),
943            ClusterGroup(name='Cluster Group 3', slug='cluster-group-3'),
944        )
945        ClusterGroup.objects.bulk_create(cluster_groups)
946
947        cluster_type = ClusterType.objects.create(name='Cluster Type 1', slug='cluster-type-1')
948        clusters = (
949            Cluster(name='Cluster 1', type=cluster_type, group=cluster_groups[0], site=sites[0]),
950            Cluster(name='Cluster 2', type=cluster_type, group=cluster_groups[1], site=sites[1]),
951            Cluster(name='Cluster 3', type=cluster_type, group=cluster_groups[2], site=sites[2]),
952        )
953        Cluster.objects.bulk_create(clusters)
954
955        virtual_machines = (
956            VirtualMachine(name='Virtual Machine 1', cluster=clusters[0]),
957            VirtualMachine(name='Virtual Machine 2', cluster=clusters[1]),
958            VirtualMachine(name='Virtual Machine 3', cluster=clusters[2]),
959        )
960        VirtualMachine.objects.bulk_create(virtual_machines)
961
962        groups = (
963            # Scoped VLAN groups
964            VLANGroup(name='Region 1', slug='region-1', scope=regions[0]),
965            VLANGroup(name='Region 2', slug='region-2', scope=regions[1]),
966            VLANGroup(name='Region 3', slug='region-3', scope=regions[2]),
967            VLANGroup(name='Site Group 1', slug='site-group-1', scope=site_groups[0]),
968            VLANGroup(name='Site Group 2', slug='site-group-2', scope=site_groups[1]),
969            VLANGroup(name='Site Group 3', slug='site-group-3', scope=site_groups[2]),
970            VLANGroup(name='Site 1', slug='site-1', scope=sites[0]),
971            VLANGroup(name='Site 2', slug='site-2', scope=sites[1]),
972            VLANGroup(name='Site 3', slug='site-3', scope=sites[2]),
973            VLANGroup(name='Location 1', slug='location-1', scope=locations[0]),
974            VLANGroup(name='Location 2', slug='location-2', scope=locations[1]),
975            VLANGroup(name='Location 3', slug='location-3', scope=locations[2]),
976            VLANGroup(name='Rack 1', slug='rack-1', scope=racks[0]),
977            VLANGroup(name='Rack 2', slug='rack-2', scope=racks[1]),
978            VLANGroup(name='Rack 3', slug='rack-3', scope=racks[2]),
979            VLANGroup(name='Cluster Group 1', slug='cluster-group-1', scope=cluster_groups[0]),
980            VLANGroup(name='Cluster Group 2', slug='cluster-group-2', scope=cluster_groups[1]),
981            VLANGroup(name='Cluster Group 3', slug='cluster-group-3', scope=cluster_groups[2]),
982            VLANGroup(name='Cluster 1', slug='cluster-1', scope=clusters[0]),
983            VLANGroup(name='Cluster 2', slug='cluster-2', scope=clusters[1]),
984            VLANGroup(name='Cluster 3', slug='cluster-3', scope=clusters[2]),
985
986            # General purpose VLAN groups
987            VLANGroup(name='VLAN Group 1', slug='vlan-group-1'),
988            VLANGroup(name='VLAN Group 2', slug='vlan-group-2'),
989            VLANGroup(name='VLAN Group 3', slug='vlan-group-3'),
990        )
991        VLANGroup.objects.bulk_create(groups)
992
993        roles = (
994            Role(name='Role 1', slug='role-1'),
995            Role(name='Role 2', slug='role-2'),
996            Role(name='Role 3', slug='role-3'),
997        )
998        Role.objects.bulk_create(roles)
999
1000        tenant_groups = (
1001            TenantGroup(name='Tenant group 1', slug='tenant-group-1'),
1002            TenantGroup(name='Tenant group 2', slug='tenant-group-2'),
1003            TenantGroup(name='Tenant group 3', slug='tenant-group-3'),
1004        )
1005        for tenantgroup in tenant_groups:
1006            tenantgroup.save()
1007
1008        tenants = (
1009            Tenant(name='Tenant 1', slug='tenant-1', group=tenant_groups[0]),
1010            Tenant(name='Tenant 2', slug='tenant-2', group=tenant_groups[1]),
1011            Tenant(name='Tenant 3', slug='tenant-3', group=tenant_groups[2]),
1012        )
1013        Tenant.objects.bulk_create(tenants)
1014
1015        vlans = (
1016            # Create one VLAN per VLANGroup
1017            VLAN(vid=1, name='Region 1', group=groups[0]),
1018            VLAN(vid=2, name='Region 2', group=groups[1]),
1019            VLAN(vid=3, name='Region 3', group=groups[2]),
1020            VLAN(vid=4, name='Site Group 1', group=groups[3]),
1021            VLAN(vid=5, name='Site Group 2', group=groups[4]),
1022            VLAN(vid=6, name='Site Group 3', group=groups[5]),
1023            VLAN(vid=7, name='Site 1', group=groups[6]),
1024            VLAN(vid=8, name='Site 2', group=groups[7]),
1025            VLAN(vid=9, name='Site 3', group=groups[8]),
1026            VLAN(vid=10, name='Location 1', group=groups[9]),
1027            VLAN(vid=11, name='Location 2', group=groups[10]),
1028            VLAN(vid=12, name='Location 3', group=groups[11]),
1029            VLAN(vid=13, name='Rack 1', group=groups[12]),
1030            VLAN(vid=14, name='Rack 2', group=groups[13]),
1031            VLAN(vid=15, name='Rack 3', group=groups[14]),
1032            VLAN(vid=16, name='Cluster Group 1', group=groups[15]),
1033            VLAN(vid=17, name='Cluster Group 2', group=groups[16]),
1034            VLAN(vid=18, name='Cluster Group 3', group=groups[17]),
1035            VLAN(vid=19, name='Cluster 1', group=groups[18]),
1036            VLAN(vid=20, name='Cluster 2', group=groups[19]),
1037            VLAN(vid=21, name='Cluster 3', group=groups[20]),
1038
1039            VLAN(vid=101, name='VLAN 101', site=sites[3], group=groups[21], role=roles[0], tenant=tenants[0], status=VLANStatusChoices.STATUS_ACTIVE),
1040            VLAN(vid=102, name='VLAN 102', site=sites[3], group=groups[21], role=roles[0], tenant=tenants[0], status=VLANStatusChoices.STATUS_ACTIVE),
1041            VLAN(vid=201, name='VLAN 201', site=sites[4], group=groups[22], role=roles[1], tenant=tenants[1], status=VLANStatusChoices.STATUS_DEPRECATED),
1042            VLAN(vid=202, name='VLAN 202', site=sites[4], group=groups[22], role=roles[1], tenant=tenants[1], status=VLANStatusChoices.STATUS_DEPRECATED),
1043            VLAN(vid=301, name='VLAN 301', site=sites[5], group=groups[23], role=roles[2], tenant=tenants[2], status=VLANStatusChoices.STATUS_RESERVED),
1044            VLAN(vid=302, name='VLAN 302', site=sites[5], group=groups[23], role=roles[2], tenant=tenants[2], status=VLANStatusChoices.STATUS_RESERVED),
1045
1046            # Create one globally available VLAN
1047            VLAN(vid=1000, name='Global VLAN'),
1048        )
1049        VLAN.objects.bulk_create(vlans)
1050
1051    def test_name(self):
1052        params = {'name': ['VLAN 101', 'VLAN 102']}
1053        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
1054
1055    def test_vid(self):
1056        params = {'vid': ['101', '201', '301']}
1057        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 3)
1058
1059    def test_region(self):
1060        regions = Region.objects.all()[:2]
1061        params = {'region_id': [regions[0].pk, regions[1].pk]}
1062        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
1063        params = {'region': [regions[0].slug, regions[1].slug]}
1064        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
1065
1066    def test_site_group(self):
1067        site_groups = SiteGroup.objects.all()[:2]
1068        params = {'site_group_id': [site_groups[0].pk, site_groups[1].pk]}
1069        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
1070        params = {'site_group': [site_groups[0].slug, site_groups[1].slug]}
1071        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
1072
1073    def test_site(self):
1074        sites = Site.objects.all()
1075        params = {'site_id': [sites[3].pk, sites[4].pk]}
1076        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
1077        params = {'site': [sites[3].slug, sites[4].slug]}
1078        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
1079
1080    def test_group(self):
1081        groups = VLANGroup.objects.filter(name__startswith='VLAN Group')[:2]
1082        params = {'group_id': [groups[0].pk, groups[1].pk]}
1083        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
1084        params = {'group': [groups[0].slug, groups[1].slug]}
1085        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
1086
1087    def test_role(self):
1088        roles = Role.objects.all()[:2]
1089        params = {'role_id': [roles[0].pk, roles[1].pk]}
1090        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
1091        params = {'role': [roles[0].slug, roles[1].slug]}
1092        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
1093
1094    def test_status(self):
1095        params = {'status': [VLANStatusChoices.STATUS_DEPRECATED, VLANStatusChoices.STATUS_RESERVED]}
1096        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
1097
1098    def test_tenant(self):
1099        tenants = Tenant.objects.all()[:2]
1100        params = {'tenant_id': [tenants[0].pk, tenants[1].pk]}
1101        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
1102        params = {'tenant': [tenants[0].slug, tenants[1].slug]}
1103        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
1104
1105    def test_tenant_group(self):
1106        tenant_groups = TenantGroup.objects.all()[:2]
1107        params = {'tenant_group_id': [tenant_groups[0].pk, tenant_groups[1].pk]}
1108        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
1109        params = {'tenant_group': [tenant_groups[0].slug, tenant_groups[1].slug]}
1110        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
1111
1112    def test_available_on_device(self):
1113        device_id = Device.objects.first().pk
1114        params = {'available_on_device': device_id}
1115        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 6)  # 5 scoped + 1 global
1116
1117    def test_available_on_virtualmachine(self):
1118        vm_id = VirtualMachine.objects.first().pk
1119        params = {'available_on_virtualmachine': vm_id}
1120        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 6)  # 5 scoped + 1 global
1121
1122
1123class ServiceTestCase(TestCase, ChangeLoggedFilterSetTests):
1124    queryset = Service.objects.all()
1125    filterset = ServiceFilterSet
1126
1127    @classmethod
1128    def setUpTestData(cls):
1129
1130        site = Site.objects.create(name='Site 1', slug='site-1')
1131        manufacturer = Manufacturer.objects.create(name='Manufacturer 1', slug='manufacturer-1')
1132        device_type = DeviceType.objects.create(manufacturer=manufacturer, model='Device Type 1')
1133        device_role = DeviceRole.objects.create(name='Device Role 1', slug='device-role-1')
1134
1135        devices = (
1136            Device(device_type=device_type, name='Device 1', site=site, device_role=device_role),
1137            Device(device_type=device_type, name='Device 2', site=site, device_role=device_role),
1138            Device(device_type=device_type, name='Device 3', site=site, device_role=device_role),
1139        )
1140        Device.objects.bulk_create(devices)
1141
1142        clustertype = ClusterType.objects.create(name='Cluster Type 1', slug='cluster-type-1')
1143        cluster = Cluster.objects.create(type=clustertype, name='Cluster 1')
1144
1145        virtual_machines = (
1146            VirtualMachine(name='Virtual Machine 1', cluster=cluster),
1147            VirtualMachine(name='Virtual Machine 2', cluster=cluster),
1148            VirtualMachine(name='Virtual Machine 3', cluster=cluster),
1149        )
1150        VirtualMachine.objects.bulk_create(virtual_machines)
1151
1152        services = (
1153            Service(device=devices[0], name='Service 1', protocol=ServiceProtocolChoices.PROTOCOL_TCP, ports=[1001]),
1154            Service(device=devices[1], name='Service 2', protocol=ServiceProtocolChoices.PROTOCOL_TCP, ports=[1002]),
1155            Service(device=devices[2], name='Service 3', protocol=ServiceProtocolChoices.PROTOCOL_UDP, ports=[1003]),
1156            Service(virtual_machine=virtual_machines[0], name='Service 4', protocol=ServiceProtocolChoices.PROTOCOL_TCP, ports=[2001]),
1157            Service(virtual_machine=virtual_machines[1], name='Service 5', protocol=ServiceProtocolChoices.PROTOCOL_TCP, ports=[2002]),
1158            Service(virtual_machine=virtual_machines[2], name='Service 6', protocol=ServiceProtocolChoices.PROTOCOL_UDP, ports=[2003]),
1159        )
1160        Service.objects.bulk_create(services)
1161
1162    def test_name(self):
1163        params = {'name': ['Service 1', 'Service 2']}
1164        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
1165
1166    def test_protocol(self):
1167        params = {'protocol': ServiceProtocolChoices.PROTOCOL_TCP}
1168        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
1169
1170    def test_port(self):
1171        params = {'port': '1001'}
1172        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
1173
1174    def test_device(self):
1175        devices = Device.objects.all()[:2]
1176        params = {'device_id': [devices[0].pk, devices[1].pk]}
1177        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
1178        params = {'device': [devices[0].name, devices[1].name]}
1179        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
1180
1181    def test_virtual_machine(self):
1182        vms = VirtualMachine.objects.all()[:2]
1183        params = {'virtual_machine_id': [vms[0].pk, vms[1].pk]}
1184        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
1185        params = {'virtual_machine': [vms[0].name, vms[1].name]}
1186        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
1187