blob: b704c688d8be786ae7145d690b0bb63e14f9d92c [file] [log] [blame]
gio1cd65152024-08-16 08:18:49 +04001package tasks
2
3import (
giof6ad2982024-08-23 17:42:49 +04004 "fmt"
5 "path/filepath"
6
gio1cd65152024-08-16 08:18:49 +04007 "github.com/giolekva/pcloud/core/installer"
giof6ad2982024-08-23 17:42:49 +04008 "github.com/giolekva/pcloud/core/installer/cluster"
9 "github.com/giolekva/pcloud/core/installer/soft"
gio1cd65152024-08-16 08:18:49 +040010)
11
12type InstallFunc func() (installer.ReleaseResources, error)
13
14type dynamicTaskSlice struct {
15 t []Task
16}
17
18func (d *dynamicTaskSlice) Tasks() []Task {
19 return d.t
20}
21
22func (d *dynamicTaskSlice) Append(t Task) {
23 d.t = append(d.t, t)
24}
25
26func NewInstallTask(mon installer.HelmReleaseMonitor, fn InstallFunc) Task {
27 d := &dynamicTaskSlice{t: []Task{}}
28 var rr installer.ReleaseResources
29 done := make(chan error)
30 installTask := newLeafTask("Downloading configuration files", func() error {
31 var err error
32 rr, err = fn()
33 return err
34 })
35 d.Append(&installTask)
36 installTask.OnDone(func(err error) {
37 if err != nil {
38 done <- err
39 return
40 }
41 monTasks := NewMonitorReleaseTasks(mon, rr)
42 for _, mt := range monTasks {
43 d.Append(mt)
44 }
45 monitor := newConcurrentParentTask("Monitor", true, monTasks...)
46 monitor.OnDone(func(err error) {
47 done <- err
48 })
49 monitor.Start()
50 })
51 start := func() error {
52 installTask.Start()
53 return <-done
54 }
55 t := newParentTask("Installing application", true, start, d)
56 return &t
57}
giof6ad2982024-08-23 17:42:49 +040058
gio8f290322024-09-21 15:37:45 +040059func NewClusterInitTask(m cluster.Manager, server cluster.Server, cnc installer.ClusterNetworkConfigurator, repo soft.RepoIO, setupFn cluster.ClusterIngressSetupFunc) Task {
giof6ad2982024-08-23 17:42:49 +040060 d := &dynamicTaskSlice{t: []Task{}}
61 done := make(chan error)
62 setupTask := newLeafTask(fmt.Sprintf("Installing dodo on %s", server.IP.String()), func() error {
63 _, err := m.Init(server, setupFn)
64 return err
65 })
66 d.Append(&setupTask)
67 setupTask.OnDone(func(err error) {
68 if err != nil {
69 done <- err
70 return
71 }
72 if err := cnc.AddCluster(m.State().Name, m.State().IngressIP); err != nil {
73 done <- err
74 return
75 }
76 _, err = repo.Do(func(fs soft.RepoFS) (string, error) {
77 if err := soft.WriteJson(fs, fmt.Sprintf("/clusters/%s/config.json", m.State().Name), m.State()); err != nil {
78 return "", err
79 }
80 return fmt.Sprintf("add server to cluster: %s", m.State().Name), nil
81 })
82 done <- err
83 })
84 start := func() error {
85 setupTask.Start()
86 return <-done
87 }
88 t := newParentTask("Installing application", true, start, d)
89 return &t
90}
91
gio8f290322024-09-21 15:37:45 +040092func NewRemoveClusterTask(m cluster.Manager, cnc installer.ClusterNetworkConfigurator, repo soft.RepoIO) Task {
giof6ad2982024-08-23 17:42:49 +040093 t := newLeafTask(fmt.Sprintf("Removing %s cluster", m.State().Name), func() error {
94 if err := cnc.RemoveCluster(m.State().Name, m.State().IngressIP); err != nil {
95 return err
96 }
97 _, err := repo.Do(func(fs soft.RepoFS) (string, error) {
98 if err := fs.RemoveAll(fmt.Sprintf("/clusters/%s", m.State().Name)); err != nil {
99 return "", err
100 }
101 kustPath := filepath.Join("/clusters", "kustomization.yaml")
102 kust, err := soft.ReadKustomization(fs, kustPath)
103 if err != nil {
104 return "", err
105 }
106 kust.RemoveResources(m.State().Name)
107 soft.WriteYaml(fs, kustPath, kust)
108 return fmt.Sprintf("remove cluster: %s", m.State().Name), nil
109 })
110 return err
111 })
112 return &t
113}
114
115func NewClusterJoinControllerTask(m cluster.Manager, server cluster.Server, repo soft.RepoIO) Task {
116 d := &dynamicTaskSlice{t: []Task{}}
117 done := make(chan error)
118 setupTask := newLeafTask(fmt.Sprintf("Joining %s to %s cluster", server.IP.String(), m.State().Name), func() error {
119 return m.JoinController(server)
120 })
121 d.Append(&setupTask)
122 setupTask.OnDone(func(err error) {
123 if err != nil {
124 done <- err
125 return
126 }
127 _, err = repo.Do(func(fs soft.RepoFS) (string, error) {
128 if err := soft.WriteJson(fs, fmt.Sprintf("/clusters/%s/config.json", m.State().Name), m.State()); err != nil {
129 return "", err
130 }
131 return fmt.Sprintf("add controller server to cluster: %s", m.State().Name), nil
132 })
133 done <- err
134 })
135 start := func() error {
136 setupTask.Start()
137 return <-done
138 }
139 t := newParentTask("Installing application", true, start, d)
140 return &t
141}
142
143func NewClusterJoinWorkerTask(m cluster.Manager, server cluster.Server, repo soft.RepoIO) Task {
144 d := &dynamicTaskSlice{t: []Task{}}
145 done := make(chan error)
146 setupTask := newLeafTask(fmt.Sprintf("Joining %s to %s cluster", server.IP.String(), m.State().Name), func() error {
147 return m.JoinWorker(server)
148 })
149 d.Append(&setupTask)
150 setupTask.OnDone(func(err error) {
151 if err != nil {
152 done <- err
153 return
154 }
155 _, err = repo.Do(func(fs soft.RepoFS) (string, error) {
156 if err := soft.WriteJson(fs, fmt.Sprintf("/clusters/%s/config.json", m.State().Name), m.State()); err != nil {
157 return "", err
158 }
159 return fmt.Sprintf("add worker server to cluster: %s", m.State().Name), nil
160 })
161 done <- err
162 })
163 start := func() error {
164 setupTask.Start()
165 return <-done
166 }
167 t := newParentTask("Installing application", true, start, d)
168 return &t
169}
170
171func NewClusterRemoveServerTask(m cluster.Manager, server string, repo soft.RepoIO) Task {
172 d := &dynamicTaskSlice{t: []Task{}}
173 done := make(chan error)
174 setupTask := newLeafTask(fmt.Sprintf("Removing %s from %s cluster", server, m.State().Name), func() error {
175 return m.RemoveServer(server)
176 })
177 d.Append(&setupTask)
178 setupTask.OnDone(func(err error) {
179 if err != nil {
180 done <- err
181 return
182 }
183 _, err = repo.Do(func(fs soft.RepoFS) (string, error) {
184 if err := soft.WriteJson(fs, fmt.Sprintf("/clusters/%s/config.json", m.State().Name), m.State()); err != nil {
185 return "", err
186 }
187 return fmt.Sprintf("remove %s from cluster: %s", server, m.State().Name), nil
188 })
189 done <- err
190 })
191 start := func() error {
192 setupTask.Start()
193 return <-done
194 }
195 t := newParentTask("Installing application", true, start, d)
196 return &t
197}
gio8f290322024-09-21 15:37:45 +0400198
199func NewClusterSetupTask(m cluster.Manager, setupFn cluster.ClusterSetupFunc, repo soft.RepoIO, msg string) Task {
200 d := &dynamicTaskSlice{t: []Task{}}
201 done := make(chan error)
202 setupTask := newLeafTask(msg, func() error {
203 return setupFn(m)
204 })
205 d.Append(&setupTask)
206 setupTask.OnDone(func(err error) {
207 if err != nil {
208 done <- err
209 return
210 }
211 _, err = repo.Do(func(fs soft.RepoFS) (string, error) {
212 if err := soft.WriteJson(fs, fmt.Sprintf("/clusters/%s/config.json", m.State().Name), m.State()); err != nil {
213 return "", err
214 }
215 return msg, nil
216 })
217 done <- err
218 })
219 start := func() error {
220 setupTask.Start()
221 return <-done
222 }
223 t := newParentTask("Installing application", true, start, d)
224 return &t
225}