From 3404cb055026b7cc77e832ceb82f77dd59ce7005 Mon Sep 17 00:00:00 2001 From: Gert Drapers Date: Tue, 11 Jun 2024 16:22:27 +0200 Subject: [PATCH] rm v2 directory interfaces (#92) * rm v2 interfaces * fix GetObjects validation * deps * rm commented out tests --- go.mod | 4 +- go.sum | 27 +-- makefile | 77 +----- pkg/bdb/metadata/metadata.go | 27 --- pkg/bdb/migrate/mig/mig.go | 4 +- pkg/bdb/migrate/mig001/migrate.go | 82 ------- pkg/bdb/migrate/mig002/migrate.go | 273 ---------------------- pkg/bdb/migrate/mig003/migrate.go | 377 ------------------------------ pkg/bdb/migrate/migrate.go | 8 +- pkg/directory/directory.go | 35 +-- pkg/directory/v2/exporter.go | 168 ------------- pkg/directory/v2/importer.go | 147 ------------ pkg/directory/v2/reader.go | 290 ----------------------- pkg/directory/v2/writer.go | 134 ----------- pkg/directory/v3/reader.go | 4 + pkg/server/test-edge-ds.go | 23 -- tests/manifest_test.go | 6 +- tests/runner_test.go | 103 +------- 18 files changed, 37 insertions(+), 1752 deletions(-) delete mode 100644 pkg/bdb/metadata/metadata.go delete mode 100644 pkg/bdb/migrate/mig001/migrate.go delete mode 100644 pkg/bdb/migrate/mig002/migrate.go delete mode 100644 pkg/bdb/migrate/mig003/migrate.go delete mode 100644 pkg/directory/v2/exporter.go delete mode 100644 pkg/directory/v2/importer.go delete mode 100644 pkg/directory/v2/reader.go delete mode 100644 pkg/directory/v2/writer.go diff --git a/go.mod b/go.mod index e5d25a8..128e356 100644 --- a/go.mod +++ b/go.mod @@ -8,7 +8,7 @@ toolchain go1.22.2 // replace github.com/aserto-dev/go-directory => ../go-directory require ( - github.com/Masterminds/semver v1.5.0 + github.com/Masterminds/semver/v3 v3.2.1 github.com/aserto-dev/aserto-grpc v0.2.3 github.com/aserto-dev/azm v0.1.10 github.com/aserto-dev/errors v0.0.8 @@ -18,7 +18,7 @@ require ( github.com/gonvenience/ytbx v1.4.4 github.com/google/uuid v1.6.0 github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 - github.com/homeport/dyff v1.7.1 + github.com/homeport/dyff v1.8.0 github.com/panmari/cuckoofilter v1.0.6 github.com/pkg/errors v0.9.1 github.com/rs/zerolog v1.33.0 diff --git a/go.sum b/go.sum index 3c818f7..5ff259a 100644 --- a/go.sum +++ b/go.sum @@ -4,8 +4,8 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMT github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0= github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= -github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww= -github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= +github.com/Masterminds/semver/v3 v3.2.1 h1:RN9w6+7QoMeJVGyfmbcgs28Br8cvmnucEXnY0rYXWg0= +github.com/Masterminds/semver/v3 v3.2.1/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ= github.com/antlr4-go/antlr/v4 v4.13.1 h1:SqQKkuVZ+zWkMMNkjy5FZe5mr5WURWnlpmOuzYWrPrQ= github.com/antlr4-go/antlr/v4 v4.13.1/go.mod h1:GKmUxMtwp6ZgGwZSva4eWPC5mS6vUAmOABFgjdkM7Nw= github.com/aserto-dev/aserto-grpc v0.2.3 h1:pimQD0nq57dSMrv+nT9hUnN9Uricpp+iJypzdyf6E+E= @@ -47,11 +47,12 @@ github.com/go-http-utils/headers v0.0.0-20181008091004-fed159eddc2a h1:v6zMvHuY9 github.com/go-http-utils/headers v0.0.0-20181008091004-fed159eddc2a/go.mod h1:I79BieaU4fxrw4LMXby6q5OS9XnoR9UIKLOzDFjUmuw= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY= -github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= +github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= +github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= +github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= @@ -79,8 +80,8 @@ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/pprof v0.0.0-20230602150820-91b7bce49751 h1:hR7/MlvK23p6+lIw9SN1TigNLn9ZnF3W4SYRKq2gAHs= -github.com/google/pprof v0.0.0-20230602150820-91b7bce49751/go.mod h1:Jh3hGz2jkYak8qXPD19ryItVnUgpgeqzdkY/D0EaeuA= +github.com/google/pprof v0.0.0-20240424215950-a892ee059fd6 h1:k7nVchz72niMH6YLQNvHSdIE7iqsQxK1P41mySCvssg= +github.com/google/pprof v0.0.0-20240424215950-a892ee059fd6/go.mod h1:kf6iHlnVGwgKolg33glAes7Yg/8iWP8ukqeldJSO7jw= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= @@ -94,8 +95,8 @@ github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= -github.com/homeport/dyff v1.7.1 h1:B3KJUtnU53H2UryxGcfYKQPrde8VjjbwlHZbczH3giQ= -github.com/homeport/dyff v1.7.1/go.mod h1:iLe5b3ymc9xmHZNuJlNVKERE8L2isQMBLxFiTXcwZY0= +github.com/homeport/dyff v1.8.0 h1:/Mg8PRGtbgIx9ubCk95B0T5LonIdWWi0abGemL3huuc= +github.com/homeport/dyff v1.8.0/go.mod h1:NLdqE3DYiNW6xbZ55r1FsOAfhMXYHTTPA1FDhWJLKHM= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -130,10 +131,10 @@ github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= -github.com/onsi/ginkgo/v2 v2.15.0 h1:79HwNRBAZHOEwrczrgSOPy+eFTTlIGELKy5as+ClttY= -github.com/onsi/ginkgo/v2 v2.15.0/go.mod h1:HlxMHtYF57y6Dpf+mc5529KKmSq9h2FpCF+/ZkwUxKM= -github.com/onsi/gomega v1.31.1 h1:KYppCUK+bUgAZwHOu7EXVBKyQA6ILvOESHkn/tgoqvo= -github.com/onsi/gomega v1.31.1/go.mod h1:y40C95dwAD1Nz36SsEnxvfFe8FFfNxzI5eJ0EYGyAy0= +github.com/onsi/ginkgo/v2 v2.19.0 h1:9Cnnf7UHo57Hy3k6/m5k3dRfGTMXGvxhHFvkDTCTpvA= +github.com/onsi/ginkgo/v2 v2.19.0/go.mod h1:rlwLi9PilAFJ8jCg9UE1QP6VBpd6/xj3SRC0d6TU0To= +github.com/onsi/gomega v1.33.1 h1:dsYjIxxSR755MDmKVsaFQTE22ChNBcuuTWgkUDSubOk= +github.com/onsi/gomega v1.33.1/go.mod h1:U4R44UsT+9eLIaYRB2a5qajjtQYn0hauxvRm16AVYg0= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/panmari/cuckoofilter v1.0.6 h1:WKb1aSj16h22x0CKVtTCaRkJiCnVGPLEMGbNY8xwXf8= github.com/panmari/cuckoofilter v1.0.6/go.mod h1:bKADbQPGbN6TxUvo/IbMEIUbKuASnpsOvrLTgpSX0aU= diff --git a/makefile b/makefile index 7de7483..af805d6 100644 --- a/makefile +++ b/makefile @@ -6,13 +6,12 @@ ERR_COLOR := \033[31;01m WARN_COLOR := \033[36;01m ATTN_COLOR := \033[33;01m -GOOS := $(shell go env GOOS) -GOARCH := $(shell go env GOARCH) -GOPRIVATE := "github.com/aserto-dev" +GOOS := $(shell go env GOOS) +GOARCH := $(shell go env GOARCH) +GOPRIVATE := "github.com/aserto-dev" DOCKER_BUILDKIT := 1 -BIN_DIR := ./bin -EXT_DIR := ./.ext +EXT_DIR := ./.ext EXT_BIN_DIR := ${EXT_DIR}/bin EXT_TMP_DIR := ${EXT_DIR}/tmp @@ -23,19 +22,12 @@ GOLANGCI-LINT_VERSION := 1.56.2 GORELEASER_VERSION := 1.24.0 WIRE_VERSION := 0.6.0 -BUF_USER := $(shell ${EXT_BIN_DIR}/vault kv get -field ASERTO_BUF_USER kv/buf.build) -BUF_TOKEN := $(shell ${EXT_BIN_DIR}/vault kv get -field ASERTO_BUF_TOKEN kv/buf.build) -BUF_REPO := "buf.build/aserto-dev/directory" -BUF_LATEST := $(shell BUF_BETA_SUPPRESS_WARNINGS=1 ${EXT_BIN_DIR}/buf beta registry tag list buf.build/aserto-dev/directory --format json --reverse | jq -r '.results[0].name') -BUF_DEV_IMAGE := "../pb-directory/bin/directory.bin" -BUF_VERSION := 1.30.0 - RELEASE_TAG := $$(svu) .DEFAULT_GOAL := build .PHONY: deps -deps: info install-vault install-buf install-svu install-goreleaser install-golangci-lint install-gotestsum install-wire +deps: info install-vault install-svu install-goreleaser install-golangci-lint install-gotestsum @echo -e "$(ATTN_COLOR)==> $@ $(NO_COLOR)" .PHONY: build @@ -68,18 +60,10 @@ lint: @echo -e "$(ATTN_COLOR)==> $@ $(NO_COLOR)" @${EXT_BIN_DIR}/golangci-lint run --config ${PWD}/.golangci.yaml -# github.com/aserto-dev/topaz/pkg/app/tests/$PKGS -PKGS = authz builtin manifest policy query .PHONY: test -test: $(PKGS) test-xdg -$(PKGS): - @echo -e "$(ATTN_COLOR)==> test github.com/aserto-dev/topaz/pkg/app/tests/$@/... $(NO_COLOR)" - @${EXT_BIN_DIR}/gotestsum --format short-verbose -- -count=1 -parallel=1 -v -coverprofile=cover.out -coverpkg=./... github.com/aserto-dev/topaz/pkg/app/tests/$@/...; - -.PHONY: test-xdg -test-xdg: - @echo -e "$(ATTN_COLOR)==> test github.com/aserto-dev/topaz/pkg/cli/xdg/... $(NO_COLOR)" - @${EXT_BIN_DIR}/gotestsum --format short-verbose -- -count=1 -parallel=1 -v -coverprofile=cover.out -coverpkg=./... github.com/adrg/xdg/...; +test: + @echo -e "$(ATTN_COLOR)==> $@ $(NO_COLOR)" + @${EXT_BIN_DIR}/gotestsum --format short-verbose -- -count=1 -parallel=1 -v -coverprofile=cover.out -coverpkg=./... ./...; .PHONY: write-version write-version: @@ -91,60 +75,15 @@ vault-login: @echo -e "$(ATTN_COLOR)==> $@ $(NO_COLOR)" @vault login -method=github token=$$(gh auth token) -.PHONY: buf-login -buf-login: - @echo -e "$(ATTN_COLOR)==> $@ $(NO_COLOR)" - @echo ${BUF_TOKEN} | ${EXT_BIN_DIR}/buf registry login --username ${BUF_USER} --token-stdin - -.PHONY: buf-lint -buf-lint: - @echo -e "$(ATTN_COLOR)==> $@ $(NO_COLOR)" - @${EXT_BIN_DIR}/buf lint proto - -.PHONY: buf-breaking -buf-breaking: - @echo -e "$(ATTN_COLOR)==> $@ $(NO_COLOR)" - @${EXT_BIN_DIR}/buf breaking proto --against "https://github.com/d5s-io/directory.git#branch=main" - -.PHONY: buf-build -buf-build: ${BIN_DIR} - @echo -e "$(ATTN_COLOR)==> $@ $(NO_COLOR)" - @${EXT_BIN_DIR}/buf build proto --output ${BIN_DIR}/directory.bin - -.PHONY: buf-push -buf-push: - @echo -e "$(ATTN_COLOR)==> $@ $(NO_COLOR)" - @${EXT_BIN_DIR}/buf push proto --tag ${RELEASE_TAG} - -.PHONY: buf-mod-update -buf-mod-update: - @echo -e "$(ATTN_COLOR)==> $@ $(NO_COLOR)" - @${EXT_BIN_DIR}/buf mod update proto - -.PHONY: buf-generate -buf-generate: - @echo -e "$(ATTN_COLOR)==> $@ $(NO_COLOR)" - @${EXT_BIN_DIR}/buf mod update . - @${EXT_BIN_DIR}/buf generate ${BUF_REPO}:${BUF_LATEST} - -.PHONY: buf-generate-dev -buf-generate-dev: - @echo -e "$(ATTN_COLOR)==> $@ $(NO_COLOR)" - @${EXT_BIN_DIR}/buf mod update . - @${EXT_BIN_DIR}/buf generate "../pb-directory/bin/directory.bin" - .PHONY: info info: @echo -e "$(ATTN_COLOR)==> $@ $(NO_COLOR)" @echo "GOOS: ${GOOS}" @echo "GOARCH: ${GOARCH}" - @echo "BIN_DIR: ${BIN_DIR}" @echo "EXT_DIR: ${EXT_DIR}" @echo "EXT_BIN_DIR: ${EXT_BIN_DIR}" @echo "EXT_TMP_DIR: ${EXT_TMP_DIR}" @echo "RELEASE_TAG: ${RELEASE_TAG}" - @echo "BUF_REPO: ${BUF_REPO}" - @echo "BUF_LATEST: ${BUF_LATEST}" .PHONY: install-vault install-vault: ${EXT_BIN_DIR} ${EXT_TMP_DIR} diff --git a/pkg/bdb/metadata/metadata.go b/pkg/bdb/metadata/metadata.go deleted file mode 100644 index 668329c..0000000 --- a/pkg/bdb/metadata/metadata.go +++ /dev/null @@ -1,27 +0,0 @@ -package metadata - -import ( - dsc2 "github.com/aserto-dev/go-directory/aserto/directory/common/v2" -) - -var ( - // base directory object types. - ObjectTypes = []*dsc2.ObjectType{ - {Name: "system", DisplayName: "System", IsSubject: false, Ordinal: 900, Status: uint32(dsc2.Flag_FLAG_HIDDEN | dsc2.Flag_FLAG_SYSTEM)}, - {Name: "user", DisplayName: "User", IsSubject: true, Ordinal: 100, Status: uint32(dsc2.Flag_FLAG_SYSTEM)}, - {Name: "identity", DisplayName: "Identity", IsSubject: false, Ordinal: 300, Status: uint32(dsc2.Flag_FLAG_SYSTEM | dsc2.Flag_FLAG_READONLY)}, - {Name: "group", DisplayName: "Group", IsSubject: true, Ordinal: 200, Status: uint32(dsc2.Flag_FLAG_SYSTEM)}, - {Name: "application", DisplayName: "Application", IsSubject: false, Ordinal: 400, Status: uint32(dsc2.Flag_FLAG_SYSTEM)}, - {Name: "resource", DisplayName: "Resource", IsSubject: false, Ordinal: 500, Status: uint32(dsc2.Flag_FLAG_SYSTEM)}, - {Name: "user-v1", DisplayName: "UserV1", IsSubject: true, Ordinal: 1000, Status: uint32(dsc2.Flag_FLAG_HIDDEN | dsc2.Flag_FLAG_SYSTEM | dsc2.Flag_FLAG_SHADOW | dsc2.Flag_FLAG_READONLY)}, - } - - // base directory relation types. - RelationTypes = []*dsc2.RelationType{ - {ObjectType: "system", Name: "user", DisplayName: "system:user", Ordinal: 900, Status: uint32(dsc2.Flag_FLAG_SYSTEM)}, - {ObjectType: "identity", Name: "identifier", DisplayName: "identity:identifier", Ordinal: 200, Status: uint32(dsc2.Flag_FLAG_SYSTEM)}, - {ObjectType: "group", Name: "member", DisplayName: "group:member", Ordinal: 100, Status: uint32(dsc2.Flag_FLAG_SYSTEM)}, - {ObjectType: "application", Name: "user", DisplayName: "application:user", Ordinal: 400, Status: uint32(dsc2.Flag_FLAG_SYSTEM)}, - {ObjectType: "user", Name: "manager", DisplayName: "user:manager", Ordinal: 300, Status: uint32(dsc2.Flag_FLAG_SYSTEM)}, - } -) diff --git a/pkg/bdb/migrate/mig/mig.go b/pkg/bdb/migrate/mig/mig.go index 4bd02ca..ec8a294 100644 --- a/pkg/bdb/migrate/mig/mig.go +++ b/pkg/bdb/migrate/mig/mig.go @@ -16,13 +16,13 @@ import ( "github.com/aserto-dev/go-edge-ds/pkg/fs" "github.com/rs/zerolog" - "github.com/Masterminds/semver" + "github.com/Masterminds/semver/v3" bolt "go.etcd.io/bbolt" ) const ( versionKey string = "version" - baseVersion string = "0.0.0" + baseVersion string = "0.0.4" ) func SetBucket(tx *bolt.Tx, path bdb.Path) (*bolt.Bucket, error) { diff --git a/pkg/bdb/migrate/mig001/migrate.go b/pkg/bdb/migrate/mig001/migrate.go deleted file mode 100644 index 8ba63b6..0000000 --- a/pkg/bdb/migrate/mig001/migrate.go +++ /dev/null @@ -1,82 +0,0 @@ -package mig001 - -import ( - "bytes" - "time" - - "github.com/Masterminds/semver" - "github.com/aserto-dev/go-directory/pkg/pb" - "github.com/aserto-dev/go-edge-ds/pkg/bdb" - "github.com/aserto-dev/go-edge-ds/pkg/bdb/metadata" - "github.com/aserto-dev/go-edge-ds/pkg/bdb/migrate/mig" - "github.com/rs/zerolog" - bolt "go.etcd.io/bbolt" - "google.golang.org/protobuf/types/known/timestamppb" -) - -const ( - Version string = "0.0.1" -) - -func MigrationVersion() *semver.Version { - migVersion, _ := semver.NewVersion(Version) - return migVersion -} - -var fnMap = []func(*zerolog.Logger, *bolt.DB, *bolt.DB) error{ - mig.CreateBucket(bdb.SystemPath), - mig.EnsureBaseVersion, - mig.CreateBucket(bdb.ObjectTypesPath), - mig.CreateBucket(bdb.PermissionsPath), - mig.CreateBucket(bdb.RelationTypesPath), - mig.CreateBucket(bdb.ObjectsPath), - mig.CreateBucket(bdb.RelationsSubPath), - mig.CreateBucket(bdb.RelationsObjPath), - seed, -} - -func Migrate(log *zerolog.Logger, roDB, rwDB *bolt.DB) error { - log.Info().Str("version", Version).Msg("StartMigration") - for _, fn := range fnMap { - if err := fn(log, roDB, rwDB); err != nil { - return err - } - } - log.Info().Str("version", Version).Msg("FinishedMigration") - return nil -} - -func seed(_ *zerolog.Logger, _, rwDB *bolt.DB) error { - return rwDB.Update(func(tx *bolt.Tx) error { - for _, objType := range metadata.ObjectTypes { - ts := timestamppb.New(time.Now().UTC()) - objType.CreatedAt = ts - objType.UpdatedAt = ts - - buf := new(bytes.Buffer) - if err := pb.ProtoToBuf(buf, objType); err != nil { - return err - } - - if err := mig.SetKey(tx, bdb.ObjectTypesPath, []byte(objType.Name), buf.Bytes()); err != nil { - return err - } - } - - for _, relType := range metadata.RelationTypes { - ts := timestamppb.New(time.Now().UTC()) - relType.CreatedAt = ts - relType.UpdatedAt = ts - - buf := new(bytes.Buffer) - if err := pb.ProtoToBuf(buf, relType); err != nil { - return err - } - - if err := mig.SetKey(tx, bdb.RelationTypesPath, []byte(relType.Name), buf.Bytes()); err != nil { - return err - } - } - return nil - }) -} diff --git a/pkg/bdb/migrate/mig002/migrate.go b/pkg/bdb/migrate/mig002/migrate.go deleted file mode 100644 index e66d864..0000000 --- a/pkg/bdb/migrate/mig002/migrate.go +++ /dev/null @@ -1,273 +0,0 @@ -package mig002 - -import ( - "bytes" - "fmt" - "os" - - dsc2 "github.com/aserto-dev/go-directory/aserto/directory/common/v2" - "github.com/aserto-dev/go-directory/pkg/pb" - "github.com/aserto-dev/go-edge-ds/pkg/bdb" - "github.com/aserto-dev/go-edge-ds/pkg/bdb/migrate/mig" - "github.com/aserto-dev/go-edge-ds/pkg/ds" - "github.com/rs/zerolog" - - "github.com/Masterminds/semver" - "github.com/pkg/errors" - bolt "go.etcd.io/bbolt" - "google.golang.org/protobuf/proto" - "google.golang.org/protobuf/types/known/structpb" -) - -const ( - Version string = "0.0.2" -) - -var ( - ObjectTypesNamePath = []string{"object_types_name"} - RelationTypesNamePath = []string{"relation_types_name"} - PermissionsNamePath = []string{"permissions_name"} - ObjectsKeyPath = []string{"objects_key"} -) - -func MigrationVersion() *semver.Version { - migVersion, _ := semver.NewVersion(Version) - return migVersion -} - -type modelType interface { - *dsc2.ObjectType | *dsc2.RelationType | *dsc2.Permission - proto.Message - GetName() string -} - -type objectType interface { - *dsc2.Object - proto.Message - GetType() string - GetKey() string - GetProperties() *structpb.Struct -} - -type relationType interface { - *dsc2.Relation - proto.Message - GetSubject() *dsc2.ObjectIdentifier - GetRelation() string - GetObject() *dsc2.ObjectIdentifier -} - -var fnMap = []func(*zerolog.Logger, *bolt.DB, *bolt.DB) error{ - mig.DeleteBucket(bdb.ObjectTypesPath), - mig.DeleteBucket(ObjectTypesNamePath), - mig.CreateBucket(bdb.ObjectTypesPath), - updateModelTypes(bdb.ObjectTypesPath, &dsc2.ObjectType{}), - - mig.DeleteBucket(bdb.RelationTypesPath), - mig.DeleteBucket(RelationTypesNamePath), - mig.CreateBucket(bdb.RelationTypesPath), - updateModelTypes(bdb.RelationTypesPath, &dsc2.RelationType{}), - - mig.DeleteBucket(bdb.PermissionsPath), - mig.DeleteBucket(PermissionsNamePath), - mig.CreateBucket(bdb.PermissionsPath), - updateModelTypes(bdb.PermissionsPath, &dsc2.Permission{}), - - mig.DeleteBucket(bdb.ObjectsPath), - mig.DeleteBucket(ObjectsKeyPath), - mig.CreateBucket(bdb.ObjectsPath), - updateObjects(bdb.ObjectsPath, &dsc2.Object{}), - - mig.DeleteBucket(bdb.RelationsObjPath), - mig.DeleteBucket(bdb.RelationsSubPath), - mig.CreateBucket(bdb.RelationsObjPath), - mig.CreateBucket(bdb.RelationsSubPath), - updateRelations(bdb.RelationsObjPath, &dsc2.Relation{}, ds.ObjectToSubject), - updateRelations(bdb.RelationsSubPath, &dsc2.Relation{}, ds.SubjectToObject), -} - -func Migrate(log *zerolog.Logger, roDB, rwDB *bolt.DB) error { - log.Info().Str("version", Version).Msg("StartMigration") - for _, fn := range fnMap { - if err := fn(log, roDB, rwDB); err != nil { - return err - } - } - log.Info().Str("version", Version).Msg("FinishedMigration") - return nil -} - -// updateModelTypes, read values from read-only backup, write to new bucket. -func updateModelTypes[T modelType](path bdb.Path, v T) func(*zerolog.Logger, *bolt.DB, *bolt.DB) error { - return func(log *zerolog.Logger, roDB *bolt.DB, rwDB *bolt.DB) error { - log.Info().Str("version", Version).Msg("UpdateModelTypes") - - if err := roDB.View(func(rtx *bolt.Tx) error { - wtx, err := rwDB.Begin(true) - if err != nil { - return err - } - defer func() { _ = wtx.Rollback() }() - - b, err := mig.SetBucket(rtx, path) - if err != nil { - return err - } - - c := b.Cursor() - for key, value := c.First(); key != nil; key, value = c.Next() { - if err := pb.BufToProto(bytes.NewReader(value), any(v).(proto.Message)); err != nil { - return err - } - - buf := new(bytes.Buffer) - if err := pb.ProtoToBuf(buf, v); err != nil { - return err - } - - if err := mig.SetKey(wtx, path, keyModelType(v), buf.Bytes()); err != nil { - return err - } - } - - return wtx.Commit() - }); err != nil { - return err - } - - return nil - } -} - -func keyModelType[T modelType](v T) []byte { - var i interface{} = v - switch msg := i.(type) { - case *dsc2.ObjectType: - return []byte(msg.GetName()) - case *dsc2.Permission: - return []byte(msg.GetName()) - case *dsc2.RelationType: - return []byte(msg.GetObjectType() + ds.TypeIDSeparator + msg.GetName()) - } - return []byte{} -} - -// updateObjects, read values from read-only backup, write to new bucket. -func updateObjects[T objectType](path bdb.Path, v T) func(*zerolog.Logger, *bolt.DB, *bolt.DB) error { - return func(log *zerolog.Logger, roDB *bolt.DB, rwDB *bolt.DB) error { - log.Info().Str("version", Version).Msg("UpdateObjects") - - if err := roDB.View(func(rtx *bolt.Tx) error { - wtx, err := rwDB.Begin(true) - if err != nil { - return err - } - defer func() { _ = wtx.Rollback() }() - - b, err := mig.SetBucket(rtx, path) - if err != nil { - return err - } - - c := b.Cursor() - for key, value := c.First(); key != nil; key, value = c.Next() { - if err := pb.BufToProto(bytes.NewReader(value), any(v).(proto.Message)); err != nil { - return err - } - - buf := new(bytes.Buffer) - if err := pb.ProtoToBuf(buf, v); err != nil { - return err - } - - newKey := v.GetType() + ds.TypeIDSeparator + v.GetKey() - - if err := mig.SetKey(wtx, path, []byte(newKey), buf.Bytes()); err != nil { - return err - } - } - - return wtx.Commit() - }); err != nil { - return err - } - return nil - } -} - -// updateRelations, read values from read-only backup, write to new bucket. -func updateRelations[T relationType](path bdb.Path, v T, d ds.Direction) func(*zerolog.Logger, *bolt.DB, *bolt.DB) error { - return func(log *zerolog.Logger, roDB *bolt.DB, rwDB *bolt.DB) error { - log.Info().Str("version", Version).Msg("UpdateRelations") - - if err := roDB.View(func(rtx *bolt.Tx) error { - wtx, err := rwDB.Begin(true) - if err != nil { - return err - } - defer func() { _ = wtx.Rollback() }() - - b, err := mig.SetBucket(rtx, path) - if err != nil { - return err - } - - c := b.Cursor() - for key, value := c.First(); key != nil; key, value = c.Next() { - if err := pb.BufToProto(bytes.NewReader(value), any(v).(proto.Message)); err != nil { - return err - } - - buf := new(bytes.Buffer) - if err := pb.ProtoToBuf(buf, v); err != nil { - return err - } - - if v.GetObject().GetKey() == "" || v.GetSubject().GetKey() == "" { - return errors.Wrapf(os.ErrInvalid, "relation does not contain key values") - } - - newKey := relKey(v, d) - - if err := mig.SetKey(wtx, path, []byte(newKey), buf.Bytes()); err != nil { - return err - } - } - - return wtx.Commit() - }); err != nil { - return err - } - return nil - } -} - -// relKey, generates the new relation key using the object type and key instead of object id. -func relKey[T relationType](v T, d ds.Direction) string { - switch d { - // obj_type : obj_id | relation | sub_type : sub_id - // when subject_relation is added this will become - // obj_type : obj_id | relation | sub_type : sub_id (# sub_rel) - case ds.ObjectToSubject: - return fmt.Sprintf("%s:%s|%s|%s:%s", - v.GetObject().GetType(), - v.GetObject().GetKey(), - v.GetRelation(), - v.GetSubject().GetType(), - v.GetSubject().GetKey(), - ) - // sub_type : sub_id | relation | obj_type : obj_id - // when subject_relation is added this will become - // sub_type : sub_id (# sub_rel) | relation | obj_type : obj_id - case ds.SubjectToObject: - return fmt.Sprintf("%s:%s|%s|%s:%s", - v.GetSubject().GetType(), - v.GetSubject().GetKey(), - v.GetRelation(), - v.GetObject().GetType(), - v.GetObject().GetKey(), - ) - default: - return "" - } -} diff --git a/pkg/bdb/migrate/mig003/migrate.go b/pkg/bdb/migrate/mig003/migrate.go deleted file mode 100644 index cbe6eeb..0000000 --- a/pkg/bdb/migrate/mig003/migrate.go +++ /dev/null @@ -1,377 +0,0 @@ -package mig003 - -import ( - "bytes" - "context" - "hash/fnv" - "os" - "path/filepath" - "strconv" - - "github.com/aserto-dev/azm/migrate" - v3 "github.com/aserto-dev/azm/v3" - dsc2 "github.com/aserto-dev/go-directory/aserto/directory/common/v2" - dsc3 "github.com/aserto-dev/go-directory/aserto/directory/common/v3" - dsm3 "github.com/aserto-dev/go-directory/aserto/directory/model/v3" - "github.com/aserto-dev/go-directory/pkg/convert" - "github.com/aserto-dev/go-edge-ds/pkg/bdb" - "github.com/aserto-dev/go-edge-ds/pkg/bdb/migrate/mig" - "github.com/aserto-dev/go-edge-ds/pkg/ds" - "github.com/pkg/errors" - "google.golang.org/protobuf/types/known/timestamppb" - - "github.com/rs/zerolog" - bolt "go.etcd.io/bbolt" -) - -// mig003 -// -// backup current database file -// mount current database file as read-only -// add _manifest bucket -// convert object_types, relation_types, permissions to annotated v3 manifest -// set manifest -// set model -// copy object (with schema check) -// copy relations (with schema check) -// set schema to 3 - -const ( - Version string = "0.0.3" -) - -var fnMap = []func(*zerolog.Logger, *bolt.DB, *bolt.DB) error{ - mig.CreateBucket(bdb.SystemPath), - - mig.CreateBucket(bdb.ManifestPath), - createModel(), - migrateModel(), - - mig.DeleteBucket(bdb.ObjectTypesPath), - mig.DeleteBucket(bdb.RelationTypesPath), - mig.DeleteBucket(bdb.PermissionsPath), - - mig.DeleteBucket(bdb.ObjectsPath), - mig.CreateBucket(bdb.ObjectsPath), - updateObjects(bdb.ObjectsPath), - - mig.DeleteBucket(bdb.RelationsObjPath), - mig.CreateBucket(bdb.RelationsObjPath), - updateRelations(bdb.RelationsObjPath, ds.ObjectToSubject), - - mig.DeleteBucket(bdb.RelationsSubPath), - mig.CreateBucket(bdb.RelationsSubPath), - updateRelations(bdb.RelationsSubPath, ds.SubjectToObject), -} - -func Migrate(log *zerolog.Logger, roDB, rwDB *bolt.DB) error { - log.Info().Str("version", Version).Msg("StartMigration") - for _, fn := range fnMap { - if err := fn(log, roDB, rwDB); err != nil { - return err - } - } - log.Info().Str("version", Version).Msg("FinishedMigration") - return nil -} - -func createModel() func(*zerolog.Logger, *bolt.DB, *bolt.DB) error { - return func(log *zerolog.Logger, roDB *bolt.DB, rwDB *bolt.DB) error { - // skip when roDB is set. - if roDB != nil { - log.Debug().Msg("SKIP CreateModel") - return nil - } - - log.Info().Str("version", Version).Msg("CreateModel") - ctx := context.Background() - - manifestBuf := new(bytes.Buffer) - - model, err := v3.Load(bytes.NewReader(manifestBuf.Bytes())) - if err != nil { - return err - } - - h := fnv.New64a() - h.Reset() - _, _ = h.Write(manifestBuf.Bytes()) - - md := &dsm3.Metadata{ - UpdatedAt: timestamppb.Now(), - Etag: strconv.FormatUint(h.Sum64(), 10), - } - if err := rwDB.Update(func(tx *bolt.Tx) error { - if err := ds.Manifest(md).Set(ctx, tx, manifestBuf); err != nil { - return errors.Errorf("failed to set manifest") - } - - if err := ds.Manifest(md).SetModel(ctx, tx, model); err != nil { - return errors.Errorf("failed to set model") - } - - return nil - }); err != nil { - return err - } - - return nil - } -} - -// migrateModel, -// 1) creates a manifest file from the metadata objects in the db -// 2) computes the in-memory model -// 2) persists the manifest file byte-stream in the store -// 3) persists the serialized model in the store. -func migrateModel() func(*zerolog.Logger, *bolt.DB, *bolt.DB) error { - return func(log *zerolog.Logger, roDB *bolt.DB, rwDB *bolt.DB) error { - // skip when roDB is nil. - if roDB == nil { - log.Debug().Msg("SKIP MigrateModel") - return nil - } - - log.Info().Str("version", Version).Msg("MigrateModel") - ctx := context.Background() - - metadata, err := getMetadata(ctx, roDB) - if err != nil { - return err - } - - relationMap, err := relationMap(roDB) - if err != nil { - return err - } - - m := &migrate.Migrator{ - Metadata: metadata, - RelationMap: relationMap, - PermissionMap: migrate.NewObjPermRelContainer(), - } - - if err := m.Process(); err != nil { - return err - } - - manifestBuf := new(bytes.Buffer) - if err := m.Write(manifestBuf); err != nil { - return err - } - - model, err := v3.Load(bytes.NewReader(manifestBuf.Bytes())) - if err != nil { - return err - } - - md := &dsm3.Metadata{ - UpdatedAt: timestamppb.Now(), - } - if err := rwDB.Update(func(tx *bolt.Tx) error { - if err := ds.Manifest(md).Set(ctx, tx, manifestBuf); err != nil { - return errors.Errorf("failed to set manifest") - } - - if err := ds.Manifest(md).SetModel(ctx, tx, model); err != nil { - return errors.Errorf("failed to set model") - } - - return nil - }); err != nil { - return err - } - - fileName := manifestFilename(rwDB.Path(), "manifest.yaml") - w, err := os.Create(fileName) - if err != nil { - return err - } - defer w.Close() - - if _, err := manifestBuf.WriteTo(w); err != nil { - return err - } - - log.Info().Str("version", Version).Msgf("write migrated manifest: %s", fileName) - return nil - } -} - -func getMetadata(ctx context.Context, roDB *bolt.DB) (*migrate.Metadata, error) { - metadata := &migrate.Metadata{} - if err := roDB.View(func(rtx *bolt.Tx) error { - objectTypes, err := bdb.List[dsc2.ObjectType](ctx, rtx, bdb.ObjectTypesPath) - if err != nil { - return err - } - - relationTypes, err := bdb.List[dsc2.RelationType](ctx, rtx, bdb.RelationTypesPath) - if err != nil { - return err - } - - permissions, err := bdb.List[dsc2.Permission](ctx, rtx, bdb.PermissionsPath) - if err != nil { - return err - } - - metadata = &migrate.Metadata{ - ObjectTypes: objectTypes, - RelationTypes: relationTypes, - Permissions: permissions, - } - - return nil - }); err != nil { - return nil, err - } - return metadata, nil -} - -// updateObjects, read values from read-only backup, write to new bucket. -func updateObjects(path bdb.Path) func(*zerolog.Logger, *bolt.DB, *bolt.DB) error { - return func(log *zerolog.Logger, roDB *bolt.DB, rwDB *bolt.DB) error { - // skip when roDB is nil. - if roDB == nil { - log.Debug().Msg("SKIP UpdateObjects") - return nil - } - - log.Info().Str("version", Version).Msg("UpdateObjects") - - if err := roDB.View(func(rtx *bolt.Tx) error { - wtx, err := rwDB.Begin(true) - if err != nil { - return err - } - defer func() { _ = wtx.Rollback() }() - - b, err := mig.SetBucket(rtx, path) - if err != nil { - return err - } - - c := b.Cursor() - for key, value := c.First(); key != nil; key, value = c.Next() { - o2, err := bdb.Unmarshal[dsc2.Object](value) - if err != nil { - return err - } - - o3 := convert.ObjectToV3(o2) - - b3, err := bdb.Marshal[dsc3.Object](o3) - if err != nil { - return err - } - - newKey := ds.Object(o3).Key() - - if err := mig.SetKey(wtx, path, []byte(newKey), b3); err != nil { - return err - } - } - - return wtx.Commit() - }); err != nil { - return err - } - return nil - } -} - -// updateRelations, read values from read-only backup, write to new bucket. -func updateRelations(path bdb.Path, d ds.Direction) func(*zerolog.Logger, *bolt.DB, *bolt.DB) error { - return func(log *zerolog.Logger, roDB *bolt.DB, rwDB *bolt.DB) error { - // skip when roDB is nil. - if roDB == nil { - log.Debug().Msg("SKIP UpdateRelations") - return nil - } - - log.Info().Str("version", Version).Msg("UpdateRelations") - - if err := roDB.View(func(rtx *bolt.Tx) error { - wtx, err := rwDB.Begin(true) - if err != nil { - return err - } - defer func() { _ = wtx.Rollback() }() - - b, err := mig.SetBucket(rtx, path) - if err != nil { - return err - } - - var newKey string - - c := b.Cursor() - for key, value := c.First(); key != nil; key, value = c.Next() { - r2, err := bdb.Unmarshal[dsc2.Relation](value) - if err != nil { - return err - } - - r3 := convert.RelationToV3(r2) - - b3, err := bdb.Marshal[dsc3.Relation](r3) - if err != nil { - return err - } - - if d == ds.ObjectToSubject { - newKey = ds.Relation(r3).ObjKey() - } else if d == ds.SubjectToObject { - newKey = ds.Relation(r3).SubKey() - } - - if err := mig.SetKey(wtx, path, []byte(newKey), b3); err != nil { - return err - } - } - return wtx.Commit() - - }); err != nil { - return err - } - return nil - } -} - -func relationMap(roDB *bolt.DB) (*migrate.ObjRelSubContainer, error) { - orsc := migrate.NewObjRelSubContainer() - - if err := roDB.View(func(rtx *bolt.Tx) error { - b, err := mig.SetBucket(rtx, bdb.RelationsObjPath) - if err != nil { - return err - } - - c := b.Cursor() - for key, value := c.First(); key != nil; key, value = c.Next() { - r2, err := bdb.Unmarshal[dsc2.Relation](value) - if err != nil { - return err - } - - orsc.Add(&migrate.ObjRelSub{ - Object: r2.GetObject().GetType(), - Relation: r2.GetRelation(), - Subject: r2.GetSubject().GetType(), - }) - } - - return nil - - }); err != nil { - return nil, err - } - - return orsc, nil -} - -func manifestFilename(dbPath, name string) string { - dir, _ := filepath.Split(dbPath) - return filepath.Join(dir, name) -} diff --git a/pkg/bdb/migrate/migrate.go b/pkg/bdb/migrate/migrate.go index 3737014..8c19ee7 100644 --- a/pkg/bdb/migrate/migrate.go +++ b/pkg/bdb/migrate/migrate.go @@ -7,15 +7,12 @@ import ( cerr "github.com/aserto-dev/errors" "github.com/aserto-dev/go-edge-ds/pkg/bdb" "github.com/aserto-dev/go-edge-ds/pkg/bdb/migrate/mig" - "github.com/aserto-dev/go-edge-ds/pkg/bdb/migrate/mig001" - "github.com/aserto-dev/go-edge-ds/pkg/bdb/migrate/mig002" - "github.com/aserto-dev/go-edge-ds/pkg/bdb/migrate/mig003" "github.com/aserto-dev/go-edge-ds/pkg/bdb/migrate/mig004" "github.com/aserto-dev/go-edge-ds/pkg/bdb/migrate/mig005" "github.com/aserto-dev/go-edge-ds/pkg/bdb/migrate/mig006" "github.com/aserto-dev/go-edge-ds/pkg/fs" - "github.com/Masterminds/semver" + "github.com/Masterminds/semver/v3" "github.com/rs/zerolog" bolt "go.etcd.io/bbolt" "google.golang.org/grpc/codes" @@ -25,9 +22,6 @@ type Migration func(*zerolog.Logger, *bolt.DB, *bolt.DB) error // list of migration steps, keyed by version. var migMap = map[string]Migration{ - mig001.Version: mig001.Migrate, - mig002.Version: mig002.Migrate, - mig003.Version: mig003.Migrate, mig004.Version: mig004.Migrate, mig005.Version: mig005.Migrate, mig006.Version: mig006.Migrate, diff --git a/pkg/directory/directory.go b/pkg/directory/directory.go index 5eab0d5..e627dc2 100644 --- a/pkg/directory/directory.go +++ b/pkg/directory/directory.go @@ -6,11 +6,6 @@ import ( "sync" "time" - dse2 "github.com/aserto-dev/go-directory/aserto/directory/exporter/v2" - dsi2 "github.com/aserto-dev/go-directory/aserto/directory/importer/v2" - dsr2 "github.com/aserto-dev/go-directory/aserto/directory/reader/v2" - dsw2 "github.com/aserto-dev/go-directory/aserto/directory/writer/v2" - dsc3 "github.com/aserto-dev/go-directory/aserto/directory/common/v3" dse3 "github.com/aserto-dev/go-directory/aserto/directory/exporter/v3" dsi3 "github.com/aserto-dev/go-directory/aserto/directory/importer/v3" @@ -21,10 +16,9 @@ import ( "github.com/aserto-dev/go-edge-ds/pkg/bdb" "github.com/aserto-dev/go-edge-ds/pkg/bdb/migrate" "github.com/aserto-dev/go-edge-ds/pkg/datasync" - v2 "github.com/aserto-dev/go-edge-ds/pkg/directory/v2" v3 "github.com/aserto-dev/go-edge-ds/pkg/directory/v3" - "github.com/Masterminds/semver" + "github.com/Masterminds/semver/v3" "github.com/bufbuild/protovalidate-go" "github.com/rs/zerolog" bolt "go.etcd.io/bbolt" @@ -51,10 +45,6 @@ type Directory struct { logger *zerolog.Logger store *bdb.BoltDB validator *protovalidate.Validator - exporter2 dse2.ExporterServer - importer2 dsi2.ImporterServer - reader2 dsr2.ReaderServer - writer2 dsw2.WriterServer exporter3 dse3.ExporterServer importer3 dsi3.ImporterServer model3 dsm3.ModelServer @@ -146,13 +136,6 @@ func newDirectory(_ context.Context, config *Config, logger *zerolog.Logger) (*D importer3: importer3, } - if config.EnableV2 { - dir.exporter2 = v2.NewExporter(logger, store, exporter3) - dir.importer2 = v2.NewImporter(logger, store, importer3) - dir.reader2 = v2.NewReader(logger, store, reader3) - dir.writer2 = v2.NewWriter(logger, store, writer3) - } - if err := store.LoadModel(); err != nil { return nil, err } @@ -167,22 +150,6 @@ func (s *Directory) Close() { } } -func (s *Directory) Exporter2() dse2.ExporterServer { - return s.exporter2 -} - -func (s *Directory) Importer2() dsi2.ImporterServer { - return s.importer2 -} - -func (s *Directory) Reader2() dsr2.ReaderServer { - return s.reader2 -} - -func (s *Directory) Writer2() dsw2.WriterServer { - return s.writer2 -} - func (s *Directory) Exporter3() dse3.ExporterServer { return s.exporter3 } diff --git a/pkg/directory/v2/exporter.go b/pkg/directory/v2/exporter.go deleted file mode 100644 index 334751d..0000000 --- a/pkg/directory/v2/exporter.go +++ /dev/null @@ -1,168 +0,0 @@ -package v2 - -import ( - dsc3 "github.com/aserto-dev/go-directory/aserto/directory/common/v3" - dse2 "github.com/aserto-dev/go-directory/aserto/directory/exporter/v2" - dse3 "github.com/aserto-dev/go-directory/aserto/directory/exporter/v3" - "github.com/aserto-dev/go-directory/pkg/convert" - "github.com/aserto-dev/go-edge-ds/pkg/bdb" - v3 "github.com/aserto-dev/go-edge-ds/pkg/directory/v3" - - "github.com/rs/zerolog" - bolt "go.etcd.io/bbolt" -) - -type Exporter struct { - logger *zerolog.Logger - store *bdb.BoltDB - e3 dse3.ExporterServer -} - -func NewExporter(logger *zerolog.Logger, store *bdb.BoltDB, e3 *v3.Exporter) *Exporter { - return &Exporter{ - logger: logger, - store: store, - e3: e3, - } -} - -func (s *Exporter) Export(req *dse2.ExportRequest, stream dse2.Exporter_ExportServer) error { - logger := s.logger.With().Str("method", "Export").Interface("req", req).Logger() - - if req.Options&uint32(dse2.Option_OPTION_METADATA_OBJECT_TYPES) != 0 { - if err := exportObjectTypes(s.store, stream); err != nil { - logger.Error().Err(err).Msg("export_object_types") - return err - } - } - - if req.Options&uint32(dse2.Option_OPTION_METADATA_RELATION_TYPES) != 0 { - if err := exportRelationTypes(s.store, stream); err != nil { - logger.Error().Err(err).Msg("export_relation_types") - return err - } - } - - if req.Options&uint32(dse2.Option_OPTION_METADATA_PERMISSIONS) != 0 { - if err := exportPermissions(s.store, stream); err != nil { - logger.Error().Err(err).Msg("export_permissions") - return err - } - } - - err := s.store.DB().View(func(tx *bolt.Tx) error { - if req.Options&uint32(dse2.Option_OPTION_DATA_OBJECTS) != 0 { - if err := exportObjects(tx, stream); err != nil { - logger.Error().Err(err).Msg("export_objects") - return err - } - } - - if req.Options&uint32(dse2.Option_OPTION_DATA_RELATIONS) != 0 { - if err := exportRelations(tx, stream); err != nil { - logger.Error().Err(err).Msg("export_relations") - return err - } - } - - return nil - }) - - return err -} - -func exportObjectTypes(store *bdb.BoltDB, stream dse2.Exporter_ExportServer) error { - results, err := store.MC().GetObjectTypes() - if err != nil { - return err - } - - for _, v := range results { - if err := stream.Send(&dse2.ExportResponse{ - Msg: &dse2.ExportResponse_ObjectType{ - ObjectType: v, - }, - }); err != nil { - return err - } - } - - return nil -} - -func exportRelationTypes(store *bdb.BoltDB, stream dse2.Exporter_ExportServer) error { - results, err := store.MC().GetRelationTypes("") - if err != nil { - return err - } - - for _, v := range results { - if err := stream.Send(&dse2.ExportResponse{ - Msg: &dse2.ExportResponse_RelationType{ - RelationType: v, - }, - }); err != nil { - return err - } - } - - return nil -} - -func exportPermissions(store *bdb.BoltDB, stream dse2.Exporter_ExportServer) error { - results, err := store.MC().GetPermissions() - if err != nil { - return err - } - - for _, v := range results { - if err := stream.Send(&dse2.ExportResponse{ - Msg: &dse2.ExportResponse_Permission{ - Permission: v, - }, - }); err != nil { - return err - } - } - - return nil -} - -func exportObjects(tx *bolt.Tx, stream dse2.Exporter_ExportServer) error { - iter, err := bdb.NewScanIterator[dsc3.Object](stream.Context(), tx, bdb.ObjectsPath) - if err != nil { - return err - } - - for iter.Next() { - convert.ObjectToV2(iter.Value()) - if err := stream.Send(&dse2.ExportResponse{ - Msg: &dse2.ExportResponse_Object{ - Object: convert.ObjectToV2(iter.Value()), - }, - }); err != nil { - return err - } - } - - return nil -} - -func exportRelations(tx *bolt.Tx, stream dse2.Exporter_ExportServer) error { - iter, err := bdb.NewScanIterator[dsc3.Relation](stream.Context(), tx, bdb.RelationsObjPath) - if err != nil { - return err - } - - for iter.Next() { - if err := stream.Send(&dse2.ExportResponse{ - Msg: &dse2.ExportResponse_Relation{ - Relation: convert.RelationToV2(iter.Value()), - }, - }); err != nil { - return err - } - } - - return nil -} diff --git a/pkg/directory/v2/importer.go b/pkg/directory/v2/importer.go deleted file mode 100644 index bbb3721..0000000 --- a/pkg/directory/v2/importer.go +++ /dev/null @@ -1,147 +0,0 @@ -package v2 - -import ( - "context" - "io" - - dsc2 "github.com/aserto-dev/go-directory/aserto/directory/common/v2" - dsc3 "github.com/aserto-dev/go-directory/aserto/directory/common/v3" - dsi2 "github.com/aserto-dev/go-directory/aserto/directory/importer/v2" - dsi3 "github.com/aserto-dev/go-directory/aserto/directory/importer/v3" - "github.com/aserto-dev/go-directory/pkg/convert" - "github.com/aserto-dev/go-directory/pkg/derr" - "github.com/aserto-dev/go-edge-ds/pkg/bdb" - v3 "github.com/aserto-dev/go-edge-ds/pkg/directory/v3" - "github.com/aserto-dev/go-edge-ds/pkg/ds" - "github.com/aserto-dev/go-edge-ds/pkg/session" - "github.com/bufbuild/protovalidate-go" - - "github.com/google/uuid" - "github.com/rs/zerolog" - bolt "go.etcd.io/bbolt" -) - -type Importer struct { - logger *zerolog.Logger - store *bdb.BoltDB - i3 dsi3.ImporterServer - v *protovalidate.Validator -} - -func NewImporter(logger *zerolog.Logger, store *bdb.BoltDB, i3 *v3.Importer) *Importer { - v, _ := protovalidate.New() - return &Importer{ - logger: logger, - store: store, - i3: i3, - v: v, - } -} - -func (s *Importer) Import(stream dsi2.Importer_ImportServer) error { - res := &dsi2.ImportResponse{ - ObjectType: &dsi2.ImportCounter{}, - Permission: &dsi2.ImportCounter{}, - RelationType: &dsi2.ImportCounter{}, - Object: &dsi2.ImportCounter{}, - Relation: &dsi2.ImportCounter{}, - } - - ctx := session.ContextWithSessionID(stream.Context(), uuid.NewString()) - - s.store.DB().MaxBatchSize = s.store.Config().MaxBatchSize - s.store.DB().MaxBatchDelay = s.store.Config().MaxBatchDelay - - importErr := s.store.DB().Batch(func(tx *bolt.Tx) error { - for { - req, err := stream.Recv() - if err == io.EOF { - s.logger.Debug().Interface("res", res).Msg("import stream EOF") - return stream.Send(res) - } else if err != nil { - s.logger.Err(err).Msg("cannot receive req") - return stream.Send(res) - } - - if err := s.handleImportRequest(ctx, tx, req, res); err != nil { - s.logger.Err(err).Msg("cannot handle load request") - return stream.Send(res) - } - } - }) - - return importErr -} - -func (s *Importer) handleImportRequest(ctx context.Context, tx *bolt.Tx, req *dsi2.ImportRequest, res *dsi2.ImportResponse) (err error) { - - if obj := req.GetObject(); obj != nil { - err = s.objectHandler(ctx, tx, obj) - res.Object = updateCounter(res.Object, req.OpCode, err) - } else if rel := req.GetRelation(); rel != nil { - err = s.relationHandler(ctx, tx, rel) - res.Relation = updateCounter(res.Relation, req.OpCode, err) - } - - return err -} - -func (s *Importer) objectHandler(ctx context.Context, tx *bolt.Tx, req *dsc2.Object) error { - s.logger.Debug().Interface("object", req).Msg("import_object") - - req3 := convert.ObjectToV3(req) - if err := s.v.Validate(req3); err != nil { - // invalid proto message - return derr.ErrProtoValidate.Msg(err.Error()) - } - - obj := ds.Object(req3) - if err := obj.Validate(s.store.MC()); err != nil { - // The object violates the model. - return err - } - - if _, err := bdb.Set[dsc3.Object](ctx, tx, bdb.ObjectsPath, obj.Key(), req3); err != nil { - return derr.ErrInvalidObject.Msg("set") - } - - return nil -} - -func (s *Importer) relationHandler(ctx context.Context, tx *bolt.Tx, req *dsc2.Relation) error { - s.logger.Debug().Interface("relation", req).Msg("import_relation") - - req3 := convert.RelationToV3(req) - if err := s.v.Validate(req3); err != nil { - // invalid proto message - return derr.ErrProtoValidate.Msg(err.Error()) - } - - rel := ds.Relation(req3) - if err := rel.Validate(s.store.MC()); err != nil { - return err - } - - if _, err := bdb.Set[dsc3.Relation](ctx, tx, bdb.RelationsObjPath, rel.ObjKey(), req3); err != nil { - return derr.ErrInvalidRelation.Msg("set") - } - - if _, err := bdb.Set[dsc3.Relation](ctx, tx, bdb.RelationsSubPath, rel.SubKey(), req3); err != nil { - return derr.ErrInvalidRelation.Msg("set") - } - - return nil -} - -func updateCounter(c *dsi2.ImportCounter, opCode dsi2.Opcode, err error) *dsi2.ImportCounter { - c.Recv++ - if opCode == dsi2.Opcode_OPCODE_SET { - c.Set++ - } else if opCode == dsi2.Opcode_OPCODE_DELETE { - c.Delete++ - } - if err != nil { - c.Error++ - } - return c -} diff --git a/pkg/directory/v2/reader.go b/pkg/directory/v2/reader.go deleted file mode 100644 index 386dd27..0000000 --- a/pkg/directory/v2/reader.go +++ /dev/null @@ -1,290 +0,0 @@ -package v2 - -import ( - "context" - - dsc2 "github.com/aserto-dev/go-directory/aserto/directory/common/v2" - dsc3 "github.com/aserto-dev/go-directory/aserto/directory/common/v3" - dsr2 "github.com/aserto-dev/go-directory/aserto/directory/reader/v2" - dsr3 "github.com/aserto-dev/go-directory/aserto/directory/reader/v3" - "github.com/aserto-dev/go-directory/pkg/convert" - "github.com/aserto-dev/go-edge-ds/pkg/bdb" - v3 "github.com/aserto-dev/go-edge-ds/pkg/directory/v3" - "github.com/aserto-dev/go-edge-ds/pkg/ds" - bolt "go.etcd.io/bbolt" - "google.golang.org/protobuf/proto" - - "github.com/rs/zerolog" -) - -type Reader struct { - logger *zerolog.Logger - store *bdb.BoltDB - r3 dsr3.ReaderServer -} - -func NewReader(logger *zerolog.Logger, store *bdb.BoltDB, r3 *v3.Reader) *Reader { - return &Reader{ - logger: logger, - store: store, - r3: r3, - } -} - -// Get object type (metadata). -func (s *Reader) GetObjectType(ctx context.Context, req *dsr2.GetObjectTypeRequest) (*dsr2.GetObjectTypeResponse, error) { - resp := &dsr2.GetObjectTypeResponse{} - - if req.Param == nil { - req.Param = &dsc2.ObjectTypeIdentifier{Name: proto.String("")} - } - - objectType, err := s.store.MC().GetObjectType(req.Param.GetName()) - if err != nil { - return resp, err - } - - resp.Result = objectType - - return resp, err -} - -// Get all objects types (metadata) (paginated). -func (s *Reader) GetObjectTypes(ctx context.Context, req *dsr2.GetObjectTypesRequest) (*dsr2.GetObjectTypesResponse, error) { - resp := &dsr2.GetObjectTypesResponse{Results: []*dsc2.ObjectType{}} - - if req.Page == nil { - req.Page = &dsc2.PaginationRequest{Size: 100} - } - - objectTypes, err := s.store.MC().GetObjectTypes() - - resp.Results = objectTypes - resp.Page = &dsc2.PaginationResponse{ - NextToken: "", - ResultSize: int32(len(resp.Results)), - } - - return resp, err -} - -// Get relation type (metadata). -func (s *Reader) GetRelationType(ctx context.Context, req *dsr2.GetRelationTypeRequest) (*dsr2.GetRelationTypeResponse, error) { - resp := &dsr2.GetRelationTypeResponse{} - - if req.Param == nil { - req.Param = &dsc2.RelationTypeIdentifier{ - ObjectType: proto.String(""), - Name: proto.String(""), - } - } - - relationType, err := s.store.MC().GetRelationType(req.Param.GetObjectType(), req.Param.GetName()) - if err != nil { - return resp, err - } - - resp.Result = relationType - - return resp, err -} - -// Get all relation types, optionally filtered by object type (metadata) (paginated). -func (s *Reader) GetRelationTypes(ctx context.Context, req *dsr2.GetRelationTypesRequest) (*dsr2.GetRelationTypesResponse, error) { - resp := &dsr2.GetRelationTypesResponse{Results: []*dsc2.RelationType{}, Page: &dsc2.PaginationResponse{}} - - if req.Param == nil { - req.Param = &dsc2.ObjectTypeIdentifier{} - } - - if req.Page == nil { - req.Page = &dsc2.PaginationRequest{Size: 100} - } - - relationTypes, err := s.store.MC().GetRelationTypes(req.Param.GetName()) - if err != nil { - return resp, err - } - - resp.Results = relationTypes - resp.Page = &dsc2.PaginationResponse{ - NextToken: "", - ResultSize: int32(len(resp.Results)), - } - - return resp, err -} - -// Get permission (metadata). -func (s *Reader) GetPermission(ctx context.Context, req *dsr2.GetPermissionRequest) (*dsr2.GetPermissionResponse, error) { - resp := &dsr2.GetPermissionResponse{} - - if req.Param == nil { - req.Param = &dsc2.PermissionIdentifier{ - Name: proto.String(""), - } - } - - permission, err := s.store.MC().GetPermission(req.Param.GetName()) - if err != nil { - return resp, err - } - - resp.Result = permission - - return resp, err -} - -// Get all permissions (metadata) (paginated). -func (s *Reader) GetPermissions(ctx context.Context, req *dsr2.GetPermissionsRequest) (*dsr2.GetPermissionsResponse, error) { - resp := &dsr2.GetPermissionsResponse{Results: []*dsc2.Permission{}} - - if req.Page == nil { - req.Page = &dsc2.PaginationRequest{Size: 100} - } - - permissions, err := s.store.MC().GetPermissions() - if err != nil { - return resp, err - } - - resp.Results = permissions - resp.Page = &dsc2.PaginationResponse{ - NextToken: "", - ResultSize: int32(len(resp.Results)), - } - - return resp, err -} - -// Get single object instance. -func (s *Reader) GetObject(ctx context.Context, req *dsr2.GetObjectRequest) (*dsr2.GetObjectResponse, error) { - r3, err := s.r3.GetObject(ctx, convert.GetObjectRequestToV3(req)) - if err != nil { - return &dsr2.GetObjectResponse{}, err - } - - r2 := &dsr2.GetObjectResponse{ - Result: convert.ObjectToV2(r3.Result), - Relations: convert.RelationArrayToV2(r3.Relations), - Page: convert.PaginationResponseToV2(r3.Page), - } - - return r2, err -} - -// Get multiple object instances by id or type+key, in a single request. -func (s *Reader) GetObjectMany(ctx context.Context, req *dsr2.GetObjectManyRequest) (*dsr2.GetObjectManyResponse, error) { - r3, err := s.r3.GetObjectMany(ctx, convert.GetObjectManyRequestToV3(req)) - if err != nil { - return &dsr2.GetObjectManyResponse{}, err - } - - r2 := &dsr2.GetObjectManyResponse{ - Results: convert.ObjectArrayToV2(r3.Results), - } - - return r2, err -} - -// Get all object instances, optionally filtered by object type. (paginated). -func (s *Reader) GetObjects(ctx context.Context, req *dsr2.GetObjectsRequest) (*dsr2.GetObjectsResponse, error) { - r3, err := s.r3.GetObjects(ctx, convert.GetObjectsRequestToV3(req)) - if err != nil { - return &dsr2.GetObjectsResponse{}, err - } - - r2 := &dsr2.GetObjectsResponse{ - Results: convert.ObjectArrayToV2(r3.Results), - Page: convert.PaginationResponseToV2(r3.Page), - } - - return r2, err -} - -// Get relation instances based on subject, relation, object filter. -func (s *Reader) GetRelation(ctx context.Context, req *dsr2.GetRelationRequest) (*dsr2.GetRelationResponse, error) { - r3, err := s.r3.GetRelation(ctx, convert.GetRelationRequestToV3(req)) - if err != nil { - return &dsr2.GetRelationResponse{}, err - } - - r2 := &dsr2.GetRelationResponse{ - Results: convert.RelationArrayToV2([]*dsc3.Relation{r3.Result}), - Objects: map[string]*dsc2.Object{}, - } - - for k, v := range r3.Objects { - r2.Objects[k] = convert.ObjectToV2(v) - } - - return r2, err -} - -// Get relation instances based on subject, relation, object filter (paginated). -func (s *Reader) GetRelations(ctx context.Context, req *dsr2.GetRelationsRequest) (*dsr2.GetRelationsResponse, error) { - r3, err := s.r3.GetRelations(ctx, convert.GetRelationsRequestToV3(req)) - if err != nil { - return &dsr2.GetRelationsResponse{}, err - } - - r2 := &dsr2.GetRelationsResponse{ - Results: convert.RelationArrayToV2(r3.Results), - Page: convert.PaginationResponseToV2(r3.Page), - } - - return r2, err -} - -// Check if subject has permission on object. -func (s *Reader) CheckPermission(ctx context.Context, req *dsr2.CheckPermissionRequest) (*dsr2.CheckPermissionResponse, error) { - r3, err := s.r3.CheckPermission(ctx, convert.CheckPermissionRequestToV3(req)) - if err != nil { - return &dsr2.CheckPermissionResponse{}, err - } - - r2 := &dsr2.CheckPermissionResponse{ - Check: r3.GetCheck(), - Trace: r3.GetTrace(), - } - - return r2, err -} - -// Check if subject has relation to object. -func (s *Reader) CheckRelation(ctx context.Context, req *dsr2.CheckRelationRequest) (*dsr2.CheckRelationResponse, error) { - r3, err := s.r3.CheckRelation(ctx, convert.CheckRelationRequestToV3(req)) - if err != nil { - return &dsr2.CheckRelationResponse{}, err - } - - r2 := &dsr2.CheckRelationResponse{ - Check: r3.GetCheck(), - Trace: r3.GetTrace(), - } - - return r2, err -} - -// Get object dependency graph. -func (s *Reader) GetGraph(ctx context.Context, req *dsr2.GetGraphRequest) (*dsr2.GetGraphResponse, error) { - resp := &dsr2.GetGraphResponse{} - - getGraph := ds.GetGraphV2(req) - if err := getGraph.Validate(s.store.MC()); err != nil { - return resp, err - } - - err := s.store.DB().View(func(tx *bolt.Tx) error { - var err error - results, err := getGraph.Exec(ctx, tx) - if err != nil { - return err - } - - resp.Results = results - return nil - }) - - return resp, err -} diff --git a/pkg/directory/v2/writer.go b/pkg/directory/v2/writer.go deleted file mode 100644 index df89016..0000000 --- a/pkg/directory/v2/writer.go +++ /dev/null @@ -1,134 +0,0 @@ -package v2 - -import ( - "context" - - dsw2 "github.com/aserto-dev/go-directory/aserto/directory/writer/v2" - dsw3 "github.com/aserto-dev/go-directory/aserto/directory/writer/v3" - "github.com/aserto-dev/go-directory/pkg/convert" - "github.com/aserto-dev/go-edge-ds/pkg/bdb" - v3 "github.com/aserto-dev/go-edge-ds/pkg/directory/v3" - - "github.com/rs/zerolog" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/status" -) - -const ( - errMetaDataMethodObsolete string = "method %s is obsolete, use set manifest to manipulate metadata" -) - -type Writer struct { - logger *zerolog.Logger - store *bdb.BoltDB - w3 dsw3.WriterServer -} - -func NewWriter(logger *zerolog.Logger, store *bdb.BoltDB, w3 *v3.Writer) *Writer { - return &Writer{ - logger: logger, - store: store, - w3: w3, - } -} - -// SetObjectType, obsolete, use set manifest to manipulate metadata. -func (s *Writer) SetObjectType(_ context.Context, _ *dsw2.SetObjectTypeRequest) (*dsw2.SetObjectTypeResponse, error) { - return &dsw2.SetObjectTypeResponse{}, status.Errorf(codes.Unimplemented, errMetaDataMethodObsolete, "SetObjectType") -} - -// DeleteObjectType, obsolete, use set manifest to manipulate metadata. -func (s *Writer) DeleteObjectType(_ context.Context, _ *dsw2.DeleteObjectTypeRequest) (*dsw2.DeleteObjectTypeResponse, error) { - return &dsw2.DeleteObjectTypeResponse{}, status.Errorf(codes.Unimplemented, errMetaDataMethodObsolete, "DeleteObjectType") -} - -// SetRelationType, obsolete, use set manifest to manipulate metadata. -func (s *Writer) SetRelationType(_ context.Context, _ *dsw2.SetRelationTypeRequest) (*dsw2.SetRelationTypeResponse, error) { - return &dsw2.SetRelationTypeResponse{}, status.Errorf(codes.Unimplemented, errMetaDataMethodObsolete, "SetRelationType") -} - -// DeleteRelationType, obsolete, use set manifest to manipulate metadata. -func (s *Writer) DeleteRelationType(_ context.Context, _ *dsw2.DeleteRelationTypeRequest) (*dsw2.DeleteRelationTypeResponse, error) { - return &dsw2.DeleteRelationTypeResponse{}, status.Errorf(codes.Unimplemented, errMetaDataMethodObsolete, "DeleteRelationType") -} - -// SetPermission, obsolete, use set manifest to manipulate metadata. -func (s *Writer) SetPermission(_ context.Context, _ *dsw2.SetPermissionRequest) (*dsw2.SetPermissionResponse, error) { - return &dsw2.SetPermissionResponse{}, status.Errorf(codes.Unimplemented, errMetaDataMethodObsolete, "SetPermission") -} - -// DeletePermission, obsolete, use set manifest to manipulate metadata. -func (s *Writer) DeletePermission(_ context.Context, _ *dsw2.DeletePermissionRequest) (*dsw2.DeletePermissionResponse, error) { - return &dsw2.DeletePermissionResponse{}, status.Errorf(codes.Unimplemented, errMetaDataMethodObsolete, "DeletePermission") -} - -// SetObject, implementation is delegated to writer.v3.SetObject. -func (s *Writer) SetObject(ctx context.Context, req *dsw2.SetObjectRequest) (*dsw2.SetObjectResponse, error) { - r3, err := s.w3.SetObject(ctx, &dsw3.SetObjectRequest{ - Object: convert.ObjectToV3(req.GetObject()), - }) - if err != nil { - return &dsw2.SetObjectResponse{}, err - } - - r2 := &dsw2.SetObjectResponse{ - Result: convert.ObjectToV2(r3.GetResult()), - } - - return r2, err -} - -// DeleteObject, implementation is delegated to writer.v3.DeleteObject. -func (s *Writer) DeleteObject(ctx context.Context, req *dsw2.DeleteObjectRequest) (*dsw2.DeleteObjectResponse, error) { - r3, err := s.w3.DeleteObject(ctx, &dsw3.DeleteObjectRequest{ - ObjectType: req.GetParam().GetType(), - ObjectId: req.GetParam().GetKey(), - WithRelations: req.GetWithRelations(), - }) - if err != nil { - return &dsw2.DeleteObjectResponse{}, err - } - - r2 := &dsw2.DeleteObjectResponse{ - Result: r3.Result, - } - - return r2, err -} - -// SetRelation, implementation is delegated to writer.v3.SetRelation. -func (s *Writer) SetRelation(ctx context.Context, req *dsw2.SetRelationRequest) (*dsw2.SetRelationResponse, error) { - r3, err := s.w3.SetRelation(ctx, &dsw3.SetRelationRequest{ - Relation: convert.RelationToV3(req.GetRelation()), - }) - if err != nil { - return &dsw2.SetRelationResponse{}, err - } - - r2 := &dsw2.SetRelationResponse{ - Result: convert.RelationToV2(r3.GetResult()), - } - - return r2, err -} - -// DeleteRelation, implementation is delegated to writer.v3.DeleteRelation. -func (s *Writer) DeleteRelation(ctx context.Context, req *dsw2.DeleteRelationRequest) (*dsw2.DeleteRelationResponse, error) { - r3, err := s.w3.DeleteRelation(ctx, &dsw3.DeleteRelationRequest{ - ObjectType: req.GetParam().GetObject().GetType(), - ObjectId: req.GetParam().GetObject().GetKey(), - Relation: req.GetParam().GetRelation().GetName(), - SubjectType: req.GetParam().GetSubject().GetType(), - SubjectId: req.GetParam().GetSubject().GetKey(), - SubjectRelation: "", - }) - if err != nil { - return &dsw2.DeleteRelationResponse{}, err - } - - r2 := &dsw2.DeleteRelationResponse{ - Result: r3.Result, - } - - return r2, err -} diff --git a/pkg/directory/v3/reader.go b/pkg/directory/v3/reader.go index 1bdf779..6b1aa31 100644 --- a/pkg/directory/v3/reader.go +++ b/pkg/directory/v3/reader.go @@ -141,6 +141,10 @@ func (s *Reader) GetObjects(ctx context.Context, req *dsr3.GetObjectsRequest) (* } if req.GetObjectType() != "" { + if err := ds.ObjectSelector(&dsc3.ObjectIdentifier{ObjectType: req.ObjectType}).Validate(s.store.MC()); err != nil { + return resp, err + } + opts = append(opts, bdb.WithKeyFilter(req.GetObjectType()+ds.TypeIDSeparator)) } diff --git a/pkg/server/test-edge-ds.go b/pkg/server/test-edge-ds.go index a99d12c..d518055 100644 --- a/pkg/server/test-edge-ds.go +++ b/pkg/server/test-edge-ds.go @@ -4,11 +4,6 @@ import ( "context" "net" - dse2 "github.com/aserto-dev/go-directory/aserto/directory/exporter/v2" - dsi2 "github.com/aserto-dev/go-directory/aserto/directory/importer/v2" - dsr2 "github.com/aserto-dev/go-directory/aserto/directory/reader/v2" - dsw2 "github.com/aserto-dev/go-directory/aserto/directory/writer/v2" - dse3 "github.com/aserto-dev/go-directory/aserto/directory/exporter/v3" dsi3 "github.com/aserto-dev/go-directory/aserto/directory/importer/v3" dsm3 "github.com/aserto-dev/go-directory/aserto/directory/model/v3" @@ -26,17 +21,9 @@ import ( ) type TestEdgeClient struct { - V2 ClientV2 V3 ClientV3 } -type ClientV2 struct { - Reader dsr2.ReaderClient - Writer dsw2.WriterClient - Importer dsi2.ImporterClient - Exporter dse2.ExporterClient -} - type ClientV3 struct { Model dsm3.ModelClient Reader dsr3.ReaderClient @@ -61,10 +48,6 @@ func NewTestEdgeServer(ctx context.Context, logger *zerolog.Logger, cfg *directo grpc.UnaryInterceptor(errMiddleware.Unary()), grpc.StreamInterceptor(errMiddleware.Stream()), ) - dsr2.RegisterReaderServer(s, edgeDirServer.Reader2()) - dsw2.RegisterWriterServer(s, edgeDirServer.Writer2()) - dse2.RegisterExporterServer(s, edgeDirServer.Exporter2()) - dsi2.RegisterImporterServer(s, edgeDirServer.Importer2()) dsm3.RegisterModelServer(s, edgeDirServer.Model3()) dsr3.RegisterReaderServer(s, edgeDirServer.Reader3()) @@ -84,12 +67,6 @@ func NewTestEdgeServer(ctx context.Context, logger *zerolog.Logger, cfg *directo }), grpc.WithTransportCredentials(insecure.NewCredentials()), grpc.WithBlock()) client := TestEdgeClient{ - V2: ClientV2{ - Reader: dsr2.NewReaderClient(conn), - Writer: dsw2.NewWriterClient(conn), - Importer: dsi2.NewImporterClient(conn), - Exporter: dse2.NewExporterClient(conn), - }, V3: ClientV3{ Model: dsm3.NewModelClient(conn), Reader: dsr3.NewReaderClient(conn), diff --git a/tests/manifest_test.go b/tests/manifest_test.go index 220c71c..bd7718e 100644 --- a/tests/manifest_test.go +++ b/tests/manifest_test.go @@ -27,7 +27,7 @@ import ( const blockSize = 1024 // test with 1KiB block size to exercise chunking. func TestManifestV2(t *testing.T) { - client, closer := testInit(t) + client, closer := testInit() t.Cleanup(closer) manifest, err := os.ReadFile("./manifest_v2_test.yaml") @@ -39,7 +39,7 @@ func TestManifestV2(t *testing.T) { } func TestManifestV3(t *testing.T) { - client, closer := testInit(t) + client, closer := testInit() t.Cleanup(closer) manifest, err := os.ReadFile("./manifest_v3_test.yaml") @@ -52,7 +52,7 @@ func TestManifestV3(t *testing.T) { } func TestManifestDiff(t *testing.T) { - client, closer := testInit(t) + client, closer := testInit() t.Cleanup(closer) m1, err := os.ReadFile("./manifest_v3_test.yaml") diff --git a/tests/runner_test.go b/tests/runner_test.go index eb4561d..840ba8a 100644 --- a/tests/runner_test.go +++ b/tests/runner_test.go @@ -10,10 +10,7 @@ import ( "testing" "time" - dsc2 "github.com/aserto-dev/go-directory/aserto/directory/common/v2" - dsr2 "github.com/aserto-dev/go-directory/aserto/directory/reader/v2" dsr3 "github.com/aserto-dev/go-directory/aserto/directory/reader/v3" - dsw2 "github.com/aserto-dev/go-directory/aserto/directory/writer/v2" dsw3 "github.com/aserto-dev/go-directory/aserto/directory/writer/v3" "github.com/aserto-dev/go-edge-ds/pkg/directory" "github.com/aserto-dev/go-edge-ds/pkg/server" @@ -62,48 +59,12 @@ func TestMain(m *testing.M) { os.Exit(exitVal) } -func TestGetObjectTypes(t *testing.T) { - client, closer := testInit(t) - t.Cleanup(closer) - - resp, err := client.V2.Reader.GetObjectTypes(context.Background(), &dsr2.GetObjectTypesRequest{}) - require.NoError(t, err) - for _, v := range resp.Results { - t.Logf("object_type: %s", v.Name) - } -} - -func TestGetRelationTypes(t *testing.T) { - client, closer := testInit(t) - t.Cleanup(closer) - - resp, err := client.V2.Reader.GetRelationTypes(context.Background(), &dsr2.GetRelationTypesRequest{ - Param: &dsc2.ObjectTypeIdentifier{}, - Page: &dsc2.PaginationRequest{}, - }) - require.NoError(t, err) - for _, v := range resp.Results { - t.Logf("relation_type: %s:%s", v.ObjectType, v.Name) - } -} - -func TestGetPermissions(t *testing.T) { - client, closer := testInit(t) - t.Cleanup(closer) - - resp, err := client.V2.Reader.GetPermissions(context.Background(), &dsr2.GetPermissionsRequest{}) - require.NoError(t, err) - for _, v := range resp.Results { - t.Logf("permission: %s", v.Name) - } -} - -func testInit(t *testing.T) (*server.TestEdgeClient, func()) { +func testInit() (*server.TestEdgeClient, func()) { return client, func() {} } func testRunner(t *testing.T, tcs []*TestCase) { - client, cleanup := testInit(t) + client, cleanup := testInit() t.Cleanup(cleanup) ctx := context.Background() @@ -129,66 +90,6 @@ func testRunner(t *testing.T, tcs []*TestCase) { func runTestCase(ctx context.Context, t *testing.T, tc *TestCase) func(proto.Message) { switch req := tc.Req.(type) { - case *dsr2.GetObjectRequest: - resp, err := client.V2.Reader.GetObject(ctx, req) - return tc.Checks(t, resp, err) - - case *dsw2.SetObjectRequest: - resp, err := client.V2.Writer.SetObject(ctx, req) - return tc.Checks(t, resp, err) - - case *dsw2.DeleteObjectRequest: - resp, err := client.V2.Writer.DeleteObject(ctx, req) - return tc.Checks(t, resp, err) - - case *dsr2.GetObjectTypeRequest: - resp, err := client.V2.Reader.GetObjectType(ctx, req) - return tc.Checks(t, resp, err) - - case *dsw2.SetObjectTypeRequest: - resp, err := client.V2.Writer.SetObjectType(ctx, req) - return tc.Checks(t, resp, err) - - case *dsw2.DeleteObjectTypeRequest: - resp, err := client.V2.Writer.DeleteObjectType(ctx, req) - return tc.Checks(t, resp, err) - - case *dsr2.GetPermissionRequest: - resp, err := client.V2.Reader.GetPermission(ctx, req) - return tc.Checks(t, resp, err) - - case *dsw2.SetPermissionRequest: - resp, err := client.V2.Writer.SetPermission(ctx, req) - return tc.Checks(t, resp, err) - - case *dsw2.DeletePermissionRequest: - resp, err := client.V2.Writer.DeletePermission(ctx, req) - return tc.Checks(t, resp, err) - - case *dsr2.GetRelationRequest: - resp, err := client.V2.Reader.GetRelation(ctx, req) - return tc.Checks(t, resp, err) - - case *dsw2.SetRelationRequest: - resp, err := client.V2.Writer.SetRelation(ctx, req) - return tc.Checks(t, resp, err) - - case *dsw2.DeleteRelationRequest: - resp, err := client.V2.Writer.DeleteRelation(ctx, req) - return tc.Checks(t, resp, err) - - case *dsr2.GetRelationTypeRequest: - resp, err := client.V2.Reader.GetRelationType(ctx, req) - return tc.Checks(t, resp, err) - - case *dsw2.SetRelationTypeRequest: - resp, err := client.V2.Writer.SetRelationType(ctx, req) - return tc.Checks(t, resp, err) - - case *dsw2.DeleteRelationTypeRequest: - resp, err := client.V2.Writer.DeleteRelationType(ctx, req) - return tc.Checks(t, resp, err) - // V3 /////////////////////////////////////////////////////////////// case *dsr3.GetObjectRequest: