Skip to content

Commit 0ff2db3

Browse files
Add availability domain field to instance and instance template resource (#12566) (#8914)
[upstream:8765b378e648d65db401f302e4ec05a321dcdbf9] Signed-off-by: Modular Magician <[email protected]>
1 parent 11e4df1 commit 0ff2db3

11 files changed

+283
-0
lines changed

.changelog/12566.txt

+3
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-beta/services/compute/compute_instance_helpers.go

+7
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 {
@@ -278,6 +281,7 @@ func flattenScheduling(resp *compute.Scheduling) []map[string]interface{} {
278281
"min_node_cpus": resp.MinNodeCpus,
279282
"provisioning_model": resp.ProvisioningModel,
280283
"instance_termination_action": resp.InstanceTerminationAction,
284+
"availability_domain": resp.AvailabilityDomain,
281285
}
282286

283287
if resp.AutomaticRestart != nil {
@@ -729,6 +733,9 @@ func schedulingHasChangeWithoutReboot(d *schema.ResourceData) bool {
729733
if oScheduling["instance_termination_action"] != newScheduling["instance_termination_action"] {
730734
return true
731735
}
736+
if oScheduling["availability_domain"] != newScheduling["availability_domain"] {
737+
return true
738+
}
732739
if oScheduling["host_error_timeout_seconds"] != newScheduling["host_error_timeout_seconds"] {
733740
return true
734741
}

google-beta/services/compute/resource_compute_instance.go

+7
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.maintenance_interval",
@@ -882,6 +883,12 @@ func ResourceComputeInstance() *schema.Resource {
882883
AtLeastOneOf: schedulingKeys,
883884
Description: `Specifies the action GCE should take when SPOT VM is preempted.`,
884885
},
886+
"availability_domain": {
887+
Type: schema.TypeInt,
888+
Optional: true,
889+
AtLeastOneOf: schedulingKeys,
890+
Description: `Specifies the availability domain, which this instance should be scheduled on.`,
891+
},
885892
"max_run_duration": {
886893
Type: schema.TypeList,
887894
Optional: true,

google-beta/services/compute/resource_compute_instance_template.go

+8
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.maintenance_interval",
@@ -712,6 +713,13 @@ Google Cloud KMS.`,
712713
AtLeastOneOf: schedulingInstTemplateKeys,
713714
Description: `Specifies the action GCE should take when SPOT VM is preempted.`,
714715
},
716+
"availability_domain": {
717+
Type: schema.TypeInt,
718+
Optional: true,
719+
ForceNew: true,
720+
AtLeastOneOf: schedulingInstTemplateKeys,
721+
Description: `Specifies the availability domain, which this instance should be scheduled on.`,
722+
},
715723
"max_run_duration": {
716724
Type: schema.TypeList,
717725
Optional: true,

google-beta/services/compute/resource_compute_instance_template_test.go

+79
Original file line numberDiff line numberDiff line change
@@ -727,6 +727,34 @@ func TestAccComputeInstanceTemplate_instanceResourcePolicies(t *testing.T) {
727727
})
728728
}
729729

730+
func TestAccComputeInstanceTemplate_instanceResourcePoliciesSpread(t *testing.T) {
731+
t.Parallel()
732+
733+
var template compute.InstanceTemplate
734+
var policyName = "tf-test-policy-" + acctest.RandString(t, 10)
735+
736+
acctest.VcrTest(t, resource.TestCase{
737+
PreCheck: func() { acctest.AccTestPreCheck(t) },
738+
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories(t),
739+
CheckDestroy: testAccCheckComputeInstanceTemplateDestroyProducer(t),
740+
Steps: []resource.TestStep{
741+
{
742+
Config: testAccComputeInstanceTemplate_instanceResourcePolicySpread(acctest.RandString(t, 10), policyName),
743+
Check: resource.ComposeTestCheckFunc(
744+
testAccCheckComputeInstanceTemplateExists(t, "google_compute_instance_template.foobar", &template),
745+
testAccCheckComputeInstanceTemplateHasInstanceResourcePolicies(&template, policyName),
746+
testAccCheckComputeInstanceTemplateHasAvailabilityDomain(&template, 3),
747+
),
748+
},
749+
{
750+
ResourceName: "google_compute_instance_template.foobar",
751+
ImportState: true,
752+
ImportStateVerify: true,
753+
},
754+
},
755+
})
756+
}
757+
730758
func TestAccComputeInstanceTemplate_reservationAffinities(t *testing.T) {
731759
t.Parallel()
732760

@@ -2202,6 +2230,15 @@ func testAccCheckComputeInstanceTemplateHasInstanceResourcePolicies(instanceTemp
22022230

22032231
}
22042232

2233+
func testAccCheckComputeInstanceTemplateHasAvailabilityDomain(instanceTemplate *compute.InstanceTemplate, availabilityDomain int64) resource.TestCheckFunc {
2234+
return func(s *terraform.State) error {
2235+
if instanceTemplate.Properties.Scheduling.AvailabilityDomain != availabilityDomain {
2236+
return fmt.Errorf("Expected availability_domain %d, got %d", availabilityDomain, instanceTemplate.Properties.Scheduling.AvailabilityDomain)
2237+
}
2238+
return nil
2239+
}
2240+
}
2241+
22052242
func testAccCheckComputeInstanceTemplateHasReservationAffinity(instanceTemplate *compute.InstanceTemplate, consumeReservationType string, specificReservationNames ...string) resource.TestCheckFunc {
22062243
if len(specificReservationNames) > 1 {
22072244
panic("too many specificReservationNames in test")
@@ -3569,6 +3606,48 @@ resource "google_compute_instance_template" "foobar" {
35693606
`, policyName, suffix)
35703607
}
35713608

3609+
func testAccComputeInstanceTemplate_instanceResourcePolicySpread(suffix string, policyName string) string {
3610+
return fmt.Sprintf(`
3611+
resource "google_compute_resource_policy" "foo" {
3612+
name = "%s"
3613+
region = "us-central1"
3614+
group_placement_policy {
3615+
availability_domain_count = 5
3616+
}
3617+
}
3618+
3619+
data "google_compute_image" "my_image" {
3620+
family = "debian-11"
3621+
project = "debian-cloud"
3622+
}
3623+
3624+
resource "google_compute_instance_template" "foobar" {
3625+
name = "tf-test-instance-template-%s"
3626+
machine_type = "e2-standard-4"
3627+
3628+
disk {
3629+
source_image = data.google_compute_image.my_image.self_link
3630+
auto_delete = true
3631+
boot = true
3632+
}
3633+
3634+
network_interface {
3635+
network = "default"
3636+
}
3637+
3638+
scheduling {
3639+
availability_domain = 3
3640+
}
3641+
3642+
resource_policies = [google_compute_resource_policy.foo.self_link]
3643+
3644+
service_account {
3645+
scopes = ["userinfo-email", "compute-ro", "storage-ro"]
3646+
}
3647+
}
3648+
`, policyName, suffix)
3649+
}
3650+
35723651
func testAccComputeInstanceTemplate_reservationAffinityInstanceTemplate_nonSpecificReservation(templateName, consumeReservationType string) string {
35733652
return fmt.Sprintf(`
35743653
data "google_compute_image" "my_image" {

google-beta/services/compute/resource_compute_instance_test.go

+86
Original file line numberDiff line numberDiff line change
@@ -2986,6 +2986,31 @@ func TestAccComputeInstance_resourcePolicyCollocate(t *testing.T) {
29862986
})
29872987
}
29882988

2989+
func TestAccComputeInstance_resourcePolicySpread(t *testing.T) {
2990+
t.Parallel()
2991+
2992+
instanceName := fmt.Sprintf("tf-test-%s", acctest.RandString(t, 10))
2993+
var instance compute.Instance
2994+
2995+
acctest.VcrTest(t, resource.TestCase{
2996+
PreCheck: func() { acctest.AccTestPreCheck(t) },
2997+
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories(t),
2998+
CheckDestroy: testAccCheckComputeInstanceDestroyProducer(t),
2999+
Steps: []resource.TestStep{
3000+
{
3001+
Config: testAccComputeInstance_resourcePolicySpread(instanceName, acctest.RandString(t, 10)),
3002+
Check: resource.ComposeTestCheckFunc(
3003+
testAccCheckComputeInstanceExists(
3004+
t, "google_compute_instance.foobar", &instance),
3005+
testAccCheckComputeInstanceHasStatus(&instance, "RUNNING"),
3006+
testAccCheckComputeInstanceHasAvailabilityDomain(&instance, 3),
3007+
),
3008+
},
3009+
computeInstanceImportStep("us-east4-b", instanceName, []string{"allow_stopping_for_update"}),
3010+
},
3011+
})
3012+
}
3013+
29893014
func TestAccComputeInstance_subnetworkUpdate(t *testing.T) {
29903015
t.Parallel()
29913016
instanceName := fmt.Sprintf("tf-test-%s", acctest.RandString(t, 10))
@@ -4408,6 +4433,23 @@ func testAccCheckComputeInstanceMaxRunDuration(instance *compute.Instance, insta
44084433
}
44094434
}
44104435

4436+
func testAccCheckComputeInstanceHasAvailabilityDomain(instance *compute.Instance, availabilityDomain int64) resource.TestCheckFunc {
4437+
return func(s *terraform.State) error {
4438+
if instance == nil {
4439+
return fmt.Errorf("instance is nil")
4440+
}
4441+
if instance.Scheduling == nil {
4442+
return fmt.Errorf("no scheduling")
4443+
}
4444+
4445+
if instance.Scheduling.AvailabilityDomain != availabilityDomain {
4446+
return fmt.Errorf("got the wrong availability domain: have %d; want %d", instance.Scheduling.AvailabilityDomain, availabilityDomain)
4447+
}
4448+
4449+
return nil
4450+
}
4451+
}
4452+
44114453
func testAccCheckComputeInstanceLocalSsdRecoveryTimeout(instance *compute.Instance, instanceLocalSsdRecoveryTiemoutWant compute.Duration) resource.TestCheckFunc {
44124454
return func(s *terraform.State) error {
44134455
if instance == nil {
@@ -9309,6 +9351,50 @@ resource "google_compute_resource_policy" "foo" {
93099351
`, instance, instance, suffix)
93109352
}
93119353

9354+
func testAccComputeInstance_resourcePolicySpread(instance, suffix string) string {
9355+
return fmt.Sprintf(`
9356+
data "google_compute_image" "my_image" {
9357+
family = "debian-11"
9358+
project = "debian-cloud"
9359+
}
9360+
9361+
resource "google_compute_instance" "foobar" {
9362+
name = "%s"
9363+
machine_type = "e2-standard-4"
9364+
zone = "us-east4-b"
9365+
can_ip_forward = false
9366+
tags = ["foo", "bar"]
9367+
9368+
//deletion_protection = false is implicit in this config due to default value
9369+
9370+
boot_disk {
9371+
initialize_params {
9372+
image = data.google_compute_image.my_image.self_link
9373+
}
9374+
}
9375+
9376+
network_interface {
9377+
network = "default"
9378+
}
9379+
9380+
scheduling {
9381+
availability_domain = 3
9382+
}
9383+
9384+
resource_policies = [google_compute_resource_policy.foo.self_link]
9385+
}
9386+
9387+
resource "google_compute_resource_policy" "foo" {
9388+
name = "tf-test-policy-%s"
9389+
region = "us-east4"
9390+
group_placement_policy {
9391+
availability_domain_count = 3
9392+
}
9393+
}
9394+
9395+
`, instance, suffix)
9396+
}
9397+
93129398
func testAccComputeInstance_subnetworkUpdate(suffix, instance string) string {
93139399
return fmt.Sprintf(`
93149400
data "google_compute_image" "my_image" {

google-beta/services/compute/resource_compute_region_instance_template.go

+7
Original file line numberDiff line numberDiff line change
@@ -675,6 +675,13 @@ Google Cloud KMS.`,
675675
AtLeastOneOf: schedulingInstTemplateKeys,
676676
Description: `Specifies the action GCE should take when SPOT VM is preempted.`,
677677
},
678+
"availability_domain": {
679+
Type: schema.TypeInt,
680+
Optional: true,
681+
ForceNew: true,
682+
AtLeastOneOf: schedulingInstTemplateKeys,
683+
Description: `Specifies the availability domain, which this instance should be scheduled on.`,
684+
},
678685
"max_run_duration": {
679686
Type: schema.TypeList,
680687
Optional: true,

google-beta/services/compute/resource_compute_region_instance_template_test.go

+80
Original file line numberDiff line numberDiff line change
@@ -605,6 +605,34 @@ func TestAccComputeRegionInstanceTemplate_instanceResourcePolicies(t *testing.T)
605605
})
606606
}
607607

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

@@ -1838,6 +1866,15 @@ func testAccCheckComputeRegionInstanceTemplateHasInstanceResourcePolicies(instan
18381866

18391867
}
18401868

1869+
func testAccCheckComputeRegionInstanceTemplateHasAvailabilityDomain(instanceTemplate *compute.InstanceTemplate, availabilityDomain int64) resource.TestCheckFunc {
1870+
return func(s *terraform.State) error {
1871+
if instanceTemplate.Properties.Scheduling.AvailabilityDomain != availabilityDomain {
1872+
return fmt.Errorf("Expected availability_domain %d, got %d", availabilityDomain, instanceTemplate.Properties.Scheduling.AvailabilityDomain)
1873+
}
1874+
return nil
1875+
}
1876+
}
1877+
18411878
func testAccCheckComputeRegionInstanceTemplateHasReservationAffinity(instanceTemplate *compute.InstanceTemplate, consumeReservationType string, specificReservationNames ...string) resource.TestCheckFunc {
18421879
if len(specificReservationNames) > 1 {
18431880
panic("too many specificReservationNames in test")
@@ -2960,6 +2997,49 @@ resource "google_compute_region_instance_template" "foobar" {
29602997
`, policyName, suffix)
29612998
}
29622999

3000+
func testAccComputeRegionInstanceTemplate_instanceResourcePolicySpread(suffix string, policyName string) string {
3001+
return fmt.Sprintf(`
3002+
resource "google_compute_resource_policy" "foo" {
3003+
name = "%s"
3004+
region = "us-central1"
3005+
group_placement_policy {
3006+
availability_domain_count = 5
3007+
}
3008+
}
3009+
3010+
data "google_compute_image" "my_image" {
3011+
family = "debian-11"
3012+
project = "debian-cloud"
3013+
}
3014+
3015+
resource "google_compute_region_instance_template" "foobar" {
3016+
name = "tf-test-instance-template-%s"
3017+
machine_type = "e2-standard-4"
3018+
region = "us-central1"
3019+
3020+
disk {
3021+
source_image = data.google_compute_image.my_image.self_link
3022+
auto_delete = true
3023+
boot = true
3024+
}
3025+
3026+
network_interface {
3027+
network = "default"
3028+
}
3029+
3030+
scheduling {
3031+
availability_domain = 3
3032+
}
3033+
3034+
resource_policies = [google_compute_resource_policy.foo.self_link]
3035+
3036+
service_account {
3037+
scopes = ["userinfo-email", "compute-ro", "storage-ro"]
3038+
}
3039+
}
3040+
`, policyName, suffix)
3041+
}
3042+
29633043
func testAccComputeRegionInstanceTemplate_reservationAffinityInstanceTemplate_nonSpecificReservation(templateName, consumeReservationType string) string {
29643044
return fmt.Sprintf(`
29653045
data "google_compute_image" "my_image" {

0 commit comments

Comments
 (0)