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 }`