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 }