github.com/danp/terraform@v0.9.5-0.20170426144147-39d740081351/builtin/providers/aws/resource_aws_kinesis_stream_test.go (about) 1 package aws 2 3 import ( 4 "fmt" 5 "math/rand" 6 "strconv" 7 "strings" 8 "testing" 9 "time" 10 11 "github.com/aws/aws-sdk-go/aws" 12 "github.com/aws/aws-sdk-go/service/kinesis" 13 "github.com/hashicorp/terraform/helper/resource" 14 "github.com/hashicorp/terraform/terraform" 15 ) 16 17 func TestAccAWSKinesisStream_basic(t *testing.T) { 18 var stream kinesis.StreamDescription 19 20 config := fmt.Sprintf(testAccKinesisStreamConfig, rand.New(rand.NewSource(time.Now().UnixNano())).Int()) 21 22 resource.Test(t, resource.TestCase{ 23 PreCheck: func() { testAccPreCheck(t) }, 24 Providers: testAccProviders, 25 CheckDestroy: testAccCheckKinesisStreamDestroy, 26 Steps: []resource.TestStep{ 27 resource.TestStep{ 28 Config: config, 29 Check: resource.ComposeTestCheckFunc( 30 testAccCheckKinesisStreamExists("aws_kinesis_stream.test_stream", &stream), 31 testAccCheckAWSKinesisStreamAttributes(&stream), 32 ), 33 }, 34 }, 35 }) 36 } 37 38 func TestAccAWSKinesisStream_shardCount(t *testing.T) { 39 var stream kinesis.StreamDescription 40 41 ri := rand.New(rand.NewSource(time.Now().UnixNano())).Int() 42 config := fmt.Sprintf(testAccKinesisStreamConfig, ri) 43 updateConfig := fmt.Sprintf(testAccKinesisStreamConfigUpdateShardCount, ri) 44 45 resource.Test(t, resource.TestCase{ 46 PreCheck: func() { testAccPreCheck(t) }, 47 Providers: testAccProviders, 48 CheckDestroy: testAccCheckKinesisStreamDestroy, 49 Steps: []resource.TestStep{ 50 resource.TestStep{ 51 Config: config, 52 Check: resource.ComposeTestCheckFunc( 53 testAccCheckKinesisStreamExists("aws_kinesis_stream.test_stream", &stream), 54 testAccCheckAWSKinesisStreamAttributes(&stream), 55 resource.TestCheckResourceAttr( 56 "aws_kinesis_stream.test_stream", "shard_count", "2"), 57 ), 58 }, 59 60 resource.TestStep{ 61 Config: updateConfig, 62 Check: resource.ComposeTestCheckFunc( 63 testAccCheckKinesisStreamExists("aws_kinesis_stream.test_stream", &stream), 64 testAccCheckAWSKinesisStreamAttributes(&stream), 65 resource.TestCheckResourceAttr( 66 "aws_kinesis_stream.test_stream", "shard_count", "4"), 67 ), 68 }, 69 }, 70 }) 71 } 72 73 func TestAccAWSKinesisStream_retentionPeriod(t *testing.T) { 74 var stream kinesis.StreamDescription 75 76 ri := rand.New(rand.NewSource(time.Now().UnixNano())).Int() 77 config := fmt.Sprintf(testAccKinesisStreamConfig, ri) 78 updateConfig := fmt.Sprintf(testAccKinesisStreamConfigUpdateRetentionPeriod, ri) 79 decreaseConfig := fmt.Sprintf(testAccKinesisStreamConfigDecreaseRetentionPeriod, ri) 80 81 resource.Test(t, resource.TestCase{ 82 PreCheck: func() { testAccPreCheck(t) }, 83 Providers: testAccProviders, 84 CheckDestroy: testAccCheckKinesisStreamDestroy, 85 Steps: []resource.TestStep{ 86 resource.TestStep{ 87 Config: config, 88 Check: resource.ComposeTestCheckFunc( 89 testAccCheckKinesisStreamExists("aws_kinesis_stream.test_stream", &stream), 90 testAccCheckAWSKinesisStreamAttributes(&stream), 91 resource.TestCheckResourceAttr( 92 "aws_kinesis_stream.test_stream", "retention_period", "24"), 93 ), 94 }, 95 96 resource.TestStep{ 97 Config: updateConfig, 98 Check: resource.ComposeTestCheckFunc( 99 testAccCheckKinesisStreamExists("aws_kinesis_stream.test_stream", &stream), 100 testAccCheckAWSKinesisStreamAttributes(&stream), 101 resource.TestCheckResourceAttr( 102 "aws_kinesis_stream.test_stream", "retention_period", "100"), 103 ), 104 }, 105 106 resource.TestStep{ 107 Config: decreaseConfig, 108 Check: resource.ComposeTestCheckFunc( 109 testAccCheckKinesisStreamExists("aws_kinesis_stream.test_stream", &stream), 110 testAccCheckAWSKinesisStreamAttributes(&stream), 111 resource.TestCheckResourceAttr( 112 "aws_kinesis_stream.test_stream", "retention_period", "28"), 113 ), 114 }, 115 }, 116 }) 117 } 118 119 func TestAccAWSKinesisStream_shardLevelMetrics(t *testing.T) { 120 var stream kinesis.StreamDescription 121 122 ri := rand.New(rand.NewSource(time.Now().UnixNano())).Int() 123 config := fmt.Sprintf(testAccKinesisStreamConfig, ri) 124 allConfig := fmt.Sprintf(testAccKinesisStreamConfigAllShardLevelMetrics, ri) 125 singleConfig := fmt.Sprintf(testAccKinesisStreamConfigSingleShardLevelMetric, ri) 126 127 resource.Test(t, resource.TestCase{ 128 PreCheck: func() { testAccPreCheck(t) }, 129 Providers: testAccProviders, 130 CheckDestroy: testAccCheckKinesisStreamDestroy, 131 Steps: []resource.TestStep{ 132 resource.TestStep{ 133 Config: config, 134 Check: resource.ComposeTestCheckFunc( 135 testAccCheckKinesisStreamExists("aws_kinesis_stream.test_stream", &stream), 136 testAccCheckAWSKinesisStreamAttributes(&stream), 137 resource.TestCheckNoResourceAttr( 138 "aws_kinesis_stream.test_stream", "shard_level_metrics"), 139 ), 140 }, 141 142 resource.TestStep{ 143 Config: allConfig, 144 Check: resource.ComposeTestCheckFunc( 145 testAccCheckKinesisStreamExists("aws_kinesis_stream.test_stream", &stream), 146 testAccCheckAWSKinesisStreamAttributes(&stream), 147 resource.TestCheckResourceAttr( 148 "aws_kinesis_stream.test_stream", "shard_level_metrics.#", "7"), 149 ), 150 }, 151 152 resource.TestStep{ 153 Config: singleConfig, 154 Check: resource.ComposeTestCheckFunc( 155 testAccCheckKinesisStreamExists("aws_kinesis_stream.test_stream", &stream), 156 testAccCheckAWSKinesisStreamAttributes(&stream), 157 resource.TestCheckResourceAttr( 158 "aws_kinesis_stream.test_stream", "shard_level_metrics.#", "1"), 159 ), 160 }, 161 }, 162 }) 163 } 164 165 func testAccCheckKinesisStreamExists(n string, stream *kinesis.StreamDescription) resource.TestCheckFunc { 166 return func(s *terraform.State) error { 167 rs, ok := s.RootModule().Resources[n] 168 if !ok { 169 return fmt.Errorf("Not found: %s", n) 170 } 171 172 if rs.Primary.ID == "" { 173 return fmt.Errorf("No Kinesis ID is set") 174 } 175 176 conn := testAccProvider.Meta().(*AWSClient).kinesisconn 177 describeOpts := &kinesis.DescribeStreamInput{ 178 StreamName: aws.String(rs.Primary.Attributes["name"]), 179 } 180 resp, err := conn.DescribeStream(describeOpts) 181 if err != nil { 182 return err 183 } 184 185 *stream = *resp.StreamDescription 186 187 return nil 188 } 189 } 190 191 func testAccCheckAWSKinesisStreamAttributes(stream *kinesis.StreamDescription) resource.TestCheckFunc { 192 return func(s *terraform.State) error { 193 if !strings.HasPrefix(*stream.StreamName, "terraform-kinesis-test") { 194 return fmt.Errorf("Bad Stream name: %s", *stream.StreamName) 195 } 196 for _, rs := range s.RootModule().Resources { 197 if rs.Type != "aws_kinesis_stream" { 198 continue 199 } 200 if *stream.StreamARN != rs.Primary.Attributes["arn"] { 201 return fmt.Errorf("Bad Stream ARN\n\t expected: %s\n\tgot: %s\n", rs.Primary.Attributes["arn"], *stream.StreamARN) 202 } 203 shard_count := strconv.Itoa(len(stream.Shards)) 204 if shard_count != rs.Primary.Attributes["shard_count"] { 205 return fmt.Errorf("Bad Stream Shard Count\n\t expected: %s\n\tgot: %s\n", rs.Primary.Attributes["shard_count"], shard_count) 206 } 207 } 208 return nil 209 } 210 } 211 212 func testAccCheckKinesisStreamDestroy(s *terraform.State) error { 213 for _, rs := range s.RootModule().Resources { 214 if rs.Type != "aws_kinesis_stream" { 215 continue 216 } 217 conn := testAccProvider.Meta().(*AWSClient).kinesisconn 218 describeOpts := &kinesis.DescribeStreamInput{ 219 StreamName: aws.String(rs.Primary.Attributes["name"]), 220 } 221 resp, err := conn.DescribeStream(describeOpts) 222 if err == nil { 223 if resp.StreamDescription != nil && *resp.StreamDescription.StreamStatus != "DELETING" { 224 return fmt.Errorf("Error: Stream still exists") 225 } 226 } 227 228 return nil 229 230 } 231 232 return nil 233 } 234 235 var testAccKinesisStreamConfig = ` 236 resource "aws_kinesis_stream" "test_stream" { 237 name = "terraform-kinesis-test-%d" 238 shard_count = 2 239 tags { 240 Name = "tf-test" 241 } 242 } 243 ` 244 245 var testAccKinesisStreamConfigUpdateShardCount = ` 246 resource "aws_kinesis_stream" "test_stream" { 247 name = "terraform-kinesis-test-%d" 248 shard_count = 4 249 tags { 250 Name = "tf-test" 251 } 252 } 253 ` 254 255 var testAccKinesisStreamConfigUpdateRetentionPeriod = ` 256 resource "aws_kinesis_stream" "test_stream" { 257 name = "terraform-kinesis-test-%d" 258 shard_count = 2 259 retention_period = 100 260 tags { 261 Name = "tf-test" 262 } 263 } 264 ` 265 266 var testAccKinesisStreamConfigDecreaseRetentionPeriod = ` 267 resource "aws_kinesis_stream" "test_stream" { 268 name = "terraform-kinesis-test-%d" 269 shard_count = 2 270 retention_period = 28 271 tags { 272 Name = "tf-test" 273 } 274 } 275 ` 276 277 var testAccKinesisStreamConfigAllShardLevelMetrics = ` 278 resource "aws_kinesis_stream" "test_stream" { 279 name = "terraform-kinesis-test-%d" 280 shard_count = 2 281 tags { 282 Name = "tf-test" 283 } 284 shard_level_metrics = [ 285 "IncomingBytes", 286 "IncomingRecords", 287 "OutgoingBytes", 288 "OutgoingRecords", 289 "WriteProvisionedThroughputExceeded", 290 "ReadProvisionedThroughputExceeded", 291 "IteratorAgeMilliseconds" 292 ] 293 } 294 ` 295 296 var testAccKinesisStreamConfigSingleShardLevelMetric = ` 297 resource "aws_kinesis_stream" "test_stream" { 298 name = "terraform-kinesis-test-%d" 299 shard_count = 2 300 tags { 301 Name = "tf-test" 302 } 303 shard_level_metrics = [ 304 "IncomingBytes" 305 ] 306 } 307 `