packer-cn/builder/amazon/instance/step_upload_bundle.go

99 lines
2.7 KiB
Go
Raw Normal View History

2013-07-25 00:29:21 -04:00
package instance
import (
"context"
2013-07-25 00:29:21 -04:00
"fmt"
2014-07-24 19:30:30 -04:00
"github.com/hashicorp/packer/helper/multistep"
2017-04-04 16:39:01 -04:00
"github.com/hashicorp/packer/packer"
"github.com/hashicorp/packer/template/interpolate"
2013-07-25 00:29:21 -04:00
)
type uploadCmdData struct {
AccessKey string
BucketName string
BundleDirectory string
ManifestPath string
2014-08-18 14:42:32 -04:00
Region string
2013-07-25 00:29:21 -04:00
SecretKey string
Token string
2013-07-25 00:29:21 -04:00
}
2014-07-24 19:30:30 -04:00
type StepUploadBundle struct {
Debug bool
}
2013-07-25 00:29:21 -04:00
func (s *StepUploadBundle) Run(ctx context.Context, state multistep.StateBag) multistep.StepAction {
comm := state.Get("communicator").(packer.Communicator)
config := state.Get("config").(*Config)
manifestName := state.Get("manifest_name").(string)
manifestPath := state.Get("manifest_path").(string)
ui := state.Get("ui").(packer.Ui)
2013-07-25 00:29:21 -04:00
accessKey := config.AccessKey
secretKey := config.SecretKey
2017-03-01 19:43:09 -05:00
session, err := config.AccessConfig.Session()
region := *session.Config.Region
2017-03-01 19:43:09 -05:00
accessConfig := session.Config
var token string
if err == nil && accessKey == "" && secretKey == "" {
credentials, err := accessConfig.Credentials.Get()
if err == nil {
accessKey = credentials.AccessKeyID
secretKey = credentials.SecretAccessKey
token = credentials.SessionToken
}
}
config.ctx.Data = uploadCmdData{
AccessKey: accessKey,
2013-07-25 00:29:21 -04:00
BucketName: config.S3Bucket,
BundleDirectory: config.BundleDestination,
ManifestPath: manifestPath,
Region: region,
SecretKey: secretKey,
Token: token,
}
config.BundleUploadCommand, err = interpolate.Render(config.BundleUploadCommand, &config.ctx)
if err != nil {
err := fmt.Errorf("Error processing bundle upload command: %s", err)
state.Put("error", err)
ui.Error(err.Error())
return multistep.ActionHalt
2013-07-25 00:29:21 -04:00
}
ui.Say("Uploading the bundle...")
cmd := &packer.RemoteCmd{Command: config.BundleUploadCommand}
2014-07-24 19:30:30 -04:00
if s.Debug {
ui.Say(fmt.Sprintf("Running: %s", config.BundleUploadCommand))
}
if err := cmd.RunWithUi(ctx, comm, ui); err != nil {
state.Put("error", fmt.Errorf("Error uploading volume: %s", err))
ui.Error(state.Get("error").(error).Error())
2013-07-25 00:29:21 -04:00
return multistep.ActionHalt
}
if cmd.ExitStatus() != 0 {
if cmd.ExitStatus() == 3 {
ui.Error(fmt.Sprintf("Please check that the bucket `%s` "+
"does not exist, or exists and is writable. This error "+
"indicates that the bucket may be owned by somebody else.",
config.S3Bucket))
}
state.Put("error", fmt.Errorf(
"Bundle upload failed. Please see the output above for more\n"+
"details on what went wrong."))
ui.Error(state.Get("error").(error).Error())
2013-07-25 00:29:21 -04:00
return multistep.ActionHalt
}
state.Put("remote_manifest_path", fmt.Sprintf(
"%s/%s", config.S3Bucket, manifestName))
2013-07-25 00:29:21 -04:00
return multistep.ActionContinue
}
func (s *StepUploadBundle) Cleanup(state multistep.StateBag) {}