summaryrefslogtreecommitdiff
path: root/vendor/github.com/authzed/spicedb/internal/datastore/common/migrations.go
blob: 304f62cca0b0d4d34628a08ff08fc34e91c75225 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
package common

import (
	"fmt"
	"slices"
	"strings"

	"github.com/authzed/spicedb/pkg/datastore"
)

type MigrationValidator struct {
	additionalAllowedMigrations []string
	headMigration               string
}

func NewMigrationValidator(headMigration string, additionalAllowedMigrations []string) *MigrationValidator {
	return &MigrationValidator{
		additionalAllowedMigrations: additionalAllowedMigrations,
		headMigration:               headMigration,
	}
}

// MigrationReadyState returns the readiness of the datastore for the given version.
func (mv *MigrationValidator) MigrationReadyState(version string) datastore.ReadyState {
	if version == mv.headMigration {
		return datastore.ReadyState{IsReady: true}
	}
	if slices.Contains(mv.additionalAllowedMigrations, version) {
		return datastore.ReadyState{IsReady: true}
	}
	var msgBuilder strings.Builder
	msgBuilder.WriteString(fmt.Sprintf("datastore is not migrated: currently at revision %q, but requires %q", version, mv.headMigration))

	if len(mv.additionalAllowedMigrations) > 0 {
		msgBuilder.WriteString(fmt.Sprintf(" (additional allowed migrations: %v)", mv.additionalAllowedMigrations))
	}
	msgBuilder.WriteString(". Please run \"spicedb datastore migrate\".")
	return datastore.ReadyState{
		Message: msgBuilder.String(),
		IsReady: false,
	}
}