Files
vault/tools/pipeline/internal/pkg/generate/enos_dynamic_config_test.go
Ryan Cragun 69646127df fmt: check gosimports during pre-commit hooks (#29520)
`gosimports` is the preferred style for module imports and it is
enforced via CI. I've found that things often manage to drift so I've
taken the liberty to update our pre-commit hook to verify our imports
formatting before a change is committed.

Along with updating the formatting helper I've also run `make fmt` to
resolve any formatting drift that managed to make it into the codebase.

Signed-off-by: Ryan Cragun <me@ryan.ec>
2025-02-27 15:56:34 -07:00

279 lines
6.7 KiB
Go

// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: BUSL-1.1
package generate
import (
"context"
"os"
"path/filepath"
"slices"
"testing"
"github.com/hashicorp/vault/tools/pipeline/internal/pkg/releases"
"github.com/stretchr/testify/require"
)
var testAPIVersions = []string{
"1.16.10+ent.hsm.fips1402",
"1.16.10+ent.fips1402",
"1.16.10+ent.hsm",
"1.16.10+ent",
"1.17.6+ent.hsm.fips1402",
"1.17.6+ent.fips1402",
"1.17.6+ent.hsm",
"1.17.6+ent",
"1.18.0-rc1+ent.hsm.fips1402",
"1.18.0-rc1+ent.fips1402",
"1.18.0-rc1+ent.hsm",
"1.18.0-rc1+ent",
"1.17.5+ent.hsm.fips1402",
"1.17.5+ent.fips1402",
"1.17.5+ent.hsm",
"1.17.5+ent",
"1.16.9+ent.hsm.fips1402",
"1.16.9+ent.fips1402",
"1.16.9+ent.hsm",
"1.16.9+ent",
"1.17.4+ent.hsm.fips1402",
"1.17.4+ent.fips1402",
"1.17.4+ent.hsm",
"1.17.4+ent",
"1.16.8+ent.hsm.fips1402",
"1.16.8+ent.fips1402",
"1.16.8+ent.hsm",
"1.16.8+ent",
"1.17.3+ent.hsm.fips1402",
"1.17.3+ent.fips1402",
"1.17.3+ent.hsm",
"1.16.7+ent.hsm.fips1402",
"1.17.3+ent",
"1.16.7+ent.fips1402",
"1.16.7+ent.hsm",
"1.16.7+ent",
"1.17.2+ent.hsm.fips1402",
"1.17.2+ent.fips1402",
"1.17.2+ent.hsm",
"1.17.2+ent",
"1.16.6+ent.hsm.fips1402",
"1.16.6+ent.fips1402",
"1.16.6+ent.hsm",
"1.16.6+ent",
}
var testAllVersions = []string{
"1.16.6",
"1.16.7",
"1.16.8",
"1.16.9",
"1.16.10",
"1.17.2",
"1.17.3",
"1.17.4",
"1.17.5",
"1.17.6",
"1.18.0-rc1",
}
func Test_EnosDynamicConfigReq_Validate(t *testing.T) {
t.Parallel()
for name, test := range map[string]struct {
in *EnosDynamicConfigReq
fail bool
}{
"ce edition": {
in: &EnosDynamicConfigReq{
VaultEdition: "ce",
VaultVersion: "1.18.0",
EnosDir: t.TempDir(),
FileName: "test.hcl",
VersionLister: releases.NewMockClient(testAPIVersions),
},
},
"oss edition": {
in: &EnosDynamicConfigReq{
VaultEdition: "oss",
VaultVersion: "1.18.0",
EnosDir: t.TempDir(),
FileName: "test.hcl",
VersionLister: releases.NewMockClient(testAPIVersions),
},
},
"ent edition": {
in: &EnosDynamicConfigReq{
VaultEdition: "ent",
VaultVersion: "1.18.0",
EnosDir: t.TempDir(),
FileName: "test.hcl",
VersionLister: releases.NewMockClient(testAPIVersions),
},
},
"enterprise edition": {
in: &EnosDynamicConfigReq{
VaultEdition: "enterprise",
VaultVersion: "1.18.0",
EnosDir: t.TempDir(),
FileName: "test.hcl",
VersionLister: releases.NewMockClient(testAPIVersions),
},
},
"ent.hsm edition": {
in: &EnosDynamicConfigReq{
VaultEdition: "ent.hsm",
VaultVersion: "1.18.0",
EnosDir: t.TempDir(),
FileName: "test.hcl",
VersionLister: releases.NewMockClient(testAPIVersions),
},
},
"ent.fips1402 edition": {
in: &EnosDynamicConfigReq{
VaultEdition: "ent.fips1402",
VaultVersion: "1.18.0",
EnosDir: t.TempDir(),
FileName: "test.hcl",
VersionLister: releases.NewMockClient(testAPIVersions),
},
},
"ent.hsm.fips1402 edition": {
in: &EnosDynamicConfigReq{
VaultEdition: "ent.hsm.fips1402",
VaultVersion: "1.18.0",
EnosDir: t.TempDir(),
FileName: "test.hcl",
VersionLister: releases.NewMockClient(testAPIVersions),
},
},
"unknown edition": {
in: &EnosDynamicConfigReq{
VaultEdition: "ent.nope",
VaultVersion: "1.18.0",
EnosDir: t.TempDir(),
FileName: "test.hcl",
},
fail: true,
},
"invalid version": {
in: &EnosDynamicConfigReq{
VaultEdition: "ent.hsm.fips1402",
VaultVersion: "vault-1.18.0",
EnosDir: t.TempDir(),
FileName: "test.hcl",
},
fail: true,
},
"target dir doesn't exist": {
in: &EnosDynamicConfigReq{
VaultEdition: "ent.hsm.fips1402",
VaultVersion: "1.18.0",
},
fail: true,
},
"no file name": {
in: &EnosDynamicConfigReq{
VaultEdition: "ent.hsm.fips1402",
VaultVersion: "1.18.0",
EnosDir: t.TempDir(),
},
fail: true,
},
"no version lister": {
in: &EnosDynamicConfigReq{
VaultEdition: "ent.hsm.fips1402",
VaultVersion: "1.18.0",
EnosDir: t.TempDir(),
FileName: "test.hcl",
},
fail: true,
},
} {
t.Run(name, func(t *testing.T) {
t.Parallel()
err := test.in.Validate(context.Background())
if test.fail {
require.Error(t, err)
} else {
require.NoError(t, err)
}
})
}
}
func Test_EnosDynamicConfigReq_Run(t *testing.T) {
t.Parallel()
for desc, test := range map[string]struct {
req *EnosDynamicConfigReq
res func() *EnosDynamicConfigRes
hcl []byte
fail bool
}{
"default config": {
req: &EnosDynamicConfigReq{
FileName: "test.hcl",
VaultEdition: "ent.hsm.fips1402",
VaultVersion: "1.18.0",
Skip: []string{"1.17.2", "1.17.5"},
NMinus: 2,
EnosDir: t.TempDir(),
VersionLister: releases.NewMockClient(testAPIVersions),
},
res: func() *EnosDynamicConfigRes {
versions := testAllVersions
versions = slices.DeleteFunc(versions, func(v string) bool {
return v == "1.17.2" || v == "1.17.5"
})
return &EnosDynamicConfigRes{
Globals: &Globals{
SampleAttributes: &SampleAttrs{
AWSRegion: []string{"us-east-1", "us-west-2"},
DistroVersionAmzn: []string{"2023"},
DistroVersionLeap: []string{"15.6"},
DistroVersionRhel: []string{"8.10", "9.4"},
DistroVersionSles: []string{"15.6"},
DistroVersionUbuntu: []string{"20.04", "24.04"},
UpgradeInitialVersion: versions,
},
},
}
},
hcl: []byte(`# Copyright (c) HashiCorp, Inc.
# SPDX-License-Identifier: BUSL-1.1
# Code generated by pipeline generate enos-dynamic-config DO NOT EDIT.
# This file is overwritten in CI as it contains branch specific and sometimes ever-changing values.
# It's checked in here so that enos samples and scenarios can be performed, just be aware that this
# might change out from under you.
globals {
sample_attributes = {
aws_region = ["us-east-1", "us-west-2"]
distro_version_amzn = ["2023"]
distro_version_leap = ["15.6"]
distro_version_rhel = ["8.10", "9.4"]
distro_version_sles = ["15.6"]
distro_version_ubuntu = ["20.04", "24.04"]
upgrade_initial_version = ["1.16.6", "1.16.7", "1.16.8", "1.16.9", "1.16.10", "1.17.3", "1.17.4", "1.17.6", "1.18.0-rc1"]
}
}
`),
},
} {
t.Run(desc, func(t *testing.T) {
t.Parallel()
res, err := test.req.Run(context.Background())
if test.fail {
require.Error(t, err)
return
}
require.NoError(t, err)
require.EqualValues(t, test.res(), res)
b, err := os.ReadFile(filepath.Join(test.req.EnosDir, test.req.FileName))
require.NoError(t, err)
require.EqualValuesf(t, test.hcl, b, string(b))
})
}
}