Merge pull request #4155 from fuweid/bugfix-for-default-hostconfig

bugfix: add default host config if not set
This commit is contained in:
Derek McGowan 2020-04-06 16:01:22 -07:00 committed by GitHub
commit 173cbc1ba9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 74 additions and 14 deletions

View File

@ -74,6 +74,7 @@ func ConfigureHosts(ctx context.Context, options HostOptions) docker.RegistryHos
return nil, err return nil, err
} }
if dir != "" { if dir != "" {
log.G(ctx).WithField("dir", dir).Debug("loading host directory")
hosts, err = loadHostDir(ctx, dir) hosts, err = loadHostDir(ctx, dir)
if err != nil { if err != nil {
return nil, err return nil, err
@ -88,11 +89,10 @@ func ConfigureHosts(ctx context.Context, options HostOptions) docker.RegistryHos
if hosts == nil { if hosts == nil {
hosts = make([]hostConfig, 1) hosts = make([]hostConfig, 1)
} }
if len(hosts) > 1 { if len(hosts) > 0 && hosts[len(hosts)-1].host == "" {
if hosts[len(hosts)-1].host == "" {
if host == "docker.io" { if host == "docker.io" {
hosts[len(hosts)-1].scheme = "https" hosts[len(hosts)-1].scheme = "https"
hosts[len(hosts)-1].host = "https://registry-1.docker.io" hosts[len(hosts)-1].host = "registry-1.docker.io"
} else { } else {
hosts[len(hosts)-1].host = host hosts[len(hosts)-1].host = host
if options.DefaultScheme != "" { if options.DefaultScheme != "" {
@ -102,7 +102,7 @@ func ConfigureHosts(ctx context.Context, options HostOptions) docker.RegistryHos
} }
} }
hosts[len(hosts)-1].path = "/v2" hosts[len(hosts)-1].path = "/v2"
} hosts[len(hosts)-1].capabilities = docker.HostCapabilityPull | docker.HostCapabilityResolve | docker.HostCapabilityPush
} }
defaultTransport := &http.Transport{ defaultTransport := &http.Transport{

View File

@ -23,11 +23,55 @@ import (
"path/filepath" "path/filepath"
"testing" "testing"
"github.com/containerd/containerd/log/logtest"
"github.com/containerd/containerd/remotes/docker" "github.com/containerd/containerd/remotes/docker"
) )
const allCaps = docker.HostCapabilityPull | docker.HostCapabilityResolve | docker.HostCapabilityPush
func TestDefaultHosts(t *testing.T) {
ctx := logtest.WithT(context.Background(), t)
resolve := ConfigureHosts(ctx, HostOptions{})
for _, tc := range []struct {
host string
expected []docker.RegistryHost
}{
{
host: "docker.io",
expected: []docker.RegistryHost{
{
Scheme: "https",
Host: "registry-1.docker.io",
Path: "/v2",
Capabilities: allCaps,
},
},
},
} {
hosts, err := resolve(tc.host)
if err != nil {
t.Errorf("[%s] resolve failed: %v", tc.host, err)
continue
}
if len(hosts) != len(tc.expected) {
t.Errorf("[%s] unexpected number of hosts %d, expected %d", tc.host, len(hosts), len(tc.expected))
continue
}
for j := range hosts {
if !compareRegistryHost(hosts[j], tc.expected[j]) {
t.Errorf("[%s] [%d] unexpected host %v, expected %v", tc.host, j, hosts[j], tc.expected[j])
break
}
}
}
}
func TestParseHostFile(t *testing.T) { func TestParseHostFile(t *testing.T) {
ctx := context.Background() ctx := logtest.WithT(context.Background(), t)
const testtoml = ` const testtoml = `
server = "https://test-default.registry" server = "https://test-default.registry"
@ -56,7 +100,6 @@ ca = "/etc/path/default"
client = ["/etc/certs/client-1.pem", "/etc/certs/client-2.pem"] client = ["/etc/certs/client-1.pem", "/etc/certs/client-2.pem"]
` `
var tb, fb = true, false var tb, fb = true, false
var allCaps = docker.HostCapabilityPull | docker.HostCapabilityResolve | docker.HostCapabilityPush
expected := []hostConfig{ expected := []hostConfig{
{ {
scheme: "https", scheme: "https",
@ -142,6 +185,23 @@ ca = "/etc/path/default"
} }
} }
func compareRegistryHost(j, k docker.RegistryHost) bool {
if j.Scheme != k.Scheme {
return false
}
if j.Host != k.Host {
return false
}
if j.Path != k.Path {
return false
}
if j.Capabilities != k.Capabilities {
return false
}
// Not comparing TLS configs or authorizations
return true
}
func compareHostConfig(j, k hostConfig) bool { func compareHostConfig(j, k hostConfig) bool {
if j.scheme != k.scheme { if j.scheme != k.scheme {
return false return false