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  }