diff --git a/.changelog/534.txt b/.changelog/534.txt new file mode 100644 index 000000000..592eb77d2 --- /dev/null +++ b/.changelog/534.txt @@ -0,0 +1,3 @@ +```release-note:fix +resource/harness_platform_secret_file: Fixed Bug while creating this resource with tags separated by comma led to crashing. +``` diff --git a/internal/service/platform/secret/file.go b/internal/service/platform/secret/file.go index 29eabf658..11b45f34d 100644 --- a/internal/service/platform/secret/file.go +++ b/internal/service/platform/secret/file.go @@ -121,21 +121,34 @@ func buildSpec(d *schema.ResourceData) string { func buildTag(no_of_tags int, tags *schema.Set) string { result := "{" + tagMap := make(map[string]string) for i := 0; i < tags.Len(); i++ { tag := fmt.Sprintf("%v", tags.List()[i]) - split_tag := strings.Split(tag, ":") - key := split_tag[0] - value := split_tag[1] - if i == tags.Len()-1 { - result = result + fmt.Sprintf(`"%[1]s":"%[2]s"`, key, value) + if strings.Contains(tag, ":") { + splitTag := strings.Split(tag, ":") + key := splitTag[0] + value := splitTag[1] + tagMap[key] = value } else { - result = result + fmt.Sprintf(`"%[1]s":"%[2]s,",`, key, value) + tagMap[tag] = "" } } - result = result + "}" + + first := true + for key, value := range tagMap { + if !first { + result += "," + } else { + first = false + } + result += fmt.Sprintf(`"%s":"%s"`, key, value) + } + + result += "}" return result } + func readSecretFile(d *schema.ResourceData, secret *nextgen.Secret) error { d.Set("secret_manager_identifier", secret.File.SecretManagerIdentifier) d.SetId(secret.Identifier) diff --git a/internal/service/platform/secret/file_test.go b/internal/service/platform/secret/file_test.go index d3edf0881..9a576c2d7 100644 --- a/internal/service/platform/secret/file_test.go +++ b/internal/service/platform/secret/file_test.go @@ -56,6 +56,52 @@ func TestAccSecretFile(t *testing.T) { }) } +func TestAccSecretFileWMultipleTags(t *testing.T) { + + id := fmt.Sprintf("%s_%s", t.Name(), utils.RandStringBytes(5)) + name := id + updatedName := fmt.Sprintf("%s_updated", name) + resourceName := "harness_platform_secret_file.test" + + resource.UnitTest(t, resource.TestCase{ + PreCheck: func() { acctest.TestAccPreCheck(t) }, + ProviderFactories: acctest.ProviderFactories, + CheckDestroy: testAccSecretDestroy(resourceName), + Steps: []resource.TestStep{ + { + Config: testAccResourceSecret_fileMultipleTags(id, name), + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttr(resourceName, "id", id), + resource.TestCheckResourceAttr(resourceName, "identifier", id), + resource.TestCheckResourceAttr(resourceName, "name", name), + resource.TestCheckResourceAttr(resourceName, "description", "test"), + resource.TestCheckResourceAttr(resourceName, "tags.#", "4"), + resource.TestCheckResourceAttr(resourceName, "secret_manager_identifier", "harnessSecretManager"), + ), + }, + { + Config: testAccResourceSecret_fileMultipleTags(id, updatedName), + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttr(resourceName, "id", id), + resource.TestCheckResourceAttr(resourceName, "identifier", id), + resource.TestCheckResourceAttr(resourceName, "name", updatedName), + resource.TestCheckResourceAttr(resourceName, "description", "test"), + resource.TestCheckResourceAttr(resourceName, "tags.#", "4"), + resource.TestCheckResourceAttr(resourceName, "secret_manager_identifier", "harnessSecretManager"), + ), + }, + { + ResourceName: resourceName, + ImportState: true, + ImportStateVerify: true, + ImportStateVerifyIgnore: []string{ + "file_path", + }, + }, + }, + }) +} + func TestAccSecretFileOrgLevel(t *testing.T) { id := fmt.Sprintf("%s_%s", t.Name(), utils.RandStringBytes(5)) @@ -227,6 +273,19 @@ func testAccResourceSecret_file(id string, name string) string { `, id, name, getAbsFilePath("../../../acctest/secret_files/secret.txt")) } +func testAccResourceSecret_fileMultipleTags(id string, name string) string { + return fmt.Sprintf(` + resource "harness_platform_secret_file" "test" { + identifier = "%[1]s" + name = "%[2]s" + description = "test" + tags = ["foo:bar","connector","gcp:sm","tf"] + file_path = "%[3]s" + secret_manager_identifier = "harnessSecretManager" + } + `, id, name, getAbsFilePath("../../../acctest/secret_files/secret.txt")) +} + func getAbsFilePath(file_path string) string { absPath, _ := filepath.Abs(file_path) return absPath