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 }