159 lines
4.3 KiB
Go
159 lines
4.3 KiB
Go
package inmem
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"path"
|
|
|
|
"github.com/influxdata/influxdb/v2"
|
|
)
|
|
|
|
var (
|
|
errDBRPMappingNotFound = &influxdb.Error{
|
|
Code: influxdb.ENotFound,
|
|
Msg: "dbrp mapping not found",
|
|
}
|
|
)
|
|
|
|
func encodeDBRPMappingKey(cluster, db, rp string) string {
|
|
return path.Join(cluster, db, rp)
|
|
}
|
|
|
|
func (s *Service) loadDBRPMapping(ctx context.Context, cluster, db, rp string) (*influxdb.DBRPMapping, error) {
|
|
i, ok := s.dbrpMappingKV.Load(encodeDBRPMappingKey(cluster, db, rp))
|
|
if !ok {
|
|
return nil, errDBRPMappingNotFound
|
|
}
|
|
|
|
m, ok := i.(influxdb.DBRPMapping)
|
|
if !ok {
|
|
return nil, fmt.Errorf("type %T is not a dbrp mapping", i)
|
|
}
|
|
|
|
return &m, nil
|
|
}
|
|
|
|
// FindBy returns a single dbrp mapping by cluster, db and rp.
|
|
func (s *Service) FindBy(ctx context.Context, cluster, db, rp string) (*influxdb.DBRPMapping, error) {
|
|
return s.loadDBRPMapping(ctx, cluster, db, rp)
|
|
}
|
|
|
|
func (s *Service) forEachDBRPMapping(ctx context.Context, fn func(m *influxdb.DBRPMapping) bool) error {
|
|
var err error
|
|
s.dbrpMappingKV.Range(func(k, v interface{}) bool {
|
|
m, ok := v.(influxdb.DBRPMapping)
|
|
if !ok {
|
|
err = fmt.Errorf("type %T is not a dbrp mapping", v)
|
|
return false
|
|
}
|
|
return fn(&m)
|
|
})
|
|
|
|
return err
|
|
}
|
|
|
|
func (s *Service) filterDBRPMappings(ctx context.Context, fn func(m *influxdb.DBRPMapping) bool) ([]*influxdb.DBRPMapping, error) {
|
|
mappings := []*influxdb.DBRPMapping{}
|
|
err := s.forEachDBRPMapping(ctx, func(m *influxdb.DBRPMapping) bool {
|
|
if fn(m) {
|
|
mappings = append(mappings, m)
|
|
}
|
|
return true
|
|
})
|
|
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return mappings, nil
|
|
}
|
|
|
|
// Find returns the first dbrp mapping that matches filter.
|
|
func (s *Service) Find(ctx context.Context, filter influxdb.DBRPMappingFilter) (*influxdb.DBRPMapping, error) {
|
|
if filter.Cluster == nil && filter.Database == nil && filter.RetentionPolicy == nil {
|
|
return nil, &influxdb.Error{
|
|
Code: influxdb.EInvalid,
|
|
Msg: "no filter parameters provided",
|
|
}
|
|
}
|
|
|
|
// filter by dbrpMapping id
|
|
if filter.Cluster != nil && filter.Database != nil && filter.RetentionPolicy != nil {
|
|
return s.FindBy(ctx, *filter.Cluster, *filter.Database, *filter.RetentionPolicy)
|
|
}
|
|
|
|
mappings, n, err := s.FindMany(ctx, filter)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if n < 1 {
|
|
return nil, errDBRPMappingNotFound
|
|
}
|
|
|
|
return mappings[0], nil
|
|
}
|
|
|
|
// FindMany returns a list of dbrpMappings that match filter and the total count of matching dbrp mappings.
|
|
// Additional options provide pagination & sorting.
|
|
func (s *Service) FindMany(ctx context.Context, filter influxdb.DBRPMappingFilter, opt ...influxdb.FindOptions) ([]*influxdb.DBRPMapping, int, error) {
|
|
// filter by dbrpMapping id
|
|
if filter.Cluster != nil && filter.Database != nil && filter.RetentionPolicy != nil {
|
|
m, err := s.FindBy(ctx, *filter.Cluster, *filter.Database, *filter.RetentionPolicy)
|
|
if err != nil {
|
|
return nil, 0, err
|
|
}
|
|
return []*influxdb.DBRPMapping{m}, 1, nil
|
|
}
|
|
|
|
filterFunc := func(mapping *influxdb.DBRPMapping) bool {
|
|
return (filter.Cluster == nil || (*filter.Cluster) == mapping.Cluster) &&
|
|
(filter.Database == nil || (*filter.Database) == mapping.Database) &&
|
|
(filter.RetentionPolicy == nil || (*filter.RetentionPolicy) == mapping.RetentionPolicy) &&
|
|
(filter.Default == nil || (*filter.Default) == mapping.Default)
|
|
}
|
|
|
|
mappings, err := s.filterDBRPMappings(ctx, filterFunc)
|
|
if err != nil {
|
|
return nil, 0, err
|
|
}
|
|
|
|
return mappings, len(mappings), nil
|
|
}
|
|
|
|
// Create creates a new dbrp mapping.
|
|
func (s *Service) Create(ctx context.Context, m *influxdb.DBRPMapping) error {
|
|
if err := m.Validate(); err != nil {
|
|
return nil
|
|
}
|
|
existing, err := s.loadDBRPMapping(ctx, m.Cluster, m.Database, m.RetentionPolicy)
|
|
if err != nil {
|
|
if err == errDBRPMappingNotFound {
|
|
return s.PutDBRPMapping(ctx, m)
|
|
}
|
|
return err
|
|
}
|
|
|
|
if !existing.Equal(m) {
|
|
return &influxdb.Error{
|
|
Code: influxdb.EConflict,
|
|
Msg: "dbrp mapping already exists",
|
|
}
|
|
}
|
|
|
|
return s.PutDBRPMapping(ctx, m)
|
|
}
|
|
|
|
// PutDBRPMapping sets dbrpMapping with the current ID.
|
|
func (s *Service) PutDBRPMapping(ctx context.Context, m *influxdb.DBRPMapping) error {
|
|
k := encodeDBRPMappingKey(m.Cluster, m.Database, m.RetentionPolicy)
|
|
s.dbrpMappingKV.Store(k, *m)
|
|
return nil
|
|
}
|
|
|
|
// Delete removes a dbrp mapping
|
|
func (s *Service) Delete(ctx context.Context, cluster, db, rp string) error {
|
|
s.dbrpMappingKV.Delete(encodeDBRPMappingKey(cluster, db, rp))
|
|
return nil
|
|
}
|