Skip to content

Add prompt-on-launch support for workflow jobs#183

Open
PabloHiro wants to merge 1 commit intoansible:mainfrom
PabloHiro:feature/support-for-prompt-on-launch-workflow-job
Open

Add prompt-on-launch support for workflow jobs#183
PabloHiro wants to merge 1 commit intoansible:mainfrom
PabloHiro:feature/support-for-prompt-on-launch-workflow-job

Conversation

@PabloHiro
Copy link
Copy Markdown
Contributor

@PabloHiro PabloHiro commented Jan 22, 2026

Description

Added prompt-on-launch support for workflow jobs (aap_workflow_job resource and aap_workflow_job_launch action):

  • Job tags
  • Limit
  • Labels
  • Skip tags

These fields were already added to regular job templates in PR #178. This PR completes the feature by adding them to workflow job templates.

Also includes refactoring to improve code quality:

  • Created shared helper functions (GetLaunchConfiguration, CommonJobSchemaAttributes)
  • Fixed validation logic to handle unknown values on Create
  • Added comprehensive unit tests for new fields
  • Reduced code duplication to address SonarQube quality concerns

Related Issue: #130 / AAP-51746

Type of Change

  • New feature (non-breaking change that adds functionality)
  • Documentation update
  • Code refactoring (no functional changes)

Testing Checklist

Unit Tests

  • Unit tests added/updated for new code
  • All unit tests pass locally (make test)
  • Verified coverage locally (make testcov)

Acceptance Tests

  • Acceptance tests added/updated
  • Acceptance tests pass (see output below)

Code Quality

  • Linting passes (make lint)
  • Code follows existing patterns
  • PR is focused on a single feature/fix

Documentation

  • Documentation updated (if user-facing changes)
  • Examples updated (if applicable)
  • Docs regenerated (make generatedocs)

Testing Instructions

Run unit and acceptance tests. Check if the added scenarios make sense.

Changelog

  • Changelog entry added in changelogs/fragments/ (if applicable)
  • Format: YYYYMMDD-description.yml

Additional Notes

  • Created additional structs to accurately represent API models
  • Added more resources to the playbook that sets up acceptance tests.

AI Attribution

Assisted-by: Claude Opus 4.5

Summary by CodeRabbit

  • New Features

    • Added optional prompt-on-launch parameters: job_tags, labels, limit, and skip_tags for workflow job resource and launch action.
  • Documentation

    • Updated action and resource docs and added a Terraform note for write-only fields.
  • Refactor

    • Consolidated launch-and-wait flow and centralized prompt-field validation for more reliable launches.
  • Tests

    • Added unit and acceptance tests covering prompt-required fields, launch validation, and wait-for-completion.
  • Chores

    • Added changelog fragment, test playbook template, and acceptance test env variable.

@PabloHiro PabloHiro force-pushed the feature/support-for-prompt-on-launch-workflow-job branch from c0a8be3 to 436444b Compare January 22, 2026 09:39
@PabloHiro
Copy link
Copy Markdown
Contributor Author

PabloHiro commented Jan 22, 2026

Acceptance tests:

Details
==> Running acceptance tests...
TF_ACC=1 go test -count=1 -v ./...
?       github.com/ansible/terraform-provider-aap       [no test files]
=== RUN   TestCreateNamedURLBaseDetailModelAPIModel
=== RUN   TestCreateNamedURLBaseDetailModelAPIModel/test_id_only
=== RUN   TestCreateNamedURLBaseDetailModelAPIModel/test_null_values
--- PASS: TestCreateNamedURLBaseDetailModelAPIModel (0.00s)
    --- PASS: TestCreateNamedURLBaseDetailModelAPIModel/test_id_only (0.00s)
    --- PASS: TestCreateNamedURLBaseDetailModelAPIModel/test_null_values (0.00s)
=== RUN   TestCreateNamedURLOrganizationAPIModel
=== RUN   TestCreateNamedURLOrganizationAPIModel/test_id_only
=== RUN   TestCreateNamedURLOrganizationAPIModel/test_all_values
=== RUN   TestCreateNamedURLOrganizationAPIModel/test_id_null_and_name
=== RUN   TestCreateNamedURLOrganizationAPIModel/test_null_values
--- PASS: TestCreateNamedURLOrganizationAPIModel (0.00s)
    --- PASS: TestCreateNamedURLOrganizationAPIModel/test_id_only (0.00s)
    --- PASS: TestCreateNamedURLOrganizationAPIModel/test_all_values (0.00s)
    --- PASS: TestCreateNamedURLOrganizationAPIModel/test_id_null_and_name (0.00s)
    --- PASS: TestCreateNamedURLOrganizationAPIModel/test_null_values (0.00s)
=== RUN   TestCreateNamedURLBaseDetailAPIModelWithOrg
=== RUN   TestCreateNamedURLBaseDetailAPIModelWithOrg/test_id_only
=== RUN   TestCreateNamedURLBaseDetailAPIModelWithOrg/test_all_values
=== RUN   TestCreateNamedURLBaseDetailAPIModelWithOrg/test_id_and_organization_name
=== RUN   TestCreateNamedURLBaseDetailAPIModelWithOrg/test_id_and_name
=== RUN   TestCreateNamedURLBaseDetailAPIModelWithOrg/test_id_null,_name_and_organization_name
=== RUN   TestCreateNamedURLBaseDetailAPIModelWithOrg/test_null_values
=== RUN   TestCreateNamedURLBaseDetailAPIModelWithOrg/test_name_and_null_values
=== RUN   TestCreateNamedURLBaseDetailAPIModelWithOrg/test_organization_name_and_null_values
--- PASS: TestCreateNamedURLBaseDetailAPIModelWithOrg (0.00s)
    --- PASS: TestCreateNamedURLBaseDetailAPIModelWithOrg/test_id_only (0.00s)
    --- PASS: TestCreateNamedURLBaseDetailAPIModelWithOrg/test_all_values (0.00s)
    --- PASS: TestCreateNamedURLBaseDetailAPIModelWithOrg/test_id_and_organization_name (0.00s)
    --- PASS: TestCreateNamedURLBaseDetailAPIModelWithOrg/test_id_and_name (0.00s)
    --- PASS: TestCreateNamedURLBaseDetailAPIModelWithOrg/test_id_null,_name_and_organization_name (0.00s)
    --- PASS: TestCreateNamedURLBaseDetailAPIModelWithOrg/test_null_values (0.00s)
    --- PASS: TestCreateNamedURLBaseDetailAPIModelWithOrg/test_name_and_null_values (0.00s)
    --- PASS: TestCreateNamedURLBaseDetailAPIModelWithOrg/test_organization_name_and_null_values (0.00s)
=== RUN   TestBaseDataSourceMetadata
=== PAUSE TestBaseDataSourceMetadata
=== RUN   TestBaseDataSourceSchema
=== PAUSE TestBaseDataSourceSchema
=== RUN   TestBaseDataSourceConfigValidators
=== PAUSE TestBaseDataSourceConfigValidators
=== RUN   TestBaseEdaDataSourceMetadata
=== PAUSE TestBaseEdaDataSourceMetadata
=== RUN   TestBaseEdaDataSourceSchema
=== PAUSE TestBaseEdaDataSourceSchema
=== RUN   TestBaseEdaDataSourceConfigure
=== PAUSE TestBaseEdaDataSourceConfigure
=== RUN   TestBaseEdaDataSourceRead
=== PAUSE TestBaseEdaDataSourceRead
=== RUN   TestBaseEdaSourceModelParseHttpResponse
=== PAUSE TestBaseEdaSourceModelParseHttpResponse
=== RUN   TestIsContextActive
=== RUN   TestIsContextActive/test_context_active
=== RUN   TestIsContextActive/test_context_complete
--- PASS: TestIsContextActive (0.00s)
    --- PASS: TestIsContextActive/test_context_active (0.00s)
    --- PASS: TestIsContextActive/test_context_complete (0.00s)
=== RUN   TestNewBasicAuthenticator
=== RUN   TestNewBasicAuthenticator/Success_when_providing_username_and_password
=== RUN   TestNewBasicAuthenticator/Failure_when_username_and_password_are_nil
=== RUN   TestNewBasicAuthenticator/Failure_when_username_is_provided_and_password_is_nil
=== RUN   TestNewBasicAuthenticator/Failure_with_when_username_is_nil_and_password_is_provided
--- PASS: TestNewBasicAuthenticator (0.00s)
    --- PASS: TestNewBasicAuthenticator/Success_when_providing_username_and_password (0.00s)
    --- PASS: TestNewBasicAuthenticator/Failure_when_username_and_password_are_nil (0.00s)
    --- PASS: TestNewBasicAuthenticator/Failure_when_username_is_provided_and_password_is_nil (0.00s)
    --- PASS: TestNewBasicAuthenticator/Failure_with_when_username_is_nil_and_password_is_provided (0.00s)
=== RUN   TestBasicAuthenticatorConfigure
--- PASS: TestBasicAuthenticatorConfigure (0.00s)
=== RUN   TestNewTokenAuthenticator
=== RUN   TestNewTokenAuthenticator/Success_when_token_is_provided
=== RUN   TestNewTokenAuthenticator/Failure_when_token_is_nil_
--- PASS: TestNewTokenAuthenticator (0.00s)
    --- PASS: TestNewTokenAuthenticator/Success_when_token_is_provided (0.00s)
    --- PASS: TestNewTokenAuthenticator/Failure_when_token_is_nil_ (0.00s)
=== RUN   TestTokenAuthenticatorConfigure
=== RUN   TestTokenAuthenticatorConfigure/Configure_defaults_header_to_Authorization:_Bearer_...
--- PASS: TestTokenAuthenticatorConfigure (0.00s)
    --- PASS: TestTokenAuthenticatorConfigure/Configure_defaults_header_to_Authorization:_Bearer_... (0.00s)
=== RUN   TestComputeURLPath
=== RUN   TestComputeURLPath/case_1
=== RUN   TestComputeURLPath/case_2
=== RUN   TestComputeURLPath/case_3
=== RUN   TestComputeURLPath/case_4
--- PASS: TestComputeURLPath (0.00s)
    --- PASS: TestComputeURLPath/case_1 (0.00s)
    --- PASS: TestComputeURLPath/case_2 (0.00s)
    --- PASS: TestComputeURLPath/case_3 (0.00s)
    --- PASS: TestComputeURLPath/case_4 (0.00s)
=== RUN   TestReadAPIEndpoint
=== RUN   TestReadAPIEndpoint/AAP_2.4
=== RUN   TestReadAPIEndpoint/AAP_2.5+
=== RUN   TestReadAPIEndpoint/Failing_api_endpoint
=== RUN   TestReadAPIEndpoint/Bad_JSON
--- PASS: TestReadAPIEndpoint (0.00s)
    --- PASS: TestReadAPIEndpoint/AAP_2.4 (0.00s)
    --- PASS: TestReadAPIEndpoint/AAP_2.5+ (0.00s)
    --- PASS: TestReadAPIEndpoint/Failing_api_endpoint (0.00s)
    --- PASS: TestReadAPIEndpoint/Bad_JSON (0.00s)
=== RUN   TestReadAPIEndpointForController
=== RUN   TestReadAPIEndpointForController/Bad_Controller_Endpoint
=== RUN   TestReadAPIEndpointForController/Bad_Controller_JSON
--- PASS: TestReadAPIEndpointForController (0.00s)
    --- PASS: TestReadAPIEndpointForController/Bad_Controller_Endpoint (0.00s)
    --- PASS: TestReadAPIEndpointForController/Bad_Controller_JSON (0.00s)
=== RUN   TestReadAPIEndpointForEDA
=== RUN   TestReadAPIEndpointForEDA/Bad_EDA_Endpoint
=== RUN   TestReadAPIEndpointForEDA/Bad_EDA_JSON
=== RUN   TestReadAPIEndpointForEDA/Invalid_EDA_URL
--- PASS: TestReadAPIEndpointForEDA (0.00s)
    --- PASS: TestReadAPIEndpointForEDA/Bad_EDA_Endpoint (0.00s)
    --- PASS: TestReadAPIEndpointForEDA/Bad_EDA_JSON (0.00s)
    --- PASS: TestReadAPIEndpointForEDA/Invalid_EDA_URL (0.00s)
=== RUN   TestUpdateWithStatus
=== RUN   TestUpdateWithStatus/successful_update
=== RUN   TestUpdateWithStatus/conflict_error
=== RUN   TestUpdateWithStatus/not_found_error
=== RUN   TestUpdateWithStatus/server_error
--- PASS: TestUpdateWithStatus (0.00s)
    --- PASS: TestUpdateWithStatus/successful_update (0.00s)
    --- PASS: TestUpdateWithStatus/conflict_error (0.00s)
    --- PASS: TestUpdateWithStatus/not_found_error (0.00s)
    --- PASS: TestUpdateWithStatus/server_error (0.00s)
=== RUN   TestDeleteWithStatus
=== RUN   TestDeleteWithStatus/successful_delete_-_accepted
=== RUN   TestDeleteWithStatus/successful_delete_-_no_content
=== RUN   TestDeleteWithStatus/conflict_error
=== RUN   TestDeleteWithStatus/not_found_error
=== RUN   TestDeleteWithStatus/server_error
--- PASS: TestDeleteWithStatus (0.00s)
    --- PASS: TestDeleteWithStatus/successful_delete_-_accepted (0.00s)
    --- PASS: TestDeleteWithStatus/successful_delete_-_no_content (0.00s)
    --- PASS: TestDeleteWithStatus/conflict_error (0.00s)
    --- PASS: TestDeleteWithStatus/not_found_error (0.00s)
    --- PASS: TestDeleteWithStatus/server_error (0.00s)
=== RUN   TestUpdateReusesUpdateWithStatus
--- PASS: TestUpdateReusesUpdateWithStatus (0.00s)
=== RUN   TestDeleteReusesDeleteWithStatus
--- PASS: TestDeleteReusesDeleteWithStatus (0.00s)
=== RUN   TestNewEDAEventStreamDataSource
--- PASS: TestNewEDAEventStreamDataSource (0.00s)
=== RUN   TestAccEDAEventStreamDataSourceRetrievesPostURL
    provider_test.go:40: 'AAP_TOKEN' is set, using token authentication in acceptance tests
--- PASS: TestAccEDAEventStreamDataSourceRetrievesPostURL (5.95s)
=== RUN   TestEDAEventStreamPostActionSchema
=== PAUSE TestEDAEventStreamPostActionSchema
=== RUN   TestEDAEventStreamPostActionMetadata
=== PAUSE TestEDAEventStreamPostActionMetadata
=== RUN   TestCreateEventPayload
=== PAUSE TestCreateEventPayload
=== RUN   TestCreateRequest
=== RUN   TestCreateRequest/valid_context_produces_POST_request_with_auth_header_and_body
=== RUN   TestCreateRequest/empty_context_fails
--- PASS: TestCreateRequest (0.00s)
    --- PASS: TestCreateRequest/valid_context_produces_POST_request_with_auth_header_and_body (0.00s)
    --- PASS: TestCreateRequest/empty_context_fails (0.00s)
=== RUN   TestCreateClient
=== PAUSE TestCreateClient
=== RUN   TestExecuteRequest
=== PAUSE TestExecuteRequest
=== RUN   TestAccEDAEventStreamAfterCreateAction
--- PASS: TestAccEDAEventStreamAfterCreateAction (7.11s)
=== RUN   TestAccEDAEventStreamUnrelatedActionDoesNotTrigger
--- PASS: TestAccEDAEventStreamUnrelatedActionDoesNotTrigger (3.38s)
=== RUN   TestAccEDAEventStreamAfterUpdateAction
--- PASS: TestAccEDAEventStreamAfterUpdateAction (6.92s)
=== RUN   TestGroupResourceSchema
=== PAUSE TestGroupResourceSchema
=== RUN   TestGroupResourceCreateRequestBody
=== RUN   TestGroupResourceCreateRequestBody/test_with_unknown_values
=== RUN   TestGroupResourceCreateRequestBody/test_with_null_values
=== RUN   TestGroupResourceCreateRequestBody/test_with_some_values
=== RUN   TestGroupResourceCreateRequestBody/test_with_all_values
--- PASS: TestGroupResourceCreateRequestBody (0.00s)
    --- PASS: TestGroupResourceCreateRequestBody/test_with_unknown_values (0.00s)
    --- PASS: TestGroupResourceCreateRequestBody/test_with_null_values (0.00s)
    --- PASS: TestGroupResourceCreateRequestBody/test_with_some_values (0.00s)
    --- PASS: TestGroupResourceCreateRequestBody/test_with_all_values (0.00s)
=== RUN   TestGroupResourceParseHTTPResponse
=== RUN   TestGroupResourceParseHTTPResponse/test_with_JSON_error
=== RUN   TestGroupResourceParseHTTPResponse/test_with_missing_values
=== RUN   TestGroupResourceParseHTTPResponse/test_with_all_values
--- PASS: TestGroupResourceParseHTTPResponse (0.00s)
    --- PASS: TestGroupResourceParseHTTPResponse/test_with_JSON_error (0.00s)
    --- PASS: TestGroupResourceParseHTTPResponse/test_with_missing_values (0.00s)
    --- PASS: TestGroupResourceParseHTTPResponse/test_with_all_values (0.00s)
=== RUN   TestAccGroupResource
    provider_test.go:40: 'AAP_TOKEN' is set, using token authentication in acceptance tests
--- PASS: TestAccGroupResource (14.91s)
=== RUN   TestSliceDifference
--- PASS: TestSliceDifference (0.00s)
=== RUN   TestExtractIDs
--- PASS: TestExtractIDs (0.00s)
=== RUN   TestHostResourceSchema
=== PAUSE TestHostResourceSchema
=== RUN   TestHostResourceCreateRequestBody
=== RUN   TestHostResourceCreateRequestBody/test_with_unknown_values
=== RUN   TestHostResourceCreateRequestBody/test_with_null_values
=== RUN   TestHostResourceCreateRequestBody/test_with_some_values
=== RUN   TestHostResourceCreateRequestBody/test_with_all_values
--- PASS: TestHostResourceCreateRequestBody (0.00s)
    --- PASS: TestHostResourceCreateRequestBody/test_with_unknown_values (0.00s)
    --- PASS: TestHostResourceCreateRequestBody/test_with_null_values (0.00s)
    --- PASS: TestHostResourceCreateRequestBody/test_with_some_values (0.00s)
    --- PASS: TestHostResourceCreateRequestBody/test_with_all_values (0.00s)
=== RUN   TestHostResourceParseHTTPResponse
=== RUN   TestHostResourceParseHTTPResponse/test_with_JSON_error
=== RUN   TestHostResourceParseHTTPResponse/test_with_missing_values
=== RUN   TestHostResourceParseHTTPResponse/test_with_all_values
--- PASS: TestHostResourceParseHTTPResponse (0.00s)
    --- PASS: TestHostResourceParseHTTPResponse/test_with_JSON_error (0.00s)
    --- PASS: TestHostResourceParseHTTPResponse/test_with_missing_values (0.00s)
    --- PASS: TestHostResourceParseHTTPResponse/test_with_all_values (0.00s)
=== RUN   TestAccHostResource
    provider_test.go:40: 'AAP_TOKEN' is set, using token authentication in acceptance tests
--- PASS: TestAccHostResource (19.53s)
=== RUN   TestAccHostResourceDeleteWithRetry
    provider_test.go:40: 'AAP_TOKEN' is set, using token authentication in acceptance tests
--- PASS: TestAccHostResourceDeleteWithRetry (39.84s)
=== RUN   TestInventoryDataSourceSchema
=== PAUSE TestInventoryDataSourceSchema
=== RUN   TestInventoryDataSourceParseHTTPResponse
=== RUN   TestInventoryDataSourceParseHTTPResponse/JSON_error
=== RUN   TestInventoryDataSourceParseHTTPResponse/missing_values
=== RUN   TestInventoryDataSourceParseHTTPResponse/all_values
--- PASS: TestInventoryDataSourceParseHTTPResponse (0.00s)
    --- PASS: TestInventoryDataSourceParseHTTPResponse/JSON_error (0.00s)
    --- PASS: TestInventoryDataSourceParseHTTPResponse/missing_values (0.00s)
    --- PASS: TestInventoryDataSourceParseHTTPResponse/all_values (0.00s)
=== RUN   TestAccInventoryDataSource
    provider_test.go:40: 'AAP_TOKEN' is set, using token authentication in acceptance tests
--- PASS: TestAccInventoryDataSource (13.86s)
=== RUN   TestInventoryResourceSchema
=== PAUSE TestInventoryResourceSchema
=== RUN   TestInventoryResourceGenerateRequestBody
=== RUN   TestInventoryResourceGenerateRequestBody/unknown_values
=== RUN   TestInventoryResourceGenerateRequestBody/null_values
=== RUN   TestInventoryResourceGenerateRequestBody/provided_values
--- PASS: TestInventoryResourceGenerateRequestBody (0.00s)
    --- PASS: TestInventoryResourceGenerateRequestBody/unknown_values (0.00s)
    --- PASS: TestInventoryResourceGenerateRequestBody/null_values (0.00s)
    --- PASS: TestInventoryResourceGenerateRequestBody/provided_values (0.00s)
=== RUN   TestInventoryResourceParseHTTPResponse
=== RUN   TestInventoryResourceParseHTTPResponse/JSON_error
=== RUN   TestInventoryResourceParseHTTPResponse/missing_values
=== RUN   TestInventoryResourceParseHTTPResponse/all_values
--- PASS: TestInventoryResourceParseHTTPResponse (0.00s)
    --- PASS: TestInventoryResourceParseHTTPResponse/JSON_error (0.00s)
    --- PASS: TestInventoryResourceParseHTTPResponse/missing_values (0.00s)
    --- PASS: TestInventoryResourceParseHTTPResponse/all_values (0.00s)
=== RUN   TestAccInventoryResource
    provider_test.go:40: 'AAP_TOKEN' is set, using token authentication in acceptance tests
--- PASS: TestAccInventoryResource (18.58s)
=== RUN   TestJobLaunchActionSchema
=== PAUSE TestJobLaunchActionSchema
=== RUN   TestJobLaunchActionMetadata
=== PAUSE TestJobLaunchActionMetadata
=== RUN   TestJobLaunchActionConfigure
=== PAUSE TestJobLaunchActionConfigure
=== RUN   TestJobLaunchActionInvoke
=== PAUSE TestJobLaunchActionInvoke
=== RUN   TestAccAAPJobAction_basic
    provider_test.go:40: 'AAP_TOKEN' is set, using token authentication in acceptance tests
--- PASS: TestAccAAPJobAction_basic (14.73s)
=== RUN   TestAccAAPJobAction_fail
    provider_test.go:40: 'AAP_TOKEN' is set, using token authentication in acceptance tests
--- PASS: TestAccAAPJobAction_fail (12.92s)
=== RUN   TestAccAAPJobAction_failIgnore
    provider_test.go:40: 'AAP_TOKEN' is set, using token authentication in acceptance tests
--- PASS: TestAccAAPJobAction_failIgnore (15.05s)
=== RUN   TestAccAAPJobAction_AllFieldsOnPrompt
    provider_test.go:40: 'AAP_TOKEN' is set, using token authentication in acceptance tests
--- PASS: TestAccAAPJobAction_AllFieldsOnPrompt (14.99s)
=== RUN   TestAccAAPJobAction_AllFieldsOnPrompt_MissingRequired
    provider_test.go:40: 'AAP_TOKEN' is set, using token authentication in acceptance tests
--- PASS: TestAccAAPJobAction_AllFieldsOnPrompt_MissingRequired (4.11s)
=== RUN   TestJobResourceSchema
=== PAUSE TestJobResourceSchema
=== RUN   TestIsFinalStateAAPJob
=== RUN   TestIsFinalStateAAPJob/state_new
=== RUN   TestIsFinalStateAAPJob/state_pending
=== RUN   TestIsFinalStateAAPJob/state_waiting
=== RUN   TestIsFinalStateAAPJob/state_running
=== RUN   TestIsFinalStateAAPJob/state_successful
=== RUN   TestIsFinalStateAAPJob/state_failed
=== RUN   TestIsFinalStateAAPJob/state_error
=== RUN   TestIsFinalStateAAPJob/state_canceled
=== RUN   TestIsFinalStateAAPJob/state_empty_string
=== RUN   TestIsFinalStateAAPJob/state_random_string
--- PASS: TestIsFinalStateAAPJob (0.00s)
    --- PASS: TestIsFinalStateAAPJob/state_new (0.00s)
    --- PASS: TestIsFinalStateAAPJob/state_pending (0.00s)
    --- PASS: TestIsFinalStateAAPJob/state_waiting (0.00s)
    --- PASS: TestIsFinalStateAAPJob/state_running (0.00s)
    --- PASS: TestIsFinalStateAAPJob/state_successful (0.00s)
    --- PASS: TestIsFinalStateAAPJob/state_failed (0.00s)
    --- PASS: TestIsFinalStateAAPJob/state_error (0.00s)
    --- PASS: TestIsFinalStateAAPJob/state_canceled (0.00s)
    --- PASS: TestIsFinalStateAAPJob/state_empty_string (0.00s)
    --- PASS: TestIsFinalStateAAPJob/state_random_string (0.00s)
=== RUN   TestJobResourceCreateRequestBody
=== RUN   TestJobResourceCreateRequestBody/unknown_values
=== RUN   TestJobResourceCreateRequestBody/null_values
=== RUN   TestJobResourceCreateRequestBody/extra_vars_only
=== RUN   TestJobResourceCreateRequestBody/inventory_vars_only
=== RUN   TestJobResourceCreateRequestBody/combined
=== RUN   TestJobResourceCreateRequestBody/manual_triggers
=== RUN   TestJobResourceCreateRequestBody/wait_for_completed_parameters
--- PASS: TestJobResourceCreateRequestBody (0.00s)
    --- PASS: TestJobResourceCreateRequestBody/unknown_values (0.00s)
    --- PASS: TestJobResourceCreateRequestBody/null_values (0.00s)
    --- PASS: TestJobResourceCreateRequestBody/extra_vars_only (0.00s)
    --- PASS: TestJobResourceCreateRequestBody/inventory_vars_only (0.00s)
    --- PASS: TestJobResourceCreateRequestBody/combined (0.00s)
    --- PASS: TestJobResourceCreateRequestBody/manual_triggers (0.00s)
    --- PASS: TestJobResourceCreateRequestBody/wait_for_completed_parameters (0.00s)
=== RUN   TestJobResourceParseHTTPResponse
=== RUN   TestJobResourceParseHTTPResponse/JSON_error
=== RUN   TestJobResourceParseHTTPResponse/no_ignored_fields
=== RUN   TestJobResourceParseHTTPResponse/ignored_fields
--- PASS: TestJobResourceParseHTTPResponse (0.00s)
    --- PASS: TestJobResourceParseHTTPResponse/JSON_error (0.00s)
    --- PASS: TestJobResourceParseHTTPResponse/no_ignored_fields (0.00s)
    --- PASS: TestJobResourceParseHTTPResponse/ignored_fields (0.00s)
=== RUN   TestAccAAPJob_basic
    provider_test.go:40: 'AAP_TOKEN' is set, using token authentication in acceptance tests
--- PASS: TestAccAAPJob_basic (6.97s)
=== RUN   TestAccAAPJob_UpdateWithSameParameters
    provider_test.go:40: 'AAP_TOKEN' is set, using token authentication in acceptance tests
--- PASS: TestAccAAPJob_UpdateWithSameParameters (9.49s)
=== RUN   TestAccAAPJob_UpdateWithNewInventoryIdPromptOnLaunch
    provider_test.go:40: 'AAP_TOKEN' is set, using token authentication in acceptance tests
--- PASS: TestAccAAPJob_UpdateWithNewInventoryIdPromptOnLaunch (43.75s)
=== RUN   TestAccAAPJob_UpdateWithTrigger
    provider_test.go:40: 'AAP_TOKEN' is set, using token authentication in acceptance tests
--- PASS: TestAccAAPJob_UpdateWithTrigger (10.11s)
=== RUN   TestAccAAPJob_WaitForCompletion
    provider_test.go:40: 'AAP_TOKEN' is set, using token authentication in acceptance tests
--- PASS: TestAccAAPJob_WaitForCompletion (44.55s)
=== RUN   TestAccAAPJob_disappears
    provider_test.go:40: 'AAP_TOKEN' is set, using token authentication in acceptance tests
--- PASS: TestAccAAPJob_disappears (21.42s)
=== RUN   TestRetryUntilAAPJobReachesAnyFinalState_ErrorHandling
=== PAUSE TestRetryUntilAAPJobReachesAnyFinalState_ErrorHandling
=== RUN   TestRetryUntilAAPJobReachesAnyFinalState_LoggingBehavior
    job_resource_test.go:797: Job status: running
--- PASS: TestRetryUntilAAPJobReachesAnyFinalState_LoggingBehavior (0.00s)
=== RUN   TestAccAAPJob_AllFieldsOnPrompt
    provider_test.go:40: 'AAP_TOKEN' is set, using token authentication in acceptance tests
--- PASS: TestAccAAPJob_AllFieldsOnPrompt (17.63s)
=== RUN   TestAccAAPJob_AllFieldsOnPrompt_MissingRequired
    provider_test.go:40: 'AAP_TOKEN' is set, using token authentication in acceptance tests
--- PASS: TestAccAAPJob_AllFieldsOnPrompt_MissingRequired (1.86s)
=== RUN   TestJobModelCreateRequestBody
=== RUN   TestJobModelCreateRequestBody/unknown_values
=== RUN   TestJobModelCreateRequestBody/null_values
=== RUN   TestJobModelCreateRequestBody/extra_vars_only
=== RUN   TestJobModelCreateRequestBody/inventory_vars_only
=== RUN   TestJobModelCreateRequestBody/combined
=== RUN   TestJobModelCreateRequestBody/manual_triggers
=== RUN   TestJobModelCreateRequestBody/wait_for_completed_parameters
=== RUN   TestJobModelCreateRequestBody/credentials_serialization
=== RUN   TestJobModelCreateRequestBody/labels_serialization
=== RUN   TestJobModelCreateRequestBody/instance_groups_serialization
=== RUN   TestJobModelCreateRequestBody/all_prompt-on-launch_fields
--- PASS: TestJobModelCreateRequestBody (0.00s)
    --- PASS: TestJobModelCreateRequestBody/unknown_values (0.00s)
    --- PASS: TestJobModelCreateRequestBody/null_values (0.00s)
    --- PASS: TestJobModelCreateRequestBody/extra_vars_only (0.00s)
    --- PASS: TestJobModelCreateRequestBody/inventory_vars_only (0.00s)
    --- PASS: TestJobModelCreateRequestBody/combined (0.00s)
    --- PASS: TestJobModelCreateRequestBody/manual_triggers (0.00s)
    --- PASS: TestJobModelCreateRequestBody/wait_for_completed_parameters (0.00s)
    --- PASS: TestJobModelCreateRequestBody/credentials_serialization (0.00s)
    --- PASS: TestJobModelCreateRequestBody/labels_serialization (0.00s)
    --- PASS: TestJobModelCreateRequestBody/instance_groups_serialization (0.00s)
    --- PASS: TestJobModelCreateRequestBody/all_prompt-on-launch_fields (0.00s)
=== RUN   TestJobModelGetLaunchJob
=== PAUSE TestJobModelGetLaunchJob
=== RUN   TestJobModelCanJobBeLaunched
=== PAUSE TestJobModelCanJobBeLaunched
=== RUN   TestJobModelLaunchJob
=== PAUSE TestJobModelLaunchJob
=== RUN   TestJobTemplateDataSourceSchema
=== PAUSE TestJobTemplateDataSourceSchema
=== RUN   TestJobTemplateDataSourceParseHTTPResponse
=== RUN   TestJobTemplateDataSourceParseHTTPResponse/JSON_error
=== RUN   TestJobTemplateDataSourceParseHTTPResponse/missing_values
=== RUN   TestJobTemplateDataSourceParseHTTPResponse/all_values
--- PASS: TestJobTemplateDataSourceParseHTTPResponse (0.00s)
    --- PASS: TestJobTemplateDataSourceParseHTTPResponse/JSON_error (0.00s)
    --- PASS: TestJobTemplateDataSourceParseHTTPResponse/missing_values (0.00s)
    --- PASS: TestJobTemplateDataSourceParseHTTPResponse/all_values (0.00s)
=== RUN   TestAccJobTemplateDataSource
    provider_test.go:40: 'AAP_TOKEN' is set, using token authentication in acceptance tests
--- PASS: TestAccJobTemplateDataSource (12.91s)
=== RUN   TestAccInventoryResourceWithOrganizationDataSource
    provider_test.go:40: 'AAP_TOKEN' is set, using token authentication in acceptance tests
--- PASS: TestAccInventoryResourceWithOrganizationDataSource (7.51s)
=== RUN   TestOrganizationDataSourceSchema
=== PAUSE TestOrganizationDataSourceSchema
=== RUN   TestOrganizationDataSourceValidateConfig
=== PAUSE TestOrganizationDataSourceValidateConfig
=== RUN   TestOrganizationDataSourceParseHTTPResponse
=== RUN   TestOrganizationDataSourceParseHTTPResponse/JSON_error
=== RUN   TestOrganizationDataSourceParseHTTPResponse/missing_values
=== RUN   TestOrganizationDataSourceParseHTTPResponse/all_values
--- PASS: TestOrganizationDataSourceParseHTTPResponse (0.00s)
    --- PASS: TestOrganizationDataSourceParseHTTPResponse/JSON_error (0.00s)
    --- PASS: TestOrganizationDataSourceParseHTTPResponse/missing_values (0.00s)
    --- PASS: TestOrganizationDataSourceParseHTTPResponse/all_values (0.00s)
=== RUN   TestAccOrganizationDataSource
    provider_test.go:40: 'AAP_TOKEN' is set, using token authentication in acceptance tests
--- PASS: TestAccOrganizationDataSource (8.86s)
=== RUN   TestAccOrganizationDataSourceBadConfig
    provider_test.go:40: 'AAP_TOKEN' is set, using token authentication in acceptance tests
--- PASS: TestAccOrganizationDataSourceBadConfig (0.09s)
=== RUN   TestAccOrganizationDataSourceWithIdAndName
    provider_test.go:40: 'AAP_TOKEN' is set, using token authentication in acceptance tests
--- PASS: TestAccOrganizationDataSourceWithIdAndName (5.07s)
=== RUN   TestAccOrganizationDataSourceNonExistentValues
    provider_test.go:40: 'AAP_TOKEN' is set, using token authentication in acceptance tests
--- PASS: TestAccOrganizationDataSourceNonExistentValues (2.09s)
=== RUN   TestReadValues
=== RUN   TestReadValues/No_defined_values
=== RUN   TestReadValues/Using_env_variables_only,_with_token
=== RUN   TestReadValues/Using_env_variables_only,_with_username/password
=== RUN   TestReadValues/Using_env_variables_only,_legacy_AAP_HOST
=== RUN   TestReadValues/Using_both_configuration_and_envs_value
=== RUN   TestReadValues/Using_configuration_value
=== RUN   TestReadValues/Bad_value_for_env_variable
=== RUN   TestReadValues/Using_null_values_in_configuration
=== RUN   TestReadValues/Using_env_variables_for_configuration,_ignores_username/password_when_token_is_set
=== RUN   TestReadValues/Using_configuration,_ignores_username/password_when_token_is_set_and_reports_warnings
--- PASS: TestReadValues (0.00s)
    --- PASS: TestReadValues/No_defined_values (0.00s)
    --- PASS: TestReadValues/Using_env_variables_only,_with_token (0.00s)
    --- PASS: TestReadValues/Using_env_variables_only,_with_username/password (0.00s)
    --- PASS: TestReadValues/Using_env_variables_only,_legacy_AAP_HOST (0.00s)
    --- PASS: TestReadValues/Using_both_configuration_and_envs_value (0.00s)
    --- PASS: TestReadValues/Using_configuration_value (0.00s)
    --- PASS: TestReadValues/Bad_value_for_env_variable (0.00s)
    --- PASS: TestReadValues/Using_null_values_in_configuration (0.00s)
    --- PASS: TestReadValues/Using_env_variables_for_configuration,_ignores_username/password_when_token_is_set (0.00s)
    --- PASS: TestReadValues/Using_configuration,_ignores_username/password_when_token_is_set_and_reports_warnings (0.00s)
=== RUN   TestCheckUnknownValue
=== RUN   TestCheckUnknownValue/no_errors_with_nothing_unknown_(token)
=== RUN   TestCheckUnknownValue/no_errors_with_nothing_unknown_(basic)
=== RUN   TestCheckUnknownValue/unknown_host
=== RUN   TestCheckUnknownValue/unknown_username
=== RUN   TestCheckUnknownValue/unknown_password
=== RUN   TestCheckUnknownValue/unknown_token
=== RUN   TestCheckUnknownValue/unknown_insecure_skip_verify
=== RUN   TestCheckUnknownValue/unknown_timeout
--- PASS: TestCheckUnknownValue (0.00s)
    --- PASS: TestCheckUnknownValue/no_errors_with_nothing_unknown_(token) (0.00s)
    --- PASS: TestCheckUnknownValue/no_errors_with_nothing_unknown_(basic) (0.00s)
    --- PASS: TestCheckUnknownValue/unknown_host (0.00s)
    --- PASS: TestCheckUnknownValue/unknown_username (0.00s)
    --- PASS: TestCheckUnknownValue/unknown_password (0.00s)
    --- PASS: TestCheckUnknownValue/unknown_token (0.00s)
    --- PASS: TestCheckUnknownValue/unknown_insecure_skip_verify (0.00s)
    --- PASS: TestCheckUnknownValue/unknown_timeout (0.00s)
=== RUN   TestConfigure
=== RUN   TestConfigure/Missing_host
=== RUN   TestConfigure/Missing_token
=== RUN   TestConfigure/Missing_username
=== RUN   TestConfigure/Missing_password
--- PASS: TestConfigure (0.00s)
    --- PASS: TestConfigure/Missing_host (0.00s)
    --- PASS: TestConfigure/Missing_token (0.00s)
    --- PASS: TestConfigure/Missing_username (0.00s)
    --- PASS: TestConfigure/Missing_password (0.00s)
=== RUN   TestActions
--- PASS: TestActions (0.00s)
=== RUN   TestRetryOperation
=== PAUSE TestRetryOperation
=== RUN   TestCreateRetryConfig
=== RUN   TestCreateRetryConfig/error_cases
=== RUN   TestCreateRetryConfig/error_cases/nil_operation
=== RUN   TestCreateRetryConfig/error_cases/overflow_timeout
=== RUN   TestCreateRetryConfig/error_cases/overflow_initial_delay
=== RUN   TestCreateRetryConfig/error_cases/overflow_retry_delay
=== RUN   TestCreateRetryConfig/error_cases/negative_timeout
=== RUN   TestCreateRetryConfig/error_cases/all_overflow_values
=== RUN   TestCreateRetryConfig/default_status_codes
=== RUN   TestCreateRetryConfig/default_status_codes/success_codes_nil
=== RUN   TestCreateRetryConfig/default_status_codes/retryable_codes_nil
=== RUN   TestCreateRetryConfig/default_status_codes/both_nil
=== RUN   TestCreateRetryConfig/default_status_codes/both_empty
=== RUN   TestCreateRetryConfig/valid_configuration
--- PASS: TestCreateRetryConfig (0.00s)
    --- PASS: TestCreateRetryConfig/error_cases (0.00s)
        --- PASS: TestCreateRetryConfig/error_cases/nil_operation (0.00s)
        --- PASS: TestCreateRetryConfig/error_cases/overflow_timeout (0.00s)
        --- PASS: TestCreateRetryConfig/error_cases/overflow_initial_delay (0.00s)
        --- PASS: TestCreateRetryConfig/error_cases/overflow_retry_delay (0.00s)
        --- PASS: TestCreateRetryConfig/error_cases/negative_timeout (0.00s)
        --- PASS: TestCreateRetryConfig/error_cases/all_overflow_values (0.00s)
    --- PASS: TestCreateRetryConfig/default_status_codes (0.00s)
        --- PASS: TestCreateRetryConfig/default_status_codes/success_codes_nil (0.00s)
        --- PASS: TestCreateRetryConfig/default_status_codes/retryable_codes_nil (0.00s)
        --- PASS: TestCreateRetryConfig/default_status_codes/both_nil (0.00s)
        --- PASS: TestCreateRetryConfig/default_status_codes/both_empty (0.00s)
    --- PASS: TestCreateRetryConfig/valid_configuration (0.00s)
=== RUN   TestSafeDurationFromSeconds
=== RUN   TestSafeDurationFromSeconds/success_cases
=== RUN   TestSafeDurationFromSeconds/success_cases/zero_seconds
=== RUN   TestSafeDurationFromSeconds/success_cases/one_second
=== RUN   TestSafeDurationFromSeconds/success_cases/one_minute
=== RUN   TestSafeDurationFromSeconds/success_cases/one_hour
=== RUN   TestSafeDurationFromSeconds/success_cases/max_valid_duration
=== RUN   TestSafeDurationFromSeconds/success_cases/max_valid_minus_one
=== RUN   TestSafeDurationFromSeconds/error_cases
=== RUN   TestSafeDurationFromSeconds/error_cases/negative_value
=== RUN   TestSafeDurationFromSeconds/error_cases/large_negative
=== RUN   TestSafeDurationFromSeconds/error_cases/overflow
=== RUN   TestSafeDurationFromSeconds/error_cases/large_overflow
--- PASS: TestSafeDurationFromSeconds (0.00s)
    --- PASS: TestSafeDurationFromSeconds/success_cases (0.00s)
        --- PASS: TestSafeDurationFromSeconds/success_cases/zero_seconds (0.00s)
        --- PASS: TestSafeDurationFromSeconds/success_cases/one_second (0.00s)
        --- PASS: TestSafeDurationFromSeconds/success_cases/one_minute (0.00s)
        --- PASS: TestSafeDurationFromSeconds/success_cases/one_hour (0.00s)
        --- PASS: TestSafeDurationFromSeconds/success_cases/max_valid_duration (0.00s)
        --- PASS: TestSafeDurationFromSeconds/success_cases/max_valid_minus_one (0.00s)
    --- PASS: TestSafeDurationFromSeconds/error_cases (0.00s)
        --- PASS: TestSafeDurationFromSeconds/error_cases/negative_value (0.00s)
        --- PASS: TestSafeDurationFromSeconds/error_cases/large_negative (0.00s)
        --- PASS: TestSafeDurationFromSeconds/error_cases/overflow (0.00s)
        --- PASS: TestSafeDurationFromSeconds/error_cases/large_overflow (0.00s)
=== RUN   TestRetryWithConfig
=== RUN   TestRetryWithConfig/successfully_returns_retry_result
=== RUN   TestRetryWithConfig/returns_error_when_operation_has_diagnostic_errors
=== RUN   TestRetryWithConfig/returns_error_when_retry_config_is_nil
=== RUN   TestRetryWithConfig/returns_error_when_state_config_is_nil
=== RUN   TestRetryWithConfig/returns_error_when_context_is_nil
=== RUN   TestRetryWithConfig/returns_error_when_context_is_canceled
--- PASS: TestRetryWithConfig (0.00s)
    --- PASS: TestRetryWithConfig/successfully_returns_retry_result (0.00s)
    --- PASS: TestRetryWithConfig/returns_error_when_operation_has_diagnostic_errors (0.00s)
    --- PASS: TestRetryWithConfig/returns_error_when_retry_config_is_nil (0.00s)
    --- PASS: TestRetryWithConfig/returns_error_when_state_config_is_nil (0.00s)
    --- PASS: TestRetryWithConfig/returns_error_when_context_is_nil (0.00s)
    --- PASS: TestRetryWithConfig/returns_error_when_context_is_canceled (0.00s)
=== RUN   TestIsValueProvidedOrPromised
=== RUN   TestIsValueProvidedOrPromised/value_is_int64(1)
=== RUN   TestIsValueProvidedOrPromised/value_is_int64_unknown
=== RUN   TestIsValueProvidedOrPromised/value_is_int64_null
=== RUN   TestIsValueProvidedOrPromised/value_is_string(test)
=== RUN   TestIsValueProvidedOrPromised/value_is_string_unknown
=== RUN   TestIsValueProvidedOrPromised/value_is_string_null
--- PASS: TestIsValueProvidedOrPromised (0.00s)
    --- PASS: TestIsValueProvidedOrPromised/value_is_int64(1) (0.00s)
    --- PASS: TestIsValueProvidedOrPromised/value_is_int64_unknown (0.00s)
    --- PASS: TestIsValueProvidedOrPromised/value_is_int64_null (0.00s)
    --- PASS: TestIsValueProvidedOrPromised/value_is_string(test) (0.00s)
    --- PASS: TestIsValueProvidedOrPromised/value_is_string_unknown (0.00s)
    --- PASS: TestIsValueProvidedOrPromised/value_is_string_null (0.00s)
=== RUN   TestReturnAAPNamedURL
=== RUN   TestReturnAAPNamedURL/id_only
=== RUN   TestReturnAAPNamedURL/all_values
=== RUN   TestReturnAAPNamedURL/id_and_org_name
=== RUN   TestReturnAAPNamedURL/id_and_name
=== RUN   TestReturnAAPNamedURL/name_and_org_name
=== RUN   TestReturnAAPNamedURL/id_unknown,_name_and_org_name
=== RUN   TestReturnAAPNamedURL/unknown_name,_id_and_org_name_null
=== RUN   TestReturnAAPNamedURL/all_null_values
=== RUN   TestReturnAAPNamedURL/id_and_org_name_null,_name_provided
=== RUN   TestReturnAAPNamedURL/id_and_name_null,_org_name_provided
--- PASS: TestReturnAAPNamedURL (0.00s)
    --- PASS: TestReturnAAPNamedURL/id_only (0.00s)
    --- PASS: TestReturnAAPNamedURL/all_values (0.00s)
    --- PASS: TestReturnAAPNamedURL/id_and_org_name (0.00s)
    --- PASS: TestReturnAAPNamedURL/id_and_name (0.00s)
    --- PASS: TestReturnAAPNamedURL/name_and_org_name (0.00s)
    --- PASS: TestReturnAAPNamedURL/id_unknown,_name_and_org_name (0.00s)
    --- PASS: TestReturnAAPNamedURL/unknown_name,_id_and_org_name_null (0.00s)
    --- PASS: TestReturnAAPNamedURL/all_null_values (0.00s)
    --- PASS: TestReturnAAPNamedURL/id_and_org_name_null,_name_provided (0.00s)
    --- PASS: TestReturnAAPNamedURL/id_and_name_null,_org_name_provided (0.00s)
=== RUN   TestGetURL
=== RUN   TestGetURL/https://example.com
=== RUN   TestGetURL/https://example.com/
=== RUN   TestGetURL/https://example.com#01
=== RUN   TestGetURL/invalid-url
--- PASS: TestGetURL (0.00s)
    --- PASS: TestGetURL/https://example.com (0.00s)
    --- PASS: TestGetURL/https://example.com/ (0.00s)
    --- PASS: TestGetURL/https://example.com#01 (0.00s)
    --- PASS: TestGetURL/invalid-url (0.00s)
=== RUN   TestParseStringValue
=== RUN   TestParseStringValue/Test_non-empty_string
=== RUN   TestParseStringValue/Test_empty_string
--- PASS: TestParseStringValue (0.00s)
    --- PASS: TestParseStringValue/Test_non-empty_string (0.00s)
    --- PASS: TestParseStringValue/Test_empty_string (0.00s)
=== RUN   TestParseNormalizedValue
=== RUN   TestParseNormalizedValue/Test_non-empty_string
=== RUN   TestParseNormalizedValue/Test_empty_string
--- PASS: TestParseNormalizedValue (0.00s)
    --- PASS: TestParseNormalizedValue/Test_non-empty_string (0.00s)
    --- PASS: TestParseNormalizedValue/Test_empty_string (0.00s)
=== RUN   TestConvertListToInt64Slice
=== RUN   TestConvertListToInt64Slice/null_list
=== RUN   TestConvertListToInt64Slice/unknown_list
=== RUN   TestConvertListToInt64Slice/empty_list
=== RUN   TestConvertListToInt64Slice/single_element
=== RUN   TestConvertListToInt64Slice/multiple_elements
=== RUN   TestConvertListToInt64Slice/skip_null_elements
=== RUN   TestConvertListToInt64Slice/list_with_only_null_values
=== RUN   TestConvertListToInt64Slice/list_with_only_unknown_values
--- PASS: TestConvertListToInt64Slice (0.00s)
    --- PASS: TestConvertListToInt64Slice/null_list (0.00s)
    --- PASS: TestConvertListToInt64Slice/unknown_list (0.00s)
    --- PASS: TestConvertListToInt64Slice/empty_list (0.00s)
    --- PASS: TestConvertListToInt64Slice/single_element (0.00s)
    --- PASS: TestConvertListToInt64Slice/multiple_elements (0.00s)
    --- PASS: TestConvertListToInt64Slice/skip_null_elements (0.00s)
    --- PASS: TestConvertListToInt64Slice/list_with_only_null_values (0.00s)
    --- PASS: TestConvertListToInt64Slice/list_with_only_unknown_values (0.00s)
=== RUN   TestAccAAPWorkflowJobAction_Basic
    provider_test.go:40: 'AAP_TOKEN' is set, using token authentication in acceptance tests
--- PASS: TestAccAAPWorkflowJobAction_Basic (7.27s)
=== RUN   TestAccAAPWorkflowJobAction_fail
    provider_test.go:40: 'AAP_TOKEN' is set, using token authentication in acceptance tests
--- PASS: TestAccAAPWorkflowJobAction_fail (13.31s)
=== RUN   TestAccAAPWorkflowJobAction_failIgnore
    provider_test.go:40: 'AAP_TOKEN' is set, using token authentication in acceptance tests
--- PASS: TestAccAAPWorkflowJobAction_failIgnore (14.95s)
=== RUN   TestAccAAPWorkflowJobAction_AllFieldsOnPrompt
    provider_test.go:40: 'AAP_TOKEN' is set, using token authentication in acceptance tests
--- PASS: TestAccAAPWorkflowJobAction_AllFieldsOnPrompt (7.29s)
=== RUN   TestAccAAPWorkflowJobAction_AllFieldsOnPrompt_MissingRequired
    provider_test.go:40: 'AAP_TOKEN' is set, using token authentication in acceptance tests
--- PASS: TestAccAAPWorkflowJobAction_AllFieldsOnPrompt_MissingRequired (3.97s)
=== RUN   TestWorkflowJobResourceSchema
=== PAUSE TestWorkflowJobResourceSchema
=== RUN   TestWorkflowJobResourceCreateRequestBody
=== RUN   TestWorkflowJobResourceCreateRequestBody/unknown_values
=== RUN   TestWorkflowJobResourceCreateRequestBody/null_values
=== RUN   TestWorkflowJobResourceCreateRequestBody/extra_vars_only
=== RUN   TestWorkflowJobResourceCreateRequestBody/inventory_vars_only
=== RUN   TestWorkflowJobResourceCreateRequestBody/combined
=== RUN   TestWorkflowJobResourceCreateRequestBody/manual_triggers
--- PASS: TestWorkflowJobResourceCreateRequestBody (0.00s)
    --- PASS: TestWorkflowJobResourceCreateRequestBody/unknown_values (0.00s)
    --- PASS: TestWorkflowJobResourceCreateRequestBody/null_values (0.00s)
    --- PASS: TestWorkflowJobResourceCreateRequestBody/extra_vars_only (0.00s)
    --- PASS: TestWorkflowJobResourceCreateRequestBody/inventory_vars_only (0.00s)
    --- PASS: TestWorkflowJobResourceCreateRequestBody/combined (0.00s)
    --- PASS: TestWorkflowJobResourceCreateRequestBody/manual_triggers (0.00s)
=== RUN   TestWorkflowJobResourceParseHTTPResponse
=== RUN   TestWorkflowJobResourceParseHTTPResponse/JSON_error
=== RUN   TestWorkflowJobResourceParseHTTPResponse/no_ignored_fields
=== RUN   TestWorkflowJobResourceParseHTTPResponse/ignored_fields
--- PASS: TestWorkflowJobResourceParseHTTPResponse (0.00s)
    --- PASS: TestWorkflowJobResourceParseHTTPResponse/JSON_error (0.00s)
    --- PASS: TestWorkflowJobResourceParseHTTPResponse/no_ignored_fields (0.00s)
    --- PASS: TestWorkflowJobResourceParseHTTPResponse/ignored_fields (0.00s)
=== RUN   TestWorkflowJobResourceMetadata
--- PASS: TestWorkflowJobResourceMetadata (0.00s)
=== RUN   TestWorkflowJobResourceConfigure
=== PAUSE TestWorkflowJobResourceConfigure
=== RUN   TestWorkflowJobModelCreateRequestBody
=== RUN   TestWorkflowJobModelCreateRequestBody/unknown_values
=== RUN   TestWorkflowJobModelCreateRequestBody/null_values
=== RUN   TestWorkflowJobModelCreateRequestBody/extra_vars_only
=== RUN   TestWorkflowJobModelCreateRequestBody/inventory_only
=== RUN   TestWorkflowJobModelCreateRequestBody/combined_extra_vars_and_inventory
=== RUN   TestWorkflowJobModelCreateRequestBody/wait_for_completed_parameters_not_included_in_request
=== RUN   TestWorkflowJobModelCreateRequestBody/labels_serialization
=== RUN   TestWorkflowJobModelCreateRequestBody/limit_only
=== RUN   TestWorkflowJobModelCreateRequestBody/job_tags_only
=== RUN   TestWorkflowJobModelCreateRequestBody/skip_tags_only
=== RUN   TestWorkflowJobModelCreateRequestBody/all_prompt-on-launch_fields
--- PASS: TestWorkflowJobModelCreateRequestBody (0.00s)
    --- PASS: TestWorkflowJobModelCreateRequestBody/unknown_values (0.00s)
    --- PASS: TestWorkflowJobModelCreateRequestBody/null_values (0.00s)
    --- PASS: TestWorkflowJobModelCreateRequestBody/extra_vars_only (0.00s)
    --- PASS: TestWorkflowJobModelCreateRequestBody/inventory_only (0.00s)
    --- PASS: TestWorkflowJobModelCreateRequestBody/combined_extra_vars_and_inventory (0.00s)
    --- PASS: TestWorkflowJobModelCreateRequestBody/wait_for_completed_parameters_not_included_in_request (0.00s)
    --- PASS: TestWorkflowJobModelCreateRequestBody/labels_serialization (0.00s)
    --- PASS: TestWorkflowJobModelCreateRequestBody/limit_only (0.00s)
    --- PASS: TestWorkflowJobModelCreateRequestBody/job_tags_only (0.00s)
    --- PASS: TestWorkflowJobModelCreateRequestBody/skip_tags_only (0.00s)
    --- PASS: TestWorkflowJobModelCreateRequestBody/all_prompt-on-launch_fields (0.00s)
=== RUN   TestWorkflowJobModelGetLaunchWorkflowJob
=== PAUSE TestWorkflowJobModelGetLaunchWorkflowJob
=== RUN   TestWorkflowJobModelCanWorkflowJobBeLaunched
=== PAUSE TestWorkflowJobModelCanWorkflowJobBeLaunched
=== RUN   TestWorkflowJobModelLaunchWorkflowJob
=== PAUSE TestWorkflowJobModelLaunchWorkflowJob
=== RUN   TestAccAAPWorkflowJob_Basic
    provider_test.go:40: 'AAP_TOKEN' is set, using token authentication in acceptance tests
--- PASS: TestAccAAPWorkflowJob_Basic (8.07s)
=== RUN   TestAccAAPWorkflowJobWithNoInventoryID
    provider_test.go:40: 'AAP_TOKEN' is set, using token authentication in acceptance tests
--- PASS: TestAccAAPWorkflowJobWithNoInventoryID (6.80s)
=== RUN   TestAccAAPWorkflowJob_UpdateWithSameParameters
    provider_test.go:40: 'AAP_TOKEN' is set, using token authentication in acceptance tests
--- PASS: TestAccAAPWorkflowJob_UpdateWithSameParameters (10.81s)
=== RUN   TestAccAAPWorkflowJob_UpdateWithNewInventoryIdPromptOnLaunch
    provider_test.go:40: 'AAP_TOKEN' is set, using token authentication in acceptance tests
--- PASS: TestAccAAPWorkflowJob_UpdateWithNewInventoryIdPromptOnLaunch (13.51s)
=== RUN   TestAccAAPWorkflowJob_UpdateWithTrigger
    provider_test.go:40: 'AAP_TOKEN' is set, using token authentication in acceptance tests
--- PASS: TestAccAAPWorkflowJob_UpdateWithTrigger (11.43s)
=== RUN   TestAccAAPWorkflowJob_waitForCompletionWithFailure
    provider_test.go:40: 'AAP_TOKEN' is set, using token authentication in acceptance tests
--- PASS: TestAccAAPWorkflowJob_waitForCompletionWithFailure (16.07s)
=== RUN   TestAccAAPWorkflowJob_AllFieldsOnPrompt
    provider_test.go:40: 'AAP_TOKEN' is set, using token authentication in acceptance tests
--- PASS: TestAccAAPWorkflowJob_AllFieldsOnPrompt (10.09s)
=== RUN   TestAccAAPWorkflowJob_AllFieldsOnPrompt_MissingRequired
    provider_test.go:40: 'AAP_TOKEN' is set, using token authentication in acceptance tests
--- PASS: TestAccAAPWorkflowJob_AllFieldsOnPrompt_MissingRequired (1.91s)
=== RUN   TestAccAAPWorkflowJobDisappears
    provider_test.go:40: 'AAP_TOKEN' is set, using token authentication in acceptance tests
--- PASS: TestAccAAPWorkflowJobDisappears (21.78s)
=== RUN   TestWorkflowJobTemplateDataSourceSchema
=== PAUSE TestWorkflowJobTemplateDataSourceSchema
=== RUN   TestWorkflowJobTemplateDataSourceParseHTTPResponse
=== RUN   TestWorkflowJobTemplateDataSourceParseHTTPResponse/JSON_error
=== RUN   TestWorkflowJobTemplateDataSourceParseHTTPResponse/missing_values
=== RUN   TestWorkflowJobTemplateDataSourceParseHTTPResponse/all_values
--- PASS: TestWorkflowJobTemplateDataSourceParseHTTPResponse (0.00s)
    --- PASS: TestWorkflowJobTemplateDataSourceParseHTTPResponse/JSON_error (0.00s)
    --- PASS: TestWorkflowJobTemplateDataSourceParseHTTPResponse/missing_values (0.00s)
    --- PASS: TestWorkflowJobTemplateDataSourceParseHTTPResponse/all_values (0.00s)
=== RUN   TestAccWorkflowJobTemplateDataSource
    provider_test.go:40: 'AAP_TOKEN' is set, using token authentication in acceptance tests
--- PASS: TestAccWorkflowJobTemplateDataSource (13.02s)
=== CONT  TestBaseDataSourceMetadata
=== CONT  TestJobLaunchActionMetadata
=== CONT  TestEDAEventStreamPostActionMetadata
=== CONT  TestEDAEventStreamPostActionSchema
--- PASS: TestBaseDataSourceMetadata (0.00s)
=== CONT  TestWorkflowJobTemplateDataSourceSchema
--- PASS: TestEDAEventStreamPostActionSchema (0.00s)
=== CONT  TestBaseEdaSourceModelParseHttpResponse
=== CONT  TestBaseEdaDataSourceSchema
=== RUN   TestBaseEdaSourceModelParseHttpResponse/Valid_response_with_single_result
--- PASS: TestWorkflowJobTemplateDataSourceSchema (0.00s)
=== CONT  TestBaseDataSourceConfigValidators
=== PAUSE TestBaseEdaSourceModelParseHttpResponse/Valid_response_with_single_result
--- PASS: TestBaseEdaDataSourceSchema (0.00s)
=== RUN   TestBaseDataSourceConfigValidators/base_datasource
=== CONT  TestBaseEdaDataSourceRead
=== RUN   TestBaseEdaSourceModelParseHttpResponse/Invalid_JSON_response
=== PAUSE TestBaseEdaSourceModelParseHttpResponse/Invalid_JSON_response
=== CONT  TestWorkflowJobModelLaunchWorkflowJob
=== RUN   TestBaseDataSourceConfigValidators/organization_datasource
=== RUN   TestBaseEdaDataSourceRead/Success_scenario
=== RUN   TestWorkflowJobModelLaunchWorkflowJob/successful_workflow_job_launch
=== PAUSE TestBaseEdaDataSourceRead/Success_scenario
=== RUN   TestBaseEdaDataSourceRead/Invalid_EDA_endpoint
=== RUN   TestBaseDataSourceConfigValidators/base_datasource_with_org
=== PAUSE TestBaseEdaDataSourceRead/Invalid_EDA_endpoint
=== CONT  TestBaseEdaDataSourceConfigure
=== CONT  TestBaseEdaDataSourceRead/Invalid_EDA_endpoint
--- PASS: TestBaseDataSourceConfigValidators (0.00s)
    --- PASS: TestBaseDataSourceConfigValidators/base_datasource (0.00s)
    --- PASS: TestBaseDataSourceConfigValidators/organization_datasource (0.00s)
    --- PASS: TestBaseDataSourceConfigValidators/base_datasource_with_org (0.00s)
=== CONT  TestBaseDataSourceSchema
--- PASS: TestBaseDataSourceSchema (0.00s)
=== RUN   TestBaseEdaDataSourceConfigure/Success_scenario
=== CONT  TestJobLaunchActionInvoke
=== CONT  TestJobLaunchActionSchema
--- PASS: TestEDAEventStreamPostActionMetadata (0.00s)
=== RUN   TestJobLaunchActionInvoke/fire_and_forget_-_successful_launch
=== CONT  TestJobModelLaunchJob
--- PASS: TestJobLaunchActionMetadata (0.00s)
=== CONT  TestHostResourceSchema
--- PASS: TestJobLaunchActionSchema (0.00s)
=== CONT  TestWorkflowJobModelCanWorkflowJobBeLaunched
=== RUN   TestWorkflowJobModelLaunchWorkflowJob/launch_fails_when_CanWorkflowJobBeLaunched_fails
=== CONT  TestGroupResourceSchema
=== CONT  TestWorkflowJobModelGetLaunchWorkflowJob
=== CONT  TestWorkflowJobResourceConfigure
=== CONT  TestWorkflowJobResourceSchema
=== RUN   TestWorkflowJobResourceConfigure/ProviderData_is_nil
=== CONT  TestBaseEdaDataSourceRead/Success_scenario
=== CONT  TestRetryOperation
=== RUN   TestRetryOperation/operation_succeeds_on_the_first_attempt
=== PAUSE TestRetryOperation/operation_succeeds_on_the_first_attempt
=== RUN   TestRetryOperation/operation_succeeds_after_a_conflict
=== PAUSE TestRetryOperation/operation_succeeds_after_a_conflict
=== RUN   TestRetryOperation/operation_fails_immediately_on_non_retryable_error
=== RUN   TestWorkflowJobModelGetLaunchWorkflowJob/successful_retrieval_of_launch_config
=== CONT  TestExecuteRequest
=== RUN   TestExecuteRequest/succeed_when_response_status_is_http_200_ok
=== CONT  TestCreateClient
=== RUN   TestCreateClient/CreateClient_defaults_to_InsecureSkipVerify_false
=== CONT  TestCreateEventPayload
=== RUN   TestCreateEventPayload/success_with_default_marshaler
=== CONT  TestBaseEdaDataSourceMetadata
=== CONT  TestOrganizationDataSourceValidateConfig
=== RUN   TestOrganizationDataSourceValidateConfig/valid_config_with_id
=== RUN   TestBaseEdaSourceModelParseHttpResponse/Empty_results_array
=== PAUSE TestBaseEdaSourceModelParseHttpResponse/Empty_results_array
=== RUN   TestBaseEdaSourceModelParseHttpResponse/Multiple_results
=== PAUSE TestBaseEdaDataSourceConfigure/Success_scenario
=== PAUSE TestBaseEdaSourceModelParseHttpResponse/Multiple_results
=== CONT  TestInventoryResourceSchema
=== RUN   TestBaseEdaSourceModelParseHttpResponse/Valid_response_with_null/empty_values
=== RUN   TestBaseEdaDataSourceConfigure/Response_object_is_nil
=== PAUSE TestBaseEdaSourceModelParseHttpResponse/Valid_response_with_null/empty_values
=== NAME  TestJobLaunchActionInvoke/fire_and_forget_-_successful_launch
    job_launch_action_test.go:281: Progress: Job launched, URL: /api/v2/jobs/789/, Template ID: 123, Inventory ID: 0
=== CONT  TestOrganizationDataSourceSchema
=== PAUSE TestBaseEdaDataSourceConfigure/Response_object_is_nil
=== RUN   TestBaseEdaDataSourceConfigure/Context_not_active
=== CONT  TestJobModelGetLaunchJob
=== RUN   TestJobModelGetLaunchJob/successful_retrieval_of_launch_config
=== PAUSE TestBaseEdaDataSourceConfigure/Context_not_active
=== RUN   TestBaseEdaDataSourceConfigure/ProviderData_is_nil
=== PAUSE TestBaseEdaDataSourceConfigure/ProviderData_is_nil
=== CONT  TestInventoryDataSourceSchema
=== RUN   TestBaseEdaDataSourceConfigure/Wrong_ProviderData_type
=== PAUSE TestBaseEdaDataSourceConfigure/Wrong_ProviderData_type
=== CONT  TestJobModelCanJobBeLaunched
=== CONT  TestJobLaunchActionConfigure
=== RUN   TestJobLaunchActionConfigure/valid_provider_data
=== RUN   TestJobModelCanJobBeLaunched/all_fields_optional_-_no_errors
--- PASS: TestHostResourceSchema (0.00s)
=== RUN   TestWorkflowJobModelCanWorkflowJobBeLaunched/all_fields_optional_-_no_errors
=== RUN   TestJobModelGetLaunchJob/handles_API_404_error
=== PAUSE TestRetryOperation/operation_fails_immediately_on_non_retryable_error
=== RUN   TestRetryOperation/operation_times_out_after_multiple_retries
--- PASS: TestGroupResourceSchema (0.00s)
=== CONT  TestJobTemplateDataSourceSchema
=== PAUSE TestRetryOperation/operation_times_out_after_multiple_retries
=== RUN   TestRetryOperation/operation_with_multiple_retryable_status_codes
=== RUN   TestBaseEdaSourceModelParseHttpResponse/Valid_response_with_missing_fields
=== RUN   TestWorkflowJobModelLaunchWorkflowJob/launch_fails_when_POST_fails
=== CONT  TestRetryUntilAAPJobReachesAnyFinalState_ErrorHandling
--- PASS: TestWorkflowJobResourceSchema (0.00s)
=== PAUSE TestBaseEdaSourceModelParseHttpResponse/Valid_response_with_missing_fields
=== RUN   TestRetryUntilAAPJobReachesAnyFinalState_ErrorHandling/handles_diagnostics_errors
=== RUN   TestJobModelCanJobBeLaunched/extra_vars_required_but_not_provided
=== RUN   TestCreateClient/CreateClient_honors_InsecureSkipVerify_true_in_config
=== RUN   TestCreateEventPayload/error_with_failing_marshaler
=== RUN   TestJobModelGetLaunchJob/handles_invalid_JSON_response
=== RUN   TestCreateClient/CreateClient_honors_InsecureSkipVerify_false_in_config
=== RUN   TestWorkflowJobModelCanWorkflowJobBeLaunched/extra_vars_required_but_not_provided
=== RUN   TestJobModelLaunchJob/successful_job_launch
=== CONT  TestJobResourceSchema
=== RUN   TestBaseEdaSourceModelParseHttpResponse/Completely_malformed_JSON
=== RUN   TestExecuteRequest/succeed_when_response_status_is_http_201_created
=== PAUSE TestBaseEdaSourceModelParseHttpResponse/Completely_malformed_JSON
=== RUN   TestCreateClient/CreateClient_defaults_InsecureSkipVerify_to_false_when_unknown_in_config
=== RUN   TestWorkflowJobResourceConfigure/ProviderData_is_wrong_type
--- PASS: TestCreateEventPayload (0.00s)
    --- PASS: TestCreateEventPayload/success_with_default_marshaler (0.00s)
    --- PASS: TestCreateEventPayload/error_with_failing_marshaler (0.00s)
--- PASS: TestBaseEdaDataSourceMetadata (0.00s)
=== PAUSE TestRetryOperation/operation_with_multiple_retryable_status_codes
=== CONT  TestBaseEdaDataSourceConfigure/Success_scenario
--- PASS: TestCreateClient (0.00s)
    --- PASS: TestCreateClient/CreateClient_defaults_to_InsecureSkipVerify_false (0.00s)
    --- PASS: TestCreateClient/CreateClient_honors_InsecureSkipVerify_true_in_config (0.00s)
    --- PASS: TestCreateClient/CreateClient_honors_InsecureSkipVerify_false_in_config (0.00s)
    --- PASS: TestCreateClient/CreateClient_defaults_InsecureSkipVerify_to_false_when_unknown_in_config (0.00s)
=== RUN   TestRetryOperation/operation_with_multiple_success_status_codes
=== CONT  TestBaseEdaDataSourceConfigure/Wrong_ProviderData_type
--- PASS: TestBaseEdaDataSourceRead (0.00s)
    --- PASS: TestBaseEdaDataSourceRead/Invalid_EDA_endpoint (0.00s)
    --- PASS: TestBaseEdaDataSourceRead/Success_scenario (0.00s)
=== RUN   TestBaseEdaSourceModelParseHttpResponse/Empty_response_body
=== CONT  TestBaseEdaDataSourceConfigure/ProviderData_is_nil
=== CONT  TestBaseEdaDataSourceConfigure/Context_not_active
=== PAUSE TestBaseEdaSourceModelParseHttpResponse/Empty_response_body
--- PASS: TestInventoryResourceSchema (0.00s)
=== RUN   TestBaseEdaSourceModelParseHttpResponse/Missing_results_field
=== CONT  TestBaseEdaDataSourceConfigure/Response_object_is_nil
=== PAUSE TestBaseEdaSourceModelParseHttpResponse/Missing_results_field
--- PASS: TestOrganizationDataSourceSchema (0.00s)
=== CONT  TestBaseEdaSourceModelParseHttpResponse/Completely_malformed_JSON
=== RUN   TestWorkflowJobModelGetLaunchWorkflowJob/handles_API_404_error
=== RUN   TestOrganizationDataSourceValidateConfig/valid_config_with_name
=== CONT  TestBaseEdaSourceModelParseHttpResponse/Valid_response_with_missing_fields
--- PASS: TestInventoryDataSourceSchema (0.00s)
=== PAUSE TestRetryOperation/operation_with_multiple_success_status_codes
=== CONT  TestBaseEdaSourceModelParseHttpResponse/Valid_response_with_null/empty_values
--- PASS: TestJobTemplateDataSourceSchema (0.00s)
=== CONT  TestBaseEdaSourceModelParseHttpResponse/Valid_response_with_single_result
=== RUN   TestJobLaunchActionConfigure/nil_provider_data
=== RUN   TestJobModelCanJobBeLaunched/extra_vars_provided_but_not_expected_-_warning
=== CONT  TestBaseEdaSourceModelParseHttpResponse/Multiple_results
=== RUN   TestJobLaunchActionConfigure/invalid_provider_data_type
=== CONT  TestBaseEdaSourceModelParseHttpResponse/Empty_results_array
--- PASS: TestJobLaunchActionConfigure (0.00s)
    --- PASS: TestJobLaunchActionConfigure/valid_provider_data (0.00s)
    --- PASS: TestJobLaunchActionConfigure/nil_provider_data (0.00s)
    --- PASS: TestJobLaunchActionConfigure/invalid_provider_data_type (0.00s)
=== CONT  TestBaseEdaSourceModelParseHttpResponse/Invalid_JSON_response
=== CONT  TestBaseEdaSourceModelParseHttpResponse/Missing_results_field
=== CONT  TestBaseEdaSourceModelParseHttpResponse/Empty_response_body
=== RUN   TestExecuteRequest/fail_when_response_status_is_http_403_forbidden
=== RUN   TestRetryOperation/operation_succeeds_when_all_HTTP_status_codes_are_retryable
=== RUN   TestJobLaunchActionInvoke/launch_fails_with_API_error
=== RUN   TestWorkflowJobModelLaunchWorkflowJob/launch_with_all_parameters
--- PASS: TestJobModelGetLaunchJob (0.00s)
    --- PASS: TestJobModelGetLaunchJob/successful_retrieval_of_launch_config (0.00s)
    --- PASS: TestJobModelGetLaunchJob/handles_API_404_error (0.00s)
    --- PASS: TestJobModelGetLaunchJob/handles_invalid_JSON_response (0.00s)
=== RUN   TestWorkflowJobModelGetLaunchWorkflowJob/handles_invalid_JSON_response
--- PASS: TestJobResourceSchema (0.00s)
=== RUN   TestExecuteRequest/fail_when_client_returns_failure
=== PAUSE TestRetryOperation/operation_succeeds_when_all_HTTP_status_codes_are_retryable
=== RUN   TestOrganizationDataSourceValidateConfig/valid_config_with_both_id_and_name
=== RUN   TestJobModelCanJobBeLaunched/inventory_id_required_but_not_provided
=== RUN   TestExecuteRequest/fail_when_reading_the_response_fails
=== RUN   TestRetryOperation/operation_fails_with_diagnostic_errors_and_non-retryable_HTTP_status_code
=== PAUSE TestRetryOperation/operation_fails_with_diagnostic_errors_and_non-retryable_HTTP_status_code
--- PASS: TestExecuteRequest (0.00s)
    --- PASS: TestExecuteRequest/succeed_when_response_status_is_http_200_ok (0.00s)
    --- PASS: TestExecuteRequest/succeed_when_response_status_is_http_201_created (0.00s)
    --- PASS: TestExecuteRequest/fail_when_response_status_is_http_403_forbidden (0.00s)
    --- PASS: TestExecuteRequest/fail_when_client_returns_failure (0.00s)
    --- PASS: TestExecuteRequest/fail_when_reading_the_response_fails (0.00s)
=== CONT  TestRetryOperation/operation_succeeds_on_the_first_attempt
=== CONT  TestRetryOperation/operation_succeeds_when_all_HTTP_status_codes_are_retryable
=== RUN   TestRetryUntilAAPJobReachesAnyFinalState_ErrorHandling/returns_retryable_error_for_non-final_state
=== CONT  TestRetryOperation/operation_succeeds_after_a_conflict
=== CONT  TestRetryOperation/operation_with_multiple_success_status_codes
=== CONT  TestRetryOperation/operation_times_out_after_multiple_retries
=== CONT  TestRetryOperation/operation_with_multiple_retryable_status_codes
=== NAME  TestRetryUntilAAPJobReachesAnyFinalState_ErrorHandling/returns_retryable_error_for_non-final_state
    job_resource_test.go:689: Job status: running
=== CONT  TestRetryOperation/operation_fails_immediately_on_non_retryable_error
--- PASS: TestWorkflowJobModelGetLaunchWorkflowJob (0.00s)
    --- PASS: TestWorkflowJobModelGetLaunchWorkflowJob/successful_retrieval_of_launch_config (0.00s)
    --- PASS: TestWorkflowJobModelGetLaunchWorkflowJob/handles_API_404_error (0.00s)
    --- PASS: TestWorkflowJobModelGetLaunchWorkflowJob/handles_invalid_JSON_response (0.00s)
=== RUN   TestWorkflowJobModelCanWorkflowJobBeLaunched/extra_vars_provided_but_not_expected_-_warning
=== RUN   TestRetryUntilAAPJobReachesAnyFinalState_ErrorHandling/handles_job_state_transition_from_running_to_successful
=== CONT  TestRetryOperation/operation_fails_with_diagnostic_errors_and_non-retryable_HTTP_status_code
=== RUN   TestWorkflowJobModelCanWorkflowJobBeLaunched/inventory_id_required_but_not_provided
--- PASS: TestBaseEdaDataSourceConfigure (0.00s)
    --- PASS: TestBaseEdaDataSourceConfigure/Success_scenario (0.00s)
    --- PASS: TestBaseEdaDataSourceConfigure/Wrong_ProviderData_type (0.00s)
    --- PASS: TestBaseEdaDataSourceConfigure/Context_not_active (0.00s)
    --- PASS: TestBaseEdaDataSourceConfigure/ProviderData_is_nil (0.00s)
    --- PASS: TestBaseEdaDataSourceConfigure/Response_object_is_nil (0.00s)
=== RUN   TestJobModelLaunchJob/launch_fails_when_CanJobBeLaunched_fails
=== NAME  TestRetryUntilAAPJobReachesAnyFinalState_ErrorHandling/handles_job_state_transition_from_running_to_successful
    job_resource_test.go:723: Job status: running
=== RUN   TestWorkflowJobModelCanWorkflowJobBeLaunched/inventory_id_provided_but_not_expected_-_warning
=== NAME  TestRetryUntilAAPJobReachesAnyFinalState_ErrorHandling/handles_job_state_transition_from_running_to_successful
    job_resource_test.go:723: Job status: successful
=== RUN   TestWorkflowJobResourceConfigure/ProviderData_is_correct_type
--- PASS: TestRetryUntilAAPJobReachesAnyFinalState_ErrorHandling (0.00s)
    --- PASS: TestRetryUntilAAPJobReachesAnyFinalState_ErrorHandling/handles_diagnostics_errors (0.00s)
    --- PASS: TestRetryUntilAAPJobReachesAnyFinalState_ErrorHandling/returns_retryable_error_for_non-final_state (0.00s)
    --- PASS: TestRetryUntilAAPJobReachesAnyFinalState_ErrorHandling/handles_job_state_transition_from_running_to_successful (0.00s)
--- PASS: TestWorkflowJobModelLaunchWorkflowJob (0.00s)
    --- PASS: TestWorkflowJobModelLaunchWorkflowJob/successful_workflow_job_launch (0.00s)
    --- PASS: TestWorkflowJobModelLaunchWorkflowJob/launch_fails_when_CanWorkflowJobBeLaunched_fails (0.00s)
    --- PASS: TestWorkflowJobModelLaunchWorkflowJob/launch_fails_when_POST_fails (0.00s)
    --- PASS: TestWorkflowJobModelLaunchWorkflowJob/launch_with_all_parameters (0.00s)
--- PASS: TestWorkflowJobResourceConfigure (0.00s)
    --- PASS: TestWorkflowJobResourceConfigure/ProviderData_is_nil (0.00s)
    --- PASS: TestWorkflowJobResourceConfigure/ProviderData_is_wrong_type (0.00s)
    --- PASS: TestWorkflowJobResourceConfigure/ProviderData_is_correct_type (0.00s)
=== RUN   TestJobModelCanJobBeLaunched/inventory_id_provided_but_not_expected_-_warning
--- PASS: TestBaseEdaSourceModelParseHttpResponse (0.00s)
    --- PASS: TestBaseEdaSourceModelParseHttpResponse/Completely_malformed_JSON (0.00s)
    --- PASS: TestBaseEdaSourceModelParseHttpResponse/Valid_response_with_null/empty_values (0.00s)
    --- PASS: TestBaseEdaSourceModelParseHttpResponse/Valid_response_with_missing_fields (0.00s)
    --- PASS: TestBaseEdaSourceModelParseHttpResponse/Valid_response_with_single_result (0.00s)
    --- PASS: TestBaseEdaSourceModelParseHttpResponse/Empty_results_array (0.00s)
    --- PASS: TestBaseEdaSourceModelParseHttpResponse/Multiple_results (0.00s)
    --- PASS: TestBaseEdaSourceModelParseHttpResponse/Invalid_JSON_response (0.00s)
    --- PASS: TestBaseEdaSourceModelParseHttpResponse/Empty_response_body (0.00s)
    --- PASS: TestBaseEdaSourceModelParseHttpResponse/Missing_results_field (0.00s)
=== RUN   TestWorkflowJobModelCanWorkflowJobBeLaunched/limit_required_but_not_provided
=== RUN   TestJobLaunchActionInvoke/invalid_JSON_response_from_API
=== RUN   TestJobModelLaunchJob/launch_fails_when_POST_fails
=== RUN   TestJobModelCanJobBeLaunched/limit_required_but_not_provided
=== RUN   TestOrganizationDataSourceValidateConfig/invalid_config_with_neither_id_nor_name
=== RUN   TestWorkflowJobModelCanWorkflowJobBeLaunched/limit_provided_but_not_expected_-_warning
=== RUN   TestJobModelCanJobBeLaunched/limit_provided_but_not_expected_-_warning
=== RUN   TestWorkflowJobModelCanWorkflowJobBeLaunched/job_tags_required_but_not_provided
=== RUN   TestJobModelLaunchJob/launch_with_all_parameters
=== RUN   TestJobModelCanJobBeLaunched/job_tags_required_but_not_provided
=== RUN   TestWorkflowJobModelCanWorkflowJobBeLaunched/job_tags_provided_but_not_expected_-_warning
--- PASS: TestJobModelLaunchJob (0.00s)
    --- PASS: TestJobModelLaunchJob/successful_job_launch (0.00s)
    --- PASS: TestJobModelLaunchJob/launch_fails_when_CanJobBeLaunched_fails (0.00s)
    --- PASS: TestJobModelLaunchJob/launch_fails_when_POST_fails (0.00s)
    --- PASS: TestJobModelLaunchJob/launch_with_all_parameters (0.00s)
=== RUN   TestJobModelCanJobBeLaunched/job_tags_provided_but_not_expected_-_warning
=== RUN   TestWorkflowJobModelCanWorkflowJobBeLaunched/skip_tags_required_but_not_provided
=== RUN   TestJobModelCanJobBeLaunched/skip_tags_required_but_not_provided
=== RUN   TestWorkflowJobModelCanWorkflowJobBeLaunched/skip_tags_provided_but_not_expected_-_warning
--- PASS: TestOrganizationDataSourceValidateConfig (0.00s)
    --- PASS: TestOrganizationDataSourceValidateConfig/valid_config_with_id (0.00s)
    --- PASS: TestOrganizationDataSourceValidateConfig/valid_config_with_name (0.00s)
    --- PASS: TestOrganizationDataSourceValidateConfig/valid_config_with_both_id_and_name (0.00s)
    --- PASS: TestOrganizationDataSourceValidateConfig/invalid_config_with_neither_id_nor_name (0.00s)
=== RUN   TestJobModelCanJobBeLaunched/skip_tags_provided_but_not_expected_-_warning
=== RUN   TestWorkflowJobModelCanWorkflowJobBeLaunched/labels_required_but_not_provided
=== RUN   TestJobLaunchActionInvoke/wait_for_completion_-_job_succeeds
=== RUN   TestJobModelCanJobBeLaunched/diff_mode_required_but_not_provided
=== RUN   TestWorkflowJobModelCanWorkflowJobBeLaunched/labels_provided_but_not_expected_-_warning
=== RUN   TestJobModelCanJobBeLaunched/diff_mode_provided_but_not_expected_-_warning
=== RUN   TestWorkflowJobModelCanWorkflowJobBeLaunched/all_required_fields_provided_-_no_errors
=== NAME  TestJobLaunchActionInvoke/wait_for_completion_-_job_succeeds
    job_launch_action_test.go:281: Progress: Job launched, URL: /api/v2/jobs/789/, Template ID: 123, Inventory ID: 0
=== RUN   TestJobModelCanJobBeLaunched/verbosity_required_but_not_provided
=== NAME  TestJobLaunchActionInvoke/wait_for_completion_-_job_succeeds
    job_launch_action_test.go:281: Progress: Job at: /api/v2/jobs/789/ is in status: successful
--- PASS: TestWorkflowJobModelCanWorkflowJobBeLaunched (0.00s)
    --- PASS: TestWorkflowJobModelCanWorkflowJobBeLaunched/all_fields_optional_-_no_errors (0.00s)
    --- PASS: TestWorkflowJobModelCanWorkflowJobBeLaunched/extra_vars_required_but_not_provided (0.00s)
    --- PASS: TestWorkflowJobModelCanWorkflowJobBeLaunched/extra_vars_provided_but_not_expected_-_warning (0.00s)
    --- PASS: TestWorkflowJobModelCanWorkflowJobBeLaunched/inventory_id_required_but_not_provided (0.00s)
    --- PASS: TestWorkflowJobModelCanWorkflowJobBeLaunched/inventory_id_provided_but_not_expected_-_warning (0.00s)
    --- PASS: TestWorkflowJobModelCanWorkflowJobBeLaunched/limit_required_but_not_provided (0.00s)
    --- PASS: TestWorkflowJobModelCanWorkflowJobBeLaunched/limit_provided_but_not_expected_-_warning (0.00s)
    --- PASS: TestWorkflowJobModelCanWorkflowJobBeLaunched/job_tags_required_but_not_provided (0.00s)
    --- PASS: TestWorkflowJobModelCanWorkflowJobBeLaunched/job_tags_provided_but_not_expected_-_warning (0.00s)
    --- PASS: TestWorkflowJobModelCanWorkflowJobBeLaunched/skip_tags_required_but_not_provided (0.00s)
    --- PASS: TestWorkflowJobModelCanWorkflowJobBeLaunched/skip_tags_provided_but_not_expected_-_warning (0.00s)
    --- PASS: TestWorkflowJobModelCanWorkflowJobBeLaunched/labels_required_but_not_provided (0.00s)
    --- PASS: TestWorkflowJobModelCanWorkflowJobBeLaunched/labels_provided_but_not_expected_-_warning (0.00s)
    --- PASS: TestWorkflowJobModelCanWorkflowJobBeLaunched/all_required_fields_provided_-_no_errors (0.00s)
=== RUN   TestJobLaunchActionInvoke/wait_for_completion_-_job_fails_-_no_ignore
=== RUN   TestJobModelCanJobBeLaunched/verbosity_provided_but_not_expected_-_warning
=== RUN   TestJobModelCanJobBeLaunched/forks_required_but_not_provided
=== RUN   TestJobModelCanJobBeLaunched/forks_provided_but_not_expected_-_warning
=== RUN   TestJobModelCanJobBeLaunched/timeout_required_but_not_provided
=== NAME  TestJobLaunchActionInvoke/wait_for_completion_-_job_fails_-_no_ignore
    job_launch_action_test.go:281: Progress: Job launched, URL: /api/v2/jobs/789/, Template ID: 123, Inventory ID: 0
=== RUN   TestJobModelCanJobBeLaunched/timeout_provided_but_not_expected_-_warning
=== NAME  TestJobLaunchActionInvoke/wait_for_completion_-_job_fails_-_no_ignore
    job_launch_action_test.go:281: Progress: Job at: /api/v2/jobs/789/ is in status: failed
=== RUN   TestJobLaunchActionInvoke/wait_for_completion_-_job_fails_-_with_ignore
=== RUN   TestJobModelCanJobBeLaunched/job_slice_count_required_but_not_provided
=== RUN   TestJobModelCanJobBeLaunched/job_slice_count_provided_but_not_expected_-_warning
=== RUN   TestJobModelCanJobBeLaunched/execution_environment_required_but_not_provided
=== RUN   TestJobModelCanJobBeLaunched/execution_environment_provided_but_not_expected_-_warning
=== NAME  TestJobLaunchActionInvoke/wait_for_completion_-_job_fails_-_with_ignore
    job_launch_action_test.go:281: Progress: Job launched, URL: /api/v2/jobs/789/, Template ID: 123, Inventory ID: 0
    job_launch_action_test.go:281: Progress: Job at: /api/v2/jobs/789/ is in status: failed
=== RUN   TestJobModelCanJobBeLaunched/instance_groups_required_but_not_provided
=== RUN   TestJobLaunchActionInvoke/wait_for_completion_-_job_canceled
=== RUN   TestJobModelCanJobBeLaunched/instance_groups_provided_but_not_expected_-_warning
=== RUN   TestJobModelCanJobBeLaunched/credentials_required_but_not_provided
=== RUN   TestJobModelCanJobBeLaunched/credentials_provided_but_not_expected_-_warning
=== NAME  TestJobLaunchActionInvoke/wait_for_completion_-_job_canceled
    job_launch_action_test.go:281: Progress: Job launched, URL: /api/v2/jobs/789/, Template ID: 123, Inventory ID: 0
=== RUN   TestJobModelCanJobBeLaunched/labels_required_but_not_provided
=== NAME  TestJobLaunchActionInvoke/wait_for_completion_-_job_canceled
    job_launch_action_test.go:281: Progress: Job at: /api/v2/jobs/789/ is in status: canceled
=== RUN   TestJobLaunchActionInvoke/wait_for_completion_-_uses_default_timeout
=== RUN   TestJobModelCanJobBeLaunched/labels_provided_but_not_expected_-_warning
=== RUN   TestJobModelCanJobBeLaunched/all_required_fields_provided_-_no_errors
--- PASS: TestJobModelCanJobBeLaunched (0.00s)
    --- PASS: TestJobModelCanJobBeLaunched/all_fields_optional_-_no_errors (0.00s)
    --- PASS: TestJobModelCanJobBeLaunched/extra_vars_required_but_not_provided (0.00s)
    --- PASS: TestJobModelCanJobBeLaunched/extra_vars_provided_but_not_expected_-_warning (0.00s)
    --- PASS: TestJobModelCanJobBeLaunched/inventory_id_required_but_not_provided (0.00s)
    --- PASS: TestJobModelCanJobBeLaunched/inventory_id_provided_but_not_expected_-_warning (0.00s)
    --- PASS: TestJobModelCanJobBeLaunched/limit_required_but_not_provided (0.00s)
    --- PASS: TestJobModelCanJobBeLaunched/limit_provided_but_not_expected_-_warning (0.00s)
    --- PASS: TestJobModelCanJobBeLaunched/job_tags_required_but_not_provided (0.00s)
    --- PASS: TestJobModelCanJobBeLaunched/job_tags_provided_but_not_expected_-_warning (0.00s)
    --- PASS: TestJobModelCanJobBeLaunched/skip_tags_required_but_not_provided (0.00s)
    --- PASS: TestJobModelCanJobBeLaunched/skip_tags_provided_but_not_expected_-_warning (0.00s)
    --- PASS: TestJobModelCanJobBeLaunched/diff_mode_required_but_not_provided (0.00s)
    --- PASS: TestJobModelCanJobBeLaunched/diff_mode_provided_but_not_expected_-_warning (0.00s)
    --- PASS: TestJobModelCanJobBeLaunched/verbosity_required_but_not_provided (0.00s)
    --- PASS: TestJobModelCanJobBeLaunched/verbosity_provided_but_not_expected_-_warning (0.00s)
    --- PASS: TestJobModelCanJobBeLaunched/forks_required_but_not_provided (0.00s)
    --- PASS: TestJobModelCanJobBeLaunched/forks_provided_but_not_expected_-_warning (0.00s)
    --- PASS: TestJobModelCanJobBeLaunched/timeout_required_but_not_provided (0.00s)
    --- PASS: TestJobModelCanJobBeLaunched/timeout_provided_but_not_expected_-_warning (0.00s)
    --- PASS: TestJobModelCanJobBeLaunched/job_slice_count_required_but_not_provided (0.00s)
    --- PASS: TestJobModelCanJobBeLaunched/job_slice_count_provided_but_not_expected_-_warning (0.00s)
    --- PASS: TestJobModelCanJobBeLaunched/execution_environment_required_but_not_provided (0.00s)
    --- PASS: TestJobModelCanJobBeLaunched/execution_environment_provided_but_not_expected_-_warning (0.00s)
    --- PASS: TestJobModelCanJobBeLaunched/instance_groups_required_but_not_provided (0.00s)
    --- PASS: TestJobModelCanJobBeLaunched/instance_groups_provided_but_not_expected_-_warning (0.00s)
    --- PASS: TestJobModelCanJobBeLaunched/credentials_required_but_not_provided (0.00s)
    --- PASS: TestJobModelCanJobBeLaunched/credentials_provided_but_not_expected_-_warning (0.00s)
    --- PASS: TestJobModelCanJobBeLaunched/labels_required_but_not_provided (0.00s)
    --- PASS: TestJobModelCanJobBeLaunched/labels_provided_but_not_expected_-_warning (0.00s)
    --- PASS: TestJobModelCanJobBeLaunched/all_required_fields_provided_-_no_errors (0.00s)
=== NAME  TestJobLaunchActionInvoke/wait_for_completion_-_uses_default_timeout
    job_launch_action_test.go:281: Progress: Job launched, URL: /api/v2/jobs/789/, Template ID: 123, Inventory ID: 0
    job_launch_action_test.go:281: Progress: Job at: /api/v2/jobs/789/ is in status: successful
--- PASS: TestJobLaunchActionInvoke (0.01s)
    --- PASS: TestJobLaunchActionInvoke/fire_and_forget_-_successful_launch (0.00s)
    --- PASS: TestJobLaunchActionInvoke/launch_fails_with_API_error (0.00s)
    --- PASS: TestJobLaunchActionInvoke/invalid_JSON_response_from_API (0.00s)
    --- PASS: TestJobLaunchActionInvoke/wait_for_completion_-_job_succeeds (0.00s)
    --- PASS: TestJobLaunchActionInvoke/wait_for_completion_-_job_fails_-_no_ignore (0.00s)
    --- PASS: TestJobLaunchActionInvoke/wait_for_completion_-_job_fails_-_with_ignore (0.00s)
    --- PASS: TestJobLaunchActionInvoke/wait_for_completion_-_job_canceled (0.00s)
    --- PASS: TestJobLaunchActionInvoke/wait_for_completion_-_uses_default_timeout (0.00s)
--- PASS: TestRetryOperation (0.00s)
    --- PASS: TestRetryOperation/operation_fails_immediately_on_non_retryable_error (1.00s)
    --- PASS: TestRetryOperation/operation_succeeds_on_the_first_attempt (1.00s)
    --- PASS: TestRetryOperation/operation_with_multiple_success_status_codes (1.00s)
    --- PASS: TestRetryOperation/operation_succeeds_when_all_HTTP_status_codes_are_retryable (1.00s)
    --- PASS: TestRetryOperation/operation_fails_with_diagnostic_errors_and_non-retryable_HTTP_status_code (1.00s)
    --- PASS: TestRetryOperation/operation_succeeds_after_a_conflict (2.00s)
    --- PASS: TestRetryOperation/operation_with_multiple_retryable_status_codes (8.00s)
    --- PASS: TestRetryOperation/operation_times_out_after_multiple_retries (10.00s)
PASS
ok      github.com/ansible/terraform-provider-aap/internal/provider     554.490s
=== RUN   TestAAPCustomStringTypeValidate
=== PAUSE TestAAPCustomStringTypeValidate
=== RUN   TestAAPCustomStringTypeValueFromTerraform
=== PAUSE TestAAPCustomStringTypeValueFromTerraform
=== RUN   TestAAPCustomStringStringSemanticEquals
=== PAUSE TestAAPCustomStringStringSemanticEquals
=== CONT  TestAAPCustomStringTypeValidate
=== RUN   TestAAPCustomStringTypeValidate/wrong-value-type
=== PAUSE TestAAPCustomStringTypeValidate/wrong-value-type
=== RUN   TestAAPCustomStringTypeValidate/empty-struct
=== PAUSE TestAAPCustomStringTypeValidate/empty-struct
=== RUN   TestAAPCustomStringTypeValidate/null
=== PAUSE TestAAPCustomStringTypeValidate/null
=== RUN   TestAAPCustomStringTypeValidate/unknown
=== PAUSE TestAAPCustomStringTypeValidate/unknown
=== RUN   TestAAPCustomStringTypeValidate/json_object
=== PAUSE TestAAPCustomStringTypeValidate/json_object
=== CONT  TestAAPCustomStringStringSemanticEquals
=== RUN   TestAAPCustomStringStringSemanticEquals/not_equal_-_mismatched_field_names
=== PAUSE TestAAPCustomStringStringSemanticEquals/not_equal_-_mismatched_field_names
=== RUN   TestAAPCustomStringStringSemanticEquals/not_equal_-_additional_field
=== PAUSE TestAAPCustomStringStringSemanticEquals/not_equal_-_additional_field
=== RUN   TestAAPCustomStringStringSemanticEquals/not_equal_-_array_item_order_difference
=== PAUSE TestAAPCustomStringStringSemanticEquals/not_equal_-_array_item_order_difference
=== RUN   TestAAPCustomStringTypeValidate/json_string
=== PAUSE TestAAPCustomStringTypeValidate/json_string
=== CONT  TestAAPCustomStringTypeValueFromTerraform
=== RUN   TestAAPCustomStringStringSemanticEquals/semantically_equal_-_object_byte-for-byte_match
=== PAUSE TestAAPCustomStringStringSemanticEquals/semantically_equal_-_object_byte-for-byte_match
=== RUN   TestAAPCustomStringStringSemanticEquals/semantically_equal_-_object_whitespace_difference
=== RUN   TestAAPCustomStringTypeValidate/yaml_string
=== PAUSE TestAAPCustomStringStringSemanticEquals/semantically_equal_-_object_whitespace_difference
=== PAUSE TestAAPCustomStringTypeValidate/yaml_string
=== RUN   TestAAPCustomStringTypeValueFromTerraform/yaml_string_no_newline
=== PAUSE TestAAPCustomStringTypeValueFromTerraform/yaml_string_no_newline
=== RUN   TestAAPCustomStringStringSemanticEquals/semantically_equal_-_yaml_no_difference
=== RUN   TestAAPCustomStringTypeValueFromTerraform/true
=== PAUSE TestAAPCustomStringTypeValueFromTerraform/true
=== RUN   TestAAPCustomStringTypeValidate/yaml_string_no_newline
=== RUN   TestAAPCustomStringTypeValueFromTerraform/unknown
=== PAUSE TestAAPCustomStringTypeValidate/yaml_string_no_newline
=== CONT  TestAAPCustomStringTypeValidate/wrong-value-type
=== CONT  TestAAPCustomStringTypeValidate/json_string
=== PAUSE TestAAPCustomStringTypeValueFromTerraform/unknown
=== RUN   TestAAPCustomStringTypeValueFromTerraform/null
=== PAUSE TestAAPCustomStringTypeValueFromTerraform/null
=== CONT  TestAAPCustomStringTypeValidate/json_object
=== RUN   TestAAPCustomStringTypeValueFromTerraform/wrongType
=== PAUSE TestAAPCustomStringTypeValueFromTerraform/wrongType
=== CONT  TestAAPCustomStringTypeValueFromTerraform/yaml_string_no_newline
=== CONT  TestAAPCustomStringTypeValidate/yaml_string_no_newline
=== CONT  TestAAPCustomStringTypeValidate/unknown
=== CONT  TestAAPCustomStringTypeValidate/null
=== CONT  TestAAPCustomStringTypeValidate/empty-struct
=== CONT  TestAAPCustomStringTypeValidate/yaml_string
--- PASS: TestAAPCustomStringTypeValidate (0.00s)
    --- PASS: TestAAPCustomStringTypeValidate/json_object (0.00s)
    --- PASS: TestAAPCustomStringTypeValidate/wrong-value-type (0.00s)
    --- PASS: TestAAPCustomStringTypeValidate/yaml_string_no_newline (0.00s)
    --- PASS: TestAAPCustomStringTypeValidate/json_string (0.00s)
    --- PASS: TestAAPCustomStringTypeValidate/unknown (0.00s)
    --- PASS: TestAAPCustomStringTypeValidate/null (0.00s)
    --- PASS: TestAAPCustomStringTypeValidate/empty-struct (0.00s)
    --- PASS: TestAAPCustomStringTypeValidate/yaml_string (0.00s)
=== PAUSE TestAAPCustomStringStringSemanticEquals/semantically_equal_-_yaml_no_difference
=== RUN   TestAAPCustomStringStringSemanticEquals/semantically_equal_-_yaml_no_difference_with_newline
=== PAUSE TestAAPCustomStringStringSemanticEquals/semantically_equal_-_yaml_no_difference_with_newline
=== RUN   TestAAPCustomStringStringSemanticEquals/not_equal_-_mismatched_field_values
=== PAUSE TestAAPCustomStringStringSemanticEquals/not_equal_-_mismatched_field_values
=== CONT  TestAAPCustomStringStringSemanticEquals/not_equal_-_mismatched_field_names
=== CONT  TestAAPCustomStringTypeValueFromTerraform/wrongType
=== CONT  TestAAPCustomStringStringSemanticEquals/semantically_equal_-_object_whitespace_difference
=== CONT  TestAAPCustomStringStringSemanticEquals/not_equal_-_array_item_order_difference
=== CONT  TestAAPCustomStringStringSemanticEquals/not_equal_-_additional_field
=== CONT  TestAAPCustomStringStringSemanticEquals/semantically_equal_-_object_byte-for-byte_match
=== CONT  TestAAPCustomStringStringSemanticEquals/not_equal_-_mismatched_field_values
=== CONT  TestAAPCustomStringStringSemanticEquals/semantically_equal_-_yaml_no_difference
=== CONT  TestAAPCustomStringTypeValueFromTerraform/null
=== CONT  TestAAPCustomStringTypeValueFromTerraform/unknown
=== CONT  TestAAPCustomStringTypeValueFromTerraform/true
=== CONT  TestAAPCustomStringStringSemanticEquals/semantically_equal_-_yaml_no_difference_with_newline
--- PASS: TestAAPCustomStringTypeValueFromTerraform (0.00s)
    --- PASS: TestAAPCustomStringTypeValueFromTerraform/yaml_string_no_newline (0.00s)
    --- PASS: TestAAPCustomStringTypeValueFromTerraform/wrongType (0.00s)
    --- PASS: TestAAPCustomStringTypeValueFromTerraform/null (0.00s)
    --- PASS: TestAAPCustomStringTypeValueFromTerraform/unknown (0.00s)
    --- PASS: TestAAPCustomStringTypeValueFromTerraform/true (0.00s)
--- PASS: TestAAPCustomStringStringSemanticEquals (0.00s)
    --- PASS: TestAAPCustomStringStringSemanticEquals/not_equal_-_mismatched_field_names (0.00s)
    --- PASS: TestAAPCustomStringStringSemanticEquals/semantically_equal_-_object_whitespace_difference (0.00s)
    --- PASS: TestAAPCustomStringStringSemanticEquals/not_equal_-_additional_field (0.00s)
    --- PASS: TestAAPCustomStringStringSemanticEquals/not_equal_-_mismatched_field_values (0.00s)
    --- PASS: TestAAPCustomStringStringSemanticEquals/semantically_equal_-_object_byte-for-byte_match (0.00s)
    --- PASS: TestAAPCustomStringStringSemanticEquals/semantically_equal_-_yaml_no_difference (0.00s)
    --- PASS: TestAAPCustomStringStringSemanticEquals/not_equal_-_array_item_order_difference (0.00s)
    --- PASS: TestAAPCustomStringStringSemanticEquals/semantically_equal_-_yaml_no_difference_with_newline (0.00s)
PASS
ok      github.com/ansible/terraform-provider-aap/internal/provider/customtypes 0.003s
?       github.com/ansible/terraform-provider-aap/internal/provider/mock_provider       [no test files]

@sonarqubecloud
Copy link
Copy Markdown

Quality Gate Failed Quality Gate failed

Failed conditions
72.6% Coverage on New Code (required ≥ 80%)
8.5% Duplication on New Code (required ≤ 3%)

See analysis details on SonarQube Cloud

@PabloHiro PabloHiro marked this pull request as ready for review January 22, 2026 09:43
matoval
matoval previously approved these changes Feb 11, 2026
Copy link
Copy Markdown
Collaborator

@matoval matoval left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

Copy link
Copy Markdown
Contributor

@davemulford davemulford left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Request changes to give time for docs coordination.

@coderabbitai
Copy link
Copy Markdown

coderabbitai bot commented Apr 16, 2026

📝 Walkthrough

Walkthrough

Adds prompt-on-launch support for workflow jobs: new schema fields (job_tags, labels, limit, skip_tags), API models and validation, centralized launch/post helpers, updated action behavior, documentation, acceptance/unit tests, and test fixtures.

Changes

Cohort / File(s) Summary
Docs & Changelog
changelogs/fragments/20260122-prompt-on-launch-support-workflow-jobs.yml, docs/actions/workflow_job_launch.md, docs/resources/workflow_job.md
Added changelog entry and documented new optional parameters job_tags, labels (write-only note), limit, and skip_tags for the workflow-job resource and launch action.
Action implementation & tests
internal/provider/workflow_job_launch_action.go, internal/provider/workflow_job_launch_action_test.go
Extended action schema to accept limit, job_tags, skip_tags, labels; adjusted Invoke logging and wait-for-completion to use shared wait helper; added unit and acceptance tests covering new fields and missing-required behavior.
Resource implementation & tests
internal/provider/workflow_job_resource.go, internal/provider/workflow_job_resource_test.go
Added WorkflowJobLaunchAPIModel and WorkflowJobLaunchRequestModel; extended models with Limit, JobTags, SkipTags, Labels; added launch-config GET, CanWorkflowJobBeLaunched, WaitForWorkflowJobCompletion, GetTemplateID, launchAndWait flow and extensive tests; request serialization updated to use launch request model.
Shared launch utilities
internal/provider/utils.go
Introduced LaunchFieldValidation, ValidateLaunchFields, ParseIgnoredFieldsToList, LaunchableJob interface, GetLaunchConfiguration, and LaunchJobTemplate to centralize launch validation and POST/GET behavior.
Job resource refactor
internal/provider/job_resource.go
Consolidated launch-and-wait logic into launchAndWait, delegated launch POST to LaunchJobTemplate, used ValidateLaunchFields, and added JobModel.GetTemplateID().
Testing fixtures
testing/playbook.yml, testing/templates/acceptance_test_vars.env.j2
Added Ansible task for a demo workflow-job template with all promptable fields enabled and exported AAP_TEST_WORKFLOW_JOB_TEMPLATE_ALL_FIELDS_PROMPT_ID for acceptance tests.

Sequence Diagrams

sequenceDiagram
    participant Client as Client (Terraform)
    participant Provider as Provider
    participant AAP as AAP API

    Client->>Provider: Request launch (aap_workflow_job / action)
    Provider->>AAP: GET /.../{id}/launch/
    AAP-->>Provider: Launch config (ask_on_launch flags, ignored_fields, etc.)
    Provider->>Provider: CanWorkflowJobBeLaunched() — validate required prompt fields
    alt All required fields present
        Provider->>AAP: POST /.../{id}/launch/ with payload (extra_vars, job_tags, labels, limit, skip_tags, inventory_id...)
        AAP-->>Provider: 201 Created + Job response
        Provider->>Provider: WaitForWorkflowJobCompletion() (if requested) — poll status
        AAP-->>Provider: Job status updates
        Provider-->>Client: Success / state updated
    else Missing required fields
        Provider-->>Client: Error (Missing required field)
    end
Loading

Estimated code review effort

🎯 5 (Critical) | ⏱️ ~120 minutes

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 40.74% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed The title 'Add prompt-on-launch support for workflow jobs' accurately summarizes the main change in the pull request.
Description check ✅ Passed PR description is comprehensive and follows the template structure with all required sections completed.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@sonarqubecloud
Copy link
Copy Markdown

Quality Gate Failed Quality Gate failed

Failed conditions
72.6% Coverage on New Code (required ≥ 80%)
8.5% Duplication on New Code (required ≤ 3%)

See analysis details on SonarQube Cloud

Copy link
Copy Markdown

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (2)
internal/provider/workflow_job_launch_action.go (1)

123-132: Nit: labels missing from debug log while other new fields are logged.

For symmetry with the newly added limit, job_tags, and skip_tags, consider including labels in the debug map so the full set of prompt-on-launch inputs is captured.

Proposed tweak
 	tflog.Debug(ctx, "workflow job launched", map[string]interface{}{
 		"url":          jobResponse.URL,
 		"status":       jobResponse.Status,
 		"template_id":  jobResponse.TemplateID,
 		"inventory_id": jobResponse.Inventory,
 		"extra_vars":   jobResponse.ExtraVars,
 		"limit":        jobResponse.Limit,
 		"job_tags":     jobResponse.JobTags,
 		"skip_tags":    jobResponse.SkipTags,
+		"labels":       jobResponse.Labels,
 	})

Also, the removal of ignored_fields from this map isn't mentioned in the PR description — confirm that's intentional, as it was useful for surfacing AAP-side rejected inputs.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@internal/provider/workflow_job_launch_action.go` around lines 123 - 132, The
debug log in tflog.Debug within workflow_job_launch_action.go is missing the
labels field from jobResponse; update the map passed to tflog.Debug (the one
currently logging
"url","status","template_id","inventory_id","extra_vars","limit","job_tags","skip_tags")
to include "labels": jobResponse.Labels so prompt-on-launch inputs are fully
captured, and verify whether the previously-logged ignored_fields was
intentionally removed—if it should remain, re-add "ignored_fields":
jobResponse.IgnoredFields to the same map.
internal/provider/workflow_job_resource_test.go (1)

1111-1115: Optional: testAccCheckWorkflowJobPause is redundant when wait_for_completion = true.

The config sets wait_for_completion = true, so the workflow job is already in a final state by the time Check runs. The explicit pause is harmless but can be dropped to keep the test focused and faster.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@internal/provider/workflow_job_resource_test.go` around lines 1111 - 1115,
The test config uses wait_for_completion = true via
testAccWorkflowJobAllFieldsOnPrompt so the job is already final when checks run;
remove the redundant check testAccCheckWorkflowJobPause from the
resource.ComposeAggregateTestCheckFunc in the failing test (the reference to
testAccWorkflowJobAllFieldsOnPrompt, testAccCheckWorkflowJobPause and the
ComposeAggregateTestCheckFunc identify the spot) to simplify and speed the test.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@internal/provider/workflow_job_resource.go`:
- Around line 492-518: The validation incorrectly treats Terraform "unknown"
plan values as provided because it only checks IsNull(); update the logic around
the validations slice (the block building validations and the loop over it) to
consider IsUnknown() for the Optional+Computed fields (r.JobTags, r.SkipTags,
r.Limit, r.InventoryID) by computing a boolean like isNullOrUnknown (e.g.,
isNull || IsUnknown) and use that instead of v.isNull for the required-field
error and the "will be ignored" warning; keep ExtraVars and Labels behavior
unchanged. Also add unit tests that supply Unknown plan values for those four
Optional+Computed fields to assert the Create-path validation produces the
expected error/warning behavior.

---

Nitpick comments:
In `@internal/provider/workflow_job_launch_action.go`:
- Around line 123-132: The debug log in tflog.Debug within
workflow_job_launch_action.go is missing the labels field from jobResponse;
update the map passed to tflog.Debug (the one currently logging
"url","status","template_id","inventory_id","extra_vars","limit","job_tags","skip_tags")
to include "labels": jobResponse.Labels so prompt-on-launch inputs are fully
captured, and verify whether the previously-logged ignored_fields was
intentionally removed—if it should remain, re-add "ignored_fields":
jobResponse.IgnoredFields to the same map.

In `@internal/provider/workflow_job_resource_test.go`:
- Around line 1111-1115: The test config uses wait_for_completion = true via
testAccWorkflowJobAllFieldsOnPrompt so the job is already final when checks run;
remove the redundant check testAccCheckWorkflowJobPause from the
resource.ComposeAggregateTestCheckFunc in the failing test (the reference to
testAccWorkflowJobAllFieldsOnPrompt, testAccCheckWorkflowJobPause and the
ComposeAggregateTestCheckFunc identify the spot) to simplify and speed the test.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 7c4f89d2-7a2e-4beb-a73c-7df9ffb963e0

📥 Commits

Reviewing files that changed from the base of the PR and between 924ec1f and 383c3b0.

📒 Files selected for processing (9)
  • changelogs/fragments/20260122-prompt-on-launch-support-workflow-jobs.yml
  • docs/actions/workflow_job_launch.md
  • docs/resources/workflow_job.md
  • internal/provider/workflow_job_launch_action.go
  • internal/provider/workflow_job_launch_action_test.go
  • internal/provider/workflow_job_resource.go
  • internal/provider/workflow_job_resource_test.go
  • testing/playbook.yml
  • testing/templates/acceptance_test_vars.env.j2

Comment thread internal/provider/workflow_job_resource.go Outdated
Copy link
Copy Markdown

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
internal/provider/job_resource.go (1)

654-669: ⚠️ Potential issue | 🟠 Major

Unknown plan values bypass required-field checks and trigger spurious warnings on Create.

On Create, Limit, JobTags, SkipTags, InventoryID, DiffMode, ExecutionEnvironmentID, Forks, Verbosity, InstanceGroups, Timeout, and JobSliceCount are all Optional+Computed. When the user omits them there is no prior state for UseStateForUnknown() to substitute, so they arrive as unknown, not null. Since IsNull() returns false for unknown values:

  • When the template sets e.g. ask_limit_on_launch=true and the user omits limit, the required-field validation is skipped and the POST proceeds with an empty value, producing an API error rather than the intended provider diagnostic.
  • When the template does not ask for a field and the user also omitted it, the "field will be ignored" warning fires spuriously on every Create.

ExtraVars (Optional only) and Credentials/Labels (WriteOnly) are unaffected. Existing unit tests use explicit Null/Value and do not catch this.

🛠️ Proposed fix
 	validations := []LaunchFieldValidation{
 		{launchConfig.AskVariablesOnLaunch, r.ExtraVars.IsNull(), "extra_vars"},
-		{launchConfig.AskTagsOnLaunch, r.JobTags.IsNull(), "job_tags"},
-		{launchConfig.AskSkipTagsOnLaunch, r.SkipTags.IsNull(), "skip_tags"},
-		{launchConfig.AskDiffModeOnLaunch, r.DiffMode.IsNull(), "diff_mode"},
-		{launchConfig.AskLimitOnLaunch, r.Limit.IsNull(), "limit"},
-		{launchConfig.AskInventoryOnLaunch, r.InventoryID.IsNull(), "inventory_id"},
+		{launchConfig.AskTagsOnLaunch, r.JobTags.IsNull() || r.JobTags.IsUnknown(), "job_tags"},
+		{launchConfig.AskSkipTagsOnLaunch, r.SkipTags.IsNull() || r.SkipTags.IsUnknown(), "skip_tags"},
+		{launchConfig.AskDiffModeOnLaunch, r.DiffMode.IsNull() || r.DiffMode.IsUnknown(), "diff_mode"},
+		{launchConfig.AskLimitOnLaunch, r.Limit.IsNull() || r.Limit.IsUnknown(), "limit"},
+		{launchConfig.AskInventoryOnLaunch, r.InventoryID.IsNull() || r.InventoryID.IsUnknown(), "inventory_id"},
 		{launchConfig.AskCredentialOnLaunch, r.Credentials.IsNull(), "credentials"},
-		{launchConfig.AskExecutionEnvironmentOnLaunch, r.ExecutionEnvironmentID.IsNull(), "execution_environment"},
+		{launchConfig.AskExecutionEnvironmentOnLaunch, r.ExecutionEnvironmentID.IsNull() || r.ExecutionEnvironmentID.IsUnknown(), "execution_environment"},
 		{launchConfig.AskLabelsOnLaunch, r.Labels.IsNull(), "labels"},
-		{launchConfig.AskForksOnLaunch, r.Forks.IsNull(), "forks"},
-		{launchConfig.AskVerbosityOnLaunch, r.Verbosity.IsNull(), "verbosity"},
-		{launchConfig.AskInstanceGroupsOnLaunch, r.InstanceGroups.IsNull(), "instance_groups"},
-		{launchConfig.AskTimeoutOnLaunch, r.Timeout.IsNull(), "timeout"},
-		{launchConfig.AskJobSliceCountOnLaunch, r.JobSliceCount.IsNull(), "job_slice_count"},
+		{launchConfig.AskForksOnLaunch, r.Forks.IsNull() || r.Forks.IsUnknown(), "forks"},
+		{launchConfig.AskVerbosityOnLaunch, r.Verbosity.IsNull() || r.Verbosity.IsUnknown(), "verbosity"},
+		{launchConfig.AskInstanceGroupsOnLaunch, r.InstanceGroups.IsNull() || r.InstanceGroups.IsUnknown(), "instance_groups"},
+		{launchConfig.AskTimeoutOnLaunch, r.Timeout.IsNull() || r.Timeout.IsUnknown(), "timeout"},
+		{launchConfig.AskJobSliceCountOnLaunch, r.JobSliceCount.IsNull() || r.JobSliceCount.IsUnknown(), "job_slice_count"},
 	}

Alternatively, consider folding the null-or-unknown check into LaunchFieldValidation (e.g., accept an attr.Value and compute IsNull() || IsUnknown() centrally) to prevent this from recurring, and extend unit tests with Unknown values to cover the Create path.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@internal/provider/job_resource.go` around lines 654 - 669, The validation
loop builds LaunchFieldValidation entries using expressions like
launchConfig.AskLimitOnLaunch and r.Limit.IsNull(), but attr.Values that are
unknown on Create (Optional+Computed fields such as Limit, JobTags, SkipTags,
InventoryID, DiffMode, ExecutionEnvironmentID, Forks, Verbosity, InstanceGroups,
Timeout, JobSliceCount) return IsNull() == false and thus bypass required checks
and emit spurious warnings; fix by treating unknown the same as null—either
change each check to r.<Field>.IsNull() || r.<Field>.IsUnknown() for the listed
fields in the validations slice, or better refactor LaunchFieldValidation to
accept the attr.Value and compute (v.IsNull() || v.IsUnknown()) centrally so the
required/ignored logic uses that combined null-or-unknown predicate (update unit
tests to include Unknown values on Create).
♻️ Duplicate comments (1)
internal/provider/workflow_job_resource.go (1)

472-482: ⚠️ Potential issue | 🟠 Major

Unknown plan values bypass required-field checks on Create (same class of bug as in job_resource.go).

Limit, JobTags, SkipTags, and InventoryID are Optional+Computed, so on Create they arrive as unknown (not null) when the user omits them — UseStateForUnknown() has no prior state to substitute. IsNull() is false for unknown values, so:

  • Required-on-launch fields silently skip the error and the POST proceeds with empty values, producing API errors instead of the intended "Missing required field" diagnostic.
  • For fields the template does not ask for, the "field will be ignored" warning fires spuriously on every Create.

ExtraVars (Optional only) and Labels (Optional+WriteOnly) resolve to null when unset and are unaffected.

🛠️ Proposed fix
 	validations := []LaunchFieldValidation{
 		{launchConfig.AskVariablesOnLaunch, r.ExtraVars.IsNull(), "extra_vars"},
-		{launchConfig.AskTagsOnLaunch, r.JobTags.IsNull(), "job_tags"},
-		{launchConfig.AskSkipTagsOnLaunch, r.SkipTags.IsNull(), "skip_tags"},
-		{launchConfig.AskLimitOnLaunch, r.Limit.IsNull(), "limit"},
-		{launchConfig.AskInventoryOnLaunch, r.InventoryID.IsNull(), "inventory_id"},
+		{launchConfig.AskTagsOnLaunch, r.JobTags.IsNull() || r.JobTags.IsUnknown(), "job_tags"},
+		{launchConfig.AskSkipTagsOnLaunch, r.SkipTags.IsNull() || r.SkipTags.IsUnknown(), "skip_tags"},
+		{launchConfig.AskLimitOnLaunch, r.Limit.IsNull() || r.Limit.IsUnknown(), "limit"},
+		{launchConfig.AskInventoryOnLaunch, r.InventoryID.IsNull() || r.InventoryID.IsUnknown(), "inventory_id"},
 		{launchConfig.AskLabelsOnLaunch, r.Labels.IsNull(), "labels"},
 	}

Or, preferably, update LaunchFieldValidation to accept the attr.Value and compute IsNull() || IsUnknown() in one place (see comment on utils.go).

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@internal/provider/workflow_job_resource.go` around lines 472 - 482, The
validations currently call LaunchFieldValidation with boolean checks using
r.Limit.IsNull(), r.JobTags.IsNull(), r.SkipTags.IsNull(),
r.InventoryID.IsNull(), which miss Unknown values on Create (Optional+Computed)
and let required-on-launch fields bypass diagnostics; update the validation
logic so the check treats unknown the same as null by using IsNull() ||
IsUnknown() for these attributes, or better, modify LaunchFieldValidation to
accept the attr.Value (e.g., r.Limit, r.JobTags, r.SkipTags, r.InventoryID) and
perform the combined IsNull() || IsUnknown() test inside
ValidateLaunchFields/LaunchFieldValidation so unknowns trigger the
required-field errors and suppress spurious "will be ignored" warnings on
create.
🧹 Nitpick comments (3)
internal/provider/utils.go (1)

130-158: Design makes the null-vs-unknown pitfall easy to reintroduce.

LaunchFieldValidation.IsNull is a precomputed bool supplied by callers, which is exactly why the job_resource.go and workflow_job_resource.go validation sites only checked IsNull() and missed IsUnknown() (see related comments). Consider changing the field to accept the attr.Value directly and derive the check centrally:

type LaunchFieldValidation struct {
    AskOnLaunch bool
    Value       attr.Value
    FieldName   string
}

// inside ValidateLaunchFields
missing := v.Value.IsNull() || v.Value.IsUnknown()

This guarantees both Null and Unknown are treated as "not provided" across every call site and future additions.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@internal/provider/utils.go` around lines 130 - 158, The validation currently
relies on a precomputed boolean IsNull on LaunchFieldValidation which caused
callers (job_resource.go, workflow_job_resource.go) to miss IsUnknown cases;
change LaunchFieldValidation to carry the actual attr.Value (rename IsNull ->
Value attr.Value) and update ValidateLaunchFields to compute "missing" as
v.Value.IsNull() || v.Value.IsUnknown() so both null and unknown are treated as
not provided; update all call sites that construct LaunchFieldValidation to pass
the attr.Value instead of IsNull and adjust checks that previously used IsNull
to rely on ValidateLaunchFields' derived missing logic.
internal/provider/workflow_job_resource_test.go (1)

518-659: Tests only exercise Null/Value; add Unknown coverage.

CanWorkflowJobBeLaunched unit tests cover explicit Null and Value states but never Unknown. Since Optional+Computed fields arrive as Unknown on Create, adding cases like Limit: customtypes.NewAAPCustomStringUnknown() with AskLimitOnLaunch: true would catch the null-vs-unknown bug that currently surfaces only in real Terraform runs. See the related comment on CanWorkflowJobBeLaunched.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@internal/provider/workflow_job_resource_test.go` around lines 518 - 659, The
tests in TestWorkflowJobModelCanWorkflowJobBeLaunched only exercise Null and
Value states; add test cases that set Optional+Computed fields to Unknown to
match Create-time Terraform behavior so CanWorkflowJobBeLaunched handles Unknown
correctly. Specifically, in that table-driven test add rows where fields such as
Limit, ExtraVars, JobTags, SkipTags use customtypes.NewAAPCustomStringUnknown(),
InventoryID uses types.Int64Unknown(), and Labels uses
types.ListUnknown(types.Int64Type) while the corresponding
WorkflowJobLaunchAPIModel flags (e.g., AskLimitOnLaunch, AskVariablesOnLaunch,
AskInventoryOnLaunch, AskLabelsOnLaunch) are true; assert
expectError/expectWarnings accordingly to catch the null-vs-unknown bug when
calling WorkflowJobModel.CanWorkflowJobBeLaunched.
internal/provider/job_resource.go (1)

686-721: Consider extracting a WaitForJobCompletion helper for parity with the workflow job resource.

WorkflowJobResource.launchAndWait delegates polling to WorkflowJobModel.WaitForWorkflowJobCompletion, while JobResource.launchAndWait inlines the retry.RetryContext call. Mirroring the helper on JobModel would make the two resources symmetric and easier to maintain/test.

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Outside diff comments:
In `@internal/provider/job_resource.go`:
- Around line 654-669: The validation loop builds LaunchFieldValidation entries
using expressions like launchConfig.AskLimitOnLaunch and r.Limit.IsNull(), but
attr.Values that are unknown on Create (Optional+Computed fields such as Limit,
JobTags, SkipTags, InventoryID, DiffMode, ExecutionEnvironmentID, Forks,
Verbosity, InstanceGroups, Timeout, JobSliceCount) return IsNull() == false and
thus bypass required checks and emit spurious warnings; fix by treating unknown
the same as null—either change each check to r.<Field>.IsNull() ||
r.<Field>.IsUnknown() for the listed fields in the validations slice, or better
refactor LaunchFieldValidation to accept the attr.Value and compute (v.IsNull()
|| v.IsUnknown()) centrally so the required/ignored logic uses that combined
null-or-unknown predicate (update unit tests to include Unknown values on
Create).

---

Duplicate comments:
In `@internal/provider/workflow_job_resource.go`:
- Around line 472-482: The validations currently call LaunchFieldValidation with
boolean checks using r.Limit.IsNull(), r.JobTags.IsNull(), r.SkipTags.IsNull(),
r.InventoryID.IsNull(), which miss Unknown values on Create (Optional+Computed)
and let required-on-launch fields bypass diagnostics; update the validation
logic so the check treats unknown the same as null by using IsNull() ||
IsUnknown() for these attributes, or better, modify LaunchFieldValidation to
accept the attr.Value (e.g., r.Limit, r.JobTags, r.SkipTags, r.InventoryID) and
perform the combined IsNull() || IsUnknown() test inside
ValidateLaunchFields/LaunchFieldValidation so unknowns trigger the
required-field errors and suppress spurious "will be ignored" warnings on
create.

---

Nitpick comments:
In `@internal/provider/utils.go`:
- Around line 130-158: The validation currently relies on a precomputed boolean
IsNull on LaunchFieldValidation which caused callers (job_resource.go,
workflow_job_resource.go) to miss IsUnknown cases; change LaunchFieldValidation
to carry the actual attr.Value (rename IsNull -> Value attr.Value) and update
ValidateLaunchFields to compute "missing" as v.Value.IsNull() ||
v.Value.IsUnknown() so both null and unknown are treated as not provided; update
all call sites that construct LaunchFieldValidation to pass the attr.Value
instead of IsNull and adjust checks that previously used IsNull to rely on
ValidateLaunchFields' derived missing logic.

In `@internal/provider/workflow_job_resource_test.go`:
- Around line 518-659: The tests in TestWorkflowJobModelCanWorkflowJobBeLaunched
only exercise Null and Value states; add test cases that set Optional+Computed
fields to Unknown to match Create-time Terraform behavior so
CanWorkflowJobBeLaunched handles Unknown correctly. Specifically, in that
table-driven test add rows where fields such as Limit, ExtraVars, JobTags,
SkipTags use customtypes.NewAAPCustomStringUnknown(), InventoryID uses
types.Int64Unknown(), and Labels uses types.ListUnknown(types.Int64Type) while
the corresponding WorkflowJobLaunchAPIModel flags (e.g., AskLimitOnLaunch,
AskVariablesOnLaunch, AskInventoryOnLaunch, AskLabelsOnLaunch) are true; assert
expectError/expectWarnings accordingly to catch the null-vs-unknown bug when
calling WorkflowJobModel.CanWorkflowJobBeLaunched.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 00779f03-0761-4ee3-8b18-e136b2c80d91

📥 Commits

Reviewing files that changed from the base of the PR and between 383c3b0 and b166c69.

📒 Files selected for processing (6)
  • internal/provider/job_resource.go
  • internal/provider/utils.go
  • internal/provider/workflow_job_launch_action.go
  • internal/provider/workflow_job_launch_action_test.go
  • internal/provider/workflow_job_resource.go
  • internal/provider/workflow_job_resource_test.go
🚧 Files skipped from review as they are similar to previous changes (1)
  • internal/provider/workflow_job_launch_action.go

@melissalkelly melissalkelly force-pushed the feature/support-for-prompt-on-launch-workflow-job branch from b166c69 to f833543 Compare April 16, 2026 22:01
davemulford
davemulford previously approved these changes Apr 17, 2026
Copy link
Copy Markdown
Contributor

@davemulford davemulford left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks great!

Copy link
Copy Markdown

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (2)
internal/provider/workflow_job_resource_test.go (1)

518-659: Consider adding an IsUnknown() case for Optional+Computed fields.

TestWorkflowJobModelCanWorkflowJobBeLaunched only exercises Null vs. Value for Limit/JobTags/SkipTags/InventoryID, but on Create these Optional+Computed attributes arrive as unknown when unset. The shared ValidateLaunchFields already handles both (IsNull() || IsUnknown()), so adding a couple of Unknown-based cases would lock in that contract from the call site and catch future regressions if someone refactors the validator.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@internal/provider/workflow_job_resource_test.go` around lines 518 - 659,
TestWorkflowJobModelCanWorkflowJobBeLaunched currently only tests Null vs Value
for optional+computed fields; add cases where those fields are Unknown
(IsUnknown) to ensure Optional+Computed attributes behave the same as Null at
the call site—update the test table to include at least two test cases (e.g.,
one where Limit/JobTags/SkipTags are Unknown and one where
InventoryID/ExtraVars/Labels are Unknown) and assert the same
expectError/expectWarnings outcomes as their Null counterparts; reference the
test function TestWorkflowJobModelCanWorkflowJobBeLaunched and the validator
ValidateLaunchFields to mirror its IsNull() || IsUnknown() logic.
internal/provider/job_resource.go (1)

669-704: Consider extracting a shared WaitForJobCompletion helper for parity with WorkflowJobModel.

WorkflowJobModel.WaitForWorkflowJobCompletion encapsulates the timeout/retry/diagnostic pattern, while JobResource.launchAndWait still inlines the same logic here. Factoring an analogous JobModel.WaitForJobCompletion (or a single shared helper keyed off URL/timeout) would keep the two resources behaviorally aligned and shrink drift risk when the wait semantics evolve.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@internal/provider/job_resource.go` around lines 669 - 704, Extract the inline
wait/retry/timeout logic from JobResource.launchAndWait into a reusable helper
(e.g., JobModel.WaitForJobCompletion or a shared WaitForJobCompletion that
accepts ctx, client, url, timeout, and a progress callback) mirroring the
pattern used by WorkflowJobModel.WaitForWorkflowJobCompletion; replace the
inlined block that builds timeout, retryProgressFunc, calls retry.RetryContext
with retryUntilAAPJobReachesAnyFinalState, and sets data.Status with a call to
the new helper, ensuring diagnostics returned on error are preserved and that
LaunchJobWithResponse remains invoked before waiting.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@internal/provider/utils.go`:
- Around line 161-186: The ParseIgnoredFieldsToList function builds keysList by
iterating a map which yields non-deterministic order; to avoid perpetual diffs
you should collect the map keys (or the mapped values via keyMapping) into a
slice, sort that slice using sort.Strings, then build keysList in that
deterministic order before calling types.ListValue; update
ParseIgnoredFieldsToList to perform the sort and add the "sort" import,
referencing the existing ParseIgnoredFieldsToList function, the keysList
variable and the keyMapping lookup.

---

Nitpick comments:
In `@internal/provider/job_resource.go`:
- Around line 669-704: Extract the inline wait/retry/timeout logic from
JobResource.launchAndWait into a reusable helper (e.g.,
JobModel.WaitForJobCompletion or a shared WaitForJobCompletion that accepts ctx,
client, url, timeout, and a progress callback) mirroring the pattern used by
WorkflowJobModel.WaitForWorkflowJobCompletion; replace the inlined block that
builds timeout, retryProgressFunc, calls retry.RetryContext with
retryUntilAAPJobReachesAnyFinalState, and sets data.Status with a call to the
new helper, ensuring diagnostics returned on error are preserved and that
LaunchJobWithResponse remains invoked before waiting.

In `@internal/provider/workflow_job_resource_test.go`:
- Around line 518-659: TestWorkflowJobModelCanWorkflowJobBeLaunched currently
only tests Null vs Value for optional+computed fields; add cases where those
fields are Unknown (IsUnknown) to ensure Optional+Computed attributes behave the
same as Null at the call site—update the test table to include at least two test
cases (e.g., one where Limit/JobTags/SkipTags are Unknown and one where
InventoryID/ExtraVars/Labels are Unknown) and assert the same
expectError/expectWarnings outcomes as their Null counterparts; reference the
test function TestWorkflowJobModelCanWorkflowJobBeLaunched and the validator
ValidateLaunchFields to mirror its IsNull() || IsUnknown() logic.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 4fccd57e-b555-41a6-a73a-aebc6c721b32

📥 Commits

Reviewing files that changed from the base of the PR and between b166c69 and bab0122.

📒 Files selected for processing (5)
  • internal/provider/job_resource.go
  • internal/provider/utils.go
  • internal/provider/workflow_job_launch_action_test.go
  • internal/provider/workflow_job_resource.go
  • internal/provider/workflow_job_resource_test.go

Comment thread internal/provider/utils.go
Add support for limit, job_tags, skip_tags, and labels fields
in workflow job resources and actions. These fields can be
provided at launch time when the workflow job template allows it.

Changes:
- Add new optional fields to workflow_job resource and action
- Validate fields against template's ask_on_launch settings
- Add comprehensive unit tests for new fields
- Refactor duplicated code into shared helpers
- Fix validation to handle unknown values on Create
- Add GetLaunchConfiguration and CommonJobSchemaAttributes helpers

Co-authored-by: melissalkelly <melissalkelly1@gmail.com>
Signed-off-by: melissalkelly <melissalkelly1@gmail.com>
@melissalkelly melissalkelly force-pushed the feature/support-for-prompt-on-launch-workflow-job branch from 5b67f4d to 9a79cec Compare April 17, 2026 13:35
@sonarqubecloud
Copy link
Copy Markdown

@melissalkelly melissalkelly changed the title Support for additional fields in jobs and workflow jobs Add prompt-on-launch support for workflow jobs Apr 17, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants