github.phpd.cn/hashicorp/packer@v1.3.2/builder/alicloud/ecs/step_mount_disk.go (about)

     1  package ecs
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  
     7  	"github.com/denverdino/aliyungo/ecs"
     8  	"github.com/hashicorp/packer/helper/multistep"
     9  	"github.com/hashicorp/packer/packer"
    10  )
    11  
    12  type stepMountAlicloudDisk struct {
    13  }
    14  
    15  func (s *stepMountAlicloudDisk) Run(_ context.Context, state multistep.StateBag) multistep.StepAction {
    16  	client := state.Get("client").(*ecs.Client)
    17  	config := state.Get("config").(*Config)
    18  	ui := state.Get("ui").(packer.Ui)
    19  	instance := state.Get("instance").(*ecs.InstanceAttributesType)
    20  	alicloudDiskDevices := config.ECSImagesDiskMappings
    21  	if len(config.ECSImagesDiskMappings) == 0 {
    22  		return multistep.ActionContinue
    23  	}
    24  	ui.Say("Mounting disks.")
    25  	disks, _, err := client.DescribeDisks(&ecs.DescribeDisksArgs{InstanceId: instance.InstanceId,
    26  		RegionId: instance.RegionId})
    27  	if err != nil {
    28  		err := fmt.Errorf("Error querying disks: %s", err)
    29  		state.Put("error", err)
    30  		ui.Error(err.Error())
    31  		return multistep.ActionHalt
    32  	}
    33  	for _, disk := range disks {
    34  		if disk.Status == ecs.DiskStatusAvailable {
    35  			if err := client.AttachDisk(&ecs.AttachDiskArgs{DiskId: disk.DiskId,
    36  				InstanceId: instance.InstanceId,
    37  				Device:     getDevice(&disk, alicloudDiskDevices),
    38  			}); err != nil {
    39  				err := fmt.Errorf("Error mounting disks: %s", err)
    40  				state.Put("error", err)
    41  				ui.Error(err.Error())
    42  				return multistep.ActionHalt
    43  			}
    44  		}
    45  	}
    46  	for _, disk := range disks {
    47  		if err := client.WaitForDisk(instance.RegionId, disk.DiskId, ecs.DiskStatusInUse, ALICLOUD_DEFAULT_SHORT_TIMEOUT); err != nil {
    48  			err := fmt.Errorf("Timeout waiting for mount: %s", err)
    49  			state.Put("error", err)
    50  			ui.Error(err.Error())
    51  			return multistep.ActionHalt
    52  		}
    53  	}
    54  	ui.Say("Finished mounting disks.")
    55  	return multistep.ActionContinue
    56  }
    57  
    58  func (s *stepMountAlicloudDisk) Cleanup(state multistep.StateBag) {
    59  
    60  }
    61  
    62  func getDevice(disk *ecs.DiskItemType, diskDevices []AlicloudDiskDevice) string {
    63  	if disk.Device != "" {
    64  		return disk.Device
    65  	}
    66  	for _, alicloudDiskDevice := range diskDevices {
    67  		if alicloudDiskDevice.DiskName == disk.DiskName || alicloudDiskDevice.SnapshotId == disk.SourceSnapshotId {
    68  			return alicloudDiskDevice.Device
    69  		}
    70  	}
    71  	return ""
    72  }