mirror of
https://github.com/ansible/awx.git
synced 2026-10-31 14:36:17 -02:30
[AAP-86051] Wire DAB validation bypass observability for Controller
Register ORM bypass signals and AWX caller prefixes at startup, and audit bulk host create before bulk_create. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -44,6 +44,7 @@ from polymorphic.models import PolymorphicModel
|
|||||||
|
|
||||||
# django-ansible-base
|
# django-ansible-base
|
||||||
from ansible_base.lib.serializers.mixins import CleanTextMixin
|
from ansible_base.lib.serializers.mixins import CleanTextMixin
|
||||||
|
from ansible_base.lib.utils.bulk_validation_audit import audit_bulk_model_instances
|
||||||
from ansible_base.lib.utils.models import get_type_for_model
|
from ansible_base.lib.utils.models import get_type_for_model
|
||||||
from ansible_base.lib.utils.settings import get_setting
|
from ansible_base.lib.utils.settings import get_setting
|
||||||
from ansible_base.lib.utils.validation import DEFAULT_NAME_FIELDS
|
from ansible_base.lib.utils.validation import DEFAULT_NAME_FIELDS
|
||||||
@@ -2277,6 +2278,7 @@ class BulkHostCreateSerializer(serializers.Serializer):
|
|||||||
old_total_hosts = validated_data['inventory'].total_hosts
|
old_total_hosts = validated_data['inventory'].total_hosts
|
||||||
result = [Host(**attrs) for attrs in validated_data['hosts']]
|
result = [Host(**attrs) for attrs in validated_data['hosts']]
|
||||||
try:
|
try:
|
||||||
|
audit_bulk_model_instances(result, operation='bulk_create')
|
||||||
Host.objects.bulk_create(result)
|
Host.objects.bulk_create(result)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
raise serializers.ValidationError({"detail": _(f"cannot create host, host creation error {e}")})
|
raise serializers.ValidationError({"detail": _(f"cannot create host, host creation error {e}")})
|
||||||
|
|||||||
@@ -67,4 +67,9 @@ class MainConfig(AppConfig):
|
|||||||
|
|
||||||
self.configure_dispatcherd()
|
self.configure_dispatcherd()
|
||||||
self.load_named_url_feature()
|
self.load_named_url_feature()
|
||||||
|
from awx.main.utils.validation_bypass_observability import configure_validation_bypass_observability
|
||||||
|
|
||||||
|
configure_validation_bypass_observability()
|
||||||
|
import awx.api.serializers # noqa: F401 — register CleanTextMixin models for ORM bypass signal
|
||||||
|
|
||||||
pre_migrate.connect(self.check_db_requirement, sender=self)
|
pre_migrate.connect(self.check_db_requirement, sender=self)
|
||||||
|
|||||||
@@ -0,0 +1,28 @@
|
|||||||
|
"""Register django-ansible-base ORM bypass caller attribution for AWX."""
|
||||||
|
|
||||||
|
from ansible_base.lib.utils.validation_signals import (
|
||||||
|
extend_caller_allowlist_prefixes,
|
||||||
|
extend_internal_caller_prefixes,
|
||||||
|
register_validation_signals,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def configure_validation_bypass_observability() -> None:
|
||||||
|
"""Call from AppConfig.ready() so ORM bypass logs show AWX entry points."""
|
||||||
|
register_validation_signals()
|
||||||
|
extend_caller_allowlist_prefixes(
|
||||||
|
[
|
||||||
|
"awx.api.views",
|
||||||
|
"awx.api.serializers",
|
||||||
|
"awx.main.tasks",
|
||||||
|
"awx.main.management",
|
||||||
|
"awx.main.utils",
|
||||||
|
]
|
||||||
|
)
|
||||||
|
extend_internal_caller_prefixes(
|
||||||
|
[
|
||||||
|
"awx.main.models",
|
||||||
|
"awx.main.signals",
|
||||||
|
"awx.main.dispatch",
|
||||||
|
]
|
||||||
|
)
|
||||||
Reference in New Issue
Block a user