blob: 96caf68fcbeb5707e30756c00f0e3be7e54f78f5 [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),
57 CreateAppCoreAuth(valuesTmpls, tmpls),
58 CreateAppVaultwarden(valuesTmpls, tmpls),
59 CreateAppMatrix(valuesTmpls, tmpls),
60 CreateAppPihole(valuesTmpls, tmpls),
61 CreateAppMaddy(valuesTmpls, tmpls),
62 CreateAppQBittorrent(valuesTmpls, tmpls),
63 CreateAppJellyfin(valuesTmpls, tmpls),
64 CreateAppRpuppy(valuesTmpls, tmpls),
65 CreateAppHeadscale(valuesTmpls, tmpls),
Giorgi Lekveishvili0ccd1482023-06-21 15:02:24 +040066 CreateAppTailscaleProxy(valuesTmpls, tmpls),
67 CreateMetallbConfigEnv(valuesTmpls, tmpls),
68 CreateEnvManager(valuesTmpls, tmpls),
69 CreateIngressPublic(valuesTmpls, tmpls),
70 CreateCertManager(valuesTmpls, tmpls),
71 CreateCertManagerWebhookGandi(valuesTmpls, tmpls),
72 CreateCertManagerWebhookGandiRole(valuesTmpls, tmpls),
73 CreateCSIDriverSMB(valuesTmpls, tmpls),
74 CreateResourceRendererController(valuesTmpls, tmpls),
75 CreateHeadscaleController(valuesTmpls, tmpls),
giolekvaef76a3e2022-01-10 12:22:28 +040076 }
77}
78
Giorgi Lekveishvili4d2784d2023-06-01 14:27:32 +040079// TODO(gio): service account needs permission to create/update secret
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +040080func CreateAppIngressPrivate(fs embed.FS, tmpls *template.Template) App {
81 schema, err := fs.ReadFile("values-tmpl/ingress-private.jsonschema")
82 if err != nil {
83 panic(err)
84 }
giolekva050609f2021-12-29 15:51:40 +040085 return App{
86 "ingress-private",
87 []*template.Template{
Giorgi Lekveishvili23ef7f82023-05-26 11:57:48 +040088 // tmpls.Lookup("vpn-mesh-config.yaml"),
giolekva050609f2021-12-29 15:51:40 +040089 tmpls.Lookup("ingress-private.yaml"),
90 tmpls.Lookup("certificate-issuer.yaml"),
91 },
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +040092 string(schema),
Giorgi Lekveishvili4d2784d2023-06-01 14:27:32 +040093 tmpls.Lookup("ingress-private.md"),
giolekva050609f2021-12-29 15:51:40 +040094 }
95}
96
Giorgi Lekveishvili0ccd1482023-06-21 15:02:24 +040097func CreateCertificateIssuerPrivate(fs embed.FS, tmpls *template.Template) App {
98 schema, err := fs.ReadFile("values-tmpl/certificate-issuer-private.jsonschema")
99 if err != nil {
100 panic(err)
101 }
102 return App{
103 "ingress-private",
104 []*template.Template{
105 tmpls.Lookup("certificate-issuer-private.yaml"),
106 },
107 string(schema),
108 tmpls.Lookup("certificate-issuer-private.md"),
109 }
110}
111
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +0400112func CreateAppCoreAuth(fs embed.FS, tmpls *template.Template) App {
113 schema, err := fs.ReadFile("values-tmpl/core-auth.jsonschema")
114 if err != nil {
115 panic(err)
116 }
giolekva050609f2021-12-29 15:51:40 +0400117 return App{
118 "core-auth",
119 []*template.Template{
120 tmpls.Lookup("core-auth-storage.yaml"),
121 tmpls.Lookup("core-auth.yaml"),
122 },
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +0400123 string(schema),
Giorgi Lekveishvili3ca1f3f2023-05-30 14:33:02 +0400124 tmpls.Lookup("core-auth.md"),
giolekva050609f2021-12-29 15:51:40 +0400125 }
126}
127
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +0400128func CreateAppVaultwarden(fs embed.FS, tmpls *template.Template) App {
129 schema, err := fs.ReadFile("values-tmpl/vaultwarden.jsonschema")
130 if err != nil {
131 panic(err)
132 }
giolekva050609f2021-12-29 15:51:40 +0400133 return App{
134 "vaultwarden",
135 []*template.Template{
136 tmpls.Lookup("vaultwarden.yaml"),
137 },
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +0400138 string(schema),
Giorgi Lekveishvili4d2784d2023-06-01 14:27:32 +0400139 tmpls.Lookup("vaultwarden.md"),
giolekva050609f2021-12-29 15:51:40 +0400140 }
141}
142
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +0400143func CreateAppMatrix(fs embed.FS, tmpls *template.Template) App {
144 schema, err := fs.ReadFile("values-tmpl/matrix.jsonschema")
145 if err != nil {
146 panic(err)
147 }
giolekva050609f2021-12-29 15:51:40 +0400148 return App{
149 "matrix",
150 []*template.Template{
151 tmpls.Lookup("matrix-storage.yaml"),
152 tmpls.Lookup("matrix.yaml"),
153 },
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +0400154 string(schema),
155 nil,
giolekva050609f2021-12-29 15:51:40 +0400156 }
157}
158
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +0400159func CreateAppPihole(fs embed.FS, tmpls *template.Template) App {
160 schema, err := fs.ReadFile("values-tmpl/pihole.jsonschema")
161 if err != nil {
162 panic(err)
163 }
giolekva050609f2021-12-29 15:51:40 +0400164 return App{
165 "pihole",
166 []*template.Template{
167 tmpls.Lookup("pihole.yaml"),
168 },
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +0400169 string(schema),
Giorgi Lekveishvili28ad4512023-06-02 11:44:27 +0400170 tmpls.Lookup("pihole.md"),
giolekva050609f2021-12-29 15:51:40 +0400171 }
172}
173
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +0400174func CreateAppMaddy(fs embed.FS, tmpls *template.Template) App {
175 schema, err := fs.ReadFile("values-tmpl/maddy.jsonschema")
176 if err != nil {
177 panic(err)
178 }
giolekva050609f2021-12-29 15:51:40 +0400179 return App{
180 "maddy",
181 []*template.Template{
182 tmpls.Lookup("maddy.yaml"),
183 },
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +0400184 string(schema),
185 nil,
giolekva050609f2021-12-29 15:51:40 +0400186 }
187}
giolekvaef76a3e2022-01-10 12:22:28 +0400188
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +0400189func CreateAppQBittorrent(fs embed.FS, tmpls *template.Template) App {
190 schema, err := fs.ReadFile("values-tmpl/qbittorrent.jsonschema")
191 if err != nil {
192 panic(err)
193 }
giolekvaef76a3e2022-01-10 12:22:28 +0400194 return App{
195 "qbittorrent",
196 []*template.Template{
197 tmpls.Lookup("qbittorrent.yaml"),
198 },
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +0400199 string(schema),
Giorgi Lekveishvili19960c52023-06-09 12:55:08 +0400200 tmpls.Lookup("qbittorrent.md"),
giolekvaef76a3e2022-01-10 12:22:28 +0400201 }
202}
203
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +0400204func CreateAppJellyfin(fs embed.FS, tmpls *template.Template) App {
205 schema, err := fs.ReadFile("values-tmpl/jellyfin.jsonschema")
206 if err != nil {
207 panic(err)
208 }
giolekvaef76a3e2022-01-10 12:22:28 +0400209 return App{
210 "jellyfin",
211 []*template.Template{
212 tmpls.Lookup("jellyfin.yaml"),
213 },
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +0400214 string(schema),
215 nil,
giolekvaef76a3e2022-01-10 12:22:28 +0400216 }
217}
Giorgi Lekveishvili23ef7f82023-05-26 11:57:48 +0400218
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +0400219func CreateAppRpuppy(fs embed.FS, tmpls *template.Template) App {
220 schema, err := fs.ReadFile("values-tmpl/rpuppy.jsonschema")
221 if err != nil {
222 panic(err)
223 }
Giorgi Lekveishvili23ef7f82023-05-26 11:57:48 +0400224 return App{
225 "rpuppy",
226 []*template.Template{
227 tmpls.Lookup("rpuppy.yaml"),
228 },
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +0400229 string(schema),
230 tmpls.Lookup("rpuppy.md"),
Giorgi Lekveishvili23ef7f82023-05-26 11:57:48 +0400231 }
232}
233
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +0400234func CreateAppHeadscale(fs embed.FS, tmpls *template.Template) App {
235 schema, err := fs.ReadFile("values-tmpl/headscale.jsonschema")
236 if err != nil {
237 panic(err)
238 }
Giorgi Lekveishvili23ef7f82023-05-26 11:57:48 +0400239 return App{
240 "headscale",
241 []*template.Template{
242 tmpls.Lookup("headscale.yaml"),
243 },
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +0400244 string(schema),
Giorgi Lekveishvili3a907052023-05-30 13:33:32 +0400245 tmpls.Lookup("headscale.md"),
Giorgi Lekveishvili23ef7f82023-05-26 11:57:48 +0400246 }
247}
Giorgi Lekveishvili0ccd1482023-06-21 15:02:24 +0400248
249func CreateAppTailscaleProxy(fs embed.FS, tmpls *template.Template) App {
250 schema, err := fs.ReadFile("values-tmpl/tailscale-proxy.jsonschema")
251 if err != nil {
252 panic(err)
253 }
254 return App{
255 "tailscale-proxy",
256 []*template.Template{
257 tmpls.Lookup("tailscale-proxy.yaml"),
258 },
259 string(schema),
260 tmpls.Lookup("tailscale-proxy.md"),
261 }
262}
263
264func CreateMetallbConfigEnv(fs embed.FS, tmpls *template.Template) App {
265 schema, err := fs.ReadFile("values-tmpl/metallb-config-env.jsonschema")
266 if err != nil {
267 panic(err)
268 }
269 return App{
270 "metallb-config-env",
271 []*template.Template{
272 tmpls.Lookup("metallb-config-env.yaml"),
273 },
274 string(schema),
275 tmpls.Lookup("metallb-config-env.md"),
276 }
277}
278
279func CreateEnvManager(fs embed.FS, tmpls *template.Template) App {
280 schema, err := fs.ReadFile("values-tmpl/env-manager.jsonschema")
281 if err != nil {
282 panic(err)
283 }
284 return App{
285 "env-manager",
286 []*template.Template{
287 tmpls.Lookup("env-manager.yaml"),
288 },
289 string(schema),
290 tmpls.Lookup("env-manager.md"),
291 }
292}
293
294func CreateIngressPublic(fs embed.FS, tmpls *template.Template) App {
295 schema, err := fs.ReadFile("values-tmpl/ingress-public.jsonschema")
296 if err != nil {
297 panic(err)
298 }
299 return App{
300 "ingress-public",
301 []*template.Template{
302 tmpls.Lookup("ingress-public.yaml"),
303 },
304 string(schema),
305 tmpls.Lookup("ingress-public.md"),
306 }
307}
308
309func CreateCertManager(fs embed.FS, tmpls *template.Template) App {
310 schema, err := fs.ReadFile("values-tmpl/cert-manager.jsonschema")
311 if err != nil {
312 panic(err)
313 }
314 return App{
315 "cert-manager",
316 []*template.Template{
317 tmpls.Lookup("cert-manager.yaml"),
318 },
319 string(schema),
320 tmpls.Lookup("cert-manager.md"),
321 }
322}
323
324func CreateCertManagerWebhookGandi(fs embed.FS, tmpls *template.Template) App {
325 schema, err := fs.ReadFile("values-tmpl/cert-manager-webhook-gandi.jsonschema")
326 if err != nil {
327 panic(err)
328 }
329 return App{
330 "cert-manager-webhook-gandi",
331 []*template.Template{
332 tmpls.Lookup("cert-manager-webhook-gandi.yaml"),
333 },
334 string(schema),
335 tmpls.Lookup("cert-manager-webhook-gandi.md"),
336 }
337}
338
339func CreateCertManagerWebhookGandiRole(fs embed.FS, tmpls *template.Template) App {
340 schema, err := fs.ReadFile("values-tmpl/cert-manager-webhook-gandi-role.jsonschema")
341 if err != nil {
342 panic(err)
343 }
344 return App{
345 "cert-manager-webhook-gandi-role",
346 []*template.Template{
347 tmpls.Lookup("cert-manager-webhook-gandi-role.yaml"),
348 },
349 string(schema),
350 tmpls.Lookup("cert-manager-webhook-gandi-role.md"),
351 }
352}
353
354func CreateCSIDriverSMB(fs embed.FS, tmpls *template.Template) App {
355 schema, err := fs.ReadFile("values-tmpl/csi-driver-smb.jsonschema")
356 if err != nil {
357 panic(err)
358 }
359 return App{
360 "csi-driver-smb",
361 []*template.Template{
362 tmpls.Lookup("csi-driver-smb.yaml"),
363 },
364 string(schema),
365 tmpls.Lookup("csi-driver-smb.md"),
366 }
367}
368
369func CreateResourceRendererController(fs embed.FS, tmpls *template.Template) App {
370 schema, err := fs.ReadFile("values-tmpl/resource-renderer-controller.jsonschema")
371 if err != nil {
372 panic(err)
373 }
374 return App{
375 "resource-renderer-controller",
376 []*template.Template{
377 tmpls.Lookup("resource-renderer-controller.yaml"),
378 },
379 string(schema),
380 tmpls.Lookup("resource-renderer-controller.md"),
381 }
382}
383
384func CreateHeadscaleController(fs embed.FS, tmpls *template.Template) App {
385 schema, err := fs.ReadFile("values-tmpl/headscale-controller.jsonschema")
386 if err != nil {
387 panic(err)
388 }
389 return App{
390 "headscale-controller",
391 []*template.Template{
392 tmpls.Lookup("headscale-controller.yaml"),
393 },
394 string(schema),
395 tmpls.Lookup("headscale-controller.md"),
396 }
397}