Skip to content

Commit 1201312

Browse files
modular-magicianTimofey Yushchenko
andauthored
Add support for Resource Policies resource in Instance Template (#7235) (#5182)
Signed-off-by: Modular Magician <[email protected]> Co-authored-by: Timofey Yushchenko <[email protected]>
1 parent 0d0d49e commit 1201312

File tree

4 files changed

+116
-4
lines changed

4 files changed

+116
-4
lines changed

.changelog/7235.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 `resource_policies` field to `google_compute_instance_template`
3+
```

google-beta/resource_compute_instance_template.go

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -827,6 +827,18 @@ be from 0 to 999,999,999 inclusive.`,
827827
Description: `A set of key/value label pairs to assign to instances created from this template,`,
828828
},
829829

830+
"resource_policies": {
831+
Type: schema.TypeList,
832+
Optional: true,
833+
ForceNew: true,
834+
MaxItems: 1,
835+
Description: `A list of self_links of resource policies to attach to the instance. Currently a max of 1 resource policy is supported.`,
836+
Elem: &schema.Schema{
837+
Type: schema.TypeString,
838+
DiffSuppressFunc: compareResourceNames,
839+
},
840+
},
841+
830842
"reservation_affinity": {
831843
Type: schema.TypeList,
832844
MaxItems: 1,
@@ -1066,7 +1078,7 @@ func buildDisks(d *schema.ResourceData, config *Config) ([]*compute.AttachedDisk
10661078

10671079
if _, ok := d.GetOk(prefix + ".resource_policies"); ok {
10681080
// instance template only supports a resource name here (not uri)
1069-
disk.InitializeParams.ResourcePolicies = convertAndMapStringArr(d.Get(prefix+".resource_policies").([]interface{}), GetResourceNameFromSelfLink)
1081+
disk.InitializeParams.ResourcePolicies = expandInstanceTemplateResourcePolicies(d, prefix+".resource_policies")
10701082
}
10711083
}
10721084

@@ -1120,6 +1132,10 @@ func expandInstanceTemplateGuestAccelerators(d TerraformResourceData, config *Co
11201132
return guestAccelerators
11211133
}
11221134

1135+
func expandInstanceTemplateResourcePolicies(d TerraformResourceData, dataKey string) []string {
1136+
return convertAndMapStringArr(d.Get(dataKey).([]interface{}), GetResourceNameFromSelfLink)
1137+
}
1138+
11231139
func resourceComputeInstanceTemplateCreate(d *schema.ResourceData, meta interface{}) error {
11241140
config := meta.(*Config)
11251141
userAgent, err := generateUserAgentString(d, config.userAgent)
@@ -1159,6 +1175,7 @@ func resourceComputeInstanceTemplateCreate(d *schema.ResourceData, meta interfac
11591175
if err != nil {
11601176
return err
11611177
}
1178+
resourcePolicies := expandInstanceTemplateResourcePolicies(d, "resource_policies")
11621179

11631180
instanceProperties := &compute.InstanceProperties{
11641181
CanIpForward: d.Get("can_ip_forward").(bool),
@@ -1177,6 +1194,7 @@ func resourceComputeInstanceTemplateCreate(d *schema.ResourceData, meta interfac
11771194
ShieldedInstanceConfig: expandShieldedVmConfigs(d),
11781195
AdvancedMachineFeatures: expandAdvancedMachineFeatures(d),
11791196
DisplayDevice: expandDisplayDevice(d),
1197+
ResourcePolicies: resourcePolicies,
11801198
ReservationAffinity: reservationAffinity,
11811199
}
11821200

@@ -1590,6 +1608,12 @@ func resourceComputeInstanceTemplateRead(d *schema.ResourceData, meta interface{
15901608
}
15911609
}
15921610

1611+
if instanceTemplate.Properties.ResourcePolicies != nil {
1612+
if err = d.Set("resource_policies", instanceTemplate.Properties.ResourcePolicies); err != nil {
1613+
return fmt.Errorf("Error setting resource_policies: %s", err)
1614+
}
1615+
}
1616+
15931617
if reservationAffinity := instanceTemplate.Properties.ReservationAffinity; reservationAffinity != nil {
15941618
if err = d.Set("reservation_affinity", flattenReservationAffinity(reservationAffinity)); err != nil {
15951619
return fmt.Errorf("Error setting reservation_affinity: %s", err)

google-beta/resource_compute_instance_template_test.go

Lines changed: 86 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -759,6 +759,33 @@ func TestAccComputeInstanceTemplate_soleTenantNodeAffinities(t *testing.T) {
759759
})
760760
}
761761

762+
func TestAccComputeInstanceTemplate_instanceResourcePolicies(t *testing.T) {
763+
t.Parallel()
764+
765+
var template compute.InstanceTemplate
766+
var policyName = "tf-test-policy-" + randString(t, 10)
767+
768+
vcrTest(t, resource.TestCase{
769+
PreCheck: func() { testAccPreCheck(t) },
770+
Providers: testAccProviders,
771+
CheckDestroy: testAccCheckComputeInstanceTemplateDestroyProducer(t),
772+
Steps: []resource.TestStep{
773+
{
774+
Config: testAccComputeInstanceTemplate_instanceResourcePolicyCollocated(randString(t, 10), policyName),
775+
Check: resource.ComposeTestCheckFunc(
776+
testAccCheckComputeInstanceTemplateExists(t, "google_compute_instance_template.foobar", &template),
777+
testAccCheckComputeInstanceTemplateHasInstanceResourcePolicies(&template, policyName),
778+
),
779+
},
780+
{
781+
ResourceName: "google_compute_instance_template.foobar",
782+
ImportState: true,
783+
ImportStateVerify: true,
784+
},
785+
},
786+
})
787+
}
788+
762789
func TestAccComputeInstanceTemplate_reservationAffinities(t *testing.T) {
763790
t.Parallel()
764791

@@ -994,7 +1021,7 @@ func TestAccComputeInstanceTemplate_imageResourceTest(t *testing.T) {
9941021
})
9951022
}
9961023

997-
func TestAccComputeInstanceTemplate_resourcePolicies(t *testing.T) {
1024+
func TestAccComputeInstanceTemplate_diskResourcePolicies(t *testing.T) {
9981025
t.Parallel()
9991026

10001027
var instanceTemplate compute.InstanceTemplate
@@ -1006,7 +1033,7 @@ func TestAccComputeInstanceTemplate_resourcePolicies(t *testing.T) {
10061033
CheckDestroy: testAccCheckComputeInstanceTemplateDestroyProducer(t),
10071034
Steps: []resource.TestStep{
10081035
{
1009-
Config: testAccComputeInstanceTemplate_resourcePolicies(randString(t, 10), policyName),
1036+
Config: testAccComputeInstanceTemplate_diskResourcePolicies(randString(t, 10), policyName),
10101037
Check: resource.ComposeTestCheckFunc(
10111038
testAccCheckComputeInstanceTemplateExists(t, "google_compute_instance_template.foobar", &instanceTemplate),
10121039
testAccCheckComputeInstanceTemplateHasDiskResourcePolicy(&instanceTemplate, policyName),
@@ -1521,6 +1548,18 @@ func testAccCheckComputeInstanceTemplateHasMinCpuPlatform(instanceTemplate *comp
15211548
}
15221549
}
15231550

1551+
func testAccCheckComputeInstanceTemplateHasInstanceResourcePolicies(instanceTemplate *compute.InstanceTemplate, resourcePolicy string) resource.TestCheckFunc {
1552+
return func(s *terraform.State) error {
1553+
resourcePolicyActual := instanceTemplate.Properties.ResourcePolicies[0]
1554+
if resourcePolicyActual != resourcePolicy {
1555+
return fmt.Errorf("Wrong instance resource policy: expected %s, got %s", resourcePolicy, resourcePolicyActual)
1556+
}
1557+
1558+
return nil
1559+
}
1560+
1561+
}
1562+
15241563
func testAccCheckComputeInstanceTemplateHasReservationAffinity(instanceTemplate *compute.InstanceTemplate, consumeReservationType string, specificReservationNames ...string) resource.TestCheckFunc {
15251564
if len(specificReservationNames) > 1 {
15261565
panic("too many specificReservationNames in test")
@@ -2479,6 +2518,50 @@ resource "google_compute_instance_template" "foobar" {
24792518
`, suffix)
24802519
}
24812520

2521+
func testAccComputeInstanceTemplate_instanceResourcePolicyCollocated(suffix string, policyName string) string {
2522+
return fmt.Sprintf(`
2523+
resource "google_compute_resource_policy" "foo" {
2524+
name = "%s"
2525+
region = "us-central1"
2526+
group_placement_policy {
2527+
vm_count = 2
2528+
collocation = "COLLOCATED"
2529+
}
2530+
}
2531+
2532+
data "google_compute_image" "my_image" {
2533+
family = "debian-11"
2534+
project = "debian-cloud"
2535+
}
2536+
2537+
resource "google_compute_instance_template" "foobar" {
2538+
name = "tf-test-instance-template-%s"
2539+
machine_type = "e2-standard-4"
2540+
2541+
disk {
2542+
source_image = data.google_compute_image.my_image.self_link
2543+
auto_delete = true
2544+
boot = true
2545+
}
2546+
2547+
network_interface {
2548+
network = "default"
2549+
}
2550+
2551+
scheduling {
2552+
preemptible = false
2553+
automatic_restart = false
2554+
}
2555+
2556+
resource_policies = [google_compute_resource_policy.foo.self_link]
2557+
2558+
service_account {
2559+
scopes = ["userinfo-email", "compute-ro", "storage-ro"]
2560+
}
2561+
}
2562+
`, policyName, suffix)
2563+
}
2564+
24822565
func testAccComputeInstanceTemplate_reservationAffinityInstanceTemplate_nonSpecificReservation(templateName, consumeReservationType string) string {
24832566
return fmt.Sprintf(`
24842567
data "google_compute_image" "my_image" {
@@ -2734,7 +2817,7 @@ resource "google_compute_instance_template" "foobar" {
27342817
`, diskName, imageName, imageDescription)
27352818
}
27362819

2737-
func testAccComputeInstanceTemplate_resourcePolicies(suffix string, policyName string) string {
2820+
func testAccComputeInstanceTemplate_diskResourcePolicies(suffix string, policyName string) string {
27382821
return fmt.Sprintf(`
27392822
data "google_compute_image" "my_image" {
27402823
family = "debian-11"

website/docs/r/compute_instance_template.html.markdown

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -336,6 +336,8 @@ The following arguments are supported:
336336
resource is tied to a specific region. Defaults to the region of the
337337
Provider if no value is given.
338338

339+
* `resource_policies` (Optional) -- A list of self_links of resource policies to attach to the instance. Modifying this list will cause the instance to recreate. Currently a max of 1 resource policy is supported.
340+
339341
* `reservation_affinity` - (Optional) Specifies the reservations that this instance can consume from.
340342
Structure is [documented below](#nested_reservation_affinity).
341343

0 commit comments

Comments
 (0)