diff --git a/builtin/providers/google/resource_compute_instance.go b/builtin/providers/google/resource_compute_instance.go index 255718e5c..956f27457 100644 --- a/builtin/providers/google/resource_compute_instance.go +++ b/builtin/providers/google/resource_compute_instance.go @@ -81,6 +81,12 @@ func resourceComputeInstance() *schema.Resource { ForceNew: true, }, + "scratch": &schema.Schema{ + Type: schema.TypeBool, + Optional: true, + ForceNew: true, + }, + "auto_delete": &schema.Schema{ Type: schema.TypeBool, Optional: true, @@ -319,6 +325,15 @@ func resourceComputeInstanceCreate(d *schema.ResourceData, meta interface{}) err } disk.Source = diskData.SelfLink + } else { + // Create a new disk + disk.InitializeParams = &compute.AttachedDiskInitializeParams{ } + } + + if v, ok := d.GetOk(prefix + ".scratch"); ok { + if v.(bool) { + disk.Type = "SCRATCH" + } } // Load up the image for this disk if specified @@ -332,9 +347,7 @@ func resourceComputeInstanceCreate(d *schema.ResourceData, meta interface{}) err imageName, err) } - disk.InitializeParams = &compute.AttachedDiskInitializeParams{ - SourceImage: imageUrl, - } + disk.InitializeParams.SourceImage = imageUrl } if v, ok := d.GetOk(prefix + ".type"); ok { diff --git a/builtin/providers/google/resource_compute_instance_test.go b/builtin/providers/google/resource_compute_instance_test.go index 9dabc2fb7..70d0c5f2f 100644 --- a/builtin/providers/google/resource_compute_instance_test.go +++ b/builtin/providers/google/resource_compute_instance_test.go @@ -140,6 +140,26 @@ func TestAccComputeInstance_disks(t *testing.T) { }) } +func TestAccComputeInstance_local_ssd(t *testing.T) { + var instance compute.Instance + + resource.Test(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + Providers: testAccProviders, + CheckDestroy: testAccCheckComputeInstanceDestroy, + Steps: []resource.TestStep{ + resource.TestStep{ + Config: testAccComputeInstance_local_ssd, + Check: resource.ComposeTestCheckFunc( + testAccCheckComputeInstanceExists( + "google_compute_instance.local-ssd", &instance), + testAccCheckComputeInstanceDisk(&instance, "terraform-test", true, true), + ), + }, + }, + }) +} + func TestAccComputeInstance_update_deprecated_network(t *testing.T) { var instance compute.Instance @@ -609,6 +629,27 @@ resource "google_compute_instance" "foobar" { } }` +const testAccComputeInstance_local_ssd = ` +resource "google_compute_instance" "local-ssd" { + name = "terraform-test" + machine_type = "n1-standard-1" + zone = "us-central1-a" + + disk { + image = "debian-7-wheezy-v20140814" + } + + disk { + type = "local-ssd" + scratch = true + } + + network_interface { + network = "default" + } + +}` + const testAccComputeInstance_service_account = ` resource "google_compute_instance" "foobar" { name = "terraform-test" diff --git a/website/source/docs/providers/google/r/compute_instance.html.markdown b/website/source/docs/providers/google/r/compute_instance.html.markdown index a0361c5a5..ae231a8c4 100644 --- a/website/source/docs/providers/google/r/compute_instance.html.markdown +++ b/website/source/docs/providers/google/r/compute_instance.html.markdown @@ -27,6 +27,12 @@ resource "google_compute_instance" "default" { image = "debian-7-wheezy-v20140814" } + // Local SSD disk + disk { + type = "local-ssd" + scratch = true + } + network_interface { network = "default" access_config { @@ -79,22 +85,27 @@ The following arguments are supported: * `tags` - (Optional) Tags to attach to the instance. -The `disk` block supports: +The `disk` block supports: (Note that either disk or image is required, unless +the type is "local-ssd", in which case scratch must be true). -* `disk` - (Required if image not set) The name of the disk (such as - those managed by `google_compute_disk`) to attach. +* `disk` - The name of the existing disk (such as those managed by + `google_compute_disk`) to attach. -* `image` - (Required if disk not set) The image from which to initialize this - disk. Either the full URL, a contraction of the form "project/name", or just - a name (in which case the current project is used). +* `image` - The image from which to initialize this + disk. Either the full URL, a contraction of the form "project/name", or just + a name (in which case the current project is used). * `auto_delete` - (Optional) Whether or not the disk should be auto-deleted. - This defaults to true. + This defaults to true. Leave true for local SSDs. -* `type` - (Optional) The GCE disk type. +* `type` - (Optional) The GCE disk type, e.g. pd-standard, pd-ssd, or local-ssd. -* `size` - (Optional) The size of the image in gigabytes. If not specified, - it will inherit the size of its base image. +* `scratch` - (Optional) Whether the disk is a scratch disk as opposed to a + persistent disk (required for local-ssd). + +* `size` - (Optional) The size of the image in gigabytes. If not specified, it + will inherit the size of its base image. Do not specify for local SSDs as + their size is fixed. * `device_name` - (Optional) Name with which attached disk will be accessible under `/dev/disk/by-id/`