From 42910a5f8c3503de69a62403e60850893846970e Mon Sep 17 00:00:00 2001 From: Matthew Hooker Date: Wed, 5 Sep 2018 12:08:40 -0700 Subject: [PATCH] fix docker email fixer Fixing post-processors requires some smart parsing of the template. Let's turn that logic into a helper and use it everywhere. --- fix/fixer_docker_email.go | 10 ++++++---- fix/fixer_pp_manifest_filename.go | 19 +++---------------- fix/fixer_pp_vagrant_override.go | 20 +++----------------- fix/helpers.go | 25 +++++++++++++++++++++++++ 4 files changed, 37 insertions(+), 37 deletions(-) create mode 100644 fix/helpers.go diff --git a/fix/fixer_docker_email.go b/fix/fixer_docker_email.go index d1402d3bd..363dfd345 100644 --- a/fix/fixer_docker_email.go +++ b/fix/fixer_docker_email.go @@ -7,8 +7,8 @@ type FixerDockerEmail struct{} func (FixerDockerEmail) Fix(input map[string]interface{}) (map[string]interface{}, error) { // Our template type we'll use for this fixer only type template struct { - Builders []map[string]interface{} - PostProcessors []map[string]interface{} `mapstructure:"post-processors"` + Builders []map[string]interface{} + PP `mapstructure:",squash"` } // Decode the input into our structure, if we can @@ -27,7 +27,9 @@ func (FixerDockerEmail) Fix(input map[string]interface{}) (map[string]interface{ } // Go through each post-processor and delete `docker_login` if present - for _, pp := range tpl.PostProcessors { + pps := tpl.postProcessors() + + for _, pp := range pps { _, ok := pp["login_email"] if !ok { continue @@ -36,7 +38,7 @@ func (FixerDockerEmail) Fix(input map[string]interface{}) (map[string]interface{ } input["builders"] = tpl.Builders - input["post-processors"] = tpl.PostProcessors + input["post-processors"] = pps return input, nil } diff --git a/fix/fixer_pp_manifest_filename.go b/fix/fixer_pp_manifest_filename.go index 50b3e5e16..c08083e62 100644 --- a/fix/fixer_pp_manifest_filename.go +++ b/fix/fixer_pp_manifest_filename.go @@ -11,7 +11,7 @@ func (FixerManifestFilename) Fix(input map[string]interface{}) (map[string]inter // Our template type we'll use for this fixer only type template struct { - PostProcessors []interface{} `mapstructure:"post-processors"` + PP `mapstructure:",squash"` } // Decode the input into our structure, if we can @@ -21,20 +21,7 @@ func (FixerManifestFilename) Fix(input map[string]interface{}) (map[string]inter } // Go through each post-processor and get out all the complex configs - pps := make([]map[string]interface{}, 0, len(tpl.PostProcessors)) - for _, rawPP := range tpl.PostProcessors { - switch pp := rawPP.(type) { - case string: - case map[string]interface{}: - pps = append(pps, pp) - case []interface{}: - for _, innerRawPP := range pp { - if innerPP, ok := innerRawPP.(map[string]interface{}); ok { - pps = append(pps, innerPP) - } - } - } - } + pps := tpl.postProcessors() for _, pp := range pps { ppTypeRaw, ok := pp["type"] @@ -60,7 +47,7 @@ func (FixerManifestFilename) Fix(input map[string]interface{}) (map[string]inter } - input["post-processors"] = tpl.PostProcessors + input["post-processors"] = pps return input, nil } diff --git a/fix/fixer_pp_vagrant_override.go b/fix/fixer_pp_vagrant_override.go index a0c530728..f04043ab0 100644 --- a/fix/fixer_pp_vagrant_override.go +++ b/fix/fixer_pp_vagrant_override.go @@ -12,7 +12,7 @@ type FixerVagrantPPOverride struct{} func (FixerVagrantPPOverride) Fix(input map[string]interface{}) (map[string]interface{}, error) { // Our template type we'll use for this fixer only type template struct { - PostProcessors []interface{} `mapstructure:"post-processors"` + PP `mapstructure:",squash"` } // Decode the input into our structure, if we can @@ -21,21 +21,7 @@ func (FixerVagrantPPOverride) Fix(input map[string]interface{}) (map[string]inte return nil, err } - // Go through each post-processor and get out all the complex configs - pps := make([]map[string]interface{}, 0, len(tpl.PostProcessors)) - for _, rawPP := range tpl.PostProcessors { - switch pp := rawPP.(type) { - case string: - case map[string]interface{}: - pps = append(pps, pp) - case []interface{}: - for _, innerRawPP := range pp { - if innerPP, ok := innerRawPP.(map[string]interface{}); ok { - pps = append(pps, innerPP) - } - } - } - } + pps := tpl.postProcessors() // Go through each post-processor and make the fix if necessary possible := []string{"aws", "digitalocean", "virtualbox", "vmware"} @@ -66,7 +52,7 @@ func (FixerVagrantPPOverride) Fix(input map[string]interface{}) (map[string]inte } } - input["post-processors"] = tpl.PostProcessors + input["post-processors"] = pps return input, nil } diff --git a/fix/helpers.go b/fix/helpers.go new file mode 100644 index 000000000..03b07573d --- /dev/null +++ b/fix/helpers.go @@ -0,0 +1,25 @@ +package fix + +// PP is a convenient way to interact with the post-processors within a fixer +type PP struct { + PostProcessors []interface{} `mapstructure:"post-processors"` +} + +// postProcessors converts the variable structure of the template to a list +func (pp *PP) postProcessors() []map[string]interface{} { + pps := make([]map[string]interface{}, 0, len(pp.PostProcessors)) + for _, rawPP := range pp.PostProcessors { + switch pp := rawPP.(type) { + case string: + case map[string]interface{}: + pps = append(pps, pp) + case []interface{}: + for _, innerRawPP := range pp { + if innerPP, ok := innerRawPP.(map[string]interface{}); ok { + pps = append(pps, innerPP) + } + } + } + } + return pps +}