packer: validate minimum version [GH-2310]
This commit is contained in:
parent
8657b1e9d8
commit
2498ad02c8
|
@ -28,6 +28,7 @@ type Meta struct {
|
|||
CoreConfig *packer.CoreConfig
|
||||
Cache packer.Cache
|
||||
Ui packer.Ui
|
||||
Version string
|
||||
|
||||
// These are set by command-line flags
|
||||
flagBuildExcept []string
|
||||
|
@ -42,6 +43,7 @@ func (m *Meta) Core(tpl *template.Template) (*packer.Core, error) {
|
|||
config := *m.CoreConfig
|
||||
config.Template = tpl
|
||||
config.Variables = m.flagVars
|
||||
config.Version = m.Version
|
||||
|
||||
// Init the core
|
||||
core, err := packer.NewCore(&config)
|
||||
|
|
1
main.go
1
main.go
|
@ -168,6 +168,7 @@ func wrappedMain() int {
|
|||
PostProcessor: config.LoadPostProcessor,
|
||||
Provisioner: config.LoadProvisioner,
|
||||
},
|
||||
Version: Version,
|
||||
},
|
||||
Cache: cache,
|
||||
Ui: ui,
|
||||
|
|
|
@ -5,6 +5,7 @@ import (
|
|||
"sort"
|
||||
|
||||
"github.com/hashicorp/go-multierror"
|
||||
"github.com/hashicorp/go-version"
|
||||
"github.com/mitchellh/packer/template"
|
||||
"github.com/mitchellh/packer/template/interpolate"
|
||||
)
|
||||
|
@ -17,6 +18,7 @@ type Core struct {
|
|||
components ComponentFinder
|
||||
variables map[string]string
|
||||
builds map[string]*template.Builder
|
||||
version string
|
||||
}
|
||||
|
||||
// CoreConfig is the structure for initializing a new Core. Once a CoreConfig
|
||||
|
@ -25,6 +27,7 @@ type CoreConfig struct {
|
|||
Components ComponentFinder
|
||||
Template *template.Template
|
||||
Variables map[string]string
|
||||
Version string
|
||||
}
|
||||
|
||||
// The function type used to lookup Builder implementations.
|
||||
|
@ -55,6 +58,7 @@ func NewCore(c *CoreConfig) (*Core, error) {
|
|||
Template: c.Template,
|
||||
components: c.Components,
|
||||
variables: c.Variables,
|
||||
version: c.Version,
|
||||
}
|
||||
if err := result.validate(); err != nil {
|
||||
return nil, err
|
||||
|
@ -226,6 +230,29 @@ func (c *Core) validate() error {
|
|||
return err
|
||||
}
|
||||
|
||||
// Validate the minimum version is satisfied
|
||||
if c.Template.MinVersion != "" {
|
||||
versionActual, err := version.NewVersion(c.version)
|
||||
if err != nil {
|
||||
// This shouldn't happen since we set it via the compiler
|
||||
panic(err)
|
||||
}
|
||||
|
||||
versionMin, err := version.NewVersion(c.Template.MinVersion)
|
||||
if err != nil {
|
||||
return fmt.Errorf(
|
||||
"min_version is invalid: %s", err)
|
||||
}
|
||||
|
||||
if versionActual.LessThan(versionMin) {
|
||||
return fmt.Errorf(
|
||||
"This template requires a minimum Packer version of %s,\n"+
|
||||
"but version %s is running.",
|
||||
versionMin,
|
||||
versionActual)
|
||||
}
|
||||
}
|
||||
|
||||
// Validate variables are set
|
||||
var err error
|
||||
for n, v := range c.Template.Variables {
|
||||
|
|
|
@ -484,6 +484,19 @@ func TestCoreValidate(t *testing.T) {
|
|||
map[string]string{"foo": "bar"},
|
||||
false,
|
||||
},
|
||||
|
||||
// Min version good
|
||||
{
|
||||
"validate-min-version.json",
|
||||
map[string]string{"foo": "bar"},
|
||||
false,
|
||||
},
|
||||
|
||||
{
|
||||
"validate-min-version-high.json",
|
||||
map[string]string{"foo": "bar"},
|
||||
true,
|
||||
},
|
||||
}
|
||||
|
||||
for _, tc := range cases {
|
||||
|
@ -501,6 +514,7 @@ func TestCoreValidate(t *testing.T) {
|
|||
_, err = NewCore(&CoreConfig{
|
||||
Template: tpl,
|
||||
Variables: tc.Vars,
|
||||
Version: "1.0.0",
|
||||
})
|
||||
if (err != nil) != tc.Err {
|
||||
t.Fatalf("err: %s\n\n%s", tc.File, err)
|
||||
|
|
|
@ -0,0 +1,7 @@
|
|||
{
|
||||
"min_packer_version": "2.1.0",
|
||||
|
||||
"builders": [
|
||||
{"type": "foo"}
|
||||
]
|
||||
}
|
|
@ -0,0 +1,7 @@
|
|||
{
|
||||
"min_packer_version": "0.1.0",
|
||||
|
||||
"builders": [
|
||||
{"type": "foo"}
|
||||
]
|
||||
}
|
Loading…
Reference in New Issue