AppManager: Support exposing cross-cluster ports

Change-Id: I4bdb3573209935f6777656ec2f3481e79d84a9c9
diff --git a/core/installer/cmd/app_manager.go b/core/installer/cmd/app_manager.go
index afc7d32..c2547d6 100644
--- a/core/installer/cmd/app_manager.go
+++ b/core/installer/cmd/app_manager.go
@@ -3,8 +3,8 @@
 import (
 	"log"
 	"os"
-
-	"golang.org/x/crypto/ssh"
+	"path/filepath"
+	"strings"
 
 	"github.com/giolekva/pcloud/core/installer"
 	"github.com/giolekva/pcloud/core/installer/server/appmanager"
@@ -80,20 +80,14 @@
 	if err != nil {
 		return err
 	}
-	signer, err := ssh.ParsePrivateKey(sshKey)
+	items := strings.Split(appManagerFlags.repoAddr, "/")
+	ipPort := items[len(items)-2]
+	repoName := items[len(items)-1]
+	ssClient, err := soft.NewClient(ipPort, sshKey, log.Default())
 	if err != nil {
 		return err
 	}
-	addr, err := soft.ParseRepositoryAddress(appManagerFlags.repoAddr)
-	if err != nil {
-		return err
-	}
-	repo, err := soft.CloneRepository(addr, signer)
-	if err != nil {
-		return err
-	}
-	log.Println("Cloned repository")
-	repoIO, err := soft.NewRepoIO(repo, signer)
+	repoIO, err := ssClient.GetRepo(repoName)
 	if err != nil {
 		return err
 	}
@@ -112,7 +106,8 @@
 		PrivateSubdomain: "p",
 		DNSAPIAddr:       appManagerFlags.dnsAPIAddr,
 		Repo:             repoIO,
-		NginxConfigPath:  appManagerFlags.clusterProxyConfigPath,
+		ConfigPath:       appManagerFlags.clusterProxyConfigPath,
+		ServicePath:      filepath.Join(filepath.Dir(appManagerFlags.clusterProxyConfigPath), "proxy-backend-service.yaml"),
 	}
 	m, err := installer.NewAppManager(repoIO, nsc, jc, hf, vpnAPIClient, cnc, "/apps")
 	if err != nil {
@@ -145,6 +140,7 @@
 	}
 	s, err := appmanager.NewServer(
 		appManagerFlags.port,
+		ssClient,
 		repoIO,
 		m,
 		r,
diff --git a/core/installer/cmd/dodo_app.go b/core/installer/cmd/dodo_app.go
index adc8beb..9b5da30 100644
--- a/core/installer/cmd/dodo_app.go
+++ b/core/installer/cmd/dodo_app.go
@@ -245,6 +245,8 @@
 	return s.Start()
 }
 
+// TODO(gio): this should be removed, all of app installtions including dodo app
+// must be done directly by main app manager.
 type proxyConfigurator struct {
 	apiAddr string
 }
@@ -262,7 +264,7 @@
 	To   string `json:"to"`
 }
 
-func (pc *proxyConfigurator) AddProxy(src, dst string) error {
+func (pc *proxyConfigurator) AddIngressProxy(src, dst string) error {
 	var buf bytes.Buffer
 	if err := json.NewEncoder(&buf).Encode(proxyPair{src, dst}); err != nil {
 		return err
@@ -279,7 +281,17 @@
 	return nil
 }
 
-func (pc *proxyConfigurator) RemoveProxy(src, dst string) error {
+func (pc *proxyConfigurator) AddProxy(src int, dst string, protocol installer.Protocol) (string, error) {
+	// TODO(gio): implement
+	return "", fmt.Errorf("NOT IMPLEMENTED")
+}
+
+func (pc *proxyConfigurator) RemoveProxy(src int, dst string, protocol installer.Protocol) error {
+	// TODO(gio): implement
+	return fmt.Errorf("NOT IMPLEMENTED")
+}
+
+func (pc *proxyConfigurator) RemoveIngressProxy(src, dst string) error {
 	var buf bytes.Buffer
 	if err := json.NewEncoder(&buf).Encode(proxyPair{src, dst}); err != nil {
 		return err