From fc02736206c357b1fced9f7c5350d65b9a0a6292 Mon Sep 17 00:00:00 2001 From: Juho Makinen Date: Mon, 5 May 2025 11:00:02 +1000 Subject: [PATCH] fix: filter configs and secrets, and refetneces to them from the external schema --- common/schema/schema.go | 35 ++++++++++++++++++++++++++++---- common/schema/schema_test.go | 39 ++++++++++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+), 4 deletions(-) diff --git a/common/schema/schema.go b/common/schema/schema.go index 0564c07850..a29cbe6854 100644 --- a/common/schema/schema.go +++ b/common/schema/schema.go @@ -310,37 +310,64 @@ func (s *Schema) FilterModules(modules []RefKey) (*Schema, []RefKey) { func (s *Schema) External() *Schema { filtered := &Schema{} for _, realm := range s.Realms { - if !realm.External { + realmCopy := ftlreflect.DeepCopy(realm) + if !realmCopy.External { filtered.Realms = append( filtered.Realms, - realm.FilterByVisibility(VisibilityScopeRealm), + realmCopy.FilterByVisibility(VisibilityScopeRealm), ) } } - // strip any runtime + // strip any runtime, and unsupported decls for _, realm := range filtered.Realms { for _, module := range realm.Modules { module.Runtime = nil + var filteredDecls []Decl for _, decl := range module.Decls { switch d := decl.(type) { case *Verb: d.Runtime = nil + d.Metadata = filterExternalMetadata(d.Metadata) + filteredDecls = append(filteredDecls, d) case *Database: d.Runtime = nil + d.Metadata = filterExternalMetadata(d.Metadata) + filteredDecls = append(filteredDecls, d) case *Topic: d.Runtime = nil + d.Metadata = filterExternalMetadata(d.Metadata) + filteredDecls = append(filteredDecls, d) case *Data: + d.Metadata = filterExternalMetadata(d.Metadata) + filteredDecls = append(filteredDecls, d) case *TypeAlias: - case *Config: + d.Metadata = filterExternalMetadata(d.Metadata) + filteredDecls = append(filteredDecls, d) case *Enum: + filteredDecls = append(filteredDecls, d) + case *Config: case *Secret: } + module.Decls = filteredDecls } } } return filtered } +func filterExternalMetadata(metadata []Metadata) []Metadata { + var filtered []Metadata + for _, m := range metadata { + switch m := m.(type) { + case *MetadataConfig: + case *MetadataSecrets: + default: + filtered = append(filtered, m) + } + } + return filtered +} + // SchemaState is the schema service state as persisted in Raft // //protobuf:export diff --git a/common/schema/schema_test.go b/common/schema/schema_test.go index 04b05d5128..c57ae84dc3 100644 --- a/common/schema/schema_test.go +++ b/common/schema/schema_test.go @@ -1352,3 +1352,42 @@ func TestWithBuiltins(t *testing.T) { assert.Equal(t, schema.WithBuiltins(), schema.WithBuiltins().WithBuiltins()) }) } + +func TestExternal(t *testing.T) { + t.Run("does not include referred configs", func(t *testing.T) { + schema := &Schema{ + Realms: []*Realm{{ + Name: "foo", + Modules: []*Module{{ + Name: "bar", + Decls: []Decl{ + &Config{Name: "config", Type: &String{}}, + &Verb{ + Name: "m", + Request: &Unit{Unit: true}, + Response: &Unit{Unit: true}, + Metadata: []Metadata{&MetadataConfig{Config: []*Ref{{Module: "bar", Name: "config"}}}}, + Visibility: VisibilityScopeRealm, + }, + }, + }}, + }}, + } + assert.Equal(t, &Schema{ + Realms: []*Realm{{ + Name: "foo", + Modules: []*Module{{ + Name: "bar", + Decls: []Decl{ + &Verb{ + Name: "m", + Request: &Unit{Unit: true}, + Response: &Unit{Unit: true}, + Visibility: VisibilityScopeRealm, + }, + }, + }}, + }}, + }, schema.External()) + }) +}