Skip to content

Commit

Permalink
Fix/value not a collection (#2836)
Browse files Browse the repository at this point in the history
* Revert "Revert "fix: value is not known (#2834)" (#2835)"

This reverts commit 81449fb.

* fix: handle panic on bad values when getting from provider
  • Loading branch information
tim775 committed Jan 15, 2024
1 parent 81449fb commit 1b9197c
Show file tree
Hide file tree
Showing 32 changed files with 3,544 additions and 109 deletions.
34 changes: 34 additions & 0 deletions cmd/infracost/breakdown_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import (
"os/exec"
"path"
"path/filepath"
"regexp"
"strings"
"testing"

Expand Down Expand Up @@ -85,6 +86,39 @@ func TestBreakdownFormatJsonWithTags(t *testing.T) {
)
}

func TestBreakdownFormatJsonWithTagsAliasedProvider(t *testing.T) {
testName := testutil.CalcGoldenFileTestdataDirName()
dir := path.Join("./testdata", testName)

runWithEnv := func(env map[string]string) func(t *testing.T) {
return func(t *testing.T) {
GoldenFileCommandTest(
t,
testName,
[]string{
"breakdown",
"--format", "json",
"--path", dir,
},
&GoldenFileOptions{
CaptureLogs: true,
IsJSON: true,
JSONInclude: regexp.MustCompile("^(defaultTags|tags|name)$"),
JSONExclude: regexp.MustCompile("^(costComponents|pastBreakdown)$"),
Env: env,
}, func(ctx *config.RunContext) {
ctx.Config.TagPoliciesEnabled = true
},
)
}
}

t.Run("with old hcl evaluator", runWithEnv(nil))
t.Run("with graph evaluator", runWithEnv(map[string]string{
"INFRACOST_GRAPH_EVALUATOR": "true",
}))
}

func TestBreakdownFormatJsonWithTagsAzure(t *testing.T) {
testName := testutil.CalcGoldenFileTestdataDirName()
dir := path.Join("./testdata", testName)
Expand Down
60 changes: 59 additions & 1 deletion cmd/infracost/cmd_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ import (
"strings"
"testing"

"github.com/tidwall/gjson"

main "github.com/infracost/infracost/cmd/infracost"
"github.com/infracost/infracost/internal/config"
"github.com/infracost/infracost/internal/testutil"
Expand All @@ -31,6 +33,8 @@ type GoldenFileOptions = struct {
Currency string
CaptureLogs bool
IsJSON bool
JSONInclude *regexp.Regexp
JSONExclude *regexp.Regexp
Env map[string]string
// RunTerraformCLI sets the cmd test to also run the cmd with --terraform-force-cli set
RunTerraformCLI bool
Expand Down Expand Up @@ -128,8 +132,18 @@ func GetCommandOutput(t *testing.T, args []string, testOptions *GoldenFileOption
}, &args)

if testOptions.IsJSON {
outBytes := outBuf.Bytes()
if testOptions.JSONInclude != nil {
filtered := filterJSON(gjson.ParseBytes(outBytes), testOptions.JSONInclude, testOptions.JSONExclude)
var err error
outBytes, err = json.Marshal(filtered)
if err != nil {
outBytes = outBuf.Bytes()
}
}

prettyBuf := bytes.NewBuffer([]byte{})
err := json.Indent(prettyBuf, outBuf.Bytes(), "", " ")
err := json.Indent(prettyBuf, outBytes, "", " ")
if err != nil {
actual = outBuf.Bytes()
} else {
Expand Down Expand Up @@ -158,6 +172,50 @@ func GetCommandOutput(t *testing.T, args []string, testOptions *GoldenFileOption
return stripDynamicValues(actual)
}

func filterJSON(r gjson.Result, include *regexp.Regexp, exclude *regexp.Regexp) map[string]interface{} {
values := make(map[string]interface{})
for k, v := range r.Map() {
if include.MatchString(k) {
values[k] = v.Value()
continue
}
if exclude.MatchString(k) {
continue
}

if v.IsObject() {
filteredV := filterJSON(v, include, exclude)
if len(filteredV) > 0 {
values[k] = filterJSON(v, include, exclude)
}
} else if v.IsArray() {
filteredV := filterJSONArray(v.Array(), include, exclude)
if len(filteredV) > 0 {
values[k] = filteredV
}
}
}
return values
}

func filterJSONArray(rArray []gjson.Result, include *regexp.Regexp, exclude *regexp.Regexp) []interface{} {
var values []interface{}
for _, el := range rArray {
if el.IsObject() {
filteredEl := filterJSON(el, include, exclude)
if len(filteredEl) > 0 {
values = append(values, filteredEl)
}
} else if el.IsArray() {
filteredEl := filterJSONArray(el.Array(), include, exclude)
if len(filteredEl) > 0 {
values = append(values, filteredEl)
}
}
}
return values
}

// stripDynamicValues strips out any values that change between test runs from the output,
// including timestamps and temp file paths
func stripDynamicValues(actual []byte) []byte {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,249 @@
{
"projects": [
{
"breakdown": {
"resources": [
{
"name": "aws_sqs_queue.sqs_withTags",
"tags": {
"DefaultNotOverride": "defaultnotoverride-aws",
"DefaultOverride": "sqs-def",
"ResourceTag": "sqs-hi"
}
},
{
"name": "aws_sqs_queue.sqs_withTags_provider",
"tags": {
"DefaultNotOverride": "defaultnotoverride-aws.env",
"DefaultOverride": "sqs-def",
"ResourceTag": "sqs-hi"
}
},
{
"name": "module.mymod_aliased.aws_sqs_queue.sqs_withTags_mymod_aliased",
"tags": {
"DefaultNotOverride": "defaultnotoverride-aws.env",
"DefaultOverride": "sqs-def",
"ResourceTag": "sqs-hi"
}
},
{
"name": "module.mymod_aliased.module.mysub_aliased.aws_sqs_queue.sqs_withTags_mysub_aliased",
"tags": {
"DefaultNotOverride": "defaultnotoverride-aws.env",
"DefaultOverride": "sqs-def",
"ResourceTag": "sqs-hi"
}
},
{
"name": "module.mymod_aliased.module.mysub_aliased.module.mysubsub_aliased.aws_sqs_queue.sqs_withTag_mysubsub_aliased",
"tags": {
"DefaultNotOverride": "defaultnotoverride-aws.env",
"DefaultOverride": "sqs-def",
"ResourceTag": "sqs-hi"
}
},
{
"name": "module.mymod_aliased.module.mysub_aliased.module.mysubsub_implict.aws_sqs_queue.sqs_withTag_mysubsub_implict",
"tags": {
"DefaultNotOverride": "defaultnotoverride-aws.env",
"DefaultOverride": "sqs-def",
"ResourceTag": "sqs-hi"
}
},
{
"name": "module.mymod_aliased.module.mysub_aliased.module.mysubsub_own.aws_sqs_queue.sqs_withTag_mysubsub_own",
"tags": {
"DefaultNotOverride": "defaultnotoverride-subsub-own-provider",
"DefaultOverride": "sqs-def",
"ResourceTag": "sqs-hi"
}
},
{
"name": "module.mymod_aliased.module.mysub_implicit.aws_sqs_queue.sqs_withTag_mysub_implicit",
"tags": {
"DefaultNotOverride": "defaultnotoverride-aws.env",
"DefaultOverride": "sqs-def",
"ResourceTag": "sqs-hi"
}
},
{
"name": "module.mymod_aliased.module.mysub_implicit.module.mysubsub_implict.aws_sqs_queue.sqs_withTag_mysubsub_implict",
"tags": {
"DefaultNotOverride": "defaultnotoverride-aws.env",
"DefaultOverride": "sqs-def",
"ResourceTag": "sqs-hi"
}
},
{
"name": "module.mymod_aliased.module.mysub_implicit.module.mysubsub_own.aws_sqs_queue.sqs_withTag_mysubsub_own",
"tags": {
"DefaultNotOverride": "defaultnotoverride-subsub-own-provider",
"DefaultOverride": "sqs-def",
"ResourceTag": "sqs-hi"
}
},
{
"name": "module.mymod_implicit.aws_sqs_queue.sqs_withTags_mymod_implicit",
"tags": {
"DefaultNotOverride": "defaultnotoverride-aws",
"DefaultOverride": "sqs-def",
"ResourceTag": "sqs-hi"
}
},
{
"name": "module.mymod_implicit.module.mysub_implicit.aws_sqs_queue.sqs_withTag_mysub_implicit",
"tags": {
"DefaultNotOverride": "defaultnotoverride-aws",
"DefaultOverride": "sqs-def",
"ResourceTag": "sqs-hi"
}
},
{
"name": "module.mymod_implicit.module.mysub_implicit.module.mysubsub_implict.aws_sqs_queue.sqs_withTag_mysubsub_implict",
"tags": {
"DefaultNotOverride": "defaultnotoverride-aws",
"DefaultOverride": "sqs-def",
"ResourceTag": "sqs-hi"
}
},
{
"name": "module.mymod_implicit.module.mysub_implicit.module.mysubsub_own.aws_sqs_queue.sqs_withTag_mysubsub_own",
"tags": {
"DefaultNotOverride": "defaultnotoverride-subsub-own-provider",
"DefaultOverride": "sqs-def",
"ResourceTag": "sqs-hi"
}
},
{
"name": "module.mymod_own.aws_sqs_queue.sqs_withTags_mymod_own",
"tags": {
"DefaultNotOverride": "defaultnotoverride-own-provider",
"DefaultOverride": "sqs-def",
"ResourceTag": "sqs-hi"
}
},
{
"name": "module.mymod_own.module.mysub_aliased.aws_sqs_queue.sqs_withTags_mysub_aliased",
"tags": {
"DefaultNotOverride": "defaultnotoverride-own-provider",
"DefaultOverride": "sqs-def",
"ResourceTag": "sqs-hi"
}
},
{
"name": "module.mymod_own.module.mysub_aliased.module.mysubsub_aliased.aws_sqs_queue.sqs_withTag_mysubsub_aliased",
"tags": {
"DefaultNotOverride": "defaultnotoverride-own-provider",
"DefaultOverride": "sqs-def",
"ResourceTag": "sqs-hi"
}
},
{
"name": "module.mymod_own.module.mysub_aliased.module.mysubsub_implict.aws_sqs_queue.sqs_withTag_mysubsub_implict",
"tags": {
"DefaultNotOverride": "defaultnotoverride-own-provider",
"DefaultOverride": "sqs-def",
"ResourceTag": "sqs-hi"
}
},
{
"name": "module.mymod_own.module.mysub_aliased.module.mysubsub_own.aws_sqs_queue.sqs_withTag_mysubsub_own",
"tags": {
"DefaultNotOverride": "defaultnotoverride-subsub-own-provider",
"DefaultOverride": "sqs-def",
"ResourceTag": "sqs-hi"
}
},
{
"name": "module.mymod_own.module.mysub_implicit.aws_sqs_queue.sqs_withTag_mysub_implicit",
"tags": {
"DefaultNotOverride": "defaultnotoverride-aws",
"DefaultOverride": "sqs-def",
"ResourceTag": "sqs-hi"
}
},
{
"name": "module.mymod_own.module.mysub_implicit.module.mysubsub_implict.aws_sqs_queue.sqs_withTag_mysubsub_implict",
"tags": {
"DefaultNotOverride": "defaultnotoverride-aws",
"DefaultOverride": "sqs-def",
"ResourceTag": "sqs-hi"
}
},
{
"name": "module.mymod_own.module.mysub_implicit.module.mysubsub_own.aws_sqs_queue.sqs_withTag_mysubsub_own",
"tags": {
"DefaultNotOverride": "defaultnotoverride-subsub-own-provider",
"DefaultOverride": "sqs-def",
"ResourceTag": "sqs-hi"
}
}
]
},
"metadata": {
"providers": [
{
"defaultTags": {
"DefaultNotOverride": "defaultnotoverride-aws",
"DefaultOverride": "defaultoverride-aws"
},
"name": "aws"
},
{
"defaultTags": {
"DefaultNotOverride": "defaultnotoverride-aws.env",
"DefaultOverride": "defaultoverride-aws.env"
},
"name": "aws.env"
},
{
"defaultTags": {
"DefaultNotOverride": "defaultnotoverride-subsub-own-provider",
"DefaultOverride": "defaultoverride-subsub-own-provider"
},
"name": "aws"
},
{
"defaultTags": {
"DefaultNotOverride": "defaultnotoverride-subsub-own-provider",
"DefaultOverride": "defaultoverride-subsub-own-provider"
},
"name": "aws"
},
{
"defaultTags": {
"DefaultNotOverride": "defaultnotoverride-subsub-own-provider",
"DefaultOverride": "defaultoverride-subsub-own-provider"
},
"name": "aws"
},
{
"defaultTags": {
"DefaultNotOverride": "defaultnotoverride-subsub-own-provider",
"DefaultOverride": "defaultoverride-subsub-own-provider"
},
"name": "aws"
},
{
"defaultTags": {
"DefaultNotOverride": "defaultnotoverride-subsub-own-provider",
"DefaultOverride": "defaultoverride-subsub-own-provider"
},
"name": "aws"
},
{
"defaultTags": {
"DefaultNotOverride": "defaultnotoverride-own-provider",
"DefaultOverride": "defaultoverride-own-provider"
},
"name": "aws"
}
]
},
"name": "infracost/infracost/cmd/infracost/testdata/breakdown_format_json_with_tags_aliased_provider"
}
]
}
Err:

0 comments on commit 1b9197c

Please sign in to comment.