Skip to content

Commit 3df128f

Browse files
Add support for parameter manager parameter version datasource google_parameter_manager_parameter_version (#12653)
[upstream:79f6fab37290e2c1e0e159d89743fd5739078140] Signed-off-by: Modular Magician <[email protected]>
1 parent 24a8c2d commit 3df128f

5 files changed

+452
-0
lines changed

.changelog/12653.txt

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:new-datasource
2+
`google_parameter_manager_parameter_version`
3+
```

google-beta/provider/provider_mmv1_resources.go

+1
Original file line numberDiff line numberDiff line change
@@ -324,6 +324,7 @@ var handwrittenDatasources = map[string]*schema.Resource{
324324
"google_organizations": resourcemanager.DataSourceGoogleOrganizations(),
325325
"google_parameter_manager_parameter": parametermanager.DataSourceParameterManagerParameter(),
326326
"google_parameter_manager_parameters": parametermanager.DataSourceParameterManagerParameters(),
327+
"google_parameter_manager_parameter_version": parametermanager.DataSourceParameterManagerParameterVersion(),
327328
"google_parameter_manager_regional_parameter": parametermanagerregional.DataSourceParameterManagerRegionalRegionalParameter(),
328329
"google_parameter_manager_regional_parameters": parametermanagerregional.DataSourceParameterManagerRegionalRegionalParameters(),
329330
"google_privateca_certificate_authority": privateca.DataSourcePrivatecaCertificateAuthority(),
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,161 @@
1+
// Copyright (c) HashiCorp, Inc.
2+
// SPDX-License-Identifier: MPL-2.0
3+
package parametermanager
4+
5+
import (
6+
"encoding/base64"
7+
"fmt"
8+
"net/http"
9+
"regexp"
10+
11+
"github.com/hashicorp/terraform-provider-google-beta/google-beta/tpgresource"
12+
transport_tpg "github.com/hashicorp/terraform-provider-google-beta/google-beta/transport"
13+
14+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
15+
)
16+
17+
func DataSourceParameterManagerParameterVersion() *schema.Resource {
18+
return &schema.Resource{
19+
Read: dataSourceParameterManagerParameterVersionRead,
20+
Schema: map[string]*schema.Schema{
21+
"project": {
22+
Type: schema.TypeString,
23+
Optional: true,
24+
Computed: true,
25+
},
26+
"parameter": {
27+
Type: schema.TypeString,
28+
Required: true,
29+
DiffSuppressFunc: tpgresource.CompareSelfLinkOrResourceName,
30+
},
31+
"parameter_version_id": {
32+
Type: schema.TypeString,
33+
Required: true,
34+
},
35+
"parameter_data": {
36+
Type: schema.TypeString,
37+
Computed: true,
38+
Sensitive: true,
39+
},
40+
"name": {
41+
Type: schema.TypeString,
42+
Computed: true,
43+
},
44+
"create_time": {
45+
Type: schema.TypeString,
46+
Computed: true,
47+
},
48+
"update_time": {
49+
Type: schema.TypeString,
50+
Computed: true,
51+
},
52+
"disabled": {
53+
Type: schema.TypeBool,
54+
Computed: true,
55+
},
56+
},
57+
}
58+
}
59+
60+
func dataSourceParameterManagerParameterVersionRead(d *schema.ResourceData, meta interface{}) error {
61+
config := meta.(*transport_tpg.Config)
62+
userAgent, err := tpgresource.GenerateUserAgentString(d, config.UserAgent)
63+
if err != nil {
64+
return err
65+
}
66+
67+
// Check if the parameter is provided as a resource reference or a parameter id.
68+
parameterRegex := regexp.MustCompile("projects/(.+)/locations/global/parameters/(.+)$")
69+
dParameter, ok := d.Get("parameter").(string)
70+
if !ok {
71+
return fmt.Errorf("wrong type for parameter field (%T), expected string", d.Get("parameter"))
72+
}
73+
74+
parts := parameterRegex.FindStringSubmatch(dParameter)
75+
var project string
76+
77+
// if reference of the parameter is provided in the parameter field
78+
if len(parts) == 3 {
79+
// Stores value of project to set in state
80+
project = parts[1]
81+
if dProject, ok := d.Get("project").(string); !ok {
82+
return fmt.Errorf("wrong type for project (%T), expected string", d.Get("project"))
83+
} else if dProject != "" && dProject != project {
84+
return fmt.Errorf("project field value (%s) does not match project of parameter (%s).", dProject, project)
85+
}
86+
if err := d.Set("parameter", parts[2]); err != nil {
87+
return fmt.Errorf("error setting parameter: %s", err)
88+
}
89+
} else { // if parameter name is provided in the parameter field
90+
// Stores value of project to set in state
91+
project, err = tpgresource.GetProject(d, config)
92+
if err != nil {
93+
return fmt.Errorf("error fetching project for parameter: %s", err)
94+
}
95+
}
96+
if err := d.Set("project", project); err != nil {
97+
return fmt.Errorf("error setting project: %s", err)
98+
}
99+
100+
dParameterVersionId, ok := d.Get("parameter_version_id").(string)
101+
if !ok {
102+
return fmt.Errorf("wrong type for parameter version id field (%T), expected string", d.Get("parameter_version_id"))
103+
}
104+
105+
url, err := tpgresource.ReplaceVars(d, config, "{{ParameterManagerBasePath}}projects/{{project}}/locations/global/parameters/{{parameter}}/versions/{{parameter_version_id}}")
106+
if err != nil {
107+
return err
108+
}
109+
110+
headers := make(http.Header)
111+
parameterVersion, err := transport_tpg.SendRequest(transport_tpg.SendRequestOptions{
112+
Config: config,
113+
Method: "GET",
114+
Project: project,
115+
RawURL: url,
116+
UserAgent: userAgent,
117+
Headers: headers,
118+
})
119+
if err != nil {
120+
return fmt.Errorf("error retrieving available parameter manager parameter versions: %s", err.Error())
121+
}
122+
123+
// If the response contains the disabled value, return an error stating that the parameter version is currently disabled
124+
isDisabled, ok := parameterVersion["disabled"]
125+
if ok && isDisabled.(bool) {
126+
return fmt.Errorf("parameter version %s is in DISABLED state.", dParameterVersionId)
127+
}
128+
129+
nameValue, ok := parameterVersion["name"]
130+
if !ok {
131+
return fmt.Errorf("read response didn't contain critical fields. Read may not have succeeded.")
132+
}
133+
134+
if err := d.Set("name", nameValue.(string)); err != nil {
135+
return fmt.Errorf("error reading parameterVersion: %s", err)
136+
}
137+
138+
if err := d.Set("disabled", false); err != nil {
139+
return fmt.Errorf("error setting disabled: %s", err)
140+
}
141+
142+
if err := d.Set("update_time", parameterVersion["updateTime"].(string)); err != nil {
143+
return fmt.Errorf("error setting update_time: %s", err)
144+
}
145+
146+
if err := d.Set("create_time", parameterVersion["createTime"].(string)); err != nil {
147+
return fmt.Errorf("error setting create_time: %s", err)
148+
}
149+
150+
data := parameterVersion["payload"].(map[string]interface{})
151+
parameterData, err := base64.StdEncoding.DecodeString(data["data"].(string))
152+
if err != nil {
153+
return fmt.Errorf("error decoding parameter manager parameter version data: %s", err.Error())
154+
}
155+
if err := d.Set("parameter_data", string(parameterData)); err != nil {
156+
return fmt.Errorf("error setting parameter_data: %s", err)
157+
}
158+
159+
d.SetId(nameValue.(string))
160+
return nil
161+
}

0 commit comments

Comments
 (0)