Skip to content

Commit 5edde43

Browse files
committed
add data source tencentcloud_ssm_secrets and tencentcloud_ssm_secret_versions
1 parent 3be752b commit 5edde43

File tree

5 files changed

+404
-4
lines changed

5 files changed

+404
-4
lines changed
Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
package tencentcloud
2+
3+
import (
4+
"context"
5+
"log"
6+
"strings"
7+
8+
"github.com/hashicorp/terraform-plugin-sdk/helper/resource"
9+
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
10+
"github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
11+
)
12+
13+
func dataSourceTencentCloudSsmSecretVersions() *schema.Resource {
14+
return &schema.Resource{
15+
Read: dataSourceTencentCloudSsmSecretVersionsRead,
16+
Schema: map[string]*schema.Schema{
17+
"secret_name": {
18+
Type: schema.TypeString,
19+
Required: true,
20+
Description: "Secret name used to filter result.",
21+
},
22+
"version_id": {
23+
Type: schema.TypeString,
24+
Optional: true,
25+
Description: "VersionId used to filter result.",
26+
},
27+
"result_output_file": {
28+
Type: schema.TypeString,
29+
Optional: true,
30+
Description: "Used to save results.",
31+
},
32+
"secret_version_list": {
33+
Type: schema.TypeList,
34+
Computed: true,
35+
Description: "A list of SSM secret versions.",
36+
Elem: &schema.Resource{
37+
Schema: map[string]*schema.Schema{
38+
"version_id": {
39+
Type: schema.TypeString,
40+
Computed: true,
41+
Description: "Version of secret.",
42+
},
43+
"secret_binary": {
44+
Type: schema.TypeString,
45+
Computed: true,
46+
Description: "The base64-encoded binary secret.",
47+
},
48+
"secret_string": {
49+
Type: schema.TypeString,
50+
Computed: true,
51+
Description: "The string text of secret.",
52+
},
53+
},
54+
},
55+
},
56+
},
57+
}
58+
}
59+
60+
func dataSourceTencentCloudSsmSecretVersionsRead(d *schema.ResourceData, meta interface{}) error {
61+
defer logElapsed("data_source.tencentcloud_ssm_secret_versions.read")()
62+
63+
logId := getLogId(contextNil)
64+
ctx := context.WithValue(context.TODO(), logIdKey, logId)
65+
ssmService := SsmService{
66+
client: meta.(*TencentCloudClient).apiV3Conn,
67+
}
68+
69+
secretName := d.Get("secret_name").(string)
70+
var outErr, inErr error
71+
var secretInfo *SecretInfo
72+
outErr = resource.Retry(readRetryTimeout, func() *resource.RetryError {
73+
secretInfo, inErr = ssmService.DescribeSecretByName(ctx, secretName)
74+
if inErr != nil {
75+
return retryError(inErr)
76+
}
77+
return nil
78+
})
79+
if outErr != nil {
80+
log.Printf("[CRITAL]%s read SSM secret failed, reason:%+v", logId, outErr)
81+
return outErr
82+
}
83+
if secretInfo.status != SSM_STATUS_ENABLED {
84+
log.Printf("[CRITAL]%s read SSM secret version failed, reason: secret status is not Enabled", logId)
85+
return nil
86+
}
87+
var secretVersionInfos []*SecretVersionInfo
88+
var versionIds []string
89+
if v, ok := d.GetOk("version_id"); ok {
90+
versionIds = append(versionIds, v.(string))
91+
} else {
92+
outErr = resource.Retry(readRetryTimeout, func() *resource.RetryError {
93+
versionIds, inErr = ssmService.DescribeSecretVersionIdsByName(ctx, secretName)
94+
if inErr != nil {
95+
return retryError(inErr)
96+
}
97+
return nil
98+
})
99+
if outErr != nil {
100+
log.Printf("[CRITAL]%s read SSM secret versionId list failed, reason:%+v", logId, outErr)
101+
return outErr
102+
}
103+
}
104+
105+
for _, versionId := range versionIds {
106+
outErr = resource.Retry(readRetryTimeout, func() *resource.RetryError {
107+
secretVersionInfo, inErr := ssmService.DescribeSecretVersion(ctx, secretName, versionId)
108+
if inErr != nil {
109+
return retryError(inErr)
110+
}
111+
secretVersionInfos = append(secretVersionInfos, secretVersionInfo)
112+
return nil
113+
})
114+
if outErr != nil {
115+
log.Printf("[CRITAL]%s read SSM secret version failed, reason:%+v", logId, outErr)
116+
return outErr
117+
}
118+
}
119+
120+
var secretVersionList []map[string]interface{}
121+
var ids []string
122+
for _, secretVersionInfo := range secretVersionInfos {
123+
mapping := map[string]interface{}{
124+
"version_id": secretVersionInfo.versionId,
125+
"secret_binary": secretVersionInfo.secretBinary,
126+
"secret_string": secretVersionInfo.secretString,
127+
}
128+
129+
secretVersionList = append(secretVersionList, mapping)
130+
ids = append(ids, strings.Join([]string{secretVersionInfo.secretName, secretVersionInfo.versionId}, FILED_SP))
131+
}
132+
133+
d.SetId(helper.DataResourceIdsHash(ids))
134+
if e := d.Set("secret_version_list", secretVersionList); e != nil {
135+
log.Printf("[CRITAL]%s provider set SSM secret version list fail, reason:%+v", logId, e)
136+
return e
137+
}
138+
if output, ok := d.GetOk("result_output_file"); ok && output.(string) != "" {
139+
return writeToFile(output.(string), secretVersionList)
140+
}
141+
return nil
142+
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package tencentcloud
2+
3+
import (
4+
"testing"
5+
6+
"github.com/hashicorp/terraform-plugin-sdk/helper/resource"
7+
)
8+
9+
func TestAccTencentCloudSsmSecretVersionsDataSource(t *testing.T) {
10+
dataSourceName := "data.tencentcloud_ssm_secret_versions.secret_version"
11+
12+
resource.Test(t, resource.TestCase{
13+
PreCheck: func() { testAccPreCheck(t) },
14+
Providers: testAccProviders,
15+
Steps: []resource.TestStep{
16+
{
17+
Config: TestAccTencentCloudSsmSecretVersionsDataSourceConfig,
18+
Check: resource.ComposeTestCheckFunc(
19+
testAccCheckTencentCloudDataSourceID(dataSourceName),
20+
resource.TestCheckResourceAttr(dataSourceName, "secret_version_list.0.version_id", "v2"),
21+
resource.TestCheckResourceAttr(dataSourceName, "secret_version_list.0.secret_binary", "MTIzMTIzMTIzMTIzMTIzQQ=="),
22+
),
23+
},
24+
},
25+
})
26+
}
27+
28+
const TestAccTencentCloudSsmSecretVersionsDataSourceConfig = `
29+
resource "tencentcloud_ssm_secret" "secret" {
30+
secret_name = "unit-test"
31+
description = "test secret"
32+
init_secret {
33+
version_id = "v1"
34+
secret_string = "123456789"
35+
}
36+
37+
tags = {
38+
test-tag = "test"
39+
}
40+
}
41+
42+
resource "tencentcloud_ssm_secret_version" "v2" {
43+
secret_name = tencentcloud_ssm_secret.secret.secret_name
44+
version_id = "v2"
45+
secret_binary = "MTIzMTIzMTIzMTIzMTIzQQ=="
46+
}
47+
48+
data "tencentcloud_ssm_secret_versions" "secret_version" {
49+
secret_name = tencentcloud_ssm_secret_version.v2.secret_name
50+
version_id = tencentcloud_ssm_secret_version.v2.version_id
51+
}
52+
`
Lines changed: 154 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,154 @@
1+
package tencentcloud
2+
3+
import (
4+
"context"
5+
"log"
6+
7+
"github.com/hashicorp/terraform-plugin-sdk/helper/resource"
8+
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
9+
ssm "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/ssm/v20190923"
10+
"github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
11+
)
12+
13+
func dataSourceTencentCloudSsmSecrets() *schema.Resource {
14+
return &schema.Resource{
15+
Read: dataSourceTencentCloudSsmSecretsRead,
16+
Schema: map[string]*schema.Schema{
17+
"order_type": {
18+
Type: schema.TypeInt,
19+
Optional: true,
20+
Default: 0,
21+
Description: "The order to sort the create time of secret. `0` - desc, `1` - asc. Default value is `0`.",
22+
},
23+
"state": {
24+
Type: schema.TypeInt,
25+
Optional: true,
26+
Default: 0,
27+
Description: "Filter by state of secret. `0` - all secrets are queried, `1` - only Enabled secrets are queried, `2` - only Disabled secrets are queried, `3` - only PendingDelete secrets are queried.",
28+
},
29+
"secret_name": {
30+
Type: schema.TypeString,
31+
Optional: true,
32+
Description: "Secret name used to filter result.",
33+
},
34+
"tags": {
35+
Type: schema.TypeMap,
36+
Optional: true,
37+
Description: "Tags to filter secret.",
38+
},
39+
"result_output_file": {
40+
Type: schema.TypeString,
41+
Optional: true,
42+
Description: "Used to save results.",
43+
},
44+
"secret_list": {
45+
Type: schema.TypeList,
46+
Computed: true,
47+
Description: "A list of SSM secrets.",
48+
Elem: &schema.Resource{
49+
Schema: map[string]*schema.Schema{
50+
"secret_name": {
51+
Type: schema.TypeString,
52+
Computed: true,
53+
Description: "Name of secret.",
54+
},
55+
"description": {
56+
Type: schema.TypeString,
57+
Computed: true,
58+
Description: "Description of secret.",
59+
},
60+
"kms_key_id": {
61+
Type: schema.TypeString,
62+
Computed: true,
63+
Description: "KMS keyId used to encrypt secret.",
64+
},
65+
"create_uin": {
66+
Type: schema.TypeInt,
67+
Computed: true,
68+
Description: "Uin of Creator.",
69+
},
70+
"status": {
71+
Type: schema.TypeString,
72+
Computed: true,
73+
Description: "Status of secret.",
74+
},
75+
"delete_time": {
76+
Type: schema.TypeInt,
77+
Computed: true,
78+
Description: "Delete time of CMK.",
79+
},
80+
"create_time": {
81+
Type: schema.TypeInt,
82+
Computed: true,
83+
Description: "Create time of secret.",
84+
},
85+
},
86+
},
87+
},
88+
},
89+
}
90+
}
91+
92+
func dataSourceTencentCloudSsmSecretsRead(d *schema.ResourceData, meta interface{}) error {
93+
defer logElapsed("data_source.tencentcloud_ssm_secrets.read")()
94+
95+
logId := getLogId(contextNil)
96+
ctx := context.WithValue(context.TODO(), logIdKey, logId)
97+
98+
param := make(map[string]interface{})
99+
if v, ok := d.GetOk("order_type"); ok {
100+
param["order_type"] = v.(int)
101+
}
102+
if v, ok := d.GetOk("state"); ok {
103+
param["state"] = v.(int)
104+
}
105+
if v, ok := d.GetOk("secret_name"); ok {
106+
param["secret_name"] = v.(string)
107+
}
108+
if tags := helper.GetTags(d, "tags"); len(tags) > 0 {
109+
param["tag_filter"] = tags
110+
}
111+
112+
ssmService := SsmService{
113+
client: meta.(*TencentCloudClient).apiV3Conn,
114+
}
115+
var secrets []*ssm.SecretMetadata
116+
err := resource.Retry(readRetryTimeout, func() *resource.RetryError {
117+
results, e := ssmService.DescribeSecretsByFilter(ctx, param)
118+
if e != nil {
119+
return retryError(e)
120+
}
121+
secrets = results
122+
return nil
123+
})
124+
if err != nil {
125+
log.Printf("[CRITAL]%s read SSM secrets failed, reason:%+v", logId, err)
126+
return err
127+
}
128+
secretList := make([]map[string]interface{}, 0, len(secrets))
129+
secretNames := make([]string, 0, len(secrets))
130+
for _, secret := range secrets {
131+
mapping := map[string]interface{}{
132+
"secret_name": secret.SecretName,
133+
"description": secret.Description,
134+
"kms_key_id": secret.KmsKeyId,
135+
"create_uin": secret.CreateUin,
136+
"status": secret.Status,
137+
"delete_time": secret.DeleteTime,
138+
"create_time": secret.CreateTime,
139+
}
140+
141+
secretList = append(secretList, mapping)
142+
secretNames = append(secretNames, *secret.SecretName)
143+
}
144+
145+
d.SetId(helper.DataResourceIdsHash(secretNames))
146+
if e := d.Set("secret_list", secretList); e != nil {
147+
log.Printf("[CRITAL]%s provider set SSM secret list fail, reason:%+v", logId, e)
148+
return e
149+
}
150+
if output, ok := d.GetOk("result_output_file"); ok && output.(string) != "" {
151+
return writeToFile(output.(string), secretList)
152+
}
153+
return nil
154+
}

0 commit comments

Comments
 (0)