forked from TrueCloudLab/distribution
9c88801a12
Back in the before time, the best practices surrounding usage of Context weren't quite worked out. We defined our own type to make usage easier. As this packaged was used elsewhere, it make it more and more challenging to integrate with the forked `Context` type. Now that it is available in the standard library, we can just use that one directly. To make usage more consistent, we now use `dcontext` when referring to the distribution context package. Signed-off-by: Stephen J Day <stephen.day@docker.com>
73 lines
1.8 KiB
Go
73 lines
1.8 KiB
Go
package context
|
|
|
|
import (
|
|
"context"
|
|
"sync"
|
|
|
|
"github.com/docker/distribution/uuid"
|
|
)
|
|
|
|
// instanceContext is a context that provides only an instance id. It is
|
|
// provided as the main background context.
|
|
type instanceContext struct {
|
|
context.Context
|
|
id string // id of context, logged as "instance.id"
|
|
once sync.Once // once protect generation of the id
|
|
}
|
|
|
|
func (ic *instanceContext) Value(key interface{}) interface{} {
|
|
if key == "instance.id" {
|
|
ic.once.Do(func() {
|
|
// We want to lazy initialize the UUID such that we don't
|
|
// call a random generator from the package initialization
|
|
// code. For various reasons random could not be available
|
|
// https://github.com/docker/distribution/issues/782
|
|
ic.id = uuid.Generate().String()
|
|
})
|
|
return ic.id
|
|
}
|
|
|
|
return ic.Context.Value(key)
|
|
}
|
|
|
|
var background = &instanceContext{
|
|
Context: context.Background(),
|
|
}
|
|
|
|
// Background returns a non-nil, empty Context. The background context
|
|
// provides a single key, "instance.id" that is globally unique to the
|
|
// process.
|
|
func Background() context.Context {
|
|
return background
|
|
}
|
|
|
|
// stringMapContext is a simple context implementation that checks a map for a
|
|
// key, falling back to a parent if not present.
|
|
type stringMapContext struct {
|
|
context.Context
|
|
m map[string]interface{}
|
|
}
|
|
|
|
// WithValues returns a context that proxies lookups through a map. Only
|
|
// supports string keys.
|
|
func WithValues(ctx context.Context, m map[string]interface{}) context.Context {
|
|
mo := make(map[string]interface{}, len(m)) // make our own copy.
|
|
for k, v := range m {
|
|
mo[k] = v
|
|
}
|
|
|
|
return stringMapContext{
|
|
Context: ctx,
|
|
m: mo,
|
|
}
|
|
}
|
|
|
|
func (smc stringMapContext) Value(key interface{}) interface{} {
|
|
if ks, ok := key.(string); ok {
|
|
if v, ok := smc.m[ks]; ok {
|
|
return v
|
|
}
|
|
}
|
|
|
|
return smc.Context.Value(key)
|
|
}
|