mirror of
https://github.com/ansible/awx.git
synced 2026-10-31 06:26:15 -02:30
[AAP-86051] Wrap bulk job launch create in serializer persistence context
Use DAB serializer_mediated_persistence_context on BulkJobLaunchSerializer so validate() rejection logs are not duplicated by bulk workflow node audit. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -43,7 +43,7 @@ from rest_framework.utils.serializer_helpers import ReturnList
|
|||||||
from polymorphic.models import PolymorphicModel
|
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, serializer_mediated_persistence_context
|
||||||
from ansible_base.lib.utils.bulk_validation_audit import audit_bulk_model_instances
|
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
|
||||||
@@ -5278,6 +5278,10 @@ class BulkJobLaunchSerializer(PromptFieldCleanTextMixin, serializers.Serializer)
|
|||||||
)
|
)
|
||||||
|
|
||||||
def create(self, validated_data):
|
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)
|
request = self.context.get('request', None)
|
||||||
launch_user = request.user if request else None
|
launch_user = request.user if request else None
|
||||||
job_node_data = validated_data.pop('jobs')
|
job_node_data = validated_data.pop('jobs')
|
||||||
|
|||||||
@@ -49,6 +49,19 @@ def test_audit_bulk_model_instances_logs_host_description_on_bulk_create(caplog)
|
|||||||
assert 'main.Host' in caplog.text
|
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 = '<script>x</script>'
|
||||||
|
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
|
@pytest.mark.django_db
|
||||||
def test_audit_workflow_job_nodes_logs_limit_pseudo_field(caplog):
|
def test_audit_workflow_job_nodes_logs_limit_pseudo_field(caplog):
|
||||||
wfj = WorkflowJob.objects.create(name='wf-audit-limit')
|
wfj = WorkflowJob.objects.create(name='wf-audit-limit')
|
||||||
|
|||||||
Reference in New Issue
Block a user