diff --git a/pkg/cmd/grafana-server/server.go b/pkg/cmd/grafana-server/server.go index a07cb692a68..d8d021d502b 100644 --- a/pkg/cmd/grafana-server/server.go +++ b/pkg/cmd/grafana-server/server.go @@ -15,13 +15,17 @@ import ( "github.com/grafana/grafana/pkg/api" "github.com/grafana/grafana/pkg/api/routing" "github.com/grafana/grafana/pkg/bus" + "github.com/grafana/grafana/pkg/lifecycle" + "github.com/grafana/grafana/pkg/middleware" + "github.com/grafana/grafana/pkg/registry" + + "golang.org/x/sync/errgroup" + + "github.com/grafana/grafana/pkg/api" "github.com/grafana/grafana/pkg/log" - "github.com/grafana/grafana/pkg/login" "github.com/grafana/grafana/pkg/services/cache" "github.com/grafana/grafana/pkg/setting" - "github.com/grafana/grafana/pkg/social" - // self registering services _ "github.com/grafana/grafana/pkg/extensions" _ "github.com/grafana/grafana/pkg/metrics" @@ -35,8 +39,7 @@ import ( _ "github.com/grafana/grafana/pkg/services/rendering" _ "github.com/grafana/grafana/pkg/services/search" _ "github.com/grafana/grafana/pkg/services/sqlstore" - "github.com/grafana/grafana/pkg/setting" - "github.com/grafana/grafana/pkg/social" // self registering services + "github.com/grafana/grafana/pkg/setting" // self registering services _ "github.com/grafana/grafana/pkg/tracing" "golang.org/x/sync/errgroup" ) @@ -71,8 +74,7 @@ func (g *GrafanaServerImpl) Run() error { g.loadConfiguration() g.writePIDFile() - login.Init() - social.NewOAuthService() + lifecycle.Notify(lifecycle.ApplicationStarting) serviceGraph := inject.Graph{} serviceGraph.Provide(&inject.Object{Value: bus.GetBus()}) @@ -145,7 +147,7 @@ func (g *GrafanaServerImpl) Run() error { } sendSystemdNotification("READY=1") - + lifecycle.Notify(lifecycle.ApplicationStarted) return g.childRoutines.Wait() } diff --git a/pkg/lifecycle/lifecycle.go b/pkg/lifecycle/lifecycle.go new file mode 100644 index 00000000000..eea733a7da8 --- /dev/null +++ b/pkg/lifecycle/lifecycle.go @@ -0,0 +1,22 @@ +package lifecycle + +type Event int + +const ( + ApplicationStarting Event = iota + ApplicationStarted +) + +type EventHandlerFunc func() + +var listeners = map[int][]EventHandlerFunc{} + +func AddListener(evt Event, fn EventHandlerFunc) { + listeners[int(evt)] = append(listeners[int(evt)], fn) +} + +func Notify(evt Event) { + for _, handler := range listeners[int(evt)] { + handler() + } +} diff --git a/pkg/lifecycle/lifecycle_test.go b/pkg/lifecycle/lifecycle_test.go new file mode 100644 index 00000000000..e946cc2f4a8 --- /dev/null +++ b/pkg/lifecycle/lifecycle_test.go @@ -0,0 +1,35 @@ +package lifecycle + +import ( + "testing" + + . "github.com/smartystreets/goconvey/convey" +) + +func TestLifecycle(t *testing.T) { + Convey("TestLifecycle", t, func() { + Convey("Given listeners", func() { + applicationStartingCounter := 0 + AddListener(ApplicationStarting, func() { + applicationStartingCounter++ + }) + + applicationStartedCounter := 0 + AddListener(ApplicationStarted, func() { + applicationStartedCounter++ + }) + + Convey("When notify application starting should call listener", func() { + Notify(ApplicationStarting) + So(applicationStartingCounter, ShouldEqual, 1) + So(applicationStartedCounter, ShouldEqual, 0) + }) + + Convey("When notify application started should call listener", func() { + Notify(ApplicationStarted) + So(applicationStartingCounter, ShouldEqual, 0) + So(applicationStartedCounter, ShouldEqual, 1) + }) + }) + }) +} diff --git a/pkg/login/auth.go b/pkg/login/auth.go index 991fa72fd54..b195b8dd2e4 100644 --- a/pkg/login/auth.go +++ b/pkg/login/auth.go @@ -2,7 +2,9 @@ package login import ( "errors" + "github.com/grafana/grafana/pkg/bus" + "github.com/grafana/grafana/pkg/lifecycle" m "github.com/grafana/grafana/pkg/models" ) @@ -18,9 +20,11 @@ var ( ErrGettingUserQuota = errors.New("Error getting user quota") ) -func Init() { - bus.AddHandler("auth", AuthenticateUser) - loadLdapConfig() +func init() { + lifecycle.AddListener(lifecycle.ApplicationStarting, func() { + bus.AddHandler("auth", AuthenticateUser) + loadLdapConfig() + }) } func AuthenticateUser(query *m.LoginUserQuery) error { diff --git a/pkg/social/social.go b/pkg/social/social.go index 8918507f3b9..054420fd994 100644 --- a/pkg/social/social.go +++ b/pkg/social/social.go @@ -8,11 +8,18 @@ import ( "golang.org/x/oauth2" + "github.com/grafana/grafana/pkg/lifecycle" "github.com/grafana/grafana/pkg/log" "github.com/grafana/grafana/pkg/setting" "github.com/grafana/grafana/pkg/util" ) +func init() { + lifecycle.AddListener(lifecycle.ApplicationStarting, func() { + initOAuthService() + }) +} + type BasicUserInfo struct { Id string Name string @@ -56,7 +63,7 @@ var ( allOauthes = []string{"github", "gitlab", "google", "generic_oauth", "grafananet", grafanaCom} ) -func NewOAuthService() { +func initOAuthService() { setting.OAuthService = &setting.OAuther{} setting.OAuthService.OAuthInfos = make(map[string]*setting.OAuthInfo)