@@ -13,14 +13,103 @@ limitations under the License.
13
13
14
14
package bundle
15
15
16
+ import (
17
+ "context"
18
+ "fmt"
19
+ "strconv"
20
+ "time"
21
+
22
+ "github.com/google/go-containerregistry/pkg/v1/remote"
23
+ "github.com/tektoncd/pipeline/pkg/resolution/resolver/framework"
24
+ )
25
+
16
26
const (
17
27
// ConfigServiceAccount is the configuration field name for controlling
18
28
// the Service Account name to use for bundle requests.
19
29
ConfigServiceAccount = "default-service-account"
20
30
// ConfigKind is the configuration field name for controlling
21
31
// what the layer name in the bundle image is.
22
32
ConfigKind = "default-kind"
23
- // DefaultTimeoutKey is the configuration field name for controlling
33
+ // ConfigTimeoutKey is the configuration field name for controlling
24
34
// the maximum duration of a resolution request for a file from registry.
25
35
ConfigTimeoutKey = "fetch-timeout"
36
+ // ConfigBackoffDuration is the configuration field name for controlling
37
+ // the initial duration of a backoff when a bundle resolution fails
38
+ ConfigBackoffDuration = "backoff-duration"
39
+ DefaultBackoffDuration = 2.0 * time .Second
40
+ // ConfigBackoffFactor is the configuration field name for controlling
41
+ // the factor by which successive backoffs will increase when a bundle
42
+ // resolution fails
43
+ ConfigBackoffFactor = "backoff-factor"
44
+ DefaultBackoffFactor = 2.0
45
+ // ConfigBackoffJitter is the configuration field name for controlling
46
+ // the randomness applied to backoff durations when a bundle resolution fails
47
+ ConfigBackoffJitter = "backoff-jitter"
48
+ DefaultBackoffJitter = 0.1
49
+ // ConfigBackoffSteps is the configuration field name for controlling
50
+ // the number of attempted backoffs to retry when a bundle resolution fails
51
+ ConfigBackoffSteps = "backoff-steps"
52
+ DefaultBackoffSteps = 2
53
+ // ConfigBackoffCap is the configuration field name for controlling
54
+ // the maximum duration to try when backing off
55
+ ConfigBackoffCap = "backoff-cap"
56
+ DefaultBackoffCap = 10 * time .Second
26
57
)
58
+
59
+ // GetBundleResolverBackoff returns a remote.Backoff to
60
+ // be passed when resolving remote images. This can be configured with the
61
+ // backoff-duration, backoff-factor, backoff-jitter, backoff-steps, and backoff-cap
62
+ // fields in the bundle-resolver-config ConfigMap.
63
+ func GetBundleResolverBackoff (ctx context.Context ) (remote.Backoff , error ) {
64
+ conf := framework .GetResolverConfigFromContext (ctx )
65
+
66
+ customRetryBackoff := remote.Backoff {
67
+ Duration : DefaultBackoffDuration ,
68
+ Factor : DefaultBackoffFactor ,
69
+ Jitter : DefaultBackoffJitter ,
70
+ Steps : DefaultBackoffSteps ,
71
+ Cap : DefaultBackoffCap ,
72
+ }
73
+ if v , ok := conf [ConfigBackoffDuration ]; ok {
74
+ var err error
75
+ duration , err := time .ParseDuration (v )
76
+ if err != nil {
77
+ return customRetryBackoff , fmt .Errorf ("error parsing backoff duration value %s: %w" , v , err )
78
+ }
79
+ customRetryBackoff .Duration = duration
80
+ }
81
+ if v , ok := conf [ConfigBackoffFactor ]; ok {
82
+ var err error
83
+ factor , err := strconv .ParseFloat (v , 64 )
84
+ if err != nil {
85
+ return customRetryBackoff , fmt .Errorf ("error parsing backoff factor value %s: %w" , v , err )
86
+ }
87
+ customRetryBackoff .Factor = factor
88
+ }
89
+ if v , ok := conf [ConfigBackoffJitter ]; ok {
90
+ var err error
91
+ jitter , err := strconv .ParseFloat (v , 64 )
92
+ if err != nil {
93
+ return customRetryBackoff , fmt .Errorf ("error parsing backoff jitter value %s: %w" , v , err )
94
+ }
95
+ customRetryBackoff .Jitter = jitter
96
+ }
97
+ if v , ok := conf [ConfigBackoffSteps ]; ok {
98
+ var err error
99
+ steps , err := strconv .Atoi (v )
100
+ if err != nil {
101
+ return customRetryBackoff , fmt .Errorf ("error parsing backoff steps value %s: %w" , v , err )
102
+ }
103
+ customRetryBackoff .Steps = steps
104
+ }
105
+ if v , ok := conf [ConfigBackoffCap ]; ok {
106
+ var err error
107
+ cap , err := time .ParseDuration (v )
108
+ if err != nil {
109
+ return customRetryBackoff , fmt .Errorf ("error parsing backoff steps value %s: %w" , v , err )
110
+ }
111
+ customRetryBackoff .Cap = cap
112
+ }
113
+
114
+ return customRetryBackoff , nil
115
+ }
0 commit comments