-
Notifications
You must be signed in to change notification settings - Fork 9.5k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
provider/aws: Elastic Beanstalk Application Version #3871
Closed
dharrisio
wants to merge
28
commits into
hashicorp:f-aws-elastic-beanstalk
from
dharrisio:f-aws-elastic-beanstalk
Closed
Changes from 11 commits
Commits
Show all changes
28 commits
Select commit
Hold shift + click to select a range
8d018ae
Added new resource as_elastic_beanstalk_application_version.
dharrisio c408511
Adding version_label option to beanstalk_environment resource.
dharrisio 3307b09
Handle InvalidParameterValue error when running terraform destroy on…
dharrisio 67fcae1
Merge remote-tracking branch 'origin/f-aws-elastic-beanstalk' into f-…
dharrisio 4c3fd07
Add an update check for version_label and create function to update e…
dharrisio 7b76e60
Adding basic test for Elastic Beanstalk Application Version.
dharrisio 6c944b3
Renaming AWSClient connections to conn for consistency.
dharrisio 68bd845
Fixed failed testAccBeanstalkEnvConfig by updating solution_stack_name.
dharrisio d06ce54
Updated resourceAwsElasticBeanstalkEnviornmentCreate to treat version…
dharrisio 8d9c718
Adding new documentation for elastic_beanstalk_application_version re…
dharrisio 01bebdd
Removed auto create application option. This option is unnecessary as…
dharrisio 0c8843f
ElasticBeanstalkEnvironmentUpdate with one beanstalk api call.
dharrisio 80f4194
Added new resource as_elastic_beanstalk_application_version.
dharrisio e241a4c
Adding version_label option to beanstalk_environment resource.
dharrisio 26b830c
Handle InvalidParameterValue error when running terraform destroy on…
dharrisio b73af4e
Add an update check for version_label and create function to update e…
dharrisio dd999a9
Adding basic test for Elastic Beanstalk Application Version.
dharrisio 9cafc94
Renaming AWSClient connections to conn for consistency.
dharrisio c20e638
Updated resourceAwsElasticBeanstalkEnviornmentCreate to treat version…
dharrisio 3566c54
Adding new documentation for elastic_beanstalk_application_version re…
dharrisio 4df23d3
Removed auto create application option. This option is unnecessary as…
dharrisio 3cbf5b9
gofmt
dharrisio 20b7b67
Merge branch 'f-aws-elastic-beanstalk-update-once' into f-aws-elastic…
dharrisio 28010c9
Minor formating and wording changes to documentation.
dharrisio e132ac9
Cleaned up BeanstalkAppVersion_basic test. Added text fixture for sam…
dharrisio 251f151
Cleaned up test config name. Moved random bucket name creation to _ba…
dharrisio 6de38ca
clean up test terraform document.
dharrisio b495df7
Adding TestAccAWSBeanstalkEnv_version_label test.
dharrisio File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
163 changes: 163 additions & 0 deletions
163
builtin/providers/aws/resource_aws_elastic_beanstalk_application_version.go
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,163 @@ | ||
package aws | ||
|
||
import ( | ||
"fmt" | ||
"log" | ||
|
||
"github.com/hashicorp/terraform/helper/schema" | ||
|
||
"github.com/aws/aws-sdk-go/aws" | ||
"github.com/aws/aws-sdk-go/aws/awserr" | ||
"github.com/aws/aws-sdk-go/service/elasticbeanstalk" | ||
) | ||
|
||
func resourceAwsElasticBeanstalkApplicationVersion() *schema.Resource { | ||
return &schema.Resource{ | ||
Create: resourceAwsElasticBeanstalkApplicationVersionCreate, | ||
Read: resourceAwsElasticBeanstalkApplicationVersionRead, | ||
Update: resourceAwsElasticBeanstalkApplicationVersionUpdate, | ||
Delete: resourceAwsElasticBeanstalkApplicationVersionDelete, | ||
|
||
Schema: map[string]*schema.Schema{ | ||
"application": &schema.Schema{ | ||
Type: schema.TypeString, | ||
Required: true, | ||
ForceNew: true, | ||
}, | ||
"description": &schema.Schema{ | ||
Type: schema.TypeString, | ||
Optional: true, | ||
}, | ||
"bucket": &schema.Schema{ | ||
Type: schema.TypeString, | ||
Optional: true, | ||
ForceNew: true, | ||
}, | ||
"key": &schema.Schema{ | ||
Type: schema.TypeString, | ||
Optional: true, | ||
ForceNew: true, | ||
}, | ||
"name": &schema.Schema{ | ||
Type: schema.TypeString, | ||
Required: true, | ||
ForceNew: true, | ||
}, | ||
}, | ||
} | ||
} | ||
|
||
func resourceAwsElasticBeanstalkApplicationVersionCreate(d *schema.ResourceData, meta interface{}) error { | ||
conn := meta.(*AWSClient).elasticbeanstalkconn | ||
|
||
application := d.Get("application").(string) | ||
description := d.Get("description").(string) | ||
bucket := d.Get("bucket").(string) | ||
key := d.Get("key").(string) | ||
name := d.Get("name").(string) | ||
|
||
s3Location := elasticbeanstalk.S3Location{ | ||
S3Bucket: aws.String(bucket), | ||
S3Key: aws.String(key), | ||
} | ||
|
||
createOpts := elasticbeanstalk.CreateApplicationVersionInput{ | ||
ApplicationName: aws.String(application), | ||
Description: aws.String(description), | ||
SourceBundle: &s3Location, | ||
VersionLabel: aws.String(name), | ||
} | ||
|
||
log.Printf("[DEBUG] Elastic Beanstalk Application Version create opts: %s", createOpts) | ||
_, err := conn.CreateApplicationVersion(&createOpts) | ||
if err != nil { | ||
return err | ||
} | ||
|
||
d.SetId(name) | ||
log.Printf("[INFO] Elastic Beanstalk Application Version Label: %s", name) | ||
|
||
return resourceAwsElasticBeanstalkApplicationVersionRead(d, meta) | ||
} | ||
|
||
func resourceAwsElasticBeanstalkApplicationVersionRead(d *schema.ResourceData, meta interface{}) error { | ||
conn := meta.(*AWSClient).elasticbeanstalkconn | ||
|
||
name := d.Id() | ||
|
||
resp, err := conn.DescribeApplicationVersions(&elasticbeanstalk.DescribeApplicationVersionsInput{ | ||
VersionLabels: []*string{aws.String(name)}, | ||
}) | ||
|
||
if err != nil { | ||
return err | ||
} | ||
|
||
if len(resp.ApplicationVersions) == 0 { | ||
log.Printf("[DEBUG] Elastic Beanstalk application version read: application version not found") | ||
|
||
d.SetId("") | ||
|
||
return nil | ||
} else if len(resp.ApplicationVersions) != 1 { | ||
return fmt.Errorf("Error reading application version properties: found %d application versions, expected 1", len(resp.ApplicationVersions)) | ||
} | ||
|
||
if err := d.Set("description", resp.ApplicationVersions[0].Description); err != nil { | ||
return err | ||
} | ||
|
||
return nil | ||
} | ||
|
||
func resourceAwsElasticBeanstalkApplicationVersionUpdate(d *schema.ResourceData, meta interface{}) error { | ||
conn := meta.(*AWSClient).elasticbeanstalkconn | ||
|
||
if d.HasChange("description") { | ||
if err := resourceAwsElasticBeanstalkApplicationVersionDescriptionUpdate(conn, d); err != nil { | ||
return err | ||
} | ||
} | ||
|
||
return resourceAwsElasticBeanstalkApplicationVersionRead(d, meta) | ||
|
||
} | ||
|
||
func resourceAwsElasticBeanstalkApplicationVersionDelete(d *schema.ResourceData, meta interface{}) error { | ||
conn := meta.(*AWSClient).elasticbeanstalkconn | ||
|
||
application := d.Get("application").(string) | ||
name := d.Id() | ||
|
||
_, err := conn.DeleteApplicationVersion(&elasticbeanstalk.DeleteApplicationVersionInput{ | ||
ApplicationName: aws.String(application), | ||
VersionLabel: aws.String(name), | ||
}) | ||
|
||
d.SetId("") | ||
|
||
if awserr, ok := err.(awserr.Error); ok { | ||
// application version is pending delete, or no longer exists. | ||
if awserr.Code() == "InvalidParameterValue" { | ||
return nil | ||
} | ||
|
||
} | ||
return err | ||
} | ||
|
||
func resourceAwsElasticBeanstalkApplicationVersionDescriptionUpdate(conn *elasticbeanstalk.ElasticBeanstalk, d *schema.ResourceData) error { | ||
application := d.Get("application").(string) | ||
description := d.Get("description").(string) | ||
name := d.Get("name").(string) | ||
|
||
log.Printf("[DEBUG] Elastic Beanstalk application version: %s, update description: %s", name, description) | ||
|
||
_, err := conn.UpdateApplicationVersion(&elasticbeanstalk.UpdateApplicationVersionInput{ | ||
ApplicationName: aws.String(application), | ||
Description: aws.String(description), | ||
VersionLabel: aws.String(name), | ||
}) | ||
|
||
return err | ||
} |
130 changes: 130 additions & 0 deletions
130
builtin/providers/aws/resource_aws_elastic_beanstalk_application_version_test.go
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,130 @@ | ||
package aws | ||
|
||
import ( | ||
"testing" | ||
|
||
"fmt" | ||
"io/ioutil" | ||
"log" | ||
|
||
"github.com/aws/aws-sdk-go/aws" | ||
"github.com/aws/aws-sdk-go/aws/awserr" | ||
"github.com/aws/aws-sdk-go/service/elasticbeanstalk" | ||
"github.com/hashicorp/terraform/helper/resource" | ||
"github.com/hashicorp/terraform/terraform" | ||
) | ||
|
||
var s3File, s3Err = ioutil.TempFile("", "tf.zip") | ||
|
||
func TestAccAWSBeanstalkAppVersion_basic(t *testing.T) { | ||
ioutil.WriteFile(s3File.Name(), []byte("{anything will do }"), 0644) | ||
|
||
var appVersion elasticbeanstalk.ApplicationVersionDescription | ||
|
||
resource.Test(t, resource.TestCase{ | ||
PreCheck: func() { | ||
if s3Err != nil { | ||
panic(s3Err) | ||
} | ||
testAccPreCheck(t) | ||
}, | ||
Providers: testAccProviders, | ||
CheckDestroy: testAccCheckApplicationVersionDestroy, | ||
Steps: []resource.TestStep{ | ||
resource.TestStep{ | ||
Config: testAccApplicationVersionConfig, | ||
Check: resource.ComposeTestCheckFunc( | ||
testAccCheckApplicationVersionExists("aws_elastic_beanstalk_application_version.default", &appVersion), | ||
), | ||
}, | ||
}, | ||
}) | ||
} | ||
|
||
func testAccCheckApplicationVersionDestroy(s *terraform.State) error { | ||
conn := testAccProvider.Meta().(*AWSClient).elasticbeanstalkconn | ||
|
||
for _, rs := range s.RootModule().Resources { | ||
if rs.Type != "aws_elastic_beanstalk_application_version" { | ||
continue | ||
} | ||
|
||
describeApplicationVersionOpts := &elasticbeanstalk.DescribeApplicationVersionsInput{ | ||
VersionLabels: []*string{aws.String(rs.Primary.ID)}, | ||
} | ||
resp, err := conn.DescribeApplicationVersions(describeApplicationVersionOpts) | ||
if err == nil { | ||
if len(resp.ApplicationVersions) > 0 { | ||
return fmt.Errorf("Elastic Beanstalk Application Verson still exists.") | ||
} | ||
|
||
return nil | ||
} | ||
ec2err, ok := err.(awserr.Error) | ||
if !ok { | ||
return err | ||
} | ||
if ec2err.Code() != "InvalidParameterValue" { | ||
return err | ||
} | ||
} | ||
|
||
return nil | ||
} | ||
|
||
func testAccCheckApplicationVersionExists(n string, app *elasticbeanstalk.ApplicationVersionDescription) resource.TestCheckFunc { | ||
return func(s *terraform.State) error { | ||
rs, ok := s.RootModule().Resources[n] | ||
if !ok { | ||
return fmt.Errorf("Not found: %s", n) | ||
} | ||
|
||
if rs.Primary.ID == "" { | ||
return fmt.Errorf("Elastic Beanstalk Application Version is not set") | ||
} | ||
|
||
conn := testAccProvider.Meta().(*AWSClient).elasticbeanstalkconn | ||
describeApplicationVersionOpts := &elasticbeanstalk.DescribeApplicationVersionsInput{ | ||
VersionLabels: []*string{aws.String(rs.Primary.ID)}, | ||
} | ||
|
||
log.Printf("[DEBUG] Elastic Beanstalk Application Version TEST describe opts: %s", describeApplicationVersionOpts) | ||
|
||
resp, err := conn.DescribeApplicationVersions(describeApplicationVersionOpts) | ||
if err != nil { | ||
return err | ||
} | ||
if len(resp.ApplicationVersions) == 0 { | ||
return fmt.Errorf("Elastic Beanstalk Application Version not found.") | ||
} | ||
|
||
*app = *resp.ApplicationVersions[0] | ||
|
||
return nil | ||
} | ||
} | ||
|
||
var randomBeanstalkBucket = randInt | ||
var testAccApplicationVersionConfig = fmt.Sprintf(` | ||
resource "aws_s3_bucket" "default" { | ||
bucket = "tftest.applicationversion.bucket-%d" | ||
} | ||
|
||
resource "aws_s3_bucket_object" "default" { | ||
bucket = "${aws_s3_bucket.default.id}" | ||
key = "beanstalk/go-v1.zip" | ||
source = "%s" | ||
} | ||
|
||
resource "aws_elastic_beanstalk_application" "default" { | ||
name = "tf-test-name" | ||
description = "tf-test-desc" | ||
} | ||
|
||
resource "aws_elastic_beanstalk_application_version" "default" { | ||
application = "tf-test-name" | ||
name = "tf-test-version-label" | ||
bucket = "${aws_s3_bucket.default.id}" | ||
key = "${aws_s3_bucket_object.default.id}" | ||
} | ||
`, randomBeanstalkBucket, s3File.Name()) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If you attempt to update a setting option and the version label at the same time AWS returns this error
Here is an example document that demonstrates the issue.
Change document to
This causes an issue because the environment is still making the option setting changes when it tries to update the environment with the new application version.
I think there are two potential ways to fix this.
@catsby I'm not sure which of those would be the preferred way, so let me know what you think.