# 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