From e21e980647c6477f3a2f59278c18f48cf75b4220 Mon Sep 17 00:00:00 2001 From: Matthew Hooker Date: Wed, 28 Aug 2013 17:27:14 -0700 Subject: [PATCH 1/3] template expansion of `json` in chef-solo Fixes #362 --- packer/config_template_test.go | 34 ++++++++++++++++++++++++++++ provisioner/chef-solo/provisioner.go | 10 ++++++-- 2 files changed, 42 insertions(+), 2 deletions(-) diff --git a/packer/config_template_test.go b/packer/config_template_test.go index 4c4864cda..817868bbf 100644 --- a/packer/config_template_test.go +++ b/packer/config_template_test.go @@ -5,6 +5,7 @@ import ( "strconv" "testing" "time" + "encoding/json" ) func TestConfigTemplateProcess_timestamp(t *testing.T) { @@ -47,6 +48,39 @@ func TestConfigTemplateProcess_user(t *testing.T) { } } +func TestJsonTemplateProcess_user(t *testing.T) { + tpl, err := NewConfigTemplate() + if err != nil { + t.Fatalf("err: %s", err) + } + + tpl.UserVars["foo"] = "bar" + jsonData := make(map[string]interface{}) + jsonData["key"] = map[string]string{ + "key1": "{{user `foo`}}", + } + jsonBytes, err := json.MarshalIndent(jsonData, "", " ") + if err != nil { + t.Fatalf("err: %s", err) + } + var jsonString = string(jsonBytes) + + result, err := tpl.Process(jsonString, nil) + if err != nil { + t.Fatalf("err: %s", err) + } + var dat map[string]map[string]interface{} + if err := json.Unmarshal([]byte(result), &dat); err != nil { + t.Fatalf("err: %s", err) + } + + if dat["key"]["key1"] != "bar" { + t.Fatalf("found %s instead", dat["key"]["key1"]) + } + +} + + func TestConfigTemplateValidate(t *testing.T) { tpl, err := NewConfigTemplate() if err != nil { diff --git a/provisioner/chef-solo/provisioner.go b/provisioner/chef-solo/provisioner.go index e8bf05e25..05c1836a2 100644 --- a/provisioner/chef-solo/provisioner.go +++ b/provisioner/chef-solo/provisioner.go @@ -95,7 +95,6 @@ func (p *Provisioner) Prepare(raws ...interface{}) error { sliceTemplates := map[string][]string{ "cookbook_paths": p.config.CookbookPaths, "remote_cookbook_paths": p.config.RemoteCookbookPaths, - "run_list": p.config.RunList, } for n, slice := range sliceTemplates { @@ -236,10 +235,17 @@ func (p *Provisioner) createJson(ui packer.Ui, comm packer.Communicator) (string if err != nil { return "", err } + var jsonString = string(jsonBytes) + println(jsonString) + + result, err := p.config.tpl.Process(jsonString, nil) + if err != nil { + return "", err + } // Upload the bytes remotePath := filepath.Join(p.config.StagingDir, "node.json") - if err := comm.Upload(remotePath, bytes.NewReader(jsonBytes)); err != nil { + if err := comm.Upload(remotePath, bytes.NewReader([]byte(result))); err != nil { return "", err } From fc595de0fd6af2b9a4ce4978c7484e8047aa5c30 Mon Sep 17 00:00:00 2001 From: Matthew Hooker Date: Wed, 28 Aug 2013 17:35:43 -0700 Subject: [PATCH 2/3] clean up and retab. --- packer/config_template_test.go | 24 ++++++++++++------------ provisioner/chef-solo/provisioner.go | 6 ++---- 2 files changed, 14 insertions(+), 16 deletions(-) diff --git a/packer/config_template_test.go b/packer/config_template_test.go index 817868bbf..7e0ef5d85 100644 --- a/packer/config_template_test.go +++ b/packer/config_template_test.go @@ -56,27 +56,27 @@ func TestJsonTemplateProcess_user(t *testing.T) { tpl.UserVars["foo"] = "bar" jsonData := make(map[string]interface{}) - jsonData["key"] = map[string]string{ - "key1": "{{user `foo`}}", - } + jsonData["key"] = map[string]string{ + "key1": "{{user `foo`}}", + } jsonBytes, err := json.MarshalIndent(jsonData, "", " ") if err != nil { - t.Fatalf("err: %s", err) + t.Fatalf("err: %s", err) } - var jsonString = string(jsonBytes) + var jsonString = string(jsonBytes) - result, err := tpl.Process(jsonString, nil) + result, err := tpl.Process(jsonString, nil) if err != nil { t.Fatalf("err: %s", err) } - var dat map[string]map[string]interface{} - if err := json.Unmarshal([]byte(result), &dat); err != nil { + var dat map[string]map[string]interface{} + if err := json.Unmarshal([]byte(result), &dat); err != nil { t.Fatalf("err: %s", err) - } + } - if dat["key"]["key1"] != "bar" { - t.Fatalf("found %s instead", dat["key"]["key1"]) - } + if dat["key"]["key1"] != "bar" { + t.Fatalf("found %s instead", dat["key"]["key1"]) + } } diff --git a/provisioner/chef-solo/provisioner.go b/provisioner/chef-solo/provisioner.go index 05c1836a2..8589070c6 100644 --- a/provisioner/chef-solo/provisioner.go +++ b/provisioner/chef-solo/provisioner.go @@ -235,17 +235,15 @@ func (p *Provisioner) createJson(ui packer.Ui, comm packer.Communicator) (string if err != nil { return "", err } - var jsonString = string(jsonBytes) - println(jsonString) - result, err := p.config.tpl.Process(jsonString, nil) + jsonBytesProcessed, err := p.config.tpl.Process(string(jsonBytes), nil) if err != nil { return "", err } // Upload the bytes remotePath := filepath.Join(p.config.StagingDir, "node.json") - if err := comm.Upload(remotePath, bytes.NewReader([]byte(result))); err != nil { + if err := comm.Upload(remotePath, bytes.NewReader([]byte(jsonBytesProcessed))); err != nil { return "", err } From a1893b0bce5dfbaeac94e03fca86d34ca5dce21f Mon Sep 17 00:00:00 2001 From: Matthew Hooker Date: Wed, 28 Aug 2013 20:16:06 -0700 Subject: [PATCH 3/3] reuse jsonString instead of opaque result var. --- packer/config_template_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packer/config_template_test.go b/packer/config_template_test.go index 7e0ef5d85..2ef891bba 100644 --- a/packer/config_template_test.go +++ b/packer/config_template_test.go @@ -65,12 +65,12 @@ func TestJsonTemplateProcess_user(t *testing.T) { } var jsonString = string(jsonBytes) - result, err := tpl.Process(jsonString, nil) + jsonString, err = tpl.Process(jsonString, nil) if err != nil { t.Fatalf("err: %s", err) } var dat map[string]map[string]interface{} - if err := json.Unmarshal([]byte(result), &dat); err != nil { + if err := json.Unmarshal([]byte(jsonString), &dat); err != nil { t.Fatalf("err: %s", err) }