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