postgres: databroker storage backend (#3370)

* wip

* storage: add filtering to SyncLatest

* don't increment the record version, so intermediate changes are requested

* databroker: add support for query filtering

* fill server and record version

* postgres: databroker storage backend

* wip

* serialize puts

* add test

* skip tests for macos

* add test

* return error from protojson

* set data

* exclude postgres from cover tests
This commit is contained in:
Caleb Doxsey 2022-05-25 10:23:58 -06:00 committed by GitHub
parent 550698b1ca
commit 1c2aad2de6
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
21 changed files with 1573 additions and 17 deletions

View file

@ -23,6 +23,7 @@ import (
"github.com/pomerium/pomerium/pkg/grpc/databroker"
"github.com/pomerium/pomerium/pkg/storage"
"github.com/pomerium/pomerium/pkg/storage/inmemory"
"github.com/pomerium/pomerium/pkg/storage/postgres"
"github.com/pomerium/pomerium/pkg/storage/redis"
)
@ -186,14 +187,21 @@ func (srv *Server) Put(ctx context.Context, req *databroker.PutRequest) (*databr
defer span.End()
records := req.GetRecords()
var recordType string
for _, record := range records {
recordType = record.GetType()
if len(records) == 1 {
log.Info(ctx).
Str("record-type", records[0].GetType()).
Str("record-id", records[0].GetId()).
Msg("put")
} else {
var recordType string
for _, record := range records {
recordType = record.GetType()
}
log.Info(ctx).
Int("record-count", len(records)).
Str("record-type", recordType).
Msg("put")
}
log.Info(ctx).
Int("record-count", len(records)).
Str("record-type", recordType).
Msg("put")
db, err := srv.getBackend()
if err != nil {
@ -398,6 +406,9 @@ func (srv *Server) newBackendLocked() (backend storage.Backend, err error) {
case config.StorageInMemoryName:
log.Info(ctx).Msg("using in-memory store")
return inmemory.New(), nil
case config.StoragePostgresName:
log.Info(ctx).Msg("using postgres store")
backend = postgres.New(srv.cfg.storageConnectionString)
case config.StorageRedisName:
log.Info(ctx).Msg("using redis store")
backend, err = redis.New(
@ -407,15 +418,15 @@ func (srv *Server) newBackendLocked() (backend storage.Backend, err error) {
if err != nil {
return nil, fmt.Errorf("failed to create new redis storage: %w", err)
}
if srv.cfg.secret != nil {
backend, err = storage.NewEncryptedBackend(srv.cfg.secret, backend)
if err != nil {
return nil, err
}
}
default:
return nil, fmt.Errorf("unsupported storage type: %s", srv.cfg.storageType)
}
if srv.cfg.secret != nil {
backend, err = storage.NewEncryptedBackend(srv.cfg.secret, backend)
if err != nil {
return nil, err
}
}
return backend, nil
}