blob: f02e7a81ff386bb2984ebc75927bf02ec05ae3cf [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 Lekveishvili77ee2dc2023-12-11 16:51:10 +040023 t := newLeafTask(fmt.Sprintf("Activate %s environment", env.Name), func() error {
24 ssPublicKeys, err := st.ssClient.GetPublicKeys()
Giorgi Lekveishvili46743d42023-12-10 15:47:23 +040025 if err != nil {
26 return err
27 }
Giorgi Lekveishvili77ee2dc2023-12-11 16:51:10 +040028 repoHost := strings.Split(st.ssClient.Addr, ":")[0]
29 kust, err := st.repo.ReadKustomization("environments/kustomization.yaml")
30 if err != nil {
Giorgi Lekveishvili46743d42023-12-10 15:47:23 +040031 return err
32 }
Giorgi Lekveishvili77ee2dc2023-12-11 16:51:10 +040033 kust.AddResources(env.Name)
34 tmpls, err := template.ParseFS(filesTmpls, "env-tmpl/*.yaml")
35 if err != nil {
36 return err
37 }
38 var knownHosts bytes.Buffer
39 for _, key := range ssPublicKeys {
40 fmt.Fprintf(&knownHosts, "%s %s\n", repoHost, key)
41 }
42 for _, tmpl := range tmpls.Templates() {
43 dstPath := path.Join("environments", env.Name, tmpl.Name())
44 dst, err := st.repo.Writer(dstPath)
45 if err != nil {
46 return err
47 }
48 defer dst.Close()
49
50 if err := tmpl.Execute(dst, map[string]string{
51 "Name": env.Name,
52 "PrivateKey": base64.StdEncoding.EncodeToString(st.keys.RawPrivateKey()),
53 "PublicKey": base64.StdEncoding.EncodeToString(st.keys.RawAuthorizedKey()),
54 "RepoHost": repoHost,
55 "RepoName": "config",
56 "KnownHosts": base64.StdEncoding.EncodeToString(knownHosts.Bytes()),
57 }); err != nil {
58 return err
59 }
60 }
61 if err := st.repo.WriteKustomization("environments/kustomization.yaml", *kust); err != nil {
62 return err
63 }
64 if err := st.repo.CommitAndPush(fmt.Sprintf("%s: initialize environment", env.Name)); err != nil {
65 return err
66 }
67 return nil
68 })
69 return &t
Giorgi Lekveishvili46743d42023-12-10 15:47:23 +040070}