Skip to content

Commit 86a1b68

Browse files
committed
feat: replace hardcoded artifact image constants with CLI-configurable values
Adds CLI flags that replace hardcoded image constants Signed-off-by: Aleksandr Gamzin <[email protected]>
1 parent c27ee27 commit 86a1b68

File tree

8 files changed

+98
-9
lines changed

8 files changed

+98
-9
lines changed

cmd/image-factory/cmd/options.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,14 @@ type Options struct { //nolint:govet
110110

111111
// SecureBoot settings.
112112
SecureBoot SecureBootOptions
113+
114+
// Image references
115+
InstallerBaseImage string
116+
InstallerImage string
117+
ImagerImage string
118+
ExtensionManifestImage string
119+
OverlayManifestImage string
120+
TalosctlImage string
113121
}
114122

115123
// SecureBootOptions configures SecureBoot.
@@ -165,4 +173,11 @@ var DefaultOptions = Options{
165173
CacheS3Bucket: "image-factory",
166174

167175
MetricsListenAddr: ":2122",
176+
177+
InstallerBaseImage: "siderolabs/installer-base",
178+
InstallerImage: "siderolabs/installer",
179+
ImagerImage: "siderolabs/imager",
180+
ExtensionManifestImage: "siderolabs/extensions",
181+
OverlayManifestImage: "siderolabs/overlays",
182+
TalosctlImage: "siderolabs/talosctl-all",
168183
}

cmd/image-factory/cmd/service.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -309,6 +309,13 @@ func buildArtifactsManager(ctx context.Context, logger *zap.Logger, opts Options
309309
TalosVersionRecheckInterval: opts.TalosVersionRecheckInterval,
310310
RemoteOptions: remoteOptions(),
311311
RegistryRefreshInterval: opts.RegistryRefreshInterval,
312+
313+
InstallerBaseImage: opts.InstallerBaseImage,
314+
InstallerImage: opts.InstallerImage,
315+
ImagerImage: opts.ImagerImage,
316+
ExtensionManifestImage: opts.ExtensionManifestImage,
317+
OverlayManifestImage: opts.OverlayManifestImage,
318+
TalosctlImage: opts.TalosctlImage,
312319
})
313320
if err != nil {
314321
return nil, fmt.Errorf("failed to initialize artifacts manager: %w", err)

cmd/image-factory/flags.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,13 @@ func initFlags() cmd.Options {
9797
flag.StringVar(&opts.SecureBoot.AzureCertificateName, "secureboot-azure-certificate-name", cmd.DefaultOptions.SecureBoot.AzureCertificateName, "Secure Boot Azure Key Vault certificate name (use Azure PKI)") //nolint:lll
9898
flag.StringVar(&opts.SecureBoot.AzureKeyName, "secureboot-azure-key-name", cmd.DefaultOptions.SecureBoot.AzureKeyName, "Secure Boot Azure Key Vault PCR key name (use Azure PKI)")
9999

100+
flag.StringVar(&opts.InstallerBaseImage, "installer-base-image", cmd.DefaultOptions.InstallerBaseImage, "Name of image InstallerBaseImage")
101+
flag.StringVar(&opts.InstallerImage, "installer-image", cmd.DefaultOptions.InstallerImage, "Name of image InstallerImage")
102+
flag.StringVar(&opts.ImagerImage, "imager-image", cmd.DefaultOptions.ImagerImage, "Name of image ImagerImage")
103+
flag.StringVar(&opts.ExtensionManifestImage, "extension-manifest-image", cmd.DefaultOptions.ExtensionManifestImage, "Name of image ExtensionManifestImage")
104+
flag.StringVar(&opts.OverlayManifestImage, "overlay-manifest-image", cmd.DefaultOptions.OverlayManifestImage, "Name of image OverlayManifestImage")
105+
flag.StringVar(&opts.TalosctlImage, "talosctl-image", cmd.DefaultOptions.TalosctlImage, "Name of image TalosctlImage")
106+
100107
opts.LogLevel = zap.LevelFlag("log-level", zap.InfoLevel, "set the logging level")
101108

102109
flag.Parse()

internal/artifacts/artifacts.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,13 @@ type Options struct { //nolint:govet
3131
RemoteOptions []remote.Option
3232
// RegistryRefreshInterval is the interval for refreshing the image registry connections.
3333
RegistryRefreshInterval time.Duration
34+
35+
InstallerBaseImage string
36+
InstallerImage string
37+
ImagerImage string
38+
ExtensionManifestImage string
39+
OverlayManifestImage string
40+
TalosctlImage string
3441
}
3542

3643
// ImageVerifyOptions are the options for verifying the image signature.

internal/artifacts/fetch.go

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,12 @@ func (m *Manager) fetchImageByDigest(digestRef name.Digest, architecture Arch, i
142142
func (m *Manager) fetchImager(tag string) error {
143143
destinationPath := filepath.Join(m.storagePath, tag)
144144

145-
if err := m.fetchImageByTag(ImagerImage, tag, ArchAmd64, imageExportHandler(func(logger *zap.Logger, r io.Reader) error {
145+
imagerImage := ImagerImage
146+
if m.options.ImagerImage != "" {
147+
imagerImage = m.options.ImagerImage
148+
}
149+
150+
if err := m.fetchImageByTag(imagerImage, tag, ArchAmd64, imageExportHandler(func(logger *zap.Logger, r io.Reader) error {
146151
return untarWithPrefix(logger, r, usrInstallPrefix, destinationPath+tmpSuffix)
147152
})); err != nil {
148153
return err
@@ -190,10 +195,20 @@ func (m *Manager) fetchOverlayImage(arch Arch, ref OverlayRef, destPath string)
190195

191196
// fetchInstallerImage fetches a Talos installer image and exports it to the storage.
192197
func (m *Manager) fetchInstallerImage(arch Arch, versionTag string, destPath string) error {
193-
installerImage := InstallerImage
198+
var installerImage string
194199

195200
if quirks.New(versionTag).SupportsUnifiedInstaller() {
196-
installerImage = InstallerBaseImage
201+
if m.options.InstallerBaseImage != "" {
202+
installerImage = m.options.InstallerBaseImage
203+
} else {
204+
installerImage = InstallerBaseImage
205+
}
206+
} else {
207+
if m.options.InstallerImage != "" {
208+
installerImage = m.options.InstallerImage
209+
} else {
210+
installerImage = InstallerImage
211+
}
197212
}
198213

199214
if err := m.fetchImageByTag(installerImage, versionTag, arch, imageOCIHandler(destPath+tmpSuffix)); err != nil {
@@ -206,6 +221,9 @@ func (m *Manager) fetchInstallerImage(arch Arch, versionTag string, destPath str
206221
// fetchTalosctlImage fetches a Talosctl image and exports it to the storage.
207222
func (m *Manager) fetchTalosctlImage(versionTag string, destPath string) error {
208223
talosctlImage := TalosctlImage
224+
if m.options.TalosctlImage != "" {
225+
talosctlImage = m.options.TalosctlImage
226+
}
209227

210228
if err := m.fetchImageByTag(talosctlImage, versionTag, ArchAmd64, imageExportHandler(func(logger *zap.Logger, r io.Reader) error {
211229
return untarWithPrefix(logger, r, "", destPath+tmpSuffix)

internal/artifacts/manager.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -454,6 +454,10 @@ func (m *Manager) GetTalosctlTuples(ctx context.Context, versionString string) (
454454
return tuples, nil
455455
}
456456

457+
func (m *Manager) Options() Options {
458+
return m.options
459+
}
460+
457461
func (m *Manager) parseTag(ctx context.Context, versionString string) (string, error) {
458462
version, err := semver.ParseTolerant(versionString)
459463
if err != nil {

internal/artifacts/versions.go

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,12 @@ func (m *Manager) fetchTalosVersions() (any, error) {
2828
ctx, cancel := context.WithTimeout(context.Background(), FetchTimeout)
2929
defer cancel()
3030

31-
repository := m.imageRegistry.Repo(ImagerImage)
31+
imagerImage := ImagerImage
32+
if m.options.ImagerImage != "" {
33+
imagerImage = m.options.ImagerImage
34+
}
35+
36+
repository := m.imageRegistry.Repo(imagerImage)
3237

3338
candidates, err := m.pullers[ArchAmd64].List(ctx, repository)
3439
if err != nil {
@@ -128,9 +133,14 @@ type overlaysDescription struct {
128133
}
129134

130135
func (m *Manager) fetchOfficialExtensions(tag string) error {
136+
extensionManifestImage := ExtensionManifestImage
137+
if m.options.ExtensionManifestImage != "" {
138+
extensionManifestImage = m.options.ExtensionManifestImage
139+
}
140+
131141
var extensions []ExtensionRef
132142

133-
if err := m.fetchImageByTag(ExtensionManifestImage, tag, ArchAmd64, imageExportHandler(func(_ *zap.Logger, r io.Reader) error {
143+
if err := m.fetchImageByTag(extensionManifestImage, tag, ArchAmd64, imageExportHandler(func(_ *zap.Logger, r io.Reader) error {
134144
var extractErr error
135145

136146
extensions, extractErr = extractExtensionList(r)
@@ -158,9 +168,14 @@ func (m *Manager) fetchOfficialExtensions(tag string) error {
158168
}
159169

160170
func (m *Manager) fetchOfficialOverlays(tag string) error {
171+
overlayManifestImage := OverlayManifestImage
172+
if m.options.OverlayManifestImage != "" {
173+
overlayManifestImage = m.options.OverlayManifestImage
174+
}
175+
161176
var overlays []OverlayRef
162177

163-
if err := m.fetchImageByTag(OverlayManifestImage, tag, ArchAmd64, imageExportHandler(func(_ *zap.Logger, r io.Reader) error {
178+
if err := m.fetchImageByTag(overlayManifestImage, tag, ArchAmd64, imageExportHandler(func(_ *zap.Logger, r io.Reader) error {
164179
var extractErr error
165180

166181
overlays, extractErr = extractOverlayList(r)
@@ -188,9 +203,14 @@ func (m *Manager) fetchOfficialOverlays(tag string) error {
188203
}
189204

190205
func (m *Manager) fetchTalosctlTuples(tag string) error {
206+
talosctlImage := TalosctlImage
207+
if m.options.TalosctlImage != "" {
208+
talosctlImage = m.options.TalosctlImage
209+
}
210+
191211
var talosctlTuples []TalosctlTuple
192212

193-
if err := m.fetchImageByTag(TalosctlImage, tag, ArchAmd64, imageExportHandler(func(_ *zap.Logger, r io.Reader) error {
213+
if err := m.fetchImageByTag(talosctlImage, tag, ArchAmd64, imageExportHandler(func(_ *zap.Logger, r io.Reader) error {
194214
var extractErr error
195215

196216
talosctlTuples, extractErr = extractTalosctlTuples(r)

internal/profile/profile.go

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -283,6 +283,7 @@ type ArtifactProducer interface {
283283
GetOverlayArtifact(context.Context, artifacts.Arch, artifacts.OverlayRef, artifacts.OverlayKind) (string, error)
284284
GetInstallerImage(context.Context, artifacts.Arch, string) (string, error)
285285
GetTalosctlImage(context.Context, string) (string, error)
286+
Options() artifacts.Options
286287
}
287288

288289
func findExtension(availableExtensions []artifacts.ExtensionRef, extensionName string) artifacts.ExtensionRef {
@@ -362,10 +363,20 @@ func EnhanceFromSchematic(
362363

363364
if prof.Output.Kind == profile.OutKindInstaller {
364365
if installerImagePath, err := artifactProducer.GetInstallerImage(ctx, artifacts.Arch(prof.Arch), versionTag); err == nil {
365-
installerImage := artifacts.InstallerImage
366+
var installerImage string
366367

367368
if quirks.New(versionTag).SupportsUnifiedInstaller() {
368-
installerImage = artifacts.InstallerBaseImage
369+
if artifactProducer.Options().InstallerBaseImage != "" {
370+
installerImage = artifactProducer.Options().InstallerBaseImage
371+
} else {
372+
installerImage = artifacts.InstallerBaseImage // fallback
373+
}
374+
} else {
375+
if artifactProducer.Options().InstallerImage != "" {
376+
installerImage = artifactProducer.Options().InstallerImage
377+
} else {
378+
installerImage = artifacts.InstallerImage // fallback
379+
}
369380
}
370381

371382
prof.Input.BaseInstaller.ImageRef = installerImage + ":" + versionTag // fake reference

0 commit comments

Comments
 (0)