Move 'search' to the registry subsystem

This continues the effort to separate all registry logic from the
deprecated `Server` object.

* 'search' is exposed by `github.com/dotcloud/docker/registry/Service`
* Added proper documentation of Search while I was at it

Docker-DCO-1.1-Signed-off-by: Solomon Hykes <solomon@docker.com> (github: shykes)
This commit is contained in:
Solomon Hykes 2014-04-27 15:21:42 -07:00 committed by Victor Vieux
parent 8934560bbc
commit bbebff75b6

View file

@ -9,7 +9,7 @@ import (
// following calls: // following calls:
// //
// 'auth': Authenticate against the public registry // 'auth': Authenticate against the public registry
// 'search': Search for images on the public registry (TODO) // 'search': Search for images on the public registry
// 'pull': Download images from any registry (TODO) // 'pull': Download images from any registry (TODO)
// 'push': Upload images to any registry (TODO) // 'push': Upload images to any registry (TODO)
type Service struct { type Service struct {
@ -24,6 +24,7 @@ func NewService() *Service {
// Install installs registry capabilities to eng. // Install installs registry capabilities to eng.
func (s *Service) Install(eng *engine.Engine) error { func (s *Service) Install(eng *engine.Engine) error {
eng.Register("auth", s.Auth) eng.Register("auth", s.Auth)
eng.Register("search", s.Search)
return nil return nil
} }
@ -52,3 +53,52 @@ func (s *Service) Auth(job *engine.Job) engine.Status {
job.Printf("%s\n", status) job.Printf("%s\n", status)
return engine.StatusOK return engine.StatusOK
} }
// Search queries the public registry for images matching the specified
// search terms, and returns the results.
//
// Argument syntax: search TERM
//
// Option environment:
// 'authConfig': json-encoded credentials to authenticate against the registry.
// The search extends to images only accessible via the credentials.
//
// 'metaHeaders': extra HTTP headers to include in the request to the registry.
// The headers should be passed as a json-encoded dictionary.
//
// Output:
// Results are sent as a collection of structured messages (using engine.Table).
// Each result is sent as a separate message.
// Results are ordered by number of stars on the public registry.
func (s *Service) Search(job *engine.Job) engine.Status {
if n := len(job.Args); n != 1 {
return job.Errorf("Usage: %s TERM", job.Name)
}
var (
term = job.Args[0]
metaHeaders = map[string][]string{}
authConfig = &AuthConfig{}
)
job.GetenvJson("authConfig", authConfig)
job.GetenvJson("metaHeaders", metaHeaders)
r, err := NewRegistry(authConfig, HTTPRequestFactory(metaHeaders), IndexServerAddress())
if err != nil {
return job.Error(err)
}
results, err := r.SearchRepositories(term)
if err != nil {
return job.Error(err)
}
outs := engine.NewTable("star_count", 0)
for _, result := range results.Results {
out := &engine.Env{}
out.Import(result)
outs.Add(out)
}
outs.ReverseSort()
if _, err := outs.WriteListTo(job.Stdout); err != nil {
return job.Error(err)
}
return engine.StatusOK
}