github.com/mmcquillan/packer@v1.1.1-0.20171009221028-c85cf0483a5d/builder/alicloud/ecs/step_attach_keypair.go (about)

     1  package ecs
     2  
     3  import (
     4  	"fmt"
     5  
     6  	"github.com/denverdino/aliyungo/common"
     7  	"github.com/denverdino/aliyungo/ecs"
     8  	"github.com/hashicorp/packer/packer"
     9  	"github.com/mitchellh/multistep"
    10  	"time"
    11  )
    12  
    13  type stepAttachKeyPar struct {
    14  }
    15  
    16  func (s *stepAttachKeyPar) Run(state multistep.StateBag) multistep.StepAction {
    17  	keyPairName := state.Get("keyPair").(string)
    18  	if keyPairName == "" {
    19  		return multistep.ActionContinue
    20  	}
    21  	ui := state.Get("ui").(packer.Ui)
    22  	client := state.Get("client").(*ecs.Client)
    23  	config := state.Get("config").(Config)
    24  	instance := state.Get("instance").(*ecs.InstanceAttributesType)
    25  	timeoutPoint := time.Now().Add(120 * time.Second)
    26  	for {
    27  		err := client.AttachKeyPair(&ecs.AttachKeyPairArgs{RegionId: common.Region(config.AlicloudRegion),
    28  			KeyPairName: keyPairName, InstanceIds: "[\"" + instance.InstanceId + "\"]"})
    29  		if err != nil {
    30  			e, _ := err.(*common.Error)
    31  			if (!(e.Code == "MissingParameter" || e.Code == "DependencyViolation.WindowsInstance" ||
    32  				e.Code == "InvalidKeyPairName.NotFound" || e.Code == "InvalidRegionId.NotFound")) &&
    33  				time.Now().Before(timeoutPoint) {
    34  				time.Sleep(5 * time.Second)
    35  				continue
    36  			}
    37  			err := fmt.Errorf("Error attaching keypair %s to instance %s : %s",
    38  				keyPairName, instance.InstanceId, err)
    39  			state.Put("error", err)
    40  			ui.Error(err.Error())
    41  			return multistep.ActionHalt
    42  		}
    43  		break
    44  	}
    45  
    46  	ui.Message(fmt.Sprintf("Attach keypair %s to instance: %s", keyPairName, instance.InstanceId))
    47  
    48  	return multistep.ActionContinue
    49  }
    50  
    51  func (s *stepAttachKeyPar) Cleanup(state multistep.StateBag) {
    52  	keyPairName := state.Get("keyPair").(string)
    53  	if keyPairName == "" {
    54  		return
    55  	}
    56  	client := state.Get("client").(*ecs.Client)
    57  	config := state.Get("config").(Config)
    58  	ui := state.Get("ui").(packer.Ui)
    59  	instance := state.Get("instance").(*ecs.InstanceAttributesType)
    60  
    61  	err := client.DetachKeyPair(&ecs.DetachKeyPairArgs{RegionId: common.Region(config.AlicloudRegion),
    62  		KeyPairName: keyPairName, InstanceIds: "[\"" + instance.InstanceId + "\"]"})
    63  	if err != nil {
    64  		err := fmt.Errorf("Error Detaching keypair %s to instance %s : %s", keyPairName,
    65  			instance.InstanceId, err)
    66  		state.Put("error", err)
    67  		ui.Error(err.Error())
    68  		return
    69  	}
    70  
    71  	ui.Message(fmt.Sprintf("Detach keypair %s from instance: %s", keyPairName, instance.InstanceId))
    72  
    73  }