Skip to content

Commit 532459c

Browse files
abheda-crestanoopkverma-google
authored andcommitted
Add support for parameter manager parameter version datasource google_parameter_manager_parameter_version (GoogleCloudPlatform#12653)
1 parent 886dce0 commit 532459c

File tree

4 files changed

+451
-0
lines changed

4 files changed

+451
-0
lines changed

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

+1
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,7 @@ var handwrittenDatasources = map[string]*schema.Resource{
189189
{{- if ne $.TargetVersionName "ga" }}
190190
"google_parameter_manager_parameter": parametermanager.DataSourceParameterManagerParameter(),
191191
"google_parameter_manager_parameters": parametermanager.DataSourceParameterManagerParameters(),
192+
"google_parameter_manager_parameter_version": parametermanager.DataSourceParameterManagerParameterVersion(),
192193
"google_parameter_manager_regional_parameter": parametermanagerregional.DataSourceParameterManagerRegionalRegionalParameter(),
193194
"google_parameter_manager_regional_parameters": parametermanagerregional.DataSourceParameterManagerRegionalRegionalParameters(),
194195
{{- end }}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,162 @@
1+
package parametermanager
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 DataSourceParameterManagerParameterVersion() *schema.Resource {
17+
return &schema.Resource{
18+
Read: dataSourceParameterManagerParameterVersionRead,
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+
},
56+
}
57+
}
58+
59+
func dataSourceParameterManagerParameterVersionRead(d *schema.ResourceData, meta interface{}) error {
60+
config := meta.(*transport_tpg.Config)
61+
userAgent, err := tpgresource.GenerateUserAgentString(d, config.UserAgent)
62+
if err != nil {
63+
return err
64+
}
65+
66+
// Check if the parameter is provided as a resource reference or a parameter id.
67+
parameterRegex := regexp.MustCompile("projects/(.+)/locations/global/parameters/(.+)$")
68+
dParameter, ok := d.Get("parameter").(string)
69+
if !ok {
70+
return fmt.Errorf("wrong type for parameter field (%T), expected string", d.Get("parameter"))
71+
}
72+
73+
parts := parameterRegex.FindStringSubmatch(dParameter)
74+
var project string
75+
76+
// if reference of the parameter is provided in the parameter field
77+
if len(parts) == 3 {
78+
// Stores value of project to set in state
79+
project = parts[1]
80+
if dProject, ok := d.Get("project").(string); !ok {
81+
return fmt.Errorf("wrong type for project (%T), expected string", d.Get("project"))
82+
} else if dProject != "" && dProject != project {
83+
return fmt.Errorf("project field value (%s) does not match project of parameter (%s).", dProject, project)
84+
}
85+
if err := d.Set("parameter", parts[2]); err != nil {
86+
return fmt.Errorf("error setting parameter: %s", err)
87+
}
88+
} else { // if parameter name is provided in the parameter field
89+
// Stores value of project to set in state
90+
project, err = tpgresource.GetProject(d, config)
91+
if err != nil {
92+
return fmt.Errorf("error fetching project for parameter: %s", err)
93+
}
94+
}
95+
if err := d.Set("project", project); err != nil {
96+
return fmt.Errorf("error setting project: %s", err)
97+
}
98+
99+
dParameterVersionId, ok := d.Get("parameter_version_id").(string)
100+
if !ok {
101+
return fmt.Errorf("wrong type for parameter version id field (%T), expected string", d.Get("parameter_version_id"))
102+
}
103+
104+
url, err := tpgresource.ReplaceVars(d, config, "{{"{{"}}ParameterManagerBasePath{{"}}"}}projects/{{"{{"}}project{{"}}"}}/locations/global/parameters/{{"{{"}}parameter{{"}}"}}/versions/{{"{{"}}parameter_version_id{{"}}"}}")
105+
if err != nil {
106+
return err
107+
}
108+
109+
headers := make(http.Header)
110+
parameterVersion, err := transport_tpg.SendRequest(transport_tpg.SendRequestOptions{
111+
Config: config,
112+
Method: "GET",
113+
Project: project,
114+
RawURL: url,
115+
UserAgent: userAgent,
116+
Headers: headers,
117+
})
118+
if err != nil {
119+
return fmt.Errorf("error retrieving available parameter manager parameter versions: %s", err.Error())
120+
}
121+
122+
// If the response contains the disabled value, return an error stating that the parameter version is currently disabled
123+
isDisabled, ok := parameterVersion["disabled"]
124+
if ok && isDisabled.(bool) {
125+
return fmt.Errorf("parameter version %s is in DISABLED state.", dParameterVersionId)
126+
}
127+
128+
nameValue, ok := parameterVersion["name"]
129+
if !ok {
130+
return fmt.Errorf("read response didn't contain critical fields. Read may not have succeeded.")
131+
}
132+
133+
if err := d.Set("name", nameValue.(string)); err != nil {
134+
return fmt.Errorf("error reading parameterVersion: %s", err)
135+
}
136+
137+
if err := d.Set("disabled", false); err != nil {
138+
return fmt.Errorf("error setting disabled: %s", err)
139+
}
140+
141+
if err := d.Set("update_time", parameterVersion["updateTime"].(string)); err != nil {
142+
return fmt.Errorf("error setting update_time: %s", err)
143+
}
144+
145+
if err := d.Set("create_time", parameterVersion["createTime"].(string)); err != nil {
146+
return fmt.Errorf("error setting create_time: %s", err)
147+
}
148+
149+
data := parameterVersion["payload"].(map[string]interface{})
150+
parameterData, err := base64.StdEncoding.DecodeString(data["data"].(string))
151+
if err != nil {
152+
return fmt.Errorf("error decoding parameter manager parameter version data: %s", err.Error())
153+
}
154+
if err := d.Set("parameter_data", string(parameterData)); err != nil {
155+
return fmt.Errorf("error setting parameter_data: %s", err)
156+
}
157+
158+
d.SetId(nameValue.(string))
159+
return nil
160+
}
161+
162+
{{ end }}

0 commit comments

Comments
 (0)