Skip to content

Instantly share code, notes, and snippets.

@mubeta06
Created August 16, 2017 22:44
Show Gist options
  • Save mubeta06/b5e29694b8b1b5b5511f373ab5f85703 to your computer and use it in GitHub Desktop.
Save mubeta06/b5e29694b8b1b5b5511f373ab5f85703 to your computer and use it in GitHub Desktop.
package derp
import (
"fmt"
"io/ioutil"
"log"
"os"
"testing"
"github.com/hashicorp/terraform/helper/acctest"
"github.com/hashicorp/terraform/helper/resource"
"github.com/hashicorp/terraform/helper/schema"
"github.com/hashicorp/terraform/terraform"
"github.com/terraform-providers/terraform-provider-template/template"
"github.com/terraform-providers/terraform-provider-tls/tls"
terraformaws "github.com/terraform-providers/terraform-provider-aws/aws"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/service/s3"
)
var testAccProviders map[string]terraform.ResourceProvider
var testAccProvidersWithTLS map[string]terraform.ResourceProvider
var testAccProvider *schema.Provider
var testAccTemplateProvider *schema.Provider
func init() {
testAccProvider = terraformaws.Provider().(*schema.Provider)
testAccTemplateProvider = template.Provider().(*schema.Provider)
testAccProviders = map[string]terraform.ResourceProvider{
"aws": testAccProvider,
"template": testAccTemplateProvider,
}
testAccProvidersWithTLS = map[string]terraform.ResourceProvider{
"tls": tls.Provider(),
}
for k, v := range testAccProviders {
testAccProvidersWithTLS[k] = v
}
}
func testAccPreCheck(t *testing.T) {
if v := os.Getenv("AWS_PROFILE"); v == "" {
if v := os.Getenv("AWS_ACCESS_KEY_ID"); v == "" {
t.Fatal("AWS_ACCESS_KEY_ID must be set for acceptance tests")
}
if v := os.Getenv("AWS_SECRET_ACCESS_KEY"); v == "" {
t.Fatal("AWS_SECRET_ACCESS_KEY must be set for acceptance tests")
}
}
if v := os.Getenv("AWS_DEFAULT_REGION"); v == "" {
log.Println("[INFO] Test: Using us-west-2 as test region")
os.Setenv("AWS_DEFAULT_REGION", "us-west-2")
}
err := testAccProvider.Configure(terraform.NewResourceConfig(nil))
if err != nil {
t.Fatal(err)
}
}
func TestAccAWSS3BucketObject_sse(t *testing.T) {
tmpFile, err := ioutil.TempFile("", "tf-acc-s3-obj-source-sse")
if err != nil {
t.Fatal(err)
}
defer os.Remove(tmpFile.Name())
// first write some data to the tempfile just so it's not 0 bytes.
err = ioutil.WriteFile(tmpFile.Name(), []byte("{anything will do}"), 0644)
if err != nil {
t.Fatal(err)
}
rInt := acctest.RandInt()
var obj s3.GetObjectOutput
resource.Test(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },
Providers: testAccProviders,
CheckDestroy: testAccCheckAWSS3BucketObjectDestroy,
Steps: []resource.TestStep{
resource.TestStep{
PreConfig: func() {},
Config: testAccAWSS3BucketObjectConfig_withSSE(rInt, tmpFile.Name()),
Check: resource.ComposeTestCheckFunc(
testAccCheckAWSS3BucketObjectExists(
"aws_s3_bucket_object.object",
&obj),
testAccCheckAWSS3BucketObjectSSE(
"aws_s3_bucket_object.object",
"aws:kms"),
),
},
},
})
}
func testAccCheckAWSS3BucketObjectDestroy(s *terraform.State) error {
s3conn := testAccProvider.Meta().(*terraformaws.AWSClient).S3()
for _, rs := range s.RootModule().Resources {
if rs.Type != "aws_s3_bucket_object" {
continue
}
_, err := s3conn.HeadObject(
&s3.HeadObjectInput{
Bucket: aws.String(rs.Primary.Attributes["bucket"]),
Key: aws.String(rs.Primary.Attributes["key"]),
IfMatch: aws.String(rs.Primary.Attributes["etag"]),
})
if err == nil {
return fmt.Errorf("AWS S3 Object still exists: %s", rs.Primary.ID)
}
}
return nil
}
func testAccCheckAWSS3BucketObjectExists(n string, obj *s3.GetObjectOutput) resource.TestCheckFunc {
return func(s *terraform.State) error {
rs, ok := s.RootModule().Resources[n]
if !ok {
return fmt.Errorf("Not Found: %s", n)
}
if rs.Primary.ID == "" {
return fmt.Errorf("No S3 Bucket Object ID is set")
}
s3conn := testAccProvider.Meta().(*terraformaws.AWSClient).S3()
out, err := s3conn.GetObject(
&s3.GetObjectInput{
Bucket: aws.String(rs.Primary.Attributes["bucket"]),
Key: aws.String(rs.Primary.Attributes["key"]),
IfMatch: aws.String(rs.Primary.Attributes["etag"]),
})
if err != nil {
return fmt.Errorf("S3Bucket Object error: %s", err)
}
*obj = *out
return nil
}
}
func testAccCheckAWSS3BucketObjectSSE(n, expectedSSE string) resource.TestCheckFunc {
return func(s *terraform.State) error {
rs, _ := s.RootModule().Resources[n]
s3conn := testAccProvider.Meta().(*terraformaws.AWSClient).S3()
out, err := s3conn.HeadObject(&s3.HeadObjectInput{
Bucket: aws.String(rs.Primary.Attributes["bucket"]),
Key: aws.String(rs.Primary.Attributes["key"]),
})
if err != nil {
return fmt.Errorf("HeadObject error: %v", err)
}
if out.ServerSideEncryption == nil {
return fmt.Errorf("Expected a non %v Server Side Encryption.", out.ServerSideEncryption)
}
sse := *out.ServerSideEncryption
if sse != expectedSSE {
return fmt.Errorf("Expected Server Side Encryption %v, got %v.",
expectedSSE, sse)
}
return nil
}
}
func testAccAWSS3BucketObjectConfig_withSSE(randInt int, source string) string {
return fmt.Sprintf(`
resource "aws_s3_bucket" "object_bucket" {
bucket = "tf-object-test-bucket-%d"
}
resource "aws_s3_bucket_object" "object" {
bucket = "${aws_s3_bucket.object_bucket.bucket}"
key = "test-key"
source = "%s"
server_side_encryption = "aws:kms"
}
`, randInt, source)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment