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  `