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