github.com/mohanarpit/terraform@v0.6.16-0.20160909104007-291f29853544/builtin/providers/aws/resource_aws_spot_fleet_request_test.go (about) 1 package aws 2 3 import ( 4 "encoding/base64" 5 "fmt" 6 "testing" 7 8 "github.com/aws/aws-sdk-go/aws" 9 "github.com/aws/aws-sdk-go/service/ec2" 10 "github.com/hashicorp/terraform/helper/acctest" 11 "github.com/hashicorp/terraform/helper/resource" 12 "github.com/hashicorp/terraform/terraform" 13 ) 14 15 func TestAccAWSSpotFleetRequest_changePriceForcesNewRequest(t *testing.T) { 16 var before, after ec2.SpotFleetRequestConfig 17 rName := acctest.RandString(10) 18 19 resource.Test(t, resource.TestCase{ 20 PreCheck: func() { testAccPreCheck(t) }, 21 Providers: testAccProviders, 22 CheckDestroy: testAccCheckAWSSpotFleetRequestDestroy, 23 Steps: []resource.TestStep{ 24 resource.TestStep{ 25 Config: testAccAWSSpotFleetRequestConfig(rName), 26 Check: resource.ComposeAggregateTestCheckFunc( 27 testAccCheckAWSSpotFleetRequestExists( 28 "aws_spot_fleet_request.foo", &before), 29 resource.TestCheckResourceAttr( 30 "aws_spot_fleet_request.foo", "spot_request_state", "active"), 31 resource.TestCheckResourceAttr( 32 "aws_spot_fleet_request.foo", "spot_price", "0.005"), 33 resource.TestCheckResourceAttr( 34 "aws_spot_fleet_request.foo", "launch_specification.#", "1"), 35 ), 36 }, 37 resource.TestStep{ 38 Config: testAccAWSSpotFleetRequestConfigChangeSpotBidPrice(rName), 39 Check: resource.ComposeAggregateTestCheckFunc( 40 testAccCheckAWSSpotFleetRequestExists( 41 "aws_spot_fleet_request.foo", &after), 42 resource.TestCheckResourceAttr( 43 "aws_spot_fleet_request.foo", "spot_request_state", "active"), 44 resource.TestCheckResourceAttr( 45 "aws_spot_fleet_request.foo", "launch_specification.#", "1"), 46 resource.TestCheckResourceAttr( 47 "aws_spot_fleet_request.foo", "spot_price", "0.01"), 48 testAccCheckAWSSpotFleetRequestConfigRecreated(t, &before, &after), 49 ), 50 }, 51 }, 52 }) 53 } 54 55 func TestAccAWSSpotFleetRequest_lowestPriceAzOrSubnetInRegion(t *testing.T) { 56 var sfr ec2.SpotFleetRequestConfig 57 rName := acctest.RandString(10) 58 59 resource.Test(t, resource.TestCase{ 60 PreCheck: func() { testAccPreCheck(t) }, 61 Providers: testAccProviders, 62 CheckDestroy: testAccCheckAWSSpotFleetRequestDestroy, 63 Steps: []resource.TestStep{ 64 resource.TestStep{ 65 Config: testAccAWSSpotFleetRequestConfig(rName), 66 Check: resource.ComposeAggregateTestCheckFunc( 67 testAccCheckAWSSpotFleetRequestExists( 68 "aws_spot_fleet_request.foo", &sfr), 69 resource.TestCheckResourceAttr( 70 "aws_spot_fleet_request.foo", "spot_request_state", "active"), 71 resource.TestCheckResourceAttr( 72 "aws_spot_fleet_request.foo", "launch_specification.#", "1"), 73 ), 74 }, 75 }, 76 }) 77 } 78 79 func TestAccAWSSpotFleetRequest_lowestPriceAzInGivenList(t *testing.T) { 80 var sfr ec2.SpotFleetRequestConfig 81 rName := acctest.RandString(10) 82 83 resource.Test(t, resource.TestCase{ 84 PreCheck: func() { testAccPreCheck(t) }, 85 Providers: testAccProviders, 86 CheckDestroy: testAccCheckAWSSpotFleetRequestDestroy, 87 Steps: []resource.TestStep{ 88 resource.TestStep{ 89 Config: testAccAWSSpotFleetRequestConfigWithAzs(rName), 90 Check: resource.ComposeAggregateTestCheckFunc( 91 testAccCheckAWSSpotFleetRequestExists( 92 "aws_spot_fleet_request.foo", &sfr), 93 resource.TestCheckResourceAttr( 94 "aws_spot_fleet_request.foo", "spot_request_state", "active"), 95 resource.TestCheckResourceAttr( 96 "aws_spot_fleet_request.foo", "launch_specification.#", "2"), 97 resource.TestCheckResourceAttr( 98 "aws_spot_fleet_request.foo", "launch_specification.1590006269.availability_zone", "us-west-2a"), 99 resource.TestCheckResourceAttr( 100 "aws_spot_fleet_request.foo", "launch_specification.3809475891.availability_zone", "us-west-2b"), 101 ), 102 }, 103 }, 104 }) 105 } 106 107 func TestAccAWSSpotFleetRequest_lowestPriceSubnetInGivenList(t *testing.T) { 108 var sfr ec2.SpotFleetRequestConfig 109 rName := acctest.RandString(10) 110 111 resource.Test(t, resource.TestCase{ 112 PreCheck: func() { testAccPreCheck(t) }, 113 Providers: testAccProviders, 114 CheckDestroy: testAccCheckAWSSpotFleetRequestDestroy, 115 Steps: []resource.TestStep{ 116 resource.TestStep{ 117 Config: testAccAWSSpotFleetRequestConfigWithSubnet(rName), 118 Check: resource.ComposeAggregateTestCheckFunc( 119 testAccCheckAWSSpotFleetRequestExists( 120 "aws_spot_fleet_request.foo", &sfr), 121 resource.TestCheckResourceAttr( 122 "aws_spot_fleet_request.foo", "spot_request_state", "active"), 123 resource.TestCheckResourceAttr( 124 "aws_spot_fleet_request.foo", "launch_specification.#", "2"), 125 ), 126 }, 127 }, 128 }) 129 } 130 131 func TestAccAWSSpotFleetRequest_multipleInstanceTypesInSameAz(t *testing.T) { 132 var sfr ec2.SpotFleetRequestConfig 133 rName := acctest.RandString(10) 134 135 resource.Test(t, resource.TestCase{ 136 PreCheck: func() { testAccPreCheck(t) }, 137 Providers: testAccProviders, 138 CheckDestroy: testAccCheckAWSSpotFleetRequestDestroy, 139 Steps: []resource.TestStep{ 140 resource.TestStep{ 141 Config: testAccAWSSpotFleetRequestConfigMultipleInstanceTypesinSameAz(rName), 142 Check: resource.ComposeAggregateTestCheckFunc( 143 testAccCheckAWSSpotFleetRequestExists( 144 "aws_spot_fleet_request.foo", &sfr), 145 resource.TestCheckResourceAttr( 146 "aws_spot_fleet_request.foo", "spot_request_state", "active"), 147 resource.TestCheckResourceAttr( 148 "aws_spot_fleet_request.foo", "launch_specification.#", "2"), 149 resource.TestCheckResourceAttr( 150 "aws_spot_fleet_request.foo", "launch_specification.1590006269.instance_type", "m1.small"), 151 resource.TestCheckResourceAttr( 152 "aws_spot_fleet_request.foo", "launch_specification.1590006269.availability_zone", "us-west-2a"), 153 resource.TestCheckResourceAttr( 154 "aws_spot_fleet_request.foo", "launch_specification.3079734941.instance_type", "m3.large"), 155 resource.TestCheckResourceAttr( 156 "aws_spot_fleet_request.foo", "launch_specification.3079734941.availability_zone", "us-west-2a"), 157 ), 158 }, 159 }, 160 }) 161 } 162 163 func TestAccAWSSpotFleetRequest_multipleInstanceTypesInSameSubnet(t *testing.T) { 164 var sfr ec2.SpotFleetRequestConfig 165 rName := acctest.RandString(10) 166 167 resource.Test(t, resource.TestCase{ 168 PreCheck: func() { testAccPreCheck(t) }, 169 Providers: testAccProviders, 170 CheckDestroy: testAccCheckAWSSpotFleetRequestDestroy, 171 Steps: []resource.TestStep{ 172 resource.TestStep{ 173 Config: testAccAWSSpotFleetRequestConfigMultipleInstanceTypesinSameSubnet(rName), 174 Check: resource.ComposeAggregateTestCheckFunc( 175 testAccCheckAWSSpotFleetRequestExists( 176 "aws_spot_fleet_request.foo", &sfr), 177 resource.TestCheckResourceAttr( 178 "aws_spot_fleet_request.foo", "spot_request_state", "active"), 179 resource.TestCheckResourceAttr( 180 "aws_spot_fleet_request.foo", "launch_specification.#", "2"), 181 ), 182 }, 183 }, 184 }) 185 } 186 187 func TestAccAWSSpotFleetRequest_overriddingSpotPrice(t *testing.T) { 188 var sfr ec2.SpotFleetRequestConfig 189 rName := acctest.RandString(10) 190 191 resource.Test(t, resource.TestCase{ 192 PreCheck: func() { testAccPreCheck(t) }, 193 Providers: testAccProviders, 194 CheckDestroy: testAccCheckAWSSpotFleetRequestDestroy, 195 Steps: []resource.TestStep{ 196 resource.TestStep{ 197 Config: testAccAWSSpotFleetRequestConfigOverridingSpotPrice(rName), 198 Check: resource.ComposeAggregateTestCheckFunc( 199 testAccCheckAWSSpotFleetRequestExists( 200 "aws_spot_fleet_request.foo", &sfr), 201 resource.TestCheckResourceAttr( 202 "aws_spot_fleet_request.foo", "spot_request_state", "active"), 203 resource.TestCheckResourceAttr( 204 "aws_spot_fleet_request.foo", "spot_price", "0.005"), 205 resource.TestCheckResourceAttr( 206 "aws_spot_fleet_request.foo", "launch_specification.#", "2"), 207 resource.TestCheckResourceAttr( 208 "aws_spot_fleet_request.foo", "launch_specification.522395050.spot_price", "0.01"), 209 resource.TestCheckResourceAttr( 210 "aws_spot_fleet_request.foo", "launch_specification.522395050.instance_type", "m3.large"), 211 resource.TestCheckResourceAttr( 212 "aws_spot_fleet_request.foo", "launch_specification.1590006269.spot_price", ""), //there will not be a value here since it's not overriding 213 resource.TestCheckResourceAttr( 214 "aws_spot_fleet_request.foo", "launch_specification.1590006269.instance_type", "m1.small"), 215 ), 216 }, 217 }, 218 }) 219 } 220 221 func TestAccAWSSpotFleetRequest_diversifiedAllocation(t *testing.T) { 222 var sfr ec2.SpotFleetRequestConfig 223 rName := acctest.RandString(10) 224 225 resource.Test(t, resource.TestCase{ 226 PreCheck: func() { testAccPreCheck(t) }, 227 Providers: testAccProviders, 228 CheckDestroy: testAccCheckAWSSpotFleetRequestDestroy, 229 Steps: []resource.TestStep{ 230 resource.TestStep{ 231 Config: testAccAWSSpotFleetRequestConfigDiversifiedAllocation(rName), 232 Check: resource.ComposeAggregateTestCheckFunc( 233 testAccCheckAWSSpotFleetRequestExists( 234 "aws_spot_fleet_request.foo", &sfr), 235 resource.TestCheckResourceAttr( 236 "aws_spot_fleet_request.foo", "spot_request_state", "active"), 237 resource.TestCheckResourceAttr( 238 "aws_spot_fleet_request.foo", "launch_specification.#", "3"), 239 resource.TestCheckResourceAttr( 240 "aws_spot_fleet_request.foo", "allocation_strategy", "diversified"), 241 ), 242 }, 243 }, 244 }) 245 } 246 247 func TestAccAWSSpotFleetRequest_withWeightedCapacity(t *testing.T) { 248 var sfr ec2.SpotFleetRequestConfig 249 rName := acctest.RandString(10) 250 251 resource.Test(t, resource.TestCase{ 252 PreCheck: func() { testAccPreCheck(t) }, 253 Providers: testAccProviders, 254 CheckDestroy: testAccCheckAWSSpotFleetRequestDestroy, 255 Steps: []resource.TestStep{ 256 resource.TestStep{ 257 Config: testAccAWSSpotFleetRequestConfigWithWeightedCapacity(rName), 258 Check: resource.ComposeAggregateTestCheckFunc( 259 testAccCheckAWSSpotFleetRequestExists( 260 "aws_spot_fleet_request.foo", &sfr), 261 resource.TestCheckResourceAttr( 262 "aws_spot_fleet_request.foo", "spot_request_state", "active"), 263 resource.TestCheckResourceAttr( 264 "aws_spot_fleet_request.foo", "launch_specification.#", "2"), 265 resource.TestCheckResourceAttr( 266 "aws_spot_fleet_request.foo", "launch_specification.2325690000.weighted_capacity", "3"), 267 resource.TestCheckResourceAttr( 268 "aws_spot_fleet_request.foo", "launch_specification.2325690000.instance_type", "r3.large"), 269 resource.TestCheckResourceAttr( 270 "aws_spot_fleet_request.foo", "launch_specification.3079734941.weighted_capacity", "6"), 271 resource.TestCheckResourceAttr( 272 "aws_spot_fleet_request.foo", "launch_specification.3079734941.instance_type", "m3.large"), 273 ), 274 }, 275 }, 276 }) 277 } 278 279 func TestAccAWSSpotFleetRequest_CannotUseEmptyKeyName(t *testing.T) { 280 _, errors := validateSpotFleetRequestKeyName("", "key_name") 281 if len(errors) == 0 { 282 t.Fatalf("Expected the key name to trigger a validation error") 283 } 284 } 285 286 func testAccCheckAWSSpotFleetRequestConfigRecreated(t *testing.T, 287 before, after *ec2.SpotFleetRequestConfig) resource.TestCheckFunc { 288 return func(s *terraform.State) error { 289 if before.SpotFleetRequestId == after.SpotFleetRequestId { 290 t.Fatalf("Expected change of Spot Fleet Request IDs, but both were %v", before.SpotFleetRequestId) 291 } 292 return nil 293 } 294 } 295 296 func testAccCheckAWSSpotFleetRequestExists( 297 n string, sfr *ec2.SpotFleetRequestConfig) resource.TestCheckFunc { 298 return func(s *terraform.State) error { 299 rs, ok := s.RootModule().Resources[n] 300 if !ok { 301 return fmt.Errorf("Not found: %s", n) 302 } 303 304 if rs.Primary.ID == "" { 305 return fmt.Errorf("No Spot fleet request with that id exists") 306 } 307 308 conn := testAccProvider.Meta().(*AWSClient).ec2conn 309 310 params := &ec2.DescribeSpotFleetRequestsInput{ 311 SpotFleetRequestIds: []*string{&rs.Primary.ID}, 312 } 313 resp, err := conn.DescribeSpotFleetRequests(params) 314 315 if err != nil { 316 return err 317 } 318 319 if v := len(resp.SpotFleetRequestConfigs); v != 1 { 320 return fmt.Errorf("Expected 1 request returned, got %d", v) 321 } 322 323 *sfr = *resp.SpotFleetRequestConfigs[0] 324 325 return nil 326 } 327 } 328 329 func testAccCheckAWSSpotFleetRequest_LaunchSpecAttributes( 330 sfr *ec2.SpotFleetRequestConfig) resource.TestCheckFunc { 331 return func(s *terraform.State) error { 332 if len(sfr.SpotFleetRequestConfig.LaunchSpecifications) == 0 { 333 return fmt.Errorf("Missing launch specification") 334 } 335 336 spec := *sfr.SpotFleetRequestConfig.LaunchSpecifications[0] 337 338 if *spec.InstanceType != "m1.small" { 339 return fmt.Errorf("Unexpected launch specification instance type: %s", *spec.InstanceType) 340 } 341 342 if *spec.ImageId != "ami-d06a90b0" { 343 return fmt.Errorf("Unexpected launch specification image id: %s", *spec.ImageId) 344 } 345 346 if *spec.SpotPrice != "0.01" { 347 return fmt.Errorf("Unexpected launch specification spot price: %s", *spec.SpotPrice) 348 } 349 350 if *spec.WeightedCapacity != 2 { 351 return fmt.Errorf("Unexpected launch specification weighted capacity: %f", *spec.WeightedCapacity) 352 } 353 354 if *spec.UserData != base64.StdEncoding.EncodeToString([]byte("hello-world")) { 355 return fmt.Errorf("Unexpected launch specification user data: %s", *spec.UserData) 356 } 357 358 return nil 359 } 360 } 361 362 func testAccCheckAWSSpotFleetRequestDestroy(s *terraform.State) error { 363 conn := testAccProvider.Meta().(*AWSClient).ec2conn 364 365 for _, rs := range s.RootModule().Resources { 366 if rs.Type != "aws_spot_fleet_request" { 367 continue 368 } 369 370 _, err := conn.CancelSpotFleetRequests(&ec2.CancelSpotFleetRequestsInput{ 371 SpotFleetRequestIds: []*string{aws.String(rs.Primary.ID)}, 372 TerminateInstances: aws.Bool(true), 373 }) 374 375 if err != nil { 376 return fmt.Errorf("Error cancelling spot request (%s): %s", rs.Primary.ID, err) 377 } 378 } 379 380 return nil 381 } 382 383 func testAccAWSSpotFleetRequestConfig(rName string) string { 384 return fmt.Sprintf(` 385 resource "aws_key_pair" "debugging" { 386 key_name = "tmp-key-%s" 387 public_key = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD3F6tyPEFEzV0LX3X8BsXdMsQz1x2cEikKDEY0aIj41qgxMCP/iteneqXSIFZBp5vizPvaoIR3Um9xK7PGoW8giupGn+EPuxIA4cDM4vzOqOkiMPhz5XK0whEjkVzTo4+S0puvDZuwIsdiW9mxhJc7tgBNL0cYlWSYVkz4G/fslNfRPW5mYAM49f4fhtxPb5ok4Q2Lg9dPKVHO/Bgeu5woMc7RY0p1ej6D4CKFE6lymSDJpW0YHX/wqE9+cfEauh7xZcG0q9t2ta6F6fmX0agvpFyZo8aFbXeUBr7osSCJNgvavWbM/06niWrOvYX2xwWdhXmXSrbX8ZbabVohBK41 phodgson@thoughtworks.com" 388 } 389 390 resource "aws_iam_policy_attachment" "test-attach" { 391 name = "test-attachment" 392 roles = ["${aws_iam_role.test-role.name}"] 393 policy_arn = "arn:aws:iam::aws:policy/service-role/AmazonEC2SpotFleetRole" 394 } 395 396 resource "aws_iam_role" "test-role" { 397 name = "test-role-%s" 398 assume_role_policy = <<EOF 399 { 400 "Version": "2012-10-17", 401 "Statement": [ 402 { 403 "Sid": "", 404 "Effect": "Allow", 405 "Principal": { 406 "Service": [ 407 "spotfleet.amazonaws.com", 408 "ec2.amazonaws.com" 409 ] 410 }, 411 "Action": "sts:AssumeRole" 412 } 413 ] 414 } 415 EOF 416 } 417 418 resource "aws_spot_fleet_request" "foo" { 419 iam_fleet_role = "${aws_iam_role.test-role.arn}" 420 spot_price = "0.005" 421 target_capacity = 2 422 valid_until = "2019-11-04T20:44:20Z" 423 terminate_instances_with_expiration = true 424 launch_specification { 425 instance_type = "m1.small" 426 ami = "ami-d06a90b0" 427 key_name = "${aws_key_pair.debugging.key_name}" 428 } 429 depends_on = ["aws_iam_policy_attachment.test-attach"] 430 } 431 `, rName, rName) 432 } 433 434 func testAccAWSSpotFleetRequestConfigChangeSpotBidPrice(rName string) string { 435 return fmt.Sprintf(` 436 resource "aws_key_pair" "debugging" { 437 key_name = "tmp-key-%s" 438 public_key = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD3F6tyPEFEzV0LX3X8BsXdMsQz1x2cEikKDEY0aIj41qgxMCP/iteneqXSIFZBp5vizPvaoIR3Um9xK7PGoW8giupGn+EPuxIA4cDM4vzOqOkiMPhz5XK0whEjkVzTo4+S0puvDZuwIsdiW9mxhJc7tgBNL0cYlWSYVkz4G/fslNfRPW5mYAM49f4fhtxPb5ok4Q2Lg9dPKVHO/Bgeu5woMc7RY0p1ej6D4CKFE6lymSDJpW0YHX/wqE9+cfEauh7xZcG0q9t2ta6F6fmX0agvpFyZo8aFbXeUBr7osSCJNgvavWbM/06niWrOvYX2xwWdhXmXSrbX8ZbabVohBK41 phodgson@thoughtworks.com" 439 } 440 441 resource "aws_iam_policy_attachment" "test-attach" { 442 name = "test-attachment" 443 roles = ["${aws_iam_role.test-role.name}"] 444 policy_arn = "arn:aws:iam::aws:policy/service-role/AmazonEC2SpotFleetRole" 445 } 446 447 resource "aws_iam_role" "test-role" { 448 name = "test-role-%s" 449 assume_role_policy = <<EOF 450 { 451 "Version": "2012-10-17", 452 "Statement": [ 453 { 454 "Sid": "", 455 "Effect": "Allow", 456 "Principal": { 457 "Service": [ 458 "spotfleet.amazonaws.com", 459 "ec2.amazonaws.com" 460 ] 461 }, 462 "Action": "sts:AssumeRole" 463 } 464 ] 465 } 466 EOF 467 } 468 469 resource "aws_spot_fleet_request" "foo" { 470 iam_fleet_role = "${aws_iam_role.test-role.arn}" 471 spot_price = "0.01" 472 target_capacity = 2 473 valid_until = "2019-11-04T20:44:20Z" 474 terminate_instances_with_expiration = true 475 launch_specification { 476 instance_type = "m1.small" 477 ami = "ami-d06a90b0" 478 key_name = "${aws_key_pair.debugging.key_name}" 479 } 480 depends_on = ["aws_iam_policy_attachment.test-attach"] 481 } 482 `, rName, rName) 483 } 484 485 func testAccAWSSpotFleetRequestConfigWithAzs(rName string) string { 486 return fmt.Sprintf(` 487 resource "aws_key_pair" "debugging" { 488 key_name = "tmp-key-%s" 489 public_key = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD3F6tyPEFEzV0LX3X8BsXdMsQz1x2cEikKDEY0aIj41qgxMCP/iteneqXSIFZBp5vizPvaoIR3Um9xK7PGoW8giupGn+EPuxIA4cDM4vzOqOkiMPhz5XK0whEjkVzTo4+S0puvDZuwIsdiW9mxhJc7tgBNL0cYlWSYVkz4G/fslNfRPW5mYAM49f4fhtxPb5ok4Q2Lg9dPKVHO/Bgeu5woMc7RY0p1ej6D4CKFE6lymSDJpW0YHX/wqE9+cfEauh7xZcG0q9t2ta6F6fmX0agvpFyZo8aFbXeUBr7osSCJNgvavWbM/06niWrOvYX2xwWdhXmXSrbX8ZbabVohBK41 phodgson@thoughtworks.com" 490 } 491 492 resource "aws_iam_policy_attachment" "test-attach" { 493 name = "test-attachment" 494 roles = ["${aws_iam_role.test-role.name}"] 495 policy_arn = "arn:aws:iam::aws:policy/service-role/AmazonEC2SpotFleetRole" 496 } 497 498 resource "aws_iam_role" "test-role" { 499 name = "test-role-%s" 500 assume_role_policy = <<EOF 501 { 502 "Version": "2012-10-17", 503 "Statement": [ 504 { 505 "Sid": "", 506 "Effect": "Allow", 507 "Principal": { 508 "Service": [ 509 "spotfleet.amazonaws.com", 510 "ec2.amazonaws.com" 511 ] 512 }, 513 "Action": "sts:AssumeRole" 514 } 515 ] 516 } 517 EOF 518 } 519 520 resource "aws_spot_fleet_request" "foo" { 521 iam_fleet_role = "${aws_iam_role.test-role.arn}" 522 spot_price = "0.005" 523 target_capacity = 2 524 valid_until = "2019-11-04T20:44:20Z" 525 terminate_instances_with_expiration = true 526 launch_specification { 527 instance_type = "m1.small" 528 ami = "ami-d06a90b0" 529 key_name = "${aws_key_pair.debugging.key_name}" 530 availability_zone = "us-west-2a" 531 } 532 launch_specification { 533 instance_type = "m1.small" 534 ami = "ami-d06a90b0" 535 key_name = "${aws_key_pair.debugging.key_name}" 536 availability_zone = "us-west-2b" 537 } 538 depends_on = ["aws_iam_policy_attachment.test-attach"] 539 } 540 `, rName, rName) 541 } 542 543 func testAccAWSSpotFleetRequestConfigWithSubnet(rName string) string { 544 return fmt.Sprintf(` 545 resource "aws_key_pair" "debugging" { 546 key_name = "tmp-key-%s" 547 public_key = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD3F6tyPEFEzV0LX3X8BsXdMsQz1x2cEikKDEY0aIj41qgxMCP/iteneqXSIFZBp5vizPvaoIR3Um9xK7PGoW8giupGn+EPuxIA4cDM4vzOqOkiMPhz5XK0whEjkVzTo4+S0puvDZuwIsdiW9mxhJc7tgBNL0cYlWSYVkz4G/fslNfRPW5mYAM49f4fhtxPb5ok4Q2Lg9dPKVHO/Bgeu5woMc7RY0p1ej6D4CKFE6lymSDJpW0YHX/wqE9+cfEauh7xZcG0q9t2ta6F6fmX0agvpFyZo8aFbXeUBr7osSCJNgvavWbM/06niWrOvYX2xwWdhXmXSrbX8ZbabVohBK41 phodgson@thoughtworks.com" 548 } 549 550 resource "aws_iam_policy_attachment" "test-attach" { 551 name = "test-attachment" 552 roles = ["${aws_iam_role.test-role.name}"] 553 policy_arn = "arn:aws:iam::aws:policy/service-role/AmazonEC2SpotFleetRole" 554 } 555 556 resource "aws_iam_role" "test-role" { 557 name = "test-role-%s" 558 assume_role_policy = <<EOF 559 { 560 "Version": "2012-10-17", 561 "Statement": [ 562 { 563 "Sid": "", 564 "Effect": "Allow", 565 "Principal": { 566 "Service": [ 567 "spotfleet.amazonaws.com", 568 "ec2.amazonaws.com" 569 ] 570 }, 571 "Action": "sts:AssumeRole" 572 } 573 ] 574 } 575 EOF 576 } 577 578 resource "aws_vpc" "foo" { 579 cidr_block = "10.1.0.0/16" 580 } 581 582 resource "aws_subnet" "foo" { 583 cidr_block = "10.1.1.0/24" 584 vpc_id = "${aws_vpc.foo.id}" 585 availability_zone = "us-west-2a" 586 } 587 588 resource "aws_subnet" "bar" { 589 cidr_block = "10.1.20.0/24" 590 vpc_id = "${aws_vpc.foo.id}" 591 availability_zone = "us-west-2b" 592 } 593 594 resource "aws_spot_fleet_request" "foo" { 595 iam_fleet_role = "${aws_iam_role.test-role.arn}" 596 spot_price = "0.005" 597 target_capacity = 4 598 valid_until = "2019-11-04T20:44:20Z" 599 terminate_instances_with_expiration = true 600 launch_specification { 601 instance_type = "m3.large" 602 ami = "ami-d0f506b0" 603 key_name = "${aws_key_pair.debugging.key_name}" 604 subnet_id = "${aws_subnet.foo.id}" 605 } 606 launch_specification { 607 instance_type = "m3.large" 608 ami = "ami-d0f506b0" 609 key_name = "${aws_key_pair.debugging.key_name}" 610 subnet_id = "${aws_subnet.bar.id}" 611 } 612 depends_on = ["aws_iam_policy_attachment.test-attach"] 613 } 614 `, rName, rName) 615 } 616 617 func testAccAWSSpotFleetRequestConfigMultipleInstanceTypesinSameAz(rName string) string { 618 return fmt.Sprintf(` 619 resource "aws_key_pair" "debugging" { 620 key_name = "tmp-key-%s" 621 public_key = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD3F6tyPEFEzV0LX3X8BsXdMsQz1x2cEikKDEY0aIj41qgxMCP/iteneqXSIFZBp5vizPvaoIR3Um9xK7PGoW8giupGn+EPuxIA4cDM4vzOqOkiMPhz5XK0whEjkVzTo4+S0puvDZuwIsdiW9mxhJc7tgBNL0cYlWSYVkz4G/fslNfRPW5mYAM49f4fhtxPb5ok4Q2Lg9dPKVHO/Bgeu5woMc7RY0p1ej6D4CKFE6lymSDJpW0YHX/wqE9+cfEauh7xZcG0q9t2ta6F6fmX0agvpFyZo8aFbXeUBr7osSCJNgvavWbM/06niWrOvYX2xwWdhXmXSrbX8ZbabVohBK41 phodgson@thoughtworks.com" 622 } 623 624 resource "aws_iam_policy_attachment" "test-attach" { 625 name = "test-attachment" 626 roles = ["${aws_iam_role.test-role.name}"] 627 policy_arn = "arn:aws:iam::aws:policy/service-role/AmazonEC2SpotFleetRole" 628 } 629 630 resource "aws_iam_role" "test-role" { 631 name = "test-role-%s" 632 assume_role_policy = <<EOF 633 { 634 "Version": "2012-10-17", 635 "Statement": [ 636 { 637 "Sid": "", 638 "Effect": "Allow", 639 "Principal": { 640 "Service": [ 641 "spotfleet.amazonaws.com", 642 "ec2.amazonaws.com" 643 ] 644 }, 645 "Action": "sts:AssumeRole" 646 } 647 ] 648 } 649 EOF 650 } 651 652 resource "aws_spot_fleet_request" "foo" { 653 iam_fleet_role = "${aws_iam_role.test-role.arn}" 654 spot_price = "0.005" 655 target_capacity = 2 656 valid_until = "2019-11-04T20:44:20Z" 657 terminate_instances_with_expiration = true 658 launch_specification { 659 instance_type = "m1.small" 660 ami = "ami-d06a90b0" 661 key_name = "${aws_key_pair.debugging.key_name}" 662 availability_zone = "us-west-2a" 663 } 664 launch_specification { 665 instance_type = "m3.large" 666 ami = "ami-d06a90b0" 667 key_name = "${aws_key_pair.debugging.key_name}" 668 availability_zone = "us-west-2a" 669 } 670 depends_on = ["aws_iam_policy_attachment.test-attach"] 671 } 672 `, rName, rName) 673 } 674 675 func testAccAWSSpotFleetRequestConfigMultipleInstanceTypesinSameSubnet(rName string) string { 676 return fmt.Sprintf(` 677 resource "aws_key_pair" "debugging" { 678 key_name = "tmp-key-%s" 679 public_key = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD3F6tyPEFEzV0LX3X8BsXdMsQz1x2cEikKDEY0aIj41qgxMCP/iteneqXSIFZBp5vizPvaoIR3Um9xK7PGoW8giupGn+EPuxIA4cDM4vzOqOkiMPhz5XK0whEjkVzTo4+S0puvDZuwIsdiW9mxhJc7tgBNL0cYlWSYVkz4G/fslNfRPW5mYAM49f4fhtxPb5ok4Q2Lg9dPKVHO/Bgeu5woMc7RY0p1ej6D4CKFE6lymSDJpW0YHX/wqE9+cfEauh7xZcG0q9t2ta6F6fmX0agvpFyZo8aFbXeUBr7osSCJNgvavWbM/06niWrOvYX2xwWdhXmXSrbX8ZbabVohBK41 phodgson@thoughtworks.com" 680 } 681 682 resource "aws_iam_policy_attachment" "test-attach" { 683 name = "test-attachment" 684 roles = ["${aws_iam_role.test-role.name}"] 685 policy_arn = "arn:aws:iam::aws:policy/service-role/AmazonEC2SpotFleetRole" 686 } 687 688 resource "aws_iam_role" "test-role" { 689 name = "test-role-%s" 690 assume_role_policy = <<EOF 691 { 692 "Version": "2012-10-17", 693 "Statement": [ 694 { 695 "Sid": "", 696 "Effect": "Allow", 697 "Principal": { 698 "Service": [ 699 "spotfleet.amazonaws.com", 700 "ec2.amazonaws.com" 701 ] 702 }, 703 "Action": "sts:AssumeRole" 704 } 705 ] 706 } 707 EOF 708 } 709 710 resource "aws_vpc" "foo" { 711 cidr_block = "10.1.0.0/16" 712 } 713 714 resource "aws_subnet" "foo" { 715 cidr_block = "10.1.1.0/24" 716 vpc_id = "${aws_vpc.foo.id}" 717 availability_zone = "us-west-2a" 718 } 719 720 resource "aws_spot_fleet_request" "foo" { 721 iam_fleet_role = "${aws_iam_role.test-role.arn}" 722 spot_price = "0.005" 723 target_capacity = 4 724 valid_until = "2019-11-04T20:44:20Z" 725 terminate_instances_with_expiration = true 726 launch_specification { 727 instance_type = "m3.large" 728 ami = "ami-d0f506b0" 729 key_name = "${aws_key_pair.debugging.key_name}" 730 subnet_id = "${aws_subnet.foo.id}" 731 } 732 launch_specification { 733 instance_type = "r3.large" 734 ami = "ami-d0f506b0" 735 key_name = "${aws_key_pair.debugging.key_name}" 736 subnet_id = "${aws_subnet.foo.id}" 737 } 738 depends_on = ["aws_iam_policy_attachment.test-attach"] 739 } 740 `, rName, rName) 741 } 742 743 func testAccAWSSpotFleetRequestConfigOverridingSpotPrice(rName string) string { 744 return fmt.Sprintf(` 745 resource "aws_key_pair" "debugging" { 746 key_name = "tmp-key-%s" 747 public_key = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD3F6tyPEFEzV0LX3X8BsXdMsQz1x2cEikKDEY0aIj41qgxMCP/iteneqXSIFZBp5vizPvaoIR3Um9xK7PGoW8giupGn+EPuxIA4cDM4vzOqOkiMPhz5XK0whEjkVzTo4+S0puvDZuwIsdiW9mxhJc7tgBNL0cYlWSYVkz4G/fslNfRPW5mYAM49f4fhtxPb5ok4Q2Lg9dPKVHO/Bgeu5woMc7RY0p1ej6D4CKFE6lymSDJpW0YHX/wqE9+cfEauh7xZcG0q9t2ta6F6fmX0agvpFyZo8aFbXeUBr7osSCJNgvavWbM/06niWrOvYX2xwWdhXmXSrbX8ZbabVohBK41 phodgson@thoughtworks.com" 748 } 749 750 resource "aws_iam_policy_attachment" "test-attach" { 751 name = "test-attachment" 752 roles = ["${aws_iam_role.test-role.name}"] 753 policy_arn = "arn:aws:iam::aws:policy/service-role/AmazonEC2SpotFleetRole" 754 } 755 756 resource "aws_iam_role" "test-role" { 757 name = "test-role-%s" 758 assume_role_policy = <<EOF 759 { 760 "Version": "2012-10-17", 761 "Statement": [ 762 { 763 "Sid": "", 764 "Effect": "Allow", 765 "Principal": { 766 "Service": [ 767 "spotfleet.amazonaws.com", 768 "ec2.amazonaws.com" 769 ] 770 }, 771 "Action": "sts:AssumeRole" 772 } 773 ] 774 } 775 EOF 776 } 777 778 resource "aws_spot_fleet_request" "foo" { 779 iam_fleet_role = "${aws_iam_role.test-role.arn}" 780 spot_price = "0.005" 781 target_capacity = 2 782 valid_until = "2019-11-04T20:44:20Z" 783 terminate_instances_with_expiration = true 784 launch_specification { 785 instance_type = "m1.small" 786 ami = "ami-d06a90b0" 787 key_name = "${aws_key_pair.debugging.key_name}" 788 availability_zone = "us-west-2a" 789 } 790 launch_specification { 791 instance_type = "m3.large" 792 ami = "ami-d06a90b0" 793 key_name = "${aws_key_pair.debugging.key_name}" 794 availability_zone = "us-west-2a" 795 spot_price = "0.01" 796 } 797 depends_on = ["aws_iam_policy_attachment.test-attach"] 798 } 799 `, rName, rName) 800 } 801 802 func testAccAWSSpotFleetRequestConfigDiversifiedAllocation(rName string) string { 803 return fmt.Sprintf(` 804 resource "aws_key_pair" "debugging" { 805 key_name = "tmp-key-%s" 806 public_key = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD3F6tyPEFEzV0LX3X8BsXdMsQz1x2cEikKDEY0aIj41qgxMCP/iteneqXSIFZBp5vizPvaoIR3Um9xK7PGoW8giupGn+EPuxIA4cDM4vzOqOkiMPhz5XK0whEjkVzTo4+S0puvDZuwIsdiW9mxhJc7tgBNL0cYlWSYVkz4G/fslNfRPW5mYAM49f4fhtxPb5ok4Q2Lg9dPKVHO/Bgeu5woMc7RY0p1ej6D4CKFE6lymSDJpW0YHX/wqE9+cfEauh7xZcG0q9t2ta6F6fmX0agvpFyZo8aFbXeUBr7osSCJNgvavWbM/06niWrOvYX2xwWdhXmXSrbX8ZbabVohBK41 phodgson@thoughtworks.com" 807 } 808 809 resource "aws_iam_policy_attachment" "test-attach" { 810 name = "test-attachment" 811 roles = ["${aws_iam_role.test-role.name}"] 812 policy_arn = "arn:aws:iam::aws:policy/service-role/AmazonEC2SpotFleetRole" 813 } 814 815 resource "aws_iam_role" "test-role" { 816 name = "test-role-%s" 817 assume_role_policy = <<EOF 818 { 819 "Version": "2012-10-17", 820 "Statement": [ 821 { 822 "Sid": "", 823 "Effect": "Allow", 824 "Principal": { 825 "Service": [ 826 "spotfleet.amazonaws.com", 827 "ec2.amazonaws.com" 828 ] 829 }, 830 "Action": "sts:AssumeRole" 831 } 832 ] 833 } 834 EOF 835 } 836 837 resource "aws_spot_fleet_request" "foo" { 838 iam_fleet_role = "${aws_iam_role.test-role.arn}" 839 spot_price = "0.7" 840 target_capacity = 30 841 valid_until = "2019-11-04T20:44:20Z" 842 allocation_strategy = "diversified" 843 terminate_instances_with_expiration = true 844 launch_specification { 845 instance_type = "m1.small" 846 ami = "ami-d06a90b0" 847 key_name = "${aws_key_pair.debugging.key_name}" 848 availability_zone = "us-west-2a" 849 } 850 launch_specification { 851 instance_type = "m3.large" 852 ami = "ami-d06a90b0" 853 key_name = "${aws_key_pair.debugging.key_name}" 854 availability_zone = "us-west-2a" 855 } 856 launch_specification { 857 instance_type = "r3.large" 858 ami = "ami-d06a90b0" 859 key_name = "${aws_key_pair.debugging.key_name}" 860 availability_zone = "us-west-2a" 861 } 862 depends_on = ["aws_iam_policy_attachment.test-attach"] 863 } 864 `, rName, rName) 865 } 866 867 func testAccAWSSpotFleetRequestConfigWithWeightedCapacity(rName string) string { 868 return fmt.Sprintf(` 869 resource "aws_key_pair" "debugging" { 870 key_name = "tmp-key-%s" 871 public_key = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD3F6tyPEFEzV0LX3X8BsXdMsQz1x2cEikKDEY0aIj41qgxMCP/iteneqXSIFZBp5vizPvaoIR3Um9xK7PGoW8giupGn+EPuxIA4cDM4vzOqOkiMPhz5XK0whEjkVzTo4+S0puvDZuwIsdiW9mxhJc7tgBNL0cYlWSYVkz4G/fslNfRPW5mYAM49f4fhtxPb5ok4Q2Lg9dPKVHO/Bgeu5woMc7RY0p1ej6D4CKFE6lymSDJpW0YHX/wqE9+cfEauh7xZcG0q9t2ta6F6fmX0agvpFyZo8aFbXeUBr7osSCJNgvavWbM/06niWrOvYX2xwWdhXmXSrbX8ZbabVohBK41 phodgson@thoughtworks.com" 872 } 873 874 resource "aws_iam_policy_attachment" "test-attach" { 875 name = "test-attachment" 876 roles = ["${aws_iam_role.test-role.name}"] 877 policy_arn = "arn:aws:iam::aws:policy/service-role/AmazonEC2SpotFleetRole" 878 } 879 880 resource "aws_iam_role" "test-role" { 881 name = "test-role-%s" 882 assume_role_policy = <<EOF 883 { 884 "Version": "2012-10-17", 885 "Statement": [ 886 { 887 "Sid": "", 888 "Effect": "Allow", 889 "Principal": { 890 "Service": [ 891 "spotfleet.amazonaws.com", 892 "ec2.amazonaws.com" 893 ] 894 }, 895 "Action": "sts:AssumeRole" 896 } 897 ] 898 } 899 EOF 900 } 901 902 resource "aws_spot_fleet_request" "foo" { 903 iam_fleet_role = "${aws_iam_role.test-role.arn}" 904 spot_price = "0.7" 905 target_capacity = 10 906 valid_until = "2019-11-04T20:44:20Z" 907 terminate_instances_with_expiration = true 908 launch_specification { 909 instance_type = "m3.large" 910 ami = "ami-d06a90b0" 911 key_name = "${aws_key_pair.debugging.key_name}" 912 availability_zone = "us-west-2a" 913 weighted_capacity = "6" 914 } 915 launch_specification { 916 instance_type = "r3.large" 917 ami = "ami-d06a90b0" 918 key_name = "${aws_key_pair.debugging.key_name}" 919 availability_zone = "us-west-2a" 920 weighted_capacity = "3" 921 } 922 depends_on = ["aws_iam_policy_attachment.test-attach"] 923 } 924 `, rName, rName) 925 }