Skip to content

Commit caadce7

Browse files
committed
Add custom capabilities setting to registry config
Allows a registry mirror to be configured with the "push" capability which can be helpful in some proxy use-cases. Signed-off-by: Will Jordan <[email protected]>
1 parent d5a40ad commit caadce7

File tree

3 files changed

+93
-2
lines changed

3 files changed

+93
-2
lines changed

util/resolver/config/config.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ type RegistryConfig struct {
77
RootCAs []string `toml:"ca"`
88
KeyPairs []TLSKeyPair `toml:"keypair"`
99
TLSConfigDir []string `toml:"tlsconfigdir"`
10+
Capabilities []string `toml:"capabilities"`
1011
}
1112

1213
type TLSKeyPair struct {

util/resolver/resolver.go

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,25 @@ const (
2525
defaultPath = "/v2"
2626
)
2727

28+
func fillConfigOpts(host string, c config.RegistryConfig, h docker.RegistryHost) (*docker.RegistryHost, error) {
29+
if len(c.Capabilities) > 0 {
30+
h.Capabilities = 0
31+
for _, capability := range c.Capabilities {
32+
switch strings.ToLower(capability) {
33+
case "pull":
34+
h.Capabilities |= docker.HostCapabilityPull
35+
case "resolve":
36+
h.Capabilities |= docker.HostCapabilityResolve
37+
case "push":
38+
h.Capabilities |= docker.HostCapabilityPush
39+
default:
40+
return nil, errors.Errorf("unknown capability %v", c)
41+
}
42+
}
43+
}
44+
45+
return fillInsecureOpts(host, c, h)
46+
}
2847
func fillInsecureOpts(host string, c config.RegistryConfig, h docker.RegistryHost) (*docker.RegistryHost, error) {
2948
tc, err := loadTLSConfig(c)
3049
if err != nil {
@@ -134,7 +153,7 @@ func NewRegistryConfig(m map[string]config.RegistryConfig) docker.RegistryHosts
134153
for _, rawMirror := range c.Mirrors {
135154
h := newMirrorRegistryHost(rawMirror)
136155
mirrorHost := h.Host
137-
host, err := fillInsecureOpts(mirrorHost, m[mirrorHost], h)
156+
host, err := fillConfigOpts(mirrorHost, m[mirrorHost], h)
138157
if err != nil {
139158
return nil, err
140159
}
@@ -154,7 +173,7 @@ func NewRegistryConfig(m map[string]config.RegistryConfig) docker.RegistryHosts
154173
Capabilities: docker.HostCapabilityPush | docker.HostCapabilityPull | docker.HostCapabilityResolve,
155174
}
156175

157-
hosts, err := fillInsecureOpts(host, c, h)
176+
hosts, err := fillConfigOpts(host, c, h)
158177
if err != nil {
159178
return nil, err
160179
}

util/resolver/resolver_test.go

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"path"
66
"testing"
77

8+
"github.com/containerd/containerd/v2/core/remotes/docker"
89
"github.com/moby/buildkit/cmd/buildkitd/config"
910
"github.com/stretchr/testify/require"
1011
)
@@ -66,3 +67,73 @@ mirrors = ["https://url/", "https://url/path/"]
6667
}
6768
}
6869
}
70+
71+
func TestNewRegistryConfig(t *testing.T) {
72+
const testConfig = `
73+
[registry."docker.io"]
74+
mirrors = ["yourmirror.local", "proxy.local:5000/proxy.docker.io"]
75+
76+
[registry."yourmirror.local"]
77+
http = true
78+
79+
[registry."proxy.local:5000"]
80+
capabilities = ["pull", "resolve", "push"]
81+
`
82+
83+
pull, resolve, push := docker.HostCapabilityPull, docker.HostCapabilityResolve, docker.HostCapabilityPush
84+
tests := map[string][]struct {
85+
host string
86+
scheme string
87+
path string
88+
capabilities docker.HostCapabilities
89+
}{
90+
"docker.io": {
91+
{
92+
host: "yourmirror.local",
93+
scheme: "http",
94+
path: defaultPath,
95+
capabilities: pull | resolve,
96+
},
97+
{
98+
host: "proxy.local:5000",
99+
scheme: "https",
100+
path: path.Join(defaultPath, "proxy.docker.io"),
101+
capabilities: pull | resolve | push,
102+
},
103+
{
104+
host: "registry-1.docker.io",
105+
scheme: "https",
106+
path: defaultPath,
107+
capabilities: pull | resolve | push,
108+
},
109+
},
110+
"yourmirror.local": {
111+
{
112+
host: "yourmirror.local",
113+
scheme: "http",
114+
path: defaultPath,
115+
capabilities: pull | resolve | push,
116+
},
117+
},
118+
}
119+
120+
cfg, err := config.Load(bytes.NewBuffer([]byte(testConfig)))
121+
require.NoError(t, err)
122+
123+
require.NotEqual(t, 0, len(cfg.Registries))
124+
registryHosts := NewRegistryConfig(cfg.Registries)
125+
require.NotNil(t, registryHosts)
126+
127+
for hostname, testHost := range tests {
128+
hosts, err := registryHosts(hostname)
129+
require.NoError(t, err)
130+
require.Equal(t, len(testHost), len(hosts))
131+
for i, host := range hosts {
132+
test := testHost[i]
133+
require.Equal(t, test.host, host.Host)
134+
require.Equal(t, test.capabilities, host.Capabilities)
135+
require.Equal(t, test.scheme, host.Scheme)
136+
require.Equal(t, test.path, host.Path)
137+
}
138+
}
139+
}

0 commit comments

Comments
 (0)