Commit 2498ad02 authored by Mitchell Hashimoto's avatar Mitchell Hashimoto

packer: validate minimum version [GH-2310]

parent 8657b1e9
......@@ -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)
......
......@@ -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)
......
{
"min_packer_version": "2.1.0",
"builders": [
{"type": "foo"}
]
}
{
"min_packer_version": "0.1.0",
"builders": [
{"type": "foo"}
]
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment