diff --git a/aws/resource_aws_lightsail_instance.go b/aws/resource_aws_lightsail_instance.go index 17fdf90e6037..d5633d6d8648 100644 --- a/aws/resource_aws_lightsail_instance.go +++ b/aws/resource_aws_lightsail_instance.go @@ -3,6 +3,7 @@ package aws import ( "fmt" "log" + "regexp" "strconv" "time" @@ -11,6 +12,7 @@ import ( "github.com/aws/aws-sdk-go/service/lightsail" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" + "github.com/hashicorp/terraform/helper/validation" ) func resourceAwsLightsailInstance() *schema.Resource { @@ -27,6 +29,11 @@ func resourceAwsLightsailInstance() *schema.Resource { Type: schema.TypeString, Required: true, ForceNew: true, + ValidateFunc: validation.All( + validation.StringLenBetween(3, 255), + validation.StringMatch(regexp.MustCompile(`^[a-zA-Z]`), "must begin with an alphabetic character, and contain only alphanumeric characters, underscores, hyphens, and dots"), + validation.StringMatch(regexp.MustCompile(`^[a-zA-Z0-9_\-.]+[^._\-]$`), "must begin with an alphabetic character, and contain only alphanumeric characters, underscores, hyphens, and dots"), + ), }, "availability_zone": { Type: schema.TypeString, diff --git a/aws/resource_aws_lightsail_instance_test.go b/aws/resource_aws_lightsail_instance_test.go index 87a1f0446025..f4bd85dca530 100644 --- a/aws/resource_aws_lightsail_instance_test.go +++ b/aws/resource_aws_lightsail_instance_test.go @@ -3,6 +3,7 @@ package aws import ( "errors" "fmt" + "regexp" "testing" "time" @@ -62,6 +63,51 @@ func TestAccAWSLightsailInstance_euRegion(t *testing.T) { }) } +func TestAccAWSLightsailInstance_Name(t *testing.T) { + var conf lightsail.Instance + lightsailName := fmt.Sprintf("tf-test-lightsail-%d", acctest.RandInt()) + lightsailNameWithSpace := fmt.Sprint(lightsailName, "string with more spaces") + lightsailNameWithTrailingDot := fmt.Sprintf("%s.", lightsailName) + lightsailNameWithUnderscore := fmt.Sprintf("%s_123456", lightsailName) + + resource.ParallelTest(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + IDRefreshName: "aws_lightsail_instance.lightsail_instance_test", + Providers: testAccProviders, + CheckDestroy: testAccCheckAWSLightsailInstanceDestroy, + Steps: []resource.TestStep{ + { + Config: testAccAWSLightsailInstanceConfig_basic(lightsailNameWithSpace), + ExpectError: regexp.MustCompile(`must begin with an alphabetic character.*`), + }, + { + Config: testAccAWSLightsailInstanceConfig_basic(lightsailNameWithTrailingDot), + ExpectError: regexp.MustCompile(`must begin with an alphabetic character.*`), + }, + { + Config: testAccAWSLightsailInstanceConfig_basic(lightsailName), + Check: resource.ComposeAggregateTestCheckFunc( + testAccCheckAWSLightsailInstanceExists("aws_lightsail_instance.lightsail_instance_test", &conf), + resource.TestCheckResourceAttrSet("aws_lightsail_instance.lightsail_instance_test", "availability_zone"), + resource.TestCheckResourceAttrSet("aws_lightsail_instance.lightsail_instance_test", "blueprint_id"), + resource.TestCheckResourceAttrSet("aws_lightsail_instance.lightsail_instance_test", "bundle_id"), + resource.TestCheckResourceAttrSet("aws_lightsail_instance.lightsail_instance_test", "key_pair_name"), + ), + }, + { + Config: testAccAWSLightsailInstanceConfig_basic(lightsailNameWithUnderscore), + Check: resource.ComposeAggregateTestCheckFunc( + testAccCheckAWSLightsailInstanceExists("aws_lightsail_instance.lightsail_instance_test", &conf), + resource.TestCheckResourceAttrSet("aws_lightsail_instance.lightsail_instance_test", "availability_zone"), + resource.TestCheckResourceAttrSet("aws_lightsail_instance.lightsail_instance_test", "blueprint_id"), + resource.TestCheckResourceAttrSet("aws_lightsail_instance.lightsail_instance_test", "bundle_id"), + resource.TestCheckResourceAttrSet("aws_lightsail_instance.lightsail_instance_test", "key_pair_name"), + ), + }, + }, + }) +} + func TestAccAWSLightsailInstance_disapear(t *testing.T) { var conf lightsail.Instance lightsailName := fmt.Sprintf("tf-test-lightsail-%d", acctest.RandInt()) @@ -74,7 +120,7 @@ func TestAccAWSLightsailInstance_disapear(t *testing.T) { }) if err != nil { - return fmt.Errorf("Error deleting Lightsail Instance in disapear test") + return fmt.Errorf("error deleting Lightsail Instance in disappear test") } // sleep 7 seconds to give it time, so we don't have to poll @@ -165,6 +211,7 @@ func testAccAWSLightsailInstanceConfig_basic(lightsailName string) string { provider "aws" { region = "us-east-1" } + resource "aws_lightsail_instance" "lightsail_instance_test" { name = "%s" availability_zone = "us-east-1b" @@ -179,6 +226,7 @@ func testAccAWSLightsailInstanceConfig_euRegion(lightsailName string) string { provider "aws" { region = "eu-west-1" } + resource "aws_lightsail_instance" "lightsail_instance_test" { name = "%s" availability_zone = "eu-west-1a"