Skip to content

Commit cbf894e

Browse files
committed
chore: add version override query from the API
hhfab versions --live Signed-off-by: Pau Capdevila <[email protected]>
1 parent 1ed17d8 commit cbf894e

File tree

2 files changed

+97
-15
lines changed

2 files changed

+97
-15
lines changed

cmd/hhfab/main.go

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -624,12 +624,17 @@ func Run(ctx context.Context) error {
624624
},
625625
},
626626
{
627-
Name: "versions",
628-
Usage: "print versions of all components",
629-
Flags: flatten(defaultFlags, hModeFlags),
627+
Name: "versions",
628+
Usage: "print versions of all components",
629+
Flags: flatten(defaultFlags, hModeFlags, []cli.Flag{
630+
&cli.BoolFlag{
631+
Name: "live",
632+
Usage: "load versions from running API instead of the config file (fab.yaml)",
633+
},
634+
}),
630635
Before: before(false),
631-
Action: func(_ *cli.Context) error {
632-
if err := hhfab.Versions(ctx, workDir, cacheDir, hhfab.HydrateMode(hydrateMode)); err != nil {
636+
Action: func(c *cli.Context) error {
637+
if err := hhfab.Versions(ctx, workDir, cacheDir, hhfab.HydrateMode(hydrateMode), c.Bool("live")); err != nil {
633638
return fmt.Errorf("printing versions: %w", err)
634639
}
635640

pkg/hhfab/cmdversions.go

Lines changed: 87 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,20 +11,31 @@ import (
1111
"os"
1212
"path/filepath"
1313

14+
"go.githedgehog.com/fabric/pkg/util/kubeutil"
1415
fabapi "go.githedgehog.com/fabricator/api/fabricator/v1beta1"
1516
"go.githedgehog.com/fabricator/pkg/fab"
16-
"sigs.k8s.io/yaml"
17+
kclient "sigs.k8s.io/controller-runtime/pkg/client"
18+
kyaml "sigs.k8s.io/yaml"
1719
)
1820

19-
func Versions(ctx context.Context, workDir, cacheDir string, hMode HydrateMode) error {
21+
func Versions(ctx context.Context, workDir, cacheDir string, hMode HydrateMode, live bool) error {
22+
if live {
23+
cfg := &Config{
24+
WorkDir: workDir,
25+
CacheDir: cacheDir,
26+
}
27+
28+
return getVersionsFromCluster(ctx, cfg)
29+
}
30+
2031
configPath := filepath.Join(workDir, FabConfigFile)
2132
if _, err := os.Stat(configPath); err != nil && errors.Is(err, os.ErrNotExist) {
2233
slog.Info("No configuration found", "file", FabConfigFile, "action", "Showing release versions")
2334
freshFab := fabapi.Fabricator{}
2435
if err := freshFab.CalculateVersions(fab.Versions); err != nil {
2536
return fmt.Errorf("calculating default versions: %w", err)
2637
}
27-
data, err := yaml.Marshal(freshFab.Status.Versions)
38+
data, err := kyaml.Marshal(freshFab.Status.Versions)
2839
if err != nil {
2940
return fmt.Errorf("marshalling versions: %w", err)
3041
}
@@ -42,16 +53,74 @@ func Versions(ctx context.Context, workDir, cacheDir string, hMode HydrateMode)
4253
if err := freshFab.CalculateVersions(fab.Versions); err != nil {
4354
return fmt.Errorf("calculating default versions: %w", err)
4455
}
45-
releaseData, err := yaml.Marshal(freshFab.Status.Versions)
56+
releaseData, err := kyaml.Marshal(freshFab.Status.Versions)
4657
if err != nil {
4758
return fmt.Errorf("marshalling release versions: %w", err)
4859
}
4960
var release map[string]interface{}
50-
if err := yaml.Unmarshal(releaseData, &release); err != nil {
61+
if err := kyaml.Unmarshal(releaseData, &release); err != nil {
5162
return fmt.Errorf("unmarshalling release versions: %w", err)
5263
}
5364

54-
overridesRaw, err := yaml.Marshal(cfg.Fab.Spec.Overrides.Versions)
65+
overridesRaw, err := kyaml.Marshal(cfg.Fab.Spec.Overrides.Versions)
66+
if err != nil {
67+
slog.Warn("Failed to marshal overrides", "error", err)
68+
fmt.Println(string(releaseData))
69+
70+
return nil
71+
}
72+
73+
var overrides map[string]interface{}
74+
if err := kyaml.Unmarshal(overridesRaw, &overrides); err != nil {
75+
slog.Warn("Failed to unmarshal overrides", "error", err)
76+
fmt.Println(string(releaseData))
77+
78+
return nil
79+
}
80+
81+
if len(overrides) == 0 {
82+
slog.Info("Printing versions of all components")
83+
fmt.Println(string(releaseData))
84+
85+
return nil
86+
}
87+
88+
slog.Info("Printing versions of all components (release → override)")
89+
merged := make(map[string]interface{})
90+
91+
for category, value := range release {
92+
merged[category] = processVersionCategory(category, value, overrides)
93+
}
94+
95+
mergedData, err := kyaml.Marshal(merged)
96+
if err != nil {
97+
return fmt.Errorf("marshalling merged versions: %w", err)
98+
}
99+
fmt.Println(string(mergedData))
100+
101+
return nil
102+
}
103+
104+
func getVersionsFromCluster(ctx context.Context, c *Config) error {
105+
kubeconfig := filepath.Join(c.WorkDir, VLABDir, VLABKubeConfig)
106+
kube, err := kubeutil.NewClient(ctx, kubeconfig, fabapi.SchemeBuilder)
107+
if err != nil {
108+
return fmt.Errorf("creating kube client: %w", err)
109+
}
110+
111+
fab := &fabapi.Fabricator{}
112+
if err := kube.Get(ctx, kclient.ObjectKey{Name: "default", Namespace: "fab"}, fab); err != nil {
113+
return fmt.Errorf("getting fabricator object: %w", err)
114+
}
115+
116+
slog.Info("Printing versions from live cluster")
117+
118+
releaseData, err := kyaml.Marshal(fab.Status.Versions)
119+
if err != nil {
120+
return fmt.Errorf("marshalling versions: %w", err)
121+
}
122+
123+
overridesRaw, err := kyaml.Marshal(fab.Spec.Overrides.Versions)
55124
if err != nil {
56125
slog.Warn("Failed to marshal overrides", "error", err)
57126
fmt.Println(string(releaseData))
@@ -60,7 +129,7 @@ func Versions(ctx context.Context, workDir, cacheDir string, hMode HydrateMode)
60129
}
61130

62131
var overrides map[string]interface{}
63-
if err := yaml.Unmarshal(overridesRaw, &overrides); err != nil {
132+
if err := kyaml.Unmarshal(overridesRaw, &overrides); err != nil {
64133
slog.Warn("Failed to unmarshal overrides", "error", err)
65134
fmt.Println(string(releaseData))
66135

@@ -74,14 +143,22 @@ func Versions(ctx context.Context, workDir, cacheDir string, hMode HydrateMode)
74143
return nil
75144
}
76145

77-
slog.Info("Printing versions of all components (overridden←→release)")
146+
var release map[string]interface{}
147+
if err := kyaml.Unmarshal(releaseData, &release); err != nil {
148+
slog.Warn("Failed to unmarshal release versions", "error", err)
149+
fmt.Println(string(releaseData))
150+
151+
return nil
152+
}
153+
154+
slog.Info("Printing versions of all components (release → override)")
78155
merged := make(map[string]interface{})
79156

80157
for category, value := range release {
81158
merged[category] = processVersionCategory(category, value, overrides)
82159
}
83160

84-
mergedData, err := yaml.Marshal(merged)
161+
mergedData, err := kyaml.Marshal(merged)
85162
if err != nil {
86163
return fmt.Errorf("marshalling merged versions: %w", err)
87164
}
@@ -120,7 +197,7 @@ func processVersionCategory(category string, releaseValue interface{}, overrides
120197
if overrideComp, exists := overrideMap[compName]; exists {
121198
overrideVerStr, isOverrideString := overrideComp.(string)
122199
if isOverrideString {
123-
result[compName] = fmt.Sprintf("%s←→%s", overrideVerStr, releaseVerStr)
200+
result[compName] = fmt.Sprintf("%s%s", releaseVerStr, overrideVerStr)
124201
} else {
125202
result[compName] = releaseVer
126203
}

0 commit comments

Comments
 (0)