github.com/ricardclau/terraform@v0.6.17-0.20160519222547-283e3ae6b5a9/builtin/providers/aws/resource_aws_rds_cluster_parameter_group_test.go (about) 1 package aws 2 3 import ( 4 "fmt" 5 "testing" 6 "time" 7 8 "github.com/aws/aws-sdk-go/aws" 9 "github.com/aws/aws-sdk-go/aws/awserr" 10 "github.com/aws/aws-sdk-go/service/rds" 11 "github.com/hashicorp/terraform/helper/resource" 12 "github.com/hashicorp/terraform/terraform" 13 ) 14 15 func TestAccAWSDBClusterParameterGroup_basic(t *testing.T) { 16 var v rds.DBClusterParameterGroup 17 18 resource.Test(t, resource.TestCase{ 19 PreCheck: func() { testAccPreCheck(t) }, 20 Providers: testAccProviders, 21 CheckDestroy: testAccCheckAWSDBClusterParameterGroupDestroy, 22 Steps: []resource.TestStep{ 23 resource.TestStep{ 24 Config: testAccAWSDBClusterParameterGroupConfig, 25 Check: resource.ComposeTestCheckFunc( 26 testAccCheckAWSDBClusterParameterGroupExists("aws_rds_cluster_parameter_group.bar", &v), 27 testAccCheckAWSDBClusterParameterGroupAttributes(&v), 28 resource.TestCheckResourceAttr( 29 "aws_rds_cluster_parameter_group.bar", "name", "cluster-parameter-group-test-terraform"), 30 resource.TestCheckResourceAttr( 31 "aws_rds_cluster_parameter_group.bar", "family", "aurora5.6"), 32 resource.TestCheckResourceAttr( 33 "aws_rds_cluster_parameter_group.bar", "description", "Test cluster parameter group for terraform"), 34 resource.TestCheckResourceAttr( 35 "aws_rds_cluster_parameter_group.bar", "parameter.1708034931.name", "character_set_results"), 36 resource.TestCheckResourceAttr( 37 "aws_rds_cluster_parameter_group.bar", "parameter.1708034931.value", "utf8"), 38 resource.TestCheckResourceAttr( 39 "aws_rds_cluster_parameter_group.bar", "parameter.2421266705.name", "character_set_server"), 40 resource.TestCheckResourceAttr( 41 "aws_rds_cluster_parameter_group.bar", "parameter.2421266705.value", "utf8"), 42 resource.TestCheckResourceAttr( 43 "aws_rds_cluster_parameter_group.bar", "parameter.2478663599.name", "character_set_client"), 44 resource.TestCheckResourceAttr( 45 "aws_rds_cluster_parameter_group.bar", "parameter.2478663599.value", "utf8"), 46 resource.TestCheckResourceAttr( 47 "aws_rds_cluster_parameter_group.bar", "tags.#", "1"), 48 ), 49 }, 50 resource.TestStep{ 51 Config: testAccAWSDBClusterParameterGroupAddParametersConfig, 52 Check: resource.ComposeTestCheckFunc( 53 testAccCheckAWSDBClusterParameterGroupExists("aws_rds_cluster_parameter_group.bar", &v), 54 testAccCheckAWSDBClusterParameterGroupAttributes(&v), 55 resource.TestCheckResourceAttr( 56 "aws_rds_cluster_parameter_group.bar", "name", "cluster-parameter-group-test-terraform"), 57 resource.TestCheckResourceAttr( 58 "aws_rds_cluster_parameter_group.bar", "family", "aurora5.6"), 59 resource.TestCheckResourceAttr( 60 "aws_rds_cluster_parameter_group.bar", "description", "Test cluster parameter group for terraform"), 61 resource.TestCheckResourceAttr( 62 "aws_rds_cluster_parameter_group.bar", "parameter.1706463059.name", "collation_connection"), 63 resource.TestCheckResourceAttr( 64 "aws_rds_cluster_parameter_group.bar", "parameter.1706463059.value", "utf8_unicode_ci"), 65 resource.TestCheckResourceAttr( 66 "aws_rds_cluster_parameter_group.bar", "parameter.1708034931.name", "character_set_results"), 67 resource.TestCheckResourceAttr( 68 "aws_rds_cluster_parameter_group.bar", "parameter.1708034931.value", "utf8"), 69 resource.TestCheckResourceAttr( 70 "aws_rds_cluster_parameter_group.bar", "parameter.2421266705.name", "character_set_server"), 71 resource.TestCheckResourceAttr( 72 "aws_rds_cluster_parameter_group.bar", "parameter.2421266705.value", "utf8"), 73 resource.TestCheckResourceAttr( 74 "aws_rds_cluster_parameter_group.bar", "parameter.2475805061.name", "collation_server"), 75 resource.TestCheckResourceAttr( 76 "aws_rds_cluster_parameter_group.bar", "parameter.2475805061.value", "utf8_unicode_ci"), 77 resource.TestCheckResourceAttr( 78 "aws_rds_cluster_parameter_group.bar", "parameter.2478663599.name", "character_set_client"), 79 resource.TestCheckResourceAttr( 80 "aws_rds_cluster_parameter_group.bar", "parameter.2478663599.value", "utf8"), 81 resource.TestCheckResourceAttr( 82 "aws_rds_cluster_parameter_group.bar", "tags.#", "2"), 83 ), 84 }, 85 }, 86 }) 87 } 88 89 func TestAccAWSDBClusterParameterGroup_disappears(t *testing.T) { 90 var v rds.DBClusterParameterGroup 91 92 resource.Test(t, resource.TestCase{ 93 PreCheck: func() { testAccPreCheck(t) }, 94 Providers: testAccProviders, 95 CheckDestroy: testAccCheckAWSDBClusterParameterGroupDestroy, 96 Steps: []resource.TestStep{ 97 resource.TestStep{ 98 Config: testAccAWSDBClusterParameterGroupConfig, 99 Check: resource.ComposeTestCheckFunc( 100 testAccCheckAWSDBClusterParameterGroupExists("aws_rds_cluster_parameter_group.bar", &v), 101 testAccAWSDBClusterParameterGroupDisappears(&v), 102 ), 103 ExpectNonEmptyPlan: true, 104 }, 105 }, 106 }) 107 } 108 109 func TestAccAWSDBClusterParameterGroupOnly(t *testing.T) { 110 var v rds.DBClusterParameterGroup 111 112 resource.Test(t, resource.TestCase{ 113 PreCheck: func() { testAccPreCheck(t) }, 114 Providers: testAccProviders, 115 CheckDestroy: testAccCheckAWSDBClusterParameterGroupDestroy, 116 Steps: []resource.TestStep{ 117 resource.TestStep{ 118 Config: testAccAWSDBClusterParameterGroupOnlyConfig, 119 Check: resource.ComposeTestCheckFunc( 120 testAccCheckAWSDBClusterParameterGroupExists("aws_rds_cluster_parameter_group.bar", &v), 121 testAccCheckAWSDBClusterParameterGroupAttributes(&v), 122 resource.TestCheckResourceAttr( 123 "aws_rds_cluster_parameter_group.bar", "name", "cluster-parameter-group-test-terraform"), 124 resource.TestCheckResourceAttr( 125 "aws_rds_cluster_parameter_group.bar", "family", "aurora5.6"), 126 resource.TestCheckResourceAttr( 127 "aws_rds_cluster_parameter_group.bar", "description", "Test cluster parameter group for terraform"), 128 ), 129 }, 130 }, 131 }) 132 } 133 134 func TestResourceAWSDBClusterParameterGroupName_validation(t *testing.T) { 135 cases := []struct { 136 Value string 137 ErrCount int 138 }{ 139 { 140 Value: "tEsting123", 141 ErrCount: 1, 142 }, 143 { 144 Value: "testing123!", 145 ErrCount: 1, 146 }, 147 { 148 Value: "1testing123", 149 ErrCount: 1, 150 }, 151 { 152 Value: "testing--123", 153 ErrCount: 1, 154 }, 155 { 156 Value: "testing123-", 157 ErrCount: 1, 158 }, 159 { 160 Value: randomString(256), 161 ErrCount: 1, 162 }, 163 } 164 165 for _, tc := range cases { 166 _, errors := validateDbParamGroupName(tc.Value, "aws_rds_cluster_parameter_group_name") 167 168 if len(errors) != tc.ErrCount { 169 t.Fatalf("Expected the DB Cluster Parameter Group Name to trigger a validation error") 170 } 171 } 172 } 173 174 func testAccCheckAWSDBClusterParameterGroupDestroy(s *terraform.State) error { 175 conn := testAccProvider.Meta().(*AWSClient).rdsconn 176 177 for _, rs := range s.RootModule().Resources { 178 if rs.Type != "aws_rds_cluster_parameter_group" { 179 continue 180 } 181 182 // Try to find the Group 183 resp, err := conn.DescribeDBClusterParameterGroups( 184 &rds.DescribeDBClusterParameterGroupsInput{ 185 DBClusterParameterGroupName: aws.String(rs.Primary.ID), 186 }) 187 188 if err == nil { 189 if len(resp.DBClusterParameterGroups) != 0 && 190 *resp.DBClusterParameterGroups[0].DBClusterParameterGroupName == rs.Primary.ID { 191 return fmt.Errorf("DB Cluster Parameter Group still exists") 192 } 193 } 194 195 // Verify the error 196 newerr, ok := err.(awserr.Error) 197 if !ok { 198 return err 199 } 200 if newerr.Code() != "DBParameterGroupNotFound" { 201 return err 202 } 203 } 204 205 return nil 206 } 207 208 func testAccCheckAWSDBClusterParameterGroupAttributes(v *rds.DBClusterParameterGroup) resource.TestCheckFunc { 209 return func(s *terraform.State) error { 210 211 if *v.DBClusterParameterGroupName != "cluster-parameter-group-test-terraform" { 212 return fmt.Errorf("bad name: %#v", v.DBClusterParameterGroupName) 213 } 214 215 if *v.DBParameterGroupFamily != "aurora5.6" { 216 return fmt.Errorf("bad family: %#v", v.DBParameterGroupFamily) 217 } 218 219 if *v.Description != "Test cluster parameter group for terraform" { 220 return fmt.Errorf("bad description: %#v", v.Description) 221 } 222 223 return nil 224 } 225 } 226 227 func testAccAWSDBClusterParameterGroupDisappears(v *rds.DBClusterParameterGroup) resource.TestCheckFunc { 228 return func(s *terraform.State) error { 229 conn := testAccProvider.Meta().(*AWSClient).rdsconn 230 opts := &rds.DeleteDBClusterParameterGroupInput{ 231 DBClusterParameterGroupName: v.DBClusterParameterGroupName, 232 } 233 if _, err := conn.DeleteDBClusterParameterGroup(opts); err != nil { 234 return err 235 } 236 return resource.Retry(40*time.Minute, func() *resource.RetryError { 237 opts := &rds.DescribeDBClusterParameterGroupsInput{ 238 DBClusterParameterGroupName: v.DBClusterParameterGroupName, 239 } 240 _, err := conn.DescribeDBClusterParameterGroups(opts) 241 if err != nil { 242 dbparamgrouperr, ok := err.(awserr.Error) 243 if ok && dbparamgrouperr.Code() == "DBParameterGroupNotFound" { 244 return nil 245 } 246 return resource.NonRetryableError( 247 fmt.Errorf("Error retrieving DB Cluster Parameter Groups: %s", err)) 248 } 249 return resource.RetryableError(fmt.Errorf( 250 "Waiting for cluster parameter group to be deleted: %v", v.DBClusterParameterGroupName)) 251 }) 252 } 253 } 254 255 func testAccCheckAWSDBClusterParameterGroupExists(n string, v *rds.DBClusterParameterGroup) resource.TestCheckFunc { 256 return func(s *terraform.State) error { 257 rs, ok := s.RootModule().Resources[n] 258 if !ok { 259 return fmt.Errorf("Not found: %s", n) 260 } 261 262 if rs.Primary.ID == "" { 263 return fmt.Errorf("No DB Cluster Parameter Group ID is set") 264 } 265 266 conn := testAccProvider.Meta().(*AWSClient).rdsconn 267 268 opts := rds.DescribeDBClusterParameterGroupsInput{ 269 DBClusterParameterGroupName: aws.String(rs.Primary.ID), 270 } 271 272 resp, err := conn.DescribeDBClusterParameterGroups(&opts) 273 274 if err != nil { 275 return err 276 } 277 278 if len(resp.DBClusterParameterGroups) != 1 || 279 *resp.DBClusterParameterGroups[0].DBClusterParameterGroupName != rs.Primary.ID { 280 return fmt.Errorf("DB Cluster Parameter Group not found") 281 } 282 283 *v = *resp.DBClusterParameterGroups[0] 284 285 return nil 286 } 287 } 288 289 const testAccAWSDBClusterParameterGroupConfig = ` 290 resource "aws_rds_cluster_parameter_group" "bar" { 291 name = "cluster-parameter-group-test-terraform" 292 family = "aurora5.6" 293 description = "Test cluster parameter group for terraform" 294 295 parameter { 296 name = "character_set_server" 297 value = "utf8" 298 } 299 300 parameter { 301 name = "character_set_client" 302 value = "utf8" 303 } 304 305 parameter { 306 name = "character_set_results" 307 value = "utf8" 308 } 309 310 tags { 311 foo = "bar" 312 } 313 } 314 ` 315 316 const testAccAWSDBClusterParameterGroupAddParametersConfig = ` 317 resource "aws_rds_cluster_parameter_group" "bar" { 318 name = "cluster-parameter-group-test-terraform" 319 family = "aurora5.6" 320 description = "Test cluster parameter group for terraform" 321 322 parameter { 323 name = "character_set_server" 324 value = "utf8" 325 } 326 327 parameter { 328 name = "character_set_client" 329 value = "utf8" 330 } 331 332 parameter { 333 name = "character_set_results" 334 value = "utf8" 335 } 336 337 parameter { 338 name = "collation_server" 339 value = "utf8_unicode_ci" 340 } 341 342 parameter { 343 name = "collation_connection" 344 value = "utf8_unicode_ci" 345 } 346 347 tags { 348 foo = "bar" 349 baz = "foo" 350 } 351 } 352 ` 353 354 const testAccAWSDBClusterParameterGroupOnlyConfig = ` 355 resource "aws_rds_cluster_parameter_group" "bar" { 356 name = "cluster-parameter-group-test-terraform" 357 family = "aurora5.6" 358 description = "Test cluster parameter group for terraform" 359 } 360 `