3
0

Improve missing ref detection in envoy

This commit is contained in:
Tomaž Jerman
2021-09-15 17:15:08 +02:00
parent cea8ca39d3
commit a33856b66c
3 changed files with 42 additions and 3 deletions
+34 -2
View File
@@ -2,6 +2,7 @@ package envoy
import (
"context"
"errors"
"io"
"github.com/cortezaproject/corteza-server/pkg/envoy/resource"
@@ -10,6 +11,8 @@ import (
type (
builder struct {
pp []Preparer
reportMissingRefs bool
}
Stream struct {
@@ -45,12 +48,23 @@ type (
}
)
var (
BuilderErrUnresolvedReferences = errors.New("builder error: unresolved references")
)
func NewBuilder(pp ...Preparer) *builder {
return &builder{
pp: pp,
}
}
func NewSafeBuilder(pp ...Preparer) *builder {
return &builder{
pp: pp,
reportMissingRefs: true,
}
}
// Build builds the graph that is used for structured data processing
//
// Outline:
@@ -63,6 +77,9 @@ func (b *builder) Build(ctx context.Context, rr ...resource.Interface) (*graph,
var err error
g := b.buildGraph(rr)
if len(g.missingRefs) > 0 {
return g, BuilderErrUnresolvedReferences
}
// Do any dep. related preprocessing
var state *ResourceState
@@ -89,6 +106,9 @@ func (b *builder) Build(ctx context.Context, rr ...resource.Interface) (*graph,
}
g = b.buildGraph(rr)
if len(g.missingRefs) > 0 {
return g, BuilderErrUnresolvedReferences
}
return g, nil
}
@@ -108,7 +128,6 @@ func (b *builder) buildGraph(rr []resource.Interface) *graph {
// Build the graph
for _, cNode := range nn {
refs := cNode.res.Refs()
missingRefs := make(resource.RefSet, 0, len(refs))
// Attempt to connect all available nodes
for _, ref := range refs {
@@ -125,7 +144,9 @@ func (b *builder) buildGraph(rr []resource.Interface) *graph {
rNode := nIndex.GetRef(ref)
if rNode == nil {
missingRefs = append(missingRefs, ref)
if !resource.IgnoreDepResolution(ref) {
cNode.missing = append(cNode.missing, ref)
}
continue
}
@@ -138,5 +159,16 @@ func (b *builder) buildGraph(rr []resource.Interface) *graph {
g.addNode(cNode)
}
if b.reportMissingRefs {
missing := make(resource.RefSet, 0, 10)
for _, n := range g.nn {
missing = append(missing, n.missing...)
}
if len(missing) > 0 {
g.missingRefs = missing
}
}
return g
}
+6
View File
@@ -14,6 +14,8 @@ type (
nn nodeSet
resIndex map[resource.Interface]*node
missingRefs resource.RefSet
// Config flags
inverted bool
@@ -39,6 +41,10 @@ func newGraph() *graph {
}
}
func (g *graph) MissingDeps() resource.RefSet {
return g.missingRefs
}
func (g *graph) addNode(nn ...*node) {
for _, n := range nn {
g.resIndex[n.res] = n
+2 -1
View File
@@ -6,7 +6,8 @@ type (
// the node struct is used for nicer graph state management
nodeSet []*node
node struct {
res resource.Interface
res resource.Interface
missing resource.RefSet
pp nodeSet
cc nodeSet