AppManager: Support exposing ports on public networks

Sets up [public ingress -> private ingress -> remote cluster] proxy chain

Change-Id: I6376a006b2692c31f3cb895bbfd6e373182e8824
diff --git a/core/installer/dodo_app_test.go b/core/installer/dodo_app_test.go
index eaad590..6c4df1f 100644
--- a/core/installer/dodo_app_test.go
+++ b/core/installer/dodo_app_test.go
@@ -213,7 +213,7 @@
 	t.Log(string(r.Raw))
 }
 
-const exposeRemoteCluster = `
+const exposeRemoteClusterPrivateNetwork = `
 {
     "cluster": "remote",
     "postgresql": [{
@@ -227,9 +227,9 @@
 }
 `
 
-func TestExposeRemoteCluster(t *testing.T) {
+func TestExposeRemoteClusterPrivateNetwork(t *testing.T) {
 	var buf bytes.Buffer
-	if _, err := buf.WriteString(exposeRemoteCluster); err != nil {
+	if _, err := buf.WriteString(exposeRemoteClusterPrivateNetwork); err != nil {
 		t.Fatal(err)
 	}
 	clusters := []Cluster{{
@@ -270,3 +270,62 @@
 	}
 	t.Log(string(r.Raw))
 }
+
+const exposeRemoteClusterPublicNetwork = `
+{
+    "cluster": "remote",
+    "postgresql": [{
+		"name": "db",
+		"size": "1Gi",
+		"expose": [{
+			"network": "Public",
+			"subdomain": "pg"
+		}]
+	}],
+}
+`
+
+func TestExposeRemoteClusterPublicNetwork(t *testing.T) {
+	var buf bytes.Buffer
+	if _, err := buf.WriteString(exposeRemoteClusterPublicNetwork); err != nil {
+		t.Fatal(err)
+	}
+	clusters := []Cluster{{
+		Name:             "remote",
+		Kubeconfig:       "<KUBECONFIG>",
+		IngressClassName: "<INGRESS_CLASS_NAME>",
+	}}
+	if err := json.NewEncoder(&buf).Encode(struct {
+		Clusters []Cluster `json:"clusters"`
+	}{
+		clusters,
+	}); err != nil {
+		t.Fatal(err)
+	}
+	app, err := NewDodoApp(buf.Bytes())
+	if err != nil {
+		for _, e := range errors.Errors(err) {
+			t.Log(e)
+		}
+		t.Fatal(err)
+	}
+	release := Release{
+		Namespace:     "foo",
+		AppInstanceId: "foo-bar",
+		RepoAddr:      "ssh://192.168.100.210:22/config",
+		AppDir:        "/foo/bar",
+	}
+	keyGen := testKeyGen{}
+	r, err := app.Render(release, env, networks, clusters, map[string]any{
+		"managerAddr":                  "",
+		"appId":                        "",
+		"sshPrivateKey":                "",
+		"port_postgresql_db_0":         1,
+		"port_postgresql_db_0_cluster": 2,
+		"port_postgresql_db_0_private": 3,
+	}, nil, keyGen)
+	if err != nil {
+		t.Fatal(err)
+	}
+	t.Log(string(r.Raw))
+}