Skip to content

Commit 737a059

Browse files
authored
Add support for parameter manager regional parameter version render datasource google_parameter_manager_regional_parameter_version_render (#12675)
1 parent af25719 commit 737a059

4 files changed

+624
-0
lines changed

mmv1/third_party/terraform/provider/provider_mmv1_resources.go.tmpl

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

0 commit comments

Comments
 (0)