diff --git a/api/tests.yaml b/api/tests.yaml index 70a0c4d75c..36e9851b95 100644 --- a/api/tests.yaml +++ b/api/tests.yaml @@ -197,6 +197,8 @@ components: format: date-time variableSet: $ref: "./variableSets.yaml#/components/schemas/VariableSet" + resolvedTrigger: + $ref: "./triggers.yaml#/components/schemas/Trigger" triggerResult: $ref: "./triggers.yaml#/components/schemas/TriggerResult" trace: diff --git a/cli/openapi/model_test_run.go b/cli/openapi/model_test_run.go index b993280aff..dbdf89fb13 100644 --- a/cli/openapi/model_test_run.go +++ b/cli/openapi/model_test_run.go @@ -39,6 +39,7 @@ type TestRun struct { ObtainedTraceAt *time.Time `json:"obtainedTraceAt,omitempty"` CompletedAt *time.Time `json:"completedAt,omitempty"` VariableSet *VariableSet `json:"variableSet,omitempty"` + ResolvedTrigger *Trigger `json:"resolvedTrigger,omitempty"` TriggerResult *TriggerResult `json:"triggerResult,omitempty"` Trace *Trace `json:"trace,omitempty"` Result *AssertionResults `json:"result,omitempty"` @@ -515,6 +516,38 @@ func (o *TestRun) SetVariableSet(v VariableSet) { o.VariableSet = &v } +// GetResolvedTrigger returns the ResolvedTrigger field value if set, zero value otherwise. +func (o *TestRun) GetResolvedTrigger() Trigger { + if o == nil || isNil(o.ResolvedTrigger) { + var ret Trigger + return ret + } + return *o.ResolvedTrigger +} + +// GetResolvedTriggerOk returns a tuple with the ResolvedTrigger field value if set, nil otherwise +// and a boolean to check if the value has been set. +func (o *TestRun) GetResolvedTriggerOk() (*Trigger, bool) { + if o == nil || isNil(o.ResolvedTrigger) { + return nil, false + } + return o.ResolvedTrigger, true +} + +// HasResolvedTrigger returns a boolean if a field has been set. +func (o *TestRun) HasResolvedTrigger() bool { + if o != nil && !isNil(o.ResolvedTrigger) { + return true + } + + return false +} + +// SetResolvedTrigger gets a reference to the given Trigger and assigns it to the ResolvedTrigger field. +func (o *TestRun) SetResolvedTrigger(v Trigger) { + o.ResolvedTrigger = &v +} + // GetTriggerResult returns the TriggerResult field value if set, zero value otherwise. func (o *TestRun) GetTriggerResult() TriggerResult { if o == nil || isNil(o.TriggerResult) { @@ -849,6 +882,9 @@ func (o TestRun) ToMap() (map[string]interface{}, error) { if !isNil(o.VariableSet) { toSerialize["variableSet"] = o.VariableSet } + if !isNil(o.ResolvedTrigger) { + toSerialize["resolvedTrigger"] = o.ResolvedTrigger + } if !isNil(o.TriggerResult) { toSerialize["triggerResult"] = o.TriggerResult } diff --git a/server/executor/runner.go b/server/executor/runner.go index 114bc6048a..94cfe9f07c 100644 --- a/server/executor/runner.go +++ b/server/executor/runner.go @@ -146,6 +146,9 @@ func (r persistentRunner) ProcessItem(ctx context.Context, job Job) { r.handleError(job.Run, err) } + run.ResolvedTrigger = resolvedTest.Trigger + r.handleDBError(run, r.updater.Update(ctx, run)) + err = r.eventEmitter.Emit(ctx, events.TriggerResolveSuccess(job.Run.TestID, job.Run.ID)) if err != nil { r.handleError(job.Run, err) diff --git a/server/executor/workers/trigger_preparation_worker.go b/server/executor/workers/trigger_preparation_worker.go new file mode 100644 index 0000000000..be17f1e2f0 --- /dev/null +++ b/server/executor/workers/trigger_preparation_worker.go @@ -0,0 +1,24 @@ +package workers + +import ( + "context" + + "github.com/kubeshop/tracetest/server/executor" + triggerer "github.com/kubeshop/tracetest/server/executor/trigger" + "github.com/kubeshop/tracetest/server/model" + "github.com/kubeshop/tracetest/server/test" +) + +type EventEmitter interface { + Emit(ctx context.Context, event model.TestRunEvent) error +} + +type TriggerPreparationWorker struct { + runRepository test.RunRepository + eventEmiter EventEmitter + triggers *triggerer.Registry +} + +func (w *TriggerPreparationWorker) ProcessItem(ctx context.Context, job executor.Job) { + +} diff --git a/server/http/mappings/tests.go b/server/http/mappings/tests.go index c26e098517..6c23d2ac9e 100644 --- a/server/http/mappings/tests.go +++ b/server/http/mappings/tests.go @@ -281,6 +281,7 @@ func (m OpenAPI) Run(in *test.Run) openapi.TestRun { ServiceTriggerCompletedAt: in.ServiceTriggerCompletedAt, ObtainedTraceAt: in.ObtainedTraceAt, CompletedAt: in.CompletedAt, + ResolvedTrigger: m.Trigger(in.ResolvedTrigger), TriggerResult: m.TriggerResult(in.TriggerResult), TestVersion: int32(in.TestVersion), Trace: m.Trace(in.Trace), diff --git a/server/migrations/32_add_resolved_trigger_to_test_run.down.sql b/server/migrations/32_add_resolved_trigger_to_test_run.down.sql new file mode 100644 index 0000000000..b4bdbbfe83 --- /dev/null +++ b/server/migrations/32_add_resolved_trigger_to_test_run.down.sql @@ -0,0 +1,3 @@ +ALTER TABLE + test_runs +DROP COLUMN resolved_trigger; diff --git a/server/migrations/32_add_resolved_trigger_to_test_run.up.sql b/server/migrations/32_add_resolved_trigger_to_test_run.up.sql new file mode 100644 index 0000000000..2e5148617e --- /dev/null +++ b/server/migrations/32_add_resolved_trigger_to_test_run.up.sql @@ -0,0 +1,4 @@ +ALTER TABLE + test_runs +ADD + COLUMN resolved_trigger jsonb; diff --git a/server/openapi/model_test_run.go b/server/openapi/model_test_run.go index 9dd6b81ebc..d07b753965 100644 --- a/server/openapi/model_test_run.go +++ b/server/openapi/model_test_run.go @@ -47,6 +47,8 @@ type TestRun struct { VariableSet VariableSet `json:"variableSet,omitempty"` + ResolvedTrigger Trigger `json:"resolvedTrigger,omitempty"` + TriggerResult TriggerResult `json:"triggerResult,omitempty"` Trace Trace `json:"trace,omitempty"` @@ -71,6 +73,9 @@ func AssertTestRunRequired(obj TestRun) error { if err := AssertVariableSetRequired(obj.VariableSet); err != nil { return err } + if err := AssertTriggerRequired(obj.ResolvedTrigger); err != nil { + return err + } if err := AssertTriggerResultRequired(obj.TriggerResult); err != nil { return err } diff --git a/server/test/run_repository.go b/server/test/run_repository.go index 53e77a7c75..2a88d567aa 100644 --- a/server/test/run_repository.go +++ b/server/test/run_repository.go @@ -106,6 +106,7 @@ INSERT INTO test_runs ( "span_id", -- result info + "resolved_trigger", "trigger_results", "test_results", "trace", @@ -144,19 +145,20 @@ INSERT INTO test_runs ( $9, -- span_id -- result info - $10, -- trigger_results + $10, -- resolved_trigger + $11, -- trigger_results '{}', -- test_results - $11, -- trace + $12, -- trace '[]', -- outputs NULL, -- last_error 0, -- pass 0, -- fail - $12, -- metadata - $13, -- variable_set - $14, -- linter - $15, -- required_gates_result - $16 -- tenant_id + $13, -- metadata + $14, -- variable_set + $15, -- linter + $16, -- required_gates_result + $17 -- tenant_id ) RETURNING "id"` @@ -168,6 +170,11 @@ func (r *runRepository) CreateRun(ctx context.Context, test Test, run Run) (Run, run.CreatedAt = time.Now() } + jsonResolvedTrigger, err := json.Marshal(run.ResolvedTrigger) + if err != nil { + return Run{}, fmt.Errorf("resolved trigger encoding error: %w", err) + } + jsonTriggerResults, err := json.Marshal(run.TriggerResult) if err != nil { return Run{}, fmt.Errorf("trigger results encoding error: %w", err) @@ -224,6 +231,7 @@ func (r *runRepository) CreateRun(ctx context.Context, test Test, run Run) (Run, run.State, run.TraceID.String(), run.SpanID.String(), + jsonResolvedTrigger, jsonTriggerResults, jsonTrace, jsonMetadata, @@ -257,27 +265,33 @@ UPDATE test_runs SET "span_id" = $7, -- result info - "trigger_results" = $8, - "test_results" = $9, - "trace" = $10, - "outputs" = $11, - "last_error" = $12, - "pass" = $13, - "fail" = $14, - - "metadata" = $15, - "variable_set" = $18, + "resolved_trigger" = $8, + "trigger_results" = $9, + "test_results" = $10, + "trace" = $11, + "outputs" = $12, + "last_error" = $13, + "pass" = $14, + "fail" = $15, + + "metadata" = $16, + "variable_set" = $19, --- linter - "linter" = $19, + "linter" = $20, --- required gates - "required_gates_result" = $20 + "required_gates_result" = $21 -WHERE id = $16 AND test_id = $17 +WHERE id = $17 AND test_id = $18 ` func (r *runRepository) UpdateRun(ctx context.Context, run Run) error { + jsonResolvedTrigger, err := json.Marshal(run.ResolvedTrigger) + if err != nil { + return fmt.Errorf("resolved trigger encoding error: %w", err) + } + jsonTriggerResults, err := json.Marshal(run.TriggerResult) if err != nil { return fmt.Errorf("trigger results encoding error: %w", err) @@ -336,6 +350,7 @@ func (r *runRepository) UpdateRun(ctx context.Context, run Run) error { run.State, run.TraceID.String(), run.SpanID.String(), + jsonResolvedTrigger, jsonTriggerResults, jsonTestResults, jsonTrace, @@ -412,6 +427,7 @@ const ( "span_id", -- result info + "resolved_trigger", "trigger_results", "test_results", "trace", @@ -544,6 +560,7 @@ func readRunRow(row scanner) (Run, error) { r := Run{} var ( + jsonResolvedTrigger, jsonTriggerResults, jsonTestResults, jsonTrace, @@ -573,6 +590,7 @@ func readRunRow(row scanner) (Run, error) { &r.State, &traceID, &spanID, + &jsonResolvedTrigger, &jsonTriggerResults, &jsonTestResults, &jsonTrace, diff --git a/server/test/test_entities.go b/server/test/test_entities.go index c52af2a94f..64bd63563c 100644 --- a/server/test/test_entities.go +++ b/server/test/test_entities.go @@ -113,13 +113,14 @@ type ( SpanID trace.SpanID // result info - TriggerResult trigger.TriggerResult - Results *RunResults - Trace *traces.Trace - Outputs maps.Ordered[string, RunOutput] - LastError error - Pass int - Fail int + ResolvedTrigger trigger.Trigger + TriggerResult trigger.TriggerResult + Results *RunResults + Trace *traces.Trace + Outputs maps.Ordered[string, RunOutput] + LastError error + Pass int + Fail int Metadata RunMetadata diff --git a/web/src/models/TestRun.model.ts b/web/src/models/TestRun.model.ts index ffbe721305..7c434953b0 100644 --- a/web/src/models/TestRun.model.ts +++ b/web/src/models/TestRun.model.ts @@ -27,6 +27,7 @@ type TestRun = Model< triggerTime: number; lastErrorState?: string; trigger?: TTriggerSchemas['Trigger']; + resolvedTrigger?: TTriggerSchemas['Trigger']; triggerResult?: TriggerResult; outputs?: TestRunOutput[]; variableSet?: VariableSet; diff --git a/web/src/types/Generated.types.ts b/web/src/types/Generated.types.ts index cb7c6157ca..0faed69d2c 100644 --- a/web/src/types/Generated.types.ts +++ b/web/src/types/Generated.types.ts @@ -1846,6 +1846,7 @@ export interface external { /** Format: date-time */ completedAt?: string; variableSet?: external["variableSets.yaml"]["components"]["schemas"]["VariableSet"]; + resolvedTrigger?: external["triggers.yaml"]["components"]["schemas"]["Trigger"]; triggerResult?: external["triggers.yaml"]["components"]["schemas"]["TriggerResult"]; trace?: external["trace.yaml"]["components"]["schemas"]["Trace"]; result?: external["tests.yaml"]["components"]["schemas"]["AssertionResults"];