github.com/bendemaree/terraform@v0.5.4-0.20150613200311-f50d97d6eee6/builtin/providers/aws/resource_aws_s3_bucket_test.go (about)

     1  package aws
     2  
     3  import (
     4  	"encoding/json"
     5  	"fmt"
     6  	"math/rand"
     7  	"reflect"
     8  	"strconv"
     9  	"testing"
    10  	"time"
    11  
    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/service/s3"
    17  )
    18  
    19  func TestAccAWSS3Bucket_basic(t *testing.T) {
    20  	resource.Test(t, resource.TestCase{
    21  		PreCheck:     func() { testAccPreCheck(t) },
    22  		Providers:    testAccProviders,
    23  		CheckDestroy: testAccCheckAWSS3BucketDestroy,
    24  		Steps: []resource.TestStep{
    25  			resource.TestStep{
    26  				Config: testAccAWSS3BucketConfig,
    27  				Check: resource.ComposeTestCheckFunc(
    28  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
    29  					resource.TestCheckResourceAttr(
    30  						"aws_s3_bucket.bucket", "hosted_zone_id", HostedZoneIDForRegion("us-west-2")),
    31  					resource.TestCheckResourceAttr(
    32  						"aws_s3_bucket.bucket", "region", "us-west-2"),
    33  					resource.TestCheckResourceAttr(
    34  						"aws_s3_bucket.bucket", "website_endpoint", ""),
    35  				),
    36  			},
    37  		},
    38  	})
    39  }
    40  
    41  func TestAccAWSS3Bucket_Policy(t *testing.T) {
    42  	resource.Test(t, resource.TestCase{
    43  		PreCheck:     func() { testAccPreCheck(t) },
    44  		Providers:    testAccProviders,
    45  		CheckDestroy: testAccCheckAWSS3BucketDestroy,
    46  		Steps: []resource.TestStep{
    47  			resource.TestStep{
    48  				Config: testAccAWSS3BucketConfigWithPolicy,
    49  				Check: resource.ComposeTestCheckFunc(
    50  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
    51  					testAccCheckAWSS3BucketPolicy(
    52  						"aws_s3_bucket.bucket", testAccAWSS3BucketPolicy),
    53  				),
    54  			},
    55  			resource.TestStep{
    56  				Config: testAccAWSS3BucketConfig,
    57  				Check: resource.ComposeTestCheckFunc(
    58  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
    59  					testAccCheckAWSS3BucketPolicy(
    60  						"aws_s3_bucket.bucket", ""),
    61  				),
    62  			},
    63  		},
    64  	})
    65  }
    66  
    67  func TestAccAWSS3Bucket_Website(t *testing.T) {
    68  	resource.Test(t, resource.TestCase{
    69  		PreCheck:     func() { testAccPreCheck(t) },
    70  		Providers:    testAccProviders,
    71  		CheckDestroy: testAccCheckAWSS3BucketDestroy,
    72  		Steps: []resource.TestStep{
    73  			resource.TestStep{
    74  				Config: testAccAWSS3BucketWebsiteConfig,
    75  				Check: resource.ComposeTestCheckFunc(
    76  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
    77  					testAccCheckAWSS3BucketWebsite(
    78  						"aws_s3_bucket.bucket", "index.html", "", ""),
    79  					resource.TestCheckResourceAttr(
    80  						"aws_s3_bucket.bucket", "website_endpoint", testAccWebsiteEndpoint),
    81  				),
    82  			},
    83  			resource.TestStep{
    84  				Config: testAccAWSS3BucketWebsiteConfigWithError,
    85  				Check: resource.ComposeTestCheckFunc(
    86  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
    87  					testAccCheckAWSS3BucketWebsite(
    88  						"aws_s3_bucket.bucket", "index.html", "error.html", ""),
    89  					resource.TestCheckResourceAttr(
    90  						"aws_s3_bucket.bucket", "website_endpoint", testAccWebsiteEndpoint),
    91  				),
    92  			},
    93  			resource.TestStep{
    94  				Config: testAccAWSS3BucketConfig,
    95  				Check: resource.ComposeTestCheckFunc(
    96  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
    97  					testAccCheckAWSS3BucketWebsite(
    98  						"aws_s3_bucket.bucket", "", "", ""),
    99  					resource.TestCheckResourceAttr(
   100  						"aws_s3_bucket.bucket", "website_endpoint", ""),
   101  				),
   102  			},
   103  		},
   104  	})
   105  }
   106  
   107  func TestAccAWSS3Bucket_WebsiteRedirect(t *testing.T) {
   108  	resource.Test(t, resource.TestCase{
   109  		PreCheck:     func() { testAccPreCheck(t) },
   110  		Providers:    testAccProviders,
   111  		CheckDestroy: testAccCheckAWSS3BucketDestroy,
   112  		Steps: []resource.TestStep{
   113  			resource.TestStep{
   114  				Config: testAccAWSS3BucketWebsiteConfigWithRedirect,
   115  				Check: resource.ComposeTestCheckFunc(
   116  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
   117  					testAccCheckAWSS3BucketWebsite(
   118  						"aws_s3_bucket.bucket", "", "", "hashicorp.com"),
   119  					resource.TestCheckResourceAttr(
   120  						"aws_s3_bucket.bucket", "website_endpoint", testAccWebsiteEndpoint),
   121  				),
   122  			},
   123  			resource.TestStep{
   124  				Config: testAccAWSS3BucketConfig,
   125  				Check: resource.ComposeTestCheckFunc(
   126  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
   127  					testAccCheckAWSS3BucketWebsite(
   128  						"aws_s3_bucket.bucket", "", "", ""),
   129  					resource.TestCheckResourceAttr(
   130  						"aws_s3_bucket.bucket", "website_endpoint", ""),
   131  				),
   132  			},
   133  		},
   134  	})
   135  }
   136  
   137  func testAccCheckAWSS3BucketDestroy(s *terraform.State) error {
   138  	conn := testAccProvider.Meta().(*AWSClient).s3conn
   139  
   140  	for _, rs := range s.RootModule().Resources {
   141  		if rs.Type != "aws_s3_bucket" {
   142  			continue
   143  		}
   144  		_, err := conn.DeleteBucket(&s3.DeleteBucketInput{
   145  			Bucket: aws.String(rs.Primary.ID),
   146  		})
   147  		if err != nil {
   148  			return err
   149  		}
   150  	}
   151  	return nil
   152  }
   153  
   154  func testAccCheckAWSS3BucketExists(n string) resource.TestCheckFunc {
   155  	return func(s *terraform.State) error {
   156  		rs, ok := s.RootModule().Resources[n]
   157  		if !ok {
   158  			return fmt.Errorf("Not found: %s", n)
   159  		}
   160  
   161  		if rs.Primary.ID == "" {
   162  			return fmt.Errorf("No S3 Bucket ID is set")
   163  		}
   164  
   165  		conn := testAccProvider.Meta().(*AWSClient).s3conn
   166  		_, err := conn.HeadBucket(&s3.HeadBucketInput{
   167  			Bucket: aws.String(rs.Primary.ID),
   168  		})
   169  
   170  		if err != nil {
   171  			return fmt.Errorf("S3Bucket error: %v", err)
   172  		}
   173  		return nil
   174  	}
   175  }
   176  
   177  func testAccCheckAWSS3BucketPolicy(n string, policy string) resource.TestCheckFunc {
   178  	return func(s *terraform.State) error {
   179  		rs, _ := s.RootModule().Resources[n]
   180  		conn := testAccProvider.Meta().(*AWSClient).s3conn
   181  
   182  		out, err := conn.GetBucketPolicy(&s3.GetBucketPolicyInput{
   183  			Bucket: aws.String(rs.Primary.ID),
   184  		})
   185  
   186  		if err != nil {
   187  			if policy == "" {
   188  				// expected
   189  				return nil
   190  			} else {
   191  				return fmt.Errorf("GetBucketPolicy error: %v, expected %s", err, policy)
   192  			}
   193  		}
   194  
   195  		if v := out.Policy; v == nil {
   196  			if policy != "" {
   197  				return fmt.Errorf("bad policy, found nil, expected: %s", policy)
   198  			}
   199  		} else {
   200  			expected := make(map[string]interface{})
   201  			if err := json.Unmarshal([]byte(policy), &expected); err != nil {
   202  				return err
   203  			}
   204  			actual := make(map[string]interface{})
   205  			if err := json.Unmarshal([]byte(*v), &actual); err != nil {
   206  				return err
   207  			}
   208  
   209  			if !reflect.DeepEqual(expected, actual) {
   210  				return fmt.Errorf("bad policy, expected: %#v, got %#v", expected, actual)
   211  			}
   212  		}
   213  
   214  		return nil
   215  	}
   216  }
   217  func testAccCheckAWSS3BucketWebsite(n string, indexDoc string, errorDoc string, redirectTo string) resource.TestCheckFunc {
   218  	return func(s *terraform.State) error {
   219  		rs, _ := s.RootModule().Resources[n]
   220  		conn := testAccProvider.Meta().(*AWSClient).s3conn
   221  
   222  		out, err := conn.GetBucketWebsite(&s3.GetBucketWebsiteInput{
   223  			Bucket: aws.String(rs.Primary.ID),
   224  		})
   225  
   226  		if err != nil {
   227  			if indexDoc == "" {
   228  				// If we want to assert that the website is not there, than
   229  				// this error is expected
   230  				return nil
   231  			} else {
   232  				return fmt.Errorf("S3BucketWebsite error: %v", err)
   233  			}
   234  		}
   235  
   236  		if v := out.IndexDocument; v == nil {
   237  			if indexDoc != "" {
   238  				return fmt.Errorf("bad index doc, found nil, expected: %s", indexDoc)
   239  			}
   240  		} else {
   241  			if *v.Suffix != indexDoc {
   242  				return fmt.Errorf("bad index doc, expected: %s, got %#v", indexDoc, out.IndexDocument)
   243  			}
   244  		}
   245  
   246  		if v := out.ErrorDocument; v == nil {
   247  			if errorDoc != "" {
   248  				return fmt.Errorf("bad error doc, found nil, expected: %s", errorDoc)
   249  			}
   250  		} else {
   251  			if *v.Key != errorDoc {
   252  				return fmt.Errorf("bad error doc, expected: %s, got %#v", errorDoc, out.ErrorDocument)
   253  			}
   254  		}
   255  
   256  		if v := out.RedirectAllRequestsTo; v == nil {
   257  			if redirectTo != "" {
   258  				return fmt.Errorf("bad redirect to, found nil, expected: %s", redirectTo)
   259  			}
   260  		} else {
   261  			if *v.HostName != redirectTo {
   262  				return fmt.Errorf("bad redirect to, expected: %s, got %#v", redirectTo, out.RedirectAllRequestsTo)
   263  			}
   264  		}
   265  
   266  		return nil
   267  	}
   268  }
   269  
   270  // These need a bit of randomness as the name can only be used once globally
   271  // within AWS
   272  var randInt = rand.New(rand.NewSource(time.Now().UnixNano())).Int()
   273  var testAccWebsiteEndpoint = fmt.Sprintf("tf-test-bucket-%d.s3-website-us-west-2.amazonaws.com", randInt)
   274  var testAccAWSS3BucketPolicy = fmt.Sprintf(`{ "Version": "2008-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "AWS": "*" }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::tf-test-bucket-%d/*" } ] }`, randInt)
   275  
   276  var testAccAWSS3BucketConfig = fmt.Sprintf(`
   277  resource "aws_s3_bucket" "bucket" {
   278  	bucket = "tf-test-bucket-%d"
   279  	acl = "public-read"
   280  }
   281  `, randInt)
   282  
   283  var testAccAWSS3BucketWebsiteConfig = fmt.Sprintf(`
   284  resource "aws_s3_bucket" "bucket" {
   285  	bucket = "tf-test-bucket-%d"
   286  	acl = "public-read"
   287  
   288  	website {
   289  		index_document = "index.html"
   290  	}
   291  }
   292  `, randInt)
   293  
   294  var testAccAWSS3BucketWebsiteConfigWithError = fmt.Sprintf(`
   295  resource "aws_s3_bucket" "bucket" {
   296  	bucket = "tf-test-bucket-%d"
   297  	acl = "public-read"
   298  
   299  	website {
   300  		index_document = "index.html"
   301  		error_document = "error.html"
   302  	}
   303  }
   304  `, randInt)
   305  
   306  var testAccAWSS3BucketWebsiteConfigWithRedirect = fmt.Sprintf(`
   307  resource "aws_s3_bucket" "bucket" {
   308  	bucket = "tf-test-bucket-%d"
   309  	acl = "public-read"
   310  
   311  	website {
   312  		redirect_all_requests_to = "hashicorp.com"
   313  	}
   314  }
   315  `, randInt)
   316  
   317  var testAccAWSS3BucketConfigWithPolicy = fmt.Sprintf(`
   318  resource "aws_s3_bucket" "bucket" {
   319  	bucket = "tf-test-bucket-%d"
   320  	acl = "public-read"
   321  	policy = %s
   322  }
   323  `, randInt, strconv.Quote(testAccAWSS3BucketPolicy))