mirror of
https://github.com/hashicorp/packer.git
synced 2026-09-25 01:04:00 -04:00
This commit attempts to fix the timestamp-related part of #4885 by using the logic found in the analogous virtualbox implementation. In essence, it applies the solution from commit 93bb0d8 to the vmx case.
94 lines
3.0 KiB
Go
94 lines
3.0 KiB
Go
package vmx
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
|
|
vmwcommon "github.com/hashicorp/packer/builder/vmware/common"
|
|
"github.com/hashicorp/packer/common"
|
|
"github.com/hashicorp/packer/helper/config"
|
|
"github.com/hashicorp/packer/packer"
|
|
"github.com/hashicorp/packer/template/interpolate"
|
|
)
|
|
|
|
// Config is the configuration structure for the builder.
|
|
type Config struct {
|
|
common.PackerConfig `mapstructure:",squash"`
|
|
common.HTTPConfig `mapstructure:",squash"`
|
|
common.FloppyConfig `mapstructure:",squash"`
|
|
vmwcommon.DriverConfig `mapstructure:",squash"`
|
|
vmwcommon.OutputConfig `mapstructure:",squash"`
|
|
vmwcommon.RunConfig `mapstructure:",squash"`
|
|
vmwcommon.ShutdownConfig `mapstructure:",squash"`
|
|
vmwcommon.SSHConfig `mapstructure:",squash"`
|
|
vmwcommon.ToolsConfig `mapstructure:",squash"`
|
|
vmwcommon.VMXConfig `mapstructure:",squash"`
|
|
|
|
BootCommand []string `mapstructure:"boot_command"`
|
|
RemoteType string `mapstructure:"remote_type"`
|
|
SkipCompaction bool `mapstructure:"skip_compaction"`
|
|
SourcePath string `mapstructure:"source_path"`
|
|
VMName string `mapstructure:"vm_name"`
|
|
|
|
ctx interpolate.Context
|
|
}
|
|
|
|
func NewConfig(raws ...interface{}) (*Config, []string, error) {
|
|
c := new(Config)
|
|
err := config.Decode(c, &config.DecodeOpts{
|
|
Interpolate: true,
|
|
InterpolateContext: &c.ctx,
|
|
InterpolateFilter: &interpolate.RenderFilter{
|
|
Exclude: []string{
|
|
"boot_command",
|
|
"tools_upload_path",
|
|
},
|
|
},
|
|
}, raws...)
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
|
|
// Defaults
|
|
if c.VMName == "" {
|
|
c.VMName = fmt.Sprintf(
|
|
"packer-%s-%d", c.PackerBuildName, interpolate.InitTime.Unix())
|
|
}
|
|
|
|
// Prepare the errors
|
|
var errs *packer.MultiError
|
|
errs = packer.MultiErrorAppend(errs, c.DriverConfig.Prepare(&c.ctx)...)
|
|
errs = packer.MultiErrorAppend(errs, c.HTTPConfig.Prepare(&c.ctx)...)
|
|
errs = packer.MultiErrorAppend(errs, c.OutputConfig.Prepare(&c.ctx, &c.PackerConfig)...)
|
|
errs = packer.MultiErrorAppend(errs, c.RunConfig.Prepare(&c.ctx)...)
|
|
errs = packer.MultiErrorAppend(errs, c.ShutdownConfig.Prepare(&c.ctx)...)
|
|
errs = packer.MultiErrorAppend(errs, c.SSHConfig.Prepare(&c.ctx)...)
|
|
errs = packer.MultiErrorAppend(errs, c.ToolsConfig.Prepare(&c.ctx)...)
|
|
errs = packer.MultiErrorAppend(errs, c.VMXConfig.Prepare(&c.ctx)...)
|
|
errs = packer.MultiErrorAppend(errs, c.FloppyConfig.Prepare(&c.ctx)...)
|
|
|
|
if c.SourcePath == "" {
|
|
errs = packer.MultiErrorAppend(errs, fmt.Errorf("source_path is blank, but is required"))
|
|
} else {
|
|
if _, err := os.Stat(c.SourcePath); err != nil {
|
|
errs = packer.MultiErrorAppend(errs,
|
|
fmt.Errorf("source_path is invalid: %s", err))
|
|
}
|
|
}
|
|
|
|
// Warnings
|
|
var warnings []string
|
|
if c.ShutdownCommand == "" {
|
|
warnings = append(warnings,
|
|
"A shutdown_command was not specified. Without a shutdown command, Packer\n"+
|
|
"will forcibly halt the virtual machine, which may result in data loss.")
|
|
}
|
|
|
|
// Check for any errors.
|
|
if errs != nil && len(errs.Errors) > 0 {
|
|
return nil, warnings, errs
|
|
}
|
|
|
|
return c, warnings, nil
|
|
}
|