blob: 6ff939bfb582f929b0ab10b14b94ca9153339e29 [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
59func NewClusterInitTask(m cluster.Manager, server cluster.Server, cnc installer.ClusterNetworkConfigurator, repo soft.RepoIO, setupFn cluster.ClusterSetupFunc) Task {
60 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
92func NewRemoveClusterTask(m cluster.Manager, cnc installer.ClusterNetworkConfigurator,
93 repo soft.RepoIO) Task {
94 t := newLeafTask(fmt.Sprintf("Removing %s cluster", m.State().Name), func() error {
95 if err := cnc.RemoveCluster(m.State().Name, m.State().IngressIP); err != nil {
96 return err
97 }
98 _, err := repo.Do(func(fs soft.RepoFS) (string, error) {
99 if err := fs.RemoveAll(fmt.Sprintf("/clusters/%s", m.State().Name)); err != nil {
100 return "", err
101 }
102 kustPath := filepath.Join("/clusters", "kustomization.yaml")
103 kust, err := soft.ReadKustomization(fs, kustPath)
104 if err != nil {
105 return "", err
106 }
107 kust.RemoveResources(m.State().Name)
108 soft.WriteYaml(fs, kustPath, kust)
109 return fmt.Sprintf("remove cluster: %s", m.State().Name), nil
110 })
111 return err
112 })
113 return &t
114}
115
116func NewClusterJoinControllerTask(m cluster.Manager, server cluster.Server, repo soft.RepoIO) Task {
117 d := &dynamicTaskSlice{t: []Task{}}
118 done := make(chan error)
119 setupTask := newLeafTask(fmt.Sprintf("Joining %s to %s cluster", server.IP.String(), m.State().Name), func() error {
120 return m.JoinController(server)
121 })
122 d.Append(&setupTask)
123 setupTask.OnDone(func(err error) {
124 if err != nil {
125 done <- err
126 return
127 }
128 _, err = repo.Do(func(fs soft.RepoFS) (string, error) {
129 if err := soft.WriteJson(fs, fmt.Sprintf("/clusters/%s/config.json", m.State().Name), m.State()); err != nil {
130 return "", err
131 }
132 return fmt.Sprintf("add controller server to cluster: %s", m.State().Name), nil
133 })
134 done <- err
135 })
136 start := func() error {
137 setupTask.Start()
138 return <-done
139 }
140 t := newParentTask("Installing application", true, start, d)
141 return &t
142}
143
144func NewClusterJoinWorkerTask(m cluster.Manager, server cluster.Server, repo soft.RepoIO) Task {
145 d := &dynamicTaskSlice{t: []Task{}}
146 done := make(chan error)
147 setupTask := newLeafTask(fmt.Sprintf("Joining %s to %s cluster", server.IP.String(), m.State().Name), func() error {
148 return m.JoinWorker(server)
149 })
150 d.Append(&setupTask)
151 setupTask.OnDone(func(err error) {
152 if err != nil {
153 done <- err
154 return
155 }
156 _, err = repo.Do(func(fs soft.RepoFS) (string, error) {
157 if err := soft.WriteJson(fs, fmt.Sprintf("/clusters/%s/config.json", m.State().Name), m.State()); err != nil {
158 return "", err
159 }
160 return fmt.Sprintf("add worker server to cluster: %s", m.State().Name), nil
161 })
162 done <- err
163 })
164 start := func() error {
165 setupTask.Start()
166 return <-done
167 }
168 t := newParentTask("Installing application", true, start, d)
169 return &t
170}
171
172func NewClusterRemoveServerTask(m cluster.Manager, server string, repo soft.RepoIO) Task {
173 d := &dynamicTaskSlice{t: []Task{}}
174 done := make(chan error)
175 setupTask := newLeafTask(fmt.Sprintf("Removing %s from %s cluster", server, m.State().Name), func() error {
176 return m.RemoveServer(server)
177 })
178 d.Append(&setupTask)
179 setupTask.OnDone(func(err error) {
180 if err != nil {
181 done <- err
182 return
183 }
184 _, err = repo.Do(func(fs soft.RepoFS) (string, error) {
185 if err := soft.WriteJson(fs, fmt.Sprintf("/clusters/%s/config.json", m.State().Name), m.State()); err != nil {
186 return "", err
187 }
188 return fmt.Sprintf("remove %s from cluster: %s", server, m.State().Name), nil
189 })
190 done <- err
191 })
192 start := func() error {
193 setupTask.Start()
194 return <-done
195 }
196 t := newParentTask("Installing application", true, start, d)
197 return &t
198}