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/cmd/app_manager.go b/core/installer/cmd/app_manager.go
index 8cffeba..33f122d 100644
--- a/core/installer/cmd/app_manager.go
+++ b/core/installer/cmd/app_manager.go
@@ -76,11 +76,16 @@
 	if err != nil {
 		return err
 	}
-	kube, err := newNSCreator()
+	nsc, err := newNSCreator()
 	if err != nil {
 		return err
 	}
-	m, err := installer.NewAppManager(repoIO, kube, "/apps")
+	jc, err := newJobCreator()
+	if err != nil {
+		return err
+	}
+	hf := installer.NewGitHelmFetcher()
+	m, err := installer.NewAppManager(repoIO, nsc, jc, hf, "/apps")
 	if err != nil {
 		return err
 	}
diff --git a/core/installer/cmd/dodo_app.go b/core/installer/cmd/dodo_app.go
index d9f9a69..c45cd35 100644
--- a/core/installer/cmd/dodo_app.go
+++ b/core/installer/cmd/dodo_app.go
@@ -85,6 +85,10 @@
 	if err != nil {
 		return err
 	}
+	jc, err := newJobCreator()
+	if err != nil {
+		return err
+	}
 	if err := softClient.AddRepository("app"); err == nil {
 		repo, err := softClient.GetRepo("app")
 		if err != nil {
@@ -93,7 +97,7 @@
 		if err := initRepo(repo); err != nil {
 			return err
 		}
-		if err := welcome.UpdateDodoApp(softClient, dodoAppFlags.namespace, string(sshKey), &env); err != nil {
+		if err := welcome.UpdateDodoApp(softClient, dodoAppFlags.namespace, string(sshKey), jc, &env); err != nil {
 			return err
 		}
 		if err := softClient.AddWebhook("app", fmt.Sprintf("http://%s/update", dodoAppFlags.self), "--active=true", "--events=push", "--content-type=json"); err != nil {
@@ -102,7 +106,7 @@
 	} else if !errors.Is(err, soft.ErrorAlreadyExists) {
 		return err
 	}
-	s := welcome.NewDodoAppServer(dodoAppFlags.port, string(sshKey), softClient, dodoAppFlags.namespace, env)
+	s := welcome.NewDodoAppServer(dodoAppFlags.port, string(sshKey), softClient, dodoAppFlags.namespace, jc, env)
 	return s.Start()
 }
 
diff --git a/core/installer/cmd/env_manager.go b/core/installer/cmd/env_manager.go
index aa33de8..c0ea8e8 100644
--- a/core/installer/cmd/env_manager.go
+++ b/core/installer/cmd/env_manager.go
@@ -72,6 +72,11 @@
 	if err != nil {
 		return err
 	}
+	jc, err := newJobCreator()
+	if err != nil {
+		return err
+	}
+	hf := installer.NewGitHelmFetcher()
 	dnsFetcher, err := newZoneFetcher()
 	if err != nil {
 		return err
@@ -83,6 +88,8 @@
 		repoIO,
 		repoClient,
 		nsCreator,
+		jc,
+		hf,
 		dnsFetcher,
 		installer.NewFixedLengthRandomNameGenerator(4),
 		httpClient,
diff --git a/core/installer/cmd/kube.go b/core/installer/cmd/kube.go
index 4c6ab59..f31ad8f 100644
--- a/core/installer/cmd/kube.go
+++ b/core/installer/cmd/kube.go
@@ -15,3 +15,11 @@
 func newHelmReleaseMonitor() (installer.HelmReleaseMonitor, error) {
 	return installer.NewHelmReleaseMonitor(rootFlags.kubeConfig)
 }
+
+func newJobCreator() (installer.JobCreator, error) {
+	clientset, err := installer.NewKubeConfig(rootFlags.kubeConfig)
+	if err != nil {
+		return nil, err
+	}
+	return installer.NewJobCreator(clientset.BatchV1()), nil
+}
diff --git a/core/installer/cmd/launcher.go b/core/installer/cmd/launcher.go
index 6a8ced5..0af1d1e 100644
--- a/core/installer/cmd/launcher.go
+++ b/core/installer/cmd/launcher.go
@@ -74,7 +74,7 @@
 	if err != nil {
 		return err
 	}
-	appManager, err := installer.NewAppManager(repoIO, nil, "/apps")
+	appManager, err := installer.NewAppManager(repoIO, nil, nil, nil, "/apps")
 	if err != nil {
 		return err
 	}
diff --git a/core/installer/cmd/rewrite.go b/core/installer/cmd/rewrite.go
index c4bc7a8..3ebb390 100644
--- a/core/installer/cmd/rewrite.go
+++ b/core/installer/cmd/rewrite.go
@@ -61,7 +61,8 @@
 	}
 	log.Println("Creating repository")
 	r := installer.NewInMemoryAppRepository(installer.CreateAllApps())
-	mgr, err := installer.NewAppManager(repoIO, nil, "/apps")
+	hf := installer.NewGitHelmFetcher()
+	mgr, err := installer.NewAppManager(repoIO, nil, nil, hf, "/apps")
 	if err != nil {
 		return err
 	}
@@ -84,7 +85,14 @@
 			return err
 		}
 		v := inst.InputToValues(app.Schema())
-		if _, err := mgr.Update(app, inst.Id, v, soft.WithNoCommit()); err != nil {
+		if _, err := mgr.Install(
+			app,
+			inst.Id,
+			inst.Release.AppDir,
+			inst.Release.Namespace,
+			v,
+			installer.WithNoPublish(),
+		); err != nil {
 			return err
 		}
 	}
diff --git a/core/installer/cmd/welcome.go b/core/installer/cmd/welcome.go
index 64820e6..db1ce4a 100644
--- a/core/installer/cmd/welcome.go
+++ b/core/installer/cmd/welcome.go
@@ -3,6 +3,7 @@
 import (
 	"os"
 
+	"github.com/giolekva/pcloud/core/installer"
 	"github.com/giolekva/pcloud/core/installer/soft"
 	"github.com/giolekva/pcloud/core/installer/welcome"
 	"github.com/spf13/cobra"
@@ -91,6 +92,7 @@
 		welcomeFlags.port,
 		repoIO,
 		nsCreator,
+		installer.NewGitHelmFetcher(),
 		welcomeFlags.createAccountAddr,
 		welcomeFlags.loginAddr,
 		welcomeFlags.membershipsInitAddr,