Skip to content

Commit 19be5da

Browse files
committed
WIP: Add fallback handler
OCI registries don't provide a way to retrieve metadata in the same call as listing tags. This means that you have to do a separate API request for each tag if you want the metadata, which could be very slow for a large number of tags. As such, preferably use the selfhosted client as a fallback, but add a fallback fallback to the oci handler for registries that are incompatible with the selfhosted API implementation.
1 parent d28f8c6 commit 19be5da

File tree

3 files changed

+55
-3
lines changed

3 files changed

+55
-3
lines changed

pkg/client/client.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@ import (
1111
"github.com/jetstack/version-checker/pkg/client/acr"
1212
"github.com/jetstack/version-checker/pkg/client/docker"
1313
"github.com/jetstack/version-checker/pkg/client/ecr"
14+
"github.com/jetstack/version-checker/pkg/client/fallback"
1415
"github.com/jetstack/version-checker/pkg/client/gcr"
1516
"github.com/jetstack/version-checker/pkg/client/ghcr"
16-
"github.com/jetstack/version-checker/pkg/client/oci"
1717
"github.com/jetstack/version-checker/pkg/client/quay"
1818
"github.com/jetstack/version-checker/pkg/client/selfhosted"
1919
)
@@ -76,7 +76,7 @@ func New(ctx context.Context, log *logrus.Entry, opts Options) (*Client, error)
7676
selfhostedClients = append(selfhostedClients, sClient)
7777
}
7878

79-
fallbackClient, err := oci.New()
79+
fallbackClient, err := fallback.New(ctx, log)
8080
if err != nil {
8181
return nil, fmt.Errorf("failed to create fallback client: %s", err)
8282
}

pkg/client/client_test.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"github.com/jetstack/version-checker/pkg/client/acr"
1111
"github.com/jetstack/version-checker/pkg/client/docker"
1212
"github.com/jetstack/version-checker/pkg/client/ecr"
13+
"github.com/jetstack/version-checker/pkg/client/fallback"
1314
"github.com/jetstack/version-checker/pkg/client/gcr"
1415
"github.com/jetstack/version-checker/pkg/client/ghcr"
1516
"github.com/jetstack/version-checker/pkg/client/quay"
@@ -167,7 +168,7 @@ func TestFromImageURL(t *testing.T) {
167168
},
168169
"selfhosted with different domain should be fallback": {
169170
url: "registry.opensource.zalan.do/teapot/external-dns",
170-
expClient: new(selfhosted.Client),
171+
expClient: new(fallback.Client),
171172
expHost: "registry.opensource.zalan.do",
172173
expPath: "teapot/external-dns",
173174
},

pkg/client/fallback/fallback.go

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package fallback
2+
3+
import (
4+
"context"
5+
6+
"github.com/jetstack/version-checker/pkg/api"
7+
"github.com/jetstack/version-checker/pkg/client/oci"
8+
"github.com/jetstack/version-checker/pkg/client/selfhosted"
9+
"github.com/sirupsen/logrus"
10+
)
11+
12+
type Client struct {
13+
SelfHosted *selfhosted.Client
14+
OCI *oci.Client
15+
}
16+
17+
func New(ctx context.Context, log *logrus.Entry) (*Client, error) {
18+
sh, err := selfhosted.New(ctx, log, new(selfhosted.Options))
19+
if err != nil {
20+
return nil, err
21+
}
22+
oci, err := oci.New()
23+
if err != nil {
24+
return nil, err
25+
}
26+
27+
return &Client{
28+
SelfHosted: sh,
29+
OCI: oci,
30+
}, nil
31+
}
32+
33+
func (c *Client) Name() string {
34+
return "fallback"
35+
}
36+
37+
func (c *Client) Tags(ctx context.Context, host, repo, image string) ([]api.ImageTag, error) {
38+
// TODO: Cache selfhosted/oci by host
39+
if tags, err := c.SelfHosted.Tags(ctx, host, repo, image); err == nil {
40+
return tags, err
41+
}
42+
return c.OCI.Tags(ctx, host, repo, image)
43+
}
44+
45+
func (c *Client) IsHost(host string) bool {
46+
return true
47+
}
48+
49+
func (c *Client) RepoImageFromPath(path string) (string, string) {
50+
return c.SelfHosted.RepoImageFromPath(path)
51+
}

0 commit comments

Comments
 (0)