This adds the code used by buildx and compose into the default CLI program to help normalize the usage of these APIs and allow code reuse between projects. It also allows these projects to benefit from improvements or changes that may be made by another team. At the moment, these APIs are a pretty thin layer on the OTEL SDK. It configures an additional exporter to a docker endpoint that's used for usage collection and is only active if the option is configured in docker desktop. This also upgrades the OTEL version to v1.19 which is the one being used by buildkit, buildx, compose, etc. Signed-off-by: Jonathan A. Sternberg <jonathan.sternberg@docker.com>
63 lines
1.1 KiB
Go
63 lines
1.1 KiB
Go
package backoff
|
|
|
|
import (
|
|
"context"
|
|
"time"
|
|
)
|
|
|
|
// BackOffContext is a backoff policy that stops retrying after the context
|
|
// is canceled.
|
|
type BackOffContext interface { // nolint: golint
|
|
BackOff
|
|
Context() context.Context
|
|
}
|
|
|
|
type backOffContext struct {
|
|
BackOff
|
|
ctx context.Context
|
|
}
|
|
|
|
// WithContext returns a BackOffContext with context ctx
|
|
//
|
|
// ctx must not be nil
|
|
func WithContext(b BackOff, ctx context.Context) BackOffContext { // nolint: golint
|
|
if ctx == nil {
|
|
panic("nil context")
|
|
}
|
|
|
|
if b, ok := b.(*backOffContext); ok {
|
|
return &backOffContext{
|
|
BackOff: b.BackOff,
|
|
ctx: ctx,
|
|
}
|
|
}
|
|
|
|
return &backOffContext{
|
|
BackOff: b,
|
|
ctx: ctx,
|
|
}
|
|
}
|
|
|
|
func getContext(b BackOff) context.Context {
|
|
if cb, ok := b.(BackOffContext); ok {
|
|
return cb.Context()
|
|
}
|
|
if tb, ok := b.(*backOffTries); ok {
|
|
return getContext(tb.delegate)
|
|
}
|
|
return context.Background()
|
|
}
|
|
|
|
func (b *backOffContext) Context() context.Context {
|
|
return b.ctx
|
|
}
|
|
|
|
func (b *backOffContext) NextBackOff() time.Duration {
|
|
select {
|
|
case <-b.ctx.Done():
|
|
return Stop
|
|
default:
|
|
return b.BackOff.NextBackOff()
|
|
}
|
|
}
|