feat: Add useProxies to registryMirror allowing to mirror more anything (#965)
* feat: add useProxies to registryMirror to allow mirroring anything Signed-off-by: momiji <teq1uila-free01@yahoo.fr>
This commit is contained in:
parent
9f75cabc34
commit
b4cc13db41
|
|
@ -527,6 +527,9 @@ type RegistryMirror struct {
|
||||||
|
|
||||||
// Request the remote registry directly.
|
// Request the remote registry directly.
|
||||||
Direct bool `yaml:"direct" mapstructure:"direct"`
|
Direct bool `yaml:"direct" mapstructure:"direct"`
|
||||||
|
|
||||||
|
// Whether to use proxies to decide when to use dragonfly
|
||||||
|
UseProxies bool `yaml:"useProxies" mapstructure:"useProxies"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// TLSConfig returns the tls.Config used to communicate with the mirror.
|
// TLSConfig returns the tls.Config used to communicate with the mirror.
|
||||||
|
|
|
||||||
|
|
@ -269,8 +269,11 @@ func (proxy *Proxy) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// check direct request
|
||||||
|
directRequest := r.Method != http.MethodConnect && r.URL.Scheme == ""
|
||||||
|
|
||||||
// check whiteList
|
// check whiteList
|
||||||
if !proxy.checkWhiteList(r) {
|
if !directRequest && !proxy.checkWhiteList(r) {
|
||||||
status := http.StatusUnauthorized
|
status := http.StatusUnauthorized
|
||||||
http.Error(w, http.StatusText(status), status)
|
http.Error(w, http.StatusText(status), status)
|
||||||
logger.Debugf("not in whitelist: %s, url:%s", r.Host, r.URL.String())
|
logger.Debugf("not in whitelist: %s, url:%s", r.Host, r.URL.String())
|
||||||
|
|
@ -556,7 +559,13 @@ func (proxy *Proxy) shouldUseDragonfly(req *http.Request) bool {
|
||||||
// shouldUseDragonflyForMirror returns whether we should use dragonfly to proxy a request
|
// shouldUseDragonflyForMirror returns whether we should use dragonfly to proxy a request
|
||||||
// when we use registry mirror.
|
// when we use registry mirror.
|
||||||
func (proxy *Proxy) shouldUseDragonflyForMirror(req *http.Request) bool {
|
func (proxy *Proxy) shouldUseDragonflyForMirror(req *http.Request) bool {
|
||||||
return proxy.registry != nil && !proxy.registry.Direct && transport.NeedUseDragonfly(req)
|
if proxy.registry == nil || proxy.registry.Direct {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
if proxy.registry.UseProxies {
|
||||||
|
return proxy.shouldUseDragonfly(req)
|
||||||
|
}
|
||||||
|
return transport.NeedUseDragonfly(req)
|
||||||
}
|
}
|
||||||
|
|
||||||
// tunnelHTTPS handles a CONNECT request and proxy an https request through an
|
// tunnelHTTPS handles a CONNECT request and proxy an https request through an
|
||||||
|
|
|
||||||
|
|
@ -56,7 +56,7 @@ func (tc *testCase) WithRule(regx string, direct bool, useHTTPS bool, redirect s
|
||||||
return tc
|
return tc
|
||||||
}
|
}
|
||||||
|
|
||||||
func (tc *testCase) WithRegistryMirror(rawURL string, direct bool, dynamic bool) *testCase {
|
func (tc *testCase) WithRegistryMirror(rawURL string, direct bool, dynamic bool, useProxies bool) *testCase {
|
||||||
if tc.Error != nil {
|
if tc.Error != nil {
|
||||||
return tc
|
return tc
|
||||||
}
|
}
|
||||||
|
|
@ -67,6 +67,7 @@ func (tc *testCase) WithRegistryMirror(rawURL string, direct bool, dynamic bool)
|
||||||
Remote: &config.URL{URL: u},
|
Remote: &config.URL{URL: u},
|
||||||
DynamicRemote: dynamic,
|
DynamicRemote: dynamic,
|
||||||
Direct: direct,
|
Direct: direct,
|
||||||
|
UseProxies: useProxies,
|
||||||
}
|
}
|
||||||
return tc
|
return tc
|
||||||
}
|
}
|
||||||
|
|
@ -109,7 +110,7 @@ func (tc *testCase) TestMirror(t *testing.T) {
|
||||||
if !a.Nil(tc.Error) {
|
if !a.Nil(tc.Error) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
tp, err := NewProxy(WithRegistryMirror(tc.RegistryMirror))
|
tp, err := NewProxy(WithRegistryMirror(tc.RegistryMirror), WithRules(tc.Rules))
|
||||||
if !a.Nil(err) {
|
if !a.Nil(err) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
@ -154,17 +155,39 @@ func TestMatch(t *testing.T) {
|
||||||
TestMirror(t)
|
TestMirror(t)
|
||||||
|
|
||||||
newTestCase().
|
newTestCase().
|
||||||
WithRegistryMirror("http://index.docker.io", false, false).
|
WithRegistryMirror("http://index.docker.io", false, false, false).
|
||||||
WithTest("http://h/a", true, false, "").
|
WithTest("http://h/a", true, false, "").
|
||||||
TestMirror(t)
|
TestMirror(t)
|
||||||
|
|
||||||
newTestCase().
|
newTestCase().
|
||||||
WithRegistryMirror("http://index.docker.io", false, false).
|
WithRegistryMirror("http://index.docker.io", false, false, false).
|
||||||
WithTest("http://index.docker.io/v2/blobs/sha256/xxx", false, false, "").
|
WithTest("http://index.docker.io/v2/blobs/sha256/xxx", false, false, "").
|
||||||
TestMirror(t)
|
TestMirror(t)
|
||||||
|
|
||||||
newTestCase().
|
newTestCase().
|
||||||
WithRegistryMirror("http://index.docker.io", true, false).
|
WithRegistryMirror("http://index.docker.io", true, false, false).
|
||||||
|
WithTest("http://index.docker.io/v2/blobs/sha256/xxx", true, false, "").
|
||||||
|
TestMirror(t)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestMatchWithUseProxies(t *testing.T) {
|
||||||
|
// should direct as registry is set with direct=false and no proxies are defined
|
||||||
|
newTestCase().
|
||||||
|
WithRegistryMirror("http://index.docker.io", false, false, true).
|
||||||
|
WithTest("http://index.docker.io/v2/blobs/sha256/xxx", true, false, "").
|
||||||
|
TestMirror(t)
|
||||||
|
|
||||||
|
// should cache as registry is set with direct=false, and one proxy matches
|
||||||
|
newTestCase().
|
||||||
|
WithRegistryMirror("http://index.docker.io", false, false, true).
|
||||||
|
WithRule("/blobs/sha256/", false, false, "").
|
||||||
|
WithTest("http://index.docker.io/v2/blobs/sha256/xxx", false, false, "").
|
||||||
|
TestMirror(t)
|
||||||
|
|
||||||
|
// should direct as registry is set with direct=true, even if one proxy matches
|
||||||
|
newTestCase().
|
||||||
|
WithRegistryMirror("http://index.docker.io", true, false, true).
|
||||||
|
WithRule("/blobs/sha256/", false, false, "").
|
||||||
WithTest("http://index.docker.io/v2/blobs/sha256/xxx", true, false, "").
|
WithTest("http://index.docker.io/v2/blobs/sha256/xxx", true, false, "").
|
||||||
TestMirror(t)
|
TestMirror(t)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -221,6 +221,8 @@ proxy:
|
||||||
certs: []
|
certs: []
|
||||||
# whether to request the remote registry directly
|
# whether to request the remote registry directly
|
||||||
direct: false
|
direct: false
|
||||||
|
# whether to use proxies to decide if dragonfly should be used
|
||||||
|
useProxies: false
|
||||||
|
|
||||||
proxies:
|
proxies:
|
||||||
# proxy all http image layer download requests with dfget
|
# proxy all http image layer download requests with dfget
|
||||||
|
|
|
||||||
|
|
@ -194,6 +194,8 @@ proxy:
|
||||||
certs: []
|
certs: []
|
||||||
# 是否直连镜像中心,true 的话,流量不再走 p2p
|
# 是否直连镜像中心,true 的话,流量不再走 p2p
|
||||||
direct: false
|
direct: false
|
||||||
|
# whether to use proxies to decide if dragonfly should be used
|
||||||
|
useProxies: false
|
||||||
|
|
||||||
proxies:
|
proxies:
|
||||||
# 代理镜像 blobs 信息
|
# 代理镜像 blobs 信息
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue