github.com/jsoriano/terraform@v0.6.7-0.20151026070445-8b70867fdd95/builtin/providers/google/resource_storage_bucket_test.go (about)

     1  package google
     2  
     3  import (
     4  	"bytes"
     5  	"fmt"
     6  	"math/rand"
     7  	"testing"
     8  	"time"
     9  
    10  	"github.com/hashicorp/terraform/helper/resource"
    11  	"github.com/hashicorp/terraform/terraform"
    12  
    13  	"google.golang.org/api/googleapi"
    14  	storage "google.golang.org/api/storage/v1"
    15  )
    16  
    17  func TestAccStorage_basic(t *testing.T) {
    18  	var bucketName string
    19  
    20  	resource.Test(t, resource.TestCase{
    21  		PreCheck:     func() { testAccPreCheck(t) },
    22  		Providers:    testAccProviders,
    23  		CheckDestroy: testAccGoogleStorageDestroy,
    24  		Steps: []resource.TestStep{
    25  			resource.TestStep{
    26  				Config: testGoogleStorageBucketsReaderDefaults,
    27  				Check: resource.ComposeTestCheckFunc(
    28  					testAccCheckCloudStorageBucketExists(
    29  						"google_storage_bucket.bucket", &bucketName),
    30  					resource.TestCheckResourceAttr(
    31  						"google_storage_bucket.bucket", "location", "US"),
    32  					resource.TestCheckResourceAttr(
    33  						"google_storage_bucket.bucket", "force_destroy", "false"),
    34  				),
    35  			},
    36  		},
    37  	})
    38  }
    39  
    40  func TestAccStorageCustomAttributes(t *testing.T) {
    41  	var bucketName string
    42  
    43  	resource.Test(t, resource.TestCase{
    44  		PreCheck:     func() { testAccPreCheck(t) },
    45  		Providers:    testAccProviders,
    46  		CheckDestroy: testAccGoogleStorageDestroy,
    47  		Steps: []resource.TestStep{
    48  			resource.TestStep{
    49  				Config: testGoogleStorageBucketsReaderCustomAttributes,
    50  				Check: resource.ComposeTestCheckFunc(
    51  					testAccCheckCloudStorageBucketExists(
    52  						"google_storage_bucket.bucket", &bucketName),
    53  					resource.TestCheckResourceAttr(
    54  						"google_storage_bucket.bucket", "location", "EU"),
    55  					resource.TestCheckResourceAttr(
    56  						"google_storage_bucket.bucket", "force_destroy", "true"),
    57  				),
    58  			},
    59  		},
    60  	})
    61  }
    62  
    63  func TestAccStorageBucketUpdate(t *testing.T) {
    64  	var bucketName string
    65  
    66  	resource.Test(t, resource.TestCase{
    67  		PreCheck:     func() { testAccPreCheck(t) },
    68  		Providers:    testAccProviders,
    69  		CheckDestroy: testAccGoogleStorageDestroy,
    70  		Steps: []resource.TestStep{
    71  			resource.TestStep{
    72  				Config: testGoogleStorageBucketsReaderDefaults,
    73  				Check: resource.ComposeTestCheckFunc(
    74  					testAccCheckCloudStorageBucketExists(
    75  						"google_storage_bucket.bucket", &bucketName),
    76  					resource.TestCheckResourceAttr(
    77  						"google_storage_bucket.bucket", "location", "US"),
    78  					resource.TestCheckResourceAttr(
    79  						"google_storage_bucket.bucket", "force_destroy", "false"),
    80  				),
    81  			},
    82  			resource.TestStep{
    83  				Config: testGoogleStorageBucketsReaderCustomAttributes,
    84  				Check: resource.ComposeTestCheckFunc(
    85  					testAccCheckCloudStorageBucketExists(
    86  						"google_storage_bucket.bucket", &bucketName),
    87  					resource.TestCheckResourceAttr(
    88  						"google_storage_bucket.bucket", "predefined_acl", "publicReadWrite"),
    89  					resource.TestCheckResourceAttr(
    90  						"google_storage_bucket.bucket", "location", "EU"),
    91  					resource.TestCheckResourceAttr(
    92  						"google_storage_bucket.bucket", "force_destroy", "true"),
    93  				),
    94  			},
    95  		},
    96  	})
    97  }
    98  
    99  func TestAccStorageForceDestroy(t *testing.T) {
   100  	var bucketName string
   101  
   102  	resource.Test(t, resource.TestCase{
   103  		PreCheck:     func() { testAccPreCheck(t) },
   104  		Providers:    testAccProviders,
   105  		CheckDestroy: testAccGoogleStorageDestroy,
   106  		Steps: []resource.TestStep{
   107  			resource.TestStep{
   108  				Config: testGoogleStorageBucketsReaderCustomAttributes,
   109  				Check: resource.ComposeTestCheckFunc(
   110  					testAccCheckCloudStorageBucketExists(
   111  						"google_storage_bucket.bucket", &bucketName),
   112  				),
   113  			},
   114  			resource.TestStep{
   115  				Config: testGoogleStorageBucketsReaderCustomAttributes,
   116  				Check: resource.ComposeTestCheckFunc(
   117  					testAccCheckCloudStorageBucketPutItem(&bucketName),
   118  				),
   119  			},
   120  			resource.TestStep{
   121  				Config: "",
   122  				Check: resource.ComposeTestCheckFunc(
   123  					testAccCheckCloudStorageBucketMissing(&bucketName),
   124  				),
   125  			},
   126  		},
   127  	})
   128  }
   129  
   130  func testAccCheckCloudStorageBucketExists(n string, bucketName *string) resource.TestCheckFunc {
   131  	return func(s *terraform.State) error {
   132  		rs, ok := s.RootModule().Resources[n]
   133  		if !ok {
   134  			return fmt.Errorf("Not found: %s", n)
   135  		}
   136  
   137  		if rs.Primary.ID == "" {
   138  			return fmt.Errorf("No Project_ID is set")
   139  		}
   140  
   141  		config := testAccProvider.Meta().(*Config)
   142  
   143  		found, err := config.clientStorage.Buckets.Get(rs.Primary.ID).Do()
   144  		if err != nil {
   145  			return err
   146  		}
   147  
   148  		if found.Id != rs.Primary.ID {
   149  			return fmt.Errorf("Bucket not found")
   150  		}
   151  
   152  		*bucketName = found.Name
   153  		return nil
   154  	}
   155  }
   156  
   157  func testAccCheckCloudStorageBucketPutItem(bucketName *string) resource.TestCheckFunc {
   158  	return func(s *terraform.State) error {
   159  		config := testAccProvider.Meta().(*Config)
   160  
   161  		data := bytes.NewBufferString("test")
   162  		dataReader := bytes.NewReader(data.Bytes())
   163  		object := &storage.Object{Name: "bucketDestroyTestFile"}
   164  
   165  		// This needs to use Media(io.Reader) call, otherwise it does not go to /upload API and fails
   166  		if res, err := config.clientStorage.Objects.Insert(*bucketName, object).Media(dataReader).Do(); err == nil {
   167  			fmt.Printf("Created object %v at location %v\n\n", res.Name, res.SelfLink)
   168  		} else {
   169  			return fmt.Errorf("Objects.Insert failed: %v", err)
   170  		}
   171  
   172  		return nil
   173  	}
   174  }
   175  
   176  func testAccCheckCloudStorageBucketMissing(bucketName *string) resource.TestCheckFunc {
   177  	return func(s *terraform.State) error {
   178  		config := testAccProvider.Meta().(*Config)
   179  
   180  		_, err := config.clientStorage.Buckets.Get(*bucketName).Do()
   181  		if err == nil {
   182  			return fmt.Errorf("Found %s", *bucketName)
   183  		}
   184  
   185  		if gerr, ok := err.(*googleapi.Error); ok && gerr.Code == 404 {
   186  			return nil
   187  		} else {
   188  			return err
   189  		}
   190  	}
   191  }
   192  
   193  func testAccGoogleStorageDestroy(s *terraform.State) error {
   194  	config := testAccProvider.Meta().(*Config)
   195  
   196  	for _, rs := range s.RootModule().Resources {
   197  		if rs.Type != "google_storage_bucket" {
   198  			continue
   199  		}
   200  
   201  		_, err := config.clientStorage.Buckets.Get(rs.Primary.ID).Do()
   202  		if err == nil {
   203  			return fmt.Errorf("Bucket still exists")
   204  		}
   205  	}
   206  
   207  	return nil
   208  }
   209  
   210  var randInt = rand.New(rand.NewSource(time.Now().UnixNano())).Int()
   211  
   212  var testGoogleStorageBucketsReaderDefaults = fmt.Sprintf(`
   213  resource "google_storage_bucket" "bucket" {
   214  	name = "tf-test-bucket-%d"
   215  }
   216  `, randInt)
   217  
   218  var testGoogleStorageBucketsReaderCustomAttributes = fmt.Sprintf(`
   219  resource "google_storage_bucket" "bucket" {
   220  	name = "tf-test-bucket-%d"
   221  	predefined_acl = "publicReadWrite"
   222  	location = "EU"
   223  	force_destroy = "true"
   224  }
   225  `, randInt)