diff --git a/builtin/providers/google/resource_compute_disk.go b/builtin/providers/google/resource_compute_disk.go index 2b4148baa..04cbca51c 100644 --- a/builtin/providers/google/resource_compute_disk.go +++ b/builtin/providers/google/resource_compute_disk.go @@ -3,6 +3,7 @@ package google import ( "fmt" "log" + "regexp" "github.com/hashicorp/terraform/helper/schema" "google.golang.org/api/compute/v1" @@ -129,17 +130,21 @@ func resourceComputeDiskCreate(d *schema.ResourceData, meta interface{}) error { if v, ok := d.GetOk("snapshot"); ok { snapshotName := v.(string) - log.Printf("[DEBUG] Loading snapshot: %s", snapshotName) - snapshotData, err := config.clientCompute.Snapshots.Get( - project, snapshotName).Do() + match, _ := regexp.MatchString("^https://www.googleapis.com/compute", snapshotName) + if match { + disk.SourceSnapshot = snapshotName + } else { + log.Printf("[DEBUG] Loading snapshot: %s", snapshotName) + snapshotData, err := config.clientCompute.Snapshots.Get( + project, snapshotName).Do() - if err != nil { - return fmt.Errorf( - "Error loading snapshot '%s': %s", - snapshotName, err) + if err != nil { + return fmt.Errorf( + "Error loading snapshot '%s': %s", + snapshotName, err) + } + disk.SourceSnapshot = snapshotData.SelfLink } - - disk.SourceSnapshot = snapshotData.SelfLink } if v, ok := d.GetOk("disk_encryption_key_raw"); ok { diff --git a/builtin/providers/google/resource_compute_disk_test.go b/builtin/providers/google/resource_compute_disk_test.go index 478144e7e..91f29c985 100644 --- a/builtin/providers/google/resource_compute_disk_test.go +++ b/builtin/providers/google/resource_compute_disk_test.go @@ -2,6 +2,7 @@ package google import ( "fmt" + "os" "testing" "github.com/hashicorp/terraform/helper/acctest" @@ -30,6 +31,30 @@ func TestAccComputeDisk_basic(t *testing.T) { }) } +func TestAccComputeDisk_fromSnapshotURI(t *testing.T) { + diskName := fmt.Sprintf("tf-test-%s", acctest.RandString(10)) + firstDiskName := fmt.Sprintf("tf-test-%s", acctest.RandString(10)) + snapshotName := fmt.Sprintf("tf-test-%s", acctest.RandString(10)) + var xpn_host = os.Getenv("GOOGLE_XPN_HOST_PROJECT") + + var disk compute.Disk + + resource.Test(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + Providers: testAccProviders, + CheckDestroy: testAccCheckComputeDiskDestroy, + Steps: []resource.TestStep{ + resource.TestStep{ + Config: testAccComputeDisk_fromSnapshotURI(firstDiskName, snapshotName, diskName, xpn_host), + Check: resource.ComposeTestCheckFunc( + testAccCheckComputeDiskExists( + "google_compute_disk.seconddisk", &disk), + ), + }, + }, + }) +} + func TestAccComputeDisk_encryption(t *testing.T) { diskName := fmt.Sprintf("tf-test-%s", acctest.RandString(10)) var disk compute.Disk @@ -130,6 +155,31 @@ resource "google_compute_disk" "foobar" { }`, diskName) } +func testAccComputeDisk_fromSnapshotURI(firstDiskName, snapshotName, diskName, xpn_host string) string { + return fmt.Sprintf(` + resource "google_compute_disk" "foobar" { + name = "%s" + image = "debian-8-jessie-v20160803" + size = 50 + type = "pd-ssd" + zone = "us-central1-a" + project = "%s" + } + +resource "google_compute_snapshot" "snapdisk" { + name = "%s" + source_disk = "${google_compute_disk.foobar.name}" + zone = "us-central1-a" + project = "%s" +} +resource "google_compute_disk" "seconddisk" { + name = "%s" + snapshot = "${google_compute_snapshot.snapdisk.self_link}" + type = "pd-ssd" + zone = "us-central1-a" +}`, firstDiskName, xpn_host, snapshotName, xpn_host, diskName) +} + func testAccComputeDisk_encryption(diskName string) string { return fmt.Sprintf(` resource "google_compute_disk" "foobar" {