2019-10-14 10:43:59 -04:00
//go:generate mapstructure-to-hcl2 -type ImageDestination
2020-06-24 08:31:05 -04:00
//go:generate struct-markdown
2019-10-14 10:43:59 -04:00
2019-10-12 04:46:21 -04:00
package common
2019-06-13 03:16:49 -04:00
import (
"fmt"
"regexp"
2019-10-14 10:43:59 -04:00
2020-12-17 16:29:25 -05:00
"github.com/hashicorp/packer-plugin-sdk/template/interpolate"
2019-06-13 03:16:49 -04:00
)
type ImageDestination struct {
2020-06-24 08:31:05 -04:00
// 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" `
2019-06-13 03:16:49 -04:00
}
type ImageConfig struct {
2020-06-24 08:31:05 -04:00
// 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" `
2019-06-13 03:16:49 -04:00
}
2019-10-18 02:52:20 -04:00
var ImageNamePattern = regexp . MustCompile ( ` ^[A-Za-z0-9\p { Han}-_\[\]:,.] { 1,63}$ ` )
2019-06-13 03:16:49 -04:00
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" ) )
2019-10-18 02:52:20 -04:00
} else if ! ImageNamePattern . MatchString ( imageName ) {
2019-06-13 03:16:49 -04:00
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
}
2019-06-19 09:32:33 -04:00
2019-06-13 03:16:49 -04:00
errs = append ( errs , imageDestination . validate ( ) ... )
}
}
2019-10-18 02:52:20 -04:00
if c . WaitImageReadyTimeout <= 0 {
2019-10-24 05:10:48 -04:00
c . WaitImageReadyTimeout = DefaultCreateImageTimeout
2019-10-18 02:52:20 -04:00
}
2019-06-13 03:16:49 -04:00
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" ) )
}
2019-10-18 02:52:20 -04:00
if imageDestination . Name != "" && ! ImageNamePattern . MatchString ( imageDestination . Name ) {
2019-06-13 03:16:49 -04:00
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
}