@@ -17,6 +17,9 @@ import (
1717 "sync/atomic"
1818 "time"
1919
20+ "github.com/cenkalti/backoff/v5"
21+
22+ "github.com/elastic/elastic-agent/internal/pkg/agent/application/upgrade/artifact/download"
2023 semver "github.com/elastic/elastic-agent/pkg/version"
2124)
2225
@@ -116,21 +119,43 @@ func (r *artifactResult) Fetch(ctx context.Context, l Logger, dir string) error
116119 return fmt .Errorf ("failed to create path %q: %w" , dst , err )
117120 }
118121
119- err = DownloadPackage (ctx , l , r .doer , r .src , dst )
122+ _ , err = backoff .Retry (ctx , func () (any , error ) {
123+ if err = r .fetch (ctx , l , dst ); err != nil {
124+ return nil , err
125+ }
126+
127+ // check package hash
128+ if err = download .VerifySHA512Hash (dst ); err != nil {
129+ l .Logf ("inconsistent package hash detected: %s" , err )
130+ return nil , fmt .Errorf ("inconsistent package hash: %w" , err )
131+ }
132+
133+ return nil , nil
134+ },
135+ backoff .WithMaxTries (3 ),
136+ backoff .WithBackOff (backoff .NewConstantBackOff (3 * time .Second )),
137+ )
138+
120139 if err != nil {
140+ return fmt .Errorf ("failed to fetch %s: %w" , r .src , err )
141+ }
142+
143+ return nil
144+ }
145+
146+ func (r * artifactResult ) fetch (ctx context.Context , l Logger , dst string ) error {
147+ if err := DownloadPackage (ctx , l , r .doer , r .src , dst ); err != nil {
121148 return fmt .Errorf ("failed to download %s: %w" , r .src , err )
122149 }
123150
124151 // fetch package hash
125- err = DownloadPackage (ctx , l , r .doer , r .src + extHash , dst + extHash )
126- if err != nil {
127- return fmt .Errorf ("failed to download %s: %w" , r .src , err )
152+ if err := DownloadPackage (ctx , l , r .doer , r .src + extHash , dst + extHash ); err != nil {
153+ return fmt .Errorf ("failed to download %s: %w" , r .src + extHash , err )
128154 }
129155
130156 // fetch package asc
131- err = DownloadPackage (ctx , l , r .doer , r .src + extAsc , dst + extAsc )
132- if err != nil {
133- return fmt .Errorf ("failed to download %s: %w" , r .src , err )
157+ if err := DownloadPackage (ctx , l , r .doer , r .src + extAsc , dst + extAsc ); err != nil {
158+ return fmt .Errorf ("failed to download %s: %w" , r .src + extAsc , err )
134159 }
135160
136161 return nil
@@ -144,7 +169,12 @@ func findURI(ctx context.Context, doer httpDoer, version *semver.ParsedSemVer) (
144169 return fmt .Sprintf ("https://snapshots.elastic.co/%s-%s/downloads/beats/elastic-agent/" , version .CoreVersion (), version .BuildMetadata ()), nil
145170 }
146171
147- buildID , err := findLatestSnapshot (ctx , doer , version .CoreVersion ())
172+ buildID , err := backoff .Retry (ctx , func () (any , error ) {
173+ return findLatestSnapshot (ctx , doer , version .CoreVersion ())
174+ },
175+ backoff .WithMaxTries (3 ),
176+ backoff .WithBackOff (backoff .NewConstantBackOff (3 * time .Second )),
177+ )
148178 if err != nil {
149179 return "" , fmt .Errorf ("failed to find snapshot information for version %q: %w" , version , err )
150180 }
0 commit comments