github.phpd.cn/hashicorp/packer@v1.3.2/builder/amazon/common/step_modify_ebs_instance.go (about)

     1  package common
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"strings"
     7  
     8  	"github.com/aws/aws-sdk-go/aws"
     9  	"github.com/aws/aws-sdk-go/service/ec2"
    10  	"github.com/hashicorp/packer/helper/multistep"
    11  	"github.com/hashicorp/packer/packer"
    12  )
    13  
    14  type StepModifyEBSBackedInstance struct {
    15  	EnableAMIENASupport      *bool
    16  	EnableAMISriovNetSupport bool
    17  }
    18  
    19  func (s *StepModifyEBSBackedInstance) Run(_ context.Context, state multistep.StateBag) multistep.StepAction {
    20  	ec2conn := state.Get("ec2").(*ec2.EC2)
    21  	instance := state.Get("instance").(*ec2.Instance)
    22  	ui := state.Get("ui").(packer.Ui)
    23  
    24  	// Set SriovNetSupport to "simple". See http://goo.gl/icuXh5
    25  	// As of February 2017, this applies to C3, C4, D2, I2, R3, and M4 (excluding m4.16xlarge)
    26  	if s.EnableAMISriovNetSupport {
    27  		ui.Say("Enabling Enhanced Networking (SR-IOV)...")
    28  		simple := "simple"
    29  		_, err := ec2conn.ModifyInstanceAttribute(&ec2.ModifyInstanceAttributeInput{
    30  			InstanceId:      instance.InstanceId,
    31  			SriovNetSupport: &ec2.AttributeValue{Value: &simple},
    32  		})
    33  		if err != nil {
    34  			err := fmt.Errorf("Error enabling Enhanced Networking (SR-IOV) on %s: %s", *instance.InstanceId, err)
    35  			state.Put("error", err)
    36  			ui.Error(err.Error())
    37  			return multistep.ActionHalt
    38  		}
    39  	}
    40  
    41  	// Handle EnaSupport flag.
    42  	// As of February 2017, this applies to C5, I3, P2, R4, X1, and m4.16xlarge
    43  	if s.EnableAMIENASupport != nil {
    44  		var prefix string
    45  		if *s.EnableAMIENASupport {
    46  			prefix = "En"
    47  		} else {
    48  			prefix = "Dis"
    49  		}
    50  		ui.Say(fmt.Sprintf("%sabling Enhanced Networking (ENA)...", prefix))
    51  		_, err := ec2conn.ModifyInstanceAttribute(&ec2.ModifyInstanceAttributeInput{
    52  			InstanceId: instance.InstanceId,
    53  			EnaSupport: &ec2.AttributeBooleanValue{Value: aws.Bool(*s.EnableAMIENASupport)},
    54  		})
    55  		if err != nil {
    56  			err := fmt.Errorf("Error %sabling Enhanced Networking (ENA) on %s: %s", strings.ToLower(prefix), *instance.InstanceId, err)
    57  			state.Put("error", err)
    58  			ui.Error(err.Error())
    59  			return multistep.ActionHalt
    60  		}
    61  	}
    62  
    63  	return multistep.ActionContinue
    64  }
    65  
    66  func (s *StepModifyEBSBackedInstance) Cleanup(state multistep.StateBag) {
    67  	// No cleanup...
    68  }