mirror of https://github.com/hashicorp/packer
It was possible to put the same source 2 times in the build and when using HCP, it would error eventually since they are considered the same build from HCP sidebackport-bumps
parent
88b708896b
commit
9dc5e80eb3
@ -0,0 +1,319 @@
|
|||||||
|
package registry
|
||||||
|
|
||||||
|
import (
|
||||||
|
"reflect"
|
||||||
|
"slices"
|
||||||
|
"strings"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/hashicorp/packer/hcl2template"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestNewRegisterProperBuildName(t *testing.T) {
|
||||||
|
cases := map[string]struct {
|
||||||
|
expectedBuilds []string
|
||||||
|
expectErr bool
|
||||||
|
diagsSummaryContains string
|
||||||
|
builds hcl2template.Builds
|
||||||
|
}{
|
||||||
|
"single build block with single source": {
|
||||||
|
expectErr: false,
|
||||||
|
expectedBuilds: []string{"docker.ubuntu"},
|
||||||
|
builds: hcl2template.Builds{
|
||||||
|
&hcl2template.BuildBlock{
|
||||||
|
Sources: []hcl2template.SourceUseBlock{
|
||||||
|
{
|
||||||
|
SourceRef: hcl2template.SourceRef{
|
||||||
|
Type: "docker",
|
||||||
|
Name: "ubuntu",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"single build block with name and with single source": {
|
||||||
|
expectErr: false,
|
||||||
|
expectedBuilds: []string{"docker.ubuntu"},
|
||||||
|
builds: hcl2template.Builds{
|
||||||
|
&hcl2template.BuildBlock{
|
||||||
|
Name: "my-build-block",
|
||||||
|
Sources: []hcl2template.SourceUseBlock{
|
||||||
|
{
|
||||||
|
SourceRef: hcl2template.SourceRef{
|
||||||
|
Type: "docker",
|
||||||
|
Name: "ubuntu",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"single build block with 2 sources": {
|
||||||
|
expectErr: false,
|
||||||
|
expectedBuilds: []string{"docker.alpine", "docker.ubuntu"},
|
||||||
|
builds: hcl2template.Builds{
|
||||||
|
&hcl2template.BuildBlock{
|
||||||
|
Sources: []hcl2template.SourceUseBlock{
|
||||||
|
{
|
||||||
|
SourceRef: hcl2template.SourceRef{
|
||||||
|
Type: "docker",
|
||||||
|
Name: "ubuntu",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
SourceRef: hcl2template.SourceRef{
|
||||||
|
Type: "docker",
|
||||||
|
Name: "alpine",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"single build block with 3 sources": {
|
||||||
|
expectErr: false,
|
||||||
|
expectedBuilds: []string{"docker.alpine", "docker.ubuntu", "docker.arch"},
|
||||||
|
builds: hcl2template.Builds{
|
||||||
|
&hcl2template.BuildBlock{
|
||||||
|
Sources: []hcl2template.SourceUseBlock{
|
||||||
|
{
|
||||||
|
SourceRef: hcl2template.SourceRef{
|
||||||
|
Type: "docker",
|
||||||
|
Name: "ubuntu",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
SourceRef: hcl2template.SourceRef{
|
||||||
|
Type: "docker",
|
||||||
|
Name: "alpine",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
SourceRef: hcl2template.SourceRef{
|
||||||
|
Type: "docker",
|
||||||
|
Name: "arch",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"single build block with name and multiple sources": {
|
||||||
|
expectErr: false,
|
||||||
|
expectedBuilds: []string{"docker.alpine", "docker.ubuntu"},
|
||||||
|
builds: hcl2template.Builds{
|
||||||
|
&hcl2template.BuildBlock{
|
||||||
|
Name: "my-build-block",
|
||||||
|
Sources: []hcl2template.SourceUseBlock{
|
||||||
|
{
|
||||||
|
SourceRef: hcl2template.SourceRef{
|
||||||
|
Type: "docker",
|
||||||
|
Name: "ubuntu",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
SourceRef: hcl2template.SourceRef{
|
||||||
|
Type: "docker",
|
||||||
|
Name: "alpine",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"single build block with multiple identical sources create conflict": {
|
||||||
|
expectErr: true,
|
||||||
|
diagsSummaryContains: "conflict",
|
||||||
|
builds: hcl2template.Builds{
|
||||||
|
&hcl2template.BuildBlock{
|
||||||
|
Sources: []hcl2template.SourceUseBlock{
|
||||||
|
{
|
||||||
|
SourceRef: hcl2template.SourceRef{
|
||||||
|
Type: "docker",
|
||||||
|
Name: "ubuntu",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
SourceRef: hcl2template.SourceRef{
|
||||||
|
Type: "docker",
|
||||||
|
Name: "ubuntu",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"multiple build block with different source": {
|
||||||
|
expectErr: false,
|
||||||
|
expectedBuilds: []string{"docker.alpine", "docker.ubuntu"},
|
||||||
|
builds: hcl2template.Builds{
|
||||||
|
&hcl2template.BuildBlock{
|
||||||
|
Sources: []hcl2template.SourceUseBlock{
|
||||||
|
{
|
||||||
|
SourceRef: hcl2template.SourceRef{
|
||||||
|
Type: "docker",
|
||||||
|
Name: "ubuntu",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
&hcl2template.BuildBlock{
|
||||||
|
Sources: []hcl2template.SourceUseBlock{
|
||||||
|
{
|
||||||
|
SourceRef: hcl2template.SourceRef{
|
||||||
|
Type: "docker",
|
||||||
|
Name: "alpine",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"multiple build block with same source create conflict": {
|
||||||
|
expectErr: true,
|
||||||
|
diagsSummaryContains: "conflict",
|
||||||
|
builds: hcl2template.Builds{
|
||||||
|
&hcl2template.BuildBlock{
|
||||||
|
Sources: []hcl2template.SourceUseBlock{
|
||||||
|
{
|
||||||
|
SourceRef: hcl2template.SourceRef{
|
||||||
|
Type: "docker",
|
||||||
|
Name: "ubuntu",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
SourceRef: hcl2template.SourceRef{
|
||||||
|
Type: "docker",
|
||||||
|
Name: "alpine",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
&hcl2template.BuildBlock{
|
||||||
|
Sources: []hcl2template.SourceUseBlock{
|
||||||
|
{
|
||||||
|
SourceRef: hcl2template.SourceRef{
|
||||||
|
Type: "docker",
|
||||||
|
Name: "ubuntu",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
SourceRef: hcl2template.SourceRef{
|
||||||
|
Type: "docker",
|
||||||
|
Name: "alpine",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"multiple build block with same source but with different build name": {
|
||||||
|
expectErr: false,
|
||||||
|
expectedBuilds: []string{"build1.docker.ubuntu", "build2.docker.ubuntu"},
|
||||||
|
builds: hcl2template.Builds{
|
||||||
|
&hcl2template.BuildBlock{
|
||||||
|
Name: "build1",
|
||||||
|
Sources: []hcl2template.SourceUseBlock{
|
||||||
|
{
|
||||||
|
SourceRef: hcl2template.SourceRef{
|
||||||
|
Type: "docker",
|
||||||
|
Name: "ubuntu",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
&hcl2template.BuildBlock{
|
||||||
|
Name: "build2",
|
||||||
|
Sources: []hcl2template.SourceUseBlock{
|
||||||
|
{
|
||||||
|
SourceRef: hcl2template.SourceRef{
|
||||||
|
Type: "docker",
|
||||||
|
Name: "ubuntu",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"multiple build block with same source but with only one declared build name": {
|
||||||
|
expectErr: false,
|
||||||
|
expectedBuilds: []string{"docker.ubuntu", "build.docker.ubuntu"},
|
||||||
|
builds: hcl2template.Builds{
|
||||||
|
&hcl2template.BuildBlock{
|
||||||
|
Name: "build",
|
||||||
|
Sources: []hcl2template.SourceUseBlock{
|
||||||
|
{
|
||||||
|
SourceRef: hcl2template.SourceRef{
|
||||||
|
Type: "docker",
|
||||||
|
Name: "ubuntu",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
&hcl2template.BuildBlock{
|
||||||
|
Sources: []hcl2template.SourceUseBlock{
|
||||||
|
{
|
||||||
|
SourceRef: hcl2template.SourceRef{
|
||||||
|
Type: "docker",
|
||||||
|
Name: "ubuntu",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for desc, tc := range cases {
|
||||||
|
t.Run(desc, func(t *testing.T) {
|
||||||
|
|
||||||
|
config := &hcl2template.PackerConfig{
|
||||||
|
Builds: tc.builds,
|
||||||
|
}
|
||||||
|
|
||||||
|
registry := HCLRegistry{
|
||||||
|
configuration: config,
|
||||||
|
bucket: &Bucket{
|
||||||
|
Name: "test-bucket-" + desc,
|
||||||
|
Version: &Version{},
|
||||||
|
},
|
||||||
|
buildNames: map[string]struct{}{},
|
||||||
|
}
|
||||||
|
|
||||||
|
diags := registry.registerAllComponents()
|
||||||
|
if tc.diagsSummaryContains != "" {
|
||||||
|
|
||||||
|
containsMsg := false
|
||||||
|
for _, diag := range diags {
|
||||||
|
if strings.Contains(diag.Summary, tc.diagsSummaryContains) {
|
||||||
|
containsMsg = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if !containsMsg {
|
||||||
|
t.Fatalf("diagnostics should contains '%s' in summary", tc.diagsSummaryContains)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if !tc.expectErr {
|
||||||
|
if diags.HasErrors() {
|
||||||
|
t.Fatalf("should not report error diagnostic: %v", diags)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if tc.expectErr {
|
||||||
|
if !diags.HasErrors() {
|
||||||
|
t.Fatal("should report error in this case")
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
actualExpectedBuilds := registry.bucket.Version.expectedBuilds
|
||||||
|
|
||||||
|
slices.Sort(tc.expectedBuilds)
|
||||||
|
slices.Sort(actualExpectedBuilds)
|
||||||
|
|
||||||
|
if !reflect.DeepEqual(tc.expectedBuilds, actualExpectedBuilds) {
|
||||||
|
t.Fatalf("expectedBuilds registered: %v, got: %v", tc.expectedBuilds, actualExpectedBuilds)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in new issue