Skip to content

Commit

Permalink
feat(api): add scheduler config update events
Browse files Browse the repository at this point in the history
  • Loading branch information
gabrielcorado committed Sep 20, 2021
1 parent b57a177 commit 78148f4
Show file tree
Hide file tree
Showing 15 changed files with 206 additions and 31 deletions.
4 changes: 2 additions & 2 deletions api/api_suite_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -109,13 +109,13 @@ var _ = BeforeEach(func() {
lockKey = config.GetString("watcher.lockKey")

mockRedisClient.EXPECT().Ping().Return(redis.NewStatusResult("PONG", nil)).AnyTimes()
app, err = api.NewApp("0.0.0.0", 9998, config, logger, false, "", mockDb, mockCtxWrapper, mockRedisClient, mockRedisTraceWrapper, clientset, metricsClientset)
app, err = api.NewApp("0.0.0.0", 9998, config, logger, false, "", mockDb, mockCtxWrapper, mockRedisClient, mockRedisTraceWrapper, clientset, metricsClientset, mockSchedulerEventStorage)

Expect(err).NotTo(HaveOccurred())

mockLogin = loginMocks.NewMockLogin(mockCtrl)
app.Login = mockLogin

mockSchedulerEventStorage = storageMock.NewMockSchedulerEventStorage(mockCtrl)
app.SchedulerEventStorage = mockSchedulerEventStorage
})
Expand Down
12 changes: 10 additions & 2 deletions api/app.go
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,7 @@ func NewApp(
redisTraceWrapperOrNil redisinterfaces.TraceWrapper,
kubernetesClientOrNil kubernetes.Interface,
metricsClientsetOrNil metricsClient.Interface,
schedulerEventStorageOrNil storage.SchedulerEventStorage,
) (*App, error) {
a := &App{
Config: config,
Expand All @@ -117,6 +118,7 @@ func NewApp(
redisClientOrNil, redisTraceWrapperOrNil,
kubernetesClientOrNil,
metricsClientsetOrNil,
schedulerEventStorageOrNil,
)
if err != nil {
return nil, err
Expand Down Expand Up @@ -433,6 +435,7 @@ func (a *App) configureApp(
redisTraceWrapperOrNil redisinterfaces.TraceWrapper,
kubernetesClientOrNil kubernetes.Interface,
metricsClientsetOrNil metricsClient.Interface,
schedulerEventStorageOrNil storage.SchedulerEventStorage,
) error {
a.loadConfigurationDefaults()
a.configureLogger()
Expand All @@ -456,7 +459,7 @@ func (a *App) configureApp(
a.configureWilliam()
a.configureServer()
a.configureEnvironment()
a.configureEventStorage()
a.configureEventStorage(schedulerEventStorageOrNil)
return nil
}

Expand Down Expand Up @@ -507,7 +510,12 @@ func (a *App) configureCache() {
a.SchedulerCache = models.NewSchedulerCache(expirationTime, cleanupInterval, a.Logger)
}

func (a *App) configureEventStorage() {
func (a *App) configureEventStorage(schedulerEventStorageOrNil storage.SchedulerEventStorage) {
if schedulerEventStorageOrNil != nil {
a.SchedulerEventStorage = schedulerEventStorageOrNil
return
}

a.SchedulerEventStorage = storageredis.NewRedisSchedulerEventStorage(a.RedisClient.Client)
}

Expand Down
8 changes: 4 additions & 4 deletions api/app_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ import (
var _ = Describe("App", func() {
Describe("NewApp", func() {
It("should return new app", func() {
application, err := api.NewApp("0.0.0.0", 9998, config, logger, false, "", mockDb, mockCtxWrapper, mockRedisClient, mockRedisTraceWrapper, clientset, metricsClientset)
application, err := api.NewApp("0.0.0.0", 9998, config, logger, false, "", mockDb, mockCtxWrapper, mockRedisClient, mockRedisTraceWrapper, clientset, metricsClientset, mockSchedulerEventStorage)
Expect(err).NotTo(HaveOccurred())
Expect(application).NotTo(BeNil())
Expect(application.Address).NotTo(Equal(""))
Expand All @@ -36,22 +36,22 @@ var _ = Describe("App", func() {

// should use development environment
config.Set(api.EnvironmentConfig, api.DevEnvironment)
application, err = api.NewApp("0.0.0.0", 9998, config, logger, false, "", mockDb, mockCtxWrapper, mockRedisClient, mockRedisTraceWrapper, clientset, metricsClientset)
application, err = api.NewApp("0.0.0.0", 9998, config, logger, false, "", mockDb, mockCtxWrapper, mockRedisClient, mockRedisTraceWrapper, clientset, metricsClientset, mockSchedulerEventStorage)
Expect(err).NotTo(HaveOccurred())
Expect(application.RoomAddrGetter).To(BeAssignableToTypeOf(&models.RoomAddressesFromNodePort{}))
})

It("should fail if some error occurred", func() {
config.Set("newrelic.key", 12345)
application, err := api.NewApp("0.0.0.0", 9998, config, logger, false, "", mockDb, mockCtxWrapper, mockRedisClient, mockRedisTraceWrapper, clientset, metricsClientset)
application, err := api.NewApp("0.0.0.0", 9998, config, logger, false, "", mockDb, mockCtxWrapper, mockRedisClient, mockRedisTraceWrapper, clientset, metricsClientset, mockSchedulerEventStorage)
Expect(err).To(HaveOccurred())
Expect(err.Error()).To(Equal("license length is not 40"))
Expect(application).To(BeNil())
})

It("should not fail if no newrelic key is provided", func() {
config.Set("newrelic.key", "")
application, err := api.NewApp("0.0.0.0", 9998, config, logger, false, "", mockDb, mockCtxWrapper, mockRedisClient, mockRedisTraceWrapper, clientset, metricsClientset)
application, err := api.NewApp("0.0.0.0", 9998, config, logger, false, "", mockDb, mockCtxWrapper, mockRedisClient, mockRedisTraceWrapper, clientset, metricsClientset, mockSchedulerEventStorage)
Expect(err).NotTo(HaveOccurred())
Expect(application).NotTo(BeNil())
})
Expand Down
2 changes: 1 addition & 1 deletion api/auth_middleware_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ var _ = Describe("AuthMiddleware", func() {
config.Set("william.checkTimeout", "1s")

var err error
app, err = NewApp("0.0.0.0", 9998, config, logger, false, "", mockDb, mockCtxWrapper, mockRedisClient, mockRedisTraceWrapper, clientset, metricsClientset)
app, err = NewApp("0.0.0.0", 9998, config, logger, false, "", mockDb, mockCtxWrapper, mockRedisClient, mockRedisTraceWrapper, clientset, metricsClientset, mockSchedulerEventStorage)
Expect(err).NotTo(HaveOccurred())

authMiddleware = NewAuthMiddleware(app, auth.ActionResolver("SomePermission"))
Expand Down
8 changes: 4 additions & 4 deletions api/room_handler_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -272,7 +272,7 @@ forwarders:
createNamespace(namespace, clientset)
pod, err = createPod(roomName, namespace, clientset)
Expect(err).NotTo(HaveOccurred())
app, err = api.NewApp("0.0.0.0", 9998, config, logger, false, "", mockDb, mockCtxWrapper, mockRedisClient, mockRedisTraceWrapper, clientset, metricsClientset)
app, err = api.NewApp("0.0.0.0", 9998, config, logger, false, "", mockDb, mockCtxWrapper, mockRedisClient, mockRedisTraceWrapper, clientset, metricsClientset, mockSchedulerEventStorage)
Expect(err).NotTo(HaveOccurred())
app.Forwarders = []*eventforwarder.Info{
&eventforwarder.Info{
Expand Down Expand Up @@ -572,7 +572,7 @@ forwarders:
createNamespace(namespace, clientset)
pod, err = createPod(roomName, namespace, clientset)
Expect(err).NotTo(HaveOccurred())
app, err = api.NewApp("0.0.0.0", 9998, config, logger, false, "", mockDb, mockCtxWrapper, mockRedisClient, mockRedisTraceWrapper, clientset, metricsClientset)
app, err = api.NewApp("0.0.0.0", 9998, config, logger, false, "", mockDb, mockCtxWrapper, mockRedisClient, mockRedisTraceWrapper, clientset, metricsClientset, mockSchedulerEventStorage)
Expect(err).NotTo(HaveOccurred())
app.Forwarders = []*eventforwarder.Info{
&eventforwarder.Info{
Expand Down Expand Up @@ -754,7 +754,7 @@ forwarders:
var app *api.App
BeforeEach(func() {
var err error
app, err = api.NewApp("0.0.0.0", 9998, config, logger, false, "", mockDb, mockCtxWrapper, mockRedisClient, mockRedisTraceWrapper, clientset, metricsClientset)
app, err = api.NewApp("0.0.0.0", 9998, config, logger, false, "", mockDb, mockCtxWrapper, mockRedisClient, mockRedisTraceWrapper, clientset, metricsClientset, mockSchedulerEventStorage)
Expect(err).NotTo(HaveOccurred())
app.Forwarders = []*eventforwarder.Info{
&eventforwarder.Info{
Expand Down Expand Up @@ -895,7 +895,7 @@ forwarders:
createNamespace(namespace, clientset)
pod, err = createPod("roomName", namespace, clientset)
Expect(err).NotTo(HaveOccurred())
app, err = api.NewApp("0.0.0.0", 9998, config, logger, false, "", mockDb, mockCtxWrapper, mockRedisClient, mockRedisTraceWrapper, clientset, metricsClientset)
app, err = api.NewApp("0.0.0.0", 9998, config, logger, false, "", mockDb, mockCtxWrapper, mockRedisClient, mockRedisTraceWrapper, clientset, metricsClientset, mockSchedulerEventStorage)
Expect(err).NotTo(HaveOccurred())
app.Forwarders = []*eventforwarder.Info{
&eventforwarder.Info{
Expand Down
8 changes: 5 additions & 3 deletions api/scheduler_handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,12 @@ import (
"encoding/json"
"errors"
"fmt"
"github.com/topfreegames/maestro/api/auth"
"net/http"
"strings"
"time"

"github.com/topfreegames/maestro/api/auth"

"github.com/topfreegames/go-extensions-k8s-client-go/kubernetes"
maestroErrors "github.com/topfreegames/maestro/errors"
"github.com/topfreegames/maestro/reporters"
Expand Down Expand Up @@ -282,6 +283,7 @@ func updateSchedulerConfigCommon(
nil,
app.Config,
operationManager,
app.SchedulerEventStorage,
)
logger.WithField("time", time.Now()).Info("finished update")

Expand Down Expand Up @@ -644,7 +646,7 @@ func (g *SchedulerImageHandler) update(

db := g.App.DBClient.WithContext(r.Context())
err = controller.UpdateSchedulerImage(r.Context(), logger, g.App.RoomManager, mr, db, g.App.RedisClient, g.App.KubernetesClient,
schedulerName, imageParams, maxSurge, &clock.Clock{}, g.App.Config, operationManager)
schedulerName, imageParams, maxSurge, &clock.Clock{}, g.App.Config, operationManager, g.App.SchedulerEventStorage)
if err != nil {
status = http.StatusInternalServerError
if strings.Contains(err.Error(), "not found") {
Expand Down Expand Up @@ -749,7 +751,7 @@ func (g *SchedulerUpdateMinHandler) update(
logger.Info("starting controllers update min")
db := g.App.DBClient.WithContext(r.Context())
err = controller.UpdateSchedulerMin(r.Context(), logger, g.App.RoomManager, mr, db, g.App.RedisClient, schedulerName,
schedulerMin, &clock.Clock{}, g.App.Config, operationManager)
schedulerMin, &clock.Clock{}, g.App.Config, operationManager, g.App.SchedulerEventStorage)
if err != nil {
status = http.StatusInternalServerError
if strings.Contains(err.Error(), "not found") {
Expand Down
32 changes: 28 additions & 4 deletions api/scheduler_handler_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -759,6 +759,8 @@ autoscaling:

calls.Finish()

MockUpdateSchedulerEvents(mockSchedulerEventStorage, scheduler1.Name, scheduler1.Version, "")

recorder = httptest.NewRecorder()
app.Router.ServeHTTP(recorder, request)
Expect(recorder.Body.String()).To(Equal(`{"success": true}`))
Expand Down Expand Up @@ -811,6 +813,8 @@ autoscaling:
)
Expect(err).NotTo(HaveOccurred())

MockUpdateSchedulerEvents(mockSchedulerEventStorage, "scheduler-name", "v1.1", "")

app.Router.ServeHTTP(recorder, request)
Expect(recorder.Body.String()).To(Equal(`{"success": true}`))
Expect(recorder.Code).To(Equal(http.StatusCreated))
Expand Down Expand Up @@ -1109,6 +1113,8 @@ autoscaling:

calls.Finish()

MockUpdateSchedulerEvents(mockSchedulerEventStorage, scheduler1.Name, scheduler1.Version, "")

recorder = httptest.NewRecorder()
app.Router.ServeHTTP(recorder, request)
var response map[string]interface{}
Expand Down Expand Up @@ -1525,7 +1531,7 @@ game: game-name
err = yaml.Unmarshal([]byte(yamlString), &configYaml1)
Expect(err).NotTo(HaveOccurred())
config.Set("basicauth.tryOauthIfUnset", true)
app, err = api.NewApp("0.0.0.0", 9998, config, logger, false, "", mockDb, mockCtxWrapper, mockRedisClient, mockRedisTraceWrapper, clientset, metricsClientset)
app, err = api.NewApp("0.0.0.0", 9998, config, logger, false, "", mockDb, mockCtxWrapper, mockRedisClient, mockRedisTraceWrapper, clientset, metricsClientset, mockSchedulerEventStorage)
Expect(err).NotTo(HaveOccurred())
app.Login = mockLogin
})
Expand Down Expand Up @@ -2163,6 +2169,8 @@ game: game-name

calls.Finish()

MockUpdateSchedulerEvents(mockSchedulerEventStorage, scheduler1.Name, scheduler1.Version, "")

recorder = httptest.NewRecorder()
app.Router.ServeHTTP(recorder, request)
Expect(recorder.Body.String()).To(Equal(`{"success": true}`))
Expand Down Expand Up @@ -2257,6 +2265,8 @@ game: game-name

calls.Finish()

MockUpdateSchedulerEvents(mockSchedulerEventStorage, scheduler1.Name, scheduler1.Version, "")

recorder = httptest.NewRecorder()
app.Router.ServeHTTP(recorder, request)
Expect(recorder.Body.String()).To(Equal(`{"success": true}`))
Expand Down Expand Up @@ -2545,7 +2555,7 @@ game: game-name
Expect(err).NotTo(HaveOccurred())
config.Set("basicauth.tryOauthIfUnset", true)

app, err := api.NewApp("0.0.0.0", 9998, config, logger, false, "", mockDb, mockCtxWrapper, mockRedisClient, mockRedisTraceWrapper, clientset, metricsClientset)
app, err := api.NewApp("0.0.0.0", 9998, config, logger, false, "", mockDb, mockCtxWrapper, mockRedisClient, mockRedisTraceWrapper, clientset, metricsClientset, mockSchedulerEventStorage)
Expect(err).NotTo(HaveOccurred())
app.Login = mockLogin
newImageName := "new-image"
Expand Down Expand Up @@ -2626,6 +2636,8 @@ game: game-name

calls.Finish()

MockUpdateSchedulerEvents(mockSchedulerEventStorage, scheduler1.Name, scheduler1.Version, "")

recorder = httptest.NewRecorder()
app.Router.ServeHTTP(recorder, request)
Expect(recorder.Body.String()).To(Equal(`{"success": true}`))
Expand Down Expand Up @@ -2662,7 +2674,7 @@ game: game-name
Expect(err).NotTo(HaveOccurred())
scheduler1 = models.NewScheduler(configYaml1.Name, configYaml1.Game, jsonString)

app, err := api.NewApp("0.0.0.0", 9998, config, logger, false, "", mockDb, mockCtxWrapper, mockRedisClient, mockRedisTraceWrapper, clientset, metricsClientset)
app, err := api.NewApp("0.0.0.0", 9998, config, logger, false, "", mockDb, mockCtxWrapper, mockRedisClient, mockRedisTraceWrapper, clientset, metricsClientset, mockSchedulerEventStorage)
Expect(err).NotTo(HaveOccurred())
app.Login = mockLogin

Expand Down Expand Up @@ -2748,6 +2760,8 @@ game: game-name

calls.Finish()

MockUpdateSchedulerEvents(mockSchedulerEventStorage, scheduler1.Name, scheduler1.Version, "")

recorder = httptest.NewRecorder()
app.Router.ServeHTTP(recorder, request)
Expect(recorder.Body.String()).To(Equal(`{"success": true}`))
Expand Down Expand Up @@ -2866,6 +2880,8 @@ game: game-name

calls.Finish()

MockUpdateSchedulerEvents(mockSchedulerEventStorage, scheduler1.Name, scheduler1.Version, "")

recorder = httptest.NewRecorder()
app.Router.ServeHTTP(recorder, request)
var response map[string]interface{}
Expand Down Expand Up @@ -3030,6 +3046,8 @@ game: game-name

calls.Finish()

MockUpdateSchedulerEvents(mockSchedulerEventStorage, scheduler1.Name, scheduler1.Version, "")

recorder = httptest.NewRecorder()

app.Router.ServeHTTP(recorder, request)
Expand Down Expand Up @@ -3172,6 +3190,8 @@ game: game-name

calls.Finish()

MockUpdateSchedulerEvents(mockSchedulerEventStorage, scheduler1.Name, scheduler1.Version, "")

recorder = httptest.NewRecorder()
app.Router.ServeHTTP(recorder, request)
Expect(recorder.Code).To(Equal(http.StatusOK))
Expand Down Expand Up @@ -3241,7 +3261,7 @@ game: game-name

config, err := GetDefaultConfig()
config.Set("basicauth.tryOauthIfUnset", true)
app, err := api.NewApp("0.0.0.0", 9998, config, logger, false, "", mockDb, mockCtxWrapper, mockRedisClient, mockRedisTraceWrapper, clientset, metricsClientset)
app, err := api.NewApp("0.0.0.0", 9998, config, logger, false, "", mockDb, mockCtxWrapper, mockRedisClient, mockRedisTraceWrapper, clientset, metricsClientset, mockSchedulerEventStorage)
Expect(err).NotTo(HaveOccurred())
app.Login = mockLogin

Expand Down Expand Up @@ -3289,6 +3309,8 @@ game: game-name

calls.Finish()

MockUpdateSchedulerEvents(mockSchedulerEventStorage, scheduler1.Name, scheduler1.Version, "")

recorder = httptest.NewRecorder()
app.Router.ServeHTTP(recorder, request)
Expect(recorder.Code).To(Equal(http.StatusOK))
Expand Down Expand Up @@ -3367,6 +3389,8 @@ game: game-name

calls.Finish()

MockUpdateSchedulerEvents(mockSchedulerEventStorage, scheduler1.Name, scheduler1.Version, "")

recorder = httptest.NewRecorder()

app.Router.ServeHTTP(recorder, request)
Expand Down
4 changes: 4 additions & 0 deletions api/scheduler_rollback_handler_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,8 @@ autoscaling:

calls.Finish()

MockUpdateSchedulerEvents(mockSchedulerEventStorage, scheduler1.Name, "v1.1", "")

app.Router.ServeHTTP(recorder, request)
Expect(recorder.Code).To(Equal(http.StatusOK))
Expect(recorder.Body.String()).To(Equal(`{"success": true}`))
Expand Down Expand Up @@ -240,6 +242,8 @@ autoscaling:

MockUpdateVersionsTable(mockDb, nil)

MockUpdateSchedulerEvents(mockSchedulerEventStorage, scheduler1.Name, "v1.1", "")

app.Router.ServeHTTP(recorder, request)
Expect(recorder.Code).To(Equal(http.StatusOK))

Expand Down
2 changes: 1 addition & 1 deletion api/william_handler_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ var _ = Describe("WilliamHandler", func() {
config.Set("william.enabled", true)

var err error
app, err = NewApp("0.0.0.0", 9998, config, logger, false, "", mockDb, mockCtxWrapper, mockRedisClient, mockRedisTraceWrapper, clientset, metricsClientset)
app, err = NewApp("0.0.0.0", 9998, config, logger, false, "", mockDb, mockCtxWrapper, mockRedisClient, mockRedisTraceWrapper, clientset, metricsClientset, mockSchedulerEventStorage)
Expect(err).NotTo(HaveOccurred())

request, _ = http.NewRequest("GET", "/am", nil)
Expand Down
2 changes: 1 addition & 1 deletion cmd/start.go
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ var startCmd = &cobra.Command{

cmdL.Info("starting maestro")

app, err := api.NewApp(bind, port, config, log, incluster, kubeconfig, nil, nil, nil, nil, nil, nil)
app, err := api.NewApp(bind, port, config, log, incluster, kubeconfig, nil, nil, nil, nil, nil, nil, nil)
if err != nil {
cmdL.Fatal(err)
}
Expand Down
Loading

0 comments on commit 78148f4

Please sign in to comment.