blob: 0980deead9eb9c4321cc447dff78df76acc6bbeb [file] [log] [blame]
Giorgi Lekveishvili46743d42023-12-10 15:47:23 +04001package tasks
2
3import (
4 "bytes"
5 "embed"
6 "encoding/base64"
7 "fmt"
8 "path"
9 "strings"
10 "text/template"
Giorgi Lekveishvili46743d42023-12-10 15:47:23 +040011)
12
13//go:embed env-tmpl
14var filesTmpls embed.FS
15
16type activateEnvTask struct {
17 basicTask
18 env Env
19 st *state
20}
21
22func NewActivateEnvTask(env Env, st *state) Task {
Giorgi Lekveishvili378ea882023-12-12 13:59:18 +040023 return newSequentialParentTask(
24 fmt.Sprintf("Activate new %s instance", env.PCloudEnvName),
25 AddNewEnvTask(env, st),
26 // TODO(gio): sync dodo-flux
27 )
28}
29
30func AddNewEnvTask(env Env, st *state) Task {
31 t := newLeafTask("Commit initial configuration", func() error {
Giorgi Lekveishvili77ee2dc2023-12-11 16:51:10 +040032 ssPublicKeys, err := st.ssClient.GetPublicKeys()
Giorgi Lekveishvili46743d42023-12-10 15:47:23 +040033 if err != nil {
34 return err
35 }
Giorgi Lekveishvili77ee2dc2023-12-11 16:51:10 +040036 repoHost := strings.Split(st.ssClient.Addr, ":")[0]
37 kust, err := st.repo.ReadKustomization("environments/kustomization.yaml")
38 if err != nil {
Giorgi Lekveishvili46743d42023-12-10 15:47:23 +040039 return err
40 }
Giorgi Lekveishvili77ee2dc2023-12-11 16:51:10 +040041 kust.AddResources(env.Name)
42 tmpls, err := template.ParseFS(filesTmpls, "env-tmpl/*.yaml")
43 if err != nil {
44 return err
45 }
46 var knownHosts bytes.Buffer
47 for _, key := range ssPublicKeys {
48 fmt.Fprintf(&knownHosts, "%s %s\n", repoHost, key)
49 }
Giorgi Lekveishvilie009a5d2024-01-05 14:10:11 +040050 for _, tmpl := range tmpls.Templates() { // TODO(gio): migrate to cue
Giorgi Lekveishvili77ee2dc2023-12-11 16:51:10 +040051 dstPath := path.Join("environments", env.Name, tmpl.Name())
52 dst, err := st.repo.Writer(dstPath)
53 if err != nil {
54 return err
55 }
56 defer dst.Close()
57
58 if err := tmpl.Execute(dst, map[string]string{
59 "Name": env.Name,
60 "PrivateKey": base64.StdEncoding.EncodeToString(st.keys.RawPrivateKey()),
61 "PublicKey": base64.StdEncoding.EncodeToString(st.keys.RawAuthorizedKey()),
62 "RepoHost": repoHost,
63 "RepoName": "config",
64 "KnownHosts": base64.StdEncoding.EncodeToString(knownHosts.Bytes()),
65 }); err != nil {
66 return err
67 }
68 }
69 if err := st.repo.WriteKustomization("environments/kustomization.yaml", *kust); err != nil {
70 return err
71 }
72 if err := st.repo.CommitAndPush(fmt.Sprintf("%s: initialize environment", env.Name)); err != nil {
73 return err
74 }
75 return nil
76 })
77 return &t
Giorgi Lekveishvili46743d42023-12-10 15:47:23 +040078}