Skip to content

Commit f8d0bda

Browse files
committed
Add OCI registry client as second fallback
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 74cde3c commit f8d0bda

File tree

6 files changed

+153
-4
lines changed

6 files changed

+153
-4
lines changed

go.mod

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ require (
2727

2828
require (
2929
github.com/gofri/go-github-ratelimit v1.1.0
30+
github.com/google/go-containerregistry v0.19.0
3031
github.com/google/go-github/v58 v58.0.0
3132
)
3233

@@ -50,7 +51,12 @@ require (
5051
github.com/aws/smithy-go v1.20.2 // indirect
5152
github.com/beorn7/perks v1.0.1 // indirect
5253
github.com/cespare/xxhash/v2 v2.2.0 // indirect
54+
github.com/containerd/stargz-snapshotter/estargz v0.14.3 // indirect
5355
github.com/davecgh/go-spew v1.1.1 // indirect
56+
github.com/docker/cli v24.0.0+incompatible // indirect
57+
github.com/docker/distribution v2.8.2+incompatible // indirect
58+
github.com/docker/docker v24.0.0+incompatible // indirect
59+
github.com/docker/docker-credential-helpers v0.7.0 // indirect
5460
github.com/emicklei/go-restful/v3 v3.11.0 // indirect
5561
github.com/evanphx/json-patch v5.7.0+incompatible // indirect
5662
github.com/go-errors/errors v1.5.1 // indirect
@@ -75,19 +81,24 @@ require (
7581
github.com/jmespath/go-jmespath v0.4.0 // indirect
7682
github.com/josharian/intern v1.0.0 // indirect
7783
github.com/json-iterator/go v1.1.12 // indirect
84+
github.com/klauspost/compress v1.16.5 // indirect
7885
github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de // indirect
7986
github.com/mailru/easyjson v0.7.7 // indirect
8087
github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect
88+
github.com/mitchellh/go-homedir v1.1.0 // indirect
8189
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
8290
github.com/modern-go/reflect2 v1.0.2 // indirect
8391
github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 // indirect
8492
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
93+
github.com/opencontainers/go-digest v1.0.0 // indirect
94+
github.com/opencontainers/image-spec v1.1.0-rc3 // indirect
8595
github.com/peterbourgon/diskv v2.0.1+incompatible // indirect
8696
github.com/pkg/errors v0.9.1 // indirect
8797
github.com/prometheus/client_model v0.5.0 // indirect
8898
github.com/prometheus/common v0.45.0 // indirect
8999
github.com/prometheus/procfs v0.12.0 // indirect
90100
github.com/rogpeppe/go-internal v1.11.0 // indirect
101+
github.com/vbatts/tar-split v0.11.3 // indirect
91102
github.com/xlab/treeprint v1.2.0 // indirect
92103
go.starlark.net v0.0.0-20231101134539-556fd59b42f6 // indirect
93104
golang.org/x/crypto v0.17.0 // indirect
@@ -97,7 +108,6 @@ require (
97108
golang.org/x/term v0.15.0 // indirect
98109
golang.org/x/text v0.14.0 // indirect
99110
golang.org/x/time v0.3.0 // indirect
100-
golang.org/x/tools v0.9.1 // indirect
101111
google.golang.org/appengine v1.6.8 // indirect
102112
google.golang.org/protobuf v1.33.0 // indirect
103113
gopkg.in/evanphx/json-patch.v5 v5.7.0 // indirect

go.sum

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ github.com/Azure/go-autorest/logger v0.2.1 h1:IG7i4p/mDa2Ce4TRyAO8IHnVhAVF3RFU+Z
1414
github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8=
1515
github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo=
1616
github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU=
17+
github.com/BurntSushi/toml v1.2.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
1718
github.com/aws/aws-sdk-go v1.47.1 h1:j9ih0Ashcw8tQcnfqNimBM8ARQ/CMpoBwjKue1D6Fuk=
1819
github.com/aws/aws-sdk-go v1.47.1/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk=
1920
github.com/aws/aws-sdk-go-v2 v1.26.1 h1:5554eUqIYVWpU0YmeeYZ0wU64H2VLBs8TlhRB2L+EkA=
@@ -48,11 +49,21 @@ github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
4849
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
4950
github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=
5051
github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
52+
github.com/containerd/stargz-snapshotter/estargz v0.14.3 h1:OqlDCK3ZVUO6C3B/5FSkDwbkEETK84kQgEeFwDC+62k=
53+
github.com/containerd/stargz-snapshotter/estargz v0.14.3/go.mod h1:KY//uOCIkSuNAHhJogcZtrNHdKrA99/FCCRjE3HD36o=
5154
github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
5255
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
5356
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
5457
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
5558
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
59+
github.com/docker/cli v24.0.0+incompatible h1:0+1VshNwBQzQAx9lOl+OYCTCEAD8fKs/qeXMx3O0wqM=
60+
github.com/docker/cli v24.0.0+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8=
61+
github.com/docker/distribution v2.8.2+incompatible h1:T3de5rq0dB1j30rp0sA2rER+m322EBzniBPB6ZIzuh8=
62+
github.com/docker/distribution v2.8.2+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
63+
github.com/docker/docker v24.0.0+incompatible h1:z4bf8HvONXX9Tde5lGBMQ7yCJgNahmJumdrStZAbeY4=
64+
github.com/docker/docker v24.0.0+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
65+
github.com/docker/docker-credential-helpers v0.7.0 h1:xtCHsjxogADNZcdv1pKUHXryefjlVRqWqIhk/uXJp0A=
66+
github.com/docker/docker-credential-helpers v0.7.0/go.mod h1:rETQfLdHNT3foU5kuNkFR1R1V12OJRRO5lzt2D1b5X0=
5667
github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g=
5768
github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=
5869
github.com/evanphx/json-patch v5.7.0+incompatible h1:vgGkfT/9f8zE6tvSCe74nfpAVDQ2tG6yudJd8LBksgI=
@@ -92,6 +103,8 @@ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
92103
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
93104
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
94105
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
106+
github.com/google/go-containerregistry v0.19.0 h1:uIsMRBV7m/HDkDxE/nXMnv1q+lOOSPlQ/ywc5JbB8Ic=
107+
github.com/google/go-containerregistry v0.19.0/go.mod h1:u0qB2l7mvtWVR5kNcbFIhFY1hLbf8eeGapA+vbFDCtQ=
95108
github.com/google/go-github/v58 v58.0.0 h1:Una7GGERlF/37XfkPwpzYJe0Vp4dt2k1kCjlxwjIvzw=
96109
github.com/google/go-github/v58 v58.0.0/go.mod h1:k4hxDKEfoWpSqFlc8LTpGd9fu2KrV1YAa6Hi6FmDNY4=
97110
github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8=
@@ -126,6 +139,8 @@ github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnr
126139
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
127140
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
128141
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
142+
github.com/klauspost/compress v1.16.5 h1:IFV2oUNUzZaz+XyusxpLzpzS8Pt5rh0Z16For/djlyI=
143+
github.com/klauspost/compress v1.16.5/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE=
129144
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
130145
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
131146
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
@@ -138,6 +153,8 @@ github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0
138153
github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
139154
github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg=
140155
github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k=
156+
github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
157+
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
141158
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
142159
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
143160
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
@@ -149,6 +166,10 @@ github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq
149166
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
150167
github.com/onsi/ginkgo/v2 v2.9.4 h1:xR7vG4IXt5RWx6FfIjyAtsoMAtnc3C/rFXBBd2AjZwE=
151168
github.com/onsi/gomega v1.27.6 h1:ENqfyGeS5AX/rlXDd/ETokDz93u0YufY1Pgxuy/PvWE=
169+
github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U=
170+
github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM=
171+
github.com/opencontainers/image-spec v1.1.0-rc3 h1:fzg1mXZFj8YdPeNkRXMg+zb88BFV0Ys52cJydRwBkb8=
172+
github.com/opencontainers/image-spec v1.1.0-rc3/go.mod h1:X4pATf0uXsnn3g5aiGIsVnJBR4mxhKzfwmvK/B2NTm8=
152173
github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+vxiaj6gdUUzhl4XmI=
153174
github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU=
154175
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
@@ -167,6 +188,7 @@ github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDN
167188
github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA=
168189
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
169190
github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0=
191+
github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
170192
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
171193
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
172194
github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I=
@@ -185,6 +207,9 @@ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO
185207
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
186208
github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
187209
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
210+
github.com/urfave/cli v1.22.12/go.mod h1:sSBEIC79qR6OvcmsD4U3KABeOTxDqQtdDnaFuUN30b8=
211+
github.com/vbatts/tar-split v0.11.3 h1:hLFqsOLQ1SsppQNTMpkpPXClLDfC2A3Zgy9OUU+RVck=
212+
github.com/vbatts/tar-split v0.11.3/go.mod h1:9QlHN18E+fEH7RdG+QAJJcuya3rqT7eXSTY7wGrAokY=
188213
github.com/xlab/treeprint v1.2.0 h1:HzHnuAF1plUN2zGlAFHbSQP2qJ0ZAD3XF5XD7OesXRQ=
189214
github.com/xlab/treeprint v1.2.0/go.mod h1:gj5Gd3gPdKtR1ikdDK6fnFLdmIS0X30kTTuNd/WEJu0=
190215
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
@@ -230,6 +255,7 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc
230255
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
231256
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
232257
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
258+
golang.org/x/sys v0.0.0-20220906165534-d0df966e6959/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
233259
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
234260
golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc=
235261
golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
@@ -254,7 +280,6 @@ golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roY
254280
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
255281
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
256282
golang.org/x/tools v0.9.1 h1:8WMNJAz3zrtPmnYC7ISf5dEn3MT0gY7jBJfw27yrrLo=
257-
golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc=
258283
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
259284
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
260285
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
@@ -278,6 +303,7 @@ gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
278303
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
279304
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
280305
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
306+
gotest.tools/v3 v3.0.3 h1:4AuOwCGf4lLR9u3YOe2awrHygurzhO/HeQ6laiA6Sx0=
281307
k8s.io/api v0.28.3 h1:Gj1HtbSdB4P08C8rs9AR94MfSGpRhJgsS+GF9V26xMM=
282308
k8s.io/api v0.28.3/go.mod h1:MRCV/jr1dW87/qJnZ57U5Pak65LGmQVkKTzf3AtKFHc=
283309
k8s.io/apimachinery v0.28.3 h1:B1wYx8txOaCQG0HmYF6nbpU8dg6HvA06x5tEffvOe7A=

pkg/client/client.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ 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"
1617
"github.com/jetstack/version-checker/pkg/client/quay"
@@ -75,7 +76,7 @@ func New(ctx context.Context, log *logrus.Entry, opts Options) (*Client, error)
7576
selfhostedClients = append(selfhostedClients, sClient)
7677
}
7778

78-
fallbackClient, err := selfhosted.New(ctx, log, new(selfhosted.Options))
79+
fallbackClient, err := fallback.New(ctx, log)
7980
if err != nil {
8081
return nil, fmt.Errorf("failed to create fallback client: %s", err)
8182
}

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+
}

pkg/client/oci/oci.go

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package oci
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"strings"
7+
8+
"github.com/google/go-containerregistry/pkg/name"
9+
"github.com/google/go-containerregistry/pkg/v1/remote"
10+
"github.com/jetstack/version-checker/pkg/api"
11+
)
12+
13+
type Client struct{}
14+
15+
func New() (*Client, error) {
16+
return &Client{}, nil
17+
}
18+
19+
func (c *Client) Name() string {
20+
return "oci"
21+
}
22+
23+
func (c *Client) Tags(ctx context.Context, host, repo, image string) ([]api.ImageTag, error) {
24+
src := fmt.Sprintf("%s/%s/%s", host, repo, image)
25+
rpo, err := name.NewRepository(src)
26+
if err != nil {
27+
return []api.ImageTag{}, err
28+
}
29+
30+
bareTags, err := remote.List(rpo, remote.WithContext(ctx))
31+
if err != nil {
32+
return []api.ImageTag{}, err
33+
}
34+
35+
var tags []api.ImageTag
36+
for _, t := range bareTags {
37+
tags = append(tags, api.ImageTag{Tag: t})
38+
}
39+
40+
return tags, nil
41+
}
42+
43+
func (c *Client) IsHost(host string) bool {
44+
return true
45+
}
46+
47+
func (c *Client) RepoImageFromPath(path string) (string, string) {
48+
split := strings.Split(path, "/")
49+
50+
lenSplit := len(split)
51+
if lenSplit == 1 {
52+
return "", split[0]
53+
}
54+
55+
if lenSplit > 1 {
56+
return split[lenSplit-2], split[lenSplit-1]
57+
}
58+
59+
return path, ""
60+
}

0 commit comments

Comments
 (0)