From 5ddaa8f85e23948ffd4d1e52968c5925e3e2e99f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A1bor=20Ny=C3=ADri?= Date: Mon, 8 Jan 2024 21:09:40 +0100 Subject: [PATCH] Add retry capability --- README.md | 2 +- cli/cmd/consts.go | 1 + cli/cmd/getName.go | 10 ++++++++-- cli/cmd/groups.go | 8 +++++++- cli/cmd/retry.go | 15 +++++++++++++++ cli/cmd/setState.go | 6 +++++- cli/cmd/status.go | 9 ++++++++- cli/cmd/users.go | 8 +++++++- 8 files changed, 52 insertions(+), 7 deletions(-) create mode 100644 cli/cmd/retry.go diff --git a/README.md b/README.md index 111652e..6b38a82 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ If all goes fine, later this repository will provide you both a GoLang SDK and a ## TODOs * [ ] Create json output for machines. Improve documentation accordingly. -* [ ] Add retries. `status` command produces `PORT_ERROR` quite frequently while second try works fine. +* [x] Add retries. `status` command produces `PORT_ERROR` quite frequently while second try works fine. * [x] Improve token handling. Token is stored in `config.yaml` but it seems to be invalidated after a while. It should be renewed on demand. ## Usage diff --git a/cli/cmd/consts.go b/cli/cmd/consts.go index c50f489..ba41f7b 100644 --- a/cli/cmd/consts.go +++ b/cli/cmd/consts.go @@ -21,4 +21,5 @@ const ( LogoutCmdName = "logout" PingCmdName = "ping" TokenExpirationTime = time.Minute * 5 + retryCount = 3 ) diff --git a/cli/cmd/getName.go b/cli/cmd/getName.go index dfbd924..52db6f2 100644 --- a/cli/cmd/getName.go +++ b/cli/cmd/getName.go @@ -52,9 +52,15 @@ func GetName(localMac, mac [6]byte, host string, port int, token uint32) error { } }() - name, err := client.GetName() + var name string + err = retry(func() error { + var err2 error + name, err2 = client.GetName() + return err2 + }) + if err != nil { - return err + return nil } log.Infof("Received name: %s", name) diff --git a/cli/cmd/groups.go b/cli/cmd/groups.go index 52dae58..c0af393 100644 --- a/cli/cmd/groups.go +++ b/cli/cmd/groups.go @@ -54,7 +54,13 @@ func listGroups(localMac [6]byte, mac [6]byte, host string, port int, token uint } }() - groups, err := client.GetGroups() + var groups *sdk.Groups + err = retry(func() error { + var err2 error + groups, err2 = client.GetGroups() + return err2 + }) + if err != nil { return err } diff --git a/cli/cmd/retry.go b/cli/cmd/retry.go new file mode 100644 index 0000000..40e5435 --- /dev/null +++ b/cli/cmd/retry.go @@ -0,0 +1,15 @@ +package cmd + +func retry(f func() error) error { + var err error + + for i := 0; i < retryCount; i++ { + err = f() + if err == nil { + break + } + log.Debugf("Retriable error: %v", err) + } + + return err +} diff --git a/cli/cmd/setState.go b/cli/cmd/setState.go index ff0e2a9..d494c9e 100644 --- a/cli/cmd/setState.go +++ b/cli/cmd/setState.go @@ -57,7 +57,11 @@ func setStatus(localMac [6]byte, mac [6]byte, host string, port int, devicePort } }() - err = client.SetState(devicePort) + err = retry(func() error { + err2 := client.SetState(devicePort) + return err2 + }) + if err != nil { return err } diff --git a/cli/cmd/status.go b/cli/cmd/status.go index 561a243..5e753d6 100644 --- a/cli/cmd/status.go +++ b/cli/cmd/status.go @@ -3,6 +3,7 @@ package cmd import ( "bisecure/cli" "bisecure/sdk" + "bisecure/sdk/payload" "github.com/spf13/viper" "os" @@ -57,7 +58,13 @@ func getStatus(localMac [6]byte, mac [6]byte, host string, port int, devicePort } }() - status, err := client.GetTransition(devicePort) + var status *payload.HmGetTransitionResponse + err = retry(func() error { + var err2 error + status, err2 = client.GetTransition(devicePort) + return err2 + }) + if err != nil { return err } diff --git a/cli/cmd/users.go b/cli/cmd/users.go index 1cbe4d7..f34fa21 100644 --- a/cli/cmd/users.go +++ b/cli/cmd/users.go @@ -54,7 +54,13 @@ func listUsers(localMac [6]byte, mac [6]byte, host string, port int, token uint3 } }() - users, err := client.GetUsers() + var users *sdk.Users + err = retry(func() error { + var err2 error + users, err2 = client.GetUsers() + return err2 + }) + if err != nil { return err }