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  `