Check gets Ready and readme
Some checks are pending
continuous-integration/drone/push Build is running

This commit is contained in:
Marvin Steadfast 2021-06-15 10:48:12 +02:00
parent 45c92cefec
commit 7ed6294563
4 changed files with 134 additions and 3 deletions

View File

@ -22,3 +22,12 @@ test:
tidy: tidy:
go mod tidy go mod tidy
go mod vendor go mod vendor
.PHONY: readme
readme:
goreadme \
-title don \
-credit=false \
-functions \
-types \
> README.md

76
README.md Normal file
View File

@ -0,0 +1,76 @@
# don
Package don is a little helper if you need to check for the readiness of something.
This could be a command to run (like ssh) or a `db.Ping()` for check of the readiness
of a database container.
## Use as commandline tool
Download the tool from the [download page](https://git.xsfx.dev/xsteadfastx/don/releases).
```go
don -t 15m -r 15s -c "ssh -o StrictHostKeyChecking=no -o ConnectTimeout=10 root@container"
```
This example checks every 15 seconds if the ssh container is ready. It would timeout with an
error after 15 minutes.
## Use as a library
If you want to use don as a library, it just takes a `func() bool` in `don.Ready()`
have a function that runs the readiness check and returns `true` or `false` if its
ready or not. The second argument is the overall timeout and
the third argument is the check interval. Import it like this:
```go
import go.xsfx.dev/don
```
Doing the readiness check like this:
```go
if err := don.Ready(
func() bool {
db, err := sql.Open("oracle", dbConn)
if err != nil {
log.Warn().Err(err).Str("dbConn", dbConn).Msg("could not open connection")
return false
}
if err := db.Ping(); err != nil {
log.Warn().Err(err).Str("dbConn", dbConn).Msg("could not ping")
return false
}
return true
},
10*time.Minute,
30*time.Second,
); err != nil {
log.Error().Err(err).Msg("received error")
teardown(pool, resource, tmpState.Name())
os.Exit(1)
}
```
## Functions
### func [Cmd](/don.go#L65)
`func Cmd(c string) func() bool`
Cmd returns a `func() bool` for working with don.Check. It executes a command and
returns a true if everything looks fine or a false if there was some kind of error.
### func [Ready](/don.go#L83)
`func Ready(f func() bool, timeout time.Duration, retry time.Duration) error`
Ready takes a function that executes something and returns a bool to indicate if
something is ready or not. It returns an error if it timeouts.
## Sub Packages
* [cmd](./cmd)

View File

@ -30,7 +30,7 @@ var (
var rootCmd = &cobra.Command{ var rootCmd = &cobra.Command{
Use: "don [command]", Use: "don [command]",
Run: func(cmd *cobra.Command, args []string) { Run: func(cmd *cobra.Command, args []string) {
if err := don.Check(don.Cmd(command), timeout, retry); err != nil { if err := don.Ready(don.Cmd(command), timeout, retry); err != nil {
log.Fatal().Err(err).Msg("received error") log.Fatal().Err(err).Msg("received error")
} }

50
don.go
View File

@ -1,6 +1,52 @@
// Package don is a little helper if you need to check for the readiness of something. // Package don is a little helper if you need to check for the readiness of something.
// This could be a command to run (like ssh) or a `db.Ping()` for check of the readiness // This could be a command to run (like ssh) or a `db.Ping()` for check of the readiness
// of a database container. // of a database container.
//
// Use as commandline tool
//
// Download the tool from the (download page) https://git.xsfx.dev/xsteadfastx/don/releases.
//
// don -t 15m -r 15s -c "ssh -o StrictHostKeyChecking=no -o ConnectTimeout=10 root@container"
//
// This example checks every 15 seconds if the ssh container is ready. It would timeout with an
// error after 15 minutes.
//
// Use as a library
//
// If you want to use don as a library, it just takes a `func() bool` in `don.Ready()`
// have a function that runs the readiness check and returns `true` or `false` if its
// ready or not. The second argument is the overall timeout and
// the third argument is the check interval. Import it like this:
//
// import go.xsfx.dev/don
//
// Doing the readiness check like this:
//
// if err := don.Ready(
// func() bool {
// db, err := sql.Open("oracle", dbConn)
// if err != nil {
// log.Warn().Err(err).Str("dbConn", dbConn).Msg("could not open connection")
//
// return false
// }
//
// if err := db.Ping(); err != nil {
// log.Warn().Err(err).Str("dbConn", dbConn).Msg("could not ping")
//
// return false
// }
//
// return true
// },
// 10*time.Minute,
// 30*time.Second,
// ); err != nil {
// log.Error().Err(err).Msg("received error")
// teardown(pool, resource, tmpState.Name())
// os.Exit(1)
// }
//
package don package don
import ( import (
@ -32,9 +78,9 @@ func Cmd(c string) func() bool {
} }
} }
// Check takes a function that executes something and returns a bool to indicate if // Ready takes a function that executes something and returns a bool to indicate if
// something is ready or not. It returns an error if it timeouts. // something is ready or not. It returns an error if it timeouts.
func Check(f func() bool, timeout time.Duration, retry time.Duration) error { func Ready(f func() bool, timeout time.Duration, retry time.Duration) error {
chReady := make(chan struct{}) chReady := make(chan struct{})
go func() { go func() {