github.com/leeprovoost/terraform@v0.6.10-0.20160119085442-96f3f76118e7/builtin/providers/aws/resource_aws_opsworks_stack_test.go (about)

     1  package aws
     2  
     3  import (
     4  	"fmt"
     5  	"testing"
     6  
     7  	"github.com/hashicorp/terraform/helper/resource"
     8  	"github.com/hashicorp/terraform/terraform"
     9  
    10  	"github.com/aws/aws-sdk-go/aws"
    11  	"github.com/aws/aws-sdk-go/aws/awserr"
    12  	"github.com/aws/aws-sdk-go/service/opsworks"
    13  )
    14  
    15  //////////////////////////////////////////////////
    16  //// Helper configs for the necessary IAM objects
    17  //////////////////////////////////////////////////
    18  
    19  var testAccAwsOpsworksStackIamConfig = `
    20  resource "aws_iam_role" "opsworks_service" {
    21      name = "terraform_testacc_opsworks_service"
    22      assume_role_policy = <<EOT
    23  {
    24    "Version": "2008-10-17",
    25    "Statement": [
    26      {
    27        "Sid": "",
    28        "Effect": "Allow",
    29        "Principal": {
    30          "Service": "opsworks.amazonaws.com"
    31        },
    32        "Action": "sts:AssumeRole"
    33      }
    34    ]
    35  }
    36  EOT
    37  }
    38  
    39  resource "aws_iam_role_policy" "opsworks_service" {
    40      name = "terraform_testacc_opsworks_service"
    41      role = "${aws_iam_role.opsworks_service.id}"
    42      policy = <<EOT
    43  {
    44    "Statement": [
    45      {
    46        "Action": [
    47          "ec2:*",
    48          "iam:PassRole",
    49          "cloudwatch:GetMetricStatistics",
    50          "elasticloadbalancing:*",
    51          "rds:*"
    52        ],
    53        "Effect": "Allow",
    54        "Resource": ["*"]
    55      }
    56    ]
    57  }
    58  EOT
    59  }
    60  
    61  resource "aws_iam_role" "opsworks_instance" {
    62      name = "terraform_testacc_opsworks_instance"
    63      assume_role_policy = <<EOT
    64  {
    65    "Version": "2008-10-17",
    66    "Statement": [
    67      {
    68        "Sid": "",
    69        "Effect": "Allow",
    70        "Principal": {
    71          "Service": "ec2.amazonaws.com"
    72        },
    73        "Action": "sts:AssumeRole"
    74      }
    75    ]
    76  }
    77  EOT
    78  }
    79  
    80  resource "aws_iam_instance_profile" "opsworks_instance" {
    81      name = "terraform_testacc_opsworks_instance"
    82      roles = ["${aws_iam_role.opsworks_instance.name}"]
    83  }
    84  
    85  `
    86  
    87  ///////////////////////////////
    88  //// Tests for the No-VPC case
    89  ///////////////////////////////
    90  
    91  var testAccAwsOpsworksStackConfigNoVpcCreate = testAccAwsOpsworksStackIamConfig + `
    92  resource "aws_opsworks_stack" "tf-acc" {
    93    name = "tf-opsworks-acc"
    94    region = "us-east-1"
    95    service_role_arn = "${aws_iam_role.opsworks_service.arn}"
    96    default_instance_profile_arn = "${aws_iam_instance_profile.opsworks_instance.arn}"
    97    default_availability_zone = "us-east-1c"
    98    default_os = "Amazon Linux 2014.09"
    99    default_root_device_type = "ebs"
   100    custom_json = "{\"key\": \"value\"}"
   101    configuration_manager_version = "11.10"
   102    use_opsworks_security_groups = false
   103  }
   104  `
   105  var testAccAWSOpsworksStackConfigNoVpcUpdate = testAccAwsOpsworksStackIamConfig + `
   106  resource "aws_opsworks_stack" "tf-acc" {
   107    name = "tf-opsworks-acc"
   108    region = "us-east-1"
   109    service_role_arn = "${aws_iam_role.opsworks_service.arn}"
   110    default_instance_profile_arn = "${aws_iam_instance_profile.opsworks_instance.arn}"
   111    default_availability_zone = "us-east-1c"
   112    default_os = "Amazon Linux 2014.09"
   113    default_root_device_type = "ebs"
   114    custom_json = "{\"key\": \"value\"}"
   115    configuration_manager_version = "11.10"
   116    use_opsworks_security_groups = false
   117    use_custom_cookbooks = true
   118    manage_berkshelf = true
   119    custom_cookbooks_source {
   120      type = "git"
   121      revision = "master"
   122      url = "https://github.com/aws/opsworks-example-cookbooks.git"
   123    }
   124  }
   125  `
   126  
   127  func TestAccAWSOpsworksStackNoVpc(t *testing.T) {
   128  	resource.Test(t, resource.TestCase{
   129  		PreCheck:     func() { testAccPreCheck(t) },
   130  		Providers:    testAccProviders,
   131  		CheckDestroy: testAccCheckAwsOpsworksStackDestroy,
   132  		Steps: []resource.TestStep{
   133  			resource.TestStep{
   134  				Config: testAccAwsOpsworksStackConfigNoVpcCreate,
   135  				Check:  testAccAwsOpsworksStackCheckResourceAttrsCreate("us-east-1c"),
   136  			},
   137  			resource.TestStep{
   138  				Config: testAccAWSOpsworksStackConfigNoVpcUpdate,
   139  				Check:  testAccAwsOpsworksStackCheckResourceAttrsUpdate("us-east-1c"),
   140  			},
   141  		},
   142  	})
   143  }
   144  
   145  ////////////////////////////
   146  //// Tests for the VPC case
   147  ////////////////////////////
   148  
   149  var testAccAwsOpsworksStackConfigVpcCreate = testAccAwsOpsworksStackIamConfig + `
   150  resource "aws_vpc" "tf-acc" {
   151    cidr_block = "10.3.5.0/24"
   152  }
   153  resource "aws_subnet" "tf-acc" {
   154    vpc_id = "${aws_vpc.tf-acc.id}"
   155    cidr_block = "${aws_vpc.tf-acc.cidr_block}"
   156    availability_zone = "us-west-2a"
   157  }
   158  resource "aws_opsworks_stack" "tf-acc" {
   159    name = "tf-opsworks-acc"
   160    region = "us-west-2"
   161    vpc_id = "${aws_vpc.tf-acc.id}"
   162    default_subnet_id = "${aws_subnet.tf-acc.id}"
   163    service_role_arn = "${aws_iam_role.opsworks_service.arn}"
   164    default_instance_profile_arn = "${aws_iam_instance_profile.opsworks_instance.arn}"
   165    default_os = "Amazon Linux 2014.09"
   166    default_root_device_type = "ebs"
   167    custom_json = "{\"key\": \"value\"}"
   168    configuration_manager_version = "11.10"
   169    use_opsworks_security_groups = false
   170  }
   171  `
   172  
   173  var testAccAWSOpsworksStackConfigVpcUpdate = testAccAwsOpsworksStackIamConfig + `
   174  resource "aws_vpc" "tf-acc" {
   175    cidr_block = "10.3.5.0/24"
   176  }
   177  resource "aws_subnet" "tf-acc" {
   178    vpc_id = "${aws_vpc.tf-acc.id}"
   179    cidr_block = "${aws_vpc.tf-acc.cidr_block}"
   180    availability_zone = "us-west-2a"
   181  }
   182  resource "aws_opsworks_stack" "tf-acc" {
   183    name = "tf-opsworks-acc"
   184    region = "us-west-2"
   185    vpc_id = "${aws_vpc.tf-acc.id}"
   186    default_subnet_id = "${aws_subnet.tf-acc.id}"
   187    service_role_arn = "${aws_iam_role.opsworks_service.arn}"
   188    default_instance_profile_arn = "${aws_iam_instance_profile.opsworks_instance.arn}"
   189    default_os = "Amazon Linux 2014.09"
   190    default_root_device_type = "ebs"
   191    custom_json = "{\"key\": \"value\"}"
   192    configuration_manager_version = "11.10"
   193    use_opsworks_security_groups = false
   194    use_custom_cookbooks = true
   195    manage_berkshelf = true
   196    custom_cookbooks_source {
   197      type = "git"
   198      revision = "master"
   199      url = "https://github.com/aws/opsworks-example-cookbooks.git"
   200    }
   201  }
   202  `
   203  
   204  func TestAccAWSOpsworksStackVpc(t *testing.T) {
   205  	resource.Test(t, resource.TestCase{
   206  		PreCheck:     func() { testAccPreCheck(t) },
   207  		Providers:    testAccProviders,
   208  		CheckDestroy: testAccCheckAwsOpsworksStackDestroy,
   209  		Steps: []resource.TestStep{
   210  			resource.TestStep{
   211  				Config: testAccAwsOpsworksStackConfigVpcCreate,
   212  				Check:  testAccAwsOpsworksStackCheckResourceAttrsCreate("us-west-2a"),
   213  			},
   214  			resource.TestStep{
   215  				Config: testAccAWSOpsworksStackConfigVpcUpdate,
   216  				Check: resource.ComposeTestCheckFunc(
   217  					testAccAwsOpsworksStackCheckResourceAttrsUpdate("us-west-2a"),
   218  					testAccAwsOpsworksCheckVpc,
   219  				),
   220  			},
   221  		},
   222  	})
   223  }
   224  
   225  ////////////////////////////
   226  //// Checkers and Utilities
   227  ////////////////////////////
   228  
   229  func testAccAwsOpsworksStackCheckResourceAttrsCreate(zone string) resource.TestCheckFunc {
   230  	return resource.ComposeTestCheckFunc(
   231  		resource.TestCheckResourceAttr(
   232  			"aws_opsworks_stack.tf-acc",
   233  			"name",
   234  			"tf-opsworks-acc",
   235  		),
   236  		resource.TestCheckResourceAttr(
   237  			"aws_opsworks_stack.tf-acc",
   238  			"default_availability_zone",
   239  			zone,
   240  		),
   241  		resource.TestCheckResourceAttr(
   242  			"aws_opsworks_stack.tf-acc",
   243  			"default_os",
   244  			"Amazon Linux 2014.09",
   245  		),
   246  		resource.TestCheckResourceAttr(
   247  			"aws_opsworks_stack.tf-acc",
   248  			"default_root_device_type",
   249  			"ebs",
   250  		),
   251  		resource.TestCheckResourceAttr(
   252  			"aws_opsworks_stack.tf-acc",
   253  			"custom_json",
   254  			`{"key": "value"}`,
   255  		),
   256  		resource.TestCheckResourceAttr(
   257  			"aws_opsworks_stack.tf-acc",
   258  			"configuration_manager_version",
   259  			"11.10",
   260  		),
   261  		resource.TestCheckResourceAttr(
   262  			"aws_opsworks_stack.tf-acc",
   263  			"use_opsworks_security_groups",
   264  			"false",
   265  		),
   266  	)
   267  }
   268  
   269  func testAccAwsOpsworksStackCheckResourceAttrsUpdate(zone string) resource.TestCheckFunc {
   270  	return resource.ComposeTestCheckFunc(
   271  		resource.TestCheckResourceAttr(
   272  			"aws_opsworks_stack.tf-acc",
   273  			"name",
   274  			"tf-opsworks-acc",
   275  		),
   276  		resource.TestCheckResourceAttr(
   277  			"aws_opsworks_stack.tf-acc",
   278  			"default_availability_zone",
   279  			zone,
   280  		),
   281  		resource.TestCheckResourceAttr(
   282  			"aws_opsworks_stack.tf-acc",
   283  			"default_os",
   284  			"Amazon Linux 2014.09",
   285  		),
   286  		resource.TestCheckResourceAttr(
   287  			"aws_opsworks_stack.tf-acc",
   288  			"default_root_device_type",
   289  			"ebs",
   290  		),
   291  		resource.TestCheckResourceAttr(
   292  			"aws_opsworks_stack.tf-acc",
   293  			"custom_json",
   294  			`{"key": "value"}`,
   295  		),
   296  		resource.TestCheckResourceAttr(
   297  			"aws_opsworks_stack.tf-acc",
   298  			"configuration_manager_version",
   299  			"11.10",
   300  		),
   301  		resource.TestCheckResourceAttr(
   302  			"aws_opsworks_stack.tf-acc",
   303  			"use_opsworks_security_groups",
   304  			"false",
   305  		),
   306  		resource.TestCheckResourceAttr(
   307  			"aws_opsworks_stack.tf-acc",
   308  			"use_custom_cookbooks",
   309  			"true",
   310  		),
   311  		resource.TestCheckResourceAttr(
   312  			"aws_opsworks_stack.tf-acc",
   313  			"manage_berkshelf",
   314  			"true",
   315  		),
   316  		resource.TestCheckResourceAttr(
   317  			"aws_opsworks_stack.tf-acc",
   318  			"custom_cookbooks_source.0.type",
   319  			"git",
   320  		),
   321  		resource.TestCheckResourceAttr(
   322  			"aws_opsworks_stack.tf-acc",
   323  			"custom_cookbooks_source.0.revision",
   324  			"master",
   325  		),
   326  		resource.TestCheckResourceAttr(
   327  			"aws_opsworks_stack.tf-acc",
   328  			"custom_cookbooks_source.0.url",
   329  			"https://github.com/aws/opsworks-example-cookbooks.git",
   330  		),
   331  	)
   332  }
   333  
   334  func testAccAwsOpsworksCheckVpc(s *terraform.State) error {
   335  	rs, ok := s.RootModule().Resources["aws_opsworks_stack.tf-acc"]
   336  	if !ok {
   337  		return fmt.Errorf("Not found: %s", "aws_opsworks_stack.tf-acc")
   338  	}
   339  	if rs.Primary.ID == "" {
   340  		return fmt.Errorf("No ID is set")
   341  	}
   342  
   343  	p := rs.Primary
   344  
   345  	opsworksconn := testAccProvider.Meta().(*AWSClient).opsworksconn
   346  	describeOpts := &opsworks.DescribeStacksInput{
   347  		StackIds: []*string{aws.String(p.ID)},
   348  	}
   349  	resp, err := opsworksconn.DescribeStacks(describeOpts)
   350  	if err != nil {
   351  		return err
   352  	}
   353  	if len(resp.Stacks) == 0 {
   354  		return fmt.Errorf("No stack %s not found", p.ID)
   355  	}
   356  	if p.Attributes["vpc_id"] != *resp.Stacks[0].VpcId {
   357  		return fmt.Errorf("VPCID Got %s, expected %s", *resp.Stacks[0].VpcId, p.Attributes["vpc_id"])
   358  	}
   359  	if p.Attributes["default_subnet_id"] != *resp.Stacks[0].DefaultSubnetId {
   360  		return fmt.Errorf("VPCID Got %s, expected %s", *resp.Stacks[0].DefaultSubnetId, p.Attributes["default_subnet_id"])
   361  	}
   362  	return nil
   363  }
   364  
   365  func testAccCheckAwsOpsworksStackDestroy(s *terraform.State) error {
   366  	opsworksconn := testAccProvider.Meta().(*AWSClient).opsworksconn
   367  	for _, rs := range s.RootModule().Resources {
   368  		if rs.Type != "aws_opsworks_stack" {
   369  			continue
   370  		}
   371  
   372  		req := &opsworks.DescribeStacksInput{
   373  			StackIds: []*string{
   374  				aws.String(rs.Primary.ID),
   375  			},
   376  		}
   377  
   378  		_, err := opsworksconn.DescribeStacks(req)
   379  		if err != nil {
   380  			if awserr, ok := err.(awserr.Error); ok {
   381  				if awserr.Code() == "ResourceNotFoundException" {
   382  					// not found, all good
   383  					return nil
   384  				}
   385  			}
   386  			return err
   387  		}
   388  	}
   389  	return fmt.Errorf("Fall through error for OpsWorks stack test")
   390  }