From 283d7382dc9e7dd0f9b83b7c88966ccefecc7a26 Mon Sep 17 00:00:00 2001 From: ChanochShayner <57212002+ChanochShayner@users.noreply.github.com> Date: Wed, 12 Jul 2023 13:30:50 +0300 Subject: [PATCH 1/2] Handle correctly parse existing tags with comments (#406) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Handle correctly parse existing tags with comments * Update src/terraform/structure/terraform_parser.go Co-authored-by: Anton Grübel --------- Co-authored-by: Anton Grübel --- src/terraform/structure/terraform_parser.go | 8 ++++-- .../structure/terraform_parser_test.go | 26 +++++++++++++++++++ .../terraform/tags_with_comments/expected.txt | 14 ++++++++++ tests/terraform/tags_with_comments/main.tf | 13 ++++++++++ 4 files changed, 59 insertions(+), 2 deletions(-) create mode 100644 tests/terraform/tags_with_comments/expected.txt create mode 100644 tests/terraform/tags_with_comments/main.tf diff --git a/src/terraform/structure/terraform_parser.go b/src/terraform/structure/terraform_parser.go index 2d86c42b..e5f18dde 100644 --- a/src/terraform/structure/terraform_parser.go +++ b/src/terraform/structure/terraform_parser.go @@ -725,7 +725,7 @@ func (p *TerraformParser) getHclMapsContents(tokens hclwrite.Tokens) []hclwrite. func (p *TerraformParser) extractTagPairs(tokens hclwrite.Tokens) []hclwrite.Tokens { // The function gets tokens and returns an array of tokens that represent key and value // example: tokens: "a=1\n b=2, c=3", returns: ["a=1", "b=2", "c=3"] - separatorTokens := []hclsyntax.TokenType{hclsyntax.TokenComma, hclsyntax.TokenNewline} + separatorTokens := []hclsyntax.TokenType{hclsyntax.TokenComma, hclsyntax.TokenNewline, hclsyntax.TokenComment} bracketsCounters := map[hclsyntax.TokenType]int{ hclsyntax.TokenOParen: 0, @@ -746,7 +746,11 @@ func (p *TerraformParser) extractTagPairs(tokens hclwrite.Tokens) []hclwrite.Tok for i, token := range tokens { if utils.InSlice(separatorTokens, token.Type) && getUncloseBracketsCount(bracketsCounters) == 0 { if hasEq { - tagPairs = append(tagPairs, tokens[startIndex:i]) + endIndex := i + if token.Type == hclsyntax.TokenComment { + endIndex = i + 1 + } + tagPairs = append(tagPairs, tokens[startIndex:endIndex]) } startIndex = i + 1 hasEq = false diff --git a/src/terraform/structure/terraform_parser_test.go b/src/terraform/structure/terraform_parser_test.go index 3d5bae6e..4e054592 100644 --- a/src/terraform/structure/terraform_parser_test.go +++ b/src/terraform/structure/terraform_parser_test.go @@ -377,6 +377,32 @@ func TestTerraformParser_Module(t *testing.T) { assert.Equal(t, string(resultStr), string(expectedStr)) }) + t.Run("Test parsing of existing tags with comments", func(t *testing.T) { + p := &TerraformParser{} + p.Init("../../../tests/terraform/data", nil) + defer p.Close() + sourceFilePath := "../../../tests/terraform/tags_with_comments/main.tf" + expectedFileName := "../../../tests/terraform/tags_with_comments/expected.txt" + blocks, err := p.ParseFile(sourceFilePath) + if err != nil { + t.Fail() + } + + mb := blocks[0] + mb.AddNewTags([]tags.ITag{ + &tags.Tag{Key: "mock_tag_2", Value: "mock_value"}, + }) + + resultFileName := "result.txt" + defer func() { + _ = os.Remove(resultFileName) + }() + _ = p.WriteFile(sourceFilePath, blocks, resultFileName) + resultStr, _ := os.ReadFile(resultFileName) + expectedStr, _ := os.ReadFile(expectedFileName) + assert.Equal(t, string(resultStr), string(expectedStr)) + }) + t.Run("Test parsing of unsupported resources", func(t *testing.T) { p := &TerraformParser{} p.Init("../../../tests/terraform/supported", nil) diff --git a/tests/terraform/tags_with_comments/expected.txt b/tests/terraform/tags_with_comments/expected.txt new file mode 100644 index 00000000..d6055726 --- /dev/null +++ b/tests/terraform/tags_with_comments/expected.txt @@ -0,0 +1,14 @@ +data "aws_s3_bucket" "primary" { + count = var.create_bucket == true ? 0 : 1 + bucket = "externally-created-bucket" +} + +resource "aws_s3_bucket" "primary" { + count = var.create_bucket == true ? 1 : 0 + bucket = "yor-bug-test-bucket" + tags = { + mock_tag = "mock_value" # This is for test + yor_trace = "some-uuid" + mock_tag_2 = "mock_value" + } +} \ No newline at end of file diff --git a/tests/terraform/tags_with_comments/main.tf b/tests/terraform/tags_with_comments/main.tf new file mode 100644 index 00000000..dba542cd --- /dev/null +++ b/tests/terraform/tags_with_comments/main.tf @@ -0,0 +1,13 @@ +data "aws_s3_bucket" "primary" { + count = var.create_bucket == true ? 0 : 1 + bucket = "externally-created-bucket" +} + +resource "aws_s3_bucket" "primary" { + count = var.create_bucket == true ? 1 : 0 + bucket = "yor-bug-test-bucket" + tags = { + mock_tag = "mock_value" # This is for test + yor_trace = "some-uuid" + } +} \ No newline at end of file From 0838f8519866f6efafd6b045b3f252f69b560e21 Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Wed, 12 Jul 2023 10:36:00 +0000 Subject: [PATCH 2/2] chore: Updated coverage badge. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8cf39483..3779ea45 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -![Coverage](https://img.shields.io/badge/Coverage-81.8%25-brightgreen) +![Coverage](https://img.shields.io/badge/Coverage-81.4%25-brightgreen) [![Maintained by Bridgecrew.io](https://img.shields.io/badge/maintained%20by-bridgecrew.io-blueviolet)](https://bridgecrew.io/?utm_source=github&utm_medium=organic_oss&utm_campaign=yor) ![golangci-lint](https://github.com/bridgecrewio/yor/workflows/tests/badge.svg) [![security](https://github.com/bridgecrewio/yor/actions/workflows/security.yml/badge.svg)](https://github.com/bridgecrewio/yor/actions/workflows/security.yml)