Skip to content

Commit b16cf66

Browse files
authored
Fix the issue that user can't use regional disk in global_instance_template (#13278)
1 parent 54d8f02 commit b16cf66

File tree

2 files changed

+93
-2
lines changed

2 files changed

+93
-2
lines changed

mmv1/third_party/terraform/services/compute/resource_compute_instance_from_template.go.tmpl

+4-2
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"encoding/json"
55
"fmt"
66
"log"
7+
"regexp"
78
"strings"
89

910
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/customdiff"
@@ -230,6 +231,7 @@ func resourceComputeInstanceFromTemplateCreate(d *schema.ResourceData, meta inte
230231
// ensures that overriding one of these properties does not override the others.
231232
func adjustInstanceFromTemplateDisks(d *schema.ResourceData, config *transport_tpg.Config, it *compute.InstanceTemplate, zone *compute.Zone, project string, isFromRegionalTemplate bool) ([]*compute.AttachedDisk, error) {
232233
disks := []*compute.AttachedDisk{}
234+
re := regexp.MustCompile(`projects/[^/]+/regions/[^/]+/disks/[^/]+$`)
233235
if _, hasBootDisk := d.GetOk("boot_disk"); hasBootDisk {
234236
bootDisk, err := expandBootDisk(d, config, project)
235237
if err != nil {
@@ -240,7 +242,7 @@ func adjustInstanceFromTemplateDisks(d *schema.ResourceData, config *transport_t
240242
// boot disk was not overridden, so use the one from the instance template
241243
for _, disk := range it.Properties.Disks {
242244
if disk.Boot {
243-
if disk.Source != "" && !isFromRegionalTemplate {
245+
if disk.Source != "" && !isFromRegionalTemplate && !re.MatchString(disk.Source){
244246
// Instances need a URL for the disk, but instance templates only have the name
245247
disk.Source = fmt.Sprintf("projects/%s/zones/%s/disks/%s", project, zone.Name, disk.Source)
246248
}
@@ -303,7 +305,7 @@ func adjustInstanceFromTemplateDisks(d *schema.ResourceData, config *transport_t
303305
// attached disks were not overridden, so use the ones from the instance template
304306
for _, disk := range it.Properties.Disks {
305307
if !disk.Boot && disk.Type != "SCRATCH" {
306-
if s := disk.Source; s != "" && !isFromRegionalTemplate {
308+
if s := disk.Source; s != "" && !isFromRegionalTemplate && !re.MatchString(disk.Source){
307309
// Instances need a URL for the disk source, but instance templates
308310
// only have the name (since they're global).
309311
disk.Source = fmt.Sprintf("zones/%s/disks/%s", zone.Name, s)

mmv1/third_party/terraform/services/compute/resource_compute_instance_from_template_test.go.tmpl

+89
Original file line numberDiff line numberDiff line change
@@ -456,7 +456,29 @@ func TestAccComputeInstanceFromTemplate_overrideMetadataDotStartupScript(t *test
456456
},
457457
},
458458
})
459+
}
460+
461+
func TestAccComputeInstanceFromTemplate_useDiskSelfLink(t *testing.T) {
462+
t.Parallel()
459463

464+
var instance compute.Instance
465+
instanceName := fmt.Sprintf("tf-test-%s", acctest.RandString(t, 10))
466+
templateName := fmt.Sprintf("tf-test-%s", acctest.RandString(t, 10))
467+
resourceName := "google_compute_instance_from_template.foobar"
468+
469+
acctest.VcrTest(t, resource.TestCase{
470+
PreCheck: func() { acctest.AccTestPreCheck(t) },
471+
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories(t),
472+
CheckDestroy: testAccCheckComputeInstanceFromTemplateDestroyProducer(t),
473+
Steps: []resource.TestStep{
474+
{
475+
Config: testAccComputeInstanceFromTemplate_regionalDisk(instanceName, templateName),
476+
Check: resource.ComposeTestCheckFunc(
477+
testAccCheckComputeInstanceExists(t, resourceName, &instance),
478+
),
479+
},
480+
},
481+
})
460482
}
461483

462484
func testAccCheckComputeInstanceFromTemplateDestroyProducer(t *testing.T) func(s *terraform.State) error {
@@ -1170,6 +1192,73 @@ resource "google_compute_instance_from_template" "foobar" {
11701192

11711193
{{ end }}
11721194

1195+
func testAccComputeInstanceFromTemplate_regionalDisk(instance, template string) string {
1196+
return fmt.Sprintf(`
1197+
data "google_compute_image" "my_image" {
1198+
family = "debian-11"
1199+
project = "debian-cloud"
1200+
}
1201+
1202+
resource "google_compute_region_disk" "foobar" {
1203+
name = "%s"
1204+
size = 10
1205+
type = "pd-ssd"
1206+
region = "us-central1"
1207+
replica_zones = ["us-central1-a", "us-central1-f"]
1208+
}
1209+
1210+
resource "google_compute_instance_template" "foobar" {
1211+
name = "%s"
1212+
machine_type = "n1-standard-1" // can't be e2 because of local-ssd
1213+
1214+
disk {
1215+
source_image = data.google_compute_image.my_image.self_link
1216+
auto_delete = true
1217+
disk_size_gb = 100
1218+
boot = true
1219+
disk_type = "pd-ssd"
1220+
type = "PERSISTENT"
1221+
}
1222+
1223+
disk {
1224+
source = google_compute_region_disk.foobar.self_link
1225+
auto_delete = false
1226+
boot = false
1227+
}
1228+
1229+
network_interface {
1230+
network = "default"
1231+
}
1232+
1233+
metadata = {
1234+
foo = "bar"
1235+
}
1236+
1237+
scheduling {
1238+
automatic_restart = true
1239+
}
1240+
1241+
can_ip_forward = true
1242+
}
1243+
1244+
resource "google_compute_instance_from_template" "foobar" {
1245+
name = "%s"
1246+
zone = "us-central1-a"
1247+
1248+
source_instance_template = google_compute_instance_template.foobar.id
1249+
1250+
// Overrides
1251+
can_ip_forward = false
1252+
labels = {
1253+
my_key = "my_value"
1254+
}
1255+
scheduling {
1256+
automatic_restart = false
1257+
}
1258+
}
1259+
`, template, template, instance)
1260+
}
1261+
11731262
func testAccComputeInstanceFromTemplate_self_link_unique(instance, template string) string {
11741263
return fmt.Sprintf(`
11751264
data "google_compute_image" "my_image" {

0 commit comments

Comments
 (0)