From 9d4f0e3dbc79f665e21c66aed992562161b11361 Mon Sep 17 00:00:00 2001 From: Arvindh Date: Wed, 10 Jul 2024 23:18:18 +0530 Subject: [PATCH] fix compose and list pats Signed-off-by: Arvindh --- auth/bolt/pat.go | 33 ++++++++++++++++++++------------- cmd/auth/main.go | 11 ++++++++--- docker/docker-compose.yml | 2 ++ internal/clients/bolt/bolt.go | 12 +++++++----- 4 files changed, 37 insertions(+), 21 deletions(-) diff --git a/auth/bolt/pat.go b/auth/bolt/pat.go index 9c8e8f2eed..9c7d2ea247 100644 --- a/auth/bolt/pat.go +++ b/auth/bolt/pat.go @@ -64,7 +64,11 @@ func (pr *patRepo) Save(ctx context.Context, pat auth.PAT) error { return err } return pr.db.Update(func(tx *bolt.Tx) error { - b, err := pr.createRetrieveUserBucket(tx, pat.User) + rootBucket, err := pr.retrieveRootBucket(tx) + if err != nil { + return errors.Wrap(repoerr.ErrCreateEntity, err) + } + b, err := pr.createUserBucket(rootBucket, pat.User) if err != nil { return errors.Wrap(repoerr.ErrCreateEntity, err) } @@ -74,7 +78,7 @@ func (pr *patRepo) Save(ctx context.Context, pat auth.PAT) error { return errors.Wrap(repoerr.ErrCreateEntity, err) } } - if err := b.Put([]byte(pat.User+keySeparator+patKey+pat.ID), []byte(pat.ID)); err != nil { + if err := rootBucket.Put([]byte(pat.User+keySeparator+patKey+keySeparator+pat.ID), []byte(pat.ID)); err != nil { return errors.Wrap(repoerr.ErrCreateEntity, err) } return nil @@ -139,7 +143,7 @@ func (pr *patRepo) RetrieveAll(ctx context.Context, userID string, pm auth.PATSP patIDs := []string{} if err := pr.db.View(func(tx *bolt.Tx) error { - b, err := pr.retrieveUserBucket(tx, userID) + b, err := pr.retrieveRootBucket(tx) if err != nil { return errors.Wrap(repoerr.ErrViewEntity, err) } @@ -175,7 +179,7 @@ func (pr *patRepo) RetrieveAll(ctx context.Context, userID string, pm auth.PATSP } for i := pm.Offset; i < aLimit; i++ { - if total < int(i) { + if int(i) < total { pat, err := pr.Retrieve(ctx, userID, patIDs[i]) if err != nil { return patsPage, err @@ -319,12 +323,7 @@ func (pr *patRepo) RemoveAllScopeEntry(ctx context.Context, userID, patID string return nil } -func (pr *patRepo) createRetrieveUserBucket(tx *bolt.Tx, userID string) (*bolt.Bucket, error) { - rootBucket := tx.Bucket([]byte(pr.bucketName)) - if rootBucket == nil { - return nil, errors.Wrap(repoerr.ErrCreateEntity, fmt.Errorf("bucket %s not found", pr.bucketName)) - } - +func (pr *patRepo) createUserBucket(rootBucket *bolt.Bucket, userID string) (*bolt.Bucket, error) { userBucket, err := rootBucket.CreateBucketIfNotExists([]byte(userID)) if err != nil { return nil, errors.Wrap(repoerr.ErrCreateEntity, fmt.Errorf("failed to retrieve or create bucket for user %s : %w", userID, err)) @@ -334,9 +333,9 @@ func (pr *patRepo) createRetrieveUserBucket(tx *bolt.Tx, userID string) (*bolt.B } func (pr *patRepo) retrieveUserBucket(tx *bolt.Tx, userID string) (*bolt.Bucket, error) { - rootBucket := tx.Bucket([]byte(pr.bucketName)) - if rootBucket == nil { - return nil, fmt.Errorf("bucket %s not found", pr.bucketName) + rootBucket, err := pr.retrieveRootBucket(tx) + if err != nil { + return nil, err } userBucket := rootBucket.Bucket([]byte(userID)) @@ -346,6 +345,14 @@ func (pr *patRepo) retrieveUserBucket(tx *bolt.Tx, userID string) (*bolt.Bucket, return userBucket, nil } +func (pr *patRepo) retrieveRootBucket(tx *bolt.Tx) (*bolt.Bucket, error) { + rootBucket := tx.Bucket([]byte(pr.bucketName)) + if rootBucket == nil { + return nil, fmt.Errorf("bucket %s not found", pr.bucketName) + } + return rootBucket, nil +} + func (pr *patRepo) updatePATField(_ context.Context, userID, patID, key string, value []byte) (auth.PAT, error) { prefix := []byte(patID + keySeparator) kv := map[string][]byte{} diff --git a/cmd/auth/main.go b/cmd/auth/main.go index f53f41d93c..5c44e0e54e 100644 --- a/cmd/auth/main.go +++ b/cmd/auth/main.go @@ -51,6 +51,7 @@ const ( envPrefixHTTP = "MG_AUTH_HTTP_" envPrefixGrpc = "MG_AUTH_GRPC_" envPrefixDB = "MG_AUTH_DB_" + envPrefixPATDB = "MG_AUTH_PAT_DB_" defDB = "auth" defSvcHTTPPort = "8189" defSvcGRPCPort = "8181" @@ -132,13 +133,17 @@ func main() { } boltDBConfig := boltclient.Config{} - if err := env.ParseWithOptions(&boltDBConfig, env.Options{}); err != nil { - panic(err) + if err := env.ParseWithOptions(&boltDBConfig, env.Options{Prefix: envPrefixPATDB}); err != nil { + logger.Error(fmt.Sprintf("failed to parse bolt db config : %s\n", err.Error())) + exitCode = 1 + return } client, err := boltclient.Connect(boltDBConfig, bolt.Init) if err != nil { - panic(err) + logger.Error(fmt.Sprintf("failed to connect to bolt db : %s\n", err.Error())) + exitCode = 1 + return } defer client.Close() diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index c206e7529c..ab333e37da 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -15,6 +15,7 @@ volumes: magistrala-mqtt-broker-volume: magistrala-spicedb-db-volume: magistrala-auth-db-volume: + magistrala-pat-db-volume: magistrala-invitations-db-volume: magistrala-ui-db-volume: @@ -132,6 +133,7 @@ services: - magistrala-base-net volumes: - ./spicedb/schema.zed:${MG_SPICEDB_SCHEMA_FILE} + - magistrala-pat-db-volume:/magistrala-data # Auth gRPC mTLS server certificates - type: bind source: ${MG_AUTH_GRPC_SERVER_CERT:-ssl/certs/dummy/server_cert} diff --git a/internal/clients/bolt/bolt.go b/internal/clients/bolt/bolt.go index 12e22efadf..6db2d1a276 100644 --- a/internal/clients/bolt/bolt.go +++ b/internal/clients/bolt/bolt.go @@ -32,10 +32,11 @@ func (fm *FileMode) UnmarshalText(text []byte) error { // Config contains BoltDB specific parameters. type Config struct { - FilePath string `env:"FILE_PATH" envDefault:"./bolt.db"` - FileMode FileMode `env:"FILE_MODE" envDefault:"0600"` - Bucket string `env:"BUCKET" envDefault:"magistrala"` - Timeout time.Duration `env:"TIMEOUT" envDefault:"0"` + FileDirPath string `env:"FILE_DIR_PATH" envDefault:"./magistrala-data"` + FileName string `env:"FILE_NAME" envDefault:"magistrala-pat.db"` + FileMode FileMode `env:"FILE_MODE" envDefault:"0600"` + Bucket string `env:"BUCKET" envDefault:"magistrala"` + Timeout time.Duration `env:"TIMEOUT" envDefault:"0"` } // Setup load configuration from environment and creates new BoltDB. @@ -59,7 +60,8 @@ func SetupDB(envPrefix string, initFn func(*bolt.Tx, string) error) (*bolt.DB, e // Connect establishes connection to the BoltDB. func Connect(cfg Config, initFn func(*bolt.Tx, string) error) (*bolt.DB, error) { - db, err := bolt.Open(cfg.FilePath, fs.FileMode(cfg.FileMode), nil) + filePath := cfg.FileDirPath + "/" + cfg.FileName + db, err := bolt.Open(filePath, fs.FileMode(cfg.FileMode), nil) if err != nil { return nil, errors.Wrap(errConnect, err) }