github.com/andresvia/terraform@v0.6.15-0.20160412045437-d51c75946785/builtin/providers/aws/resource_aws_s3_bucket_object_test.go (about)

     1  package aws
     2  
     3  import (
     4  	"fmt"
     5  	"io/ioutil"
     6  	"os"
     7  	"testing"
     8  
     9  	"github.com/hashicorp/terraform/helper/acctest"
    10  	"github.com/hashicorp/terraform/helper/resource"
    11  	"github.com/hashicorp/terraform/terraform"
    12  
    13  	"github.com/aws/aws-sdk-go/aws"
    14  	"github.com/aws/aws-sdk-go/service/s3"
    15  )
    16  
    17  func TestAccAWSS3BucketObject_source(t *testing.T) {
    18  	tmpFile, err := ioutil.TempFile("", "tf-acc-s3-obj-source")
    19  	if err != nil {
    20  		t.Fatal(err)
    21  	}
    22  	defer os.Remove(tmpFile.Name())
    23  
    24  	rInt := acctest.RandInt()
    25  	// first write some data to the tempfile just so it's not 0 bytes.
    26  	err = ioutil.WriteFile(tmpFile.Name(), []byte("{anything will do }"), 0644)
    27  	if err != nil {
    28  		t.Fatal(err)
    29  	}
    30  	var obj s3.GetObjectOutput
    31  
    32  	resource.Test(t, resource.TestCase{
    33  		PreCheck:     func() { testAccPreCheck(t) },
    34  		Providers:    testAccProviders,
    35  		CheckDestroy: testAccCheckAWSS3BucketObjectDestroy,
    36  		Steps: []resource.TestStep{
    37  			resource.TestStep{
    38  				Config: testAccAWSS3BucketObjectConfigSource(rInt, tmpFile.Name()),
    39  				Check:  testAccCheckAWSS3BucketObjectExists("aws_s3_bucket_object.object", &obj),
    40  			},
    41  		},
    42  	})
    43  }
    44  
    45  func TestAccAWSS3BucketObject_content(t *testing.T) {
    46  	rInt := acctest.RandInt()
    47  	var obj s3.GetObjectOutput
    48  
    49  	resource.Test(t, resource.TestCase{
    50  		PreCheck:     func() { testAccPreCheck(t) },
    51  		Providers:    testAccProviders,
    52  		CheckDestroy: testAccCheckAWSS3BucketObjectDestroy,
    53  		Steps: []resource.TestStep{
    54  			resource.TestStep{
    55  				PreConfig: func() {},
    56  				Config:    testAccAWSS3BucketObjectConfigContent(rInt),
    57  				Check:     testAccCheckAWSS3BucketObjectExists("aws_s3_bucket_object.object", &obj),
    58  			},
    59  		},
    60  	})
    61  }
    62  
    63  func TestAccAWSS3BucketObject_withContentCharacteristics(t *testing.T) {
    64  	tmpFile, err := ioutil.TempFile("", "tf-acc-s3-obj-content-characteristics")
    65  	if err != nil {
    66  		t.Fatal(err)
    67  	}
    68  	defer os.Remove(tmpFile.Name())
    69  
    70  	rInt := acctest.RandInt()
    71  	// first write some data to the tempfile just so it's not 0 bytes.
    72  	err = ioutil.WriteFile(tmpFile.Name(), []byte("{anything will do }"), 0644)
    73  	if err != nil {
    74  		t.Fatal(err)
    75  	}
    76  
    77  	var obj s3.GetObjectOutput
    78  
    79  	resource.Test(t, resource.TestCase{
    80  		PreCheck:     func() { testAccPreCheck(t) },
    81  		Providers:    testAccProviders,
    82  		CheckDestroy: testAccCheckAWSS3BucketObjectDestroy,
    83  		Steps: []resource.TestStep{
    84  			resource.TestStep{
    85  				Config: testAccAWSS3BucketObjectConfig_withContentCharacteristics(rInt, tmpFile.Name()),
    86  				Check: resource.ComposeTestCheckFunc(
    87  					testAccCheckAWSS3BucketObjectExists("aws_s3_bucket_object.object", &obj),
    88  					resource.TestCheckResourceAttr(
    89  						"aws_s3_bucket_object.object", "content_type", "binary/octet-stream"),
    90  				),
    91  			},
    92  		},
    93  	})
    94  }
    95  
    96  func TestAccAWSS3BucketObject_updates(t *testing.T) {
    97  	tmpFile, err := ioutil.TempFile("", "tf-acc-s3-obj-updates")
    98  	if err != nil {
    99  		t.Fatal(err)
   100  	}
   101  	defer os.Remove(tmpFile.Name())
   102  
   103  	rInt := acctest.RandInt()
   104  	err = ioutil.WriteFile(tmpFile.Name(), []byte("initial object state"), 0644)
   105  	if err != nil {
   106  		t.Fatal(err)
   107  	}
   108  	var obj s3.GetObjectOutput
   109  
   110  	resource.Test(t, resource.TestCase{
   111  		PreCheck:     func() { testAccPreCheck(t) },
   112  		Providers:    testAccProviders,
   113  		CheckDestroy: testAccCheckAWSS3BucketObjectDestroy,
   114  		Steps: []resource.TestStep{
   115  			resource.TestStep{
   116  				Config: testAccAWSS3BucketObjectConfig_updates(rInt, tmpFile.Name()),
   117  				Check: resource.ComposeTestCheckFunc(
   118  					testAccCheckAWSS3BucketObjectExists("aws_s3_bucket_object.object", &obj),
   119  					resource.TestCheckResourceAttr("aws_s3_bucket_object.object", "etag", "647d1d58e1011c743ec67d5e8af87b53"),
   120  				),
   121  			},
   122  			resource.TestStep{
   123  				PreConfig: func() {
   124  					err = ioutil.WriteFile(tmpFile.Name(), []byte("modified object"), 0644)
   125  					if err != nil {
   126  						t.Fatal(err)
   127  					}
   128  				},
   129  				Config: testAccAWSS3BucketObjectConfig_updates(rInt, tmpFile.Name()),
   130  				Check: resource.ComposeTestCheckFunc(
   131  					testAccCheckAWSS3BucketObjectExists("aws_s3_bucket_object.object", &obj),
   132  					resource.TestCheckResourceAttr("aws_s3_bucket_object.object", "etag", "1c7fd13df1515c2a13ad9eb068931f09"),
   133  				),
   134  			},
   135  		},
   136  	})
   137  }
   138  
   139  func TestAccAWSS3BucketObject_updatesWithVersioning(t *testing.T) {
   140  	tmpFile, err := ioutil.TempFile("", "tf-acc-s3-obj-updates-w-versions")
   141  	if err != nil {
   142  		t.Fatal(err)
   143  	}
   144  	defer os.Remove(tmpFile.Name())
   145  
   146  	rInt := acctest.RandInt()
   147  	err = ioutil.WriteFile(tmpFile.Name(), []byte("initial versioned object state"), 0644)
   148  	if err != nil {
   149  		t.Fatal(err)
   150  	}
   151  
   152  	var originalObj, modifiedObj s3.GetObjectOutput
   153  
   154  	resource.Test(t, resource.TestCase{
   155  		PreCheck:     func() { testAccPreCheck(t) },
   156  		Providers:    testAccProviders,
   157  		CheckDestroy: testAccCheckAWSS3BucketObjectDestroy,
   158  		Steps: []resource.TestStep{
   159  			resource.TestStep{
   160  				Config: testAccAWSS3BucketObjectConfig_updatesWithVersioning(rInt, tmpFile.Name()),
   161  				Check: resource.ComposeTestCheckFunc(
   162  					testAccCheckAWSS3BucketObjectExists("aws_s3_bucket_object.object", &originalObj),
   163  					resource.TestCheckResourceAttr("aws_s3_bucket_object.object", "etag", "cee4407fa91906284e2a5e5e03e86b1b"),
   164  				),
   165  			},
   166  			resource.TestStep{
   167  				PreConfig: func() {
   168  					err = ioutil.WriteFile(tmpFile.Name(), []byte("modified versioned object"), 0644)
   169  					if err != nil {
   170  						t.Fatal(err)
   171  					}
   172  				},
   173  				Config: testAccAWSS3BucketObjectConfig_updatesWithVersioning(rInt, tmpFile.Name()),
   174  				Check: resource.ComposeTestCheckFunc(
   175  					testAccCheckAWSS3BucketObjectExists("aws_s3_bucket_object.object", &modifiedObj),
   176  					resource.TestCheckResourceAttr("aws_s3_bucket_object.object", "etag", "00b8c73b1b50e7cc932362c7225b8e29"),
   177  					testAccCheckAWSS3BucketObjectVersionIdDiffers(&originalObj, &modifiedObj),
   178  				),
   179  			},
   180  		},
   181  	})
   182  }
   183  
   184  func testAccCheckAWSS3BucketObjectVersionIdDiffers(first, second *s3.GetObjectOutput) resource.TestCheckFunc {
   185  	return func(s *terraform.State) error {
   186  		if first.VersionId == nil {
   187  			return fmt.Errorf("Expected first object to have VersionId: %s", first)
   188  		}
   189  		if second.VersionId == nil {
   190  			return fmt.Errorf("Expected second object to have VersionId: %s", second)
   191  		}
   192  
   193  		if *first.VersionId == *second.VersionId {
   194  			return fmt.Errorf("Expected Version IDs to differ, but they are equal (%s)", *first.VersionId)
   195  		}
   196  
   197  		return nil
   198  	}
   199  }
   200  
   201  func testAccCheckAWSS3BucketObjectDestroy(s *terraform.State) error {
   202  	s3conn := testAccProvider.Meta().(*AWSClient).s3conn
   203  
   204  	for _, rs := range s.RootModule().Resources {
   205  		if rs.Type != "aws_s3_bucket_object" {
   206  			continue
   207  		}
   208  
   209  		_, err := s3conn.HeadObject(
   210  			&s3.HeadObjectInput{
   211  				Bucket:  aws.String(rs.Primary.Attributes["bucket"]),
   212  				Key:     aws.String(rs.Primary.Attributes["key"]),
   213  				IfMatch: aws.String(rs.Primary.Attributes["etag"]),
   214  			})
   215  		if err == nil {
   216  			return fmt.Errorf("AWS S3 Object still exists: %s", rs.Primary.ID)
   217  		}
   218  	}
   219  	return nil
   220  }
   221  
   222  func testAccCheckAWSS3BucketObjectExists(n string, obj *s3.GetObjectOutput) resource.TestCheckFunc {
   223  	return func(s *terraform.State) error {
   224  		rs, ok := s.RootModule().Resources[n]
   225  		if !ok {
   226  			return fmt.Errorf("Not Found: %s", n)
   227  		}
   228  
   229  		if rs.Primary.ID == "" {
   230  			return fmt.Errorf("No S3 Bucket Object ID is set")
   231  		}
   232  
   233  		s3conn := testAccProvider.Meta().(*AWSClient).s3conn
   234  		out, err := s3conn.GetObject(
   235  			&s3.GetObjectInput{
   236  				Bucket:  aws.String(rs.Primary.Attributes["bucket"]),
   237  				Key:     aws.String(rs.Primary.Attributes["key"]),
   238  				IfMatch: aws.String(rs.Primary.Attributes["etag"]),
   239  			})
   240  		if err != nil {
   241  			return fmt.Errorf("S3Bucket Object error: %s", err)
   242  		}
   243  
   244  		*obj = *out
   245  
   246  		return nil
   247  	}
   248  }
   249  
   250  func TestAccAWSS3BucketObject_kms(t *testing.T) {
   251  	rInt := acctest.RandInt()
   252  	var obj s3.GetObjectOutput
   253  
   254  	resource.Test(t, resource.TestCase{
   255  		PreCheck:     func() { testAccPreCheck(t) },
   256  		Providers:    testAccProviders,
   257  		CheckDestroy: testAccCheckAWSS3BucketObjectDestroy,
   258  		Steps: []resource.TestStep{
   259  			resource.TestStep{
   260  				PreConfig: func() {},
   261  				Config:    testAccAWSS3BucketObjectConfig_withKMSId(rInt),
   262  				Check:     testAccCheckAWSS3BucketObjectExists("aws_s3_bucket_object.object", &obj),
   263  			},
   264  		},
   265  	})
   266  }
   267  
   268  func testAccAWSS3BucketObjectConfigSource(randInt int, source string) string {
   269  	return fmt.Sprintf(`
   270  resource "aws_s3_bucket" "object_bucket" {
   271      bucket = "tf-object-test-bucket-%d"
   272  }
   273  resource "aws_s3_bucket_object" "object" {
   274  	bucket = "${aws_s3_bucket.object_bucket.bucket}"
   275  	key = "test-key"
   276  	source = "%s"
   277  	content_type = "binary/octet-stream"
   278  }
   279  `, randInt, source)
   280  }
   281  
   282  func testAccAWSS3BucketObjectConfig_withContentCharacteristics(randInt int, source string) string {
   283  	return fmt.Sprintf(`
   284  resource "aws_s3_bucket" "object_bucket_2" {
   285  	bucket = "tf-object-test-bucket-%d"
   286  }
   287  
   288  resource "aws_s3_bucket_object" "object" {
   289  	bucket = "${aws_s3_bucket.object_bucket_2.bucket}"
   290  	key = "test-key"
   291  	source = "%s"
   292  	content_language = "en"
   293  	content_type = "binary/octet-stream"
   294  }
   295  `, randInt, source)
   296  }
   297  
   298  func testAccAWSS3BucketObjectConfigContent(randInt int) string {
   299  	return fmt.Sprintf(`
   300  resource "aws_s3_bucket" "object_bucket" {
   301          bucket = "tf-object-test-bucket-%d"
   302  }
   303  resource "aws_s3_bucket_object" "object" {
   304          bucket = "${aws_s3_bucket.object_bucket.bucket}"
   305          key = "test-key"
   306          content = "some_bucket_content"
   307  }
   308  `, randInt)
   309  }
   310  
   311  func testAccAWSS3BucketObjectConfig_updates(randInt int, source string) string {
   312  	return fmt.Sprintf(`
   313  resource "aws_s3_bucket" "object_bucket_3" {
   314  	bucket = "tf-object-test-bucket-%d"
   315  }
   316  
   317  resource "aws_s3_bucket_object" "object" {
   318  	bucket = "${aws_s3_bucket.object_bucket_3.bucket}"
   319  	key = "updateable-key"
   320  	source = "%s"
   321  	etag = "${md5(file("%s"))}"
   322  }
   323  `, randInt, source, source)
   324  }
   325  
   326  func testAccAWSS3BucketObjectConfig_updatesWithVersioning(randInt int, source string) string {
   327  	return fmt.Sprintf(`
   328  resource "aws_s3_bucket" "object_bucket_3" {
   329  	bucket = "tf-object-test-bucket-%d"
   330  	versioning {
   331  		enabled = true
   332  	}
   333  }
   334  
   335  resource "aws_s3_bucket_object" "object" {
   336  	bucket = "${aws_s3_bucket.object_bucket_3.bucket}"
   337  	key = "updateable-key"
   338  	source = "%s"
   339  	etag = "${md5(file("%s"))}"
   340  }
   341  `, randInt, source, source)
   342  }
   343  
   344  func testAccAWSS3BucketObjectConfig_withKMSId(randInt int) string {
   345  	return fmt.Sprintf(`
   346  resource "aws_kms_key" "kms_key_1" {
   347  }
   348  
   349  resource "aws_s3_bucket" "object_bucket_2" {
   350  	bucket = "tf-object-test-bucket-%d"
   351  }
   352  
   353  resource "aws_s3_bucket_object" "object" {
   354  	bucket = "${aws_s3_bucket.object_bucket_2.bucket}"
   355  	key = "test-key"
   356  	content = "stuff"
   357  	kms_key_id = "${aws_kms_key.kms_key_1.key_id}"
   358  }
   359  `, randInt)
   360  }