diff --git a/server/automation/envoy/store_encode.gen.go b/server/automation/envoy/store_encode.gen.go index 30a4f3b6ea..d83351a813 100644 --- a/server/automation/envoy/store_encode.gen.go +++ b/server/automation/envoy/store_encode.gen.go @@ -201,16 +201,9 @@ func (e StoreEncoder) encodeWorkflow(ctx context.Context, p envoyx.EncodeParams, var auxID uint64 err = func() (err error) { for fieldLabel, ref := range n.References { - rn := tree.ParentForRef(n, ref) - if rn == nil { - err = fmt.Errorf("parent reference %v not found", ref) - return - } - - auxID = rn.Resource.GetID() + auxID = safeParentID(tree, n, ref) if auxID == 0 { - err = fmt.Errorf("parent reference does not provide an identifier") - return + continue } err = n.Resource.SetValue(fieldLabel, 0, auxID) @@ -414,16 +407,9 @@ func (e StoreEncoder) encodeTrigger(ctx context.Context, p envoyx.EncodeParams, var auxID uint64 err = func() (err error) { for fieldLabel, ref := range n.References { - rn := tree.ParentForRef(n, ref) - if rn == nil { - err = fmt.Errorf("parent reference %v not found", ref) - return - } - - auxID = rn.Resource.GetID() + auxID = safeParentID(tree, n, ref) if auxID == 0 { - err = fmt.Errorf("parent reference does not provide an identifier") - return + continue } err = n.Resource.SetValue(fieldLabel, 0, auxID) @@ -560,3 +546,12 @@ func (e StoreEncoder) getScopeNodes(ctx context.Context, s store.Storer, nn envo return } + +func safeParentID(tt envoyx.Traverser, n *envoyx.Node, ref envoyx.Ref) (out uint64) { + rn := tt.ParentForRef(n, ref) + if rn == nil { + return + } + + return rn.Resource.GetID() +} diff --git a/server/automation/envoy/yaml_encode.gen.go b/server/automation/envoy/yaml_encode.gen.go index c971e58276..04fce68475 100644 --- a/server/automation/envoy/yaml_encode.gen.go +++ b/server/automation/envoy/yaml_encode.gen.go @@ -346,3 +346,12 @@ func (e YamlEncoder) getWriter(p envoyx.EncodeParams) (out io.Writer, err error) err = errors.Errorf("YAML encoder expects a writer conforming to io.Writer interface") return } + +func safeParentIdentifier(tt envoyx.Traverser, n *envoyx.Node, ref envoyx.Ref) (out string) { + aux := tt.ParentForRef(n, ref) + if aux == nil { + return ref.Identifiers.FriendlyIdentifier() + } + + return aux.Identifiers.FriendlyIdentifier() +} diff --git a/server/codegen/assets/templates/gocode/envoy/store_encode.go.tpl b/server/codegen/assets/templates/gocode/envoy/store_encode.go.tpl index ed15d601cd..e9834b49ad 100644 --- a/server/codegen/assets/templates/gocode/envoy/store_encode.go.tpl +++ b/server/codegen/assets/templates/gocode/envoy/store_encode.go.tpl @@ -215,16 +215,9 @@ func (e StoreEncoder) encode{{.expIdent}}(ctx context.Context, p envoyx.EncodePa var auxID uint64 err = func() (err error) { for fieldLabel, ref := range n.References { - rn := tree.ParentForRef(n, ref) - if rn == nil { - err = fmt.Errorf("parent reference %v not found", ref) - return - } - - auxID = rn.Resource.GetID() + auxID = safeParentID(tree, n, ref) if auxID == 0 { - err = fmt.Errorf("parent reference does not provide an identifier") - return + continue } err = n.Resource.SetValue(fieldLabel, 0, auxID) @@ -508,4 +501,13 @@ func (e StoreEncoder) makeNamespaceFilter(scope *envoyx.Node, refs map[string]*e return } -{{ end }} \ No newline at end of file +{{ end }} + +func safeParentID(tt envoyx.Traverser, n *envoyx.Node, ref envoyx.Ref) (out uint64) { + rn := tt.ParentForRef(n, ref) + if rn == nil { + return + } + + return rn.Resource.GetID() +} diff --git a/server/codegen/assets/templates/gocode/envoy/yaml_encode.go.tpl b/server/codegen/assets/templates/gocode/envoy/yaml_encode.go.tpl index 9a40dc3522..4222d6eebe 100644 --- a/server/codegen/assets/templates/gocode/envoy/yaml_encode.go.tpl +++ b/server/codegen/assets/templates/gocode/envoy/yaml_encode.go.tpl @@ -294,3 +294,12 @@ func (e YamlEncoder) getWriter(p envoyx.EncodeParams) (out io.Writer, err error) err = errors.Errorf("YAML encoder expects a writer conforming to io.Writer interface") return } + +func safeParentIdentifier(tt envoyx.Traverser, n *envoyx.Node, ref envoyx.Ref) (out string) { + aux := tt.ParentForRef(n, ref) + if aux == nil { + return ref.Identifiers.FriendlyIdentifier() + } + + return aux.Identifiers.FriendlyIdentifier() +} diff --git a/server/compose/envoy/store_encode.gen.go b/server/compose/envoy/store_encode.gen.go index a3b350dc4f..0bb4b37ed7 100644 --- a/server/compose/envoy/store_encode.gen.go +++ b/server/compose/envoy/store_encode.gen.go @@ -221,16 +221,9 @@ func (e StoreEncoder) encodeChart(ctx context.Context, p envoyx.EncodeParams, s var auxID uint64 err = func() (err error) { for fieldLabel, ref := range n.References { - rn := tree.ParentForRef(n, ref) - if rn == nil { - err = fmt.Errorf("parent reference %v not found", ref) - return - } - - auxID = rn.Resource.GetID() + auxID = safeParentID(tree, n, ref) if auxID == 0 { - err = fmt.Errorf("parent reference does not provide an identifier") - return + continue } err = n.Resource.SetValue(fieldLabel, 0, auxID) @@ -440,16 +433,9 @@ func (e StoreEncoder) encodeModule(ctx context.Context, p envoyx.EncodeParams, s var auxID uint64 err = func() (err error) { for fieldLabel, ref := range n.References { - rn := tree.ParentForRef(n, ref) - if rn == nil { - err = fmt.Errorf("parent reference %v not found", ref) - return - } - - auxID = rn.Resource.GetID() + auxID = safeParentID(tree, n, ref) if auxID == 0 { - err = fmt.Errorf("parent reference does not provide an identifier") - return + continue } err = n.Resource.SetValue(fieldLabel, 0, auxID) @@ -674,16 +660,9 @@ func (e StoreEncoder) encodeModuleField(ctx context.Context, p envoyx.EncodePara var auxID uint64 err = func() (err error) { for fieldLabel, ref := range n.References { - rn := tree.ParentForRef(n, ref) - if rn == nil { - err = fmt.Errorf("parent reference %v not found", ref) - return - } - - auxID = rn.Resource.GetID() + auxID = safeParentID(tree, n, ref) if auxID == 0 { - err = fmt.Errorf("parent reference does not provide an identifier") - return + continue } err = n.Resource.SetValue(fieldLabel, 0, auxID) @@ -896,16 +875,9 @@ func (e StoreEncoder) encodeNamespace(ctx context.Context, p envoyx.EncodeParams var auxID uint64 err = func() (err error) { for fieldLabel, ref := range n.References { - rn := tree.ParentForRef(n, ref) - if rn == nil { - err = fmt.Errorf("parent reference %v not found", ref) - return - } - - auxID = rn.Resource.GetID() + auxID = safeParentID(tree, n, ref) if auxID == 0 { - err = fmt.Errorf("parent reference does not provide an identifier") - return + continue } err = n.Resource.SetValue(fieldLabel, 0, auxID) @@ -1132,16 +1104,9 @@ func (e StoreEncoder) encodePage(ctx context.Context, p envoyx.EncodeParams, s s var auxID uint64 err = func() (err error) { for fieldLabel, ref := range n.References { - rn := tree.ParentForRef(n, ref) - if rn == nil { - err = fmt.Errorf("parent reference %v not found", ref) - return - } - - auxID = rn.Resource.GetID() + auxID = safeParentID(tree, n, ref) if auxID == 0 { - err = fmt.Errorf("parent reference does not provide an identifier") - return + continue } err = n.Resource.SetValue(fieldLabel, 0, auxID) @@ -1356,16 +1321,9 @@ func (e StoreEncoder) encodePageLayout(ctx context.Context, p envoyx.EncodeParam var auxID uint64 err = func() (err error) { for fieldLabel, ref := range n.References { - rn := tree.ParentForRef(n, ref) - if rn == nil { - err = fmt.Errorf("parent reference %v not found", ref) - return - } - - auxID = rn.Resource.GetID() + auxID = safeParentID(tree, n, ref) if auxID == 0 { - err = fmt.Errorf("parent reference does not provide an identifier") - return + continue } err = n.Resource.SetValue(fieldLabel, 0, auxID) @@ -1583,3 +1541,12 @@ func (e StoreEncoder) makeNamespaceFilter(scope *envoyx.Node, refs map[string]*e return } + +func safeParentID(tt envoyx.Traverser, n *envoyx.Node, ref envoyx.Ref) (out uint64) { + rn := tt.ParentForRef(n, ref) + if rn == nil { + return + } + + return rn.Resource.GetID() +} diff --git a/server/compose/envoy/yaml_encode.gen.go b/server/compose/envoy/yaml_encode.gen.go index 93240e4ab2..701997a9d3 100644 --- a/server/compose/envoy/yaml_encode.gen.go +++ b/server/compose/envoy/yaml_encode.gen.go @@ -710,3 +710,12 @@ func (e YamlEncoder) getWriter(p envoyx.EncodeParams) (out io.Writer, err error) err = errors.Errorf("YAML encoder expects a writer conforming to io.Writer interface") return } + +func safeParentIdentifier(tt envoyx.Traverser, n *envoyx.Node, ref envoyx.Ref) (out string) { + aux := tt.ParentForRef(n, ref) + if aux == nil { + return ref.Identifiers.FriendlyIdentifier() + } + + return aux.Identifiers.FriendlyIdentifier() +} diff --git a/server/compose/envoy/yaml_encode.go b/server/compose/envoy/yaml_encode.go index 3999983b49..6a5dc8420d 100644 --- a/server/compose/envoy/yaml_encode.go +++ b/server/compose/envoy/yaml_encode.go @@ -25,15 +25,9 @@ func (e YamlEncoder) encodeChartConfigC(ctx context.Context, p envoyx.EncodePara continue } - mNode := tt.ParentForRef(n, modRef) - if mNode == nil { - err = fmt.Errorf("invalid module reference %v: module does not exist", modRef) - return - } - r, err := y7s.MakeMap( "filter", r.Filter, - "module", mNode.Identifiers.FriendlyIdentifier(), + "module", safeParentIdentifier(tt, n, modRef), "metrics", r.Metrics, "dimensions", r.Dimensions, "yAxis", r.YAxis, @@ -69,25 +63,14 @@ func (e YamlEncoder) encodeModuleFieldOptionsC(ctx context.Context, p envoyx.Enc switch f.Kind { case "Record": modRef := n.References["Options.ModuleID"] - mNode := tt.ParentForRef(n, modRef) - if mNode == nil { - err = fmt.Errorf("invalid module reference %v: module does not exist", modRef) - return - } - opt["module"] = mNode.Identifiers.FriendlyIdentifier() + opt["module"] = safeParentIdentifier(tt, n, modRef) delete(opt, "moduleID") case "User": aux := make([]string, 0, 2) for i := range opt.Strings("roles") { roleRef := n.References[fmt.Sprintf("Options.RoleID.%d", i)] - rNode := tt.ParentForRef(n, roleRef) - if rNode == nil { - err = fmt.Errorf("invalid role reference %v: role does not exist", roleRef) - return - } - - aux = append(aux, rNode.Identifiers.FriendlyIdentifier()) + aux = append(aux, safeParentIdentifier(tt, n, roleRef)) } opt["roles"] = aux delete(opt, "role") @@ -131,34 +114,19 @@ func (e YamlEncoder) encodePageBlockC(ctx context.Context, p envoyx.EncodeParams b = e.cleanupPageblockRecordList(b) modRef := n.References[fmt.Sprintf("Blocks.%d.Options.ModuleID", index)] - node := tt.ParentForRef(n, modRef) - if node == nil { - err = fmt.Errorf("invalid module reference %v: module does not exist", modRef) - return - } - b.Options["module"] = node.Identifiers.FriendlyIdentifier() + b.Options["module"] = safeParentIdentifier(tt, n, modRef) delete(b.Options, "moduleID") break case "RecordOrganizer": modRef := n.References[fmt.Sprintf("Blocks.%d.Options.ModuleID", index)] - node := tt.ParentForRef(n, modRef) - if node == nil { - err = fmt.Errorf("invalid module reference %v: module does not exist", modRef) - return - } - b.Options["module"] = node.Identifiers.FriendlyIdentifier() + b.Options["module"] = safeParentIdentifier(tt, n, modRef) delete(b.Options, "moduleID") break case "Chart": chrRef := n.References[fmt.Sprintf("Blocks.%d.Options.ChartID", index)] - node := tt.ParentForRef(n, chrRef) - if node == nil { - err = fmt.Errorf("invalid chart reference %v: chart does not exist", chrRef) - return - } - b.Options["chart"] = node.Identifiers.FriendlyIdentifier() + b.Options["chart"] = safeParentIdentifier(tt, n, chrRef) delete(b.Options, "chartID") break @@ -169,12 +137,7 @@ func (e YamlEncoder) encodePageBlockC(ctx context.Context, p envoyx.EncodeParams fOpts, _ := (feed["options"]).(map[string]interface{}) modRef := n.References[fmt.Sprintf("Blocks.%d.Options.feeds.%d.ModuleID", index, i)] - node := tt.ParentForRef(n, modRef) - if node == nil { - err = fmt.Errorf("invalid module reference %v: module does not exist", modRef) - return - } - fOpts["module"] = node.Identifiers.FriendlyIdentifier() + fOpts["module"] = safeParentIdentifier(tt, n, modRef) delete(fOpts, "moduleID") } break @@ -188,13 +151,7 @@ func (e YamlEncoder) encodePageBlockC(ctx context.Context, p envoyx.EncodeParams } wfRef := n.References[fmt.Sprintf("Blocks.%d.Options.buttons.%d.WorkflowID", index, i)] - node := tt.ParentForRef(n, wfRef) - if node == nil { - err = fmt.Errorf("invalid workflow reference %v: workflow does not exist", wfRef) - return - } - - button["workflow"] = node.Identifiers.FriendlyIdentifier() + button["workflow"] = safeParentIdentifier(tt, n, wfRef) delete(button, "workflowID") i++ } @@ -204,26 +161,16 @@ func (e YamlEncoder) encodePageBlockC(ctx context.Context, p envoyx.EncodeParams mm, _ := b.Options["metrics"].([]interface{}) for i, m := range mm { modRef := n.References[fmt.Sprintf("Blocks.%d.Options.metrics.%d.ModuleID", index, i)] - node := tt.ParentForRef(n, modRef) - if node == nil { - err = fmt.Errorf("invalid module reference %v: module does not exist", modRef) - return - } mops, _ := m.(map[string]interface{}) - mops["module"] = node.Identifiers.FriendlyIdentifier() + mops["module"] = safeParentIdentifier(tt, n, modRef) delete(mops, "moduleID") } break case "Comment": modRef := n.References[fmt.Sprintf("Blocks.%d.Options.ModuleID", index)] - node := tt.ParentForRef(n, modRef) - if node == nil { - err = fmt.Errorf("invalid module reference %v: module does not exist", modRef) - return - } - b.Options["module"] = node.Identifiers.FriendlyIdentifier() + b.Options["module"] = safeParentIdentifier(tt, n, modRef) delete(b.Options, "moduleID") break @@ -254,14 +201,8 @@ func (e YamlEncoder) encodeProgressPageblockVal(k string, index int, n *envoyx.N } modRef := n.References[fmt.Sprintf("Blocks.%d.Options.%s.ModuleID", index, k)] - node := tt.ParentForRef(n, modRef) - if node == nil { - err = fmt.Errorf("invalid module reference %v: module does not exist", modRef) - return - } - opt := b.Options[k].(map[string]any) - opt["moduleID"] = node.Identifiers.FriendlyIdentifier() + opt["moduleID"] = safeParentIdentifier(tt, n, modRef) delete(opt, "moduleID") return diff --git a/server/system/envoy/store_encode.gen.go b/server/system/envoy/store_encode.gen.go index 9fe83844e3..83789f85cc 100644 --- a/server/system/envoy/store_encode.gen.go +++ b/server/system/envoy/store_encode.gen.go @@ -250,16 +250,9 @@ func (e StoreEncoder) encodeApplication(ctx context.Context, p envoyx.EncodePara var auxID uint64 err = func() (err error) { for fieldLabel, ref := range n.References { - rn := tree.ParentForRef(n, ref) - if rn == nil { - err = fmt.Errorf("parent reference %v not found", ref) - return - } - - auxID = rn.Resource.GetID() + auxID = safeParentID(tree, n, ref) if auxID == 0 { - err = fmt.Errorf("parent reference does not provide an identifier") - return + continue } err = n.Resource.SetValue(fieldLabel, 0, auxID) @@ -462,16 +455,9 @@ func (e StoreEncoder) encodeApigwRoute(ctx context.Context, p envoyx.EncodeParam var auxID uint64 err = func() (err error) { for fieldLabel, ref := range n.References { - rn := tree.ParentForRef(n, ref) - if rn == nil { - err = fmt.Errorf("parent reference %v not found", ref) - return - } - - auxID = rn.Resource.GetID() + auxID = safeParentID(tree, n, ref) if auxID == 0 { - err = fmt.Errorf("parent reference does not provide an identifier") - return + continue } err = n.Resource.SetValue(fieldLabel, 0, auxID) @@ -674,16 +660,9 @@ func (e StoreEncoder) encodeApigwFilter(ctx context.Context, p envoyx.EncodePara var auxID uint64 err = func() (err error) { for fieldLabel, ref := range n.References { - rn := tree.ParentForRef(n, ref) - if rn == nil { - err = fmt.Errorf("parent reference %v not found", ref) - return - } - - auxID = rn.Resource.GetID() + auxID = safeParentID(tree, n, ref) if auxID == 0 { - err = fmt.Errorf("parent reference does not provide an identifier") - return + continue } err = n.Resource.SetValue(fieldLabel, 0, auxID) @@ -886,16 +865,9 @@ func (e StoreEncoder) encodeAuthClient(ctx context.Context, p envoyx.EncodeParam var auxID uint64 err = func() (err error) { for fieldLabel, ref := range n.References { - rn := tree.ParentForRef(n, ref) - if rn == nil { - err = fmt.Errorf("parent reference %v not found", ref) - return - } - - auxID = rn.Resource.GetID() + auxID = safeParentID(tree, n, ref) if auxID == 0 { - err = fmt.Errorf("parent reference does not provide an identifier") - return + continue } err = n.Resource.SetValue(fieldLabel, 0, auxID) @@ -1099,16 +1071,9 @@ func (e StoreEncoder) encodeQueue(ctx context.Context, p envoyx.EncodeParams, s var auxID uint64 err = func() (err error) { for fieldLabel, ref := range n.References { - rn := tree.ParentForRef(n, ref) - if rn == nil { - err = fmt.Errorf("parent reference %v not found", ref) - return - } - - auxID = rn.Resource.GetID() + auxID = safeParentID(tree, n, ref) if auxID == 0 { - err = fmt.Errorf("parent reference does not provide an identifier") - return + continue } err = n.Resource.SetValue(fieldLabel, 0, auxID) @@ -1312,16 +1277,9 @@ func (e StoreEncoder) encodeReport(ctx context.Context, p envoyx.EncodeParams, s var auxID uint64 err = func() (err error) { for fieldLabel, ref := range n.References { - rn := tree.ParentForRef(n, ref) - if rn == nil { - err = fmt.Errorf("parent reference %v not found", ref) - return - } - - auxID = rn.Resource.GetID() + auxID = safeParentID(tree, n, ref) if auxID == 0 { - err = fmt.Errorf("parent reference does not provide an identifier") - return + continue } err = n.Resource.SetValue(fieldLabel, 0, auxID) @@ -1525,16 +1483,9 @@ func (e StoreEncoder) encodeRole(ctx context.Context, p envoyx.EncodeParams, s s var auxID uint64 err = func() (err error) { for fieldLabel, ref := range n.References { - rn := tree.ParentForRef(n, ref) - if rn == nil { - err = fmt.Errorf("parent reference %v not found", ref) - return - } - - auxID = rn.Resource.GetID() + auxID = safeParentID(tree, n, ref) if auxID == 0 { - err = fmt.Errorf("parent reference does not provide an identifier") - return + continue } err = n.Resource.SetValue(fieldLabel, 0, auxID) @@ -1738,16 +1689,9 @@ func (e StoreEncoder) encodeTemplate(ctx context.Context, p envoyx.EncodeParams, var auxID uint64 err = func() (err error) { for fieldLabel, ref := range n.References { - rn := tree.ParentForRef(n, ref) - if rn == nil { - err = fmt.Errorf("parent reference %v not found", ref) - return - } - - auxID = rn.Resource.GetID() + auxID = safeParentID(tree, n, ref) if auxID == 0 { - err = fmt.Errorf("parent reference does not provide an identifier") - return + continue } err = n.Resource.SetValue(fieldLabel, 0, auxID) @@ -1951,16 +1895,9 @@ func (e StoreEncoder) encodeUser(ctx context.Context, p envoyx.EncodeParams, s s var auxID uint64 err = func() (err error) { for fieldLabel, ref := range n.References { - rn := tree.ParentForRef(n, ref) - if rn == nil { - err = fmt.Errorf("parent reference %v not found", ref) - return - } - - auxID = rn.Resource.GetID() + auxID = safeParentID(tree, n, ref) if auxID == 0 { - err = fmt.Errorf("parent reference does not provide an identifier") - return + continue } err = n.Resource.SetValue(fieldLabel, 0, auxID) @@ -2164,16 +2101,9 @@ func (e StoreEncoder) encodeDalConnection(ctx context.Context, p envoyx.EncodePa var auxID uint64 err = func() (err error) { for fieldLabel, ref := range n.References { - rn := tree.ParentForRef(n, ref) - if rn == nil { - err = fmt.Errorf("parent reference %v not found", ref) - return - } - - auxID = rn.Resource.GetID() + auxID = safeParentID(tree, n, ref) if auxID == 0 { - err = fmt.Errorf("parent reference does not provide an identifier") - return + continue } err = n.Resource.SetValue(fieldLabel, 0, auxID) @@ -2377,16 +2307,9 @@ func (e StoreEncoder) encodeDalSensitivityLevel(ctx context.Context, p envoyx.En var auxID uint64 err = func() (err error) { for fieldLabel, ref := range n.References { - rn := tree.ParentForRef(n, ref) - if rn == nil { - err = fmt.Errorf("parent reference %v not found", ref) - return - } - - auxID = rn.Resource.GetID() + auxID = safeParentID(tree, n, ref) if auxID == 0 { - err = fmt.Errorf("parent reference does not provide an identifier") - return + continue } err = n.Resource.SetValue(fieldLabel, 0, auxID) @@ -2524,3 +2447,12 @@ func (e StoreEncoder) getScopeNodes(ctx context.Context, s store.Storer, nn envo return } + +func safeParentID(tt envoyx.Traverser, n *envoyx.Node, ref envoyx.Ref) (out uint64) { + rn := tt.ParentForRef(n, ref) + if rn == nil { + return + } + + return rn.Resource.GetID() +} diff --git a/server/system/envoy/store_encode_locale.go b/server/system/envoy/store_encode_locale.go index d236585667..f7d59969f2 100644 --- a/server/system/envoy/store_encode_locale.go +++ b/server/system/envoy/store_encode_locale.go @@ -57,18 +57,7 @@ func (e StoreEncoder) encodeResourceTranslation(ctx context.Context, p envoyx.En var auxID uint64 err = func() (err error) { for fieldLabel, ref := range n.References { - rn := tree.ParentForRef(n, ref) - if rn == nil { - err = fmt.Errorf("parent reference %v not found", ref) - return - } - - auxID = rn.Resource.GetID() - if auxID == 0 { - err = fmt.Errorf("parent reference does not provide an identifier") - return - } - + auxID = safeParentID(tree, n, ref) err = n.Resource.SetValue(fieldLabel, 0, auxID) if err != nil { return diff --git a/server/system/envoy/store_encode_rbac.go b/server/system/envoy/store_encode_rbac.go index 7c5b9d389b..b658442e64 100644 --- a/server/system/envoy/store_encode_rbac.go +++ b/server/system/envoy/store_encode_rbac.go @@ -54,18 +54,7 @@ func (e StoreEncoder) encodeRbacRule(ctx context.Context, p envoyx.EncodeParams, var auxID uint64 err = func() (err error) { for fieldLabel, ref := range n.References { - rn := tree.ParentForRef(n, ref) - if rn == nil { - err = fmt.Errorf("parent reference %v not found", ref) - return - } - - auxID = rn.Resource.GetID() - if auxID == 0 { - err = fmt.Errorf("parent reference does not provide an identifier") - return - } - + auxID = safeParentID(tree, n, ref) err = n.Resource.SetValue(fieldLabel, 0, auxID) if err != nil { return diff --git a/server/system/envoy/yaml_encode.gen.go b/server/system/envoy/yaml_encode.gen.go index 6f71e090cb..25b58f811e 100644 --- a/server/system/envoy/yaml_encode.gen.go +++ b/server/system/envoy/yaml_encode.gen.go @@ -1105,3 +1105,12 @@ func (e YamlEncoder) getWriter(p envoyx.EncodeParams) (out io.Writer, err error) err = errors.Errorf("YAML encoder expects a writer conforming to io.Writer interface") return } + +func safeParentIdentifier(tt envoyx.Traverser, n *envoyx.Node, ref envoyx.Ref) (out string) { + aux := tt.ParentForRef(n, ref) + if aux == nil { + return ref.Identifiers.FriendlyIdentifier() + } + + return aux.Identifiers.FriendlyIdentifier() +}