github.com/gabrielperezs/terraform@v0.7.0-rc2.0.20160715084931-f7da2612946f/builtin/providers/aws/resource_aws_kinesis_firehose_delivery_stream_test.go (about)

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