Skip to content

Commit bf41187

Browse files
akshat-goyal-harnessHarness
authored andcommitted
feat: [PL-66266]: Adding kmsKeyId support for AWS SM secrets (#1316)
* bcde9e Merge remote-tracking branch 'origin/PL-66266' into PL-66266 * 7f80d8 #uts * e11544 #fix * ab60a4 #exampleFix * 499aa1 #additionalMetaData * 25360f #uts * 8f6a8c #fix * 7a6b38 Merge remote-tracking branch 'origin/PL-66266' into PL-66266 * 729c22 #exampleFix * ad6716 #kms_key_id_support * e89252 #awsSecretManagerChanges * a70681 #exampleFix * 3e1fa6 #kms_key_id_support * 296cf7 feat: [CDS-115898]: add winrm secret in terraform (#1311) * 5dea6c fix: [CDS-115721]: Fix appset test (#1313) * 534e61 #awsSecretManagerChanges
1 parent 32c6d11 commit bf41187

File tree

7 files changed

+197
-26
lines changed

7 files changed

+197
-26
lines changed

examples/resources/harness_platform_secret_text/resource.tf

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,4 +35,21 @@ resource "harness_platform_secret_text" "gcp_secret_manager_reference" {
3535
version = "1"
3636
}
3737
}
38+
}
39+
40+
resource "harness_platform_secret_text" "aws_secret_manager" {
41+
identifier = "identifier"
42+
name = "name"
43+
description = "example"
44+
tags = ["foo:bar"]
45+
46+
secret_manager_identifier = "awsSecretManager"
47+
value_type = "Inline"
48+
value = "secret"
49+
50+
additional_metadata {
51+
values {
52+
kms_key_id = "kmsKeyId"
53+
}
54+
}
3855
}

internal/service/platform/secret/file.go

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,11 @@ func ResourceSecretFile() *schema.Resource {
3434
Type: schema.TypeString,
3535
Required: true,
3636
},
37+
"kms_key_id": {
38+
Description: "Kms Key Id for encrypting the secret value",
39+
Type: schema.TypeString,
40+
Optional: true,
41+
},
3742
},
3843
}
3944
helpers.SetMultiLevelResourceSchema(resource.Schema)
@@ -114,7 +119,12 @@ func buildSpec(d *schema.ResourceData) string {
114119
spec = spec + fmt.Sprintf(`,"tags":%[1]s`, tags_string)
115120
}
116121
if attr, ok := d.GetOk("secret_manager_identifier"); ok {
117-
spec = spec + fmt.Sprintf(`,"spec":{"secretManagerIdentifier":"%[1]s"}`, attr.(string))
122+
spec = spec + fmt.Sprintf(`,"spec":{"secretManagerIdentifier":"%[1]s"`, attr.(string))
123+
}
124+
if attr, ok := d.GetOk("kms_key_id"); ok {
125+
spec = spec + fmt.Sprintf(`,"additionalMetadata":{"values":{"kmsKeyId":"%[1]s"}}}`, attr.(string))
126+
} else {
127+
spec = spec + fmt.Sprintf(`}`)
118128
}
119129
return spec + "}}"
120130
}
@@ -160,5 +170,6 @@ func readSecretFile(d *schema.ResourceData, secret *nextgen.Secret) error {
160170
d.Set("org_id", secret.OrgIdentifier)
161171
d.Set("project_id", secret.ProjectIdentifier)
162172
d.Set("tags", helpers.FlattenTags(secret.Tags))
173+
163174
return nil
164175
}

internal/service/platform/secret/file_data_source.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,11 @@ func DataSourceSecretFile() *schema.Resource {
2121
Type: schema.TypeString,
2222
Computed: true,
2323
},
24+
"kms_key_id": {
25+
Description: "Kms Key Id for encrypting the secret value",
26+
Type: schema.TypeString,
27+
Optional: true,
28+
},
2429
},
2530
}
2631

internal/service/platform/secret/file_test.go

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -290,3 +290,65 @@ func getAbsFilePath(file_path string) string {
290290
absPath, _ := filepath.Abs(file_path)
291291
return absPath
292292
}
293+
294+
func TestAccResourceSecretFile_AWS_SM_reference(t *testing.T) {
295+
id := fmt.Sprintf("%s_%s", t.Name(), utils.RandStringBytes(5))
296+
name := id
297+
updatedName := fmt.Sprintf("%s_updated", name)
298+
resourceName := "harness_platform_secret_file.test"
299+
300+
resource.UnitTest(t, resource.TestCase{
301+
PreCheck: func() { acctest.TestAccPreCheck(t) },
302+
ProviderFactories: acctest.ProviderFactories,
303+
CheckDestroy: testAccSecretDestroy(resourceName),
304+
Steps: []resource.TestStep{
305+
{
306+
Config: testAccResourceSecret_file_AWS_SM(id, name),
307+
Check: resource.ComposeTestCheckFunc(
308+
resource.TestCheckResourceAttr(resourceName, "id", id),
309+
resource.TestCheckResourceAttr(resourceName, "identifier", id),
310+
resource.TestCheckResourceAttr(resourceName, "name", name),
311+
resource.TestCheckResourceAttr(resourceName, "description", "test"),
312+
resource.TestCheckResourceAttr(resourceName, "tags.#", "1"),
313+
resource.TestCheckResourceAttr(resourceName, "secret_manager_identifier", "harnessSecretManager"),
314+
resource.TestCheckResourceAttr(resourceName, "kms_key_id", "awsKMSKeyId"),
315+
),
316+
},
317+
{
318+
Config: testAccResourceSecret_file_AWS_SM(id, updatedName),
319+
Check: resource.ComposeTestCheckFunc(
320+
resource.TestCheckResourceAttr(resourceName, "id", id),
321+
resource.TestCheckResourceAttr(resourceName, "identifier", id),
322+
resource.TestCheckResourceAttr(resourceName, "name", updatedName),
323+
resource.TestCheckResourceAttr(resourceName, "description", "test"),
324+
resource.TestCheckResourceAttr(resourceName, "tags.#", "1"),
325+
resource.TestCheckResourceAttr(resourceName, "secret_manager_identifier", "harnessSecretManager"),
326+
resource.TestCheckResourceAttr(resourceName, "kms_key_id", "awsKMSKeyId"),
327+
),
328+
},
329+
{
330+
ResourceName: resourceName,
331+
ImportState: true,
332+
ImportStateVerify: true,
333+
ImportStateVerifyIgnore: []string{
334+
"file_path",
335+
"kms_key_id",
336+
},
337+
},
338+
},
339+
})
340+
}
341+
342+
func testAccResourceSecret_file_AWS_SM(id string, name string) string {
343+
return fmt.Sprintf(`
344+
resource "harness_platform_secret_file" "test" {
345+
identifier = "%[1]s"
346+
name = "%[2]s"
347+
description = "test"
348+
tags = ["foo:bar"]
349+
file_path = "%[3]s"
350+
secret_manager_identifier = "harnessSecretManager"
351+
kms_key_id = "awsKMSKeyId"
352+
}
353+
`, id, name, getAbsFilePath("../../../acctest/secret_files/secret.txt"))
354+
}

internal/service/platform/secret/text.go

Lines changed: 26 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,10 @@ func ResourceSecretText() *schema.Resource {
5353
Type: schema.TypeString,
5454
Optional: true,
5555
},
56+
"kms_key_id": {
57+
Type: schema.TypeString,
58+
Optional: true,
59+
},
5660
// Add other fields for the inner map as needed
5761
},
5862
},
@@ -153,6 +157,9 @@ func readAdditionalMetadata(metadata interface{}) nextgen.AdditionalMetadata {
153157
if version, ok := valueMap["version"].(string); ok {
154158
result.Values["version"] = version
155159
}
160+
if kmsKeyId, ok := valueMap["kms_key_id"].(string); ok {
161+
result.Values["kmsKeyId"] = kmsKeyId
162+
}
156163
// Add other fields as needed
157164
}
158165
}
@@ -161,37 +168,31 @@ func readAdditionalMetadata(metadata interface{}) nextgen.AdditionalMetadata {
161168
return result
162169
}
163170

164-
func importAdditionalMetadata(data map[string]string) []map[string]interface{} {
165-
var result []map[string]interface{}
166-
167-
for _, value := range data {
168-
entry := map[string]interface{}{
169-
"version": value,
170-
// Add other fields for the inner map as needed
171-
}
172-
173-
result = append(result, entry)
174-
}
175-
176-
return result
177-
}
178-
179171
func importAdditionalMetadata_2(additionalMetadata *nextgen.AdditionalMetadata) []interface{} {
180172
response := make([]interface{}, 0)
181173
data := map[string]interface{}{}
182174
if additionalMetadata != nil && len(additionalMetadata.Values) > 0 {
183-
var valuesList []interface{}
184-
185-
for _, value := range additionalMetadata.Values {
186-
entry := map[string]string{
187-
"version": value,
188-
// Add other fields for the inner map as needed
175+
entry := make(map[string]interface{})
176+
for k, v := range additionalMetadata.Values {
177+
switch k {
178+
case "version":
179+
entry["version"] = v
180+
case "kmsKeyId":
181+
entry["kms_key_id"] = v
189182
}
190-
191-
valuesList = append(valuesList, entry)
192183
}
193-
194-
data["values"] = valuesList
184+
data["values"] = schema.NewSet(schema.HashResource(&schema.Resource{
185+
Schema: map[string]*schema.Schema{
186+
"version": {
187+
Type: schema.TypeString,
188+
Optional: true,
189+
},
190+
"kms_key_id": {
191+
Type: schema.TypeString,
192+
Optional: true,
193+
},
194+
},
195+
}), []interface{}{entry})
195196
}
196197
return append(response, data)
197198
}

internal/service/platform/secret/text_data_source.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,10 @@ func DataSourceSecretText() *schema.Resource {
4242
Type: schema.TypeString,
4343
Optional: true,
4444
},
45+
"kms_key_id": {
46+
Type: schema.TypeString,
47+
Optional: true,
48+
},
4549
// Add other fields for the inner map as needed
4650
},
4751
},

internal/service/platform/secret/text_test.go

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -350,6 +350,25 @@ func testAccResourceSecret_text_inline(id string, name string, secretValue strin
350350
`, id, name, secretValue)
351351
}
352352

353+
func testAccResourceSecret_text_inline_AWS_SM(id string, name string, secretValue, secretManagerIdentifier string) string {
354+
return fmt.Sprintf(`
355+
resource "harness_platform_secret_text" "test" {
356+
identifier = "%[1]s"
357+
name = "%[2]s"
358+
description = "test"
359+
tags = ["foo:bar"]
360+
secret_manager_identifier = "%[4]s"
361+
value_type = "Inline"
362+
value = "%[3]s"
363+
additional_metadata {
364+
values {
365+
kms_key_id = "awsKMSKeyId"
366+
}
367+
}
368+
}
369+
`, id, name, secretValue, secretManagerIdentifier)
370+
}
371+
353372
func testAccResourceSecret_text_reference(id string, name string, secretValue string, secretManagerIdentifier string) string {
354373
return fmt.Sprintf(`
355374
resource "harness_platform_secret_text" "test" {
@@ -529,3 +548,55 @@ func TestAccResourceSecretText_GCP_SM_reference(t *testing.T) {
529548
},
530549
})
531550
}
551+
552+
func TestAccResourceSecretText_AWS_SM_reference(t *testing.T) {
553+
id := fmt.Sprintf("%s_%s", t.Name(), utils.RandStringBytes(5))
554+
name := id
555+
updatedName := fmt.Sprintf("%s_updated", name)
556+
secretValue := fmt.Sprintf("%s_%s", t.Name(), utils.RandStringBytes(5))
557+
updatedValue := secretValue + "updated"
558+
resourceName := "harness_platform_secret_text.test"
559+
560+
resource.UnitTest(t, resource.TestCase{
561+
PreCheck: func() { acctest.TestAccPreCheck(t) },
562+
ProviderFactories: acctest.ProviderFactories,
563+
CheckDestroy: testAccSecretDestroy(resourceName),
564+
Steps: []resource.TestStep{
565+
{
566+
Config: testAccResourceSecret_text_inline_AWS_SM(id, name, secretValue, "harnessSecretManager"),
567+
Check: resource.ComposeTestCheckFunc(
568+
resource.TestCheckResourceAttr(resourceName, "id", id),
569+
resource.TestCheckResourceAttr(resourceName, "identifier", id),
570+
resource.TestCheckResourceAttr(resourceName, "name", name),
571+
resource.TestCheckResourceAttr(resourceName, "description", "test"),
572+
resource.TestCheckResourceAttr(resourceName, "tags.#", "1"),
573+
resource.TestCheckResourceAttr(resourceName, "secret_manager_identifier", "harnessSecretManager"),
574+
resource.TestCheckResourceAttr(resourceName, "value_type", "Inline"),
575+
resource.TestCheckResourceAttr(resourceName, "value", secretValue),
576+
resource.TestCheckResourceAttr(resourceName, "additional_metadata.0.values.0.kms_key_id", "awsKMSKeyId"),
577+
),
578+
},
579+
{
580+
Config: testAccResourceSecret_text_inline_AWS_SM(id, updatedName, updatedValue, "harnessSecretManager"),
581+
Check: resource.ComposeTestCheckFunc(
582+
resource.TestCheckResourceAttr(resourceName, "id", id),
583+
resource.TestCheckResourceAttr(resourceName, "identifier", id),
584+
resource.TestCheckResourceAttr(resourceName, "name", updatedName),
585+
resource.TestCheckResourceAttr(resourceName, "description", "test"),
586+
resource.TestCheckResourceAttr(resourceName, "tags.#", "1"),
587+
resource.TestCheckResourceAttr(resourceName, "secret_manager_identifier", "harnessSecretManager"),
588+
resource.TestCheckResourceAttr(resourceName, "value_type", "Inline"),
589+
resource.TestCheckResourceAttr(resourceName, "value", updatedValue),
590+
resource.TestCheckResourceAttr(resourceName, "additional_metadata.0.values.0.kms_key_id", "awsKMSKeyId"),
591+
),
592+
},
593+
{
594+
ResourceName: resourceName,
595+
ImportState: true,
596+
ImportStateVerify: true,
597+
ImportStateIdFunc: acctest.AccountLevelResourceImportStateIdFunc(resourceName),
598+
ImportStateVerifyIgnore: []string{"value"},
599+
},
600+
},
601+
})
602+
}

0 commit comments

Comments
 (0)