github.phpd.cn/hashicorp/packer@v1.3.2/builder/ncloud/config.go (about) 1 package ncloud 2 3 import ( 4 "errors" 5 "fmt" 6 "os" 7 8 "github.com/hashicorp/packer/common" 9 "github.com/hashicorp/packer/helper/communicator" 10 "github.com/hashicorp/packer/helper/config" 11 "github.com/hashicorp/packer/packer" 12 "github.com/hashicorp/packer/template/interpolate" 13 ) 14 15 // Config is structure to use packer builder plugin for Naver Cloud Platform 16 type Config struct { 17 common.PackerConfig `mapstructure:",squash"` 18 19 AccessKey string `mapstructure:"access_key"` 20 SecretKey string `mapstructure:"secret_key"` 21 ServerImageProductCode string `mapstructure:"server_image_product_code"` 22 ServerProductCode string `mapstructure:"server_product_code"` 23 MemberServerImageNo string `mapstructure:"member_server_image_no"` 24 ServerImageName string `mapstructure:"server_image_name"` 25 ServerImageDescription string `mapstructure:"server_image_description"` 26 UserData string `mapstructure:"user_data"` 27 UserDataFile string `mapstructure:"user_data_file"` 28 BlockStorageSize int `mapstructure:"block_storage_size"` 29 Region string `mapstructure:"region"` 30 AccessControlGroupConfigurationNo string `mapstructure:"access_control_group_configuration_no"` 31 32 Comm communicator.Config `mapstructure:",squash"` 33 ctx *interpolate.Context 34 } 35 36 // NewConfig checks parameters 37 func NewConfig(raws ...interface{}) (*Config, []string, error) { 38 c := new(Config) 39 warnings := []string{} 40 41 err := config.Decode(c, &config.DecodeOpts{ 42 Interpolate: true, 43 InterpolateFilter: &interpolate.RenderFilter{ 44 Exclude: []string{}, 45 }, 46 }, raws...) 47 if err != nil { 48 return nil, warnings, err 49 } 50 51 var errs *packer.MultiError 52 if es := c.Comm.Prepare(nil); len(es) > 0 { 53 errs = packer.MultiErrorAppend(errs, es...) 54 } 55 56 if c.AccessKey == "" { 57 errs = packer.MultiErrorAppend(errs, errors.New("access_key is required")) 58 } 59 60 if c.SecretKey == "" { 61 errs = packer.MultiErrorAppend(errs, errors.New("secret_key is required")) 62 } 63 64 if c.MemberServerImageNo == "" && c.ServerImageProductCode == "" { 65 errs = packer.MultiErrorAppend(errs, errors.New("server_image_product_code or member_server_image_no is required")) 66 } 67 68 if c.MemberServerImageNo != "" && c.ServerImageProductCode != "" { 69 errs = packer.MultiErrorAppend(errs, errors.New("Only one of server_image_product_code and member_server_image_no can be set")) 70 } 71 72 if c.ServerImageProductCode != "" && len(c.ServerImageProductCode) > 20 { 73 errs = packer.MultiErrorAppend(errs, errors.New("If server_image_product_code field is set, length of server_image_product_code should be max 20")) 74 } 75 76 if c.ServerProductCode != "" && len(c.ServerProductCode) > 20 { 77 errs = packer.MultiErrorAppend(errs, errors.New("If server_product_code field is set, length of server_product_code should be max 20")) 78 } 79 80 if c.ServerImageName != "" && (len(c.ServerImageName) < 3 || len(c.ServerImageName) > 30) { 81 errs = packer.MultiErrorAppend(errs, errors.New("If server_image_name field is set, length of server_image_name should be min 3 and max 20")) 82 } 83 84 if c.ServerImageDescription != "" && len(c.ServerImageDescription) > 1000 { 85 errs = packer.MultiErrorAppend(errs, errors.New("If server_image_description field is set, length of server_image_description should be max 1000")) 86 } 87 88 if c.BlockStorageSize != 0 { 89 if c.BlockStorageSize < 10 || c.BlockStorageSize > 2000 { 90 errs = packer.MultiErrorAppend(errs, errors.New("The size of BlockStorageSize is at least 10 GB and up to 2000GB")) 91 } else if int(c.BlockStorageSize/10)*10 != c.BlockStorageSize { 92 return nil, nil, errors.New("BlockStorageSize must be a multiple of 10 GB") 93 } 94 } 95 96 if c.UserData != "" && c.UserDataFile != "" { 97 errs = packer.MultiErrorAppend(errs, errors.New("Only one of user_data or user_data_file can be specified.")) 98 } else if c.UserDataFile != "" { 99 if _, err := os.Stat(c.UserDataFile); err != nil { 100 errs = packer.MultiErrorAppend(errs, fmt.Errorf("user_data_file not found: %s", c.UserDataFile)) 101 } 102 } 103 104 if c.UserData != "" && len(c.UserData) > 21847 { 105 errs = packer.MultiErrorAppend(errs, errors.New("If user_data field is set, length of UserData should be max 21847")) 106 } 107 108 if c.Comm.Type == "wrinrm" && c.AccessControlGroupConfigurationNo == "" { 109 errs = packer.MultiErrorAppend(errs, errors.New("If Communicator is winrm, access_control_group_configuration_no is required")) 110 } 111 112 if errs != nil && len(errs.Errors) > 0 { 113 return nil, warnings, errs 114 } 115 116 return c, warnings, nil 117 }