Reconciler: Reconcile dodo Apps as well

Fix service-account assignment.

Change-Id: Ic66c46ae5b728e09ee9118f61e31ab860623bce0
diff --git a/core/installer/tasks/env.go b/core/installer/tasks/env.go
index 20528a3..bc104cc 100644
--- a/core/installer/tasks/env.go
+++ b/core/installer/tasks/env.go
@@ -72,12 +72,12 @@
 	t.OnDone(func(_ error) {
 		done()
 	})
-	pr := NewFluxcdReconciler( // TODO(gio): make reconciler address a flag
-		"http://fluxcd-reconciler.dodo-fluxcd-reconciler.svc.cluster.local",
+	pr := NewFixedReconciler(
+		fmt.Sprintf("%s-flux", env.InfraName),
 		fmt.Sprintf("%s-flux", env.InfraName),
 	)
-	er := NewFluxcdReconciler(
-		"http://fluxcd-reconciler.dodo-fluxcd-reconciler.svc.cluster.local",
+	er := NewFixedReconciler(
+		env.Id,
 		env.Id,
 	)
 	go pr.Reconcile(rctx)
diff --git a/core/installer/tasks/reconciler.go b/core/installer/tasks/reconciler.go
index 0e8133e..9f8a004 100644
--- a/core/installer/tasks/reconciler.go
+++ b/core/installer/tasks/reconciler.go
@@ -4,35 +4,62 @@
 	"context"
 	"fmt"
 	"net/http"
-	"time"
 )
 
+// TODO(gio): make reconciler address a flag
+const baseURL = "http://fluxcd-reconciler.dodo-fluxcd-reconciler.svc.cluster.local"
+
 type Reconciler interface {
-	Reconcile(ctx context.Context)
+	Reconcile(ctx context.Context, namespace, name string)
 }
 
-type fluxcdReconciler struct {
-	resources []string
+type SequentialReconciler struct {
+	Reconcilers []Reconciler
 }
 
-func NewFluxcdReconciler(addr, name string) Reconciler {
-	return fluxcdReconciler{
-		resources: []string{
-			fmt.Sprintf("%s/source/git/%s/%s/reconcile", addr, name, name),
-			fmt.Sprintf("%s/kustomization/%s/%s/reconcile", addr, name, name),
-		},
+func (r *SequentialReconciler) Reconcile(ctx context.Context, namespace, name string) {
+	for _, rec := range r.Reconcilers {
+		rec.Reconcile(ctx, namespace, name)
 	}
 }
 
-func (r fluxcdReconciler) Reconcile(ctx context.Context) {
-	for {
-		select {
-		case <-time.After(3 * time.Second):
-			for _, res := range r.resources {
-				http.Get(res)
-			}
-		case <-ctx.Done():
-			return
-		}
+type SourceGitReconciler struct{}
+
+func (c SourceGitReconciler) Reconcile(ctx context.Context, namespace, name string) {
+	addr := fmt.Sprintf("%s/source/git/%s/%s/reconcile", baseURL, namespace, name)
+	http.Get(addr)
+}
+
+type KustomizationReconciler struct{}
+
+func (c KustomizationReconciler) Reconcile(ctx context.Context, namespace, name string) {
+	addr := fmt.Sprintf("%s/kustomization/%s/%s/reconcile", baseURL, namespace, name)
+	http.Get(addr)
+}
+
+type namespaceNamePair struct {
+	namespace string
+	name      string
+}
+
+type FixedReconciler struct {
+	namespace  string
+	name       string
+	reconciler Reconciler
+}
+
+func NewFixedReconciler(namespace, name string) *FixedReconciler {
+	return &FixedReconciler{
+		namespace,
+		name,
+		&SequentialReconciler{[]Reconciler{
+			SourceGitReconciler{},
+			// NOTE(gio): synchronizing git repository auto-syncs root kustomization as well
+			// KustomizationReconciler{},
+		}},
 	}
 }
+
+func (r *FixedReconciler) Reconcile(ctx context.Context) {
+	r.reconciler.Reconcile(ctx, r.namespace, r.name)
+}