82 lines
2.3 KiB
Go
82 lines
2.3 KiB
Go
package cvm
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"strings"
|
|
|
|
"github.com/hashicorp/packer/helper/multistep"
|
|
"github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common"
|
|
cvm "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm/v20170312"
|
|
)
|
|
|
|
type stepCopyImage struct {
|
|
DesinationRegions []string
|
|
SourceRegion string
|
|
}
|
|
|
|
func (s *stepCopyImage) Run(ctx context.Context, state multistep.StateBag) multistep.StepAction {
|
|
if len(s.DesinationRegions) == 0 || (len(s.DesinationRegions) == 1 && s.DesinationRegions[0] == s.SourceRegion) {
|
|
return multistep.ActionContinue
|
|
}
|
|
|
|
config := state.Get("config").(*Config)
|
|
client := state.Get("cvm_client").(*cvm.Client)
|
|
|
|
imageId := state.Get("image").(*cvm.Image).ImageId
|
|
|
|
Say(state, strings.Join(s.DesinationRegions, ","), "Trying to copy image to")
|
|
|
|
req := cvm.NewSyncImagesRequest()
|
|
req.ImageIds = []*string{imageId}
|
|
copyRegions := make([]*string, 0, len(s.DesinationRegions))
|
|
for _, region := range s.DesinationRegions {
|
|
if region != s.SourceRegion {
|
|
copyRegions = append(copyRegions, common.StringPtr(region))
|
|
}
|
|
}
|
|
req.DestinationRegions = copyRegions
|
|
|
|
err := Retry(ctx, func(ctx context.Context) error {
|
|
_, e := client.SyncImages(req)
|
|
return e
|
|
})
|
|
if err != nil {
|
|
return Halt(state, err, "Failed to copy image")
|
|
}
|
|
|
|
Message(state, "Waiting for image ready", "")
|
|
tencentCloudImages := state.Get("tencentcloudimages").(map[string]string)
|
|
|
|
for _, region := range req.DestinationRegions {
|
|
rc, err := NewCvmClient(config.SecretId, config.SecretKey, *region)
|
|
if err != nil {
|
|
return Halt(state, err, "Failed to init client")
|
|
}
|
|
|
|
err = WaitForImageReady(ctx, rc, config.ImageName, "NORMAL", 1800)
|
|
if err != nil {
|
|
return Halt(state, err, "Failed to wait for image ready")
|
|
}
|
|
|
|
image, err := GetImageByName(ctx, rc, config.ImageName)
|
|
if err != nil {
|
|
return Halt(state, err, "Failed to get image")
|
|
}
|
|
|
|
if image == nil {
|
|
return Halt(state, err, "Failed to wait for image ready")
|
|
}
|
|
|
|
tencentCloudImages[*region] = *image.ImageId
|
|
Message(state, fmt.Sprintf("Copy image from %s(%s) to %s(%s)", s.SourceRegion, *imageId, *region, *image.ImageId), "")
|
|
}
|
|
|
|
state.Put("tencentcloudimages", tencentCloudImages)
|
|
Message(state, "Image copied", "")
|
|
|
|
return multistep.ActionContinue
|
|
}
|
|
|
|
func (s *stepCopyImage) Cleanup(state multistep.StateBag) {}
|