3
0

Fix namespace export error when resources reference deleted resources

This commit is contained in:
Tomaž Jerman 2023-11-03 09:19:59 +01:00
parent 0c3a5253b1
commit dc54b55e55
11 changed files with 126 additions and 275 deletions

View File

@ -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()
}

View File

@ -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()
}

View File

@ -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 }}
{{ 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()
}

View File

@ -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()
}

View File

@ -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()
}

View File

@ -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()
}

View File

@ -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

View File

@ -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()
}

View File

@ -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

View File

@ -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

View File

@ -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()
}