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
|
CoreConfig *packer.CoreConfig
|
||||||
Cache packer.Cache
|
Cache packer.Cache
|
||||||
Ui packer.Ui
|
Ui packer.Ui
|
||||||
|
Version string
|
||||||
|
|
||||||
// These are set by command-line flags
|
// These are set by command-line flags
|
||||||
flagBuildExcept []string
|
flagBuildExcept []string
|
||||||
@ -42,6 +43,7 @@ func (m *Meta) Core(tpl *template.Template) (*packer.Core, error) {
|
|||||||
config := *m.CoreConfig
|
config := *m.CoreConfig
|
||||||
config.Template = tpl
|
config.Template = tpl
|
||||||
config.Variables = m.flagVars
|
config.Variables = m.flagVars
|
||||||
|
config.Version = m.Version
|
||||||
|
|
||||||
// Init the core
|
// Init the core
|
||||||
core, err := packer.NewCore(&config)
|
core, err := packer.NewCore(&config)
|
||||||
|
1
main.go
1
main.go
@ -168,6 +168,7 @@ func wrappedMain() int {
|
|||||||
PostProcessor: config.LoadPostProcessor,
|
PostProcessor: config.LoadPostProcessor,
|
||||||
Provisioner: config.LoadProvisioner,
|
Provisioner: config.LoadProvisioner,
|
||||||
},
|
},
|
||||||
|
Version: Version,
|
||||||
},
|
},
|
||||||
Cache: cache,
|
Cache: cache,
|
||||||
Ui: ui,
|
Ui: ui,
|
||||||
|
@ -5,6 +5,7 @@ import (
|
|||||||
"sort"
|
"sort"
|
||||||
|
|
||||||
"github.com/hashicorp/go-multierror"
|
"github.com/hashicorp/go-multierror"
|
||||||
|
"github.com/hashicorp/go-version"
|
||||||
"github.com/mitchellh/packer/template"
|
"github.com/mitchellh/packer/template"
|
||||||
"github.com/mitchellh/packer/template/interpolate"
|
"github.com/mitchellh/packer/template/interpolate"
|
||||||
)
|
)
|
||||||
@ -17,6 +18,7 @@ type Core struct {
|
|||||||
components ComponentFinder
|
components ComponentFinder
|
||||||
variables map[string]string
|
variables map[string]string
|
||||||
builds map[string]*template.Builder
|
builds map[string]*template.Builder
|
||||||
|
version string
|
||||||
}
|
}
|
||||||
|
|
||||||
// CoreConfig is the structure for initializing a new Core. Once a CoreConfig
|
// CoreConfig is the structure for initializing a new Core. Once a CoreConfig
|
||||||
@ -25,6 +27,7 @@ type CoreConfig struct {
|
|||||||
Components ComponentFinder
|
Components ComponentFinder
|
||||||
Template *template.Template
|
Template *template.Template
|
||||||
Variables map[string]string
|
Variables map[string]string
|
||||||
|
Version string
|
||||||
}
|
}
|
||||||
|
|
||||||
// The function type used to lookup Builder implementations.
|
// The function type used to lookup Builder implementations.
|
||||||
@ -55,6 +58,7 @@ func NewCore(c *CoreConfig) (*Core, error) {
|
|||||||
Template: c.Template,
|
Template: c.Template,
|
||||||
components: c.Components,
|
components: c.Components,
|
||||||
variables: c.Variables,
|
variables: c.Variables,
|
||||||
|
version: c.Version,
|
||||||
}
|
}
|
||||||
if err := result.validate(); err != nil {
|
if err := result.validate(); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@ -226,6 +230,29 @@ func (c *Core) validate() error {
|
|||||||
return err
|
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
|
// Validate variables are set
|
||||||
var err error
|
var err error
|
||||||
for n, v := range c.Template.Variables {
|
for n, v := range c.Template.Variables {
|
||||||
|
@ -484,6 +484,19 @@ func TestCoreValidate(t *testing.T) {
|
|||||||
map[string]string{"foo": "bar"},
|
map[string]string{"foo": "bar"},
|
||||||
false,
|
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 {
|
for _, tc := range cases {
|
||||||
@ -501,6 +514,7 @@ func TestCoreValidate(t *testing.T) {
|
|||||||
_, err = NewCore(&CoreConfig{
|
_, err = NewCore(&CoreConfig{
|
||||||
Template: tpl,
|
Template: tpl,
|
||||||
Variables: tc.Vars,
|
Variables: tc.Vars,
|
||||||
|
Version: "1.0.0",
|
||||||
})
|
})
|
||||||
if (err != nil) != tc.Err {
|
if (err != nil) != tc.Err {
|
||||||
t.Fatalf("err: %s\n\n%s", tc.File, err)
|
t.Fatalf("err: %s\n\n%s", tc.File, err)
|
||||||
|
7
packer/test-fixtures/validate-min-version-high.json
Normal file
7
packer/test-fixtures/validate-min-version-high.json
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"min_packer_version": "2.1.0",
|
||||||
|
|
||||||
|
"builders": [
|
||||||
|
{"type": "foo"}
|
||||||
|
]
|
||||||
|
}
|
7
packer/test-fixtures/validate-min-version.json
Normal file
7
packer/test-fixtures/validate-min-version.json
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"min_packer_version": "0.1.0",
|
||||||
|
|
||||||
|
"builders": [
|
||||||
|
{"type": "foo"}
|
||||||
|
]
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user