blob: f3818e31c3eb80a97428984a5a9e4e93c00c4c14 [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 Lekveishvili378ea882023-12-12 13:59:18 +040012func SetupConfigRepoTask(env Env, st *state) Task {
13 return newSequentialParentTask(
14 "Configuration repository",
15 NewCreateConfigRepoTask(env, st),
16 CreateGitClientTask(env, st),
17 NewInitConfigRepoTask(env, st),
18 )
19}
20
Giorgi Lekveishvili46743d42023-12-10 15:47:23 +040021func NewCreateConfigRepoTask(env Env, st *state) Task {
Giorgi Lekveishvili77ee2dc2023-12-11 16:51:10 +040022 t := newLeafTask("Install Git server", func() error {
23 appsRepo := installer.NewInMemoryAppRepository(installer.CreateAllApps())
24 ssApp, err := appsRepo.Find("soft-serve")
25 if err != nil {
26 return err
27 }
28 ssAdminKeys, err := installer.NewSSHKeyPair(fmt.Sprintf("%s-config-repo-admin-keys", env.Name))
29 if err != nil {
30 return err
31 }
Giorgi Lekveishvili378ea882023-12-12 13:59:18 +040032 st.ssAdminKeys = ssAdminKeys
Giorgi Lekveishvili77ee2dc2023-12-11 16:51:10 +040033 ssKeys, err := installer.NewSSHKeyPair(fmt.Sprintf("%s-config-repo-keys", env.Name))
34 if err != nil {
35 return err
36 }
37 ssValues := map[string]any{
38 "ChartRepositoryNamespace": env.PCloudEnvName,
39 "ServiceType": "ClusterIP",
40 "PrivateKey": string(ssKeys.RawPrivateKey()),
41 "PublicKey": string(ssKeys.RawAuthorizedKey()),
42 "AdminKey": string(ssAdminKeys.RawAuthorizedKey()),
43 "Ingress": map[string]any{
44 "Enabled": false,
45 },
46 }
47 derived := installer.Derived{
48 Global: installer.Values{
49 Id: env.Name,
50 PCloudEnvName: env.PCloudEnvName,
51 },
52 Release: installer.Release{
53 Namespace: env.Name,
54 },
55 Values: ssValues,
56 }
57 if err := st.nsCreator.Create(env.Name); err != nil {
58 return err
59 }
60 if err := st.repo.InstallApp(*ssApp, filepath.Join("/environments", env.Name, "config-repo"), ssValues, derived); err != nil {
61 return err
62 }
Giorgi Lekveishvili378ea882023-12-12 13:59:18 +040063 return nil
64 })
65 return &t
66}
67
68func CreateGitClientTask(env Env, st *state) Task {
69 t := newLeafTask("Wait git server to come up", func() error {
Giorgi Lekveishvili77ee2dc2023-12-11 16:51:10 +040070 ssClient, err := soft.WaitForClient(
71 fmt.Sprintf("soft-serve.%s.svc.cluster.local:%d", env.Name, 22),
Giorgi Lekveishvili378ea882023-12-12 13:59:18 +040072 st.ssAdminKeys.RawPrivateKey(),
Giorgi Lekveishvili77ee2dc2023-12-11 16:51:10 +040073 log.Default())
74 if err != nil {
75 return err
76 }
77 if err := ssClient.AddPublicKey("admin", env.AdminPublicKey); err != nil {
78 return err
79 }
80 // // TODO(gio): defer?
81 // // TODO(gio): remove at the end of final task cleanup
82 // if err := ssClient.RemovePublicKey("admin", string(ssAdminKeys.RawAuthorizedKey())); err != nil {
83 // t.callDoneListeners(err)
84 // return
85 // }
86 st.ssClient = ssClient
87 return nil
88 })
89 return &t
Giorgi Lekveishvili46743d42023-12-10 15:47:23 +040090}
91
92func NewInitConfigRepoTask(env Env, st *state) Task {
Giorgi Lekveishvili77ee2dc2023-12-11 16:51:10 +040093 t := newLeafTask("Create Git repository for environment configuration", func() error {
94 st.fluxUserName = fmt.Sprintf("flux-%s", env.Name)
95 keys, err := installer.NewSSHKeyPair(st.fluxUserName)
96 if err != nil {
97 return err
98 }
99 st.keys = keys
100 if err := st.ssClient.AddRepository("config"); err != nil {
101 return err
102 }
103 repo, err := st.ssClient.GetRepo("config")
104 if err != nil {
105 return err
106 }
107 repoIO := installer.NewRepoIO(repo, st.ssClient.Signer)
108 if err := repoIO.WriteCommitAndPush("README.md", fmt.Sprintf("# %s PCloud environment", env.Name), "readme"); err != nil {
109 return err
110 }
111 if err := st.ssClient.AddUser(st.fluxUserName, keys.AuthorizedKey()); err != nil {
112 return err
113 }
114 if err := st.ssClient.AddReadOnlyCollaborator("config", st.fluxUserName); err != nil {
115 return err
116 }
117 return nil
118 })
119 return &t
Giorgi Lekveishvili46743d42023-12-10 15:47:23 +0400120}