diff --git a/plugins/plugins.go b/plugins/plugins.go index 6d3a8d0c6b..efab5e629a 100644 --- a/plugins/plugins.go +++ b/plugins/plugins.go @@ -12,16 +12,16 @@ import ( "github.com/gorilla/mux" - "github.com/open-policy-agent/opa/v1/ast" - "github.com/open-policy-agent/opa/v1/bundle" - "github.com/open-policy-agent/opa/v1/hooks" - "github.com/open-policy-agent/opa/v1/loader" - "github.com/open-policy-agent/opa/v1/logging" + "github.com/open-policy-agent/opa/ast" + "github.com/open-policy-agent/opa/bundle" + "github.com/open-policy-agent/opa/hooks" + "github.com/open-policy-agent/opa/loader" + "github.com/open-policy-agent/opa/logging" + "github.com/open-policy-agent/opa/resolver/wasm" + "github.com/open-policy-agent/opa/storage" + "github.com/open-policy-agent/opa/topdown/print" + "github.com/open-policy-agent/opa/tracing" v1 "github.com/open-policy-agent/opa/v1/plugins" - "github.com/open-policy-agent/opa/v1/resolver/wasm" - "github.com/open-policy-agent/opa/v1/storage" - "github.com/open-policy-agent/opa/v1/topdown/print" - "github.com/open-policy-agent/opa/v1/tracing" ) // Factory defines the interface OPA uses to instantiate your plugin. @@ -92,7 +92,7 @@ type Triggerable = v1.Triggerable // State defines the state that a Plugin instance is currently // in with pre-defined states. -type State v1.State +type State = v1.State const ( // StateNotReady indicates that the Plugin is not in an error state, but isn't @@ -252,5 +252,15 @@ func WithTelemetryGatherers(gs map[string]report.Gatherer) func(*Manager) { // New creates a new Manager using config. func New(raw []byte, id string, store storage.Store, opts ...func(*Manager)) (*Manager, error) { - return v1.New(raw, id, store, opts...) + options := make([]func(*Manager), 0, len(opts)+1) + options = append(options, opts...) + options = append(opts, func(m *Manager) { + if m.ParserOptions().RegoVersion == ast.RegoUndefined { + cpy := m.ParserOptions() + cpy.RegoVersion = ast.DefaultRegoVersion + WithParserOptions(cpy)(m) + } + }) + + return v1.New(raw, id, store, options...) } diff --git a/plugins/plugins_test.go b/plugins/plugins_test.go new file mode 100644 index 0000000000..c453549de5 --- /dev/null +++ b/plugins/plugins_test.go @@ -0,0 +1,47 @@ +// Copyright 2024 The OPA Authors. All rights reserved. +// Use of this source code is governed by an Apache2 +// license that can be found in the LICENSE file. + +package plugins + +import ( + "testing" + + "github.com/open-policy-agent/opa/storage/inmem" + "github.com/open-policy-agent/opa/v1/ast" +) + +func TestNew_DefaultRegoVersion(t *testing.T) { + popts := ast.ParserOptions{ + Capabilities: &ast.Capabilities{ + Features: []string{ + "my_custom_feature", + }, + }, + ProcessAnnotation: true, + AllFutureKeywords: true, + FutureKeywords: []string{"foo", "bar"}, + } + m, err := New([]byte(`{"plugins": {"someplugin": {}}}`), "test", inmem.New(), + WithParserOptions(popts)) + if err != nil { + t.Fatal(err) + } + + if exp, act := ast.RegoV0, m.ParserOptions().RegoVersion; exp != act { + t.Fatalf("Expected default Rego version to be %v but got %v", exp, act) + } + + // Check a couple of other options to make sure they haven't changed + if exp, act := popts.ProcessAnnotation, m.ParserOptions().ProcessAnnotation; exp != act { + t.Fatalf("Expected ProcessAnnotation to be %v but got %v", exp, act) + } + + if exp, act := popts.AllFutureKeywords, m.ParserOptions().AllFutureKeywords; exp != act { + t.Fatalf("Expected AllFutureKeywords to be %v but got %v", exp, act) + } + + if exp, act := popts.Capabilities, m.ParserOptions().Capabilities; exp != act { + t.Fatalf("Expected Capabilities to be %v but got %v", exp, act) + } +}