Skip to content

Commit 110b2d8

Browse files
feat: harbor 仓库增加搜索功能
1 parent 5dbf179 commit 110b2d8

File tree

10 files changed

+173
-59
lines changed

10 files changed

+173
-59
lines changed

internal/api/v1/imagerepo/image_repo.go

+3-2
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,8 @@ func (h *Handler) ListInternalRepos() iris.Handler {
7171
ctx.Values().Set("message", err.Error())
7272
return
7373
}
74-
names, err := h.imageRepoService.ListInternalRepos(req.ImageRepo)
74+
75+
names, err := h.imageRepoService.ListInternalRepos(req.ImageRepo, req.Page, req.Limit, req.Search)
7576
if err != nil {
7677
ctx.StatusCode(iris.StatusInternalServerError)
7778
ctx.Values().Set("message", err.Error())
@@ -164,7 +165,7 @@ func (h *Handler) ListImages() iris.Handler {
164165
}
165166
}
166167

167-
func (h *Handler) ListImagesByRepo() iris.Handler {
168+
func (h *Handler) ListImagesByRepo() iris.Handler {
168169
return func(ctx *context.Context) {
169170
name := ctx.Params().GetString("repo")
170171
imageRepos, err := h.imageRepoService.ListImagesByRepo(name, common.DBOptions{})

internal/api/v1/imagerepo/types.go

+3
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,7 @@ import V1ImageRepo "github.com/KubeOperator/kubepi/internal/model/v1/imagerepo"
44

55
type RepoConfig struct {
66
V1ImageRepo.ImageRepo
7+
Page int `json:"page" validate:"required"`
8+
Limit int `json:"limit" validate:"required"`
9+
Search string `json:"search"`
710
}

internal/service/v1/imagerepo/image_repo.go

+28-14
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@ package imagerepo
33
import (
44
"errors"
55
V1ClusterRepo "github.com/KubeOperator/kubepi/internal/model/v1/clusterrepo"
6-
"github.com/KubeOperator/kubepi/internal/model/v1/imagerepo"
76
V1ImageRepo "github.com/KubeOperator/kubepi/internal/model/v1/imagerepo"
87
"github.com/KubeOperator/kubepi/internal/service/v1/common"
98
costomStorm "github.com/KubeOperator/kubepi/pkg/storm"
109
repoClient "github.com/KubeOperator/kubepi/pkg/util/imagerepo"
10+
"github.com/KubeOperator/kubepi/pkg/util/imagerepo/repos"
1111
"github.com/KubeOperator/kubepi/pkg/util/lang"
1212
"github.com/asdine/storm/v3"
1313
"github.com/asdine/storm/v3/q"
@@ -17,7 +17,7 @@ import (
1717

1818
type Service interface {
1919
common.DBService
20-
ListInternalRepos(repo imagerepo.ImageRepo) (names []string, err error)
20+
ListInternalRepos(repo V1ImageRepo.ImageRepo, page, limit int, search string) (names []string, err error)
2121
Search(num, size int, conditions common.Conditions, options common.DBOptions) (result []V1ImageRepo.ImageRepo, count int, err error)
2222
Create(repo *V1ImageRepo.ImageRepo, options common.DBOptions) (err error)
2323
Delete(name string, options common.DBOptions) (err error)
@@ -36,11 +36,12 @@ type service struct {
3636
common.DefaultDBService
3737
}
3838

39-
func (s *service) ListInternalRepos(repo imagerepo.ImageRepo) (names []string, err error) {
40-
client := repoClient.NewClient(repoClient.Config{
39+
func (s *service) ListInternalRepos(repo V1ImageRepo.ImageRepo, page, limit int, search string) (names []string, err error) {
40+
41+
client := repoClient.NewClient(repos.Config{
4142
Type: repo.Type,
4243
EndPoint: repo.EndPoint,
43-
Credential: repoClient.Credential{
44+
Credential: repos.Credential{
4445
Username: repo.Credential.Username,
4546
Password: repo.Credential.Password,
4647
},
@@ -49,7 +50,13 @@ func (s *service) ListInternalRepos(repo imagerepo.ImageRepo) (names []string, e
4950
if client == nil {
5051
return nil, errors.New("repo client is not found")
5152
}
52-
return client.ListRepos()
53+
request := repos.ProjectRequest{
54+
Name: search,
55+
Page: page,
56+
Limit: limit,
57+
}
58+
59+
return client.ListRepos(request)
5360
}
5461

5562
func (s *service) ListImages(repo, cluster string, options common.DBOptions) (names []string, err error) {
@@ -64,21 +71,25 @@ func (s *service) ListImages(repo, cluster string, options common.DBOptions) (na
6471
err = err1
6572
return
6673
}
67-
client := repoClient.NewClient(repoClient.Config{
74+
client := repoClient.NewClient(repos.Config{
6875
Type: rp.Type,
6976
EndPoint: rp.EndPoint,
70-
Credential: repoClient.Credential{
77+
Credential: repos.Credential{
7178
Username: rp.Credential.Username,
7279
Password: rp.Credential.Password,
7380
},
7481
Version: rp.Version,
7582
})
76-
images, err2 := client.ListImages(rp.RepoName)
83+
request := repos.RepoRequest{
84+
Repo: rp.RepoName,
85+
}
86+
87+
res, err2 := client.ListImages(request)
7788
if err2 != nil {
7889
err = err2
7990
return
8091
}
81-
for _, image := range images {
92+
for _, image := range res.Items {
8293
names = append(names, rp.DownloadUrl+"/"+image)
8394
}
8495
return
@@ -90,21 +101,24 @@ func (s *service) ListImagesByRepo(repo string, options common.DBOptions) (names
90101
err = err1
91102
return
92103
}
93-
client := repoClient.NewClient(repoClient.Config{
104+
client := repoClient.NewClient(repos.Config{
94105
Type: rp.Type,
95106
EndPoint: rp.EndPoint,
96-
Credential: repoClient.Credential{
107+
Credential: repos.Credential{
97108
Username: rp.Credential.Username,
98109
Password: rp.Credential.Password,
99110
},
100111
Version: rp.Version,
101112
})
102-
images, err2 := client.ListImages(rp.RepoName)
113+
request := repos.RepoRequest{
114+
Repo: rp.RepoName,
115+
}
116+
res, err2 := client.ListImages(request)
103117
if err2 != nil {
104118
err = err2
105119
return
106120
}
107-
for _, image := range images {
121+
for _, image := range res.Items {
108122
names = append(names, rp.DownloadUrl+"/"+image)
109123
}
110124
return

pkg/util/imagerepo/image_repo.go

+3-17
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,11 @@ package imagerepo
33
import "github.com/KubeOperator/kubepi/pkg/util/imagerepo/repos"
44

55
type RepoClient interface {
6-
//Auth() error
7-
ListRepos() ([]string, error)
8-
ListImages(repository string) (images []string, err error)
6+
ListRepos(request repos.ProjectRequest) ([]string, error)
7+
ListImages(request repos.RepoRequest) (response repos.RepoResponse, err error)
98
}
109

11-
func NewClient(config Config) RepoClient {
10+
func NewClient(config repos.Config) RepoClient {
1211
switch config.Type {
1312
case "Nexus":
1413
return repos.NewNexusClient(config.EndPoint, config.Credential.Username, config.Credential.Password)
@@ -19,16 +18,3 @@ func NewClient(config Config) RepoClient {
1918
}
2019
return nil
2120
}
22-
23-
type Config struct {
24-
Type string
25-
EndPoint string
26-
//DownloadUrl string
27-
Credential Credential
28-
Version string
29-
}
30-
31-
type Credential struct {
32-
Username string
33-
Password string
34-
}

pkg/util/imagerepo/repos/docker_registry.go

+4-3
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,12 @@ type dockerRegistryClient struct {
2323
EndPoint string
2424
}
2525

26-
func (c *dockerRegistryClient) ListRepos() (names []string, err error) {
26+
func (c *dockerRegistryClient) ListRepos(request ProjectRequest) (names []string, err error) {
2727
return
2828
}
2929

30-
func (c *dockerRegistryClient) ListImages(project string) (images []string, err error) {
30+
func (c *dockerRegistryClient) ListImages(request RepoRequest) (response RepoResponse, err error) {
31+
3132
transport := &http.Transport{
3233
TLSClientConfig: &tls.Config{
3334
InsecureSkipVerify: true, //nolint:gosec
@@ -69,7 +70,7 @@ func (c *dockerRegistryClient) ListImages(project string) (images []string, err
6970

7071
if len(tags) != 0 {
7172
for _, tag := range tags {
72-
images = append(images, image+":"+tag)
73+
response.Items = append(response.Items, image+":"+tag)
7374
}
7475
}
7576
}

pkg/util/imagerepo/repos/harbor.go

+68-14
Original file line numberDiff line numberDiff line change
@@ -39,31 +39,86 @@ type artifacts struct {
3939
Tags []NameResult
4040
}
4141

42-
func (c *harborClient) ListRepos() (names []string, err error) {
42+
type harborBody struct {
43+
Name string
44+
Version string
45+
Format string
46+
ProjectID int `json:"project_id"`
47+
ArtifactCount int `json:"artifact_count"`
48+
}
49+
50+
func (c *harborClient) ListRepos(request ProjectRequest) (names []string, err error) {
4351

44-
result, err1 := c.HttpClient.GetNameResult(getProjectUrl(c.Version))
52+
projectUrl := fmt.Sprintf("%s?page=%d&page_size=%d", getProjectUrl(c.Version), request.Page, request.Limit)
53+
if request.Name != "" {
54+
projectUrl = projectUrl + "&q=name=~" + request.Name
55+
}
56+
body, _, err1 := c.HttpClient.Get(projectUrl)
4557
if err1 != nil {
4658
err = err1
4759
return
4860
}
49-
for _, r := range result {
61+
var projects []harborBody
62+
if err1 = json.Unmarshal(body, &projects); err1 != nil {
63+
err = err1
64+
return
65+
}
66+
for _, r := range projects {
5067
names = append(names, r.Name)
5168
}
5269
return
5370
}
5471

55-
func (c *harborClient) ListImages(project string) (images []string, err error) {
72+
func (c *harborClient) ListImages(request RepoRequest) (response RepoResponse, err error) {
73+
project := request.Repo
74+
//计数器
75+
startCount := (request.Page - 1) * request.Limit
5676

5777
if c.Version == "v2" {
58-
repoUrl := fmt.Sprintf("%s/%s/%s", getProjectUrl(c.Version), project, repositoryUrl)
59-
result, err1 := c.HttpClient.GetNameResult(repoUrl)
60-
if err1 != nil {
61-
err = err1
62-
return
78+
start := true
79+
p := 1
80+
limit := 100
81+
artifactCount := 0
82+
repoArCount := 0
83+
var repos []harborBody
84+
for start {
85+
repoUrl := fmt.Sprintf("%s/%s/%s?page=%d&&page_size=%d", getProjectUrl(c.Version), project, repositoryUrl, p, limit)
86+
body, _, err1 := c.HttpClient.Get(repoUrl)
87+
if err1 != nil {
88+
err = err1
89+
return
90+
}
91+
var items []harborBody
92+
if err1 = json.Unmarshal(body, &items); err1 != nil {
93+
err = err1
94+
return
95+
}
96+
for _, v := range items {
97+
if v.ArtifactCount == 0 {
98+
continue
99+
}
100+
if artifactCount >= startCount {
101+
repoArCount = repoArCount + v.ArtifactCount
102+
if repoArCount >= limit {
103+
start = false
104+
break
105+
}
106+
repos = append(repos, v)
107+
continue
108+
}
109+
if artifactCount+v.ArtifactCount <= startCount {
110+
artifactCount = artifactCount + v.ArtifactCount
111+
}
112+
}
113+
p++
63114
}
64-
for _, r := range result {
115+
repoUrl := fmt.Sprintf("%s/%s/%s", getProjectUrl(c.Version), project, repositoryUrl)
116+
for _, r := range repos {
65117
repoName := strings.Replace(r.Name, project+"/", "", -1)
66-
body, _, err2 := c.HttpClient.Get(fmt.Sprintf("%s/%s/%s", repoUrl, repoName, artifactUrl))
118+
body, res, err2 := c.HttpClient.Get(fmt.Sprintf("%s/%s/%s?page=%d&&page_size=%d", repoUrl, repoName, artifactUrl, 1, r.ArtifactCount))
119+
if res != nil && res.StatusCode == 404 {
120+
continue
121+
}
67122
if err2 != nil {
68123
if strings.Contains(err2.Error(), "404") {
69124
continue
@@ -77,12 +132,11 @@ func (c *harborClient) ListImages(project string) (images []string, err error) {
77132
}
78133
for _, art := range artifacts {
79134
for _, tag := range art.Tags {
80-
images = append(images, r.Name+":"+tag.Name)
135+
response.Items = append(response.Items, r.Name+":"+tag.Name)
81136
}
82137
}
83138
}
84139
} else {
85-
86140
result, err1 := c.HttpClient.GetNameResult(getProjectUrl(c.Version))
87141
if err1 != nil {
88142
err = err1
@@ -108,7 +162,7 @@ func (c *harborClient) ListImages(project string) (images []string, err error) {
108162
return
109163
}
110164
for _, tag := range tags {
111-
images = append(images, repo.Name+":"+tag.Name)
165+
response.Items = append(response.Items, repo.Name+":"+tag.Name)
112166
}
113167
}
114168
}

pkg/util/imagerepo/repos/http_client.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,8 @@ func (h *HttpClient) Get(endpoint string) ([]byte, *http.Response, error) {
6666
}
6767

6868
func (h *HttpClient) GetNameResult(url string) ([]NameResult, error) {
69-
body, _, err := h.Get(url)
69+
body, res, err := h.Get(url)
70+
fmt.Println(res)
7071
if err != nil {
7172
return nil, err
7273
}

pkg/util/imagerepo/repos/nexus.go

+7-5
Original file line numberDiff line numberDiff line change
@@ -32,14 +32,15 @@ type nexusClient struct {
3232
}
3333

3434
type ItemResult struct {
35-
Items []NameResult
35+
Items []NameResult
36+
ContinuationToken string
3637
}
3738

3839
func (c *nexusClient) Auth() error {
3940
return nil
4041
}
4142

42-
func (c *nexusClient) ListRepos() (names []string, err error) {
43+
func (c *nexusClient) ListRepos(request ProjectRequest) (names []string, err error) {
4344
body, _, err1 := c.HttpClient.Get(RepoUrl)
4445
if err1 != nil {
4546
err = err1
@@ -57,8 +58,9 @@ func (c *nexusClient) ListRepos() (names []string, err error) {
5758
return
5859
}
5960

60-
func (c *nexusClient) ListImages(repository string) (images []string, err error) {
61-
body, _, err1 := c.HttpClient.Get(fmt.Sprintf("%s%s", ComponentUrl, repository))
61+
func (c *nexusClient) ListImages(request RepoRequest) (response RepoResponse, err error) {
62+
body, res, err1 := c.HttpClient.Get(fmt.Sprintf("%s%s", ComponentUrl, request.Repo))
63+
fmt.Println(res)
6264
if err1 != nil {
6365
err = err1
6466
return
@@ -68,7 +70,7 @@ func (c *nexusClient) ListImages(repository string) (images []string, err error)
6870
return
6971
}
7072
for _, r := range result.Items {
71-
images = append(images, r.Name+":"+r.Version)
73+
response.Items = append(response.Items, r.Name+":"+r.Version)
7274
}
7375
return
7476
}

0 commit comments

Comments
 (0)