Skip to content

Commit

Permalink
Add instance_termination_action to instance and instance template for…
Browse files Browse the repository at this point in the history
… Spot VM (#6272) (#12105)

Signed-off-by: Modular Magician <magic-modules@google.com>
  • Loading branch information
modular-magician committed Jul 15, 2022
1 parent 84766ca commit 182ace8
Show file tree
Hide file tree
Showing 7 changed files with 66 additions and 4 deletions.
5 changes: 5 additions & 0 deletions .changelog/6272.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
```release-note:enhancement
compute: added `instance_termination_action` field to `google_compute_instance` resource to support Spot VM termination action
```
```release-note:enhancement
compute: added `instance_termination_action` field to `google_compute_instance_template` resource to support Spot VM termination action```
17 changes: 13 additions & 4 deletions google/compute_instance_helpers.go
Original file line number Diff line number Diff line change
Expand Up @@ -122,15 +122,20 @@ func expandScheduling(v interface{}) (*compute.Scheduling, error) {
scheduling.ProvisioningModel = v.(string)
scheduling.ForceSendFields = append(scheduling.ForceSendFields, "ProvisioningModel")
}
if v, ok := original["instance_termination_action"]; ok {
scheduling.InstanceTerminationAction = v.(string)
scheduling.ForceSendFields = append(scheduling.ForceSendFields, "InstanceTerminationAction")
}
return scheduling, nil
}

func flattenScheduling(resp *compute.Scheduling) []map[string]interface{} {
schedulingMap := map[string]interface{}{
"on_host_maintenance": resp.OnHostMaintenance,
"preemptible": resp.Preemptible,
"min_node_cpus": resp.MinNodeCpus,
"provisioning_model": resp.ProvisioningModel,
"on_host_maintenance": resp.OnHostMaintenance,
"preemptible": resp.Preemptible,
"min_node_cpus": resp.MinNodeCpus,
"provisioning_model": resp.ProvisioningModel,
"instance_termination_action": resp.InstanceTerminationAction,
}

if resp.AutomaticRestart != nil {
Expand Down Expand Up @@ -480,6 +485,10 @@ func schedulingHasChangeWithoutReboot(d *schema.ResourceData) bool {
return true
}

if oScheduling["instance_termination_action"] != newScheduling["instance_termination_action"] {
return true
}

return false
}

Expand Down
1 change: 1 addition & 0 deletions google/resource_cgc_snippet_generated_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,7 @@ resource "google_compute_instance" "spot_vm_instance" {
preemptible = true
automatic_restart = false
provisioning_model = "SPOT"
instance_termination_action = "STOP"
}
network_interface {
Expand Down
10 changes: 10 additions & 0 deletions google/resource_compute_instance.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ var (
"scheduling.0.node_affinities",
"scheduling.0.min_node_cpus",
"scheduling.0.provisioning_model",
"scheduling.0.instance_termination_action",
}

shieldedInstanceConfigKeys = []string{
Expand Down Expand Up @@ -595,11 +596,13 @@ func resourceComputeInstance() *schema.Resource {
DiffSuppressFunc: emptyOrDefaultStringSuppress(""),
Description: `Specifies node affinities or anti-affinities to determine which sole-tenant nodes your instances and managed instance groups will use as host systems.`,
},

"min_node_cpus": {
Type: schema.TypeInt,
Optional: true,
AtLeastOneOf: schedulingKeys,
},

"provisioning_model": {
Type: schema.TypeString,
Optional: true,
Expand All @@ -608,6 +611,13 @@ func resourceComputeInstance() *schema.Resource {
AtLeastOneOf: schedulingKeys,
Description: `Whether the instance is spot. If this is set as SPOT.`,
},

"instance_termination_action": {
Type: schema.TypeString,
Optional: true,
AtLeastOneOf: schedulingKeys,
Description: `Specifies the action GCE should take when SPOT VM is preempted.`,
},
},
},
},
Expand Down
7 changes: 7 additions & 0 deletions google/resource_compute_instance_template.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ var (
"scheduling.0.node_affinities",
"scheduling.0.min_node_cpus",
"scheduling.0.provisioning_model",
"scheduling.0.instance_termination_action",
}

shieldedInstanceTemplateConfigKeys = []string{
Expand Down Expand Up @@ -510,6 +511,12 @@ func resourceComputeInstanceTemplate() *schema.Resource {
AtLeastOneOf: schedulingInstTemplateKeys,
Description: `Whether the instance is spot. If this is set as SPOT.`,
},
"instance_termination_action": {
Type: schema.TypeString,
Optional: true,
AtLeastOneOf: schedulingInstTemplateKeys,
Description: `Specifies the action GCE should take when SPOT VM is preempted.`,
},
},
},
},
Expand Down
11 changes: 11 additions & 0 deletions google/resource_compute_instance_template_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1097,6 +1097,7 @@ func TestAccComputeInstanceTemplate_spot(t *testing.T) {
testAccCheckComputeInstanceTemplateAutomaticRestart(&instanceTemplate, false),
testAccCheckComputeInstanceTemplatePreemptible(&instanceTemplate, true),
testAccCheckComputeInstanceTemplateProvisioningModel(&instanceTemplate, "SPOT"),
testAccCheckComputeInstanceTemplateInstanceTerminationAction(&instanceTemplate, "STOP"),
),
},
{
Expand Down Expand Up @@ -1264,6 +1265,15 @@ func testAccCheckComputeInstanceTemplateProvisioningModel(instanceTemplate *comp
}
}

func testAccCheckComputeInstanceTemplateInstanceTerminationAction(instanceTemplate *compute.InstanceTemplate, instance_termination_action string) resource.TestCheckFunc {
return func(s *terraform.State) error {
if instanceTemplate.Properties.Scheduling.InstanceTerminationAction != instance_termination_action {
return fmt.Errorf("Expected instance_termination_action %v, got %v", instance_termination_action, instanceTemplate.Properties.Scheduling.InstanceTerminationAction)
}
return nil
}
}

func testAccCheckComputeInstanceTemplateAutomaticRestart(instanceTemplate *compute.InstanceTemplate, automaticRestart bool) resource.TestCheckFunc {
return func(s *terraform.State) error {
ar := instanceTemplate.Properties.Scheduling.AutomaticRestart
Expand Down Expand Up @@ -2806,6 +2816,7 @@ resource "google_compute_instance_template" "foobar" {
preemptible = true
automatic_restart = false
provisioning_model = "SPOT"
instance_termination_action = "STOP"
}
metadata = {
Expand Down
19 changes: 19 additions & 0 deletions google/resource_compute_instance_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2203,6 +2203,7 @@ func TestAccComputeInstance_spotVM(t *testing.T) {
Check: resource.ComposeTestCheckFunc(
testAccCheckComputeInstanceExists(
t, "google_compute_instance.foobar", &instance),
testAccCheckComputeInstanceTerminationAction(&instance, "STOP"),
),
},
computeInstanceImportStep("us-central1-a", instanceName, []string{}),
Expand Down Expand Up @@ -2558,6 +2559,23 @@ func testAccCheckComputeResourcePolicy(instance *compute.Instance, scheduleName
}
}

func testAccCheckComputeInstanceTerminationAction(instance *compute.Instance, instanceTerminationActionWant string) resource.TestCheckFunc {
return func(s *terraform.State) error {
if instance == nil {
return fmt.Errorf("instance is nil")
}
if instance.Scheduling == nil {
return fmt.Errorf("no scheduling")
}

if instance.Scheduling.InstanceTerminationAction != instanceTerminationActionWant {
return fmt.Errorf("got the wrong instance termniation action: have: %s; want: %s", instance.Scheduling.InstanceTerminationAction, instanceTerminationActionWant)
}

return nil
}
}

func testAccCheckComputeInstanceDisk(instance *compute.Instance, source string, delete bool, boot bool) resource.TestCheckFunc {
return func(s *terraform.State) error {
if instance.Disks == nil {
Expand Down Expand Up @@ -6180,6 +6198,7 @@ resource "google_compute_instance" "foobar" {
provisioning_model = "SPOT"
automatic_restart = false
preemptible = true
instance_termination_action = "STOP"
}
}
Expand Down

0 comments on commit 182ace8

Please sign in to comment.