fix various bugs deregistering AMIs

always deregister ami in session region
validate that session region does not appear in ami_regions
This commit is contained in:
Matthew Hooker 2017-10-30 14:17:19 -07:00
parent 6c4fbe8d87
commit c65fa8490d
No known key found for this signature in database
GPG Key ID: 7B5F933D9CE8C6A1
8 changed files with 25 additions and 20 deletions

View File

@ -121,7 +121,8 @@ func (b *Builder) Prepare(raws ...interface{}) ([]string, error) {
var warns []string var warns []string
errs = packer.MultiErrorAppend(errs, b.config.AccessConfig.Prepare(&b.config.ctx)...) errs = packer.MultiErrorAppend(errs, b.config.AccessConfig.Prepare(&b.config.ctx)...)
errs = packer.MultiErrorAppend(errs, b.config.AMIConfig.Prepare(&b.config.ctx)...) errs = packer.MultiErrorAppend(errs,
b.config.AMIConfig.Prepare(&b.config.AccessConfig, &b.config.ctx)...)
for _, mounts := range b.config.ChrootMounts { for _, mounts := range b.config.ChrootMounts {
if len(mounts) != 3 { if len(mounts) != 3 {

View File

@ -32,7 +32,7 @@ func (c *AccessConfig) Session() (*session.Session, error) {
return c.session, nil return c.session, nil
} }
region, err := c.Region() region, err := c.region()
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -82,7 +82,7 @@ func (c *AccessConfig) Session() (*session.Session, error) {
// Region returns the aws.Region object for access to AWS services, requesting // Region returns the aws.Region object for access to AWS services, requesting
// the region from the instance metadata if possible. // the region from the instance metadata if possible.
func (c *AccessConfig) Region() (string, error) { func (c *AccessConfig) region() (string, error) {
if c.RawRegion != "" { if c.RawRegion != "" {
if !c.SkipValidation { if !c.SkipValidation {
if valid := ValidateRegion(c.RawRegion); !valid { if valid := ValidateRegion(c.RawRegion); !valid {

View File

@ -38,12 +38,23 @@ func stringInSlice(s []string, searchstr string) bool {
return false return false
} }
func (c *AMIConfig) Prepare(ctx *interpolate.Context) []error { func (c *AMIConfig) Prepare(accessConfig *AccessConfig, ctx *interpolate.Context) []error {
var errs []error var errs []error
session, err := accessConfig.Session()
if err != nil {
errs = append(errs, err)
}
region := *session.Config.Region
if c.AMIName == "" { if c.AMIName == "" {
errs = append(errs, fmt.Errorf("ami_name must be specified")) errs = append(errs, fmt.Errorf("ami_name must be specified"))
} }
if stringInSlice(c.AMIRegions, region) {
errs = append(errs, fmt.Errorf("Cannot copy AMI to AWS session region '%s', please remove it from `ami_regions`.", region))
}
if len(c.AMIRegions) > 0 { if len(c.AMIRegions) > 0 {
regionSet := make(map[string]struct{}) regionSet := make(map[string]struct{})
regions := make([]string, 0, len(c.AMIRegions)) regions := make([]string, 0, len(c.AMIRegions))
@ -61,7 +72,6 @@ func (c *AMIConfig) Prepare(ctx *interpolate.Context) []error {
// Verify the region is real // Verify the region is real
if valid := ValidateRegion(region); !valid { if valid := ValidateRegion(region); !valid {
errs = append(errs, fmt.Errorf("Unknown region: %s", region)) errs = append(errs, fmt.Errorf("Unknown region: %s", region))
continue
} }
} }

View File

@ -25,10 +25,8 @@ func (s *StepDeregisterAMI) Run(state multistep.StateBag) multistep.StepAction {
ui := state.Get("ui").(packer.Ui) ui := state.Get("ui").(packer.Ui)
ec2conn := state.Get("ec2").(*ec2.EC2) ec2conn := state.Get("ec2").(*ec2.EC2)
regions := s.Regions // Add the session region to list of regions will will deregister AMIs in
if len(regions) == 0 { regions := append(s.Regions, *ec2conn.Config.Region)
regions = append(regions, *ec2conn.Config.Region)
}
for _, region := range regions { for _, region := range regions {
// get new connection for each region in which we need to deregister vms // get new connection for each region in which we need to deregister vms

View File

@ -64,8 +64,9 @@ func (b *Builder) Prepare(raws ...interface{}) ([]string, error) {
// Accumulate any errors // Accumulate any errors
var errs *packer.MultiError var errs *packer.MultiError
errs = packer.MultiErrorAppend(errs, b.config.AccessConfig.Prepare(&b.config.ctx)...) errs = packer.MultiErrorAppend(errs, b.config.AccessConfig.Prepare(&b.config.ctx)...)
errs = packer.MultiErrorAppend(errs,
b.config.AMIConfig.Prepare(&b.config.AccessConfig, &b.config.ctx)...)
errs = packer.MultiErrorAppend(errs, b.config.BlockDevices.Prepare(&b.config.ctx)...) errs = packer.MultiErrorAppend(errs, b.config.BlockDevices.Prepare(&b.config.ctx)...)
errs = packer.MultiErrorAppend(errs, b.config.AMIConfig.Prepare(&b.config.ctx)...)
errs = packer.MultiErrorAppend(errs, b.config.RunConfig.Prepare(&b.config.ctx)...) errs = packer.MultiErrorAppend(errs, b.config.RunConfig.Prepare(&b.config.ctx)...)
if errs != nil && len(errs.Errors) > 0 { if errs != nil && len(errs.Errors) > 0 {

View File

@ -64,7 +64,8 @@ func (b *Builder) Prepare(raws ...interface{}) ([]string, error) {
var errs *packer.MultiError var errs *packer.MultiError
errs = packer.MultiErrorAppend(errs, b.config.AccessConfig.Prepare(&b.config.ctx)...) errs = packer.MultiErrorAppend(errs, b.config.AccessConfig.Prepare(&b.config.ctx)...)
errs = packer.MultiErrorAppend(errs, b.config.RunConfig.Prepare(&b.config.ctx)...) errs = packer.MultiErrorAppend(errs, b.config.RunConfig.Prepare(&b.config.ctx)...)
errs = packer.MultiErrorAppend(errs, b.config.AMIConfig.Prepare(&b.config.ctx)...) errs = packer.MultiErrorAppend(errs,
b.config.AMIConfig.Prepare(&b.config.AccessConfig, &b.config.ctx)...)
errs = packer.MultiErrorAppend(errs, b.config.BlockDevices.Prepare(&b.config.ctx)...) errs = packer.MultiErrorAppend(errs, b.config.BlockDevices.Prepare(&b.config.ctx)...)
errs = packer.MultiErrorAppend(errs, b.config.RootDevice.Prepare(&b.config.ctx)...) errs = packer.MultiErrorAppend(errs, b.config.RootDevice.Prepare(&b.config.ctx)...)

View File

@ -127,7 +127,8 @@ func (b *Builder) Prepare(raws ...interface{}) ([]string, error) {
var errs *packer.MultiError var errs *packer.MultiError
errs = packer.MultiErrorAppend(errs, b.config.AccessConfig.Prepare(&b.config.ctx)...) errs = packer.MultiErrorAppend(errs, b.config.AccessConfig.Prepare(&b.config.ctx)...)
errs = packer.MultiErrorAppend(errs, b.config.BlockDevices.Prepare(&b.config.ctx)...) errs = packer.MultiErrorAppend(errs, b.config.BlockDevices.Prepare(&b.config.ctx)...)
errs = packer.MultiErrorAppend(errs, b.config.AMIConfig.Prepare(&b.config.ctx)...) errs = packer.MultiErrorAppend(errs,
b.config.AMIConfig.Prepare(&b.config.AccessConfig, &b.config.ctx)...)
errs = packer.MultiErrorAppend(errs, b.config.RunConfig.Prepare(&b.config.ctx)...) errs = packer.MultiErrorAppend(errs, b.config.RunConfig.Prepare(&b.config.ctx)...)
if b.config.AccountId == "" { if b.config.AccountId == "" {

View File

@ -29,17 +29,10 @@ func (s *StepUploadBundle) Run(state multistep.StateBag) multistep.StepAction {
manifestPath := state.Get("manifest_path").(string) manifestPath := state.Get("manifest_path").(string)
ui := state.Get("ui").(packer.Ui) ui := state.Get("ui").(packer.Ui)
region, err := config.Region()
if err != nil {
err := fmt.Errorf("Error retrieving region: %s", err)
state.Put("error", err)
ui.Error(err.Error())
return multistep.ActionHalt
}
accessKey := config.AccessKey accessKey := config.AccessKey
secretKey := config.SecretKey secretKey := config.SecretKey
session, err := config.AccessConfig.Session() session, err := config.AccessConfig.Session()
region := *session.Config.Region
accessConfig := session.Config accessConfig := session.Config
var token string var token string
if err == nil && accessKey == "" && secretKey == "" { if err == nil && accessKey == "" && secretKey == "" {