Skip to content

Commit 2aecfd0

Browse files
committed
feat: upload aliases from config file
Adds a flag for specifying the path to a YAML file with extension name aliases. Signed-off-by: Aleksandr Gamzin <[email protected]>
1 parent c4f0e72 commit 2aecfd0

File tree

5 files changed

+75
-1
lines changed

5 files changed

+75
-1
lines changed

cmd/image-factory/cmd/options.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,9 @@ type Options struct { //nolint:govet
121121
ExtensionManifestImage string
122122
OverlayManifestImage string
123123
TalosctlImage string
124+
125+
// Path to YAML file with extension name aliases.
126+
ExtensionNameAlias string
124127
}
125128

126129
// SecureBootOptions configures SecureBoot.
@@ -184,4 +187,6 @@ var DefaultOptions = Options{
184187
ExtensionManifestImage: "siderolabs/extensions",
185188
OverlayManifestImage: "siderolabs/overlays",
186189
TalosctlImage: "siderolabs/talosctl-all",
190+
191+
ExtensionNameAlias: "/etc/image-factory/aliases.yaml",
187192
}

cmd/image-factory/flags.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,8 @@ func initFlags() cmd.Options {
106106
flag.StringVar(&opts.OverlayManifestImage, "overlay-manifest-image", cmd.DefaultOptions.OverlayManifestImage, "Name of image OverlayManifestImage")
107107
flag.StringVar(&opts.TalosctlImage, "talosctl-image", cmd.DefaultOptions.TalosctlImage, "Name of image TalosctlImage")
108108

109+
flag.StringVar(&opts.ExtensionNameAlias, "extension-name-alias", cmd.DefaultOptions.ExtensionNameAlias, "Path to YAML file with extension name aliases")
110+
109111
opts.LogLevel = zap.LevelFlag("log-level", zap.InfoLevel, "set the logging level")
110112

111113
flag.Parse()

cmd/image-factory/main.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import (
1717

1818
"github.com/siderolabs/image-factory/cmd/image-factory/cmd"
1919
"github.com/siderolabs/image-factory/internal/artifacts"
20+
"github.com/siderolabs/image-factory/internal/config"
2021
)
2122

2223
func main() {
@@ -89,6 +90,12 @@ func runWithContext(ctx context.Context) error {
8990
artifacts.TalosctlImage = opts.TalosctlImage
9091
}
9192

93+
if opts.ExtensionNameAlias != "" {
94+
if err := config.LoadAliases(opts.ExtensionNameAlias); err != nil {
95+
log.Fatalf("failed to load extension aliases: %v", err)
96+
}
97+
}
98+
9299
cfg := zap.NewProductionConfig()
93100
cfg.Level = zap.NewAtomicLevelAt(*opts.LogLevel)
94101

internal/config/alias.go

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
// This Source Code Form is subject to the terms of the Mozilla Public
2+
// License, v. 2.0. If a copy of the MPL was not distributed with this
3+
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
4+
5+
package config
6+
7+
import (
8+
"fmt"
9+
"os"
10+
11+
"gopkg.in/yaml.v3"
12+
)
13+
14+
type aliasConfig struct {
15+
ExtensionNameAlias []struct {
16+
Name string `yaml:"name"`
17+
Alias string `yaml:"alias"`
18+
} `yaml:"extensionNameAlias"`
19+
}
20+
21+
var aliasMap map[string]string
22+
23+
// Loads aliases from aliases.yaml.
24+
func LoadAliases(path string) error {
25+
data, err := os.ReadFile(path)
26+
if err != nil {
27+
return fmt.Errorf("failed to read alias config: %w", err)
28+
}
29+
30+
var cfg aliasConfig
31+
if err := yaml.Unmarshal(data, &cfg); err != nil {
32+
return fmt.Errorf("failed to unmarshal alias config: %w", err)
33+
}
34+
35+
aliasMap = make(map[string]string)
36+
for _, item := range cfg.ExtensionNameAlias {
37+
aliasMap[item.Name] = item.Alias
38+
}
39+
40+
return nil
41+
}
42+
43+
// GetAlias returns alias if exists.
44+
func GetAlias(name string) (string, bool) {
45+
if aliasMap == nil {
46+
return "", false
47+
}
48+
alias, ok := aliasMap[name]
49+
return alias, ok
50+
}
51+

internal/profile/profile.go

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020
"github.com/siderolabs/gen/xerrors"
2121
"github.com/siderolabs/gen/xslices"
2222
"github.com/siderolabs/go-pointer"
23+
"github.com/siderolabs/image-factory/internal/config"
2324
"github.com/siderolabs/talos/pkg/imager/profile"
2425
"github.com/siderolabs/talos/pkg/machinery/config/merge"
2526
"github.com/siderolabs/talos/pkg/machinery/constants"
@@ -393,7 +394,15 @@ func EnhanceFromSchematic(
393394
}
394395

395396
if value.IsZero(extensionRef) {
396-
return prof, xerrors.NewTaggedf[InvalidErrorTag]("official extension %q is not available for Talos version %s", extensionName, versionTag)
397+
// try YAML-based aliases
398+
if aliasedName, ok := config.GetAlias(extensionName); ok {
399+
extensionRef = findExtension(availableExtensions, aliasedName)
400+
} else {
401+
// fallback to default aliases if no YAML config was loaded
402+
if aliasedName, ok := extensionNameAlias(extensionName); ok {
403+
extensionRef = findExtension(availableExtensions, aliasedName)
404+
}
405+
}
397406
}
398407

399408
imagePath, err := artifactProducer.GetExtensionImage(ctx, artifacts.Arch(prof.Arch), extensionRef)

0 commit comments

Comments
 (0)