Skip to content

Commit da264d3

Browse files
Add availability domain field to instance and instance template resource (#12566) (#20694)
[upstream:8765b378e648d65db401f302e4ec05a321dcdbf9] Signed-off-by: Modular Magician <magic-modules@google.com>
1 parent 70d9c1d commit da264d3

11 files changed

+283
-0
lines changed

.changelog/12566.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:enhancement
2+
compute: added `availability_domain` field to `google_compute_instance`, `google_compute_instance_template` and `google_compute_region_instance_template` resources.
3+
```

google/services/compute/compute_instance_helpers.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,9 @@ func expandScheduling(v interface{}) (*compute.Scheduling, error) {
144144
scheduling.InstanceTerminationAction = v.(string)
145145
scheduling.ForceSendFields = append(scheduling.ForceSendFields, "InstanceTerminationAction")
146146
}
147+
if v, ok := original["availability_domain"]; ok && v != nil {
148+
scheduling.AvailabilityDomain = int64(v.(int))
149+
}
147150
if v, ok := original["max_run_duration"]; ok {
148151
transformedMaxRunDuration, err := expandComputeMaxRunDuration(v)
149152
if err != nil {
@@ -264,6 +267,7 @@ func flattenScheduling(resp *compute.Scheduling) []map[string]interface{} {
264267
"min_node_cpus": resp.MinNodeCpus,
265268
"provisioning_model": resp.ProvisioningModel,
266269
"instance_termination_action": resp.InstanceTerminationAction,
270+
"availability_domain": resp.AvailabilityDomain,
267271
}
268272

269273
if resp.AutomaticRestart != nil {
@@ -681,6 +685,9 @@ func schedulingHasChangeWithoutReboot(d *schema.ResourceData) bool {
681685
if oScheduling["instance_termination_action"] != newScheduling["instance_termination_action"] {
682686
return true
683687
}
688+
if oScheduling["availability_domain"] != newScheduling["availability_domain"] {
689+
return true
690+
}
684691

685692
return false
686693
}

google/services/compute/resource_compute_instance.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ var (
9292
"scheduling.0.min_node_cpus",
9393
"scheduling.0.provisioning_model",
9494
"scheduling.0.instance_termination_action",
95+
"scheduling.0.availability_domain",
9596
"scheduling.0.max_run_duration",
9697
"scheduling.0.on_instance_stop_action",
9798
"scheduling.0.local_ssd_recovery_timeout",
@@ -846,6 +847,12 @@ func ResourceComputeInstance() *schema.Resource {
846847
AtLeastOneOf: schedulingKeys,
847848
Description: `Specifies the action GCE should take when SPOT VM is preempted.`,
848849
},
850+
"availability_domain": {
851+
Type: schema.TypeInt,
852+
Optional: true,
853+
AtLeastOneOf: schedulingKeys,
854+
Description: `Specifies the availability domain, which this instance should be scheduled on.`,
855+
},
849856
"max_run_duration": {
850857
Type: schema.TypeList,
851858
Optional: true,

google/services/compute/resource_compute_instance_template.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ var (
3131
"scheduling.0.min_node_cpus",
3232
"scheduling.0.provisioning_model",
3333
"scheduling.0.instance_termination_action",
34+
"scheduling.0.availability_domain",
3435
"scheduling.0.max_run_duration",
3536
"scheduling.0.on_instance_stop_action",
3637
"scheduling.0.local_ssd_recovery_timeout",
@@ -686,6 +687,13 @@ Google Cloud KMS.`,
686687
AtLeastOneOf: schedulingInstTemplateKeys,
687688
Description: `Specifies the action GCE should take when SPOT VM is preempted.`,
688689
},
690+
"availability_domain": {
691+
Type: schema.TypeInt,
692+
Optional: true,
693+
ForceNew: true,
694+
AtLeastOneOf: schedulingInstTemplateKeys,
695+
Description: `Specifies the availability domain, which this instance should be scheduled on.`,
696+
},
689697
"max_run_duration": {
690698
Type: schema.TypeList,
691699
Optional: true,

google/services/compute/resource_compute_instance_template_test.go

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -652,6 +652,34 @@ func TestAccComputeInstanceTemplate_instanceResourcePolicies(t *testing.T) {
652652
})
653653
}
654654

655+
func TestAccComputeInstanceTemplate_instanceResourcePoliciesSpread(t *testing.T) {
656+
t.Parallel()
657+
658+
var template compute.InstanceTemplate
659+
var policyName = "tf-test-policy-" + acctest.RandString(t, 10)
660+
661+
acctest.VcrTest(t, resource.TestCase{
662+
PreCheck: func() { acctest.AccTestPreCheck(t) },
663+
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories(t),
664+
CheckDestroy: testAccCheckComputeInstanceTemplateDestroyProducer(t),
665+
Steps: []resource.TestStep{
666+
{
667+
Config: testAccComputeInstanceTemplate_instanceResourcePolicySpread(acctest.RandString(t, 10), policyName),
668+
Check: resource.ComposeTestCheckFunc(
669+
testAccCheckComputeInstanceTemplateExists(t, "google_compute_instance_template.foobar", &template),
670+
testAccCheckComputeInstanceTemplateHasInstanceResourcePolicies(&template, policyName),
671+
testAccCheckComputeInstanceTemplateHasAvailabilityDomain(&template, 3),
672+
),
673+
},
674+
{
675+
ResourceName: "google_compute_instance_template.foobar",
676+
ImportState: true,
677+
ImportStateVerify: true,
678+
},
679+
},
680+
})
681+
}
682+
655683
func TestAccComputeInstanceTemplate_reservationAffinities(t *testing.T) {
656684
t.Parallel()
657685

@@ -1985,6 +2013,15 @@ func testAccCheckComputeInstanceTemplateHasInstanceResourcePolicies(instanceTemp
19852013

19862014
}
19872015

2016+
func testAccCheckComputeInstanceTemplateHasAvailabilityDomain(instanceTemplate *compute.InstanceTemplate, availabilityDomain int64) resource.TestCheckFunc {
2017+
return func(s *terraform.State) error {
2018+
if instanceTemplate.Properties.Scheduling.AvailabilityDomain != availabilityDomain {
2019+
return fmt.Errorf("Expected availability_domain %d, got %d", availabilityDomain, instanceTemplate.Properties.Scheduling.AvailabilityDomain)
2020+
}
2021+
return nil
2022+
}
2023+
}
2024+
19882025
func testAccCheckComputeInstanceTemplateHasReservationAffinity(instanceTemplate *compute.InstanceTemplate, consumeReservationType string, specificReservationNames ...string) resource.TestCheckFunc {
19892026
if len(specificReservationNames) > 1 {
19902027
panic("too many specificReservationNames in test")
@@ -3266,6 +3303,48 @@ resource "google_compute_instance_template" "foobar" {
32663303
`, policyName, suffix)
32673304
}
32683305

3306+
func testAccComputeInstanceTemplate_instanceResourcePolicySpread(suffix string, policyName string) string {
3307+
return fmt.Sprintf(`
3308+
resource "google_compute_resource_policy" "foo" {
3309+
name = "%s"
3310+
region = "us-central1"
3311+
group_placement_policy {
3312+
availability_domain_count = 5
3313+
}
3314+
}
3315+
3316+
data "google_compute_image" "my_image" {
3317+
family = "debian-11"
3318+
project = "debian-cloud"
3319+
}
3320+
3321+
resource "google_compute_instance_template" "foobar" {
3322+
name = "tf-test-instance-template-%s"
3323+
machine_type = "e2-standard-4"
3324+
3325+
disk {
3326+
source_image = data.google_compute_image.my_image.self_link
3327+
auto_delete = true
3328+
boot = true
3329+
}
3330+
3331+
network_interface {
3332+
network = "default"
3333+
}
3334+
3335+
scheduling {
3336+
availability_domain = 3
3337+
}
3338+
3339+
resource_policies = [google_compute_resource_policy.foo.self_link]
3340+
3341+
service_account {
3342+
scopes = ["userinfo-email", "compute-ro", "storage-ro"]
3343+
}
3344+
}
3345+
`, policyName, suffix)
3346+
}
3347+
32693348
func testAccComputeInstanceTemplate_reservationAffinityInstanceTemplate_nonSpecificReservation(templateName, consumeReservationType string) string {
32703349
return fmt.Sprintf(`
32713350
data "google_compute_image" "my_image" {

google/services/compute/resource_compute_instance_test.go

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2909,6 +2909,31 @@ func TestAccComputeInstance_resourcePolicyCollocate(t *testing.T) {
29092909
})
29102910
}
29112911

2912+
func TestAccComputeInstance_resourcePolicySpread(t *testing.T) {
2913+
t.Parallel()
2914+
2915+
instanceName := fmt.Sprintf("tf-test-%s", acctest.RandString(t, 10))
2916+
var instance compute.Instance
2917+
2918+
acctest.VcrTest(t, resource.TestCase{
2919+
PreCheck: func() { acctest.AccTestPreCheck(t) },
2920+
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories(t),
2921+
CheckDestroy: testAccCheckComputeInstanceDestroyProducer(t),
2922+
Steps: []resource.TestStep{
2923+
{
2924+
Config: testAccComputeInstance_resourcePolicySpread(instanceName, acctest.RandString(t, 10)),
2925+
Check: resource.ComposeTestCheckFunc(
2926+
testAccCheckComputeInstanceExists(
2927+
t, "google_compute_instance.foobar", &instance),
2928+
testAccCheckComputeInstanceHasStatus(&instance, "RUNNING"),
2929+
testAccCheckComputeInstanceHasAvailabilityDomain(&instance, 3),
2930+
),
2931+
},
2932+
computeInstanceImportStep("us-east4-b", instanceName, []string{"allow_stopping_for_update"}),
2933+
},
2934+
})
2935+
}
2936+
29122937
func TestAccComputeInstance_subnetworkUpdate(t *testing.T) {
29132938
t.Parallel()
29142939
instanceName := fmt.Sprintf("tf-test-%s", acctest.RandString(t, 10))
@@ -3843,6 +3868,23 @@ func testAccCheckComputeInstanceMaxRunDuration(instance *compute.Instance, insta
38433868
}
38443869
}
38453870

3871+
func testAccCheckComputeInstanceHasAvailabilityDomain(instance *compute.Instance, availabilityDomain int64) resource.TestCheckFunc {
3872+
return func(s *terraform.State) error {
3873+
if instance == nil {
3874+
return fmt.Errorf("instance is nil")
3875+
}
3876+
if instance.Scheduling == nil {
3877+
return fmt.Errorf("no scheduling")
3878+
}
3879+
3880+
if instance.Scheduling.AvailabilityDomain != availabilityDomain {
3881+
return fmt.Errorf("got the wrong availability domain: have %d; want %d", instance.Scheduling.AvailabilityDomain, availabilityDomain)
3882+
}
3883+
3884+
return nil
3885+
}
3886+
}
3887+
38463888
func testAccCheckComputeInstanceLocalSsdRecoveryTimeout(instance *compute.Instance, instanceLocalSsdRecoveryTiemoutWant compute.Duration) resource.TestCheckFunc {
38473889
return func(s *terraform.State) error {
38483890
if instance == nil {
@@ -8587,6 +8629,50 @@ resource "google_compute_resource_policy" "foo" {
85878629
`, instance, instance, suffix)
85888630
}
85898631

8632+
func testAccComputeInstance_resourcePolicySpread(instance, suffix string) string {
8633+
return fmt.Sprintf(`
8634+
data "google_compute_image" "my_image" {
8635+
family = "debian-11"
8636+
project = "debian-cloud"
8637+
}
8638+
8639+
resource "google_compute_instance" "foobar" {
8640+
name = "%s"
8641+
machine_type = "e2-standard-4"
8642+
zone = "us-east4-b"
8643+
can_ip_forward = false
8644+
tags = ["foo", "bar"]
8645+
8646+
//deletion_protection = false is implicit in this config due to default value
8647+
8648+
boot_disk {
8649+
initialize_params {
8650+
image = data.google_compute_image.my_image.self_link
8651+
}
8652+
}
8653+
8654+
network_interface {
8655+
network = "default"
8656+
}
8657+
8658+
scheduling {
8659+
availability_domain = 3
8660+
}
8661+
8662+
resource_policies = [google_compute_resource_policy.foo.self_link]
8663+
}
8664+
8665+
resource "google_compute_resource_policy" "foo" {
8666+
name = "tf-test-policy-%s"
8667+
region = "us-east4"
8668+
group_placement_policy {
8669+
availability_domain_count = 3
8670+
}
8671+
}
8672+
8673+
`, instance, suffix)
8674+
}
8675+
85908676
func testAccComputeInstance_subnetworkUpdate(suffix, instance string) string {
85918677
return fmt.Sprintf(`
85928678
data "google_compute_image" "my_image" {

google/services/compute/resource_compute_region_instance_template.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -659,6 +659,13 @@ Google Cloud KMS.`,
659659
AtLeastOneOf: schedulingInstTemplateKeys,
660660
Description: `Specifies the action GCE should take when SPOT VM is preempted.`,
661661
},
662+
"availability_domain": {
663+
Type: schema.TypeInt,
664+
Optional: true,
665+
ForceNew: true,
666+
AtLeastOneOf: schedulingInstTemplateKeys,
667+
Description: `Specifies the availability domain, which this instance should be scheduled on.`,
668+
},
662669
"max_run_duration": {
663670
Type: schema.TypeList,
664671
Optional: true,

google/services/compute/resource_compute_region_instance_template_test.go

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -604,6 +604,34 @@ func TestAccComputeRegionInstanceTemplate_instanceResourcePolicies(t *testing.T)
604604
})
605605
}
606606

607+
func TestAccComputeRegionInstanceTemplate_instanceResourcePoliciesSpread(t *testing.T) {
608+
t.Parallel()
609+
610+
var template compute.InstanceTemplate
611+
var policyName = "tf-test-policy-" + acctest.RandString(t, 10)
612+
613+
acctest.VcrTest(t, resource.TestCase{
614+
PreCheck: func() { acctest.AccTestPreCheck(t) },
615+
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories(t),
616+
CheckDestroy: testAccCheckComputeRegionInstanceTemplateDestroyProducer(t),
617+
Steps: []resource.TestStep{
618+
{
619+
Config: testAccComputeRegionInstanceTemplate_instanceResourcePolicySpread(acctest.RandString(t, 10), policyName),
620+
Check: resource.ComposeTestCheckFunc(
621+
testAccCheckComputeRegionInstanceTemplateExists(t, "google_compute_region_instance_template.foobar", &template),
622+
testAccCheckComputeRegionInstanceTemplateHasInstanceResourcePolicies(&template, policyName),
623+
testAccCheckComputeRegionInstanceTemplateHasAvailabilityDomain(&template, 3),
624+
),
625+
},
626+
{
627+
ResourceName: "google_compute_region_instance_template.foobar",
628+
ImportState: true,
629+
ImportStateVerify: true,
630+
},
631+
},
632+
})
633+
}
634+
607635
func TestAccComputeRegionInstanceTemplate_reservationAffinities(t *testing.T) {
608636
t.Parallel()
609637

@@ -1706,6 +1734,15 @@ func testAccCheckComputeRegionInstanceTemplateHasInstanceResourcePolicies(instan
17061734

17071735
}
17081736

1737+
func testAccCheckComputeRegionInstanceTemplateHasAvailabilityDomain(instanceTemplate *compute.InstanceTemplate, availabilityDomain int64) resource.TestCheckFunc {
1738+
return func(s *terraform.State) error {
1739+
if instanceTemplate.Properties.Scheduling.AvailabilityDomain != availabilityDomain {
1740+
return fmt.Errorf("Expected availability_domain %d, got %d", availabilityDomain, instanceTemplate.Properties.Scheduling.AvailabilityDomain)
1741+
}
1742+
return nil
1743+
}
1744+
}
1745+
17091746
func testAccCheckComputeRegionInstanceTemplateHasReservationAffinity(instanceTemplate *compute.InstanceTemplate, consumeReservationType string, specificReservationNames ...string) resource.TestCheckFunc {
17101747
if len(specificReservationNames) > 1 {
17111748
panic("too many specificReservationNames in test")
@@ -2783,6 +2820,49 @@ resource "google_compute_region_instance_template" "foobar" {
27832820
`, policyName, suffix)
27842821
}
27852822

2823+
func testAccComputeRegionInstanceTemplate_instanceResourcePolicySpread(suffix string, policyName string) string {
2824+
return fmt.Sprintf(`
2825+
resource "google_compute_resource_policy" "foo" {
2826+
name = "%s"
2827+
region = "us-central1"
2828+
group_placement_policy {
2829+
availability_domain_count = 5
2830+
}
2831+
}
2832+
2833+
data "google_compute_image" "my_image" {
2834+
family = "debian-11"
2835+
project = "debian-cloud"
2836+
}
2837+
2838+
resource "google_compute_region_instance_template" "foobar" {
2839+
name = "tf-test-instance-template-%s"
2840+
machine_type = "e2-standard-4"
2841+
region = "us-central1"
2842+
2843+
disk {
2844+
source_image = data.google_compute_image.my_image.self_link
2845+
auto_delete = true
2846+
boot = true
2847+
}
2848+
2849+
network_interface {
2850+
network = "default"
2851+
}
2852+
2853+
scheduling {
2854+
availability_domain = 3
2855+
}
2856+
2857+
resource_policies = [google_compute_resource_policy.foo.self_link]
2858+
2859+
service_account {
2860+
scopes = ["userinfo-email", "compute-ro", "storage-ro"]
2861+
}
2862+
}
2863+
`, policyName, suffix)
2864+
}
2865+
27862866
func testAccComputeRegionInstanceTemplate_reservationAffinityInstanceTemplate_nonSpecificReservation(templateName, consumeReservationType string) string {
27872867
return fmt.Sprintf(`
27882868
data "google_compute_image" "my_image" {

0 commit comments

Comments
 (0)