summaryrefslogtreecommitdiffstats
path: root/cds-regression-test/test/remote-ansible
diff options
context:
space:
mode:
Diffstat (limited to 'cds-regression-test/test/remote-ansible')
-rw-r--r--cds-regression-test/test/remote-ansible/connection-failure/expected-response.json28
-rw-r--r--cds-regression-test/test/remote-ansible/connection-failure/request-payload.json27
-rw-r--r--cds-regression-test/test/remote-ansible/connection-failure/test.sh25
-rw-r--r--cds-regression-test/test/remote-ansible/dummy-request-payload.json14
-rw-r--r--cds-regression-test/test/remote-ansible/failure/resources/elalto/expected-response.json28
-rw-r--r--cds-regression-test/test/remote-ansible/failure/resources/elalto/request-payload.json27
-rw-r--r--cds-regression-test/test/remote-ansible/failure/resources/frankfurt/expected-response.json29
-rw-r--r--cds-regression-test/test/remote-ansible/failure/resources/frankfurt/request-payload.json27
-rw-r--r--cds-regression-test/test/remote-ansible/failure/test.sh26
-rwxr-xr-xcds-regression-test/test/remote-ansible/init-mockserver.sh39
-rw-r--r--cds-regression-test/test/remote-ansible/mock-payloads/get_job-template-launch.json46
-rw-r--r--cds-regression-test/test/remote-ansible/mock-payloads/inventory.json110
-rw-r--r--cds-regression-test/test/remote-ansible/mock-payloads/job-execution.json183
-rw-r--r--cds-regression-test/test/remote-ansible/mock-payloads/job-output.json24
-rw-r--r--cds-regression-test/test/remote-ansible/mock-payloads/job-template-error.json8
-rw-r--r--cds-regression-test/test/remote-ansible/mock-payloads/job-template.json224
-rw-r--r--cds-regression-test/test/remote-ansible/mock-payloads/post_job-template-launch.json144
-rwxr-xr-xcds-regression-test/test/remote-ansible/remote-ansible-enrichment-test.sh16
-rwxr-xr-xcds-regression-test/test/remote-ansible/remote-ansible-upload-test.sh20
-rw-r--r--cds-regression-test/test/remote-ansible/success/expected-response.json29
-rw-r--r--cds-regression-test/test/remote-ansible/success/request-payload.json27
-rw-r--r--cds-regression-test/test/remote-ansible/success/test.sh25
22 files changed, 1126 insertions, 0 deletions
diff --git a/cds-regression-test/test/remote-ansible/connection-failure/expected-response.json b/cds-regression-test/test/remote-ansible/connection-failure/expected-response.json
new file mode 100644
index 0000000..301e70b
--- /dev/null
+++ b/cds-regression-test/test/remote-ansible/connection-failure/expected-response.json
@@ -0,0 +1,28 @@
+{
+ "commonHeader": {
+ "timestamp": "2020-05-01T19:38:57.529Z",
+ "originatorId": "System",
+ "requestId": "remote-ansible-connection-failure",
+ "subRequestId": "remote-ansible-connection-failure-1",
+ "flags": null
+ },
+ "actionIdentifiers": {
+ "blueprintName": "RT-remote-ansible",
+ "blueprintVersion": "1.0.0",
+ "actionName": "connection-fail",
+ "mode": "sync"
+ },
+ "status": {
+ "code": 500,
+ "eventType": "EVENT_COMPONENT_FAILURE",
+ "timestamp": "2020-05-01T19:38:57.551Z",
+ "errorMessage": "error : ansible-command-logs : Failed to process on remote executor (Connect to localhost:12345 [localhost/127.0.0.1] failed: Connection refused (Connection refused))",
+ "message": "failure"
+ },
+ "payload": {
+ "connection-fail-response": {
+ "ansible-command-status": "error",
+ "ansible-command-logs": "Failed to process on remote executor (Connect to localhost:12345 [localhost/127.0.0.1] failed: Connection refused (Connection refused))"
+ }
+ }
+}
diff --git a/cds-regression-test/test/remote-ansible/connection-failure/request-payload.json b/cds-regression-test/test/remote-ansible/connection-failure/request-payload.json
new file mode 100644
index 0000000..08e39c7
--- /dev/null
+++ b/cds-regression-test/test/remote-ansible/connection-failure/request-payload.json
@@ -0,0 +1,27 @@
+{
+ "commonHeader": {
+ "originatorId": "System",
+ "requestId": "remote-ansible-connection-failure",
+ "subRequestId": "remote-ansible-connection-failure-1"
+ },
+ "actionIdentifiers": {
+ "blueprintName": "RT-remote-ansible",
+ "blueprintVersion": "1.0.0",
+ "actionName": "connection-fail",
+ "mode": "sync"
+ },
+ "payload": {
+ "connection-fail-request": {
+ "endpoint-selector": "awx",
+ "job-template-name": "hello_world_job_template",
+ "inventory": "Demo Inventory",
+ "limit": "123",
+ "tags": "some-tag",
+ "skip-tags": "some-skip-tag",
+ "extra-vars": {
+ "site_id": "3 - Belmont",
+ "tor_group": "vEPC"
+ }
+ }
+ }
+}
diff --git a/cds-regression-test/test/remote-ansible/connection-failure/test.sh b/cds-regression-test/test/remote-ansible/connection-failure/test.sh
new file mode 100644
index 0000000..7c880fe
--- /dev/null
+++ b/cds-regression-test/test/remote-ansible/connection-failure/test.sh
@@ -0,0 +1,25 @@
+#!/bin/bash
+
+CBA_NAME="remote-ansible"
+TEST_NAME="connection-failure"
+TEST_NUMBER=$RANDOM
+
+mkdir -p "$RESPONSES_DIRECTORY/$CBA_NAME/$TEST_NAME/$TEST_NUMBER/"
+RESPONSE_HEADERS_FILE="$RESPONSES_DIRECTORY/$CBA_NAME/$TEST_NAME/$TEST_NUMBER/response-headers"
+RESPONSE_PAYLOAD_FILE="$RESPONSES_DIRECTORY/$CBA_NAME/$TEST_NAME/$TEST_NUMBER/response-payload"
+
+REQUEST_PAYLOAD_FILE="$TEST_DIRECTORY/$CBA_NAME/$TEST_NAME/request-payload.json"
+EXPECTED_PAYLOAD_FILE="$TEST_DIRECTORY/$CBA_NAME/$TEST_NAME/expected-response.json"
+
+. ./$TEST_DIRECTORY/utils.sh
+
+echo "Running test: $CBA_NAME:$TEST_NUMBER:$TEST_NAME"
+
+echo 'Calling CDS process'
+process_cba $REQUEST_PAYLOAD_FILE $RESPONSE_PAYLOAD_FILE $RESPONSE_HEADERS_FILE
+
+echo 'Assert statuscode'
+assert_status_code 500 $RESPONSE_HEADERS_FILE
+
+echo 'Assert payload'
+assert_cds_response_equals $EXPECTED_PAYLOAD_FILE $RESPONSE_PAYLOAD_FILE
diff --git a/cds-regression-test/test/remote-ansible/dummy-request-payload.json b/cds-regression-test/test/remote-ansible/dummy-request-payload.json
new file mode 100644
index 0000000..5bb8112
--- /dev/null
+++ b/cds-regression-test/test/remote-ansible/dummy-request-payload.json
@@ -0,0 +1,14 @@
+{
+ "commonHeader": {
+ "originatorId": "System",
+ "requestId": "dummy-request-should-fail",
+ "subRequestId": "1"
+ },
+ "actionIdentifiers": {
+ "blueprintName": "RT-remote-ansible",
+ "blueprintVersion": "1.0.0",
+ "actionName": "dummy",
+ "mode": "sync"
+ },
+ "payload": {}
+}
diff --git a/cds-regression-test/test/remote-ansible/failure/resources/elalto/expected-response.json b/cds-regression-test/test/remote-ansible/failure/resources/elalto/expected-response.json
new file mode 100644
index 0000000..050e328
--- /dev/null
+++ b/cds-regression-test/test/remote-ansible/failure/resources/elalto/expected-response.json
@@ -0,0 +1,28 @@
+{
+ "commonHeader": {
+ "timestamp": "2020-05-01T18:55:44.034Z",
+ "originatorId": "System",
+ "requestId": "remote-ansible-failure",
+ "subRequestId": "remote-ansible-failure-1",
+ "flags": null
+ },
+ "actionIdentifiers": {
+ "blueprintName": "RT-remote-ansible",
+ "blueprintVersion": "1.0.0",
+ "actionName": "execute-remote-ansible-failure",
+ "mode": "sync"
+ },
+ "status": {
+ "code": 500,
+ "eventType": "EVENT_COMPONENT_FAILURE",
+ "timestamp": "2020-05-01T18:55:44.046Z",
+ "errorMessage": "error : ansible-command-logs : Failed to process on remote executor (mapper.readTree(response.body) must not be null)",
+ "message": "failure"
+ },
+ "payload": {
+ "execute-remote-ansible-failure-response": {
+ "ansible-command-status": "error",
+ "ansible-command-logs": "Failed to process on remote executor (mapper.readTree(response.body) must not be null)"
+ }
+ }
+}
diff --git a/cds-regression-test/test/remote-ansible/failure/resources/elalto/request-payload.json b/cds-regression-test/test/remote-ansible/failure/resources/elalto/request-payload.json
new file mode 100644
index 0000000..a4589ae
--- /dev/null
+++ b/cds-regression-test/test/remote-ansible/failure/resources/elalto/request-payload.json
@@ -0,0 +1,27 @@
+{
+ "commonHeader": {
+ "originatorId": "System",
+ "requestId": "remote-ansible-failure",
+ "subRequestId": "remote-ansible-failure-1"
+ },
+ "actionIdentifiers": {
+ "blueprintName": "RT-remote-ansible",
+ "blueprintVersion": "1.0.0",
+ "actionName": "execute-remote-ansible-failure",
+ "mode": "sync"
+ },
+ "payload": {
+ "execute-remote-ansible-failure-request": {
+ "endpoint-selector": "awx",
+ "job-template-name": "hello_world_job_template",
+ "inventory": "Demo Inventory",
+ "limit": "123",
+ "tags": "some-tag",
+ "skip-tags": "some-skip-tag",
+ "extra-vars": {
+ "site_id": "3 - Belmont",
+ "tor_group": "vEPC"
+ }
+ }
+ }
+}
diff --git a/cds-regression-test/test/remote-ansible/failure/resources/frankfurt/expected-response.json b/cds-regression-test/test/remote-ansible/failure/resources/frankfurt/expected-response.json
new file mode 100644
index 0000000..713b934
--- /dev/null
+++ b/cds-regression-test/test/remote-ansible/failure/resources/frankfurt/expected-response.json
@@ -0,0 +1,29 @@
+{
+ "correlationUUID": null,
+ "commonHeader": {
+ "timestamp": "2020-06-02T21:03:35.836Z",
+ "originatorId": "System",
+ "requestId": "remote-ansible-failure",
+ "subRequestId": "remote-ansible-failure-1",
+ "flags": null
+ },
+ "actionIdentifiers": {
+ "blueprintName": "RT-remote-ansible",
+ "blueprintVersion": "1.0.0",
+ "actionName": "execute-remote-ansible-failure",
+ "mode": "sync"
+ },
+ "status": {
+ "code": 500,
+ "eventType": "EVENT_COMPONENT_FAILURE",
+ "timestamp": "2020-06-02T21:03:38.655Z",
+ "errorMessage": "error : ansible-command-logs : Workflow/Job template hello_world_job_template does not exists",
+ "message": "failure"
+ },
+ "payload": {
+ "execute-remote-ansible-failure-response": {
+ "ansible-command-status": "error",
+ "ansible-command-logs": "Workflow/Job template hello_world_job_template does not exists"
+ }
+ }
+}
diff --git a/cds-regression-test/test/remote-ansible/failure/resources/frankfurt/request-payload.json b/cds-regression-test/test/remote-ansible/failure/resources/frankfurt/request-payload.json
new file mode 100644
index 0000000..a4589ae
--- /dev/null
+++ b/cds-regression-test/test/remote-ansible/failure/resources/frankfurt/request-payload.json
@@ -0,0 +1,27 @@
+{
+ "commonHeader": {
+ "originatorId": "System",
+ "requestId": "remote-ansible-failure",
+ "subRequestId": "remote-ansible-failure-1"
+ },
+ "actionIdentifiers": {
+ "blueprintName": "RT-remote-ansible",
+ "blueprintVersion": "1.0.0",
+ "actionName": "execute-remote-ansible-failure",
+ "mode": "sync"
+ },
+ "payload": {
+ "execute-remote-ansible-failure-request": {
+ "endpoint-selector": "awx",
+ "job-template-name": "hello_world_job_template",
+ "inventory": "Demo Inventory",
+ "limit": "123",
+ "tags": "some-tag",
+ "skip-tags": "some-skip-tag",
+ "extra-vars": {
+ "site_id": "3 - Belmont",
+ "tor_group": "vEPC"
+ }
+ }
+ }
+}
diff --git a/cds-regression-test/test/remote-ansible/failure/test.sh b/cds-regression-test/test/remote-ansible/failure/test.sh
new file mode 100644
index 0000000..c044762
--- /dev/null
+++ b/cds-regression-test/test/remote-ansible/failure/test.sh
@@ -0,0 +1,26 @@
+#!/bin/bash
+
+CBA_NAME="remote-ansible"
+TEST_NAME="failure"
+TEST_NUMBER=$RANDOM
+
+mkdir -p "$RESPONSES_DIRECTORY/$CBA_NAME/$TEST_NAME/$TEST_NUMBER/"
+RESPONSE_HEADERS_FILE="$RESPONSES_DIRECTORY/$CBA_NAME/$TEST_NAME/$TEST_NUMBER/response-headers"
+RESPONSE_PAYLOAD_FILE="$RESPONSES_DIRECTORY/$CBA_NAME/$TEST_NAME/$TEST_NUMBER/response-payload"
+
+RESOURCES_DIR="$TEST_DIRECTORY/$CBA_NAME/$TEST_NAME/resources/$CDS_VERSION"
+REQUEST_PAYLOAD_FILE="$RESOURCES_DIR/request-payload.json"
+EXPECTED_PAYLOAD_FILE="$RESOURCES_DIR/expected-response.json"
+
+. ./$TEST_DIRECTORY/utils.sh
+
+echo "Running test: $CBA_NAME:$TEST_NUMBER:$TEST_NAME"
+
+echo 'Calling CDS process'
+process_cba $REQUEST_PAYLOAD_FILE $RESPONSE_PAYLOAD_FILE $RESPONSE_HEADERS_FILE
+
+echo 'Assert statuscode'
+assert_status_code 500 $RESPONSE_HEADERS_FILE
+
+echo 'Assert payload'
+assert_cds_response_equals $EXPECTED_PAYLOAD_FILE $RESPONSE_PAYLOAD_FILE
diff --git a/cds-regression-test/test/remote-ansible/init-mockserver.sh b/cds-regression-test/test/remote-ansible/init-mockserver.sh
new file mode 100755
index 0000000..c737b9e
--- /dev/null
+++ b/cds-regression-test/test/remote-ansible/init-mockserver.sh
@@ -0,0 +1,39 @@
+#!/bin/bash
+
+CBA_NAME="remote-ansible"
+DIR_PAYLOADS="$TEST_DIRECTORY/$CBA_NAME/mock-payloads"
+
+# JOB TEMPLATE
+echo "Mocking Job Template route..."
+JT_PAYLOAD="job-template.json"
+curl -v -X PUT "http://$MOCKSERVER_URL:$MOCKSERVER_PORT/mockserver/expectation" -d "@$DIR_PAYLOADS/$JT_PAYLOAD"
+
+# JOB TEMPLATE ERROR
+echo "Mocking Job Template Error route..."
+JT_ERR_PAYLOAD="job-template-error.json"
+curl -v -X PUT "http://$MOCKSERVER_URL:$MOCKSERVER_PORT/mockserver/expectation" -d "@$DIR_PAYLOADS/$JT_ERR_PAYLOAD"
+
+# JOB TEMPLATE LAUNCH - GET
+echo "Mocking Job Template Launch GET route..."
+GET_JT_LAUNCH_PAYLOAD="get_job-template-launch.json"
+curl -v -X PUT "http://$MOCKSERVER_URL:$MOCKSERVER_PORT/mockserver/expectation" -d "@$DIR_PAYLOADS/$GET_JT_LAUNCH_PAYLOAD"
+
+# JOB TEMPLATE LAUNCH
+echo "Mocking Inventory route..."
+INVENTORY_PAYLOAD="inventory.json"
+curl -v -X PUT "http://$MOCKSERVER_URL:$MOCKSERVER_PORT/mockserver/expectation" -d "@$DIR_PAYLOADS/$INVENTORY_PAYLOAD"
+
+# JOB TEMPLATE LAUNCH - POST
+echo "Mocking Job Template Launch POST route..."
+POST_JT_LAUNCH_PAYLOAD="post_job-template-launch.json"
+curl -v -X PUT "http://$MOCKSERVER_URL:$MOCKSERVER_PORT/mockserver/expectation" -d "@$DIR_PAYLOADS/$POST_JT_LAUNCH_PAYLOAD"
+
+# JOB EXECUTION
+echo "Mocking Job Execution route..."
+JOB_EXECUTION_PAYLOAD="job-execution.json"
+curl -v -X PUT "http://$MOCKSERVER_URL:$MOCKSERVER_PORT/mockserver/expectation" -d "@$DIR_PAYLOADS/$JOB_EXECUTION_PAYLOAD"
+
+# JOB OUTPUT
+echo "Mocking Job Output route..."
+JOB_OUTPUT_PAYLOAD="job-output.json"
+curl -v -X PUT "http://$MOCKSERVER_URL:$MOCKSERVER_PORT/mockserver/expectation" -d "@$DIR_PAYLOADS/$JOB_OUTPUT_PAYLOAD"
diff --git a/cds-regression-test/test/remote-ansible/mock-payloads/get_job-template-launch.json b/cds-regression-test/test/remote-ansible/mock-payloads/get_job-template-launch.json
new file mode 100644
index 0000000..ed7904d
--- /dev/null
+++ b/cds-regression-test/test/remote-ansible/mock-payloads/get_job-template-launch.json
@@ -0,0 +1,46 @@
+{
+ "httpRequest": {
+ "method": "GET",
+ "path": "/remote-ansible/success/api/v2/job_templates/123/launch/"
+ },
+ "httpResponse": {
+ "body": {
+ "can_start_without_user_input": false,
+ "passwords_needed_to_start": [],
+ "ask_variables_on_launch": true,
+ "ask_tags_on_launch": true,
+ "ask_diff_mode_on_launch": false,
+ "ask_skip_tags_on_launch": true,
+ "ask_job_type_on_launch": false,
+ "ask_limit_on_launch": true,
+ "ask_verbosity_on_launch": false,
+ "ask_inventory_on_launch": true,
+ "ask_credential_on_launch": true,
+ "survey_enabled": true,
+ "variables_needed_to_start": [
+ "tor_group",
+ "site_id"
+ ],
+ "credential_needed_to_start": false,
+ "inventory_needed_to_start": false,
+ "job_template_data": {
+ "name": "hello_world_job_template",
+ "id": "123",
+ "description": "hello_world Runner Job Template"
+ },
+ "defaults": {
+ "extra_vars": "",
+ "diff_mode": false,
+ "limit": "",
+ "job_tags": "",
+ "skip_tags": "",
+ "job_type": "run",
+ "verbosity": 0,
+ "inventory": {
+ "name": "Demo Inventory",
+ "id": 1
+ }
+ }
+ }
+ }
+}
diff --git a/cds-regression-test/test/remote-ansible/mock-payloads/inventory.json b/cds-regression-test/test/remote-ansible/mock-payloads/inventory.json
new file mode 100644
index 0000000..165b929
--- /dev/null
+++ b/cds-regression-test/test/remote-ansible/mock-payloads/inventory.json
@@ -0,0 +1,110 @@
+{
+ "httpRequest": {
+ "method": "GET",
+ "path": "/remote-ansible/success/api/v2/inventories/"
+ },
+ "httpResponse": {
+ "body": {
+ "count": 1,
+ "next": null,
+ "previous": null,
+ "results": [
+ {
+ "id": 1,
+ "type": "inventory",
+ "url": "/api/v2/inventories/1/",
+ "related": {
+ "created_by": "/api/v2/users/1/",
+ "modified_by": "/api/v2/users/1/",
+ "hosts": "/api/v2/inventories/1/hosts/",
+ "groups": "/api/v2/inventories/1/groups/",
+ "root_groups": "/api/v2/inventories/1/root_groups/",
+ "variable_data": "/api/v2/inventories/1/variable_data/",
+ "script": "/api/v2/inventories/1/script/",
+ "tree": "/api/v2/inventories/1/tree/",
+ "inventory_sources": "/api/v2/inventories/1/inventory_sources/",
+ "update_inventory_sources": "/api/v2/inventories/1/update_inventory_sources/",
+ "activity_stream": "/api/v2/inventories/1/activity_stream/",
+ "job_templates": "/api/v2/inventories/1/job_templates/",
+ "ad_hoc_commands": "/api/v2/inventories/1/ad_hoc_commands/",
+ "access_list": "/api/v2/inventories/1/access_list/",
+ "object_roles": "/api/v2/inventories/1/object_roles/",
+ "instance_groups": "/api/v2/inventories/1/instance_groups/",
+ "copy": "/api/v2/inventories/1/copy/",
+ "organization": "/api/v2/organizations/1/"
+ },
+ "summary_fields": {
+ "organization": {
+ "id": 1,
+ "name": "Default",
+ "description": ""
+ },
+ "created_by": {
+ "id": 1,
+ "username": "admin",
+ "first_name": "",
+ "last_name": ""
+ },
+ "modified_by": {
+ "id": 1,
+ "username": "admin",
+ "first_name": "",
+ "last_name": ""
+ },
+ "object_roles": {
+ "admin_role": {
+ "description": "Can manage all aspects of the inventory",
+ "name": "Admin",
+ "id": 21
+ },
+ "update_role": {
+ "description": "May update project or inventory or group using the configured source update system",
+ "name": "Update",
+ "id": 22
+ },
+ "adhoc_role": {
+ "description": "May run ad hoc commands on an inventory",
+ "name": "Ad Hoc",
+ "id": 23
+ },
+ "use_role": {
+ "description": "Can use the inventory in a job template",
+ "name": "Use",
+ "id": 24
+ },
+ "read_role": {
+ "description": "May view settings for the inventory",
+ "name": "Read",
+ "id": 25
+ }
+ },
+ "user_capabilities": {
+ "edit": true,
+ "delete": true,
+ "copy": true,
+ "adhoc": true
+ }
+ },
+ "created": "2019-05-21T15:45:31.954359Z",
+ "modified": "2019-05-21T15:45:31.954378Z",
+ "name": "Demo Inventory",
+ "description": "",
+ "organization": 1,
+ "kind": "",
+ "host_filter": null,
+ "variables": "",
+ "has_active_failures": false,
+ "total_hosts": 1,
+ "hosts_with_active_failures": 0,
+ "total_groups": 0,
+ "groups_with_active_failures": 0,
+ "has_inventory_sources": false,
+ "total_inventory_sources": 0,
+ "inventory_sources_with_failures": 0,
+ "insights_credential": null,
+ "pending_deletion": false
+ }
+ ]
+ }
+ }
+}
diff --git a/cds-regression-test/test/remote-ansible/mock-payloads/job-execution.json b/cds-regression-test/test/remote-ansible/mock-payloads/job-execution.json
new file mode 100644
index 0000000..e8df26b
--- /dev/null
+++ b/cds-regression-test/test/remote-ansible/mock-payloads/job-execution.json
@@ -0,0 +1,183 @@
+{
+ "httpRequest": {
+ "method": "GET",
+ "path": "/remote-ansible/success/api/v2/jobs/456/"
+ },
+ "httpResponse": {
+ "body": {
+ "id": "456",
+ "type": "job",
+ "url": "/api/v2/jobs/456/",
+ "related": {
+ "created_by": "/api/v2/users/1/",
+ "labels": "/api/v2/jobs/456/labels/",
+ "inventory": "/api/v2/inventories/1/",
+ "project": "/api/v2/projects/8/",
+ "extra_credentials": "/api/v2/jobs/456/extra_credentials/",
+ "credentials": "/api/v2/jobs/456/credentials/",
+ "unified_job_template": "/api/v2/job_templates/123/",
+ "stdout": "/api/v2/jobs/456/stdout/",
+ "job_events": "/api/v2/jobs/456/job_events/",
+ "job_host_summaries": "/api/v2/jobs/456/job_host_summaries/",
+ "activity_stream": "/api/v2/jobs/456/activity_stream/",
+ "notifications": "/api/v2/jobs/456/notifications/",
+ "job_template": "/api/v2/job_templates/123/",
+ "cancel": "/api/v2/jobs/456/cancel/",
+ "create_schedule": "/api/v2/jobs/456/create_schedule/",
+ "relaunch": "/api/v2/jobs/456/relaunch/"
+ },
+ "summary_fields": {
+ "inventory": {
+ "id": 1,
+ "name": "Demo Inventory",
+ "description": "",
+ "has_active_failures": false,
+ "total_hosts": 1,
+ "hosts_with_active_failures": 0,
+ "total_groups": 0,
+ "groups_with_active_failures": 0,
+ "has_inventory_sources": false,
+ "total_inventory_sources": 0,
+ "inventory_sources_with_failures": 0,
+ "organization_id": 1,
+ "kind": ""
+ },
+ "project": {
+ "id": 8,
+ "name": "cds_playbooks",
+ "description": "CDS - cds_playbooks Project",
+ "status": "ok",
+ "scm_type": ""
+ },
+ "job_template": {
+ "id": "123",
+ "name": "hello_world_job_template",
+ "description": "hello_world Runner Job Template"
+ },
+ "unified_job_template": {
+ "id": "123",
+ "name": "hello_world_job_template",
+ "description": "hello_world Runner Job Template",
+ "unified_job_type": "job"
+ },
+ "instance_group": {
+ "name": "tower",
+ "id": 1
+ },
+ "created_by": {
+ "id": 1,
+ "username": "admin",
+ "first_name": "",
+ "last_name": ""
+ },
+ "user_capabilities": {
+ "delete": true,
+ "start": true
+ },
+ "labels": {
+ "count": 0,
+ "results": []
+ },
+ "extra_credentials": [],
+ "credentials": []
+ },
+ "created": "2019-06-12T11:21:26.891986Z",
+ "modified": "2019-06-12T11:21:27.355185Z",
+ "name": "hello_world_job_template",
+ "description": "hello_world Runner Job Template",
+ "job_type": "run",
+ "inventory": 1,
+ "project": 8,
+ "playbook": "hello_world.yml",
+ "forks": 0,
+ "limit": "",
+ "verbosity": 0,
+ "extra_vars": "{\"tor_group\": \"vEPC\", \"site_id\": \"3 - Belmont\"}",
+ "job_tags": "",
+ "force_handlers": false,
+ "skip_tags": "",
+ "start_at_task": "",
+ "timeout": 0,
+ "use_fact_cache": false,
+ "unified_job_template": "123",
+ "launch_type": "manual",
+ "status": "successful",
+ "failed": false,
+ "started": "2019-06-12T11:21:27.510766Z",
+ "finished": "2019-06-12T11:21:48.993385Z",
+ "elapsed": 21.483,
+ "job_args": "[\"ansible-playbook\", \"-u\", \"root\", \"-i\", \"/tmp/awx_223_ft8hu4p4/tmptmtwllu4\", \"-e\", \"@/tmp/awx_223_ft8hu4p4/env/extravars\", \"hello_world.yml\"]",
+ "job_cwd": "/var/lib/awx/projects/cds_playbooks_folder",
+ "job_env": {
+ "HOSTNAME": "awx",
+ "LC_ALL": "en_US.UTF-8",
+ "VIRTUAL_ENV": "/var/lib/awx/venv/ansible",
+ "PATH": "/var/lib/awx/venv/ansible/bin:/var/lib/awx/venv/awx/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
+ "SUPERVISOR_GROUP_NAME": "tower-processes",
+ "PWD": "/var/lib/awx",
+ "LANG": "en_US.UTF-8",
+ "PS1": "(awx) ",
+ "SUPERVISOR_ENABLED": "1",
+ "HOME": "/var/lib/awx",
+ "SHLVL": "2",
+ "LANGUAGE": "en_US.UTF-8",
+ "LC_CTYPE": "en_US.UTF-8",
+ "SUPERVISOR_PROCESS_NAME": "dispatcher",
+ "SUPERVISOR_SERVER_URL": "unix:///tmp/supervisor.sock",
+ "DJANGO_SETTINGS_MODULE": "awx.settings.production",
+ "DJANGO_LIVE_TEST_SERVER_ADDRESS": "localhost:9013-9199",
+ "TZ": "UTC",
+ "ANSIBLE_FORCE_COLOR": "True",
+ "ANSIBLE_HOST_KEY_CHECKING": "False",
+ "ANSIBLE_INVENTORY_UNPARSED_FAILED": "True",
+ "ANSIBLE_PARAMIKO_RECORD_HOST_KEYS": "False",
+ "ANSIBLE_VENV_PATH": "/var/lib/awx/venv/ansible",
+ "AWX_PRIVATE_DATA_DIR": "/tmp/awx_223_ft8hu4p4",
+ "PYTHONPATH": "/var/lib/awx/venv/ansible/lib/python2.7/site-packages:/var/lib/awx/venv/awx/lib64/python3.6/site-packages/awx/lib:",
+ "JOB_ID": "456",
+ "INVENTORY_ID": "1",
+ "PROJECT_REVISION": "",
+ "ANSIBLE_RETRY_FILES_ENABLED": "False",
+ "MAX_EVENT_RES": "700000",
+ "ANSIBLE_CALLBACK_PLUGINS": "/var/lib/awx/venv/awx/lib64/python3.6/site-packages/awx/plugins/callback",
+ "AWX_HOST": "https://towerhost",
+ "ANSIBLE_SSH_CONTROL_PATH_DIR": "/tmp/awx_223_ft8hu4p4/cp",
+ "ANSIBLE_STDOUT_CALLBACK": "awx_display",
+ "AWX_ISOLATED_DATA_DIR": "/tmp/awx_223_ft8hu4p4/artifacts/456"
+ },
+ "job_explanation": "",
+ "execution_node": "awx",
+ "controller_node": "",
+ "result_traceback": "",
+ "event_processing_finished": true,
+ "job_template": "123",
+ "passwords_needed_to_start": [],
+ "ask_diff_mode_on_launch": false,
+ "ask_variables_on_launch": true,
+ "ask_limit_on_launch": true,
+ "ask_tags_on_launch": true,
+ "ask_skip_tags_on_launch": true,
+ "ask_job_type_on_launch": false,
+ "ask_verbosity_on_launch": false,
+ "ask_inventory_on_launch": true,
+ "ask_credential_on_launch": true,
+ "allow_simultaneous": false,
+ "artifacts": {},
+ "scm_revision": "",
+ "instance_group": 1,
+ "diff_mode": false,
+ "job_slice_number": 0,
+ "job_slice_count": 1,
+ "host_status_counts": {
+ "ok": 1
+ },
+ "playbook_counts": {
+ "play_count": 1,
+ "task_count": 2
+ },
+ "custom_virtualenv": "/var/lib/awx/venv/ansible",
+ "credential": null,
+ "vault_credential": null
+ }
+ }
+}
diff --git a/cds-regression-test/test/remote-ansible/mock-payloads/job-output.json b/cds-regression-test/test/remote-ansible/mock-payloads/job-output.json
new file mode 100644
index 0000000..4ae2a49
--- /dev/null
+++ b/cds-regression-test/test/remote-ansible/mock-payloads/job-output.json
@@ -0,0 +1,24 @@
+{
+ "httpRequest" : {
+ "method" : "GET",
+ "path" : "/remote-ansible/success/api/v2/jobs/456/stdout/"
+ },
+ "httpResponse" : {
+ "body" : "
+
+ PLAY [Hello World Sample] ******************************************************
+
+ TASK [Gathering Facts] *********************************************************
+ ok: [localhost]
+
+ TASK [Hello Message] ***********************************************************
+ ok: [localhost] => {
+ \"msg\": \"Hello World!\"
+ }
+
+ PLAY RECAP *********************************************************************
+ localhost : ok=2 changed=0 unreachable=0 failed=0
+
+"
+ }
+}
diff --git a/cds-regression-test/test/remote-ansible/mock-payloads/job-template-error.json b/cds-regression-test/test/remote-ansible/mock-payloads/job-template-error.json
new file mode 100644
index 0000000..49a9798
--- /dev/null
+++ b/cds-regression-test/test/remote-ansible/mock-payloads/job-template-error.json
@@ -0,0 +1,8 @@
+{
+ "httpRequest": {
+ "path": "/remote-ansible/failure/api/v2/job_templates/hello_world_job_template/"
+ },
+ "httpResponse": {
+ "statusCode": 500
+ }
+}
diff --git a/cds-regression-test/test/remote-ansible/mock-payloads/job-template.json b/cds-regression-test/test/remote-ansible/mock-payloads/job-template.json
new file mode 100644
index 0000000..10552c4
--- /dev/null
+++ b/cds-regression-test/test/remote-ansible/mock-payloads/job-template.json
@@ -0,0 +1,224 @@
+{
+ "httpRequest": {
+ "method": "GET",
+ "path": "/remote-ansible/success/api/v2/job_templates/hello_world_job_template/"
+ },
+ "httpResponse": {
+ "body": {
+ "id": "123",
+ "type": "job_template",
+ "url": "/api/v2/job_templates/123/",
+ "related": {
+ "named_url": "/api/v2/job_templates/hello_world_job_template/",
+ "created_by": "/api/v2/users/1/",
+ "modified_by": "/api/v2/users/1/",
+ "labels": "/api/v2/job_templates/123/labels/",
+ "inventory": "/api/v2/inventories/1/",
+ "project": "/api/v2/projects/8/",
+ "extra_credentials": "/api/v2/job_templates/123/extra_credentials/",
+ "credentials": "/api/v2/job_templates/123/credentials/",
+ "last_job": "/api/v2/jobs/222/",
+ "jobs": "/api/v2/job_templates/123/jobs/",
+ "schedules": "/api/v2/job_templates/123/schedules/",
+ "activity_stream": "/api/v2/job_templates/123/activity_stream/",
+ "launch": "/api/v2/job_templates/123/launch/",
+ "notification_templates_any": "/api/v2/job_templates/123/notification_templates_any/",
+ "notification_templates_success": "/api/v2/job_templates/123/notification_templates_success/",
+ "notification_templates_error": "/api/v2/job_templates/123/notification_templates_error/",
+ "access_list": "/api/v2/job_templates/123/access_list/",
+ "survey_spec": "/api/v2/job_templates/123/survey_spec/",
+ "object_roles": "/api/v2/job_templates/123/object_roles/",
+ "instance_groups": "/api/v2/job_templates/123/instance_groups/",
+ "slice_workflow_jobs": "/api/v2/job_templates/123/slice_workflow_jobs/",
+ "copy": "/api/v2/job_templates/123/copy/"
+ },
+ "summary_fields": {
+ "inventory": {
+ "id": 1,
+ "name": "Demo Inventory",
+ "description": "",
+ "has_active_failures": false,
+ "total_hosts": 1,
+ "hosts_with_active_failures": 0,
+ "total_groups": 0,
+ "groups_with_active_failures": 0,
+ "has_inventory_sources": false,
+ "total_inventory_sources": 0,
+ "inventory_sources_with_failures": 0,
+ "organization_id": 1,
+ "kind": ""
+ },
+ "project": {
+ "id": 8,
+ "name": "cds_playbooks",
+ "description": "CDS - cds_playbooks Project",
+ "status": "ok",
+ "scm_type": ""
+ },
+ "last_job": {
+ "id": 222,
+ "name": "hello_world_job_template",
+ "description": "hello_world Runner Job Template",
+ "finished": "2019-06-12T11:20:27.892787Z",
+ "status": "successful",
+ "failed": false
+ },
+ "last_update": {
+ "id": 222,
+ "name": "hello_world_job_template",
+ "description": "hello_world Runner Job Template",
+ "status": "successful",
+ "failed": false
+ },
+ "created_by": {
+ "id": 1,
+ "username": "admin",
+ "first_name": "",
+ "last_name": ""
+ },
+ "modified_by": {
+ "id": 1,
+ "username": "admin",
+ "first_name": "",
+ "last_name": ""
+ },
+ "object_roles": {
+ "admin_role": {
+ "description": "Can manage all aspects of the job template",
+ "name": "Admin",
+ "id": 51
+ },
+ "execute_role": {
+ "description": "May run the job template",
+ "name": "Execute",
+ "id": 52
+ },
+ "read_role": {
+ "description": "May view settings for the job template",
+ "name": "Read",
+ "id": 53
+ }
+ },
+ "user_capabilities": {
+ "edit": true,
+ "delete": true,
+ "start": true,
+ "schedule": true,
+ "copy": true
+ },
+ "labels": {
+ "count": 0,
+ "results": []
+ },
+ "survey": {
+ "title": "",
+ "description": ""
+ },
+ "recent_jobs": [
+ {
+ "id": 222,
+ "status": "successful",
+ "finished": "2019-06-12T11:20:27.892787Z",
+ "type": "job"
+ },
+ {
+ "id": 65,
+ "status": "successful",
+ "finished": "2019-06-03T18:27:19.114796Z",
+ "type": "job"
+ },
+ {
+ "id": 64,
+ "status": "successful",
+ "finished": "2019-06-03T18:26:53.606618Z",
+ "type": "job"
+ },
+ {
+ "id": 63,
+ "status": "successful",
+ "finished": "2019-06-03T18:24:36.072943Z",
+ "type": "job"
+ },
+ {
+ "id": 62,
+ "status": "successful",
+ "finished": "2019-06-03T18:17:50.616528Z",
+ "type": "job"
+ },
+ {
+ "id": 61,
+ "status": "successful",
+ "finished": "2019-06-03T18:04:42.995611Z",
+ "type": "job"
+ },
+ {
+ "id": 60,
+ "status": "successful",
+ "finished": "2019-06-03T17:47:13.983951Z",
+ "type": "job"
+ },
+ {
+ "id": 50,
+ "status": "successful",
+ "finished": "2019-05-30T15:47:55.700161Z",
+ "type": "job"
+ },
+ {
+ "id": 49,
+ "status": "successful",
+ "finished": "2019-05-29T14:46:51.615926Z",
+ "type": "job"
+ },
+ {
+ "id": 47,
+ "status": "successful",
+ "finished": "2019-05-27T20:23:58.656709Z",
+ "type": "job"
+ }
+ ],
+ "extra_credentials": [],
+ "credentials": []
+ },
+ "created": "2019-05-21T19:28:05.953730Z",
+ "modified": "2019-05-21T20:06:55.728697Z",
+ "name": "hello_world_job_template",
+ "description": "hello_world Runner Job Template",
+ "job_type": "run",
+ "inventory": 1,
+ "project": 8,
+ "playbook": "hello_world.yml",
+ "forks": 0,
+ "limit": "",
+ "verbosity": 0,
+ "extra_vars": "",
+ "job_tags": "",
+ "force_handlers": false,
+ "skip_tags": "",
+ "start_at_task": "",
+ "timeout": 0,
+ "use_fact_cache": false,
+ "last_job_run": "2019-06-12T11:20:27.892787Z",
+ "last_job_failed": false,
+ "next_job_run": null,
+ "status": "successful",
+ "host_config_key": "",
+ "ask_diff_mode_on_launch": false,
+ "ask_variables_on_launch": true,
+ "ask_limit_on_launch": true,
+ "ask_tags_on_launch": true,
+ "ask_skip_tags_on_launch": true,
+ "ask_job_type_on_launch": false,
+ "ask_verbosity_on_launch": false,
+ "ask_inventory_on_launch": true,
+ "ask_credential_on_launch": true,
+ "survey_enabled": true,
+ "become_enabled": false,
+ "diff_mode": false,
+ "allow_simultaneous": false,
+ "custom_virtualenv": null,
+ "job_slice_count": 1,
+ "credential": null,
+ "vault_credential": null
+ }
+ }
+}
diff --git a/cds-regression-test/test/remote-ansible/mock-payloads/post_job-template-launch.json b/cds-regression-test/test/remote-ansible/mock-payloads/post_job-template-launch.json
new file mode 100644
index 0000000..8484374
--- /dev/null
+++ b/cds-regression-test/test/remote-ansible/mock-payloads/post_job-template-launch.json
@@ -0,0 +1,144 @@
+{
+ "httpRequest": {
+ "method": "POST",
+ "path": "/remote-ansible/success/api/v2/job_templates/123/launch/"
+ },
+ "httpResponse": {
+ "body": {
+ "job": "456",
+ "ignored_fields": {},
+ "id": "456",
+ "type": "job",
+ "url": "/api/v2/jobs/456/",
+ "related": {
+ "created_by": "/api/v2/users/1/",
+ "modified_by": "/api/v2/users/1/",
+ "labels": "/api/v2/jobs/456/labels/",
+ "inventory": "/api/v2/inventories/1/",
+ "project": "/api/v2/projects/8/",
+ "extra_credentials": "/api/v2/jobs/456/extra_credentials/",
+ "credentials": "/api/v2/jobs/456/credentials/",
+ "unified_job_template": "/api/v2/job_templates/123/",
+ "stdout": "/api/v2/jobs/456/stdout/",
+ "job_events": "/api/v2/jobs/456/job_events/",
+ "job_host_summaries": "/api/v2/jobs/456/job_host_summaries/",
+ "activity_stream": "/api/v2/jobs/456/activity_stream/",
+ "notifications": "/api/v2/jobs/456/notifications/",
+ "job_template": "/api/v2/job_templates/123/",
+ "cancel": "/api/v2/jobs/456/cancel/",
+ "create_schedule": "/api/v2/jobs/456/create_schedule/",
+ "relaunch": "/api/v2/jobs/456/relaunch/"
+ },
+ "summary_fields": {
+ "inventory": {
+ "id": 1,
+ "name": "Demo Inventory",
+ "description": "",
+ "has_active_failures": false,
+ "total_hosts": 1,
+ "hosts_with_active_failures": 0,
+ "total_groups": 0,
+ "groups_with_active_failures": 0,
+ "has_inventory_sources": false,
+ "total_inventory_sources": 0,
+ "inventory_sources_with_failures": 0,
+ "organization_id": 1,
+ "kind": ""
+ },
+ "project": {
+ "id": 8,
+ "name": "cds_playbooks",
+ "description": "CDS - cds_playbooks Project",
+ "status": "ok",
+ "scm_type": ""
+ },
+ "job_template": {
+ "id": "123",
+ "name": "hello_world_job_template",
+ "description": "hello_world Runner Job Template"
+ },
+ "unified_job_template": {
+ "id": "123",
+ "name": "hello_world_job_template",
+ "description": "hello_world Runner Job Template",
+ "unified_job_type": "job"
+ },
+ "created_by": {
+ "id": 1,
+ "username": "admin",
+ "first_name": "",
+ "last_name": ""
+ },
+ "modified_by": {
+ "id": 1,
+ "username": "admin",
+ "first_name": "",
+ "last_name": ""
+ },
+ "user_capabilities": {
+ "delete": true,
+ "start": true
+ },
+ "labels": {
+ "count": 0,
+ "results": []
+ },
+ "extra_credentials": [],
+ "credentials": []
+ },
+ "created": "2019-06-12T11:21:26.891986Z",
+ "modified": "2019-06-12T11:21:27.016410Z",
+ "name": "hello_world_job_template",
+ "description": "hello_world Runner Job Template",
+ "job_type": "run",
+ "inventory": 1,
+ "project": 8,
+ "playbook": "hello_world.yml",
+ "forks": 0,
+ "limit": "",
+ "verbosity": 0,
+ "extra_vars": "{\"tor_group\": \"vEPC\", \"site_id\": \"3 - Belmont\"}",
+ "job_tags": "",
+ "force_handlers": false,
+ "skip_tags": "",
+ "start_at_task": "",
+ "timeout": 0,
+ "use_fact_cache": false,
+ "unified_job_template": "123",
+ "launch_type": "manual",
+ "status": "pending",
+ "failed": false,
+ "started": null,
+ "finished": null,
+ "elapsed": 0,
+ "job_args": "",
+ "job_cwd": "",
+ "job_env": {},
+ "job_explanation": "",
+ "execution_node": "",
+ "controller_node": "",
+ "result_traceback": "",
+ "event_processing_finished": false,
+ "job_template": "123",
+ "passwords_needed_to_start": [],
+ "ask_diff_mode_on_launch": false,
+ "ask_variables_on_launch": true,
+ "ask_limit_on_launch": true,
+ "ask_tags_on_launch": true,
+ "ask_skip_tags_on_launch": true,
+ "ask_job_type_on_launch": false,
+ "ask_verbosity_on_launch": false,
+ "ask_inventory_on_launch": true,
+ "ask_credential_on_launch": true,
+ "allow_simultaneous": false,
+ "artifacts": {},
+ "scm_revision": "",
+ "instance_group": null,
+ "diff_mode": false,
+ "job_slice_number": 0,
+ "job_slice_count": 1,
+ "credential": null,
+ "vault_credential": null
+ }
+ }
+}
diff --git a/cds-regression-test/test/remote-ansible/remote-ansible-enrichment-test.sh b/cds-regression-test/test/remote-ansible/remote-ansible-enrichment-test.sh
new file mode 100755
index 0000000..9e4de45
--- /dev/null
+++ b/cds-regression-test/test/remote-ansible/remote-ansible-enrichment-test.sh
@@ -0,0 +1,16 @@
+#!/bin/bash
+CBA_NAME="remote-ansible"
+TEST_NAME="$CBA_NAME-enrichment"
+TEST_NUMBER=$RANDOM
+RESPONSE_HEADERS_FILE="$RESPONSES_DIRECTORY/$TEST_NAME-$TEST_NUMBER-response-headers"
+
+. ./$TEST_DIRECTORY/utils.sh
+
+echo "Compressing CBA: $CBA_NAME"
+compress_cba $CBA_NAME
+
+echo "Enriching CBA: $CBA_NAME"
+enrich_cba $CBA_NAME $RESPONSE_HEADERS_FILE
+
+echo 'Assert status 200'
+assert_status_code 200 $RESPONSE_HEADERS_FILE
diff --git a/cds-regression-test/test/remote-ansible/remote-ansible-upload-test.sh b/cds-regression-test/test/remote-ansible/remote-ansible-upload-test.sh
new file mode 100755
index 0000000..334b9b9
--- /dev/null
+++ b/cds-regression-test/test/remote-ansible/remote-ansible-upload-test.sh
@@ -0,0 +1,20 @@
+#!/bin/bash
+CBA_NAME="remote-ansible"
+TEST_NAME="$CBA_NAME-upload"
+TEST_NUMBER=$RANDOM
+RESPONSE_HEADERS_FILE="$RESPONSES_DIRECTORY/$TEST_NAME-$TEST_NUMBER-response-headers"
+RESPONSE_PAYLOAD_FILE="$RESPONSES_DIRECTORY/$TEST_NAME-$TEST_NUMBER-response-payload"
+REQUEST_PAYLOAD_FILE="$TEST_DIRECTORY/$CBA_NAME/dummy-request-payload.json"
+
+. ./$TEST_DIRECTORY/utils.sh
+
+echo "Uploading CBA: $CBA_NAME"
+upload_cba $CBA_NAME $RESPONSE_PAYLOAD_FILE $RESPONSE_HEADERS_FILE
+
+echo 'Assert status 200'
+assert_status_code 200 $RESPONSE_HEADERS_FILE
+
+# This step prevents a race-condition for parallel process requests
+# when cba has not yet been written to filesystem
+echo 'Send process request to force CDS to load CBA to filesystem'
+process_cba $REQUEST_PAYLOAD_FILE '/dev/null' '/dev/null'
diff --git a/cds-regression-test/test/remote-ansible/success/expected-response.json b/cds-regression-test/test/remote-ansible/success/expected-response.json
new file mode 100644
index 0000000..9dce094
--- /dev/null
+++ b/cds-regression-test/test/remote-ansible/success/expected-response.json
@@ -0,0 +1,29 @@
+{
+ "correlationUUID": null,
+ "commonHeader": {
+ "timestamp": "2020-06-03T16:20:03.527Z",
+ "originatorId": "System",
+ "requestId": "remote-ansible-success",
+ "subRequestId": "remote-ansible-success-1",
+ "flags": null
+ },
+ "actionIdentifiers": {
+ "blueprintName": "RT-remote-ansible",
+ "blueprintVersion": "1.0.0",
+ "actionName": "execute-remote-ansible-success",
+ "mode": "sync"
+ },
+ "status": {
+ "code": 200,
+ "eventType": "EVENT_COMPONENT_EXECUTED",
+ "timestamp": "2020-06-03T16:20:18.859Z",
+ "errorMessage": null,
+ "message": "success"
+ },
+ "payload": {
+ "execute-remote-ansible-success-response": {
+ "ansible-command-status": "successful",
+ "ansible-command-logs": "Output for Job 456 :\n PLAY [Hello World Sample] ****************************************************** TASK [Gathering Facts] ********************************************************* ok: [localhost] TASK [Hello Message] *********************************************************** ok: [localhost] => { \"msg\": \"Hello World!\" } PLAY RECAP ********************************************************************* localhost : ok=2 changed=0 unreachable=0 failed=0\n"
+ }
+ }
+}
diff --git a/cds-regression-test/test/remote-ansible/success/request-payload.json b/cds-regression-test/test/remote-ansible/success/request-payload.json
new file mode 100644
index 0000000..3718c4d
--- /dev/null
+++ b/cds-regression-test/test/remote-ansible/success/request-payload.json
@@ -0,0 +1,27 @@
+{
+ "commonHeader": {
+ "originatorId": "System",
+ "requestId": "remote-ansible-success",
+ "subRequestId": "remote-ansible-success-1"
+ },
+ "actionIdentifiers": {
+ "blueprintName": "RT-remote-ansible",
+ "blueprintVersion": "1.0.0",
+ "actionName": "execute-remote-ansible-success",
+ "mode": "sync"
+ },
+ "payload": {
+ "execute-remote-ansible-success-request": {
+ "endpoint-selector": "awx",
+ "job-template-name": "hello_world_job_template",
+ "inventory": "Demo Inventory",
+ "limit": "123",
+ "tags": "some-tag",
+ "skip-tags": "some-skip-tag",
+ "extra-vars": {
+ "site_id": "3 - Belmont",
+ "tor_group": "vEPC"
+ }
+ }
+ }
+}
diff --git a/cds-regression-test/test/remote-ansible/success/test.sh b/cds-regression-test/test/remote-ansible/success/test.sh
new file mode 100644
index 0000000..eab16ca
--- /dev/null
+++ b/cds-regression-test/test/remote-ansible/success/test.sh
@@ -0,0 +1,25 @@
+#!/bin/bash
+
+CBA_NAME="remote-ansible"
+TEST_NAME="success"
+TEST_NUMBER=$RANDOM
+
+mkdir -p "$RESPONSES_DIRECTORY/$CBA_NAME/$TEST_NAME/$TEST_NUMBER/"
+RESPONSE_HEADERS_FILE="$RESPONSES_DIRECTORY/$CBA_NAME/$TEST_NAME/$TEST_NUMBER/response-headers"
+RESPONSE_PAYLOAD_FILE="$RESPONSES_DIRECTORY/$CBA_NAME/$TEST_NAME/$TEST_NUMBER/response-payload"
+
+REQUEST_PAYLOAD_FILE="$TEST_DIRECTORY/$CBA_NAME/$TEST_NAME/request-payload.json"
+EXPECTED_PAYLOAD_FILE="$TEST_DIRECTORY/$CBA_NAME/$TEST_NAME/expected-response.json"
+
+. ./$TEST_DIRECTORY/utils.sh
+
+echo "Running test: $CBA_NAME:$TEST_NUMBER:$TEST_NAME"
+
+echo 'Calling CDS process'
+process_cba $REQUEST_PAYLOAD_FILE $RESPONSE_PAYLOAD_FILE $RESPONSE_HEADERS_FILE
+
+echo 'Assert statuscode'
+assert_status_code_versioned 200 $RESPONSE_HEADERS_FILE $RESPONSE_PAYLOAD_FILE
+
+echo 'Assert payload'
+assert_cds_response_equals $EXPECTED_PAYLOAD_FILE $RESPONSE_PAYLOAD_FILE