Skip to content

Commit a77ad9d

Browse files
authored
Add support for parameter manager regional parameter version datasource google_parameter_manager_regional_parameter_version (#12650)
1 parent 4ff6395 commit a77ad9d

4 files changed

+478
-0
lines changed

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

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

0 commit comments

Comments
 (0)