mirror of
https://github.com/grafana/grafana.git
synced 2024-11-23 09:26:43 -06:00
0de2c9eb96
* feat: add ability to launch targeted dskit modules in the grafana server CLI command This commit adds a ModuleServer and ModuleRunner suitable for launching dskit services and updates the server cli command to use this instead of the full Server. The default behavior is unchanged and will launch the full Grafana server. Individual services are targeted by setting target=comma,seperated,list in the config file. * require dev mode to target dskit modules * remove unused type * replace setting.CommandLineArgs w/setting.Cfg; the caller can deal with calling setting.NewCfg * Update pkg/server/module_server.go Co-authored-by: Serge Zaitsev <serge.zaitsev@grafana.com> --------- Co-authored-by: Serge Zaitsev <serge.zaitsev@grafana.com>
93 lines
2.0 KiB
Go
93 lines
2.0 KiB
Go
package server
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"fmt"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
|
|
"github.com/grafana/grafana/pkg/registry"
|
|
"github.com/grafana/grafana/pkg/registry/backgroundsvcs"
|
|
"github.com/grafana/grafana/pkg/services/accesscontrol/acimpl"
|
|
"github.com/grafana/grafana/pkg/setting"
|
|
)
|
|
|
|
type testService struct {
|
|
started chan struct{}
|
|
runErr error
|
|
isDisabled bool
|
|
}
|
|
|
|
func newTestService(runErr error, disabled bool) *testService {
|
|
return &testService{
|
|
started: make(chan struct{}),
|
|
runErr: runErr,
|
|
isDisabled: disabled,
|
|
}
|
|
}
|
|
|
|
func (s *testService) Run(ctx context.Context) error {
|
|
if s.isDisabled {
|
|
return fmt.Errorf("Shouldn't run disabled service")
|
|
}
|
|
|
|
if s.runErr != nil {
|
|
return s.runErr
|
|
}
|
|
close(s.started)
|
|
<-ctx.Done()
|
|
return ctx.Err()
|
|
}
|
|
|
|
func (s *testService) IsDisabled() bool {
|
|
return s.isDisabled
|
|
}
|
|
|
|
func testServer(t *testing.T, services ...registry.BackgroundService) *Server {
|
|
t.Helper()
|
|
s, err := newServer(Options{}, setting.NewCfg(), nil, &acimpl.Service{}, nil, backgroundsvcs.NewBackgroundServiceRegistry(services...))
|
|
require.NoError(t, err)
|
|
// Required to skip configuration initialization that causes
|
|
// DI errors in this test.
|
|
s.isInitialized = true
|
|
return s
|
|
}
|
|
|
|
func TestServer_Run_Error(t *testing.T) {
|
|
testErr := errors.New("boom")
|
|
s := testServer(t, newTestService(nil, false), newTestService(testErr, false))
|
|
err := s.Run()
|
|
require.ErrorIs(t, err, testErr)
|
|
}
|
|
|
|
func TestServer_Shutdown(t *testing.T) {
|
|
ctx := context.Background()
|
|
|
|
s := testServer(t, newTestService(nil, false), newTestService(nil, true))
|
|
|
|
ch := make(chan error)
|
|
|
|
go func() {
|
|
defer close(ch)
|
|
|
|
// Wait until all services launched.
|
|
for _, svc := range s.backgroundServices {
|
|
if !svc.(*testService).isDisabled {
|
|
<-svc.(*testService).started
|
|
}
|
|
}
|
|
ctx, cancel := context.WithTimeout(ctx, 3*time.Second)
|
|
defer cancel()
|
|
err := s.Shutdown(ctx, "test interrupt")
|
|
ch <- err
|
|
}()
|
|
err := s.Run()
|
|
require.NoError(t, err)
|
|
|
|
err = <-ch
|
|
require.NoError(t, err)
|
|
}
|