From d568d7fd01fadd9210c58e7796ded1637fb15c75 Mon Sep 17 00:00:00 2001 From: Nathaniel Cook Date: Thu, 12 Jul 2018 15:27:27 -0600 Subject: [PATCH] feat: Use DBRPMappings in 1.x read path --- cmd/transpilerd/main.go | 2 + http/transpiler_handler.go | 15 +++--- mock/dbrp_mapping.go | 51 ++++++++++++++++++ query/functions/query_test.go | 26 ++++++++- query/influxql/config.go | 5 +- query/influxql/spectests/aggregates.go | 2 +- .../spectests/aggregates_with_condition.go | 2 +- .../spectests/aggregates_with_groupby.go | 2 +- .../spectests/aggregates_with_window.go | 2 +- .../aggregates_with_window_offset.go | 2 +- query/influxql/spectests/math.go | 4 +- .../influxql/spectests/multiple_aggregates.go | 4 +- .../influxql/spectests/multiple_statements.go | 4 +- query/influxql/spectests/raw.go | 2 +- .../influxql/spectests/raw_with_condition.go | 2 +- .../spectests/raw_with_regex_condition.go | 4 +- query/influxql/spectests/retention_policy.go | 2 +- query/influxql/spectests/selectors.go | 2 +- query/influxql/spectests/testing.go | 54 +++++++++++++++++-- query/influxql/transpiler.go | 54 ++++++++++++------- query/influxql/transpiler_test.go | 33 ++++++++++-- query/querytest/compspecs/compspecs.go | 29 +++++++++- 22 files changed, 252 insertions(+), 51 deletions(-) create mode 100644 mock/dbrp_mapping.go diff --git a/cmd/transpilerd/main.go b/cmd/transpilerd/main.go index a63a22fe00..f51907f30c 100644 --- a/cmd/transpilerd/main.go +++ b/cmd/transpilerd/main.go @@ -82,6 +82,8 @@ func transpileF(cmd *cobra.Command, logger *zap.Logger, args []string) error { transpileHandler.QueryService = &http.QueryService{ Addr: hosts[0], } + //TODO(nathanielc): Add DBRPMappingService + transpileHandler.DBRPMappingService = nil transpileHandler.Logger = logger reg.MustRegister(transpileHandler.PrometheusCollectors()...) diff --git a/http/transpiler_handler.go b/http/transpiler_handler.go index 3def61206b..b972a6a62c 100644 --- a/http/transpiler_handler.go +++ b/http/transpiler_handler.go @@ -15,9 +15,10 @@ import ( type TranspilerQueryHandler struct { *httprouter.Router - Logger *zap.Logger - QueryService query.QueryService - OrgID platform.ID + Logger *zap.Logger + QueryService query.QueryService + DBRPMappingService platform.DBRPMappingService + OrgID platform.ID } // NewQueryHandler returns a new instance of QueryHandler. @@ -52,7 +53,7 @@ func (h *TranspilerQueryHandler) handlePostQuery(w http.ResponseWriter, r *http. // Create a new transpiler from the http request. ce := influxqlCE - transpiler := ce.transpiler(r) + transpiler := ce.transpiler(r, h.DBRPMappingService) // Run the transpiler against the query service. results, err := query.QueryWithTranspile(ctx, h.OrgID, queryStr, h.QueryService, transpiler) @@ -77,18 +78,18 @@ func (h *TranspilerQueryHandler) PrometheusCollectors() []prometheus.Collector { // crossExecute contains the components needed to execute a transpiled query and encode results. type crossExecute struct { - transpiler func(req *http.Request) query.Transpiler + transpiler func(req *http.Request, dbrpMappingSvc platform.DBRPMappingService) query.Transpiler encoder query.MultiResultEncoder contentType string } var influxqlCE = crossExecute{ - transpiler: func(req *http.Request) query.Transpiler { + transpiler: func(req *http.Request, dbrpMappingSvc platform.DBRPMappingService) query.Transpiler { config := influxql.Config{ DefaultDatabase: req.FormValue("db"), DefaultRetentionPolicy: req.FormValue("rp"), } - return influxql.NewTranspilerWithConfig(config) + return influxql.NewTranspilerWithConfig(dbrpMappingSvc, config) }, encoder: influxql.NewMultiResultEncoder(), contentType: "application/json", diff --git a/mock/dbrp_mapping.go b/mock/dbrp_mapping.go new file mode 100644 index 0000000000..a576f1105f --- /dev/null +++ b/mock/dbrp_mapping.go @@ -0,0 +1,51 @@ +package mock + +import ( + "context" + + "github.com/influxdata/platform" +) + +type DBRPMappingService struct { + FindByFn func(ctx context.Context, cluster string, db string, rp string) (*platform.DBRPMapping, error) + FindFn func(ctx context.Context, filter platform.DBRPMappingFilter) (*platform.DBRPMapping, error) + FindManyFn func(ctx context.Context, filter platform.DBRPMappingFilter, opt ...platform.FindOptions) ([]*platform.DBRPMapping, int, error) + CreateFn func(ctx context.Context, dbrpMap *platform.DBRPMapping) error + DeleteFn func(ctx context.Context, cluster string, db string, rp string) error +} + +func NewDBRPMappingService() *DBRPMappingService { + return &DBRPMappingService{ + FindByFn: func(ctx context.Context, cluster string, db string, rp string) (*platform.DBRPMapping, error) { + return nil, nil + }, + FindFn: func(ctx context.Context, filter platform.DBRPMappingFilter) (*platform.DBRPMapping, error) { + return nil, nil + }, + FindManyFn: func(ctx context.Context, filter platform.DBRPMappingFilter, opt ...platform.FindOptions) ([]*platform.DBRPMapping, int, error) { + return nil, 0, nil + }, + CreateFn: func(ctx context.Context, dbrpMap *platform.DBRPMapping) error { return nil }, + DeleteFn: func(ctx context.Context, cluster string, db string, rp string) error { return nil }, + } +} + +func (s *DBRPMappingService) FindBy(ctx context.Context, cluster string, db string, rp string) (*platform.DBRPMapping, error) { + return s.FindByFn(ctx, cluster, db, rp) +} + +func (s *DBRPMappingService) Find(ctx context.Context, filter platform.DBRPMappingFilter) (*platform.DBRPMapping, error) { + return s.FindFn(ctx, filter) +} + +func (s *DBRPMappingService) FindMany(ctx context.Context, filter platform.DBRPMappingFilter, opt ...platform.FindOptions) ([]*platform.DBRPMapping, int, error) { + return s.FindManyFn(ctx, filter, opt...) +} + +func (s *DBRPMappingService) Create(ctx context.Context, dbrpMap *platform.DBRPMapping) error { + return s.CreateFn(ctx, dbrpMap) +} + +func (s *DBRPMappingService) Delete(ctx context.Context, cluster string, db string, rp string) error { + return s.DeleteFn(ctx, cluster, db, rp) +} diff --git a/query/functions/query_test.go b/query/functions/query_test.go index 85f1f4e5e0..f32f93a3e2 100644 --- a/query/functions/query_test.go +++ b/query/functions/query_test.go @@ -8,6 +8,8 @@ import ( "testing" "time" + "github.com/influxdata/platform" + "github.com/influxdata/platform/mock" "github.com/influxdata/platform/query" _ "github.com/influxdata/platform/query/builtin" "github.com/influxdata/platform/query/csv" @@ -18,6 +20,28 @@ import ( "github.com/andreyvit/diff" ) +var dbrpMappingSvc = mock.NewDBRPMappingService() + +func init() { + mapping := platform.DBRPMapping{ + Cluster: "cluster", + Database: "db0", + RetentionPolicy: "autogen", + Default: true, + OrganizationID: platform.ID("org"), + BucketID: platform.ID("bucket"), + } + dbrpMappingSvc.FindByFn = func(ctx context.Context, cluster string, db string, rp string) (*platform.DBRPMapping, error) { + return &mapping, nil + } + dbrpMappingSvc.FindFn = func(ctx context.Context, filter platform.DBRPMappingFilter) (*platform.DBRPMapping, error) { + return &mapping, nil + } + dbrpMappingSvc.FindManyFn = func(ctx context.Context, filter platform.DBRPMappingFilter, opt ...platform.FindOptions) ([]*platform.DBRPMapping, int, error) { + return []*platform.DBRPMapping{&mapping}, 1, nil + } +} + var skipTests = map[string]string{ "derivative": "derivative not supported by influxql (https://github.com/influxdata/platform/issues/93)", "filter_by_tags": "arbitrary filtering not supported by influxql (https://github.com/influxdata/platform/issues/94)", @@ -31,7 +55,7 @@ var skipTests = map[string]string{ func Test_QueryEndToEnd(t *testing.T) { qs := querytest.GetQueryServiceBridge() - influxqlTranspiler := influxql.NewTranspiler() + influxqlTranspiler := influxql.NewTranspiler(dbrpMappingSvc) dir, err := os.Getwd() if err != nil { diff --git a/query/influxql/config.go b/query/influxql/config.go index ebaf125a3c..c57a315f92 100644 --- a/query/influxql/config.go +++ b/query/influxql/config.go @@ -1,10 +1,13 @@ package influxql -import "time" +import ( + "time" +) // Config modifies the behavior of the Transpiler. type Config struct { DefaultDatabase string DefaultRetentionPolicy string NowFn func() time.Time + Cluster string } diff --git a/query/influxql/spectests/aggregates.go b/query/influxql/spectests/aggregates.go index 525b4f19c6..0b2acfa33b 100644 --- a/query/influxql/spectests/aggregates.go +++ b/query/influxql/spectests/aggregates.go @@ -58,7 +58,7 @@ func init() { { ID: "from0", Spec: &functions.FromOpSpec{ - Bucket: "db0/autogen", + BucketID: bucketID, }, }, { diff --git a/query/influxql/spectests/aggregates_with_condition.go b/query/influxql/spectests/aggregates_with_condition.go index c5f3da9085..aa2e290b78 100644 --- a/query/influxql/spectests/aggregates_with_condition.go +++ b/query/influxql/spectests/aggregates_with_condition.go @@ -20,7 +20,7 @@ func init() { { ID: "from0", Spec: &functions.FromOpSpec{ - Bucket: "db0/autogen", + BucketID: bucketID, }, }, { diff --git a/query/influxql/spectests/aggregates_with_groupby.go b/query/influxql/spectests/aggregates_with_groupby.go index 8a23af8f8e..44a882fd7e 100644 --- a/query/influxql/spectests/aggregates_with_groupby.go +++ b/query/influxql/spectests/aggregates_with_groupby.go @@ -20,7 +20,7 @@ func init() { { ID: "from0", Spec: &functions.FromOpSpec{ - Bucket: "db0/autogen", + BucketID: bucketID, }, }, { diff --git a/query/influxql/spectests/aggregates_with_window.go b/query/influxql/spectests/aggregates_with_window.go index d3855d522d..bc2ea8f28b 100644 --- a/query/influxql/spectests/aggregates_with_window.go +++ b/query/influxql/spectests/aggregates_with_window.go @@ -21,7 +21,7 @@ func init() { { ID: "from0", Spec: &functions.FromOpSpec{ - Bucket: "db0/autogen", + BucketID: bucketID, }, }, { diff --git a/query/influxql/spectests/aggregates_with_window_offset.go b/query/influxql/spectests/aggregates_with_window_offset.go index c5b644806c..bd7b7213a0 100644 --- a/query/influxql/spectests/aggregates_with_window_offset.go +++ b/query/influxql/spectests/aggregates_with_window_offset.go @@ -21,7 +21,7 @@ func init() { { ID: "from0", Spec: &functions.FromOpSpec{ - Bucket: "db0/autogen", + BucketID: bucketID, }, }, { diff --git a/query/influxql/spectests/math.go b/query/influxql/spectests/math.go index 6aed4d752a..2fd3d71208 100644 --- a/query/influxql/spectests/math.go +++ b/query/influxql/spectests/math.go @@ -19,7 +19,7 @@ func init() { { ID: "from0", Spec: &functions.FromOpSpec{ - Bucket: "db0/autogen", + BucketID: bucketID, }, }, { @@ -69,7 +69,7 @@ func init() { { ID: "from1", Spec: &functions.FromOpSpec{ - Bucket: "db0/autogen", + BucketID: bucketID, }, }, { diff --git a/query/influxql/spectests/multiple_aggregates.go b/query/influxql/spectests/multiple_aggregates.go index 3a97716f36..9a48be4fcf 100644 --- a/query/influxql/spectests/multiple_aggregates.go +++ b/query/influxql/spectests/multiple_aggregates.go @@ -20,7 +20,7 @@ func init() { { ID: "from0", Spec: &functions.FromOpSpec{ - Bucket: "db0/autogen", + BucketID: bucketID, }, }, { @@ -86,7 +86,7 @@ func init() { { ID: "from1", Spec: &functions.FromOpSpec{ - Bucket: "db0/autogen", + BucketID: bucketID, }, }, { diff --git a/query/influxql/spectests/multiple_statements.go b/query/influxql/spectests/multiple_statements.go index b873df132e..a56c8b4781 100644 --- a/query/influxql/spectests/multiple_statements.go +++ b/query/influxql/spectests/multiple_statements.go @@ -20,7 +20,7 @@ func init() { { ID: "from0", Spec: &functions.FromOpSpec{ - Bucket: "db0/autogen", + BucketID: bucketID, }, }, { @@ -125,7 +125,7 @@ func init() { { ID: "from1", Spec: &functions.FromOpSpec{ - Bucket: "db0/autogen", + BucketID: bucketID, }, }, { diff --git a/query/influxql/spectests/raw.go b/query/influxql/spectests/raw.go index d244fc0745..6b03212fea 100644 --- a/query/influxql/spectests/raw.go +++ b/query/influxql/spectests/raw.go @@ -19,7 +19,7 @@ func init() { { ID: "from0", Spec: &functions.FromOpSpec{ - Bucket: "db0/autogen", + BucketID: bucketID, }, }, { diff --git a/query/influxql/spectests/raw_with_condition.go b/query/influxql/spectests/raw_with_condition.go index 21f458ef4c..07452e4223 100644 --- a/query/influxql/spectests/raw_with_condition.go +++ b/query/influxql/spectests/raw_with_condition.go @@ -19,7 +19,7 @@ func init() { { ID: "from0", Spec: &functions.FromOpSpec{ - Bucket: "db0/autogen", + BucketID: bucketID, }, }, { diff --git a/query/influxql/spectests/raw_with_regex_condition.go b/query/influxql/spectests/raw_with_regex_condition.go index 14a4a5b669..3f204ef3ef 100644 --- a/query/influxql/spectests/raw_with_regex_condition.go +++ b/query/influxql/spectests/raw_with_regex_condition.go @@ -20,7 +20,7 @@ func init() { { ID: "from0", Spec: &functions.FromOpSpec{ - Bucket: "db0/autogen", + BucketID: bucketID, }, }, { @@ -155,7 +155,7 @@ func init() { { ID: "from0", Spec: &functions.FromOpSpec{ - Bucket: "db0/autogen", + BucketID: bucketID, }, }, { diff --git a/query/influxql/spectests/retention_policy.go b/query/influxql/spectests/retention_policy.go index 4ee0e5c020..6b5e3a4519 100644 --- a/query/influxql/spectests/retention_policy.go +++ b/query/influxql/spectests/retention_policy.go @@ -19,7 +19,7 @@ func init() { { ID: "from0", Spec: &functions.FromOpSpec{ - Bucket: "db0/alternate", + BucketID: altBucketID, }, }, { diff --git a/query/influxql/spectests/selectors.go b/query/influxql/spectests/selectors.go index 10e0b6deab..1ed5e6533d 100644 --- a/query/influxql/spectests/selectors.go +++ b/query/influxql/spectests/selectors.go @@ -59,7 +59,7 @@ func init() { { ID: "from0", Spec: &functions.FromOpSpec{ - Bucket: "db0/autogen", + BucketID: bucketID, }, }, { diff --git a/query/influxql/spectests/testing.go b/query/influxql/spectests/testing.go index eaf37f04f5..45753de4ff 100644 --- a/query/influxql/spectests/testing.go +++ b/query/influxql/spectests/testing.go @@ -10,10 +10,55 @@ import ( "time" "github.com/google/go-cmp/cmp" + "github.com/influxdata/platform" + "github.com/influxdata/platform/mock" "github.com/influxdata/platform/query" "github.com/influxdata/platform/query/influxql" ) +var dbrpMappingSvc = mock.NewDBRPMappingService() +var organizationID = platform.ID("aaaa") +var bucketID = platform.ID("bbbb") +var altBucketID = platform.ID("cccc") + +func init() { + mapping := platform.DBRPMapping{ + Cluster: "cluster", + Database: "db0", + RetentionPolicy: "autogen", + Default: true, + OrganizationID: organizationID, + BucketID: bucketID, + } + altMapping := platform.DBRPMapping{ + Cluster: "cluster", + Database: "db0", + RetentionPolicy: "autogen", + Default: true, + OrganizationID: organizationID, + BucketID: altBucketID, + } + dbrpMappingSvc.FindByFn = func(ctx context.Context, cluster string, db string, rp string) (*platform.DBRPMapping, error) { + if rp == "alternate" { + return &altMapping, nil + } + return &mapping, nil + } + dbrpMappingSvc.FindFn = func(ctx context.Context, filter platform.DBRPMappingFilter) (*platform.DBRPMapping, error) { + if filter.RetentionPolicy != nil && *filter.RetentionPolicy == "alternate" { + return &altMapping, nil + } + return &mapping, nil + } + dbrpMappingSvc.FindManyFn = func(ctx context.Context, filter platform.DBRPMappingFilter, opt ...platform.FindOptions) ([]*platform.DBRPMapping, int, error) { + m := &mapping + if filter.RetentionPolicy != nil && *filter.RetentionPolicy == "alternate" { + m = &altMapping + } + return []*platform.DBRPMapping{m}, 1, nil + } +} + // Fixture is a structure that will run tests. type Fixture interface { Run(t *testing.T) @@ -43,9 +88,12 @@ func (f *fixture) Run(t *testing.T) { t.Fatalf("%s:%d: expected spec is not valid: %s", f.file, f.line, err) } - transpiler := influxql.NewTranspilerWithConfig(influxql.Config{ - NowFn: Now, - }) + transpiler := influxql.NewTranspilerWithConfig( + dbrpMappingSvc, + influxql.Config{ + NowFn: Now, + }, + ) spec, err := transpiler.Transpile(context.Background(), f.stmt) if err != nil { t.Fatalf("%s:%d: unexpected error: %s", f.file, f.line, err) diff --git a/query/influxql/transpiler.go b/query/influxql/transpiler.go index 6b951c6329..574d3f12f9 100644 --- a/query/influxql/transpiler.go +++ b/query/influxql/transpiler.go @@ -8,22 +8,25 @@ import ( "time" "github.com/influxdata/influxql" + "github.com/influxdata/platform" "github.com/influxdata/platform/query" "github.com/influxdata/platform/query/functions" ) // Transpiler converts InfluxQL queries into a query spec. type Transpiler struct { - Config *Config + Config *Config + dbrpMappingSvc platform.DBRPMappingService } -func NewTranspiler() *Transpiler { - return &Transpiler{} +func NewTranspiler(dbrpMappingSvc platform.DBRPMappingService) *Transpiler { + return NewTranspilerWithConfig(dbrpMappingSvc, Config{}) } -func NewTranspilerWithConfig(cfg Config) *Transpiler { +func NewTranspilerWithConfig(dbrpMappingSvc platform.DBRPMappingService, cfg Config) *Transpiler { return &Transpiler{ - Config: &cfg, + Config: &cfg, + dbrpMappingSvc: dbrpMappingSvc, } } @@ -34,7 +37,7 @@ func (t *Transpiler) Transpile(ctx context.Context, txt string) (*query.Spec, er return nil, err } - transpiler := newTranspilerState(t.Config) + transpiler := newTranspilerState(t.dbrpMappingSvc, t.Config) for i, s := range q.Statements { stmt, ok := s.(*influxql.SelectStatement) if !ok { @@ -48,18 +51,20 @@ func (t *Transpiler) Transpile(ctx context.Context, txt string) (*query.Spec, er } type transpilerState struct { - id int - stmt *influxql.SelectStatement - config Config - spec *query.Spec - nextID map[string]int - now time.Time + id int + stmt *influxql.SelectStatement + config Config + spec *query.Spec + nextID map[string]int + now time.Time + dbrpMappingSvc platform.DBRPMappingService } -func newTranspilerState(config *Config) *transpilerState { +func newTranspilerState(dbrpMappingSvc platform.DBRPMappingService, config *Config) *transpilerState { state := &transpilerState{ - spec: &query.Spec{}, - nextID: make(map[string]int), + spec: &query.Spec{}, + nextID: make(map[string]int), + dbrpMappingSvc: dbrpMappingSvc, } if config != nil { state.config = *config @@ -128,13 +133,26 @@ func (t *transpilerState) from(m *influxql.Measurement) (query.OperationID, erro if rp == "" { if t.config.DefaultRetentionPolicy != "" { rp = t.config.DefaultRetentionPolicy - } else { - rp = "autogen" } } + var filter platform.DBRPMappingFilter + filter.Cluster = &t.config.Cluster + if db != "" { + filter.Database = &db + } + if rp != "" { + filter.RetentionPolicy = &rp + } + defaultRP := rp == "" + filter.Default = &defaultRP + mapping, err := t.dbrpMappingSvc.Find(context.TODO(), filter) + if err != nil { + return "", err + } + spec := &functions.FromOpSpec{ - Bucket: fmt.Sprintf("%s/%s", db, rp), + BucketID: mapping.BucketID, } return t.op("from", spec), nil } diff --git a/query/influxql/transpiler_test.go b/query/influxql/transpiler_test.go index f80d115c35..0ef493af7e 100644 --- a/query/influxql/transpiler_test.go +++ b/query/influxql/transpiler_test.go @@ -5,11 +5,35 @@ import ( "strings" "testing" + "github.com/influxdata/platform" + "github.com/influxdata/platform/mock" "github.com/influxdata/platform/query/influxql" "github.com/influxdata/platform/query/influxql/spectests" "github.com/pkg/errors" ) +var dbrpMappingSvc = mock.NewDBRPMappingService() + +func init() { + mapping := platform.DBRPMapping{ + Cluster: "cluster", + Database: "db0", + RetentionPolicy: "autogen", + Default: true, + OrganizationID: platform.ID("aaaa"), + BucketID: platform.ID("bbbb"), + } + dbrpMappingSvc.FindByFn = func(ctx context.Context, cluster string, db string, rp string) (*platform.DBRPMapping, error) { + return &mapping, nil + } + dbrpMappingSvc.FindFn = func(ctx context.Context, filter platform.DBRPMappingFilter) (*platform.DBRPMapping, error) { + return &mapping, nil + } + dbrpMappingSvc.FindManyFn = func(ctx context.Context, filter platform.DBRPMappingFilter, opt ...platform.FindOptions) ([]*platform.DBRPMapping, int, error) { + return []*platform.DBRPMapping{&mapping}, 1, nil + } +} + func TestTranspiler(t *testing.T) { for _, fixture := range spectests.All() { fixture.Run(t) @@ -361,9 +385,12 @@ func TestTranspiler_Compile(t *testing.T) { } }() - transpiler := influxql.NewTranspilerWithConfig(influxql.Config{ - DefaultDatabase: "db0", - }) + transpiler := influxql.NewTranspilerWithConfig( + dbrpMappingSvc, + influxql.Config{ + DefaultDatabase: "db0", + }, + ) if _, err := transpiler.Transpile(context.Background(), tt.s); err != nil { if got, want := err.Error(), tt.err; got != want { if cause := errors.Cause(err); strings.HasPrefix(cause.Error(), "unimplemented") { diff --git a/query/querytest/compspecs/compspecs.go b/query/querytest/compspecs/compspecs.go index 1c0e6aae09..3142bf98f3 100644 --- a/query/querytest/compspecs/compspecs.go +++ b/query/querytest/compspecs/compspecs.go @@ -11,6 +11,8 @@ import ( "time" "github.com/google/go-cmp/cmp/cmpopts" + "github.com/influxdata/platform" + "github.com/influxdata/platform/mock" "github.com/influxdata/platform/query" "github.com/influxdata/platform/query/influxql" "github.com/influxdata/platform/query/semantic/semantictest" @@ -69,7 +71,7 @@ func main() { return } - transpiler := influxql.NewTranspiler() + transpiler := influxql.NewTranspiler(dbrpMappingSvc) influxqlSpec, err := transpiler.Transpile(context.Background(), string(influxqlText)) if err != nil { fmt.Printf("error transpiling. \n query: \n %s \n err: %s", string(influxqlText), err) @@ -85,3 +87,28 @@ func main() { fmt.Printf("compiled vs transpiled diff: \n%s", difference) } } + +// Setup mock DBRPMappingService to always return `db.rp`. +var dbrpMappingSvc = mock.NewDBRPMappingService() + +func init() { + organizationID := platform.ID("aaaa") + bucketID := platform.ID("bbbb") + mapping := platform.DBRPMapping{ + Cluster: "cluster", + Database: "db", + RetentionPolicy: "rp", + Default: true, + OrganizationID: organizationID, + BucketID: bucketID, + } + dbrpMappingSvc.FindByFn = func(ctx context.Context, cluster string, db string, rp string) (*platform.DBRPMapping, error) { + return &mapping, nil + } + dbrpMappingSvc.FindFn = func(ctx context.Context, filter platform.DBRPMappingFilter) (*platform.DBRPMapping, error) { + return &mapping, nil + } + dbrpMappingSvc.FindManyFn = func(ctx context.Context, filter platform.DBRPMappingFilter, opt ...platform.FindOptions) ([]*platform.DBRPMapping, int, error) { + return []*platform.DBRPMapping{&mapping}, 1, nil + } +}