Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
74626c9
Merge branch 'main' of github.com:go-vela/server
jbrockopp Feb 14, 2023
974c8e6
Merge branch 'main' of github.com:go-vela/server
jbrockopp Mar 3, 2023
2f2c425
Merge branch 'main' of github.com:go-vela/server
jbrockopp Mar 20, 2023
528291a
Merge branch 'main' of github.com:go-vela/server
jbrockopp Apr 8, 2023
b53c687
Merge branch 'main' of github.com:go-vela/server
jbrockopp Apr 8, 2023
4734dcb
Merge branch 'main' of github.com:go-vela/server
jbrockopp Apr 16, 2023
1fb52df
Merge branch 'main' of github.com:go-vela/server
jbrockopp Apr 21, 2023
e996aa6
Merge branch 'main' of github.com:go-vela/server
jbrockopp Apr 27, 2023
c299ee4
Merge branch 'main' of github.com:go-vela/server
jbrockopp May 11, 2023
c8da9e3
Merge branch 'main' of github.com:go-vela/server
jbrockopp May 16, 2023
1ee254f
Merge branch 'main' of github.com:go-vela/server
jbrockopp May 22, 2023
8dd6033
Merge branch 'main' of github.com:go-vela/server
jbrockopp May 22, 2023
0eb92b1
Merge branch 'main' of github.com:go-vela/server
jbrockopp May 26, 2023
d5dcb6d
Merge branch 'main' of github.com:go-vela/server
jbrockopp Jun 1, 2023
1b8ab7c
feat(database): add agnostic engine
jbrockopp Jun 1, 2023
19bf93b
feat(database): add config.Validate()
jbrockopp Jun 1, 2023
f820f6a
feat(database): add engine.Close()
jbrockopp Jun 1, 2023
5d5490c
feat(database): add engine.Driver()
jbrockopp Jun 1, 2023
ab04f2f
chore: minor fixes
jbrockopp Jun 1, 2023
fa00227
Merge branch 'feature/database/engine' of github.com:go-vela/server i…
jbrockopp Jun 1, 2023
a51f84c
feat(database): add engine.Ping()
jbrockopp Jun 1, 2023
61d93d2
Merge branch 'main' into feature/database/engine_ping
jbrockopp Jun 2, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 42 additions & 0 deletions database/ping.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
// Copyright (c) 2023 Target Brands, Inc. All rights reserved.
//
// Use of this source code is governed by the LICENSE file in this repository.

package database

import (
"fmt"
"time"
)

// Ping sends a "ping" request with backoff to the database.
func (e *engine) Ping() error {
e.Logger.Tracef("sending ping request to the %s database", e.Driver())

// create a loop to attempt ping requests 5 times
for i := 0; i < 5; i++ {
// capture database/sql database from gorm.io/gorm database
_sql, err := e.Database.DB()
if err != nil {
return err
}

// send ping request to database
err = _sql.Ping()
if err != nil {
// create the duration of time to sleep for before attempting to retry
duration := time.Duration(i+1) * time.Second

e.Logger.Warnf("unable to ping %s database - retrying in %v", e.Driver(), duration)

// sleep for loop iteration in seconds
time.Sleep(duration)

continue
}

return nil
}

return fmt.Errorf("unable to successfully ping %s database", e.Driver())
}
82 changes: 82 additions & 0 deletions database/ping_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
// Copyright (c) 2023 Target Brands, Inc. All rights reserved.
//
// Use of this source code is governed by the LICENSE file in this repository.

package database

import (
"testing"

"github.com/sirupsen/logrus"
"gorm.io/gorm"
)

func TestDatabase_Engine_Ping(t *testing.T) {
_postgres, _mock := testPostgres(t)
defer _postgres.Close()
// ensure the mock expects the ping
_mock.ExpectPing()

// create a test database without mocking the call
_unmocked, _ := testPostgres(t)

_sqlite := testSqlite(t)
defer _sqlite.Close()

// setup tests
tests := []struct {
failure bool
name string
database *engine
}{
{
name: "success with postgres",
failure: false,
database: _postgres,
},
{
name: "success with sqlite",
failure: false,
database: _sqlite,
},
{
name: "failure without mocked call",
failure: true,
database: _unmocked,
},
{
name: "failure with invalid gorm database",
failure: true,
database: &engine{
Config: &Config{
Driver: "invalid",
},
Database: &gorm.DB{
Config: &gorm.Config{
ConnPool: nil,
},
},
Logger: logrus.NewEntry(logrus.StandardLogger()),
},
},
}

// run tests
for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
err := test.database.Ping()

if test.failure {
if err == nil {
t.Errorf("Ping for %s should have returned err", test.name)
}

return
}

if err != nil {
t.Errorf("Ping for %s returned err: %v", test.name, err)
}
})
}
}