Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Load the c1z once per process, and share it and the store cache across requests #35

Merged
merged 1 commit into from
Oct 12, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 16 additions & 1 deletion cmd/baton/explorer.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
"os"
"os/exec"

"github.com/conductorone/baton-sdk/pkg/dotc1z/manager"
"github.com/conductorone/baton/pkg/explorer"
"github.com/spf13/cobra"
)
Expand Down Expand Up @@ -53,6 +54,8 @@
}

func startExplorerAPI(cmd *cobra.Command) {
ctx := cmd.Context()

filePath, err := cmd.Flags().GetString("file")
if err != nil {
log.Fatal("error fetching file path", err)
Expand All @@ -68,7 +71,19 @@
log.Fatal("error fetching resourceType", err)
}

ctrl := explorer.NewController(filePath, syncID, resourceType)
m, err := manager.New(ctx, filePath)
if err != nil {
log.Fatal("error creating c1z manager", err)
}
defer m.Close(ctx)

store, err := m.LoadC1Z(ctx)
if err != nil {
log.Fatal("error loading c1z", err)

Check failure on line 82 in cmd/baton/explorer.go

View workflow job for this annotation

GitHub Actions / go-lint

exitAfterDefer: log.Fatal will exit, and `defer m.Close(ctx)` will not run (gocritic)
}
defer store.Close()

ctrl := explorer.NewController(ctx, store, syncID, resourceType)
e := ctrl.Run(":8080")
if e != nil {
log.Fatal("error running explorer", err)
Expand Down
144 changes: 36 additions & 108 deletions pkg/explorer/baton_service.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import (
"fmt"

"github.com/conductorone/baton-sdk/pkg/connectorstore"
"github.com/conductorone/baton-sdk/pkg/dotc1z/manager"
"github.com/conductorone/baton-sdk/pkg/dotc1z"
v1 "github.com/conductorone/baton/pb/baton/v1"
"github.com/conductorone/baton/pkg/storecache"

Expand All @@ -14,50 +14,37 @@ import (
)

type BatonService struct {
filePath string
syncID string
resourceType string
store *dotc1z.C1File
storeCache *storecache.StoreCache
}

func (b BatonService) GetEntitlements(ctx context.Context) (*v1.EntitlementListOutput, error) {
c1zPath := b.filePath

m, err := manager.New(ctx, c1zPath)
if err != nil {
return nil, err
}
defer m.Close(ctx)

store, err := m.LoadC1Z(ctx)
if err != nil {
return nil, err
}

func (b *BatonService) GetEntitlements(ctx context.Context) (*v1.EntitlementListOutput, error) {
var err error
if b.syncID != "" {
err = store.ViewSync(ctx, b.syncID)
err = b.store.ViewSync(ctx, b.syncID)
if err != nil {
return nil, err
}
}

sc := storecache.NewStoreCache(ctx, store)

var entitlements []*v1.EntitlementOutput
pageToken := ""
for {
req := &v2.EntitlementsServiceListEntitlementsRequest{PageToken: pageToken}

resp, err := store.ListEntitlements(ctx, req)
resp, err := b.store.ListEntitlements(ctx, req)
if err != nil {
return nil, err
}

for _, en := range resp.List {
rt, err := sc.GetResourceType(ctx, en.Resource.Id.ResourceType)
rt, err := b.storeCache.GetResourceType(ctx, en.Resource.Id.ResourceType)
if err != nil {
return nil, err
}
resource, err := sc.GetResource(ctx, en.Resource.Id)
resource, err := b.storeCache.GetResource(ctx, en.Resource.Id)
if err != nil {
return nil, err
}
Expand All @@ -81,29 +68,16 @@ func (b BatonService) GetEntitlements(ctx context.Context) (*v1.EntitlementListO
}, err
}

func (b BatonService) GetResources(ctx context.Context) (*v1.ResourceListOutput, error) {
m, err := manager.New(ctx, b.filePath)
if err != nil {
return nil, err
}
defer m.Close(ctx)

store, err := m.LoadC1Z(ctx)
func (b *BatonService) GetResources(ctx context.Context) (*v1.ResourceListOutput, error) {
err := b.store.ViewSync(ctx, "")
if err != nil {
return nil, err
}

err = store.ViewSync(ctx, "")
if err != nil {
return nil, err
}

sc := storecache.NewStoreCache(ctx, store)

var resources []*v1.ResourceOutput
pageToken := ""
for {
resp, err := store.ListResources(ctx, &v2.ResourcesServiceListResourcesRequest{
resp, err := b.store.ListResources(ctx, &v2.ResourcesServiceListResourcesRequest{
ResourceTypeId: b.resourceType,
PageToken: pageToken,
})
Expand All @@ -112,14 +86,14 @@ func (b BatonService) GetResources(ctx context.Context) (*v1.ResourceListOutput,
}

for _, r := range resp.List {
rt, err := sc.GetResourceType(ctx, r.Id.ResourceType)
rt, err := b.storeCache.GetResourceType(ctx, r.Id.ResourceType)
if err != nil {
return nil, err
}
var parent *v2.Resource

if r.ParentResourceId != nil {
parent, err = sc.GetResource(ctx, r.ParentResourceId)
parent, err = b.storeCache.GetResource(ctx, r.ParentResourceId)
if err != nil {
return nil, err
}
Expand All @@ -144,20 +118,11 @@ func (b BatonService) GetResources(ctx context.Context) (*v1.ResourceListOutput,
}, nil
}

func (b BatonService) GetResourceTypes(ctx context.Context) (*v1.ResourceTypeListOutput, error) {
m, err := manager.New(ctx, b.filePath)
if err != nil {
return nil, err
}
defer m.Close(ctx)

store, err := m.LoadC1Z(ctx)
if err != nil {
return nil, err
}
func (b *BatonService) GetResourceTypes(ctx context.Context) (*v1.ResourceTypeListOutput, error) {
var err error

if b.syncID != "" {
err = store.ViewSync(ctx, b.syncID)
err = b.store.ViewSync(ctx, b.syncID)
if err != nil {
return nil, err
}
Expand All @@ -166,7 +131,7 @@ func (b BatonService) GetResourceTypes(ctx context.Context) (*v1.ResourceTypeLis
var resourceTypes []*v1.ResourceTypeOutput
pageToken := ""
for {
resp, err := store.ListResourceTypes(ctx, &v2.ResourceTypesServiceListResourceTypesRequest{PageToken: pageToken})
resp, err := b.store.ListResourceTypes(ctx, &v2.ResourceTypesServiceListResourceTypesRequest{PageToken: pageToken})
if err != nil {
return nil, err
}
Expand All @@ -187,21 +152,8 @@ func (b BatonService) GetResourceTypes(ctx context.Context) (*v1.ResourceTypeLis
}, nil
}

func (b BatonService) GetAccess(ctx context.Context, resourceType, resourceID string) (*v1.ResourceAccessListOutput, error) {
m, err := manager.New(ctx, b.filePath)
if err != nil {
return nil, err
}
defer m.Close(ctx)

store, err := m.LoadC1Z(ctx)
if err != nil {
return nil, err
}

sc := storecache.NewStoreCache(ctx, store)

principal, err := sc.GetResource(ctx, &v2.ResourceId{
func (b *BatonService) GetAccess(ctx context.Context, resourceType, resourceID string) (*v1.ResourceAccessListOutput, error) {
principal, err := b.storeCache.GetResource(ctx, &v2.ResourceId{
ResourceType: resourceType,
Resource: resourceID,
})
Expand All @@ -212,7 +164,7 @@ func (b BatonService) GetAccess(ctx context.Context, resourceType, resourceID st
var entitlements []*v2.Entitlement
pageToken := ""
for {
resp, err := store.ListGrants(ctx, &v2.GrantsServiceListGrantsRequest{
resp, err := b.store.ListGrants(ctx, &v2.GrantsServiceListGrantsRequest{
PageToken: pageToken,
})
if err != nil {
Expand All @@ -221,7 +173,7 @@ func (b BatonService) GetAccess(ctx context.Context, resourceType, resourceID st

for _, g := range resp.List {
if g.Principal.Id.ResourceType == resourceType && g.Principal.Id.Resource == resourceID {
en, err := sc.GetEntitlement(ctx, g.Entitlement.Id)
en, err := b.storeCache.GetEntitlement(ctx, g.Entitlement.Id)
if err != nil {
return nil, err
}
Expand All @@ -244,12 +196,12 @@ func (b BatonService) GetAccess(ctx context.Context, resourceType, resourceID st
if rAccess, ok := entitlementsByResource[rKey]; ok {
accessOutput = rAccess
} else {
resource, err := sc.GetResource(ctx, en.Resource.Id)
resource, err := b.storeCache.GetResource(ctx, en.Resource.Id)
if err != nil {
return nil, err
}

rType, err := sc.GetResourceType(ctx, en.Resource.Id.ResourceType)
rType, err := b.storeCache.GetResourceType(ctx, en.Resource.Id.ResourceType)
if err != nil {
return nil, err
}
Expand All @@ -275,26 +227,15 @@ func (b BatonService) GetAccess(ctx context.Context, resourceType, resourceID st
}, nil
}

func (b BatonService) GetResourceById(ctx context.Context, resourceType, resourceID string) (*v1.ResourceOutput, error) {
m, err := manager.New(ctx, b.filePath)
if err != nil {
return nil, err
}
defer m.Close(ctx)

store, err := m.LoadC1Z(ctx)
if err != nil {
return nil, err
}
func (b *BatonService) GetResourceById(ctx context.Context, resourceType, resourceID string) (*v1.ResourceOutput, error) {
var err error

err = store.ViewSync(ctx, "")
err = b.store.ViewSync(ctx, "")
if err != nil {
return nil, err
}

sc := storecache.NewStoreCache(ctx, store)

r, err := sc.GetResource(ctx, &v2.ResourceId{
r, err := b.storeCache.GetResource(ctx, &v2.ResourceId{
ResourceType: resourceType,
Resource: resourceID,
})
Expand All @@ -303,7 +244,7 @@ func (b BatonService) GetResourceById(ctx context.Context, resourceType, resourc
return nil, err
}

rt, err := sc.GetResourceType(ctx, resourceType)
rt, err := b.storeCache.GetResourceType(ctx, resourceType)
if err != nil {
return nil, err
}
Expand Down Expand Up @@ -353,29 +294,16 @@ type ResourceAccessListOutput struct {
PrincipalAccess []*ResourceAccessOutput `protobuf:"bytes,3,rep,name=access,proto3" json:"access,omitempty"`
}

func (b BatonService) GetAccessForResource(ctx context.Context, resourceType, resourceID string) (*ResourceAccessListOutput, error) {
m, err := manager.New(ctx, b.filePath)
if err != nil {
return nil, err
}
defer m.Close(ctx)

store, err := m.LoadC1Z(ctx)
if err != nil {
return nil, err
}

sc := storecache.NewStoreCache(ctx, store)

grantResource, err := sc.GetResource(ctx, &v2.ResourceId{
func (b *BatonService) GetAccessForResource(ctx context.Context, resourceType, resourceID string) (*ResourceAccessListOutput, error) {
grantResource, err := b.storeCache.GetResource(ctx, &v2.ResourceId{
ResourceType: resourceType,
Resource: resourceID,
})
if err != nil {
return nil, err
}

grantResourceType, err := sc.GetResourceType(ctx, resourceType)
grantResourceType, err := b.storeCache.GetResourceType(ctx, resourceType)

if err != nil {
return nil, err
Expand All @@ -384,7 +312,7 @@ func (b BatonService) GetAccessForResource(ctx context.Context, resourceType, re
var resourceGrants []*v2.Grant
pageToken := ""
for {
grants, nextToken, err := listGrantsForResourceType(ctx, store, pageToken, resourceType)
grants, nextToken, err := listGrantsForResourceType(ctx, b.store, pageToken, resourceType)
if err != nil {
return nil, err
}
Expand All @@ -410,12 +338,12 @@ func (b BatonService) GetAccessForResource(ctx context.Context, resourceType, re
if rAccess, ok := grantsByResource[rKey]; ok {
accessOutput = rAccess
} else {
resource, err := sc.GetResource(ctx, g.Principal.Id)
resource, err := b.storeCache.GetResource(ctx, g.Principal.Id)
if err != nil {
return nil, err
}

rType, err := sc.GetResourceType(ctx, g.Principal.Id.ResourceType)
rType, err := b.storeCache.GetResourceType(ctx, g.Principal.Id.ResourceType)
if err != nil {
return nil, err
}
Expand All @@ -426,7 +354,7 @@ func (b BatonService) GetAccessForResource(ctx context.Context, resourceType, re
}
}

en, err := sc.GetEntitlement(ctx, g.Entitlement.Id)
en, err := b.storeCache.GetEntitlement(ctx, g.Entitlement.Id)
if err != nil {
return nil, err
}
Expand Down
13 changes: 9 additions & 4 deletions pkg/explorer/controller.go
Original file line number Diff line number Diff line change
@@ -1,16 +1,21 @@
package explorer

import (
"context"

"github.com/conductorone/baton-sdk/pkg/dotc1z"
"github.com/conductorone/baton/pkg/storecache"
"github.com/gin-gonic/gin"
)

type Controller struct {
baton BatonService
baton *BatonService
}

func NewController(filePath, syncID, resourceType string) Controller {
return Controller{BatonService{
filePath: filePath,
func NewController(ctx context.Context, store *dotc1z.C1File, syncID, resourceType string) Controller {
return Controller{&BatonService{
storeCache: storecache.NewStoreCache(ctx, store),
store: store,
syncID: syncID,
resourceType: resourceType,
}}
Expand Down
Loading