sg/internal/engine/builder.go (47 lines of code) (raw):
package engine
import (
"fmt"
"github.com/Azure/ShieldGuard/sg/internal/policy"
)
// QueryerBuilder constructs a Queryer.
type QueryerBuilder struct {
packages []policy.Package
queryCache QueryCache
err error
parseArmTemplateDefaults bool
}
// QueryWithPolicy creates a QueryerBuilder with loading packages from the given paths.
func QueryWithPolicy(policyPaths []string) *QueryerBuilder {
qb := &QueryerBuilder{
queryCache: noopQueryCache,
}
qb.packages, qb.err = policy.LoadPackagesFromPaths(policyPaths)
if qb.err != nil {
return qb
}
return qb
}
// QueryWithParsingArmTemplateDefaults creates a QueryerBuilder that parses arm template default values
func (qb *QueryerBuilder) QueryWithParsingArmTemplateDefaults(shouldParseDefaults bool) *QueryerBuilder {
qb.parseArmTemplateDefaults = shouldParseDefaults
return qb
}
// WithQueueCache sets the query cache for the queryer.
func (qb *QueryerBuilder) WithQueueCache(cache QueryCache) *QueryerBuilder {
qb.queryCache = cache
return qb
}
// Complete constructs the Queryer.
func (qb *QueryerBuilder) Complete() (Queryer, error) {
if qb.err != nil {
return nil, qb.err
}
compiler, compilerKey, err := policy.NewRegoCompiler(qb.packages)
if err != nil {
return nil, fmt.Errorf("failed to create compiler from packages: %w", err)
}
rv := &RegoEngine{
policyPackages: qb.packages,
compiler: compiler,
compilerKey: compilerKey,
// NOTE: we limit the actual query by CPU count as policy evaluation is CPU bounded.
// For input actions like reading policy files / source code, we allow them to run unbounded,
// as the actual limiting is done by this limiter.
limiter: newLimiterFromMaxProcs(),
queryCache: qb.queryCache,
parseArmTemplateDefaults: qb.parseArmTemplateDefaults,
}
return rv, nil
}