In Vagrant post-processor, check whether the host system is able to create a dummy Vagrant box before processing (#8431)
This commit is contained in:
parent
49a33c04cd
commit
d9a128a375
|
@ -93,6 +93,11 @@ func (p *PostProcessor) PostProcessProvider(name string, provider Provider, ui p
|
||||||
config = specificConfig
|
config = specificConfig
|
||||||
}
|
}
|
||||||
|
|
||||||
|
err := CreateDummyBox(ui, config.CompressionLevel)
|
||||||
|
if err != nil {
|
||||||
|
return nil, false, err
|
||||||
|
}
|
||||||
|
|
||||||
ui.Say(fmt.Sprintf("Creating Vagrant box for '%s' provider", name))
|
ui.Say(fmt.Sprintf("Creating Vagrant box for '%s' provider", name))
|
||||||
|
|
||||||
config.ctx.Data = &outputPathTemplate{
|
config.ctx.Data = &outputPathTemplate{
|
||||||
|
|
|
@ -5,6 +5,7 @@ import (
|
||||||
"compress/flate"
|
"compress/flate"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"github.com/hashicorp/packer/packer/tmp"
|
||||||
"io"
|
"io"
|
||||||
"log"
|
"log"
|
||||||
"os"
|
"os"
|
||||||
|
@ -158,6 +159,39 @@ func DirToBox(dst, dir string, ui packer.Ui, level int) error {
|
||||||
return filepath.Walk(dir, tarWalk)
|
return filepath.Walk(dir, tarWalk)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// CreateDummyBox create a dummy Vagrant-compatible box under temporary dir
|
||||||
|
// This function is mainly used to check cases such as the host system having
|
||||||
|
// a GNU tar incompatible uname that will cause the actual Vagrant box creation
|
||||||
|
// to fail later
|
||||||
|
func CreateDummyBox(ui packer.Ui, level int) error {
|
||||||
|
ui.Say("Creating a dummy Vagrant box to ensure the host system can create one correctly")
|
||||||
|
|
||||||
|
// Create a temporary dir to create dummy Vagrant box from
|
||||||
|
tempDir, err := tmp.Dir("packer")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer os.RemoveAll(tempDir)
|
||||||
|
|
||||||
|
// Write some dummy metadata for the box
|
||||||
|
if err := WriteMetadata(tempDir, make(map[string]string)); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create the dummy Vagrant box
|
||||||
|
tempBox, err := tmp.File("box-*.box")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer tempBox.Close()
|
||||||
|
defer os.Remove(tempBox.Name())
|
||||||
|
if err := DirToBox(tempBox.Name(), tempDir, nil, level); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// WriteMetadata writes the "metadata.json" file for a Vagrant box.
|
// WriteMetadata writes the "metadata.json" file for a Vagrant box.
|
||||||
func WriteMetadata(dir string, contents interface{}) error {
|
func WriteMetadata(dir string, contents interface{}) error {
|
||||||
if _, err := os.Stat(filepath.Join(dir, "metadata.json")); os.IsNotExist(err) {
|
if _, err := os.Stat(filepath.Join(dir, "metadata.json")); os.IsNotExist(err) {
|
||||||
|
|
Loading…
Reference in New Issue