diff --git a/awx/main/migrations/0207_alter_skip_tags_to_textfield.py b/awx/main/migrations/0207_alter_skip_tags_to_textfield.py new file mode 100644 index 0000000000..9a6457cc07 --- /dev/null +++ b/awx/main/migrations/0207_alter_skip_tags_to_textfield.py @@ -0,0 +1,23 @@ +# Generated by Django 5.2.8 on 2026-07-20 11:07 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('main', '0206_jobhostsummary_host_id_idx'), + ] + + operations = [ + migrations.AlterField( + model_name='job', + name='skip_tags', + field=models.TextField(blank=True, default=''), + ), + migrations.AlterField( + model_name='jobtemplate', + name='skip_tags', + field=models.TextField(blank=True, default=''), + ), + ] diff --git a/awx/main/models/jobs.py b/awx/main/models/jobs.py index 9b84488836..0336ab72c8 100644 --- a/awx/main/models/jobs.py +++ b/awx/main/models/jobs.py @@ -132,8 +132,7 @@ class JobOptions(BaseModel): blank=True, default=False, ) - skip_tags = models.CharField( - max_length=1024, + skip_tags = models.TextField( blank=True, default='', ) diff --git a/awx/main/tests/functional/api/test_job_runtime_params.py b/awx/main/tests/functional/api/test_job_runtime_params.py index 95b55e15b6..1220a0c8db 100644 --- a/awx/main/tests/functional/api/test_job_runtime_params.py +++ b/awx/main/tests/functional/api/test_job_runtime_params.py @@ -191,6 +191,21 @@ def test_job_accept_empty_tags(job_template_prompts, post, admin_user, mocker): mock_job.signal_start.assert_called_once() +@pytest.mark.django_db +@pytest.mark.job_runtime_vars +def test_job_accept_long_skip_tags(job_template_prompts, post, admin_user, mocker): + job_template = job_template_prompts(True) + long_skip_tags = ','.join(f'tag{i}' for i in range(500)) + assert len(long_skip_tags) > 1024 + + mock_job = mocker.MagicMock(spec=Job, id=968) + + mocker.patch.object(JobTemplate, 'create_unified_job', return_value=mock_job) + mocker.patch('awx.api.serializers.JobSerializer.to_representation') + post(reverse('api:job_template_launch', kwargs={'pk': job_template.pk}), {'skip_tags': long_skip_tags}, admin_user, expect=201) + JobTemplate.create_unified_job.assert_called_once_with(skip_tags=long_skip_tags) + + @pytest.mark.django_db @pytest.mark.job_runtime_vars def test_slice_timeout_forks_need_int(job_template_prompts, post, admin_user, mocker):