github.com/daveadams/terraform@v0.6.4-0.20160830094355-13ce74975936/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": "spotfleet.amazonaws.com" 407 }, 408 "Action": "sts:AssumeRole" 409 } 410 ] 411 } 412 EOF 413 } 414 415 resource "aws_spot_fleet_request" "foo" { 416 iam_fleet_role = "${aws_iam_role.test-role.arn}" 417 spot_price = "0.005" 418 target_capacity = 2 419 valid_until = "2019-11-04T20:44:20Z" 420 terminate_instances_with_expiration = true 421 launch_specification { 422 instance_type = "m1.small" 423 ami = "ami-d06a90b0" 424 key_name = "${aws_key_pair.debugging.key_name}" 425 } 426 depends_on = ["aws_iam_policy_attachment.test-attach"] 427 } 428 `, rName, rName) 429 } 430 431 func testAccAWSSpotFleetRequestConfigChangeSpotBidPrice(rName string) string { 432 return fmt.Sprintf(` 433 resource "aws_key_pair" "debugging" { 434 key_name = "tmp-key-%s" 435 public_key = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD3F6tyPEFEzV0LX3X8BsXdMsQz1x2cEikKDEY0aIj41qgxMCP/iteneqXSIFZBp5vizPvaoIR3Um9xK7PGoW8giupGn+EPuxIA4cDM4vzOqOkiMPhz5XK0whEjkVzTo4+S0puvDZuwIsdiW9mxhJc7tgBNL0cYlWSYVkz4G/fslNfRPW5mYAM49f4fhtxPb5ok4Q2Lg9dPKVHO/Bgeu5woMc7RY0p1ej6D4CKFE6lymSDJpW0YHX/wqE9+cfEauh7xZcG0q9t2ta6F6fmX0agvpFyZo8aFbXeUBr7osSCJNgvavWbM/06niWrOvYX2xwWdhXmXSrbX8ZbabVohBK41 phodgson@thoughtworks.com" 436 } 437 438 resource "aws_iam_policy_attachment" "test-attach" { 439 name = "test-attachment" 440 roles = ["${aws_iam_role.test-role.name}"] 441 policy_arn = "arn:aws:iam::aws:policy/service-role/AmazonEC2SpotFleetRole" 442 } 443 444 resource "aws_iam_role" "test-role" { 445 name = "test-role-%s" 446 assume_role_policy = <<EOF 447 { 448 "Version": "2012-10-17", 449 "Statement": [ 450 { 451 "Sid": "", 452 "Effect": "Allow", 453 "Principal": { 454 "Service": "spotfleet.amazonaws.com" 455 }, 456 "Action": "sts:AssumeRole" 457 } 458 ] 459 } 460 EOF 461 } 462 463 resource "aws_spot_fleet_request" "foo" { 464 iam_fleet_role = "${aws_iam_role.test-role.arn}" 465 spot_price = "0.01" 466 target_capacity = 2 467 valid_until = "2019-11-04T20:44:20Z" 468 terminate_instances_with_expiration = true 469 launch_specification { 470 instance_type = "m1.small" 471 ami = "ami-d06a90b0" 472 key_name = "${aws_key_pair.debugging.key_name}" 473 } 474 depends_on = ["aws_iam_policy_attachment.test-attach"] 475 } 476 `, rName, rName) 477 } 478 479 func testAccAWSSpotFleetRequestConfigWithAzs(rName string) string { 480 return fmt.Sprintf(` 481 resource "aws_key_pair" "debugging" { 482 key_name = "tmp-key-%s" 483 public_key = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD3F6tyPEFEzV0LX3X8BsXdMsQz1x2cEikKDEY0aIj41qgxMCP/iteneqXSIFZBp5vizPvaoIR3Um9xK7PGoW8giupGn+EPuxIA4cDM4vzOqOkiMPhz5XK0whEjkVzTo4+S0puvDZuwIsdiW9mxhJc7tgBNL0cYlWSYVkz4G/fslNfRPW5mYAM49f4fhtxPb5ok4Q2Lg9dPKVHO/Bgeu5woMc7RY0p1ej6D4CKFE6lymSDJpW0YHX/wqE9+cfEauh7xZcG0q9t2ta6F6fmX0agvpFyZo8aFbXeUBr7osSCJNgvavWbM/06niWrOvYX2xwWdhXmXSrbX8ZbabVohBK41 phodgson@thoughtworks.com" 484 } 485 486 resource "aws_iam_policy_attachment" "test-attach" { 487 name = "test-attachment" 488 roles = ["${aws_iam_role.test-role.name}"] 489 policy_arn = "arn:aws:iam::aws:policy/service-role/AmazonEC2SpotFleetRole" 490 } 491 492 resource "aws_iam_role" "test-role" { 493 name = "test-role-%s" 494 assume_role_policy = <<EOF 495 { 496 "Version": "2012-10-17", 497 "Statement": [ 498 { 499 "Sid": "", 500 "Effect": "Allow", 501 "Principal": { 502 "Service": "spotfleet.amazonaws.com" 503 }, 504 "Action": "sts:AssumeRole" 505 } 506 ] 507 } 508 EOF 509 } 510 511 resource "aws_spot_fleet_request" "foo" { 512 iam_fleet_role = "${aws_iam_role.test-role.arn}" 513 spot_price = "0.005" 514 target_capacity = 2 515 valid_until = "2019-11-04T20:44:20Z" 516 terminate_instances_with_expiration = true 517 launch_specification { 518 instance_type = "m1.small" 519 ami = "ami-d06a90b0" 520 key_name = "${aws_key_pair.debugging.key_name}" 521 availability_zone = "us-west-2a" 522 } 523 launch_specification { 524 instance_type = "m1.small" 525 ami = "ami-d06a90b0" 526 key_name = "${aws_key_pair.debugging.key_name}" 527 availability_zone = "us-west-2b" 528 } 529 depends_on = ["aws_iam_policy_attachment.test-attach"] 530 } 531 `, rName, rName) 532 } 533 534 func testAccAWSSpotFleetRequestConfigWithSubnet(rName string) string { 535 return fmt.Sprintf(` 536 resource "aws_key_pair" "debugging" { 537 key_name = "tmp-key-%s" 538 public_key = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD3F6tyPEFEzV0LX3X8BsXdMsQz1x2cEikKDEY0aIj41qgxMCP/iteneqXSIFZBp5vizPvaoIR3Um9xK7PGoW8giupGn+EPuxIA4cDM4vzOqOkiMPhz5XK0whEjkVzTo4+S0puvDZuwIsdiW9mxhJc7tgBNL0cYlWSYVkz4G/fslNfRPW5mYAM49f4fhtxPb5ok4Q2Lg9dPKVHO/Bgeu5woMc7RY0p1ej6D4CKFE6lymSDJpW0YHX/wqE9+cfEauh7xZcG0q9t2ta6F6fmX0agvpFyZo8aFbXeUBr7osSCJNgvavWbM/06niWrOvYX2xwWdhXmXSrbX8ZbabVohBK41 phodgson@thoughtworks.com" 539 } 540 541 resource "aws_iam_policy_attachment" "test-attach" { 542 name = "test-attachment" 543 roles = ["${aws_iam_role.test-role.name}"] 544 policy_arn = "arn:aws:iam::aws:policy/service-role/AmazonEC2SpotFleetRole" 545 } 546 547 resource "aws_iam_role" "test-role" { 548 name = "test-role-%s" 549 assume_role_policy = <<EOF 550 { 551 "Version": "2012-10-17", 552 "Statement": [ 553 { 554 "Sid": "", 555 "Effect": "Allow", 556 "Principal": { 557 "Service": "spotfleet.amazonaws.com" 558 }, 559 "Action": "sts:AssumeRole" 560 } 561 ] 562 } 563 EOF 564 } 565 566 resource "aws_vpc" "foo" { 567 cidr_block = "10.1.0.0/16" 568 } 569 570 resource "aws_subnet" "foo" { 571 cidr_block = "10.1.1.0/24" 572 vpc_id = "${aws_vpc.foo.id}" 573 availability_zone = "us-west-2a" 574 } 575 576 resource "aws_subnet" "bar" { 577 cidr_block = "10.1.20.0/24" 578 vpc_id = "${aws_vpc.foo.id}" 579 availability_zone = "us-west-2b" 580 } 581 582 resource "aws_spot_fleet_request" "foo" { 583 iam_fleet_role = "${aws_iam_role.test-role.arn}" 584 spot_price = "0.005" 585 target_capacity = 4 586 valid_until = "2019-11-04T20:44:20Z" 587 terminate_instances_with_expiration = true 588 launch_specification { 589 instance_type = "m3.large" 590 ami = "ami-d0f506b0" 591 key_name = "${aws_key_pair.debugging.key_name}" 592 subnet_id = "${aws_subnet.foo.id}" 593 } 594 launch_specification { 595 instance_type = "m3.large" 596 ami = "ami-d0f506b0" 597 key_name = "${aws_key_pair.debugging.key_name}" 598 subnet_id = "${aws_subnet.bar.id}" 599 } 600 depends_on = ["aws_iam_policy_attachment.test-attach"] 601 } 602 `, rName, rName) 603 } 604 605 func testAccAWSSpotFleetRequestConfigMultipleInstanceTypesinSameAz(rName string) string { 606 return fmt.Sprintf(` 607 resource "aws_key_pair" "debugging" { 608 key_name = "tmp-key-%s" 609 public_key = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD3F6tyPEFEzV0LX3X8BsXdMsQz1x2cEikKDEY0aIj41qgxMCP/iteneqXSIFZBp5vizPvaoIR3Um9xK7PGoW8giupGn+EPuxIA4cDM4vzOqOkiMPhz5XK0whEjkVzTo4+S0puvDZuwIsdiW9mxhJc7tgBNL0cYlWSYVkz4G/fslNfRPW5mYAM49f4fhtxPb5ok4Q2Lg9dPKVHO/Bgeu5woMc7RY0p1ej6D4CKFE6lymSDJpW0YHX/wqE9+cfEauh7xZcG0q9t2ta6F6fmX0agvpFyZo8aFbXeUBr7osSCJNgvavWbM/06niWrOvYX2xwWdhXmXSrbX8ZbabVohBK41 phodgson@thoughtworks.com" 610 } 611 612 resource "aws_iam_policy_attachment" "test-attach" { 613 name = "test-attachment" 614 roles = ["${aws_iam_role.test-role.name}"] 615 policy_arn = "arn:aws:iam::aws:policy/service-role/AmazonEC2SpotFleetRole" 616 } 617 618 resource "aws_iam_role" "test-role" { 619 name = "test-role-%s" 620 assume_role_policy = <<EOF 621 { 622 "Version": "2012-10-17", 623 "Statement": [ 624 { 625 "Sid": "", 626 "Effect": "Allow", 627 "Principal": { 628 "Service": "spotfleet.amazonaws.com" 629 }, 630 "Action": "sts:AssumeRole" 631 } 632 ] 633 } 634 EOF 635 } 636 637 resource "aws_spot_fleet_request" "foo" { 638 iam_fleet_role = "${aws_iam_role.test-role.arn}" 639 spot_price = "0.005" 640 target_capacity = 2 641 valid_until = "2019-11-04T20:44:20Z" 642 terminate_instances_with_expiration = true 643 launch_specification { 644 instance_type = "m1.small" 645 ami = "ami-d06a90b0" 646 key_name = "${aws_key_pair.debugging.key_name}" 647 availability_zone = "us-west-2a" 648 } 649 launch_specification { 650 instance_type = "m3.large" 651 ami = "ami-d06a90b0" 652 key_name = "${aws_key_pair.debugging.key_name}" 653 availability_zone = "us-west-2a" 654 } 655 depends_on = ["aws_iam_policy_attachment.test-attach"] 656 } 657 `, rName, rName) 658 } 659 660 func testAccAWSSpotFleetRequestConfigMultipleInstanceTypesinSameSubnet(rName string) string { 661 return fmt.Sprintf(` 662 resource "aws_key_pair" "debugging" { 663 key_name = "tmp-key-%s" 664 public_key = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD3F6tyPEFEzV0LX3X8BsXdMsQz1x2cEikKDEY0aIj41qgxMCP/iteneqXSIFZBp5vizPvaoIR3Um9xK7PGoW8giupGn+EPuxIA4cDM4vzOqOkiMPhz5XK0whEjkVzTo4+S0puvDZuwIsdiW9mxhJc7tgBNL0cYlWSYVkz4G/fslNfRPW5mYAM49f4fhtxPb5ok4Q2Lg9dPKVHO/Bgeu5woMc7RY0p1ej6D4CKFE6lymSDJpW0YHX/wqE9+cfEauh7xZcG0q9t2ta6F6fmX0agvpFyZo8aFbXeUBr7osSCJNgvavWbM/06niWrOvYX2xwWdhXmXSrbX8ZbabVohBK41 phodgson@thoughtworks.com" 665 } 666 667 resource "aws_iam_policy_attachment" "test-attach" { 668 name = "test-attachment" 669 roles = ["${aws_iam_role.test-role.name}"] 670 policy_arn = "arn:aws:iam::aws:policy/service-role/AmazonEC2SpotFleetRole" 671 } 672 673 resource "aws_iam_role" "test-role" { 674 name = "test-role-%s" 675 assume_role_policy = <<EOF 676 { 677 "Version": "2012-10-17", 678 "Statement": [ 679 { 680 "Sid": "", 681 "Effect": "Allow", 682 "Principal": { 683 "Service": "spotfleet.amazonaws.com" 684 }, 685 "Action": "sts:AssumeRole" 686 } 687 ] 688 } 689 EOF 690 } 691 692 resource "aws_vpc" "foo" { 693 cidr_block = "10.1.0.0/16" 694 } 695 696 resource "aws_subnet" "foo" { 697 cidr_block = "10.1.1.0/24" 698 vpc_id = "${aws_vpc.foo.id}" 699 availability_zone = "us-west-2a" 700 } 701 702 resource "aws_spot_fleet_request" "foo" { 703 iam_fleet_role = "${aws_iam_role.test-role.arn}" 704 spot_price = "0.005" 705 target_capacity = 4 706 valid_until = "2019-11-04T20:44:20Z" 707 terminate_instances_with_expiration = true 708 launch_specification { 709 instance_type = "m3.large" 710 ami = "ami-d0f506b0" 711 key_name = "${aws_key_pair.debugging.key_name}" 712 subnet_id = "${aws_subnet.foo.id}" 713 } 714 launch_specification { 715 instance_type = "r3.large" 716 ami = "ami-d0f506b0" 717 key_name = "${aws_key_pair.debugging.key_name}" 718 subnet_id = "${aws_subnet.foo.id}" 719 } 720 depends_on = ["aws_iam_policy_attachment.test-attach"] 721 } 722 `, rName, rName) 723 } 724 725 func testAccAWSSpotFleetRequestConfigOverridingSpotPrice(rName string) string { 726 return fmt.Sprintf(` 727 resource "aws_key_pair" "debugging" { 728 key_name = "tmp-key-%s" 729 public_key = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD3F6tyPEFEzV0LX3X8BsXdMsQz1x2cEikKDEY0aIj41qgxMCP/iteneqXSIFZBp5vizPvaoIR3Um9xK7PGoW8giupGn+EPuxIA4cDM4vzOqOkiMPhz5XK0whEjkVzTo4+S0puvDZuwIsdiW9mxhJc7tgBNL0cYlWSYVkz4G/fslNfRPW5mYAM49f4fhtxPb5ok4Q2Lg9dPKVHO/Bgeu5woMc7RY0p1ej6D4CKFE6lymSDJpW0YHX/wqE9+cfEauh7xZcG0q9t2ta6F6fmX0agvpFyZo8aFbXeUBr7osSCJNgvavWbM/06niWrOvYX2xwWdhXmXSrbX8ZbabVohBK41 phodgson@thoughtworks.com" 730 } 731 732 resource "aws_iam_policy_attachment" "test-attach" { 733 name = "test-attachment" 734 roles = ["${aws_iam_role.test-role.name}"] 735 policy_arn = "arn:aws:iam::aws:policy/service-role/AmazonEC2SpotFleetRole" 736 } 737 738 resource "aws_iam_role" "test-role" { 739 name = "test-role-%s" 740 assume_role_policy = <<EOF 741 { 742 "Version": "2012-10-17", 743 "Statement": [ 744 { 745 "Sid": "", 746 "Effect": "Allow", 747 "Principal": { 748 "Service": "spotfleet.amazonaws.com" 749 }, 750 "Action": "sts:AssumeRole" 751 } 752 ] 753 } 754 EOF 755 } 756 757 resource "aws_spot_fleet_request" "foo" { 758 iam_fleet_role = "${aws_iam_role.test-role.arn}" 759 spot_price = "0.005" 760 target_capacity = 2 761 valid_until = "2019-11-04T20:44:20Z" 762 terminate_instances_with_expiration = true 763 launch_specification { 764 instance_type = "m1.small" 765 ami = "ami-d06a90b0" 766 key_name = "${aws_key_pair.debugging.key_name}" 767 availability_zone = "us-west-2a" 768 } 769 launch_specification { 770 instance_type = "m3.large" 771 ami = "ami-d06a90b0" 772 key_name = "${aws_key_pair.debugging.key_name}" 773 availability_zone = "us-west-2a" 774 spot_price = "0.01" 775 } 776 depends_on = ["aws_iam_policy_attachment.test-attach"] 777 } 778 `, rName, rName) 779 } 780 781 func testAccAWSSpotFleetRequestConfigDiversifiedAllocation(rName string) string { 782 return fmt.Sprintf(` 783 resource "aws_key_pair" "debugging" { 784 key_name = "tmp-key-%s" 785 public_key = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD3F6tyPEFEzV0LX3X8BsXdMsQz1x2cEikKDEY0aIj41qgxMCP/iteneqXSIFZBp5vizPvaoIR3Um9xK7PGoW8giupGn+EPuxIA4cDM4vzOqOkiMPhz5XK0whEjkVzTo4+S0puvDZuwIsdiW9mxhJc7tgBNL0cYlWSYVkz4G/fslNfRPW5mYAM49f4fhtxPb5ok4Q2Lg9dPKVHO/Bgeu5woMc7RY0p1ej6D4CKFE6lymSDJpW0YHX/wqE9+cfEauh7xZcG0q9t2ta6F6fmX0agvpFyZo8aFbXeUBr7osSCJNgvavWbM/06niWrOvYX2xwWdhXmXSrbX8ZbabVohBK41 phodgson@thoughtworks.com" 786 } 787 788 resource "aws_iam_policy_attachment" "test-attach" { 789 name = "test-attachment" 790 roles = ["${aws_iam_role.test-role.name}"] 791 policy_arn = "arn:aws:iam::aws:policy/service-role/AmazonEC2SpotFleetRole" 792 } 793 794 resource "aws_iam_role" "test-role" { 795 name = "test-role-%s" 796 assume_role_policy = <<EOF 797 { 798 "Version": "2012-10-17", 799 "Statement": [ 800 { 801 "Sid": "", 802 "Effect": "Allow", 803 "Principal": { 804 "Service": "spotfleet.amazonaws.com" 805 }, 806 "Action": "sts:AssumeRole" 807 } 808 ] 809 } 810 EOF 811 } 812 813 resource "aws_spot_fleet_request" "foo" { 814 iam_fleet_role = "${aws_iam_role.test-role.arn}" 815 spot_price = "0.7" 816 target_capacity = 30 817 valid_until = "2019-11-04T20:44:20Z" 818 allocation_strategy = "diversified" 819 terminate_instances_with_expiration = true 820 launch_specification { 821 instance_type = "m1.small" 822 ami = "ami-d06a90b0" 823 key_name = "${aws_key_pair.debugging.key_name}" 824 availability_zone = "us-west-2a" 825 } 826 launch_specification { 827 instance_type = "m3.large" 828 ami = "ami-d06a90b0" 829 key_name = "${aws_key_pair.debugging.key_name}" 830 availability_zone = "us-west-2a" 831 } 832 launch_specification { 833 instance_type = "r3.large" 834 ami = "ami-d06a90b0" 835 key_name = "${aws_key_pair.debugging.key_name}" 836 availability_zone = "us-west-2a" 837 } 838 depends_on = ["aws_iam_policy_attachment.test-attach"] 839 } 840 `, rName, rName) 841 } 842 843 func testAccAWSSpotFleetRequestConfigWithWeightedCapacity(rName string) string { 844 return fmt.Sprintf(` 845 resource "aws_key_pair" "debugging" { 846 key_name = "tmp-key-%s" 847 public_key = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD3F6tyPEFEzV0LX3X8BsXdMsQz1x2cEikKDEY0aIj41qgxMCP/iteneqXSIFZBp5vizPvaoIR3Um9xK7PGoW8giupGn+EPuxIA4cDM4vzOqOkiMPhz5XK0whEjkVzTo4+S0puvDZuwIsdiW9mxhJc7tgBNL0cYlWSYVkz4G/fslNfRPW5mYAM49f4fhtxPb5ok4Q2Lg9dPKVHO/Bgeu5woMc7RY0p1ej6D4CKFE6lymSDJpW0YHX/wqE9+cfEauh7xZcG0q9t2ta6F6fmX0agvpFyZo8aFbXeUBr7osSCJNgvavWbM/06niWrOvYX2xwWdhXmXSrbX8ZbabVohBK41 phodgson@thoughtworks.com" 848 } 849 850 resource "aws_iam_policy_attachment" "test-attach" { 851 name = "test-attachment" 852 roles = ["${aws_iam_role.test-role.name}"] 853 policy_arn = "arn:aws:iam::aws:policy/service-role/AmazonEC2SpotFleetRole" 854 } 855 856 resource "aws_iam_role" "test-role" { 857 name = "test-role-%s" 858 assume_role_policy = <<EOF 859 { 860 "Version": "2012-10-17", 861 "Statement": [ 862 { 863 "Sid": "", 864 "Effect": "Allow", 865 "Principal": { 866 "Service": "spotfleet.amazonaws.com" 867 }, 868 "Action": "sts:AssumeRole" 869 } 870 ] 871 } 872 EOF 873 } 874 875 resource "aws_spot_fleet_request" "foo" { 876 iam_fleet_role = "${aws_iam_role.test-role.arn}" 877 spot_price = "0.7" 878 target_capacity = 10 879 valid_until = "2019-11-04T20:44:20Z" 880 terminate_instances_with_expiration = true 881 launch_specification { 882 instance_type = "m3.large" 883 ami = "ami-d06a90b0" 884 key_name = "${aws_key_pair.debugging.key_name}" 885 availability_zone = "us-west-2a" 886 weighted_capacity = "6" 887 } 888 launch_specification { 889 instance_type = "r3.large" 890 ami = "ami-d06a90b0" 891 key_name = "${aws_key_pair.debugging.key_name}" 892 availability_zone = "us-west-2a" 893 weighted_capacity = "3" 894 } 895 depends_on = ["aws_iam_policy_attachment.test-attach"] 896 } 897 `, rName, rName) 898 }