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 }