89bd48481c
This patch removes the need for requestFactories and decorators by implementing http.RoundTripper transports instead. It refactors some challenging-to-read code. NewSession now takes an *http.Client that can already have a custom Transport, it will add its own auth transport by wrapping it. The idea is that callers of http.Client should not bother setting custom headers for every handler but instead it should be transparent to the callers of a same context. This patch is needed for future refactorings of registry, namely refactoring of the v1 client code. Signed-off-by: Tibor Vass <tibor@docker.com>
67 lines
1.9 KiB
Go
67 lines
1.9 KiB
Go
package registry
|
|
|
|
import "github.com/docker/docker/cliconfig"
|
|
|
|
type Service struct {
|
|
Config *ServiceConfig
|
|
}
|
|
|
|
// NewService returns a new instance of Service ready to be
|
|
// installed no an engine.
|
|
func NewService(options *Options) *Service {
|
|
return &Service{
|
|
Config: NewServiceConfig(options),
|
|
}
|
|
}
|
|
|
|
// Auth contacts the public registry with the provided credentials,
|
|
// and returns OK if authentication was sucessful.
|
|
// It can be used to verify the validity of a client's credentials.
|
|
func (s *Service) Auth(authConfig *cliconfig.AuthConfig) (string, error) {
|
|
addr := authConfig.ServerAddress
|
|
if addr == "" {
|
|
// Use the official registry address if not specified.
|
|
addr = IndexServerAddress()
|
|
}
|
|
index, err := s.ResolveIndex(addr)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
endpoint, err := NewEndpoint(index)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
authConfig.ServerAddress = endpoint.String()
|
|
return Login(authConfig, endpoint)
|
|
}
|
|
|
|
// Search queries the public registry for images matching the specified
|
|
// search terms, and returns the results.
|
|
func (s *Service) Search(term string, authConfig *cliconfig.AuthConfig, headers map[string][]string) (*SearchResults, error) {
|
|
repoInfo, err := s.ResolveRepository(term)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// *TODO: Search multiple indexes.
|
|
endpoint, err := repoInfo.GetEndpoint()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
r, err := NewSession(endpoint.HTTPClient(), authConfig, endpoint)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return r.SearchRepositories(repoInfo.GetSearchTerm())
|
|
}
|
|
|
|
// ResolveRepository splits a repository name into its components
|
|
// and configuration of the associated registry.
|
|
func (s *Service) ResolveRepository(name string) (*RepositoryInfo, error) {
|
|
return s.Config.NewRepositoryInfo(name)
|
|
}
|
|
|
|
// ResolveIndex takes indexName and returns index info
|
|
func (s *Service) ResolveIndex(name string) (*IndexInfo, error) {
|
|
return s.Config.NewIndexInfo(name)
|
|
}
|