| Giorgi Lekveishvili | 46743d4 | 2023-12-10 15:47:23 +0400 | [diff] [blame] | 1 | package tasks |
| 2 | |
| 3 | import ( |
| 4 | "bytes" |
| 5 | "embed" |
| 6 | "encoding/base64" |
| 7 | "fmt" |
| 8 | "path" |
| 9 | "strings" |
| 10 | "text/template" |
| gio | 3af4394 | 2024-04-16 08:13:50 +0400 | [diff] [blame] | 11 | |
| 12 | "github.com/giolekva/pcloud/core/installer" |
| gio | e72b54f | 2024-04-22 10:44:41 +0400 | [diff] [blame^] | 13 | "github.com/giolekva/pcloud/core/installer/soft" |
| Giorgi Lekveishvili | 46743d4 | 2023-12-10 15:47:23 +0400 | [diff] [blame] | 14 | ) |
| 15 | |
| 16 | //go:embed env-tmpl |
| 17 | var filesTmpls embed.FS |
| 18 | |
| gio | e72b54f | 2024-04-22 10:44:41 +0400 | [diff] [blame^] | 19 | func NewActivateEnvTask(env installer.EnvConfig, st *state) Task { |
| Giorgi Lekveishvili | 378ea88 | 2023-12-12 13:59:18 +0400 | [diff] [blame] | 20 | return newSequentialParentTask( |
| Giorgi Lekveishvili | 5c1b06e | 2024-03-28 15:19:44 +0400 | [diff] [blame] | 21 | "Activate GitOps", |
| 22 | false, |
| Giorgi Lekveishvili | 378ea88 | 2023-12-12 13:59:18 +0400 | [diff] [blame] | 23 | AddNewEnvTask(env, st), |
| 24 | // TODO(gio): sync dodo-flux |
| 25 | ) |
| 26 | } |
| 27 | |
| gio | e72b54f | 2024-04-22 10:44:41 +0400 | [diff] [blame^] | 28 | func AddNewEnvTask(env installer.EnvConfig, st *state) Task { |
| Giorgi Lekveishvili | 378ea88 | 2023-12-12 13:59:18 +0400 | [diff] [blame] | 29 | t := newLeafTask("Commit initial configuration", func() error { |
| Giorgi Lekveishvili | 77ee2dc | 2023-12-11 16:51:10 +0400 | [diff] [blame] | 30 | ssPublicKeys, err := st.ssClient.GetPublicKeys() |
| Giorgi Lekveishvili | 46743d4 | 2023-12-10 15:47:23 +0400 | [diff] [blame] | 31 | if err != nil { |
| 32 | return err |
| 33 | } |
| gio | e72b54f | 2024-04-22 10:44:41 +0400 | [diff] [blame^] | 34 | repoHost := strings.Split(st.ssClient.Address(), ":")[0] |
| 35 | return st.repo.Do(func(r soft.RepoFS) (string, error) { |
| 36 | kust, err := soft.ReadKustomization(r, "environments/kustomization.yaml") |
| Giorgi Lekveishvili | 77ee2dc | 2023-12-11 16:51:10 +0400 | [diff] [blame] | 37 | if err != nil { |
| gio | 3af4394 | 2024-04-16 08:13:50 +0400 | [diff] [blame] | 38 | return "", err |
| Giorgi Lekveishvili | 77ee2dc | 2023-12-11 16:51:10 +0400 | [diff] [blame] | 39 | } |
| gio | e72b54f | 2024-04-22 10:44:41 +0400 | [diff] [blame^] | 40 | kust.AddResources(env.Id) |
| gio | 3af4394 | 2024-04-16 08:13:50 +0400 | [diff] [blame] | 41 | tmpls, err := template.ParseFS(filesTmpls, "env-tmpl/*.yaml") |
| 42 | if err != nil { |
| 43 | return "", err |
| Giorgi Lekveishvili | 77ee2dc | 2023-12-11 16:51:10 +0400 | [diff] [blame] | 44 | } |
| gio | 3af4394 | 2024-04-16 08:13:50 +0400 | [diff] [blame] | 45 | var knownHosts bytes.Buffer |
| 46 | for _, key := range ssPublicKeys { |
| 47 | fmt.Fprintf(&knownHosts, "%s %s\n", repoHost, key) |
| 48 | } |
| 49 | for _, tmpl := range tmpls.Templates() { // TODO(gio): migrate to cue |
| gio | e72b54f | 2024-04-22 10:44:41 +0400 | [diff] [blame^] | 50 | dstPath := path.Join("environments", env.Id, tmpl.Name()) |
| gio | 3af4394 | 2024-04-16 08:13:50 +0400 | [diff] [blame] | 51 | dst, err := r.Writer(dstPath) |
| 52 | if err != nil { |
| 53 | return "", err |
| 54 | } |
| 55 | defer dst.Close() |
| 56 | if err := tmpl.Execute(dst, map[string]string{ |
| gio | e72b54f | 2024-04-22 10:44:41 +0400 | [diff] [blame^] | 57 | "Name": env.Id, |
| gio | 3af4394 | 2024-04-16 08:13:50 +0400 | [diff] [blame] | 58 | "PrivateKey": base64.StdEncoding.EncodeToString(st.keys.RawPrivateKey()), |
| 59 | "PublicKey": base64.StdEncoding.EncodeToString(st.keys.RawAuthorizedKey()), |
| 60 | "RepoHost": repoHost, |
| 61 | "RepoName": "config", |
| 62 | "KnownHosts": base64.StdEncoding.EncodeToString(knownHosts.Bytes()), |
| 63 | }); err != nil { |
| 64 | return "", err |
| 65 | } |
| 66 | } |
| gio | e72b54f | 2024-04-22 10:44:41 +0400 | [diff] [blame^] | 67 | if err := soft.WriteYaml(r, "environments/kustomization.yaml", kust); err != nil { |
| gio | 3af4394 | 2024-04-16 08:13:50 +0400 | [diff] [blame] | 68 | return "", err |
| 69 | } |
| gio | e72b54f | 2024-04-22 10:44:41 +0400 | [diff] [blame^] | 70 | return fmt.Sprintf("%s: initialize environment", env.Id), nil |
| gio | 3af4394 | 2024-04-16 08:13:50 +0400 | [diff] [blame] | 71 | }) |
| Giorgi Lekveishvili | 77ee2dc | 2023-12-11 16:51:10 +0400 | [diff] [blame] | 72 | }) |
| 73 | return &t |
| Giorgi Lekveishvili | 46743d4 | 2023-12-10 15:47:23 +0400 | [diff] [blame] | 74 | } |