blob: 1e4ada4c439cda41e01c37d9d90aba4a620803cd [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
12type createConfigRepoTask struct {
13 basicTask
14 env Env
15 st *state
16}
17
18func NewCreateConfigRepoTask(env Env, st *state) Task {
19 return &createConfigRepoTask{
20 basicTask: basicTask{
21 title: "Install Git server",
22 },
23 env: env,
24 st: st,
25 }
26}
27
28func (t *createConfigRepoTask) Start() {
29 appsRepo := installer.NewInMemoryAppRepository(installer.CreateAllApps())
30 ssApp, err := appsRepo.Find("soft-serve")
31 if err != nil {
32 t.callDoneListeners(err)
33 return
34 }
35 ssAdminKeys, err := installer.NewSSHKeyPair(fmt.Sprintf("%s-config-repo-admin-keys", t.env.Name))
36 if err != nil {
37 t.callDoneListeners(err)
38 return
39 }
40 ssKeys, err := installer.NewSSHKeyPair(fmt.Sprintf("%s-config-repo-keys", t.env.Name))
41 if err != nil {
42 t.callDoneListeners(err)
43 return
44 }
45 ssValues := map[string]any{
46 "ChartRepositoryNamespace": t.env.PCloudEnvName,
47 "ServiceType": "ClusterIP",
48 "PrivateKey": string(ssKeys.RawPrivateKey()),
49 "PublicKey": string(ssKeys.RawAuthorizedKey()),
50 "AdminKey": string(ssAdminKeys.RawAuthorizedKey()),
51 "Ingress": map[string]any{
52 "Enabled": false,
53 },
54 }
55 derived := installer.Derived{
56 Global: installer.Values{
57 Id: t.env.Name,
58 PCloudEnvName: t.env.PCloudEnvName,
59 },
60 Release: installer.Release{
61 Namespace: t.env.Name,
62 },
63 Values: ssValues,
64 }
65 if err := t.st.nsCreator.Create(t.env.Name); err != nil {
66 t.callDoneListeners(err)
67 return
68 }
69 if err := t.st.repo.InstallApp(*ssApp, filepath.Join("/environments", t.env.Name, "config-repo"), ssValues, derived); err != nil {
70 t.callDoneListeners(err)
71 return
72 }
73 ssClient, err := soft.WaitForClient(
74 fmt.Sprintf("soft-serve.%s.svc.cluster.local:%d", t.env.Name, 22),
75 ssAdminKeys.RawPrivateKey(),
76 log.Default())
77 if err != nil {
78 t.callDoneListeners(err)
79 return
80 }
81 if err := ssClient.AddPublicKey("admin", t.env.AdminPublicKey); err != nil {
82 t.callDoneListeners(err)
83 return
84 }
85 // // TODO(gio): defer?
86 // // TODO(gio): remove at the end of final task cleanup
87 // if err := ssClient.RemovePublicKey("admin", string(ssAdminKeys.RawAuthorizedKey())); err != nil {
88 // t.callDoneListeners(err)
89 // return
90 // }
91 t.st.ssClient = ssClient
92 t.callDoneListeners(nil)
93}
94
95type initConfigRepoTask struct {
96 basicTask
97 env Env
98 st *state
99}
100
101func NewInitConfigRepoTask(env Env, st *state) Task {
102 return &initConfigRepoTask{
103 basicTask: basicTask{
104 title: "Create Git repository for environment configuration",
105 },
106 env: env,
107 st: st,
108 }
109}
110
111func (t *initConfigRepoTask) Start() {
112 t.st.fluxUserName = fmt.Sprintf("flux-%s", t.env.Name)
113 keys, err := installer.NewSSHKeyPair(t.st.fluxUserName)
114 if err != nil {
115 t.callDoneListeners(err)
116 return
117 }
118 t.st.keys = keys
119 if err := t.st.ssClient.AddRepository("config"); err != nil {
120 t.callDoneListeners(err)
121 return
122 }
123 repo, err := t.st.ssClient.GetRepo("config")
124 if err != nil {
125 t.callDoneListeners(err)
126 return
127 }
128 repoIO := installer.NewRepoIO(repo, t.st.ssClient.Signer)
129 if err := repoIO.WriteCommitAndPush("README.md", fmt.Sprintf("# %s PCloud environment", t.env.Name), "readme"); err != nil {
130 t.callDoneListeners(err)
131 return
132 }
133 if err := t.st.ssClient.AddUser(t.st.fluxUserName, keys.AuthorizedKey()); err != nil {
134 t.callDoneListeners(err)
135 return
136 }
137 if err := t.st.ssClient.AddReadOnlyCollaborator("config", t.st.fluxUserName); err != nil {
138 t.callDoneListeners(err)
139 return
140 }
141 t.callDoneListeners(nil)
142}