blob: f8b8018f228ce6f87c1a324cfb91d1dd201a98ee [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"
11
12 "github.com/charmbracelet/keygen"
13
14 "github.com/giolekva/pcloud/core/installer"
15)
16
17//go:embed env-tmpl
18var filesTmpls embed.FS
19
20type activateEnvTask struct {
21 basicTask
22 env Env
23 st *state
24}
25
26func NewActivateEnvTask(env Env, st *state) Task {
27 return &activateEnvTask{
28 basicTask: basicTask{
29 title: fmt.Sprintf("Activate %s environment", env.Name),
30 },
31 env: env,
32 st: st,
33 }
34}
35
36func (t *activateEnvTask) Start() {
37 ssPublicKeys, err := t.st.ssClient.GetPublicKeys()
38 if err != nil {
39 t.callDoneListeners(err)
40 return
41 }
42 if err := t.addNewEnv(
43 t.st.repo,
44 strings.Split(t.st.ssClient.Addr, ":")[0],
45 t.st.keys,
46 ssPublicKeys,
47 ); err != nil {
48 t.callDoneListeners(err)
49 return
50 }
51 t.callDoneListeners(nil)
52}
53
54func (t *activateEnvTask) addNewEnv(
55 repoIO installer.RepoIO,
56 repoHost string,
57 keys *keygen.KeyPair,
58 configRepoPublicKeys []string,
59) error {
60 kust, err := repoIO.ReadKustomization("environments/kustomization.yaml")
61 if err != nil {
62 return err
63 }
64 kust.AddResources(t.env.Name)
65 tmpls, err := template.ParseFS(filesTmpls, "env-tmpl/*.yaml")
66 if err != nil {
67 return err
68 }
69 var knownHosts bytes.Buffer
70 for _, key := range configRepoPublicKeys {
71 fmt.Fprintf(&knownHosts, "%s %s\n", repoHost, key)
72 }
73 for _, tmpl := range tmpls.Templates() {
74 dstPath := path.Join("environments", t.env.Name, tmpl.Name())
75 dst, err := repoIO.Writer(dstPath)
76 if err != nil {
77 return err
78 }
79 defer dst.Close()
80
81 if err := tmpl.Execute(dst, map[string]string{
82 "Name": t.env.Name,
83 "PrivateKey": base64.StdEncoding.EncodeToString(keys.RawPrivateKey()),
84 "PublicKey": base64.StdEncoding.EncodeToString(keys.RawAuthorizedKey()),
85 "RepoHost": repoHost,
86 "RepoName": "config",
87 "KnownHosts": base64.StdEncoding.EncodeToString(knownHosts.Bytes()),
88 }); err != nil {
89 return err
90 }
91 }
92 if err := repoIO.WriteKustomization("environments/kustomization.yaml", *kust); err != nil {
93 return err
94 }
95 if err := repoIO.CommitAndPush(fmt.Sprintf("%s: initialize environment", t.env.Name)); err != nil {
96 return err
97 }
98 return nil
99}