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 &registrytypes.SearchResults{
    86  		Query:      unfilteredResult.Query,
    87  		NumResults: len(filteredResults),
    88  		Results:    filteredResults,
    89  	}, nil
    90  }