DodoApp: Support remote clusters

Change-Id: I6f4e6a0a32cc723b47c96518d83b1ffdb5169f14
diff --git a/core/installer/cmd/dodo_app.go b/core/installer/cmd/dodo_app.go
index 8512691..bcd8a68 100644
--- a/core/installer/cmd/dodo_app.go
+++ b/core/installer/cmd/dodo_app.go
@@ -1,9 +1,14 @@
 package main
 
 import (
+	"bytes"
 	"database/sql"
 	"encoding/json"
+	"fmt"
+	"io"
 	"log"
+	"net"
+	"net/http"
 	"os"
 
 	"github.com/giolekva/pcloud/core/installer"
@@ -201,8 +206,7 @@
 		},
 	}
 	vpnKeyGen := installer.NewHeadscaleAPIClient(dodoAppFlags.headscaleAPIAddr)
-	// TOOD(gio): implement
-	var cnc installer.ClusterNetworkConfigurator
+	cnc := &proxyConfigurator{dodoAppFlags.envAppManagerAddr}
 	s, err := welcome.NewDodoAppServer(
 		st,
 		nf,
@@ -230,3 +234,54 @@
 	}
 	return s.Start()
 }
+
+type proxyConfigurator struct {
+	apiAddr string
+}
+
+func (pc *proxyConfigurator) AddCluster(name string, ingressIP net.IP) error {
+	return fmt.Errorf("NOT IMPLEMENTED")
+}
+
+func (pc *proxyConfigurator) RemoveCluster(name string, ingressIP net.IP) error {
+	return fmt.Errorf("NOT IMPLEMENTED")
+}
+
+type proxyPair struct {
+	From string `json:"from"`
+	To   string `json:"to"`
+}
+
+func (pc *proxyConfigurator) AddProxy(src, dst string) error {
+	var buf bytes.Buffer
+	if err := json.NewEncoder(&buf).Encode(proxyPair{src, dst}); err != nil {
+		return err
+	}
+	resp, err := http.Post(fmt.Sprintf("%s/api/proxy/add", pc.apiAddr), "application/json", &buf)
+	if err != nil {
+		return err
+	}
+	if resp.StatusCode != http.StatusOK {
+		var buf bytes.Buffer
+		io.Copy(&buf, resp.Body)
+		return fmt.Errorf(buf.String())
+	}
+	return nil
+}
+
+func (pc *proxyConfigurator) RemoveProxy(src, dst string) error {
+	var buf bytes.Buffer
+	if err := json.NewEncoder(&buf).Encode(proxyPair{src, dst}); err != nil {
+		return err
+	}
+	resp, err := http.Post(fmt.Sprintf("%s/api/proxy/remove", pc.apiAddr), "application/json", &buf)
+	if err != nil {
+		return err
+	}
+	if resp.StatusCode != http.StatusOK {
+		var buf bytes.Buffer
+		io.Copy(&buf, resp.Body)
+		return fmt.Errorf(buf.String())
+	}
+	return nil
+}