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  }