-
Notifications
You must be signed in to change notification settings - Fork 88
/
rewrite.go
116 lines (100 loc) · 4.03 KB
/
rewrite.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
package base
import (
"strings"
dockerref "github.com/containers/image/v5/docker/reference"
"github.com/distribution/distribution/v3/reference"
"github.com/pkg/errors"
"github.com/replicatedhq/kots/pkg/docker/registry"
dockerregistrytypes "github.com/replicatedhq/kots/pkg/docker/registry/types"
imagetypes "github.com/replicatedhq/kots/pkg/image/types"
"github.com/replicatedhq/kots/pkg/imageutil"
"github.com/replicatedhq/kots/pkg/kotsutil"
kotsv1beta1 "github.com/replicatedhq/kotskinds/apis/kots/v1beta1"
kustomizetypes "sigs.k8s.io/kustomize/api/types"
)
// RewriteImages rewrites all images to point to the configured destination registry.
func RewriteImages(images []string, destRegistry dockerregistrytypes.RegistryOptions) ([]kustomizetypes.Image, error) {
rewrittenImages := []kustomizetypes.Image{}
rewritten := map[string]bool{}
for _, image := range images {
if _, ok := rewritten[image]; ok {
continue
}
rewrittenImage, err := imageutil.RewriteDockerRegistryImage(destRegistry, image)
if err != nil {
return nil, errors.Wrapf(err, "failed to rewrite image %s", image)
}
rewrittenImages = append(rewrittenImages, *rewrittenImage)
rewritten[image] = true
}
withAltNames := make([]kustomizetypes.Image, 0)
for _, i := range rewrittenImages {
altNames, err := imageutil.BuildImageAltNames(i)
if err != nil {
return nil, errors.Wrap(err, "failed to build image alt names")
}
withAltNames = append(withAltNames, altNames...)
}
return withAltNames, nil
}
// RewritePrivateImages rewrites private images to be proxied through proxy.replicated.com,
// and rewrites replicated registry images to use the custom registry domain if configured
func RewritePrivateImages(images []string, kotsKinds *kotsutil.KotsKinds, license *kotsv1beta1.License) ([]kustomizetypes.Image, error) {
replicatedRegistryInfo := registry.GetRegistryProxyInfo(license, &kotsKinds.Installation, &kotsKinds.KotsApplication)
replicatedRegistry := dockerregistrytypes.RegistryOptions{
Endpoint: replicatedRegistryInfo.Registry,
ProxyEndpoint: replicatedRegistryInfo.Proxy,
UpstreamEndpoint: replicatedRegistryInfo.Upstream,
}
installationImages := make(map[string]imagetypes.InstallationImageInfo)
for _, i := range kotsKinds.Installation.Spec.KnownImages {
installationImages[i.Image] = imagetypes.InstallationImageInfo{
IsPrivate: i.IsPrivate,
}
}
privateImages := []string{}
for _, img := range images {
if installationImages[img].IsPrivate {
privateImages = append(privateImages, img)
}
}
kustomizeImages := make([]kustomizetypes.Image, 0)
for _, privateImage := range privateImages {
dockerRef, err := dockerref.ParseDockerRef(privateImage)
if err != nil {
return nil, errors.Wrapf(err, "failed to parse docker ref %q", privateImage)
}
registryHost := dockerref.Domain(dockerRef)
if registryHost == replicatedRegistry.Endpoint {
// replicated images are also private, but we don't rewrite those
continue
}
image := kustomizetypes.Image{}
if registryHost == replicatedRegistry.UpstreamEndpoint {
// image is using the upstream replicated registry, but a custom registry domain is configured, so rewrite to use the custom domain
image = kustomizetypes.Image{
Name: dockerRef.Name(),
NewName: strings.Replace(dockerRef.Name(), registryHost, replicatedRegistry.Endpoint, 1),
}
} else {
// all other private images are rewritten to use the replicated proxy
image = kustomizetypes.Image{
Name: dockerRef.Name(),
NewName: registry.MakeProxiedImageURL(replicatedRegistry.ProxyEndpoint, license.Spec.AppSlug, privateImage),
}
}
if can, ok := dockerRef.(reference.Canonical); ok {
image.Digest = can.Digest().String()
} else if tagged, ok := dockerRef.(reference.Tagged); ok {
image.NewTag = tagged.Tag()
} else {
image.NewTag = "latest"
}
altNames, err := imageutil.BuildImageAltNames(image)
if err != nil {
return nil, errors.Wrap(err, "failed build alt names")
}
kustomizeImages = append(kustomizeImages, altNames...)
}
return kustomizeImages, nil
}