github.com/koding/terraform@v0.6.4-0.20170608090606-5d7e0339779d/builtin/providers/google/resource_compute_disk_test.go (about)

     1  package google
     2  
     3  import (
     4  	"fmt"
     5  	"os"
     6  	"strconv"
     7  	"testing"
     8  
     9  	"github.com/hashicorp/terraform/helper/acctest"
    10  	"github.com/hashicorp/terraform/helper/resource"
    11  	"github.com/hashicorp/terraform/terraform"
    12  	"google.golang.org/api/compute/v1"
    13  )
    14  
    15  func TestAccComputeDisk_basic(t *testing.T) {
    16  	diskName := fmt.Sprintf("tf-test-%s", acctest.RandString(10))
    17  	var disk compute.Disk
    18  
    19  	resource.Test(t, resource.TestCase{
    20  		PreCheck:     func() { testAccPreCheck(t) },
    21  		Providers:    testAccProviders,
    22  		CheckDestroy: testAccCheckComputeDiskDestroy,
    23  		Steps: []resource.TestStep{
    24  			resource.TestStep{
    25  				Config: testAccComputeDisk_basic(diskName),
    26  				Check: resource.ComposeTestCheckFunc(
    27  					testAccCheckComputeDiskExists(
    28  						"google_compute_disk.foobar", &disk),
    29  				),
    30  			},
    31  		},
    32  	})
    33  }
    34  
    35  func TestAccComputeDisk_updateSize(t *testing.T) {
    36  	diskName := fmt.Sprintf("tf-test-%s", acctest.RandString(10))
    37  	var disk compute.Disk
    38  
    39  	resource.Test(t, resource.TestCase{
    40  		PreCheck:  func() { testAccPreCheck(t) },
    41  		Providers: testAccProviders,
    42  		Steps: []resource.TestStep{
    43  			{
    44  				Config: testAccComputeDisk_basic(diskName),
    45  				Check: resource.ComposeTestCheckFunc(
    46  					testAccCheckComputeDiskExists(
    47  						"google_compute_disk.foobar", &disk),
    48  					resource.TestCheckResourceAttr("google_compute_disk.foobar", "size", "50"),
    49  				),
    50  			},
    51  			{
    52  				Config: testAccComputeDisk_resized(diskName),
    53  				Check: resource.ComposeTestCheckFunc(
    54  					testAccCheckComputeDiskExists(
    55  						"google_compute_disk.foobar", &disk),
    56  					resource.TestCheckResourceAttr("google_compute_disk.foobar", "size", "100"),
    57  				),
    58  			},
    59  		},
    60  	})
    61  }
    62  
    63  func TestAccComputeDisk_fromSnapshotURI(t *testing.T) {
    64  	diskName := fmt.Sprintf("tf-test-%s", acctest.RandString(10))
    65  	firstDiskName := fmt.Sprintf("tf-test-%s", acctest.RandString(10))
    66  	snapshotName := fmt.Sprintf("tf-test-%s", acctest.RandString(10))
    67  	var xpn_host = os.Getenv("GOOGLE_XPN_HOST_PROJECT")
    68  
    69  	var disk compute.Disk
    70  
    71  	resource.Test(t, resource.TestCase{
    72  		PreCheck:     func() { testAccPreCheck(t) },
    73  		Providers:    testAccProviders,
    74  		CheckDestroy: testAccCheckComputeDiskDestroy,
    75  		Steps: []resource.TestStep{
    76  			resource.TestStep{
    77  				Config: testAccComputeDisk_fromSnapshotURI(firstDiskName, snapshotName, diskName, xpn_host),
    78  				Check: resource.ComposeTestCheckFunc(
    79  					testAccCheckComputeDiskExists(
    80  						"google_compute_disk.seconddisk", &disk),
    81  				),
    82  			},
    83  		},
    84  	})
    85  }
    86  
    87  func TestAccComputeDisk_encryption(t *testing.T) {
    88  	diskName := fmt.Sprintf("tf-test-%s", acctest.RandString(10))
    89  	var disk compute.Disk
    90  
    91  	resource.Test(t, resource.TestCase{
    92  		PreCheck:     func() { testAccPreCheck(t) },
    93  		Providers:    testAccProviders,
    94  		CheckDestroy: testAccCheckComputeDiskDestroy,
    95  		Steps: []resource.TestStep{
    96  			resource.TestStep{
    97  				Config: testAccComputeDisk_encryption(diskName),
    98  				Check: resource.ComposeTestCheckFunc(
    99  					testAccCheckComputeDiskExists(
   100  						"google_compute_disk.foobar", &disk),
   101  					testAccCheckEncryptionKey(
   102  						"google_compute_disk.foobar", &disk),
   103  				),
   104  			},
   105  		},
   106  	})
   107  }
   108  
   109  func TestAccComputeDisk_deleteDetach(t *testing.T) {
   110  	diskName := fmt.Sprintf("tf-test-%s", acctest.RandString(10))
   111  	instanceName := fmt.Sprintf("tf-test-%s", acctest.RandString(10))
   112  	var disk compute.Disk
   113  
   114  	resource.Test(t, resource.TestCase{
   115  		PreCheck:     func() { testAccPreCheck(t) },
   116  		Providers:    testAccProviders,
   117  		CheckDestroy: testAccCheckComputeDiskDestroy,
   118  		Steps: []resource.TestStep{
   119  			resource.TestStep{
   120  				Config: testAccComputeDisk_deleteDetach(instanceName, diskName),
   121  				Check: resource.ComposeTestCheckFunc(
   122  					testAccCheckComputeDiskExists(
   123  						"google_compute_disk.foo", &disk),
   124  				),
   125  			},
   126  			// this needs to be a second step so we refresh and see the instance
   127  			// listed as attached to the disk; the instance is created after the
   128  			// disk. and the disk's properties aren't refreshed unless there's
   129  			// another step
   130  			resource.TestStep{
   131  				Config: testAccComputeDisk_deleteDetach(instanceName, diskName),
   132  				Check: resource.ComposeTestCheckFunc(
   133  					testAccCheckComputeDiskExists(
   134  						"google_compute_disk.foo", &disk),
   135  					testAccCheckComputeDiskInstances(
   136  						"google_compute_disk.foo", &disk),
   137  				),
   138  			},
   139  		},
   140  	})
   141  }
   142  
   143  func testAccCheckComputeDiskDestroy(s *terraform.State) error {
   144  	config := testAccProvider.Meta().(*Config)
   145  
   146  	for _, rs := range s.RootModule().Resources {
   147  		if rs.Type != "google_compute_disk" {
   148  			continue
   149  		}
   150  
   151  		_, err := config.clientCompute.Disks.Get(
   152  			config.Project, rs.Primary.Attributes["zone"], rs.Primary.ID).Do()
   153  		if err == nil {
   154  			return fmt.Errorf("Disk still exists")
   155  		}
   156  	}
   157  
   158  	return nil
   159  }
   160  
   161  func testAccCheckComputeDiskExists(n string, disk *compute.Disk) resource.TestCheckFunc {
   162  	return func(s *terraform.State) error {
   163  		rs, ok := s.RootModule().Resources[n]
   164  		if !ok {
   165  			return fmt.Errorf("Not found: %s", n)
   166  		}
   167  
   168  		if rs.Primary.ID == "" {
   169  			return fmt.Errorf("No ID is set")
   170  		}
   171  
   172  		config := testAccProvider.Meta().(*Config)
   173  
   174  		found, err := config.clientCompute.Disks.Get(
   175  			config.Project, rs.Primary.Attributes["zone"], rs.Primary.ID).Do()
   176  		if err != nil {
   177  			return err
   178  		}
   179  
   180  		if found.Name != rs.Primary.ID {
   181  			return fmt.Errorf("Disk not found")
   182  		}
   183  
   184  		*disk = *found
   185  
   186  		return nil
   187  	}
   188  }
   189  
   190  func testAccCheckEncryptionKey(n string, disk *compute.Disk) resource.TestCheckFunc {
   191  	return func(s *terraform.State) error {
   192  		rs, ok := s.RootModule().Resources[n]
   193  		if !ok {
   194  			return fmt.Errorf("Not found: %s", n)
   195  		}
   196  
   197  		attr := rs.Primary.Attributes["disk_encryption_key_sha256"]
   198  		if disk.DiskEncryptionKey == nil && attr != "" {
   199  			return fmt.Errorf("Disk %s has mismatched encryption key.\nTF State: %+v\nGCP State: <empty>", n, attr)
   200  		}
   201  
   202  		if attr != disk.DiskEncryptionKey.Sha256 {
   203  			return fmt.Errorf("Disk %s has mismatched encryption key.\nTF State: %+v.\nGCP State: %+v",
   204  				n, attr, disk.DiskEncryptionKey.Sha256)
   205  		}
   206  		return nil
   207  	}
   208  }
   209  
   210  func testAccCheckComputeDiskInstances(n string, disk *compute.Disk) resource.TestCheckFunc {
   211  	return func(s *terraform.State) error {
   212  		rs, ok := s.RootModule().Resources[n]
   213  		if !ok {
   214  			return fmt.Errorf("Not found: %s", n)
   215  		}
   216  
   217  		attr := rs.Primary.Attributes["users.#"]
   218  		if strconv.Itoa(len(disk.Users)) != attr {
   219  			return fmt.Errorf("Disk %s has mismatched users.\nTF State: %+v\nGCP State: %+v", n, rs.Primary.Attributes["users"], disk.Users)
   220  		}
   221  
   222  		for pos, user := range disk.Users {
   223  			if rs.Primary.Attributes["users."+strconv.Itoa(pos)] != user {
   224  				return fmt.Errorf("Disk %s has mismatched users.\nTF State: %+v.\nGCP State: %+v",
   225  					n, rs.Primary.Attributes["users"], disk.Users)
   226  			}
   227  		}
   228  		return nil
   229  	}
   230  }
   231  
   232  func testAccComputeDisk_basic(diskName string) string {
   233  	return fmt.Sprintf(`
   234  resource "google_compute_disk" "foobar" {
   235  	name = "%s"
   236  	image = "debian-8-jessie-v20160803"
   237  	size = 50
   238  	type = "pd-ssd"
   239  	zone = "us-central1-a"
   240  }`, diskName)
   241  }
   242  
   243  func testAccComputeDisk_resized(diskName string) string {
   244  	return fmt.Sprintf(`
   245  resource "google_compute_disk" "foobar" {
   246  	name = "%s"
   247  	image = "debian-8-jessie-v20160803"
   248  	size = 100
   249  	type = "pd-ssd"
   250  	zone = "us-central1-a"
   251  }`, diskName)
   252  }
   253  
   254  func testAccComputeDisk_fromSnapshotURI(firstDiskName, snapshotName, diskName, xpn_host string) string {
   255  	return fmt.Sprintf(`
   256  		resource "google_compute_disk" "foobar" {
   257  			name = "%s"
   258  			image = "debian-8-jessie-v20160803"
   259  			size = 50
   260  			type = "pd-ssd"
   261  			zone = "us-central1-a"
   262  			project = "%s"
   263  		}
   264  
   265  resource "google_compute_snapshot" "snapdisk" {
   266    name = "%s"
   267    source_disk = "${google_compute_disk.foobar.name}"
   268    zone = "us-central1-a"
   269  	project = "%s"
   270  }
   271  resource "google_compute_disk" "seconddisk" {
   272  	name = "%s"
   273  	snapshot = "${google_compute_snapshot.snapdisk.self_link}"
   274  	type = "pd-ssd"
   275  	zone = "us-central1-a"
   276  }`, firstDiskName, xpn_host, snapshotName, xpn_host, diskName)
   277  }
   278  
   279  func testAccComputeDisk_encryption(diskName string) string {
   280  	return fmt.Sprintf(`
   281  resource "google_compute_disk" "foobar" {
   282  	name = "%s"
   283  	image = "debian-8-jessie-v20160803"
   284  	size = 50
   285  	type = "pd-ssd"
   286  	zone = "us-central1-a"
   287  	disk_encryption_key_raw = "SGVsbG8gZnJvbSBHb29nbGUgQ2xvdWQgUGxhdGZvcm0="
   288  }`, diskName)
   289  }
   290  
   291  func testAccComputeDisk_deleteDetach(instanceName, diskName string) string {
   292  	return fmt.Sprintf(`
   293  resource "google_compute_disk" "foo" {
   294  	name = "%s"
   295  	image = "debian-8"
   296  	size = 50
   297  	type = "pd-ssd"
   298  	zone = "us-central1-a"
   299  }
   300  
   301  resource "google_compute_instance" "bar" {
   302  	name = "%s"
   303  	machine_type = "n1-standard-1"
   304  	zone = "us-central1-a"
   305  
   306  	disk {
   307  		image = "debian-8-jessie-v20170523"
   308  	}
   309  
   310  	disk {
   311  		disk = "${google_compute_disk.foo.name}"
   312  		auto_delete = false
   313  	}
   314  
   315  	network_interface {
   316  		network = "default"
   317  	}
   318  }`, diskName, instanceName)
   319  }