fix except flag for JSON and HCL2

This commit is contained in:
Moss 2020-06-09 15:23:29 +02:00
parent 6e610927da
commit bfb9df0039
7 changed files with 227 additions and 19 deletions

View File

@ -368,30 +368,62 @@ func TestBuildExceptFileCommaFlags(t *testing.T) {
c := &BuildCommand{
Meta: testMetaFile(t),
}
args := []string{
tc := []struct {
name string
args []string
expectedFiles []string
buildNotExpectedFiles []string
postProcNotExpectedFiles []string
}{
{
name: "JSON: except build and post-processor",
args: []string{
"-parallel-builds=1",
"-except=chocolate,vanilla",
"-except=chocolate,vanilla,pear",
filepath.Join(testFixture("build-only"), "template.json"),
},
expectedFiles: []string{"apple.txt", "cherry.txt", "peach.txt"},
buildNotExpectedFiles: []string{"chocolate.txt", "vanilla.txt", "tomato.txt", "unnamed.txt"},
postProcNotExpectedFiles: []string{"pear.txt"},
},
{
name: "HCL2: except build and post-processor",
args: []string{
"-parallel-builds=1",
"-except=file.chocolate,file.vanilla,pear",
filepath.Join(testFixture("build-only"), "template.pkr.hcl"),
},
expectedFiles: []string{"apple.txt", "cherry.txt", "peach.txt"},
buildNotExpectedFiles: []string{"chocolate.txt", "vanilla.txt", "tomato.txt", "unnamed.txt"},
postProcNotExpectedFiles: []string{"pear.txt"},
},
}
for _, tt := range tc {
t.Run(tt.name, func(t *testing.T) {
defer cleanup()
if code := c.Run(args); code != 0 {
if code := c.Run(tt.args); code != 0 {
fatalCommand(t, c.Meta)
}
for _, f := range []string{"chocolate.txt", "vanilla.txt", "tomato.txt",
"unnamed.txt"} {
for _, f := range tt.buildNotExpectedFiles {
if fileExists(f) {
t.Errorf("Expected NOT to find %s", f)
t.Errorf("build not skipped: Expected NOT to find %s", f)
}
}
for _, f := range []string{"apple.txt", "cherry.txt", "pear.txt", "peach.txt"} {
for _, f := range tt.postProcNotExpectedFiles {
if fileExists(f) {
t.Errorf("post-processor not skipped: Expected NOT to find %s", f)
}
}
for _, f := range tt.expectedFiles {
if !fileExists(f) {
t.Errorf("Expected to find %s", f)
}
}
})
}
}
func testHCLOnlyExceptFlags(t *testing.T, args, present, notPresent []string) {

View File

@ -0,0 +1,49 @@
source "file" "chocolate" {
content = "chocolate"
target = "chocolate.txt"
}
source "file" "vanilla" {
content = "vanilla"
target = "vanilla.txt"
}
source "file" "cherry" {
content = "cherry"
target = "cherry.txt"
}
build {
sources = [
"sources.file.chocolate",
"sources.file.vanilla",
"sources.file.cherry",
]
post-processor "shell-local" {
name = "apple"
inline = [ "echo apple > apple.txt" ]
}
post-processor "shell-local" {
name = "peach"
inline = [ "echo apple > peach.txt" ]
}
post-processor "shell-local" {
name = "pear"
inline = [ "echo apple > pear.txt" ]
}
post-processor "shell-local" {
only = ["vanilla"]
name = "tomato"
inline = [ "echo apple > tomato.txt" ]
}
post-processor "shell-local" {
only = ["chocolate"]
inline = [ "echo apple > unnamed.txt" ]
}
}

View File

@ -0,0 +1,26 @@
{
"builders":[
{
"name": "chocolate",
"type":"file",
"target":"chocolate.txt",
"content":"chocolate"
},
{
"type":"file",
"name": "vanilla"
}
],
"post-processors": [
{
"name": "apple",
"type": "shell-local",
"inline": [ "echo apple 'hello'" ]
},
{
"name": "pear",
"type": "shell-local"
}
],
"min_packer_version":"101.0.0"
}

View File

@ -0,0 +1,23 @@
source "file" "chocolate" {
content = "chocolate"
target = "chocolate.txt"
}
source "file" "vanilla" {
content = "vanilla"
}
build {
sources = [
"source.file.chocolate",
"source.file.vanilla"
]
post-processor "shell-local" {
name = "apple"
inline = [ "echo apple 'hello'" ]
}
post-processor "shell-local" {
name = "pear"
}
}

View File

@ -98,3 +98,56 @@ func TestValidateCommandBadVersion(t *testing.T) {
}
t.Log(stdout)
}
func TestValidateCommandExcept(t *testing.T) {
tt := []struct {
name string
args []string
exitCode int
}{
{
name: "JSON: validate except build and post-processor",
args: []string{
"-except=vanilla,pear",
filepath.Join(testFixture("validate"), "validate_except.json"),
},
},
{
name: "JSON: fail validate except build and post-processor",
args: []string{
"-except=chocolate,apple",
filepath.Join(testFixture("validate"), "validate_except.json"),
},
exitCode: 1,
},
{
name: "HCL2: validate except build and post-processor",
args: []string{
"-except=file.vanilla,pear",
filepath.Join(testFixture("validate"), "validate_except.pkr.hcl"),
},
},
{
name: "HCL2: fail validation except build and post-processor",
args: []string{
"-except=file.chocolate,apple",
filepath.Join(testFixture("validate"), "validate_except.pkr.hcl"),
},
exitCode: 1,
},
}
c := &ValidateCommand{
Meta: testMetaFile(t),
}
c.CoreConfig.Version = "102.0.0"
for _, tc := range tt {
t.Run(tc.name, func(t *testing.T) {
tc := tc
if code := c.Run(tc.args); code != tc.exitCode {
fatalCommand(t, c.Meta)
}
})
}
}

View File

@ -2,6 +2,7 @@ package hcl2template
import (
"fmt"
"github.com/gobwas/glob"
"strings"
"github.com/hashicorp/hcl/v2"
@ -37,6 +38,9 @@ type PackerConfig struct {
provisionersSchemas packer.ProvisionerStore
postProcessorsSchemas packer.PostProcessorStore
except []glob.Glob
only []glob.Glob
}
type ValidationOptions struct {
@ -244,6 +248,23 @@ func (cfg *PackerConfig) getCoreBuildPostProcessors(source SourceBlock, blocks [
if ppb.OnlyExcept.Skip(source.Type + "." + source.Name) {
continue
}
name := ppb.PName
if name == "" {
name = ppb.PType
}
// -except
exclude := false
for _, exceptGlob := range cfg.except {
if exceptGlob.Match(name) {
exclude = true
break
}
}
if exclude {
continue
}
postProcessor, moreDiags := cfg.startPostProcessor(source, ppb, ectx, generatedVars)
diags = append(diags, moreDiags...)
if moreDiags.HasErrors() {
@ -289,6 +310,7 @@ func (cfg *PackerConfig) GetBuilds(opts packer.GetBuildsOptions) ([]packer.Build
if diags.HasErrors() {
return nil, diags
}
cfg.only = onlyGlobs
include := false
for _, onlyGlob := range onlyGlobs {
if onlyGlob.Match(buildName) {
@ -307,6 +329,7 @@ func (cfg *PackerConfig) GetBuilds(opts packer.GetBuildsOptions) ([]packer.Build
if diags.HasErrors() {
return nil, diags
}
cfg.except = exceptGlobs
exclude := false
for _, exceptGlob := range exceptGlobs {
if exceptGlob.Match(buildName) {

View File

@ -133,6 +133,8 @@ func (c *Core) BuildNames(only, except []string) []string {
sort.Strings(only)
sort.Strings(except)
c.except = except
c.only = only
r := make([]string, 0, len(c.builds))
for n := range c.builds {