From 0344ac239b1d27ab100173c8cf0152fb123e76e1 Mon Sep 17 00:00:00 2001 From: Lantao Liu Date: Tue, 23 Jul 2019 19:10:31 -0700 Subject: [PATCH] Update containerd for config backward compatibility. Signed-off-by: Lantao Liu --- vendor.conf | 2 +- .../cmd/containerd/command/config.go | 5 +++++ .../cmd/containerd/command/config_linux.go | 2 +- .../containerd/command/config_unsupported.go | 2 +- .../cmd/containerd/command/config_windows.go | 2 +- .../containerd/remotes/docker/authorizer.go | 22 ++++++++++++++----- .../containerd/remotes/docker/resolver.go | 14 ++++++++++-- 7 files changed, 38 insertions(+), 11 deletions(-) diff --git a/vendor.conf b/vendor.conf index 983081595..bbaf187d0 100644 --- a/vendor.conf +++ b/vendor.conf @@ -2,7 +2,7 @@ github.com/beorn7/perks 4c0e84591b9aa9e6dcfdf3e020114cd81f89d5f9 github.com/BurntSushi/toml v0.3.1 github.com/containerd/cgroups db272301ab8449d05f062e6db6f13d8a6aaff466 github.com/containerd/console 0650fd9eeb50bab4fc99dceb9f2e14cf58f36e7f -github.com/containerd/containerd 2f69be5594cecacdbe42076ed12c7039a0638a2c +github.com/containerd/containerd 31afff294400b5a69bdb3ec387ecdf5bad57a038 github.com/containerd/continuity bd77b46c8352f74eb12c85bdc01f4b90f69d66b4 github.com/containerd/fifo 3d5202aec260678c48179c56f40e6f38a095738c github.com/containerd/go-cni 22460c018b64cf8bf4151b3ff9c4d077e6a88cbf diff --git a/vendor/github.com/containerd/containerd/cmd/containerd/command/config.go b/vendor/github.com/containerd/containerd/cmd/containerd/command/config.go index de9790ecf..6eec996cb 100644 --- a/vendor/github.com/containerd/containerd/cmd/containerd/command/config.go +++ b/vendor/github.com/containerd/containerd/cmd/containerd/command/config.go @@ -50,6 +50,11 @@ var configCommand = cli.Command{ config := &Config{ Config: defaultConfig(), } + // for the time being, keep the defaultConfig's version set at 1 so that + // when a config without a version is loaded from disk and has no version + // set, we assume it's a v1 config. But when generating new configs via + // this command, generate the v2 config + config.Config.Version = 2 plugins, err := server.LoadPlugins(gocontext.Background(), config.Config) if err != nil { return err diff --git a/vendor/github.com/containerd/containerd/cmd/containerd/command/config_linux.go b/vendor/github.com/containerd/containerd/cmd/containerd/command/config_linux.go index 3bbc0ab0d..9ed7368d7 100644 --- a/vendor/github.com/containerd/containerd/cmd/containerd/command/config_linux.go +++ b/vendor/github.com/containerd/containerd/cmd/containerd/command/config_linux.go @@ -23,7 +23,7 @@ import ( func defaultConfig() *srvconfig.Config { return &srvconfig.Config{ - Version: 2, + Version: 1, Root: defaults.DefaultRootDir, State: defaults.DefaultStateDir, GRPC: srvconfig.GRPCConfig{ diff --git a/vendor/github.com/containerd/containerd/cmd/containerd/command/config_unsupported.go b/vendor/github.com/containerd/containerd/cmd/containerd/command/config_unsupported.go index 0408ac230..695a7b466 100644 --- a/vendor/github.com/containerd/containerd/cmd/containerd/command/config_unsupported.go +++ b/vendor/github.com/containerd/containerd/cmd/containerd/command/config_unsupported.go @@ -25,7 +25,7 @@ import ( func defaultConfig() *srvconfig.Config { return &srvconfig.Config{ - Version: 2, + Version: 1, Root: defaults.DefaultRootDir, State: defaults.DefaultStateDir, GRPC: srvconfig.GRPCConfig{ diff --git a/vendor/github.com/containerd/containerd/cmd/containerd/command/config_windows.go b/vendor/github.com/containerd/containerd/cmd/containerd/command/config_windows.go index 3bbc0ab0d..9ed7368d7 100644 --- a/vendor/github.com/containerd/containerd/cmd/containerd/command/config_windows.go +++ b/vendor/github.com/containerd/containerd/cmd/containerd/command/config_windows.go @@ -23,7 +23,7 @@ import ( func defaultConfig() *srvconfig.Config { return &srvconfig.Config{ - Version: 2, + Version: 1, Root: defaults.DefaultRootDir, State: defaults.DefaultStateDir, GRPC: srvconfig.GRPCConfig{ diff --git a/vendor/github.com/containerd/containerd/remotes/docker/authorizer.go b/vendor/github.com/containerd/containerd/remotes/docker/authorizer.go index 73adb5a2f..3097cc3b5 100644 --- a/vendor/github.com/containerd/containerd/remotes/docker/authorizer.go +++ b/vendor/github.com/containerd/containerd/remotes/docker/authorizer.go @@ -31,6 +31,7 @@ import ( "github.com/containerd/containerd/errdefs" "github.com/containerd/containerd/log" + "github.com/containerd/containerd/version" "github.com/pkg/errors" "github.com/sirupsen/logrus" "golang.org/x/net/context/ctxhttp" @@ -40,6 +41,7 @@ type dockerAuthorizer struct { credentials func(string) (string, string, error) client *http.Client + ua string mu sync.Mutex auth map[string]string @@ -54,6 +56,7 @@ func NewAuthorizer(client *http.Client, f func(string) (string, string, error)) return &dockerAuthorizer{ credentials: f, client: client, + ua: "containerd/" + version.Version, auth: map[string]string{}, } } @@ -194,11 +197,16 @@ func (a *dockerAuthorizer) fetchTokenWithOAuth(ctx context.Context, to tokenOpti form.Set("password", to.secret) } - resp, err := ctxhttp.Post( - ctx, a.client, to.realm, - "application/x-www-form-urlencoded; charset=utf-8", - strings.NewReader(form.Encode()), - ) + req, err := http.NewRequest("POST", to.realm, strings.NewReader(form.Encode())) + if err != nil { + return "", err + } + req.Header.Set("Content-Type", "application/x-www-form-urlencoded; charset=utf-8") + if a.ua != "" { + req.Header.Set("User-Agent", a.ua) + } + + resp, err := ctxhttp.Do(ctx, a.client, req) if err != nil { return "", err } @@ -244,6 +252,10 @@ func (a *dockerAuthorizer) fetchToken(ctx context.Context, to tokenOptions) (str return "", err } + if a.ua != "" { + req.Header.Set("User-Agent", a.ua) + } + reqParams := req.URL.Query() if to.service != "" { diff --git a/vendor/github.com/containerd/containerd/remotes/docker/resolver.go b/vendor/github.com/containerd/containerd/remotes/docker/resolver.go index 00e1c8556..45282fb51 100644 --- a/vendor/github.com/containerd/containerd/remotes/docker/resolver.go +++ b/vendor/github.com/containerd/containerd/remotes/docker/resolver.go @@ -111,6 +111,7 @@ type dockerResolver struct { auth Authorizer host func(string) (string, error) headers http.Header + uagent string plainHTTP bool client *http.Client tracker StatusTracker @@ -135,16 +136,22 @@ func NewResolver(options ResolverOptions) remotes.Resolver { ocispec.MediaTypeImageManifest, ocispec.MediaTypeImageIndex, "*"}, ", ")) } - if _, ok := options.Headers["User-Agent"]; !ok { - options.Headers.Set("User-Agent", "containerd/"+version.Version) + ua := options.Headers.Get("User-Agent") + if ua != "" { + options.Headers.Del("User-Agent") + } else { + ua = "containerd/" + version.Version } + if options.Authorizer == nil { options.Authorizer = NewAuthorizer(options.Client, options.Credentials) + options.Authorizer.(*dockerAuthorizer).ua = ua } return &dockerResolver{ auth: options.Authorizer, host: options.Host, headers: options.Headers, + uagent: ua, plainHTTP: options.PlainHTTP, client: options.Client, tracker: options.Tracker, @@ -351,6 +358,7 @@ func (r *dockerResolver) Pusher(ctx context.Context, ref string) (remotes.Pusher type dockerBase struct { refspec reference.Spec base url.URL + uagent string client *http.Client auth Authorizer @@ -382,6 +390,7 @@ func (r *dockerResolver) base(refspec reference.Spec) (*dockerBase, error) { return &dockerBase{ refspec: refspec, base: base, + uagent: r.uagent, client: r.client, auth: r.auth, }, nil @@ -407,6 +416,7 @@ func (r *dockerBase) authorize(ctx context.Context, req *http.Request) error { func (r *dockerBase) doRequest(ctx context.Context, req *http.Request) (*http.Response, error) { ctx = log.WithLogger(ctx, log.G(ctx).WithField("url", req.URL.String())) log.G(ctx).WithField("request.headers", req.Header).WithField("request.method", req.Method).Debug("do request") + req.Header.Set("User-Agent", r.uagent) if err := r.authorize(ctx, req); err != nil { return nil, errors.Wrap(err, "failed to authorize") }