github.com/gabrielperezs/terraform@v0.7.0-rc2.0.20160715084931-f7da2612946f/builtin/providers/aws/structure_test.go (about) 1 package aws 2 3 import ( 4 "reflect" 5 "strings" 6 "testing" 7 8 "github.com/aws/aws-sdk-go/aws" 9 "github.com/aws/aws-sdk-go/service/apigateway" 10 "github.com/aws/aws-sdk-go/service/autoscaling" 11 "github.com/aws/aws-sdk-go/service/ec2" 12 "github.com/aws/aws-sdk-go/service/elasticache" 13 "github.com/aws/aws-sdk-go/service/elb" 14 "github.com/aws/aws-sdk-go/service/rds" 15 "github.com/aws/aws-sdk-go/service/redshift" 16 "github.com/aws/aws-sdk-go/service/route53" 17 "github.com/hashicorp/terraform/flatmap" 18 "github.com/hashicorp/terraform/helper/schema" 19 ) 20 21 // Returns test configuration 22 func testConf() map[string]string { 23 return map[string]string{ 24 "listener.#": "1", 25 "listener.0.lb_port": "80", 26 "listener.0.lb_protocol": "http", 27 "listener.0.instance_port": "8000", 28 "listener.0.instance_protocol": "http", 29 "availability_zones.#": "2", 30 "availability_zones.0": "us-east-1a", 31 "availability_zones.1": "us-east-1b", 32 "ingress.#": "1", 33 "ingress.0.protocol": "icmp", 34 "ingress.0.from_port": "1", 35 "ingress.0.to_port": "-1", 36 "ingress.0.cidr_blocks.#": "1", 37 "ingress.0.cidr_blocks.0": "0.0.0.0/0", 38 "ingress.0.security_groups.#": "2", 39 "ingress.0.security_groups.0": "sg-11111", 40 "ingress.0.security_groups.1": "foo/sg-22222", 41 } 42 } 43 44 func TestExpandIPPerms(t *testing.T) { 45 hash := schema.HashString 46 47 expanded := []interface{}{ 48 map[string]interface{}{ 49 "protocol": "icmp", 50 "from_port": 1, 51 "to_port": -1, 52 "cidr_blocks": []interface{}{"0.0.0.0/0"}, 53 "security_groups": schema.NewSet(hash, []interface{}{ 54 "sg-11111", 55 "foo/sg-22222", 56 }), 57 }, 58 map[string]interface{}{ 59 "protocol": "icmp", 60 "from_port": 1, 61 "to_port": -1, 62 "self": true, 63 }, 64 } 65 group := &ec2.SecurityGroup{ 66 GroupId: aws.String("foo"), 67 VpcId: aws.String("bar"), 68 } 69 perms, err := expandIPPerms(group, expanded) 70 if err != nil { 71 t.Fatalf("error expanding perms: %v", err) 72 } 73 74 expected := []ec2.IpPermission{ 75 ec2.IpPermission{ 76 IpProtocol: aws.String("icmp"), 77 FromPort: aws.Int64(int64(1)), 78 ToPort: aws.Int64(int64(-1)), 79 IpRanges: []*ec2.IpRange{&ec2.IpRange{CidrIp: aws.String("0.0.0.0/0")}}, 80 UserIdGroupPairs: []*ec2.UserIdGroupPair{ 81 &ec2.UserIdGroupPair{ 82 UserId: aws.String("foo"), 83 GroupId: aws.String("sg-22222"), 84 }, 85 &ec2.UserIdGroupPair{ 86 GroupId: aws.String("sg-11111"), 87 }, 88 }, 89 }, 90 ec2.IpPermission{ 91 IpProtocol: aws.String("icmp"), 92 FromPort: aws.Int64(int64(1)), 93 ToPort: aws.Int64(int64(-1)), 94 UserIdGroupPairs: []*ec2.UserIdGroupPair{ 95 &ec2.UserIdGroupPair{ 96 GroupId: aws.String("foo"), 97 }, 98 }, 99 }, 100 } 101 102 exp := expected[0] 103 perm := perms[0] 104 105 if *exp.FromPort != *perm.FromPort { 106 t.Fatalf( 107 "Got:\n\n%#v\n\nExpected:\n\n%#v\n", 108 *perm.FromPort, 109 *exp.FromPort) 110 } 111 112 if *exp.IpRanges[0].CidrIp != *perm.IpRanges[0].CidrIp { 113 t.Fatalf( 114 "Got:\n\n%#v\n\nExpected:\n\n%#v\n", 115 *perm.IpRanges[0].CidrIp, 116 *exp.IpRanges[0].CidrIp) 117 } 118 119 if *exp.UserIdGroupPairs[0].UserId != *perm.UserIdGroupPairs[0].UserId { 120 t.Fatalf( 121 "Got:\n\n%#v\n\nExpected:\n\n%#v\n", 122 *perm.UserIdGroupPairs[0].UserId, 123 *exp.UserIdGroupPairs[0].UserId) 124 } 125 126 if *exp.UserIdGroupPairs[0].GroupId != *perm.UserIdGroupPairs[0].GroupId { 127 t.Fatalf( 128 "Got:\n\n%#v\n\nExpected:\n\n%#v\n", 129 *perm.UserIdGroupPairs[0].GroupId, 130 *exp.UserIdGroupPairs[0].GroupId) 131 } 132 133 if *exp.UserIdGroupPairs[1].GroupId != *perm.UserIdGroupPairs[1].GroupId { 134 t.Fatalf( 135 "Got:\n\n%#v\n\nExpected:\n\n%#v\n", 136 *perm.UserIdGroupPairs[1].GroupId, 137 *exp.UserIdGroupPairs[1].GroupId) 138 } 139 140 exp = expected[1] 141 perm = perms[1] 142 143 if *exp.UserIdGroupPairs[0].GroupId != *perm.UserIdGroupPairs[0].GroupId { 144 t.Fatalf( 145 "Got:\n\n%#v\n\nExpected:\n\n%#v\n", 146 *perm.UserIdGroupPairs[0].GroupId, 147 *exp.UserIdGroupPairs[0].GroupId) 148 } 149 } 150 151 func TestExpandIPPerms_NegOneProtocol(t *testing.T) { 152 hash := schema.HashString 153 154 expanded := []interface{}{ 155 map[string]interface{}{ 156 "protocol": "-1", 157 "from_port": 0, 158 "to_port": 0, 159 "cidr_blocks": []interface{}{"0.0.0.0/0"}, 160 "security_groups": schema.NewSet(hash, []interface{}{ 161 "sg-11111", 162 "foo/sg-22222", 163 }), 164 }, 165 } 166 group := &ec2.SecurityGroup{ 167 GroupId: aws.String("foo"), 168 VpcId: aws.String("bar"), 169 } 170 171 perms, err := expandIPPerms(group, expanded) 172 if err != nil { 173 t.Fatalf("error expanding perms: %v", err) 174 } 175 176 expected := []ec2.IpPermission{ 177 ec2.IpPermission{ 178 IpProtocol: aws.String("-1"), 179 FromPort: aws.Int64(int64(0)), 180 ToPort: aws.Int64(int64(0)), 181 IpRanges: []*ec2.IpRange{&ec2.IpRange{CidrIp: aws.String("0.0.0.0/0")}}, 182 UserIdGroupPairs: []*ec2.UserIdGroupPair{ 183 &ec2.UserIdGroupPair{ 184 UserId: aws.String("foo"), 185 GroupId: aws.String("sg-22222"), 186 }, 187 &ec2.UserIdGroupPair{ 188 GroupId: aws.String("sg-11111"), 189 }, 190 }, 191 }, 192 } 193 194 exp := expected[0] 195 perm := perms[0] 196 197 if *exp.FromPort != *perm.FromPort { 198 t.Fatalf( 199 "Got:\n\n%#v\n\nExpected:\n\n%#v\n", 200 *perm.FromPort, 201 *exp.FromPort) 202 } 203 204 if *exp.IpRanges[0].CidrIp != *perm.IpRanges[0].CidrIp { 205 t.Fatalf( 206 "Got:\n\n%#v\n\nExpected:\n\n%#v\n", 207 *perm.IpRanges[0].CidrIp, 208 *exp.IpRanges[0].CidrIp) 209 } 210 211 if *exp.UserIdGroupPairs[0].UserId != *perm.UserIdGroupPairs[0].UserId { 212 t.Fatalf( 213 "Got:\n\n%#v\n\nExpected:\n\n%#v\n", 214 *perm.UserIdGroupPairs[0].UserId, 215 *exp.UserIdGroupPairs[0].UserId) 216 } 217 218 // Now test the error case. This *should* error when either from_port 219 // or to_port is not zero, but protocol is "-1". 220 errorCase := []interface{}{ 221 map[string]interface{}{ 222 "protocol": "-1", 223 "from_port": 0, 224 "to_port": 65535, 225 "cidr_blocks": []interface{}{"0.0.0.0/0"}, 226 "security_groups": schema.NewSet(hash, []interface{}{ 227 "sg-11111", 228 "foo/sg-22222", 229 }), 230 }, 231 } 232 securityGroups := &ec2.SecurityGroup{ 233 GroupId: aws.String("foo"), 234 VpcId: aws.String("bar"), 235 } 236 237 _, expandErr := expandIPPerms(securityGroups, errorCase) 238 if expandErr == nil { 239 t.Fatal("expandIPPerms should have errored!") 240 } 241 } 242 243 func TestExpandIPPerms_nonVPC(t *testing.T) { 244 hash := schema.HashString 245 246 expanded := []interface{}{ 247 map[string]interface{}{ 248 "protocol": "icmp", 249 "from_port": 1, 250 "to_port": -1, 251 "cidr_blocks": []interface{}{"0.0.0.0/0"}, 252 "security_groups": schema.NewSet(hash, []interface{}{ 253 "sg-11111", 254 "foo/sg-22222", 255 }), 256 }, 257 map[string]interface{}{ 258 "protocol": "icmp", 259 "from_port": 1, 260 "to_port": -1, 261 "self": true, 262 }, 263 } 264 group := &ec2.SecurityGroup{ 265 GroupName: aws.String("foo"), 266 } 267 perms, err := expandIPPerms(group, expanded) 268 if err != nil { 269 t.Fatalf("error expanding perms: %v", err) 270 } 271 272 expected := []ec2.IpPermission{ 273 ec2.IpPermission{ 274 IpProtocol: aws.String("icmp"), 275 FromPort: aws.Int64(int64(1)), 276 ToPort: aws.Int64(int64(-1)), 277 IpRanges: []*ec2.IpRange{&ec2.IpRange{CidrIp: aws.String("0.0.0.0/0")}}, 278 UserIdGroupPairs: []*ec2.UserIdGroupPair{ 279 &ec2.UserIdGroupPair{ 280 GroupName: aws.String("sg-22222"), 281 }, 282 &ec2.UserIdGroupPair{ 283 GroupName: aws.String("sg-11111"), 284 }, 285 }, 286 }, 287 ec2.IpPermission{ 288 IpProtocol: aws.String("icmp"), 289 FromPort: aws.Int64(int64(1)), 290 ToPort: aws.Int64(int64(-1)), 291 UserIdGroupPairs: []*ec2.UserIdGroupPair{ 292 &ec2.UserIdGroupPair{ 293 GroupName: aws.String("foo"), 294 }, 295 }, 296 }, 297 } 298 299 exp := expected[0] 300 perm := perms[0] 301 302 if *exp.FromPort != *perm.FromPort { 303 t.Fatalf( 304 "Got:\n\n%#v\n\nExpected:\n\n%#v\n", 305 *perm.FromPort, 306 *exp.FromPort) 307 } 308 309 if *exp.IpRanges[0].CidrIp != *perm.IpRanges[0].CidrIp { 310 t.Fatalf( 311 "Got:\n\n%#v\n\nExpected:\n\n%#v\n", 312 *perm.IpRanges[0].CidrIp, 313 *exp.IpRanges[0].CidrIp) 314 } 315 316 if *exp.UserIdGroupPairs[0].GroupName != *perm.UserIdGroupPairs[0].GroupName { 317 t.Fatalf( 318 "Got:\n\n%#v\n\nExpected:\n\n%#v\n", 319 *perm.UserIdGroupPairs[0].GroupName, 320 *exp.UserIdGroupPairs[0].GroupName) 321 } 322 323 if *exp.UserIdGroupPairs[1].GroupName != *perm.UserIdGroupPairs[1].GroupName { 324 t.Fatalf( 325 "Got:\n\n%#v\n\nExpected:\n\n%#v\n", 326 *perm.UserIdGroupPairs[1].GroupName, 327 *exp.UserIdGroupPairs[1].GroupName) 328 } 329 330 exp = expected[1] 331 perm = perms[1] 332 333 if *exp.UserIdGroupPairs[0].GroupName != *perm.UserIdGroupPairs[0].GroupName { 334 t.Fatalf( 335 "Got:\n\n%#v\n\nExpected:\n\n%#v\n", 336 *perm.UserIdGroupPairs[0].GroupName, 337 *exp.UserIdGroupPairs[0].GroupName) 338 } 339 } 340 341 func TestExpandListeners(t *testing.T) { 342 expanded := []interface{}{ 343 map[string]interface{}{ 344 "instance_port": 8000, 345 "lb_port": 80, 346 "instance_protocol": "http", 347 "lb_protocol": "http", 348 }, 349 map[string]interface{}{ 350 "instance_port": 8000, 351 "lb_port": 80, 352 "instance_protocol": "https", 353 "lb_protocol": "https", 354 "ssl_certificate_id": "something", 355 }, 356 } 357 listeners, err := expandListeners(expanded) 358 if err != nil { 359 t.Fatalf("bad: %#v", err) 360 } 361 362 expected := &elb.Listener{ 363 InstancePort: aws.Int64(int64(8000)), 364 LoadBalancerPort: aws.Int64(int64(80)), 365 InstanceProtocol: aws.String("http"), 366 Protocol: aws.String("http"), 367 } 368 369 if !reflect.DeepEqual(listeners[0], expected) { 370 t.Fatalf( 371 "Got:\n\n%#v\n\nExpected:\n\n%#v\n", 372 listeners[0], 373 expected) 374 } 375 } 376 377 // this test should produce an error from expandlisteners on an invalid 378 // combination 379 func TestExpandListeners_invalid(t *testing.T) { 380 expanded := []interface{}{ 381 map[string]interface{}{ 382 "instance_port": 8000, 383 "lb_port": 80, 384 "instance_protocol": "http", 385 "lb_protocol": "http", 386 "ssl_certificate_id": "something", 387 }, 388 } 389 _, err := expandListeners(expanded) 390 if err != nil { 391 // Check the error we got 392 if !strings.Contains(err.Error(), "ssl_certificate_id may be set only when protocol") { 393 t.Fatalf("Got error in TestExpandListeners_invalid, but not what we expected: %s", err) 394 } 395 } 396 397 if err == nil { 398 t.Fatalf("Expected TestExpandListeners_invalid to fail, but passed") 399 } 400 } 401 402 func TestFlattenHealthCheck(t *testing.T) { 403 cases := []struct { 404 Input *elb.HealthCheck 405 Output []map[string]interface{} 406 }{ 407 { 408 Input: &elb.HealthCheck{ 409 UnhealthyThreshold: aws.Int64(int64(10)), 410 HealthyThreshold: aws.Int64(int64(10)), 411 Target: aws.String("HTTP:80/"), 412 Timeout: aws.Int64(int64(30)), 413 Interval: aws.Int64(int64(30)), 414 }, 415 Output: []map[string]interface{}{ 416 map[string]interface{}{ 417 "unhealthy_threshold": int64(10), 418 "healthy_threshold": int64(10), 419 "target": "HTTP:80/", 420 "timeout": int64(30), 421 "interval": int64(30), 422 }, 423 }, 424 }, 425 } 426 427 for _, tc := range cases { 428 output := flattenHealthCheck(tc.Input) 429 if !reflect.DeepEqual(output, tc.Output) { 430 t.Fatalf("Got:\n\n%#v\n\nExpected:\n\n%#v", output, tc.Output) 431 } 432 } 433 } 434 435 func TestExpandStringList(t *testing.T) { 436 expanded := flatmap.Expand(testConf(), "availability_zones").([]interface{}) 437 stringList := expandStringList(expanded) 438 expected := []*string{ 439 aws.String("us-east-1a"), 440 aws.String("us-east-1b"), 441 } 442 443 if !reflect.DeepEqual(stringList, expected) { 444 t.Fatalf( 445 "Got:\n\n%#v\n\nExpected:\n\n%#v\n", 446 stringList, 447 expected) 448 } 449 450 } 451 452 func TestExpandParameters(t *testing.T) { 453 expanded := []interface{}{ 454 map[string]interface{}{ 455 "name": "character_set_client", 456 "value": "utf8", 457 "apply_method": "immediate", 458 }, 459 } 460 parameters, err := expandParameters(expanded) 461 if err != nil { 462 t.Fatalf("bad: %#v", err) 463 } 464 465 expected := &rds.Parameter{ 466 ParameterName: aws.String("character_set_client"), 467 ParameterValue: aws.String("utf8"), 468 ApplyMethod: aws.String("immediate"), 469 } 470 471 if !reflect.DeepEqual(parameters[0], expected) { 472 t.Fatalf( 473 "Got:\n\n%#v\n\nExpected:\n\n%#v\n", 474 parameters[0], 475 expected) 476 } 477 } 478 479 func TestexpandRedshiftParameters(t *testing.T) { 480 expanded := []interface{}{ 481 map[string]interface{}{ 482 "name": "character_set_client", 483 "value": "utf8", 484 }, 485 } 486 parameters, err := expandRedshiftParameters(expanded) 487 if err != nil { 488 t.Fatalf("bad: %#v", err) 489 } 490 491 expected := &redshift.Parameter{ 492 ParameterName: aws.String("character_set_client"), 493 ParameterValue: aws.String("utf8"), 494 } 495 496 if !reflect.DeepEqual(parameters[0], expected) { 497 t.Fatalf( 498 "Got:\n\n%#v\n\nExpected:\n\n%#v\n", 499 parameters[0], 500 expected) 501 } 502 } 503 504 func TestexpandElasticacheParameters(t *testing.T) { 505 expanded := []interface{}{ 506 map[string]interface{}{ 507 "name": "activerehashing", 508 "value": "yes", 509 "apply_method": "immediate", 510 }, 511 } 512 parameters, err := expandElastiCacheParameters(expanded) 513 if err != nil { 514 t.Fatalf("bad: %#v", err) 515 } 516 517 expected := &elasticache.ParameterNameValue{ 518 ParameterName: aws.String("activerehashing"), 519 ParameterValue: aws.String("yes"), 520 } 521 522 if !reflect.DeepEqual(parameters[0], expected) { 523 t.Fatalf( 524 "Got:\n\n%#v\n\nExpected:\n\n%#v\n", 525 parameters[0], 526 expected) 527 } 528 } 529 530 func TestExpandStepAdjustments(t *testing.T) { 531 expanded := []interface{}{ 532 map[string]interface{}{ 533 "metric_interval_lower_bound": "1.0", 534 "metric_interval_upper_bound": "2.0", 535 "scaling_adjustment": 1, 536 }, 537 } 538 parameters, err := expandStepAdjustments(expanded) 539 if err != nil { 540 t.Fatalf("bad: %#v", err) 541 } 542 543 expected := &autoscaling.StepAdjustment{ 544 MetricIntervalLowerBound: aws.Float64(1.0), 545 MetricIntervalUpperBound: aws.Float64(2.0), 546 ScalingAdjustment: aws.Int64(int64(1)), 547 } 548 549 if !reflect.DeepEqual(parameters[0], expected) { 550 t.Fatalf( 551 "Got:\n\n%#v\n\nExpected:\n\n%#v\n", 552 parameters[0], 553 expected) 554 } 555 } 556 557 func TestFlattenParameters(t *testing.T) { 558 cases := []struct { 559 Input []*rds.Parameter 560 Output []map[string]interface{} 561 }{ 562 { 563 Input: []*rds.Parameter{ 564 &rds.Parameter{ 565 ParameterName: aws.String("character_set_client"), 566 ParameterValue: aws.String("utf8"), 567 }, 568 }, 569 Output: []map[string]interface{}{ 570 map[string]interface{}{ 571 "name": "character_set_client", 572 "value": "utf8", 573 }, 574 }, 575 }, 576 } 577 578 for _, tc := range cases { 579 output := flattenParameters(tc.Input) 580 if !reflect.DeepEqual(output, tc.Output) { 581 t.Fatalf("Got:\n\n%#v\n\nExpected:\n\n%#v", output, tc.Output) 582 } 583 } 584 } 585 586 func TestflattenRedshiftParameters(t *testing.T) { 587 cases := []struct { 588 Input []*redshift.Parameter 589 Output []map[string]interface{} 590 }{ 591 { 592 Input: []*redshift.Parameter{ 593 &redshift.Parameter{ 594 ParameterName: aws.String("character_set_client"), 595 ParameterValue: aws.String("utf8"), 596 }, 597 }, 598 Output: []map[string]interface{}{ 599 map[string]interface{}{ 600 "name": "character_set_client", 601 "value": "utf8", 602 }, 603 }, 604 }, 605 } 606 607 for _, tc := range cases { 608 output := flattenRedshiftParameters(tc.Input) 609 if !reflect.DeepEqual(output, tc.Output) { 610 t.Fatalf("Got:\n\n%#v\n\nExpected:\n\n%#v", output, tc.Output) 611 } 612 } 613 } 614 615 func TestflattenElasticacheParameters(t *testing.T) { 616 cases := []struct { 617 Input []*elasticache.Parameter 618 Output []map[string]interface{} 619 }{ 620 { 621 Input: []*elasticache.Parameter{ 622 &elasticache.Parameter{ 623 ParameterName: aws.String("activerehashing"), 624 ParameterValue: aws.String("yes"), 625 }, 626 }, 627 Output: []map[string]interface{}{ 628 map[string]interface{}{ 629 "name": "activerehashing", 630 "value": "yes", 631 }, 632 }, 633 }, 634 } 635 636 for _, tc := range cases { 637 output := flattenElastiCacheParameters(tc.Input) 638 if !reflect.DeepEqual(output, tc.Output) { 639 t.Fatalf("Got:\n\n%#v\n\nExpected:\n\n%#v", output, tc.Output) 640 } 641 } 642 } 643 644 func TestExpandInstanceString(t *testing.T) { 645 646 expected := []*elb.Instance{ 647 &elb.Instance{InstanceId: aws.String("test-one")}, 648 &elb.Instance{InstanceId: aws.String("test-two")}, 649 } 650 651 ids := []interface{}{ 652 "test-one", 653 "test-two", 654 } 655 656 expanded := expandInstanceString(ids) 657 658 if !reflect.DeepEqual(expanded, expected) { 659 t.Fatalf("Expand Instance String output did not match.\nGot:\n%#v\n\nexpected:\n%#v", expanded, expected) 660 } 661 } 662 663 func TestFlattenNetworkInterfacesPrivateIPAddresses(t *testing.T) { 664 expanded := []*ec2.NetworkInterfacePrivateIpAddress{ 665 &ec2.NetworkInterfacePrivateIpAddress{PrivateIpAddress: aws.String("192.168.0.1")}, 666 &ec2.NetworkInterfacePrivateIpAddress{PrivateIpAddress: aws.String("192.168.0.2")}, 667 } 668 669 result := flattenNetworkInterfacesPrivateIPAddresses(expanded) 670 671 if result == nil { 672 t.Fatal("result was nil") 673 } 674 675 if len(result) != 2 { 676 t.Fatalf("expected result had %d elements, but got %d", 2, len(result)) 677 } 678 679 if result[0] != "192.168.0.1" { 680 t.Fatalf("expected ip to be 192.168.0.1, but was %s", result[0]) 681 } 682 683 if result[1] != "192.168.0.2" { 684 t.Fatalf("expected ip to be 192.168.0.2, but was %s", result[1]) 685 } 686 } 687 688 func TestFlattenGroupIdentifiers(t *testing.T) { 689 expanded := []*ec2.GroupIdentifier{ 690 &ec2.GroupIdentifier{GroupId: aws.String("sg-001")}, 691 &ec2.GroupIdentifier{GroupId: aws.String("sg-002")}, 692 } 693 694 result := flattenGroupIdentifiers(expanded) 695 696 if len(result) != 2 { 697 t.Fatalf("expected result had %d elements, but got %d", 2, len(result)) 698 } 699 700 if result[0] != "sg-001" { 701 t.Fatalf("expected id to be sg-001, but was %s", result[0]) 702 } 703 704 if result[1] != "sg-002" { 705 t.Fatalf("expected id to be sg-002, but was %s", result[1]) 706 } 707 } 708 709 func TestExpandPrivateIPAddresses(t *testing.T) { 710 711 ip1 := "192.168.0.1" 712 ip2 := "192.168.0.2" 713 flattened := []interface{}{ 714 ip1, 715 ip2, 716 } 717 718 result := expandPrivateIPAddresses(flattened) 719 720 if len(result) != 2 { 721 t.Fatalf("expected result had %d elements, but got %d", 2, len(result)) 722 } 723 724 if *result[0].PrivateIpAddress != "192.168.0.1" || !*result[0].Primary { 725 t.Fatalf("expected ip to be 192.168.0.1 and Primary, but got %v, %t", *result[0].PrivateIpAddress, *result[0].Primary) 726 } 727 728 if *result[1].PrivateIpAddress != "192.168.0.2" || *result[1].Primary { 729 t.Fatalf("expected ip to be 192.168.0.2 and not Primary, but got %v, %t", *result[1].PrivateIpAddress, *result[1].Primary) 730 } 731 } 732 733 func TestFlattenAttachment(t *testing.T) { 734 expanded := &ec2.NetworkInterfaceAttachment{ 735 InstanceId: aws.String("i-00001"), 736 DeviceIndex: aws.Int64(int64(1)), 737 AttachmentId: aws.String("at-002"), 738 } 739 740 result := flattenAttachment(expanded) 741 742 if result == nil { 743 t.Fatal("expected result to have value, but got nil") 744 } 745 746 if result["instance"] != "i-00001" { 747 t.Fatalf("expected instance to be i-00001, but got %s", result["instance"]) 748 } 749 750 if result["device_index"] != int64(1) { 751 t.Fatalf("expected device_index to be 1, but got %d", result["device_index"]) 752 } 753 754 if result["attachment_id"] != "at-002" { 755 t.Fatalf("expected attachment_id to be at-002, but got %s", result["attachment_id"]) 756 } 757 } 758 759 func TestFlattenAttachmentWhenNoInstanceId(t *testing.T) { 760 expanded := &ec2.NetworkInterfaceAttachment{ 761 DeviceIndex: aws.Int64(int64(1)), 762 AttachmentId: aws.String("at-002"), 763 } 764 765 result := flattenAttachment(expanded) 766 767 if result == nil { 768 t.Fatal("expected result to have value, but got nil") 769 } 770 771 if result["instance"] != nil { 772 t.Fatalf("expected instance to be nil, but got %s", result["instance"]) 773 } 774 } 775 776 func TestflattenStepAdjustments(t *testing.T) { 777 expanded := []*autoscaling.StepAdjustment{ 778 &autoscaling.StepAdjustment{ 779 MetricIntervalLowerBound: aws.Float64(1.0), 780 MetricIntervalUpperBound: aws.Float64(2.0), 781 ScalingAdjustment: aws.Int64(int64(1)), 782 }, 783 } 784 785 result := flattenStepAdjustments(expanded)[0] 786 if result == nil { 787 t.Fatal("expected result to have value, but got nil") 788 } 789 if result["metric_interval_lower_bound"] != float64(1.0) { 790 t.Fatalf("expected metric_interval_lower_bound to be 1.0, but got %d", result["metric_interval_lower_bound"]) 791 } 792 if result["metric_interval_upper_bound"] != float64(2.0) { 793 t.Fatalf("expected metric_interval_upper_bound to be 1.0, but got %d", result["metric_interval_upper_bound"]) 794 } 795 if result["scaling_adjustment"] != int64(1) { 796 t.Fatalf("expected scaling_adjustment to be 1, but got %d", result["scaling_adjustment"]) 797 } 798 } 799 800 func TestFlattenResourceRecords(t *testing.T) { 801 expanded := []*route53.ResourceRecord{ 802 &route53.ResourceRecord{ 803 Value: aws.String("127.0.0.1"), 804 }, 805 &route53.ResourceRecord{ 806 Value: aws.String("127.0.0.3"), 807 }, 808 } 809 810 result := flattenResourceRecords(expanded) 811 812 if result == nil { 813 t.Fatal("expected result to have value, but got nil") 814 } 815 816 if len(result) != 2 { 817 t.Fatal("expected result to have value, but got nil") 818 } 819 } 820 821 func TestFlattenAsgEnabledMetrics(t *testing.T) { 822 expanded := []*autoscaling.EnabledMetric{ 823 &autoscaling.EnabledMetric{Granularity: aws.String("1Minute"), Metric: aws.String("GroupTotalInstances")}, 824 &autoscaling.EnabledMetric{Granularity: aws.String("1Minute"), Metric: aws.String("GroupMaxSize")}, 825 } 826 827 result := flattenAsgEnabledMetrics(expanded) 828 829 if len(result) != 2 { 830 t.Fatalf("expected result had %d elements, but got %d", 2, len(result)) 831 } 832 833 if result[0] != "GroupTotalInstances" { 834 t.Fatalf("expected id to be GroupTotalInstances, but was %s", result[0]) 835 } 836 837 if result[1] != "GroupMaxSize" { 838 t.Fatalf("expected id to be GroupMaxSize, but was %s", result[1]) 839 } 840 } 841 842 func TestFlattenSecurityGroups(t *testing.T) { 843 cases := []struct { 844 ownerId *string 845 pairs []*ec2.UserIdGroupPair 846 expected []*ec2.GroupIdentifier 847 }{ 848 // simple, no user id included (we ignore it mostly) 849 { 850 ownerId: aws.String("user1234"), 851 pairs: []*ec2.UserIdGroupPair{ 852 &ec2.UserIdGroupPair{ 853 GroupId: aws.String("sg-12345"), 854 }, 855 }, 856 expected: []*ec2.GroupIdentifier{ 857 &ec2.GroupIdentifier{ 858 GroupId: aws.String("sg-12345"), 859 }, 860 }, 861 }, 862 // include the owner id, but keep it consitent with the same account. Tests 863 // EC2 classic situation 864 { 865 ownerId: aws.String("user1234"), 866 pairs: []*ec2.UserIdGroupPair{ 867 &ec2.UserIdGroupPair{ 868 GroupId: aws.String("sg-12345"), 869 UserId: aws.String("user1234"), 870 }, 871 }, 872 expected: []*ec2.GroupIdentifier{ 873 &ec2.GroupIdentifier{ 874 GroupId: aws.String("sg-12345"), 875 }, 876 }, 877 }, 878 879 // include the owner id, but from a different account. This is reflects 880 // EC2 Classic when refering to groups by name 881 { 882 ownerId: aws.String("user1234"), 883 pairs: []*ec2.UserIdGroupPair{ 884 &ec2.UserIdGroupPair{ 885 GroupId: aws.String("sg-12345"), 886 GroupName: aws.String("somegroup"), // GroupName is only included in Classic 887 UserId: aws.String("user4321"), 888 }, 889 }, 890 expected: []*ec2.GroupIdentifier{ 891 &ec2.GroupIdentifier{ 892 GroupId: aws.String("sg-12345"), 893 GroupName: aws.String("user4321/somegroup"), 894 }, 895 }, 896 }, 897 898 // include the owner id, but from a different account. This reflects in 899 // EC2 VPC when refering to groups by id 900 { 901 ownerId: aws.String("user1234"), 902 pairs: []*ec2.UserIdGroupPair{ 903 &ec2.UserIdGroupPair{ 904 GroupId: aws.String("sg-12345"), 905 UserId: aws.String("user4321"), 906 }, 907 }, 908 expected: []*ec2.GroupIdentifier{ 909 &ec2.GroupIdentifier{ 910 GroupId: aws.String("user4321/sg-12345"), 911 }, 912 }, 913 }, 914 } 915 916 for _, c := range cases { 917 out := flattenSecurityGroups(c.pairs, c.ownerId) 918 if !reflect.DeepEqual(out, c.expected) { 919 t.Fatalf("Error matching output and expected: %#v vs %#v", out, c.expected) 920 } 921 } 922 } 923 924 func TestFlattenApiGatewayThrottleSettings(t *testing.T) { 925 expectedBurstLimit := int64(140) 926 expectedRateLimit := 120.0 927 928 ts := &apigateway.ThrottleSettings{ 929 BurstLimit: aws.Int64(expectedBurstLimit), 930 RateLimit: aws.Float64(expectedRateLimit), 931 } 932 result := flattenApiGatewayThrottleSettings(ts) 933 934 if len(result) != 1 { 935 t.Fatalf("Expected map to have exactly 1 element, got %d", len(result)) 936 } 937 938 burstLimit, ok := result[0]["burst_limit"] 939 if !ok { 940 t.Fatal("Expected 'burst_limit' key in the map") 941 } 942 burstLimitInt, ok := burstLimit.(int64) 943 if !ok { 944 t.Fatal("Expected 'burst_limit' to be int") 945 } 946 if burstLimitInt != expectedBurstLimit { 947 t.Fatalf("Expected 'burst_limit' to equal %d, got %d", expectedBurstLimit, burstLimitInt) 948 } 949 950 rateLimit, ok := result[0]["rate_limit"] 951 if !ok { 952 t.Fatal("Expected 'rate_limit' key in the map") 953 } 954 rateLimitFloat, ok := rateLimit.(float64) 955 if !ok { 956 t.Fatal("Expected 'rate_limit' to be float64") 957 } 958 if rateLimitFloat != expectedRateLimit { 959 t.Fatalf("Expected 'rate_limit' to equal %f, got %f", expectedRateLimit, rateLimitFloat) 960 } 961 } 962 963 func TestFlattenApiGatewayStageKeys(t *testing.T) { 964 cases := []struct { 965 Input []*string 966 Output []map[string]interface{} 967 }{ 968 { 969 Input: []*string{ 970 aws.String("a1b2c3d4e5/dev"), 971 aws.String("e5d4c3b2a1/test"), 972 }, 973 Output: []map[string]interface{}{ 974 map[string]interface{}{ 975 "stage_name": "dev", 976 "rest_api_id": "a1b2c3d4e5", 977 }, 978 map[string]interface{}{ 979 "stage_name": "test", 980 "rest_api_id": "e5d4c3b2a1", 981 }, 982 }, 983 }, 984 } 985 986 for _, tc := range cases { 987 output := flattenApiGatewayStageKeys(tc.Input) 988 if !reflect.DeepEqual(output, tc.Output) { 989 t.Fatalf("Got:\n\n%#v\n\nExpected:\n\n%#v", output, tc.Output) 990 } 991 } 992 }