@@ -3,55 +3,46 @@ package registryclients
3
3
import (
4
4
"context"
5
5
"fmt"
6
- "github.com/Masterminds/semver/v3"
7
6
"github.com/armosec/armoapi-go/armotypes"
8
- "github.com/armosec/registryx/common"
9
- "github.com/armosec/registryx/registries"
7
+ "github.com/armosec/registryx/registries/quay"
10
8
dockerregistry "github.com/docker/docker/api/types/registry"
11
9
"github.com/google/go-containerregistry/pkg/authn"
12
- "github.com/google/go-containerregistry/pkg/v1/remote"
13
- "slices"
14
- "sort"
15
- "strings"
10
+ "github.com/google/go-containerregistry/pkg/name"
16
11
)
17
12
18
13
type QuayRegistryClient struct {
19
14
Registry * armotypes.QuayImageRegistry
20
15
}
21
16
22
17
func (q * QuayRegistryClient ) GetAllRepositories (ctx context.Context ) ([]string , error ) {
23
- iRegistry , err := registries . Factory ( & authn. AuthConfig { Username : q .Registry .RobotAccountName , Password : q . Registry . RobotAccountToken }, q . Registry . ContainerRegistryName , nil )
18
+ registry , err := name . NewRegistry ( q .Registry .ContainerRegistryName )
24
19
if err != nil {
25
20
return nil , err
26
21
}
27
- var repos , pageRepos []string
28
- var nextPage * common.PaginationOption
29
-
30
- firstPage := common .MakePagination (iRegistry .GetMaxPageSize ())
31
- catalogOpts := common.CatalogOption {}
32
-
33
- for pageRepos , nextPage , err = iRegistry .Catalog (ctx , firstPage , catalogOpts , authn .FromConfig (* iRegistry .GetAuth ())); ; pageRepos , nextPage , err = iRegistry .Catalog (ctx , * nextPage , catalogOpts , authn .FromConfig (* iRegistry .GetAuth ())) {
34
- if err != nil {
35
- return nil , err
36
- }
37
- if len (pageRepos ) == 0 {
38
- break
39
- }
40
- repos = append (repos , pageRepos ... )
41
-
42
- if nextPage == nil || nextPage .Cursor == "" {
43
- break
44
- }
22
+ iRegistry , err := quay .NewQuayIORegistry (& authn.AuthConfig {Username : q .Registry .RobotAccountName , Password : q .Registry .RobotAccountToken }, & registry , nil )
23
+ if err != nil {
24
+ return nil , err
45
25
}
46
- return repos , nil
26
+ return getAllRepositories ( ctx , iRegistry )
47
27
}
48
28
49
- func (q * QuayRegistryClient ) GetImagesToScan (ctx context.Context ) (map [string ]string , error ) {
29
+ func (q * QuayRegistryClient ) GetImagesToScan (_ context.Context ) (map [string ]string , error ) {
30
+ registry , err := name .NewRegistry (q .Registry .ContainerRegistryName )
31
+ if err != nil {
32
+ return nil , err
33
+ }
34
+ iRegistry , err := quay .NewQuayIORegistry (& authn.AuthConfig {Username : q .Registry .RobotAccountName , Password : q .Registry .RobotAccountToken }, & registry , nil )
35
+ if err != nil {
36
+ return nil , err
37
+ }
38
+
50
39
images := make (map [string ]string , len (q .Registry .Repositories ))
51
40
for _ , repository := range q .Registry .Repositories {
52
- tag , err := q . getImageLatestTag (ctx , repository )
41
+ tag , err := getImageLatestTag (repository , iRegistry )
53
42
if err != nil {
54
43
return nil , err
44
+ } else if tag == "" {
45
+ return nil , fmt .Errorf ("failed to find latest tag for repository %s" , repository )
55
46
}
56
47
images [fmt .Sprintf ("%s/%s" , q .Registry .ContainerRegistryName , repository )] = tag
57
48
}
@@ -64,53 +55,3 @@ func (q *QuayRegistryClient) GetDockerAuth() *dockerregistry.AuthConfig {
64
55
Password : q .Registry .RobotAccountToken ,
65
56
}
66
57
}
67
-
68
- func (q * QuayRegistryClient ) getImageLatestTag (_ context.Context , repo string ) (string , error ) {
69
- iRegistry , err := registries .Factory (& authn.AuthConfig {Username : q .Registry .RobotAccountName , Password : q .Registry .RobotAccountToken }, q .Registry .ContainerRegistryName , nil )
70
- if err != nil {
71
- return "" , err
72
- }
73
-
74
- firstPage := common .MakePagination (1000 )
75
- var tags []string
76
- options := []remote.Option {remote .WithAuth (authn .FromConfig (* iRegistry .GetAuth ()))}
77
- if latestTags , err := iRegistry .GetLatestTags (repo , 1 , options ... ); err == nil {
78
- for _ , tag := range latestTags {
79
- if strings .HasSuffix (tag , ".sig" ) {
80
- continue
81
- }
82
- tagsForDigest := strings .Split (tag , "," )
83
- return tagsForDigest [0 ], nil
84
- }
85
- } else {
86
- for tagsPage , nextPage , err := iRegistry .List (repo , firstPage , options ... ); ; tagsPage , nextPage , err = iRegistry .List (repo , * nextPage ) {
87
- if err != nil {
88
- return "" , err
89
- }
90
-
91
- if slices .Contains (tagsPage , "latest" ) {
92
- return "latest" , nil
93
- }
94
-
95
- tags = append (tags , tagsPage ... )
96
-
97
- if nextPage == nil {
98
- break
99
- }
100
- }
101
- return getLatestTag (tags ), nil
102
- }
103
- return "" , nil
104
- }
105
-
106
- func getLatestTag (tags []string ) string {
107
- var versions []* semver.Version
108
- for _ , tag := range tags {
109
- version , err := semver .NewVersion (tag )
110
- if err == nil {
111
- versions = append (versions , version )
112
- }
113
- }
114
- sort .Sort (sort .Reverse (semver .Collection (versions )))
115
- return versions [0 ].String ()
116
- }
0 commit comments