diff --git a/Makefile b/Makefile index e8180f0..53c9ca4 100644 --- a/Makefile +++ b/Makefile @@ -34,21 +34,22 @@ test-dynamodb: cd server && go clean --testcache && TEST_DBS="dynamodb" go test -p 1 -v ./test docker rm -vf dynamodb-local-test test-couchbase: - docker run -d --name couchbase-local-test -p 8091-8097:8091-8097 -p 11210:11210 -p 11207:11207 -p 18091-18095:18091-18095 -p 18096:18096 -p 18097:18097 couchbase:latest + # docker run -d --name couchbase-local-test -p 8091-8097:8091-8097 -p 11210:11210 -p 11207:11207 -p 18091-18095:18091-18095 -p 18096:18096 -p 18097:18097 couchbase:latest + # create a docker container, set the cluster information and then run the tests cd server && go clean --testcache && TEST_DBS="couchbase" go test -p 1 -v ./test - docker rm -vf couchbase-local-test + # docker rm -vf couchbase-local-test test-all-db: rm -rf server/test/test.db server/test/test.db-shm server/test/test.db-wal && rm -rf test.db test.db-shm test.db-wal docker run -d --name authorizer_scylla_db -p 9042:9042 scylladb/scylla docker run -d --name authorizer_mongodb_db -p 27017:27017 mongo:4.4.15 docker run -d --name authorizer_arangodb -p 8529:8529 -e ARANGO_NO_AUTH=1 arangodb/arangodb:3.8.4 docker run -d --name dynamodb-local-test -p 8000:8000 amazon/dynamodb-local:latest - docker run -d --name couchbase-local-test -p 8091-8097:8091-8097 -p 11210:11210 -p 11207:11207 -p 18091-18095:18091-18095 -p 18096:18096 -p 18097:18097 couchbase:latest - cd server && go clean --testcache && TEST_DBS="sqlite,mongodb,arangodb,scylladb,dynamodb,couchbase" go test -p 1 -v ./test + # docker run -d --name couchbase-local-test -p 8091-8097:8091-8097 -p 11210:11210 -p 11207:11207 -p 18091-18095:18091-18095 -p 18096:18096 -p 18097:18097 couchbase:latest + cd server && go clean --testcache && TEST_DBS="sqlite,mongodb,arangodb,scylladb,dynamodb" go test -p 1 -v ./test docker rm -vf authorizer_scylla_db docker rm -vf authorizer_mongodb_db docker rm -vf authorizer_arangodb docker rm -vf dynamodb-local-test - docker rm -vf couchbase-local-test + # docker rm -vf couchbase-local-test generate: cd server && go run github.com/99designs/gqlgen generate && go mod tidy diff --git a/scripts/couchbase-test.sh b/scripts/couchbase-test.sh new file mode 100644 index 0000000..c7ee194 --- /dev/null +++ b/scripts/couchbase-test.sh @@ -0,0 +1,41 @@ +#!/bin/sh + +set -x +set -m + +sleep 15 + +# Setup index and memory quota +# curl -v -X POST http://127.0.0.1:8091/pools/default -d memoryQuota=300 -d indexMemoryQuota=300 + +# Setup services +curl -v http://127.0.0.1:8091/node/controller/setupServices -d services=kv%2Cn1ql%2Cindex + +# Setup credentials +curl -v http://127.0.0.1:8091/settings/web -d port=8091 -d username=Administrator -d password=password + +# Setup Memory Optimized Indexes +curl -i -u Administrator:password -X POST http://127.0.0.1:8091/settings/indexes -d 'storageMode=memory_optimized' + +# Load travel-sample bucket +#curl -v -u Administrator:password -X POST http://127.0.0.1:8091/sampleBuckets/install -d '["travel-sample"]' + +echo "Type: $TYPE" + +if [ "$TYPE" = "WORKER" ]; then + echo "Sleeping ..." + sleep 15 + + #IP=`hostname -s` + IP=`hostname -I | cut -d ' ' -f1` + echo "IP: " $IP + + echo "Auto Rebalance: $AUTO_REBALANCE" + if [ "$AUTO_REBALANCE" = "true" ]; then + couchbase-cli rebalance --cluster=$COUCHBASE_MASTER:8091 --user=Administrator --password=password --server-add=$IP --server-add-username=Administrator --server-add-password=password + else + couchbase-cli server-add --cluster=$COUCHBASE_MASTER:8091 --user=Administrator --password=password --server-add=$IP --server-add-username=Administrator --server-add-password=password + fi; +fi; + +fg 1 \ No newline at end of file diff --git a/server/db/db.go b/server/db/db.go index 0579448..3a1c018 100644 --- a/server/db/db.go +++ b/server/db/db.go @@ -7,6 +7,7 @@ import ( "github.com/authorizerdev/authorizer/server/db/providers" "github.com/authorizerdev/authorizer/server/db/providers/arangodb" "github.com/authorizerdev/authorizer/server/db/providers/cassandradb" + "github.com/authorizerdev/authorizer/server/db/providers/couchbase" "github.com/authorizerdev/authorizer/server/db/providers/dynamodb" "github.com/authorizerdev/authorizer/server/db/providers/mongodb" "github.com/authorizerdev/authorizer/server/db/providers/sql" @@ -26,6 +27,7 @@ func InitDB() error { isMongoDB := envs.DatabaseType == constants.DbTypeMongodb isCassandra := envs.DatabaseType == constants.DbTypeCassandraDB || envs.DatabaseType == constants.DbTypeScyllaDB isDynamoDB := envs.DatabaseType == constants.DbTypeDynamoDB + isCouchbaseDB := envs.DatabaseType == constants.DbTypeCouchbaseDB if isSQL { log.Info("Initializing SQL Driver for: ", envs.DatabaseType) @@ -72,5 +74,14 @@ func InitDB() error { } } + if isCouchbaseDB { + log.Info("Initializing CouchbaseDB Driver for: ", envs.DatabaseType) + Provider, err = couchbase.NewProvider() + if err != nil { + log.Fatal("Failed to initialize Couchbase driver: ", err) + return err + } + } + return nil } diff --git a/server/db/providers/couchbase/provider.go b/server/db/providers/couchbase/provider.go index 4f3181e..92dfa41 100644 --- a/server/db/providers/couchbase/provider.go +++ b/server/db/providers/couchbase/provider.go @@ -4,54 +4,52 @@ import ( "context" "errors" "fmt" - "os" "reflect" - "github.com/authorizerdev/authorizer/server/constants" + "github.com/couchbase/gocb/v2" + "github.com/authorizerdev/authorizer/server/db/models" "github.com/authorizerdev/authorizer/server/memorystore" - "github.com/couchbase/gocb/v2" ) -// TODO change following provider to new db provider +const ( + defaultBucketName = "authorizer" + defaultScope = "_default" +) + type provider struct { db *gocb.Scope scopeName string } -// NewProvider returns a new SQL provider -// TODO change following provider to new db provider +// NewProvider returns a new Couchbase provider func NewProvider() (*provider, error) { - // scopeName := os.Getenv(constants.EnvCouchbaseScope) - bucketName := os.Getenv(constants.EnvCouchbaseBucket) - scopeName := os.Getenv(constants.EnvCouchbaseScope) - + bucketName := memorystore.RequiredEnvStoreObj.GetRequiredEnv().CouchbaseBucket + scopeName := memorystore.RequiredEnvStoreObj.GetRequiredEnv().CouchbaseScope dbURL := memorystore.RequiredEnvStoreObj.GetRequiredEnv().DatabaseURL userName := memorystore.RequiredEnvStoreObj.GetRequiredEnv().DatabaseUsername password := memorystore.RequiredEnvStoreObj.GetRequiredEnv().DatabasePassword - opts := gocb.ClusterOptions{ Username: userName, Password: password, } - + if bucketName == "" { + bucketName = defaultBucketName + } + if scopeName == "" { + scopeName = defaultScope + } cluster, err := gocb.Connect(dbURL, opts) - if err != nil { return nil, err } - // To create the bucket and scope if not exist bucket, err := CreateBucketAndScope(cluster, bucketName, scopeName) - if err != nil { return nil, err } - scope := bucket.Scope(scopeName) - scopeIdentifier := fmt.Sprintf("%s.%s", bucketName, scopeName) - v := reflect.ValueOf(models.Collections) for i := 0; i < v.NumField(); i++ { field := v.Field(i) @@ -62,10 +60,10 @@ func NewProvider() (*provider, error) { collectionOpts := gocb.CreateCollectionOptions{ Context: context.TODO(), } - _ = bucket.Collections().CreateCollection(user, &collectionOpts) - // if err != nil && !errors.Is(err, gocb.ErrCollectionExists) { - // return nil, err - // } + err = bucket.Collections().CreateCollection(user, &collectionOpts) + if err != nil && !errors.Is(err, gocb.ErrCollectionExists) { + return nil, err + } indexQuery := fmt.Sprintf("CREATE PRIMARY INDEX ON %s.%s", scopeIdentifier, field.String()) scope.Query(indexQuery, nil) } @@ -100,15 +98,15 @@ func CreateBucketAndScope(cluster *gocb.Cluster, bucketName string, scopeName st }, nil) bucket := cluster.Bucket(bucketName) - if err != nil && !errors.Is(err, gocb.ErrBucketExists) { return bucket, err } - err = bucket.Collections().CreateScope(scopeName, nil) - - if err != nil && !errors.Is(err, gocb.ErrScopeExists) { - return bucket, err + if scopeName != defaultScope { + err = bucket.Collections().CreateScope(scopeName, nil) + if err != nil && !errors.Is(err, gocb.ErrScopeExists) { + return bucket, err + } } return bucket, nil diff --git a/server/test/resolvers_test.go b/server/test/resolvers_test.go index 90a5706..3763e4d 100644 --- a/server/test/resolvers_test.go +++ b/server/test/resolvers_test.go @@ -58,6 +58,12 @@ func TestResolvers(t *testing.T) { memorystore.Provider.UpdateEnvVariable(constants.EnvAwsRegion, "ap-south-1") os.Setenv(constants.EnvAwsRegion, "ap-south-1") } + if dbType == constants.DbTypeCouchbaseDB { + memorystore.Provider.UpdateEnvVariable(constants.EnvKeyDatabaseUsername, "Administrator") + os.Setenv(constants.EnvKeyDatabaseUsername, "Administrator") + memorystore.Provider.UpdateEnvVariable(constants.EnvKeyDatabasePassword, "password") + os.Setenv(constants.EnvKeyDatabasePassword, "password") + } memorystore.InitRequiredEnv()