Installer: Separate infrastructure and environment apps.

Have two separate application managers, one for installing apps on the
dodo infra, and nother installing on individual environments.

Change-Id: I1b24f008e30c5533c48c22ea92328bc4bb7abc54
diff --git a/core/installer/cmd/app_manager.go b/core/installer/cmd/app_manager.go
index 621ad87..b6c083c 100644
--- a/core/installer/cmd/app_manager.go
+++ b/core/installer/cmd/app_manager.go
@@ -84,7 +84,7 @@
 	if err != nil {
 		return err
 	}
-	config, err := m.Config()
+	env, err := m.Config()
 	if err != nil {
 		return err
 	}
@@ -110,7 +110,7 @@
 		r,
 		tasks.NewFluxcdReconciler( // TODO(gio): make reconciler address a flag
 			"http://fluxcd-reconciler.dodo-fluxcd-reconciler.svc.cluster.local",
-			config.Values.Id,
+			env.Id,
 		),
 	)
 	return s.Start()
diff --git a/core/installer/cmd/bootstrap.go b/core/installer/cmd/bootstrap.go
index e6385b5..dc85470 100644
--- a/core/installer/cmd/bootstrap.go
+++ b/core/installer/cmd/bootstrap.go
@@ -3,8 +3,10 @@
 import (
 	_ "embed"
 	"fmt"
+	"net"
 	"net/netip"
 	"os"
+	"strings"
 
 	"github.com/spf13/cobra"
 
@@ -34,7 +36,7 @@
 		"",
 	)
 	cmd.Flags().StringVar(
-		&bootstrapFlags.envName,
+		&bootstrapFlags.publicIP,
 		"public-ip",
 		"",
 		"",
@@ -93,9 +95,10 @@
 	if err != nil {
 		return err
 	}
-	envConfig := installer.EnvConfig{
-		Name:                      bootstrapFlags.envName,
-		PublicIP:                  bootstrapFlags.publicIP,
+	publicIPs, err := parseIPs(bootstrapFlags.publicIP)
+	envConfig := installer.BootstrapConfig{
+		InfraName:                 bootstrapFlags.envName,
+		PublicIP:                  publicIPs,
 		NamespacePrefix:           fmt.Sprintf("%s-", bootstrapFlags.envName),
 		StorageDir:                bootstrapFlags.storageDir,
 		VolumeDefaultReplicaCount: bootstrapFlags.volumeDefaultReplicaCount,
@@ -130,3 +133,15 @@
 		To:            t,
 	}, nil
 }
+
+func parseIPs(ip string) ([]net.IP, error) {
+	ret := make([]net.IP, 0)
+	for _, i := range strings.Split(ip, ",") {
+		ip := net.ParseIP(i)
+		if ip == nil {
+			return nil, fmt.Errorf("invalid ip: %s", i)
+		}
+		ret = append(ret, ip)
+	}
+	return ret, nil
+}