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