diff --git a/sdk/opa.go b/sdk/opa.go index cd636643a0..da1b988ad9 100644 --- a/sdk/opa.go +++ b/sdk/opa.go @@ -53,9 +53,14 @@ type state struct { // options that specify an OPA configuration file. func New(ctx context.Context, opts Options) (*OPA, error) { - id, err := uuid.New(rand.Reader) - if err != nil { - return nil, err + var err error + + id := opts.ID + if id == "" { + id, err = uuid.New(rand.Reader) + if err != nil { + return nil, err + } } if err := opts.init(); err != nil { diff --git a/sdk/opa_test.go b/sdk/opa_test.go index 03a5de076d..763bfe4679 100644 --- a/sdk/opa_test.go +++ b/sdk/opa_test.go @@ -97,6 +97,59 @@ func TestPluginPanic(t *testing.T) { opa.Stop(ctx) } +func TestSDKConfigurableID(t *testing.T) { + ctx := context.Background() + + server := sdktest.MustNewServer( + sdktest.MockBundle("/bundles/bundle.tar.gz", map[string]string{ + "main.rego": "package system\nmain = time.now_ns()", + }), + ) + + defer server.Stop() + + config := fmt.Sprintf(`{ + "services": { + "test": { + "url": %q + } + }, + "bundles": { + "test": { + "resource": "/bundles/bundle.tar.gz" + } + }, + "decision_logs": { + "console": true + } + }`, server.URL()) + + testLogger := loggingtest.New() + opa, err := sdk.New(ctx, sdk.Options{ + Config: strings.NewReader(config), + ConsoleLogger: testLogger, + ID: "164031de-e511-11ec-8fea-0242ac120002"}) + + if err != nil { + t.Fatal(err) + } + + defer opa.Stop(ctx) + + if _, err := opa.Decision(ctx, sdk.DecisionOptions{ + Now: time.Unix(0, 1619868194450288000).UTC(), + }); err != nil { + t.Fatal(err) + } + + entries := testLogger.Entries() + + if entries[0].Fields["labels"].(map[string]interface{})["id"] != "164031de-e511-11ec-8fea-0242ac120002" { + t.Fatalf("expected %v but got %v", "164031de-e511-11ec-8fea-0242ac120002", entries[0].Fields["labels"].(map[string]interface{})["id"]) + } + +} + func TestDecision(t *testing.T) { ctx := context.Background() diff --git a/sdk/options.go b/sdk/options.go index 7bb725387b..e8359c3f30 100644 --- a/sdk/options.go +++ b/sdk/options.go @@ -40,6 +40,9 @@ type Options struct { // registered with the OPA SDK instance. Plugins map[string]plugins.Factory + // When calling the sdk the user can specify an opa id so that repeat calls to the sdk don't have a unique opa id + ID string + config []byte block bool }