Skip to content

Commit ea23a30

Browse files
authored
fix: import with schema=false (#510)
1 parent 80de266 commit ea23a30

8 files changed

Lines changed: 108 additions & 6 deletions
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
definition user {}
2+
3+
definition resource {
4+
relation user: user
5+
permission view = user
6+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
---
2+
# different than relations-only-schema.zed
3+
schema: |-
4+
definition new {}
5+
6+
definition resource {
7+
relation viewer: new
8+
permission view = viewer
9+
}
10+
11+
relationships: >-
12+
resource:1#user@user:1
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
---
2+
relationships: >-
3+
resource:1#user@user:1

internal/cmd/import.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ func registerImportCmd(rootCmd *cobra.Command) {
7676

7777
func importCmdFunc(cmd *cobra.Command, schemaClient v1.SchemaServiceClient, relationshipsClient v1.PermissionsServiceClient, prefix, filename string) error {
7878
prefix = strings.TrimRight(prefix, "/")
79-
p, err := decode.ValidationFileFromFilename(filename, decode.FileTypeYaml)
79+
p, err := decode.ValidationFileFromFilename(filename, decode.FileTypeYaml, false)
8080
if err != nil {
8181
return err
8282
}

internal/cmd/import_test.go

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package cmd
22

33
import (
4+
"os"
45
"path/filepath"
56
"testing"
67

@@ -69,6 +70,9 @@ func TestImportCmd(t *testing.T) {
6970
}()
7071
conn, err := srv.GRPCDialContext(ctx)
7172
require.NoError(err)
73+
t.Cleanup(func() {
74+
conn.Close()
75+
})
7276

7377
c, err := zedtesting.ClientFromConn(conn)(cmd)
7478
require.NoError(err)
@@ -98,3 +102,80 @@ func TestImportCmd(t *testing.T) {
98102
})
99103
}
100104
}
105+
106+
func TestImportCmdRelationsOnly(t *testing.T) {
107+
cmd := zedtesting.CreateTestCobraCommandWithFlagValue(t,
108+
zedtesting.StringFlag{FlagName: "schema-definition-prefix"},
109+
zedtesting.BoolFlag{FlagName: "schema", FlagValue: false},
110+
zedtesting.BoolFlag{FlagName: "relationships", FlagValue: true},
111+
zedtesting.IntFlag{FlagName: "batch-size", FlagValue: 100},
112+
zedtesting.IntFlag{FlagName: "workers", FlagValue: 1},
113+
)
114+
115+
// Set up client
116+
ctx := t.Context()
117+
srv := zedtesting.NewTestServer(ctx, t)
118+
go func() {
119+
assert.NoError(t, srv.Run(ctx))
120+
}()
121+
conn, err := srv.GRPCDialContext(ctx)
122+
require.NoError(t, err)
123+
t.Cleanup(func() {
124+
conn.Close()
125+
})
126+
127+
c, err := zedtesting.ClientFromConn(conn)(cmd)
128+
require.NoError(t, err)
129+
130+
// Write the schema out-of-band so that the import is hitting a realized schema
131+
schemaBytes, err := os.ReadFile(filepath.Join("import-test", "relations-only-schema.zed"))
132+
require.NoError(t, err)
133+
_, err = c.WriteSchema(ctx, &v1.WriteSchemaRequest{
134+
Schema: string(schemaBytes),
135+
})
136+
require.NoError(t, err)
137+
138+
t.Run("with no schema or schemaFile key in yaml", func(t *testing.T) {
139+
f := filepath.Join("import-test", "relations-only-validation-file.yaml")
140+
err = importCmdFunc(cmd, c, c, "", f)
141+
require.NoError(t, err)
142+
143+
// Run a check with full consistency to see whether the relationships were written
144+
resp, err := c.CheckPermission(ctx, &v1.CheckPermissionRequest{
145+
Consistency: fullyConsistent,
146+
Subject: &v1.SubjectReference{Object: &v1.ObjectReference{ObjectType: "user", ObjectId: "1"}},
147+
Permission: "view",
148+
Resource: &v1.ObjectReference{ObjectType: "resource", ObjectId: "1"},
149+
})
150+
require.NoError(t, err)
151+
require.Equal(t, v1.CheckPermissionResponse_PERMISSIONSHIP_HAS_PERMISSION, resp.Permissionship)
152+
153+
// Run a ReadSchema to assert the schema was NOT written
154+
schemaResp, err := c.ReadSchema(ctx, &v1.ReadSchemaRequest{})
155+
require.NoError(t, err)
156+
require.Contains(t, schemaResp.SchemaText, `relation user: user`)
157+
require.Contains(t, schemaResp.SchemaText, `permission view = user`)
158+
})
159+
t.Run("with schema present should be ignored", func(t *testing.T) {
160+
f := filepath.Join("import-test", "relations-only-validation-file-different-schema.yaml")
161+
err = importCmdFunc(cmd, c, c, "", f)
162+
require.NoError(t, err)
163+
164+
// Run a check with full consistency to see whether the relationships
165+
// and schema are written
166+
resp, err := c.CheckPermission(ctx, &v1.CheckPermissionRequest{
167+
Consistency: fullyConsistent,
168+
Subject: &v1.SubjectReference{Object: &v1.ObjectReference{ObjectType: "user", ObjectId: "1"}},
169+
Permission: "view",
170+
Resource: &v1.ObjectReference{ObjectType: "resource", ObjectId: "1"},
171+
})
172+
require.NoError(t, err)
173+
require.Equal(t, v1.CheckPermissionResponse_PERMISSIONSHIP_HAS_PERMISSION, resp.Permissionship)
174+
175+
// Run a ReadSchema to assert the schema was NOT written
176+
schemaResp, err := c.ReadSchema(ctx, &v1.ReadSchemaRequest{})
177+
require.NoError(t, err)
178+
require.Contains(t, schemaResp.SchemaText, `relation user: user`)
179+
require.Contains(t, schemaResp.SchemaText, `permission view = user`)
180+
})
181+
}

internal/cmd/validate.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ func validateCmdFunc(cmd *cobra.Command, filenames []string) (string, bool, erro
142142
toPrint.WriteString(filename + "\n")
143143
}
144144

145-
parsed, err := decode.ValidationFileFromFilename(filename, fileType)
145+
parsed, err := decode.ValidationFileFromFilename(filename, fileType, true)
146146
if err != nil {
147147
return "", true, err
148148
}

internal/decode/decoder.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,7 @@ func UnmarshalYAMLValidationFile(contents []byte) (*validationfile.ValidationFil
197197

198198
// ValidationFileFromFilename takes a filename and a desired/expected FileType and
199199
// returns the decoded file.
200-
func ValidationFileFromFilename(filename string, fileType FileType) (decoderResult *DecoderResult, err error) {
200+
func ValidationFileFromFilename(filename string, fileType FileType, mustDefineSchema bool) (decoderResult *DecoderResult, err error) {
201201
u, err := url.Parse(filename)
202202
if err != nil {
203203
return nil, err
@@ -231,7 +231,7 @@ func ValidationFileFromFilename(filename string, fileType FileType) (decoderResu
231231
schemaFilePresent := parsed.SchemaFile != ""
232232

233233
// Ensure that either schema or schemaFile is present
234-
if !schemaPresent && !schemaFilePresent {
234+
if mustDefineSchema && !schemaPresent && !schemaFilePresent {
235235
return nil, errors.New("either schema or schemaFile must be present")
236236
}
237237

internal/decode/decoder_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -457,7 +457,7 @@ relationships: |-
457457
f := filepath.Join(dir, tt.name+".yaml")
458458
require.NoError(t, os.WriteFile(f, []byte(tt.yamlContent), 0o600))
459459

460-
vFile, err := ValidationFileFromFilename(f, FileTypeYaml)
460+
vFile, err := ValidationFileFromFilename(f, FileTypeYaml, true)
461461

462462
if tt.expectedErrText != "" {
463463
require.ErrorContains(t, err, tt.expectedErrText)
@@ -482,7 +482,7 @@ func TestValidationFileFromURLWithHTTP(t *testing.T) {
482482
serverURL := SetupTestServer(t)
483483

484484
t.Run("schema file does not get populated", func(t *testing.T) {
485-
_, err := ValidationFileFromFilename(serverURL+"/valid-with-schemaFile.zed", FileTypeYaml)
485+
_, err := ValidationFileFromFilename(serverURL+"/valid-with-schemaFile.zed", FileTypeYaml, true)
486486
require.ErrorContains(t, err, "cannot use schemaFile key")
487487
})
488488
}

0 commit comments

Comments
 (0)