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

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