github.com/vtorhonen/terraform@v0.9.0-beta2.0.20170307220345-5d894e4ffda7/builtin/providers/aws/resource_aws_redshift_subnet_group_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/aws/awserr"
     9  	"github.com/aws/aws-sdk-go/service/redshift"
    10  	"github.com/hashicorp/terraform/helper/acctest"
    11  	"github.com/hashicorp/terraform/helper/resource"
    12  	"github.com/hashicorp/terraform/terraform"
    13  )
    14  
    15  func TestAccAWSRedshiftSubnetGroup_basic(t *testing.T) {
    16  	var v redshift.ClusterSubnetGroup
    17  	rInt := acctest.RandInt()
    18  
    19  	resource.Test(t, resource.TestCase{
    20  		PreCheck:     func() { testAccPreCheck(t) },
    21  		Providers:    testAccProviders,
    22  		CheckDestroy: testAccCheckRedshiftSubnetGroupDestroy,
    23  		Steps: []resource.TestStep{
    24  			resource.TestStep{
    25  				Config: testAccRedshiftSubnetGroupConfig(rInt),
    26  				Check: resource.ComposeTestCheckFunc(
    27  					testAccCheckRedshiftSubnetGroupExists("aws_redshift_subnet_group.foo", &v),
    28  					resource.TestCheckResourceAttr(
    29  						"aws_redshift_subnet_group.foo", "subnet_ids.#", "2"),
    30  					resource.TestCheckResourceAttr(
    31  						"aws_redshift_subnet_group.foo", "description", "foo description"),
    32  				),
    33  			},
    34  		},
    35  	})
    36  }
    37  
    38  func TestAccAWSRedshiftSubnetGroup_updateDescription(t *testing.T) {
    39  	var v redshift.ClusterSubnetGroup
    40  	rInt := acctest.RandInt()
    41  
    42  	resource.Test(t, resource.TestCase{
    43  		PreCheck:     func() { testAccPreCheck(t) },
    44  		Providers:    testAccProviders,
    45  		CheckDestroy: testAccCheckRedshiftSubnetGroupDestroy,
    46  		Steps: []resource.TestStep{
    47  			resource.TestStep{
    48  				Config: testAccRedshiftSubnetGroupConfig(rInt),
    49  				Check: resource.ComposeTestCheckFunc(
    50  					testAccCheckRedshiftSubnetGroupExists("aws_redshift_subnet_group.foo", &v),
    51  					resource.TestCheckResourceAttr(
    52  						"aws_redshift_subnet_group.foo", "description", "foo description"),
    53  				),
    54  			},
    55  
    56  			resource.TestStep{
    57  				Config: testAccRedshiftSubnetGroup_updateDescription(rInt),
    58  				Check: resource.ComposeTestCheckFunc(
    59  					testAccCheckRedshiftSubnetGroupExists("aws_redshift_subnet_group.foo", &v),
    60  					resource.TestCheckResourceAttr(
    61  						"aws_redshift_subnet_group.foo", "description", "foo description updated"),
    62  				),
    63  			},
    64  		},
    65  	})
    66  }
    67  
    68  func TestAccAWSRedshiftSubnetGroup_updateSubnetIds(t *testing.T) {
    69  	var v redshift.ClusterSubnetGroup
    70  	rInt := acctest.RandInt()
    71  
    72  	resource.Test(t, resource.TestCase{
    73  		PreCheck:     func() { testAccPreCheck(t) },
    74  		Providers:    testAccProviders,
    75  		CheckDestroy: testAccCheckRedshiftSubnetGroupDestroy,
    76  		Steps: []resource.TestStep{
    77  			resource.TestStep{
    78  				Config: testAccRedshiftSubnetGroupConfig(rInt),
    79  				Check: resource.ComposeTestCheckFunc(
    80  					testAccCheckRedshiftSubnetGroupExists("aws_redshift_subnet_group.foo", &v),
    81  					resource.TestCheckResourceAttr(
    82  						"aws_redshift_subnet_group.foo", "subnet_ids.#", "2"),
    83  				),
    84  			},
    85  
    86  			resource.TestStep{
    87  				Config: testAccRedshiftSubnetGroupConfig_updateSubnetIds(rInt),
    88  				Check: resource.ComposeTestCheckFunc(
    89  					testAccCheckRedshiftSubnetGroupExists("aws_redshift_subnet_group.foo", &v),
    90  					resource.TestCheckResourceAttr(
    91  						"aws_redshift_subnet_group.foo", "subnet_ids.#", "3"),
    92  				),
    93  			},
    94  		},
    95  	})
    96  }
    97  
    98  func TestAccAWSRedshiftSubnetGroup_tags(t *testing.T) {
    99  	var v redshift.ClusterSubnetGroup
   100  	rInt := acctest.RandInt()
   101  
   102  	resource.Test(t, resource.TestCase{
   103  		PreCheck:     func() { testAccPreCheck(t) },
   104  		Providers:    testAccProviders,
   105  		CheckDestroy: testAccCheckRedshiftSubnetGroupDestroy,
   106  		Steps: []resource.TestStep{
   107  			{
   108  				Config: testAccRedshiftSubnetGroupConfigWithTags(rInt),
   109  				Check: resource.ComposeTestCheckFunc(
   110  					testAccCheckRedshiftSubnetGroupExists("aws_redshift_subnet_group.foo", &v),
   111  					resource.TestCheckResourceAttr(
   112  						"aws_redshift_subnet_group.foo", "tags.%", "1"),
   113  					resource.TestCheckResourceAttr("aws_redshift_subnet_group.foo", "tags.Name", "tf-redshift-subnetgroup"),
   114  				),
   115  			},
   116  			{
   117  				Config: testAccRedshiftSubnetGroupConfigWithTagsUpdated(rInt),
   118  				Check: resource.ComposeTestCheckFunc(
   119  					testAccCheckRedshiftSubnetGroupExists("aws_redshift_subnet_group.foo", &v),
   120  					resource.TestCheckResourceAttr(
   121  						"aws_redshift_subnet_group.foo", "tags.%", "3"),
   122  					resource.TestCheckResourceAttr("aws_redshift_subnet_group.foo", "tags.environment", "production"),
   123  					resource.TestCheckResourceAttr("aws_redshift_subnet_group.foo", "tags.Name", "tf-redshift-subnetgroup"),
   124  					resource.TestCheckResourceAttr("aws_redshift_subnet_group.foo", "tags.foo", "bar"),
   125  				),
   126  			},
   127  		},
   128  	})
   129  }
   130  
   131  func TestResourceAWSRedshiftSubnetGroupNameValidation(t *testing.T) {
   132  	cases := []struct {
   133  		Value    string
   134  		ErrCount int
   135  	}{
   136  		{
   137  			Value:    "default",
   138  			ErrCount: 1,
   139  		},
   140  		{
   141  			Value:    "testing123%%",
   142  			ErrCount: 1,
   143  		},
   144  		{
   145  			Value:    "TestingSG",
   146  			ErrCount: 1,
   147  		},
   148  		{
   149  			Value:    "testing_123",
   150  			ErrCount: 1,
   151  		},
   152  		{
   153  			Value:    "testing.123",
   154  			ErrCount: 1,
   155  		},
   156  		{
   157  			Value:    randomString(256),
   158  			ErrCount: 1,
   159  		},
   160  	}
   161  
   162  	for _, tc := range cases {
   163  		_, errors := validateRedshiftSubnetGroupName(tc.Value, "aws_redshift_subnet_group_name")
   164  
   165  		if len(errors) != tc.ErrCount {
   166  			t.Fatalf("Expected the Redshift Subnet Group Name to trigger a validation error")
   167  		}
   168  	}
   169  }
   170  
   171  func testAccCheckRedshiftSubnetGroupDestroy(s *terraform.State) error {
   172  	conn := testAccProvider.Meta().(*AWSClient).redshiftconn
   173  
   174  	for _, rs := range s.RootModule().Resources {
   175  		if rs.Type != "aws_redshift_subnet_group" {
   176  			continue
   177  		}
   178  
   179  		resp, err := conn.DescribeClusterSubnetGroups(
   180  			&redshift.DescribeClusterSubnetGroupsInput{
   181  				ClusterSubnetGroupName: aws.String(rs.Primary.ID)})
   182  		if err == nil {
   183  			if len(resp.ClusterSubnetGroups) > 0 {
   184  				return fmt.Errorf("still exist.")
   185  			}
   186  
   187  			return nil
   188  		}
   189  
   190  		redshiftErr, ok := err.(awserr.Error)
   191  		if !ok {
   192  			return err
   193  		}
   194  		if redshiftErr.Code() != "ClusterSubnetGroupNotFoundFault" {
   195  			return err
   196  		}
   197  	}
   198  
   199  	return nil
   200  }
   201  
   202  func testAccCheckRedshiftSubnetGroupExists(n string, v *redshift.ClusterSubnetGroup) resource.TestCheckFunc {
   203  	return func(s *terraform.State) error {
   204  		rs, ok := s.RootModule().Resources[n]
   205  		if !ok {
   206  			return fmt.Errorf("Not found: %s", n)
   207  		}
   208  
   209  		if rs.Primary.ID == "" {
   210  			return fmt.Errorf("No ID is set")
   211  		}
   212  
   213  		conn := testAccProvider.Meta().(*AWSClient).redshiftconn
   214  		resp, err := conn.DescribeClusterSubnetGroups(
   215  			&redshift.DescribeClusterSubnetGroupsInput{ClusterSubnetGroupName: aws.String(rs.Primary.ID)})
   216  		if err != nil {
   217  			return err
   218  		}
   219  		if len(resp.ClusterSubnetGroups) == 0 {
   220  			return fmt.Errorf("ClusterSubnetGroup not found")
   221  		}
   222  
   223  		*v = *resp.ClusterSubnetGroups[0]
   224  
   225  		return nil
   226  	}
   227  }
   228  
   229  func testAccRedshiftSubnetGroupConfig(rInt int) string {
   230  	return fmt.Sprintf(`
   231  resource "aws_vpc" "foo" {
   232  	cidr_block = "10.1.0.0/16"
   233  }
   234  
   235  resource "aws_subnet" "foo" {
   236  	cidr_block = "10.1.1.0/24"
   237  	availability_zone = "us-west-2a"
   238  	vpc_id = "${aws_vpc.foo.id}"
   239  	tags {
   240  		Name = "tf-dbsubnet-test-1"
   241  	}
   242  }
   243  
   244  resource "aws_subnet" "bar" {
   245  	cidr_block = "10.1.2.0/24"
   246  	availability_zone = "us-west-2b"
   247  	vpc_id = "${aws_vpc.foo.id}"
   248  	tags {
   249  		Name = "tf-dbsubnet-test-2"
   250  	}
   251  }
   252  
   253  resource "aws_redshift_subnet_group" "foo" {
   254  	name = "foo-%d"
   255  	description = "foo description"
   256  	subnet_ids = ["${aws_subnet.foo.id}", "${aws_subnet.bar.id}"]
   257  }
   258  	`, rInt)
   259  }
   260  
   261  func testAccRedshiftSubnetGroup_updateDescription(rInt int) string {
   262  	return fmt.Sprintf(`
   263  resource "aws_vpc" "foo" {
   264  	cidr_block = "10.1.0.0/16"
   265  }
   266  
   267  resource "aws_subnet" "foo" {
   268  	cidr_block = "10.1.1.0/24"
   269  	availability_zone = "us-west-2a"
   270  	vpc_id = "${aws_vpc.foo.id}"
   271  	tags {
   272  		Name = "tf-dbsubnet-test-1"
   273  	}
   274  }
   275  
   276  resource "aws_subnet" "bar" {
   277  	cidr_block = "10.1.2.0/24"
   278  	availability_zone = "us-west-2b"
   279  	vpc_id = "${aws_vpc.foo.id}"
   280  	tags {
   281  		Name = "tf-dbsubnet-test-2"
   282  	}
   283  }
   284  
   285  resource "aws_redshift_subnet_group" "foo" {
   286  	name = "foo-%d"
   287  	description = "foo description updated"
   288  	subnet_ids = ["${aws_subnet.foo.id}", "${aws_subnet.bar.id}"]
   289  }
   290  `, rInt)
   291  }
   292  
   293  func testAccRedshiftSubnetGroupConfigWithTags(rInt int) string {
   294  	return fmt.Sprintf(`
   295  resource "aws_vpc" "foo" {
   296  	cidr_block = "10.1.0.0/16"
   297  }
   298  
   299  resource "aws_subnet" "foo" {
   300  	cidr_block = "10.1.1.0/24"
   301  	availability_zone = "us-west-2a"
   302  	vpc_id = "${aws_vpc.foo.id}"
   303  	tags {
   304  		Name = "tf-dbsubnet-test-1"
   305  	}
   306  }
   307  
   308  resource "aws_subnet" "bar" {
   309  	cidr_block = "10.1.2.0/24"
   310  	availability_zone = "us-west-2b"
   311  	vpc_id = "${aws_vpc.foo.id}"
   312  	tags {
   313  		Name = "tf-dbsubnet-test-2"
   314  	}
   315  }
   316  
   317  resource "aws_redshift_subnet_group" "foo" {
   318  	name = "foo-%d"
   319  	subnet_ids = ["${aws_subnet.foo.id}", "${aws_subnet.bar.id}"]
   320  	tags {
   321  		Name = "tf-redshift-subnetgroup"
   322  	}
   323  }
   324  `, rInt)
   325  }
   326  
   327  func testAccRedshiftSubnetGroupConfigWithTagsUpdated(rInt int) string {
   328  	return fmt.Sprintf(`
   329  resource "aws_vpc" "foo" {
   330  	cidr_block = "10.1.0.0/16"
   331  }
   332  
   333  resource "aws_subnet" "foo" {
   334  	cidr_block = "10.1.1.0/24"
   335  	availability_zone = "us-west-2a"
   336  	vpc_id = "${aws_vpc.foo.id}"
   337  	tags {
   338  		Name = "tf-dbsubnet-test-1"
   339  	}
   340  }
   341  
   342  resource "aws_subnet" "bar" {
   343  	cidr_block = "10.1.2.0/24"
   344  	availability_zone = "us-west-2b"
   345  	vpc_id = "${aws_vpc.foo.id}"
   346  	tags {
   347  		Name = "tf-dbsubnet-test-2"
   348  	}
   349  }
   350  
   351  resource "aws_redshift_subnet_group" "foo" {
   352  	name = "foo-%d"
   353  	subnet_ids = ["${aws_subnet.foo.id}", "${aws_subnet.bar.id}"]
   354  	tags {
   355  		Name = "tf-redshift-subnetgroup"
   356  		environment = "production"
   357  		foo = "bar"
   358  	}
   359  }
   360  `, rInt)
   361  }
   362  
   363  func testAccRedshiftSubnetGroupConfig_updateSubnetIds(rInt int) string {
   364  	return fmt.Sprintf(`
   365  resource "aws_vpc" "foo" {
   366  	cidr_block = "10.1.0.0/16"
   367  }
   368  
   369  resource "aws_subnet" "foo" {
   370  	cidr_block = "10.1.1.0/24"
   371  	availability_zone = "us-west-2a"
   372  	vpc_id = "${aws_vpc.foo.id}"
   373  	tags {
   374  		Name = "tf-dbsubnet-test-1"
   375  	}
   376  }
   377  
   378  resource "aws_subnet" "bar" {
   379  	cidr_block = "10.1.2.0/24"
   380  	availability_zone = "us-west-2b"
   381  	vpc_id = "${aws_vpc.foo.id}"
   382  	tags {
   383  		Name = "tf-dbsubnet-test-2"
   384  	}
   385  }
   386  
   387  resource "aws_subnet" "foobar" {
   388  	cidr_block = "10.1.3.0/24"
   389  	availability_zone = "us-west-2c"
   390  	vpc_id = "${aws_vpc.foo.id}"
   391  	tags {
   392  		Name = "tf-dbsubnet-test-3"
   393  	}
   394  }
   395  
   396  resource "aws_redshift_subnet_group" "foo" {
   397  	name = "foo-%d"
   398  	subnet_ids = ["${aws_subnet.foo.id}", "${aws_subnet.bar.id}", "${aws_subnet.foobar.id}"]
   399  }
   400  `, rInt)
   401  }