# HG changeset patch # User Florent Aide <florent.aide@gmail.com> # Date 1709284263 -3600 # Fri Mar 01 10:11:03 2024 +0100 # Node ID fbde45c9b52e1a68ef3a79b408f8efa03589b2c9 # Parent 70ac01d7c6680efd85c206f4a54431422fdf3a26 add support for controlling desired beaver version diff --git a/HISTORY.rst b/HISTORY.rst --- a/HISTORY.rst +++ b/HISTORY.rst @@ -2,6 +2,34 @@ HISTORY ******* +3.2.3 (2024-03-01) +================== + +- config file now contains a beaverversion entry. If this entry is not left blank, beaver will try +to match its version with the desired version. If the two versions do not match beaver will refuse +to process the resources to avoid getting a different results. + +3.2.2 (2023-10-17) +================== + +- disabled keyword in charts can now be a variable + +3.2.1 (2023-10-17) +================== + +- namespace beaver can now be a variable + +3.2.0 (2023-10-17) +================== + +- build namespace flag to force helm chart namespace +- bump ci to 1.20.6 to avoid vulncheck +- Fix logging: the wrong logger was used in 'build' +- [ytt] reverse the layer paths order on the command line +- ns name in rs name if ns exists in rs +- beaver now hydrate filename of rs +- recursive variable hydration support added + 3.1.9 (2023-03-23) ================== diff --git a/README.md b/README.md --- a/README.md +++ b/README.md @@ -44,6 +44,9 @@ ```yaml # Default namespace used for this project namespace: default +# the desired beaver version. If the binary you use to process this file has a different +# version number, it will fail to avoid messing your resources. +beaverversion: 3.2.3 # an inherited beaver project - which can also inherit another beaver project inherit: ../../base # path is relative to this beaver config file inherits: diff --git a/go.mod b/go.mod --- a/go.mod +++ b/go.mod @@ -17,6 +17,7 @@ require ( github.com/davecgh/go-spew v1.1.1 // indirect github.com/fsnotify/fsnotify v1.5.1 // indirect + github.com/hashicorp/go-version v1.6.0 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/kr/pretty v0.2.0 // indirect github.com/magiconair/properties v1.8.6 // indirect diff --git a/go.sum b/go.sum --- a/go.sum +++ b/go.sum @@ -123,6 +123,8 @@ github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= +github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek= +github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= diff --git a/runner/config.go b/runner/config.go --- a/runner/config.go +++ b/runner/config.go @@ -5,7 +5,10 @@ "os" "path/filepath" + "github.com/hashicorp/go-version" "gopkg.in/yaml.v3" + + beaver "orus.io/orus-io/beaver/lib" ) // Sha define sha feature parameter @@ -58,6 +61,8 @@ // Inherit: relative path to another beaver project // a beaver project is a folder with a beaver.yaml file Inherit string + // BeaverVersion: the beaver version this config is supposed to work with. + BeaverVersion string // NameSpace: a kubernetes Namespace, shouldn't be mandatory NameSpace string // Inherits: list of relative path to other beaver projects @@ -112,5 +117,29 @@ return &config, nil } + if config.BeaverVersion != "" && beaver.Version() != "" { + if err := ControlVersions(config.BeaverVersion, beaver.Version()); err != nil { + return nil, err + } + } + return nil, fmt.Errorf("no beaver file found in %s", configDir) } + +func ControlVersions(desired, actual string) error { + desiredVersion, err := version.NewVersion(desired) + if err != nil { + return fmt.Errorf("failed to parse desired beaver version: %w", err) + } + + actualVersion, err := version.NewVersion(actual) + if err != nil { + return fmt.Errorf("failed to parse actual beaver version: %w", err) + } + + if !desiredVersion.Equal(actualVersion) { + return fmt.Errorf("desired beaver version is not equal to actual beaver version, %s != %s", desiredVersion.String(), actualVersion.String()) + } + + return nil +} diff --git a/runner/config_test.go b/runner/config_test.go --- a/runner/config_test.go +++ b/runner/config_test.go @@ -22,6 +22,7 @@ helmNamespaceFixtures = "fixtures/f3" disabledAsVar = "fixtures/fDisabledAsVar" namespaceAsVar = "fixtures/fNamespaceAsVar" + versionTest = "fixtures/versionTest" ) func TestConfig(t *testing.T) { @@ -34,6 +35,20 @@ assert.Equal(t, "../vendor/ytt/odoo", config.Charts["odoo"].Path) } +func TestConfigVersionValid(t *testing.T) { + config, err := runner.NewConfig(filepath.Join(versionTest, "validbase")) + require.NoError(t, err) + err = runner.ControlVersions(config.BeaverVersion, "3.2.3") + require.NoError(t, err) +} + +func TestConfigVersionInValid(t *testing.T) { + config, err := runner.NewConfig(filepath.Join(versionTest, "invalidbase")) + require.NoError(t, err) + err = runner.ControlVersions(config.BeaverVersion, "3.2.3") + require.Error(t, err) +} + func TestBuildArgs(t *testing.T) { config, err := runner.NewConfig(filepath.Join(helmNamespaceFixtures, "base")) require.NoError(t, err) diff --git a/runner/fixtures/versionTest/invalidbase/beaver.yml b/runner/fixtures/versionTest/invalidbase/beaver.yml new file mode 100644 --- /dev/null +++ b/runner/fixtures/versionTest/invalidbase/beaver.yml @@ -0,0 +1,5 @@ +beaverversion: 3.2.9 +charts: + postgres: + type: helm + path: ../vendor/helm/postgresql \ No newline at end of file diff --git a/runner/fixtures/versionTest/validbase/beaver.yml b/runner/fixtures/versionTest/validbase/beaver.yml new file mode 100644 --- /dev/null +++ b/runner/fixtures/versionTest/validbase/beaver.yml @@ -0,0 +1,5 @@ +beaverversion: 3.2.3 +charts: + postgres: + type: helm + path: ../vendor/helm/postgresql \ No newline at end of file