Skip to content

Commit 98f4192

Browse files
Add SecureSourceManager UpdateRepository (#14339) (#10325)
[upstream:6f3267209e5ac84a774413f1332d7729f129ab88] Signed-off-by: Modular Magician <[email protected]>
1 parent cb20fed commit 98f4192

File tree

4 files changed

+201
-1
lines changed

4 files changed

+201
-1
lines changed

.changelog/14339.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:enhancement
2+
securesourcemanager: supported in-place update for `description` in `google_secure_source_manager_repository` resource
3+
```

google-beta/services/securesourcemanager/resource_secure_source_manager_repository.go

Lines changed: 81 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import (
2424
"log"
2525
"net/http"
2626
"reflect"
27+
"strings"
2728
"time"
2829

2930
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/customdiff"
@@ -37,6 +38,7 @@ func ResourceSecureSourceManagerRepository() *schema.Resource {
3738
return &schema.Resource{
3839
Create: resourceSecureSourceManagerRepositoryCreate,
3940
Read: resourceSecureSourceManagerRepositoryRead,
41+
Update: resourceSecureSourceManagerRepositoryUpdate,
4042
Delete: resourceSecureSourceManagerRepositoryDelete,
4143

4244
Importer: &schema.ResourceImporter{
@@ -45,6 +47,7 @@ func ResourceSecureSourceManagerRepository() *schema.Resource {
4547

4648
Timeouts: &schema.ResourceTimeout{
4749
Create: schema.DefaultTimeout(20 * time.Minute),
50+
Update: schema.DefaultTimeout(20 * time.Minute),
4851
Delete: schema.DefaultTimeout(20 * time.Minute),
4952
},
5053

@@ -75,7 +78,6 @@ func ResourceSecureSourceManagerRepository() *schema.Resource {
7578
"description": {
7679
Type: schema.TypeString,
7780
Optional: true,
78-
ForceNew: true,
7981
Description: `Description of the repository, which cannot exceed 500 characters.`,
8082
},
8183
"initial_config": {
@@ -324,6 +326,84 @@ func resourceSecureSourceManagerRepositoryRead(d *schema.ResourceData, meta inte
324326
return nil
325327
}
326328

329+
func resourceSecureSourceManagerRepositoryUpdate(d *schema.ResourceData, meta interface{}) error {
330+
config := meta.(*transport_tpg.Config)
331+
userAgent, err := tpgresource.GenerateUserAgentString(d, config.UserAgent)
332+
if err != nil {
333+
return err
334+
}
335+
336+
billingProject := ""
337+
338+
project, err := tpgresource.GetProject(d, config)
339+
if err != nil {
340+
return fmt.Errorf("Error fetching project for Repository: %s", err)
341+
}
342+
billingProject = project
343+
344+
obj := make(map[string]interface{})
345+
descriptionProp, err := expandSecureSourceManagerRepositoryDescription(d.Get("description"), d, config)
346+
if err != nil {
347+
return err
348+
} else if v, ok := d.GetOkExists("description"); !tpgresource.IsEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, descriptionProp)) {
349+
obj["description"] = descriptionProp
350+
}
351+
352+
url, err := tpgresource.ReplaceVars(d, config, "{{SecureSourceManagerBasePath}}projects/{{project}}/locations/{{location}}/repositories/{{repository_id}}")
353+
if err != nil {
354+
return err
355+
}
356+
357+
log.Printf("[DEBUG] Updating Repository %q: %#v", d.Id(), obj)
358+
headers := make(http.Header)
359+
updateMask := []string{}
360+
361+
if d.HasChange("description") {
362+
updateMask = append(updateMask, "description")
363+
}
364+
// updateMask is a URL parameter but not present in the schema, so ReplaceVars
365+
// won't set it
366+
url, err = transport_tpg.AddQueryParams(url, map[string]string{"updateMask": strings.Join(updateMask, ",")})
367+
if err != nil {
368+
return err
369+
}
370+
371+
// err == nil indicates that the billing_project value was found
372+
if bp, err := tpgresource.GetBillingProject(d, config); err == nil {
373+
billingProject = bp
374+
}
375+
376+
// if updateMask is empty we are not updating anything so skip the post
377+
if len(updateMask) > 0 {
378+
res, err := transport_tpg.SendRequest(transport_tpg.SendRequestOptions{
379+
Config: config,
380+
Method: "PATCH",
381+
Project: billingProject,
382+
RawURL: url,
383+
UserAgent: userAgent,
384+
Body: obj,
385+
Timeout: d.Timeout(schema.TimeoutUpdate),
386+
Headers: headers,
387+
})
388+
389+
if err != nil {
390+
return fmt.Errorf("Error updating Repository %q: %s", d.Id(), err)
391+
} else {
392+
log.Printf("[DEBUG] Finished updating Repository %q: %#v", d.Id(), res)
393+
}
394+
395+
err = SecureSourceManagerOperationWaitTime(
396+
config, res, project, "Updating Repository", userAgent,
397+
d.Timeout(schema.TimeoutUpdate))
398+
399+
if err != nil {
400+
return err
401+
}
402+
}
403+
404+
return resourceSecureSourceManagerRepositoryRead(d, meta)
405+
}
406+
327407
func resourceSecureSourceManagerRepositoryDelete(d *schema.ResourceData, meta interface{}) error {
328408
config := meta.(*transport_tpg.Config)
329409
userAgent, err := tpgresource.GenerateUserAgentString(d, config.UserAgent)
Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
// Copyright (c) HashiCorp, Inc.
2+
// SPDX-License-Identifier: MPL-2.0
3+
// ----------------------------------------------------------------------------
4+
//
5+
// *** AUTO GENERATED CODE *** Type: Handwritten ***
6+
//
7+
// ----------------------------------------------------------------------------
8+
//
9+
// This code is generated by Magic Modules using the following:
10+
//
11+
// Source file: https://github.com/GoogleCloudPlatform/magic-modules/tree/main/mmv1/third_party/terraform/services/securesourcemanager/resource_secure_source_manager_repository_update_test.go
12+
//
13+
// DO NOT EDIT this file directly. Any changes made to this file will be
14+
// overwritten during the next generation cycle.
15+
//
16+
// ----------------------------------------------------------------------------
17+
package securesourcemanager_test
18+
19+
import (
20+
"testing"
21+
22+
"github.com/hashicorp/terraform-plugin-testing/helper/resource"
23+
"github.com/hashicorp/terraform-plugin-testing/plancheck"
24+
"github.com/hashicorp/terraform-provider-google-beta/google-beta/acctest"
25+
)
26+
27+
func TestAccSecureSourceManagerRepository_secureSourceManagerRepositoryBasicExample_update(t *testing.T) {
28+
t.Parallel()
29+
30+
context := map[string]interface{}{
31+
"prevent_destroy": false,
32+
"random_suffix": acctest.RandString(t, 10),
33+
}
34+
35+
acctest.VcrTest(t, resource.TestCase{
36+
PreCheck: func() { acctest.AccTestPreCheck(t) },
37+
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories(t),
38+
Steps: []resource.TestStep{
39+
{
40+
Config: testAccSecureSourceManagerRepository_secureSourceManagerRepositoryBasicExample_basic(context),
41+
},
42+
{
43+
ResourceName: "google_secure_source_manager_repository.default",
44+
ImportState: true,
45+
ImportStateVerify: true,
46+
ImportStateVerifyIgnore: []string{"initial_config", "location", "repository_id"},
47+
},
48+
{
49+
Config: testAccSecureSourceManagerRepository_secureSourceManagerRepositoryBasicExample_update(context),
50+
ConfigPlanChecks: resource.ConfigPlanChecks{
51+
PreApply: []plancheck.PlanCheck{
52+
plancheck.ExpectResourceAction("google_secure_source_manager_repository.default", plancheck.ResourceActionUpdate),
53+
},
54+
},
55+
},
56+
{
57+
ResourceName: "google_secure_source_manager_repository.default",
58+
ImportState: true,
59+
ImportStateVerify: true,
60+
ImportStateVerifyIgnore: []string{"initial_config", "location", "repository_id"},
61+
},
62+
},
63+
})
64+
}
65+
66+
func testAccSecureSourceManagerRepository_secureSourceManagerRepositoryBasicExample_basic(context map[string]interface{}) string {
67+
return acctest.Nprintf(`
68+
resource "google_secure_source_manager_instance" "instance" {
69+
location = "us-central1"
70+
instance_id = "tf-test-my-instance%{random_suffix}"
71+
72+
# Prevent accidental deletions.
73+
lifecycle {
74+
prevent_destroy = "%{prevent_destroy}"
75+
}
76+
}
77+
78+
resource "google_secure_source_manager_repository" "default" {
79+
location = "us-central1"
80+
repository_id = "tf-test-my-repository%{random_suffix}"
81+
instance = google_secure_source_manager_instance.instance.name
82+
83+
# Prevent accidental deletions.
84+
lifecycle {
85+
prevent_destroy = "%{prevent_destroy}"
86+
}
87+
}
88+
`, context)
89+
}
90+
91+
func testAccSecureSourceManagerRepository_secureSourceManagerRepositoryBasicExample_update(context map[string]interface{}) string {
92+
return acctest.Nprintf(`
93+
resource "google_secure_source_manager_instance" "instance" {
94+
location = "us-central1"
95+
instance_id = "tf-test-my-instance%{random_suffix}"
96+
97+
# Prevent accidental deletions.
98+
lifecycle {
99+
prevent_destroy = "%{prevent_destroy}"
100+
}
101+
}
102+
103+
resource "google_secure_source_manager_repository" "default" {
104+
location = "us-central1"
105+
repository_id = "tf-test-my-repository%{random_suffix}"
106+
instance = google_secure_source_manager_instance.instance.name
107+
108+
description = "new description"
109+
110+
# Prevent accidental deletions.
111+
lifecycle {
112+
prevent_destroy = "%{prevent_destroy}"
113+
}
114+
}
115+
`, context)
116+
}

website/docs/r/secure_source_manager_repository.html.markdown

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,7 @@ This resource provides the following
195195
[Timeouts](https://developer.hashicorp.com/terraform/plugin/sdkv2/resources/retries-and-customizable-timeouts) configuration options:
196196

197197
- `create` - Default is 20 minutes.
198+
- `update` - Default is 20 minutes.
198199
- `delete` - Default is 20 minutes.
199200

200201
## Import

0 commit comments

Comments
 (0)