Skip to content

Commit

Permalink
hack the API
Browse files Browse the repository at this point in the history
  • Loading branch information
whitej6 committed Sep 18, 2023
1 parent df1f82c commit 40b3e34
Show file tree
Hide file tree
Showing 6 changed files with 268 additions and 257 deletions.
94 changes: 53 additions & 41 deletions nautobot_firewall_models/api/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,20 @@
from nautobot_firewall_models import models


# TODO: This is a complete hack, M2M fields are not being picked up correctly.
class ThroughNautobotHyperlinkedRelatedField(NautobotHyperlinkedRelatedField):
"""Overload to account for nested through fields."""

def to_representation(self, value):
"""Convert URL representation to a brief nested representation."""
return {
"id": value.pk,
"object_type": value._meta.label_lower,
"url": super().to_representation(value)["url"],
"composite_key": value.composite_key,
}


class IPRangeSerializer(NautobotModelSerializer):
"""IPRange Serializer."""

Expand Down Expand Up @@ -45,10 +59,8 @@ class Meta:
class AddressObjectGroupSerializer(NautobotModelSerializer):
"""AddressObjectGroup Serializer."""

address_objects = NautobotHyperlinkedRelatedField(
queryset=models.AddressObject.objects.all(),
many=True,
required=False,
address_objects = ThroughNautobotHyperlinkedRelatedField(
queryset=models.AddressObject.objects.all(), many=True, required=False
)

class Meta:
Expand All @@ -71,7 +83,7 @@ class Meta:
class ApplicationObjectGroupSerializer(NautobotModelSerializer):
"""ApplicationObjectGroup Serializer."""

application_objects = NautobotHyperlinkedRelatedField(
application_objects = ThroughNautobotHyperlinkedRelatedField(
queryset=models.ApplicationObject.objects.all(),
many=True,
required=False,
Expand All @@ -97,7 +109,7 @@ class Meta:
class ServiceObjectGroupSerializer(NautobotModelSerializer):
"""ServiceObjectGroup Serializer."""

service_objects = NautobotHyperlinkedRelatedField(
service_objects = ThroughNautobotHyperlinkedRelatedField(
queryset=models.ServiceObject.objects.all(),
many=True,
required=False,
Expand All @@ -123,7 +135,7 @@ class Meta:
class UserObjectGroupSerializer(NautobotModelSerializer):
"""UserObjectGroup Serializer."""

user_objects = NautobotHyperlinkedRelatedField(
user_objects = ThroughNautobotHyperlinkedRelatedField(
queryset=models.UserObject.objects.all(),
many=True,
required=False,
Expand Down Expand Up @@ -152,64 +164,64 @@ class PolicyRuleSerializer(NautobotModelSerializer):
index = serializers.IntegerField(required=False, default=None)

# source
source_users = NautobotHyperlinkedRelatedField(
source_users = ThroughNautobotHyperlinkedRelatedField(
queryset=models.UserObject.objects.all(),
many=True,
required=False,
)
source_user_groups = NautobotHyperlinkedRelatedField(
source_user_groups = ThroughNautobotHyperlinkedRelatedField(
queryset=models.UserObjectGroup.objects.all(),
many=True,
required=False,
)
source_addresses = NautobotHyperlinkedRelatedField(
source_addresses = ThroughNautobotHyperlinkedRelatedField(
queryset=models.AddressObject.objects.all(),
many=True,
required=False,
)
source_address_groups = NautobotHyperlinkedRelatedField(
source_address_groups = ThroughNautobotHyperlinkedRelatedField(
queryset=models.AddressObjectGroup.objects.all(),
many=True,
required=False,
)
source_services = NautobotHyperlinkedRelatedField(
source_services = ThroughNautobotHyperlinkedRelatedField(
queryset=models.ServiceObject.objects.all(),
many=True,
required=False,
)
source_service_groups = NautobotHyperlinkedRelatedField(
source_service_groups = ThroughNautobotHyperlinkedRelatedField(
queryset=models.ServiceObjectGroup.objects.all(),
many=True,
required=False,
)

# destination
applications = NautobotHyperlinkedRelatedField(
applications = ThroughNautobotHyperlinkedRelatedField(
queryset=models.ApplicationObject.objects.all(),
many=True,
required=False,
)
application_groups = NautobotHyperlinkedRelatedField(
application_groups = ThroughNautobotHyperlinkedRelatedField(
queryset=models.ApplicationObjectGroup.objects.all(),
many=True,
required=False,
)
destination_addresses = NautobotHyperlinkedRelatedField(
destination_addresses = ThroughNautobotHyperlinkedRelatedField(
queryset=models.AddressObject.objects.all(),
many=True,
required=False,
)
destination_address_groups = NautobotHyperlinkedRelatedField(
destination_address_groups = ThroughNautobotHyperlinkedRelatedField(
queryset=models.AddressObjectGroup.objects.all(),
many=True,
required=False,
)
destination_services = NautobotHyperlinkedRelatedField(
destination_services = ThroughNautobotHyperlinkedRelatedField(
queryset=models.ServiceObject.objects.all(),
many=True,
required=False,
)
destination_service_groups = NautobotHyperlinkedRelatedField(
destination_service_groups = ThroughNautobotHyperlinkedRelatedField(
queryset=models.ServiceObjectGroup.objects.all(),
many=True,
required=False,
Expand All @@ -225,17 +237,17 @@ class Meta:
class PolicySerializer(NautobotModelSerializer):
"""Policy Serializer."""

policy_rules = NautobotHyperlinkedRelatedField(
policy_rules = ThroughNautobotHyperlinkedRelatedField(
queryset=models.PolicyRule.objects.all(),
many=True,
required=False,
)
assigned_devices = NautobotHyperlinkedRelatedField(
assigned_devices = ThroughNautobotHyperlinkedRelatedField(
queryset=Device.objects.all(),
many=True,
required=False,
)
assigned_dynamic_groups = NautobotHyperlinkedRelatedField(
assigned_dynamic_groups = ThroughNautobotHyperlinkedRelatedField(
queryset=DynamicGroup.objects.all(),
many=True,
required=False,
Expand Down Expand Up @@ -313,88 +325,88 @@ class NATPolicyRuleSerializer(NautobotModelSerializer):
"""PolicyRule Serializer."""

# original source
original_source_addresses = NautobotHyperlinkedRelatedField(
original_source_addresses = ThroughNautobotHyperlinkedRelatedField(
queryset=models.AddressObject.objects.all(),
many=True,
required=False,
)
original_source_address_groups = NautobotHyperlinkedRelatedField(
original_source_address_groups = ThroughNautobotHyperlinkedRelatedField(
queryset=models.AddressObjectGroup.objects.all(),
many=True,
required=False,
)
original_source_services = NautobotHyperlinkedRelatedField(
original_source_services = ThroughNautobotHyperlinkedRelatedField(
queryset=models.ServiceObject.objects.all(),
many=True,
required=False,
)
original_source_service_groups = NautobotHyperlinkedRelatedField(
original_source_service_groups = ThroughNautobotHyperlinkedRelatedField(
queryset=models.ServiceObjectGroup.objects.all(),
many=True,
required=False,
)

# translated source
translated_source_addresses = NautobotHyperlinkedRelatedField(
translated_source_addresses = ThroughNautobotHyperlinkedRelatedField(
queryset=models.AddressObject.objects.all(),
many=True,
required=False,
)
translated_source_address_groups = NautobotHyperlinkedRelatedField(
translated_source_address_groups = ThroughNautobotHyperlinkedRelatedField(
queryset=models.AddressObjectGroup.objects.all(),
many=True,
required=False,
)
translated_source_services = NautobotHyperlinkedRelatedField(
translated_source_services = ThroughNautobotHyperlinkedRelatedField(
queryset=models.ServiceObject.objects.all(),
many=True,
required=False,
)
translated_source_service_groups = NautobotHyperlinkedRelatedField(
translated_source_service_groups = ThroughNautobotHyperlinkedRelatedField(
queryset=models.ServiceObjectGroup.objects.all(),
many=True,
required=False,
)

# original destination
original_destination_addresses = NautobotHyperlinkedRelatedField(
original_destination_addresses = ThroughNautobotHyperlinkedRelatedField(
queryset=models.AddressObject.objects.all(),
many=True,
required=False,
)
original_destination_address_groups = NautobotHyperlinkedRelatedField(
original_destination_address_groups = ThroughNautobotHyperlinkedRelatedField(
queryset=models.AddressObjectGroup.objects.all(),
many=True,
required=False,
)
original_destination_services = NautobotHyperlinkedRelatedField(
original_destination_services = ThroughNautobotHyperlinkedRelatedField(
queryset=models.ServiceObject.objects.all(),
many=True,
required=False,
)
original_destination_service_groups = NautobotHyperlinkedRelatedField(
original_destination_service_groups = ThroughNautobotHyperlinkedRelatedField(
queryset=models.ServiceObjectGroup.objects.all(),
many=True,
required=False,
)

# translated destination
translated_destination_addresses = NautobotHyperlinkedRelatedField(
translated_destination_addresses = ThroughNautobotHyperlinkedRelatedField(
queryset=models.AddressObject.objects.all(),
many=True,
required=False,
)
translated_destination_address_groups = NautobotHyperlinkedRelatedField(
translated_destination_address_groups = ThroughNautobotHyperlinkedRelatedField(
queryset=models.AddressObjectGroup.objects.all(),
many=True,
required=False,
)
translated_destination_services = NautobotHyperlinkedRelatedField(
translated_destination_services = ThroughNautobotHyperlinkedRelatedField(
queryset=models.ServiceObject.objects.all(),
many=True,
required=False,
)
translated_destination_service_groups = NautobotHyperlinkedRelatedField(
translated_destination_service_groups = ThroughNautobotHyperlinkedRelatedField(
queryset=models.ServiceObjectGroup.objects.all(),
many=True,
required=False,
Expand All @@ -410,17 +422,17 @@ class Meta:
class NATPolicySerializer(NautobotModelSerializer):
"""NATPolicy Serializer."""

nat_policy_rules = NautobotHyperlinkedRelatedField(
nat_policy_rules = ThroughNautobotHyperlinkedRelatedField(
queryset=models.NATPolicyRule.objects.all(),
many=True,
required=False,
)
assigned_devices = NautobotHyperlinkedRelatedField(
assigned_devices = ThroughNautobotHyperlinkedRelatedField(
queryset=Device.objects.all(),
many=True,
required=False,
)
assigned_dynamic_groups = NautobotHyperlinkedRelatedField(
assigned_dynamic_groups = ThroughNautobotHyperlinkedRelatedField(
queryset=DynamicGroup.objects.all(),
many=True,
required=False,
Expand Down
37 changes: 0 additions & 37 deletions nautobot_firewall_models/tests/test_api.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
"""Unit tests for API views."""
# flake8: noqa: F403,405
# pylint: disable=invalid-name
from unittest import skip
from nautobot.apps.testing import APIViewTestCases
from nautobot.dcim.models import Device
from nautobot.ipam.models import Prefix
Expand Down Expand Up @@ -128,10 +127,6 @@ def setUpTestData(cls):
{"name": "test2", "address_objects": [addr_obj.id]},
]

@skip("Not implemented")
def test_list_objects_csv(self):
pass


class ServiceObjectAPIViewTest(APIViewTestCases.APIViewTestCase):
"""Test the ServiceObject viewsets."""
Expand All @@ -153,18 +148,6 @@ def setUpTestData(cls):
]
create_env()

@skip("Issues with custom validators")
def test_options_objects(self):
pass

@skip("Issues with custom validators")
def test_options_object(self):
pass

@skip("Issues with custom validators")
def test_options_returns_expected_choices(self):
pass


class ServiceGroupAPIViewTest(APIViewTestCases.APIViewTestCase):
"""Test the ServiceGroup viewsets."""
Expand Down Expand Up @@ -310,14 +293,6 @@ def setUpTestData(cls):
{"name": "test 2", "policy_rules": [pol_rule.id], "description": "Test desc", "assigned_devices": [dev.id]},
]

@skip("CSV Not supported")
def test_list_objects_csv(self):
pass

@skip("CSV Not supported")
def test_recreate_object_csv(self):
pass


class NATPolicyRuleAPIViewTest(APIViewTestCases.APIViewTestCase):
"""Test the PolicyRule viewsets."""
Expand Down Expand Up @@ -354,10 +329,6 @@ def setUpTestData(cls):
},
]

@skip("CSV Not supported")
def test_list_objects_csv(self):
pass


class NATPolicyAPIViewTest(APIViewTestCases.APIViewTestCase):
"""Test the Policy viewsets."""
Expand All @@ -378,11 +349,3 @@ def setUpTestData(cls):
{"name": "test 1", "nat_policy_rules": [nat_pol_rule.id]},
{"name": "test 2", "nat_policy_rules": [nat_pol_rule.id], "description": "Test desc"},
]

@skip("CSV Not supported")
def test_list_objects_csv(self):
pass

@skip("CSV Not supported")
def test_recreate_object_csv(self):
pass
3 changes: 3 additions & 0 deletions nautobot_firewall_models/validators.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,3 +18,6 @@ def validate_port(value):
_("%(i)s is not a port number or port range."),
params={"value": i},
)


validate_port.message = "Must be a valid port, or port range."
Loading

0 comments on commit 40b3e34

Please sign in to comment.