github.com/ojongerius/terraform@v0.7.1-0.20160811111335-97fcd5f4cc90/builtin/providers/aws/resource_aws_s3_bucket_test.go (about) 1 package aws 2 3 import ( 4 "encoding/json" 5 "fmt" 6 "reflect" 7 "regexp" 8 "strconv" 9 "testing" 10 11 "github.com/hashicorp/terraform/helper/acctest" 12 "github.com/hashicorp/terraform/helper/resource" 13 "github.com/hashicorp/terraform/terraform" 14 15 "github.com/aws/aws-sdk-go/aws" 16 "github.com/aws/aws-sdk-go/aws/awserr" 17 "github.com/aws/aws-sdk-go/service/s3" 18 ) 19 20 func TestAccAWSS3Bucket_basic(t *testing.T) { 21 rInt := acctest.RandInt() 22 arnRegexp := regexp.MustCompile( 23 "^arn:aws:s3:::") 24 25 resource.Test(t, resource.TestCase{ 26 PreCheck: func() { testAccPreCheck(t) }, 27 /* 28 IDRefreshName: "aws_s3_bucket.bucket", 29 IDRefreshIgnore: []string{"force_destroy"}, 30 */ 31 Providers: testAccProviders, 32 CheckDestroy: testAccCheckAWSS3BucketDestroy, 33 Steps: []resource.TestStep{ 34 resource.TestStep{ 35 Config: testAccAWSS3BucketConfig(rInt), 36 Check: resource.ComposeTestCheckFunc( 37 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 38 resource.TestCheckResourceAttr( 39 "aws_s3_bucket.bucket", "hosted_zone_id", HostedZoneIDForRegion("us-west-2")), 40 resource.TestCheckResourceAttr( 41 "aws_s3_bucket.bucket", "region", "us-west-2"), 42 resource.TestCheckResourceAttr( 43 "aws_s3_bucket.bucket", "website_endpoint", ""), 44 resource.TestMatchResourceAttr( 45 "aws_s3_bucket.bucket", "arn", arnRegexp), 46 ), 47 }, 48 }, 49 }) 50 } 51 52 func TestAccAWSS3Bucket_acceleration(t *testing.T) { 53 rInt := acctest.RandInt() 54 55 resource.Test(t, resource.TestCase{ 56 PreCheck: func() { testAccPreCheck(t) }, 57 Providers: testAccProviders, 58 CheckDestroy: testAccCheckAWSS3BucketDestroy, 59 Steps: []resource.TestStep{ 60 resource.TestStep{ 61 Config: testAccAWSS3BucketConfigWithAcceleration(rInt), 62 Check: resource.ComposeTestCheckFunc( 63 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 64 resource.TestCheckResourceAttr( 65 "aws_s3_bucket.bucket", "acceleration_status", "Enabled"), 66 ), 67 }, 68 resource.TestStep{ 69 Config: testAccAWSS3BucketConfigWithoutAcceleration(rInt), 70 Check: resource.ComposeTestCheckFunc( 71 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 72 resource.TestCheckResourceAttr( 73 "aws_s3_bucket.bucket", "acceleration_status", "Suspended"), 74 ), 75 }, 76 }, 77 }) 78 } 79 80 func TestAccAWSS3Bucket_RequestPayer(t *testing.T) { 81 rInt := acctest.RandInt() 82 83 resource.Test(t, resource.TestCase{ 84 PreCheck: func() { testAccPreCheck(t) }, 85 Providers: testAccProviders, 86 CheckDestroy: testAccCheckAWSS3BucketDestroy, 87 Steps: []resource.TestStep{ 88 resource.TestStep{ 89 Config: testAccAWSS3BucketConfigRequestPayerBucketOwner(rInt), 90 Check: resource.ComposeTestCheckFunc( 91 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 92 resource.TestCheckResourceAttr( 93 "aws_s3_bucket.bucket", 94 "request_payer", 95 "BucketOwner"), 96 testAccCheckAWSS3RequestPayer( 97 "aws_s3_bucket.bucket", 98 "BucketOwner"), 99 ), 100 }, 101 resource.TestStep{ 102 Config: testAccAWSS3BucketConfigRequestPayerRequester(rInt), 103 Check: resource.ComposeTestCheckFunc( 104 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 105 resource.TestCheckResourceAttr( 106 "aws_s3_bucket.bucket", 107 "request_payer", 108 "Requester"), 109 testAccCheckAWSS3RequestPayer( 110 "aws_s3_bucket.bucket", 111 "Requester"), 112 ), 113 }, 114 }, 115 }) 116 } 117 118 func TestResourceAWSS3BucketRequestPayer_validation(t *testing.T) { 119 _, errors := validateS3BucketRequestPayerType("incorrect", "request_payer") 120 if len(errors) == 0 { 121 t.Fatalf("Expected to trigger a validation error") 122 } 123 124 var testCases = []struct { 125 Value string 126 ErrCount int 127 }{ 128 { 129 Value: "Requester", 130 ErrCount: 0, 131 }, 132 { 133 Value: "BucketOwner", 134 ErrCount: 0, 135 }, 136 } 137 138 for _, tc := range testCases { 139 _, errors := validateS3BucketRequestPayerType(tc.Value, "request_payer") 140 if len(errors) != tc.ErrCount { 141 t.Fatalf("Expected not to trigger a validation error") 142 } 143 } 144 } 145 146 func TestAccAWSS3Bucket_Policy(t *testing.T) { 147 rInt := acctest.RandInt() 148 149 resource.Test(t, resource.TestCase{ 150 PreCheck: func() { testAccPreCheck(t) }, 151 Providers: testAccProviders, 152 CheckDestroy: testAccCheckAWSS3BucketDestroy, 153 Steps: []resource.TestStep{ 154 resource.TestStep{ 155 Config: testAccAWSS3BucketConfigWithPolicy(rInt), 156 Check: resource.ComposeTestCheckFunc( 157 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 158 testAccCheckAWSS3BucketPolicy( 159 "aws_s3_bucket.bucket", testAccAWSS3BucketPolicy(rInt)), 160 ), 161 }, 162 resource.TestStep{ 163 Config: testAccAWSS3BucketConfig(rInt), 164 Check: resource.ComposeTestCheckFunc( 165 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 166 testAccCheckAWSS3BucketPolicy( 167 "aws_s3_bucket.bucket", ""), 168 ), 169 }, 170 resource.TestStep{ 171 Config: testAccAWSS3BucketConfigWithEmptyPolicy(rInt), 172 Check: resource.ComposeTestCheckFunc( 173 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 174 testAccCheckAWSS3BucketPolicy( 175 "aws_s3_bucket.bucket", ""), 176 ), 177 }, 178 }, 179 }) 180 } 181 182 func TestAccAWSS3Bucket_UpdateAcl(t *testing.T) { 183 ri := acctest.RandInt() 184 preConfig := fmt.Sprintf(testAccAWSS3BucketConfigWithAcl, ri) 185 postConfig := fmt.Sprintf(testAccAWSS3BucketConfigWithAclUpdate, ri) 186 187 resource.Test(t, resource.TestCase{ 188 PreCheck: func() { testAccPreCheck(t) }, 189 Providers: testAccProviders, 190 CheckDestroy: testAccCheckAWSS3BucketDestroy, 191 Steps: []resource.TestStep{ 192 resource.TestStep{ 193 Config: preConfig, 194 Check: resource.ComposeTestCheckFunc( 195 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 196 resource.TestCheckResourceAttr( 197 "aws_s3_bucket.bucket", "acl", "public-read"), 198 ), 199 }, 200 resource.TestStep{ 201 Config: postConfig, 202 Check: resource.ComposeTestCheckFunc( 203 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 204 resource.TestCheckResourceAttr( 205 "aws_s3_bucket.bucket", "acl", "private"), 206 ), 207 }, 208 }, 209 }) 210 } 211 212 func TestAccAWSS3Bucket_Website_Simple(t *testing.T) { 213 rInt := acctest.RandInt() 214 resource.Test(t, resource.TestCase{ 215 PreCheck: func() { testAccPreCheck(t) }, 216 Providers: testAccProviders, 217 CheckDestroy: testAccCheckAWSS3BucketDestroy, 218 Steps: []resource.TestStep{ 219 resource.TestStep{ 220 Config: testAccAWSS3BucketWebsiteConfig(rInt), 221 Check: resource.ComposeTestCheckFunc( 222 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 223 testAccCheckAWSS3BucketWebsite( 224 "aws_s3_bucket.bucket", "index.html", "", "", ""), 225 resource.TestCheckResourceAttr( 226 "aws_s3_bucket.bucket", "website_endpoint", testAccWebsiteEndpoint(rInt)), 227 ), 228 }, 229 resource.TestStep{ 230 Config: testAccAWSS3BucketWebsiteConfigWithError(rInt), 231 Check: resource.ComposeTestCheckFunc( 232 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 233 testAccCheckAWSS3BucketWebsite( 234 "aws_s3_bucket.bucket", "index.html", "error.html", "", ""), 235 resource.TestCheckResourceAttr( 236 "aws_s3_bucket.bucket", "website_endpoint", testAccWebsiteEndpoint(rInt)), 237 ), 238 }, 239 resource.TestStep{ 240 Config: testAccAWSS3BucketConfig(rInt), 241 Check: resource.ComposeTestCheckFunc( 242 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 243 testAccCheckAWSS3BucketWebsite( 244 "aws_s3_bucket.bucket", "", "", "", ""), 245 resource.TestCheckResourceAttr( 246 "aws_s3_bucket.bucket", "website_endpoint", ""), 247 ), 248 }, 249 }, 250 }) 251 } 252 253 func TestAccAWSS3Bucket_WebsiteRedirect(t *testing.T) { 254 rInt := acctest.RandInt() 255 resource.Test(t, resource.TestCase{ 256 PreCheck: func() { testAccPreCheck(t) }, 257 Providers: testAccProviders, 258 CheckDestroy: testAccCheckAWSS3BucketDestroy, 259 Steps: []resource.TestStep{ 260 resource.TestStep{ 261 Config: testAccAWSS3BucketWebsiteConfigWithRedirect(rInt), 262 Check: resource.ComposeTestCheckFunc( 263 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 264 testAccCheckAWSS3BucketWebsite( 265 "aws_s3_bucket.bucket", "", "", "", "hashicorp.com"), 266 resource.TestCheckResourceAttr( 267 "aws_s3_bucket.bucket", "website_endpoint", testAccWebsiteEndpoint(rInt)), 268 ), 269 }, 270 resource.TestStep{ 271 Config: testAccAWSS3BucketWebsiteConfigWithHttpsRedirect(rInt), 272 Check: resource.ComposeTestCheckFunc( 273 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 274 testAccCheckAWSS3BucketWebsite( 275 "aws_s3_bucket.bucket", "", "", "https", "hashicorp.com"), 276 resource.TestCheckResourceAttr( 277 "aws_s3_bucket.bucket", "website_endpoint", testAccWebsiteEndpoint(rInt)), 278 ), 279 }, 280 resource.TestStep{ 281 Config: testAccAWSS3BucketConfig(rInt), 282 Check: resource.ComposeTestCheckFunc( 283 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 284 testAccCheckAWSS3BucketWebsite( 285 "aws_s3_bucket.bucket", "", "", "", ""), 286 resource.TestCheckResourceAttr( 287 "aws_s3_bucket.bucket", "website_endpoint", ""), 288 ), 289 }, 290 }, 291 }) 292 } 293 294 func TestAccAWSS3Bucket_WebsiteRoutingRules(t *testing.T) { 295 rInt := acctest.RandInt() 296 resource.Test(t, resource.TestCase{ 297 PreCheck: func() { testAccPreCheck(t) }, 298 Providers: testAccProviders, 299 CheckDestroy: testAccCheckAWSS3BucketDestroy, 300 Steps: []resource.TestStep{ 301 resource.TestStep{ 302 Config: testAccAWSS3BucketWebsiteConfigWithRoutingRules(rInt), 303 Check: resource.ComposeTestCheckFunc( 304 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 305 testAccCheckAWSS3BucketWebsite( 306 "aws_s3_bucket.bucket", "index.html", "error.html", "", ""), 307 testAccCheckAWSS3BucketWebsiteRoutingRules( 308 "aws_s3_bucket.bucket", 309 []*s3.RoutingRule{ 310 &s3.RoutingRule{ 311 Condition: &s3.Condition{ 312 KeyPrefixEquals: aws.String("docs/"), 313 }, 314 Redirect: &s3.Redirect{ 315 ReplaceKeyPrefixWith: aws.String("documents/"), 316 }, 317 }, 318 }, 319 ), 320 resource.TestCheckResourceAttr( 321 "aws_s3_bucket.bucket", "website_endpoint", testAccWebsiteEndpoint(rInt)), 322 ), 323 }, 324 resource.TestStep{ 325 Config: testAccAWSS3BucketConfig(rInt), 326 Check: resource.ComposeTestCheckFunc( 327 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 328 testAccCheckAWSS3BucketWebsite( 329 "aws_s3_bucket.bucket", "", "", "", ""), 330 testAccCheckAWSS3BucketWebsiteRoutingRules("aws_s3_bucket.bucket", nil), 331 resource.TestCheckResourceAttr( 332 "aws_s3_bucket.bucket", "website_endpoint", ""), 333 ), 334 }, 335 }, 336 }) 337 } 338 339 // Test TestAccAWSS3Bucket_shouldFailNotFound is designed to fail with a "plan 340 // not empty" error in Terraform, to check against regresssions. 341 // See https://github.com/hashicorp/terraform/pull/2925 342 func TestAccAWSS3Bucket_shouldFailNotFound(t *testing.T) { 343 rInt := acctest.RandInt() 344 resource.Test(t, resource.TestCase{ 345 PreCheck: func() { testAccPreCheck(t) }, 346 Providers: testAccProviders, 347 CheckDestroy: testAccCheckAWSS3BucketDestroy, 348 Steps: []resource.TestStep{ 349 resource.TestStep{ 350 Config: testAccAWSS3BucketDestroyedConfig(rInt), 351 Check: resource.ComposeTestCheckFunc( 352 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 353 testAccCheckAWSS3DestroyBucket("aws_s3_bucket.bucket"), 354 ), 355 ExpectNonEmptyPlan: true, 356 }, 357 }, 358 }) 359 } 360 361 func TestAccAWSS3Bucket_Versioning(t *testing.T) { 362 rInt := acctest.RandInt() 363 resource.Test(t, resource.TestCase{ 364 PreCheck: func() { testAccPreCheck(t) }, 365 Providers: testAccProviders, 366 CheckDestroy: testAccCheckAWSS3BucketDestroy, 367 Steps: []resource.TestStep{ 368 resource.TestStep{ 369 Config: testAccAWSS3BucketConfig(rInt), 370 Check: resource.ComposeTestCheckFunc( 371 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 372 testAccCheckAWSS3BucketVersioning( 373 "aws_s3_bucket.bucket", ""), 374 ), 375 }, 376 resource.TestStep{ 377 Config: testAccAWSS3BucketConfigWithVersioning(rInt), 378 Check: resource.ComposeTestCheckFunc( 379 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 380 testAccCheckAWSS3BucketVersioning( 381 "aws_s3_bucket.bucket", s3.BucketVersioningStatusEnabled), 382 ), 383 }, 384 resource.TestStep{ 385 Config: testAccAWSS3BucketConfigWithDisableVersioning(rInt), 386 Check: resource.ComposeTestCheckFunc( 387 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 388 testAccCheckAWSS3BucketVersioning( 389 "aws_s3_bucket.bucket", s3.BucketVersioningStatusSuspended), 390 ), 391 }, 392 }, 393 }) 394 } 395 396 func TestAccAWSS3Bucket_Cors(t *testing.T) { 397 rInt := acctest.RandInt() 398 resource.Test(t, resource.TestCase{ 399 PreCheck: func() { testAccPreCheck(t) }, 400 Providers: testAccProviders, 401 CheckDestroy: testAccCheckAWSS3BucketDestroy, 402 Steps: []resource.TestStep{ 403 resource.TestStep{ 404 Config: testAccAWSS3BucketConfigWithCORS(rInt), 405 Check: resource.ComposeTestCheckFunc( 406 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 407 testAccCheckAWSS3BucketCors( 408 "aws_s3_bucket.bucket", 409 []*s3.CORSRule{ 410 &s3.CORSRule{ 411 AllowedHeaders: []*string{aws.String("*")}, 412 AllowedMethods: []*string{aws.String("PUT"), aws.String("POST")}, 413 AllowedOrigins: []*string{aws.String("https://www.example.com")}, 414 ExposeHeaders: []*string{aws.String("x-amz-server-side-encryption"), aws.String("ETag")}, 415 MaxAgeSeconds: aws.Int64(3000), 416 }, 417 }, 418 ), 419 ), 420 }, 421 }, 422 }) 423 } 424 425 func TestAccAWSS3Bucket_Logging(t *testing.T) { 426 rInt := acctest.RandInt() 427 resource.Test(t, resource.TestCase{ 428 PreCheck: func() { testAccPreCheck(t) }, 429 Providers: testAccProviders, 430 CheckDestroy: testAccCheckAWSS3BucketDestroy, 431 Steps: []resource.TestStep{ 432 resource.TestStep{ 433 Config: testAccAWSS3BucketConfigWithLogging(rInt), 434 Check: resource.ComposeTestCheckFunc( 435 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 436 testAccCheckAWSS3BucketLogging( 437 "aws_s3_bucket.bucket", "aws_s3_bucket.log_bucket", "log/"), 438 ), 439 }, 440 }, 441 }) 442 } 443 444 func TestAccAWSS3Bucket_Lifecycle(t *testing.T) { 445 rInt := acctest.RandInt() 446 resource.Test(t, resource.TestCase{ 447 PreCheck: func() { testAccPreCheck(t) }, 448 Providers: testAccProviders, 449 CheckDestroy: testAccCheckAWSS3BucketDestroy, 450 Steps: []resource.TestStep{ 451 resource.TestStep{ 452 Config: testAccAWSS3BucketConfigWithLifecycle(rInt), 453 Check: resource.ComposeTestCheckFunc( 454 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 455 resource.TestCheckResourceAttr( 456 "aws_s3_bucket.bucket", "lifecycle_rule.0.id", "id1"), 457 resource.TestCheckResourceAttr( 458 "aws_s3_bucket.bucket", "lifecycle_rule.0.prefix", "path1/"), 459 resource.TestCheckResourceAttr( 460 "aws_s3_bucket.bucket", "lifecycle_rule.0.expiration.2613713285.days", "365"), 461 resource.TestCheckResourceAttr( 462 "aws_s3_bucket.bucket", "lifecycle_rule.0.expiration.2613713285.date", ""), 463 resource.TestCheckResourceAttr( 464 "aws_s3_bucket.bucket", "lifecycle_rule.0.expiration.2613713285.expired_object_delete_marker", "false"), 465 resource.TestCheckResourceAttr( 466 "aws_s3_bucket.bucket", "lifecycle_rule.0.transition.2000431762.date", ""), 467 resource.TestCheckResourceAttr( 468 "aws_s3_bucket.bucket", "lifecycle_rule.0.transition.2000431762.days", "30"), 469 resource.TestCheckResourceAttr( 470 "aws_s3_bucket.bucket", "lifecycle_rule.0.transition.2000431762.storage_class", "STANDARD_IA"), 471 resource.TestCheckResourceAttr( 472 "aws_s3_bucket.bucket", "lifecycle_rule.0.transition.6450812.date", ""), 473 resource.TestCheckResourceAttr( 474 "aws_s3_bucket.bucket", "lifecycle_rule.0.transition.6450812.days", "60"), 475 resource.TestCheckResourceAttr( 476 "aws_s3_bucket.bucket", "lifecycle_rule.0.transition.6450812.storage_class", "GLACIER"), 477 resource.TestCheckResourceAttr( 478 "aws_s3_bucket.bucket", "lifecycle_rule.1.id", "id2"), 479 resource.TestCheckResourceAttr( 480 "aws_s3_bucket.bucket", "lifecycle_rule.1.prefix", "path2/"), 481 resource.TestCheckResourceAttr( 482 "aws_s3_bucket.bucket", "lifecycle_rule.1.expiration.2855832418.date", "2016-01-12"), 483 resource.TestCheckResourceAttr( 484 "aws_s3_bucket.bucket", "lifecycle_rule.1.expiration.2855832418.days", "0"), 485 resource.TestCheckResourceAttr( 486 "aws_s3_bucket.bucket", "lifecycle_rule.1.expiration.2855832418.expired_object_delete_marker", "false"), 487 ), 488 }, 489 resource.TestStep{ 490 Config: testAccAWSS3BucketConfigWithVersioningLifecycle(rInt), 491 Check: resource.ComposeTestCheckFunc( 492 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 493 resource.TestCheckResourceAttr( 494 "aws_s3_bucket.bucket", "lifecycle_rule.0.id", "id1"), 495 resource.TestCheckResourceAttr( 496 "aws_s3_bucket.bucket", "lifecycle_rule.0.prefix", "path1/"), 497 resource.TestCheckResourceAttr( 498 "aws_s3_bucket.bucket", "lifecycle_rule.0.enabled", "true"), 499 resource.TestCheckResourceAttr( 500 "aws_s3_bucket.bucket", "lifecycle_rule.0.noncurrent_version_expiration.80908210.days", "365"), 501 resource.TestCheckResourceAttr( 502 "aws_s3_bucket.bucket", "lifecycle_rule.0.noncurrent_version_transition.1377917700.days", "30"), 503 resource.TestCheckResourceAttr( 504 "aws_s3_bucket.bucket", "lifecycle_rule.0.noncurrent_version_transition.1377917700.storage_class", "STANDARD_IA"), 505 resource.TestCheckResourceAttr( 506 "aws_s3_bucket.bucket", "lifecycle_rule.0.noncurrent_version_transition.2528035817.days", "60"), 507 resource.TestCheckResourceAttr( 508 "aws_s3_bucket.bucket", "lifecycle_rule.0.noncurrent_version_transition.2528035817.storage_class", "GLACIER"), 509 resource.TestCheckResourceAttr( 510 "aws_s3_bucket.bucket", "lifecycle_rule.1.id", "id2"), 511 resource.TestCheckResourceAttr( 512 "aws_s3_bucket.bucket", "lifecycle_rule.1.prefix", "path2/"), 513 resource.TestCheckResourceAttr( 514 "aws_s3_bucket.bucket", "lifecycle_rule.1.enabled", "false"), 515 resource.TestCheckResourceAttr( 516 "aws_s3_bucket.bucket", "lifecycle_rule.1.noncurrent_version_expiration.80908210.days", "365"), 517 ), 518 }, 519 }, 520 }) 521 } 522 523 func testAccCheckAWSS3BucketDestroy(s *terraform.State) error { 524 conn := testAccProvider.Meta().(*AWSClient).s3conn 525 526 for _, rs := range s.RootModule().Resources { 527 if rs.Type != "aws_s3_bucket" { 528 continue 529 } 530 _, err := conn.DeleteBucket(&s3.DeleteBucketInput{ 531 Bucket: aws.String(rs.Primary.ID), 532 }) 533 if err != nil { 534 if awsErr, ok := err.(awserr.Error); ok && awsErr.Code() == "NoSuchBucket" { 535 return nil 536 } 537 return err 538 } 539 } 540 return nil 541 } 542 543 func testAccCheckAWSS3BucketExists(n string) resource.TestCheckFunc { 544 return func(s *terraform.State) error { 545 rs, ok := s.RootModule().Resources[n] 546 if !ok { 547 return fmt.Errorf("Not found: %s", n) 548 } 549 550 if rs.Primary.ID == "" { 551 return fmt.Errorf("No S3 Bucket ID is set") 552 } 553 554 conn := testAccProvider.Meta().(*AWSClient).s3conn 555 _, err := conn.HeadBucket(&s3.HeadBucketInput{ 556 Bucket: aws.String(rs.Primary.ID), 557 }) 558 559 if err != nil { 560 return fmt.Errorf("S3Bucket error: %v", err) 561 } 562 return nil 563 } 564 } 565 566 func testAccCheckAWSS3DestroyBucket(n string) resource.TestCheckFunc { 567 return func(s *terraform.State) error { 568 rs, ok := s.RootModule().Resources[n] 569 if !ok { 570 return fmt.Errorf("Not found: %s", n) 571 } 572 573 if rs.Primary.ID == "" { 574 return fmt.Errorf("No S3 Bucket ID is set") 575 } 576 577 conn := testAccProvider.Meta().(*AWSClient).s3conn 578 _, err := conn.DeleteBucket(&s3.DeleteBucketInput{ 579 Bucket: aws.String(rs.Primary.ID), 580 }) 581 582 if err != nil { 583 return fmt.Errorf("Error destroying Bucket (%s) in testAccCheckAWSS3DestroyBucket: %s", rs.Primary.ID, err) 584 } 585 return nil 586 } 587 } 588 589 func testAccCheckAWSS3BucketPolicy(n string, policy string) resource.TestCheckFunc { 590 return func(s *terraform.State) error { 591 rs, _ := s.RootModule().Resources[n] 592 conn := testAccProvider.Meta().(*AWSClient).s3conn 593 594 out, err := conn.GetBucketPolicy(&s3.GetBucketPolicyInput{ 595 Bucket: aws.String(rs.Primary.ID), 596 }) 597 598 if err != nil { 599 if policy == "" { 600 // expected 601 return nil 602 } else { 603 return fmt.Errorf("GetBucketPolicy error: %v, expected %s", err, policy) 604 } 605 } 606 607 if v := out.Policy; v == nil { 608 if policy != "" { 609 return fmt.Errorf("bad policy, found nil, expected: %s", policy) 610 } 611 } else { 612 expected := make(map[string]interface{}) 613 if err := json.Unmarshal([]byte(policy), &expected); err != nil { 614 return err 615 } 616 actual := make(map[string]interface{}) 617 if err := json.Unmarshal([]byte(*v), &actual); err != nil { 618 return err 619 } 620 621 if !reflect.DeepEqual(expected, actual) { 622 return fmt.Errorf("bad policy, expected: %#v, got %#v", expected, actual) 623 } 624 } 625 626 return nil 627 } 628 } 629 630 func testAccCheckAWSS3BucketWebsite(n string, indexDoc string, errorDoc string, redirectProtocol string, redirectTo string) resource.TestCheckFunc { 631 return func(s *terraform.State) error { 632 rs, _ := s.RootModule().Resources[n] 633 conn := testAccProvider.Meta().(*AWSClient).s3conn 634 635 out, err := conn.GetBucketWebsite(&s3.GetBucketWebsiteInput{ 636 Bucket: aws.String(rs.Primary.ID), 637 }) 638 639 if err != nil { 640 if indexDoc == "" { 641 // If we want to assert that the website is not there, than 642 // this error is expected 643 return nil 644 } else { 645 return fmt.Errorf("S3BucketWebsite error: %v", err) 646 } 647 } 648 649 if v := out.IndexDocument; v == nil { 650 if indexDoc != "" { 651 return fmt.Errorf("bad index doc, found nil, expected: %s", indexDoc) 652 } 653 } else { 654 if *v.Suffix != indexDoc { 655 return fmt.Errorf("bad index doc, expected: %s, got %#v", indexDoc, out.IndexDocument) 656 } 657 } 658 659 if v := out.ErrorDocument; v == nil { 660 if errorDoc != "" { 661 return fmt.Errorf("bad error doc, found nil, expected: %s", errorDoc) 662 } 663 } else { 664 if *v.Key != errorDoc { 665 return fmt.Errorf("bad error doc, expected: %s, got %#v", errorDoc, out.ErrorDocument) 666 } 667 } 668 669 if v := out.RedirectAllRequestsTo; v == nil { 670 if redirectTo != "" { 671 return fmt.Errorf("bad redirect to, found nil, expected: %s", redirectTo) 672 } 673 } else { 674 if *v.HostName != redirectTo { 675 return fmt.Errorf("bad redirect to, expected: %s, got %#v", redirectTo, out.RedirectAllRequestsTo) 676 } 677 if redirectProtocol != "" && v.Protocol != nil && *v.Protocol != redirectProtocol { 678 return fmt.Errorf("bad redirect protocol to, expected: %s, got %#v", redirectProtocol, out.RedirectAllRequestsTo) 679 } 680 } 681 682 return nil 683 } 684 } 685 686 func testAccCheckAWSS3BucketWebsiteRoutingRules(n string, routingRules []*s3.RoutingRule) resource.TestCheckFunc { 687 return func(s *terraform.State) error { 688 rs, _ := s.RootModule().Resources[n] 689 conn := testAccProvider.Meta().(*AWSClient).s3conn 690 691 out, err := conn.GetBucketWebsite(&s3.GetBucketWebsiteInput{ 692 Bucket: aws.String(rs.Primary.ID), 693 }) 694 695 if err != nil { 696 if routingRules == nil { 697 return nil 698 } 699 return fmt.Errorf("GetBucketWebsite error: %v", err) 700 } 701 702 if !reflect.DeepEqual(out.RoutingRules, routingRules) { 703 return fmt.Errorf("bad routing rule, expected: %v, got %v", routingRules, out.RoutingRules) 704 } 705 706 return nil 707 } 708 } 709 710 func testAccCheckAWSS3BucketVersioning(n string, versioningStatus string) resource.TestCheckFunc { 711 return func(s *terraform.State) error { 712 rs, _ := s.RootModule().Resources[n] 713 conn := testAccProvider.Meta().(*AWSClient).s3conn 714 715 out, err := conn.GetBucketVersioning(&s3.GetBucketVersioningInput{ 716 Bucket: aws.String(rs.Primary.ID), 717 }) 718 719 if err != nil { 720 return fmt.Errorf("GetBucketVersioning error: %v", err) 721 } 722 723 if v := out.Status; v == nil { 724 if versioningStatus != "" { 725 return fmt.Errorf("bad error versioning status, found nil, expected: %s", versioningStatus) 726 } 727 } else { 728 if *v != versioningStatus { 729 return fmt.Errorf("bad error versioning status, expected: %s, got %s", versioningStatus, *v) 730 } 731 } 732 733 return nil 734 } 735 } 736 737 func testAccCheckAWSS3BucketCors(n string, corsRules []*s3.CORSRule) resource.TestCheckFunc { 738 return func(s *terraform.State) error { 739 rs, _ := s.RootModule().Resources[n] 740 conn := testAccProvider.Meta().(*AWSClient).s3conn 741 742 out, err := conn.GetBucketCors(&s3.GetBucketCorsInput{ 743 Bucket: aws.String(rs.Primary.ID), 744 }) 745 746 if err != nil { 747 return fmt.Errorf("GetBucketCors error: %v", err) 748 } 749 750 if !reflect.DeepEqual(out.CORSRules, corsRules) { 751 return fmt.Errorf("bad error cors rule, expected: %v, got %v", corsRules, out.CORSRules) 752 } 753 754 return nil 755 } 756 } 757 758 func testAccCheckAWSS3RequestPayer(n, expectedPayer string) resource.TestCheckFunc { 759 return func(s *terraform.State) error { 760 rs, _ := s.RootModule().Resources[n] 761 conn := testAccProvider.Meta().(*AWSClient).s3conn 762 763 out, err := conn.GetBucketRequestPayment(&s3.GetBucketRequestPaymentInput{ 764 Bucket: aws.String(rs.Primary.ID), 765 }) 766 767 if err != nil { 768 return fmt.Errorf("GetBucketRequestPayment error: %v", err) 769 } 770 771 if *out.Payer != expectedPayer { 772 return fmt.Errorf("bad error request payer type, expected: %v, got %v", 773 expectedPayer, out.Payer) 774 } 775 776 return nil 777 } 778 } 779 780 func testAccCheckAWSS3BucketLogging(n, b, p string) resource.TestCheckFunc { 781 return func(s *terraform.State) error { 782 rs, _ := s.RootModule().Resources[n] 783 conn := testAccProvider.Meta().(*AWSClient).s3conn 784 785 out, err := conn.GetBucketLogging(&s3.GetBucketLoggingInput{ 786 Bucket: aws.String(rs.Primary.ID), 787 }) 788 789 if err != nil { 790 return fmt.Errorf("GetBucketLogging error: %v", err) 791 } 792 793 tb, _ := s.RootModule().Resources[b] 794 795 if v := out.LoggingEnabled.TargetBucket; v == nil { 796 if tb.Primary.ID != "" { 797 return fmt.Errorf("bad target bucket, found nil, expected: %s", tb.Primary.ID) 798 } 799 } else { 800 if *v != tb.Primary.ID { 801 return fmt.Errorf("bad target bucket, expected: %s, got %s", tb.Primary.ID, *v) 802 } 803 } 804 805 if v := out.LoggingEnabled.TargetPrefix; v == nil { 806 if p != "" { 807 return fmt.Errorf("bad target prefix, found nil, expected: %s", p) 808 } 809 } else { 810 if *v != p { 811 return fmt.Errorf("bad target prefix, expected: %s, got %s", p, *v) 812 } 813 } 814 815 return nil 816 } 817 } 818 819 // These need a bit of randomness as the name can only be used once globally 820 // within AWS 821 func testAccWebsiteEndpoint(randInt int) string { 822 return fmt.Sprintf("tf-test-bucket-%d.s3-website-us-west-2.amazonaws.com", randInt) 823 } 824 825 func testAccAWSS3BucketPolicy(randInt int) string { 826 return fmt.Sprintf(`{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "AWS": "*" }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::tf-test-bucket-%d/*" } ] }`, randInt) 827 } 828 829 func testAccAWSS3BucketConfig(randInt int) string { 830 return fmt.Sprintf(` 831 resource "aws_s3_bucket" "bucket" { 832 bucket = "tf-test-bucket-%d" 833 acl = "public-read" 834 } 835 `, randInt) 836 } 837 838 func testAccAWSS3BucketWebsiteConfig(randInt int) string { 839 return fmt.Sprintf(` 840 resource "aws_s3_bucket" "bucket" { 841 bucket = "tf-test-bucket-%d" 842 acl = "public-read" 843 844 website { 845 index_document = "index.html" 846 } 847 } 848 `, randInt) 849 } 850 851 func testAccAWSS3BucketWebsiteConfigWithError(randInt int) string { 852 return fmt.Sprintf(` 853 resource "aws_s3_bucket" "bucket" { 854 bucket = "tf-test-bucket-%d" 855 acl = "public-read" 856 857 website { 858 index_document = "index.html" 859 error_document = "error.html" 860 } 861 } 862 `, randInt) 863 } 864 865 func testAccAWSS3BucketWebsiteConfigWithRedirect(randInt int) string { 866 return fmt.Sprintf(` 867 resource "aws_s3_bucket" "bucket" { 868 bucket = "tf-test-bucket-%d" 869 acl = "public-read" 870 871 website { 872 redirect_all_requests_to = "hashicorp.com" 873 } 874 } 875 `, randInt) 876 } 877 878 func testAccAWSS3BucketWebsiteConfigWithHttpsRedirect(randInt int) string { 879 return fmt.Sprintf(` 880 resource "aws_s3_bucket" "bucket" { 881 bucket = "tf-test-bucket-%d" 882 acl = "public-read" 883 884 website { 885 redirect_all_requests_to = "https://hashicorp.com" 886 } 887 } 888 `, randInt) 889 } 890 891 func testAccAWSS3BucketWebsiteConfigWithRoutingRules(randInt int) string { 892 return fmt.Sprintf(` 893 resource "aws_s3_bucket" "bucket" { 894 bucket = "tf-test-bucket-%d" 895 acl = "public-read" 896 897 website { 898 index_document = "index.html" 899 error_document = "error.html" 900 routing_rules = <<EOF 901 [{ 902 "Condition": { 903 "KeyPrefixEquals": "docs/" 904 }, 905 "Redirect": { 906 "ReplaceKeyPrefixWith": "documents/" 907 } 908 }] 909 EOF 910 } 911 } 912 `, randInt) 913 } 914 915 func testAccAWSS3BucketConfigWithAcceleration(randInt int) string { 916 return fmt.Sprintf(` 917 resource "aws_s3_bucket" "bucket" { 918 bucket = "tf-test-bucket-%d" 919 acl = "public-read" 920 acceleration_status = "Enabled" 921 } 922 `, randInt) 923 } 924 925 func testAccAWSS3BucketConfigWithoutAcceleration(randInt int) string { 926 return fmt.Sprintf(` 927 resource "aws_s3_bucket" "bucket" { 928 bucket = "tf-test-bucket-%d" 929 acl = "public-read" 930 acceleration_status = "Suspended" 931 } 932 `, randInt) 933 } 934 935 func testAccAWSS3BucketConfigRequestPayerBucketOwner(randInt int) string { 936 return fmt.Sprintf(` 937 resource "aws_s3_bucket" "bucket" { 938 bucket = "tf-test-bucket-%d" 939 acl = "public-read" 940 request_payer = "BucketOwner" 941 } 942 `, randInt) 943 } 944 945 func testAccAWSS3BucketConfigRequestPayerRequester(randInt int) string { 946 return fmt.Sprintf(` 947 resource "aws_s3_bucket" "bucket" { 948 bucket = "tf-test-bucket-%d" 949 acl = "public-read" 950 request_payer = "Requester" 951 } 952 `, randInt) 953 } 954 955 func testAccAWSS3BucketConfigWithPolicy(randInt int) string { 956 return fmt.Sprintf(` 957 resource "aws_s3_bucket" "bucket" { 958 bucket = "tf-test-bucket-%d" 959 acl = "public-read" 960 policy = %s 961 } 962 `, randInt, strconv.Quote(testAccAWSS3BucketPolicy(randInt))) 963 } 964 965 func testAccAWSS3BucketDestroyedConfig(randInt int) string { 966 return fmt.Sprintf(` 967 resource "aws_s3_bucket" "bucket" { 968 bucket = "tf-test-bucket-%d" 969 acl = "public-read" 970 } 971 `, randInt) 972 } 973 974 func testAccAWSS3BucketConfigWithEmptyPolicy(randInt int) string { 975 return fmt.Sprintf(` 976 resource "aws_s3_bucket" "bucket" { 977 bucket = "tf-test-bucket-%d" 978 acl = "public-read" 979 policy = "" 980 } 981 `, randInt) 982 } 983 984 func testAccAWSS3BucketConfigWithVersioning(randInt int) string { 985 return fmt.Sprintf(` 986 resource "aws_s3_bucket" "bucket" { 987 bucket = "tf-test-bucket-%d" 988 acl = "public-read" 989 versioning { 990 enabled = true 991 } 992 } 993 `, randInt) 994 } 995 996 func testAccAWSS3BucketConfigWithDisableVersioning(randInt int) string { 997 return fmt.Sprintf(` 998 resource "aws_s3_bucket" "bucket" { 999 bucket = "tf-test-bucket-%d" 1000 acl = "public-read" 1001 versioning { 1002 enabled = false 1003 } 1004 } 1005 `, randInt) 1006 } 1007 1008 func testAccAWSS3BucketConfigWithCORS(randInt int) string { 1009 return fmt.Sprintf(` 1010 resource "aws_s3_bucket" "bucket" { 1011 bucket = "tf-test-bucket-%d" 1012 acl = "public-read" 1013 cors_rule { 1014 allowed_headers = ["*"] 1015 allowed_methods = ["PUT","POST"] 1016 allowed_origins = ["https://www.example.com"] 1017 expose_headers = ["x-amz-server-side-encryption","ETag"] 1018 max_age_seconds = 3000 1019 } 1020 } 1021 `, randInt) 1022 } 1023 1024 var testAccAWSS3BucketConfigWithAcl = ` 1025 resource "aws_s3_bucket" "bucket" { 1026 bucket = "tf-test-bucket-%d" 1027 acl = "public-read" 1028 } 1029 ` 1030 1031 var testAccAWSS3BucketConfigWithAclUpdate = ` 1032 resource "aws_s3_bucket" "bucket" { 1033 bucket = "tf-test-bucket-%d" 1034 acl = "private" 1035 } 1036 ` 1037 1038 func testAccAWSS3BucketConfigWithLogging(randInt int) string { 1039 return fmt.Sprintf(` 1040 resource "aws_s3_bucket" "log_bucket" { 1041 bucket = "tf-test-log-bucket-%d" 1042 acl = "log-delivery-write" 1043 } 1044 resource "aws_s3_bucket" "bucket" { 1045 bucket = "tf-test-bucket-%d" 1046 acl = "private" 1047 logging { 1048 target_bucket = "${aws_s3_bucket.log_bucket.id}" 1049 target_prefix = "log/" 1050 } 1051 } 1052 `, randInt, randInt) 1053 } 1054 1055 func testAccAWSS3BucketConfigWithLifecycle(randInt int) string { 1056 return fmt.Sprintf(` 1057 resource "aws_s3_bucket" "bucket" { 1058 bucket = "tf-test-bucket-%d" 1059 acl = "private" 1060 lifecycle_rule { 1061 id = "id1" 1062 prefix = "path1/" 1063 enabled = true 1064 1065 expiration { 1066 days = 365 1067 } 1068 1069 transition { 1070 days = 30 1071 storage_class = "STANDARD_IA" 1072 } 1073 transition { 1074 days = 60 1075 storage_class = "GLACIER" 1076 } 1077 } 1078 lifecycle_rule { 1079 id = "id2" 1080 prefix = "path2/" 1081 enabled = true 1082 1083 expiration { 1084 date = "2016-01-12" 1085 } 1086 } 1087 } 1088 `, randInt) 1089 } 1090 1091 func testAccAWSS3BucketConfigWithVersioningLifecycle(randInt int) string { 1092 return fmt.Sprintf(` 1093 resource "aws_s3_bucket" "bucket" { 1094 bucket = "tf-test-bucket-%d" 1095 acl = "private" 1096 versioning { 1097 enabled = false 1098 } 1099 lifecycle_rule { 1100 id = "id1" 1101 prefix = "path1/" 1102 enabled = true 1103 1104 noncurrent_version_expiration { 1105 days = 365 1106 } 1107 noncurrent_version_transition { 1108 days = 30 1109 storage_class = "STANDARD_IA" 1110 } 1111 noncurrent_version_transition { 1112 days = 60 1113 storage_class = "GLACIER" 1114 } 1115 } 1116 lifecycle_rule { 1117 id = "id2" 1118 prefix = "path2/" 1119 enabled = false 1120 1121 noncurrent_version_expiration { 1122 days = 365 1123 } 1124 } 1125 } 1126 `, randInt) 1127 }