AppManager: cache helm charts and container images to local registry

Caching container images is disabled until we figure out how to run
container registry behind TLS.

Change-Id: I0253f2a862e5adddff18a82b102f67258151c070
diff --git a/core/installer/app_test.go b/core/installer/app_test.go
index a646425..74dfbdc 100644
--- a/core/installer/app_test.go
+++ b/core/installer/app_test.go
@@ -2,8 +2,13 @@
 
 import (
 	_ "embed"
+	"fmt"
 	"net"
 	"testing"
+
+	"github.com/giolekva/pcloud/core/installer/soft"
+
+	"github.com/go-git/go-billy/v5/memfs"
 )
 
 var env = EnvConfig{
@@ -46,7 +51,7 @@
 				"groups":  "a,b",
 			},
 		}
-		rendered, err := a.Render(release, env, values)
+		rendered, err := a.Render(release, env, values, nil)
 		if err != nil {
 			t.Fatal(err)
 		}
@@ -76,7 +81,7 @@
 				"enabled": false,
 			},
 		}
-		rendered, err := a.Render(release, env, values)
+		rendered, err := a.Render(release, env, values, nil)
 		if err != nil {
 			t.Fatal(err)
 		}
@@ -101,7 +106,7 @@
 	values := map[string]any{
 		"authGroups": "foo,bar",
 	}
-	rendered, err := a.Render(release, env, values)
+	rendered, err := a.Render(release, env, values, nil)
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -131,7 +136,7 @@
 		},
 		"sshPort": 22,
 	}
-	rendered, err := a.Render(release, env, values)
+	rendered, err := a.Render(release, env, values, nil)
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -156,7 +161,7 @@
 		"subdomain": "jenkins",
 		"network":   "Private",
 	}
-	rendered, err := a.Render(release, env, values)
+	rendered, err := a.Render(release, env, values, nil)
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -186,7 +191,7 @@
 	values := map[string]any{
 		"sshPrivateKey": "private",
 	}
-	rendered, err := a.Render(release, infra, values)
+	rendered, err := a.Render(release, infra, values, nil)
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -215,7 +220,7 @@
 		},
 		"sshPrivateKey": "private",
 	}
-	rendered, err := a.Render(release, env, values)
+	rendered, err := a.Render(release, env, values, nil)
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -248,18 +253,40 @@
 			"groups":  "a,b",
 		},
 	}
-	rendered, err := app.Render(release, env, values)
+	rendered, err := app.Render(release, env, values, nil)
 	if err != nil {
 		t.Fatal(err)
 	}
 	for _, r := range rendered.Resources {
 		t.Log(string(r))
 	}
+	for _, r := range rendered.HelmCharts.Git {
+		t.Log(fmt.Sprintf("%+v\n", r))
+	}
 	for _, r := range rendered.Data {
 		t.Log(string(r))
 	}
 }
 
+func TestPullGitHelmCharts(t *testing.T) {
+	charts := HelmCharts{
+		Git: map[string]HelmChartGitRepo{
+			"rpuppy": HelmChartGitRepo{
+				Address: "https://code.v1.dodo.cloud/pcloud",
+				Branch:  "main",
+				Path:    "charts/rpuppy",
+			},
+		},
+	}
+	fs := soft.NewBillyRepoFS(memfs.New())
+	hf := NewGitHelmFetcher()
+	pulled, err := pullHelmCharts(hf, charts, fs, "/helm-charts")
+	if err != nil {
+		t.Fatal(err)
+	}
+	fmt.Println(pulled)
+}
+
 func TestDNSGateway(t *testing.T) {
 	contents, err := valuesTmpls.ReadFile("values-tmpl/dns-gateway.cue")
 	if err != nil {
@@ -288,7 +315,7 @@
 	values := map[string]any{
 		"servers": []EnvDNS{EnvDNS{"v1.dodo.cloud", "10.0.1.2"}},
 	}
-	rendered, err := app.Render(release, infra, values)
+	rendered, err := app.Render(release, infra, values, nil)
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -300,7 +327,7 @@
 	}
 }
 
-//go:embed testapp.cue
+//go:embed app_configs/testapp.cue
 var testAppCue []byte
 
 type appInput struct {