-
Notifications
You must be signed in to change notification settings - Fork 12
Expand file tree
/
Copy pathmain.go
More file actions
125 lines (111 loc) · 3.38 KB
/
Copy pathmain.go
File metadata and controls
125 lines (111 loc) · 3.38 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
package main
import (
"context"
"fmt"
"log"
v1 "github.com/authzed/authzed-go/proto/authzed/api/v1"
"github.com/authzed/spicedb/pkg/cmd/datastore"
"github.com/authzed/spicedb/pkg/cmd/server"
"github.com/authzed/spicedb/pkg/cmd/util"
"golang.org/x/sync/errgroup"
)
func main() {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
server, err := newSpiceDBServer(ctx)
if err != nil {
log.Fatal("unable to configure server: ", err)
}
var wg errgroup.Group
wg.Go(func() error {
if err := server.Run(ctx); err != nil {
log.Print("error while running server: ", err)
return err
}
return nil
})
conn, err := server.GRPCDialContext(ctx)
if err != nil || conn == nil {
log.Fatal("unable to get gRPC connection: ", err)
}
schemaSrv := v1.NewSchemaServiceClient(conn)
permSrv := v1.NewPermissionsServiceClient(conn)
_, err = schemaSrv.WriteSchema(ctx, &v1.WriteSchemaRequest{
Schema: `definition user {}
definition resource {
relation viewer: user
permission view = viewer
}`,
})
if err != nil {
log.Fatal("unable to write schema: ", err)
}
resp, err := permSrv.WriteRelationships(ctx, &v1.WriteRelationshipsRequest{Updates: []*v1.RelationshipUpdate{
{
Operation: v1.RelationshipUpdate_OPERATION_CREATE,
Relationship: &v1.Relationship{
Resource: &v1.ObjectReference{
ObjectId: "my_book",
ObjectType: "resource",
},
Relation: "viewer",
Subject: &v1.SubjectReference{
Object: &v1.ObjectReference{
ObjectId: "john_doe",
ObjectType: "user",
},
},
},
},
}})
if err != nil {
log.Fatal("unable to write relationships: ", err)
}
token := resp.GetWrittenAt()
checkResp, err := permSrv.CheckPermission(ctx, &v1.CheckPermissionRequest{
Permission: "view",
Consistency: &v1.Consistency{Requirement: &v1.Consistency_AtLeastAsFresh{AtLeastAsFresh: token}},
Resource: &v1.ObjectReference{
ObjectId: "my_book",
ObjectType: "resource",
},
Subject: &v1.SubjectReference{
Object: &v1.ObjectReference{
ObjectId: "john_doe",
ObjectType: "user",
},
},
})
if err != nil {
log.Fatal("unable to issue PermissionCheck: ", err)
}
log.Printf("check result: %s", checkResp.Permissionship.String())
cancel()
wg.Wait()
}
func newSpiceDBServer(ctx context.Context) (server.RunnableServer, error) {
ds, err := datastore.NewDatastore(ctx,
datastore.DefaultDatastoreConfig().ToOption(),
datastore.WithRequestHedgingEnabled(false),
)
if err != nil {
return nil, fmt.Errorf("unable to start memdb datastore: %s", err)
}
configOpts := []server.ConfigOption{
server.WithGRPCServer(util.GRPCServerConfig{
Network: util.BufferedNetwork,
Enabled: true,
}),
server.WithGRPCAuthFunc(func(ctx context.Context) (context.Context, error) {
return ctx, nil
}),
server.WithHTTPGateway(util.HTTPServerConfig{HTTPEnabled: false}),
server.WithMetricsAPI(util.HTTPServerConfig{HTTPEnabled: false}),
// disable caching since it's all in memory
server.WithDispatchCacheConfig(server.CacheConfig{Enabled: false, Metrics: false}),
server.WithNamespaceCacheConfig(server.CacheConfig{Enabled: false, Metrics: false}),
server.WithClusterDispatchCacheConfig(server.CacheConfig{Enabled: false, Metrics: false}),
server.WithDatastore(ds),
}
return server.NewConfigWithOptionsAndDefaults(configOpts...).Complete(ctx)
}