github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/docker/registry/registry.go (about) 1 // Copyright 2021 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package registry 5 6 import ( 7 "net/http" 8 9 "github.com/juju/errors" 10 "github.com/juju/loggo" 11 12 "github.com/juju/juju/docker" 13 "github.com/juju/juju/docker/registry/internal" 14 ) 15 16 var logger = loggo.GetLogger("juju.docker.registry") 17 18 //go:generate go run go.uber.org/mock/mockgen -package mocks -destination mocks/http_mock.go net/http RoundTripper 19 //go:generate go run go.uber.org/mock/mockgen -package mocks -destination mocks/registry_mock.go github.com/juju/juju/docker/registry/internal Registry 20 21 // Registry provides APIs to interact with the OCI provider client. 22 type Registry = internal.Registry 23 24 var ( 25 // Override for testing. 26 DefaultTransport = http.DefaultTransport 27 ) 28 29 // New returns a Registry interface providing methods for interacting with registry APIs. 30 func New(repoDetails docker.ImageRepoDetails) (Registry, error) { 31 var provider internal.RegistryInternal 32 for _, providerNewer := range internal.Providers() { 33 p, err := providerNewer(repoDetails, DefaultTransport) 34 if err != nil { 35 logger.Tracef("error matching registry client %#v for %s: %s", p, repoDetails, err.Error()) 36 continue 37 } 38 if p.Match() { 39 logger.Tracef("found registry client %#v for %s", p, repoDetails) 40 provider = p 41 break 42 } 43 } 44 var err error 45 if provider == nil { 46 provider, err = internal.NewBase(repoDetails, DefaultTransport) 47 if err != nil { 48 return nil, errors.Trace(err) 49 } 50 } 51 if err := internal.InitProvider(provider); err != nil { 52 return nil, errors.Trace(err) 53 } 54 return provider, nil 55 }