github.com/rumpl/bof@v23.0.0-rc.2+incompatible/daemon/images/image_search.go (about) 1 package images // import "github.com/docker/docker/daemon/images" 2 3 import ( 4 "context" 5 "strconv" 6 7 "github.com/docker/docker/api/types" 8 "github.com/docker/docker/api/types/filters" 9 registrytypes "github.com/docker/docker/api/types/registry" 10 "github.com/docker/docker/dockerversion" 11 ) 12 13 var acceptedSearchFilterTags = map[string]bool{ 14 "is-automated": true, 15 "is-official": true, 16 "stars": true, 17 } 18 19 // SearchRegistryForImages queries the registry for images matching 20 // term. authConfig is used to login. 21 // 22 // TODO: this could be implemented in a registry service instead of the image 23 // service. 24 func (i *ImageService) SearchRegistryForImages(ctx context.Context, searchFilters filters.Args, term string, limit int, 25 authConfig *types.AuthConfig, 26 headers map[string][]string) (*registrytypes.SearchResults, error) { 27 if err := searchFilters.Validate(acceptedSearchFilterTags); err != nil { 28 return nil, err 29 } 30 31 var isAutomated, isOfficial bool 32 var hasStarFilter = 0 33 if searchFilters.Contains("is-automated") { 34 if searchFilters.UniqueExactMatch("is-automated", "true") { 35 isAutomated = true 36 } else if !searchFilters.UniqueExactMatch("is-automated", "false") { 37 return nil, invalidFilter{"is-automated", searchFilters.Get("is-automated")} 38 } 39 } 40 if searchFilters.Contains("is-official") { 41 if searchFilters.UniqueExactMatch("is-official", "true") { 42 isOfficial = true 43 } else if !searchFilters.UniqueExactMatch("is-official", "false") { 44 return nil, invalidFilter{"is-official", searchFilters.Get("is-official")} 45 } 46 } 47 if searchFilters.Contains("stars") { 48 hasStars := searchFilters.Get("stars") 49 for _, hasStar := range hasStars { 50 iHasStar, err := strconv.Atoi(hasStar) 51 if err != nil { 52 return nil, invalidFilter{"stars", hasStar} 53 } 54 if iHasStar > hasStarFilter { 55 hasStarFilter = iHasStar 56 } 57 } 58 } 59 60 unfilteredResult, err := i.registryService.Search(ctx, term, limit, authConfig, dockerversion.DockerUserAgent(ctx), headers) 61 if err != nil { 62 return nil, err 63 } 64 65 filteredResults := []registrytypes.SearchResult{} 66 for _, result := range unfilteredResult.Results { 67 if searchFilters.Contains("is-automated") { 68 if isAutomated != result.IsAutomated { 69 continue 70 } 71 } 72 if searchFilters.Contains("is-official") { 73 if isOfficial != result.IsOfficial { 74 continue 75 } 76 } 77 if searchFilters.Contains("stars") { 78 if result.StarCount < hasStarFilter { 79 continue 80 } 81 } 82 filteredResults = append(filteredResults, result) 83 } 84 85 return ®istrytypes.SearchResults{ 86 Query: unfilteredResult.Query, 87 NumResults: len(filteredResults), 88 Results: filteredResults, 89 }, nil 90 }