Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(storage/git): support fs.WalkDir and current dir path #3927

Merged
merged 4 commits into from
Feb 14, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 45 additions & 0 deletions internal/server/environments/mock_environment.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

26 changes: 23 additions & 3 deletions internal/server/environments/storage.go
Original file line number Diff line number Diff line change
Expand Up @@ -77,19 +77,34 @@
}

type EnvironmentStore struct {
byName map[string]Environment
byName map[string]Environment
defaultEnv Environment
}

func NewEnvironmentStore(envs ...Environment) *EnvironmentStore {
func NewEnvironmentStore(envs ...Environment) (*EnvironmentStore, error) {
store := &EnvironmentStore{
byName: map[string]Environment{},
}

for _, env := range envs {
store.byName[env.Name()] = env
if env.Default() {
store.defaultEnv = env
}
}

if store.defaultEnv == nil {
env, ok := store.byName["default"]
if ok {

Check failure on line 98 in internal/server/environments/storage.go

View workflow job for this annotation

GitHub Actions / Lint Go

ifElseChain: rewrite if-else to switch statement (gocritic)
store.defaultEnv = env
} else if len(envs) == 1 {
store.defaultEnv = envs[0]
} else {
return nil, errors.New("explicit default environment required")
}
}

return store
return store, nil
}

func (e *EnvironmentStore) List(ctx context.Context) iter.Seq[Environment] {
Expand All @@ -111,3 +126,8 @@

return env, nil
}

// GetDefault returns the environment identified by name.
func (e *EnvironmentStore) GetDefault(ctx context.Context) Environment {
return e.defaultEnv
}
36 changes: 18 additions & 18 deletions internal/server/evaluation/evaluation_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ func TestVariant_FlagNotFound(t *testing.T) {
s = New(logger, envStore)
)

envStore.On("Get", mock.Anything, "default").Return(environment, nil)
envStore.On("GetDefault", mock.Anything).Return(environment)

environment.On("EvaluationStore").Return(store, nil)

Expand Down Expand Up @@ -59,7 +59,7 @@ func TestVariant_NonVariantFlag(t *testing.T) {
s = New(logger, envStore)
)

envStore.On("Get", mock.Anything, "default").Return(environment, nil)
envStore.On("GetDefault", mock.Anything).Return(environment)
environment.On("EvaluationStore").Return(store, nil)

store.On("GetFlag", mock.Anything, storage.NewResource(namespaceKey, flagKey)).Return(&core.Flag{
Expand Down Expand Up @@ -92,7 +92,7 @@ func TestVariant_FlagDisabled(t *testing.T) {
s = New(logger, envStore)
)

envStore.On("Get", mock.Anything, "default").Return(environment, nil)
envStore.On("GetDefault", mock.Anything).Return(environment)
environment.On("EvaluationStore").Return(store, nil)

store.On("GetFlag", mock.Anything, storage.NewResource(namespaceKey, flagKey)).Return(&core.Flag{
Expand Down Expand Up @@ -131,7 +131,7 @@ func TestVariant_EvaluateFailure_OnGetEvaluationRules(t *testing.T) {
}
)

envStore.On("Get", mock.Anything, "default").Return(environment, nil)
envStore.On("GetDefault", mock.Anything).Return(environment)
environment.On("EvaluationStore").Return(store, nil)

store.On("GetFlag", mock.Anything, storage.NewResource(namespaceKey, flagKey)).Return(flag, nil)
Expand Down Expand Up @@ -166,7 +166,7 @@ func TestVariant_Success(t *testing.T) {
}
)

envStore.On("Get", mock.Anything, "default").Return(environment, nil)
envStore.On("GetDefault", mock.Anything).Return(environment)
environment.On("EvaluationStore").Return(store, nil)

store.On("GetFlag", mock.Anything, storage.NewResource(namespaceKey, flagKey)).Return(flag, nil)
Expand Down Expand Up @@ -228,7 +228,7 @@ func TestBoolean_FlagNotFoundError(t *testing.T) {
s = New(logger, envStore)
)

envStore.On("Get", mock.Anything, "default").Return(environment, nil)
envStore.On("GetDefault", mock.Anything).Return(environment)
environment.On("EvaluationStore").Return(store, nil)

store.On("GetFlag", mock.Anything, storage.NewResource(namespaceKey, flagKey)).Return(&core.Flag{}, errs.ErrNotFound("test-flag"))
Expand Down Expand Up @@ -257,7 +257,7 @@ func TestBoolean_NonBooleanFlagError(t *testing.T) {
s = New(logger, envStore)
)

envStore.On("Get", mock.Anything, "default").Return(environment, nil)
envStore.On("GetDefault", mock.Anything).Return(environment)
environment.On("EvaluationStore").Return(store, nil)

store.On("GetFlag", mock.Anything, storage.NewResource(namespaceKey, flagKey)).Return(&core.Flag{
Expand Down Expand Up @@ -290,7 +290,7 @@ func TestBoolean_DefaultRule_NoRollouts(t *testing.T) {
s = New(logger, envStore)
)

envStore.On("Get", mock.Anything, "default").Return(environment, nil)
envStore.On("GetDefault", mock.Anything).Return(environment)
environment.On("EvaluationStore").Return(store, nil)

store.On("GetFlag", mock.Anything, storage.NewResource(namespaceKey, flagKey)).Return(&core.Flag{
Expand Down Expand Up @@ -327,7 +327,7 @@ func TestBoolean_DefaultRuleFallthrough_WithPercentageRollout(t *testing.T) {
s = New(logger, envStore)
)

envStore.On("Get", mock.Anything, "default").Return(environment, nil)
envStore.On("GetDefault", mock.Anything).Return(environment)
environment.On("EvaluationStore").Return(store, nil)

store.On("GetFlag", mock.Anything, storage.NewResource(namespaceKey, flagKey)).Return(&core.Flag{
Expand Down Expand Up @@ -374,7 +374,7 @@ func TestBoolean_PercentageRuleMatch(t *testing.T) {
s = New(logger, envStore)
)

envStore.On("Get", mock.Anything, "default").Return(environment, nil)
envStore.On("GetDefault", mock.Anything).Return(environment)
environment.On("EvaluationStore").Return(store, nil)

store.On("GetFlag", mock.Anything, storage.NewResource(namespaceKey, flagKey)).Return(&core.Flag{
Expand Down Expand Up @@ -421,7 +421,7 @@ func TestBoolean_PercentageRuleFallthrough_SegmentMatch(t *testing.T) {
s = New(logger, envStore)
)

envStore.On("Get", mock.Anything, "default").Return(environment, nil)
envStore.On("GetDefault", mock.Anything).Return(environment)
environment.On("EvaluationStore").Return(store, nil)

store.On("GetFlag", mock.Anything, storage.NewResource(namespaceKey, flagKey)).Return(&core.Flag{
Expand Down Expand Up @@ -491,7 +491,7 @@ func TestBoolean_SegmentMatch_MultipleConstraints(t *testing.T) {
s = New(logger, envStore)
)

envStore.On("Get", mock.Anything, "default").Return(environment, nil)
envStore.On("GetDefault", mock.Anything).Return(environment)
environment.On("EvaluationStore").Return(store, nil)

store.On("GetFlag", mock.Anything, storage.NewResource(namespaceKey, flagKey)).Return(&core.Flag{
Expand Down Expand Up @@ -558,7 +558,7 @@ func TestBoolean_SegmentMatch_Constraint_EntityId(t *testing.T) {
s = New(logger, envStore)
)

envStore.On("Get", mock.Anything, "default").Return(environment, nil)
envStore.On("GetDefault", mock.Anything).Return(environment)
environment.On("EvaluationStore").Return(store, nil)

store.On("GetFlag", mock.Anything, storage.NewResource(namespaceKey, flagKey)).Return(&core.Flag{
Expand Down Expand Up @@ -617,7 +617,7 @@ func TestBoolean_SegmentMatch_MultipleSegments_WithAnd(t *testing.T) {
s = New(logger, envStore)
)

envStore.On("Get", mock.Anything, "default").Return(environment, nil)
envStore.On("GetDefault", mock.Anything).Return(environment)
environment.On("EvaluationStore").Return(store, nil)

store.On("GetFlag", mock.Anything, storage.NewResource(namespaceKey, flagKey)).Return(&core.Flag{
Expand Down Expand Up @@ -691,7 +691,7 @@ func TestBoolean_RulesOutOfOrder(t *testing.T) {
s = New(logger, envStore)
)

envStore.On("Get", mock.Anything, "default").Return(environment, nil)
envStore.On("GetDefault", mock.Anything).Return(environment)
environment.On("EvaluationStore").Return(store, nil)

store.On("GetFlag", mock.Anything, storage.NewResource(namespaceKey, flagKey)).Return(&core.Flag{
Expand Down Expand Up @@ -759,7 +759,7 @@ func TestBatch_UnknownFlagType(t *testing.T) {
s = New(logger, envStore)
)

envStore.On("Get", mock.Anything, "default").Return(environment, nil)
envStore.On("GetDefault", mock.Anything).Return(environment)
environment.On("EvaluationStore").Return(store, nil)

store.On("GetFlag", mock.Anything, storage.NewResource(namespaceKey, flagKey)).Return(&core.Flag{
Expand Down Expand Up @@ -797,7 +797,7 @@ func TestBatch_InternalError_GetFlag(t *testing.T) {
s = New(logger, envStore)
)

envStore.On("Get", mock.Anything, "default").Return(environment, nil)
envStore.On("GetDefault", mock.Anything).Return(environment)
environment.On("EvaluationStore").Return(store, nil)

store.On("GetFlag", mock.Anything, storage.NewResource(namespaceKey, flagKey)).Return(&core.Flag{}, errors.New("internal error"))
Expand Down Expand Up @@ -832,7 +832,7 @@ func TestBatch_Success(t *testing.T) {
s = New(logger, envStore)
)

envStore.On("Get", mock.Anything, "default").Return(environment, nil)
envStore.On("GetDefault", mock.Anything).Return(environment)
environment.On("EvaluationStore").Return(store, nil)

store.On("GetFlag", mock.Anything, storage.NewResource(namespaceKey, flagKey)).Return(&core.Flag{
Expand Down
45 changes: 17 additions & 28 deletions internal/server/evaluation/mock_environmentstore.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions internal/server/evaluation/ofrep_bridge_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ func TestOFREPFlagEvaluation_Variant(t *testing.T) {
}
)

envStore.On("Get", mock.Anything, "default").Return(environment, nil)
envStore.On("GetDefault", mock.Anything).Return(environment)
environment.On("EvaluationStore").Return(store, nil)

store.On("GetFlag", mock.Anything, storage.NewResource(namespaceKey, flagKey)).Return(flag, nil)
Expand Down Expand Up @@ -97,7 +97,7 @@ func TestOFREPFlagEvaluation_Boolean(t *testing.T) {
}
)

envStore.On("Get", mock.Anything, "default").Return(environment, nil)
envStore.On("GetDefault", mock.Anything).Return(environment)
environment.On("EvaluationStore").Return(store, nil)

store.On("GetFlag", mock.Anything, storage.NewResource(namespaceKey, flagKey)).Return(flag, nil)
Expand Down
9 changes: 2 additions & 7 deletions internal/server/evaluation/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import (

// EnvironmentStore is the minimal abstraction for interacting with the storage layer for evaluation.
type EnvironmentStore interface {
Get(context.Context, string) (environments.Environment, error)
GetDefault(context.Context) environments.Environment
}

// Server serves the Flipt evaluate v2 gRPC Server.
Expand Down Expand Up @@ -47,10 +47,5 @@ func (s *Server) SkipsAuthorization(ctx context.Context) bool {
func (s *Server) getEvalStore(ctx context.Context) (storage.ReadOnlyStore, error) {
// TODO(georgemac): update this to support overriding default environment based
// on configuration or header metadata on the request
env, err := s.store.Get(ctx, "default")
if err != nil {
return nil, err
}

return env.EvaluationStore()
return s.store.GetDefault(ctx).EvaluationStore()
}
4 changes: 2 additions & 2 deletions internal/server/flag_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ func TestListFlags_PaginationOffset(t *testing.T) {

defer store.AssertExpectations(t)

envStore.On("Get", mock.Anything, "default").Return(environment, nil)
envStore.On("GetDefault", mock.Anything).Return(environment)
environment.On("EvaluationStore").Return(store, nil)

store.On("ListFlags", mock.Anything, storage.ListWithOptions(storage.NewNamespace(""),
Expand Down Expand Up @@ -75,7 +75,7 @@ func TestListFlags_PaginationPageToken(t *testing.T) {

defer store.AssertExpectations(t)

envStore.On("Get", mock.Anything, "default").Return(environment, nil)
envStore.On("GetDefault", mock.Anything).Return(environment)
environment.On("EvaluationStore").Return(store, nil)

store.On("ListFlags", mock.Anything, storage.ListWithOptions(storage.NewNamespace(""),
Expand Down
Loading
Loading