github.com/articulate/terraform@v0.6.13-0.20160303003731-8d31c93862de/builtin/providers/aws/resource_aws_lambda_function_test.go (about)

     1  package aws
     2  
     3  import (
     4  	"fmt"
     5  	"strings"
     6  	"testing"
     7  
     8  	"github.com/aws/aws-sdk-go/aws"
     9  	"github.com/aws/aws-sdk-go/service/lambda"
    10  	"github.com/hashicorp/terraform/helper/acctest"
    11  	"github.com/hashicorp/terraform/helper/resource"
    12  	"github.com/hashicorp/terraform/terraform"
    13  )
    14  
    15  func TestAccAWSLambdaFunction_basic(t *testing.T) {
    16  	var conf lambda.GetFunctionOutput
    17  
    18  	resource.Test(t, resource.TestCase{
    19  		PreCheck:     func() { testAccPreCheck(t) },
    20  		Providers:    testAccProviders,
    21  		CheckDestroy: testAccCheckLambdaFunctionDestroy,
    22  		Steps: []resource.TestStep{
    23  			resource.TestStep{
    24  				Config: testAccAWSLambdaConfigBasic,
    25  				Check: resource.ComposeTestCheckFunc(
    26  					testAccCheckAwsLambdaFunctionExists("aws_lambda_function.lambda_function_test", "example_lambda_name", &conf),
    27  					testAccCheckAwsLambdaFunctionName(&conf, "example_lambda_name"),
    28  					testAccCheckAwsLambdaFunctionArnHasSuffix(&conf, ":example_lambda_name"),
    29  				),
    30  			},
    31  		},
    32  	})
    33  }
    34  
    35  func TestAccAWSLambdaFunction_VPC(t *testing.T) {
    36  	var conf lambda.GetFunctionOutput
    37  
    38  	resource.Test(t, resource.TestCase{
    39  		PreCheck:     func() { testAccPreCheck(t) },
    40  		Providers:    testAccProviders,
    41  		CheckDestroy: testAccCheckLambdaFunctionDestroy,
    42  		Steps: []resource.TestStep{
    43  			resource.TestStep{
    44  				Config: testAccAWSLambdaConfigWithVPC,
    45  				Check: resource.ComposeTestCheckFunc(
    46  					testAccCheckAwsLambdaFunctionExists("aws_lambda_function.lambda_function_test", "example_lambda_name", &conf),
    47  					testAccCheckAwsLambdaFunctionName(&conf, "example_lambda_name"),
    48  					testAccCheckAwsLambdaFunctionArnHasSuffix(&conf, ":example_lambda_name"),
    49  					testAccCheckAWSLambdaFunctionVersion(&conf, "$LATEST"),
    50  				),
    51  			},
    52  		},
    53  	})
    54  }
    55  
    56  func TestAccAWSLambdaFunction_s3(t *testing.T) {
    57  	var conf lambda.GetFunctionOutput
    58  
    59  	resource.Test(t, resource.TestCase{
    60  		PreCheck:     func() { testAccPreCheck(t) },
    61  		Providers:    testAccProviders,
    62  		CheckDestroy: testAccCheckLambdaFunctionDestroy,
    63  		Steps: []resource.TestStep{
    64  			resource.TestStep{
    65  				Config: testAccAWSLambdaConfigS3,
    66  				Check: resource.ComposeTestCheckFunc(
    67  					testAccCheckAwsLambdaFunctionExists("aws_lambda_function.lambda_function_s3test", "example_lambda_name_s3", &conf),
    68  					testAccCheckAwsLambdaFunctionName(&conf, "example_lambda_name_s3"),
    69  					testAccCheckAwsLambdaFunctionArnHasSuffix(&conf, ":example_lambda_name_s3"),
    70  					testAccCheckAWSLambdaFunctionVersion(&conf, "$LATEST"),
    71  				),
    72  			},
    73  		},
    74  	})
    75  }
    76  
    77  func testAccCheckLambdaFunctionDestroy(s *terraform.State) error {
    78  	conn := testAccProvider.Meta().(*AWSClient).lambdaconn
    79  
    80  	for _, rs := range s.RootModule().Resources {
    81  		if rs.Type != "aws_lambda_function" {
    82  			continue
    83  		}
    84  
    85  		_, err := conn.GetFunction(&lambda.GetFunctionInput{
    86  			FunctionName: aws.String(rs.Primary.ID),
    87  		})
    88  
    89  		if err == nil {
    90  			return fmt.Errorf("Lambda Function still exists")
    91  		}
    92  
    93  	}
    94  
    95  	return nil
    96  
    97  }
    98  
    99  func testAccCheckAwsLambdaFunctionExists(res, funcName string, function *lambda.GetFunctionOutput) resource.TestCheckFunc {
   100  	// Wait for IAM role
   101  	return func(s *terraform.State) error {
   102  		rs, ok := s.RootModule().Resources[res]
   103  		if !ok {
   104  			return fmt.Errorf("Lambda function not found: %s", res)
   105  		}
   106  
   107  		if rs.Primary.ID == "" {
   108  			return fmt.Errorf("Lambda function ID not set")
   109  		}
   110  
   111  		conn := testAccProvider.Meta().(*AWSClient).lambdaconn
   112  
   113  		params := &lambda.GetFunctionInput{
   114  			FunctionName: aws.String(funcName),
   115  		}
   116  
   117  		getFunction, err := conn.GetFunction(params)
   118  		if err != nil {
   119  			return err
   120  		}
   121  
   122  		*function = *getFunction
   123  
   124  		return nil
   125  	}
   126  }
   127  
   128  func testAccCheckAwsLambdaFunctionName(function *lambda.GetFunctionOutput, expectedName string) resource.TestCheckFunc {
   129  	return func(s *terraform.State) error {
   130  		c := function.Configuration
   131  		if *c.FunctionName != expectedName {
   132  			return fmt.Errorf("Expected function name %s, got %s", expectedName, *c.FunctionName)
   133  		}
   134  
   135  		return nil
   136  	}
   137  }
   138  
   139  func testAccCheckAWSLambdaFunctionVersion(function *lambda.GetFunctionOutput, expectedVersion string) resource.TestCheckFunc {
   140  	return func(s *terraform.State) error {
   141  		c := function.Configuration
   142  		if *c.Version != expectedVersion {
   143  			return fmt.Errorf("Expected version %s, got %s", expectedVersion, *c.Version)
   144  		}
   145  		return nil
   146  	}
   147  }
   148  
   149  func testAccCheckAwsLambdaFunctionArnHasSuffix(function *lambda.GetFunctionOutput, arnSuffix string) resource.TestCheckFunc {
   150  	return func(s *terraform.State) error {
   151  		c := function.Configuration
   152  		if !strings.HasSuffix(*c.FunctionArn, arnSuffix) {
   153  			return fmt.Errorf("Expected function ARN %s to have suffix %s", *c.FunctionArn, arnSuffix)
   154  		}
   155  
   156  		return nil
   157  	}
   158  }
   159  
   160  const baseAccAWSLambdaConfig = `
   161  resource "aws_iam_role_policy" "iam_policy_for_lambda" {
   162      name = "iam_policy_for_lambda"
   163      role = "${aws_iam_role.iam_for_lambda.id}"
   164      policy = <<EOF
   165  {
   166    "Version": "2012-10-17",
   167    "Statement": [
   168          {
   169              "Effect": "Allow",
   170              "Action": [
   171                  "logs:CreateLogGroup",
   172                  "logs:CreateLogStream",
   173                  "logs:PutLogEvents"
   174              ],
   175              "Resource": "arn:aws:logs:*:*:*"
   176          },
   177      {
   178        "Effect": "Allow",
   179        "Action": [
   180          "ec2:CreateNetworkInterface"
   181        ],
   182        "Resource": [
   183          "*"
   184        ]
   185      }
   186    ]
   187  }
   188  EOF
   189  }
   190  
   191  resource "aws_iam_role" "iam_for_lambda" {
   192      name = "iam_for_lambda"
   193      assume_role_policy = <<EOF
   194  {
   195    "Version": "2012-10-17",
   196    "Statement": [
   197      {
   198        "Action": "sts:AssumeRole",
   199        "Principal": {
   200          "Service": "lambda.amazonaws.com"
   201        },
   202        "Effect": "Allow",
   203        "Sid": ""
   204      }
   205    ]
   206  }
   207  EOF
   208  }
   209  
   210  resource "aws_vpc" "vpc_for_lambda" {
   211      cidr_block = "10.0.0.0/16"
   212  }
   213  
   214  resource "aws_subnet" "subnet_for_lambda" {
   215      vpc_id = "${aws_vpc.vpc_for_lambda.id}"
   216      cidr_block = "10.0.1.0/24"
   217  
   218      tags {
   219          Name = "lambda"
   220      }
   221  }
   222  
   223  resource "aws_security_group" "sg_for_lambda" {
   224    name = "sg_for_lambda"
   225    description = "Allow all inbound traffic for lambda test"
   226    vpc_id = "${aws_vpc.vpc_for_lambda.id}"
   227  
   228    ingress {
   229        from_port = 0
   230        to_port = 0
   231        protocol = "-1"
   232        cidr_blocks = ["0.0.0.0/0"]
   233    }
   234  
   235    egress {
   236        from_port = 0
   237        to_port = 0
   238        protocol = "-1"
   239        cidr_blocks = ["0.0.0.0/0"]
   240    }
   241  }
   242  
   243  `
   244  
   245  const testAccAWSLambdaConfigBasic = baseAccAWSLambdaConfig + `
   246  resource "aws_lambda_function" "lambda_function_test" {
   247      filename = "test-fixtures/lambdatest.zip"
   248      function_name = "example_lambda_name"
   249      role = "${aws_iam_role.iam_for_lambda.arn}"
   250      handler = "exports.example"
   251  }
   252  `
   253  
   254  const testAccAWSLambdaConfigWithVPC = baseAccAWSLambdaConfig + `
   255  resource "aws_lambda_function" "lambda_function_test" {
   256      filename = "test-fixtures/lambdatest.zip"
   257      function_name = "example_lambda_name"
   258      role = "${aws_iam_role.iam_for_lambda.arn}"
   259      handler = "exports.example"
   260  
   261      vpc_config = {
   262          subnet_ids = ["${aws_subnet.subnet_for_lambda.id}"]
   263          security_group_ids = ["${aws_security_group.sg_for_lambda.id}"]
   264      }
   265  }
   266  `
   267  
   268  var testAccAWSLambdaConfigS3 = fmt.Sprintf(`
   269  resource "aws_s3_bucket" "lambda_bucket" {
   270    bucket = "tf-test-bucket-%d"
   271  }
   272  
   273  resource "aws_s3_bucket_object" "lambda_code" {
   274    bucket = "${aws_s3_bucket.lambda_bucket.id}"
   275    key = "lambdatest.zip"
   276    source = "test-fixtures/lambdatest.zip"
   277  }
   278  
   279  resource "aws_iam_role" "iam_for_lambda" {
   280      name = "iam_for_lambda"
   281      assume_role_policy = <<EOF
   282  {
   283    "Version": "2012-10-17",
   284    "Statement": [
   285      {
   286        "Action": "sts:AssumeRole",
   287        "Principal": {
   288          "Service": "lambda.amazonaws.com"
   289        },
   290        "Effect": "Allow",
   291        "Sid": ""
   292      }
   293    ]
   294  }
   295  EOF
   296  }
   297  
   298  resource "aws_lambda_function" "lambda_function_s3test" {
   299      s3_bucket = "${aws_s3_bucket.lambda_bucket.id}"
   300      s3_key = "${aws_s3_bucket_object.lambda_code.id}"
   301      function_name = "example_lambda_name_s3"
   302      role = "${aws_iam_role.iam_for_lambda.arn}"
   303      handler = "exports.example"
   304  }
   305  `, acctest.RandInt())