github.com/rothwerx/packer@v0.9.0/builder/amazon/instance/step_register_ami.go (about)

     1  package instance
     2  
     3  import (
     4  	"fmt"
     5  
     6  	"github.com/aws/aws-sdk-go/aws"
     7  	"github.com/aws/aws-sdk-go/service/ec2"
     8  	"github.com/mitchellh/multistep"
     9  	awscommon "github.com/mitchellh/packer/builder/amazon/common"
    10  	"github.com/mitchellh/packer/packer"
    11  )
    12  
    13  type StepRegisterAMI struct{}
    14  
    15  func (s *StepRegisterAMI) Run(state multistep.StateBag) multistep.StepAction {
    16  	config := state.Get("config").(*Config)
    17  	ec2conn := state.Get("ec2").(*ec2.EC2)
    18  	manifestPath := state.Get("remote_manifest_path").(string)
    19  	ui := state.Get("ui").(packer.Ui)
    20  
    21  	ui.Say("Registering the AMI...")
    22  	registerOpts := &ec2.RegisterImageInput{
    23  		ImageLocation:       &manifestPath,
    24  		Name:                aws.String(config.AMIName),
    25  		BlockDeviceMappings: config.BlockDevices.BuildAMIDevices(),
    26  	}
    27  
    28  	if config.AMIVirtType != "" {
    29  		registerOpts.VirtualizationType = aws.String(config.AMIVirtType)
    30  	}
    31  
    32  	// Set SriovNetSupport to "simple". See http://goo.gl/icuXh5
    33  	if config.AMIEnhancedNetworking {
    34  		registerOpts.SriovNetSupport = aws.String("simple")
    35  	}
    36  
    37  	registerResp, err := ec2conn.RegisterImage(registerOpts)
    38  	if err != nil {
    39  		state.Put("error", fmt.Errorf("Error registering AMI: %s", err))
    40  		ui.Error(state.Get("error").(error).Error())
    41  		return multistep.ActionHalt
    42  	}
    43  
    44  	// Set the AMI ID in the state
    45  	ui.Say(fmt.Sprintf("AMI: %s", *registerResp.ImageId))
    46  	amis := make(map[string]string)
    47  	amis[*ec2conn.Config.Region] = *registerResp.ImageId
    48  	state.Put("amis", amis)
    49  
    50  	// Wait for the image to become ready
    51  	stateChange := awscommon.StateChangeConf{
    52  		Pending:   []string{"pending"},
    53  		Target:    "available",
    54  		Refresh:   awscommon.AMIStateRefreshFunc(ec2conn, *registerResp.ImageId),
    55  		StepState: state,
    56  	}
    57  
    58  	ui.Say("Waiting for AMI to become ready...")
    59  	if _, err := awscommon.WaitForState(&stateChange); err != nil {
    60  		err := fmt.Errorf("Error waiting for AMI: %s", err)
    61  		state.Put("error", err)
    62  		ui.Error(err.Error())
    63  		return multistep.ActionHalt
    64  	}
    65  
    66  	return multistep.ActionContinue
    67  }
    68  
    69  func (s *StepRegisterAMI) Cleanup(multistep.StateBag) {}