Skip to content

Commit

Permalink
add duplicate variable validation for notification recipient
Browse files Browse the repository at this point in the history
  • Loading branch information
brookesargent committed Jan 6, 2025
1 parent 18b7397 commit d4ece22
Show file tree
Hide file tree
Showing 2 changed files with 55 additions and 0 deletions.
52 changes: 52 additions & 0 deletions internal/helper/validation/valid_notification_variables.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package validation

import (
"context"

"github.com/hashicorp/terraform-plugin-framework/path"
"github.com/hashicorp/terraform-plugin-framework/schema/validator"

"github.com/honeycombio/terraform-provider-honeycombio/internal/models"
)

var _ validator.Set = notificationVariablesValidator{}

type notificationVariablesValidator struct {
schemes []string

Check failure on line 15 in internal/helper/validation/valid_notification_variables.go

View workflow job for this annotation

GitHub Actions / Build

field `schemes` is unused (unused)
}

func (v notificationVariablesValidator) Description(_ context.Context) string {
return "value must be a valid set of webhook variables"
}

func (v notificationVariablesValidator) MarkdownDescription(ctx context.Context) string {
return v.Description(ctx)
}

func (v notificationVariablesValidator) ValidateSet(ctx context.Context, request validator.SetRequest, response *validator.SetResponse) {
if request.ConfigValue.IsNull() || request.ConfigValue.IsUnknown() {
return
}

// variable names cannot be duplicated
var variables []models.NotificationVariableModel
response.Diagnostics.Append(request.ConfigValue.ElementsAs(ctx, &variables, false)...)

duplicateMap := make(map[string]bool)
for i, v := range variables {
name := v.Name.ValueString()
if duplicateMap[name] {
response.Diagnostics.AddAttributeError(
path.Root("variable").AtListIndex(i).AtName("name"),
"Conflicting configuration arguments",
"cannot have more than one \"variable\" with the same \"name\"",
)
}
duplicateMap[name] = true
}
}

// ValidQuerySpec determines if the provided JSON is a valid Honeycomb Query Specification
func ValidNotificationVariables() validator.Set {
return notificationVariablesValidator{}
}
3 changes: 3 additions & 0 deletions internal/provider/notification_recipients.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ import (
"github.com/hashicorp/terraform-plugin-framework/types"
"github.com/hashicorp/terraform-plugin-framework/types/basetypes"

"github.com/honeycombio/terraform-provider-honeycombio/internal/helper/validation"

"github.com/honeycombio/terraform-provider-honeycombio/client"
"github.com/honeycombio/terraform-provider-honeycombio/internal/helper"
"github.com/honeycombio/terraform-provider-honeycombio/internal/helper/modifiers"
Expand Down Expand Up @@ -90,6 +92,7 @@ func notificationRecipientSchema(allowedTypes []client.RecipientType) schema.Set
Description: "The variables to set with the webhook notification.",
Validators: []validator.Set{
setvalidator.SizeAtMost(10),
validation.ValidNotificationVariables(),
},
NestedObject: schema.NestedBlockObject{
Attributes: map[string]schema.Attribute{
Expand Down

0 comments on commit d4ece22

Please sign in to comment.