Skip to content

Commit a38e7d5

Browse files
Add Secure Source Manager product and Instance resource (#9415) (#16637)
* Add ssm product and instance.yaml * Add instance id parameter and keep name as output property * move to beta * Add createTime, updateTime, state fields * Add basic instance test * Remove blank lines * Add one blank line back * Move back to GA provider * Fix iam policy * move iam definition up * Add iam roles * Add iam tests * Add test to examples * Remove iam policy, adjust context and variable names * Revert "Remove iam policy, adjust context and variable names" This reverts commit 8e99a3997af8d96ebe58dc15e6d614ff5f245ae2. * remove iam policy, use ctx var for instance id * Use format with random suffix * Slight change import_format for iam, remove provider explicit * Fix instance_id in generated iam test * Remove iam test * Remove reference to the iam test * edit to test again * add iam conditions to test * Update import format * remove iam condition test * revert import format * Fix links * Remove update fields from resource, remove enum values for output field, add iam_conditions_request_type * Add back values: * Add new line * add unknown value back * Remove iam_conditions_request_type [upstream:e06981ab153016b6c49db1fd134685fc09d9a71b] Signed-off-by: Modular Magician <[email protected]>
1 parent 5e1c8e2 commit a38e7d5

18 files changed

+1630
-3
lines changed

.changelog/9415.txt

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

.teamcity/components/generated/services.kt

+5
Original file line numberDiff line numberDiff line change
@@ -546,6 +546,11 @@ var services = mapOf(
546546
"displayName" to "Secretmanager",
547547
"path" to "./google/services/secretmanager"
548548
),
549+
"securesourcemanager" to mapOf(
550+
"name" to "securesourcemanager",
551+
"displayName" to "Securesourcemanager",
552+
"path" to "./google/services/securesourcemanager"
553+
),
549554
"securitycenter" to mapOf(
550555
"name" to "securitycenter",
551556
"displayName" to "Securitycenter",

google/fwmodels/provider_model.go

+1
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ type ProviderModel struct {
115115
RedisCustomEndpoint types.String `tfsdk:"redis_custom_endpoint"`
116116
ResourceManagerCustomEndpoint types.String `tfsdk:"resource_manager_custom_endpoint"`
117117
SecretManagerCustomEndpoint types.String `tfsdk:"secret_manager_custom_endpoint"`
118+
SecureSourceManagerCustomEndpoint types.String `tfsdk:"secure_source_manager_custom_endpoint"`
118119
SecurityCenterCustomEndpoint types.String `tfsdk:"security_center_custom_endpoint"`
119120
ServiceManagementCustomEndpoint types.String `tfsdk:"service_management_custom_endpoint"`
120121
ServiceUsageCustomEndpoint types.String `tfsdk:"service_usage_custom_endpoint"`

google/fwprovider/framework_provider.go

+6
Original file line numberDiff line numberDiff line change
@@ -670,6 +670,12 @@ func (p *FrameworkProvider) Schema(_ context.Context, _ provider.SchemaRequest,
670670
transport_tpg.CustomEndpointValidator(),
671671
},
672672
},
673+
"secure_source_manager_custom_endpoint": &schema.StringAttribute{
674+
Optional: true,
675+
Validators: []validator.String{
676+
transport_tpg.CustomEndpointValidator(),
677+
},
678+
},
673679
"security_center_custom_endpoint": &schema.StringAttribute{
674680
Optional: true,
675681
Validators: []validator.String{

google/fwtransport/framework_config.go

+10
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,7 @@ type FrameworkProviderConfig struct {
140140
RedisBasePath string
141141
ResourceManagerBasePath string
142142
SecretManagerBasePath string
143+
SecureSourceManagerBasePath string
143144
SecurityCenterBasePath string
144145
ServiceManagementBasePath string
145146
ServiceUsageBasePath string
@@ -283,6 +284,7 @@ func (p *FrameworkProviderConfig) LoadAndValidateFramework(ctx context.Context,
283284
p.RedisBasePath = data.RedisCustomEndpoint.ValueString()
284285
p.ResourceManagerBasePath = data.ResourceManagerCustomEndpoint.ValueString()
285286
p.SecretManagerBasePath = data.SecretManagerCustomEndpoint.ValueString()
287+
p.SecureSourceManagerBasePath = data.SecureSourceManagerCustomEndpoint.ValueString()
286288
p.SecurityCenterBasePath = data.SecurityCenterCustomEndpoint.ValueString()
287289
p.ServiceManagementBasePath = data.ServiceManagementCustomEndpoint.ValueString()
288290
p.ServiceUsageBasePath = data.ServiceUsageCustomEndpoint.ValueString()
@@ -1137,6 +1139,14 @@ func (p *FrameworkProviderConfig) HandleDefaults(ctx context.Context, data *fwmo
11371139
data.SecretManagerCustomEndpoint = types.StringValue(customEndpoint.(string))
11381140
}
11391141
}
1142+
if data.SecureSourceManagerCustomEndpoint.IsNull() {
1143+
customEndpoint := transport_tpg.MultiEnvDefault([]string{
1144+
"GOOGLE_SECURE_SOURCE_MANAGER_CUSTOM_ENDPOINT",
1145+
}, transport_tpg.DefaultBasePaths[transport_tpg.SecureSourceManagerBasePathKey])
1146+
if customEndpoint != nil {
1147+
data.SecureSourceManagerCustomEndpoint = types.StringValue(customEndpoint.(string))
1148+
}
1149+
}
11401150
if data.SecurityCenterCustomEndpoint.IsNull() {
11411151
customEndpoint := transport_tpg.MultiEnvDefault([]string{
11421152
"GOOGLE_SECURITY_CENTER_CUSTOM_ENDPOINT",

google/provider/provider.go

+6
Original file line numberDiff line numberDiff line change
@@ -580,6 +580,11 @@ func Provider() *schema.Provider {
580580
Optional: true,
581581
ValidateFunc: transport_tpg.ValidateCustomEndpoint,
582582
},
583+
"secure_source_manager_custom_endpoint": {
584+
Type: schema.TypeString,
585+
Optional: true,
586+
ValidateFunc: transport_tpg.ValidateCustomEndpoint,
587+
},
583588
"security_center_custom_endpoint": {
584589
Type: schema.TypeString,
585590
Optional: true,
@@ -944,6 +949,7 @@ func ProviderConfigure(ctx context.Context, d *schema.ResourceData, p *schema.Pr
944949
config.RedisBasePath = d.Get("redis_custom_endpoint").(string)
945950
config.ResourceManagerBasePath = d.Get("resource_manager_custom_endpoint").(string)
946951
config.SecretManagerBasePath = d.Get("secret_manager_custom_endpoint").(string)
952+
config.SecureSourceManagerBasePath = d.Get("secure_source_manager_custom_endpoint").(string)
947953
config.SecurityCenterBasePath = d.Get("security_center_custom_endpoint").(string)
948954
config.ServiceManagementBasePath = d.Get("service_management_custom_endpoint").(string)
949955
config.ServiceUsageBasePath = d.Get("service_usage_custom_endpoint").(string)

google/provider/provider_mmv1_resources.go

+9-3
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ import (
9494
"github.com/hashicorp/terraform-provider-google/google/services/redis"
9595
"github.com/hashicorp/terraform-provider-google/google/services/resourcemanager"
9696
"github.com/hashicorp/terraform-provider-google/google/services/secretmanager"
97+
"github.com/hashicorp/terraform-provider-google/google/services/securesourcemanager"
9798
"github.com/hashicorp/terraform-provider-google/google/services/securitycenter"
9899
"github.com/hashicorp/terraform-provider-google/google/services/servicemanagement"
99100
"github.com/hashicorp/terraform-provider-google/google/services/sourcerepo"
@@ -324,6 +325,7 @@ var generatedIAMDatasources = map[string]*schema.Resource{
324325
"google_pubsub_schema_iam_policy": tpgiamresource.DataSourceIamPolicy(pubsub.PubsubSchemaIamSchema, pubsub.PubsubSchemaIamUpdaterProducer),
325326
"google_pubsub_topic_iam_policy": tpgiamresource.DataSourceIamPolicy(pubsub.PubsubTopicIamSchema, pubsub.PubsubTopicIamUpdaterProducer),
326327
"google_secret_manager_secret_iam_policy": tpgiamresource.DataSourceIamPolicy(secretmanager.SecretManagerSecretIamSchema, secretmanager.SecretManagerSecretIamUpdaterProducer),
328+
"google_secure_source_manager_instance_iam_policy": tpgiamresource.DataSourceIamPolicy(securesourcemanager.SecureSourceManagerInstanceIamSchema, securesourcemanager.SecureSourceManagerInstanceIamUpdaterProducer),
327329
"google_scc_source_iam_policy": tpgiamresource.DataSourceIamPolicy(securitycenter.SecurityCenterSourceIamSchema, securitycenter.SecurityCenterSourceIamUpdaterProducer),
328330
"google_endpoints_service_iam_policy": tpgiamresource.DataSourceIamPolicy(servicemanagement.ServiceManagementServiceIamSchema, servicemanagement.ServiceManagementServiceIamUpdaterProducer),
329331
"google_endpoints_service_consumers_iam_policy": tpgiamresource.DataSourceIamPolicy(servicemanagement.ServiceManagementServiceConsumersIamSchema, servicemanagement.ServiceManagementServiceConsumersIamUpdaterProducer),
@@ -359,9 +361,9 @@ var handwrittenIAMDatasources = map[string]*schema.Resource{
359361
}
360362

361363
// Resources
362-
// Generated resources: 344
363-
// Generated IAM resources: 213
364-
// Total generated resources: 557
364+
// Generated resources: 345
365+
// Generated IAM resources: 216
366+
// Total generated resources: 561
365367
var generatedResources = map[string]*schema.Resource{
366368
"google_folder_access_approval_settings": accessapproval.ResourceAccessApprovalFolderSettings(),
367369
"google_organization_access_approval_settings": accessapproval.ResourceAccessApprovalOrganizationSettings(),
@@ -847,6 +849,10 @@ var generatedResources = map[string]*schema.Resource{
847849
"google_secret_manager_secret_iam_member": tpgiamresource.ResourceIamMember(secretmanager.SecretManagerSecretIamSchema, secretmanager.SecretManagerSecretIamUpdaterProducer, secretmanager.SecretManagerSecretIdParseFunc),
848850
"google_secret_manager_secret_iam_policy": tpgiamresource.ResourceIamPolicy(secretmanager.SecretManagerSecretIamSchema, secretmanager.SecretManagerSecretIamUpdaterProducer, secretmanager.SecretManagerSecretIdParseFunc),
849851
"google_secret_manager_secret_version": secretmanager.ResourceSecretManagerSecretVersion(),
852+
"google_secure_source_manager_instance": securesourcemanager.ResourceSecureSourceManagerInstance(),
853+
"google_secure_source_manager_instance_iam_binding": tpgiamresource.ResourceIamBinding(securesourcemanager.SecureSourceManagerInstanceIamSchema, securesourcemanager.SecureSourceManagerInstanceIamUpdaterProducer, securesourcemanager.SecureSourceManagerInstanceIdParseFunc),
854+
"google_secure_source_manager_instance_iam_member": tpgiamresource.ResourceIamMember(securesourcemanager.SecureSourceManagerInstanceIamSchema, securesourcemanager.SecureSourceManagerInstanceIamUpdaterProducer, securesourcemanager.SecureSourceManagerInstanceIdParseFunc),
855+
"google_secure_source_manager_instance_iam_policy": tpgiamresource.ResourceIamPolicy(securesourcemanager.SecureSourceManagerInstanceIamSchema, securesourcemanager.SecureSourceManagerInstanceIamUpdaterProducer, securesourcemanager.SecureSourceManagerInstanceIdParseFunc),
850856
"google_scc_folder_custom_module": securitycenter.ResourceSecurityCenterFolderCustomModule(),
851857
"google_scc_mute_config": securitycenter.ResourceSecurityCenterMuteConfig(),
852858
"google_scc_notification_config": securitycenter.ResourceSecurityCenterNotificationConfig(),
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,245 @@
1+
// Copyright (c) HashiCorp, Inc.
2+
// SPDX-License-Identifier: MPL-2.0
3+
4+
// ----------------------------------------------------------------------------
5+
//
6+
// *** AUTO GENERATED CODE *** Type: MMv1 ***
7+
//
8+
// ----------------------------------------------------------------------------
9+
//
10+
// This file is automatically generated by Magic Modules and manual
11+
// changes will be clobbered when the file is regenerated.
12+
//
13+
// Please read more about how to change this file in
14+
// .github/CONTRIBUTING.md.
15+
//
16+
// ----------------------------------------------------------------------------
17+
18+
package securesourcemanager
19+
20+
import (
21+
"fmt"
22+
23+
"github.com/hashicorp/errwrap"
24+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
25+
"google.golang.org/api/cloudresourcemanager/v1"
26+
27+
"github.com/hashicorp/terraform-provider-google/google/tpgiamresource"
28+
"github.com/hashicorp/terraform-provider-google/google/tpgresource"
29+
transport_tpg "github.com/hashicorp/terraform-provider-google/google/transport"
30+
)
31+
32+
var SecureSourceManagerInstanceIamSchema = map[string]*schema.Schema{
33+
"project": {
34+
Type: schema.TypeString,
35+
Computed: true,
36+
Optional: true,
37+
ForceNew: true,
38+
},
39+
"location": {
40+
Type: schema.TypeString,
41+
Computed: true,
42+
Optional: true,
43+
ForceNew: true,
44+
},
45+
"instance_id": {
46+
Type: schema.TypeString,
47+
Required: true,
48+
ForceNew: true,
49+
DiffSuppressFunc: tpgresource.CompareSelfLinkOrResourceName,
50+
},
51+
}
52+
53+
type SecureSourceManagerInstanceIamUpdater struct {
54+
project string
55+
location string
56+
instanceId string
57+
d tpgresource.TerraformResourceData
58+
Config *transport_tpg.Config
59+
}
60+
61+
func SecureSourceManagerInstanceIamUpdaterProducer(d tpgresource.TerraformResourceData, config *transport_tpg.Config) (tpgiamresource.ResourceIamUpdater, error) {
62+
values := make(map[string]string)
63+
64+
project, _ := tpgresource.GetProject(d, config)
65+
if project != "" {
66+
if err := d.Set("project", project); err != nil {
67+
return nil, fmt.Errorf("Error setting project: %s", err)
68+
}
69+
}
70+
values["project"] = project
71+
location, _ := tpgresource.GetLocation(d, config)
72+
if location != "" {
73+
if err := d.Set("location", location); err != nil {
74+
return nil, fmt.Errorf("Error setting location: %s", err)
75+
}
76+
}
77+
values["location"] = location
78+
if v, ok := d.GetOk("instance_id"); ok {
79+
values["instance_id"] = v.(string)
80+
}
81+
82+
// We may have gotten either a long or short name, so attempt to parse long name if possible
83+
m, err := tpgresource.GetImportIdQualifiers([]string{"projects/(?P<project>[^/]+)/locations/(?P<location>[^/]+)/instances/(?P<instance_id>[^/]+)", "(?P<project>[^/]+)/(?P<location>[^/]+)/(?P<instance_id>[^/]+)", "(?P<location>[^/]+)/(?P<instance_id>[^/]+)", "(?P<instance_id>[^/]+)"}, d, config, d.Get("instance_id").(string))
84+
if err != nil {
85+
return nil, err
86+
}
87+
88+
for k, v := range m {
89+
values[k] = v
90+
}
91+
92+
u := &SecureSourceManagerInstanceIamUpdater{
93+
project: values["project"],
94+
location: values["location"],
95+
instanceId: values["instance_id"],
96+
d: d,
97+
Config: config,
98+
}
99+
100+
if err := d.Set("project", u.project); err != nil {
101+
return nil, fmt.Errorf("Error setting project: %s", err)
102+
}
103+
if err := d.Set("location", u.location); err != nil {
104+
return nil, fmt.Errorf("Error setting location: %s", err)
105+
}
106+
if err := d.Set("instance_id", u.GetResourceId()); err != nil {
107+
return nil, fmt.Errorf("Error setting instance_id: %s", err)
108+
}
109+
110+
return u, nil
111+
}
112+
113+
func SecureSourceManagerInstanceIdParseFunc(d *schema.ResourceData, config *transport_tpg.Config) error {
114+
values := make(map[string]string)
115+
116+
project, _ := tpgresource.GetProject(d, config)
117+
if project != "" {
118+
values["project"] = project
119+
}
120+
121+
location, _ := tpgresource.GetLocation(d, config)
122+
if location != "" {
123+
values["location"] = location
124+
}
125+
126+
m, err := tpgresource.GetImportIdQualifiers([]string{"projects/(?P<project>[^/]+)/locations/(?P<location>[^/]+)/instances/(?P<instance_id>[^/]+)", "(?P<project>[^/]+)/(?P<location>[^/]+)/(?P<instance_id>[^/]+)", "(?P<location>[^/]+)/(?P<instance_id>[^/]+)", "(?P<instance_id>[^/]+)"}, d, config, d.Id())
127+
if err != nil {
128+
return err
129+
}
130+
131+
for k, v := range m {
132+
values[k] = v
133+
}
134+
135+
u := &SecureSourceManagerInstanceIamUpdater{
136+
project: values["project"],
137+
location: values["location"],
138+
instanceId: values["instance_id"],
139+
d: d,
140+
Config: config,
141+
}
142+
if err := d.Set("instance_id", u.GetResourceId()); err != nil {
143+
return fmt.Errorf("Error setting instance_id: %s", err)
144+
}
145+
d.SetId(u.GetResourceId())
146+
return nil
147+
}
148+
149+
func (u *SecureSourceManagerInstanceIamUpdater) GetResourceIamPolicy() (*cloudresourcemanager.Policy, error) {
150+
url, err := u.qualifyInstanceUrl("getIamPolicy")
151+
if err != nil {
152+
return nil, err
153+
}
154+
155+
project, err := tpgresource.GetProject(u.d, u.Config)
156+
if err != nil {
157+
return nil, err
158+
}
159+
var obj map[string]interface{}
160+
161+
userAgent, err := tpgresource.GenerateUserAgentString(u.d, u.Config.UserAgent)
162+
if err != nil {
163+
return nil, err
164+
}
165+
166+
policy, err := transport_tpg.SendRequest(transport_tpg.SendRequestOptions{
167+
Config: u.Config,
168+
Method: "GET",
169+
Project: project,
170+
RawURL: url,
171+
UserAgent: userAgent,
172+
Body: obj,
173+
})
174+
if err != nil {
175+
return nil, errwrap.Wrapf(fmt.Sprintf("Error retrieving IAM policy for %s: {{err}}", u.DescribeResource()), err)
176+
}
177+
178+
out := &cloudresourcemanager.Policy{}
179+
err = tpgresource.Convert(policy, out)
180+
if err != nil {
181+
return nil, errwrap.Wrapf("Cannot convert a policy to a resource manager policy: {{err}}", err)
182+
}
183+
184+
return out, nil
185+
}
186+
187+
func (u *SecureSourceManagerInstanceIamUpdater) SetResourceIamPolicy(policy *cloudresourcemanager.Policy) error {
188+
json, err := tpgresource.ConvertToMap(policy)
189+
if err != nil {
190+
return err
191+
}
192+
193+
obj := make(map[string]interface{})
194+
obj["policy"] = json
195+
196+
url, err := u.qualifyInstanceUrl("setIamPolicy")
197+
if err != nil {
198+
return err
199+
}
200+
project, err := tpgresource.GetProject(u.d, u.Config)
201+
if err != nil {
202+
return err
203+
}
204+
205+
userAgent, err := tpgresource.GenerateUserAgentString(u.d, u.Config.UserAgent)
206+
if err != nil {
207+
return err
208+
}
209+
210+
_, err = transport_tpg.SendRequest(transport_tpg.SendRequestOptions{
211+
Config: u.Config,
212+
Method: "POST",
213+
Project: project,
214+
RawURL: url,
215+
UserAgent: userAgent,
216+
Body: obj,
217+
Timeout: u.d.Timeout(schema.TimeoutCreate),
218+
})
219+
if err != nil {
220+
return errwrap.Wrapf(fmt.Sprintf("Error setting IAM policy for %s: {{err}}", u.DescribeResource()), err)
221+
}
222+
223+
return nil
224+
}
225+
226+
func (u *SecureSourceManagerInstanceIamUpdater) qualifyInstanceUrl(methodIdentifier string) (string, error) {
227+
urlTemplate := fmt.Sprintf("{{SecureSourceManagerBasePath}}%s:%s", fmt.Sprintf("projects/%s/locations/%s/instances/%s", u.project, u.location, u.instanceId), methodIdentifier)
228+
url, err := tpgresource.ReplaceVars(u.d, u.Config, urlTemplate)
229+
if err != nil {
230+
return "", err
231+
}
232+
return url, nil
233+
}
234+
235+
func (u *SecureSourceManagerInstanceIamUpdater) GetResourceId() string {
236+
return fmt.Sprintf("projects/%s/locations/%s/instances/%s", u.project, u.location, u.instanceId)
237+
}
238+
239+
func (u *SecureSourceManagerInstanceIamUpdater) GetMutexKey() string {
240+
return fmt.Sprintf("iam-securesourcemanager-instance-%s", u.GetResourceId())
241+
}
242+
243+
func (u *SecureSourceManagerInstanceIamUpdater) DescribeResource() string {
244+
return fmt.Sprintf("securesourcemanager instance %q", u.GetResourceId())
245+
}

0 commit comments

Comments
 (0)