diff --git a/pkg/envoy/builder.go b/pkg/envoy/builder.go index 66c25241f..250953148 100644 --- a/pkg/envoy/builder.go +++ b/pkg/envoy/builder.go @@ -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 } diff --git a/pkg/envoy/graph.go b/pkg/envoy/graph.go index 7ab34fc96..b072e9948 100644 --- a/pkg/envoy/graph.go +++ b/pkg/envoy/graph.go @@ -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 diff --git a/pkg/envoy/node.go b/pkg/envoy/node.go index 9fd46da63..c817fb54e 100644 --- a/pkg/envoy/node.go +++ b/pkg/envoy/node.go @@ -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