Skip to content

Commit eb3388c

Browse files
Fixed issue where ConfigId was erroneously pre-computed when other fields were unknown at plan time (#9708) (#16946)
* Add case of valueUnknown in configId pre-computing * add openapi parameters test [upstream:37b21aabe9e09ada0614411ed558487cae0785fc] Signed-off-by: Modular Magician <[email protected]>
1 parent 150705d commit eb3388c

File tree

3 files changed

+153
-0
lines changed

3 files changed

+153
-0
lines changed

.changelog/9708.txt

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:bug
2+
servicemanagement: fixed issue in `google_endpoints_service` where an inconsistent plan would be created when certain fields had computed values
3+
```

google/services/servicemanagement/resource_endpoints_service.go

+4
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,10 @@ func predictServiceId(_ context.Context, d *schema.ResourceDiff, meta interface{
159159
if !d.HasChange("openapi_config") && !d.HasChange("grpc_config") && !d.HasChange("protoc_output_base64") {
160160
return nil
161161
}
162+
if !d.NewValueKnown("openapi_config") || !d.NewValueKnown("grpc_config") || !d.NewValueKnown("protoc_output_base64") {
163+
d.SetNewComputed("config_id")
164+
return nil
165+
}
162166
baseDate := time.Now().Format("2006-01-02")
163167
oldConfigId := d.Get("config_id").(string)
164168
if match, err := regexp.MatchString(`\d\d\d\d-\d\d-\d\dr\d*`, oldConfigId); !match || err != nil {

google/services/servicemanagement/resource_endpoints_service_test.go

+146
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,52 @@ func TestAccEndpointsService_grpc(t *testing.T) {
6060
})
6161
}
6262

63+
func TestAccEndpointsService_grpcNotPreComputeConfigIdByGrpcConfig(t *testing.T) {
64+
t.Parallel()
65+
prj := envvar.GetTestProjectFromEnv()
66+
parent := fmt.Sprintf("projects/%s", prj)
67+
serviceId := "tf-test" + acctest.RandString(t, 10)
68+
69+
acctest.VcrTest(t, resource.TestCase{
70+
PreCheck: func() { acctest.AccTestPreCheck(t) },
71+
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories(t),
72+
CheckDestroy: testAccCheckEndpointServiceDestroyProducer(t),
73+
Steps: []resource.TestStep{
74+
{
75+
Config: testAccEndpointsService_grpcNotPreComputeConfigIdByGrpcConfig(serviceId, envvar.GetTestProjectFromEnv(), parent, "1"),
76+
Check: testAccCheckEndpointExistsByName(t, serviceId),
77+
},
78+
{
79+
Config: testAccEndpointsService_grpcNotPreComputeConfigIdByGrpcConfig(serviceId, envvar.GetTestProjectFromEnv(), parent, "2"),
80+
Check: testAccCheckEndpointExistsByName(t, serviceId),
81+
},
82+
},
83+
})
84+
}
85+
86+
func TestAccEndpointsService_openapiNotPreComputeConfigId(t *testing.T) {
87+
t.Parallel()
88+
prj := envvar.GetTestProjectFromEnv()
89+
parent := fmt.Sprintf("projects/%s", prj)
90+
serviceId := "tf-test" + acctest.RandString(t, 10)
91+
92+
acctest.VcrTest(t, resource.TestCase{
93+
PreCheck: func() { acctest.AccTestPreCheck(t) },
94+
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories(t),
95+
CheckDestroy: testAccCheckEndpointServiceDestroyProducer(t),
96+
Steps: []resource.TestStep{
97+
{
98+
Config: testAccEndpointsService_openapiNotPreComputeConfigId(serviceId, envvar.GetTestProjectFromEnv(), parent, "1"),
99+
Check: testAccCheckEndpointExistsByName(t, serviceId),
100+
},
101+
{
102+
Config: testAccEndpointsService_openapiNotPreComputeConfigId(serviceId, envvar.GetTestProjectFromEnv(), parent, "2"),
103+
Check: testAccCheckEndpointExistsByName(t, serviceId),
104+
},
105+
},
106+
})
107+
}
108+
63109
func testAccEndpointsService_basic(serviceId, project, rev string) string {
64110
return fmt.Sprintf(`
65111
resource "google_endpoints_service" "endpoints_service" {
@@ -131,6 +177,106 @@ EOF
131177
`, serviceId, project)
132178
}
133179

180+
func testAccEndpointsService_grpcNotPreComputeConfigIdByGrpcConfig(serviceId, project, parent, description string) string {
181+
return fmt.Sprintf(`
182+
resource "google_tags_tag_key" "key1" {
183+
parent = "%[3]s"
184+
short_name = "endpoints-%[1]s-1"
185+
description = "%[4]s"
186+
}
187+
188+
resource "google_tags_tag_key" "key2" {
189+
parent = "%[3]s"
190+
short_name = "endpoints-%[1]s-2"
191+
lifecycle {
192+
replace_triggered_by = [google_tags_tag_key.key1.description]
193+
}
194+
}
195+
196+
resource "google_endpoints_service" "endpoints_service" {
197+
service_name = "%[1]s.endpoints.%[2]s.cloud.goog"
198+
project = "%[2]s"
199+
grpc_config = <<EOF
200+
type: google.api.Service
201+
config_version: 3
202+
name: %[1]s.endpoints.%[2]s.cloud.goog
203+
title: Test ${google_tags_tag_key.key2.namespaced_name}
204+
usage:
205+
rules:
206+
- selector: endpoints.examples.bookstore.Bookstore.ListShelves
207+
allow_unregistered_calls: true
208+
EOF
209+
210+
protoc_output_base64 = filebase64("test-fixtures/test_api_descriptor.pb")
211+
}
212+
`, serviceId, project, parent, description)
213+
}
214+
215+
func testAccEndpointsService_openapiNotPreComputeConfigId(serviceId, project, parent, description string) string {
216+
return fmt.Sprintf(`
217+
resource "google_tags_tag_key" "key1" {
218+
parent = "%[3]s"
219+
short_name = "endpoints-%[1]s-1"
220+
description = "%[4]s"
221+
}
222+
223+
resource "google_tags_tag_key" "key2" {
224+
parent = "%[3]s"
225+
short_name = "endpoints-%[1]s-2"
226+
lifecycle {
227+
replace_triggered_by = [google_tags_tag_key.key1.description]
228+
}
229+
}
230+
resource "google_endpoints_service" "endpoints_service" {
231+
service_name = "%[1]s.endpoints.%[2]s.cloud.goog"
232+
project = "%[2]s"
233+
openapi_config = <<EOF
234+
swagger: "2.0"
235+
info:
236+
description: "${google_tags_tag_key.key2.namespaced_name}"
237+
title: "Endpoints Example, rev. 1"
238+
version: "1.0.0"
239+
host: "%[1]s.endpoints.%[2]s.cloud.goog"
240+
basePath: "/"
241+
consumes:
242+
- "application/json"
243+
produces:
244+
- "application/json"
245+
schemes:
246+
- "https"
247+
paths:
248+
"/echo":
249+
post:
250+
description: "Echo back a given message."
251+
operationId: "echo"
252+
produces:
253+
- "application/json"
254+
responses:
255+
200:
256+
description: "Echo"
257+
schema:
258+
$ref: "#/definitions/echoMessage"
259+
parameters:
260+
- description: "Message to echo"
261+
in: body
262+
name: message
263+
required: true
264+
schema:
265+
$ref: "#/definitions/echoMessage"
266+
security:
267+
- api_key: []
268+
definitions:
269+
echoMessage:
270+
properties:
271+
message:
272+
type: "string"
273+
EOF
274+
275+
}
276+
277+
`, serviceId, project, parent, description)
278+
}
279+
134280
func testAccCheckEndpointExistsByName(t *testing.T, serviceId string) resource.TestCheckFunc {
135281
return func(s *terraform.State) error {
136282
config := acctest.GoogleProviderConfig(t)

0 commit comments

Comments
 (0)