blob: fbbcd648ec24e8171b73930dbb18cd09fae57e82 [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"
8)
giolekva050609f2021-12-29 15:51:40 +04009
Giorgi Lekveishvilibd6be7f2023-05-26 15:51:28 +040010//go:embed values-tmpl
11var valuesTmpls embed.FS
12
giolekva050609f2021-12-29 15:51:40 +040013type App struct {
14 Name string
15 Templates []*template.Template
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +040016 Schema string
17 Readme *template.Template
giolekva050609f2021-12-29 15:51:40 +040018}
19
Giorgi Lekveishvilibd6be7f2023-05-26 15:51:28 +040020type AppRepository interface {
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +040021 GetAll() ([]App, error)
Giorgi Lekveishvilibd6be7f2023-05-26 15:51:28 +040022 Find(name string) (*App, error)
23}
24
25type InMemoryAppRepository struct {
26 apps []App
27}
28
29func NewInMemoryAppRepository(apps []App) AppRepository {
30 return &InMemoryAppRepository{
31 apps,
32 }
33}
34
35func (r InMemoryAppRepository) Find(name string) (*App, error) {
36 for _, a := range r.apps {
37 if a.Name == name {
38 return &a, nil
39 }
40 }
41 return nil, fmt.Errorf("Application not found: %s", name)
42}
giolekva8aa73e82022-07-09 11:34:39 +040043
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +040044func (r InMemoryAppRepository) GetAll() ([]App, error) {
45 return r.apps, nil
46}
47
giolekva8aa73e82022-07-09 11:34:39 +040048func CreateAllApps() []App {
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +040049 tmpls, err := template.ParseFS(valuesTmpls, "values-tmpl/*")
giolekva8aa73e82022-07-09 11:34:39 +040050 if err != nil {
51 log.Fatal(err)
52 }
giolekvaef76a3e2022-01-10 12:22:28 +040053 return []App{
Giorgi Lekveishvili23ef7f82023-05-26 11:57:48 +040054 // CreateAppIngressPublic(tmpls),
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +040055 CreateAppIngressPrivate(valuesTmpls, tmpls),
56 CreateAppCoreAuth(valuesTmpls, tmpls),
57 CreateAppVaultwarden(valuesTmpls, tmpls),
58 CreateAppMatrix(valuesTmpls, tmpls),
59 CreateAppPihole(valuesTmpls, tmpls),
60 CreateAppMaddy(valuesTmpls, tmpls),
61 CreateAppQBittorrent(valuesTmpls, tmpls),
62 CreateAppJellyfin(valuesTmpls, tmpls),
63 CreateAppRpuppy(valuesTmpls, tmpls),
64 CreateAppHeadscale(valuesTmpls, tmpls),
Giorgi Lekveishvili23ef7f82023-05-26 11:57:48 +040065 }
66}
67
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +040068func CreateAppIngressPublic(fs embed.FS, tmpls *template.Template) App {
69 schema, err := fs.ReadFile("values-tmpl/ingress-public.jsonschema")
70 if err != nil {
71 panic(err)
72 }
Giorgi Lekveishvili23ef7f82023-05-26 11:57:48 +040073 return App{
74 "ingress-public",
75 []*template.Template{
76 tmpls.Lookup("ingress-public.yaml"),
77 },
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +040078 string(schema),
79 nil,
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",
91 []*template.Template{
Giorgi Lekveishvili23ef7f82023-05-26 11:57:48 +040092 // tmpls.Lookup("vpn-mesh-config.yaml"),
giolekva050609f2021-12-29 15:51:40 +040093 tmpls.Lookup("ingress-private.yaml"),
94 tmpls.Lookup("certificate-issuer.yaml"),
95 },
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +040096 string(schema),
Giorgi Lekveishvili4d2784d2023-06-01 14:27:32 +040097 tmpls.Lookup("ingress-private.md"),
giolekva050609f2021-12-29 15:51:40 +040098 }
99}
100
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +0400101func CreateAppCoreAuth(fs embed.FS, tmpls *template.Template) App {
102 schema, err := fs.ReadFile("values-tmpl/core-auth.jsonschema")
103 if err != nil {
104 panic(err)
105 }
giolekva050609f2021-12-29 15:51:40 +0400106 return App{
107 "core-auth",
108 []*template.Template{
109 tmpls.Lookup("core-auth-storage.yaml"),
110 tmpls.Lookup("core-auth.yaml"),
111 },
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +0400112 string(schema),
Giorgi Lekveishvili3ca1f3f2023-05-30 14:33:02 +0400113 tmpls.Lookup("core-auth.md"),
giolekva050609f2021-12-29 15:51:40 +0400114 }
115}
116
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +0400117func CreateAppVaultwarden(fs embed.FS, tmpls *template.Template) App {
118 schema, err := fs.ReadFile("values-tmpl/vaultwarden.jsonschema")
119 if err != nil {
120 panic(err)
121 }
giolekva050609f2021-12-29 15:51:40 +0400122 return App{
123 "vaultwarden",
124 []*template.Template{
125 tmpls.Lookup("vaultwarden.yaml"),
126 },
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +0400127 string(schema),
Giorgi Lekveishvili4d2784d2023-06-01 14:27:32 +0400128 tmpls.Lookup("vaultwarden.md"),
giolekva050609f2021-12-29 15:51:40 +0400129 }
130}
131
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +0400132func CreateAppMatrix(fs embed.FS, tmpls *template.Template) App {
133 schema, err := fs.ReadFile("values-tmpl/matrix.jsonschema")
134 if err != nil {
135 panic(err)
136 }
giolekva050609f2021-12-29 15:51:40 +0400137 return App{
138 "matrix",
139 []*template.Template{
140 tmpls.Lookup("matrix-storage.yaml"),
141 tmpls.Lookup("matrix.yaml"),
142 },
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +0400143 string(schema),
144 nil,
giolekva050609f2021-12-29 15:51:40 +0400145 }
146}
147
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +0400148func CreateAppPihole(fs embed.FS, tmpls *template.Template) App {
149 schema, err := fs.ReadFile("values-tmpl/pihole.jsonschema")
150 if err != nil {
151 panic(err)
152 }
giolekva050609f2021-12-29 15:51:40 +0400153 return App{
154 "pihole",
155 []*template.Template{
156 tmpls.Lookup("pihole.yaml"),
157 },
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +0400158 string(schema),
Giorgi Lekveishvili28ad4512023-06-02 11:44:27 +0400159 tmpls.Lookup("pihole.md"),
giolekva050609f2021-12-29 15:51:40 +0400160 }
161}
162
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +0400163func CreateAppMaddy(fs embed.FS, tmpls *template.Template) App {
164 schema, err := fs.ReadFile("values-tmpl/maddy.jsonschema")
165 if err != nil {
166 panic(err)
167 }
giolekva050609f2021-12-29 15:51:40 +0400168 return App{
169 "maddy",
170 []*template.Template{
171 tmpls.Lookup("maddy.yaml"),
172 },
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +0400173 string(schema),
174 nil,
giolekva050609f2021-12-29 15:51:40 +0400175 }
176}
giolekvaef76a3e2022-01-10 12:22:28 +0400177
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +0400178func CreateAppQBittorrent(fs embed.FS, tmpls *template.Template) App {
179 schema, err := fs.ReadFile("values-tmpl/qbittorrent.jsonschema")
180 if err != nil {
181 panic(err)
182 }
giolekvaef76a3e2022-01-10 12:22:28 +0400183 return App{
184 "qbittorrent",
185 []*template.Template{
186 tmpls.Lookup("qbittorrent.yaml"),
187 },
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +0400188 string(schema),
Giorgi Lekveishvili19960c52023-06-09 12:55:08 +0400189 tmpls.Lookup("qbittorrent.md"),
giolekvaef76a3e2022-01-10 12:22:28 +0400190 }
191}
192
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +0400193func CreateAppJellyfin(fs embed.FS, tmpls *template.Template) App {
194 schema, err := fs.ReadFile("values-tmpl/jellyfin.jsonschema")
195 if err != nil {
196 panic(err)
197 }
giolekvaef76a3e2022-01-10 12:22:28 +0400198 return App{
199 "jellyfin",
200 []*template.Template{
201 tmpls.Lookup("jellyfin.yaml"),
202 },
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +0400203 string(schema),
204 nil,
giolekvaef76a3e2022-01-10 12:22:28 +0400205 }
206}
Giorgi Lekveishvili23ef7f82023-05-26 11:57:48 +0400207
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +0400208func CreateAppRpuppy(fs embed.FS, tmpls *template.Template) App {
209 schema, err := fs.ReadFile("values-tmpl/rpuppy.jsonschema")
210 if err != nil {
211 panic(err)
212 }
Giorgi Lekveishvili23ef7f82023-05-26 11:57:48 +0400213 return App{
214 "rpuppy",
215 []*template.Template{
216 tmpls.Lookup("rpuppy.yaml"),
217 },
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +0400218 string(schema),
219 tmpls.Lookup("rpuppy.md"),
Giorgi Lekveishvili23ef7f82023-05-26 11:57:48 +0400220 }
221}
222
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +0400223func CreateAppHeadscale(fs embed.FS, tmpls *template.Template) App {
224 schema, err := fs.ReadFile("values-tmpl/headscale.jsonschema")
225 if err != nil {
226 panic(err)
227 }
Giorgi Lekveishvili23ef7f82023-05-26 11:57:48 +0400228 return App{
229 "headscale",
230 []*template.Template{
231 tmpls.Lookup("headscale.yaml"),
232 },
Giorgi Lekveishvili7efe22f2023-05-30 13:01:53 +0400233 string(schema),
Giorgi Lekveishvili3a907052023-05-30 13:33:32 +0400234 tmpls.Lookup("headscale.md"),
Giorgi Lekveishvili23ef7f82023-05-26 11:57:48 +0400235 }
236}