github.com/erriapo/terraform@v0.6.12-0.20160203182612-0340ea72354f/builtin/providers/aws/resource_aws_kinesis_firehose_delivery_stream_test.go (about)

     1  package aws
     2  
     3  import (
     4  	"fmt"
     5  	"log"
     6  	"math/rand"
     7  	"os"
     8  	"strings"
     9  	"testing"
    10  	"time"
    11  
    12  	"github.com/aws/aws-sdk-go/aws"
    13  	"github.com/aws/aws-sdk-go/service/firehose"
    14  	"github.com/hashicorp/terraform/helper/resource"
    15  	"github.com/hashicorp/terraform/terraform"
    16  )
    17  
    18  func TestAccAWSKinesisFirehoseDeliveryStream_basic(t *testing.T) {
    19  	var stream firehose.DeliveryStreamDescription
    20  	ri := rand.New(rand.NewSource(time.Now().UnixNano())).Int()
    21  	config := fmt.Sprintf(testAccKinesisFirehoseDeliveryStreamConfig_basic,
    22  		os.Getenv("AWS_ACCOUNT_ID"), ri, ri)
    23  
    24  	resource.Test(t, resource.TestCase{
    25  		PreCheck: func() {
    26  			testAccPreCheck(t)
    27  			if os.Getenv("AWS_ACCOUNT_ID") == "" {
    28  				t.Fatal("AWS_ACCOUNT_ID must be set")
    29  			}
    30  		},
    31  		Providers:    testAccProviders,
    32  		CheckDestroy: testAccCheckKinesisFirehoseDeliveryStreamDestroy,
    33  		Steps: []resource.TestStep{
    34  			resource.TestStep{
    35  				Config: config,
    36  				Check: resource.ComposeTestCheckFunc(
    37  					testAccCheckKinesisFirehoseDeliveryStreamExists("aws_kinesis_firehose_delivery_stream.test_stream", &stream),
    38  					testAccCheckAWSKinesisFirehoseDeliveryStreamAttributes(&stream),
    39  				),
    40  			},
    41  		},
    42  	})
    43  }
    44  
    45  func TestAccAWSKinesisFirehoseDeliveryStream_s3ConfigUpdates(t *testing.T) {
    46  	var stream firehose.DeliveryStreamDescription
    47  
    48  	ri := rand.New(rand.NewSource(time.Now().UnixNano())).Int()
    49  	preconfig := fmt.Sprintf(testAccKinesisFirehoseDeliveryStreamConfig_s3,
    50  		os.Getenv("AWS_ACCOUNT_ID"), ri, ri)
    51  	postConfig := fmt.Sprintf(testAccKinesisFirehoseDeliveryStreamConfig_s3Updates,
    52  		os.Getenv("AWS_ACCOUNT_ID"), ri, ri)
    53  
    54  	resource.Test(t, resource.TestCase{
    55  		PreCheck: func() {
    56  			testAccPreCheck(t)
    57  			if os.Getenv("AWS_ACCOUNT_ID") == "" {
    58  				t.Fatal("AWS_ACCOUNT_ID must be set")
    59  			}
    60  		},
    61  		Providers:    testAccProviders,
    62  		CheckDestroy: testAccCheckKinesisFirehoseDeliveryStreamDestroy,
    63  		Steps: []resource.TestStep{
    64  			resource.TestStep{
    65  				Config: preconfig,
    66  				Check: resource.ComposeTestCheckFunc(
    67  					testAccCheckKinesisFirehoseDeliveryStreamExists("aws_kinesis_firehose_delivery_stream.test_stream", &stream),
    68  					testAccCheckAWSKinesisFirehoseDeliveryStreamAttributes(&stream),
    69  					resource.TestCheckResourceAttr(
    70  						"aws_kinesis_firehose_delivery_stream.test_stream", "s3_buffer_size", "5"),
    71  					resource.TestCheckResourceAttr(
    72  						"aws_kinesis_firehose_delivery_stream.test_stream", "s3_buffer_interval", "300"),
    73  					resource.TestCheckResourceAttr(
    74  						"aws_kinesis_firehose_delivery_stream.test_stream", "s3_data_compression", "UNCOMPRESSED"),
    75  				),
    76  			},
    77  
    78  			resource.TestStep{
    79  				Config: postConfig,
    80  				Check: resource.ComposeTestCheckFunc(
    81  					testAccCheckKinesisFirehoseDeliveryStreamExists("aws_kinesis_firehose_delivery_stream.test_stream", &stream),
    82  					testAccCheckAWSKinesisFirehoseDeliveryStreamAttributes(&stream),
    83  					resource.TestCheckResourceAttr(
    84  						"aws_kinesis_firehose_delivery_stream.test_stream", "s3_buffer_size", "10"),
    85  					resource.TestCheckResourceAttr(
    86  						"aws_kinesis_firehose_delivery_stream.test_stream", "s3_buffer_interval", "400"),
    87  					resource.TestCheckResourceAttr(
    88  						"aws_kinesis_firehose_delivery_stream.test_stream", "s3_data_compression", "GZIP"),
    89  				),
    90  			},
    91  		},
    92  	})
    93  }
    94  
    95  func testAccCheckKinesisFirehoseDeliveryStreamExists(n string, stream *firehose.DeliveryStreamDescription) resource.TestCheckFunc {
    96  	return func(s *terraform.State) error {
    97  		rs, ok := s.RootModule().Resources[n]
    98  		log.Printf("State: %#v", s.RootModule().Resources)
    99  		if !ok {
   100  			return fmt.Errorf("Not found: %s", n)
   101  		}
   102  
   103  		if rs.Primary.ID == "" {
   104  			return fmt.Errorf("No Kinesis Firehose ID is set")
   105  		}
   106  
   107  		conn := testAccProvider.Meta().(*AWSClient).firehoseconn
   108  		describeOpts := &firehose.DescribeDeliveryStreamInput{
   109  			DeliveryStreamName: aws.String(rs.Primary.Attributes["name"]),
   110  		}
   111  		resp, err := conn.DescribeDeliveryStream(describeOpts)
   112  		if err != nil {
   113  			return err
   114  		}
   115  
   116  		*stream = *resp.DeliveryStreamDescription
   117  
   118  		return nil
   119  	}
   120  }
   121  
   122  func testAccCheckAWSKinesisFirehoseDeliveryStreamAttributes(stream *firehose.DeliveryStreamDescription) resource.TestCheckFunc {
   123  	return func(s *terraform.State) error {
   124  		if !strings.HasPrefix(*stream.DeliveryStreamName, "terraform-kinesis-firehose") {
   125  			return fmt.Errorf("Bad Stream name: %s", *stream.DeliveryStreamName)
   126  		}
   127  		for _, rs := range s.RootModule().Resources {
   128  			if rs.Type != "aws_kinesis_firehose_delivery_stream" {
   129  				continue
   130  			}
   131  			if *stream.DeliveryStreamARN != rs.Primary.Attributes["arn"] {
   132  				return fmt.Errorf("Bad Delivery Stream ARN\n\t expected: %s\n\tgot: %s\n", rs.Primary.Attributes["arn"], *stream.DeliveryStreamARN)
   133  			}
   134  		}
   135  		return nil
   136  	}
   137  }
   138  
   139  func testAccCheckKinesisFirehoseDeliveryStreamDestroy(s *terraform.State) error {
   140  	for _, rs := range s.RootModule().Resources {
   141  		if rs.Type != "aws_kinesis_firehose_delivery_stream" {
   142  			continue
   143  		}
   144  		conn := testAccProvider.Meta().(*AWSClient).firehoseconn
   145  		describeOpts := &firehose.DescribeDeliveryStreamInput{
   146  			DeliveryStreamName: aws.String(rs.Primary.Attributes["name"]),
   147  		}
   148  		resp, err := conn.DescribeDeliveryStream(describeOpts)
   149  		if err == nil {
   150  			if resp.DeliveryStreamDescription != nil && *resp.DeliveryStreamDescription.DeliveryStreamStatus != "DELETING" {
   151  				return fmt.Errorf("Error: Delivery Stream still exists")
   152  			}
   153  		}
   154  
   155  		return nil
   156  
   157  	}
   158  
   159  	return nil
   160  }
   161  
   162  var testAccKinesisFirehoseDeliveryStreamConfig_basic = `
   163  resource "aws_iam_role" "firehose" {
   164  	name = "terraform_acctest_firehose_delivery_role"
   165  	assume_role_policy = <<EOF
   166  {
   167    "Version": "2012-10-17",
   168    "Statement": [
   169      {
   170        "Sid": "",
   171        "Effect": "Allow",
   172        "Principal": {
   173          "Service": "firehose.amazonaws.com"
   174        },
   175        "Action": "sts:AssumeRole",
   176        "Condition": {
   177          "StringEquals": {
   178            "sts:ExternalId": "%s"
   179          }
   180        }
   181      }
   182    ]
   183  }
   184  EOF
   185  }
   186  
   187  resource "aws_s3_bucket" "bucket" {
   188  	bucket = "tf-test-bucket-%d"
   189  	acl = "private"
   190  }
   191  
   192  resource "aws_iam_role_policy" "firehose" {
   193  	name = "terraform_acctest_firehose_delivery_policy"
   194  	role = "${aws_iam_role.firehose.id}"
   195  	policy = <<EOF
   196  {
   197    "Version": "2012-10-17",
   198    "Statement": [
   199      {
   200        "Sid": "",
   201        "Effect": "Allow",
   202        "Action": [
   203          "s3:AbortMultipartUpload",
   204          "s3:GetBucketLocation",
   205          "s3:GetObject",
   206          "s3:ListBucket",
   207          "s3:ListBucketMultipartUploads",
   208          "s3:PutObject"
   209        ],
   210        "Resource": [
   211          "arn:aws:s3:::${aws_s3_bucket.bucket.id}",
   212          "arn:aws:s3:::${aws_s3_bucket.bucket.id}/*"
   213        ]
   214      }
   215    ]
   216  }
   217  EOF
   218  }
   219  
   220  resource "aws_kinesis_firehose_delivery_stream" "test_stream" {
   221  	depends_on = ["aws_iam_role_policy.firehose"]
   222  	name = "terraform-kinesis-firehose-basictest-%d"
   223  	destination = "s3"
   224  	role_arn = "${aws_iam_role.firehose.arn}"
   225  	s3_bucket_arn = "${aws_s3_bucket.bucket.arn}"
   226  }`
   227  
   228  var testAccKinesisFirehoseDeliveryStreamConfig_s3 = `
   229  resource "aws_iam_role" "firehose" {
   230  	name = "terraform_acctest_firehose_delivery_role_s3"
   231  	assume_role_policy = <<EOF
   232  {
   233    "Version": "2012-10-17",
   234    "Statement": [
   235      {
   236        "Sid": "",
   237        "Effect": "Allow",
   238        "Principal": {
   239          "Service": "firehose.amazonaws.com"
   240        },
   241        "Action": "sts:AssumeRole",
   242        "Condition": {
   243          "StringEquals": {
   244            "sts:ExternalId": "%s"
   245          }
   246        }
   247      }
   248    ]
   249  }
   250  EOF
   251  }
   252  
   253  resource "aws_s3_bucket" "bucket" {
   254  	bucket = "tf-test-bucket-%d"
   255  	acl = "private"
   256  }
   257  
   258  resource "aws_iam_role_policy" "firehose" {
   259  	name = "terraform_acctest_firehose_delivery_policy_s3"
   260  	role = "${aws_iam_role.firehose.id}"
   261  	policy = <<EOF
   262  {
   263    "Version": "2012-10-17",
   264    "Statement": [
   265      {
   266        "Sid": "",
   267        "Effect": "Allow",
   268        "Action": [
   269          "s3:AbortMultipartUpload",
   270          "s3:GetBucketLocation",
   271          "s3:GetObject",
   272          "s3:ListBucket",
   273          "s3:ListBucketMultipartUploads",
   274          "s3:PutObject"
   275        ],
   276        "Resource": [
   277          "arn:aws:s3:::${aws_s3_bucket.bucket.id}",
   278          "arn:aws:s3:::${aws_s3_bucket.bucket.id}/*"
   279        ]
   280      }
   281    ]
   282  }
   283  EOF
   284  }
   285  
   286  resource "aws_kinesis_firehose_delivery_stream" "test_stream" {
   287  	depends_on = ["aws_iam_role_policy.firehose"]
   288  	name = "terraform-kinesis-firehose-s3test-%d"
   289  	destination = "s3"
   290  	role_arn = "${aws_iam_role.firehose.arn}"
   291  	s3_bucket_arn = "${aws_s3_bucket.bucket.arn}"
   292  }`
   293  
   294  var testAccKinesisFirehoseDeliveryStreamConfig_s3Updates = `
   295  resource "aws_iam_role" "firehose" {
   296  	name = "terraform_acctest_firehose_delivery_role_s3"
   297  	assume_role_policy = <<EOF
   298  {
   299    "Version": "2012-10-17",
   300    "Statement": [
   301      {
   302        "Sid": "",
   303        "Effect": "Allow",
   304        "Principal": {
   305          "Service": "firehose.amazonaws.com"
   306        },
   307        "Action": "sts:AssumeRole",
   308        "Condition": {
   309          "StringEquals": {
   310            "sts:ExternalId": "%s"
   311          }
   312        }
   313      }
   314    ]
   315  }
   316  EOF
   317  }
   318  
   319  resource "aws_s3_bucket" "bucket" {
   320  	bucket = "tf-test-bucket-%d"
   321  	acl = "private"
   322  }
   323  
   324  resource "aws_iam_role_policy" "firehose" {
   325  	name = "terraform_acctest_firehose_delivery_policy_s3"
   326  	role = "${aws_iam_role.firehose.id}"
   327  	policy = <<EOF
   328  {
   329    "Version": "2012-10-17",
   330    "Statement": [
   331      {
   332        "Sid": "",
   333        "Effect": "Allow",
   334        "Action": [
   335          "s3:AbortMultipartUpload",
   336          "s3:GetBucketLocation",
   337          "s3:GetObject",
   338          "s3:ListBucket",
   339          "s3:ListBucketMultipartUploads",
   340          "s3:PutObject"
   341        ],
   342        "Resource": [
   343          "arn:aws:s3:::${aws_s3_bucket.bucket.id}",
   344          "arn:aws:s3:::${aws_s3_bucket.bucket.id}/*"
   345        ]
   346      }
   347    ]
   348  }
   349  EOF
   350  }
   351  
   352  resource "aws_kinesis_firehose_delivery_stream" "test_stream" {
   353  	depends_on = ["aws_iam_role_policy.firehose"]
   354  	name = "terraform-kinesis-firehose-s3test-%d"
   355  	destination = "s3"
   356  	role_arn = "${aws_iam_role.firehose.arn}"
   357  	s3_bucket_arn = "${aws_s3_bucket.bucket.arn}"
   358  	s3_buffer_size = 10
   359  	s3_buffer_interval = 400
   360  	s3_data_compression = "GZIP"
   361  }`