github.phpd.cn/hashicorp/packer@v1.3.2/builder/alicloud/ecs/step_create_image.go (about) 1 package ecs 2 3 import ( 4 "context" 5 "fmt" 6 7 "github.com/denverdino/aliyungo/common" 8 "github.com/denverdino/aliyungo/ecs" 9 "github.com/hashicorp/packer/helper/multistep" 10 "github.com/hashicorp/packer/packer" 11 ) 12 13 type stepCreateAlicloudImage struct { 14 image *ecs.ImageType 15 } 16 17 func (s *stepCreateAlicloudImage) Run(_ context.Context, state multistep.StateBag) multistep.StepAction { 18 config := state.Get("config").(*Config) 19 client := state.Get("client").(*ecs.Client) 20 ui := state.Get("ui").(packer.Ui) 21 22 // Create the alicloud image 23 ui.Say(fmt.Sprintf("Creating image: %s", config.AlicloudImageName)) 24 var imageId string 25 var err error 26 27 instance := state.Get("instance").(*ecs.InstanceAttributesType) 28 imageId, err = client.CreateImage(&ecs.CreateImageArgs{ 29 RegionId: common.Region(config.AlicloudRegion), 30 InstanceId: instance.InstanceId, 31 ImageName: config.AlicloudImageName, 32 ImageVersion: config.AlicloudImageVersion, 33 Description: config.AlicloudImageDescription}) 34 35 if err != nil { 36 err := fmt.Errorf("Error creating image: %s", err) 37 state.Put("error", err) 38 ui.Error(err.Error()) 39 return multistep.ActionHalt 40 } 41 err = client.WaitForImageReady(common.Region(config.AlicloudRegion), 42 imageId, ALICLOUD_DEFAULT_LONG_TIMEOUT) 43 if err != nil { 44 err := fmt.Errorf("Timeout waiting for image to be created: %s", err) 45 state.Put("error", err) 46 ui.Error(err.Error()) 47 return multistep.ActionHalt 48 } 49 50 images, _, err := client.DescribeImages(&ecs.DescribeImagesArgs{ 51 RegionId: common.Region(config.AlicloudRegion), 52 ImageId: imageId}) 53 if err != nil { 54 err := fmt.Errorf("Error querying created image: %s", err) 55 state.Put("error", err) 56 ui.Error(err.Error()) 57 return multistep.ActionHalt 58 } 59 60 if len(images) == 0 { 61 err := fmt.Errorf("Unable to find created image: %s", err) 62 state.Put("error", err) 63 ui.Error(err.Error()) 64 return multistep.ActionHalt 65 } 66 s.image = &images[0] 67 68 state.Put("alicloudimage", imageId) 69 alicloudImages := make(map[string]string) 70 alicloudImages[config.AlicloudRegion] = images[0].ImageId 71 state.Put("alicloudimages", alicloudImages) 72 73 return multistep.ActionContinue 74 } 75 76 func (s *stepCreateAlicloudImage) Cleanup(state multistep.StateBag) { 77 if s.image == nil { 78 return 79 } 80 _, cancelled := state.GetOk(multistep.StateCancelled) 81 _, halted := state.GetOk(multistep.StateHalted) 82 if !cancelled && !halted { 83 return 84 } 85 86 client := state.Get("client").(*ecs.Client) 87 ui := state.Get("ui").(packer.Ui) 88 config := state.Get("config").(*Config) 89 90 ui.Say("Deleting the image because of cancellation or error...") 91 if err := client.DeleteImage(common.Region(config.AlicloudRegion), s.image.ImageId); err != nil { 92 ui.Error(fmt.Sprintf("Error deleting image, it may still be around: %s", err)) 93 return 94 } 95 }