From bb91762c3e4b45b66be1d616c0840917a0f18294 Mon Sep 17 00:00:00 2001 From: Modular Magician Date: Fri, 22 Dec 2023 00:31:36 +0000 Subject: [PATCH] Add `google_compute_reservation` datasource (#9339) * WIP: initial data source go file * WIP: initial data source creation * WIP: error shows project is required even though its marked as optional * WIP: some attributes are not working as expected * use read function from resource for data source * fix reservationparsingid test * add data source to provider_mmv1_resources handwritten list * remove ParseComputeReservationId function * remove testAccCheckDataSourceComputeReservationDestroy * add google_compute_reservation data source docs * lint fix * Update mmv1/third_party/terraform/website/docs/d/compute_reservation.html.markdown Co-authored-by: Stephen Lewis (Burrows) * simplify data source test * add ReservationIdParsing Test * remove parsing Test --------- Co-authored-by: Stephen Lewis (Burrows) [upstream:8a8ffc3384a59340f47efe97f18611b6672da9bd] Signed-off-by: Modular Magician --- .changelog/9339.txt | 3 + google/provider/provider_mmv1_resources.go | 1 + .../data_source_google_compute_reservation.go | 49 +++++++++++++++ ..._source_google_compute_reservation_test.go | 61 +++++++++++++++++++ .../docs/d/compute_reservation.html.markdown | 30 +++++++++ 5 files changed, 144 insertions(+) create mode 100644 .changelog/9339.txt create mode 100644 google/services/compute/data_source_google_compute_reservation.go create mode 100644 google/services/compute/data_source_google_compute_reservation_test.go create mode 100644 website/docs/d/compute_reservation.html.markdown diff --git a/.changelog/9339.txt b/.changelog/9339.txt new file mode 100644 index 00000000000..ac85c7d00c2 --- /dev/null +++ b/.changelog/9339.txt @@ -0,0 +1,3 @@ +```release-note:new-datasource +`google_compute_reservation` +``` diff --git a/google/provider/provider_mmv1_resources.go b/google/provider/provider_mmv1_resources.go index 4fd96829d5b..dd1840b39d1 100644 --- a/google/provider/provider_mmv1_resources.go +++ b/google/provider/provider_mmv1_resources.go @@ -179,6 +179,7 @@ var handwrittenDatasources = map[string]*schema.Resource{ "google_compute_region_instance_template": compute.DataSourceGoogleComputeRegionInstanceTemplate(), "google_compute_region_network_endpoint_group": compute.DataSourceGoogleComputeRegionNetworkEndpointGroup(), "google_compute_region_ssl_certificate": compute.DataSourceGoogleRegionComputeSslCertificate(), + "google_compute_reservation": compute.DataSourceGoogleComputeReservation(), "google_compute_resource_policy": compute.DataSourceGoogleComputeResourcePolicy(), "google_compute_router": compute.DataSourceGoogleComputeRouter(), "google_compute_router_nat": compute.DataSourceGoogleComputeRouterNat(), diff --git a/google/services/compute/data_source_google_compute_reservation.go b/google/services/compute/data_source_google_compute_reservation.go new file mode 100644 index 00000000000..0ae6c293876 --- /dev/null +++ b/google/services/compute/data_source_google_compute_reservation.go @@ -0,0 +1,49 @@ +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: MPL-2.0 +package compute + +import ( + "fmt" + + "github.com/hashicorp/terraform-provider-google/google/tpgresource" + transport_tpg "github.com/hashicorp/terraform-provider-google/google/transport" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" +) + +func DataSourceGoogleComputeReservation() *schema.Resource { + // Generate datasource schema from resource + dsSchema := tpgresource.DatasourceSchemaFromResourceSchema(ResourceComputeReservation().Schema) + + // Set 'Required' schema elements + tpgresource.AddRequiredFieldsToSchema(dsSchema, "name") + tpgresource.AddRequiredFieldsToSchema(dsSchema, "zone") + + tpgresource.AddOptionalFieldsToSchema(dsSchema, "project") + + return &schema.Resource{ + Read: dataSourceGoogleComputeReservationRead, + Schema: dsSchema, + } +} + +func dataSourceGoogleComputeReservationRead(d *schema.ResourceData, meta interface{}) error { + config := meta.(*transport_tpg.Config) + err := resourceComputeReservationRead(d, meta) + if err != nil { + return err + } + + project, err := tpgresource.GetProject(d, config) + if err != nil { + return err + } + zone, err := tpgresource.GetZone(d, config) + if err != nil { + return err + } + name := d.Get("name").(string) + + d.SetId(fmt.Sprintf("projects/%s/zones/%s/reservations/%s", project, zone, name)) + return nil +} diff --git a/google/services/compute/data_source_google_compute_reservation_test.go b/google/services/compute/data_source_google_compute_reservation_test.go new file mode 100644 index 00000000000..f746f06bdae --- /dev/null +++ b/google/services/compute/data_source_google_compute_reservation_test.go @@ -0,0 +1,61 @@ +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: MPL-2.0 +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: MPL-2.0 +package compute_test + +import ( + "fmt" + "testing" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + "github.com/hashicorp/terraform-provider-google/google/acctest" +) + +func TestAccDataSourceComputeReservation(t *testing.T) { + t.Parallel() + + reservationName := fmt.Sprintf("tf-test-%s", acctest.RandString(t, 10)) + + rsName := "foobar" + dsName := "my_reservation" + rsFullName := fmt.Sprintf("google_compute_reservation.%s", rsName) + dsFullName := fmt.Sprintf("data.google_compute_reservation.%s", dsName) + + acctest.VcrTest(t, resource.TestCase{ + PreCheck: func() { acctest.AccTestPreCheck(t) }, + ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories(t), + CheckDestroy: testAccCheckComputeReservationDestroyProducer(t), + Steps: []resource.TestStep{ + { + Config: testAccDataSourceComputeReservationConfig(reservationName, rsName, dsName), + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttr(dsFullName, "status", "READY"), + acctest.CheckDataSourceStateMatchesResourceState(dsFullName, rsFullName), + ), + }, + }, + }) +} + +func testAccDataSourceComputeReservationConfig(reservationName, rsName, dsName string) string { + return fmt.Sprintf(` +resource "google_compute_reservation" "%s" { + name = "%s" + zone = "us-west1-a" + + specific_reservation { + count = 1 + instance_properties { + min_cpu_platform = "Intel Cascade Lake" + machine_type = "n2-standard-2" + } + } +} + +data "google_compute_reservation" "%s" { + name = google_compute_reservation.%s.name + zone = "us-west1-a" +} +`, rsName, reservationName, dsName, rsName) +} diff --git a/website/docs/d/compute_reservation.html.markdown b/website/docs/d/compute_reservation.html.markdown new file mode 100644 index 00000000000..2e16f0c0dc2 --- /dev/null +++ b/website/docs/d/compute_reservation.html.markdown @@ -0,0 +1,30 @@ +--- +subcategory: "Compute Engine" +description: |- + Provide access to a Reservation's attributes +--- + +# google\_compute\_reservation + +Provides access to available Google Compute Reservation Resources for a given project. +See more about [Reservations of Compute Engine resources](https://cloud.google.com/compute/docs/instances/reservations-overview) in the upstream docs. + +```hcl +data "google_compute_reservation" "reservation" { + name = "gce-reservation" + zone = "us-central1-a" +} + +``` + +## Argument Reference + +The following arguments are supported: + +* `name` (Required) - The name of the Compute Reservation. +* `zone` (Required) - Zone where the Compute Reservation resides. +* `project` (Optional) - Project from which to list the Compute Reservation. Defaults to project declared in the provider. + +## Attributes Reference + +See [google_compute_reservation](https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/compute_reservation) resource for details of the available attributes.