diff --git a/.changelog/9708.txt b/.changelog/9708.txt new file mode 100644 index 00000000000..dac8e66d053 --- /dev/null +++ b/.changelog/9708.txt @@ -0,0 +1,3 @@ +```release-note:bug +servicemanagement: fixed issue in `google_endpoints_service` where an inconsistent plan would be created when certain fields had computed values +``` diff --git a/google/services/servicemanagement/resource_endpoints_service.go b/google/services/servicemanagement/resource_endpoints_service.go index 6c75318c2a8..e21bf18b9e6 100644 --- a/google/services/servicemanagement/resource_endpoints_service.go +++ b/google/services/servicemanagement/resource_endpoints_service.go @@ -159,6 +159,10 @@ func predictServiceId(_ context.Context, d *schema.ResourceDiff, meta interface{ if !d.HasChange("openapi_config") && !d.HasChange("grpc_config") && !d.HasChange("protoc_output_base64") { return nil } + if !d.NewValueKnown("openapi_config") || !d.NewValueKnown("grpc_config") || !d.NewValueKnown("protoc_output_base64") { + d.SetNewComputed("config_id") + return nil + } baseDate := time.Now().Format("2006-01-02") oldConfigId := d.Get("config_id").(string) if match, err := regexp.MatchString(`\d\d\d\d-\d\d-\d\dr\d*`, oldConfigId); !match || err != nil { diff --git a/google/services/servicemanagement/resource_endpoints_service_test.go b/google/services/servicemanagement/resource_endpoints_service_test.go index 561fb6ad603..875ba6e2ea3 100644 --- a/google/services/servicemanagement/resource_endpoints_service_test.go +++ b/google/services/servicemanagement/resource_endpoints_service_test.go @@ -60,6 +60,52 @@ func TestAccEndpointsService_grpc(t *testing.T) { }) } +func TestAccEndpointsService_grpcNotPreComputeConfigIdByGrpcConfig(t *testing.T) { + t.Parallel() + prj := envvar.GetTestProjectFromEnv() + parent := fmt.Sprintf("projects/%s", prj) + serviceId := "tf-test" + acctest.RandString(t, 10) + + acctest.VcrTest(t, resource.TestCase{ + PreCheck: func() { acctest.AccTestPreCheck(t) }, + ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories(t), + CheckDestroy: testAccCheckEndpointServiceDestroyProducer(t), + Steps: []resource.TestStep{ + { + Config: testAccEndpointsService_grpcNotPreComputeConfigIdByGrpcConfig(serviceId, envvar.GetTestProjectFromEnv(), parent, "1"), + Check: testAccCheckEndpointExistsByName(t, serviceId), + }, + { + Config: testAccEndpointsService_grpcNotPreComputeConfigIdByGrpcConfig(serviceId, envvar.GetTestProjectFromEnv(), parent, "2"), + Check: testAccCheckEndpointExistsByName(t, serviceId), + }, + }, + }) +} + +func TestAccEndpointsService_openapiNotPreComputeConfigId(t *testing.T) { + t.Parallel() + prj := envvar.GetTestProjectFromEnv() + parent := fmt.Sprintf("projects/%s", prj) + serviceId := "tf-test" + acctest.RandString(t, 10) + + acctest.VcrTest(t, resource.TestCase{ + PreCheck: func() { acctest.AccTestPreCheck(t) }, + ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories(t), + CheckDestroy: testAccCheckEndpointServiceDestroyProducer(t), + Steps: []resource.TestStep{ + { + Config: testAccEndpointsService_openapiNotPreComputeConfigId(serviceId, envvar.GetTestProjectFromEnv(), parent, "1"), + Check: testAccCheckEndpointExistsByName(t, serviceId), + }, + { + Config: testAccEndpointsService_openapiNotPreComputeConfigId(serviceId, envvar.GetTestProjectFromEnv(), parent, "2"), + Check: testAccCheckEndpointExistsByName(t, serviceId), + }, + }, + }) +} + func testAccEndpointsService_basic(serviceId, project, rev string) string { return fmt.Sprintf(` resource "google_endpoints_service" "endpoints_service" { @@ -131,6 +177,106 @@ EOF `, serviceId, project) } +func testAccEndpointsService_grpcNotPreComputeConfigIdByGrpcConfig(serviceId, project, parent, description string) string { + return fmt.Sprintf(` +resource "google_tags_tag_key" "key1" { + parent = "%[3]s" + short_name = "endpoints-%[1]s-1" + description = "%[4]s" +} + +resource "google_tags_tag_key" "key2" { + parent = "%[3]s" + short_name = "endpoints-%[1]s-2" + lifecycle { + replace_triggered_by = [google_tags_tag_key.key1.description] + } +} + +resource "google_endpoints_service" "endpoints_service" { + service_name = "%[1]s.endpoints.%[2]s.cloud.goog" + project = "%[2]s" + grpc_config = <