5
5
_ "embed"
6
6
"log"
7
7
8
+ "github.com/authzed/spicedb/pkg/tuple"
9
+
8
10
"google.golang.org/protobuf/encoding/protojson"
9
11
10
12
"golang.org/x/xerrors"
@@ -28,7 +30,7 @@ var _ = v1.NewSchemaServiceClient
28
30
//go:embed schema.zed
29
31
var schema string
30
32
31
- func DB (ctx context.Context ) error {
33
+ func RunExample (ctx context.Context ) error {
32
34
srv , err := newServer (ctx )
33
35
if err != nil {
34
36
return err
@@ -48,61 +50,44 @@ func DB(ctx context.Context) error {
48
50
}()
49
51
50
52
_ , err = schemaSrv .WriteSchema (ctx , & v1.WriteSchemaRequest {
51
- Schema : `definition user {}
52
- definition resource {
53
- relation viewer: user
54
- permission view = viewer
55
- }` ,
53
+ Schema : schema ,
56
54
})
57
55
if err != nil {
58
56
return err
59
57
}
60
58
61
- resp , err := permSrv .WriteRelationships (ctx , & v1.WriteRelationshipsRequest {Updates : []* v1.RelationshipUpdate {
62
- {
63
- Operation : v1 .RelationshipUpdate_OPERATION_TOUCH ,
64
- Relationship : & v1.Relationship {
65
- Resource : & v1.ObjectReference {
66
- ObjectId : "my_book" ,
67
- ObjectType : "resource" ,
68
- },
69
- Relation : "viewer" ,
70
- Subject : & v1.SubjectReference {
71
- Object : & v1.ObjectReference {
72
- ObjectId : "john_doe" ,
73
- ObjectType : "user" ,
74
- },
75
- },
76
- },
77
- },
78
- }})
59
+ token , err := populateRelationships (ctx , permSrv )
79
60
if err != nil {
80
61
return err
81
62
}
82
63
83
- token := resp .GetWrittenAt ()
64
+ permsToCheck := []string {
65
+ "workspace:dogfood#view@user:root" ,
66
+ "workspace:dogfood#view@user:alice" ,
67
+ "workspace:dogfood#view@user:charlie" ,
68
+ "workspace:dogfood#view@user:gopher" ,
69
+ "workspace_build:dogfood-build#view@user:gopher" ,
70
+ // Look for cache hits?
71
+ "workspace_build:dogfood-build#view@user:gopher" ,
72
+ }
84
73
85
- for i := 0 ; i < 10 ; i ++ {
74
+ for _ , perm := range permsToCheck {
75
+ tup := tuple .Parse (perm )
76
+ r := tuple .ToRelationship (tup )
77
+
78
+ // Add debug information to the request so we can see the trace of the check.
86
79
var trailerMD metadata.MD
87
80
ctx = requestmeta .AddRequestHeaders (ctx , requestmeta .RequestDebugInformation )
88
81
checkResp , err := permSrv .CheckPermission (ctx , & v1.CheckPermissionRequest {
89
82
Permission : "view" ,
90
83
Consistency : & v1.Consistency {Requirement : & v1.Consistency_AtLeastAsFresh {AtLeastAsFresh : token }},
91
- Resource : & v1.ObjectReference {
92
- ObjectId : "my_book" ,
93
- ObjectType : "resource" ,
94
- },
95
- Subject : & v1.SubjectReference {
96
- Object : & v1.ObjectReference {
97
- ObjectId : "john_doe" ,
98
- ObjectType : "user" ,
99
- },
100
- },
84
+ Resource : r .Resource ,
85
+ Subject : r .Subject ,
101
86
}, grpc .Trailer (& trailerMD ))
102
87
if err != nil {
103
88
log .Fatal ("unable to issue PermissionCheck: %w" , err )
104
89
} else {
105
-
90
+ log . Printf ( "check result (%s): %s" , perm , checkResp . Permissionship . String ())
106
91
// All this debug stuff just shows the trace of the check
107
92
// with information like cache hits.
108
93
found , err := responsemeta .GetResponseTrailerMetadata (trailerMD , responsemeta .DebugInformation )
@@ -123,14 +108,53 @@ func DB(ctx context.Context) error {
123
108
DisplayCheckTrace (debugInfo .Check , tp , false )
124
109
tp .Print ()
125
110
}
126
-
127
111
}
128
- log .Printf ("check result: %s" , checkResp .Permissionship .String ())
129
112
}
130
113
131
114
return nil
132
115
}
133
116
117
+ func populateRelationships (ctx context.Context , permSrv v1.PermissionsServiceClient ) (* v1.ZedToken , error ) {
118
+ // Write in a workspace
119
+ relationships := []string {
120
+ "platform:default#administrator@user:root" ,
121
+
122
+ //"Dogfood" workspace owned by "Alice" with the group "developers"
123
+ "workspace:dogfood#owner@user:alice" ,
124
+ "workspace_build:dogfood-build#workspace@workspace:dogfood" ,
125
+ "workspace:dogfood#platform@platform:default" ,
126
+ "workspace:dogfood#group@group:developers" ,
127
+
128
+ //Group middle-class is in group developers
129
+ "group:developers#direct_member@user:bob" ,
130
+ "group:back-end#direct_member@user:charlie" ,
131
+ "group:golang#direct_member@user:gopher" ,
132
+ "group:developers#child_group@group:back-end" ,
133
+ "group:developers#child_group@group:front-end" ,
134
+ "group:back-end#child_group@group:golang" ,
135
+ "group:back-end#child_group@group:sql" ,
136
+ }
137
+
138
+ var token * v1.ZedToken
139
+ for _ , rel := range relationships {
140
+ tup := tuple .Parse (rel )
141
+ v1Rel := tuple .ToRelationship (tup )
142
+
143
+ resp , err := permSrv .WriteRelationships (ctx , & v1.WriteRelationshipsRequest {Updates : []* v1.RelationshipUpdate {
144
+ {
145
+ Operation : v1 .RelationshipUpdate_OPERATION_TOUCH ,
146
+ Relationship : v1Rel ,
147
+ },
148
+ }})
149
+ if err != nil {
150
+ return nil , err
151
+ }
152
+ token = resp .GetWrittenAt ()
153
+ }
154
+
155
+ return token , nil
156
+ }
157
+
134
158
func newServer (ctx context.Context ) (server.RunnableServer , error ) {
135
159
ds , err := datastore .NewDatastore (ctx ,
136
160
datastore .DefaultDatastoreConfig ().ToOption (),
@@ -162,9 +186,25 @@ func newServer(ctx context.Context) (server.RunnableServer, error) {
162
186
server .WithMetricsAPI (util.HTTPServerConfig {
163
187
HTTPAddress : "localhost:50000" ,
164
188
HTTPEnabled : true }),
165
- server .WithDispatchCacheConfig (server.CacheConfig {Enabled : true , Metrics : true }),
166
- server .WithNamespaceCacheConfig (server.CacheConfig {Enabled : true , Metrics : true }),
167
- server .WithClusterDispatchCacheConfig (server.CacheConfig {Enabled : true , Metrics : true }),
189
+ //server.WithDispatchCacheConfig(server.CacheConfig{
190
+ // Name: "DispatchCache",
191
+ // Metrics: true,
192
+ // Enabled: true,
193
+ //}),
194
+ //server.WithNamespaceCacheConfig(server.CacheConfig{
195
+ // Name: "NamespaceCache",
196
+ // //MaxCost: "",
197
+ // //NumCounters: 0,
198
+ // Metrics: true,
199
+ // Enabled: true,
200
+ //}),
201
+ //server.WithClusterDispatchCacheConfig(server.CacheConfig{
202
+ // Name: "ClusterCache",
203
+ // //MaxCost: "",
204
+ // //NumCounters: 0,
205
+ // Metrics: true,
206
+ // Enabled: true,
207
+ //}),
168
208
server .WithDatastore (ds ),
169
209
server .WithDispatchClientMetricsPrefix ("coder_client" ),
170
210
server .WithDispatchClientMetricsEnabled (true ),
0 commit comments