Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feature: Required Gates #2922

Merged
merged 6 commits into from
Jul 13, 2023
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
51 changes: 51 additions & 0 deletions api/testRunner.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
openapi: 3.0.0
components:
schemas:
TestRunnerResource:
type: object
properties:
type:
type: string
description: "Represents the type of this resource. It should always be set as 'TestRunner'."
enum:
- TestRunner
spec:
$ref: "#/components/schemas/TestRunner"
TestRunner:
type: object
properties:
id:
type: string
description: "ID of the test runner resource. It should always be set as 'current'."
enum:
- current
name:
type: string
description: "Name given for this test runner set"
requiredGates:
type: array
items:
$ref: "#/components/schemas/SupportedGates"
RequiredGatesResult:
type: object
properties:
required:
type: array
items:
$ref: "#/components/schemas/SupportedGates"
failed:
type: array
items:
$ref: "#/components/schemas/SupportedGates"
passed:
type: boolean
required:
- passed
- failed
- required
SupportedGates:
type: string
enum:
- analyzer-score
- analyzer-rules
- test-specs
7 changes: 7 additions & 0 deletions api/tests.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -218,6 +218,8 @@ components:
type: string
error:
type: string
requiredGatesResult:
$ref: "./testRunner.yaml#/components/schemas/RequiredGatesResult"

metadata:
type: object
Expand All @@ -242,6 +244,11 @@ components:
type: array
items:
$ref: "./environments.yaml#/components/schemas/EnvironmentValue"
requiredGates:
type: array
nullable: true
items:
$ref: "./testRunner.yaml#/components/schemas/SupportedGates"

AssertionResults:
type: object
Expand Down
3 changes: 2 additions & 1 deletion api/transactions.yaml
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
openapi: 3.0.0
components:
schemas:

TransactionResourceList:
type: object
properties:
Expand Down Expand Up @@ -86,3 +85,5 @@ components:
type: integer
fail:
type: integer
allStepsRequiredGatesPassed:
type: boolean
11 changes: 0 additions & 11 deletions go.work.sum
Original file line number Diff line number Diff line change
Expand Up @@ -400,21 +400,10 @@ google.golang.org/genproto v0.0.0-20221201164419-0e50fba7f41c/go.mod h1:rZS5c/ZV
google.golang.org/genproto v0.0.0-20221202195650-67e5cbc046fd/go.mod h1:cTsE614GARnxrLsqKREzmNYJACSWWpAWdNMwnD7c2BE=
google.golang.org/genproto v0.0.0-20221227171554-f9683d7f8bef/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM=
google.golang.org/grpc v1.41.0/go.mod h1:U3l9uK9J0sini8mHphKoXyaqDA/8VyGnDee1zzIUK6k=
google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk=
google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk=
google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk=
google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk=
google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI=
google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI=
google.golang.org/grpc v1.51.0/go.mod h1:wgNDFcnuBGmxLKI/qn4T+m5BtEBYXJPvibbUPsAIPww=
google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo=
gotest.tools/v3 v3.3.0/go.mod h1:Mcr9QNxkg0uMvy/YElmo4SpXgJKWgQvYrT7Kw5RzJ1A=
k8s.io/api v0.24.0/go.mod h1:5Jl90IUrJHUJYEMANRURMiVvJ0g7Ax7r3R1bqO8zx8I=
k8s.io/apimachinery v0.24.0/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM=
k8s.io/cri-api v0.25.0/go.mod h1:J1rAyQkSJ2Q6I+aBMOVgg2/cbbebso6FNa0UagiR0kc=
k8s.io/klog/v2 v2.60.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0=
k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42/go.mod h1:Z/45zLw8lUo4wdiUkI+v/ImEGAvu3WatcZl3lPMR4Rk=
k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2/go.mod h1:B+TnT182UBxE84DiCz4CVE26eOSDAeYCpfDnC2kdKMY=
sigs.k8s.io/structured-merge-diff/v4 v4.2.1/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4=
16 changes: 16 additions & 0 deletions server/app/app.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import (
"github.com/kubeshop/tracetest/server/environment"
"github.com/kubeshop/tracetest/server/executor"
"github.com/kubeshop/tracetest/server/executor/pollingprofile"
"github.com/kubeshop/tracetest/server/executor/testrunner"
"github.com/kubeshop/tracetest/server/executor/trigger"
httpServer "github.com/kubeshop/tracetest/server/http"
"github.com/kubeshop/tracetest/server/http/mappings"
Expand Down Expand Up @@ -198,6 +199,7 @@ func (app *App) Start(opts ...appOption) error {
linterRepo := analyzer.NewRepository(db)
testRepo := test.NewRepository(db)
runRepo := test.NewRunRepository(db)
testRunnerRepo := testrunner.NewRepository(db)

transactionsRepository := transaction.NewRepository(db, testRepo)
transactionRunRepository := transaction.NewRunRepository(db, runRepo)
Expand All @@ -209,6 +211,7 @@ func (app *App) Start(opts ...appOption) error {
pollingProfileRepo,
dataStoreRepo,
linterRepo,
testRunnerRepo,
testDB,
testRepo,
runRepo,
Expand Down Expand Up @@ -279,6 +282,7 @@ func (app *App) Start(opts ...appOption) error {
registerDemosResource(demoRepo, apiRouter, provisioner, tracer)
registerDataStoreResource(dataStoreRepo, apiRouter, provisioner, tracer)
registerAnalyzer(linterRepo, apiRouter, provisioner, tracer)
registerTestRunner(testRunnerRepo, apiRouter, provisioner, tracer)
registerTestResource(testRepo, apiRouter, provisioner, tracer)

isTracetestDev := os.Getenv("TRACETEST_DEV") != ""
Expand Down Expand Up @@ -379,6 +383,18 @@ func registerAnalyzer(linterRepo *analyzer.Repository, router *mux.Router, provi
provisioner.AddResourceProvisioner(manager)
}

func registerTestRunner(testRunnerRepo *testrunner.Repository, router *mux.Router, provisioner *provisioning.Provisioner, tracer trace.Tracer) {
manager := resourcemanager.New[testrunner.TestRunner](
testrunner.ResourceName,
testrunner.ResourceNamePlural,
testRunnerRepo,
resourcemanager.DisableDelete(),
resourcemanager.WithTracer(tracer),
)
manager.RegisterRoutes(router)
provisioner.AddResourceProvisioner(manager)
}

func registerTransactionResource(repo *transaction.Repository, router *mux.Router, provisioner *provisioning.Provisioner, tracer trace.Tracer) {
manager := resourcemanager.New[transaction.Transaction](
transaction.TransactionResourceName,
Expand Down
11 changes: 7 additions & 4 deletions server/app/facade.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import (
"github.com/kubeshop/tracetest/server/environment"
"github.com/kubeshop/tracetest/server/executor"
"github.com/kubeshop/tracetest/server/executor/pollingprofile"
"github.com/kubeshop/tracetest/server/executor/testrunner"
"github.com/kubeshop/tracetest/server/executor/trigger"
"github.com/kubeshop/tracetest/server/linter/analyzer"
"github.com/kubeshop/tracetest/server/model"
Expand Down Expand Up @@ -39,12 +40,12 @@ func (rf runnerFacade) StopTest(testID id.ID, runID int) {
})
}

func (rf runnerFacade) RunTest(ctx context.Context, test test.Test, rm test.RunMetadata, env environment.Environment) test.Run {
return rf.runner.Run(ctx, test, rm, env)
func (rf runnerFacade) RunTest(ctx context.Context, test test.Test, rm test.RunMetadata, env environment.Environment, gates *[]testrunner.RequiredGate) test.Run {
return rf.runner.Run(ctx, test, rm, env, gates)
}

func (rf runnerFacade) RunTransaction(ctx context.Context, tr transaction.Transaction, rm test.RunMetadata, env environment.Environment) transaction.TransactionRun {
return rf.transactionRunner.Run(ctx, tr, rm, env)
func (rf runnerFacade) RunTransaction(ctx context.Context, tr transaction.Transaction, rm test.RunMetadata, env environment.Environment, gates *[]testrunner.RequiredGate) transaction.TransactionRun {
return rf.transactionRunner.Run(ctx, tr, rm, env, gates)
}

func (rf runnerFacade) RunAssertions(ctx context.Context, request executor.AssertionRequest) {
Expand All @@ -55,6 +56,7 @@ func newRunnerFacades(
ppRepo *pollingprofile.Repository,
dsRepo *datastore.Repository,
lintRepo *analyzer.Repository,
trRepo *testrunner.Repository,
db model.Repository,
testRepo test.Repository,
runRepo test.RunRepository,
Expand Down Expand Up @@ -117,6 +119,7 @@ func newRunnerFacades(
dsRepo,
eventEmitter,
ppRepo,
trRepo,
)

transactionRunner := executor.NewTransactionRunner(
Expand Down
20 changes: 18 additions & 2 deletions server/executor/runner.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import (
"github.com/kubeshop/tracetest/server/analytics"
"github.com/kubeshop/tracetest/server/datastore"
"github.com/kubeshop/tracetest/server/environment"
"github.com/kubeshop/tracetest/server/executor/testrunner"
triggerer "github.com/kubeshop/tracetest/server/executor/trigger"
"github.com/kubeshop/tracetest/server/expression"
"github.com/kubeshop/tracetest/server/model"
Expand All @@ -31,14 +32,18 @@ type RunResult struct {
}

type Runner interface {
Run(context.Context, test.Test, test.RunMetadata, environment.Environment) test.Run
Run(context.Context, test.Test, test.RunMetadata, environment.Environment, *[]testrunner.RequiredGate) test.Run
}

type PersistentRunner interface {
Runner
WorkerPool
}

type TestRunnerGetter interface {
GetDefault(ctx context.Context) testrunner.TestRunner
}

func NewPersistentRunner(
triggers *triggerer.Registry,
runs test.RunRepository,
Expand All @@ -50,6 +55,7 @@ func NewPersistentRunner(
dsRepo resourcemanager.Current[datastore.DataStore],
eventEmitter EventEmitter,
ppGetter PollingProfileGetter,
trGetter TestRunnerGetter,
) PersistentRunner {
return persistentRunner{
triggers: triggers,
Expand All @@ -62,6 +68,7 @@ func NewPersistentRunner(
subscriptionManager: subscriptionManager,
eventEmitter: eventEmitter,
ppGetter: ppGetter,
trGetter: trGetter,
executeQueue: make(chan execReq, 5),
exit: make(chan bool, 1),
}
Expand All @@ -78,6 +85,7 @@ type persistentRunner struct {
dsRepo resourcemanager.Current[datastore.DataStore]
eventEmitter EventEmitter
ppGetter PollingProfileGetter
trGetter TestRunnerGetter

executeQueue chan execReq
exit chan bool
Expand Down Expand Up @@ -139,7 +147,7 @@ func getNewCtx(ctx context.Context) context.Context {
return otel.GetTextMapPropagator().Extract(context.Background(), carrier)
}

func (r persistentRunner) Run(ctx context.Context, testObj test.Test, metadata test.RunMetadata, environment environment.Environment) test.Run {
func (r persistentRunner) Run(ctx context.Context, testObj test.Test, metadata test.RunMetadata, environment environment.Environment, requiredGates *[]testrunner.RequiredGate) test.Run {
ctx, cancelCtx := context.WithCancel(
getNewCtx(ctx),
)
Expand All @@ -152,6 +160,14 @@ func (r persistentRunner) Run(ctx context.Context, testObj test.Test, metadata t

r.listenForStopRequests(ctx, cancelCtx, run)

// configuring required gates
if requiredGates == nil {
rg := r.trGetter.GetDefault(ctx).RequiredGates
requiredGates = &rg
}

run = run.ConfigureRequiredGates(*requiredGates)

ds := []expression.DataStore{expression.EnvironmentDataStore{
Values: environment.Values,
}}
Expand Down
12 changes: 11 additions & 1 deletion server/executor/runner_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import (
"github.com/kubeshop/tracetest/server/environment"
"github.com/kubeshop/tracetest/server/executor"
"github.com/kubeshop/tracetest/server/executor/pollingprofile"
"github.com/kubeshop/tracetest/server/executor/testrunner"
triggerer "github.com/kubeshop/tracetest/server/executor/trigger"
"github.com/kubeshop/tracetest/server/pkg/id"
"github.com/kubeshop/tracetest/server/subscription"
Expand All @@ -23,6 +24,14 @@ import (
"github.com/stretchr/testify/require"
)

type defaultTestRunnerGetter struct{}

func (dpc defaultTestRunnerGetter) GetDefault(context.Context) testrunner.TestRunner {
testRunner := testrunner.DefaultTestRunner

return testRunner
}

func TestPersistentRunner(t *testing.T) {
t.Run("TestIsTriggerd", func(t *testing.T) {
t.Parallel()
Expand Down Expand Up @@ -99,7 +108,7 @@ func (f runnerFixture) run(tests []test.Test, ttl time.Duration) {
f.runner.Start(2)
time.Sleep(10 * time.Millisecond)
for _, testObj := range tests {
f.runner.Run(context.TODO(), testObj, test.RunMetadata{}, environment.Environment{})
f.runner.Run(context.TODO(), testObj, test.RunMetadata{}, environment.Environment{}, nil)
}
time.Sleep(ttl)
f.runner.Stop()
Expand Down Expand Up @@ -161,6 +170,7 @@ func runnerSetup(t *testing.T) runnerFixture {
getDataStoreRepositoryMock(t),
eventEmitter,
defaultProfileGetter{5 * time.Second, 30 * time.Second},
defaultTestRunnerGetter{},
)

mtp.Test(t)
Expand Down
18 changes: 18 additions & 0 deletions server/executor/testrunner/main_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package testrunner_test

import (
"os"
"testing"

"github.com/kubeshop/tracetest/server/testmock"
)

func TestMain(m *testing.M) {
testmock.StartTestEnvironment()

exitVal := m.Run()

testmock.StopTestEnvironment()

os.Exit(exitVal)
}