influxdb/tests/pipeline_helpers.go

165 lines
4.6 KiB
Go

package tests
import (
"context"
"testing"
"github.com/influxdata/influxdb/v2"
"github.com/influxdata/influxdb/v2/cmd/influxd/launcher"
"github.com/influxdata/influxdb/v2/kit/platform"
"go.uber.org/zap"
)
// A Pipeline is responsible for configuring launcher.TestLauncher
// with default values so it may be used for end-to-end integration
// tests.
type Pipeline struct {
Launcher *launcher.TestLauncher
DefaultOrgID platform.ID
DefaultBucketID platform.ID
DefaultUserID platform.ID
}
// NewDefaultPipeline creates a Pipeline with default
// values.
//
// It is retained for compatibility with cloud tests.
func NewDefaultPipeline(t *testing.T, opts ...launcher.OptSetter) *DefaultPipeline {
setDefaultLogLevel := func(o *launcher.InfluxdOpts) {
// This is left here mainly for retro compatibility
if VeryVerbose {
o.LogLevel = zap.DebugLevel
} else {
o.LogLevel = zap.InfoLevel
}
}
// Set the default log level as the FIRST option here so users can override
// it with passed-in setters.
opts = append([]launcher.OptSetter{setDefaultLogLevel}, opts...)
return &DefaultPipeline{Pipeline: NewPipeline(t, opts...)}
}
// NewPipeline returns a pipeline with the given options applied to the configuration as appropriate.
//
// A single user, org, bucket and token are created.
func NewPipeline(tb testing.TB, opts ...launcher.OptSetter) *Pipeline {
tb.Helper()
tl := launcher.NewTestLauncher()
p := &Pipeline{
Launcher: tl,
}
tl.RunOrFail(tb, context.Background(), opts...)
// setup default operator
res := p.Launcher.OnBoardOrFail(tb, &influxdb.OnboardingRequest{
User: DefaultUsername,
Password: DefaultPassword,
Org: DefaultOrgName,
Bucket: DefaultBucketName,
RetentionPeriodSeconds: influxdb.InfiniteRetention,
Token: OperToken,
})
p.DefaultOrgID = res.Org.ID
p.DefaultUserID = res.User.ID
p.DefaultBucketID = res.Bucket.ID
return p
}
// Open opens all the components of the pipeline.
func (p *Pipeline) Open() error {
return nil
}
// MustOpen opens the pipeline, panicking if any error is encountered.
func (p *Pipeline) MustOpen() {
if err := p.Open(); err != nil {
panic(err)
}
}
// Close closes all the components of the pipeline.
func (p *Pipeline) Close() error {
return p.Launcher.Shutdown(context.Background())
}
// MustClose closes the pipeline, panicking if any error is encountered.
func (p *Pipeline) MustClose() {
if err := p.Close(); err != nil {
panic(err)
}
}
// MustNewAdminClient returns a default client that will direct requests to Launcher.
//
// The operator token is authorized to do anything in the system.
func (p *Pipeline) MustNewAdminClient() *Client {
return p.MustNewClient(p.DefaultOrgID, p.DefaultBucketID, OperToken)
}
// MustNewClient returns a client that will direct requests to Launcher.
func (p *Pipeline) MustNewClient(org, bucket platform.ID, token string) *Client {
config := ClientConfig{
UserID: p.DefaultUserID,
OrgID: org,
BucketID: bucket,
DocumentsNamespace: DefaultDocumentsNamespace,
Token: token,
}
svc, err := NewClient(p.Launcher.URL().String(), config)
if err != nil {
panic(err)
}
return svc
}
// NewBrowserClient returns a client with a cookie session that will direct requests to Launcher.
func (p *Pipeline) NewBrowserClient(org, bucket platform.ID, session *influxdb.Session) (*Client, error) {
config := ClientConfig{
UserID: p.DefaultUserID,
OrgID: org,
BucketID: bucket,
DocumentsNamespace: DefaultDocumentsNamespace,
Session: session,
}
return NewClient(p.Launcher.URL().String(), config)
}
// BrowserFor will create a user, session, and browser client.
// The generated browser points to the given org and bucket.
//
// The user and session are inserted directly into the backing store.
func (p *Pipeline) BrowserFor(org, bucket platform.ID, username string) (*Client, platform.ID, error) {
ctx := context.Background()
user := &influxdb.User{
Name: username,
}
err := p.Launcher.UserService().CreateUser(ctx, user)
if err != nil {
return nil, 0, err
}
session, err := p.Launcher.SessionService().CreateSession(ctx, username)
if err != nil {
return nil, 0, err
}
client, err := p.NewBrowserClient(org, bucket, session)
return client, user.ID, err
}
// Flush is a no-op and retained for compatibility with tests from cloud.
func (p *Pipeline) Flush() {
}
// DefaultPipeline is a wrapper for Pipeline and is retained
// for compatibility with cloud tests.
type DefaultPipeline struct {
*Pipeline
}