github.com/minamijoyo/terraform@v0.7.8-0.20161029001309-18b3736ba44b/builtin/providers/aws/data_source_aws_s3_bucket_object_test.go (about)

     1  package aws
     2  
     3  import (
     4  	"fmt"
     5  	"regexp"
     6  	"testing"
     7  
     8  	"github.com/aws/aws-sdk-go/aws"
     9  	"github.com/aws/aws-sdk-go/service/s3"
    10  	"github.com/hashicorp/terraform/helper/acctest"
    11  	"github.com/hashicorp/terraform/helper/resource"
    12  	"github.com/hashicorp/terraform/terraform"
    13  )
    14  
    15  func TestAccDataSourceAWSS3BucketObject_basic(t *testing.T) {
    16  	rInt := acctest.RandInt()
    17  	resourceOnlyConf, conf := testAccAWSDataSourceS3ObjectConfig_basic(rInt)
    18  
    19  	var rObj s3.GetObjectOutput
    20  	var dsObj s3.GetObjectOutput
    21  
    22  	resource.Test(t, resource.TestCase{
    23  		PreCheck:                  func() { testAccPreCheck(t) },
    24  		Providers:                 testAccProviders,
    25  		PreventPostDestroyRefresh: true,
    26  		Steps: []resource.TestStep{
    27  			resource.TestStep{
    28  				Config: resourceOnlyConf,
    29  				Check: resource.ComposeTestCheckFunc(
    30  					testAccCheckAWSS3BucketObjectExists("aws_s3_bucket_object.object", &rObj),
    31  				),
    32  			},
    33  			resource.TestStep{
    34  				Config: conf,
    35  				Check: resource.ComposeTestCheckFunc(
    36  					testAccCheckAwsS3ObjectDataSourceExists("data.aws_s3_bucket_object.obj", &dsObj),
    37  					resource.TestCheckResourceAttr("data.aws_s3_bucket_object.obj", "content_length", "11"),
    38  					resource.TestCheckResourceAttr("data.aws_s3_bucket_object.obj", "content_type", "binary/octet-stream"),
    39  					resource.TestCheckResourceAttr("data.aws_s3_bucket_object.obj", "etag", "b10a8db164e0754105b7a99be72e3fe5"),
    40  					resource.TestMatchResourceAttr("data.aws_s3_bucket_object.obj", "last_modified",
    41  						regexp.MustCompile("^[a-zA-Z]{3}, [0-9]+ [a-zA-Z]+ [0-9]{4} [0-9:]+ [A-Z]+$")),
    42  					resource.TestCheckResourceAttr("data.aws_s3_bucket_object.obj", "body", ""),
    43  				),
    44  			},
    45  		},
    46  	})
    47  }
    48  
    49  func TestAccDataSourceAWSS3BucketObject_readableBody(t *testing.T) {
    50  	rInt := acctest.RandInt()
    51  	resourceOnlyConf, conf := testAccAWSDataSourceS3ObjectConfig_readableBody(rInt)
    52  
    53  	var rObj s3.GetObjectOutput
    54  	var dsObj s3.GetObjectOutput
    55  
    56  	resource.Test(t, resource.TestCase{
    57  		PreCheck:                  func() { testAccPreCheck(t) },
    58  		Providers:                 testAccProviders,
    59  		PreventPostDestroyRefresh: true,
    60  		Steps: []resource.TestStep{
    61  			resource.TestStep{
    62  				Config: resourceOnlyConf,
    63  				Check: resource.ComposeTestCheckFunc(
    64  					testAccCheckAWSS3BucketObjectExists("aws_s3_bucket_object.object", &rObj),
    65  				),
    66  			},
    67  			resource.TestStep{
    68  				Config: conf,
    69  				Check: resource.ComposeTestCheckFunc(
    70  					testAccCheckAwsS3ObjectDataSourceExists("data.aws_s3_bucket_object.obj", &dsObj),
    71  					resource.TestCheckResourceAttr("data.aws_s3_bucket_object.obj", "content_length", "3"),
    72  					resource.TestCheckResourceAttr("data.aws_s3_bucket_object.obj", "content_type", "text/plain"),
    73  					resource.TestCheckResourceAttr("data.aws_s3_bucket_object.obj", "etag", "a6105c0a611b41b08f1209506350279e"),
    74  					resource.TestMatchResourceAttr("data.aws_s3_bucket_object.obj", "last_modified",
    75  						regexp.MustCompile("^[a-zA-Z]{3}, [0-9]+ [a-zA-Z]+ [0-9]{4} [0-9:]+ [A-Z]+$")),
    76  					resource.TestCheckResourceAttr("data.aws_s3_bucket_object.obj", "body", "yes"),
    77  				),
    78  			},
    79  		},
    80  	})
    81  }
    82  
    83  func TestAccDataSourceAWSS3BucketObject_kmsEncrypted(t *testing.T) {
    84  	rInt := acctest.RandInt()
    85  	resourceOnlyConf, conf := testAccAWSDataSourceS3ObjectConfig_kmsEncrypted(rInt)
    86  
    87  	var rObj s3.GetObjectOutput
    88  	var dsObj s3.GetObjectOutput
    89  
    90  	resource.Test(t, resource.TestCase{
    91  		PreCheck:                  func() { testAccPreCheck(t) },
    92  		Providers:                 testAccProviders,
    93  		PreventPostDestroyRefresh: true,
    94  		Steps: []resource.TestStep{
    95  			resource.TestStep{
    96  				Config: resourceOnlyConf,
    97  				Check: resource.ComposeTestCheckFunc(
    98  					testAccCheckAWSS3BucketObjectExists("aws_s3_bucket_object.object", &rObj),
    99  				),
   100  			},
   101  			resource.TestStep{
   102  				Config: conf,
   103  				Check: resource.ComposeTestCheckFunc(
   104  					testAccCheckAwsS3ObjectDataSourceExists("data.aws_s3_bucket_object.obj", &dsObj),
   105  					resource.TestCheckResourceAttr("data.aws_s3_bucket_object.obj", "content_length", "22"),
   106  					resource.TestCheckResourceAttr("data.aws_s3_bucket_object.obj", "content_type", "text/plain"),
   107  					resource.TestMatchResourceAttr("data.aws_s3_bucket_object.obj", "etag", regexp.MustCompile("^[a-f0-9]{32}$")),
   108  					resource.TestCheckResourceAttr("data.aws_s3_bucket_object.obj", "server_side_encryption", "aws:kms"),
   109  					resource.TestMatchResourceAttr("data.aws_s3_bucket_object.obj", "sse_kms_key_id",
   110  						regexp.MustCompile("^arn:aws:kms:us-west-2:[0-9]{12}:key/[a-z0-9-]{36}$")),
   111  					resource.TestMatchResourceAttr("data.aws_s3_bucket_object.obj", "last_modified",
   112  						regexp.MustCompile("^[a-zA-Z]{3}, [0-9]+ [a-zA-Z]+ [0-9]{4} [0-9:]+ [A-Z]+$")),
   113  					resource.TestCheckResourceAttr("data.aws_s3_bucket_object.obj", "body", "Keep Calm and Carry On"),
   114  				),
   115  			},
   116  		},
   117  	})
   118  }
   119  
   120  func TestAccDataSourceAWSS3BucketObject_allParams(t *testing.T) {
   121  	rInt := acctest.RandInt()
   122  	resourceOnlyConf, conf := testAccAWSDataSourceS3ObjectConfig_allParams(rInt)
   123  
   124  	var rObj s3.GetObjectOutput
   125  	var dsObj s3.GetObjectOutput
   126  
   127  	resource.Test(t, resource.TestCase{
   128  		PreCheck:                  func() { testAccPreCheck(t) },
   129  		Providers:                 testAccProviders,
   130  		PreventPostDestroyRefresh: true,
   131  		Steps: []resource.TestStep{
   132  			resource.TestStep{
   133  				Config: resourceOnlyConf,
   134  				Check: resource.ComposeTestCheckFunc(
   135  					testAccCheckAWSS3BucketObjectExists("aws_s3_bucket_object.object", &rObj),
   136  				),
   137  			},
   138  			resource.TestStep{
   139  				Config: conf,
   140  				Check: resource.ComposeTestCheckFunc(
   141  					testAccCheckAwsS3ObjectDataSourceExists("data.aws_s3_bucket_object.obj", &dsObj),
   142  					resource.TestCheckResourceAttr("data.aws_s3_bucket_object.obj", "content_length", "21"),
   143  					resource.TestCheckResourceAttr("data.aws_s3_bucket_object.obj", "content_type", "application/unknown"),
   144  					resource.TestCheckResourceAttr("data.aws_s3_bucket_object.obj", "etag", "723f7a6ac0c57b445790914668f98640"),
   145  					resource.TestMatchResourceAttr("data.aws_s3_bucket_object.obj", "last_modified",
   146  						regexp.MustCompile("^[a-zA-Z]{3}, [0-9]+ [a-zA-Z]+ [0-9]{4} [0-9:]+ [A-Z]+$")),
   147  					resource.TestMatchResourceAttr("data.aws_s3_bucket_object.obj", "version_id", regexp.MustCompile("^.{32}$")),
   148  					resource.TestCheckResourceAttr("data.aws_s3_bucket_object.obj", "body", ""),
   149  					resource.TestCheckResourceAttr("data.aws_s3_bucket_object.obj", "cache_control", "no-cache"),
   150  					resource.TestCheckResourceAttr("data.aws_s3_bucket_object.obj", "content_disposition", "attachment"),
   151  					resource.TestCheckResourceAttr("data.aws_s3_bucket_object.obj", "content_encoding", "gzip"),
   152  					resource.TestCheckResourceAttr("data.aws_s3_bucket_object.obj", "content_language", "en-GB"),
   153  					// Encryption is off
   154  					resource.TestCheckResourceAttr("data.aws_s3_bucket_object.obj", "server_side_encryption", ""),
   155  					resource.TestCheckResourceAttr("data.aws_s3_bucket_object.obj", "sse_kms_key_id", ""),
   156  					// Supported, but difficult to reproduce in short testing time
   157  					resource.TestCheckResourceAttr("data.aws_s3_bucket_object.obj", "storage_class", "STANDARD"),
   158  					resource.TestCheckResourceAttr("data.aws_s3_bucket_object.obj", "expiration", ""),
   159  					// Currently unsupported in aws_s3_bucket_object resource
   160  					resource.TestCheckResourceAttr("data.aws_s3_bucket_object.obj", "expires", ""),
   161  					resource.TestCheckResourceAttr("data.aws_s3_bucket_object.obj", "website_redirect_location", ""),
   162  					resource.TestCheckResourceAttr("data.aws_s3_bucket_object.obj", "metadata.%", "0"),
   163  				),
   164  			},
   165  		},
   166  	})
   167  }
   168  
   169  func testAccCheckAwsS3ObjectDataSourceExists(n string, obj *s3.GetObjectOutput) resource.TestCheckFunc {
   170  	return func(s *terraform.State) error {
   171  		rs, ok := s.RootModule().Resources[n]
   172  		if !ok {
   173  			return fmt.Errorf("Can't find S3 object data source: %s", n)
   174  		}
   175  
   176  		if rs.Primary.ID == "" {
   177  			return fmt.Errorf("S3 object data source ID not set")
   178  		}
   179  
   180  		s3conn := testAccProvider.Meta().(*AWSClient).s3conn
   181  		out, err := s3conn.GetObject(
   182  			&s3.GetObjectInput{
   183  				Bucket: aws.String(rs.Primary.Attributes["bucket"]),
   184  				Key:    aws.String(rs.Primary.Attributes["key"]),
   185  			})
   186  		if err != nil {
   187  			return fmt.Errorf("Failed getting S3 Object from %s: %s",
   188  				rs.Primary.Attributes["bucket"]+"/"+rs.Primary.Attributes["key"], err)
   189  		}
   190  
   191  		*obj = *out
   192  
   193  		return nil
   194  	}
   195  }
   196  
   197  func testAccAWSDataSourceS3ObjectConfig_basic(randInt int) (string, string) {
   198  	resources := fmt.Sprintf(`
   199  resource "aws_s3_bucket" "object_bucket" {
   200  	bucket = "tf-object-test-bucket-%d"
   201  }
   202  resource "aws_s3_bucket_object" "object" {
   203  	bucket = "${aws_s3_bucket.object_bucket.bucket}"
   204  	key = "tf-testing-obj-%d"
   205  	content = "Hello World"
   206  }
   207  `, randInt, randInt)
   208  
   209  	both := fmt.Sprintf(`%s
   210  data "aws_s3_bucket_object" "obj" {
   211  	bucket = "tf-object-test-bucket-%d"
   212  	key = "tf-testing-obj-%d"
   213  }`, resources, randInt, randInt)
   214  
   215  	return resources, both
   216  }
   217  
   218  func testAccAWSDataSourceS3ObjectConfig_readableBody(randInt int) (string, string) {
   219  	resources := fmt.Sprintf(`
   220  resource "aws_s3_bucket" "object_bucket" {
   221  	bucket = "tf-object-test-bucket-%d"
   222  }
   223  resource "aws_s3_bucket_object" "object" {
   224  	bucket = "${aws_s3_bucket.object_bucket.bucket}"
   225  	key = "tf-testing-obj-%d-readable"
   226  	content = "yes"
   227  	content_type = "text/plain"
   228  }
   229  `, randInt, randInt)
   230  
   231  	both := fmt.Sprintf(`%s
   232  data "aws_s3_bucket_object" "obj" {
   233  	bucket = "tf-object-test-bucket-%d"
   234  	key = "tf-testing-obj-%d-readable"
   235  }`, resources, randInt, randInt)
   236  
   237  	return resources, both
   238  }
   239  
   240  func testAccAWSDataSourceS3ObjectConfig_kmsEncrypted(randInt int) (string, string) {
   241  	resources := fmt.Sprintf(`
   242  resource "aws_s3_bucket" "object_bucket" {
   243  	bucket = "tf-object-test-bucket-%d"
   244  }
   245  resource "aws_kms_key" "example" {
   246    description             = "TF Acceptance Test KMS key"
   247    deletion_window_in_days = 7
   248  }
   249  resource "aws_s3_bucket_object" "object" {
   250  	bucket = "${aws_s3_bucket.object_bucket.bucket}"
   251  	key = "tf-testing-obj-%d-encrypted"
   252  	content = "Keep Calm and Carry On"
   253  	content_type = "text/plain"
   254  	kms_key_id = "${aws_kms_key.example.arn}"
   255  }
   256  `, randInt, randInt)
   257  
   258  	both := fmt.Sprintf(`%s
   259  data "aws_s3_bucket_object" "obj" {
   260  	bucket = "tf-object-test-bucket-%d"
   261  	key = "tf-testing-obj-%d-encrypted"
   262  }`, resources, randInt, randInt)
   263  
   264  	return resources, both
   265  }
   266  
   267  func testAccAWSDataSourceS3ObjectConfig_allParams(randInt int) (string, string) {
   268  	resources := fmt.Sprintf(`
   269  resource "aws_s3_bucket" "object_bucket" {
   270  	bucket = "tf-object-test-bucket-%d"
   271  	versioning {
   272  		enabled = true
   273  	}
   274  }
   275  
   276  resource "aws_s3_bucket_object" "object" {
   277  	bucket = "${aws_s3_bucket.object_bucket.bucket}"
   278  	key = "tf-testing-obj-%d-all-params"
   279  	content = <<CONTENT
   280  {"msg": "Hi there!"}
   281  CONTENT
   282  	content_type = "application/unknown"
   283  	cache_control = "no-cache"
   284  	content_disposition = "attachment"
   285  	content_encoding = "gzip"
   286  	content_language = "en-GB"
   287  }
   288  `, randInt, randInt)
   289  
   290  	both := fmt.Sprintf(`%s
   291  data "aws_s3_bucket_object" "obj" {
   292  	bucket = "tf-object-test-bucket-%d"
   293  	key = "tf-testing-obj-%d-all-params"
   294  }`, resources, randInt, randInt)
   295  
   296  	return resources, both
   297  }