Skip to content

Commit a34dd18

Browse files
author
Andrey Klimentyev
committed
Add option to use your own default registry
Fixes deckhouse#43
1 parent ab19a96 commit a34dd18

File tree

2 files changed

+43
-9
lines changed

2 files changed

+43
-9
lines changed

main.go

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,23 +2,23 @@ package main
22

33
import (
44
"flag"
5+
"fmt"
56
"log"
67
"net/http"
78
"strings"
89
"time"
910

11+
"github.com/flant/k8s-image-availability-exporter/pkg/handlers"
1012
"github.com/flant/k8s-image-availability-exporter/pkg/logging"
13+
"github.com/flant/k8s-image-availability-exporter/pkg/registry_checker"
1114

12-
"github.com/flant/k8s-image-availability-exporter/pkg/handlers"
15+
"github.com/google/go-containerregistry/pkg/name"
1316

1417
"github.com/sirupsen/logrus"
1518

1619
"github.com/prometheus/client_golang/prometheus"
17-
1820
"github.com/prometheus/client_golang/prometheus/promhttp"
1921

20-
"github.com/flant/k8s-image-availability-exporter/pkg/registry_checker"
21-
2222
"k8s.io/apimachinery/pkg/util/wait"
2323
"k8s.io/client-go/kubernetes"
2424
"k8s.io/client-go/tools/clientcmd"
@@ -32,6 +32,9 @@ func main() {
3232
bindAddr := flag.String("bind-address", ":8080", "address:port to bind /metrics endpoint to")
3333
insecureSkipVerify := flag.Bool("skip-registry-cert-verification", false, "whether to skip registries' certificate verification")
3434
specificNamespace := flag.String("namespace", "", "inspect specific namespace instead of whole k8s cluster")
35+
defaultRegistry := flag.String("default-registry", "",
36+
fmt.Sprintf("default registry to use in absence of a fully qualified image name, defaults to %q", name.DefaultRegistry))
37+
3538
flag.Parse()
3639

3740
logrus.SetFormatter(&logrus.TextFormatter{
@@ -66,6 +69,7 @@ func main() {
6669
*insecureSkipVerify,
6770
strings.Split(*ignoredImagesStr, ","),
6871
*specificNamespace,
72+
*defaultRegistry,
6973
)
7074
prometheus.MustRegister(registryChecker)
7175

pkg/registry_checker/checker.go

Lines changed: 35 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,10 @@ const (
2828
resyncPeriod = time.Hour
2929
)
3030

31+
type registryCheckerConfig struct {
32+
defaultRegistry string
33+
}
34+
3135
type RegistryChecker struct {
3236
imageStore *store.ImageStore
3337

@@ -44,14 +48,18 @@ type RegistryChecker struct {
4448
registryTransport *http.Transport
4549

4650
kubeClient *kubernetes.Clientset
51+
52+
config registryCheckerConfig
4753
}
4854

4955
func NewRegistryChecker(
5056
kubeClient *kubernetes.Clientset,
5157
skipVerify bool,
5258
ignoredImages []string,
5359
specificNamespace string,
60+
defaultRegistry string,
5461
) *RegistryChecker {
62+
5563
informerFactory := informers.NewSharedInformerFactory(kubeClient, time.Hour)
5664
if specificNamespace != "" {
5765
informerFactory = informers.NewSharedInformerFactoryWithOptions(kubeClient, time.Hour, informers.WithNamespace(specificNamespace))
@@ -76,6 +84,10 @@ func NewRegistryChecker(
7684
registryTransport: customTransport,
7785

7886
kubeClient: kubeClient,
87+
88+
config: registryCheckerConfig{
89+
defaultRegistry: defaultRegistry,
90+
},
7991
}
8092

8193
for _, image := range ignoredImages {
@@ -239,15 +251,33 @@ func (rc *RegistryChecker) Check() {
239251
processingGroup.Wait()
240252
}
241253

242-
func (rc *RegistryChecker) checkImageAvailability(log *logrus.Entry, imageName string, kc *keychain) (availMode store.AvailabilityMode) {
243-
ref, err := name.ParseReference(imageName)
254+
func checkImageNameParseErr(log *logrus.Entry, err error) store.AvailabilityMode {
244255
var parseErr *name.ErrBadName
245256
if errors.As(err, &parseErr) {
246257
log.WithField("availability_mode", store.BadImageName.String()).Error(err)
247258
return store.BadImageName
248-
} else if err != nil {
249-
log.WithField("availability_mode", store.UnknownError.String()).Error(err)
250-
return store.UnknownError
259+
}
260+
261+
log.WithField("availability_mode", store.UnknownError.String()).Error(err)
262+
return store.UnknownError
263+
}
264+
265+
func (rc *RegistryChecker) checkImageAvailability(log *logrus.Entry, imageName string, kc *keychain) (availMode store.AvailabilityMode) {
266+
var (
267+
ref name.Reference
268+
err error
269+
)
270+
271+
ref, err = name.ParseReference(imageName)
272+
if err != nil {
273+
return checkImageNameParseErr(log, err)
274+
}
275+
276+
if ref.Context().RegistryStr() == name.DefaultRegistry && rc.config.defaultRegistry != "" {
277+
ref, err = name.ParseReference(path.Join(rc.config.defaultRegistry, imageName))
278+
if err != nil {
279+
return checkImageNameParseErr(log, err)
280+
}
251281
}
252282

253283
var imgErr error

0 commit comments

Comments
 (0)