blob: 8d79c58e6dbb4a2564cc28a6db5ebaec646c86aa [file] [log] [blame]
giolekva8aa73e82022-07-09 11:34:39 +04001package installer
giolekva050609f2021-12-29 15:51:40 +04002
giolekva8aa73e82022-07-09 11:34:39 +04003import (
4 "embed"
Giorgi Lekveishvilibd6be7f2023-05-26 15:51:28 +04005 "fmt"
giolekva8aa73e82022-07-09 11:34:39 +04006 "log"
7 "text/template"
Giorgi Lekveishvili0ccd1482023-06-21 15:02:24 +04008
9 "github.com/Masterminds/sprig/v3"
giolekva8aa73e82022-07-09 11:34:39 +040010)
giolekva050609f2021-12-29 15:51:40 +040011
Giorgi Lekveishvilibd6be7f2023-05-26 15:51:28 +040012//go:embed values-tmpl
13var valuesTmpls embed.FS
14
giolekva050609f2021-12-29 15:51:40 +040015type App struct {
Giorgi Lekveishvili7fb28bf2023-06-24 19:51:16 +040016 Name string
17 Namespaces []string
18 Templates []*template.Template
19 Schema string
20 Readme *template.Template
giolekva050609f2021-12-29 15:51:40 +040021}
22
Giorgi Lekveishvilibd6be7f2023-05-26 15:51:28 +040023type AppRepository interface {
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +040024 GetAll() ([]App, error)
Giorgi Lekveishvilibd6be7f2023-05-26 15:51:28 +040025 Find(name string) (*App, error)
26}
27
28type InMemoryAppRepository struct {
29 apps []App
30}
31
32func NewInMemoryAppRepository(apps []App) AppRepository {
33 return &InMemoryAppRepository{
34 apps,
35 }
36}
37
38func (r InMemoryAppRepository) Find(name string) (*App, error) {
39 for _, a := range r.apps {
40 if a.Name == name {
41 return &a, nil
42 }
43 }
44 return nil, fmt.Errorf("Application not found: %s", name)
45}
giolekva8aa73e82022-07-09 11:34:39 +040046
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +040047func (r InMemoryAppRepository) GetAll() ([]App, error) {
48 return r.apps, nil
49}
50
giolekva8aa73e82022-07-09 11:34:39 +040051func CreateAllApps() []App {
Giorgi Lekveishvili0ccd1482023-06-21 15:02:24 +040052 tmpls, err := template.New("root").Funcs(template.FuncMap(sprig.FuncMap())).ParseFS(valuesTmpls, "values-tmpl/*")
giolekva8aa73e82022-07-09 11:34:39 +040053 if err != nil {
54 log.Fatal(err)
55 }
giolekvaef76a3e2022-01-10 12:22:28 +040056 return []App{
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +040057 CreateAppIngressPrivate(valuesTmpls, tmpls),
Giorgi Lekveishvili12850ee2023-06-22 13:11:17 +040058 CreateCertificateIssuerPublic(valuesTmpls, tmpls),
59 CreateCertificateIssuerPrivate(valuesTmpls, tmpls),
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +040060 CreateAppCoreAuth(valuesTmpls, tmpls),
61 CreateAppVaultwarden(valuesTmpls, tmpls),
62 CreateAppMatrix(valuesTmpls, tmpls),
63 CreateAppPihole(valuesTmpls, tmpls),
64 CreateAppMaddy(valuesTmpls, tmpls),
65 CreateAppQBittorrent(valuesTmpls, tmpls),
66 CreateAppJellyfin(valuesTmpls, tmpls),
67 CreateAppRpuppy(valuesTmpls, tmpls),
68 CreateAppHeadscale(valuesTmpls, tmpls),
Giorgi Lekveishvili0ccd1482023-06-21 15:02:24 +040069 CreateAppTailscaleProxy(valuesTmpls, tmpls),
70 CreateMetallbConfigEnv(valuesTmpls, tmpls),
71 CreateEnvManager(valuesTmpls, tmpls),
Giorgi Lekveishvili12850ee2023-06-22 13:11:17 +040072 CreateWelcome(valuesTmpls, tmpls),
Giorgi Lekveishvili0ccd1482023-06-21 15:02:24 +040073 CreateIngressPublic(valuesTmpls, tmpls),
74 CreateCertManager(valuesTmpls, tmpls),
75 CreateCertManagerWebhookGandi(valuesTmpls, tmpls),
76 CreateCertManagerWebhookGandiRole(valuesTmpls, tmpls),
77 CreateCSIDriverSMB(valuesTmpls, tmpls),
78 CreateResourceRendererController(valuesTmpls, tmpls),
79 CreateHeadscaleController(valuesTmpls, tmpls),
giolekvaef76a3e2022-01-10 12:22:28 +040080 }
81}
82
Giorgi Lekveishvili4d2784d2023-06-01 14:27:32 +040083// TODO(gio): service account needs permission to create/update secret
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +040084func CreateAppIngressPrivate(fs embed.FS, tmpls *template.Template) App {
85 schema, err := fs.ReadFile("values-tmpl/ingress-private.jsonschema")
86 if err != nil {
87 panic(err)
88 }
giolekva050609f2021-12-29 15:51:40 +040089 return App{
90 "ingress-private",
Giorgi Lekveishvili7fb28bf2023-06-24 19:51:16 +040091 []string{"ingress-private"},
giolekva050609f2021-12-29 15:51:40 +040092 []*template.Template{
giolekva050609f2021-12-29 15:51:40 +040093 tmpls.Lookup("ingress-private.yaml"),
giolekva050609f2021-12-29 15:51:40 +040094 },
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +040095 string(schema),
Giorgi Lekveishvili4d2784d2023-06-01 14:27:32 +040096 tmpls.Lookup("ingress-private.md"),
giolekva050609f2021-12-29 15:51:40 +040097 }
98}
99
Giorgi Lekveishvili0ccd1482023-06-21 15:02:24 +0400100func CreateCertificateIssuerPrivate(fs embed.FS, tmpls *template.Template) App {
101 schema, err := fs.ReadFile("values-tmpl/certificate-issuer-private.jsonschema")
102 if err != nil {
103 panic(err)
104 }
105 return App{
Giorgi Lekveishvili12850ee2023-06-22 13:11:17 +0400106 "certificate-issuer-private",
Giorgi Lekveishvili7fb28bf2023-06-24 19:51:16 +0400107 []string{},
Giorgi Lekveishvili0ccd1482023-06-21 15:02:24 +0400108 []*template.Template{
109 tmpls.Lookup("certificate-issuer-private.yaml"),
110 },
111 string(schema),
112 tmpls.Lookup("certificate-issuer-private.md"),
113 }
114}
115
Giorgi Lekveishvili12850ee2023-06-22 13:11:17 +0400116func CreateCertificateIssuerPublic(fs embed.FS, tmpls *template.Template) App {
117 schema, err := fs.ReadFile("values-tmpl/certificate-issuer-public.jsonschema")
118 if err != nil {
119 panic(err)
120 }
121 return App{
122 "certificate-issuer-public",
Giorgi Lekveishvili7fb28bf2023-06-24 19:51:16 +0400123 []string{},
Giorgi Lekveishvili12850ee2023-06-22 13:11:17 +0400124 []*template.Template{
125 tmpls.Lookup("certificate-issuer-public.yaml"),
126 },
127 string(schema),
128 tmpls.Lookup("certificate-issuer-public.md"),
129 }
130}
131
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +0400132func CreateAppCoreAuth(fs embed.FS, tmpls *template.Template) App {
133 schema, err := fs.ReadFile("values-tmpl/core-auth.jsonschema")
134 if err != nil {
135 panic(err)
136 }
giolekva050609f2021-12-29 15:51:40 +0400137 return App{
138 "core-auth",
Giorgi Lekveishvili7fb28bf2023-06-24 19:51:16 +0400139 []string{"core-auth"},
giolekva050609f2021-12-29 15:51:40 +0400140 []*template.Template{
141 tmpls.Lookup("core-auth-storage.yaml"),
142 tmpls.Lookup("core-auth.yaml"),
143 },
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +0400144 string(schema),
Giorgi Lekveishvili3ca1f3f2023-05-30 14:33:02 +0400145 tmpls.Lookup("core-auth.md"),
giolekva050609f2021-12-29 15:51:40 +0400146 }
147}
148
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +0400149func CreateAppVaultwarden(fs embed.FS, tmpls *template.Template) App {
150 schema, err := fs.ReadFile("values-tmpl/vaultwarden.jsonschema")
151 if err != nil {
152 panic(err)
153 }
giolekva050609f2021-12-29 15:51:40 +0400154 return App{
155 "vaultwarden",
Giorgi Lekveishvili7fb28bf2023-06-24 19:51:16 +0400156 []string{"app-vaultwarden"},
giolekva050609f2021-12-29 15:51:40 +0400157 []*template.Template{
158 tmpls.Lookup("vaultwarden.yaml"),
159 },
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +0400160 string(schema),
Giorgi Lekveishvili4d2784d2023-06-01 14:27:32 +0400161 tmpls.Lookup("vaultwarden.md"),
giolekva050609f2021-12-29 15:51:40 +0400162 }
163}
164
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +0400165func CreateAppMatrix(fs embed.FS, tmpls *template.Template) App {
166 schema, err := fs.ReadFile("values-tmpl/matrix.jsonschema")
167 if err != nil {
168 panic(err)
169 }
giolekva050609f2021-12-29 15:51:40 +0400170 return App{
171 "matrix",
Giorgi Lekveishvili7fb28bf2023-06-24 19:51:16 +0400172 []string{"app-matrix"},
giolekva050609f2021-12-29 15:51:40 +0400173 []*template.Template{
174 tmpls.Lookup("matrix-storage.yaml"),
175 tmpls.Lookup("matrix.yaml"),
176 },
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +0400177 string(schema),
178 nil,
giolekva050609f2021-12-29 15:51:40 +0400179 }
180}
181
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +0400182func CreateAppPihole(fs embed.FS, tmpls *template.Template) App {
183 schema, err := fs.ReadFile("values-tmpl/pihole.jsonschema")
184 if err != nil {
185 panic(err)
186 }
giolekva050609f2021-12-29 15:51:40 +0400187 return App{
188 "pihole",
Giorgi Lekveishvili7fb28bf2023-06-24 19:51:16 +0400189 []string{"app-pihole"},
giolekva050609f2021-12-29 15:51:40 +0400190 []*template.Template{
191 tmpls.Lookup("pihole.yaml"),
192 },
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +0400193 string(schema),
Giorgi Lekveishvili28ad4512023-06-02 11:44:27 +0400194 tmpls.Lookup("pihole.md"),
giolekva050609f2021-12-29 15:51:40 +0400195 }
196}
197
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +0400198func CreateAppMaddy(fs embed.FS, tmpls *template.Template) App {
199 schema, err := fs.ReadFile("values-tmpl/maddy.jsonschema")
200 if err != nil {
201 panic(err)
202 }
giolekva050609f2021-12-29 15:51:40 +0400203 return App{
204 "maddy",
Giorgi Lekveishvili7fb28bf2023-06-24 19:51:16 +0400205 []string{"app-maddy"},
giolekva050609f2021-12-29 15:51:40 +0400206 []*template.Template{
207 tmpls.Lookup("maddy.yaml"),
208 },
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +0400209 string(schema),
210 nil,
giolekva050609f2021-12-29 15:51:40 +0400211 }
212}
giolekvaef76a3e2022-01-10 12:22:28 +0400213
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +0400214func CreateAppQBittorrent(fs embed.FS, tmpls *template.Template) App {
215 schema, err := fs.ReadFile("values-tmpl/qbittorrent.jsonschema")
216 if err != nil {
217 panic(err)
218 }
giolekvaef76a3e2022-01-10 12:22:28 +0400219 return App{
220 "qbittorrent",
Giorgi Lekveishvili7fb28bf2023-06-24 19:51:16 +0400221 []string{"app-qbittorrent"},
giolekvaef76a3e2022-01-10 12:22:28 +0400222 []*template.Template{
223 tmpls.Lookup("qbittorrent.yaml"),
224 },
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +0400225 string(schema),
Giorgi Lekveishvili19960c52023-06-09 12:55:08 +0400226 tmpls.Lookup("qbittorrent.md"),
giolekvaef76a3e2022-01-10 12:22:28 +0400227 }
228}
229
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +0400230func CreateAppJellyfin(fs embed.FS, tmpls *template.Template) App {
231 schema, err := fs.ReadFile("values-tmpl/jellyfin.jsonschema")
232 if err != nil {
233 panic(err)
234 }
giolekvaef76a3e2022-01-10 12:22:28 +0400235 return App{
236 "jellyfin",
Giorgi Lekveishvili7fb28bf2023-06-24 19:51:16 +0400237 []string{"app-jellyfin"},
giolekvaef76a3e2022-01-10 12:22:28 +0400238 []*template.Template{
239 tmpls.Lookup("jellyfin.yaml"),
240 },
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +0400241 string(schema),
242 nil,
giolekvaef76a3e2022-01-10 12:22:28 +0400243 }
244}
Giorgi Lekveishvili23ef7f82023-05-26 11:57:48 +0400245
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +0400246func CreateAppRpuppy(fs embed.FS, tmpls *template.Template) App {
247 schema, err := fs.ReadFile("values-tmpl/rpuppy.jsonschema")
248 if err != nil {
249 panic(err)
250 }
Giorgi Lekveishvili23ef7f82023-05-26 11:57:48 +0400251 return App{
252 "rpuppy",
Giorgi Lekveishvili7fb28bf2023-06-24 19:51:16 +0400253 []string{"app-rpuppy"},
Giorgi Lekveishvili23ef7f82023-05-26 11:57:48 +0400254 []*template.Template{
255 tmpls.Lookup("rpuppy.yaml"),
256 },
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +0400257 string(schema),
258 tmpls.Lookup("rpuppy.md"),
Giorgi Lekveishvili23ef7f82023-05-26 11:57:48 +0400259 }
260}
261
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +0400262func CreateAppHeadscale(fs embed.FS, tmpls *template.Template) App {
263 schema, err := fs.ReadFile("values-tmpl/headscale.jsonschema")
264 if err != nil {
265 panic(err)
266 }
Giorgi Lekveishvili23ef7f82023-05-26 11:57:48 +0400267 return App{
268 "headscale",
Giorgi Lekveishvili7fb28bf2023-06-24 19:51:16 +0400269 []string{"app-headscale"},
Giorgi Lekveishvili23ef7f82023-05-26 11:57:48 +0400270 []*template.Template{
271 tmpls.Lookup("headscale.yaml"),
272 },
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +0400273 string(schema),
Giorgi Lekveishvili3a907052023-05-30 13:33:32 +0400274 tmpls.Lookup("headscale.md"),
Giorgi Lekveishvili23ef7f82023-05-26 11:57:48 +0400275 }
276}
Giorgi Lekveishvili0ccd1482023-06-21 15:02:24 +0400277
278func CreateAppTailscaleProxy(fs embed.FS, tmpls *template.Template) App {
279 schema, err := fs.ReadFile("values-tmpl/tailscale-proxy.jsonschema")
280 if err != nil {
281 panic(err)
282 }
283 return App{
284 "tailscale-proxy",
Giorgi Lekveishvili7fb28bf2023-06-24 19:51:16 +0400285 []string{"tailscale-proxy"},
Giorgi Lekveishvili0ccd1482023-06-21 15:02:24 +0400286 []*template.Template{
287 tmpls.Lookup("tailscale-proxy.yaml"),
288 },
289 string(schema),
290 tmpls.Lookup("tailscale-proxy.md"),
291 }
292}
293
294func CreateMetallbConfigEnv(fs embed.FS, tmpls *template.Template) App {
295 schema, err := fs.ReadFile("values-tmpl/metallb-config-env.jsonschema")
296 if err != nil {
297 panic(err)
298 }
299 return App{
300 "metallb-config-env",
Giorgi Lekveishvili7fb28bf2023-06-24 19:51:16 +0400301 []string{"metallb-config"},
Giorgi Lekveishvili0ccd1482023-06-21 15:02:24 +0400302 []*template.Template{
303 tmpls.Lookup("metallb-config-env.yaml"),
304 },
305 string(schema),
306 tmpls.Lookup("metallb-config-env.md"),
307 }
308}
309
310func CreateEnvManager(fs embed.FS, tmpls *template.Template) App {
311 schema, err := fs.ReadFile("values-tmpl/env-manager.jsonschema")
312 if err != nil {
313 panic(err)
314 }
315 return App{
316 "env-manager",
Giorgi Lekveishvili7fb28bf2023-06-24 19:51:16 +0400317 []string{"env-manager"},
Giorgi Lekveishvili0ccd1482023-06-21 15:02:24 +0400318 []*template.Template{
319 tmpls.Lookup("env-manager.yaml"),
320 },
321 string(schema),
322 tmpls.Lookup("env-manager.md"),
323 }
324}
325
Giorgi Lekveishvili12850ee2023-06-22 13:11:17 +0400326func CreateWelcome(fs embed.FS, tmpls *template.Template) App {
327 schema, err := fs.ReadFile("values-tmpl/welcome.jsonschema")
328 if err != nil {
329 panic(err)
330 }
331 return App{
332 "welcome",
Giorgi Lekveishvili7fb28bf2023-06-24 19:51:16 +0400333 []string{"app-welcome"},
Giorgi Lekveishvili12850ee2023-06-22 13:11:17 +0400334 []*template.Template{
335 tmpls.Lookup("welcome.yaml"),
336 },
337 string(schema),
338 tmpls.Lookup("welcome.md"),
339 }
340}
341
Giorgi Lekveishvili0ccd1482023-06-21 15:02:24 +0400342func CreateIngressPublic(fs embed.FS, tmpls *template.Template) App {
343 schema, err := fs.ReadFile("values-tmpl/ingress-public.jsonschema")
344 if err != nil {
345 panic(err)
346 }
347 return App{
348 "ingress-public",
Giorgi Lekveishvili7fb28bf2023-06-24 19:51:16 +0400349 []string{"ingress-public"},
Giorgi Lekveishvili0ccd1482023-06-21 15:02:24 +0400350 []*template.Template{
351 tmpls.Lookup("ingress-public.yaml"),
352 },
353 string(schema),
354 tmpls.Lookup("ingress-public.md"),
355 }
356}
357
358func CreateCertManager(fs embed.FS, tmpls *template.Template) App {
359 schema, err := fs.ReadFile("values-tmpl/cert-manager.jsonschema")
360 if err != nil {
361 panic(err)
362 }
363 return App{
364 "cert-manager",
Giorgi Lekveishvili7fb28bf2023-06-24 19:51:16 +0400365 []string{"cert-manager"},
Giorgi Lekveishvili0ccd1482023-06-21 15:02:24 +0400366 []*template.Template{
367 tmpls.Lookup("cert-manager.yaml"),
368 },
369 string(schema),
370 tmpls.Lookup("cert-manager.md"),
371 }
372}
373
374func CreateCertManagerWebhookGandi(fs embed.FS, tmpls *template.Template) App {
375 schema, err := fs.ReadFile("values-tmpl/cert-manager-webhook-gandi.jsonschema")
376 if err != nil {
377 panic(err)
378 }
379 return App{
380 "cert-manager-webhook-gandi",
Giorgi Lekveishvili7fb28bf2023-06-24 19:51:16 +0400381 []string{},
Giorgi Lekveishvili0ccd1482023-06-21 15:02:24 +0400382 []*template.Template{
383 tmpls.Lookup("cert-manager-webhook-gandi.yaml"),
384 },
385 string(schema),
386 tmpls.Lookup("cert-manager-webhook-gandi.md"),
387 }
388}
389
390func CreateCertManagerWebhookGandiRole(fs embed.FS, tmpls *template.Template) App {
391 schema, err := fs.ReadFile("values-tmpl/cert-manager-webhook-gandi-role.jsonschema")
392 if err != nil {
393 panic(err)
394 }
395 return App{
396 "cert-manager-webhook-gandi-role",
Giorgi Lekveishvili7fb28bf2023-06-24 19:51:16 +0400397 []string{},
Giorgi Lekveishvili0ccd1482023-06-21 15:02:24 +0400398 []*template.Template{
399 tmpls.Lookup("cert-manager-webhook-gandi-role.yaml"),
400 },
401 string(schema),
402 tmpls.Lookup("cert-manager-webhook-gandi-role.md"),
403 }
404}
405
406func CreateCSIDriverSMB(fs embed.FS, tmpls *template.Template) App {
407 schema, err := fs.ReadFile("values-tmpl/csi-driver-smb.jsonschema")
408 if err != nil {
409 panic(err)
410 }
411 return App{
412 "csi-driver-smb",
Giorgi Lekveishvili7fb28bf2023-06-24 19:51:16 +0400413 []string{"csi-driver-smb"},
Giorgi Lekveishvili0ccd1482023-06-21 15:02:24 +0400414 []*template.Template{
415 tmpls.Lookup("csi-driver-smb.yaml"),
416 },
417 string(schema),
418 tmpls.Lookup("csi-driver-smb.md"),
419 }
420}
421
422func CreateResourceRendererController(fs embed.FS, tmpls *template.Template) App {
423 schema, err := fs.ReadFile("values-tmpl/resource-renderer-controller.jsonschema")
424 if err != nil {
425 panic(err)
426 }
427 return App{
428 "resource-renderer-controller",
Giorgi Lekveishvili7fb28bf2023-06-24 19:51:16 +0400429 []string{"rr-controller"},
Giorgi Lekveishvili0ccd1482023-06-21 15:02:24 +0400430 []*template.Template{
431 tmpls.Lookup("resource-renderer-controller.yaml"),
432 },
433 string(schema),
434 tmpls.Lookup("resource-renderer-controller.md"),
435 }
436}
437
438func CreateHeadscaleController(fs embed.FS, tmpls *template.Template) App {
439 schema, err := fs.ReadFile("values-tmpl/headscale-controller.jsonschema")
440 if err != nil {
441 panic(err)
442 }
443 return App{
444 "headscale-controller",
Giorgi Lekveishvili7fb28bf2023-06-24 19:51:16 +0400445 []string{"headscale-controller"},
Giorgi Lekveishvili0ccd1482023-06-21 15:02:24 +0400446 []*template.Template{
447 tmpls.Lookup("headscale-controller.yaml"),
448 },
449 string(schema),
450 tmpls.Lookup("headscale-controller.md"),
451 }
452}