-
Notifications
You must be signed in to change notification settings - Fork 266
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add support for parameter manager regional parameters datasource `goo…
…gle_parameter_manager_regional_parameters` (#12651) (#9089) [upstream:eae83792920ab7e4acc6f5e65c06413c8ecbd7d9] Signed-off-by: Modular Magician <[email protected]>
- Loading branch information
1 parent
caf3042
commit 0c9c1a0
Showing
5 changed files
with
502 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
```release-note:new-datasource | ||
`google_parameter_manager_regional_parameters` | ||
``` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
172 changes: 172 additions & 0 deletions
172
...ta/services/parametermanagerregional/data_source_parameter_manager_regional_parameters.go
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,172 @@ | ||
// Copyright (c) HashiCorp, Inc. | ||
// SPDX-License-Identifier: MPL-2.0 | ||
package parametermanagerregional | ||
|
||
import ( | ||
"fmt" | ||
"strings" | ||
|
||
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" | ||
"github.com/hashicorp/terraform-provider-google-beta/google-beta/tpgresource" | ||
transport_tpg "github.com/hashicorp/terraform-provider-google-beta/google-beta/transport" | ||
) | ||
|
||
func DataSourceParameterManagerRegionalRegionalParameters() *schema.Resource { | ||
|
||
dsSchema := tpgresource.DatasourceSchemaFromResourceSchema(ResourceParameterManagerRegionalRegionalParameter().Schema) | ||
|
||
return &schema.Resource{ | ||
Read: dataSourceParameterManagerRegionalRegionalParametersRead, | ||
Schema: map[string]*schema.Schema{ | ||
"project": { | ||
Type: schema.TypeString, | ||
Optional: true, | ||
Computed: true, | ||
}, | ||
"filter": { | ||
Type: schema.TypeString, | ||
Description: `Filter string, adhering to the rules in List-operation filtering. List only parameters matching the filter. | ||
If filter is empty, all regional parameters are listed from specific location.`, | ||
Optional: true, | ||
}, | ||
"parameters": { | ||
Type: schema.TypeList, | ||
Computed: true, | ||
Elem: &schema.Resource{ | ||
Schema: dsSchema, | ||
}, | ||
}, | ||
"location": { | ||
Type: schema.TypeString, | ||
Required: true, | ||
}, | ||
}, | ||
} | ||
} | ||
|
||
func dataSourceParameterManagerRegionalRegionalParametersRead(d *schema.ResourceData, meta interface{}) error { | ||
config := meta.(*transport_tpg.Config) | ||
userAgent, err := tpgresource.GenerateUserAgentString(d, config.UserAgent) | ||
if err != nil { | ||
return err | ||
} | ||
|
||
url, err := tpgresource.ReplaceVars(d, config, "{{ParameterManagerRegionalBasePath}}projects/{{project}}/locations/{{location}}/parameters") | ||
if err != nil { | ||
return err | ||
} | ||
|
||
filter, has_filter := d.GetOk("filter") | ||
|
||
if has_filter { | ||
url, err = transport_tpg.AddQueryParams(url, map[string]string{"filter": filter.(string)}) | ||
if err != nil { | ||
return err | ||
} | ||
} | ||
|
||
billingProject := "" | ||
|
||
project, err := tpgresource.GetProject(d, config) | ||
if err != nil { | ||
return fmt.Errorf("error fetching project for Regional Parameters: %s", err) | ||
} | ||
billingProject = project | ||
|
||
// err == nil indicates that the billing_project value was found | ||
if bp, err := tpgresource.GetBillingProject(d, config); err == nil { | ||
billingProject = bp | ||
} | ||
|
||
// To handle the pagination locally | ||
allParameters := make([]interface{}, 0) | ||
token := "" | ||
for paginate := true; paginate; { | ||
if token != "" { | ||
url, err = transport_tpg.AddQueryParams(url, map[string]string{"pageToken": token}) | ||
if err != nil { | ||
return err | ||
} | ||
} | ||
parameters, err := transport_tpg.SendRequest(transport_tpg.SendRequestOptions{ | ||
Config: config, | ||
Method: "GET", | ||
Project: billingProject, | ||
RawURL: url, | ||
UserAgent: userAgent, | ||
}) | ||
if err != nil { | ||
return transport_tpg.HandleNotFoundError(err, d, fmt.Sprintf("ParameterManagerRegionalParameters %q", d.Id())) | ||
} | ||
parametersInterface := parameters["parameters"] | ||
if parametersInterface != nil { | ||
allParameters = append(allParameters, parametersInterface.([]interface{})...) | ||
} | ||
tokenInterface := parameters["nextPageToken"] | ||
if tokenInterface == nil { | ||
paginate = false | ||
} else { | ||
paginate = true | ||
token = tokenInterface.(string) | ||
} | ||
} | ||
|
||
if err := d.Set("parameters", flattenParameterManagerRegionalRegionalParameterParameters(allParameters, d, config)); err != nil { | ||
return fmt.Errorf("error setting regional parameters: %s", err) | ||
} | ||
|
||
if err := d.Set("project", project); err != nil { | ||
return fmt.Errorf("error setting project: %s", err) | ||
} | ||
|
||
if err := d.Set("filter", filter); err != nil { | ||
return fmt.Errorf("error setting filter: %s", err) | ||
} | ||
|
||
// Store the ID now | ||
id, err := tpgresource.ReplaceVars(d, config, "projects/{{project}}/locations/{{location}}/parameters") | ||
if err != nil { | ||
return fmt.Errorf("error constructing id: %s", err) | ||
} | ||
if has_filter { | ||
id += "/filter=" + filter.(string) | ||
} | ||
d.SetId(id) | ||
|
||
return nil | ||
} | ||
|
||
func flattenParameterManagerRegionalRegionalParameterParameters(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { | ||
if v == nil { | ||
return v | ||
} | ||
l := v.([]interface{}) | ||
transformed := make([]interface{}, 0, len(l)) | ||
for _, raw := range l { | ||
original := raw.(map[string]interface{}) | ||
if len(original) < 1 { | ||
// Do not include empty json objects coming back from the api | ||
continue | ||
} | ||
transformed = append(transformed, map[string]interface{}{ | ||
"format": flattenParameterManagerRegionalRegionalParameterFormat(original["format"], d, config), | ||
"labels": flattenParameterManagerRegionalRegionalParameterEffectiveLabels(original["labels"], d, config), | ||
"effective_labels": flattenParameterManagerRegionalRegionalParameterEffectiveLabels(original["labels"], d, config), | ||
"terraform_labels": flattenParameterManagerRegionalRegionalParameterEffectiveLabels(original["labels"], d, config), | ||
"create_time": flattenParameterManagerRegionalRegionalParameterCreateTime(original["createTime"], d, config), | ||
"update_time": flattenParameterManagerRegionalRegionalParameterUpdateTime(original["updateTime"], d, config), | ||
"policy_member": flattenParameterManagerRegionalRegionalParameterPolicyMember(original["policyMember"], d, config), | ||
"name": flattenParameterManagerRegionalRegionalParameterName(original["name"], d, config), | ||
"project": getDataFromName(original["name"], 1), | ||
"location": getDataFromName(original["name"], 3), | ||
"parameter_id": getDataFromName(original["name"], 5), | ||
}) | ||
} | ||
return transformed | ||
} | ||
|
||
func getDataFromName(v interface{}, part int) string { | ||
name := v.(string) | ||
split := strings.Split(name, "/") | ||
return split[part] | ||
} |
Oops, something went wrong.