diff --git a/.github/workflows/zos-update-worker-main.yml b/.github/workflows/zos-update-worker-main.yml index 516ecefa..a425e483 100644 --- a/.github/workflows/zos-update-worker-main.yml +++ b/.github/workflows/zos-update-worker-main.yml @@ -2,9 +2,9 @@ name: Zos Update Worker defaults: run: - working-directory: tools/zos-update-worker + working-directory: tools/zos-update-worker -on: +on: push: paths: - tools/zos-update-worker/** @@ -21,20 +21,24 @@ jobs: - name: Install GO uses: actions/setup-go@v3 - with: - go-version: 1.19 + with: + go-version: 1.24 - name: golangci-lint uses: golangci/golangci-lint-action@v3 with: args: --timeout 3m --verbose - working-directory: tools/zos-update-worker + working-directory: tools/zos-update-worker + + - uses: WillAbides/setup-go-faster@v1.14.0 + with: + go-version: 1.24 - name: staticcheck - uses: dominikh/staticcheck-action@v1.3.0 + uses: dominikh/staticcheck-action@v1.3.1 with: - version: "2022.1.3" - working-directory: tools/zos-update-worker + version: "latest" + working-directory: tools/zos-update-worker env: GO111MODULE: on @@ -43,8 +47,6 @@ jobs: with: gofmt-flags: "-l -d" gofmt-path: "tools/zos-update-worker" - + - name: Test run: go test -v ./... - - diff --git a/tools/zos-update-worker/go.mod b/tools/zos-update-worker/go.mod index 4580a2d8..ef062286 100644 --- a/tools/zos-update-worker/go.mod +++ b/tools/zos-update-worker/go.mod @@ -1,12 +1,24 @@ module github.com/threefoldtech/zos4/tools/zos-update-version -go 1.23.0 +go 1.24 -toolchain go1.24.0 +require ( + github.com/pkg/errors v0.9.1 + github.com/rs/zerolog v1.33.0 + github.com/spf13/cobra v1.9.1 + github.com/threefoldtech/tfgrid4-sdk-go/node-registrar v0.0.0-20250409160225-5883fc775bc7 +) require ( - github.com/rs/zerolog v1.28.0 - github.com/spf13/cobra v1.8.1 + github.com/ChainSafe/go-schnorrkel v1.0.0 // indirect + github.com/cosmos/go-bip39 v1.0.0 // indirect + github.com/decred/base58 v1.0.4 // indirect + github.com/decred/dcrd/crypto/blake256 v1.0.0 // indirect + github.com/gtank/merlin v0.1.1 // indirect + github.com/gtank/ristretto255 v0.1.2 // indirect + github.com/mimoo/StrobeGo v0.0.0-20220103164710-9a04d6ca976b // indirect + github.com/vedhavyas/go-subkey/v2 v2.0.0 // indirect + golang.org/x/crypto v0.35.0 // indirect ) require ( @@ -15,7 +27,7 @@ require ( github.com/mattn/go-colorable v0.1.14 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/spf13/pflag v1.0.6 // indirect - golang.org/x/sys v0.30.0 // indirect + golang.org/x/sys v0.31.0 // indirect ) replace github.com/centrifuge/go-substrate-rpc-client/v4 v4.0.5 => github.com/threefoldtech/go-substrate-rpc-client/v4 v4.0.6-0.20220927094755-0f0d22c73cc7 diff --git a/tools/zos-update-worker/go.sum b/tools/zos-update-worker/go.sum index e8629929..5104691b 100644 --- a/tools/zos-update-worker/go.sum +++ b/tools/zos-update-worker/go.sum @@ -1,30 +1,80 @@ +github.com/ChainSafe/go-schnorrkel v1.0.0 h1:3aDA67lAykLaG1y3AOjs88dMxC88PgUuHRrLeDnvGIM= +github.com/ChainSafe/go-schnorrkel v1.0.0/go.mod h1:dpzHYVxLZcp8pjlV+O+UR8K0Hp/z7vcchBSbMBEhCw4= +github.com/btcsuite/btcd/btcec/v2 v2.2.0 h1:fzn1qaOt32TuLjFlkzYSsBC35Q3KUjT1SwPxiMSCF5k= +github.com/btcsuite/btcd/btcec/v2 v2.2.0/go.mod h1:U7MHm051Al6XmscBQ0BoNydpOTsFAn707034b5nY8zU= github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= -github.com/coreos/go-systemd/v22 v22.3.3-0.20220203105225-a9a7ef127534/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/cosmos/go-bip39 v0.0.0-20180819234021-555e2067c45d/go.mod h1:tSxLoYXyBmiFeKpvmq4dzayMdCjCnu8uqmCysIGBT2Y= +github.com/cosmos/go-bip39 v1.0.0 h1:pcomnQdrdH22njcAatO0yWojsUnCO3y2tNoV1cb6hHY= +github.com/cosmos/go-bip39 v1.0.0/go.mod h1:RNJv0H/pOIVgxw6KS7QeX2a0Uo0aKUlfhZ4xuwvCdJw= +github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/decred/base58 v1.0.4 h1:QJC6B0E0rXOPA8U/kw2rP+qiRJsUaE2Er+pYb3siUeA= +github.com/decred/base58 v1.0.4/go.mod h1:jJswKPEdvpFpvf7dsDvFZyLT22xZ9lWqEByX38oGd9E= +github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= +github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 h1:YLtO71vCjJRCBcrPMtQ9nqBsqpA1m5sE92cU+pd5Mcc= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= +github.com/ethereum/go-ethereum v1.10.20 h1:75IW830ClSS40yrQC1ZCMZCt5I+zU16oqId2SiQwdQ4= +github.com/ethereum/go-ethereum v1.10.20/go.mod h1:LWUN82TCHGpxB3En5HVmLLzPD7YSrEUFmFfN1nKkVN0= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/gtank/merlin v0.1.1-0.20191105220539-8318aed1a79f/go.mod h1:T86dnYJhcGOh5BjZFCJWTDeTK7XW8uE+E21Cy/bIQ+s= +github.com/gtank/merlin v0.1.1 h1:eQ90iG7K9pOhtereWsmyRJ6RAwcP4tHTDBHXNg+u5is= +github.com/gtank/merlin v0.1.1/go.mod h1:T86dnYJhcGOh5BjZFCJWTDeTK7XW8uE+E21Cy/bIQ+s= +github.com/gtank/ristretto255 v0.1.2 h1:JEqUCPA1NvLq5DwYtuzigd7ss8fwbYay9fi4/5uMzcc= +github.com/gtank/ristretto255 v0.1.2/go.mod h1:Ph5OpO6c7xKUGROZfWVLiJf9icMDwUeIvY4OmlYW69o= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mimoo/StrobeGo v0.0.0-20181016162300-f8f6d4d2b643/go.mod h1:43+3pMjjKimDBf5Kr4ZFNGbLql1zKkbImw+fZbw3geM= +github.com/mimoo/StrobeGo v0.0.0-20220103164710-9a04d6ca976b h1:QrHweqAtyJ9EwCaGHBu1fghwxIPiopAHV06JlXrMHjk= +github.com/mimoo/StrobeGo v0.0.0-20220103164710-9a04d6ca976b/go.mod h1:xxLb2ip6sSUts3g1irPVHyk/DGslwQsNOo9I7smJfNU= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= -github.com/rs/zerolog v1.28.0 h1:MirSo27VyNi7RJYP3078AA1+Cyzd2GB66qy3aUHvsWY= -github.com/rs/zerolog v1.28.0/go.mod h1:NILgTygv/Uej1ra5XxGf82ZFSLk58MFGAUS2o6usyD0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= +github.com/rs/zerolog v1.33.0 h1:1cU2KZkvPxNyfgEmhHAz/1A9Bz+llsdYzklWFzgp0r8= +github.com/rs/zerolog v1.33.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM= -github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y= -github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo= +github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0= github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/threefoldtech/tfgrid4-sdk-go/node-registrar v0.0.0-20250409160225-5883fc775bc7 h1:T3qgbann0BZTAfCzXYlL6P6NpPPd23+Ywq27iBcrp44= +github.com/threefoldtech/tfgrid4-sdk-go/node-registrar v0.0.0-20250409160225-5883fc775bc7/go.mod h1:wZl1DI8fj9dfQryTDBgAqsbALzzi6VJTtuzcOP9xlkY= +github.com/vedhavyas/go-subkey/v2 v2.0.0 h1:LemDIsrVtRSOkp0FA8HxP6ynfKjeOj3BY2U9UNfeDMA= +github.com/vedhavyas/go-subkey/v2 v2.0.0/go.mod h1:95aZ+XDCWAUUynjlmi7BtPExjXgXxByE0WfBwbmIRH4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.35.0 h1:b15kiHdrGCHrP6LvwaQ3c03kgNhhiMgvlhxHQhmg2Xs= +golang.org/x/crypto v0.35.0/go.mod h1:dy7dXNW32cAb/6/PRuTNsix8T+vJAqvuIy5Bli/x0YQ= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc= -golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik= +golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/tools/zos-update-worker/internal/update_worker.go b/tools/zos-update-worker/internal/update_worker.go index 0b1a66d2..ccbaf484 100644 --- a/tools/zos-update-worker/internal/update_worker.go +++ b/tools/zos-update-worker/internal/update_worker.go @@ -2,18 +2,16 @@ package internal import ( "context" - "encoding/base64" - "encoding/json" "fmt" - "io" - "net/http" "os" "path/filepath" - "strings" "time" + "github.com/pkg/errors" + "github.com/cenkalti/backoff" "github.com/rs/zerolog/log" + "github.com/threefoldtech/tfgrid4-sdk-go/node-registrar/client" ) type Network string @@ -30,63 +28,17 @@ type Params struct { TestUrl string MainUrl string } -type RegistrarClient struct { - url string -} - -func NewRegistrarClient(url string) RegistrarClient { - return RegistrarClient{url: url} -} - -type RegistrarVersion struct { - SafeToUpgrade bool `json:"safe_to_upgrade"` - Version string `json:"version"` -} - -func (r RegistrarClient) GetZosVersion() (RegistrarVersion, error) { - url := fmt.Sprintf("%s/v1/zos/version", r.url) - resp, err := http.DefaultClient.Get(url) - if err != nil { - fmt.Println("Error sending get version request:", err) - return RegistrarVersion{}, err - } - defer resp.Body.Close() - body, err := io.ReadAll(resp.Body) - if err != nil { - fmt.Println("Error reading response body:", err) - } else { - fmt.Println("Response received:", string(body)) - } - if resp.StatusCode != http.StatusOK { - return RegistrarVersion{}, fmt.Errorf("failed to get version %s with status code %s", url, resp.Status) - } - defer resp.Body.Close() - jsonVersion, err := base64.StdEncoding.DecodeString(strings.Trim(string(body), "\"")) - if err != nil { - return RegistrarVersion{}, fmt.Errorf("failed to decode version %w", err) - } - correctedJSON := strings.ReplaceAll(string(jsonVersion), "'", "\"") - var version RegistrarVersion - err = json.Unmarshal([]byte(correctedJSON), &version) - // err = json.NewDecoder(resp.Body).Decode(&version) - if err != nil { - return RegistrarVersion{}, fmt.Errorf("failed to unmarshal version %w", err) - } - - return version, nil -} type Worker struct { src string dst string interval time.Duration - clients map[Network]RegistrarClient + clients map[Network]client.RegistrarClient } // NewWorker creates a new instance of the worker func NewWorker(src string, dst string, params Params) (*Worker, error) { - // we need to recalculate the path of the symlink here because of the following // - assume we run the tool like `updater -d dst -s src` // - it's then gonna build the links as above. @@ -109,18 +61,30 @@ func NewWorker(src string, dst string, params Params) (*Worker, error) { log.Info().Str("src", src).Str("dst", dst).Msg("paths") - clients := map[Network]RegistrarClient{} + clients := map[Network]client.RegistrarClient{} if params.QAUrl != "" { - clients[QANetwork] = RegistrarClient{url: params.QAUrl} + cli, err := client.NewRegistrarClient(params.QAUrl) + if err != nil { + return nil, errors.Wrap(err, "failed to create new registrar client for qa net") + } + clients[QANetwork] = cli } if params.TestUrl != "" { - clients[TestNetwork] = RegistrarClient{url: params.TestUrl} + cli, err := client.NewRegistrarClient(params.TestUrl) + if err != nil { + return nil, errors.Wrap(err, "failed to create new registrar client for test net") + } + clients[TestNetwork] = cli } if params.MainUrl != "" { - clients[MainNetwork] = RegistrarClient{url: params.MainUrl} + cli, err := client.NewRegistrarClient(params.MainUrl) + if err != nil { + return nil, errors.Wrap(err, "failed to create new registrar client for main net") + } + clients[MainNetwork] = cli } return &Worker{ @@ -141,7 +105,7 @@ func checkNetwork(network Network) error { } // updateZosVersion updates the latest zos flist for a specific network with the updated zos version -func (w *Worker) updateZosVersion(network Network, regClient RegistrarClient) error { +func (w *Worker) updateZosVersion(network Network, regClient client.RegistrarClient) error { if err := checkNetwork(network); err != nil { return err } @@ -167,7 +131,7 @@ func (w *Worker) updateZosVersion(network Network, regClient RegistrarClient) er return fmt.Errorf("failed to get dst relative path to src: %w", err) } - //zos + // zos zosCurrent := fmt.Sprintf("%v/.tag-%v", w.src, regVersion.Version) zosLatest := fmt.Sprintf("%v/%v", w.dst, network) @@ -225,15 +189,12 @@ func (w *Worker) UpdateWithInterval(ctx context.Context) { exp.MaxInterval = 2 * time.Second exp.MaxElapsedTime = 10 * time.Second err := backoff.Retry(func() error { - err := w.updateZosVersion(network, regClient) if err != nil { log.Error().Err(err).Msg("update failure. retrying") } return err - }, exp) - if err != nil { log.Error().Err(err).Msg("update zos failed with error") }