github.com/andresvia/terraform@v0.6.15-0.20160412045437-d51c75946785/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  		Providers:    testAccProviders,
    28  		CheckDestroy: testAccCheckAWSS3BucketDestroy,
    29  		Steps: []resource.TestStep{
    30  			resource.TestStep{
    31  				Config: testAccAWSS3BucketConfig(rInt),
    32  				Check: resource.ComposeTestCheckFunc(
    33  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
    34  					resource.TestCheckResourceAttr(
    35  						"aws_s3_bucket.bucket", "hosted_zone_id", HostedZoneIDForRegion("us-west-2")),
    36  					resource.TestCheckResourceAttr(
    37  						"aws_s3_bucket.bucket", "region", "us-west-2"),
    38  					resource.TestCheckResourceAttr(
    39  						"aws_s3_bucket.bucket", "website_endpoint", ""),
    40  					resource.TestMatchResourceAttr(
    41  						"aws_s3_bucket.bucket", "arn", arnRegexp),
    42  				),
    43  			},
    44  		},
    45  	})
    46  }
    47  
    48  func TestAccAWSS3Bucket_Policy(t *testing.T) {
    49  	rInt := acctest.RandInt()
    50  
    51  	resource.Test(t, resource.TestCase{
    52  		PreCheck:     func() { testAccPreCheck(t) },
    53  		Providers:    testAccProviders,
    54  		CheckDestroy: testAccCheckAWSS3BucketDestroy,
    55  		Steps: []resource.TestStep{
    56  			resource.TestStep{
    57  				Config: testAccAWSS3BucketConfigWithPolicy(rInt),
    58  				Check: resource.ComposeTestCheckFunc(
    59  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
    60  					testAccCheckAWSS3BucketPolicy(
    61  						"aws_s3_bucket.bucket", testAccAWSS3BucketPolicy(rInt)),
    62  				),
    63  			},
    64  			resource.TestStep{
    65  				Config: testAccAWSS3BucketConfig(rInt),
    66  				Check: resource.ComposeTestCheckFunc(
    67  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
    68  					testAccCheckAWSS3BucketPolicy(
    69  						"aws_s3_bucket.bucket", ""),
    70  				),
    71  			},
    72  			resource.TestStep{
    73  				Config: testAccAWSS3BucketConfigWithEmptyPolicy(rInt),
    74  				Check: resource.ComposeTestCheckFunc(
    75  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
    76  					testAccCheckAWSS3BucketPolicy(
    77  						"aws_s3_bucket.bucket", ""),
    78  				),
    79  			},
    80  		},
    81  	})
    82  }
    83  
    84  func TestAccAWSS3Bucket_UpdateAcl(t *testing.T) {
    85  	ri := acctest.RandInt()
    86  	preConfig := fmt.Sprintf(testAccAWSS3BucketConfigWithAcl, ri)
    87  	postConfig := fmt.Sprintf(testAccAWSS3BucketConfigWithAclUpdate, ri)
    88  
    89  	resource.Test(t, resource.TestCase{
    90  		PreCheck:     func() { testAccPreCheck(t) },
    91  		Providers:    testAccProviders,
    92  		CheckDestroy: testAccCheckAWSS3BucketDestroy,
    93  		Steps: []resource.TestStep{
    94  			resource.TestStep{
    95  				Config: preConfig,
    96  				Check: resource.ComposeTestCheckFunc(
    97  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
    98  					resource.TestCheckResourceAttr(
    99  						"aws_s3_bucket.bucket", "acl", "public-read"),
   100  				),
   101  			},
   102  			resource.TestStep{
   103  				Config: postConfig,
   104  				Check: resource.ComposeTestCheckFunc(
   105  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
   106  					resource.TestCheckResourceAttr(
   107  						"aws_s3_bucket.bucket", "acl", "private"),
   108  				),
   109  			},
   110  		},
   111  	})
   112  }
   113  
   114  func TestAccAWSS3Bucket_Website_Simple(t *testing.T) {
   115  	rInt := acctest.RandInt()
   116  	resource.Test(t, resource.TestCase{
   117  		PreCheck:     func() { testAccPreCheck(t) },
   118  		Providers:    testAccProviders,
   119  		CheckDestroy: testAccCheckAWSS3BucketDestroy,
   120  		Steps: []resource.TestStep{
   121  			resource.TestStep{
   122  				Config: testAccAWSS3BucketWebsiteConfig(rInt),
   123  				Check: resource.ComposeTestCheckFunc(
   124  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
   125  					testAccCheckAWSS3BucketWebsite(
   126  						"aws_s3_bucket.bucket", "index.html", "", "", ""),
   127  					resource.TestCheckResourceAttr(
   128  						"aws_s3_bucket.bucket", "website_endpoint", testAccWebsiteEndpoint(rInt)),
   129  				),
   130  			},
   131  			resource.TestStep{
   132  				Config: testAccAWSS3BucketWebsiteConfigWithError(rInt),
   133  				Check: resource.ComposeTestCheckFunc(
   134  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
   135  					testAccCheckAWSS3BucketWebsite(
   136  						"aws_s3_bucket.bucket", "index.html", "error.html", "", ""),
   137  					resource.TestCheckResourceAttr(
   138  						"aws_s3_bucket.bucket", "website_endpoint", testAccWebsiteEndpoint(rInt)),
   139  				),
   140  			},
   141  			resource.TestStep{
   142  				Config: testAccAWSS3BucketConfig(rInt),
   143  				Check: resource.ComposeTestCheckFunc(
   144  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
   145  					testAccCheckAWSS3BucketWebsite(
   146  						"aws_s3_bucket.bucket", "", "", "", ""),
   147  					resource.TestCheckResourceAttr(
   148  						"aws_s3_bucket.bucket", "website_endpoint", ""),
   149  				),
   150  			},
   151  		},
   152  	})
   153  }
   154  
   155  func TestAccAWSS3Bucket_WebsiteRedirect(t *testing.T) {
   156  	rInt := acctest.RandInt()
   157  	resource.Test(t, resource.TestCase{
   158  		PreCheck:     func() { testAccPreCheck(t) },
   159  		Providers:    testAccProviders,
   160  		CheckDestroy: testAccCheckAWSS3BucketDestroy,
   161  		Steps: []resource.TestStep{
   162  			resource.TestStep{
   163  				Config: testAccAWSS3BucketWebsiteConfigWithRedirect(rInt),
   164  				Check: resource.ComposeTestCheckFunc(
   165  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
   166  					testAccCheckAWSS3BucketWebsite(
   167  						"aws_s3_bucket.bucket", "", "", "", "hashicorp.com"),
   168  					resource.TestCheckResourceAttr(
   169  						"aws_s3_bucket.bucket", "website_endpoint", testAccWebsiteEndpoint(rInt)),
   170  				),
   171  			},
   172  			resource.TestStep{
   173  				Config: testAccAWSS3BucketWebsiteConfigWithHttpsRedirect(rInt),
   174  				Check: resource.ComposeTestCheckFunc(
   175  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
   176  					testAccCheckAWSS3BucketWebsite(
   177  						"aws_s3_bucket.bucket", "", "", "https", "hashicorp.com"),
   178  					resource.TestCheckResourceAttr(
   179  						"aws_s3_bucket.bucket", "website_endpoint", testAccWebsiteEndpoint(rInt)),
   180  				),
   181  			},
   182  			resource.TestStep{
   183  				Config: testAccAWSS3BucketConfig(rInt),
   184  				Check: resource.ComposeTestCheckFunc(
   185  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
   186  					testAccCheckAWSS3BucketWebsite(
   187  						"aws_s3_bucket.bucket", "", "", "", ""),
   188  					resource.TestCheckResourceAttr(
   189  						"aws_s3_bucket.bucket", "website_endpoint", ""),
   190  				),
   191  			},
   192  		},
   193  	})
   194  }
   195  
   196  func TestAccAWSS3Bucket_WebsiteRoutingRules(t *testing.T) {
   197  	rInt := acctest.RandInt()
   198  	resource.Test(t, resource.TestCase{
   199  		PreCheck:     func() { testAccPreCheck(t) },
   200  		Providers:    testAccProviders,
   201  		CheckDestroy: testAccCheckAWSS3BucketDestroy,
   202  		Steps: []resource.TestStep{
   203  			resource.TestStep{
   204  				Config: testAccAWSS3BucketWebsiteConfigWithRoutingRules(rInt),
   205  				Check: resource.ComposeTestCheckFunc(
   206  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
   207  					testAccCheckAWSS3BucketWebsite(
   208  						"aws_s3_bucket.bucket", "index.html", "error.html", "", ""),
   209  					testAccCheckAWSS3BucketWebsiteRoutingRules(
   210  						"aws_s3_bucket.bucket",
   211  						[]*s3.RoutingRule{
   212  							&s3.RoutingRule{
   213  								Condition: &s3.Condition{
   214  									KeyPrefixEquals: aws.String("docs/"),
   215  								},
   216  								Redirect: &s3.Redirect{
   217  									ReplaceKeyPrefixWith: aws.String("documents/"),
   218  								},
   219  							},
   220  						},
   221  					),
   222  					resource.TestCheckResourceAttr(
   223  						"aws_s3_bucket.bucket", "website_endpoint", testAccWebsiteEndpoint(rInt)),
   224  				),
   225  			},
   226  			resource.TestStep{
   227  				Config: testAccAWSS3BucketConfig(rInt),
   228  				Check: resource.ComposeTestCheckFunc(
   229  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
   230  					testAccCheckAWSS3BucketWebsite(
   231  						"aws_s3_bucket.bucket", "", "", "", ""),
   232  					testAccCheckAWSS3BucketWebsiteRoutingRules("aws_s3_bucket.bucket", nil),
   233  					resource.TestCheckResourceAttr(
   234  						"aws_s3_bucket.bucket", "website_endpoint", ""),
   235  				),
   236  			},
   237  		},
   238  	})
   239  }
   240  
   241  // Test TestAccAWSS3Bucket_shouldFailNotFound is designed to fail with a "plan
   242  // not empty" error in Terraform, to check against regresssions.
   243  // See https://github.com/hashicorp/terraform/pull/2925
   244  func TestAccAWSS3Bucket_shouldFailNotFound(t *testing.T) {
   245  	rInt := acctest.RandInt()
   246  	resource.Test(t, resource.TestCase{
   247  		PreCheck:     func() { testAccPreCheck(t) },
   248  		Providers:    testAccProviders,
   249  		CheckDestroy: testAccCheckAWSS3BucketDestroy,
   250  		Steps: []resource.TestStep{
   251  			resource.TestStep{
   252  				Config: testAccAWSS3BucketDestroyedConfig(rInt),
   253  				Check: resource.ComposeTestCheckFunc(
   254  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
   255  					testAccCheckAWSS3DestroyBucket("aws_s3_bucket.bucket"),
   256  				),
   257  				ExpectNonEmptyPlan: true,
   258  			},
   259  		},
   260  	})
   261  }
   262  
   263  func TestAccAWSS3Bucket_Versioning(t *testing.T) {
   264  	rInt := acctest.RandInt()
   265  	resource.Test(t, resource.TestCase{
   266  		PreCheck:     func() { testAccPreCheck(t) },
   267  		Providers:    testAccProviders,
   268  		CheckDestroy: testAccCheckAWSS3BucketDestroy,
   269  		Steps: []resource.TestStep{
   270  			resource.TestStep{
   271  				Config: testAccAWSS3BucketConfig(rInt),
   272  				Check: resource.ComposeTestCheckFunc(
   273  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
   274  					testAccCheckAWSS3BucketVersioning(
   275  						"aws_s3_bucket.bucket", ""),
   276  				),
   277  			},
   278  			resource.TestStep{
   279  				Config: testAccAWSS3BucketConfigWithVersioning(rInt),
   280  				Check: resource.ComposeTestCheckFunc(
   281  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
   282  					testAccCheckAWSS3BucketVersioning(
   283  						"aws_s3_bucket.bucket", s3.BucketVersioningStatusEnabled),
   284  				),
   285  			},
   286  			resource.TestStep{
   287  				Config: testAccAWSS3BucketConfigWithDisableVersioning(rInt),
   288  				Check: resource.ComposeTestCheckFunc(
   289  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
   290  					testAccCheckAWSS3BucketVersioning(
   291  						"aws_s3_bucket.bucket", s3.BucketVersioningStatusSuspended),
   292  				),
   293  			},
   294  		},
   295  	})
   296  }
   297  
   298  func TestAccAWSS3Bucket_Cors(t *testing.T) {
   299  	rInt := acctest.RandInt()
   300  	resource.Test(t, resource.TestCase{
   301  		PreCheck:     func() { testAccPreCheck(t) },
   302  		Providers:    testAccProviders,
   303  		CheckDestroy: testAccCheckAWSS3BucketDestroy,
   304  		Steps: []resource.TestStep{
   305  			resource.TestStep{
   306  				Config: testAccAWSS3BucketConfigWithCORS(rInt),
   307  				Check: resource.ComposeTestCheckFunc(
   308  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
   309  					testAccCheckAWSS3BucketCors(
   310  						"aws_s3_bucket.bucket",
   311  						[]*s3.CORSRule{
   312  							&s3.CORSRule{
   313  								AllowedHeaders: []*string{aws.String("*")},
   314  								AllowedMethods: []*string{aws.String("PUT"), aws.String("POST")},
   315  								AllowedOrigins: []*string{aws.String("https://www.example.com")},
   316  								ExposeHeaders:  []*string{aws.String("x-amz-server-side-encryption"), aws.String("ETag")},
   317  								MaxAgeSeconds:  aws.Int64(3000),
   318  							},
   319  						},
   320  					),
   321  				),
   322  			},
   323  		},
   324  	})
   325  }
   326  
   327  func TestAccAWSS3Bucket_Logging(t *testing.T) {
   328  	rInt := acctest.RandInt()
   329  	resource.Test(t, resource.TestCase{
   330  		PreCheck:     func() { testAccPreCheck(t) },
   331  		Providers:    testAccProviders,
   332  		CheckDestroy: testAccCheckAWSS3BucketDestroy,
   333  		Steps: []resource.TestStep{
   334  			resource.TestStep{
   335  				Config: testAccAWSS3BucketConfigWithLogging(rInt),
   336  				Check: resource.ComposeTestCheckFunc(
   337  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
   338  					testAccCheckAWSS3BucketLogging(
   339  						"aws_s3_bucket.bucket", "aws_s3_bucket.log_bucket", "log/"),
   340  				),
   341  			},
   342  		},
   343  	})
   344  }
   345  
   346  func testAccCheckAWSS3BucketDestroy(s *terraform.State) error {
   347  	conn := testAccProvider.Meta().(*AWSClient).s3conn
   348  
   349  	for _, rs := range s.RootModule().Resources {
   350  		if rs.Type != "aws_s3_bucket" {
   351  			continue
   352  		}
   353  		_, err := conn.DeleteBucket(&s3.DeleteBucketInput{
   354  			Bucket: aws.String(rs.Primary.ID),
   355  		})
   356  		if err != nil {
   357  			if awsErr, ok := err.(awserr.Error); ok && awsErr.Code() == "NoSuchBucket" {
   358  				return nil
   359  			}
   360  			return err
   361  		}
   362  	}
   363  	return nil
   364  }
   365  
   366  func testAccCheckAWSS3BucketExists(n string) resource.TestCheckFunc {
   367  	return func(s *terraform.State) error {
   368  		rs, ok := s.RootModule().Resources[n]
   369  		if !ok {
   370  			return fmt.Errorf("Not found: %s", n)
   371  		}
   372  
   373  		if rs.Primary.ID == "" {
   374  			return fmt.Errorf("No S3 Bucket ID is set")
   375  		}
   376  
   377  		conn := testAccProvider.Meta().(*AWSClient).s3conn
   378  		_, err := conn.HeadBucket(&s3.HeadBucketInput{
   379  			Bucket: aws.String(rs.Primary.ID),
   380  		})
   381  
   382  		if err != nil {
   383  			return fmt.Errorf("S3Bucket error: %v", err)
   384  		}
   385  		return nil
   386  	}
   387  }
   388  
   389  func testAccCheckAWSS3DestroyBucket(n string) resource.TestCheckFunc {
   390  	return func(s *terraform.State) error {
   391  		rs, ok := s.RootModule().Resources[n]
   392  		if !ok {
   393  			return fmt.Errorf("Not found: %s", n)
   394  		}
   395  
   396  		if rs.Primary.ID == "" {
   397  			return fmt.Errorf("No S3 Bucket ID is set")
   398  		}
   399  
   400  		conn := testAccProvider.Meta().(*AWSClient).s3conn
   401  		_, err := conn.DeleteBucket(&s3.DeleteBucketInput{
   402  			Bucket: aws.String(rs.Primary.ID),
   403  		})
   404  
   405  		if err != nil {
   406  			return fmt.Errorf("Error destroying Bucket (%s) in testAccCheckAWSS3DestroyBucket: %s", rs.Primary.ID, err)
   407  		}
   408  		return nil
   409  	}
   410  }
   411  
   412  func testAccCheckAWSS3BucketPolicy(n string, policy string) resource.TestCheckFunc {
   413  	return func(s *terraform.State) error {
   414  		rs, _ := s.RootModule().Resources[n]
   415  		conn := testAccProvider.Meta().(*AWSClient).s3conn
   416  
   417  		out, err := conn.GetBucketPolicy(&s3.GetBucketPolicyInput{
   418  			Bucket: aws.String(rs.Primary.ID),
   419  		})
   420  
   421  		if err != nil {
   422  			if policy == "" {
   423  				// expected
   424  				return nil
   425  			} else {
   426  				return fmt.Errorf("GetBucketPolicy error: %v, expected %s", err, policy)
   427  			}
   428  		}
   429  
   430  		if v := out.Policy; v == nil {
   431  			if policy != "" {
   432  				return fmt.Errorf("bad policy, found nil, expected: %s", policy)
   433  			}
   434  		} else {
   435  			expected := make(map[string]interface{})
   436  			if err := json.Unmarshal([]byte(policy), &expected); err != nil {
   437  				return err
   438  			}
   439  			actual := make(map[string]interface{})
   440  			if err := json.Unmarshal([]byte(*v), &actual); err != nil {
   441  				return err
   442  			}
   443  
   444  			if !reflect.DeepEqual(expected, actual) {
   445  				return fmt.Errorf("bad policy, expected: %#v, got %#v", expected, actual)
   446  			}
   447  		}
   448  
   449  		return nil
   450  	}
   451  }
   452  
   453  func testAccCheckAWSS3BucketWebsite(n string, indexDoc string, errorDoc string, redirectProtocol string, redirectTo string) resource.TestCheckFunc {
   454  	return func(s *terraform.State) error {
   455  		rs, _ := s.RootModule().Resources[n]
   456  		conn := testAccProvider.Meta().(*AWSClient).s3conn
   457  
   458  		out, err := conn.GetBucketWebsite(&s3.GetBucketWebsiteInput{
   459  			Bucket: aws.String(rs.Primary.ID),
   460  		})
   461  
   462  		if err != nil {
   463  			if indexDoc == "" {
   464  				// If we want to assert that the website is not there, than
   465  				// this error is expected
   466  				return nil
   467  			} else {
   468  				return fmt.Errorf("S3BucketWebsite error: %v", err)
   469  			}
   470  		}
   471  
   472  		if v := out.IndexDocument; v == nil {
   473  			if indexDoc != "" {
   474  				return fmt.Errorf("bad index doc, found nil, expected: %s", indexDoc)
   475  			}
   476  		} else {
   477  			if *v.Suffix != indexDoc {
   478  				return fmt.Errorf("bad index doc, expected: %s, got %#v", indexDoc, out.IndexDocument)
   479  			}
   480  		}
   481  
   482  		if v := out.ErrorDocument; v == nil {
   483  			if errorDoc != "" {
   484  				return fmt.Errorf("bad error doc, found nil, expected: %s", errorDoc)
   485  			}
   486  		} else {
   487  			if *v.Key != errorDoc {
   488  				return fmt.Errorf("bad error doc, expected: %s, got %#v", errorDoc, out.ErrorDocument)
   489  			}
   490  		}
   491  
   492  		if v := out.RedirectAllRequestsTo; v == nil {
   493  			if redirectTo != "" {
   494  				return fmt.Errorf("bad redirect to, found nil, expected: %s", redirectTo)
   495  			}
   496  		} else {
   497  			if *v.HostName != redirectTo {
   498  				return fmt.Errorf("bad redirect to, expected: %s, got %#v", redirectTo, out.RedirectAllRequestsTo)
   499  			}
   500  			if redirectProtocol != "" && v.Protocol != nil && *v.Protocol != redirectProtocol {
   501  				return fmt.Errorf("bad redirect protocol to, expected: %s, got %#v", redirectProtocol, out.RedirectAllRequestsTo)
   502  			}
   503  		}
   504  
   505  		return nil
   506  	}
   507  }
   508  
   509  func testAccCheckAWSS3BucketWebsiteRoutingRules(n string, routingRules []*s3.RoutingRule) resource.TestCheckFunc {
   510  	return func(s *terraform.State) error {
   511  		rs, _ := s.RootModule().Resources[n]
   512  		conn := testAccProvider.Meta().(*AWSClient).s3conn
   513  
   514  		out, err := conn.GetBucketWebsite(&s3.GetBucketWebsiteInput{
   515  			Bucket: aws.String(rs.Primary.ID),
   516  		})
   517  
   518  		if err != nil {
   519  			if routingRules == nil {
   520  				return nil
   521  			}
   522  			return fmt.Errorf("GetBucketWebsite error: %v", err)
   523  		}
   524  
   525  		if !reflect.DeepEqual(out.RoutingRules, routingRules) {
   526  			return fmt.Errorf("bad routing rule, expected: %v, got %v", routingRules, out.RoutingRules)
   527  		}
   528  
   529  		return nil
   530  	}
   531  }
   532  
   533  func testAccCheckAWSS3BucketVersioning(n string, versioningStatus string) resource.TestCheckFunc {
   534  	return func(s *terraform.State) error {
   535  		rs, _ := s.RootModule().Resources[n]
   536  		conn := testAccProvider.Meta().(*AWSClient).s3conn
   537  
   538  		out, err := conn.GetBucketVersioning(&s3.GetBucketVersioningInput{
   539  			Bucket: aws.String(rs.Primary.ID),
   540  		})
   541  
   542  		if err != nil {
   543  			return fmt.Errorf("GetBucketVersioning error: %v", err)
   544  		}
   545  
   546  		if v := out.Status; v == nil {
   547  			if versioningStatus != "" {
   548  				return fmt.Errorf("bad error versioning status, found nil, expected: %s", versioningStatus)
   549  			}
   550  		} else {
   551  			if *v != versioningStatus {
   552  				return fmt.Errorf("bad error versioning status, expected: %s, got %s", versioningStatus, *v)
   553  			}
   554  		}
   555  
   556  		return nil
   557  	}
   558  }
   559  
   560  func testAccCheckAWSS3BucketCors(n string, corsRules []*s3.CORSRule) resource.TestCheckFunc {
   561  	return func(s *terraform.State) error {
   562  		rs, _ := s.RootModule().Resources[n]
   563  		conn := testAccProvider.Meta().(*AWSClient).s3conn
   564  
   565  		out, err := conn.GetBucketCors(&s3.GetBucketCorsInput{
   566  			Bucket: aws.String(rs.Primary.ID),
   567  		})
   568  
   569  		if err != nil {
   570  			return fmt.Errorf("GetBucketCors error: %v", err)
   571  		}
   572  
   573  		if !reflect.DeepEqual(out.CORSRules, corsRules) {
   574  			return fmt.Errorf("bad error cors rule, expected: %v, got %v", corsRules, out.CORSRules)
   575  		}
   576  
   577  		return nil
   578  	}
   579  }
   580  
   581  func testAccCheckAWSS3BucketLogging(n, b, p string) resource.TestCheckFunc {
   582  	return func(s *terraform.State) error {
   583  		rs, _ := s.RootModule().Resources[n]
   584  		conn := testAccProvider.Meta().(*AWSClient).s3conn
   585  
   586  		out, err := conn.GetBucketLogging(&s3.GetBucketLoggingInput{
   587  			Bucket: aws.String(rs.Primary.ID),
   588  		})
   589  
   590  		if err != nil {
   591  			return fmt.Errorf("GetBucketLogging error: %v", err)
   592  		}
   593  
   594  		tb, _ := s.RootModule().Resources[b]
   595  
   596  		if v := out.LoggingEnabled.TargetBucket; v == nil {
   597  			if tb.Primary.ID != "" {
   598  				return fmt.Errorf("bad target bucket, found nil, expected: %s", tb.Primary.ID)
   599  			}
   600  		} else {
   601  			if *v != tb.Primary.ID {
   602  				return fmt.Errorf("bad target bucket, expected: %s, got %s", tb.Primary.ID, *v)
   603  			}
   604  		}
   605  
   606  		if v := out.LoggingEnabled.TargetPrefix; v == nil {
   607  			if p != "" {
   608  				return fmt.Errorf("bad target prefix, found nil, expected: %s", p)
   609  			}
   610  		} else {
   611  			if *v != p {
   612  				return fmt.Errorf("bad target prefix, expected: %s, got %s", p, *v)
   613  			}
   614  		}
   615  
   616  		return nil
   617  	}
   618  }
   619  
   620  // These need a bit of randomness as the name can only be used once globally
   621  // within AWS
   622  func testAccWebsiteEndpoint(randInt int) string {
   623  	return fmt.Sprintf("tf-test-bucket-%d.s3-website-us-west-2.amazonaws.com", randInt)
   624  }
   625  
   626  func testAccAWSS3BucketPolicy(randInt int) string {
   627  	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)
   628  }
   629  
   630  func testAccAWSS3BucketConfig(randInt int) string {
   631  	return fmt.Sprintf(`
   632  resource "aws_s3_bucket" "bucket" {
   633  	bucket = "tf-test-bucket-%d"
   634  	acl = "public-read"
   635  }
   636  `, randInt)
   637  }
   638  
   639  func testAccAWSS3BucketWebsiteConfig(randInt int) string {
   640  	return fmt.Sprintf(`
   641  resource "aws_s3_bucket" "bucket" {
   642  	bucket = "tf-test-bucket-%d"
   643  	acl = "public-read"
   644  
   645  	website {
   646  		index_document = "index.html"
   647  	}
   648  }
   649  `, randInt)
   650  }
   651  
   652  func testAccAWSS3BucketWebsiteConfigWithError(randInt int) string {
   653  	return fmt.Sprintf(`
   654  resource "aws_s3_bucket" "bucket" {
   655  	bucket = "tf-test-bucket-%d"
   656  	acl = "public-read"
   657  
   658  	website {
   659  		index_document = "index.html"
   660  		error_document = "error.html"
   661  	}
   662  }
   663  `, randInt)
   664  }
   665  
   666  func testAccAWSS3BucketWebsiteConfigWithRedirect(randInt int) string {
   667  	return fmt.Sprintf(`
   668  resource "aws_s3_bucket" "bucket" {
   669  	bucket = "tf-test-bucket-%d"
   670  	acl = "public-read"
   671  
   672  	website {
   673  		redirect_all_requests_to = "hashicorp.com"
   674  	}
   675  }
   676  `, randInt)
   677  }
   678  
   679  func testAccAWSS3BucketWebsiteConfigWithHttpsRedirect(randInt int) string {
   680  	return fmt.Sprintf(`
   681  resource "aws_s3_bucket" "bucket" {
   682  	bucket = "tf-test-bucket-%d"
   683  	acl = "public-read"
   684  
   685  	website {
   686  		redirect_all_requests_to = "https://hashicorp.com"
   687  	}
   688  }
   689  `, randInt)
   690  }
   691  
   692  func testAccAWSS3BucketWebsiteConfigWithRoutingRules(randInt int) string {
   693  	return fmt.Sprintf(`
   694  resource "aws_s3_bucket" "bucket" {
   695  	bucket = "tf-test-bucket-%d"
   696  	acl = "public-read"
   697  
   698  	website {
   699  		index_document = "index.html"
   700  		error_document = "error.html"
   701  		routing_rules = <<EOF
   702  [{
   703  	"Condition": {
   704  		"KeyPrefixEquals": "docs/"
   705  	},
   706  	"Redirect": {
   707  		"ReplaceKeyPrefixWith": "documents/"
   708  	}
   709  }]
   710  EOF
   711  	}
   712  }
   713  `, randInt)
   714  }
   715  
   716  func testAccAWSS3BucketConfigWithPolicy(randInt int) string {
   717  	return fmt.Sprintf(`
   718  resource "aws_s3_bucket" "bucket" {
   719  	bucket = "tf-test-bucket-%d"
   720  	acl = "public-read"
   721  	policy = %s
   722  }
   723  `, randInt, strconv.Quote(testAccAWSS3BucketPolicy(randInt)))
   724  }
   725  
   726  func testAccAWSS3BucketDestroyedConfig(randInt int) string {
   727  	return fmt.Sprintf(`
   728  resource "aws_s3_bucket" "bucket" {
   729  	bucket = "tf-test-bucket-%d"
   730  	acl = "public-read"
   731  }
   732  `, randInt)
   733  }
   734  
   735  func testAccAWSS3BucketConfigWithEmptyPolicy(randInt int) string {
   736  	return fmt.Sprintf(`
   737  resource "aws_s3_bucket" "bucket" {
   738  	bucket = "tf-test-bucket-%d"
   739  	acl = "public-read"
   740  	policy = ""
   741  }
   742  `, randInt)
   743  }
   744  
   745  func testAccAWSS3BucketConfigWithVersioning(randInt int) string {
   746  	return fmt.Sprintf(`
   747  resource "aws_s3_bucket" "bucket" {
   748  	bucket = "tf-test-bucket-%d"
   749  	acl = "public-read"
   750  	versioning {
   751  	  enabled = true
   752  	}
   753  }
   754  `, randInt)
   755  }
   756  
   757  func testAccAWSS3BucketConfigWithDisableVersioning(randInt int) string {
   758  	return fmt.Sprintf(`
   759  resource "aws_s3_bucket" "bucket" {
   760  	bucket = "tf-test-bucket-%d"
   761  	acl = "public-read"
   762  	versioning {
   763  	  enabled = false
   764  	}
   765  }
   766  `, randInt)
   767  }
   768  
   769  func testAccAWSS3BucketConfigWithCORS(randInt int) string {
   770  	return fmt.Sprintf(`
   771  resource "aws_s3_bucket" "bucket" {
   772  	bucket = "tf-test-bucket-%d"
   773  	acl = "public-read"
   774  	cors_rule {
   775  			allowed_headers = ["*"]
   776  			allowed_methods = ["PUT","POST"]
   777  			allowed_origins = ["https://www.example.com"]
   778  			expose_headers = ["x-amz-server-side-encryption","ETag"]
   779  			max_age_seconds = 3000
   780  	}
   781  }
   782  `, randInt)
   783  }
   784  
   785  var testAccAWSS3BucketConfigWithAcl = `
   786  resource "aws_s3_bucket" "bucket" {
   787  	bucket = "tf-test-bucket-%d"
   788  	acl = "public-read"
   789  }
   790  `
   791  
   792  var testAccAWSS3BucketConfigWithAclUpdate = `
   793  resource "aws_s3_bucket" "bucket" {
   794  	bucket = "tf-test-bucket-%d"
   795  	acl = "private"
   796  }
   797  `
   798  
   799  func testAccAWSS3BucketConfigWithLogging(randInt int) string {
   800  	return fmt.Sprintf(`
   801  resource "aws_s3_bucket" "log_bucket" {
   802  	bucket = "tf-test-log-bucket-%d"
   803  	acl = "log-delivery-write"
   804  }
   805  resource "aws_s3_bucket" "bucket" {
   806  	bucket = "tf-test-bucket-%d"
   807  	acl = "private"
   808  	logging {
   809  		target_bucket = "${aws_s3_bucket.log_bucket.id}"
   810  		target_prefix = "log/"
   811  	}
   812  }
   813  `, randInt, randInt)
   814  }