Skip to content

Commit e5a066c

Browse files
Add datasource for google_compute_region_instance_group_manager (#11720) (#8259)
[upstream:99c4ab81f01d89af7cb6eb3ade2ad8221663b63f] Signed-off-by: Modular Magician <[email protected]>
1 parent df84ede commit e5a066c

6 files changed

+311
-0
lines changed

Diff for: .changelog/11720.txt

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:new-datasource
2+
`google_compute_region_instance_group_manager`
3+
```

Diff for: google-beta/provider/provider_mmv1_resources.go

+1
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,7 @@ var handwrittenDatasources = map[string]*schema.Resource{
224224
"google_compute_regions": compute.DataSourceGoogleComputeRegions(),
225225
"google_compute_region_disk": compute.DataSourceGoogleComputeRegionDisk(),
226226
"google_compute_region_instance_group": compute.DataSourceGoogleComputeRegionInstanceGroup(),
227+
"google_compute_region_instance_group_manager": compute.DataSourceGoogleComputeRegionInstanceGroupManager(),
227228
"google_compute_region_instance_template": compute.DataSourceGoogleComputeRegionInstanceTemplate(),
228229
"google_compute_region_network_endpoint_group": compute.DataSourceGoogleComputeRegionNetworkEndpointGroup(),
229230
"google_compute_region_ssl_certificate": compute.DataSourceGoogleRegionComputeSslCertificate(),
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
// Copyright (c) HashiCorp, Inc.
2+
// SPDX-License-Identifier: MPL-2.0
3+
package compute
4+
5+
import (
6+
"errors"
7+
"fmt"
8+
9+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
10+
"github.com/hashicorp/terraform-provider-google-beta/google-beta/tpgresource"
11+
transport_tpg "github.com/hashicorp/terraform-provider-google-beta/google-beta/transport"
12+
)
13+
14+
func DataSourceGoogleComputeRegionInstanceGroupManager() *schema.Resource {
15+
16+
dsSchema := tpgresource.DatasourceSchemaFromResourceSchema(ResourceComputeRegionInstanceGroupManager().Schema)
17+
tpgresource.AddOptionalFieldsToSchema(dsSchema, "name", "self_link", "project", "region")
18+
19+
return &schema.Resource{
20+
Read: dataSourceComputeRegionInstanceGroupManagerRead,
21+
Schema: dsSchema,
22+
}
23+
}
24+
25+
func dataSourceComputeRegionInstanceGroupManagerRead(d *schema.ResourceData, meta interface{}) error {
26+
config := meta.(*transport_tpg.Config)
27+
if selfLink, ok := d.Get("self_link").(string); ok && selfLink != "" {
28+
parsed, err := tpgresource.ParseRegionalInstanceGroupManagersFieldValue(selfLink, d, config)
29+
if err != nil {
30+
return fmt.Errorf("InstanceGroup name, region or project could not be parsed from %s: %v", selfLink, err)
31+
}
32+
if err := d.Set("name", parsed.Name); err != nil {
33+
return fmt.Errorf("Error setting name: %s", err)
34+
}
35+
if err := d.Set("region", parsed.Region); err != nil {
36+
return fmt.Errorf("Error setting region: %s", err)
37+
}
38+
if err := d.Set("project", parsed.Project); err != nil {
39+
return fmt.Errorf("Error setting project: %s", err)
40+
}
41+
d.SetId(fmt.Sprintf("projects/%s/regions/%s/instanceGroupManagers/%s", parsed.Project, parsed.Region, parsed.Name))
42+
} else if name, ok := d.Get("name").(string); ok && name != "" {
43+
region, err := tpgresource.GetRegion(d, config)
44+
if err != nil {
45+
return err
46+
}
47+
project, err := tpgresource.GetProject(d, config)
48+
if err != nil {
49+
return err
50+
}
51+
d.SetId(fmt.Sprintf("projects/%s/regions/%s/instanceGroupManagers/%s", project, region, name))
52+
} else {
53+
return errors.New("Must provide either `self_link` or `region/name`")
54+
}
55+
56+
err := resourceComputeRegionInstanceGroupManagerRead(d, meta)
57+
58+
if err != nil {
59+
return err
60+
}
61+
if d.Id() == "" {
62+
return errors.New("Regional Instance Manager Group not found")
63+
}
64+
return nil
65+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,201 @@
1+
// Copyright (c) HashiCorp, Inc.
2+
// SPDX-License-Identifier: MPL-2.0
3+
package compute_test
4+
5+
import (
6+
"testing"
7+
8+
"github.com/hashicorp/terraform-plugin-testing/helper/resource"
9+
"github.com/hashicorp/terraform-provider-google-beta/google-beta/acctest"
10+
"github.com/hashicorp/terraform-provider-google-beta/google-beta/envvar"
11+
)
12+
13+
func TestAccDataSourceGoogleComputeRegionInstanceGroupManager(t *testing.T) {
14+
t.Parallel()
15+
16+
regionName := "us-central1"
17+
igmName := "tf-test-igm" + acctest.RandString(t, 6)
18+
19+
context := map[string]interface{}{
20+
"regionName": regionName,
21+
"igmName": igmName,
22+
"baseName": "tf-test-igm-base" + acctest.RandString(t, 6),
23+
"poolName": "tf-test-pool" + acctest.RandString(t, 6),
24+
"templateName": "tf-test-templt" + acctest.RandString(t, 6),
25+
"autoHealName": "tf-test-ah-name" + acctest.RandString(t, 6),
26+
}
27+
28+
acctest.VcrTest(t, resource.TestCase{
29+
PreCheck: func() { acctest.AccTestPreCheck(t) },
30+
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories(t),
31+
Steps: []resource.TestStep{
32+
{
33+
Config: testAccDataSourceGoogleComputeRegionInstanceGroupManager_usingSelfLink(context),
34+
Check: resource.ComposeTestCheckFunc(
35+
resource.TestCheckResourceAttr("data.google_compute_region_instance_group_manager.data_source", "project", envvar.GetTestProjectFromEnv()),
36+
resource.TestCheckResourceAttr("data.google_compute_region_instance_group_manager.data_source", "region", regionName),
37+
resource.TestCheckResourceAttr("data.google_compute_region_instance_group_manager.data_source", "name", igmName)),
38+
},
39+
{
40+
Config: testAccDataSourceGoogleComputeRegionInstanceGroupManager_usingNameAndRegion(context),
41+
Check: resource.ComposeTestCheckFunc(
42+
resource.TestCheckResourceAttr("data.google_compute_region_instance_group_manager.data_source", "project", envvar.GetTestProjectFromEnv()),
43+
resource.TestCheckResourceAttr("data.google_compute_region_instance_group_manager.data_source", "region", regionName),
44+
resource.TestCheckResourceAttr("data.google_compute_region_instance_group_manager.data_source", "name", igmName)),
45+
},
46+
},
47+
})
48+
}
49+
50+
func testAccDataSourceGoogleComputeRegionInstanceGroupManager_usingSelfLink(context map[string]interface{}) string {
51+
return acctest.Nprintf(`
52+
resource "google_compute_health_check" "autohealing" {
53+
name = "%{autoHealName}"
54+
check_interval_sec = 5
55+
timeout_sec = 5
56+
healthy_threshold = 2
57+
unhealthy_threshold = 10 # 50 seconds
58+
59+
http_health_check {
60+
request_path = "/healthz"
61+
port = "8080"
62+
}
63+
}
64+
65+
resource "google_compute_region_instance_group_manager" "appserver" {
66+
name = "%{igmName}"
67+
base_instance_name = "%{baseName}"
68+
region = "us-central1"
69+
70+
version {
71+
instance_template = google_compute_instance_template.igm-basic.id
72+
name = "primary"
73+
}
74+
75+
target_pools = [google_compute_target_pool.igm-basic.id]
76+
target_size = 2
77+
78+
named_port {
79+
name = "customhttp"
80+
port = 8888
81+
}
82+
83+
auto_healing_policies {
84+
health_check = google_compute_health_check.autohealing.id
85+
initial_delay_sec = 300
86+
}
87+
}
88+
89+
data "google_compute_region_instance_group_manager" "data_source" {
90+
self_link = google_compute_region_instance_group_manager.appserver.instance_group
91+
}
92+
93+
resource "google_compute_target_pool" "igm-basic" {
94+
description = "Resource created for Terraform acceptance testing"
95+
name = "%{poolName}"
96+
session_affinity = "CLIENT_IP_PROTO"
97+
}
98+
99+
data "google_compute_image" "my_image" {
100+
family = "debian-11"
101+
project = "debian-cloud"
102+
}
103+
104+
resource "google_compute_instance_template" "igm-basic" {
105+
name = "%{templateName}"
106+
machine_type = "e2-medium"
107+
can_ip_forward = false
108+
tags = ["foo", "bar"]
109+
110+
disk {
111+
source_image = data.google_compute_image.my_image.self_link
112+
auto_delete = true
113+
boot = true
114+
}
115+
116+
network_interface {
117+
network = "default"
118+
}
119+
120+
service_account {
121+
scopes = ["userinfo-email", "compute-ro", "storage-ro"]
122+
}
123+
}`, context)
124+
}
125+
126+
func testAccDataSourceGoogleComputeRegionInstanceGroupManager_usingNameAndRegion(context map[string]interface{}) string {
127+
return acctest.Nprintf(`
128+
resource "google_compute_health_check" "autohealing" {
129+
name = "%{autoHealName}"
130+
check_interval_sec = 5
131+
timeout_sec = 5
132+
healthy_threshold = 2
133+
unhealthy_threshold = 10 # 50 seconds
134+
135+
http_health_check {
136+
request_path = "/healthz"
137+
port = "8080"
138+
}
139+
}
140+
141+
resource "google_compute_region_instance_group_manager" "appserver" {
142+
name = "%{igmName}"
143+
base_instance_name = "%{baseName}"
144+
region = "us-central1"
145+
146+
version {
147+
instance_template = google_compute_instance_template.igm-basic.id
148+
name = "primary"
149+
}
150+
151+
target_pools = [google_compute_target_pool.igm-basic.id]
152+
target_size = 2
153+
154+
named_port {
155+
name = "customhttp"
156+
port = 8888
157+
}
158+
159+
auto_healing_policies {
160+
health_check = google_compute_health_check.autohealing.id
161+
initial_delay_sec = 300
162+
}
163+
}
164+
165+
data "google_compute_region_instance_group_manager" "data_source" {
166+
name = "%{igmName}"
167+
region = "us-central1"
168+
}
169+
170+
resource "google_compute_target_pool" "igm-basic" {
171+
description = "Resource created for Terraform acceptance testing"
172+
name = "%{poolName}"
173+
session_affinity = "CLIENT_IP_PROTO"
174+
}
175+
176+
data "google_compute_image" "my_image" {
177+
family = "debian-11"
178+
project = "debian-cloud"
179+
}
180+
181+
resource "google_compute_instance_template" "igm-basic" {
182+
name = "%{templateName}"
183+
machine_type = "e2-medium"
184+
can_ip_forward = false
185+
tags = ["foo", "bar"]
186+
187+
disk {
188+
source_image = data.google_compute_image.my_image.self_link
189+
auto_delete = true
190+
boot = true
191+
}
192+
193+
network_interface {
194+
network = "default"
195+
}
196+
197+
service_account {
198+
scopes = ["userinfo-email", "compute-ro", "storage-ro"]
199+
}
200+
}`, context)
201+
}

Diff for: google-beta/tpgresource/field_helpers.go

+3
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,9 @@ func ParseInstanceFieldValue(instance string, d TerraformResourceData, config *t
7676
func ParseInstanceGroupFieldValue(instanceGroup string, d TerraformResourceData, config *transport_tpg.Config) (*ZonalFieldValue, error) {
7777
return ParseZonalFieldValue("instanceGroups", instanceGroup, "project", "zone", d, config, false)
7878
}
79+
func ParseRegionalInstanceGroupManagersFieldValue(instanceGroupManager string, d TerraformResourceData, config *transport_tpg.Config) (*RegionalFieldValue, error) {
80+
return ParseRegionalFieldValue("instanceGroupManagers", instanceGroupManager, "project", "region", "zone", d, config, false)
81+
}
7982

8083
func ParseInstanceTemplateFieldValue(instanceTemplate string, d TerraformResourceData, config *transport_tpg.Config) (*GlobalFieldValue, error) {
8184
return ParseGlobalFieldValue("instanceTemplates", instanceTemplate, "project", d, config, false)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
subcategory: "Compute Engine"
2+
page_title: "Google: google_compute_region_instance_group_manager"
3+
description: |-
4+
Get a Compute Region Instance Group within GCE.
5+
---
6+
7+
# google\_compute\_region\_instance\_group\_manager
8+
9+
Get a Compute Region Instance Group Manager within GCE.
10+
For more information, see [the official documentation](https://cloud.google.com/compute/docs/instance-groups/distributing-instances-with-regional-instance-groups)
11+
and [API](https://cloud.google.com/compute/docs/reference/rest/v1/regionInstanceGroupManagers)
12+
13+
## Example Usage
14+
15+
```hcl
16+
data "google_compute_region_instance_group_manager" "rigm" {
17+
name = "my-igm"
18+
region = "us-central1"
19+
}
20+
```
21+
22+
## Argument Reference
23+
24+
The following arguments are supported:
25+
26+
* `self_link` - (Optional) The self link of the instance group. Either `name` or `self_link` must be provided.
27+
28+
* `name` - (Optional) The name of the instance group. Either `name` or `self_link` must be provided.
29+
30+
* `project` - (Optional) The ID of the project in which the resource belongs. If it is not provided, the provider project is used.
31+
32+
* `Region` - (Optional) The region where the managed instance group resides. If not provided, the provider region is used.
33+
34+
---
35+
36+
## Attributes Reference
37+
38+
See [google_compute_region_instance_group_manager](https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/compute_region_instance_group_manager) resource for details of all the available attributes.

0 commit comments

Comments
 (0)