engine, lang: core: Match exported resources properly
I inverted the logic for complex setups and forgot to handle the zero cases. I also didn't notice my loop continue error. This cleans all this up so that we can have proper exported resource matching.
This commit is contained in:
@@ -181,6 +181,19 @@ func (obj *ResFilter) Match(kind, name, host string) error {
|
|||||||
return nil // match!
|
return nil // match!
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// MatchFilters is a simple helper function to avoid duplicating this loop here.
|
||||||
|
// If any filter matches, it returns nil. Otherwise we error.
|
||||||
|
func MatchFilters(filters []*ResFilter, kind, name, host string) error {
|
||||||
|
// TODO: I'd love to avoid this O(N^2) matching if possible...
|
||||||
|
for _, filter := range filters {
|
||||||
|
if err := filter.Match(kind, name, host); err == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return fmt.Errorf("not matches found") // did not match
|
||||||
|
}
|
||||||
|
|
||||||
// ResOutput represents a record of exported resource data which we have read
|
// ResOutput represents a record of exported resource data which we have read
|
||||||
// out from the world storage system. The Data field contains an encoded version
|
// out from the world storage system. The Data field contains an encoded version
|
||||||
// of the resource, and even though decoding it will get you a Kind and Name, we
|
// of the resource, and even though decoding it will get you a Kind and Name, we
|
||||||
|
|||||||
@@ -146,10 +146,8 @@ func GetResources(ctx context.Context, client interfaces.Client, hostname string
|
|||||||
}
|
}
|
||||||
|
|
||||||
// TODO: I'd love to avoid this O(N^2) matching if possible...
|
// TODO: I'd love to avoid this O(N^2) matching if possible...
|
||||||
for _, filter := range filters {
|
if err := engine.MatchFilters(filters, kind, name, hostnameFrom); err != nil {
|
||||||
if err := filter.Match(kind, name, hostnameFrom); err != nil {
|
continue // did not match any of these
|
||||||
continue // did not match
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ro := &engine.ResOutput{
|
ro := &engine.ResOutput{
|
||||||
|
|||||||
@@ -456,12 +456,21 @@ func (obj *CollectFunc) Call(ctx context.Context, args []types.Value) (types.Val
|
|||||||
if obj.init == nil {
|
if obj.init == nil {
|
||||||
return nil, funcs.ErrCantSpeculate
|
return nil, funcs.ErrCantSpeculate
|
||||||
}
|
}
|
||||||
|
|
||||||
|
list := types.NewList(obj.Info().Sig.Out) // collectFuncOutType
|
||||||
|
|
||||||
|
if len(filters) == 0 {
|
||||||
|
// If we have no filters, it means we're matching on nothing,
|
||||||
|
// which happens if we've pre-filtered away all the resources
|
||||||
|
// that we'd want to collect, so here we return absolutely zero!
|
||||||
|
return list, nil
|
||||||
|
}
|
||||||
|
|
||||||
resOutput, err := obj.init.World.ResCollect(ctx, filters)
|
resOutput, err := obj.init.World.ResCollect(ctx, filters)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
list := types.NewList(obj.Info().Sig.Out) // collectFuncOutType
|
|
||||||
for _, x := range resOutput {
|
for _, x := range resOutput {
|
||||||
// programming error if any of these error...
|
// programming error if any of these error...
|
||||||
if x.Kind != kind {
|
if x.Kind != kind {
|
||||||
|
|||||||
Reference in New Issue
Block a user