소스 검색

Merge pull request #16509 from HuKeping/search-problem

Fix docker search problem
Vincent Demeester 9 년 전
부모
커밋
b78f66c472
4개의 변경된 파일38개의 추가작업 그리고 8개의 파일을 삭제
  1. 3 2
      api/client/search.go
  2. 8 0
      integration-cli/docker_cli_search_test.go
  3. 18 4
      registry/config.go
  4. 9 2
      registry/service.go

+ 3 - 2
api/client/search.go

@@ -41,12 +41,13 @@ func (cli *DockerCli) CmdSearch(args ...string) error {
 
 	// Resolve the Repository name from fqn to hostname + name
 	taglessRemote, _ := parsers.ParseRepositoryTag(name)
-	repoInfo, err := registry.ParseRepositoryInfo(taglessRemote)
+
+	indexInfo, err := registry.ParseIndexInfo(taglessRemote)
 	if err != nil {
 		return err
 	}
 
-	rdr, _, err := cli.clientRequestAttemptLogin("GET", "/images/search?"+v.Encode(), nil, nil, repoInfo.Index, "search")
+	rdr, _, err := cli.clientRequestAttemptLogin("GET", "/images/search?"+v.Encode(), nil, nil, indexInfo, "search")
 	if err != nil {
 		return err
 	}

+ 8 - 0
integration-cli/docker_cli_search_test.go

@@ -89,3 +89,11 @@ func (s *DockerSuite) TestSearchCmdOptions(c *check.C) {
 		c.Fatalf("failed to search with stars&automated&no-trunc options on the central registry: %s", out)
 	}
 }
+
+// search for repos which start with "ubuntu-" on the central registry
+func (s *DockerSuite) TestSearchOnCentralRegistryWithDash(c *check.C) {
+	testRequires(c, Network, DaemonIsLinux)
+
+	out, exitCode := dockerCmd(c, "search", "ubuntu-")
+	c.Assert(exitCode, check.Equals, 0, check.Commentf("failed to search on the central registry: %s", out))
+}

+ 18 - 4
registry/config.go

@@ -300,14 +300,17 @@ func splitReposName(reposName string) (string, string) {
 }
 
 // NewRepositoryInfo validates and breaks down a repository name into a RepositoryInfo
-func (config *ServiceConfig) NewRepositoryInfo(reposName string) (*RepositoryInfo, error) {
+func (config *ServiceConfig) NewRepositoryInfo(reposName string, bySearch bool) (*RepositoryInfo, error) {
 	if err := validateNoSchema(reposName); err != nil {
 		return nil, err
 	}
 
 	indexName, remoteName := splitReposName(reposName)
-	if err := validateRemoteName(remoteName); err != nil {
-		return nil, err
+
+	if !bySearch {
+		if err := validateRemoteName(remoteName); err != nil {
+			return nil, err
+		}
 	}
 
 	repoInfo := &RepositoryInfo{
@@ -359,7 +362,18 @@ func (repoInfo *RepositoryInfo) GetSearchTerm() string {
 // ParseRepositoryInfo performs the breakdown of a repository name into a RepositoryInfo, but
 // lacks registry configuration.
 func ParseRepositoryInfo(reposName string) (*RepositoryInfo, error) {
-	return emptyServiceConfig.NewRepositoryInfo(reposName)
+	return emptyServiceConfig.NewRepositoryInfo(reposName, false)
+}
+
+// ParseIndexInfo will use repository name to get back an indexInfo.
+func ParseIndexInfo(reposName string) (*IndexInfo, error) {
+	indexName, _ := splitReposName(reposName)
+
+	indexInfo, err := emptyServiceConfig.NewIndexInfo(indexName)
+	if err != nil {
+		return nil, err
+	}
+	return indexInfo, nil
 }
 
 // NormalizeLocalName transforms a repository name into a normalize LocalName

+ 9 - 2
registry/service.go

@@ -54,7 +54,8 @@ func (s *Service) Auth(authConfig *cliconfig.AuthConfig) (string, error) {
 // 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)
+
+	repoInfo, err := s.ResolveRepositoryBySearch(term)
 	if err != nil {
 		return nil, err
 	}
@@ -75,7 +76,13 @@ func (s *Service) Search(term string, authConfig *cliconfig.AuthConfig, headers
 // 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)
+	return s.Config.NewRepositoryInfo(name, false)
+}
+
+// ResolveRepositoryBySearch splits a repository name into its components
+// and configuration of the associated registry.
+func (s *Service) ResolveRepositoryBySearch(name string) (*RepositoryInfo, error) {
+	return s.Config.NewRepositoryInfo(name, true)
 }
 
 // ResolveIndex takes indexName and returns index info