post-processor/vagrant: make output contain build name by default
[GH-92]
This commit is contained in:
parent
44e0a7def5
commit
39095e48ea
|
@ -76,14 +76,14 @@ func ParseTemplate(data []byte) (t *Template, err error) {
|
||||||
newline := []byte{'\x0a'}
|
newline := []byte{'\x0a'}
|
||||||
|
|
||||||
// Calculate the start/end position of the line where the error is
|
// Calculate the start/end position of the line where the error is
|
||||||
start := bytes.LastIndex(data[:syntaxErr.Offset], newline)+1
|
start := bytes.LastIndex(data[:syntaxErr.Offset], newline) + 1
|
||||||
end := len(data)
|
end := len(data)
|
||||||
if idx := bytes.Index(data[start:], newline); idx >= 0 {
|
if idx := bytes.Index(data[start:], newline); idx >= 0 {
|
||||||
end = start + idx
|
end = start + idx
|
||||||
}
|
}
|
||||||
|
|
||||||
// Count the line number we're on plus the offset in the line
|
// Count the line number we're on plus the offset in the line
|
||||||
line := bytes.Count(data[:start], newline)+1
|
line := bytes.Count(data[:start], newline) + 1
|
||||||
pos := int(syntaxErr.Offset) - start - 1
|
pos := int(syntaxErr.Offset) - start - 1
|
||||||
|
|
||||||
err = fmt.Errorf("Error in line %d, char %d: %s\n%s",
|
err = fmt.Errorf("Error in line %d, char %d: %s\n%s",
|
||||||
|
@ -230,151 +230,151 @@ func parsePostProvisioner(i int, rawV interface{}) (result []map[string]interfac
|
||||||
errors = append(
|
errors = append(
|
||||||
errors,
|
errors,
|
||||||
fmt.Errorf("Post-processor %d.%d: sequences not allowed to be nested in sequences", i+1, j+1))
|
fmt.Errorf("Post-processor %d.%d: sequences not allowed to be nested in sequences", i+1, j+1))
|
||||||
default:
|
default:
|
||||||
errors = append(errors, fmt.Errorf("Post-processor %d.%d is in a bad format.", i+1, j+1))
|
errors = append(errors, fmt.Errorf("Post-processor %d.%d is in a bad format.", i+1, j+1))
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(errors) == 0 {
|
|
||||||
errors = nil
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
result = nil
|
|
||||||
errors = []error{fmt.Errorf("Post-processor %d is in a bad format.", i+1)}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if len(errors) == 0 {
|
||||||
|
errors = nil
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
result = nil
|
||||||
|
errors = []error{fmt.Errorf("Post-processor %d is in a bad format.", i+1)}
|
||||||
|
}
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// BuildNames returns a slice of the available names of builds that
|
||||||
|
// this template represents.
|
||||||
|
func (t *Template) BuildNames() []string {
|
||||||
|
names := make([]string, 0, len(t.Builders))
|
||||||
|
for name, _ := range t.Builders {
|
||||||
|
names = append(names, name)
|
||||||
|
}
|
||||||
|
|
||||||
|
return names
|
||||||
|
}
|
||||||
|
|
||||||
|
// Build returns a Build for the given name.
|
||||||
|
//
|
||||||
|
// If the build does not exist as part of this template, an error is
|
||||||
|
// returned.
|
||||||
|
func (t *Template) Build(name string, components *ComponentFinder) (b Build, err error) {
|
||||||
|
// Setup the Builder
|
||||||
|
builderConfig, ok := t.Builders[name]
|
||||||
|
if !ok {
|
||||||
|
err = fmt.Errorf("No such build found in template: %s", name)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// BuildNames returns a slice of the available names of builds that
|
// We panic if there is no builder function because this is really
|
||||||
// this template represents.
|
// an internal bug that always needs to be fixed, not an error.
|
||||||
func (t *Template) BuildNames() []string {
|
if components.Builder == nil {
|
||||||
names := make([]string, 0, len(t.Builders))
|
panic("no builder function")
|
||||||
for name, _ := range t.Builders {
|
|
||||||
names = append(names, name)
|
|
||||||
}
|
|
||||||
|
|
||||||
return names
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Build returns a Build for the given name.
|
// Panic if there are provisioners on the template but no provisioner
|
||||||
//
|
// component finder. This is always an internal error, so we panic.
|
||||||
// If the build does not exist as part of this template, an error is
|
if len(t.Provisioners) > 0 && components.Provisioner == nil {
|
||||||
// returned.
|
panic("no provisioner function")
|
||||||
func (t *Template) Build(name string, components *ComponentFinder) (b Build, err error) {
|
}
|
||||||
// Setup the Builder
|
|
||||||
builderConfig, ok := t.Builders[name]
|
|
||||||
if !ok {
|
|
||||||
err = fmt.Errorf("No such build found in template: %s", name)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// We panic if there is no builder function because this is really
|
builder, err := components.Builder(builderConfig.Type)
|
||||||
// an internal bug that always needs to be fixed, not an error.
|
if err != nil {
|
||||||
if components.Builder == nil {
|
return
|
||||||
panic("no builder function")
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// Panic if there are provisioners on the template but no provisioner
|
if builder == nil {
|
||||||
// component finder. This is always an internal error, so we panic.
|
err = fmt.Errorf("Builder type not found: %s", builderConfig.Type)
|
||||||
if len(t.Provisioners) > 0 && components.Provisioner == nil {
|
return
|
||||||
panic("no provisioner function")
|
}
|
||||||
}
|
|
||||||
|
|
||||||
builder, err := components.Builder(builderConfig.Type)
|
// Gather the Hooks
|
||||||
if err != nil {
|
hooks := make(map[string][]Hook)
|
||||||
return
|
for tplEvent, tplHooks := range t.Hooks {
|
||||||
}
|
curHooks := make([]Hook, 0, len(tplHooks))
|
||||||
|
|
||||||
if builder == nil {
|
for _, hookName := range tplHooks {
|
||||||
err = fmt.Errorf("Builder type not found: %s", builderConfig.Type)
|
var hook Hook
|
||||||
return
|
hook, err = components.Hook(hookName)
|
||||||
}
|
|
||||||
|
|
||||||
// Gather the Hooks
|
|
||||||
hooks := make(map[string][]Hook)
|
|
||||||
for tplEvent, tplHooks := range t.Hooks {
|
|
||||||
curHooks := make([]Hook, 0, len(tplHooks))
|
|
||||||
|
|
||||||
for _, hookName := range tplHooks {
|
|
||||||
var hook Hook
|
|
||||||
hook, err = components.Hook(hookName)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if hook == nil {
|
|
||||||
err = fmt.Errorf("Hook not found: %s", hookName)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
curHooks = append(curHooks, hook)
|
|
||||||
}
|
|
||||||
|
|
||||||
hooks[tplEvent] = curHooks
|
|
||||||
}
|
|
||||||
|
|
||||||
// Prepare the post-processors
|
|
||||||
postProcessors := make([][]coreBuildPostProcessor, 0, len(t.PostProcessors))
|
|
||||||
for _, rawPPs := range t.PostProcessors {
|
|
||||||
current := make([]coreBuildPostProcessor, len(rawPPs))
|
|
||||||
for i, rawPP := range rawPPs {
|
|
||||||
pp, err := components.PostProcessor(rawPP.Type)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
if pp == nil {
|
|
||||||
return nil, fmt.Errorf("PostProcessor type not found: %s", rawPP.Type)
|
|
||||||
}
|
|
||||||
|
|
||||||
current[i] = coreBuildPostProcessor{
|
|
||||||
processor: pp,
|
|
||||||
processorType: rawPP.Type,
|
|
||||||
config: rawPP.rawConfig,
|
|
||||||
keepInputArtifact: rawPP.KeepInputArtifact,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
postProcessors = append(postProcessors, current)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Prepare the provisioners
|
|
||||||
provisioners := make([]coreBuildProvisioner, 0, len(t.Provisioners))
|
|
||||||
for _, rawProvisioner := range t.Provisioners {
|
|
||||||
var provisioner Provisioner
|
|
||||||
provisioner, err = components.Provisioner(rawProvisioner.Type)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if provisioner == nil {
|
if hook == nil {
|
||||||
err = fmt.Errorf("Provisioner type not found: %s", rawProvisioner.Type)
|
err = fmt.Errorf("Hook not found: %s", hookName)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
configs := make([]interface{}, 1, 2)
|
curHooks = append(curHooks, hook)
|
||||||
configs[0] = rawProvisioner.rawConfig
|
}
|
||||||
|
|
||||||
if rawProvisioner.Override != nil {
|
hooks[tplEvent] = curHooks
|
||||||
if override, ok := rawProvisioner.Override[name]; ok {
|
}
|
||||||
configs = append(configs, override)
|
|
||||||
}
|
// Prepare the post-processors
|
||||||
|
postProcessors := make([][]coreBuildPostProcessor, 0, len(t.PostProcessors))
|
||||||
|
for _, rawPPs := range t.PostProcessors {
|
||||||
|
current := make([]coreBuildPostProcessor, len(rawPPs))
|
||||||
|
for i, rawPP := range rawPPs {
|
||||||
|
pp, err := components.PostProcessor(rawPP.Type)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
coreProv := coreBuildProvisioner{provisioner, configs}
|
if pp == nil {
|
||||||
provisioners = append(provisioners, coreProv)
|
return nil, fmt.Errorf("PostProcessor type not found: %s", rawPP.Type)
|
||||||
|
}
|
||||||
|
|
||||||
|
current[i] = coreBuildPostProcessor{
|
||||||
|
processor: pp,
|
||||||
|
processorType: rawPP.Type,
|
||||||
|
config: rawPP.rawConfig,
|
||||||
|
keepInputArtifact: rawPP.KeepInputArtifact,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
b = &coreBuild{
|
postProcessors = append(postProcessors, current)
|
||||||
name: name,
|
|
||||||
builder: builder,
|
|
||||||
builderConfig: builderConfig.rawConfig,
|
|
||||||
builderType: builderConfig.Type,
|
|
||||||
hooks: hooks,
|
|
||||||
postProcessors: postProcessors,
|
|
||||||
provisioners: provisioners,
|
|
||||||
}
|
|
||||||
|
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Prepare the provisioners
|
||||||
|
provisioners := make([]coreBuildProvisioner, 0, len(t.Provisioners))
|
||||||
|
for _, rawProvisioner := range t.Provisioners {
|
||||||
|
var provisioner Provisioner
|
||||||
|
provisioner, err = components.Provisioner(rawProvisioner.Type)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if provisioner == nil {
|
||||||
|
err = fmt.Errorf("Provisioner type not found: %s", rawProvisioner.Type)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
configs := make([]interface{}, 1, 2)
|
||||||
|
configs[0] = rawProvisioner.rawConfig
|
||||||
|
|
||||||
|
if rawProvisioner.Override != nil {
|
||||||
|
if override, ok := rawProvisioner.Override[name]; ok {
|
||||||
|
configs = append(configs, override)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
coreProv := coreBuildProvisioner{provisioner, configs}
|
||||||
|
provisioners = append(provisioners, coreProv)
|
||||||
|
}
|
||||||
|
|
||||||
|
b = &coreBuild{
|
||||||
|
name: name,
|
||||||
|
builder: builder,
|
||||||
|
builderConfig: builderConfig.rawConfig,
|
||||||
|
builderType: builderConfig.Type,
|
||||||
|
hooks: hooks,
|
||||||
|
postProcessors: postProcessors,
|
||||||
|
provisioners: provisioners,
|
||||||
|
}
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
|
@ -14,6 +14,8 @@ import (
|
||||||
type AWSBoxConfig struct {
|
type AWSBoxConfig struct {
|
||||||
OutputPath string `mapstructure:"output"`
|
OutputPath string `mapstructure:"output"`
|
||||||
VagrantfileTemplate string `mapstructure:"vagrantfile_template"`
|
VagrantfileTemplate string `mapstructure:"vagrantfile_template"`
|
||||||
|
|
||||||
|
PackerBuildName string `mapstructure:"packer_build_name"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type AWSVagrantfileTemplate struct {
|
type AWSVagrantfileTemplate struct {
|
||||||
|
@ -51,7 +53,8 @@ func (p *AWSBoxPostProcessor) PostProcess(ui packer.Ui, artifact packer.Artifact
|
||||||
}
|
}
|
||||||
|
|
||||||
// Compile the output path
|
// Compile the output path
|
||||||
outputPath, err := ProcessOutputPath(p.config.OutputPath, "aws", artifact)
|
outputPath, err := ProcessOutputPath(p.config.OutputPath,
|
||||||
|
p.config.PackerBuildName, "aws", artifact)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, false, err
|
return nil, false, err
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,6 +19,8 @@ var builtins = map[string]string{
|
||||||
|
|
||||||
type Config struct {
|
type Config struct {
|
||||||
OutputPath string `mapstructure:"output"`
|
OutputPath string `mapstructure:"output"`
|
||||||
|
|
||||||
|
PackerBuildName string `mapstructure:"packer_build_name"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type PostProcessor struct {
|
type PostProcessor struct {
|
||||||
|
@ -35,7 +37,7 @@ func (p *PostProcessor) Configure(raws ...interface{}) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
if p.config.OutputPath == "" {
|
if p.config.OutputPath == "" {
|
||||||
p.config.OutputPath = "packer_{{.Provider}}.box"
|
p.config.OutputPath = "packer_{{ .BuildName }}_{{.Provider}}.box"
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err := template.New("output").Parse(p.config.OutputPath)
|
_, err := template.New("output").Parse(p.config.OutputPath)
|
||||||
|
@ -49,6 +51,10 @@ func (p *PostProcessor) Configure(raws ...interface{}) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
packerConfig := map[string]interface{}{
|
||||||
|
packer.BuildNameConfigKey: p.config.PackerBuildName,
|
||||||
|
}
|
||||||
|
|
||||||
p.premade = make(map[string]packer.PostProcessor)
|
p.premade = make(map[string]packer.PostProcessor)
|
||||||
errors := make([]error, 0)
|
errors := make([]error, 0)
|
||||||
for k, raw := range mapConfig {
|
for k, raw := range mapConfig {
|
||||||
|
@ -57,7 +63,7 @@ func (p *PostProcessor) Configure(raws ...interface{}) error {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := pp.Configure(raw); err != nil {
|
if err := pp.Configure(raw, packerConfig); err != nil {
|
||||||
errors = append(errors, err)
|
errors = append(errors, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -17,6 +17,7 @@ import (
|
||||||
// OutputPath variables.
|
// OutputPath variables.
|
||||||
type OutputPathTemplate struct {
|
type OutputPathTemplate struct {
|
||||||
ArtifactId string
|
ArtifactId string
|
||||||
|
BuildName string
|
||||||
Provider string
|
Provider string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -83,11 +84,12 @@ func DirToBox(dst, dir string) error {
|
||||||
|
|
||||||
// ProcessOutputPath takes an output path template and executes it,
|
// ProcessOutputPath takes an output path template and executes it,
|
||||||
// replacing variables with their respective values.
|
// replacing variables with their respective values.
|
||||||
func ProcessOutputPath(path string, provider string, artifact packer.Artifact) (string, error) {
|
func ProcessOutputPath(path string, buildName string, provider string, artifact packer.Artifact) (string, error) {
|
||||||
var buf bytes.Buffer
|
var buf bytes.Buffer
|
||||||
|
|
||||||
tplData := &OutputPathTemplate{
|
tplData := &OutputPathTemplate{
|
||||||
ArtifactId: artifact.Id(),
|
ArtifactId: artifact.Id(),
|
||||||
|
BuildName: buildName,
|
||||||
Provider: provider,
|
Provider: provider,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -18,6 +18,8 @@ import (
|
||||||
type VBoxBoxConfig struct {
|
type VBoxBoxConfig struct {
|
||||||
OutputPath string `mapstructure:"output"`
|
OutputPath string `mapstructure:"output"`
|
||||||
VagrantfileTemplate string `mapstructure:"vagrantfile_template"`
|
VagrantfileTemplate string `mapstructure:"vagrantfile_template"`
|
||||||
|
|
||||||
|
PackerBuildName string `mapstructure:"packer_build_name"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type VBoxVagrantfileTemplate struct {
|
type VBoxVagrantfileTemplate struct {
|
||||||
|
@ -48,7 +50,8 @@ func (p *VBoxBoxPostProcessor) PostProcess(ui packer.Ui, artifact packer.Artifac
|
||||||
}
|
}
|
||||||
|
|
||||||
// Compile the output path
|
// Compile the output path
|
||||||
outputPath, err := ProcessOutputPath(p.config.OutputPath, "virtualbox", artifact)
|
outputPath, err := ProcessOutputPath(p.config.OutputPath,
|
||||||
|
p.config.PackerBuildName, "virtualbox", artifact)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, false, err
|
return nil, false, err
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,6 +14,8 @@ import (
|
||||||
type VMwareBoxConfig struct {
|
type VMwareBoxConfig struct {
|
||||||
OutputPath string `mapstructure:"output"`
|
OutputPath string `mapstructure:"output"`
|
||||||
VagrantfileTemplate string `mapstructure:"vagrantfile_template"`
|
VagrantfileTemplate string `mapstructure:"vagrantfile_template"`
|
||||||
|
|
||||||
|
PackerBuildName string `mapstructure:"packer_build_name"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type VMwareBoxPostProcessor struct {
|
type VMwareBoxPostProcessor struct {
|
||||||
|
@ -28,13 +30,13 @@ func (p *VMwareBoxPostProcessor) Configure(raws ...interface{}) error {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *VMwareBoxPostProcessor) PostProcess(ui packer.Ui, artifact packer.Artifact) (packer.Artifact, bool, error) {
|
func (p *VMwareBoxPostProcessor) PostProcess(ui packer.Ui, artifact packer.Artifact) (packer.Artifact, bool, error) {
|
||||||
// Compile the output path
|
// Compile the output path
|
||||||
outputPath, err := ProcessOutputPath(p.config.OutputPath, "vmware", artifact)
|
outputPath, err := ProcessOutputPath(p.config.OutputPath,
|
||||||
|
p.config.PackerBuildName, "vmware", artifact)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, false, err
|
return nil, false, err
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue