blob: 2b947706b91a2b4a5ed39b06125c732045b16fa2 [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 {
16 Name string
17 Templates []*template.Template
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +040018 Schema string
19 Readme *template.Template
giolekva050609f2021-12-29 15:51:40 +040020}
21
Giorgi Lekveishvilibd6be7f2023-05-26 15:51:28 +040022type AppRepository interface {
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +040023 GetAll() ([]App, error)
Giorgi Lekveishvilibd6be7f2023-05-26 15:51:28 +040024 Find(name string) (*App, error)
25}
26
27type InMemoryAppRepository struct {
28 apps []App
29}
30
31func NewInMemoryAppRepository(apps []App) AppRepository {
32 return &InMemoryAppRepository{
33 apps,
34 }
35}
36
37func (r InMemoryAppRepository) Find(name string) (*App, error) {
38 for _, a := range r.apps {
39 if a.Name == name {
40 return &a, nil
41 }
42 }
43 return nil, fmt.Errorf("Application not found: %s", name)
44}
giolekva8aa73e82022-07-09 11:34:39 +040045
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +040046func (r InMemoryAppRepository) GetAll() ([]App, error) {
47 return r.apps, nil
48}
49
giolekva8aa73e82022-07-09 11:34:39 +040050func CreateAllApps() []App {
Giorgi Lekveishvili0ccd1482023-06-21 15:02:24 +040051 tmpls, err := template.New("root").Funcs(template.FuncMap(sprig.FuncMap())).ParseFS(valuesTmpls, "values-tmpl/*")
giolekva8aa73e82022-07-09 11:34:39 +040052 if err != nil {
53 log.Fatal(err)
54 }
giolekvaef76a3e2022-01-10 12:22:28 +040055 return []App{
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +040056 CreateAppIngressPrivate(valuesTmpls, tmpls),
Giorgi Lekveishvili12850ee2023-06-22 13:11:17 +040057 CreateCertificateIssuerPublic(valuesTmpls, tmpls),
58 CreateCertificateIssuerPrivate(valuesTmpls, tmpls),
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +040059 CreateAppCoreAuth(valuesTmpls, tmpls),
60 CreateAppVaultwarden(valuesTmpls, tmpls),
61 CreateAppMatrix(valuesTmpls, tmpls),
62 CreateAppPihole(valuesTmpls, tmpls),
63 CreateAppMaddy(valuesTmpls, tmpls),
64 CreateAppQBittorrent(valuesTmpls, tmpls),
65 CreateAppJellyfin(valuesTmpls, tmpls),
66 CreateAppRpuppy(valuesTmpls, tmpls),
67 CreateAppHeadscale(valuesTmpls, tmpls),
Giorgi Lekveishvili0ccd1482023-06-21 15:02:24 +040068 CreateAppTailscaleProxy(valuesTmpls, tmpls),
69 CreateMetallbConfigEnv(valuesTmpls, tmpls),
70 CreateEnvManager(valuesTmpls, tmpls),
Giorgi Lekveishvili12850ee2023-06-22 13:11:17 +040071 CreateWelcome(valuesTmpls, tmpls),
Giorgi Lekveishvili0ccd1482023-06-21 15:02:24 +040072 CreateIngressPublic(valuesTmpls, tmpls),
73 CreateCertManager(valuesTmpls, tmpls),
74 CreateCertManagerWebhookGandi(valuesTmpls, tmpls),
75 CreateCertManagerWebhookGandiRole(valuesTmpls, tmpls),
76 CreateCSIDriverSMB(valuesTmpls, tmpls),
77 CreateResourceRendererController(valuesTmpls, tmpls),
78 CreateHeadscaleController(valuesTmpls, tmpls),
giolekvaef76a3e2022-01-10 12:22:28 +040079 }
80}
81
Giorgi Lekveishvili4d2784d2023-06-01 14:27:32 +040082// TODO(gio): service account needs permission to create/update secret
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +040083func CreateAppIngressPrivate(fs embed.FS, tmpls *template.Template) App {
84 schema, err := fs.ReadFile("values-tmpl/ingress-private.jsonschema")
85 if err != nil {
86 panic(err)
87 }
giolekva050609f2021-12-29 15:51:40 +040088 return App{
89 "ingress-private",
90 []*template.Template{
giolekva050609f2021-12-29 15:51:40 +040091 tmpls.Lookup("ingress-private.yaml"),
giolekva050609f2021-12-29 15:51:40 +040092 },
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +040093 string(schema),
Giorgi Lekveishvili4d2784d2023-06-01 14:27:32 +040094 tmpls.Lookup("ingress-private.md"),
giolekva050609f2021-12-29 15:51:40 +040095 }
96}
97
Giorgi Lekveishvili0ccd1482023-06-21 15:02:24 +040098func CreateCertificateIssuerPrivate(fs embed.FS, tmpls *template.Template) App {
99 schema, err := fs.ReadFile("values-tmpl/certificate-issuer-private.jsonschema")
100 if err != nil {
101 panic(err)
102 }
103 return App{
Giorgi Lekveishvili12850ee2023-06-22 13:11:17 +0400104 "certificate-issuer-private",
Giorgi Lekveishvili0ccd1482023-06-21 15:02:24 +0400105 []*template.Template{
106 tmpls.Lookup("certificate-issuer-private.yaml"),
107 },
108 string(schema),
109 tmpls.Lookup("certificate-issuer-private.md"),
110 }
111}
112
Giorgi Lekveishvili12850ee2023-06-22 13:11:17 +0400113func CreateCertificateIssuerPublic(fs embed.FS, tmpls *template.Template) App {
114 schema, err := fs.ReadFile("values-tmpl/certificate-issuer-public.jsonschema")
115 if err != nil {
116 panic(err)
117 }
118 return App{
119 "certificate-issuer-public",
120 []*template.Template{
121 tmpls.Lookup("certificate-issuer-public.yaml"),
122 },
123 string(schema),
124 tmpls.Lookup("certificate-issuer-public.md"),
125 }
126}
127
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +0400128func CreateAppCoreAuth(fs embed.FS, tmpls *template.Template) App {
129 schema, err := fs.ReadFile("values-tmpl/core-auth.jsonschema")
130 if err != nil {
131 panic(err)
132 }
giolekva050609f2021-12-29 15:51:40 +0400133 return App{
134 "core-auth",
135 []*template.Template{
136 tmpls.Lookup("core-auth-storage.yaml"),
137 tmpls.Lookup("core-auth.yaml"),
138 },
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +0400139 string(schema),
Giorgi Lekveishvili3ca1f3f2023-05-30 14:33:02 +0400140 tmpls.Lookup("core-auth.md"),
giolekva050609f2021-12-29 15:51:40 +0400141 }
142}
143
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +0400144func CreateAppVaultwarden(fs embed.FS, tmpls *template.Template) App {
145 schema, err := fs.ReadFile("values-tmpl/vaultwarden.jsonschema")
146 if err != nil {
147 panic(err)
148 }
giolekva050609f2021-12-29 15:51:40 +0400149 return App{
150 "vaultwarden",
151 []*template.Template{
152 tmpls.Lookup("vaultwarden.yaml"),
153 },
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +0400154 string(schema),
Giorgi Lekveishvili4d2784d2023-06-01 14:27:32 +0400155 tmpls.Lookup("vaultwarden.md"),
giolekva050609f2021-12-29 15:51:40 +0400156 }
157}
158
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +0400159func CreateAppMatrix(fs embed.FS, tmpls *template.Template) App {
160 schema, err := fs.ReadFile("values-tmpl/matrix.jsonschema")
161 if err != nil {
162 panic(err)
163 }
giolekva050609f2021-12-29 15:51:40 +0400164 return App{
165 "matrix",
166 []*template.Template{
167 tmpls.Lookup("matrix-storage.yaml"),
168 tmpls.Lookup("matrix.yaml"),
169 },
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +0400170 string(schema),
171 nil,
giolekva050609f2021-12-29 15:51:40 +0400172 }
173}
174
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +0400175func CreateAppPihole(fs embed.FS, tmpls *template.Template) App {
176 schema, err := fs.ReadFile("values-tmpl/pihole.jsonschema")
177 if err != nil {
178 panic(err)
179 }
giolekva050609f2021-12-29 15:51:40 +0400180 return App{
181 "pihole",
182 []*template.Template{
183 tmpls.Lookup("pihole.yaml"),
184 },
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +0400185 string(schema),
Giorgi Lekveishvili28ad4512023-06-02 11:44:27 +0400186 tmpls.Lookup("pihole.md"),
giolekva050609f2021-12-29 15:51:40 +0400187 }
188}
189
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +0400190func CreateAppMaddy(fs embed.FS, tmpls *template.Template) App {
191 schema, err := fs.ReadFile("values-tmpl/maddy.jsonschema")
192 if err != nil {
193 panic(err)
194 }
giolekva050609f2021-12-29 15:51:40 +0400195 return App{
196 "maddy",
197 []*template.Template{
198 tmpls.Lookup("maddy.yaml"),
199 },
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +0400200 string(schema),
201 nil,
giolekva050609f2021-12-29 15:51:40 +0400202 }
203}
giolekvaef76a3e2022-01-10 12:22:28 +0400204
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +0400205func CreateAppQBittorrent(fs embed.FS, tmpls *template.Template) App {
206 schema, err := fs.ReadFile("values-tmpl/qbittorrent.jsonschema")
207 if err != nil {
208 panic(err)
209 }
giolekvaef76a3e2022-01-10 12:22:28 +0400210 return App{
211 "qbittorrent",
212 []*template.Template{
213 tmpls.Lookup("qbittorrent.yaml"),
214 },
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +0400215 string(schema),
Giorgi Lekveishvili19960c52023-06-09 12:55:08 +0400216 tmpls.Lookup("qbittorrent.md"),
giolekvaef76a3e2022-01-10 12:22:28 +0400217 }
218}
219
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +0400220func CreateAppJellyfin(fs embed.FS, tmpls *template.Template) App {
221 schema, err := fs.ReadFile("values-tmpl/jellyfin.jsonschema")
222 if err != nil {
223 panic(err)
224 }
giolekvaef76a3e2022-01-10 12:22:28 +0400225 return App{
226 "jellyfin",
227 []*template.Template{
228 tmpls.Lookup("jellyfin.yaml"),
229 },
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +0400230 string(schema),
231 nil,
giolekvaef76a3e2022-01-10 12:22:28 +0400232 }
233}
Giorgi Lekveishvili23ef7f82023-05-26 11:57:48 +0400234
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +0400235func CreateAppRpuppy(fs embed.FS, tmpls *template.Template) App {
236 schema, err := fs.ReadFile("values-tmpl/rpuppy.jsonschema")
237 if err != nil {
238 panic(err)
239 }
Giorgi Lekveishvili23ef7f82023-05-26 11:57:48 +0400240 return App{
241 "rpuppy",
242 []*template.Template{
243 tmpls.Lookup("rpuppy.yaml"),
244 },
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +0400245 string(schema),
246 tmpls.Lookup("rpuppy.md"),
Giorgi Lekveishvili23ef7f82023-05-26 11:57:48 +0400247 }
248}
249
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +0400250func CreateAppHeadscale(fs embed.FS, tmpls *template.Template) App {
251 schema, err := fs.ReadFile("values-tmpl/headscale.jsonschema")
252 if err != nil {
253 panic(err)
254 }
Giorgi Lekveishvili23ef7f82023-05-26 11:57:48 +0400255 return App{
256 "headscale",
257 []*template.Template{
258 tmpls.Lookup("headscale.yaml"),
259 },
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +0400260 string(schema),
Giorgi Lekveishvili3a907052023-05-30 13:33:32 +0400261 tmpls.Lookup("headscale.md"),
Giorgi Lekveishvili23ef7f82023-05-26 11:57:48 +0400262 }
263}
Giorgi Lekveishvili0ccd1482023-06-21 15:02:24 +0400264
265func CreateAppTailscaleProxy(fs embed.FS, tmpls *template.Template) App {
266 schema, err := fs.ReadFile("values-tmpl/tailscale-proxy.jsonschema")
267 if err != nil {
268 panic(err)
269 }
270 return App{
271 "tailscale-proxy",
272 []*template.Template{
273 tmpls.Lookup("tailscale-proxy.yaml"),
274 },
275 string(schema),
276 tmpls.Lookup("tailscale-proxy.md"),
277 }
278}
279
280func CreateMetallbConfigEnv(fs embed.FS, tmpls *template.Template) App {
281 schema, err := fs.ReadFile("values-tmpl/metallb-config-env.jsonschema")
282 if err != nil {
283 panic(err)
284 }
285 return App{
286 "metallb-config-env",
287 []*template.Template{
288 tmpls.Lookup("metallb-config-env.yaml"),
289 },
290 string(schema),
291 tmpls.Lookup("metallb-config-env.md"),
292 }
293}
294
295func CreateEnvManager(fs embed.FS, tmpls *template.Template) App {
296 schema, err := fs.ReadFile("values-tmpl/env-manager.jsonschema")
297 if err != nil {
298 panic(err)
299 }
300 return App{
301 "env-manager",
302 []*template.Template{
303 tmpls.Lookup("env-manager.yaml"),
304 },
305 string(schema),
306 tmpls.Lookup("env-manager.md"),
307 }
308}
309
Giorgi Lekveishvili12850ee2023-06-22 13:11:17 +0400310func CreateWelcome(fs embed.FS, tmpls *template.Template) App {
311 schema, err := fs.ReadFile("values-tmpl/welcome.jsonschema")
312 if err != nil {
313 panic(err)
314 }
315 return App{
316 "welcome",
317 []*template.Template{
318 tmpls.Lookup("welcome.yaml"),
319 },
320 string(schema),
321 tmpls.Lookup("welcome.md"),
322 }
323}
324
Giorgi Lekveishvili0ccd1482023-06-21 15:02:24 +0400325func CreateIngressPublic(fs embed.FS, tmpls *template.Template) App {
326 schema, err := fs.ReadFile("values-tmpl/ingress-public.jsonschema")
327 if err != nil {
328 panic(err)
329 }
330 return App{
331 "ingress-public",
332 []*template.Template{
333 tmpls.Lookup("ingress-public.yaml"),
334 },
335 string(schema),
336 tmpls.Lookup("ingress-public.md"),
337 }
338}
339
340func CreateCertManager(fs embed.FS, tmpls *template.Template) App {
341 schema, err := fs.ReadFile("values-tmpl/cert-manager.jsonschema")
342 if err != nil {
343 panic(err)
344 }
345 return App{
346 "cert-manager",
347 []*template.Template{
348 tmpls.Lookup("cert-manager.yaml"),
349 },
350 string(schema),
351 tmpls.Lookup("cert-manager.md"),
352 }
353}
354
355func CreateCertManagerWebhookGandi(fs embed.FS, tmpls *template.Template) App {
356 schema, err := fs.ReadFile("values-tmpl/cert-manager-webhook-gandi.jsonschema")
357 if err != nil {
358 panic(err)
359 }
360 return App{
361 "cert-manager-webhook-gandi",
362 []*template.Template{
363 tmpls.Lookup("cert-manager-webhook-gandi.yaml"),
364 },
365 string(schema),
366 tmpls.Lookup("cert-manager-webhook-gandi.md"),
367 }
368}
369
370func CreateCertManagerWebhookGandiRole(fs embed.FS, tmpls *template.Template) App {
371 schema, err := fs.ReadFile("values-tmpl/cert-manager-webhook-gandi-role.jsonschema")
372 if err != nil {
373 panic(err)
374 }
375 return App{
376 "cert-manager-webhook-gandi-role",
377 []*template.Template{
378 tmpls.Lookup("cert-manager-webhook-gandi-role.yaml"),
379 },
380 string(schema),
381 tmpls.Lookup("cert-manager-webhook-gandi-role.md"),
382 }
383}
384
385func CreateCSIDriverSMB(fs embed.FS, tmpls *template.Template) App {
386 schema, err := fs.ReadFile("values-tmpl/csi-driver-smb.jsonschema")
387 if err != nil {
388 panic(err)
389 }
390 return App{
391 "csi-driver-smb",
392 []*template.Template{
393 tmpls.Lookup("csi-driver-smb.yaml"),
394 },
395 string(schema),
396 tmpls.Lookup("csi-driver-smb.md"),
397 }
398}
399
400func CreateResourceRendererController(fs embed.FS, tmpls *template.Template) App {
401 schema, err := fs.ReadFile("values-tmpl/resource-renderer-controller.jsonschema")
402 if err != nil {
403 panic(err)
404 }
405 return App{
406 "resource-renderer-controller",
407 []*template.Template{
408 tmpls.Lookup("resource-renderer-controller.yaml"),
409 },
410 string(schema),
411 tmpls.Lookup("resource-renderer-controller.md"),
412 }
413}
414
415func CreateHeadscaleController(fs embed.FS, tmpls *template.Template) App {
416 schema, err := fs.ReadFile("values-tmpl/headscale-controller.jsonschema")
417 if err != nil {
418 panic(err)
419 }
420 return App{
421 "headscale-controller",
422 []*template.Template{
423 tmpls.Lookup("headscale-controller.yaml"),
424 },
425 string(schema),
426 tmpls.Lookup("headscale-controller.md"),
427 }
428}