virtualbox: merge ExportOpts and ExportConfig structs
This commit is contained in:
parent
d4c400aa71
commit
01eff9472a
|
@ -12,6 +12,47 @@ type ExportConfig struct {
|
||||||
// Either ovf or ova, this specifies the output format
|
// Either ovf or ova, this specifies the output format
|
||||||
// of the exported virtual machine. This defaults to ovf.
|
// of the exported virtual machine. This defaults to ovf.
|
||||||
Format string `mapstructure:"format" required:"false"`
|
Format string `mapstructure:"format" required:"false"`
|
||||||
|
// Additional options to pass to the [VBoxManage
|
||||||
|
// export](https://www.virtualbox.org/manual/ch09.html#vboxmanage-export).
|
||||||
|
// This can be useful for passing product information to include in the
|
||||||
|
// resulting appliance file. Packer JSON configuration file example:
|
||||||
|
//
|
||||||
|
// ``` json
|
||||||
|
// {
|
||||||
|
// "type": "virtualbox-iso",
|
||||||
|
// "export_opts":
|
||||||
|
// [
|
||||||
|
// "--manifest",
|
||||||
|
// "--vsys", "0",
|
||||||
|
// "--description", "{{user `vm_description`}}",
|
||||||
|
// "--version", "{{user `vm_version`}}"
|
||||||
|
// ],
|
||||||
|
// "format": "ova",
|
||||||
|
// }
|
||||||
|
// ```
|
||||||
|
//
|
||||||
|
// A VirtualBox [VM
|
||||||
|
// description](https://www.virtualbox.org/manual/ch09.html#vboxmanage-export-ovf)
|
||||||
|
// may contain arbitrary strings; the GUI interprets HTML formatting. However,
|
||||||
|
// the JSON format does not allow arbitrary newlines within a value. Add a
|
||||||
|
// multi-line description by preparing the string in the shell before the
|
||||||
|
// packer call like this (shell `>` continuation character snipped for easier
|
||||||
|
// copy & paste):
|
||||||
|
//
|
||||||
|
// ``` {.shell}
|
||||||
|
//
|
||||||
|
// vm_description='some
|
||||||
|
// multiline
|
||||||
|
// description'
|
||||||
|
//
|
||||||
|
// vm_version='0.2.0'
|
||||||
|
//
|
||||||
|
// packer build \
|
||||||
|
// -var "vm_description=${vm_description}" \
|
||||||
|
// -var "vm_version=${vm_version}" \
|
||||||
|
// "packer_conf.json"
|
||||||
|
// ```
|
||||||
|
ExportOpts []string `mapstructure:"export_opts" required:"false"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *ExportConfig) Prepare(ctx *interpolate.Context) []error {
|
func (c *ExportConfig) Prepare(ctx *interpolate.Context) []error {
|
||||||
|
@ -25,5 +66,9 @@ func (c *ExportConfig) Prepare(ctx *interpolate.Context) []error {
|
||||||
errors.New("invalid format, only 'ovf' or 'ova' are allowed"))
|
errors.New("invalid format, only 'ovf' or 'ova' are allowed"))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if c.ExportOpts == nil {
|
||||||
|
c.ExportOpts = make([]string, 0)
|
||||||
|
}
|
||||||
|
|
||||||
return errs
|
return errs
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,3 +34,18 @@ func TestExportConfigPrepare_BootWait(t *testing.T) {
|
||||||
t.Fatalf("should not have error: %s", errs)
|
t.Fatalf("should not have error: %s", errs)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestExportConfigPrepare_Opts(t *testing.T) {
|
||||||
|
var c *ExportConfig
|
||||||
|
var errs []error
|
||||||
|
|
||||||
|
// Good
|
||||||
|
c = new(ExportConfig)
|
||||||
|
c.ExportOpts = []string{
|
||||||
|
"--options",
|
||||||
|
}
|
||||||
|
errs = c.Prepare(interpolate.NewContext())
|
||||||
|
if len(errs) > 0 {
|
||||||
|
t.Fatalf("should not have error: %s", errs)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -1,24 +0,0 @@
|
||||||
//go:generate struct-markdown
|
|
||||||
|
|
||||||
package common
|
|
||||||
|
|
||||||
import (
|
|
||||||
"github.com/hashicorp/packer/template/interpolate"
|
|
||||||
)
|
|
||||||
|
|
||||||
type ExportOpts struct {
|
|
||||||
// Additional options to pass to the
|
|
||||||
// VBoxManage
|
|
||||||
// export. This
|
|
||||||
// can be useful for passing product information to include in the resulting
|
|
||||||
// appliance file. Packer JSON configuration file example:
|
|
||||||
ExportOpts []string `mapstructure:"export_opts" required:"false"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *ExportOpts) Prepare(ctx *interpolate.Context) []error {
|
|
||||||
if c.ExportOpts == nil {
|
|
||||||
c.ExportOpts = make([]string, 0)
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
|
@ -1,22 +0,0 @@
|
||||||
package common
|
|
||||||
|
|
||||||
import (
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/hashicorp/packer/template/interpolate"
|
|
||||||
)
|
|
||||||
|
|
||||||
func TestExportOptsPrepare_BootWait(t *testing.T) {
|
|
||||||
var c *ExportOpts
|
|
||||||
var errs []error
|
|
||||||
|
|
||||||
// Good
|
|
||||||
c = new(ExportOpts)
|
|
||||||
c.ExportOpts = []string{
|
|
||||||
"--options",
|
|
||||||
}
|
|
||||||
errs = c.Prepare(interpolate.NewContext())
|
|
||||||
if len(errs) > 0 {
|
|
||||||
t.Fatalf("should not have error: %s", errs)
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -32,7 +32,6 @@ type Config struct {
|
||||||
common.FloppyConfig `mapstructure:",squash"`
|
common.FloppyConfig `mapstructure:",squash"`
|
||||||
bootcommand.BootConfig `mapstructure:",squash"`
|
bootcommand.BootConfig `mapstructure:",squash"`
|
||||||
vboxcommon.ExportConfig `mapstructure:",squash"`
|
vboxcommon.ExportConfig `mapstructure:",squash"`
|
||||||
vboxcommon.ExportOpts `mapstructure:",squash"`
|
|
||||||
vboxcommon.OutputConfig `mapstructure:",squash"`
|
vboxcommon.OutputConfig `mapstructure:",squash"`
|
||||||
vboxcommon.RunConfig `mapstructure:",squash"`
|
vboxcommon.RunConfig `mapstructure:",squash"`
|
||||||
vboxcommon.ShutdownConfig `mapstructure:",squash"`
|
vboxcommon.ShutdownConfig `mapstructure:",squash"`
|
||||||
|
@ -146,7 +145,7 @@ func (b *Builder) Prepare(raws ...interface{}) ([]string, error) {
|
||||||
errs = packer.MultiErrorAppend(errs, isoErrs...)
|
errs = packer.MultiErrorAppend(errs, isoErrs...)
|
||||||
|
|
||||||
errs = packer.MultiErrorAppend(errs, b.config.ExportConfig.Prepare(&b.config.ctx)...)
|
errs = packer.MultiErrorAppend(errs, b.config.ExportConfig.Prepare(&b.config.ctx)...)
|
||||||
errs = packer.MultiErrorAppend(errs, b.config.ExportOpts.Prepare(&b.config.ctx)...)
|
errs = packer.MultiErrorAppend(errs, b.config.ExportConfig.Prepare(&b.config.ctx)...)
|
||||||
errs = packer.MultiErrorAppend(errs, b.config.FloppyConfig.Prepare(&b.config.ctx)...)
|
errs = packer.MultiErrorAppend(errs, b.config.FloppyConfig.Prepare(&b.config.ctx)...)
|
||||||
errs = packer.MultiErrorAppend(
|
errs = packer.MultiErrorAppend(
|
||||||
errs, b.config.OutputConfig.Prepare(&b.config.ctx, &b.config.PackerConfig)...)
|
errs, b.config.OutputConfig.Prepare(&b.config.ctx, &b.config.PackerConfig)...)
|
||||||
|
@ -362,7 +361,7 @@ func (b *Builder) Run(ctx context.Context, ui packer.Ui, hook packer.Hook) (pack
|
||||||
&vboxcommon.StepExport{
|
&vboxcommon.StepExport{
|
||||||
Format: b.config.Format,
|
Format: b.config.Format,
|
||||||
OutputDir: b.config.OutputDir,
|
OutputDir: b.config.OutputDir,
|
||||||
ExportOpts: b.config.ExportOpts.ExportOpts,
|
ExportOpts: b.config.ExportConfig.ExportOpts,
|
||||||
Bundling: b.config.VBoxBundleConfig,
|
Bundling: b.config.VBoxBundleConfig,
|
||||||
SkipNatMapping: b.config.SSHSkipNatMapping,
|
SkipNatMapping: b.config.SSHSkipNatMapping,
|
||||||
SkipExport: b.config.SkipExport,
|
SkipExport: b.config.SkipExport,
|
||||||
|
|
|
@ -152,7 +152,7 @@ func (b *Builder) Run(ctx context.Context, ui packer.Ui, hook packer.Hook) (pack
|
||||||
&vboxcommon.StepExport{
|
&vboxcommon.StepExport{
|
||||||
Format: b.config.Format,
|
Format: b.config.Format,
|
||||||
OutputDir: b.config.OutputDir,
|
OutputDir: b.config.OutputDir,
|
||||||
ExportOpts: b.config.ExportOpts.ExportOpts,
|
ExportOpts: b.config.ExportConfig.ExportOpts,
|
||||||
SkipNatMapping: b.config.SSHSkipNatMapping,
|
SkipNatMapping: b.config.SSHSkipNatMapping,
|
||||||
SkipExport: b.config.SkipExport,
|
SkipExport: b.config.SkipExport,
|
||||||
},
|
},
|
||||||
|
|
|
@ -22,7 +22,6 @@ type Config struct {
|
||||||
common.FloppyConfig `mapstructure:",squash"`
|
common.FloppyConfig `mapstructure:",squash"`
|
||||||
bootcommand.BootConfig `mapstructure:",squash"`
|
bootcommand.BootConfig `mapstructure:",squash"`
|
||||||
vboxcommon.ExportConfig `mapstructure:",squash"`
|
vboxcommon.ExportConfig `mapstructure:",squash"`
|
||||||
vboxcommon.ExportOpts `mapstructure:",squash"`
|
|
||||||
vboxcommon.OutputConfig `mapstructure:",squash"`
|
vboxcommon.OutputConfig `mapstructure:",squash"`
|
||||||
vboxcommon.RunConfig `mapstructure:",squash"`
|
vboxcommon.RunConfig `mapstructure:",squash"`
|
||||||
vboxcommon.SSHConfig `mapstructure:",squash"`
|
vboxcommon.SSHConfig `mapstructure:",squash"`
|
||||||
|
@ -145,7 +144,7 @@ func NewConfig(raws ...interface{}) (*Config, []string, error) {
|
||||||
// Prepare the errors
|
// Prepare the errors
|
||||||
var errs *packer.MultiError
|
var errs *packer.MultiError
|
||||||
errs = packer.MultiErrorAppend(errs, c.ExportConfig.Prepare(&c.ctx)...)
|
errs = packer.MultiErrorAppend(errs, c.ExportConfig.Prepare(&c.ctx)...)
|
||||||
errs = packer.MultiErrorAppend(errs, c.ExportOpts.Prepare(&c.ctx)...)
|
errs = packer.MultiErrorAppend(errs, c.ExportConfig.Prepare(&c.ctx)...)
|
||||||
errs = packer.MultiErrorAppend(errs, c.FloppyConfig.Prepare(&c.ctx)...)
|
errs = packer.MultiErrorAppend(errs, c.FloppyConfig.Prepare(&c.ctx)...)
|
||||||
errs = packer.MultiErrorAppend(errs, c.HTTPConfig.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.OutputConfig.Prepare(&c.ctx, &c.PackerConfig)...)
|
||||||
|
|
|
@ -2,4 +2,45 @@
|
||||||
|
|
||||||
- `format` (string) - Either ovf or ova, this specifies the output format
|
- `format` (string) - Either ovf or ova, this specifies the output format
|
||||||
of the exported virtual machine. This defaults to ovf.
|
of the exported virtual machine. This defaults to ovf.
|
||||||
|
|
||||||
|
- `export_opts` ([]string) - Additional options to pass to the [VBoxManage
|
||||||
|
export](https://www.virtualbox.org/manual/ch09.html#vboxmanage-export).
|
||||||
|
This can be useful for passing product information to include in the
|
||||||
|
resulting appliance file. Packer JSON configuration file example:
|
||||||
|
|
||||||
|
``` json
|
||||||
|
{
|
||||||
|
"type": "virtualbox-iso",
|
||||||
|
"export_opts":
|
||||||
|
[
|
||||||
|
"--manifest",
|
||||||
|
"--vsys", "0",
|
||||||
|
"--description", "{{user `vm_description`}}",
|
||||||
|
"--version", "{{user `vm_version`}}"
|
||||||
|
],
|
||||||
|
"format": "ova",
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
A VirtualBox [VM
|
||||||
|
description](https://www.virtualbox.org/manual/ch09.html#vboxmanage-export-ovf)
|
||||||
|
may contain arbitrary strings; the GUI interprets HTML formatting. However,
|
||||||
|
the JSON format does not allow arbitrary newlines within a value. Add a
|
||||||
|
multi-line description by preparing the string in the shell before the
|
||||||
|
packer call like this (shell `>` continuation character snipped for easier
|
||||||
|
copy & paste):
|
||||||
|
|
||||||
|
``` {.shell}
|
||||||
|
|
||||||
|
vm_description='some
|
||||||
|
multiline
|
||||||
|
description'
|
||||||
|
|
||||||
|
vm_version='0.2.0'
|
||||||
|
|
||||||
|
packer build \
|
||||||
|
-var "vm_description=${vm_description}" \
|
||||||
|
-var "vm_version=${vm_version}" \
|
||||||
|
"packer_conf.json"
|
||||||
|
```
|
||||||
|
|
Loading…
Reference in New Issue