From eab079d09e72b4a3accef3114da0dfa0ba7c6f27 Mon Sep 17 00:00:00 2001 From: Modular Magician Date: Thu, 20 Oct 2022 19:14:02 +0000 Subject: [PATCH] Adding data source support for google_compute_region_network_endpoint_group (#6663) Signed-off-by: Modular Magician --- .changelog/6663.txt | 3 + ...e_compute_region_network_endpoint_group.go | 59 +++++++++++++++++ ...pute_region_network_endpoint_group_test.go | 63 +++++++++++++++++++ google/field_helpers.go | 4 ++ google/provider.go | 1 + ...egion_network_endpoint_group.html.markdown | 49 +++++++++++++++ 6 files changed, 179 insertions(+) create mode 100644 .changelog/6663.txt create mode 100644 google/data_source_google_compute_region_network_endpoint_group.go create mode 100644 google/data_source_google_compute_region_network_endpoint_group_test.go create mode 100644 website/docs/d/compute_region_network_endpoint_group.html.markdown diff --git a/.changelog/6663.txt b/.changelog/6663.txt new file mode 100644 index 00000000000..e0605753907 --- /dev/null +++ b/.changelog/6663.txt @@ -0,0 +1,3 @@ +```release-note:new-datasource + `google_compute_region_network_endpoint_group` +``` diff --git a/google/data_source_google_compute_region_network_endpoint_group.go b/google/data_source_google_compute_region_network_endpoint_group.go new file mode 100644 index 00000000000..6b52f26cfb4 --- /dev/null +++ b/google/data_source_google_compute_region_network_endpoint_group.go @@ -0,0 +1,59 @@ +package google + +import ( + "errors" + "fmt" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" +) + +func dataSourceGoogleComputeRegionNetworkEndpointGroup() *schema.Resource { + // Generate datasource schema from resource + dsSchema := datasourceSchemaFromResourceSchema(resourceComputeRegionNetworkEndpointGroup().Schema) + + addOptionalFieldsToSchema(dsSchema, "name") + addOptionalFieldsToSchema(dsSchema, "region") + addOptionalFieldsToSchema(dsSchema, "project") + addOptionalFieldsToSchema(dsSchema, "self_link") + + return &schema.Resource{ + Read: dataSourceComputeRegionNetworkEndpointGroupRead, + Schema: dsSchema, + } +} + +func dataSourceComputeRegionNetworkEndpointGroupRead(d *schema.ResourceData, meta interface{}) error { + config := meta.(*Config) + if name, ok := d.GetOk("name"); ok { + project, err := getProject(d, config) + if err != nil { + return err + } + region, err := getRegion(d, config) + if err != nil { + return err + } + + d.SetId(fmt.Sprintf("projects/%s/regions/%s/networkEndpointGroups/%s", project, region, name.(string))) + } else if selfLink, ok := d.GetOk("self_link"); ok { + parsed, err := ParseNetworkEndpointGroupRegionalFieldValue(selfLink.(string), d, config) + if err != nil { + return err + } + if err := d.Set("name", parsed.Name); err != nil { + return fmt.Errorf("Error setting name: %s", err) + } + if err := d.Set("project", parsed.Project); err != nil { + return fmt.Errorf("Error setting project: %s", err) + } + if err := d.Set("region", parsed.Region); err != nil { + return fmt.Errorf("Error setting region: %s", err) + } + + d.SetId(fmt.Sprintf("projects/%s/regions/%s/networkEndpointGroups/%s", parsed.Project, parsed.Region, parsed.Name)) + } else { + return errors.New("Must provide either `self_link` or `region/name`") + } + + return resourceComputeRegionNetworkEndpointGroupRead(d, meta) +} diff --git a/google/data_source_google_compute_region_network_endpoint_group_test.go b/google/data_source_google_compute_region_network_endpoint_group_test.go new file mode 100644 index 00000000000..e454c2d6b03 --- /dev/null +++ b/google/data_source_google_compute_region_network_endpoint_group_test.go @@ -0,0 +1,63 @@ +package google + +import ( + "testing" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" +) + +func TestAccDataSourceRegionNetworkEndpointGroup_basic(t *testing.T) { + t.Parallel() + context := map[string]interface{}{ + "project": getTestProjectFromEnv(), + "region": "us-central1", + "random_suffix": randString(t, 10), + } + + vcrTest(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + Providers: testAccProviders, + Steps: []resource.TestStep{ + { + Config: testAccDataSourceRegionNetworkEndpointGroup_basic(context), + Check: checkDataSourceStateMatchesResourceStateWithIgnores("data.google_compute_region_network_endpoint_group.cloudrun_neg", "google_compute_region_network_endpoint_group.cloudrun_neg", map[string]struct{}{"name": {}, "region": {}}), + }, + }, + }) +} + +func testAccDataSourceRegionNetworkEndpointGroup_basic(context map[string]interface{}) string { + return Nprintf(` + resource "google_compute_region_network_endpoint_group" "cloudrun_neg" { + name = "cloud-run-rneg-%{random_suffix}" + network_endpoint_type = "SERVERLESS" + region = "%{region}" + project = "%{project}" + cloud_run { + service = google_cloud_run_service.cloudrun_neg.name + } + } + + resource "google_cloud_run_service" "cloudrun_neg" { + name = "tf-test-cloudrun-neg%{random_suffix}" + location = "us-central1" + template { + spec { + containers { + image = "us-docker.pkg.dev/cloudrun/container/hello" + } + } + } + + traffic { + percent = 100 + latest_revision = true + } + } + + data "google_compute_region_network_endpoint_group" "cloudrun_neg" { + name = google_compute_region_network_endpoint_group.cloudrun_neg.name + region = "%{region}" + } +`, context) +} diff --git a/google/field_helpers.go b/google/field_helpers.go index 089bd3b29f9..8eaeac04402 100644 --- a/google/field_helpers.go +++ b/google/field_helpers.go @@ -88,6 +88,10 @@ func ParseNetworkEndpointGroupFieldValue(networkEndpointGroup string, d Terrafor return parseZonalFieldValue("networkEndpointGroups", networkEndpointGroup, "project", "zone", d, config, false) } +func ParseNetworkEndpointGroupRegionalFieldValue(networkEndpointGroup string, d TerraformResourceData, config *Config) (*RegionalFieldValue, error) { + return parseRegionalFieldValue("networkEndpointGroups", networkEndpointGroup, "project", "region", "zone", d, config, false) +} + // ------------------------------------------------------------ // Base helpers used to create helpers for specific fields. // ------------------------------------------------------------ diff --git a/google/provider.go b/google/provider.go index bc53c03f590..8475d2330be 100644 --- a/google/provider.go +++ b/google/provider.go @@ -824,6 +824,7 @@ func Provider() *schema.Provider { "google_compute_network_endpoint_group": dataSourceGoogleComputeNetworkEndpointGroup(), "google_compute_node_types": dataSourceGoogleComputeNodeTypes(), "google_compute_regions": dataSourceGoogleComputeRegions(), + "google_compute_region_network_endpoint_group": dataSourceGoogleComputeRegionNetworkEndpointGroup(), "google_compute_region_instance_group": dataSourceGoogleComputeRegionInstanceGroup(), "google_compute_region_ssl_certificate": dataSourceGoogleRegionComputeSslCertificate(), "google_compute_resource_policy": dataSourceGoogleComputeResourcePolicy(), diff --git a/website/docs/d/compute_region_network_endpoint_group.html.markdown b/website/docs/d/compute_region_network_endpoint_group.html.markdown new file mode 100644 index 00000000000..949df4d47d4 --- /dev/null +++ b/website/docs/d/compute_region_network_endpoint_group.html.markdown @@ -0,0 +1,49 @@ +--- +subcategory: "Compute Engine" +page_title: "Google: google_compute_region_network_endpoint_group" +description: |- + Retrieve Region Network Endpoint Group's details. +--- + +# google\_compute\_region\_network\_endpoint\_group + +Use this data source to access a Region Network Endpoint Group's attributes. + +The RNEG may be found by providing either a `self_link`, or a `name` and a `region`. + +## Example Usage + +```hcl +data "google_compute_region_network_endpoint_group" "rneg1" { + name = "k8s1-abcdef01-myns-mysvc-8080-4b6bac43" + region = "us-central1" +} + +data "google_compute_region_network_endpoint_group" "rneg2" { + self_link = "https://www.googleapis.com/compute/v1/projects/myproject/regions/us-central1/networkEndpointGroups/k8s1-abcdef01-myns-mysvc-8080-4b6bac43" +} +``` + +## Argument Reference + +The following arguments are supported: + +* `project` - (Optional) The ID of the project to list versions in. If it is not provided, the provider project is used. + +* `name` - (Optional) The Network Endpoint Group name. Provide either this or a `self_link`. + +* `region` - (Optional) A reference to the region where the Serverless REGs Reside. Provide either this or a `self_link`. + +* `self_link` - (Optional) The Network Endpoint Group self\_link. + +## Attributes Reference + +In addition the arguments listed above, the following attributes are exported: +* `id` - an identifier for the resource with format projects/{{project}}/regions/{{region}}/networkEndpointGroups/{{name}} +* `network` - The network to which all network endpoints in the RNEG belong. +* `subnetwork` - subnetwork to which all network endpoints in the RNEG belong. +* `description` - The RNEG description. +* `network_endpoint_type` - Type of network endpoints in this network endpoint group. +* `psc_target_service` - The target service url used to set up private service connection to a Google API or a PSC Producer Service Attachment. +* `default_port` - The RNEG default port. +* `size` - Number of network endpoints in the network endpoint group.