github.com/jsoriano/terraform@v0.6.7-0.20151026070445-8b70867fdd95/builtin/providers/aws/resource_aws_opsworks_stack_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/iam"
     9  	"github.com/aws/aws-sdk-go/service/opsworks"
    10  	"github.com/hashicorp/terraform/helper/resource"
    11  	"github.com/hashicorp/terraform/terraform"
    12  )
    13  
    14  // These tests assume the existence of predefined Opsworks IAM roles named `aws-opsworks-ec2-role`
    15  // and `aws-opsworks-service-role`.
    16  
    17  ///////////////////////////////
    18  //// Tests for the No-VPC case
    19  ///////////////////////////////
    20  
    21  var testAccAwsOpsworksStackConfigNoVpcCreate = `
    22  resource "aws_opsworks_stack" "tf-acc" {
    23    name = "tf-opsworks-acc"
    24    region = "us-west-2"
    25    service_role_arn = "%s"
    26    default_instance_profile_arn = "%s"
    27    default_availability_zone = "us-west-2a"
    28    default_os = "Amazon Linux 2014.09"
    29    default_root_device_type = "ebs"
    30    custom_json = "{\"key\": \"value\"}"
    31    configuration_manager_version = "11.10"
    32    use_opsworks_security_groups = false
    33  }
    34  `
    35  var testAccAWSOpsworksStackConfigNoVpcUpdate = `
    36  resource "aws_opsworks_stack" "tf-acc" {
    37    name = "tf-opsworks-acc"
    38    region = "us-west-2"
    39    service_role_arn = "%s"
    40    default_instance_profile_arn = "%s"
    41    default_availability_zone = "us-west-2a"
    42    default_os = "Amazon Linux 2014.09"
    43    default_root_device_type = "ebs"
    44    custom_json = "{\"key\": \"value\"}"
    45    configuration_manager_version = "11.10"
    46    use_opsworks_security_groups = false
    47    use_custom_cookbooks = true
    48    manage_berkshelf = true
    49    custom_cookbooks_source {
    50      type = "git"
    51      revision = "master"
    52      url = "https://github.com/awslabs/opsworks-example-cookbooks.git"
    53    }
    54  }
    55  `
    56  
    57  func TestAccAwsOpsworksStackNoVpc(t *testing.T) {
    58  	opsiam := testAccAwsOpsworksStackIam{}
    59  	testAccAwsOpsworksStackPopulateIam(t, &opsiam)
    60  
    61  	resource.Test(t, resource.TestCase{
    62  		PreCheck:     func() { testAccPreCheck(t) },
    63  		Providers:    testAccProviders,
    64  		CheckDestroy: testAccCheckAwsOpsworksStackDestroy,
    65  		Steps: []resource.TestStep{
    66  			resource.TestStep{
    67  				Config: fmt.Sprintf(testAccAwsOpsworksStackConfigNoVpcCreate, opsiam.ServiceRoleArn, opsiam.InstanceProfileArn),
    68  				Check:  testAccAwsOpsworksStackCheckResourceAttrsCreate,
    69  			},
    70  			resource.TestStep{
    71  				Config: fmt.Sprintf(testAccAWSOpsworksStackConfigNoVpcUpdate, opsiam.ServiceRoleArn, opsiam.InstanceProfileArn),
    72  				Check:  testAccAwsOpsworksStackCheckResourceAttrsUpdate,
    73  			},
    74  		},
    75  	})
    76  }
    77  
    78  ////////////////////////////
    79  //// Tests for the VPC case
    80  ////////////////////////////
    81  
    82  var testAccAwsOpsworksStackConfigVpcCreate = `
    83  resource "aws_vpc" "tf-acc" {
    84    cidr_block = "10.3.5.0/24"
    85  }
    86  resource "aws_subnet" "tf-acc" {
    87    vpc_id = "${aws_vpc.tf-acc.id}"
    88    cidr_block = "${aws_vpc.tf-acc.cidr_block}"
    89    availability_zone = "us-west-2a"
    90  }
    91  resource "aws_opsworks_stack" "tf-acc" {
    92    name = "tf-opsworks-acc"
    93    region = "us-west-2"
    94    vpc_id = "${aws_vpc.tf-acc.id}"
    95    default_subnet_id = "${aws_subnet.tf-acc.id}"
    96    service_role_arn = "%s"
    97    default_instance_profile_arn = "%s"
    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  
   106  var testAccAWSOpsworksStackConfigVpcUpdate = `
   107  resource "aws_vpc" "tf-acc" {
   108    cidr_block = "10.3.5.0/24"
   109  }
   110  resource "aws_subnet" "tf-acc" {
   111    vpc_id = "${aws_vpc.tf-acc.id}"
   112    cidr_block = "${aws_vpc.tf-acc.cidr_block}"
   113    availability_zone = "us-west-2a"
   114  }
   115  resource "aws_opsworks_stack" "tf-acc" {
   116    name = "tf-opsworks-acc"
   117    region = "us-west-2"
   118    vpc_id = "${aws_vpc.tf-acc.id}"
   119    default_subnet_id = "${aws_subnet.tf-acc.id}"
   120    service_role_arn = "%s"
   121    default_instance_profile_arn = "%s"
   122    default_os = "Amazon Linux 2014.09"
   123    default_root_device_type = "ebs"
   124    custom_json = "{\"key\": \"value\"}"
   125    configuration_manager_version = "11.10"
   126    use_opsworks_security_groups = false
   127    use_custom_cookbooks = true
   128    manage_berkshelf = true
   129    custom_cookbooks_source {
   130      type = "git"
   131      revision = "master"
   132      url = "https://github.com/awslabs/opsworks-example-cookbooks.git"
   133    }
   134  }
   135  `
   136  
   137  func TestAccAwsOpsworksStackVpc(t *testing.T) {
   138  	opsiam := testAccAwsOpsworksStackIam{}
   139  	testAccAwsOpsworksStackPopulateIam(t, &opsiam)
   140  
   141  	resource.Test(t, resource.TestCase{
   142  		PreCheck:     func() { testAccPreCheck(t) },
   143  		Providers:    testAccProviders,
   144  		CheckDestroy: testAccCheckAwsOpsworksStackDestroy,
   145  		Steps: []resource.TestStep{
   146  			resource.TestStep{
   147  				Config: fmt.Sprintf(testAccAwsOpsworksStackConfigVpcCreate, opsiam.ServiceRoleArn, opsiam.InstanceProfileArn),
   148  				Check:  testAccAwsOpsworksStackCheckResourceAttrsCreate,
   149  			},
   150  			resource.TestStep{
   151  				Config: fmt.Sprintf(testAccAWSOpsworksStackConfigVpcUpdate, opsiam.ServiceRoleArn, opsiam.InstanceProfileArn),
   152  				Check: resource.ComposeTestCheckFunc(
   153  					testAccAwsOpsworksStackCheckResourceAttrsUpdate,
   154  					testAccAwsOpsworksCheckVpc,
   155  				),
   156  			},
   157  		},
   158  	})
   159  }
   160  
   161  ////////////////////////////
   162  //// Checkers and Utilities
   163  ////////////////////////////
   164  
   165  var testAccAwsOpsworksStackCheckResourceAttrsCreate = resource.ComposeTestCheckFunc(
   166  	resource.TestCheckResourceAttr(
   167  		"aws_opsworks_stack.tf-acc",
   168  		"name",
   169  		"tf-opsworks-acc",
   170  	),
   171  	resource.TestCheckResourceAttr(
   172  		"aws_opsworks_stack.tf-acc",
   173  		"default_availability_zone",
   174  		"us-west-2a",
   175  	),
   176  	resource.TestCheckResourceAttr(
   177  		"aws_opsworks_stack.tf-acc",
   178  		"default_os",
   179  		"Amazon Linux 2014.09",
   180  	),
   181  	resource.TestCheckResourceAttr(
   182  		"aws_opsworks_stack.tf-acc",
   183  		"default_root_device_type",
   184  		"ebs",
   185  	),
   186  	resource.TestCheckResourceAttr(
   187  		"aws_opsworks_stack.tf-acc",
   188  		"custom_json",
   189  		`{"key": "value"}`,
   190  	),
   191  	resource.TestCheckResourceAttr(
   192  		"aws_opsworks_stack.tf-acc",
   193  		"configuration_manager_version",
   194  		"11.10",
   195  	),
   196  	resource.TestCheckResourceAttr(
   197  		"aws_opsworks_stack.tf-acc",
   198  		"use_opsworks_security_groups",
   199  		"false",
   200  	),
   201  )
   202  
   203  var testAccAwsOpsworksStackCheckResourceAttrsUpdate = resource.ComposeTestCheckFunc(
   204  	resource.TestCheckResourceAttr(
   205  		"aws_opsworks_stack.tf-acc",
   206  		"name",
   207  		"tf-opsworks-acc",
   208  	),
   209  	resource.TestCheckResourceAttr(
   210  		"aws_opsworks_stack.tf-acc",
   211  		"default_availability_zone",
   212  		"us-west-2a",
   213  	),
   214  	resource.TestCheckResourceAttr(
   215  		"aws_opsworks_stack.tf-acc",
   216  		"default_os",
   217  		"Amazon Linux 2014.09",
   218  	),
   219  	resource.TestCheckResourceAttr(
   220  		"aws_opsworks_stack.tf-acc",
   221  		"default_root_device_type",
   222  		"ebs",
   223  	),
   224  	resource.TestCheckResourceAttr(
   225  		"aws_opsworks_stack.tf-acc",
   226  		"custom_json",
   227  		`{"key": "value"}`,
   228  	),
   229  	resource.TestCheckResourceAttr(
   230  		"aws_opsworks_stack.tf-acc",
   231  		"configuration_manager_version",
   232  		"11.10",
   233  	),
   234  	resource.TestCheckResourceAttr(
   235  		"aws_opsworks_stack.tf-acc",
   236  		"use_opsworks_security_groups",
   237  		"false",
   238  	),
   239  	resource.TestCheckResourceAttr(
   240  		"aws_opsworks_stack.tf-acc",
   241  		"use_custom_cookbooks",
   242  		"true",
   243  	),
   244  	resource.TestCheckResourceAttr(
   245  		"aws_opsworks_stack.tf-acc",
   246  		"manage_berkshelf",
   247  		"true",
   248  	),
   249  	resource.TestCheckResourceAttr(
   250  		"aws_opsworks_stack.tf-acc",
   251  		"custom_cookbooks_source.0.type",
   252  		"git",
   253  	),
   254  	resource.TestCheckResourceAttr(
   255  		"aws_opsworks_stack.tf-acc",
   256  		"custom_cookbooks_source.0.revision",
   257  		"master",
   258  	),
   259  	resource.TestCheckResourceAttr(
   260  		"aws_opsworks_stack.tf-acc",
   261  		"custom_cookbooks_source.0.url",
   262  		"https://github.com/awslabs/opsworks-example-cookbooks.git",
   263  	),
   264  )
   265  
   266  func testAccAwsOpsworksCheckVpc(s *terraform.State) error {
   267  	rs, ok := s.RootModule().Resources["aws_opsworks_stack.tf-acc"]
   268  	if !ok {
   269  		return fmt.Errorf("Not found: %s", "aws_opsworks_stack.tf-acc")
   270  	}
   271  	if rs.Primary.ID == "" {
   272  		return fmt.Errorf("No ID is set")
   273  	}
   274  
   275  	p := rs.Primary
   276  
   277  	opsworksconn := testAccProvider.Meta().(*AWSClient).opsworksconn
   278  	describeOpts := &opsworks.DescribeStacksInput{
   279  		StackIds: []*string{aws.String(p.ID)},
   280  	}
   281  	resp, err := opsworksconn.DescribeStacks(describeOpts)
   282  	if err != nil {
   283  		return err
   284  	}
   285  	if len(resp.Stacks) == 0 {
   286  		return fmt.Errorf("No stack %s not found", p.ID)
   287  	}
   288  	if p.Attributes["vpc_id"] != *resp.Stacks[0].VpcId {
   289  		return fmt.Errorf("VPCID Got %s, expected %s", *resp.Stacks[0].VpcId, p.Attributes["vpc_id"])
   290  	}
   291  	if p.Attributes["default_subnet_id"] != *resp.Stacks[0].DefaultSubnetId {
   292  		return fmt.Errorf("VPCID Got %s, expected %s", *resp.Stacks[0].DefaultSubnetId, p.Attributes["default_subnet_id"])
   293  	}
   294  	return nil
   295  }
   296  
   297  func testAccCheckAwsOpsworksStackDestroy(s *terraform.State) error {
   298  	if len(s.RootModule().Resources) > 0 {
   299  		return fmt.Errorf("Expected all resources to be gone, but found: %#v", s.RootModule().Resources)
   300  	}
   301  
   302  	return nil
   303  }
   304  
   305  // Holds the two IAM object ARNs used in stack objects we'll create.
   306  type testAccAwsOpsworksStackIam struct {
   307  	ServiceRoleArn     string
   308  	InstanceProfileArn string
   309  }
   310  
   311  func testAccAwsOpsworksStackPopulateIam(t *testing.T, opsiam *testAccAwsOpsworksStackIam) {
   312  	resource.Test(t, resource.TestCase{
   313  		PreCheck:  func() { testAccPreCheck(t) },
   314  		Providers: testAccProviders,
   315  		Steps: []resource.TestStep{
   316  			resource.TestStep{
   317  				Config: testAccInstanceConfig_pre, // noop
   318  				Check:  testAccCheckAwsOpsworksEnsureIam(t, opsiam),
   319  			},
   320  		},
   321  	})
   322  }
   323  
   324  func testAccCheckAwsOpsworksEnsureIam(t *testing.T, opsiam *testAccAwsOpsworksStackIam) func(*terraform.State) error {
   325  	return func(_ *terraform.State) error {
   326  		iamconn := testAccProvider.Meta().(*AWSClient).iamconn
   327  
   328  		serviceRoleOpts := &iam.GetRoleInput{
   329  			RoleName: aws.String("aws-opsworks-service-role"),
   330  		}
   331  		respServiceRole, err := iamconn.GetRole(serviceRoleOpts)
   332  		if err != nil {
   333  			return err
   334  		}
   335  
   336  		instanceProfileOpts := &iam.GetInstanceProfileInput{
   337  			InstanceProfileName: aws.String("aws-opsworks-ec2-role"),
   338  		}
   339  		respInstanceProfile, err := iamconn.GetInstanceProfile(instanceProfileOpts)
   340  		if err != nil {
   341  			return err
   342  		}
   343  
   344  		opsiam.ServiceRoleArn = *respServiceRole.Role.Arn
   345  		opsiam.InstanceProfileArn = *respInstanceProfile.InstanceProfile.Arn
   346  
   347  		t.Logf("[DEBUG] ServiceRoleARN for OpsWorks: %s", opsiam.ServiceRoleArn)
   348  		t.Logf("[DEBUG] Instance Profile ARN for OpsWorks: %s", opsiam.InstanceProfileArn)
   349  
   350  		return nil
   351  
   352  	}
   353  }