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 }