From 7c95ee02105b7cf0299fda606e719fbcfabd8f1a Mon Sep 17 00:00:00 2001 From: Rogee Date: Mon, 23 Mar 2026 16:22:28 +0800 Subject: [PATCH] test: cover registry k8s fallback path derivation --- internal/hubmodule/docker/hooks.go | 18 ++++++++++++ internal/hubmodule/docker/hooks_test.go | 38 +++++++++++++++++++++++++ 2 files changed, 56 insertions(+) diff --git a/internal/hubmodule/docker/hooks.go b/internal/hubmodule/docker/hooks.go index 5a2bd34..277bfa0 100644 --- a/internal/hubmodule/docker/hooks.go +++ b/internal/hubmodule/docker/hooks.go @@ -69,6 +69,24 @@ func isDockerHubHost(host string) bool { } } +func isRegistryK8sHost(host string) bool { + if parsedHost, _, err := net.SplitHostPort(host); err == nil { + host = parsedHost + } + return strings.EqualFold(host, "registry.k8s.io") +} + +func manifestFallbackPath(ctx *hooks.RequestContext, clean string) (string, bool) { + if ctx == nil || !isRegistryK8sHost(ctx.UpstreamHost) { + return "", false + } + repo, rest, ok := splitDockerRepoPath(clean) + if !ok || strings.Contains(repo, "/") || !strings.HasPrefix(rest, "/manifests/") { + return "", false + } + return "/v2/" + repo + "/" + repo + rest, true +} + func splitDockerRepoPath(path string) (string, string, bool) { if !strings.HasPrefix(path, "/v2/") { return "", "", false diff --git a/internal/hubmodule/docker/hooks_test.go b/internal/hubmodule/docker/hooks_test.go index 5e2a563..2047ea4 100644 --- a/internal/hubmodule/docker/hooks_test.go +++ b/internal/hubmodule/docker/hooks_test.go @@ -27,6 +27,44 @@ func TestNormalizePathSkipsLibraryForNonDockerHub(t *testing.T) { } } +func TestIsRegistryK8sHost(t *testing.T) { + if !isRegistryK8sHost("registry.k8s.io") { + t.Fatalf("expected registry.k8s.io to match") + } + if isRegistryK8sHost("example.com") { + t.Fatalf("expected non-registry.k8s.io host to be ignored") + } +} + +func TestRegistryK8sManifestFallbackPath(t *testing.T) { + ctx := &hooks.RequestContext{UpstreamHost: "registry.k8s.io"} + path, ok := manifestFallbackPath(ctx, "/v2/coredns/manifests/v1.13.1") + if !ok || path != "/v2/coredns/coredns/manifests/v1.13.1" { + t.Fatalf("expected fallback path, got %q ok=%v", path, ok) + } +} + +func TestRegistryK8sManifestFallbackPathRejectsMultiSegmentRepo(t *testing.T) { + ctx := &hooks.RequestContext{UpstreamHost: "registry.k8s.io"} + if _, ok := manifestFallbackPath(ctx, "/v2/coredns/coredns/manifests/v1.13.1"); ok { + t.Fatalf("expected multi-segment repo to be ignored") + } +} + +func TestRegistryK8sManifestFallbackPathRejectsNonManifest(t *testing.T) { + ctx := &hooks.RequestContext{UpstreamHost: "registry.k8s.io"} + if _, ok := manifestFallbackPath(ctx, "/v2/coredns/blobs/sha256:deadbeef"); ok { + t.Fatalf("expected non-manifest path to be ignored") + } +} + +func TestRegistryK8sManifestFallbackPathRejectsNonRegistryHost(t *testing.T) { + ctx := &hooks.RequestContext{UpstreamHost: "mirror.gcr.io"} + if _, ok := manifestFallbackPath(ctx, "/v2/coredns/manifests/v1.13.1"); ok { + t.Fatalf("expected non-registry.k8s.io host to be ignored") + } +} + func TestSplitDockerRepoPath(t *testing.T) { repo, rest, ok := splitDockerRepoPath("/v2/library/nginx/manifests/latest") if !ok || repo != "library/nginx" || rest != "/manifests/latest" {