refactor(storage): add store.Store interface

There is a first implementation with ValKey that will allow to use redis APIs as a backend for Sablier with Hight Availability
This commit is contained in:
Alexis Couvreur
2025-02-02 15:13:45 -08:00
committed by GitHub
parent 357a7a7b18
commit f29b13a55a
23 changed files with 810 additions and 244 deletions

View File

@@ -96,15 +96,10 @@ func sessionStateToRenderOptionsInstanceState(sessionState *sessions.SessionStat
log.Warnf("sessionStateToRenderOptionsInstanceState: sessionState is nil")
return
}
sessionState.Instances.Range(func(key, value any) bool {
if value != nil {
instances = append(instances, instanceStateToRenderOptionsRequestState(value.(sessions.InstanceState).Instance))
} else {
log.Warnf("sessionStateToRenderOptionsInstanceState: sessionState instance is nil, key: %v", key)
}
return true
})
for _, v := range sessionState.Instances {
instances = append(instances, instanceStateToRenderOptionsRequestState(v.Instance))
}
sort.SliceStable(instances, func(i, j int) bool {
return strings.Compare(instances[i].Name, instances[j].Name) == -1

View File

@@ -2,6 +2,7 @@ package api
import (
"errors"
"github.com/sablierapp/sablier/app/instance"
"github.com/sablierapp/sablier/app/sessions"
"github.com/tniswong/go.rfcx/rfc7807"
"go.uber.org/mock/gomock"
@@ -10,6 +11,23 @@ import (
"testing"
)
func session() *sessions.SessionState {
state := instance.ReadyInstanceState("test", 1)
state2 := instance.ReadyInstanceState("test2", 1)
return &sessions.SessionState{
Instances: map[string]sessions.InstanceState{
"test": {
Instance: &state,
Error: nil,
},
"test2": {
Instance: &state2,
Error: nil,
},
},
}
}
func TestStartDynamic(t *testing.T) {
t.Run("StartDynamicInvalidBind", func(t *testing.T) {
app, router, strategy, _ := NewApiTest(t)
@@ -35,7 +53,7 @@ func TestStartDynamic(t *testing.T) {
t.Run("StartDynamicThemeNotFound", func(t *testing.T) {
app, router, strategy, m := NewApiTest(t)
StartDynamic(router, strategy)
m.EXPECT().RequestSessionGroup("test", gomock.Any()).Return(&sessions.SessionState{}, nil)
m.EXPECT().RequestSessionGroup("test", gomock.Any()).Return(session(), nil)
r := PerformRequest(app, "GET", "/api/strategies/dynamic?group=test&theme=invalid")
assert.Equal(t, http.StatusNotFound, r.Code)
assert.Equal(t, rfc7807.JSONMediaType, r.Header().Get("Content-Type"))
@@ -43,7 +61,7 @@ func TestStartDynamic(t *testing.T) {
t.Run("StartDynamicByNames", func(t *testing.T) {
app, router, strategy, m := NewApiTest(t)
StartDynamic(router, strategy)
m.EXPECT().RequestSession([]string{"test"}, gomock.Any()).Return(&sessions.SessionState{}, nil)
m.EXPECT().RequestSession([]string{"test"}, gomock.Any()).Return(session(), nil)
r := PerformRequest(app, "GET", "/api/strategies/dynamic?names=test")
assert.Equal(t, http.StatusOK, r.Code)
assert.Equal(t, SablierStatusReady, r.Header().Get(SablierStatusHeader))
@@ -51,7 +69,7 @@ func TestStartDynamic(t *testing.T) {
t.Run("StartDynamicByGroup", func(t *testing.T) {
app, router, strategy, m := NewApiTest(t)
StartDynamic(router, strategy)
m.EXPECT().RequestSessionGroup("test", gomock.Any()).Return(&sessions.SessionState{}, nil)
m.EXPECT().RequestSessionGroup("test", gomock.Any()).Return(session(), nil)
r := PerformRequest(app, "GET", "/api/strategies/dynamic?group=test")
assert.Equal(t, http.StatusOK, r.Code)
assert.Equal(t, SablierStatusReady, r.Header().Get(SablierStatusHeader))