packer: validate minimum version [GH-2310]

This commit is contained in:
Mitchell Hashimoto 2015-06-29 11:49:45 -07:00
parent 8657b1e9d8
commit 2498ad02c8
6 changed files with 58 additions and 0 deletions

View File

@ -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)

View File

@ -168,6 +168,7 @@ func wrappedMain() int {
PostProcessor: config.LoadPostProcessor,
Provisioner: config.LoadProvisioner,
},
Version: Version,
},
Cache: cache,
Ui: ui,

View File

@ -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 {

View File

@ -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)

View File

@ -0,0 +1,7 @@
{
"min_packer_version": "2.1.0",
"builders": [
{"type": "foo"}
]
}

View File

@ -0,0 +1,7 @@
{
"min_packer_version": "0.1.0",
"builders": [
{"type": "foo"}
]
}