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) {}