-
Notifications
You must be signed in to change notification settings - Fork 114
/
images.go
141 lines (129 loc) · 3.08 KB
/
images.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
package warehouses
import (
"context"
"fmt"
"strings"
"github.com/pkg/errors"
kargoapi "github.com/akuity/kargo/api/v1alpha1"
"github.com/akuity/kargo/internal/credentials"
"github.com/akuity/kargo/internal/git"
"github.com/akuity/kargo/internal/image"
"github.com/akuity/kargo/internal/logging"
)
func (r *reconciler) getLatestImages(
ctx context.Context,
namespace string,
subs []kargoapi.RepoSubscription,
) ([]kargoapi.Image, error) {
imgs := make([]kargoapi.Image, 0, len(subs))
for _, s := range subs {
if s.Image == nil {
continue
}
sub := s.Image
logger := logging.LoggerFromContext(ctx).WithField("repo", sub.RepoURL)
creds, ok, err :=
r.credentialsDB.Get(ctx, namespace, credentials.TypeImage, sub.RepoURL)
if err != nil {
return nil, errors.Wrapf(
err,
"error obtaining credentials for image repo %q",
sub.RepoURL,
)
}
var regCreds *image.Credentials
if ok {
regCreds = &image.Credentials{
Username: creds.Username,
Password: creds.Password,
}
logger.Debug("obtained credentials for image repo")
} else {
logger.Debug("found no credentials for image repo")
}
tag, digest, err := r.getImageRefsFn(
ctx,
sub.RepoURL,
sub.TagSelectionStrategy,
sub.SemverConstraint,
sub.AllowTags,
sub.IgnoreTags, // TODO: KR: Fix this
sub.Platform,
regCreds,
)
if err != nil {
return nil, errors.Wrapf(
err,
"error getting latest suitable tag for image %q",
sub.RepoURL,
)
}
imgs = append(
imgs,
kargoapi.Image{
RepoURL: sub.RepoURL,
GitRepoURL: r.getImageSourceURL(sub.GitRepoURL, tag),
Tag: tag,
Digest: digest,
},
)
logger.WithField("tag", tag).
Debug("found latest suitable image tag")
}
return imgs, nil
}
const (
githubURLPrefix = "https://github.com"
)
func (r *reconciler) getImageSourceURL(gitRepoURL, tag string) string {
for baseUrl, fn := range r.imageSourceURLFnsByBaseURL {
if strings.HasPrefix(gitRepoURL, baseUrl) {
return fn(gitRepoURL, tag)
}
}
return ""
}
func getGithubImageSourceURL(gitRepoURL, tag string) string {
return fmt.Sprintf("%s/tree/%s", git.NormalizeGitURL(gitRepoURL), tag)
}
func getImageRefs(
ctx context.Context,
repoURL string,
tagSelectionStrategy kargoapi.ImageTagSelectionStrategy,
constraint string,
allowTagsRegex string,
ignoreTags []string,
platform string,
creds *image.Credentials,
) (string, string, error) {
tc, err := image.NewTagSelector(
repoURL,
image.TagSelectionStrategy(tagSelectionStrategy),
&image.TagSelectorOptions{
Constraint: constraint,
AllowRegex: allowTagsRegex,
Ignore: ignoreTags,
Platform: platform,
Creds: creds,
},
)
if err != nil {
return "", "", errors.Wrapf(
err,
"error creating tag constraint for image %q",
repoURL,
)
}
tag, err := tc.SelectTag(ctx)
if err != nil {
return "", "", errors.Wrapf(
err,
"error fetching newest applicable tag for image %q",
repoURL,
)
}
if tag == nil {
return "", "", errors.Errorf("found no applicable tags for image %q", repoURL)
}
return tag.Name, tag.Digest.String(), nil
}