Skip to content

Commit e41ec1f

Browse files
fix(apigee): Added in-place update of google_apigee_environment resource (#12178) (#8627)
[upstream:f97d7e0c4c85b9be5450986e088fc24b57e7c067] Signed-off-by: Modular Magician <[email protected]>
1 parent 5df4458 commit e41ec1f

File tree

3 files changed

+139
-2
lines changed

3 files changed

+139
-2
lines changed

.changelog/12178.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:bug
2+
apigee: added in-place update of `google_apigee_environment` resource
3+
```

google-beta/services/apigee/resource_apigee_environment.go

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,13 +89,11 @@ Creating, updating, or deleting target servers. Possible values: ["DEPLOYMENT_TY
8989
"description": {
9090
Type: schema.TypeString,
9191
Optional: true,
92-
ForceNew: true,
9392
Description: `Description of the environment.`,
9493
},
9594
"display_name": {
9695
Type: schema.TypeString,
9796
Optional: true,
98-
ForceNew: true,
9997
Description: `Display name of the environment.`,
10098
},
10199
"forward_proxy_uri": {
@@ -340,6 +338,18 @@ func resourceApigeeEnvironmentUpdate(d *schema.ResourceData, meta interface{}) e
340338
billingProject := ""
341339

342340
obj := make(map[string]interface{})
341+
displayNameProp, err := expandApigeeEnvironmentDisplayName(d.Get("display_name"), d, config)
342+
if err != nil {
343+
return err
344+
} else if v, ok := d.GetOkExists("display_name"); !tpgresource.IsEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, displayNameProp)) {
345+
obj["displayName"] = displayNameProp
346+
}
347+
descriptionProp, err := expandApigeeEnvironmentDescription(d.Get("description"), d, config)
348+
if err != nil {
349+
return err
350+
} else if v, ok := d.GetOkExists("description"); !tpgresource.IsEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, descriptionProp)) {
351+
obj["description"] = descriptionProp
352+
}
343353
nodeConfigProp, err := expandApigeeEnvironmentNodeConfig(d.Get("node_config"), d, config)
344354
if err != nil {
345355
return err
@@ -368,6 +378,14 @@ func resourceApigeeEnvironmentUpdate(d *schema.ResourceData, meta interface{}) e
368378
headers := make(http.Header)
369379
updateMask := []string{}
370380

381+
if d.HasChange("display_name") {
382+
updateMask = append(updateMask, "displayName")
383+
}
384+
385+
if d.HasChange("description") {
386+
updateMask = append(updateMask, "description")
387+
}
388+
371389
if d.HasChange("node_config") {
372390
updateMask = append(updateMask, "nodeConfig")
373391
}
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+
package apigee_test
4+
5+
import (
6+
"testing"
7+
8+
"github.com/hashicorp/terraform-plugin-testing/helper/resource"
9+
10+
"github.com/hashicorp/terraform-provider-google-beta/google-beta/acctest"
11+
"github.com/hashicorp/terraform-provider-google-beta/google-beta/envvar"
12+
)
13+
14+
func TestAccApigeeEnvironment_apigeeEnvironmentUpdateTest(t *testing.T) {
15+
t.Parallel()
16+
17+
context := map[string]interface{}{
18+
"billing_account": envvar.GetTestBillingAccountFromEnv(t),
19+
"org_id": envvar.GetTestOrgFromEnv(t),
20+
"random_suffix": acctest.RandString(t, 10),
21+
}
22+
23+
acctest.VcrTest(t, resource.TestCase{
24+
PreCheck: func() { acctest.AccTestPreCheck(t) },
25+
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories(t),
26+
CheckDestroy: testAccCheckApigeeEnvironmentDestroyProducer(t),
27+
Steps: []resource.TestStep{
28+
{
29+
Config: testAccApigeeEnvironment_apigeeEnvironmentBasicTestExample(context),
30+
},
31+
{
32+
ResourceName: "google_apigee_environment.apigee_environment",
33+
ImportState: true,
34+
ImportStateVerify: true,
35+
ImportStateVerifyIgnore: []string{"org_id"},
36+
},
37+
{
38+
Config: testAccApigeeEnvironment_apigeeEnvironmentUpdateTest(context),
39+
},
40+
{
41+
ResourceName: "google_apigee_environment.apigee_environment",
42+
ImportState: true,
43+
ImportStateVerify: true,
44+
ImportStateVerifyIgnore: []string{"org_id"},
45+
},
46+
},
47+
})
48+
}
49+
50+
func testAccApigeeEnvironment_apigeeEnvironmentUpdateTest(context map[string]interface{}) string {
51+
return acctest.Nprintf(`
52+
resource "google_project" "project" {
53+
project_id = "tf-test%{random_suffix}"
54+
name = "tf-test%{random_suffix}"
55+
org_id = "%{org_id}"
56+
billing_account = "%{billing_account}"
57+
deletion_policy = "DELETE"
58+
}
59+
60+
resource "google_project_service" "apigee" {
61+
project = google_project.project.project_id
62+
service = "apigee.googleapis.com"
63+
}
64+
65+
resource "google_project_service" "servicenetworking" {
66+
project = google_project.project.project_id
67+
service = "servicenetworking.googleapis.com"
68+
depends_on = [google_project_service.apigee]
69+
}
70+
71+
resource "google_project_service" "compute" {
72+
project = google_project.project.project_id
73+
service = "compute.googleapis.com"
74+
depends_on = [google_project_service.servicenetworking]
75+
}
76+
77+
resource "google_compute_network" "apigee_network" {
78+
name = "apigee-network"
79+
project = google_project.project.project_id
80+
depends_on = [google_project_service.compute]
81+
}
82+
83+
resource "google_compute_global_address" "apigee_range" {
84+
name = "apigee-range"
85+
purpose = "VPC_PEERING"
86+
address_type = "INTERNAL"
87+
prefix_length = 16
88+
network = google_compute_network.apigee_network.id
89+
project = google_project.project.project_id
90+
}
91+
92+
resource "google_service_networking_connection" "apigee_vpc_connection" {
93+
network = google_compute_network.apigee_network.id
94+
service = "servicenetworking.googleapis.com"
95+
reserved_peering_ranges = [google_compute_global_address.apigee_range.name]
96+
depends_on = [google_project_service.servicenetworking]
97+
}
98+
99+
resource "google_apigee_organization" "apigee_org" {
100+
analytics_region = "us-central1"
101+
project_id = google_project.project.project_id
102+
authorized_network = google_compute_network.apigee_network.id
103+
depends_on = [
104+
google_service_networking_connection.apigee_vpc_connection,
105+
google_project_service.apigee,
106+
]
107+
}
108+
109+
resource "google_apigee_environment" "apigee_environment" {
110+
org_id = google_apigee_organization.apigee_org.id
111+
name = "tf-test%{random_suffix}"
112+
description = "Updated Apigee Environment Description"
113+
display_name = "environment-1-updated"
114+
}
115+
`, context)
116+
}

0 commit comments

Comments
 (0)