github.com/joshgarnett/terraform@v0.5.4-0.20160219181435-92dc20bb3594/builtin/providers/aws/resource_aws_lambda_function_test.go (about)

     1  package aws
     2  
     3  import (
     4  	"fmt"
     5  	"testing"
     6  
     7  	"github.com/aws/aws-sdk-go/aws"
     8  	"github.com/aws/aws-sdk-go/service/lambda"
     9  	"github.com/hashicorp/terraform/helper/resource"
    10  	"github.com/hashicorp/terraform/terraform"
    11  )
    12  
    13  func TestAccAWSLambdaFunction_basic(t *testing.T) {
    14  	var conf lambda.GetFunctionOutput
    15  
    16  	resource.Test(t, resource.TestCase{
    17  		PreCheck:     func() { testAccPreCheck(t) },
    18  		Providers:    testAccProviders,
    19  		CheckDestroy: testAccCheckLambdaFunctionDestroy,
    20  		Steps: []resource.TestStep{
    21  			resource.TestStep{
    22  				Config: testAccAWSLambdaConfig,
    23  				Check: resource.ComposeTestCheckFunc(
    24  					testAccCheckAwsLambdaFunctionExists("aws_lambda_function.lambda_function_test", &conf),
    25  					testAccCheckAWSLambdaAttributes(&conf),
    26  				),
    27  			},
    28  		},
    29  	})
    30  }
    31  
    32  func testAccCheckLambdaFunctionDestroy(s *terraform.State) error {
    33  	conn := testAccProvider.Meta().(*AWSClient).lambdaconn
    34  
    35  	for _, rs := range s.RootModule().Resources {
    36  		if rs.Type != "aws_lambda_function" {
    37  			continue
    38  		}
    39  
    40  		_, err := conn.GetFunction(&lambda.GetFunctionInput{
    41  			FunctionName: aws.String(rs.Primary.ID),
    42  		})
    43  
    44  		if err == nil {
    45  			return fmt.Errorf("Lambda Function still exists")
    46  		}
    47  
    48  	}
    49  
    50  	return nil
    51  
    52  }
    53  
    54  func testAccCheckAwsLambdaFunctionExists(n string, function *lambda.GetFunctionOutput) resource.TestCheckFunc {
    55  	// Wait for IAM role
    56  	return func(s *terraform.State) error {
    57  		rs, ok := s.RootModule().Resources[n]
    58  		if !ok {
    59  			return fmt.Errorf("Lambda function not found: %s", n)
    60  		}
    61  
    62  		if rs.Primary.ID == "" {
    63  			return fmt.Errorf("Lambda function ID not set")
    64  		}
    65  
    66  		conn := testAccProvider.Meta().(*AWSClient).lambdaconn
    67  
    68  		params := &lambda.GetFunctionInput{
    69  			FunctionName: aws.String("example_lambda_name"),
    70  		}
    71  
    72  		getFunction, err := conn.GetFunction(params)
    73  		if err != nil {
    74  			return err
    75  		}
    76  
    77  		*function = *getFunction
    78  
    79  		return nil
    80  	}
    81  }
    82  
    83  func testAccCheckAWSLambdaAttributes(function *lambda.GetFunctionOutput) resource.TestCheckFunc {
    84  	return func(s *terraform.State) error {
    85  		c := function.Configuration
    86  		const expectedName = "example_lambda_name"
    87  		if *c.FunctionName != expectedName {
    88  			return fmt.Errorf("Expected function name %s, got %s", expectedName, *c.FunctionName)
    89  		}
    90  
    91  		if *c.FunctionArn == "" {
    92  			return fmt.Errorf("Could not read Lambda Function's ARN")
    93  		}
    94  
    95  		return nil
    96  	}
    97  }
    98  
    99  const testAccAWSLambdaConfig = `
   100  resource "aws_iam_role_policy" "iam_policy_for_lambda" {
   101      name = "iam_policy_for_lambda"
   102      role = "${aws_iam_role.iam_for_lambda.id}"
   103      policy = <<EOF
   104  {
   105    "Version": "2012-10-17",
   106    "Statement": [
   107          {
   108              "Effect": "Allow",
   109              "Action": [
   110                  "logs:CreateLogGroup",
   111                  "logs:CreateLogStream",
   112                  "logs:PutLogEvents"
   113              ],
   114              "Resource": "arn:aws:logs:*:*:*"
   115          },
   116      {
   117        "Effect": "Allow",
   118        "Action": [
   119          "ec2:CreateNetworkInterface"
   120        ],
   121        "Resource": [
   122          "*"
   123        ]
   124      }
   125    ]
   126  }
   127  EOF
   128  }
   129  
   130  resource "aws_iam_role" "iam_for_lambda" {
   131      name = "iam_for_lambda"
   132      assume_role_policy = <<EOF
   133  {
   134    "Version": "2012-10-17",
   135    "Statement": [
   136      {
   137        "Action": "sts:AssumeRole",
   138        "Principal": {
   139          "Service": "lambda.amazonaws.com"
   140        },
   141        "Effect": "Allow",
   142        "Sid": ""
   143      }
   144    ]
   145  }
   146  EOF
   147  }
   148  
   149  resource "aws_vpc" "vpc_for_lambda" {
   150      cidr_block = "10.0.0.0/16"
   151  }
   152  
   153  resource "aws_subnet" "subnet_for_lambda" {
   154      vpc_id = "${aws_vpc.vpc_for_lambda.id}"
   155      cidr_block = "10.0.1.0/24"
   156  
   157      tags {
   158          Name = "lambda"
   159      }
   160  }
   161  
   162  resource "aws_security_group" "sg_for_lambda" {
   163    name = "sg_for_lambda"
   164    description = "Allow all inbound traffic for lambda test"
   165    vpc_id = "${aws_vpc.vpc_for_lambda.id}"
   166  
   167    ingress {
   168        from_port = 0
   169        to_port = 0
   170        protocol = "-1"
   171        cidr_blocks = ["0.0.0.0/0"]
   172    }
   173  
   174    egress {
   175        from_port = 0
   176        to_port = 0
   177        protocol = "-1"
   178        cidr_blocks = ["0.0.0.0/0"]
   179    }
   180  }
   181  
   182  resource "aws_lambda_function" "lambda_function_test" {
   183      filename = "test-fixtures/lambdatest.zip"
   184      function_name = "example_lambda_name"
   185      role = "${aws_iam_role.iam_for_lambda.arn}"
   186      handler = "exports.example"
   187  
   188      vpc_config = {
   189          subnet_ids = ["${aws_subnet.subnet_for_lambda.id}"]
   190          security_group_ids = ["${aws_security_group.sg_for_lambda.id}"]
   191      }
   192  }
   193  `