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  }