github.com/gabrielperezs/terraform@v0.7.0-rc2.0.20160715084931-f7da2612946f/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/resource" 11 "github.com/hashicorp/terraform/terraform" 12 ) 13 14 func TestAccAWSSpotFleetRequest_basic(t *testing.T) { 15 var sfr ec2.SpotFleetRequestConfig 16 17 resource.Test(t, resource.TestCase{ 18 PreCheck: func() { testAccPreCheck(t) }, 19 Providers: testAccProviders, 20 CheckDestroy: testAccCheckAWSSpotFleetRequestDestroy, 21 Steps: []resource.TestStep{ 22 resource.TestStep{ 23 Config: testAccAWSSpotFleetRequestConfig, 24 Check: resource.ComposeTestCheckFunc( 25 testAccCheckAWSSpotFleetRequestExists( 26 "aws_spot_fleet_request.foo", &sfr), 27 testAccCheckAWSSpotFleetRequestAttributes(&sfr), 28 resource.TestCheckResourceAttr( 29 "aws_spot_fleet_request.foo", "spot_request_state", "active"), 30 ), 31 }, 32 }, 33 }) 34 } 35 36 func TestAccAWSSpotFleetRequest_launchConfiguration(t *testing.T) { 37 var sfr ec2.SpotFleetRequestConfig 38 39 resource.Test(t, resource.TestCase{ 40 PreCheck: func() { testAccPreCheck(t) }, 41 Providers: testAccProviders, 42 CheckDestroy: testAccCheckAWSSpotFleetRequestDestroy, 43 Steps: []resource.TestStep{ 44 resource.TestStep{ 45 Config: testAccAWSSpotFleetRequestWithAdvancedLaunchSpecConfig, 46 Check: resource.ComposeTestCheckFunc( 47 testAccCheckAWSSpotFleetRequestExists( 48 "aws_spot_fleet_request.foo", &sfr), 49 testAccCheckAWSSpotFleetRequest_LaunchSpecAttributes(&sfr), 50 resource.TestCheckResourceAttr( 51 "aws_spot_fleet_request.foo", "spot_request_state", "active"), 52 ), 53 }, 54 }, 55 }) 56 } 57 58 func TestAccAWSSpotFleetRequest_CannotUseEmptyKeyName(t *testing.T) { 59 _, errors := validateSpotFleetRequestKeyName("", "key_name") 60 if len(errors) == 0 { 61 t.Fatalf("Expected the key name to trigger a validation error") 62 } 63 } 64 65 func testAccCheckAWSSpotFleetRequestExists( 66 n string, sfr *ec2.SpotFleetRequestConfig) resource.TestCheckFunc { 67 return func(s *terraform.State) error { 68 rs, ok := s.RootModule().Resources[n] 69 if !ok { 70 return fmt.Errorf("Not found: %s", n) 71 } 72 73 if rs.Primary.ID == "" { 74 return fmt.Errorf("No Spot fleet request with that id exists") 75 } 76 77 conn := testAccProvider.Meta().(*AWSClient).ec2conn 78 79 params := &ec2.DescribeSpotFleetRequestsInput{ 80 SpotFleetRequestIds: []*string{&rs.Primary.ID}, 81 } 82 resp, err := conn.DescribeSpotFleetRequests(params) 83 84 if err != nil { 85 return err 86 } 87 88 if v := len(resp.SpotFleetRequestConfigs); v != 1 { 89 return fmt.Errorf("Expected 1 request returned, got %d", v) 90 } 91 92 *sfr = *resp.SpotFleetRequestConfigs[0] 93 94 return nil 95 } 96 } 97 98 func testAccCheckAWSSpotFleetRequestAttributes( 99 sfr *ec2.SpotFleetRequestConfig) resource.TestCheckFunc { 100 return func(s *terraform.State) error { 101 if *sfr.SpotFleetRequestConfig.SpotPrice != "0.005" { 102 return fmt.Errorf("Unexpected spot price: %s", *sfr.SpotFleetRequestConfig.SpotPrice) 103 } 104 if *sfr.SpotFleetRequestState != "active" { 105 return fmt.Errorf("Unexpected request state: %s", *sfr.SpotFleetRequestState) 106 } 107 return nil 108 } 109 } 110 111 func testAccCheckAWSSpotFleetRequest_LaunchSpecAttributes( 112 sfr *ec2.SpotFleetRequestConfig) resource.TestCheckFunc { 113 return func(s *terraform.State) error { 114 if len(sfr.SpotFleetRequestConfig.LaunchSpecifications) == 0 { 115 return fmt.Errorf("Missing launch specification") 116 } 117 118 spec := *sfr.SpotFleetRequestConfig.LaunchSpecifications[0] 119 120 if *spec.InstanceType != "m1.small" { 121 return fmt.Errorf("Unexpected launch specification instance type: %s", *spec.InstanceType) 122 } 123 124 if *spec.ImageId != "ami-d06a90b0" { 125 return fmt.Errorf("Unexpected launch specification image id: %s", *spec.ImageId) 126 } 127 128 if *spec.SpotPrice != "0.01" { 129 return fmt.Errorf("Unexpected launch specification spot price: %s", *spec.SpotPrice) 130 } 131 132 if *spec.WeightedCapacity != 2 { 133 return fmt.Errorf("Unexpected launch specification weighted capacity: %f", *spec.WeightedCapacity) 134 } 135 136 if *spec.UserData != base64.StdEncoding.EncodeToString([]byte("hello-world")) { 137 return fmt.Errorf("Unexpected launch specification user data: %s", *spec.UserData) 138 } 139 140 return nil 141 } 142 } 143 144 func testAccCheckAWSSpotFleetRequestDestroy(s *terraform.State) error { 145 conn := testAccProvider.Meta().(*AWSClient).ec2conn 146 147 for _, rs := range s.RootModule().Resources { 148 if rs.Type != "aws_spot_fleet_request" { 149 continue 150 } 151 152 _, err := conn.CancelSpotFleetRequests(&ec2.CancelSpotFleetRequestsInput{ 153 SpotFleetRequestIds: []*string{aws.String(rs.Primary.ID)}, 154 TerminateInstances: aws.Bool(true), 155 }) 156 157 if err != nil { 158 return fmt.Errorf("Error cancelling spot request (%s): %s", rs.Primary.ID, err) 159 } 160 } 161 162 return nil 163 } 164 165 const testAccAWSSpotFleetRequestConfig = ` 166 resource "aws_key_pair" "debugging" { 167 key_name = "tmp-key" 168 public_key = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD3F6tyPEFEzV0LX3X8BsXdMsQz1x2cEikKDEY0aIj41qgxMCP/iteneqXSIFZBp5vizPvaoIR3Um9xK7PGoW8giupGn+EPuxIA4cDM4vzOqOkiMPhz5XK0whEjkVzTo4+S0puvDZuwIsdiW9mxhJc7tgBNL0cYlWSYVkz4G/fslNfRPW5mYAM49f4fhtxPb5ok4Q2Lg9dPKVHO/Bgeu5woMc7RY0p1ej6D4CKFE6lymSDJpW0YHX/wqE9+cfEauh7xZcG0q9t2ta6F6fmX0agvpFyZo8aFbXeUBr7osSCJNgvavWbM/06niWrOvYX2xwWdhXmXSrbX8ZbabVohBK41 phodgson@thoughtworks.com" 169 } 170 171 resource "aws_iam_policy_attachment" "test-attach" { 172 name = "test-attachment" 173 roles = ["${aws_iam_role.test-role.name}"] 174 policy_arn = "arn:aws:iam::aws:policy/service-role/AmazonEC2SpotFleetRole" 175 } 176 177 resource "aws_iam_role" "test-role" { 178 name = "test-role" 179 assume_role_policy = <<EOF 180 { 181 "Version": "2012-10-17", 182 "Statement": [ 183 { 184 "Sid": "", 185 "Effect": "Allow", 186 "Principal": { 187 "Service": "spotfleet.amazonaws.com" 188 }, 189 "Action": "sts:AssumeRole" 190 } 191 ] 192 } 193 EOF 194 } 195 196 resource "aws_spot_fleet_request" "foo" { 197 iam_fleet_role = "${aws_iam_role.test-role.arn}" 198 spot_price = "0.005" 199 target_capacity = 2 200 valid_until = "2019-11-04T20:44:20Z" 201 launch_specification { 202 instance_type = "m1.small" 203 ami = "ami-d06a90b0" 204 key_name = "${aws_key_pair.debugging.key_name}" 205 availability_zone = "us-west-2a" 206 } 207 depends_on = ["aws_iam_policy_attachment.test-attach"] 208 } 209 ` 210 211 const testAccAWSSpotFleetRequestWithAdvancedLaunchSpecConfig = ` 212 resource "aws_key_pair" "debugging" { 213 key_name = "tmp-key" 214 public_key = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD3F6tyPEFEzV0LX3X8BsXdMsQz1x2cEikKDEY0aIj41qgxMCP/iteneqXSIFZBp5vizPvaoIR3Um9xK7PGoW8giupGn+EPuxIA4cDM4vzOqOkiMPhz5XK0whEjkVzTo4+S0puvDZuwIsdiW9mxhJc7tgBNL0cYlWSYVkz4G/fslNfRPW5mYAM49f4fhtxPb5ok4Q2Lg9dPKVHO/Bgeu5woMc7RY0p1ej6D4CKFE6lymSDJpW0YHX/wqE9+cfEauh7xZcG0q9t2ta6F6fmX0agvpFyZo8aFbXeUBr7osSCJNgvavWbM/06niWrOvYX2xwWdhXmXSrbX8ZbabVohBK41 phodgson@thoughtworks.com" 215 } 216 217 resource "aws_iam_policy_attachment" "test-attach" { 218 name = "test-attachment" 219 roles = ["${aws_iam_role.test-role.name}"] 220 policy_arn = "arn:aws:iam::aws:policy/service-role/AmazonEC2SpotFleetRole" 221 } 222 223 resource "aws_iam_role" "test-role" { 224 name = "test-role" 225 assume_role_policy = <<EOF 226 { 227 "Version": "2012-10-17", 228 "Statement": [ 229 { 230 "Sid": "", 231 "Effect": "Allow", 232 "Principal": { 233 "Service": "spotfleet.amazonaws.com" 234 }, 235 "Action": "sts:AssumeRole" 236 } 237 ] 238 } 239 EOF 240 } 241 242 resource "aws_spot_fleet_request" "foo" { 243 iam_fleet_role = "${aws_iam_role.test-role.arn}" 244 spot_price = "0.005" 245 target_capacity = 4 246 valid_until = "2019-11-04T20:44:20Z" 247 allocation_strategy = "diversified" 248 launch_specification { 249 instance_type = "m1.small" 250 ami = "ami-d06a90b0" 251 key_name = "${aws_key_pair.debugging.key_name}" 252 availability_zone = "us-west-2a" 253 spot_price = "0.01" 254 weighted_capacity = 2 255 user_data = "hello-world" 256 root_block_device { 257 volume_size = "300" 258 volume_type = "gp2" 259 } 260 } 261 depends_on = ["aws_iam_policy_attachment.test-attach"] 262 } 263 `