107 lines
3.4 KiB
Go
107 lines
3.4 KiB
Go
//go:generate mapstructure-to-hcl2 -type ImageDestination
|
|
//go:generate struct-markdown
|
|
|
|
package common
|
|
|
|
import (
|
|
"fmt"
|
|
"regexp"
|
|
|
|
"github.com/hashicorp/packer/packer-plugin-sdk/template/interpolate"
|
|
)
|
|
|
|
type ImageDestination struct {
|
|
// The destination project id, where copying image in.
|
|
ProjectId string `mapstructure:"project_id" required:"false"`
|
|
// The destination region, where copying image in.
|
|
Region string `mapstructure:"region" required:"false"`
|
|
// The copied image name. If not defined, builder will use `image_name` as default name.
|
|
Name string `mapstructure:"name" required:"false"`
|
|
// The copied image description.
|
|
Description string `mapstructure:"description" required:"false"`
|
|
}
|
|
|
|
type ImageConfig struct {
|
|
// The name of the user-defined image, which contains 1-63 characters and only
|
|
// support Chinese, English, numbers, '-\_,.:[]'.
|
|
ImageName string `mapstructure:"image_name" required:"true"`
|
|
// The description of the image.
|
|
ImageDescription string `mapstructure:"image_description" required:"false"`
|
|
// The array of mappings regarding the copied images to the destination regions and projects.
|
|
//
|
|
// - `project_id` (string) - The destination project id, where copying image in.
|
|
//
|
|
// - `region` (string) - The destination region, where copying image in.
|
|
//
|
|
// - `name` (string) - The copied image name. If not defined, builder will use `image_name` as default name.
|
|
//
|
|
// - `description` (string) - The copied image description.
|
|
//
|
|
// ```json
|
|
// {
|
|
// "image_copy_to_mappings": [
|
|
// {
|
|
// "project_id": "{{user `ucloud_project_id`}}",
|
|
// "region": "cn-sh2",
|
|
// "description": "test",
|
|
// "name": "packer-test-basic-sh"
|
|
// }
|
|
// ]
|
|
// }
|
|
// ```
|
|
ImageDestinations []ImageDestination `mapstructure:"image_copy_to_mappings" required:"false"`
|
|
// Timeout of creating image or copying image. The default timeout is 3600 seconds if this option
|
|
// is not set or is set to 0.
|
|
WaitImageReadyTimeout int `mapstructure:"wait_image_ready_timeout" required:"false"`
|
|
}
|
|
|
|
var ImageNamePattern = regexp.MustCompile(`^[A-Za-z0-9\p{Han}-_\[\]:,.]{1,63}$`)
|
|
|
|
func (c *ImageConfig) Prepare(ctx *interpolate.Context) []error {
|
|
var errs []error
|
|
imageName := c.ImageName
|
|
if imageName == "" {
|
|
errs = append(errs, fmt.Errorf("%q must be set", "image_name"))
|
|
} else if !ImageNamePattern.MatchString(imageName) {
|
|
errs = append(errs, fmt.Errorf("expected %q to be 1-63 characters and only support chinese, english, numbers, '-_,.:[]', got %q", "image_name", imageName))
|
|
}
|
|
|
|
if len(c.ImageDestinations) > 0 {
|
|
for _, imageDestination := range c.ImageDestinations {
|
|
if imageDestination.Name == "" {
|
|
imageDestination.Name = imageName
|
|
}
|
|
|
|
errs = append(errs, imageDestination.validate()...)
|
|
}
|
|
}
|
|
|
|
if c.WaitImageReadyTimeout <= 0 {
|
|
c.WaitImageReadyTimeout = DefaultCreateImageTimeout
|
|
}
|
|
|
|
if len(errs) > 0 {
|
|
return errs
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (imageDestination *ImageDestination) validate() []error {
|
|
var errs []error
|
|
|
|
if imageDestination.Region == "" {
|
|
errs = append(errs, fmt.Errorf("%q must be set", "image_copy_region"))
|
|
}
|
|
|
|
if imageDestination.ProjectId == "" {
|
|
errs = append(errs, fmt.Errorf("%q must be set", "image_copy_project"))
|
|
}
|
|
|
|
if imageDestination.Name != "" && !ImageNamePattern.MatchString(imageDestination.Name) {
|
|
errs = append(errs, fmt.Errorf("expected %q to be 1-63 characters and only support chinese, english, numbers, '-_,.:[]', got %q", "image_copy_name", imageDestination.Name))
|
|
}
|
|
|
|
return errs
|
|
}
|