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  }