diff --git a/api/admin/clean.go b/api/admin/clean.go index efe3819c6..5078a217b 100644 --- a/api/admin/clean.go +++ b/api/admin/clean.go @@ -131,7 +131,7 @@ func CleanResources(c *gin.Context) { logrus.Infof("platform admin %s: cleaned %d services in database", u.GetName(), services) // clean steps - steps, err := database.FromContext(c).CleanSteps(msg, before) + steps, err := database.FromContext(c).CleanSteps(ctx, msg, before) if err != nil { retErr := fmt.Errorf("%d builds cleaned. %d executables cleaned. %d services cleaned. unable to update steps: %w", builds, executables, services, err) diff --git a/api/admin/step.go b/api/admin/step.go index a8b2de5d4..9fd909414 100644 --- a/api/admin/step.go +++ b/api/admin/step.go @@ -52,6 +52,7 @@ func UpdateStep(c *gin.Context) { // capture body from API request input := new(library.Step) + ctx := c.Request.Context() err := c.Bind(input) if err != nil { @@ -63,7 +64,7 @@ func UpdateStep(c *gin.Context) { } // send API call to update the step - s, err := database.FromContext(c).UpdateStep(input) + s, err := database.FromContext(c).UpdateStep(ctx, input) if err != nil { retErr := fmt.Errorf("unable to update step %d: %w", input.GetID(), err) diff --git a/api/build/cancel.go b/api/build/cancel.go index 7e72541db..c91b7c5fa 100644 --- a/api/build/cancel.go +++ b/api/build/cancel.go @@ -224,7 +224,7 @@ func CancelBuild(c *gin.Context) { for page > 0 { // retrieve build steps (per page) from the database - stepsPart, _, err := database.FromContext(c).ListStepsForBuild(b, map[string]interface{}{}, page, perPage) + stepsPart, _, err := database.FromContext(c).ListStepsForBuild(ctx, b, map[string]interface{}{}, page, perPage) if err != nil { retErr := fmt.Errorf("unable to retrieve steps for build %s: %w", entry, err) util.HandleError(c, http.StatusNotFound, retErr) @@ -249,7 +249,7 @@ func CancelBuild(c *gin.Context) { if step.GetStatus() == constants.StatusRunning || step.GetStatus() == constants.StatusPending { step.SetStatus(constants.StatusCanceled) - _, err = database.FromContext(c).UpdateStep(step) + _, err = database.FromContext(c).UpdateStep(ctx, step) if err != nil { retErr := fmt.Errorf("unable to update step %s for build %s: %w", step.GetName(), entry, err) util.HandleError(c, http.StatusNotFound, retErr) diff --git a/api/build/clean.go b/api/build/clean.go index e830c48a9..96a186821 100644 --- a/api/build/clean.go +++ b/api/build/clean.go @@ -47,7 +47,7 @@ func CleanBuild(ctx context.Context, database database.Interface, b *library.Bui s.SetFinished(time.Now().UTC().Unix()) // send API call to update the step - _, err := database.UpdateStep(s) + _, err := database.UpdateStep(ctx, s) if err != nil { logrus.Errorf("unable to kill step %s for build %d: %v", s.GetName(), b.GetNumber(), err) } diff --git a/api/build/graph.go b/api/build/graph.go index 527e15813..dde6e5343 100644 --- a/api/build/graph.go +++ b/api/build/graph.go @@ -256,7 +256,7 @@ func GetBuildGraph(c *gin.Context) { if len(p.Stages) > 0 || len(p.Steps) > 0 { for page > 0 { // retrieve build steps (per page) from the database - stepsPart, _, err := database.FromContext(c).ListStepsForBuild(b, nil, page, perPage) + stepsPart, _, err := database.FromContext(c).ListStepsForBuild(ctx, b, nil, page, perPage) if err != nil { retErr := fmt.Errorf("unable to retrieve steps for build %s: %w", entry, err) diff --git a/api/metrics.go b/api/metrics.go index afad74583..b562f7a1d 100644 --- a/api/metrics.go +++ b/api/metrics.go @@ -358,7 +358,7 @@ func recordGauges(c *gin.Context) { // step_image_count if q.StepImageCount { // send API call to capture the total number of step images - stepImageMap, err := database.FromContext(c).ListStepImageCount() + stepImageMap, err := database.FromContext(c).ListStepImageCount(ctx) if err != nil { logrus.Errorf("unable to get count of all step images: %v", err) } @@ -371,7 +371,7 @@ func recordGauges(c *gin.Context) { // step_status_count if q.StepStatusCount { // send API call to capture the total number of step statuses - stepStatusMap, err := database.FromContext(c).ListStepStatusCount() + stepStatusMap, err := database.FromContext(c).ListStepStatusCount(ctx) if err != nil { logrus.Errorf("unable to get count of all step statuses: %v", err) } diff --git a/api/step/create.go b/api/step/create.go index 06eeac4e9..f8b9ef2f8 100644 --- a/api/step/create.go +++ b/api/step/create.go @@ -72,6 +72,7 @@ func CreateStep(c *gin.Context) { o := org.Retrieve(c) r := repo.Retrieve(c) u := user.Retrieve(c) + ctx := c.Request.Context() entry := fmt.Sprintf("%s/%d", r.GetFullName(), b.GetNumber()) @@ -110,7 +111,7 @@ func CreateStep(c *gin.Context) { } // send API call to create the step - s, err := database.FromContext(c).CreateStep(input) + s, err := database.FromContext(c).CreateStep(ctx, input) if err != nil { retErr := fmt.Errorf("unable to create step for build %s: %w", entry, err) diff --git a/api/step/delete.go b/api/step/delete.go index f9ee7c2ad..574e873c7 100644 --- a/api/step/delete.go +++ b/api/step/delete.go @@ -66,6 +66,7 @@ func DeleteStep(c *gin.Context) { r := repo.Retrieve(c) s := step.Retrieve(c) u := user.Retrieve(c) + ctx := c.Request.Context() entry := fmt.Sprintf("%s/%d/%d", r.GetFullName(), b.GetNumber(), s.GetNumber()) @@ -81,7 +82,7 @@ func DeleteStep(c *gin.Context) { }).Infof("deleting step %s", entry) // send API call to remove the step - err := database.FromContext(c).DeleteStep(s) + err := database.FromContext(c).DeleteStep(ctx, s) if err != nil { retErr := fmt.Errorf("unable to delete step %s: %w", entry, err) diff --git a/api/step/list.go b/api/step/list.go index 1545e28ea..42c45cac8 100644 --- a/api/step/list.go +++ b/api/step/list.go @@ -85,6 +85,7 @@ func ListSteps(c *gin.Context) { o := org.Retrieve(c) r := repo.Retrieve(c) u := user.Retrieve(c) + ctx := c.Request.Context() entry := fmt.Sprintf("%s/%d", r.GetFullName(), b.GetNumber()) @@ -122,7 +123,7 @@ func ListSteps(c *gin.Context) { perPage = util.MaxInt(1, util.MinInt(100, perPage)) // send API call to capture the list of steps for the build - s, t, err := database.FromContext(c).ListStepsForBuild(b, map[string]interface{}{}, page, perPage) + s, t, err := database.FromContext(c).ListStepsForBuild(ctx, b, map[string]interface{}{}, page, perPage) if err != nil { retErr := fmt.Errorf("unable to list steps for build %s: %w", entry, err) diff --git a/api/step/plan.go b/api/step/plan.go index 103f38d6e..77f22adcb 100644 --- a/api/step/plan.go +++ b/api/step/plan.go @@ -60,7 +60,7 @@ func planStep(ctx context.Context, database database.Interface, b *library.Build s.SetCreated(time.Now().UTC().Unix()) // send API call to create the step - s, err := database.CreateStep(s) + s, err := database.CreateStep(ctx, s) if err != nil { return nil, fmt.Errorf("unable to create step %s: %w", s.GetName(), err) } diff --git a/api/step/update.go b/api/step/update.go index e7b2402ee..e049e0ad1 100644 --- a/api/step/update.go +++ b/api/step/update.go @@ -77,6 +77,7 @@ func UpdateStep(c *gin.Context) { r := repo.Retrieve(c) s := step.Retrieve(c) u := user.Retrieve(c) + ctx := c.Request.Context() entry := fmt.Sprintf("%s/%d/%d", r.GetFullName(), b.GetNumber(), s.GetNumber()) @@ -145,7 +146,7 @@ func UpdateStep(c *gin.Context) { } // send API call to update the step - s, err = database.FromContext(c).UpdateStep(s) + s, err = database.FromContext(c).UpdateStep(ctx, s) if err != nil { retErr := fmt.Errorf("unable to update step %s: %w", entry, err) diff --git a/database/integration_test.go b/database/integration_test.go index ffa3381b3..16ca38062 100644 --- a/database/integration_test.go +++ b/database/integration_test.go @@ -1637,10 +1637,11 @@ func testSteps(t *testing.T, db Interface, resources *Resources) { // add the method name to the list of functions methods[element.Method(i).Name] = false } + ctx := context.TODO() // create the steps for _, step := range resources.Steps { - _, err := db.CreateStep(step) + _, err := db.CreateStep(ctx, step) if err != nil { t.Errorf("unable to create step %d: %v", step.GetID(), err) } @@ -1648,7 +1649,7 @@ func testSteps(t *testing.T, db Interface, resources *Resources) { methods["CreateStep"] = true // count the steps - count, err := db.CountSteps() + count, err := db.CountSteps(ctx) if err != nil { t.Errorf("unable to count steps: %v", err) } @@ -1658,7 +1659,7 @@ func testSteps(t *testing.T, db Interface, resources *Resources) { methods["CountSteps"] = true // count the steps for a build - count, err = db.CountStepsForBuild(resources.Builds[0], nil) + count, err = db.CountStepsForBuild(ctx, resources.Builds[0], nil) if err != nil { t.Errorf("unable to count steps for build %d: %v", resources.Builds[0].GetID(), err) } @@ -1668,7 +1669,7 @@ func testSteps(t *testing.T, db Interface, resources *Resources) { methods["CountStepsForBuild"] = true // list the steps - list, err := db.ListSteps() + list, err := db.ListSteps(ctx) if err != nil { t.Errorf("unable to list steps: %v", err) } @@ -1678,7 +1679,7 @@ func testSteps(t *testing.T, db Interface, resources *Resources) { methods["ListSteps"] = true // list the steps for a build - list, count, err = db.ListStepsForBuild(resources.Builds[0], nil, 1, 10) + list, count, err = db.ListStepsForBuild(ctx, resources.Builds[0], nil, 1, 10) if err != nil { t.Errorf("unable to list steps for build %d: %v", resources.Builds[0].GetID(), err) } @@ -1694,7 +1695,7 @@ func testSteps(t *testing.T, db Interface, resources *Resources) { "#init": 1, "target/vela-git:v0.3.0": 1, } - images, err := db.ListStepImageCount() + images, err := db.ListStepImageCount(ctx) if err != nil { t.Errorf("unable to list step image count: %v", err) } @@ -1710,7 +1711,7 @@ func testSteps(t *testing.T, db Interface, resources *Resources) { "running": 1, "success": 0, } - statuses, err := db.ListStepStatusCount() + statuses, err := db.ListStepStatusCount(ctx) if err != nil { t.Errorf("unable to list step status count: %v", err) } @@ -1722,7 +1723,7 @@ func testSteps(t *testing.T, db Interface, resources *Resources) { // lookup the steps by name for _, step := range resources.Steps { build := resources.Builds[step.GetBuildID()-1] - got, err := db.GetStepForBuild(build, step.GetNumber()) + got, err := db.GetStepForBuild(ctx, build, step.GetNumber()) if err != nil { t.Errorf("unable to get step %d for build %d: %v", step.GetID(), build.GetID(), err) } @@ -1733,7 +1734,7 @@ func testSteps(t *testing.T, db Interface, resources *Resources) { methods["GetStepForBuild"] = true // clean the steps - count, err = db.CleanSteps("integration testing", 1563474090) + count, err = db.CleanSteps(ctx, "integration testing", 1563474090) if err != nil { t.Errorf("unable to clean steps: %v", err) } @@ -1745,7 +1746,7 @@ func testSteps(t *testing.T, db Interface, resources *Resources) { // update the steps for _, step := range resources.Steps { step.SetStatus("success") - got, err := db.UpdateStep(step) + got, err := db.UpdateStep(ctx, step) if err != nil { t.Errorf("unable to update step %d: %v", step.GetID(), err) } @@ -1759,7 +1760,7 @@ func testSteps(t *testing.T, db Interface, resources *Resources) { // delete the steps for _, step := range resources.Steps { - err = db.DeleteStep(step) + err = db.DeleteStep(ctx, step) if err != nil { t.Errorf("unable to delete step %d: %v", step.GetID(), err) } diff --git a/database/resource.go b/database/resource.go index 0396bec72..2e309dedf 100644 --- a/database/resource.go +++ b/database/resource.go @@ -143,6 +143,7 @@ func (e *engine) NewResources(ctx context.Context) error { // create the database agnostic engine for steps e.StepInterface, err = step.New( + step.WithContext(e.ctx), step.WithClient(e.client), step.WithLogger(e.logger), step.WithSkipCreation(e.config.SkipCreation), diff --git a/database/step/clean.go b/database/step/clean.go index 09c74543d..0dc685709 100644 --- a/database/step/clean.go +++ b/database/step/clean.go @@ -3,6 +3,7 @@ package step import ( + "context" "time" "github.com/go-vela/types/constants" @@ -12,7 +13,7 @@ import ( ) // CleanSteps updates steps to an error with a created timestamp prior to a defined moment. -func (e *engine) CleanSteps(msg string, before int64) (int64, error) { +func (e *engine) CleanSteps(ctx context.Context, msg string, before int64) (int64, error) { logrus.Tracef("cleaning pending or running steps in the database created prior to %d", before) s := new(library.Step) diff --git a/database/step/clean_test.go b/database/step/clean_test.go index 4384d7719..a7cadded5 100644 --- a/database/step/clean_test.go +++ b/database/step/clean_test.go @@ -3,6 +3,7 @@ package step import ( + "context" "reflect" "testing" @@ -52,6 +53,8 @@ func TestStep_Engine_CleanStep(t *testing.T) { _stepFour.SetStatus("pending") _postgres, _mock := testPostgres(t) + + ctx := context.TODO() defer func() { _sql, _ := _postgres.client.DB(); _sql.Close() }() // ensure the mock expects the name query @@ -62,22 +65,22 @@ func TestStep_Engine_CleanStep(t *testing.T) { _sqlite := testSqlite(t) defer func() { _sql, _ := _sqlite.client.DB(); _sql.Close() }() - _, err := _sqlite.CreateStep(_stepOne) + _, err := _sqlite.CreateStep(ctx, _stepOne) if err != nil { t.Errorf("unable to create test step for sqlite: %v", err) } - _, err = _sqlite.CreateStep(_stepTwo) + _, err = _sqlite.CreateStep(ctx, _stepTwo) if err != nil { t.Errorf("unable to create test step for sqlite: %v", err) } - _, err = _sqlite.CreateStep(_stepThree) + _, err = _sqlite.CreateStep(ctx, _stepThree) if err != nil { t.Errorf("unable to create test step for sqlite: %v", err) } - _, err = _sqlite.CreateStep(_stepFour) + _, err = _sqlite.CreateStep(ctx, _stepFour) if err != nil { t.Errorf("unable to create test step for sqlite: %v", err) } @@ -106,7 +109,7 @@ func TestStep_Engine_CleanStep(t *testing.T) { // run tests for _, test := range tests { t.Run(test.name, func(t *testing.T) { - got, err := test.database.CleanSteps("msg", 3) + got, err := test.database.CleanSteps(ctx, "msg", 3) if test.failure { if err == nil { diff --git a/database/step/count.go b/database/step/count.go index de91f1649..b47668bd0 100644 --- a/database/step/count.go +++ b/database/step/count.go @@ -3,11 +3,12 @@ package step import ( + "context" "github.com/go-vela/types/constants" ) // CountSteps gets the count of all steps from the database. -func (e *engine) CountSteps() (int64, error) { +func (e *engine) CountSteps(ctx context.Context) (int64, error) { e.logger.Tracef("getting count of all steps from the database") // variable to store query results diff --git a/database/step/count_build.go b/database/step/count_build.go index 9dfbab289..8da485331 100644 --- a/database/step/count_build.go +++ b/database/step/count_build.go @@ -3,13 +3,14 @@ package step import ( + "context" "github.com/go-vela/types/constants" "github.com/go-vela/types/library" "github.com/sirupsen/logrus" ) // CountStepsForBuild gets the count of steps by build ID from the database. -func (e *engine) CountStepsForBuild(b *library.Build, filters map[string]interface{}) (int64, error) { +func (e *engine) CountStepsForBuild(ctx context.Context, b *library.Build, filters map[string]interface{}) (int64, error) { e.logger.WithFields(logrus.Fields{ "build": b.GetNumber(), }).Tracef("getting count of steps for build %d from the database", b.GetNumber()) diff --git a/database/step/count_build_test.go b/database/step/count_build_test.go index e6561d996..e17b666f3 100644 --- a/database/step/count_build_test.go +++ b/database/step/count_build_test.go @@ -3,6 +3,7 @@ package step import ( + "context" "reflect" "testing" @@ -33,6 +34,8 @@ func TestStep_Engine_CountStepsForBuild(t *testing.T) { _stepTwo.SetImage("bar") _postgres, _mock := testPostgres(t) + + ctx := context.TODO() defer func() { _sql, _ := _postgres.client.DB(); _sql.Close() }() // create expected result in mock @@ -44,12 +47,12 @@ func TestStep_Engine_CountStepsForBuild(t *testing.T) { _sqlite := testSqlite(t) defer func() { _sql, _ := _sqlite.client.DB(); _sql.Close() }() - _, err := _sqlite.CreateStep(_stepOne) + _, err := _sqlite.CreateStep(ctx, _stepOne) if err != nil { t.Errorf("unable to create test step for sqlite: %v", err) } - _, err = _sqlite.CreateStep(_stepTwo) + _, err = _sqlite.CreateStep(ctx, _stepTwo) if err != nil { t.Errorf("unable to create test step for sqlite: %v", err) } @@ -80,7 +83,7 @@ func TestStep_Engine_CountStepsForBuild(t *testing.T) { // run tests for _, test := range tests { t.Run(test.name, func(t *testing.T) { - got, err := test.database.CountStepsForBuild(_build, filters) + got, err := test.database.CountStepsForBuild(ctx, _build, filters) if test.failure { if err == nil { diff --git a/database/step/count_test.go b/database/step/count_test.go index be8faecba..621f0a7cd 100644 --- a/database/step/count_test.go +++ b/database/step/count_test.go @@ -3,6 +3,7 @@ package step import ( + "context" "reflect" "testing" @@ -28,6 +29,9 @@ func TestStep_Engine_CountSteps(t *testing.T) { _stepTwo.SetImage("bar") _postgres, _mock := testPostgres(t) + + ctx := context.TODO() + defer func() { _sql, _ := _postgres.client.DB(); _sql.Close() }() // create expected result in mock @@ -39,12 +43,12 @@ func TestStep_Engine_CountSteps(t *testing.T) { _sqlite := testSqlite(t) defer func() { _sql, _ := _sqlite.client.DB(); _sql.Close() }() - _, err := _sqlite.CreateStep(_stepOne) + _, err := _sqlite.CreateStep(ctx, _stepOne) if err != nil { t.Errorf("unable to create test step for sqlite: %v", err) } - _, err = _sqlite.CreateStep(_stepTwo) + _, err = _sqlite.CreateStep(ctx, _stepTwo) if err != nil { t.Errorf("unable to create test step for sqlite: %v", err) } @@ -73,7 +77,7 @@ func TestStep_Engine_CountSteps(t *testing.T) { // run tests for _, test := range tests { t.Run(test.name, func(t *testing.T) { - got, err := test.database.CountSteps() + got, err := test.database.CountSteps(ctx) if test.failure { if err == nil { diff --git a/database/step/create.go b/database/step/create.go index 7b9603a44..a4ab98cfe 100644 --- a/database/step/create.go +++ b/database/step/create.go @@ -3,6 +3,7 @@ package step import ( + "context" "github.com/go-vela/types/constants" "github.com/go-vela/types/database" "github.com/go-vela/types/library" @@ -10,7 +11,7 @@ import ( ) // CreateStep creates a new step in the database. -func (e *engine) CreateStep(s *library.Step) (*library.Step, error) { +func (e *engine) CreateStep(ctx context.Context, s *library.Step) (*library.Step, error) { e.logger.WithFields(logrus.Fields{ "step": s.GetNumber(), }).Tracef("creating step %s in the database", s.GetName()) diff --git a/database/step/create_test.go b/database/step/create_test.go index 8910f8b21..b7a494c06 100644 --- a/database/step/create_test.go +++ b/database/step/create_test.go @@ -3,6 +3,7 @@ package step import ( + "context" "reflect" "testing" @@ -56,7 +57,7 @@ VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16) RETURNING "id"`) // run tests for _, test := range tests { t.Run(test.name, func(t *testing.T) { - got, err := test.database.CreateStep(_step) + got, err := test.database.CreateStep(context.TODO(), _step) if test.failure { if err == nil { diff --git a/database/step/delete.go b/database/step/delete.go index b5a6c9912..5b185a447 100644 --- a/database/step/delete.go +++ b/database/step/delete.go @@ -3,6 +3,7 @@ package step import ( + "context" "github.com/go-vela/types/constants" "github.com/go-vela/types/database" "github.com/go-vela/types/library" @@ -10,7 +11,7 @@ import ( ) // DeleteStep deletes an existing step from the database. -func (e *engine) DeleteStep(s *library.Step) error { +func (e *engine) DeleteStep(ctx context.Context, s *library.Step) error { e.logger.WithFields(logrus.Fields{ "step": s.GetNumber(), }).Tracef("deleting step %s from the database", s.GetName()) diff --git a/database/step/delete_test.go b/database/step/delete_test.go index 44def389b..476ee969f 100644 --- a/database/step/delete_test.go +++ b/database/step/delete_test.go @@ -3,6 +3,7 @@ package step import ( + "context" "testing" "github.com/DATA-DOG/go-sqlmock" @@ -19,6 +20,9 @@ func TestStep_Engine_DeleteStep(t *testing.T) { _step.SetImage("bar") _postgres, _mock := testPostgres(t) + + ctx := context.TODO() + defer func() { _sql, _ := _postgres.client.DB(); _sql.Close() }() // ensure the mock expects the query @@ -28,8 +32,7 @@ func TestStep_Engine_DeleteStep(t *testing.T) { _sqlite := testSqlite(t) defer func() { _sql, _ := _sqlite.client.DB(); _sql.Close() }() - - _, err := _sqlite.CreateStep(_step) + _, err := _sqlite.CreateStep(ctx, _step) if err != nil { t.Errorf("unable to create test step for sqlite: %v", err) } @@ -55,7 +58,7 @@ func TestStep_Engine_DeleteStep(t *testing.T) { // run tests for _, test := range tests { t.Run(test.name, func(t *testing.T) { - err = test.database.DeleteStep(_step) + err = test.database.DeleteStep(ctx, _step) if test.failure { if err == nil { diff --git a/database/step/get.go b/database/step/get.go index 183f760c1..8884fe51a 100644 --- a/database/step/get.go +++ b/database/step/get.go @@ -3,13 +3,14 @@ package step import ( + "context" "github.com/go-vela/types/constants" "github.com/go-vela/types/database" "github.com/go-vela/types/library" ) // GetStep gets a step by ID from the database. -func (e *engine) GetStep(id int64) (*library.Step, error) { +func (e *engine) GetStep(ctx context.Context, id int64) (*library.Step, error) { e.logger.Tracef("getting step %d from the database", id) // variable to store query results diff --git a/database/step/get_build.go b/database/step/get_build.go index a0f970fb8..6be0d3cb1 100644 --- a/database/step/get_build.go +++ b/database/step/get_build.go @@ -3,6 +3,7 @@ package step import ( + "context" "github.com/go-vela/types/constants" "github.com/go-vela/types/database" "github.com/go-vela/types/library" @@ -10,7 +11,7 @@ import ( ) // GetStepForBuild gets a step by number and build ID from the database. -func (e *engine) GetStepForBuild(b *library.Build, number int) (*library.Step, error) { +func (e *engine) GetStepForBuild(ctx context.Context, b *library.Build, number int) (*library.Step, error) { e.logger.WithFields(logrus.Fields{ "build": b.GetNumber(), "step": number, diff --git a/database/step/get_build_test.go b/database/step/get_build_test.go index f1bd6715e..13353178e 100644 --- a/database/step/get_build_test.go +++ b/database/step/get_build_test.go @@ -3,6 +3,7 @@ package step import ( + "context" "reflect" "testing" @@ -26,6 +27,9 @@ func TestStep_Engine_GetStepForBuild(t *testing.T) { _step.SetImage("bar") _postgres, _mock := testPostgres(t) + + ctx := context.TODO() + defer func() { _sql, _ := _postgres.client.DB(); _sql.Close() }() // create expected result in mock @@ -38,8 +42,7 @@ func TestStep_Engine_GetStepForBuild(t *testing.T) { _sqlite := testSqlite(t) defer func() { _sql, _ := _sqlite.client.DB(); _sql.Close() }() - - _, err := _sqlite.CreateStep(_step) + _, err := _sqlite.CreateStep(ctx, _step) if err != nil { t.Errorf("unable to create test step for sqlite: %v", err) } @@ -68,7 +71,7 @@ func TestStep_Engine_GetStepForBuild(t *testing.T) { // run tests for _, test := range tests { t.Run(test.name, func(t *testing.T) { - got, err := test.database.GetStepForBuild(_build, 1) + got, err := test.database.GetStepForBuild(ctx, _build, 1) if test.failure { if err == nil { diff --git a/database/step/get_test.go b/database/step/get_test.go index 18d9934ff..832108d3f 100644 --- a/database/step/get_test.go +++ b/database/step/get_test.go @@ -3,6 +3,7 @@ package step import ( + "context" "reflect" "testing" @@ -19,6 +20,7 @@ func TestStep_Engine_GetStep(t *testing.T) { _step.SetNumber(1) _step.SetName("foo") _step.SetImage("bar") + ctx := context.TODO() _postgres, _mock := testPostgres(t) defer func() { _sql, _ := _postgres.client.DB(); _sql.Close() }() @@ -34,7 +36,7 @@ func TestStep_Engine_GetStep(t *testing.T) { _sqlite := testSqlite(t) defer func() { _sql, _ := _sqlite.client.DB(); _sql.Close() }() - _, err := _sqlite.CreateStep(_step) + _, err := _sqlite.CreateStep(ctx, _step) if err != nil { t.Errorf("unable to create test step for sqlite: %v", err) } @@ -63,7 +65,7 @@ func TestStep_Engine_GetStep(t *testing.T) { // run tests for _, test := range tests { t.Run(test.name, func(t *testing.T) { - got, err := test.database.GetStep(1) + got, err := test.database.GetStep(ctx, 1) if test.failure { if err == nil { diff --git a/database/step/interface.go b/database/step/interface.go index a2a289aa3..70bbc1c72 100644 --- a/database/step/interface.go +++ b/database/step/interface.go @@ -3,6 +3,7 @@ package step import ( + "context" "github.com/go-vela/types/library" ) @@ -16,34 +17,34 @@ type StepInterface interface { // https://en.wikipedia.org/wiki/Data_definition_language // CreateStepTable defines a function that creates the steps table. - CreateStepTable(string) error + CreateStepTable(context.Context, string) error // Step Data Manipulation Language Functions // // https://en.wikipedia.org/wiki/Data_manipulation_language // CleanSteps defines a function that sets running or pending steps to error status before a given created time. - CleanSteps(string, int64) (int64, error) + CleanSteps(context.Context, string, int64) (int64, error) // CountSteps defines a function that gets the count of all steps. - CountSteps() (int64, error) + CountSteps(context.Context) (int64, error) // CountStepsForBuild defines a function that gets the count of steps by build ID. - CountStepsForBuild(*library.Build, map[string]interface{}) (int64, error) + CountStepsForBuild(context.Context, *library.Build, map[string]interface{}) (int64, error) // CreateStep defines a function that creates a new step. - CreateStep(*library.Step) (*library.Step, error) + CreateStep(context.Context, *library.Step) (*library.Step, error) // DeleteStep defines a function that deletes an existing step. - DeleteStep(*library.Step) error + DeleteStep(context.Context, *library.Step) error // GetStep defines a function that gets a step by ID. - GetStep(int64) (*library.Step, error) + GetStep(context.Context, int64) (*library.Step, error) // GetStepForBuild defines a function that gets a step by number and build ID. - GetStepForBuild(*library.Build, int) (*library.Step, error) + GetStepForBuild(context.Context, *library.Build, int) (*library.Step, error) // ListSteps defines a function that gets a list of all steps. - ListSteps() ([]*library.Step, error) + ListSteps(ctx context.Context) ([]*library.Step, error) // ListStepsForBuild defines a function that gets a list of steps by build ID. - ListStepsForBuild(*library.Build, map[string]interface{}, int, int) ([]*library.Step, int64, error) + ListStepsForBuild(context.Context, *library.Build, map[string]interface{}, int, int) ([]*library.Step, int64, error) // ListStepImageCount defines a function that gets a list of all step images and the count of their occurrence. - ListStepImageCount() (map[string]float64, error) + ListStepImageCount(context.Context) (map[string]float64, error) // ListStepStatusCount defines a function that gets a list of all step statuses and the count of their occurrence. - ListStepStatusCount() (map[string]float64, error) + ListStepStatusCount(context.Context) (map[string]float64, error) // UpdateStep defines a function that updates an existing step. - UpdateStep(*library.Step) (*library.Step, error) + UpdateStep(context.Context, *library.Step) (*library.Step, error) } diff --git a/database/step/list.go b/database/step/list.go index 1d0976ba6..b4dd0a329 100644 --- a/database/step/list.go +++ b/database/step/list.go @@ -3,13 +3,14 @@ package step import ( + "context" "github.com/go-vela/types/constants" "github.com/go-vela/types/database" "github.com/go-vela/types/library" ) // ListSteps gets a list of all steps from the database. -func (e *engine) ListSteps() ([]*library.Step, error) { +func (e *engine) ListSteps(ctx context.Context) ([]*library.Step, error) { e.logger.Trace("listing all steps from the database") // variables to store query results and return value @@ -18,7 +19,7 @@ func (e *engine) ListSteps() ([]*library.Step, error) { steps := []*library.Step{} // count the results - count, err := e.CountSteps() + count, err := e.CountSteps(ctx) if err != nil { return nil, err } diff --git a/database/step/list_build.go b/database/step/list_build.go index f14fdc67e..0a446af27 100644 --- a/database/step/list_build.go +++ b/database/step/list_build.go @@ -3,6 +3,7 @@ package step import ( + "context" "github.com/go-vela/types/constants" "github.com/go-vela/types/database" "github.com/go-vela/types/library" @@ -10,7 +11,7 @@ import ( ) // ListStepsForBuild gets a list of all steps from the database. -func (e *engine) ListStepsForBuild(b *library.Build, filters map[string]interface{}, page int, perPage int) ([]*library.Step, int64, error) { +func (e *engine) ListStepsForBuild(ctx context.Context, b *library.Build, filters map[string]interface{}, page int, perPage int) ([]*library.Step, int64, error) { e.logger.WithFields(logrus.Fields{ "build": b.GetNumber(), }).Tracef("listing steps for build %d from the database", b.GetNumber()) @@ -21,7 +22,7 @@ func (e *engine) ListStepsForBuild(b *library.Build, filters map[string]interfac steps := []*library.Step{} // count the results - count, err := e.CountStepsForBuild(b, filters) + count, err := e.CountStepsForBuild(ctx, b, filters) if err != nil { return steps, 0, err } diff --git a/database/step/list_build_test.go b/database/step/list_build_test.go index 20e13792e..2f00ba1d6 100644 --- a/database/step/list_build_test.go +++ b/database/step/list_build_test.go @@ -3,6 +3,7 @@ package step import ( + "context" "reflect" "testing" @@ -34,6 +35,8 @@ func TestStep_Engine_ListStepsForBuild(t *testing.T) { _stepTwo.SetImage("bar") _postgres, _mock := testPostgres(t) + + ctx := context.TODO() defer func() { _sql, _ := _postgres.client.DB(); _sql.Close() }() // create expected result in mock @@ -54,12 +57,12 @@ func TestStep_Engine_ListStepsForBuild(t *testing.T) { _sqlite := testSqlite(t) defer func() { _sql, _ := _sqlite.client.DB(); _sql.Close() }() - _, err := _sqlite.CreateStep(_stepOne) + _, err := _sqlite.CreateStep(ctx, _stepOne) if err != nil { t.Errorf("unable to create test step for sqlite: %v", err) } - _, err = _sqlite.CreateStep(_stepTwo) + _, err = _sqlite.CreateStep(ctx, _stepTwo) if err != nil { t.Errorf("unable to create test step for sqlite: %v", err) } @@ -90,7 +93,7 @@ func TestStep_Engine_ListStepsForBuild(t *testing.T) { // run tests for _, test := range tests { t.Run(test.name, func(t *testing.T) { - got, _, err := test.database.ListStepsForBuild(_build, filters, 1, 10) + got, _, err := test.database.ListStepsForBuild(ctx, _build, filters, 1, 10) if test.failure { if err == nil { diff --git a/database/step/list_image.go b/database/step/list_image.go index 0a98720cc..7669d637a 100644 --- a/database/step/list_image.go +++ b/database/step/list_image.go @@ -3,13 +3,14 @@ package step import ( + "context" "database/sql" "github.com/go-vela/types/constants" ) // ListStepImageCount gets a list of all step images and the count of their occurrence from the database. -func (e *engine) ListStepImageCount() (map[string]float64, error) { +func (e *engine) ListStepImageCount(ctx context.Context) (map[string]float64, error) { e.logger.Tracef("getting count of all images for steps from the database") // variables to store query results and return value diff --git a/database/step/list_image_test.go b/database/step/list_image_test.go index 6b3e6be12..ea0b78585 100644 --- a/database/step/list_image_test.go +++ b/database/step/list_image_test.go @@ -3,6 +3,7 @@ package step import ( + "context" "reflect" "testing" @@ -28,6 +29,8 @@ func TestStep_Engine_ListStepImageCount(t *testing.T) { _stepTwo.SetImage("bar") _postgres, _mock := testPostgres(t) + + ctx := context.TODO() defer func() { _sql, _ := _postgres.client.DB(); _sql.Close() }() // create expected result in mock @@ -39,12 +42,12 @@ func TestStep_Engine_ListStepImageCount(t *testing.T) { _sqlite := testSqlite(t) defer func() { _sql, _ := _sqlite.client.DB(); _sql.Close() }() - _, err := _sqlite.CreateStep(_stepOne) + _, err := _sqlite.CreateStep(ctx, _stepOne) if err != nil { t.Errorf("unable to create test step for sqlite: %v", err) } - _, err = _sqlite.CreateStep(_stepTwo) + _, err = _sqlite.CreateStep(ctx, _stepTwo) if err != nil { t.Errorf("unable to create test step for sqlite: %v", err) } @@ -73,7 +76,7 @@ func TestStep_Engine_ListStepImageCount(t *testing.T) { // run tests for _, test := range tests { t.Run(test.name, func(t *testing.T) { - got, err := test.database.ListStepImageCount() + got, err := test.database.ListStepImageCount(ctx) if test.failure { if err == nil { diff --git a/database/step/list_status.go b/database/step/list_status.go index 470369394..d93db3c30 100644 --- a/database/step/list_status.go +++ b/database/step/list_status.go @@ -3,13 +3,14 @@ package step import ( + "context" "database/sql" "github.com/go-vela/types/constants" ) // ListStepStatusCount gets a list of all step statuses and the count of their occurrence from the database. -func (e *engine) ListStepStatusCount() (map[string]float64, error) { +func (e *engine) ListStepStatusCount(ctx context.Context) (map[string]float64, error) { e.logger.Tracef("getting count of all statuses for steps from the database") // variables to store query results and return value diff --git a/database/step/list_status_test.go b/database/step/list_status_test.go index c025554d4..22f9d51c1 100644 --- a/database/step/list_status_test.go +++ b/database/step/list_status_test.go @@ -3,6 +3,7 @@ package step import ( + "context" "reflect" "testing" @@ -28,6 +29,8 @@ func TestStep_Engine_ListStepStatusCount(t *testing.T) { _stepTwo.SetImage("bar") _postgres, _mock := testPostgres(t) + + ctx := context.TODO() defer func() { _sql, _ := _postgres.client.DB(); _sql.Close() }() // create expected result in mock @@ -44,12 +47,12 @@ func TestStep_Engine_ListStepStatusCount(t *testing.T) { _sqlite := testSqlite(t) defer func() { _sql, _ := _sqlite.client.DB(); _sql.Close() }() - _, err := _sqlite.CreateStep(_stepOne) + _, err := _sqlite.CreateStep(ctx, _stepOne) if err != nil { t.Errorf("unable to create test step for sqlite: %v", err) } - _, err = _sqlite.CreateStep(_stepTwo) + _, err = _sqlite.CreateStep(ctx, _stepTwo) if err != nil { t.Errorf("unable to create test step for sqlite: %v", err) } @@ -90,7 +93,7 @@ func TestStep_Engine_ListStepStatusCount(t *testing.T) { // run tests for _, test := range tests { t.Run(test.name, func(t *testing.T) { - got, err := test.database.ListStepStatusCount() + got, err := test.database.ListStepStatusCount(ctx) if test.failure { if err == nil { diff --git a/database/step/list_test.go b/database/step/list_test.go index 348d4508b..284ae802f 100644 --- a/database/step/list_test.go +++ b/database/step/list_test.go @@ -3,6 +3,7 @@ package step import ( + "context" "reflect" "testing" @@ -29,6 +30,8 @@ func TestStep_Engine_ListSteps(t *testing.T) { _stepTwo.SetImage("foo") _postgres, _mock := testPostgres(t) + + ctx := context.TODO() defer func() { _sql, _ := _postgres.client.DB(); _sql.Close() }() // create expected result in mock @@ -49,12 +52,12 @@ func TestStep_Engine_ListSteps(t *testing.T) { _sqlite := testSqlite(t) defer func() { _sql, _ := _sqlite.client.DB(); _sql.Close() }() - _, err := _sqlite.CreateStep(_stepOne) + _, err := _sqlite.CreateStep(ctx, _stepOne) if err != nil { t.Errorf("unable to create test step for sqlite: %v", err) } - _, err = _sqlite.CreateStep(_stepTwo) + _, err = _sqlite.CreateStep(ctx, _stepTwo) if err != nil { t.Errorf("unable to create test step for sqlite: %v", err) } @@ -83,7 +86,7 @@ func TestStep_Engine_ListSteps(t *testing.T) { // run tests for _, test := range tests { t.Run(test.name, func(t *testing.T) { - got, err := test.database.ListSteps() + got, err := test.database.ListSteps(ctx) if test.failure { if err == nil { diff --git a/database/step/opts.go b/database/step/opts.go index 3c783b6f5..50fdc6eb6 100644 --- a/database/step/opts.go +++ b/database/step/opts.go @@ -3,6 +3,7 @@ package step import ( + "context" "github.com/sirupsen/logrus" "gorm.io/gorm" @@ -40,3 +41,12 @@ func WithSkipCreation(skipCreation bool) EngineOpt { return nil } } + +// WithContext sets the context in the database engine for Steps. +func WithContext(ctx context.Context) EngineOpt { + return func(e *engine) error { + e.ctx = ctx + + return nil + } +} diff --git a/database/step/opts_test.go b/database/step/opts_test.go index 1b9a3c424..6338b2f51 100644 --- a/database/step/opts_test.go +++ b/database/step/opts_test.go @@ -3,6 +3,7 @@ package step import ( + "context" "reflect" "testing" @@ -157,3 +158,52 @@ func TestStep_EngineOpt_WithSkipCreation(t *testing.T) { }) } } + +func TestStep_EngineOpt_WithContext(t *testing.T) { + // setup types + e := &engine{config: new(config)} + + // setup tests + tests := []struct { + failure bool + name string + ctx context.Context + want context.Context + }{ + { + failure: false, + name: "context set to TODO", + ctx: context.TODO(), + want: context.TODO(), + }, + { + failure: false, + name: "context set to nil", + ctx: nil, + want: nil, + }, + } + + // run tests + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + err := WithContext(test.ctx)(e) + + if test.failure { + if err == nil { + t.Errorf("WithContext for %s should have returned err", test.name) + } + + return + } + + if err != nil { + t.Errorf("WithContext returned err: %v", err) + } + + if !reflect.DeepEqual(e.ctx, test.want) { + t.Errorf("WithContext is %v, want %v", e.ctx, test.want) + } + }) + } +} diff --git a/database/step/step.go b/database/step/step.go index 9437bd118..96e3989ab 100644 --- a/database/step/step.go +++ b/database/step/step.go @@ -3,6 +3,7 @@ package step import ( + "context" "fmt" "github.com/go-vela/types/constants" @@ -23,6 +24,8 @@ type ( // engine configuration settings used in step functions config *config + ctx context.Context + // gorm.io/gorm database client used in step functions // // https://pkg.go.dev/gorm.io/gorm#DB @@ -63,7 +66,7 @@ func New(opts ...EngineOpt) (*engine, error) { } // create the steps table - err := e.CreateStepTable(e.client.Config.Dialector.Name()) + err := e.CreateStepTable(e.ctx, e.client.Config.Dialector.Name()) if err != nil { return nil, fmt.Errorf("unable to create %s table: %w", constants.TableStep, err) } diff --git a/database/step/table.go b/database/step/table.go index aa4997ffc..8cdde1b6e 100644 --- a/database/step/table.go +++ b/database/step/table.go @@ -3,6 +3,7 @@ package step import ( + "context" "github.com/go-vela/types/constants" ) @@ -59,7 +60,7 @@ steps ( ) // CreateStepTable creates the steps table in the database. -func (e *engine) CreateStepTable(driver string) error { +func (e *engine) CreateStepTable(ctx context.Context, driver string) error { e.logger.Tracef("creating steps table in the database") // handle the driver provided to create the table diff --git a/database/step/table_test.go b/database/step/table_test.go index f39f24639..38abb86ad 100644 --- a/database/step/table_test.go +++ b/database/step/table_test.go @@ -3,6 +3,7 @@ package step import ( + "context" "testing" "github.com/DATA-DOG/go-sqlmock" @@ -11,6 +12,9 @@ import ( func TestStep_Engine_CreateStepTable(t *testing.T) { // setup types _postgres, _mock := testPostgres(t) + + ctx := context.TODO() + defer func() { _sql, _ := _postgres.client.DB(); _sql.Close() }() _mock.ExpectExec(CreatePostgresTable).WillReturnResult(sqlmock.NewResult(1, 1)) @@ -39,7 +43,7 @@ func TestStep_Engine_CreateStepTable(t *testing.T) { // run tests for _, test := range tests { t.Run(test.name, func(t *testing.T) { - err := test.database.CreateStepTable(test.name) + err := test.database.CreateStepTable(ctx, test.name) if test.failure { if err == nil { diff --git a/database/step/update.go b/database/step/update.go index d655e15e0..2417c87a0 100644 --- a/database/step/update.go +++ b/database/step/update.go @@ -3,6 +3,7 @@ package step import ( + "context" "github.com/go-vela/types/constants" "github.com/go-vela/types/database" "github.com/go-vela/types/library" @@ -10,7 +11,7 @@ import ( ) // UpdateStep updates an existing step in the database. -func (e *engine) UpdateStep(s *library.Step) (*library.Step, error) { +func (e *engine) UpdateStep(ctx context.Context, s *library.Step) (*library.Step, error) { e.logger.WithFields(logrus.Fields{ "step": s.GetNumber(), }).Tracef("updating step %s in the database", s.GetName()) diff --git a/database/step/update_test.go b/database/step/update_test.go index 60907aff2..14ddf009c 100644 --- a/database/step/update_test.go +++ b/database/step/update_test.go @@ -3,6 +3,7 @@ package step import ( + "context" "reflect" "testing" @@ -20,6 +21,9 @@ func TestStep_Engine_UpdateStep(t *testing.T) { _step.SetImage("bar") _postgres, _mock := testPostgres(t) + + ctx := context.TODO() + defer func() { _sql, _ := _postgres.client.DB(); _sql.Close() }() // ensure the mock expects the query @@ -32,7 +36,7 @@ WHERE "id" = $16`). _sqlite := testSqlite(t) defer func() { _sql, _ := _sqlite.client.DB(); _sql.Close() }() - _, err := _sqlite.CreateStep(_step) + _, err := _sqlite.CreateStep(ctx, _step) if err != nil { t.Errorf("unable to create test step for sqlite: %v", err) } @@ -58,7 +62,7 @@ WHERE "id" = $16`). // run tests for _, test := range tests { t.Run(test.name, func(t *testing.T) { - got, err := test.database.UpdateStep(_step) + got, err := test.database.UpdateStep(ctx, _step) if test.failure { if err == nil { diff --git a/router/middleware/step/step.go b/router/middleware/step/step.go index 54fbfc1af..89ba1aa1f 100644 --- a/router/middleware/step/step.go +++ b/router/middleware/step/step.go @@ -31,6 +31,7 @@ func Establish() gin.HandlerFunc { o := org.Retrieve(c) r := repo.Retrieve(c) u := user.Retrieve(c) + ctx := c.Request.Context() if r == nil { retErr := fmt.Errorf("repo %s/%s not found", o, util.PathParameter(c, "repo")) @@ -73,7 +74,7 @@ func Establish() gin.HandlerFunc { "user": u.GetName(), }).Debugf("reading step %s/%d/%d", r.GetFullName(), b.GetNumber(), number) - s, err := database.FromContext(c).GetStepForBuild(b, number) + s, err := database.FromContext(c).GetStepForBuild(ctx, b, number) if err != nil { retErr := fmt.Errorf("unable to read step %s/%d/%d: %w", r.GetFullName(), b.GetNumber(), number, err) util.HandleError(c, http.StatusNotFound, retErr) diff --git a/router/middleware/step/step_test.go b/router/middleware/step/step_test.go index dd9dbafb5..8d9e19271 100644 --- a/router/middleware/step/step_test.go +++ b/router/middleware/step/step_test.go @@ -81,13 +81,13 @@ func TestStep_Establish(t *testing.T) { defer func() { _ = db.DeleteBuild(context.TODO(), b) _ = db.DeleteRepo(context.TODO(), r) - _ = db.DeleteStep(want) + _ = db.DeleteStep(context.TODO(), want) db.Close() }() _, _ = db.CreateRepo(context.TODO(), r) _, _ = db.CreateBuild(context.TODO(), b) - _, _ = db.CreateStep(want) + _, _ = db.CreateStep(context.TODO(), want) // setup context gin.SetMode(gin.TestMode)