Merge branch 'develop' into feature

This commit is contained in:
Jeremy Stretch 2023-12-28 14:20:04 -05:00
commit d5c1cb0ef6
23 changed files with 1531 additions and 310 deletions

View File

@ -23,7 +23,7 @@ body:
attributes: attributes:
label: NetBox Version label: NetBox Version
description: What version of NetBox are you currently running? description: What version of NetBox are you currently running?
placeholder: v3.6.8 placeholder: v3.6.9
validations: validations:
required: true required: true
- type: dropdown - type: dropdown

View File

@ -14,7 +14,7 @@ body:
attributes: attributes:
label: NetBox version label: NetBox version
description: What version of NetBox are you currently running? description: What version of NetBox are you currently running?
placeholder: v3.6.8 placeholder: v3.6.9
validations: validations:
required: true required: true
- type: dropdown - type: dropdown

View File

@ -1,5 +1,19 @@
# NetBox v3.6 # NetBox v3.6
## v3.6.9 (2023-12-28)
### Enhancements
* [#14631](https://github.com/netbox-community/netbox/issues/14631) - All models can be filtered and searched by their description field (where applicable)
### Bug Fixes
* [#14482](https://github.com/netbox-community/netbox/issues/14482) - Fix validation error when attempting to move a primary IP address to a new parent object
* [#14620](https://github.com/netbox-community/netbox/issues/14620) - Permit setting device type U height to 0 during bulk edit
* [#14621](https://github.com/netbox-community/netbox/issues/14621) - Fix error when using the device search filter
---
## v3.6.8 (2023-12-27) ## v3.6.8 (2023-12-27)
### Enhancements ### Enhancements

View File

@ -67,13 +67,14 @@ class ProviderFilterSet(NetBoxModelFilterSet, ContactModelFilterSet):
class Meta: class Meta:
model = Provider model = Provider
fields = ['id', 'name', 'slug'] fields = ['id', 'name', 'slug', 'description']
def search(self, queryset, name, value): def search(self, queryset, name, value):
if not value.strip(): if not value.strip():
return queryset return queryset
return queryset.filter( return queryset.filter(
Q(name__icontains=value) | Q(name__icontains=value) |
Q(description__icontains=value) |
Q(accounts__account__icontains=value) | Q(accounts__account__icontains=value) |
Q(accounts__name__icontains=value) | Q(accounts__name__icontains=value) |
Q(comments__icontains=value) Q(comments__icontains=value)
@ -101,6 +102,7 @@ class ProviderAccountFilterSet(NetBoxModelFilterSet):
return queryset return queryset
return queryset.filter( return queryset.filter(
Q(name__icontains=value) | Q(name__icontains=value) |
Q(description__icontains=value) |
Q(account__icontains=value) | Q(account__icontains=value) |
Q(comments__icontains=value) Q(comments__icontains=value)
).distinct() ).distinct()

View File

@ -25,8 +25,8 @@ class ProviderTestCase(TestCase, ChangeLoggedFilterSetTests):
ASN.objects.bulk_create(asns) ASN.objects.bulk_create(asns)
providers = ( providers = (
Provider(name='Provider 1', slug='provider-1'), Provider(name='Provider 1', slug='provider-1', description='foobar1'),
Provider(name='Provider 2', slug='provider-2'), Provider(name='Provider 2', slug='provider-2', description='foobar2'),
Provider(name='Provider 3', slug='provider-3'), Provider(name='Provider 3', slug='provider-3'),
Provider(name='Provider 4', slug='provider-4'), Provider(name='Provider 4', slug='provider-4'),
Provider(name='Provider 5', slug='provider-5'), Provider(name='Provider 5', slug='provider-5'),
@ -74,6 +74,10 @@ class ProviderTestCase(TestCase, ChangeLoggedFilterSetTests):
CircuitTermination(circuit=circuits[1], site=sites[0], term_side='A'), CircuitTermination(circuit=circuits[1], site=sites[0], term_side='A'),
)) ))
def test_q(self):
params = {'q': 'foobar1'}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
def test_name(self): def test_name(self):
params = {'name': ['Provider 1', 'Provider 2']} params = {'name': ['Provider 1', 'Provider 2']}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
@ -82,6 +86,10 @@ class ProviderTestCase(TestCase, ChangeLoggedFilterSetTests):
params = {'slug': ['provider-1', 'provider-2']} params = {'slug': ['provider-1', 'provider-2']}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
def test_description(self):
params = {'description': ['foobar1', 'foobar2']}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
def test_asn_id(self): # ASN object assignment def test_asn_id(self): # ASN object assignment
asns = ASN.objects.all()[:2] asns = ASN.objects.all()[:2]
params = {'asn_id': [asns[0].pk, asns[1].pk]} params = {'asn_id': [asns[0].pk, asns[1].pk]}
@ -122,6 +130,10 @@ class CircuitTypeTestCase(TestCase, ChangeLoggedFilterSetTests):
CircuitType(name='Circuit Type 3', slug='circuit-type-3'), CircuitType(name='Circuit Type 3', slug='circuit-type-3'),
)) ))
def test_q(self):
params = {'q': 'foobar1'}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
def test_name(self): def test_name(self):
params = {'name': ['Circuit Type 1']} params = {'name': ['Circuit Type 1']}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
@ -227,6 +239,10 @@ class CircuitTestCase(TestCase, ChangeLoggedFilterSetTests):
)) ))
CircuitTermination.objects.bulk_create(circuit_terminations) CircuitTermination.objects.bulk_create(circuit_terminations)
def test_q(self):
params = {'q': 'foobar1'}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
def test_cid(self): def test_cid(self):
params = {'cid': ['Test Circuit 1', 'Test Circuit 2']} params = {'cid': ['Test Circuit 1', 'Test Circuit 2']}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
@ -369,6 +385,10 @@ class CircuitTerminationTestCase(TestCase, ChangeLoggedFilterSetTests):
Cable(a_terminations=[circuit_terminations[0]], b_terminations=[circuit_terminations[1]]).save() Cable(a_terminations=[circuit_terminations[0]], b_terminations=[circuit_terminations[1]]).save()
def test_q(self):
params = {'q': 'foobar1'}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
def test_term_side(self): def test_term_side(self):
params = {'term_side': 'A'} params = {'term_side': 'A'}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 7) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 7)
@ -440,6 +460,10 @@ class ProviderNetworkTestCase(TestCase, ChangeLoggedFilterSetTests):
) )
ProviderNetwork.objects.bulk_create(provider_networks) ProviderNetwork.objects.bulk_create(provider_networks)
def test_q(self):
params = {'q': 'foobar1'}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
def test_name(self): def test_name(self):
params = {'name': ['Provider Network 1', 'Provider Network 2']} params = {'name': ['Provider Network 1', 'Provider Network 2']}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
@ -477,6 +501,10 @@ class ProviderAccountTestCase(TestCase, ChangeLoggedFilterSetTests):
) )
ProviderAccount.objects.bulk_create(provider_accounts) ProviderAccount.objects.bulk_create(provider_accounts)
def test_q(self):
params = {'q': 'foobar1'}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
def test_name(self): def test_name(self):
params = {'name': ['Provider Account 1', 'Provider Account 2']} params = {'name': ['Provider Account 1', 'Provider Account 2']}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)

View File

@ -28,7 +28,7 @@ class DataSourceFilterSet(NetBoxModelFilterSet):
class Meta: class Meta:
model = DataSource model = DataSource
fields = ('id', 'name', 'enabled') fields = ('id', 'name', 'enabled', 'description')
def search(self, queryset, name, value): def search(self, queryset, name, value):
if not value.strip(): if not value.strip():

View File

@ -21,14 +21,16 @@ class DataSourceTestCase(TestCase, ChangeLoggedFilterSetTests):
type='local', type='local',
source_url='file:///var/tmp/source1/', source_url='file:///var/tmp/source1/',
status=DataSourceStatusChoices.NEW, status=DataSourceStatusChoices.NEW,
enabled=True enabled=True,
description='foobar1'
), ),
DataSource( DataSource(
name='Data Source 2', name='Data Source 2',
type='local', type='local',
source_url='file:///var/tmp/source2/', source_url='file:///var/tmp/source2/',
status=DataSourceStatusChoices.SYNCING, status=DataSourceStatusChoices.SYNCING,
enabled=True enabled=True,
description='foobar2'
), ),
DataSource( DataSource(
name='Data Source 3', name='Data Source 3',
@ -40,10 +42,18 @@ class DataSourceTestCase(TestCase, ChangeLoggedFilterSetTests):
) )
DataSource.objects.bulk_create(data_sources) DataSource.objects.bulk_create(data_sources)
def test_q(self):
params = {'q': 'foobar1'}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
def test_name(self): def test_name(self):
params = {'name': ['Data Source 1', 'Data Source 2']} params = {'name': ['Data Source 1', 'Data Source 2']}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
def test_description(self):
params = {'description': ['foobar1', 'foobar2']}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
def test_type(self): def test_type(self):
params = {'type': ['local']} params = {'type': ['local']}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
@ -97,6 +107,10 @@ class DataFileTestCase(TestCase, ChangeLoggedFilterSetTests):
) )
DataFile.objects.bulk_create(data_files) DataFile.objects.bulk_create(data_files)
def test_q(self):
params = {'q': 'file1.txt'}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
def test_source(self): def test_source(self):
sources = DataSource.objects.all() sources = DataSource.objects.all()
params = {'source_id': [sources[0].pk, sources[1].pk]} params = {'source_id': [sources[0].pk, sources[1].pk]}

View File

@ -326,7 +326,7 @@ class RackFilterSet(NetBoxModelFilterSet, TenancyFilterSet, ContactModelFilterSe
model = Rack model = Rack
fields = [ fields = [
'id', 'name', 'facility_id', 'asset_tag', 'u_height', 'starting_unit', 'desc_units', 'outer_width', 'id', 'name', 'facility_id', 'asset_tag', 'u_height', 'starting_unit', 'desc_units', 'outer_width',
'outer_depth', 'outer_unit', 'mounting_depth', 'weight', 'max_weight', 'weight_unit' 'outer_depth', 'outer_unit', 'mounting_depth', 'weight', 'max_weight', 'weight_unit', 'description',
] ]
def search(self, queryset, name, value): def search(self, queryset, name, value):
@ -337,6 +337,7 @@ class RackFilterSet(NetBoxModelFilterSet, TenancyFilterSet, ContactModelFilterSe
Q(facility_id__icontains=value) | Q(facility_id__icontains=value) |
Q(serial__icontains=value.strip()) | Q(serial__icontains=value.strip()) |
Q(asset_tag__icontains=value.strip()) | Q(asset_tag__icontains=value.strip()) |
Q(description__icontains=value) |
Q(comments__icontains=value) Q(comments__icontains=value)
) )
@ -498,8 +499,8 @@ class DeviceTypeFilterSet(NetBoxModelFilterSet):
class Meta: class Meta:
model = DeviceType model = DeviceType
fields = [ fields = [
'id', 'model', 'slug', 'part_number', 'u_height', 'exclude_from_utilization', 'is_full_depth', 'subdevice_role', 'id', 'model', 'slug', 'part_number', 'u_height', 'exclude_from_utilization', 'is_full_depth',
'airflow', 'weight', 'weight_unit', 'subdevice_role', 'airflow', 'weight', 'weight_unit', 'description',
] ]
def search(self, queryset, name, value): def search(self, queryset, name, value):
@ -509,6 +510,7 @@ class DeviceTypeFilterSet(NetBoxModelFilterSet):
Q(manufacturer__name__icontains=value) | Q(manufacturer__name__icontains=value) |
Q(model__icontains=value) | Q(model__icontains=value) |
Q(part_number__icontains=value) | Q(part_number__icontains=value) |
Q(description__icontains=value) |
Q(comments__icontains=value) Q(comments__icontains=value)
) )
@ -593,7 +595,7 @@ class ModuleTypeFilterSet(NetBoxModelFilterSet):
class Meta: class Meta:
model = ModuleType model = ModuleType
fields = ['id', 'model', 'part_number', 'weight', 'weight_unit'] fields = ['id', 'model', 'part_number', 'weight', 'weight_unit', 'description']
def search(self, queryset, name, value): def search(self, queryset, name, value):
if not value.strip(): if not value.strip():
@ -602,6 +604,7 @@ class ModuleTypeFilterSet(NetBoxModelFilterSet):
Q(manufacturer__name__icontains=value) | Q(manufacturer__name__icontains=value) |
Q(model__icontains=value) | Q(model__icontains=value) |
Q(part_number__icontains=value) | Q(part_number__icontains=value) |
Q(description__icontains=value) |
Q(comments__icontains=value) Q(comments__icontains=value)
) )
@ -641,7 +644,10 @@ class DeviceTypeComponentFilterSet(django_filters.FilterSet):
def search(self, queryset, name, value): def search(self, queryset, name, value):
if not value.strip(): if not value.strip():
return queryset return queryset
return queryset.filter(name__icontains=value) return queryset.filter(
Q(name__icontains=value) |
Q(description__icontains=value)
)
class ModularDeviceTypeComponentFilterSet(DeviceTypeComponentFilterSet): class ModularDeviceTypeComponentFilterSet(DeviceTypeComponentFilterSet):
@ -656,21 +662,21 @@ class ConsolePortTemplateFilterSet(ChangeLoggedModelFilterSet, ModularDeviceType
class Meta: class Meta:
model = ConsolePortTemplate model = ConsolePortTemplate
fields = ['id', 'name', 'type'] fields = ['id', 'name', 'type', 'description']
class ConsoleServerPortTemplateFilterSet(ChangeLoggedModelFilterSet, ModularDeviceTypeComponentFilterSet): class ConsoleServerPortTemplateFilterSet(ChangeLoggedModelFilterSet, ModularDeviceTypeComponentFilterSet):
class Meta: class Meta:
model = ConsoleServerPortTemplate model = ConsoleServerPortTemplate
fields = ['id', 'name', 'type'] fields = ['id', 'name', 'type', 'description']
class PowerPortTemplateFilterSet(ChangeLoggedModelFilterSet, ModularDeviceTypeComponentFilterSet): class PowerPortTemplateFilterSet(ChangeLoggedModelFilterSet, ModularDeviceTypeComponentFilterSet):
class Meta: class Meta:
model = PowerPortTemplate model = PowerPortTemplate
fields = ['id', 'name', 'type', 'maximum_draw', 'allocated_draw'] fields = ['id', 'name', 'type', 'maximum_draw', 'allocated_draw', 'description']
class PowerOutletTemplateFilterSet(ChangeLoggedModelFilterSet, ModularDeviceTypeComponentFilterSet): class PowerOutletTemplateFilterSet(ChangeLoggedModelFilterSet, ModularDeviceTypeComponentFilterSet):
@ -681,7 +687,7 @@ class PowerOutletTemplateFilterSet(ChangeLoggedModelFilterSet, ModularDeviceType
class Meta: class Meta:
model = PowerOutletTemplate model = PowerOutletTemplate
fields = ['id', 'name', 'type', 'feed_leg'] fields = ['id', 'name', 'type', 'feed_leg', 'description']
class InterfaceTemplateFilterSet(ChangeLoggedModelFilterSet, ModularDeviceTypeComponentFilterSet): class InterfaceTemplateFilterSet(ChangeLoggedModelFilterSet, ModularDeviceTypeComponentFilterSet):
@ -705,7 +711,7 @@ class InterfaceTemplateFilterSet(ChangeLoggedModelFilterSet, ModularDeviceTypeCo
class Meta: class Meta:
model = InterfaceTemplate model = InterfaceTemplate
fields = ['id', 'name', 'type', 'enabled', 'mgmt_only'] fields = ['id', 'name', 'type', 'enabled', 'mgmt_only', 'description']
class FrontPortTemplateFilterSet(ChangeLoggedModelFilterSet, ModularDeviceTypeComponentFilterSet): class FrontPortTemplateFilterSet(ChangeLoggedModelFilterSet, ModularDeviceTypeComponentFilterSet):
@ -716,7 +722,7 @@ class FrontPortTemplateFilterSet(ChangeLoggedModelFilterSet, ModularDeviceTypeCo
class Meta: class Meta:
model = FrontPortTemplate model = FrontPortTemplate
fields = ['id', 'name', 'type', 'color'] fields = ['id', 'name', 'type', 'color', 'description']
class RearPortTemplateFilterSet(ChangeLoggedModelFilterSet, ModularDeviceTypeComponentFilterSet): class RearPortTemplateFilterSet(ChangeLoggedModelFilterSet, ModularDeviceTypeComponentFilterSet):
@ -727,21 +733,21 @@ class RearPortTemplateFilterSet(ChangeLoggedModelFilterSet, ModularDeviceTypeCom
class Meta: class Meta:
model = RearPortTemplate model = RearPortTemplate
fields = ['id', 'name', 'type', 'color', 'positions'] fields = ['id', 'name', 'type', 'color', 'positions', 'description']
class ModuleBayTemplateFilterSet(ChangeLoggedModelFilterSet, DeviceTypeComponentFilterSet): class ModuleBayTemplateFilterSet(ChangeLoggedModelFilterSet, DeviceTypeComponentFilterSet):
class Meta: class Meta:
model = ModuleBayTemplate model = ModuleBayTemplate
fields = ['id', 'name'] fields = ['id', 'name', 'description']
class DeviceBayTemplateFilterSet(ChangeLoggedModelFilterSet, DeviceTypeComponentFilterSet): class DeviceBayTemplateFilterSet(ChangeLoggedModelFilterSet, DeviceTypeComponentFilterSet):
class Meta: class Meta:
model = DeviceBayTemplate model = DeviceBayTemplate
fields = ['id', 'name'] fields = ['id', 'name', 'description']
class InventoryItemTemplateFilterSet(ChangeLoggedModelFilterSet, DeviceTypeComponentFilterSet): class InventoryItemTemplateFilterSet(ChangeLoggedModelFilterSet, DeviceTypeComponentFilterSet):
@ -774,7 +780,7 @@ class InventoryItemTemplateFilterSet(ChangeLoggedModelFilterSet, DeviceTypeCompo
class Meta: class Meta:
model = InventoryItemTemplate model = InventoryItemTemplate
fields = ['id', 'name', 'label', 'part_id'] fields = ['id', 'name', 'label', 'part_id', 'description']
def search(self, queryset, name, value): def search(self, queryset, name, value):
if not value.strip(): if not value.strip():
@ -1010,7 +1016,10 @@ class DeviceFilterSet(
class Meta: class Meta:
model = Device model = Device
fields = ['id', 'asset_tag', 'face', 'position', 'latitude', 'longitude', 'airflow', 'vc_position', 'vc_priority'] fields = [
'id', 'asset_tag', 'face', 'position', 'latitude', 'longitude', 'airflow', 'vc_position', 'vc_priority',
'description',
]
def search(self, queryset, name, value): def search(self, queryset, name, value):
if not value.strip(): if not value.strip():
@ -1020,7 +1029,7 @@ class DeviceFilterSet(
Q(serial__icontains=value.strip()) | Q(serial__icontains=value.strip()) |
Q(inventoryitems__serial__icontains=value.strip()) | Q(inventoryitems__serial__icontains=value.strip()) |
Q(asset_tag__icontains=value.strip()) | Q(asset_tag__icontains=value.strip()) |
Q(description_icontains=value.strip()) | Q(description__icontains=value.strip()) |
Q(comments__icontains=value) | Q(comments__icontains=value) |
Q(primary_ip4__address__startswith=value) | Q(primary_ip4__address__startswith=value) |
Q(primary_ip6__address__startswith=value) Q(primary_ip6__address__startswith=value)
@ -1090,13 +1099,16 @@ class VirtualDeviceContextFilterSet(NetBoxModelFilterSet, TenancyFilterSet, Prim
class Meta: class Meta:
model = VirtualDeviceContext model = VirtualDeviceContext
fields = ['id', 'device', 'name'] fields = ['id', 'device', 'name', 'description']
def search(self, queryset, name, value): def search(self, queryset, name, value):
if not value.strip(): if not value.strip():
return queryset return queryset
qs_filter = Q(name__icontains=value) qs_filter = (
Q(name__icontains=value) |
Q(description__icontains=value)
)
try: try:
qs_filter |= Q(identifier=int(value)) qs_filter |= Q(identifier=int(value))
except ValueError: except ValueError:
@ -1153,7 +1165,7 @@ class ModuleFilterSet(NetBoxModelFilterSet):
class Meta: class Meta:
model = Module model = Module
fields = ['id', 'status', 'asset_tag'] fields = ['id', 'status', 'asset_tag', 'description']
def search(self, queryset, name, value): def search(self, queryset, name, value):
if not value.strip(): if not value.strip():
@ -1162,6 +1174,7 @@ class ModuleFilterSet(NetBoxModelFilterSet):
Q(device__name__icontains=value.strip()) | Q(device__name__icontains=value.strip()) |
Q(serial__icontains=value.strip()) | Q(serial__icontains=value.strip()) |
Q(asset_tag__icontains=value.strip()) | Q(asset_tag__icontains=value.strip()) |
Q(description__icontains=value) |
Q(comments__icontains=value) Q(comments__icontains=value)
).distinct() ).distinct()
@ -1652,7 +1665,7 @@ class InventoryItemRoleFilterSet(OrganizationalModelFilterSet):
class Meta: class Meta:
model = InventoryItemRole model = InventoryItemRole
fields = ['id', 'name', 'slug', 'color'] fields = ['id', 'name', 'slug', 'color', 'description']
class VirtualChassisFilterSet(NetBoxModelFilterSet): class VirtualChassisFilterSet(NetBoxModelFilterSet):
@ -1717,13 +1730,14 @@ class VirtualChassisFilterSet(NetBoxModelFilterSet):
class Meta: class Meta:
model = VirtualChassis model = VirtualChassis
fields = ['id', 'domain', 'name'] fields = ['id', 'domain', 'name', 'description']
def search(self, queryset, name, value): def search(self, queryset, name, value):
if not value.strip(): if not value.strip():
return queryset return queryset
qs_filter = ( qs_filter = (
Q(name__icontains=value) | Q(name__icontains=value) |
Q(description__icontains=value) |
Q(members__name__icontains=value) | Q(members__name__icontains=value) |
Q(domain__icontains=value) Q(domain__icontains=value)
) )
@ -1792,12 +1806,16 @@ class CableFilterSet(TenancyFilterSet, NetBoxModelFilterSet):
class Meta: class Meta:
model = Cable model = Cable
fields = ['id', 'label', 'length', 'length_unit'] fields = ['id', 'label', 'length', 'length_unit', 'description']
def search(self, queryset, name, value): def search(self, queryset, name, value):
if not value.strip(): if not value.strip():
return queryset return queryset
return queryset.filter(label__icontains=value) qs_filter = (
Q(label__icontains=value) |
Q(description__icontains=value)
)
return queryset.filter(qs_filter)
def filter_by_termination(self, queryset, name, value): def filter_by_termination(self, queryset, name, value):
# Filter by a related object cached on CableTermination. Note the underscore preceding the field name. # Filter by a related object cached on CableTermination. Note the underscore preceding the field name.
@ -1884,13 +1902,14 @@ class PowerPanelFilterSet(NetBoxModelFilterSet, ContactModelFilterSet):
class Meta: class Meta:
model = PowerPanel model = PowerPanel
fields = ['id', 'name'] fields = ['id', 'name', 'description']
def search(self, queryset, name, value): def search(self, queryset, name, value):
if not value.strip(): if not value.strip():
return queryset return queryset
qs_filter = ( qs_filter = (
Q(name__icontains=value) Q(name__icontains=value) |
Q(description__icontains=value)
) )
return queryset.filter(qs_filter) return queryset.filter(qs_filter)
@ -1951,6 +1970,7 @@ class PowerFeedFilterSet(NetBoxModelFilterSet, CabledObjectFilterSet, PathEndpoi
model = PowerFeed model = PowerFeed
fields = [ fields = [
'id', 'name', 'status', 'type', 'supply', 'phase', 'voltage', 'amperage', 'max_utilization', 'cable_end', 'id', 'name', 'status', 'type', 'supply', 'phase', 'voltage', 'amperage', 'max_utilization', 'cable_end',
'description',
] ]
def search(self, queryset, name, value): def search(self, queryset, name, value):
@ -1958,6 +1978,7 @@ class PowerFeedFilterSet(NetBoxModelFilterSet, CabledObjectFilterSet, PathEndpoi
return queryset return queryset
qs_filter = ( qs_filter = (
Q(name__icontains=value) | Q(name__icontains=value) |
Q(description__icontains=value) |
Q(power_panel__name__icontains=value) | Q(power_panel__name__icontains=value) |
Q(comments__icontains=value) Q(comments__icontains=value)
) )

View File

@ -412,7 +412,7 @@ class DeviceTypeBulkEditForm(NetBoxModelBulkEditForm):
) )
u_height = forms.IntegerField( u_height = forms.IntegerField(
label=_('U height'), label=_('U height'),
min_value=1, min_value=0,
required=False required=False
) )
is_full_depth = forms.NullBooleanField( is_full_depth = forms.NullBooleanField(

File diff suppressed because it is too large Load Diff

View File

@ -544,7 +544,7 @@ class ConfigContextFilterSet(ChangeLoggedModelFilterSet):
class Meta: class Meta:
model = ConfigContext model = ConfigContext
fields = ['id', 'name', 'is_active', 'data_synced'] fields = ['id', 'name', 'is_active', 'data_synced', 'description']
def search(self, queryset, name, value): def search(self, queryset, name, value):
if not value.strip(): if not value.strip():

View File

@ -42,7 +42,8 @@ class CustomFieldTestCase(TestCase, BaseFilterSetTests):
weight=100, weight=100,
filter_logic=CustomFieldFilterLogicChoices.FILTER_LOOSE, filter_logic=CustomFieldFilterLogicChoices.FILTER_LOOSE,
ui_visible=CustomFieldUIVisibleChoices.ALWAYS, ui_visible=CustomFieldUIVisibleChoices.ALWAYS,
ui_editable=CustomFieldUIEditableChoices.YES ui_editable=CustomFieldUIEditableChoices.YES,
description='foobar1'
), ),
CustomField( CustomField(
name='Custom Field 2', name='Custom Field 2',
@ -51,7 +52,8 @@ class CustomFieldTestCase(TestCase, BaseFilterSetTests):
weight=200, weight=200,
filter_logic=CustomFieldFilterLogicChoices.FILTER_EXACT, filter_logic=CustomFieldFilterLogicChoices.FILTER_EXACT,
ui_visible=CustomFieldUIVisibleChoices.IF_SET, ui_visible=CustomFieldUIVisibleChoices.IF_SET,
ui_editable=CustomFieldUIEditableChoices.NO ui_editable=CustomFieldUIEditableChoices.NO,
description='foobar2'
), ),
CustomField( CustomField(
name='Custom Field 3', name='Custom Field 3',
@ -60,7 +62,8 @@ class CustomFieldTestCase(TestCase, BaseFilterSetTests):
weight=300, weight=300,
filter_logic=CustomFieldFilterLogicChoices.FILTER_DISABLED, filter_logic=CustomFieldFilterLogicChoices.FILTER_DISABLED,
ui_visible=CustomFieldUIVisibleChoices.HIDDEN, ui_visible=CustomFieldUIVisibleChoices.HIDDEN,
ui_editable=CustomFieldUIEditableChoices.HIDDEN ui_editable=CustomFieldUIEditableChoices.HIDDEN,
description='foobar3'
), ),
CustomField( CustomField(
name='Custom Field 4', name='Custom Field 4',
@ -90,6 +93,10 @@ class CustomFieldTestCase(TestCase, BaseFilterSetTests):
custom_fields[3].content_types.add(ContentType.objects.get_by_natural_key('dcim', 'device')) custom_fields[3].content_types.add(ContentType.objects.get_by_natural_key('dcim', 'device'))
custom_fields[4].content_types.add(ContentType.objects.get_by_natural_key('dcim', 'device')) custom_fields[4].content_types.add(ContentType.objects.get_by_natural_key('dcim', 'device'))
def test_q(self):
params = {'q': 'foobar1'}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
def test_name(self): def test_name(self):
params = {'name': ['Custom Field 1', 'Custom Field 2']} params = {'name': ['Custom Field 1', 'Custom Field 2']}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
@ -126,6 +133,10 @@ class CustomFieldTestCase(TestCase, BaseFilterSetTests):
params = {'choice_set_id': CustomFieldChoiceSet.objects.values_list('pk', flat=True)} params = {'choice_set_id': CustomFieldChoiceSet.objects.values_list('pk', flat=True)}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
def test_description(self):
params = {'description': ['foobar1', 'foobar2']}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
class CustomFieldChoiceSetTestCase(TestCase, BaseFilterSetTests): class CustomFieldChoiceSetTestCase(TestCase, BaseFilterSetTests):
queryset = CustomFieldChoiceSet.objects.all() queryset = CustomFieldChoiceSet.objects.all()
@ -134,12 +145,16 @@ class CustomFieldChoiceSetTestCase(TestCase, BaseFilterSetTests):
@classmethod @classmethod
def setUpTestData(cls): def setUpTestData(cls):
choice_sets = ( choice_sets = (
CustomFieldChoiceSet(name='Choice Set 1', extra_choices=['A', 'B', 'C']), CustomFieldChoiceSet(name='Choice Set 1', extra_choices=['A', 'B', 'C'], description='foobar1'),
CustomFieldChoiceSet(name='Choice Set 2', extra_choices=['D', 'E', 'F']), CustomFieldChoiceSet(name='Choice Set 2', extra_choices=['D', 'E', 'F'], description='foobar2'),
CustomFieldChoiceSet(name='Choice Set 3', extra_choices=['G', 'H', 'I']), CustomFieldChoiceSet(name='Choice Set 3', extra_choices=['G', 'H', 'I'], description='foobar3'),
) )
CustomFieldChoiceSet.objects.bulk_create(choice_sets) CustomFieldChoiceSet.objects.bulk_create(choice_sets)
def test_q(self):
params = {'q': 'foobar1'}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
def test_name(self): def test_name(self):
params = {'name': ['Choice Set 1', 'Choice Set 2']} params = {'name': ['Choice Set 1', 'Choice Set 2']}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
@ -148,6 +163,10 @@ class CustomFieldChoiceSetTestCase(TestCase, BaseFilterSetTests):
params = {'choice': ['A', 'D']} params = {'choice': ['A', 'D']}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
def test_description(self):
params = {'description': ['foobar1', 'foobar2']}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
class WebhookTestCase(TestCase, BaseFilterSetTests): class WebhookTestCase(TestCase, BaseFilterSetTests):
queryset = Webhook.objects.all() queryset = Webhook.objects.all()
@ -191,6 +210,10 @@ class WebhookTestCase(TestCase, BaseFilterSetTests):
) )
Webhook.objects.bulk_create(webhooks) Webhook.objects.bulk_create(webhooks)
def test_q(self):
params = {'q': 'Webhook 1'}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
def test_name(self): def test_name(self):
params = {'name': ['Webhook 1', 'Webhook 2']} params = {'name': ['Webhook 1', 'Webhook 2']}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
@ -387,6 +410,10 @@ class CustomLinkTestCase(TestCase, BaseFilterSetTests):
for i, custom_link in enumerate(custom_links): for i, custom_link in enumerate(custom_links):
custom_link.content_types.set([content_types[i]]) custom_link.content_types.set([content_types[i]])
def test_q(self):
params = {'q': 'Custom Link 1'}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
def test_name(self): def test_name(self):
params = {'name': ['Custom Link 1', 'Custom Link 2']} params = {'name': ['Custom Link 1', 'Custom Link 2']}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
@ -437,7 +464,8 @@ class SavedFilterTestCase(TestCase, BaseFilterSetTests):
weight=100, weight=100,
enabled=True, enabled=True,
shared=True, shared=True,
parameters={'status': ['active']} parameters={'status': ['active']},
description='foobar1'
), ),
SavedFilter( SavedFilter(
name='Saved Filter 2', name='Saved Filter 2',
@ -446,7 +474,8 @@ class SavedFilterTestCase(TestCase, BaseFilterSetTests):
weight=200, weight=200,
enabled=True, enabled=True,
shared=True, shared=True,
parameters={'status': ['planned']} parameters={'status': ['planned']},
description='foobar2'
), ),
SavedFilter( SavedFilter(
name='Saved Filter 3', name='Saved Filter 3',
@ -455,13 +484,18 @@ class SavedFilterTestCase(TestCase, BaseFilterSetTests):
weight=300, weight=300,
enabled=False, enabled=False,
shared=False, shared=False,
parameters={'status': ['retired']} parameters={'status': ['retired']},
description='foobar3'
), ),
) )
SavedFilter.objects.bulk_create(saved_filters) SavedFilter.objects.bulk_create(saved_filters)
for i, savedfilter in enumerate(saved_filters): for i, savedfilter in enumerate(saved_filters):
savedfilter.content_types.set([content_types[i]]) savedfilter.content_types.set([content_types[i]])
def test_q(self):
params = {'q': 'foobar1'}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
def test_name(self): def test_name(self):
params = {'name': ['Saved Filter 1', 'Saved Filter 2']} params = {'name': ['Saved Filter 1', 'Saved Filter 2']}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
@ -470,6 +504,10 @@ class SavedFilterTestCase(TestCase, BaseFilterSetTests):
params = {'slug': ['saved-filter-1', 'saved-filter-2']} params = {'slug': ['saved-filter-1', 'saved-filter-2']}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
def test_description(self):
params = {'description': ['foobar1', 'foobar2']}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
def test_content_types(self): def test_content_types(self):
params = {'content_types': 'dcim.site'} params = {'content_types': 'dcim.site'}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
@ -513,8 +551,6 @@ class BookmarkTestCase(TestCase, BaseFilterSetTests):
@classmethod @classmethod
def setUpTestData(cls): def setUpTestData(cls):
content_types = ContentType.objects.filter(model__in=['site', 'rack', 'device'])
users = ( users = (
User(username='User 1'), User(username='User 1'),
User(username='User 2'), User(username='User 2'),
@ -595,6 +631,10 @@ class ExportTemplateTestCase(TestCase, BaseFilterSetTests):
for i, et in enumerate(export_templates): for i, et in enumerate(export_templates):
et.content_types.set([content_types[i]]) et.content_types.set([content_types[i]])
def test_q(self):
params = {'q': 'foobar1'}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
def test_name(self): def test_name(self):
params = {'name': ['Export Template 1', 'Export Template 2']} params = {'name': ['Export Template 1', 'Export Template 2']}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
@ -668,6 +708,10 @@ class ImageAttachmentTestCase(TestCase, BaseFilterSetTests):
) )
ImageAttachment.objects.bulk_create(image_attachments) ImageAttachment.objects.bulk_create(image_attachments)
def test_q(self):
params = {'q': 'Attachment 1'}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
def test_name(self): def test_name(self):
params = {'name': ['Image Attachment 1', 'Image Attachment 2']} params = {'name': ['Image Attachment 1', 'Image Attachment 2']}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
@ -720,41 +764,45 @@ class JournalEntryTestCase(TestCase, ChangeLoggedFilterSetTests):
assigned_object=sites[0], assigned_object=sites[0],
created_by=users[0], created_by=users[0],
kind=JournalEntryKindChoices.KIND_INFO, kind=JournalEntryKindChoices.KIND_INFO,
comments='New journal entry' comments='foobar1'
), ),
JournalEntry( JournalEntry(
assigned_object=sites[0], assigned_object=sites[0],
created_by=users[1], created_by=users[1],
kind=JournalEntryKindChoices.KIND_SUCCESS, kind=JournalEntryKindChoices.KIND_SUCCESS,
comments='New journal entry' comments='foobar2'
), ),
JournalEntry( JournalEntry(
assigned_object=sites[1], assigned_object=sites[1],
created_by=users[2], created_by=users[2],
kind=JournalEntryKindChoices.KIND_WARNING, kind=JournalEntryKindChoices.KIND_WARNING,
comments='New journal entry' comments='foobar3'
), ),
JournalEntry( JournalEntry(
assigned_object=racks[0], assigned_object=racks[0],
created_by=users[0], created_by=users[0],
kind=JournalEntryKindChoices.KIND_INFO, kind=JournalEntryKindChoices.KIND_INFO,
comments='New journal entry' comments='foobar4'
), ),
JournalEntry( JournalEntry(
assigned_object=racks[0], assigned_object=racks[0],
created_by=users[1], created_by=users[1],
kind=JournalEntryKindChoices.KIND_SUCCESS, kind=JournalEntryKindChoices.KIND_SUCCESS,
comments='New journal entry' comments='foobar5'
), ),
JournalEntry( JournalEntry(
assigned_object=racks[1], assigned_object=racks[1],
created_by=users[2], created_by=users[2],
kind=JournalEntryKindChoices.KIND_WARNING, kind=JournalEntryKindChoices.KIND_WARNING,
comments='New journal entry' comments='foobar6'
), ),
) )
JournalEntry.objects.bulk_create(journal_entries) JournalEntry.objects.bulk_create(journal_entries)
def test_q(self):
params = {'q': 'foobar1'}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
def test_created_by(self): def test_created_by(self):
users = User.objects.filter(username__in=['Alice', 'Bob']) users = User.objects.filter(username__in=['Alice', 'Bob'])
params = {'created_by': [users[0].username, users[1].username]} params = {'created_by': [users[0].username, users[1].username]}
@ -890,9 +938,10 @@ class ConfigContextTestCase(TestCase, ChangeLoggedFilterSetTests):
for i in range(0, 3): for i in range(0, 3):
is_active = bool(i % 2) is_active = bool(i % 2)
c = ConfigContext.objects.create( c = ConfigContext.objects.create(
name='Config Context {}'.format(i + 1), name=f"Config Context {i + 1}",
is_active=is_active, is_active=is_active,
data='{"foo": 123}' data='{"foo": 123}',
description=f"foobar{i + 1}"
) )
c.regions.set([regions[i]]) c.regions.set([regions[i]])
c.site_groups.set([site_groups[i]]) c.site_groups.set([site_groups[i]])
@ -908,6 +957,10 @@ class ConfigContextTestCase(TestCase, ChangeLoggedFilterSetTests):
c.tenants.set([tenants[i]]) c.tenants.set([tenants[i]])
c.tags.set([tags[i]]) c.tags.set([tags[i]])
def test_q(self):
params = {'q': 'foobar1'}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
def test_name(self): def test_name(self):
params = {'name': ['Config Context 1', 'Config Context 2']} params = {'name': ['Config Context 1', 'Config Context 2']}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
@ -918,6 +971,10 @@ class ConfigContextTestCase(TestCase, ChangeLoggedFilterSetTests):
params = {'is_active': False} params = {'is_active': False}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
def test_description(self):
params = {'description': ['foobar1', 'foobar2']}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
def test_region(self): def test_region(self):
regions = Region.objects.all()[:2] regions = Region.objects.all()[:2]
params = {'region_id': [regions[0].pk, regions[1].pk]} params = {'region_id': [regions[0].pk, regions[1].pk]}
@ -1019,6 +1076,10 @@ class ConfigTemplateTestCase(TestCase, BaseFilterSetTests):
) )
ConfigTemplate.objects.bulk_create(config_templates) ConfigTemplate.objects.bulk_create(config_templates)
def test_q(self):
params = {'q': 'foobar1'}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
def test_name(self): def test_name(self):
params = {'name': ['Config Template 1', 'Config Template 2']} params = {'name': ['Config Template 1', 'Config Template 2']}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
@ -1055,6 +1116,10 @@ class TagTestCase(TestCase, ChangeLoggedFilterSetTests):
site.tags.set([tags[0]]) site.tags.set([tags[0]])
provider.tags.set([tags[1]]) provider.tags.set([tags[1]])
def test_q(self):
params = {'q': 'foobar1'}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
def test_name(self): def test_name(self):
params = {'name': ['Tag 1', 'Tag 2']} params = {'name': ['Tag 1', 'Tag 2']}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
@ -1166,6 +1231,10 @@ class ObjectChangeTestCase(TestCase, BaseFilterSetTests):
) )
ObjectChange.objects.bulk_create(object_changes) ObjectChange.objects.bulk_create(object_changes)
def test_q(self):
params = {'q': 'Site 1'}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 3)
def test_user(self): def test_user(self):
params = {'user_id': User.objects.filter(username__in=['user1', 'user2']).values_list('pk', flat=True)} params = {'user_id': User.objects.filter(username__in=['user1', 'user2']).values_list('pk', flat=True)}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)

View File

@ -758,7 +758,7 @@ class FHRPGroupFilterSet(NetBoxModelFilterSet):
class Meta: class Meta:
model = FHRPGroup model = FHRPGroup
fields = ['id', 'group_id', 'name', 'auth_key'] fields = ['id', 'group_id', 'name', 'auth_key', 'description']
def search(self, queryset, name, value): def search(self, queryset, name, value):
if not value.strip(): if not value.strip():
@ -1008,12 +1008,15 @@ class ServiceTemplateFilterSet(NetBoxModelFilterSet):
class Meta: class Meta:
model = ServiceTemplate model = ServiceTemplate
fields = ['id', 'name', 'protocol'] fields = ['id', 'name', 'protocol', 'description']
def search(self, queryset, name, value): def search(self, queryset, name, value):
if not value.strip(): if not value.strip():
return queryset return queryset
qs_filter = Q(name__icontains=value) | Q(description__icontains=value) qs_filter = (
Q(name__icontains=value) |
Q(description__icontains=value)
)
return queryset.filter(qs_filter) return queryset.filter(qs_filter)

View File

@ -873,11 +873,9 @@ class IPAddress(PrimaryModel):
is_primary = True is_primary = True
if is_primary and (parent != original_parent): if is_primary and (parent != original_parent):
raise ValidationError({ raise ValidationError(
'assigned_object': _( _("Cannot reassign IP address while it is designated as the primary IP for the parent object")
"Cannot reassign IP address while it is designated as the primary IP for the parent object" )
)
})
# Validate IP status selection # Validate IP status selection
if self.status == IPAddressStatusChoices.STATUS_SLAAC and self.family != 6: if self.status == IPAddressStatusChoices.STATUS_SLAAC and self.family != 6:

View File

@ -39,7 +39,7 @@ class ASNRangeTestCase(TestCase, ChangeLoggedFilterSetTests):
tenant=None, tenant=None,
start=65000, start=65000,
end=65009, end=65009,
description='aaa' description='foobar1'
), ),
ASNRange( ASNRange(
name='ASN Range 2', name='ASN Range 2',
@ -48,7 +48,7 @@ class ASNRangeTestCase(TestCase, ChangeLoggedFilterSetTests):
tenant=tenants[0], tenant=tenants[0],
start=65010, start=65010,
end=65019, end=65019,
description='bbb' description='foobar2'
), ),
ASNRange( ASNRange(
name='ASN Range 3', name='ASN Range 3',
@ -57,11 +57,15 @@ class ASNRangeTestCase(TestCase, ChangeLoggedFilterSetTests):
tenant=tenants[1], tenant=tenants[1],
start=65020, start=65020,
end=65029, end=65029,
description='ccc' description='foobar3'
), ),
) )
ASNRange.objects.bulk_create(asn_ranges) ASNRange.objects.bulk_create(asn_ranges)
def test_q(self):
params = {'q': 'foobar1'}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
def test_name(self): def test_name(self):
params = {'name': ['ASN Range 1', 'ASN Range 2']} params = {'name': ['ASN Range 1', 'ASN Range 2']}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
@ -89,7 +93,7 @@ class ASNRangeTestCase(TestCase, ChangeLoggedFilterSetTests):
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
def test_description(self): def test_description(self):
params = {'description': ['aaa', 'bbb']} params = {'description': ['foobar1', 'foobar2']}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
@ -123,9 +127,9 @@ class ASNTestCase(TestCase, ChangeLoggedFilterSetTests):
Tenant.objects.bulk_create(tenants) Tenant.objects.bulk_create(tenants)
asns = ( asns = (
ASN(asn=65001, rir=rirs[0], tenant=tenants[0], description='aaa'), ASN(asn=65001, rir=rirs[0], tenant=tenants[0], description='foobar1'),
ASN(asn=65002, rir=rirs[1], tenant=tenants[1], description='bbb'), ASN(asn=65002, rir=rirs[1], tenant=tenants[1], description='foobar2'),
ASN(asn=65003, rir=rirs[2], tenant=tenants[2], description='ccc'), ASN(asn=65003, rir=rirs[2], tenant=tenants[2], description='foobar3'),
ASN(asn=4200000000, rir=rirs[0], tenant=tenants[0]), ASN(asn=4200000000, rir=rirs[0], tenant=tenants[0]),
ASN(asn=4200000001, rir=rirs[1], tenant=tenants[1]), ASN(asn=4200000001, rir=rirs[1], tenant=tenants[1]),
ASN(asn=4200000002, rir=rirs[2], tenant=tenants[2]), ASN(asn=4200000002, rir=rirs[2], tenant=tenants[2]),
@ -139,6 +143,10 @@ class ASNTestCase(TestCase, ChangeLoggedFilterSetTests):
asns[4].sites.set([sites[1]]) asns[4].sites.set([sites[1]])
asns[5].sites.set([sites[2]]) asns[5].sites.set([sites[2]])
def test_q(self):
params = {'q': 'foobar1'}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
def test_asn(self): def test_asn(self):
params = {'asn': [65001, 4200000000]} params = {'asn': [65001, 4200000000]}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
@ -165,7 +173,7 @@ class ASNTestCase(TestCase, ChangeLoggedFilterSetTests):
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
def test_description(self): def test_description(self):
params = {'description': ['aaa', 'bbb']} params = {'description': ['foobar1', 'foobar2']}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
@ -214,6 +222,10 @@ class VRFTestCase(TestCase, ChangeLoggedFilterSetTests):
vrfs[2].import_targets.add(route_targets[2]) vrfs[2].import_targets.add(route_targets[2])
vrfs[2].export_targets.add(route_targets[2]) vrfs[2].export_targets.add(route_targets[2])
def test_q(self):
params = {'q': 'foobar1'}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
def test_name(self): def test_name(self):
params = {'name': ['VRF 1', 'VRF 2']} params = {'name': ['VRF 1', 'VRF 2']}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
@ -310,6 +322,10 @@ class RouteTargetTestCase(TestCase, ChangeLoggedFilterSetTests):
vrfs[1].import_targets.add(route_targets[4], route_targets[5]) vrfs[1].import_targets.add(route_targets[4], route_targets[5])
vrfs[1].export_targets.add(route_targets[6], route_targets[7]) vrfs[1].export_targets.add(route_targets[6], route_targets[7])
def test_q(self):
params = {'q': 'foobar1'}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
def test_name(self): def test_name(self):
params = {'name': ['65000:1001', '65000:1002', '65000:1003']} params = {'name': ['65000:1001', '65000:1002', '65000:1003']}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 3) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 3)
@ -355,15 +371,19 @@ class RIRTestCase(TestCase, ChangeLoggedFilterSetTests):
def setUpTestData(cls): def setUpTestData(cls):
rirs = ( rirs = (
RIR(name='RIR 1', slug='rir-1', is_private=False, description='A'), RIR(name='RIR 1', slug='rir-1', is_private=False, description='foobar1'),
RIR(name='RIR 2', slug='rir-2', is_private=False, description='B'), RIR(name='RIR 2', slug='rir-2', is_private=False, description='foobar2'),
RIR(name='RIR 3', slug='rir-3', is_private=False, description='C'), RIR(name='RIR 3', slug='rir-3', is_private=False, description='foobar3'),
RIR(name='RIR 4', slug='rir-4', is_private=True, description='D'), RIR(name='RIR 4', slug='rir-4', is_private=True),
RIR(name='RIR 5', slug='rir-5', is_private=True, description='E'), RIR(name='RIR 5', slug='rir-5', is_private=True),
RIR(name='RIR 6', slug='rir-6', is_private=True, description='F'), RIR(name='RIR 6', slug='rir-6', is_private=True),
) )
RIR.objects.bulk_create(rirs) RIR.objects.bulk_create(rirs)
def test_q(self):
params = {'q': 'foobar1'}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
def test_name(self): def test_name(self):
params = {'name': ['RIR 1', 'RIR 2']} params = {'name': ['RIR 1', 'RIR 2']}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
@ -373,7 +393,7 @@ class RIRTestCase(TestCase, ChangeLoggedFilterSetTests):
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
def test_description(self): def test_description(self):
params = {'description': ['A', 'B']} params = {'description': ['foobar1', 'foobar2']}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
def test_is_private(self): def test_is_private(self):
@ -422,6 +442,10 @@ class AggregateTestCase(TestCase, ChangeLoggedFilterSetTests):
) )
Aggregate.objects.bulk_create(aggregates) Aggregate.objects.bulk_create(aggregates)
def test_q(self):
params = {'q': 'foobar1'}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
def test_family(self): def test_family(self):
params = {'family': '4'} params = {'family': '4'}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 3) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 3)
@ -475,6 +499,10 @@ class RoleTestCase(TestCase, ChangeLoggedFilterSetTests):
) )
Role.objects.bulk_create(roles) Role.objects.bulk_create(roles)
def test_q(self):
params = {'q': 'foobar1'}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
def test_name(self): def test_name(self):
params = {'name': ['Role 1', 'Role 2']} params = {'name': ['Role 1', 'Role 2']}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
@ -579,6 +607,10 @@ class PrefixTestCase(TestCase, ChangeLoggedFilterSetTests):
for prefix in prefixes: for prefix in prefixes:
prefix.save() prefix.save()
def test_q(self):
params = {'q': 'foobar1'}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
def test_family(self): def test_family(self):
params = {'family': '6'} params = {'family': '6'}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 5) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 5)
@ -745,17 +777,87 @@ class IPRangeTestCase(TestCase, ChangeLoggedFilterSetTests):
Tenant.objects.bulk_create(tenants) Tenant.objects.bulk_create(tenants)
ip_ranges = ( ip_ranges = (
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, description='foobar1'), IPRange(
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, description='foobar2'), start_address='10.0.1.100/24',
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), end_address='10.0.1.199/24',
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), size=100,
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), vrf=None,
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), tenant=None,
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), role=None,
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), status=IPRangeStatusChoices.STATUS_ACTIVE,
description='foobar1'
),
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,
description='foobar2'
),
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
),
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
),
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
),
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
),
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
),
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
),
) )
IPRange.objects.bulk_create(ip_ranges) IPRange.objects.bulk_create(ip_ranges)
def test_q(self):
params = {'q': 'foobar1'}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
def test_family(self): def test_family(self):
params = {'family': '6'} params = {'family': '6'}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
@ -889,21 +991,111 @@ class IPAddressTestCase(TestCase, ChangeLoggedFilterSetTests):
Tenant.objects.bulk_create(tenants) Tenant.objects.bulk_create(tenants)
ipaddresses = ( ipaddresses = (
IPAddress(address='10.0.0.1/24', tenant=None, vrf=None, assigned_object=None, status=IPAddressStatusChoices.STATUS_ACTIVE, dns_name='ipaddress-a', description='foobar1'), IPAddress(
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'), address='10.0.0.1/24',
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'), tenant=None,
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'), vrf=None,
IPAddress(address='10.0.0.5/24', tenant=None, vrf=None, assigned_object=fhrp_groups[0], status=IPAddressStatusChoices.STATUS_ACTIVE), assigned_object=None,
IPAddress(address='10.0.0.1/25', tenant=None, vrf=None, assigned_object=None, status=IPAddressStatusChoices.STATUS_ACTIVE), status=IPAddressStatusChoices.STATUS_ACTIVE,
IPAddress(address='2001:db8::1/64', tenant=None, vrf=None, assigned_object=None, status=IPAddressStatusChoices.STATUS_ACTIVE, dns_name='ipaddress-a', description='foobar2'), dns_name='ipaddress-a',
IPAddress(address='2001:db8::2/64', tenant=tenants[0], vrf=vrfs[0], assigned_object=vminterfaces[0], status=IPAddressStatusChoices.STATUS_ACTIVE, dns_name='ipaddress-b'), description='foobar1'
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'), ),
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'), IPAddress(
IPAddress(address='2001:db8::5/64', tenant=None, vrf=None, assigned_object=fhrp_groups[1], status=IPAddressStatusChoices.STATUS_ACTIVE), address='10.0.0.2/24',
IPAddress(address='2001:db8::1/65', tenant=None, vrf=None, assigned_object=None, status=IPAddressStatusChoices.STATUS_ACTIVE), tenant=tenants[0],
vrf=vrfs[0],
assigned_object=interfaces[0],
status=IPAddressStatusChoices.STATUS_ACTIVE,
dns_name='ipaddress-b'
),
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'
),
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'
),
IPAddress(
address='10.0.0.5/24',
tenant=None,
vrf=None,
assigned_object=fhrp_groups[0],
status=IPAddressStatusChoices.STATUS_ACTIVE
),
IPAddress(
address='10.0.0.1/25',
tenant=None,
vrf=None,
assigned_object=None,
status=IPAddressStatusChoices.STATUS_ACTIVE
),
IPAddress(
address='2001:db8::1/64',
tenant=None,
vrf=None,
assigned_object=None,
status=IPAddressStatusChoices.STATUS_ACTIVE,
dns_name='ipaddress-a',
description='foobar2'
),
IPAddress(
address='2001:db8::2/64',
tenant=tenants[0],
vrf=vrfs[0],
assigned_object=vminterfaces[0],
status=IPAddressStatusChoices.STATUS_ACTIVE,
dns_name='ipaddress-b'
),
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'
),
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'
),
IPAddress(
address='2001:db8::5/64',
tenant=None,
vrf=None,
assigned_object=fhrp_groups[1],
status=IPAddressStatusChoices.STATUS_ACTIVE
),
IPAddress(
address='2001:db8::1/65',
tenant=None,
vrf=None,
assigned_object=None,
status=IPAddressStatusChoices.STATUS_ACTIVE
),
) )
IPAddress.objects.bulk_create(ipaddresses) IPAddress.objects.bulk_create(ipaddresses)
def test_q(self):
params = {'q': 'foobar1'}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
def test_family(self): def test_family(self):
params = {'family': '4'} params = {'family': '4'}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 6) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 6)
@ -1055,15 +1247,36 @@ class FHRPGroupTestCase(TestCase, ChangeLoggedFilterSetTests):
IPAddress.objects.bulk_create(ip_addresses) IPAddress.objects.bulk_create(ip_addresses)
fhrp_groups = ( fhrp_groups = (
FHRPGroup(protocol=FHRPGroupProtocolChoices.PROTOCOL_VRRP2, group_id=10, auth_type=FHRPGroupAuthTypeChoices.AUTHENTICATION_PLAINTEXT, auth_key='foo123'), FHRPGroup(
FHRPGroup(protocol=FHRPGroupProtocolChoices.PROTOCOL_VRRP3, group_id=20, auth_type=FHRPGroupAuthTypeChoices.AUTHENTICATION_MD5, auth_key='bar456', name='bar123'), protocol=FHRPGroupProtocolChoices.PROTOCOL_VRRP2,
FHRPGroup(protocol=FHRPGroupProtocolChoices.PROTOCOL_HSRP, group_id=30), group_id=10,
auth_type=FHRPGroupAuthTypeChoices.AUTHENTICATION_PLAINTEXT,
auth_key='foo123',
description='foobar1'
),
FHRPGroup(
protocol=FHRPGroupProtocolChoices.PROTOCOL_VRRP3,
group_id=20,
auth_type=FHRPGroupAuthTypeChoices.AUTHENTICATION_MD5,
auth_key='bar456',
name='bar123',
description='foobar2'
),
FHRPGroup(
protocol=FHRPGroupProtocolChoices.PROTOCOL_HSRP,
group_id=30,
description='foobar3'
),
) )
FHRPGroup.objects.bulk_create(fhrp_groups) FHRPGroup.objects.bulk_create(fhrp_groups)
fhrp_groups[0].ip_addresses.set([ip_addresses[0]]) fhrp_groups[0].ip_addresses.set([ip_addresses[0]])
fhrp_groups[1].ip_addresses.set([ip_addresses[1]]) fhrp_groups[1].ip_addresses.set([ip_addresses[1]])
fhrp_groups[2].ip_addresses.set([ip_addresses[2]]) fhrp_groups[2].ip_addresses.set([ip_addresses[2]])
def test_q(self):
params = {'q': 'foobar1'}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
def test_protocol(self): def test_protocol(self):
params = {'protocol': [FHRPGroupProtocolChoices.PROTOCOL_VRRP2, FHRPGroupProtocolChoices.PROTOCOL_VRRP3]} params = {'protocol': [FHRPGroupProtocolChoices.PROTOCOL_VRRP2, FHRPGroupProtocolChoices.PROTOCOL_VRRP3]}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
@ -1084,6 +1297,10 @@ class FHRPGroupTestCase(TestCase, ChangeLoggedFilterSetTests):
params = {'name': ['bar123', ]} params = {'name': ['bar123', ]}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
def test_description(self):
params = {'description': ['foobar1', 'foobar2']}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
def test_related_ip(self): def test_related_ip(self):
# Create some regular IPs to query for related IPs # Create some regular IPs to query for related IPs
ipaddresses = ( ipaddresses = (
@ -1199,17 +1416,21 @@ class VLANGroupTestCase(TestCase, ChangeLoggedFilterSetTests):
cluster.save() cluster.save()
vlan_groups = ( vlan_groups = (
VLANGroup(name='VLAN Group 1', slug='vlan-group-1', scope=region, description='A'), VLANGroup(name='VLAN Group 1', slug='vlan-group-1', scope=region, description='foobar1'),
VLANGroup(name='VLAN Group 2', slug='vlan-group-2', scope=sitegroup, description='B'), VLANGroup(name='VLAN Group 2', slug='vlan-group-2', scope=sitegroup, description='foobar2'),
VLANGroup(name='VLAN Group 3', slug='vlan-group-3', scope=site, description='C'), VLANGroup(name='VLAN Group 3', slug='vlan-group-3', scope=site, description='foobar3'),
VLANGroup(name='VLAN Group 4', slug='vlan-group-4', scope=location, description='D'), VLANGroup(name='VLAN Group 4', slug='vlan-group-4', scope=location),
VLANGroup(name='VLAN Group 5', slug='vlan-group-5', scope=rack, description='E'), VLANGroup(name='VLAN Group 5', slug='vlan-group-5', scope=rack),
VLANGroup(name='VLAN Group 6', slug='vlan-group-6', scope=clustergroup, description='F'), VLANGroup(name='VLAN Group 6', slug='vlan-group-6', scope=clustergroup),
VLANGroup(name='VLAN Group 7', slug='vlan-group-7', scope=cluster, description='G'), VLANGroup(name='VLAN Group 7', slug='vlan-group-7', scope=cluster),
VLANGroup(name='VLAN Group 8', slug='vlan-group-8'), VLANGroup(name='VLAN Group 8', slug='vlan-group-8'),
) )
VLANGroup.objects.bulk_create(vlan_groups) VLANGroup.objects.bulk_create(vlan_groups)
def test_q(self):
params = {'q': 'foobar1'}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
def test_name(self): def test_name(self):
params = {'name': ['VLAN Group 1', 'VLAN Group 2']} params = {'name': ['VLAN Group 1', 'VLAN Group 2']}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
@ -1219,7 +1440,7 @@ class VLANGroupTestCase(TestCase, ChangeLoggedFilterSetTests):
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
def test_description(self): def test_description(self):
params = {'description': ['A', 'B']} params = {'description': ['foobar1', 'foobar2']}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
def test_region(self): def test_region(self):
@ -1424,6 +1645,10 @@ class VLANTestCase(TestCase, ChangeLoggedFilterSetTests):
) )
VLAN.objects.bulk_create(vlans) VLAN.objects.bulk_create(vlans)
def test_q(self):
params = {'q': 'foobar1'}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
def test_name(self): def test_name(self):
params = {'name': ['VLAN 101', 'VLAN 102']} params = {'name': ['VLAN 101', 'VLAN 102']}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
@ -1512,15 +1737,46 @@ class ServiceTemplateTestCase(TestCase, ChangeLoggedFilterSetTests):
@classmethod @classmethod
def setUpTestData(cls): def setUpTestData(cls):
service_templates = ( service_templates = (
ServiceTemplate(name='Service Template 1', protocol=ServiceProtocolChoices.PROTOCOL_TCP, ports=[1001]), ServiceTemplate(
ServiceTemplate(name='Service Template 2', protocol=ServiceProtocolChoices.PROTOCOL_TCP, ports=[1002]), name='Service Template 1',
ServiceTemplate(name='Service Template 3', protocol=ServiceProtocolChoices.PROTOCOL_UDP, ports=[1003]), protocol=ServiceProtocolChoices.PROTOCOL_TCP,
ServiceTemplate(name='Service Template 4', protocol=ServiceProtocolChoices.PROTOCOL_TCP, ports=[2001]), ports=[1001],
ServiceTemplate(name='Service Template 5', protocol=ServiceProtocolChoices.PROTOCOL_TCP, ports=[2002]), description='foobar1'
ServiceTemplate(name='Service Template 6', protocol=ServiceProtocolChoices.PROTOCOL_UDP, ports=[2003]), ),
ServiceTemplate(
name='Service Template 2',
protocol=ServiceProtocolChoices.PROTOCOL_TCP,
ports=[1002],
description='foobar2'
),
ServiceTemplate(
name='Service Template 3',
protocol=ServiceProtocolChoices.PROTOCOL_UDP,
ports=[1003],
description='foobar3'
),
ServiceTemplate(
name='Service Template 4',
protocol=ServiceProtocolChoices.PROTOCOL_TCP,
ports=[2001]
),
ServiceTemplate(
name='Service Template 5',
protocol=ServiceProtocolChoices.PROTOCOL_TCP,
ports=[2002]
),
ServiceTemplate(
name='Service Template 6',
protocol=ServiceProtocolChoices.PROTOCOL_UDP,
ports=[2003]
),
) )
ServiceTemplate.objects.bulk_create(service_templates) ServiceTemplate.objects.bulk_create(service_templates)
def test_q(self):
params = {'q': 'foobar1'}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
def test_name(self): def test_name(self):
params = {'name': ['Service Template 1', 'Service Template 2']} params = {'name': ['Service Template 1', 'Service Template 2']}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
@ -1533,6 +1789,10 @@ class ServiceTemplateTestCase(TestCase, ChangeLoggedFilterSetTests):
params = {'port': '1001'} params = {'port': '1001'}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
def test_description(self):
params = {'description': ['foobar1', 'foobar2']}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
class ServiceTestCase(TestCase, ChangeLoggedFilterSetTests): class ServiceTestCase(TestCase, ChangeLoggedFilterSetTests):
queryset = Service.objects.all() queryset = Service.objects.all()
@ -1589,6 +1849,10 @@ class ServiceTestCase(TestCase, ChangeLoggedFilterSetTests):
services[1].ipaddresses.add(ip_addresses[1]) services[1].ipaddresses.add(ip_addresses[1])
services[2].ipaddresses.add(ip_addresses[2]) services[2].ipaddresses.add(ip_addresses[2])
def test_q(self):
params = {'q': 'foobar1'}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
def test_name(self): def test_name(self):
params = {'name': ['Service 1', 'Service 2']} params = {'name': ['Service 1', 'Service 2']}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)

View File

@ -315,5 +315,6 @@ class OrganizationalModelFilterSet(NetBoxModelFilterSet):
return queryset return queryset
return queryset.filter( return queryset.filter(
models.Q(name__icontains=value) | models.Q(name__icontains=value) |
models.Q(slug__icontains=value) models.Q(slug__icontains=value) |
models.Q(description__icontains=value)
) )

View File

@ -64,7 +64,7 @@ class ContactFilterSet(NetBoxModelFilterSet):
class Meta: class Meta:
model = Contact model = Contact
fields = ['id', 'name', 'title', 'phone', 'email', 'address', 'link'] fields = ['id', 'name', 'title', 'phone', 'email', 'address', 'link', 'description']
def search(self, queryset, name, value): def search(self, queryset, name, value):
if not value.strip(): if not value.strip():
@ -76,6 +76,7 @@ class ContactFilterSet(NetBoxModelFilterSet):
Q(email__icontains=value) | Q(email__icontains=value) |
Q(address__icontains=value) | Q(address__icontains=value) |
Q(link__icontains=value) | Q(link__icontains=value) |
Q(description__icontains=value) |
Q(comments__icontains=value) Q(comments__icontains=value)
) )

View File

@ -23,13 +23,32 @@ class TenantGroupTestCase(TestCase, ChangeLoggedFilterSetTests):
tenantgroup.save() tenantgroup.save()
tenant_groups = ( tenant_groups = (
TenantGroup(name='Tenant Group 1', slug='tenant-group-1', parent=parent_tenant_groups[0], description='A'), TenantGroup(
TenantGroup(name='Tenant Group 2', slug='tenant-group-2', parent=parent_tenant_groups[1], description='B'), name='Tenant Group 1',
TenantGroup(name='Tenant Group 3', slug='tenant-group-3', parent=parent_tenant_groups[2], description='C'), slug='tenant-group-1',
parent=parent_tenant_groups[0],
description='foobar1'
),
TenantGroup(
name='Tenant Group 2',
slug='tenant-group-2',
parent=parent_tenant_groups[1],
description='foobar2'
),
TenantGroup(
name='Tenant Group 3',
slug='tenant-group-3',
parent=parent_tenant_groups[2],
description='foobar3'
),
) )
for tenantgroup in tenant_groups: for tenantgroup in tenant_groups:
tenantgroup.save() tenantgroup.save()
def test_q(self):
params = {'q': 'foobar1'}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
def test_name(self): def test_name(self):
params = {'name': ['Tenant Group 1', 'Tenant Group 2']} params = {'name': ['Tenant Group 1', 'Tenant Group 2']}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
@ -39,7 +58,7 @@ class TenantGroupTestCase(TestCase, ChangeLoggedFilterSetTests):
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
def test_description(self): def test_description(self):
params = {'description': ['A', 'B']} params = {'description': ['foobar1', 'foobar2']}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
def test_parent(self): def test_parent(self):
@ -68,10 +87,14 @@ class TenantTestCase(TestCase, ChangeLoggedFilterSetTests):
tenants = ( tenants = (
Tenant(name='Tenant 1', slug='tenant-1', group=tenant_groups[0], description='foobar1'), Tenant(name='Tenant 1', slug='tenant-1', group=tenant_groups[0], description='foobar1'),
Tenant(name='Tenant 2', slug='tenant-2', group=tenant_groups[1], description='foobar2'), Tenant(name='Tenant 2', slug='tenant-2', group=tenant_groups[1], description='foobar2'),
Tenant(name='Tenant 3', slug='tenant-3', group=tenant_groups[2]), Tenant(name='Tenant 3', slug='tenant-3', group=tenant_groups[2], description='foobar3'),
) )
Tenant.objects.bulk_create(tenants) Tenant.objects.bulk_create(tenants)
def test_q(self):
params = {'q': 'foobar1'}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
def test_name(self): def test_name(self):
params = {'name': ['Tenant 1', 'Tenant 2']} params = {'name': ['Tenant 1', 'Tenant 2']}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
@ -108,13 +131,32 @@ class ContactGroupTestCase(TestCase, ChangeLoggedFilterSetTests):
contactgroup.save() contactgroup.save()
contact_groups = ( contact_groups = (
ContactGroup(name='Contact Group 1', slug='contact-group-1', parent=parent_contact_groups[0], description='A'), ContactGroup(
ContactGroup(name='Contact Group 2', slug='contact-group-2', parent=parent_contact_groups[1], description='B'), name='Contact Group 1',
ContactGroup(name='Contact Group 3', slug='contact-group-3', parent=parent_contact_groups[2], description='C'), slug='contact-group-1',
parent=parent_contact_groups[0],
description='foobar1'
),
ContactGroup(
name='Contact Group 2',
slug='contact-group-2',
parent=parent_contact_groups[1],
description='foobar2'
),
ContactGroup(
name='Contact Group 3',
slug='contact-group-3',
parent=parent_contact_groups[2],
description='foobar3'
),
) )
for contactgroup in contact_groups: for contactgroup in contact_groups:
contactgroup.save() contactgroup.save()
def test_q(self):
params = {'q': 'foobar1'}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
def test_name(self): def test_name(self):
params = {'name': ['Contact Group 1', 'Contact Group 2']} params = {'name': ['Contact Group 1', 'Contact Group 2']}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
@ -124,7 +166,7 @@ class ContactGroupTestCase(TestCase, ChangeLoggedFilterSetTests):
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
def test_description(self): def test_description(self):
params = {'description': ['A', 'B']} params = {'description': ['foobar1', 'foobar2']}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
def test_parent(self): def test_parent(self):
@ -145,10 +187,14 @@ class ContactRoleTestCase(TestCase, ChangeLoggedFilterSetTests):
contact_roles = ( contact_roles = (
ContactRole(name='Contact Role 1', slug='contact-role-1', description='foobar1'), ContactRole(name='Contact Role 1', slug='contact-role-1', description='foobar1'),
ContactRole(name='Contact Role 2', slug='contact-role-2', description='foobar2'), ContactRole(name='Contact Role 2', slug='contact-role-2', description='foobar2'),
ContactRole(name='Contact Role 3', slug='contact-role-3'), ContactRole(name='Contact Role 3', slug='contact-role-3', description='foobar3'),
) )
ContactRole.objects.bulk_create(contact_roles) ContactRole.objects.bulk_create(contact_roles)
def test_q(self):
params = {'q': 'foobar1'}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
def test_name(self): def test_name(self):
params = {'name': ['Contact Role 1', 'Contact Role 2']} params = {'name': ['Contact Role 1', 'Contact Role 2']}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
@ -178,16 +224,24 @@ class ContactTestCase(TestCase, ChangeLoggedFilterSetTests):
contactgroup.save() contactgroup.save()
contacts = ( contacts = (
Contact(name='Contact 1', group=contact_groups[0]), Contact(name='Contact 1', group=contact_groups[0], description='foobar1'),
Contact(name='Contact 2', group=contact_groups[1]), Contact(name='Contact 2', group=contact_groups[1], description='foobar2'),
Contact(name='Contact 3', group=contact_groups[2]), Contact(name='Contact 3', group=contact_groups[2], description='foobar3'),
) )
Contact.objects.bulk_create(contacts) Contact.objects.bulk_create(contacts)
def test_q(self):
params = {'q': 'foobar1'}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
def test_name(self): def test_name(self):
params = {'name': ['Contact 1', 'Contact 2']} params = {'name': ['Contact 1', 'Contact 2']}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
def test_description(self):
params = {'description': ['foobar1', 'foobar2']}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
def test_group(self): def test_group(self):
group = ContactGroup.objects.all()[:2] group = ContactGroup.objects.all()[:2]
params = {'group_id': [group[0].pk, group[1].pk]} params = {'group_id': [group[0].pk, group[1].pk]}

View File

@ -67,6 +67,10 @@ class UserTestCase(TestCase, BaseFilterSetTests):
users[1].groups.set([groups[1]]) users[1].groups.set([groups[1]])
users[2].groups.set([groups[2]]) users[2].groups.set([groups[2]])
def test_q(self):
params = {'q': 'user1'}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
def test_username(self): def test_username(self):
params = {'username': ['User1', 'User2']} params = {'username': ['User1', 'User2']}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
@ -117,6 +121,10 @@ class GroupTestCase(TestCase, BaseFilterSetTests):
) )
Group.objects.bulk_create(groups) Group.objects.bulk_create(groups)
def test_q(self):
params = {'q': 'group 1'}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
def test_name(self): def test_name(self):
params = {'name': ['Group 1', 'Group 2']} params = {'name': ['Group 1', 'Group 2']}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
@ -164,6 +172,10 @@ class ObjectPermissionTestCase(TestCase, BaseFilterSetTests):
permissions[i].users.set([users[i]]) permissions[i].users.set([users[i]])
permissions[i].object_types.set([object_types[i]]) permissions[i].object_types.set([object_types[i]])
def test_q(self):
params = {'q': 'foobar1'}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
def test_name(self): def test_name(self):
params = {'name': ['Permission 1', 'Permission 2']} params = {'name': ['Permission 1', 'Permission 2']}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
@ -235,6 +247,10 @@ class TokenTestCase(TestCase, BaseFilterSetTests):
) )
Token.objects.bulk_create(tokens) Token.objects.bulk_create(tokens)
def test_q(self):
params = {'q': 'foobar1'}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
def test_user(self): def test_user(self):
users = User.objects.order_by('id')[:2] users = User.objects.order_by('id')[:2]
params = {'user_id': [users[0].pk, users[1].pk]} params = {'user_id': [users[0].pk, users[1].pk]}

View File

@ -101,13 +101,14 @@ class ClusterFilterSet(NetBoxModelFilterSet, TenancyFilterSet, ContactModelFilte
class Meta: class Meta:
model = Cluster model = Cluster
fields = ['id', 'name'] fields = ['id', 'name', 'description']
def search(self, queryset, name, value): def search(self, queryset, name, value):
if not value.strip(): if not value.strip():
return queryset return queryset
return queryset.filter( return queryset.filter(
Q(name__icontains=value) | Q(name__icontains=value) |
Q(description__icontains=value) |
Q(comments__icontains=value) Q(comments__icontains=value)
) )
@ -239,13 +240,14 @@ class VirtualMachineFilterSet(
class Meta: class Meta:
model = VirtualMachine model = VirtualMachine
fields = ['id', 'cluster', 'vcpus', 'memory', 'disk'] fields = ['id', 'cluster', 'vcpus', 'memory', 'disk', 'description']
def search(self, queryset, name, value): def search(self, queryset, name, value):
if not value.strip(): if not value.strip():
return queryset return queryset
return queryset.filter( return queryset.filter(
Q(name__icontains=value) | Q(name__icontains=value) |
Q(description__icontains=value) |
Q(comments__icontains=value) | Q(comments__icontains=value) |
Q(primary_ip4__address__startswith=value) | Q(primary_ip4__address__startswith=value) |
Q(primary_ip6__address__startswith=value) Q(primary_ip6__address__startswith=value)

View File

@ -17,12 +17,16 @@ class ClusterTypeTestCase(TestCase, ChangeLoggedFilterSetTests):
def setUpTestData(cls): def setUpTestData(cls):
cluster_types = ( cluster_types = (
ClusterType(name='Cluster Type 1', slug='cluster-type-1', description='A'), ClusterType(name='Cluster Type 1', slug='cluster-type-1', description='foobar1'),
ClusterType(name='Cluster Type 2', slug='cluster-type-2', description='B'), ClusterType(name='Cluster Type 2', slug='cluster-type-2', description='foobar2'),
ClusterType(name='Cluster Type 3', slug='cluster-type-3', description='C'), ClusterType(name='Cluster Type 3', slug='cluster-type-3', description='foobar3'),
) )
ClusterType.objects.bulk_create(cluster_types) ClusterType.objects.bulk_create(cluster_types)
def test_q(self):
params = {'q': 'foobar1'}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
def test_name(self): def test_name(self):
params = {'name': ['Cluster Type 1', 'Cluster Type 2']} params = {'name': ['Cluster Type 1', 'Cluster Type 2']}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
@ -32,7 +36,7 @@ class ClusterTypeTestCase(TestCase, ChangeLoggedFilterSetTests):
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
def test_description(self): def test_description(self):
params = {'description': ['A', 'B']} params = {'description': ['foobar1', 'foobar2']}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
@ -44,12 +48,16 @@ class ClusterGroupTestCase(TestCase, ChangeLoggedFilterSetTests):
def setUpTestData(cls): def setUpTestData(cls):
cluster_groups = ( cluster_groups = (
ClusterGroup(name='Cluster Group 1', slug='cluster-group-1', description='A'), ClusterGroup(name='Cluster Group 1', slug='cluster-group-1', description='foobar1'),
ClusterGroup(name='Cluster Group 2', slug='cluster-group-2', description='B'), ClusterGroup(name='Cluster Group 2', slug='cluster-group-2', description='foobar2'),
ClusterGroup(name='Cluster Group 3', slug='cluster-group-3', description='C'), ClusterGroup(name='Cluster Group 3', slug='cluster-group-3', description='foobar3'),
) )
ClusterGroup.objects.bulk_create(cluster_groups) ClusterGroup.objects.bulk_create(cluster_groups)
def test_q(self):
params = {'q': 'foobar1'}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
def test_name(self): def test_name(self):
params = {'name': ['Cluster Group 1', 'Cluster Group 2']} params = {'name': ['Cluster Group 1', 'Cluster Group 2']}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
@ -59,7 +67,7 @@ class ClusterGroupTestCase(TestCase, ChangeLoggedFilterSetTests):
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
def test_description(self): def test_description(self):
params = {'description': ['A', 'B']} params = {'description': ['foobar1', 'foobar2']}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
@ -123,16 +131,48 @@ class ClusterTestCase(TestCase, ChangeLoggedFilterSetTests):
Tenant.objects.bulk_create(tenants) Tenant.objects.bulk_create(tenants)
clusters = ( clusters = (
Cluster(name='Cluster 1', type=cluster_types[0], group=cluster_groups[0], status=ClusterStatusChoices.STATUS_PLANNED, site=sites[0], tenant=tenants[0]), Cluster(
Cluster(name='Cluster 2', type=cluster_types[1], group=cluster_groups[1], status=ClusterStatusChoices.STATUS_STAGING, site=sites[1], tenant=tenants[1]), name='Cluster 1',
Cluster(name='Cluster 3', type=cluster_types[2], group=cluster_groups[2], status=ClusterStatusChoices.STATUS_ACTIVE, site=sites[2], tenant=tenants[2]), type=cluster_types[0],
group=cluster_groups[0],
status=ClusterStatusChoices.STATUS_PLANNED,
site=sites[0],
tenant=tenants[0],
description='foobar1'
),
Cluster(
name='Cluster 2',
type=cluster_types[1],
group=cluster_groups[1],
status=ClusterStatusChoices.STATUS_STAGING,
site=sites[1],
tenant=tenants[1],
description='foobar2'
),
Cluster(
name='Cluster 3',
type=cluster_types[2],
group=cluster_groups[2],
status=ClusterStatusChoices.STATUS_ACTIVE,
site=sites[2],
tenant=tenants[2],
description='foobar3'
),
) )
Cluster.objects.bulk_create(clusters) Cluster.objects.bulk_create(clusters)
def test_q(self):
params = {'q': 'foobar1'}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
def test_name(self): def test_name(self):
params = {'name': ['Cluster 1', 'Cluster 2']} params = {'name': ['Cluster 1', 'Cluster 2']}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
def test_description(self):
params = {'description': ['foobar1', 'foobar2']}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
def test_region(self): def test_region(self):
regions = Region.objects.all()[:2] regions = Region.objects.all()[:2]
params = {'region_id': [regions[0].pk, regions[1].pk]} params = {'region_id': [regions[0].pk, regions[1].pk]}
@ -274,9 +314,49 @@ class VirtualMachineTestCase(TestCase, ChangeLoggedFilterSetTests):
Tenant.objects.bulk_create(tenants) Tenant.objects.bulk_create(tenants)
vms = ( vms = (
VirtualMachine(name='Virtual Machine 1', site=sites[0], cluster=clusters[0], device=devices[0], platform=platforms[0], role=roles[0], tenant=tenants[0], status=VirtualMachineStatusChoices.STATUS_ACTIVE, vcpus=1, memory=1, disk=1, local_context_data={"foo": 123}), VirtualMachine(
VirtualMachine(name='Virtual Machine 2', site=sites[1], cluster=clusters[1], device=devices[1], platform=platforms[1], role=roles[1], tenant=tenants[1], status=VirtualMachineStatusChoices.STATUS_STAGED, vcpus=2, memory=2, disk=2), name='Virtual Machine 1',
VirtualMachine(name='Virtual Machine 3', site=sites[2], cluster=clusters[2], device=devices[2], platform=platforms[2], role=roles[2], tenant=tenants[2], status=VirtualMachineStatusChoices.STATUS_OFFLINE, vcpus=3, memory=3, disk=3), site=sites[0],
cluster=clusters[0],
device=devices[0],
platform=platforms[0],
role=roles[0],
tenant=tenants[0],
status=VirtualMachineStatusChoices.STATUS_ACTIVE,
vcpus=1,
memory=1,
disk=1,
description='foobar1',
local_context_data={"foo": 123}
),
VirtualMachine(
name='Virtual Machine 2',
site=sites[1],
cluster=clusters[1],
device=devices[1],
platform=platforms[1],
role=roles[1],
tenant=tenants[1],
status=VirtualMachineStatusChoices.STATUS_STAGED,
vcpus=2,
memory=2,
disk=2,
description='foobar2'
),
VirtualMachine(
name='Virtual Machine 3',
site=sites[2],
cluster=clusters[2],
device=devices[2],
platform=platforms[2],
role=roles[2],
tenant=tenants[2],
status=VirtualMachineStatusChoices.STATUS_OFFLINE,
vcpus=3,
memory=3,
disk=3,
description='foobar3'
),
) )
VirtualMachine.objects.bulk_create(vms) VirtualMachine.objects.bulk_create(vms)
@ -300,6 +380,10 @@ class VirtualMachineTestCase(TestCase, ChangeLoggedFilterSetTests):
VirtualMachine.objects.filter(pk=vms[0].pk).update(primary_ip4=ipaddresses[0], primary_ip6=ipaddresses[3]) VirtualMachine.objects.filter(pk=vms[0].pk).update(primary_ip4=ipaddresses[0], primary_ip6=ipaddresses[3])
VirtualMachine.objects.filter(pk=vms[1].pk).update(primary_ip4=ipaddresses[1], primary_ip6=ipaddresses[4]) VirtualMachine.objects.filter(pk=vms[1].pk).update(primary_ip4=ipaddresses[1], primary_ip6=ipaddresses[4])
def test_q(self):
params = {'q': 'foobar1'}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
def test_name(self): def test_name(self):
params = {'name': ['Virtual Machine 1', 'Virtual Machine 2']} params = {'name': ['Virtual Machine 1', 'Virtual Machine 2']}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
@ -307,6 +391,10 @@ class VirtualMachineTestCase(TestCase, ChangeLoggedFilterSetTests):
params = {'name': ['VIRTUAL MACHINE 1', 'VIRTUAL MACHINE 2']} params = {'name': ['VIRTUAL MACHINE 1', 'VIRTUAL MACHINE 2']}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
def test_description(self):
params = {'description': ['foobar1', 'foobar2']}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
def test_vcpus(self): def test_vcpus(self):
params = {'vcpus': [1, 2]} params = {'vcpus': [1, 2]}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
@ -467,12 +555,40 @@ class VMInterfaceTestCase(TestCase, ChangeLoggedFilterSetTests):
VirtualMachine.objects.bulk_create(vms) VirtualMachine.objects.bulk_create(vms)
interfaces = ( interfaces = (
VMInterface(virtual_machine=vms[0], name='Interface 1', enabled=True, mtu=100, mac_address='00-00-00-00-00-01', vrf=vrfs[0], description='foobar1'), VMInterface(
VMInterface(virtual_machine=vms[1], name='Interface 2', enabled=True, mtu=200, mac_address='00-00-00-00-00-02', vrf=vrfs[1], description='foobar2'), virtual_machine=vms[0],
VMInterface(virtual_machine=vms[2], name='Interface 3', enabled=False, mtu=300, mac_address='00-00-00-00-00-03', vrf=vrfs[2]), name='Interface 1',
enabled=True,
mtu=100,
mac_address='00-00-00-00-00-01',
vrf=vrfs[0],
description='foobar1'
),
VMInterface(
virtual_machine=vms[1],
name='Interface 2',
enabled=True,
mtu=200,
mac_address='00-00-00-00-00-02',
vrf=vrfs[1],
description='foobar2'
),
VMInterface(
virtual_machine=vms[2],
name='Interface 3',
enabled=False,
mtu=300,
mac_address='00-00-00-00-00-03',
vrf=vrfs[2],
description='foobar3'
),
) )
VMInterface.objects.bulk_create(interfaces) VMInterface.objects.bulk_create(interfaces)
def test_q(self):
params = {'q': 'foobar1'}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
def test_name(self): def test_name(self):
params = {'name': ['Interface 1', 'Interface 2']} params = {'name': ['Interface 1', 'Interface 2']}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)

View File

@ -654,9 +654,26 @@ class L2VPNTestCase(TestCase, ChangeLoggedFilterSetTests):
RouteTarget.objects.bulk_create(route_targets) RouteTarget.objects.bulk_create(route_targets)
l2vpns = ( l2vpns = (
L2VPN(name='L2VPN 1', slug='l2vpn-1', type=L2VPNTypeChoices.TYPE_VXLAN, identifier=65001), L2VPN(
L2VPN(name='L2VPN 2', slug='l2vpn-2', type=L2VPNTypeChoices.TYPE_VPWS, identifier=65002), name='L2VPN 1',
L2VPN(name='L2VPN 3', slug='l2vpn-3', type=L2VPNTypeChoices.TYPE_VPLS), slug='l2vpn-1',
type=L2VPNTypeChoices.TYPE_VXLAN,
identifier=65001,
description='foobar1'
),
L2VPN(
name='L2VPN 2',
slug='l2vpn-2',
type=L2VPNTypeChoices.TYPE_VPWS,
identifier=65002,
description='foobar2'
),
L2VPN(
name='L2VPN 3',
slug='l2vpn-3',
type=L2VPNTypeChoices.TYPE_VPLS,
description='foobar3'
),
) )
L2VPN.objects.bulk_create(l2vpns) L2VPN.objects.bulk_create(l2vpns)
l2vpns[0].import_targets.add(route_targets[0]) l2vpns[0].import_targets.add(route_targets[0])
@ -666,6 +683,10 @@ class L2VPNTestCase(TestCase, ChangeLoggedFilterSetTests):
l2vpns[1].export_targets.add(route_targets[4]) l2vpns[1].export_targets.add(route_targets[4])
l2vpns[2].export_targets.add(route_targets[5]) l2vpns[2].export_targets.add(route_targets[5])
def test_q(self):
params = {'q': 'foobar1'}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
def test_name(self): def test_name(self):
params = {'name': ['L2VPN 1', 'L2VPN 2']} params = {'name': ['L2VPN 1', 'L2VPN 2']}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
@ -682,6 +703,10 @@ class L2VPNTestCase(TestCase, ChangeLoggedFilterSetTests):
params = {'type': [L2VPNTypeChoices.TYPE_VXLAN, L2VPNTypeChoices.TYPE_VPWS]} params = {'type': [L2VPNTypeChoices.TYPE_VXLAN, L2VPNTypeChoices.TYPE_VPWS]}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
def test_description(self):
params = {'description': ['foobar1', 'foobar2']}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
def test_import_targets(self): def test_import_targets(self):
route_targets = RouteTarget.objects.filter(name__in=['1:1', '1:2']) route_targets = RouteTarget.objects.filter(name__in=['1:1', '1:2'])
params = {'import_target_id': [route_targets[0].pk, route_targets[1].pk]} params = {'import_target_id': [route_targets[0].pk, route_targets[1].pk]}

View File

@ -36,6 +36,10 @@ class WirelessLANGroupTestCase(TestCase, ChangeLoggedFilterSetTests):
for group in child_groups: for group in child_groups:
group.save() group.save()
def test_q(self):
params = {'q': 'foobar1'}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
def test_name(self): def test_name(self):
params = {'name': ['Wireless LAN Group 1', 'Wireless LAN Group 2']} params = {'name': ['Wireless LAN Group 1', 'Wireless LAN Group 2']}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
@ -103,7 +107,8 @@ class WirelessLANTestCase(TestCase, ChangeLoggedFilterSetTests):
tenant=tenants[0], tenant=tenants[0],
auth_type=WirelessAuthTypeChoices.TYPE_OPEN, auth_type=WirelessAuthTypeChoices.TYPE_OPEN,
auth_cipher=WirelessAuthCipherChoices.CIPHER_AUTO, auth_cipher=WirelessAuthCipherChoices.CIPHER_AUTO,
auth_psk='PSK1' auth_psk='PSK1',
description='foobar1'
), ),
WirelessLAN( WirelessLAN(
ssid='WLAN2', ssid='WLAN2',
@ -113,7 +118,8 @@ class WirelessLANTestCase(TestCase, ChangeLoggedFilterSetTests):
tenant=tenants[1], tenant=tenants[1],
auth_type=WirelessAuthTypeChoices.TYPE_WEP, auth_type=WirelessAuthTypeChoices.TYPE_WEP,
auth_cipher=WirelessAuthCipherChoices.CIPHER_TKIP, auth_cipher=WirelessAuthCipherChoices.CIPHER_TKIP,
auth_psk='PSK2' auth_psk='PSK2',
description='foobar2'
), ),
WirelessLAN( WirelessLAN(
ssid='WLAN3', ssid='WLAN3',
@ -123,11 +129,16 @@ class WirelessLANTestCase(TestCase, ChangeLoggedFilterSetTests):
tenant=tenants[2], tenant=tenants[2],
auth_type=WirelessAuthTypeChoices.TYPE_WPA_PERSONAL, auth_type=WirelessAuthTypeChoices.TYPE_WPA_PERSONAL,
auth_cipher=WirelessAuthCipherChoices.CIPHER_AES, auth_cipher=WirelessAuthCipherChoices.CIPHER_AES,
auth_psk='PSK3' auth_psk='PSK3',
description='foobar3'
), ),
) )
WirelessLAN.objects.bulk_create(wireless_lans) WirelessLAN.objects.bulk_create(wireless_lans)
def test_q(self):
params = {'q': 'foobar1'}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
def test_ssid(self): def test_ssid(self):
params = {'ssid': ['WLAN1', 'WLAN2']} params = {'ssid': ['WLAN1', 'WLAN2']}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
@ -160,6 +171,10 @@ class WirelessLANTestCase(TestCase, ChangeLoggedFilterSetTests):
params = {'auth_psk': ['PSK1', 'PSK2']} params = {'auth_psk': ['PSK1', 'PSK2']}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
def test_description(self):
params = {'description': ['foobar1', 'foobar2']}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
def test_tenant(self): def test_tenant(self):
tenants = Tenant.objects.all()[:2] tenants = Tenant.objects.all()[:2]
params = {'tenant_id': [tenants[0].pk, tenants[1].pk]} params = {'tenant_id': [tenants[0].pk, tenants[1].pk]}
@ -240,6 +255,10 @@ class WirelessLinkTestCase(TestCase, ChangeLoggedFilterSetTests):
ssid='LINK4' ssid='LINK4'
).save() ).save()
def test_q(self):
params = {'q': 'foobar1'}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
def test_ssid(self): def test_ssid(self):
params = {'ssid': ['LINK1', 'LINK2']} params = {'ssid': ['LINK1', 'LINK2']}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)