Improve missing ref detection in envoy
This commit is contained in:
+34
-2
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user