diff --git a/awx/api/serializers.py b/awx/api/serializers.py index 296ef14abf..be07520b5b 100644 --- a/awx/api/serializers.py +++ b/awx/api/serializers.py @@ -43,7 +43,7 @@ from rest_framework.utils.serializer_helpers import ReturnList from polymorphic.models import PolymorphicModel # django-ansible-base -from ansible_base.lib.serializers.mixins import CleanTextMixin +from ansible_base.lib.serializers.mixins import CleanTextMixin, serializer_mediated_persistence_context 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.settings import get_setting @@ -5278,6 +5278,10 @@ class BulkJobLaunchSerializer(PromptFieldCleanTextMixin, serializers.Serializer) ) def create(self, validated_data): + with serializer_mediated_persistence_context(): + return self._create_bulk_job_launch(validated_data) + + def _create_bulk_job_launch(self, validated_data): request = self.context.get('request', None) launch_user = request.user if request else None job_node_data = validated_data.pop('jobs') diff --git a/awx/main/tests/unit/utils/test_validation_bypass_observability.py b/awx/main/tests/unit/utils/test_validation_bypass_observability.py index 270a67a457..a9704a2446 100644 --- a/awx/main/tests/unit/utils/test_validation_bypass_observability.py +++ b/awx/main/tests/unit/utils/test_validation_bypass_observability.py @@ -49,6 +49,19 @@ def test_audit_bulk_model_instances_logs_host_description_on_bulk_create(caplog) assert 'main.Host' in caplog.text +@pytest.mark.django_db +def test_audit_workflow_job_nodes_skips_when_serializer_already_logged(caplog): + from ansible_base.lib.utils.validation_signals import register_serializer_validation_rejection + + wfj = WorkflowJob.objects.create(name='wf-audit-limit-dedupe') + node = WorkflowJobNode(workflow_job=wfj, identifier='wf-node-1') + node.limit = '' + register_serializer_validation_rejection('main.WorkflowJobNode', 'limit') + with caplog.at_level(logging.WARNING, logger=LOGGER): + audit_workflow_job_nodes_for_bulk_create([node]) + assert 'ORM bypass' not in caplog.text + + @pytest.mark.django_db def test_audit_workflow_job_nodes_logs_limit_pseudo_field(caplog): wfj = WorkflowJob.objects.create(name='wf-audit-limit')