Skip to content

Commit 93f21ae

Browse files
ohotnikov.ivankvaps
authored andcommitted
init
Signed-off-by: ohotnikov.ivan <ohotnikov.ivan@e-queo.net>
1 parent da29320 commit 93f21ae

25 files changed

Lines changed: 9069 additions & 0 deletions

internal/pkg/generator/generate.go

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
package generator
2+
3+
import (
4+
"fmt"
5+
"path/filepath"
6+
"time"
7+
8+
"gopkg.in/yaml.v3"
9+
10+
"github.com/siderolabs/talos/cmd/talosctl/cmd/mgmt/gen"
11+
"github.com/siderolabs/talos/pkg/machinery/config"
12+
"github.com/siderolabs/talos/pkg/machinery/config/generate"
13+
"github.com/siderolabs/talos/pkg/machinery/config/generate/secrets"
14+
)
15+
16+
type Options struct {
17+
RootDir string
18+
TalosVersion string
19+
Preset string
20+
Force bool
21+
22+
APIServerURL string
23+
}
24+
25+
// Run performs full generation exactly like "talm init"
26+
func Run(opts Options) error {
27+
var (
28+
contract *config.VersionContract
29+
secretsBundle *secrets.Bundle
30+
err error
31+
)
32+
33+
// Version contract
34+
if opts.TalosVersion != "" {
35+
contract, err = config.ParseContractFromVersion(opts.TalosVersion)
36+
if err != nil {
37+
return fmt.Errorf("invalid talos-version: %w", err)
38+
}
39+
}
40+
41+
// Secrets bundle
42+
secretsBundle, err = secrets.NewBundle(secrets.NewFixedClock(time.Now()), contract)
43+
if err != nil {
44+
return fmt.Errorf("failed to create secrets bundle: %w", err)
45+
}
46+
47+
// Write secrets.yaml
48+
if err := writeSecretsBundle(opts, secretsBundle); err != nil {
49+
return err
50+
}
51+
52+
// Cluster name = name of directory
53+
absolutePath, err := filepath.Abs(opts.RootDir)
54+
if err != nil {
55+
return err
56+
}
57+
clusterName := filepath.Base(absolutePath)
58+
59+
// Config generation
60+
var genOptions []generate.Option
61+
genOptions = append(genOptions, generate.WithSecretsBundle(secretsBundle))
62+
63+
if contract != nil {
64+
genOptions = append(genOptions, generate.WithVersionContract(contract))
65+
}
66+
67+
if opts.APIServerURL == "" {
68+
opts.APIServerURL = "https://192.168.0.1:6443"
69+
}
70+
71+
configBundle, err := gen.GenerateConfigBundle(
72+
genOptions,
73+
clusterName,
74+
opts.APIServerURL,
75+
"",
76+
[]string{},
77+
[]string{},
78+
[]string{},
79+
)
80+
if err != nil {
81+
return err
82+
}
83+
84+
configBundle.TalosConfig().Contexts[clusterName].Endpoints = []string{"127.0.0.1"}
85+
86+
// Write talosconfig
87+
content, err := yaml.Marshal(configBundle.TalosConfig())
88+
if err != nil {
89+
return err
90+
}
91+
92+
if err := writeFile(opts, filepath.Join(opts.RootDir, "talosconfig"), content); err != nil {
93+
return err
94+
}
95+
96+
// Write preset files
97+
if err := writePresets(opts, clusterName); err != nil {
98+
return err
99+
}
100+
101+
return nil
102+
}

internal/pkg/generator/write.go

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package generator
2+
3+
import (
4+
"fmt"
5+
"os"
6+
"path/filepath"
7+
"strings"
8+
9+
"github.com/cozystack/talm/pkg/generated"
10+
"gopkg.in/yaml.v3"
11+
12+
"github.com/siderolabs/talos/pkg/machinery/config/generate/secrets"
13+
)
14+
15+
func writeSecretsBundle(opts Options, bundle *secrets.Bundle) error {
16+
bytes, err := yaml.Marshal(bundle)
17+
if err != nil {
18+
return err
19+
}
20+
21+
dest := filepath.Join(opts.RootDir, "secrets.yaml")
22+
return writeFile(opts, dest, bytes)
23+
}
24+
25+
func writeFile(opts Options, dest string, content []byte) error {
26+
if !opts.Force {
27+
if _, err := os.Stat(dest); err == nil {
28+
return fmt.Errorf("%s already exists (use Force=true)", dest)
29+
}
30+
}
31+
32+
if err := os.MkdirAll(filepath.Dir(dest), os.ModePerm); err != nil {
33+
return fmt.Errorf("failed to create dir: %w", err)
34+
}
35+
36+
if err := os.WriteFile(dest, content, 0o644); err != nil {
37+
return fmt.Errorf("failed to write file: %w", err)
38+
}
39+
40+
fmt.Fprintf(os.Stderr, "Created %s\n", dest)
41+
return nil
42+
}
43+
44+
func writePresets(opts Options, clusterName string) error {
45+
for path, content := range generated.PresetFiles {
46+
47+
parts := strings.SplitN(path, "/", 2)
48+
chartName := parts[0]
49+
50+
if chartName != opts.Preset && chartName != "talm" {
51+
continue
52+
}
53+
54+
out := filepath.Join(opts.RootDir, parts[1])
55+
56+
// Template Chart.yaml
57+
if strings.HasSuffix(path, "Chart.yaml") {
58+
content = fmt.Sprintf(content, clusterName, "0.1.0")
59+
}
60+
61+
if err := writeFile(opts, out, []byte(content)); err != nil {
62+
return err
63+
}
64+
}
65+
return nil
66+
}

0 commit comments

Comments
 (0)