From 9290c01d65e5a92dad67c16984acddfa230ffde4 Mon Sep 17 00:00:00 2001 From: VishnuJin Date: Sat, 3 Feb 2024 19:35:44 +0530 Subject: [PATCH] feat: added vagrantfile_template_content option to allow for dynamic Vagrantfile content --- post-processor/vagrant/post-processor.go | 21 +++++++++--- .../vagrant/post-processor.hcl2spec.go | 2 ++ post-processor/vagrant/post-processor_test.go | 34 +++++++++++++++++++ 3 files changed, 53 insertions(+), 4 deletions(-) diff --git a/post-processor/vagrant/post-processor.go b/post-processor/vagrant/post-processor.go index 954cf9d1..0ab77101 100644 --- a/post-processor/vagrant/post-processor.go +++ b/post-processor/vagrant/post-processor.go @@ -75,6 +75,7 @@ type Config struct { OutputPath string `mapstructure:"output"` Override map[string]interface{} VagrantfileTemplate string `mapstructure:"vagrantfile_template"` + VagrantfileTemplateContent string `mapstructure:"vagrantfile_template_content"` VagrantfileTemplateGenerated bool `mapstructure:"vagrantfile_template_generated"` ProviderOverride string `mapstructure:"provider_override"` Architecture string `mapstructure:"architecture"` @@ -190,12 +191,20 @@ func (p *PostProcessor) PostProcessProvider(name string, provider Provider, ui p var customVagrantfile string if config.VagrantfileTemplate != "" { ui.Message(fmt.Sprintf("Using custom Vagrantfile: %s", config.VagrantfileTemplate)) - customBytes, err := ioutil.ReadFile(config.VagrantfileTemplate) - if err != nil { - return nil, false, err + + var templateContent string + if config.VagrantfileTemplateContent != "" { + templateContent = config.VagrantfileTemplateContent + } else { + customBytes, err := ioutil.ReadFile(config.VagrantfileTemplate) + if err != nil { + return nil, false, err + } + + templateContent = string(customBytes) } - customVagrantfile, err = interpolate.Render(string(customBytes), &config.ctx) + customVagrantfile, err = interpolate.Render(templateContent, &config.ctx) if err != nil { return nil, false, err } @@ -292,6 +301,10 @@ func (p *PostProcessor) configureSingle(c *Config, raws ...interface{}) error { } var errs *packersdk.MultiError + if c.VagrantfileTemplateContent != "" && c.VagrantfileTemplate == "" { + errs = packersdk.MultiErrorAppend(errs, fmt.Errorf( + "'vagrantfile_template' should be provided to use 'vagrantfile_template_content'")) + } if c.VagrantfileTemplate != "" && c.VagrantfileTemplateGenerated == false { _, err := os.Stat(c.VagrantfileTemplate) if err != nil { diff --git a/post-processor/vagrant/post-processor.hcl2spec.go b/post-processor/vagrant/post-processor.hcl2spec.go index 3f846b13..31215114 100644 --- a/post-processor/vagrant/post-processor.hcl2spec.go +++ b/post-processor/vagrant/post-processor.hcl2spec.go @@ -23,6 +23,7 @@ type FlatConfig struct { OutputPath *string `mapstructure:"output" cty:"output" hcl:"output"` Override map[string]interface{} `cty:"override" hcl:"override"` VagrantfileTemplate *string `mapstructure:"vagrantfile_template" cty:"vagrantfile_template" hcl:"vagrantfile_template"` + VagrantfileTemplateContent *string `mapstructure:"vagrantfile_template_content" cty:"vagrantfile_template_content" hcl:"vagrantfile_template_content"` VagrantfileTemplateGenerated *bool `mapstructure:"vagrantfile_template_generated" cty:"vagrantfile_template_generated" hcl:"vagrantfile_template_generated"` ProviderOverride *string `mapstructure:"provider_override" cty:"provider_override" hcl:"provider_override"` Architecture *string `mapstructure:"architecture" cty:"architecture" hcl:"architecture"` @@ -53,6 +54,7 @@ func (*FlatConfig) HCL2Spec() map[string]hcldec.Spec { "output": &hcldec.AttrSpec{Name: "output", Type: cty.String, Required: false}, "override": &hcldec.AttrSpec{Name: "override", Type: cty.Map(cty.String), Required: false}, "vagrantfile_template": &hcldec.AttrSpec{Name: "vagrantfile_template", Type: cty.String, Required: false}, + "vagrantfile_template_content": &hcldec.AttrSpec{Name: "vagrantfile_template_content", Type: cty.String, Required: false}, "vagrantfile_template_generated": &hcldec.AttrSpec{Name: "vagrantfile_template_generated", Type: cty.Bool, Required: false}, "provider_override": &hcldec.AttrSpec{Name: "provider_override", Type: cty.String, Required: false}, "architecture": &hcldec.AttrSpec{Name: "architecture", Type: cty.String, Required: false}, diff --git a/post-processor/vagrant/post-processor_test.go b/post-processor/vagrant/post-processor_test.go index 030a04f6..40f60a8b 100644 --- a/post-processor/vagrant/post-processor_test.go +++ b/post-processor/vagrant/post-processor_test.go @@ -202,6 +202,40 @@ func TestPostProcessorPrepare_vagrantfileTemplateExists(t *testing.T) { } } +// write unit test to cover vagrantfile_template_content but vagrantfile_template is not set +func TestPostProcessorPrepare_vagrantfileTemplateContentExists(t *testing.T) { + f, err := ioutil.TempFile("", "packer") + if err != nil { + t.Fatalf("err: %s", err) + } + + name := f.Name() + + c := testConfig() + c["vagrantfile_template"] = name + c["vagrantfile_template_content"] = "content" + + if err := f.Close(); err != nil { + t.Fatalf("err: %s", err) + } + var p PostProcessor + + if err := p.Configure(c); err != nil { + t.Fatal("Should not have errored since vagrantfile_template and vagrantfile_template_content both exist") + } + + if err := os.Remove(name); err != nil { + t.Fatalf("err: %s", err) + } + + c = testConfig() + c["vagrantfile_template_content"] = "content" + + if err := p.Configure(c); err == nil { + t.Fatal("Should have errored since vagrantfile_template_content exists but vagrantfile_template is not set") + } +} + func TestPostProcessorPrepare_ProviderOverrideExists(t *testing.T) { c := testConfig() c["provider_override"] = "foo"