port-allocator: allocates ports on preconfigured ingress-nginx

Replacement of /core/installer/tcp-udp-transport

Change-Id: I3d116b0f4508b462398f69e980ad55771dc88b7c
diff --git a/core/installer/app.go b/core/installer/app.go
index 64c4078..b710acc 100644
--- a/core/installer/app.go
+++ b/core/installer/app.go
@@ -78,6 +78,7 @@
 	ingressClass: string
 	certificateIssuer: string | *""
 	domain: string
+	allocatePortAddr: string
 }
 
 networks: {
@@ -86,11 +87,13 @@
 		ingressClass: "\(global.pcloudEnvName)-ingress-public"
 		certificateIssuer: "\(global.id)-public"
 		domain: global.domain
+		allocatePortAddr: "http://port-allocator.\(global.pcloudEnvName)-ingress-public.svc.cluster.local/api/allocate"
 	}
 	private: #Network & {
 		name: "Private"
 		ingressClass: "\(global.id)-ingress-private"
 		domain: global.privateDomain
+		allocatePortAddr: "http://port-allocator.\(global.id)-ingress-private.svc.cluster.local/api/allocate"
 	}
 }
 
@@ -127,8 +130,20 @@
 
 #Release: {
 	namespace: string
+	repoAddr: string
+	appDir: string
 }
 
+#PortForward: {
+	allocator: string
+	protocol: "TCP" | "UDP" | *"TCP"
+	sourcePort: int
+	targetService: string
+	targetPort: int
+}
+
+portForward: [...#PortForward] | *[]
+
 global: #Global
 release: #Release
 
@@ -303,6 +318,7 @@
 type Rendered struct {
 	Readme    string
 	Resources map[string][]byte
+	Ports     []PortForward
 }
 
 type App interface {
@@ -372,9 +388,18 @@
 	return []string{a.namespace}
 }
 
+type PortForward struct {
+	Allocator     string `json:"allocator"`
+	Protocol      string `json:"protocol"`
+	SourcePort    int    `json:"sourcePort"`
+	TargetService string `json:"targetService"`
+	TargetPort    int    `json:"targetPort"`
+}
+
 func (a cueApp) Render(derived Derived) (Rendered, error) {
 	ret := Rendered{
 		Resources: make(map[string][]byte),
+		Ports:     make([]PortForward, 0),
 	}
 	var buf bytes.Buffer
 	if err := json.NewEncoder(&buf).Encode(derived); err != nil {
@@ -394,6 +419,9 @@
 		return Rendered{}, err
 	}
 	ret.Readme = readme
+	if err := res.LookupPath(cue.ParsePath("portForward")).Decode(&ret.Ports); err != nil {
+		return Rendered{}, err
+	}
 	output := res.LookupPath(cue.ParsePath("output"))
 	i, err := output.Fields()
 	if err != nil {