AppManager: Add API endpoint to install dodo app

Refactors cue definitions.

Next steps:
* Needs some cleanup, namespace is hard coded ...
* Maybe merge with regular install API
* Support exposing ports across clusters

Change-Id: Ibfc3c3f742b61f2c5874012fe6c77b958eae81d9
diff --git a/core/installer/app_test.go b/core/installer/app_test.go
index a59571d..f0fe537 100644
--- a/core/installer/app_test.go
+++ b/core/installer/app_test.go
@@ -401,7 +401,8 @@
 }
 
 var dodoAppRemoteClusterCue = `
-app: {
+service: [{
+    name: "app"
 	type: "golang:1.22.0"
 	run: "main.go"
 	ingress: {
@@ -413,7 +414,8 @@
 		enabled: false
 	}
     cluster: "io"
-}`
+    source: repository: "ssh://foo.bar"
+}]`
 
 func TestDodoAppRemoteCluster(t *testing.T) {
 	app, err := NewDodoApp([]byte(dodoAppRemoteClusterCue))
@@ -432,12 +434,9 @@
 	}
 	keyGen := testKeyGen{}
 	r, err := app.Render(release, env, networks, clusters, map[string]any{
-		"repoAddr":       "1",
-		"repoPublicAddr": "2",
-		"managerAddr":    "3",
-		"appId":          "4",
-		"branch":         "5",
-		"sshPrivateKey":  "6",
+		"managerAddr":   "3",
+		"appId":         "4",
+		"sshPrivateKey": "6",
 	}, nil, keyGen)
 	if err != nil {
 		for _, e := range errors.Errors(err) {
@@ -453,7 +452,8 @@
 }
 
 var dodoAppDevDisabledCue = `
-app: {
+service: [{
+    name: "app"
 	type: "golang:1.22.0"
 	run: "main.go"
 	ingress: {
@@ -464,10 +464,12 @@
 	dev: {
 		enabled: false
 	}
-}`
+    source: repository: "ssh://foo.bar"
+}]`
 
 var dodoAppDevEnabledCue = `
-app: {
+service: [{
+    name: "app"
 	type: "golang:1.20.0"
 	run: "main.go"
 	ingress: {
@@ -475,19 +477,24 @@
 		subdomain: "testapp"
 		auth: enabled: false
 	}
+	volume: ["data"]
 	dev: {
 		enabled: true
 		username: "gio"
 	}
-    volumes: [{
-      name: "data"
-      size: "5Gi"
-    }]
-    mongodb: [{
-      name: "db"
-      size: "10Gi"
-    }]
-}`
+    source: repository: "ssh://foo.bar"
+}]
+
+volume: [{
+  name: "data"
+  size: "5Gi"
+}]
+
+mongodb: [{
+  name: "db"
+  size: "10Gi"
+}]
+`
 
 func TestDodoAppDevDisabled(t *testing.T) {
 	app, err := NewDodoApp([]byte(dodoAppDevDisabledCue))
@@ -506,12 +513,9 @@
 	}
 	keyGen := testKeyGen{}
 	r, err := app.Render(release, env, networks, nil, map[string]any{
-		"repoAddr":       "",
-		"repoPublicAddr": "",
-		"managerAddr":    "",
-		"appId":          "",
-		"branch":         "",
-		"sshPrivateKey":  "",
+		"managerAddr":   "",
+		"appId":         "",
+		"sshPrivateKey": "",
 	}, nil, keyGen)
 	if err != nil {
 		for _, e := range errors.Errors(err) {
@@ -543,13 +547,10 @@
 	}
 	keyGen := testKeyGen{}
 	r, err := app.Render(release, env, networks, nil, map[string]any{
-		"repoAddr":       "",
-		"repoPublicAddr": "",
-		"managerAddr":    "",
-		"appId":          "",
-		"branch":         "",
-		"sshPrivateKey":  "",
-		"username":       "",
+		"managerAddr":   "",
+		"appId":         "",
+		"sshPrivateKey": "",
+		"username":      "",
 	}, nil, keyGen)
 	if err != nil {
 		for _, e := range errors.Errors(err) {
@@ -574,7 +575,6 @@
 	}
 	values := map[string]any{
 		"repoAddr":         "",
-		"repoPublicAddr":   "",
 		"repoHost":         "",
 		"branch":           "",
 		"gitRepoPublicKey": "",