11package main
22
33import (
4+ "context"
45 "fmt"
6+ "os"
57 "strings"
68
79 "github.com/Masterminds/semver/v3"
10+ "github.com/sirupsen/logrus"
811)
912
1013type addonComponent struct {
11- getWolfiPackageName func (opts addonComponentOptions ) string
12- getWolfiPackageVersionComparison func (opts addonComponentOptions ) string
13- upstreamVersionInputOverride string
14- useUpstreamImage bool
14+ name string
15+ getCustomImageName func (opts addonComponentOptions ) (string , error )
16+ getWolfiPackageName func (opts addonComponentOptions ) string
17+ getWolfiPackageVersion func (opts addonComponentOptions ) string
18+ upstreamVersionInputOverride string
19+ useUpstreamImage bool
1520}
1621
1722type addonComponentOptions struct {
23+ ctx context.Context
1824 k0sVersion * semver.Version
1925 upstreamVersion * semver.Version
2026 latestK8sVersion * semver.Version
2127}
2228
23- func (c * addonComponent ) getPackageNameAndVersion (wolfiAPKIndex []byte , upstreamVersion string ) (string , string , error ) {
29+ func (c * addonComponent ) resolveImageRepoAndTag (ctx context.Context , image string ) (string , string , error ) {
30+ if c .useUpstreamImage {
31+ return c .resolveUpstreamImageRepoAndTag (ctx , image )
32+ }
33+ if c .getCustomImageName != nil {
34+ return c .resolveCustomImageRepoAndTag (ctx , c .getUpstreamVersion (image ))
35+ }
36+ return c .resolveApkoImageRepoAndTag (ctx , c .getUpstreamVersion (image ))
37+ }
38+
39+ func (c * addonComponent ) getUpstreamVersion (image string ) string {
40+ if c .upstreamVersionInputOverride != "" {
41+ if uv := os .Getenv (c .upstreamVersionInputOverride ); uv != "" {
42+ logrus .Infof ("using input override from %s: %s" , c .upstreamVersionInputOverride , uv )
43+ return uv
44+ }
45+ }
46+ return TagFromImage (image )
47+ }
48+
49+ func (c * addonComponent ) resolveUpstreamImageRepoAndTag (ctx context.Context , image string ) (string , string , error ) {
50+ digest , err := GetImageDigest (ctx , image )
51+ if err != nil {
52+ return "" , "" , fmt .Errorf ("failed to get image %s digest: %w" , image , err )
53+ }
54+ tag := fmt .Sprintf ("%s@%s" , TagFromImage (image ), digest )
55+ repo := fmt .Sprintf ("proxy.replicated.com/anonymous/%s" , FamiliarImageName (RemoveTagFromImage (image )))
56+ return repo , tag , nil
57+ }
58+
59+ func (c * addonComponent ) resolveCustomImageRepoAndTag (ctx context.Context , upstreamVersion string ) (string , string , error ) {
60+ k0sVersion , err := getK0sVersion ()
61+ if err != nil {
62+ return "" , "" , fmt .Errorf ("get k0s version: %w" , err )
63+ }
64+ latestK8sVersion , err := GetLatestKubernetesVersion ()
65+ if err != nil {
66+ return "" , "" , fmt .Errorf ("get latest k8s version: %w" , err )
67+ }
68+ customImage , err := c .getCustomImageName (addonComponentOptions {
69+ ctx : ctx ,
70+ k0sVersion : k0sVersion ,
71+ upstreamVersion : semver .MustParse (upstreamVersion ),
72+ latestK8sVersion : latestK8sVersion ,
73+ })
74+ if err != nil {
75+ return "" , "" , fmt .Errorf ("failed to get image name for %s: %w" , c .name , err )
76+ }
77+ digest , err := GetImageDigest (ctx , customImage )
78+ if err != nil {
79+ return "" , "" , fmt .Errorf ("failed to get image %s digest: %w" , customImage , err )
80+ }
81+ tag := fmt .Sprintf ("%s@%s" , TagFromImage (customImage ), digest )
82+ repo := fmt .Sprintf ("proxy.replicated.com/anonymous/%s" , FamiliarImageName (RemoveTagFromImage (customImage )))
83+ return repo , tag , nil
84+ }
85+
86+ func (c * addonComponent ) resolveApkoImageRepoAndTag (ctx context.Context , upstreamVersion string ) (string , string , error ) {
87+ packageName , packageVersion , err := c .getPackageNameAndVersion (ctx , upstreamVersion )
88+ if err != nil {
89+ return "" , "" , fmt .Errorf ("failed to get package name and version constraint for %s: %w" , c .name , err )
90+ }
91+
92+ logrus .Infof ("building and publishing %s" , c .name )
93+
94+ if err := ApkoBuildAndPublish (c .name , packageName , packageVersion ); err != nil {
95+ return "" , "" , fmt .Errorf ("failed to apko build and publish for %s: %w" , c .name , err )
96+ }
97+
98+ builtImage , err := GetImageNameFromBuildFile ()
99+ if err != nil {
100+ return "" , "" , fmt .Errorf ("failed to get digest from build file: %w" , err )
101+ }
102+
103+ parts := strings .SplitN (builtImage , ":" , 2 )
104+ if len (parts ) != 2 {
105+ return "" , "" , fmt .Errorf ("invalid image name: %s" , builtImage )
106+ }
107+
108+ return fmt .Sprintf ("proxy.replicated.com/anonymous/%s" , FamiliarImageName (parts [0 ])), parts [1 ], nil
109+ }
110+
111+ func (c * addonComponent ) getPackageNameAndVersion (ctx context.Context , upstreamVersion string ) (string , string , error ) {
24112 packageName := ""
25113 if c .getWolfiPackageName == nil {
26114 return packageName , strings .TrimPrefix (upstreamVersion , "v" ), nil
@@ -38,29 +126,26 @@ func (c *addonComponent) getPackageNameAndVersion(wolfiAPKIndex []byte, upstream
38126
39127 if c .getWolfiPackageName != nil {
40128 packageName = c .getWolfiPackageName (addonComponentOptions {
129+ ctx : ctx ,
41130 k0sVersion : k0sVersion ,
42131 upstreamVersion : semver .MustParse (upstreamVersion ),
43132 latestK8sVersion : latestK8sVersion ,
44133 })
45134 }
46135
47- comparison := latestPatchComparison (semver .MustParse (upstreamVersion ))
48- if c .getWolfiPackageVersionComparison != nil {
49- comparison = c .getWolfiPackageVersionComparison (addonComponentOptions {
136+ packageVersion := latestPatchVersion (semver .MustParse (upstreamVersion ))
137+ if c .getWolfiPackageVersion != nil {
138+ packageVersion = c .getWolfiPackageVersion (addonComponentOptions {
139+ ctx : ctx ,
50140 k0sVersion : k0sVersion ,
51141 upstreamVersion : semver .MustParse (upstreamVersion ),
52142 latestK8sVersion : latestK8sVersion ,
53143 })
54144 }
55- constraints , err := semver .NewConstraint (comparison )
56- if err != nil {
57- return "" , "" , fmt .Errorf ("failed to parse version constraint: %w" , err )
58- }
59-
60- packageVersion , err := FindWolfiPackageVersion (wolfiAPKIndex , packageName , constraints )
61- if err != nil {
62- return "" , "" , fmt .Errorf ("failed to find wolfi package version for %s=%s: %w" , packageName , upstreamVersion , err )
63- }
64145
65146 return packageName , packageVersion , nil
66147}
148+
149+ func latestPatchVersion (s * semver.Version ) string {
150+ return fmt .Sprintf ("%d.%d" , s .Major (), s .Minor ())
151+ }
0 commit comments