Skip to content

Commit

Permalink
add validation
Browse files Browse the repository at this point in the history
  • Loading branch information
GabeWM committed Mar 10, 2025
1 parent 73e5d86 commit 5abe0a4
Show file tree
Hide file tree
Showing 5 changed files with 67 additions and 36 deletions.
12 changes: 10 additions & 2 deletions datadog/fwprovider/resource_datadog_workflow_automation.go
Original file line number Diff line number Diff line change
Expand Up @@ -240,7 +240,11 @@ func workflowAutomationModelToCreateApiRequest(workflowAutomationModel workflowA
err = fmt.Errorf("error unmarshalling spec json string to attributes.Spec struct: %s", err)
return nil, err
}
// TODO: Enforce strict decoding
// Enforce strict decoding
err = utils.CheckForAdditionalProperties(attributes.Spec)
if err != nil {
return nil, fmt.Errorf("unknown field in spec, this could be due to misspelled field, using a version of the Go client that is out of date, or support for this field has not been added. Check the [API](https://docs.datadoghq.com/api/latest/workflow-automation/#create-a-workflow) documentation for what fields are currently supported. Error: %s", err)
}

data := datadogV2.NewWorkflowData(*attributes, datadogV2.WORKFLOWDATATYPE_WORKFLOWS)
req := datadogV2.NewCreateWorkflowRequest(*data)
Expand All @@ -266,7 +270,11 @@ func workflowAutomationModelToUpdateApiRequest(workflowAutomationModel workflowA
err = fmt.Errorf("error unmarshalling spec json string to attributes.Spec struct: %s", err)
return nil, err
}
// // TODO: Enforce strict decoding
// Enforce strict decoding
err = utils.CheckForAdditionalProperties(attributes.Spec)
if err != nil {
return nil, fmt.Errorf("unknown field in spec, this could be due to misspelled field, using a version of the Go client that is out of date, or support for this field has not been added. Check the [API](https://docs.datadoghq.com/api/latest/workflow-automation/#create-a-workflow) documentation for what fields are currently supported. Error: %s", err)
}

data := datadogV2.NewWorkflowDataUpdate(*attributes, datadogV2.WORKFLOWDATATYPE_WORKFLOWS)
req := datadogV2.NewUpdateWorkflowRequest(*data)
Expand Down
Original file line number Diff line number Diff line change
@@ -1 +1 @@
2025-03-07T13:28:09.381727-05:00
2025-03-10T11:22:35.965536-04:00
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ interactions:
remote_addr: ""
request_uri: ""
body: |
{"data":{"attributes":{"description":"My description.","name":"tf-TestAccDatadogWorkflowAutomationResource-local-1741372089","published":false,"spec":{"steps":[],"triggers":[{"startStepNames":[],"workflowTrigger":{}}]},"tags":["foo:bar","service:foo","team:bar"],"webhookSecret":""},"type":"workflows"}}
{"data":{"attributes":{"description":"My description.","name":"tf-TestAccDatadogWorkflowAutomationResource-local-1741620155","published":false,"spec":{"steps":[],"triggers":[{"startStepNames":[],"workflowTrigger":{}}]},"tags":["foo:bar","service:foo","team:bar"],"webhookSecret":""},"type":"workflows"}}
form: {}
headers:
Accept:
Expand All @@ -30,13 +30,13 @@ interactions:
trailer: {}
content_length: 588
uncompressed: false
body: '{"data":{"id":"72757da6-45f0-4d4c-849a-e26da844467a","type":"workflows","attributes":{"createdAt":"2025-03-07T18:28:11.210815Z","description":"My description.","name":"tf-TestAccDatadogWorkflowAutomationResource-local-1741372089","published":false,"spec":{"triggers":[{"startStepNames":[],"workflowTrigger":{}}],"steps":[]},"tags":["foo:bar","service:foo","team:bar"],"updatedAt":"2025-03-07T18:28:11.210815Z"},"relationships":{"creator":{"data":{"id":"3ad549bf-eba0-11e9-a77a-0705486660d0","type":"users"}},"owner":{"data":{"id":"3ad549bf-eba0-11e9-a77a-0705486660d0","type":"users"}}}}}'
body: '{"data":{"id":"16d286b6-5b59-42df-a619-cbc46908cdd2","type":"workflows","attributes":{"createdAt":"2025-03-10T15:22:38.097932Z","description":"My description.","name":"tf-TestAccDatadogWorkflowAutomationResource-local-1741620155","published":false,"spec":{"triggers":[{"startStepNames":[],"workflowTrigger":{}}],"steps":[]},"tags":["foo:bar","service:foo","team:bar"],"updatedAt":"2025-03-10T15:22:38.097932Z"},"relationships":{"creator":{"data":{"id":"3ad549bf-eba0-11e9-a77a-0705486660d0","type":"users"}},"owner":{"data":{"id":"3ad549bf-eba0-11e9-a77a-0705486660d0","type":"users"}}}}}'
headers:
Content-Type:
- application/vnd.api+json
status: 201 Created
code: 201
duration: 143.206834ms
duration: 169.691125ms
- id: 1
request:
proto: HTTP/1.1
Expand All @@ -53,7 +53,7 @@ interactions:
headers:
Accept:
- application/json
url: https://api.datadoghq.com/api/v2/workflows/72757da6-45f0-4d4c-849a-e26da844467a
url: https://api.datadoghq.com/api/v2/workflows/16d286b6-5b59-42df-a619-cbc46908cdd2
method: GET
response:
proto: HTTP/1.1
Expand All @@ -63,13 +63,13 @@ interactions:
trailer: {}
content_length: 588
uncompressed: false
body: '{"data":{"id":"72757da6-45f0-4d4c-849a-e26da844467a","type":"workflows","attributes":{"createdAt":"2025-03-07T18:28:11.210815Z","description":"My description.","name":"tf-TestAccDatadogWorkflowAutomationResource-local-1741372089","published":false,"spec":{"triggers":[{"startStepNames":[],"workflowTrigger":{}}],"steps":[]},"tags":["foo:bar","service:foo","team:bar"],"updatedAt":"2025-03-07T18:28:11.210815Z"},"relationships":{"creator":{"data":{"id":"3ad549bf-eba0-11e9-a77a-0705486660d0","type":"users"}},"owner":{"data":{"id":"3ad549bf-eba0-11e9-a77a-0705486660d0","type":"users"}}}}}'
body: '{"data":{"id":"16d286b6-5b59-42df-a619-cbc46908cdd2","type":"workflows","attributes":{"createdAt":"2025-03-10T15:22:38.097932Z","description":"My description.","name":"tf-TestAccDatadogWorkflowAutomationResource-local-1741620155","published":false,"spec":{"triggers":[{"startStepNames":[],"workflowTrigger":{}}],"steps":[]},"tags":["foo:bar","service:foo","team:bar"],"updatedAt":"2025-03-10T15:22:38.097932Z"},"relationships":{"creator":{"data":{"id":"3ad549bf-eba0-11e9-a77a-0705486660d0","type":"users"}},"owner":{"data":{"id":"3ad549bf-eba0-11e9-a77a-0705486660d0","type":"users"}}}}}'
headers:
Content-Type:
- application/vnd.api+json
status: 200 OK
code: 200
duration: 73.099209ms
duration: 71.651042ms
- id: 2
request:
proto: HTTP/1.1
Expand All @@ -86,7 +86,7 @@ interactions:
headers:
Accept:
- application/json
url: https://api.datadoghq.com/api/v2/workflows/72757da6-45f0-4d4c-849a-e26da844467a
url: https://api.datadoghq.com/api/v2/workflows/16d286b6-5b59-42df-a619-cbc46908cdd2
method: GET
response:
proto: HTTP/1.1
Expand All @@ -96,13 +96,13 @@ interactions:
trailer: {}
content_length: 588
uncompressed: false
body: '{"data":{"id":"72757da6-45f0-4d4c-849a-e26da844467a","type":"workflows","attributes":{"createdAt":"2025-03-07T18:28:11.210815Z","description":"My description.","name":"tf-TestAccDatadogWorkflowAutomationResource-local-1741372089","published":false,"spec":{"triggers":[{"startStepNames":[],"workflowTrigger":{}}],"steps":[]},"tags":["foo:bar","service:foo","team:bar"],"updatedAt":"2025-03-07T18:28:11.210815Z"},"relationships":{"creator":{"data":{"id":"3ad549bf-eba0-11e9-a77a-0705486660d0","type":"users"}},"owner":{"data":{"id":"3ad549bf-eba0-11e9-a77a-0705486660d0","type":"users"}}}}}'
body: '{"data":{"id":"16d286b6-5b59-42df-a619-cbc46908cdd2","type":"workflows","attributes":{"createdAt":"2025-03-10T15:22:38.097932Z","description":"My description.","name":"tf-TestAccDatadogWorkflowAutomationResource-local-1741620155","published":false,"spec":{"triggers":[{"startStepNames":[],"workflowTrigger":{}}],"steps":[]},"tags":["foo:bar","service:foo","team:bar"],"updatedAt":"2025-03-10T15:22:38.097932Z"},"relationships":{"creator":{"data":{"id":"3ad549bf-eba0-11e9-a77a-0705486660d0","type":"users"}},"owner":{"data":{"id":"3ad549bf-eba0-11e9-a77a-0705486660d0","type":"users"}}}}}'
headers:
Content-Type:
- application/vnd.api+json
status: 200 OK
code: 200
duration: 89.422875ms
duration: 83.788417ms
- id: 3
request:
proto: HTTP/1.1
Expand All @@ -118,22 +118,24 @@ interactions:
form: {}
headers:
Accept:
- '*/*'
url: https://api.datadoghq.com/api/v2/workflows/72757da6-45f0-4d4c-849a-e26da844467a
method: DELETE
- application/json
url: https://api.datadoghq.com/api/v2/workflows/16d286b6-5b59-42df-a619-cbc46908cdd2
method: GET
response:
proto: HTTP/1.1
proto_major: 1
proto_minor: 1
transfer_encoding: []
trailer: {}
content_length: 0
content_length: 588
uncompressed: false
body: ""
headers: {}
status: 204 No Content
code: 204
duration: 92.692416ms
body: '{"data":{"id":"16d286b6-5b59-42df-a619-cbc46908cdd2","type":"workflows","attributes":{"createdAt":"2025-03-10T15:22:38.097932Z","description":"My description.","name":"tf-TestAccDatadogWorkflowAutomationResource-local-1741620155","published":false,"spec":{"triggers":[{"startStepNames":[],"workflowTrigger":{}}],"steps":[]},"tags":["foo:bar","service:foo","team:bar"],"updatedAt":"2025-03-10T15:22:38.097932Z"},"relationships":{"creator":{"data":{"id":"3ad549bf-eba0-11e9-a77a-0705486660d0","type":"users"}},"owner":{"data":{"id":"3ad549bf-eba0-11e9-a77a-0705486660d0","type":"users"}}}}}'
headers:
Content-Type:
- application/vnd.api+json
status: 200 OK
code: 200
duration: 87.282833ms
- id: 4
request:
proto: HTTP/1.1
Expand All @@ -149,21 +151,19 @@ interactions:
form: {}
headers:
Accept:
- application/json
url: https://api.datadoghq.com/api/v2/workflows/72757da6-45f0-4d4c-849a-e26da844467a
method: GET
- '*/*'
url: https://api.datadoghq.com/api/v2/workflows/16d286b6-5b59-42df-a619-cbc46908cdd2
method: DELETE
response:
proto: HTTP/1.1
proto_major: 1
proto_minor: 1
transfer_encoding: []
trailer: {}
content_length: 44
content_length: 0
uncompressed: false
body: '{"errors":[{"detail":"workflow not found"}]}'
headers:
Content-Type:
- application/vnd.api+json
status: 404 Not Found
code: 404
duration: 43.178792ms
body: ""
headers: {}
status: 204 No Content
code: 204
duration: 94.392208ms
2 changes: 0 additions & 2 deletions datadog/tests/data_source_datadog_workflow_automation_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,6 @@ import (
)

func TestAccDatadogWorkflowAutomationDatasource(t *testing.T) {
t.Parallel()

ctx, providers, accProviders := testAccFrameworkMuxProviders(context.Background(), t)

workflowName := uniqueEntityName(ctx, t)
Expand Down
29 changes: 27 additions & 2 deletions datadog/tests/resource_datadog_workflow_automation_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,12 +25,20 @@ var (
"workflowTrigger": {}
}
]
}`
testInvalidWorkflowSpec = `{
"foo": "bar",
"steps": [],
"triggers": [
{
"startStepNames": [],
"workflowTrigger": {}
}
]
}`
)

func TestAccDatadogWorkflowAutomationResource(t *testing.T) {
t.Parallel()

ctx, providers, accProviders := testAccFrameworkMuxProviders(context.Background(), t)

workflowName := uniqueEntityName(ctx, t)
Expand Down Expand Up @@ -62,6 +70,10 @@ func TestAccDatadogWorkflowAutomationResource(t *testing.T) {
resource.TestCheckResourceAttr(resourceName, "spec_json", testWorkflowEmptySpecNoWhitespace),
),
},
{
Config: testInvalidWorkflowAutomationResourceConfig(workflowName),
ExpectError: regexp.MustCompile("Error running apply"),
},
},
})
}
Expand All @@ -81,6 +93,19 @@ func testWorkflowAutomationResourceConfig(workflowName string) string {
}`, workflowName, testWorkflowDescription, testWorkflowTags, testWorkflowSpec)
}

func testInvalidWorkflowAutomationResourceConfig(workflowName string) string {
return fmt.Sprintf(`
resource "datadog_workflow_automation" "invalid_workflow" {
name = "%s"
description = "%s"
tags = %s
published = false
spec_json = jsonencode(
%s
)
}`, workflowName, testWorkflowDescription, testWorkflowTags, testInvalidWorkflowSpec)
}

func testAccCheckDatadogWorkflowExists(accProvider *fwprovider.FrameworkProvider, n string) resource.TestCheckFunc {
return func(s *terraform.State) error {
apiInstances := accProvider.DatadogApiInstances
Expand Down

0 comments on commit 5abe0a4

Please sign in to comment.