blob: 2457c4df098ad781f2a3b88d0a905df4cd63cb81 [file] [log] [blame]
Giorgi Lekveishvili46743d42023-12-10 15:47:23 +04001package tasks
2
3import (
4 "fmt"
5 "log"
6 "path/filepath"
7
8 "github.com/giolekva/pcloud/core/installer"
9 "github.com/giolekva/pcloud/core/installer/soft"
10)
11
Giorgi Lekveishvili46743d42023-12-10 15:47:23 +040012func NewCreateConfigRepoTask(env Env, st *state) Task {
Giorgi Lekveishvili77ee2dc2023-12-11 16:51:10 +040013 t := newLeafTask("Install Git server", func() error {
14 appsRepo := installer.NewInMemoryAppRepository(installer.CreateAllApps())
15 ssApp, err := appsRepo.Find("soft-serve")
16 if err != nil {
17 return err
18 }
19 ssAdminKeys, err := installer.NewSSHKeyPair(fmt.Sprintf("%s-config-repo-admin-keys", env.Name))
20 if err != nil {
21 return err
22 }
23 ssKeys, err := installer.NewSSHKeyPair(fmt.Sprintf("%s-config-repo-keys", env.Name))
24 if err != nil {
25 return err
26 }
27 ssValues := map[string]any{
28 "ChartRepositoryNamespace": env.PCloudEnvName,
29 "ServiceType": "ClusterIP",
30 "PrivateKey": string(ssKeys.RawPrivateKey()),
31 "PublicKey": string(ssKeys.RawAuthorizedKey()),
32 "AdminKey": string(ssAdminKeys.RawAuthorizedKey()),
33 "Ingress": map[string]any{
34 "Enabled": false,
35 },
36 }
37 derived := installer.Derived{
38 Global: installer.Values{
39 Id: env.Name,
40 PCloudEnvName: env.PCloudEnvName,
41 },
42 Release: installer.Release{
43 Namespace: env.Name,
44 },
45 Values: ssValues,
46 }
47 if err := st.nsCreator.Create(env.Name); err != nil {
48 return err
49 }
50 if err := st.repo.InstallApp(*ssApp, filepath.Join("/environments", env.Name, "config-repo"), ssValues, derived); err != nil {
51 return err
52 }
53 ssClient, err := soft.WaitForClient(
54 fmt.Sprintf("soft-serve.%s.svc.cluster.local:%d", env.Name, 22),
55 ssAdminKeys.RawPrivateKey(),
56 log.Default())
57 if err != nil {
58 return err
59 }
60 if err := ssClient.AddPublicKey("admin", env.AdminPublicKey); err != nil {
61 return err
62 }
63 // // TODO(gio): defer?
64 // // TODO(gio): remove at the end of final task cleanup
65 // if err := ssClient.RemovePublicKey("admin", string(ssAdminKeys.RawAuthorizedKey())); err != nil {
66 // t.callDoneListeners(err)
67 // return
68 // }
69 st.ssClient = ssClient
70 return nil
71 })
72 return &t
Giorgi Lekveishvili46743d42023-12-10 15:47:23 +040073}
74
75func NewInitConfigRepoTask(env Env, st *state) Task {
Giorgi Lekveishvili77ee2dc2023-12-11 16:51:10 +040076 t := newLeafTask("Create Git repository for environment configuration", func() error {
77 st.fluxUserName = fmt.Sprintf("flux-%s", env.Name)
78 keys, err := installer.NewSSHKeyPair(st.fluxUserName)
79 if err != nil {
80 return err
81 }
82 st.keys = keys
83 if err := st.ssClient.AddRepository("config"); err != nil {
84 return err
85 }
86 repo, err := st.ssClient.GetRepo("config")
87 if err != nil {
88 return err
89 }
90 repoIO := installer.NewRepoIO(repo, st.ssClient.Signer)
91 if err := repoIO.WriteCommitAndPush("README.md", fmt.Sprintf("# %s PCloud environment", env.Name), "readme"); err != nil {
92 return err
93 }
94 if err := st.ssClient.AddUser(st.fluxUserName, keys.AuthorizedKey()); err != nil {
95 return err
96 }
97 if err := st.ssClient.AddReadOnlyCollaborator("config", st.fluxUserName); err != nil {
98 return err
99 }
100 return nil
101 })
102 return &t
Giorgi Lekveishvili46743d42023-12-10 15:47:23 +0400103}