Skip to content

Commit 7853f97

Browse files
askubistrodge
authored and
Philip Jonany
committed
Add datasource for google_compute_region_instance_group_manager (GoogleCloudPlatform#11720)
Co-authored-by: Thomas Rodgers <[email protected]>
1 parent 601730b commit 7853f97

5 files changed

+304
-0
lines changed

mmv1/third_party/terraform/provider/provider_mmv1_resources.go.erb

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

mmv1/third_party/terraform/tpgresource/field_helpers.go

+3
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,9 @@ func ParseInstanceFieldValue(instance string, d TerraformResourceData, config *t
7474
func ParseInstanceGroupFieldValue(instanceGroup string, d TerraformResourceData, config *transport_tpg.Config) (*ZonalFieldValue, error) {
7575
return ParseZonalFieldValue("instanceGroups", instanceGroup, "project", "zone", d, config, false)
7676
}
77+
func ParseRegionalInstanceGroupManagersFieldValue(instanceGroupManager string, d TerraformResourceData, config *transport_tpg.Config) (*RegionalFieldValue, error) {
78+
return ParseRegionalFieldValue("instanceGroupManagers", instanceGroupManager, "project", "region", "zone", d, config, false)
79+
}
7780

7881
func ParseInstanceTemplateFieldValue(instanceTemplate string, d TerraformResourceData, config *transport_tpg.Config) (*GlobalFieldValue, error) {
7982
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)