Skip to content

refactor: enhance db existence validation #1350

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 7 additions & 17 deletions src/aap_eda/api/serializers/activation.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
from aap_eda.api.serializers.event_stream import EventStreamOutSerializer
from aap_eda.api.serializers.fields.basic_user import BasicUserFieldSerializer
from aap_eda.api.serializers.fields.yaml import YAMLSerializerField
from aap_eda.api.serializers.mixins import OrganizationIdFieldMixin
from aap_eda.api.serializers.organization import OrganizationRefSerializer
from aap_eda.api.serializers.project import (
ANSIBLE_VAULT_STRING,
Expand Down Expand Up @@ -424,7 +425,9 @@ def to_representation(self, activation):
}


class ActivationCreateSerializer(serializers.ModelSerializer):
class ActivationCreateSerializer(
OrganizationIdFieldMixin, serializers.ModelSerializer
):
"""Serializer for creating the Activation."""

class Meta:
Expand All @@ -447,15 +450,6 @@ class Meta:
"skip_audit_events",
]

organization_id = serializers.IntegerField(
required=True,
allow_null=False,
validators=[validators.check_if_organization_exists],
error_messages={
"null": "Organization is needed",
"required": "Organization is required",
},
)
rulebook_id = serializers.IntegerField(
validators=[validators.check_if_rulebook_exists],
error_messages={
Expand Down Expand Up @@ -592,7 +586,9 @@ def copy(self) -> dict:
return super().create(copied_data)


class ActivationUpdateSerializer(serializers.ModelSerializer):
class ActivationUpdateSerializer(
OrganizationIdFieldMixin, serializers.ModelSerializer
):
"""Serializer for updating the Activation."""

class Meta:
Expand All @@ -615,12 +611,6 @@ class Meta:
"skip_audit_events",
]

organization_id = serializers.IntegerField(
required=False,
allow_null=False,
validators=[validators.check_if_organization_exists],
error_messages={"null": "Organization is needed"},
)
rulebook_id = serializers.IntegerField(
validators=[validators.check_if_rulebook_exists],
error_messages={"null": "Rulebook is needed"},
Expand Down
11 changes: 4 additions & 7 deletions src/aap_eda/api/serializers/decision_environment.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@

from aap_eda.api.serializers.eda_credential import EdaCredentialRefSerializer
from aap_eda.api.serializers.fields.basic_user import BasicUserFieldSerializer
from aap_eda.api.serializers.mixins import OrganizationIdFieldMixin
from aap_eda.api.serializers.organization import OrganizationRefSerializer
from aap_eda.api.serializers.user import BasicUserSerializer
from aap_eda.core import models, validators
Expand Down Expand Up @@ -54,15 +55,11 @@ def to_representation(self, decision_environment):
return result


class DecisionEnvironmentCreateSerializer(serializers.ModelSerializer):
class DecisionEnvironmentCreateSerializer(
OrganizationIdFieldMixin, serializers.ModelSerializer
):
"""Serializer for creating the DecisionEnvironment."""

organization_id = serializers.IntegerField(
required=True,
allow_null=False,
validators=[validators.check_if_organization_exists],
error_messages={"null": "Organization is needed"},
)
eda_credential_id = serializers.IntegerField(
required=False,
allow_null=True,
Expand Down
24 changes: 7 additions & 17 deletions src/aap_eda/api/serializers/eda_credential.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@

from aap_eda.api.serializers.credential_type import CredentialTypeRefSerializer
from aap_eda.api.serializers.fields.basic_user import BasicUserFieldSerializer
from aap_eda.api.serializers.mixins import OrganizationIdFieldMixin
from aap_eda.api.serializers.organization import OrganizationRefSerializer
from aap_eda.api.serializers.user import BasicUserSerializer
from aap_eda.core import enums, models, validators
Expand Down Expand Up @@ -125,7 +126,9 @@ class Meta:
]


class EdaCredentialCreateSerializer(serializers.ModelSerializer):
class EdaCredentialCreateSerializer(
OrganizationIdFieldMixin, serializers.ModelSerializer
):
credential_type_id = serializers.IntegerField(
required=True,
allow_null=False,
Expand All @@ -135,15 +138,6 @@ class EdaCredentialCreateSerializer(serializers.ModelSerializer):
"required": "Credential Type is required",
},
)
organization_id = serializers.IntegerField(
required=True,
allow_null=False,
validators=[validators.check_if_organization_exists],
error_messages={
"null": "Organization is needed",
"required": "Organization is required",
},
)
inputs = serializers.JSONField()

def validate(self, data):
Expand Down Expand Up @@ -185,13 +179,9 @@ class Meta:
]


class EdaCredentialUpdateSerializer(serializers.ModelSerializer):
organization_id = serializers.IntegerField(
required=True,
allow_null=False,
validators=[validators.check_if_organization_exists],
error_messages={"null": "Organization is needed"},
)
class EdaCredentialUpdateSerializer(
OrganizationIdFieldMixin, serializers.ModelSerializer
):
inputs = serializers.JSONField()

def validate(self, data):
Expand Down
15 changes: 14 additions & 1 deletion src/aap_eda/api/serializers/mixins.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,10 @@
# limitations under the License.

from django.conf import settings
from rest_framework import serializers

from aap_eda.api import exceptions as api_exc
from aap_eda.core import models
from aap_eda.core import models, validators


class SharedResourceSerializerMixin:
Expand All @@ -34,3 +35,15 @@ def validate_shared_resource(self, data=None):
raise api_exc.Forbidden(
f"{action} should be done through the platform ingress"
)


class OrganizationIdFieldMixin(serializers.Serializer):
organization_id = serializers.IntegerField(
required=True,
allow_null=False,
validators=[validators.check_if_organization_exists],
error_messages={
"null": "Organization is needed",
"required": "Organization is required",
},
)
27 changes: 7 additions & 20 deletions src/aap_eda/api/serializers/project.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@

from aap_eda.api.serializers.eda_credential import EdaCredentialRefSerializer
from aap_eda.api.serializers.fields.basic_user import BasicUserFieldSerializer
from aap_eda.api.serializers.mixins import OrganizationIdFieldMixin
from aap_eda.api.serializers.organization import OrganizationRefSerializer
from aap_eda.api.serializers.user import BasicUserSerializer
from aap_eda.core import models, validators
Expand Down Expand Up @@ -81,16 +82,9 @@ def to_representation(self, instance):
return result


class ProjectCreateRequestSerializer(serializers.ModelSerializer):
organization_id = serializers.IntegerField(
required=True,
allow_null=False,
validators=[validators.check_if_organization_exists],
error_messages={
"null": "Organization is needed",
"required": "Organization is required",
},
)
class ProjectCreateRequestSerializer(
OrganizationIdFieldMixin, serializers.ModelSerializer
):
eda_credential_id = serializers.IntegerField(
required=False,
allow_null=True,
Expand Down Expand Up @@ -142,16 +136,9 @@ class Meta:
]


class ProjectUpdateRequestSerializer(serializers.ModelSerializer):
organization_id = serializers.IntegerField(
required=True,
allow_null=False,
validators=[validators.check_if_organization_exists],
error_messages={
"null": "Organization is needed",
"required": "Organization is required",
},
)
class ProjectUpdateRequestSerializer(
OrganizationIdFieldMixin, serializers.ModelSerializer
):
name = serializers.CharField(
required=False,
allow_blank=False,
Expand Down
11 changes: 3 additions & 8 deletions src/aap_eda/api/serializers/team.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,9 @@
from rest_framework import serializers
from rest_framework.validators import UniqueTogetherValidator

from aap_eda.api.serializers.mixins import OrganizationIdFieldMixin
from aap_eda.api.serializers.organization import OrganizationRefSerializer
from aap_eda.core import models, validators
from aap_eda.core import models

from .fields.ansible_resource import AnsibleResourceFieldSerializer
from .mixins import SharedResourceSerializerMixin
Expand All @@ -40,16 +41,10 @@ class Meta:


class TeamCreateSerializer(
OrganizationIdFieldMixin,
serializers.ModelSerializer,
SharedResourceSerializerMixin,
):
organization_id = serializers.IntegerField(
required=True,
allow_null=False,
validators=[validators.check_if_organization_exists],
error_messages={"null": "Organization is needed"},
)

class Meta:
model = models.Team
fields = [
Expand Down
50 changes: 9 additions & 41 deletions src/aap_eda/core/validators.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,14 +40,11 @@
]


def check_if_rulebook_exists(rulebook_id: int) -> int:
try:
models.Rulebook.objects.get(pk=rulebook_id)
except models.Rulebook.DoesNotExist:
def check_if_rulebook_exists(rulebook_id: int) -> None:
if not models.Rulebook.objects.filter(pk=rulebook_id).exists():
raise serializers.ValidationError(
f"Rulebook with id {rulebook_id} does not exist"
)
return rulebook_id


def check_if_de_exists(decision_environment_id: int) -> int:
Expand Down Expand Up @@ -236,14 +233,13 @@ def check_single_aap_credential(
return eda_credential_ids


def check_if_credential_type_exists(credential_type_id: int) -> int:
try:
models.CredentialType.objects.get(pk=credential_type_id)
except models.CredentialType.DoesNotExist:
def check_if_credential_type_exists(credential_type_id: int) -> None:
if not models.CredentialType.objects.filter(
pk=credential_type_id
).exists():
raise serializers.ValidationError(
f"CredentialType with id {credential_type_id} does not exist"
)
return credential_type_id


def check_if_credential_name_used(name: str) -> str:
Expand All @@ -257,33 +253,17 @@ def check_if_credential_name_used(name: str) -> str:


def check_if_organization_exists(organization_id: int) -> int:
try:
models.Organization.objects.get(pk=organization_id)
except models.Organization.DoesNotExist:
if not models.Organization.objects.filter(pk=organization_id).exists():
raise serializers.ValidationError(
f"Organization with id {organization_id} does not exist"
)
return organization_id


def check_if_extra_var_exists(extra_var_id: int) -> int:
try:
models.ExtraVar.objects.get(pk=extra_var_id)
except models.ExtraVar.DoesNotExist:
raise serializers.ValidationError(
f"ExtraVar with id {extra_var_id} does not exist"
)
return extra_var_id


def check_if_awx_token_exists(awx_token_id: int) -> int:
try:
models.AwxToken.objects.get(pk=awx_token_id)
except models.AwxToken.DoesNotExist:
def check_if_awx_token_exists(awx_token_id: int) -> None:
if not models.AwxToken.objects.filter(pk=awx_token_id).exists():
raise serializers.ValidationError(
f"AwxToken with id {awx_token_id} does not exist"
)
return awx_token_id


def check_rulesets_require_token(
Expand Down Expand Up @@ -433,18 +413,6 @@ def _validate_event_stream_settings(auth_type: str):
)


def check_if_event_streams_exists(event_stream_ids: list[int]) -> list[int]:
"""Check a event stream exists."""
for event_stream_id in event_stream_ids:
try:
models.EventStream.objects.get(pk=event_stream_id)
except models.EventStream.DoesNotExist as exc:
raise serializers.ValidationError(
f"EventStream with id {event_stream_id} does not exist"
) from exc
return event_stream_ids


def check_credential_types_for_event_stream(eda_credential_id: int) -> int:
"""Check the credential types for a event stream."""
credential = get_credential_if_exists(eda_credential_id)
Expand Down