From 95b3ea50ae6f8c0cdece174a07b8d610422ca000 Mon Sep 17 00:00:00 2001 From: David Zanetti Date: Tue, 24 Nov 2015 12:08:31 +1300 Subject: [PATCH] Add more useful messages and clean up after ourselves - S3 object uploaded removed after import (with disable option) - Indicate to user when import is complete - Close the source file uploaded after upload is done - Each step of import process logs a debug message --- .../amazon-import/post-processor.go | 35 +++++++++++++++---- 1 file changed, 29 insertions(+), 6 deletions(-) diff --git a/post-processor/amazon-import/post-processor.go b/post-processor/amazon-import/post-processor.go index 102106a74..1794b7bf8 100644 --- a/post-processor/amazon-import/post-processor.go +++ b/post-processor/amazon-import/post-processor.go @@ -4,10 +4,12 @@ import ( "fmt" "strings" "os" + "log" "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/ec2" "github.com/aws/aws-sdk-go/service/s3/s3manager" + "github.com/aws/aws-sdk-go/service/s3" // This is bad, it should be pulled out into a common folder across // both builders and post-processors awscommon "github.com/mitchellh/packer/builder/amazon/common" @@ -33,6 +35,7 @@ type Config struct { // Variables specific to this post processor S3Bucket string `mapstructure:"s3_bucket_name"` S3Key string `mapstructure:"s3_key_name"` + SkipClean bool `mapstructure:"skip_clean"` ImportTaskDesc string `mapstructure:"import_task_desc"` ImportDiskDesc string `mapstructure:"import_disk_desc"` @@ -103,6 +106,7 @@ func (p *PostProcessor) PostProcess(ui packer.Ui, artifact packer.Artifact) (pac return nil, false, fmt.Errorf("Artifact type %s is not supported by this post-processor", artifact.BuilderId()) } + log.Println("Looking for OVA in artifact...") // Locate the files output from the builder source := "" for _, path := range artifact.Files() { @@ -118,9 +122,11 @@ func (p *PostProcessor) PostProcess(ui packer.Ui, artifact packer.Artifact) (pac } // Set up the AWS session + log.Println("Creating AWS session...") session := session.New(config) // open the source file + log.Printf("Opening file %s to upload...", source) file, err := os.Open(source) if err != nil { return nil, false, fmt.Errorf("Failed to open %s: %s", source, err) @@ -139,8 +145,12 @@ func (p *PostProcessor) PostProcess(ui packer.Ui, artifact packer.Artifact) (pac return nil, false, fmt.Errorf("Failed to upload %s: %s", source, err) } + // May as well stop holding this open now + file.Close() + ui.Message(fmt.Sprintf("Completed upload of %s to s3://%s/%s", source, p.config.S3Bucket, p.config.S3Key)) + log.Printf("Calling EC2 to import from s3://%s/%s", p.config.S3Bucket, p.config.S3Key) // Call EC2 image import process ec2conn := ec2.New(session) import_start, err := ec2conn.ImportImage(&ec2.ImportImageInput{ @@ -170,14 +180,14 @@ func (p *PostProcessor) PostProcess(ui packer.Ui, artifact packer.Artifact) (pac Refresh: awscommon.ImportImageRefreshFunc(ec2conn, *import_start.ImportTaskId), Target: "completed", } + // Actually do the wait for state change _, err = awscommon.WaitForState(&stateChange) if err != nil { return nil, false, fmt.Errorf("Import task %s failed: %s", *import_start.ImportTaskId, err) } - // Extract the AMI ID and return this as the artifact of the - // post processor + // Extract the AMI ID from the completed import task import_result, err := ec2conn.DescribeImportImageTasks(&ec2.DescribeImportImageTasksInput{ ImportTaskIds: []*string{ import_start.ImportTaskId, @@ -185,10 +195,13 @@ func (p *PostProcessor) PostProcess(ui packer.Ui, artifact packer.Artifact) (pac }) if err != nil { - return nil, false, fmt.Errorf("API error for import task id %s: %s", *import_start.ImportTaskId, err) + return nil, false, fmt.Errorf("Failed to find import task %s: %s", *import_start.ImportTaskId, err) } - // Add the discvered AMI ID to the artifact list + ui.Message(fmt.Sprintf("Import task %s complete", *import_start.ImportTaskId)) + + // Add the reported AMI ID to the artifact list + log.Printf("Adding created AMI ID %s in region %s to output artifacts", *import_result.ImportImageTasks[0].ImageId, *config.Region) artifact = &awscommon.Artifact{ Amis: map[string]string{ *config.Region: *import_result.ImportImageTasks[0].ImageId, @@ -197,7 +210,17 @@ func (p *PostProcessor) PostProcess(ui packer.Ui, artifact packer.Artifact) (pac Conn: ec2conn, } + if !p.config.SkipClean { + ui.Message(fmt.Sprintf("Deleting import source s3://%s/%s", p.config.S3Bucket, p.config.S3Key)) + s3conn := s3.New(session) + _, err = s3conn.DeleteObject(&s3.DeleteObjectInput{ + Bucket: &p.config.S3Bucket, + Key: &p.config.S3Key, + }) + if err != nil { + return nil, false, fmt.Errorf("Failed to delete s3://%s/%s: %s", p.config.S3Bucket, p.config.S3Key, err) + } + } + return artifact, false, nil } - -