642e9917ff
This uses otel standard environment variables to configure tracing in the daemon. It also adds support for propagating trace contexts in the client and reading those from the API server. See https://opentelemetry.io/docs/specs/otel/configuration/sdk-environment-variables/ for details on otel environment variables. Signed-off-by: Brian Goff <cpuguy83@gmail.com>
65 lines
1.8 KiB
Go
65 lines
1.8 KiB
Go
package client // import "github.com/docker/docker/client"
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/json"
|
|
"io"
|
|
"net/http"
|
|
|
|
"github.com/docker/docker/api/types"
|
|
)
|
|
|
|
// transportFunc allows us to inject a mock transport for testing. We define it
|
|
// here so we can detect the tlsconfig and return nil for only this type.
|
|
type transportFunc func(*http.Request) (*http.Response, error)
|
|
|
|
func (tf transportFunc) RoundTrip(req *http.Request) (*http.Response, error) {
|
|
return tf(req)
|
|
}
|
|
|
|
func transportEnsureBody(f transportFunc) transportFunc {
|
|
return func(req *http.Request) (*http.Response, error) {
|
|
resp, err := f(req)
|
|
if resp != nil && resp.Body == nil {
|
|
resp.Body = http.NoBody
|
|
}
|
|
return resp, err
|
|
}
|
|
}
|
|
|
|
func newMockClient(doer func(*http.Request) (*http.Response, error)) *http.Client {
|
|
return &http.Client{
|
|
// Some tests return a response with a nil body, this is incorrect semantically and causes a panic with wrapper transports (such as otelhttp's)
|
|
// Wrap the doer to ensure a body is always present even if it is empty.
|
|
Transport: transportEnsureBody(transportFunc(doer)),
|
|
}
|
|
}
|
|
|
|
func errorMock(statusCode int, message string) func(req *http.Request) (*http.Response, error) {
|
|
return func(req *http.Request) (*http.Response, error) {
|
|
header := http.Header{}
|
|
header.Set("Content-Type", "application/json")
|
|
|
|
body, err := json.Marshal(&types.ErrorResponse{
|
|
Message: message,
|
|
})
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &http.Response{
|
|
StatusCode: statusCode,
|
|
Body: io.NopCloser(bytes.NewReader(body)),
|
|
Header: header,
|
|
}, nil
|
|
}
|
|
}
|
|
|
|
func plainTextErrorMock(statusCode int, message string) func(req *http.Request) (*http.Response, error) {
|
|
return func(req *http.Request) (*http.Response, error) {
|
|
return &http.Response{
|
|
StatusCode: statusCode,
|
|
Body: io.NopCloser(bytes.NewReader([]byte(message))),
|
|
}, nil
|
|
}
|
|
}
|