diff --git a/instana/filterexpression/filter-expression-parser.go b/instana/filterexpression/filter-expression-parser.go index c51c197..48914e7 100644 --- a/instana/filterexpression/filter-expression-parser.go +++ b/instana/filterexpression/filter-expression-parser.go @@ -218,6 +218,16 @@ var ( ) ) +//Normalize parses the input and returns the normalized representation of the input string +func Normalize(input string) (string, error) { + parser := NewParser() + expr, err := parser.Parse(input) + if err != nil { + return input, err + } + return expr.Render(), nil +} + //NewParser creates a new instance of a Parser func NewParser() Parser { return new(parserImpl) diff --git a/instana/filterexpression/filter-expression-parser_test.go b/instana/filterexpression/filter-expression-parser_test.go index dfced97..d63bbf2 100644 --- a/instana/filterexpression/filter-expression-parser_test.go +++ b/instana/filterexpression/filter-expression-parser_test.go @@ -467,3 +467,20 @@ func TestShouldGetEntityOriginByInstanaAPIEntity(t *testing.T) { func TestShouldReturnEntityOriginDestinationAsFallbackValueWhenMatcherExpressionEntityIsNotValid(t *testing.T) { require.Equal(t, EntityOriginDestination, SupportedEntityOrigins.ForInstanaAPIEntity(restapi.MatcherExpressionEntity("invalid"))) } + +func TestShouldNormalizeExpression(t *testing.T) { + input := "entity.name NOT_EMPTY" + expectedResult := "entity.name@dest NOT_EMPTY" + + result, err := Normalize(input) + require.NoError(t, err) + require.Equal(t, expectedResult, result) +} + +func TestShouldFailToNormalizeExpressionWehnExpressionIsNotValied(t *testing.T) { + input := "entity.name bla bla bla" + + result, err := Normalize(input) + require.Error(t, err) + require.Equal(t, input, result) +} diff --git a/instana/resource-application-config.go b/instana/resource-application-config.go index 3dd5fa1..d39987b 100644 --- a/instana/resource-application-config.go +++ b/instana/resource-application-config.go @@ -2,6 +2,7 @@ package instana import ( "context" + "fmt" "log" "github.com/gessnerfl/terraform-provider-instana/instana/filterexpression" @@ -65,6 +66,28 @@ var ( Type: schema.TypeString, Required: true, Description: "The match specification of the application config", + DiffSuppressFunc: func(k, old, new string, d *schema.ResourceData) bool { + normalized, err := filterexpression.Normalize(new) + if err == nil { + return normalized == old + } + return old == new + }, + StateFunc: func(val interface{}) string { + normalized, err := filterexpression.Normalize(val.(string)) + if err == nil { + return normalized + } + return val.(string) + }, + ValidateFunc: func(val interface{}, key string) (warns []string, errs []error) { + v := val.(string) + if _, err := filterexpression.NewParser().Parse(v); err != nil { + errs = append(errs, fmt.Errorf("%q is not a valid match expression; %s", key, err)) + } + + return + }, } //ApplicationConfigNormalizedMatchSpecification schema for the application config field normalized_match_specification ApplicationConfigNormalizedMatchSpecification = &schema.Schema{ @@ -136,6 +159,7 @@ func (r *applicationConfigResource) UpdateState(d *schema.ResourceData, obj rest d.Set(ApplicationConfigFieldScope, string(applicationConfig.Scope)) d.Set(ApplicationConfigFieldBoundaryScope, string(applicationConfig.BoundaryScope)) d.Set(ApplicationConfigFieldNormalizedMatchSpecification, normalizedExpressionString) + d.Set(ApplicationConfigFieldMatchSpecification, normalizedExpressionString) d.SetId(applicationConfig.ID) return nil diff --git a/instana/resource-application-config_test.go b/instana/resource-application-config_test.go index 1382137..9946ddd 100644 --- a/instana/resource-application-config_test.go +++ b/instana/resource-application-config_test.go @@ -107,7 +107,7 @@ func createApplicationConfigResourceTestStep(httpPort int, iteration int) resour resource.TestCheckResourceAttr(testApplicationConfigDefinition, ApplicationConfigFieldFullLabel, formatResourceFullName(iteration)), resource.TestCheckResourceAttr(testApplicationConfigDefinition, ApplicationConfigFieldScope, string(restapi.ApplicationConfigScopeIncludeAllDownstream)), resource.TestCheckResourceAttr(testApplicationConfigDefinition, ApplicationConfigFieldBoundaryScope, string(restapi.BoundaryScopeAll)), - resource.TestCheckResourceAttr(testApplicationConfigDefinition, ApplicationConfigFieldMatchSpecification, defaultMatchSpecification), + resource.TestCheckResourceAttr(testApplicationConfigDefinition, ApplicationConfigFieldMatchSpecification, defaultMatchSpecificationNormalized), resource.TestCheckResourceAttr(testApplicationConfigDefinition, ApplicationConfigFieldNormalizedMatchSpecification, defaultMatchSpecificationNormalized), ), }