2020-05-07 11:52:49 -04:00
|
|
|
package command
|
|
|
|
|
|
|
|
import (
|
|
|
|
"flag"
|
2020-05-08 05:59:10 -04:00
|
|
|
"strings"
|
2020-05-07 11:52:49 -04:00
|
|
|
|
2020-11-16 17:23:35 -05:00
|
|
|
"github.com/hashicorp/packer/command/enumflag"
|
|
|
|
kvflag "github.com/hashicorp/packer/command/flag-kv"
|
|
|
|
sliceflag "github.com/hashicorp/packer/command/flag-slice"
|
2020-05-07 11:52:49 -04:00
|
|
|
)
|
|
|
|
|
2020-06-05 11:23:54 -04:00
|
|
|
//go:generate enumer -type configType -trimprefix ConfigType -transform snake
|
|
|
|
type configType int
|
|
|
|
|
|
|
|
const (
|
|
|
|
ConfigTypeJSON configType = iota // default config type
|
|
|
|
ConfigTypeHCL2
|
|
|
|
)
|
|
|
|
|
|
|
|
func (c *configType) Set(value string) error {
|
|
|
|
v, err := configTypeString(value)
|
|
|
|
if err == nil {
|
|
|
|
*c = v
|
|
|
|
}
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
2020-05-08 05:59:10 -04:00
|
|
|
// ConfigType tells what type of config we should use, it can return values
|
|
|
|
// like "hcl" or "json".
|
|
|
|
// Make sure Args was correctly set before.
|
2020-06-05 11:23:54 -04:00
|
|
|
func (ma *MetaArgs) GetConfigType() (configType, error) {
|
|
|
|
if ma.Path == "" {
|
|
|
|
return ma.ConfigType, nil
|
2020-05-08 05:59:10 -04:00
|
|
|
}
|
2020-06-05 11:23:54 -04:00
|
|
|
name := ma.Path
|
|
|
|
if name == "-" {
|
|
|
|
// TODO(azr): To allow piping HCL2 confs (when args is "-"), we probably
|
|
|
|
// will need to add a setting that says "this is an HCL config".
|
|
|
|
return ma.ConfigType, nil
|
|
|
|
}
|
|
|
|
if strings.HasSuffix(name, ".pkr.hcl") ||
|
|
|
|
strings.HasSuffix(name, ".pkr.json") {
|
|
|
|
return ConfigTypeHCL2, nil
|
|
|
|
}
|
|
|
|
isDir, err := isDir(name)
|
|
|
|
if isDir {
|
|
|
|
return ConfigTypeHCL2, err
|
|
|
|
}
|
|
|
|
return ma.ConfigType, err
|
2020-05-08 05:59:10 -04:00
|
|
|
}
|
|
|
|
|
2020-05-08 10:41:47 -04:00
|
|
|
// NewMetaArgs parses cli args and put possible values
|
|
|
|
func (ma *MetaArgs) AddFlagSets(fs *flag.FlagSet) {
|
|
|
|
fs.Var((*sliceflag.StringFlag)(&ma.Only), "only", "")
|
|
|
|
fs.Var((*sliceflag.StringFlag)(&ma.Except), "except", "")
|
|
|
|
fs.Var((*kvflag.Flag)(&ma.Vars), "var", "")
|
|
|
|
fs.Var((*kvflag.StringSlice)(&ma.VarFiles), "var-file", "")
|
2020-06-05 11:23:54 -04:00
|
|
|
fs.Var(&ma.ConfigType, "config-type", "set to 'hcl2' to run in hcl2 mode when no file is passed.")
|
2020-05-08 10:41:47 -04:00
|
|
|
}
|
|
|
|
|
2020-05-07 11:52:49 -04:00
|
|
|
// MetaArgs defines commonalities between all comands
|
|
|
|
type MetaArgs struct {
|
2020-06-05 11:23:54 -04:00
|
|
|
// TODO(azr): in the future, I want to allow passing multiple path to
|
|
|
|
// merge HCL confs together; but this will probably need an RFC first.
|
2020-05-08 10:41:47 -04:00
|
|
|
Path string
|
2020-05-07 11:52:49 -04:00
|
|
|
Only, Except []string
|
|
|
|
Vars map[string]string
|
|
|
|
VarFiles []string
|
2020-06-05 11:23:54 -04:00
|
|
|
// set to "hcl2" to force hcl2 mode
|
|
|
|
ConfigType configType
|
2020-05-07 11:52:49 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
func (ba *BuildArgs) AddFlagSets(flags *flag.FlagSet) {
|
|
|
|
flags.BoolVar(&ba.Color, "color", true, "")
|
|
|
|
flags.BoolVar(&ba.Debug, "debug", false, "")
|
|
|
|
flags.BoolVar(&ba.Force, "force", false, "")
|
|
|
|
flags.BoolVar(&ba.TimestampUi, "timestamp-ui", false, "")
|
|
|
|
flags.BoolVar(&ba.MachineReadable, "machine-readable", false, "")
|
|
|
|
|
|
|
|
flags.Int64Var(&ba.ParallelBuilds, "parallel-builds", 0, "")
|
|
|
|
|
2020-06-16 09:29:56 -04:00
|
|
|
flagOnError := enumflag.New(&ba.OnError, "cleanup", "abort", "ask", "run-cleanup-provisioner")
|
2020-05-07 11:52:49 -04:00
|
|
|
flags.Var(flagOnError, "on-error", "")
|
|
|
|
|
|
|
|
ba.MetaArgs.AddFlagSets(flags)
|
|
|
|
}
|
|
|
|
|
|
|
|
// BuildArgs represents a parsed cli line for a `packer build`
|
|
|
|
type BuildArgs struct {
|
|
|
|
MetaArgs
|
|
|
|
Color, Debug, Force, TimestampUi, MachineReadable bool
|
|
|
|
ParallelBuilds int64
|
|
|
|
OnError string
|
|
|
|
}
|
|
|
|
|
2021-02-02 12:05:04 -05:00
|
|
|
func (ia *InitArgs) AddFlagSets(flags *flag.FlagSet) {
|
|
|
|
flags.BoolVar(&ia.Upgrade, "upgrade", false, "upgrade any present plugin to the highest allowed version.")
|
|
|
|
|
|
|
|
ia.MetaArgs.AddFlagSets(flags)
|
|
|
|
}
|
|
|
|
|
|
|
|
// InitArgs represents a parsed cli line for a `packer build`
|
|
|
|
type InitArgs struct {
|
|
|
|
MetaArgs
|
|
|
|
Upgrade bool
|
|
|
|
}
|
|
|
|
|
2020-05-07 11:52:49 -04:00
|
|
|
// ConsoleArgs represents a parsed cli line for a `packer console`
|
2020-06-05 11:23:54 -04:00
|
|
|
type ConsoleArgs struct {
|
|
|
|
MetaArgs
|
|
|
|
}
|
2020-05-07 11:52:49 -04:00
|
|
|
|
|
|
|
func (fa *FixArgs) AddFlagSets(flags *flag.FlagSet) {
|
|
|
|
flags.BoolVar(&fa.Validate, "validate", true, "")
|
|
|
|
|
|
|
|
fa.MetaArgs.AddFlagSets(flags)
|
|
|
|
}
|
|
|
|
|
|
|
|
// FixArgs represents a parsed cli line for a `packer fix`
|
|
|
|
type FixArgs struct {
|
|
|
|
MetaArgs
|
|
|
|
Validate bool
|
|
|
|
}
|
|
|
|
|
|
|
|
func (va *ValidateArgs) AddFlagSets(flags *flag.FlagSet) {
|
2020-05-12 06:07:02 -04:00
|
|
|
flags.BoolVar(&va.SyntaxOnly, "syntax-only", false, "check syntax only")
|
2020-05-07 11:52:49 -04:00
|
|
|
|
|
|
|
va.MetaArgs.AddFlagSets(flags)
|
|
|
|
}
|
|
|
|
|
|
|
|
// ValidateArgs represents a parsed cli line for a `packer validate`
|
|
|
|
type ValidateArgs struct {
|
|
|
|
MetaArgs
|
|
|
|
SyntaxOnly bool
|
|
|
|
}
|
2020-06-23 05:58:57 -04:00
|
|
|
|
|
|
|
func (va *InspectArgs) AddFlagSets(flags *flag.FlagSet) {
|
|
|
|
va.MetaArgs.AddFlagSets(flags)
|
|
|
|
}
|
|
|
|
|
|
|
|
// InspectArgs represents a parsed cli line for a `packer inspect`
|
|
|
|
type InspectArgs struct {
|
|
|
|
MetaArgs
|
|
|
|
}
|
2020-08-25 04:51:43 -04:00
|
|
|
|
|
|
|
func (va *HCL2UpgradeArgs) AddFlagSets(flags *flag.FlagSet) {
|
|
|
|
flags.StringVar(&va.OutputFile, "output-file", "", "File where to put the hcl2 generated config. Defaults to JSON_TEMPLATE.pkr.hcl")
|
2021-02-12 09:31:13 -05:00
|
|
|
flags.BoolVar(&va.WithAnnotations, "with-annotations", false, "Adds helper annotations with information about the generated HCL2 blocks.")
|
2020-08-25 04:51:43 -04:00
|
|
|
|
|
|
|
va.MetaArgs.AddFlagSets(flags)
|
|
|
|
}
|
|
|
|
|
2020-11-11 11:49:39 -05:00
|
|
|
// HCL2UpgradeArgs represents a parsed cli line for a `packer hcl2_upgrade`
|
2020-08-25 04:51:43 -04:00
|
|
|
type HCL2UpgradeArgs struct {
|
|
|
|
MetaArgs
|
2021-02-12 09:18:53 -05:00
|
|
|
OutputFile string
|
|
|
|
WithAnnotations bool
|
2020-08-25 04:51:43 -04:00
|
|
|
}
|
2020-11-11 11:49:39 -05:00
|
|
|
|
|
|
|
func (va *FormatArgs) AddFlagSets(flags *flag.FlagSet) {
|
|
|
|
flags.BoolVar(&va.Check, "check", false, "check if the input is formatted")
|
|
|
|
flags.BoolVar(&va.Diff, "diff", false, "display the diff of formatting changes")
|
|
|
|
flags.BoolVar(&va.Write, "write", true, "overwrite source files instead of writing to stdout")
|
|
|
|
|
|
|
|
va.MetaArgs.AddFlagSets(flags)
|
|
|
|
}
|
|
|
|
|
|
|
|
// FormatArgs represents a parsed cli line for `packer fmt`
|
|
|
|
type FormatArgs struct {
|
|
|
|
MetaArgs
|
|
|
|
Check, Diff, Write bool
|
|
|
|
}
|