Feature: saved launchtime configurations

Consolidate prompts accept/reject logic in unified models
Break out accept/reject logic for variables
Surface new promptable fields on WFJT nodes, schedules

Make schedules and workflows accurately reject variables
  that are not allowed by the prompting
  rules or the survey rules on the template

Validate against unallowed extra_data in system job schedules
Prevent schedule or WFJT node POST/PATCH with unprompted data
Move system job days validation to new mechanism
Add new psuedo-field for WFJT node credential
Add validation for node related credentials
Add related config model to unified job
Use JobLaunchConfig model for launch RBAC check

Support credential overwrite behavior with multi-creds
  change modern manual launch to use merge behavior
Refactor JobLaunchSerializer, self.instance=None
Modularize job launch view to create "modern" data
Auto-create config object with every job
Add create schedule endpoint for jobs
This commit is contained in:
AlanCoding
2017-11-01 12:08:50 -04:00
parent cd8a4b4669
commit 34a8e0a9b6
49 changed files with 2343 additions and 884 deletions

View File

@@ -16,13 +16,13 @@ from awx.main.models import (
def mock_JT_resource_data():
return ({}, [])
return {}
@pytest.fixture
def job_template(mocker):
mock_jt = mocker.MagicMock(pk=5)
mock_jt.resource_validation_data = mock_JT_resource_data
mock_jt.validation_errors = mock_JT_resource_data
return mock_jt

View File

@@ -20,7 +20,7 @@ from rest_framework import serializers
def mock_JT_resource_data():
return ({}, [])
return {}
@pytest.fixture
@@ -28,7 +28,7 @@ def job_template(mocker):
mock_jt = mocker.MagicMock(spec=JobTemplate)
mock_jt.pk = 5
mock_jt.host_config_key = '9283920492'
mock_jt.resource_validation_data = mock_JT_resource_data
mock_jt.validation_errors = mock_JT_resource_data
return mock_jt

View File

@@ -5,7 +5,6 @@ import mock
# AWX
from awx.api.serializers import (
WorkflowJobTemplateSerializer,
WorkflowNodeBaseSerializer,
WorkflowJobTemplateNodeSerializer,
WorkflowJobNodeSerializer,
)
@@ -54,7 +53,7 @@ class TestWorkflowNodeBaseSerializerGetRelated():
return WorkflowJobTemplateNode(pk=1)
def test_workflow_unified_job_template_present(self, get_related_mock_and_run, workflow_job_template_node_related):
related = get_related_mock_and_run(WorkflowNodeBaseSerializer, workflow_job_template_node_related)
related = get_related_mock_and_run(WorkflowJobTemplateNodeSerializer, workflow_job_template_node_related)
assert 'unified_job_template' in related
assert related['unified_job_template'] == '/api/v2/%s/%d/' % ('job_templates', workflow_job_template_node_related.unified_job_template.pk)
@@ -63,7 +62,7 @@ class TestWorkflowNodeBaseSerializerGetRelated():
assert 'unified_job_template' not in related
@mock.patch('awx.api.serializers.WorkflowNodeBaseSerializer.get_related', lambda x,y: {})
@mock.patch('awx.api.serializers.BaseSerializer.get_related', lambda x,y: {})
class TestWorkflowJobTemplateNodeSerializerGetRelated():
@pytest.fixture
def workflow_job_template_node(self):
@@ -92,6 +91,9 @@ class TestWorkflowJobTemplateNodeSerializerGetRelated():
'always_nodes',
])
def test_get_related(self, test_get_related, workflow_job_template_node, related_resource_name):
serializer = WorkflowJobTemplateNodeSerializer()
print serializer.get_related(workflow_job_template_node)
# import pdb; pdb.set_trace()
test_get_related(WorkflowJobTemplateNodeSerializer,
workflow_job_template_node,
'workflow_job_template_nodes',
@@ -139,17 +141,19 @@ class TestWorkflowJobTemplateNodeSerializerCharPrompts():
def test_change_single_field(self, WFJT_serializer):
"Test that a single prompt field can be changed without affecting other fields"
internal_value = WFJT_serializer.to_internal_value({'job_type': 'check'})
assert internal_value['char_prompts']['job_type'] == 'check'
assert internal_value['char_prompts']['limit'] == 'webservers'
assert internal_value['job_type'] == 'check'
WFJT_serializer.instance.job_type = 'check'
assert WFJT_serializer.instance.limit == 'webservers'
def test_null_single_field(self, WFJT_serializer):
"Test that a single prompt field can be removed without affecting other fields"
internal_value = WFJT_serializer.to_internal_value({'job_type': None})
assert 'job_type' not in internal_value['char_prompts']
assert internal_value['char_prompts']['limit'] == 'webservers'
assert internal_value['job_type'] is None
WFJT_serializer.instance.job_type = None
assert WFJT_serializer.instance.limit == 'webservers'
@mock.patch('awx.api.serializers.WorkflowNodeBaseSerializer.get_related', lambda x,y: {})
@mock.patch('awx.api.serializers.WorkflowJobTemplateNodeSerializer.get_related', lambda x,y: {})
class TestWorkflowJobNodeSerializerGetRelated():
@pytest.fixture
def workflow_job_node(self):