blob: 74dfbdc70908052773396373594a4a78410dbede [file] [log] [blame]
Giorgi Lekveishvili7c427602024-01-04 00:13:55 +04001package installer
2
3import (
gio0eaf2712024-04-14 13:08:46 +04004 _ "embed"
giof8843412024-05-22 16:38:05 +04005 "fmt"
gio3cdee592024-04-17 10:15:56 +04006 "net"
Giorgi Lekveishvili7c427602024-01-04 00:13:55 +04007 "testing"
giof8843412024-05-22 16:38:05 +04008
9 "github.com/giolekva/pcloud/core/installer/soft"
10
11 "github.com/go-git/go-billy/v5/memfs"
Giorgi Lekveishvili7c427602024-01-04 00:13:55 +040012)
13
gioe72b54f2024-04-22 10:44:41 +040014var env = EnvConfig{
15 InfraName: "dodo",
16 Id: "id",
17 ContactEmail: "foo@bar.ge",
18 Domain: "bar.ge",
19 PrivateDomain: "p.bar.ge",
20 PublicIP: []net.IP{net.ParseIP("1.2.3.4")},
21 NameserverIP: []net.IP{net.ParseIP("1.2.3.4")},
22 NamespacePrefix: "id-",
23 Network: EnvNetwork{
24 DNS: net.ParseIP("1.1.1.1"),
25 DNSInClusterIP: net.ParseIP("2.2.2.2"),
26 Ingress: net.ParseIP("3.3.3.3"),
27 Headscale: net.ParseIP("4.4.4.4"),
28 ServicesFrom: net.ParseIP("5.5.5.5"),
29 ServicesTo: net.ParseIP("6.6.6.6"),
30 },
31}
32
Giorgi Lekveishvili67383962024-03-22 19:27:34 +040033func TestAuthProxyEnabled(t *testing.T) {
Giorgi Lekveishvili186eae52024-02-15 14:21:41 +040034 r := NewInMemoryAppRepository(CreateAllApps())
gio44f621b2024-04-29 09:44:38 +040035 for _, app := range []string{"rpuppy", "pi-hole", "url-shortener"} {
gio3cdee592024-04-17 10:15:56 +040036 a, err := FindEnvApp(r, app)
Giorgi Lekveishvili67383962024-03-22 19:27:34 +040037 if err != nil {
38 t.Fatal(err)
39 }
40 if a == nil {
41 t.Fatal("returned app is nil")
42 }
gio3cdee592024-04-17 10:15:56 +040043 release := Release{
44 Namespace: "foo",
45 }
gio3cdee592024-04-17 10:15:56 +040046 values := map[string]any{
47 "network": "Public",
48 "subdomain": "woof",
49 "auth": map[string]any{
50 "enabled": true,
51 "groups": "a,b",
Giorgi Lekveishvili67383962024-03-22 19:27:34 +040052 },
53 }
giof8843412024-05-22 16:38:05 +040054 rendered, err := a.Render(release, env, values, nil)
Giorgi Lekveishvili67383962024-03-22 19:27:34 +040055 if err != nil {
56 t.Fatal(err)
57 }
58 for _, r := range rendered.Resources {
59 t.Log(string(r))
60 }
61 }
62}
63
64func TestAuthProxyDisabled(t *testing.T) {
65 r := NewInMemoryAppRepository(CreateAllApps())
gio44f621b2024-04-29 09:44:38 +040066 for _, app := range []string{"rpuppy", "pi-hole", "url-shortener"} {
gio3cdee592024-04-17 10:15:56 +040067 a, err := FindEnvApp(r, app)
Giorgi Lekveishvili67383962024-03-22 19:27:34 +040068 if err != nil {
69 t.Fatal(err)
70 }
71 if a == nil {
72 t.Fatal("returned app is nil")
73 }
gio3cdee592024-04-17 10:15:56 +040074 release := Release{
75 Namespace: "foo",
76 }
gio3cdee592024-04-17 10:15:56 +040077 values := map[string]any{
78 "network": "Public",
79 "subdomain": "woof",
80 "auth": map[string]any{
81 "enabled": false,
Giorgi Lekveishvili67383962024-03-22 19:27:34 +040082 },
83 }
giof8843412024-05-22 16:38:05 +040084 rendered, err := a.Render(release, env, values, nil)
Giorgi Lekveishvili67383962024-03-22 19:27:34 +040085 if err != nil {
86 t.Fatal(err)
87 }
88 for _, r := range rendered.Resources {
89 t.Log(string(r))
90 }
91 }
92}
93
94func TestGroupMemberships(t *testing.T) {
95 r := NewInMemoryAppRepository(CreateAllApps())
gio3cdee592024-04-17 10:15:56 +040096 a, err := FindEnvApp(r, "memberships")
Giorgi Lekveishvili7c427602024-01-04 00:13:55 +040097 if err != nil {
Giorgi Lekveishvili186eae52024-02-15 14:21:41 +040098 t.Fatal(err)
Giorgi Lekveishvili7c427602024-01-04 00:13:55 +040099 }
Giorgi Lekveishvili186eae52024-02-15 14:21:41 +0400100 if a == nil {
101 t.Fatal("returned app is nil")
Giorgi Lekveishvili7c427602024-01-04 00:13:55 +0400102 }
gio3cdee592024-04-17 10:15:56 +0400103 release := Release{
104 Namespace: "foo",
Giorgi Lekveishvili67383962024-03-22 19:27:34 +0400105 }
gio308105e2024-04-19 13:12:13 +0400106 values := map[string]any{
107 "authGroups": "foo,bar",
108 }
giof8843412024-05-22 16:38:05 +0400109 rendered, err := a.Render(release, env, values, nil)
Giorgi Lekveishvili67383962024-03-22 19:27:34 +0400110 if err != nil {
111 t.Fatal(err)
112 }
113 for _, r := range rendered.Resources {
114 t.Log(string(r))
115 }
Giorgi Lekveishvili7c427602024-01-04 00:13:55 +0400116}
Giorgi Lekveishviliee15ee22024-03-28 12:35:10 +0400117
118func TestGerrit(t *testing.T) {
119 r := NewInMemoryAppRepository(CreateAllApps())
gio3cdee592024-04-17 10:15:56 +0400120 a, err := FindEnvApp(r, "gerrit")
Giorgi Lekveishviliee15ee22024-03-28 12:35:10 +0400121 if err != nil {
122 t.Fatal(err)
123 }
124 if a == nil {
125 t.Fatal("returned app is nil")
126 }
gio3cdee592024-04-17 10:15:56 +0400127 release := Release{
128 Namespace: "foo",
Giorgi Lekveishvili35982662024-04-05 13:05:40 +0400129 }
gio3cdee592024-04-17 10:15:56 +0400130 values := map[string]any{
131 "subdomain": "gerrit",
132 "network": "Private",
133 "key": map[string]any{
134 "public": "foo",
135 "private": "bar",
136 },
137 "sshPort": 22,
138 }
giof8843412024-05-22 16:38:05 +0400139 rendered, err := a.Render(release, env, values, nil)
Giorgi Lekveishvili35982662024-04-05 13:05:40 +0400140 if err != nil {
141 t.Fatal(err)
142 }
143 for _, r := range rendered.Resources {
144 t.Log(string(r))
145 }
146}
147
148func TestJenkins(t *testing.T) {
149 r := NewInMemoryAppRepository(CreateAllApps())
gio3cdee592024-04-17 10:15:56 +0400150 a, err := FindEnvApp(r, "jenkins")
Giorgi Lekveishvili35982662024-04-05 13:05:40 +0400151 if err != nil {
152 t.Fatal(err)
153 }
154 if a == nil {
155 t.Fatal("returned app is nil")
156 }
gio3cdee592024-04-17 10:15:56 +0400157 release := Release{
158 Namespace: "foo",
Giorgi Lekveishviliee15ee22024-03-28 12:35:10 +0400159 }
gio3cdee592024-04-17 10:15:56 +0400160 values := map[string]any{
161 "subdomain": "jenkins",
162 "network": "Private",
163 }
giof8843412024-05-22 16:38:05 +0400164 rendered, err := a.Render(release, env, values, nil)
Giorgi Lekveishviliee15ee22024-03-28 12:35:10 +0400165 if err != nil {
166 t.Fatal(err)
167 }
168 for _, r := range rendered.Resources {
169 t.Log(string(r))
170 }
171}
giodb274d12024-04-19 11:53:18 +0400172
173func TestIngressPublic(t *testing.T) {
174 r := NewInMemoryAppRepository(CreateAllApps())
175 a, err := FindInfraApp(r, "ingress-public")
176 if err != nil {
177 t.Fatal(err)
178 }
179 if a == nil {
180 t.Fatal("returned app is nil")
181 }
182 release := Release{
183 Namespace: "foo",
184 }
gioe72b54f2024-04-22 10:44:41 +0400185 infra := InfraConfig{
giodb274d12024-04-19 11:53:18 +0400186 Name: "dodo",
187 PublicIP: []net.IP{net.ParseIP("1.2.3.4")},
188 InfraNamespacePrefix: "id-",
189 InfraAdminPublicKey: []byte("foo"),
190 }
191 values := map[string]any{
192 "sshPrivateKey": "private",
193 }
giof8843412024-05-22 16:38:05 +0400194 rendered, err := a.Render(release, infra, values, nil)
giodb274d12024-04-19 11:53:18 +0400195 if err != nil {
196 t.Fatal(err)
197 }
198 for _, r := range rendered.Resources {
199 t.Log(string(r))
200 }
201}
202
203func TestPrivateNetwork(t *testing.T) {
204 r := NewInMemoryAppRepository(CreateAllApps())
205 a, err := FindEnvApp(r, "private-network")
206 if err != nil {
207 t.Fatal(err)
208 }
209 if a == nil {
210 t.Fatal("returned app is nil")
211 }
212 release := Release{
213 Namespace: "foo",
214 }
giodb274d12024-04-19 11:53:18 +0400215 values := map[string]any{
216 "privateNetwork": map[string]any{
217 "hostname": "foo",
218 "username": "bar",
219 "ipSubnet": "123123",
220 },
221 "sshPrivateKey": "private",
222 }
giof8843412024-05-22 16:38:05 +0400223 rendered, err := a.Render(release, env, values, nil)
giodb274d12024-04-19 11:53:18 +0400224 if err != nil {
225 t.Fatal(err)
226 }
227 for _, r := range rendered.Resources {
228 t.Log(string(r))
229 }
230}
gio308105e2024-04-19 13:12:13 +0400231
232func TestAppPackages(t *testing.T) {
233 contents, err := valuesTmpls.ReadFile("values-tmpl/rpuppy.cue")
234 if err != nil {
235 t.Fatal(err)
236 }
237 app, err := NewCueEnvApp(CueAppData{
gioe72b54f2024-04-22 10:44:41 +0400238 "base.cue": []byte(cueBaseConfig),
239 "app.cue": []byte(contents),
240 "global.cue": []byte(cueEnvAppGlobal),
gio308105e2024-04-19 13:12:13 +0400241 })
242 if err != nil {
243 t.Fatal(err)
244 }
245 release := Release{
246 Namespace: "foo",
247 }
gio308105e2024-04-19 13:12:13 +0400248 values := map[string]any{
249 "network": "Public",
250 "subdomain": "woof",
251 "auth": map[string]any{
252 "enabled": true,
253 "groups": "a,b",
254 },
255 }
giof8843412024-05-22 16:38:05 +0400256 rendered, err := app.Render(release, env, values, nil)
gio308105e2024-04-19 13:12:13 +0400257 if err != nil {
258 t.Fatal(err)
259 }
260 for _, r := range rendered.Resources {
261 t.Log(string(r))
262 }
giof8843412024-05-22 16:38:05 +0400263 for _, r := range rendered.HelmCharts.Git {
264 t.Log(fmt.Sprintf("%+v\n", r))
265 }
gio308105e2024-04-19 13:12:13 +0400266 for _, r := range rendered.Data {
267 t.Log(string(r))
268 }
269}
gioe72b54f2024-04-22 10:44:41 +0400270
giof8843412024-05-22 16:38:05 +0400271func TestPullGitHelmCharts(t *testing.T) {
272 charts := HelmCharts{
273 Git: map[string]HelmChartGitRepo{
274 "rpuppy": HelmChartGitRepo{
275 Address: "https://code.v1.dodo.cloud/pcloud",
276 Branch: "main",
277 Path: "charts/rpuppy",
278 },
279 },
280 }
281 fs := soft.NewBillyRepoFS(memfs.New())
282 hf := NewGitHelmFetcher()
283 pulled, err := pullHelmCharts(hf, charts, fs, "/helm-charts")
284 if err != nil {
285 t.Fatal(err)
286 }
287 fmt.Println(pulled)
288}
289
gioe72b54f2024-04-22 10:44:41 +0400290func TestDNSGateway(t *testing.T) {
291 contents, err := valuesTmpls.ReadFile("values-tmpl/dns-gateway.cue")
292 if err != nil {
293 t.Fatal(err)
294 }
295 app, err := NewCueInfraApp(CueAppData{
296 "base.cue": []byte(cueBaseConfig),
297 "app.cue": []byte(contents),
298 "global.cue": []byte(cueInfraAppGlobal),
299 })
300 if err != nil {
301 t.Fatal(err)
302 }
303 release := Release{
304 Namespace: "foo",
305 AppInstanceId: "dns-gateway",
306 RepoAddr: "ssh://192.168.100.210:22/config",
307 AppDir: "/infrastructure/gns-gateway",
308 }
309 infra := InfraConfig{
310 Name: "dodo",
311 PublicIP: []net.IP{net.ParseIP("135.181.48.180"), net.ParseIP("65.108.39.172")},
312 InfraNamespacePrefix: "dodo-",
313 InfraAdminPublicKey: []byte("ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC/ZRj0QJ0j+3udh0ANN9mJyEzrATZIOAHfNikDMpSHqrVbPZqpeHGbdYrSksCvXPXfissIZoYU4CCXX007jY0W6e1mPf1nObYh2eUT1dHo/8UtGaf9nYk+kEGU/k3utN4Uzkxa13IFh9pYERX+o0Ad3X5wh0vi5hjOBAJVKOCD9d3aipeR9piUb+qrkFDXf9fozMFn7D9nALkpJBVuGxwl/76f8K6hRxBEmPqZwIMfklzX15nRdLEcsGFJpYLYXsonbr1P3moMJFBBbQFv6M6JO9rrwA+swXpWMoScI7m/nziSEPLAb+ziv+/OyhqzeC9CQner73V0m8+2DmtcgTuSe1qHRtOScPyIjBfxoXaUx1IUkgq1NXt8k+EBO2mxnVpKdyDCvwT1Tb7088P8f8cSLtUOmUdEiAhB8bfQFprzm2KrlufenfhMvdvQPU4VfWlkQ4smLYt2yVaaXoxZMy5yD3X6LFurNXwee/Gn6di+DWqsASAOsmpsNgSCGhT8wxM= lekva@gl-mbp-m1-max.local"),
314 }
315 values := map[string]any{
316 "servers": []EnvDNS{EnvDNS{"v1.dodo.cloud", "10.0.1.2"}},
317 }
giof8843412024-05-22 16:38:05 +0400318 rendered, err := app.Render(release, infra, values, nil)
gioe72b54f2024-04-22 10:44:41 +0400319 if err != nil {
320 t.Fatal(err)
321 }
322 for _, r := range rendered.Resources {
323 t.Log(string(r))
324 }
325 for _, r := range rendered.Data {
326 t.Log(string(r))
327 }
328}
gio0eaf2712024-04-14 13:08:46 +0400329
giof8843412024-05-22 16:38:05 +0400330//go:embed app_configs/testapp.cue
gio0eaf2712024-04-14 13:08:46 +0400331var testAppCue []byte
332
333type appInput struct {
334 RepoAddr string `json:"repoAddr"`
335 SSHKey string `json:"sshKey"`
336 Network Network `json:"network"`
337}
338
339func TestPCloudApp(t *testing.T) {
340 _, err := NewDodoApp(testAppCue)
341 if err != nil {
342 t.Fatal(err)
343 }
344}