DodoApp: Use service name as container image name

This avoids clashes between multiple service definitions.

Change-Id: I379111dba1ed5265bf1b1b17975a4219c45261d8
diff --git a/core/installer/app_configs/dodo_app.cue b/core/installer/app_configs/dodo_app.cue
index 9c433bd..1390459 100644
--- a/core/installer/app_configs/dodo_app.cue
+++ b/core/installer/app_configs/dodo_app.cue
@@ -554,8 +554,16 @@
 }
 
 #AgentApp: #SketchApp
+#AgentApp: {
+	agentMode: true
+	...
+}
 
 #NonAgentApp: #GoApp | #HugoApp | #PHPApp | #NextjsApp | #NodeJSApp | #DenoApp
+#NonAgentApp: {
+	agentMode: false
+	...
+}
 
 #App: #NonAgentApp | #AgentApp
 
@@ -570,8 +578,9 @@
 
 _serviceDevDisabled: {
 	svcType: string
+	svcName: string
 	images: {
-		app: {
+		"\(svcName)": {
 			repository: "giolekva"
 			name:       "app-runner"
 			tag:        strings.Replace(svcType, ":", "-", -1)
@@ -646,7 +655,10 @@
 		}],
 	])
 
-	_sdd: _serviceDevDisabled & {svcType: svc.type}
+	_sdd: _serviceDevDisabled & {
+		svcType: svc.type
+		svcName: svc.name
+	}
 	images: _sdd.images
 	charts: _sdd.charts
 
@@ -697,9 +709,9 @@
 			}
 			values: {
 				image: {
-					repository: images.app.fullName
-					tag:        images.app.tag
-					pullPolicy: images.app.pullPolicy
+					repository: images[svc.name].fullName
+					tag:        images[svc.name].tag
+					pullPolicy: images[svc.name].pullPolicy
 				}
 				// TODO(gio): install gvisor runtime during new remote cluster init
 				if cluster == _|_ {
@@ -853,7 +865,10 @@
 #Service: #ServiceDevEnabled | #ServiceDevDisabled
 #Service: {
 	svc: type: string
-	_sdd: _serviceDevDisabled & {svcType: svc.type}
+	_sdd: _serviceDevDisabled & {
+		svcType: svc.type
+		svcName: svc.name
+	}
 	charts: _serviceDevEnabled.charts & _sdd.charts
 	images: _serviceDevEnabled.images & _sdd.images
 	...
@@ -956,13 +971,16 @@
 		for v in _service {
 			"\(v.name)": #Service & {
 				name: v.name
-				svc:  v
+				svc: v & {
+					agentMode: false
+				}
 			}
 		}
 		for v in agent {
 			"\(v.name)": #Service & {
 				name: v.name
 				svc: v & {
+					agentMode: true
 					dev: enabled: false
 					volume: ["\(v.name)-apps"]
 				}
diff --git a/core/installer/dodo_app_test.go b/core/installer/dodo_app_test.go
index 6ebf98e..6e792a0 100644
--- a/core/installer/dodo_app_test.go
+++ b/core/installer/dodo_app_test.go
@@ -756,3 +756,171 @@
 	}
 	t.Log(string(r.Raw))
 }
+
+const serviceAndAgent = `
+{
+  "service": [
+    {
+      "nodeId": "02efbce4-c338-4cb9-a101-63acfeaca4c7",
+      "type": "deno:2.2.0",
+      "name": "blog",
+      "source": {
+        "repository": "git@github.com:giolekva/dodo-blog.git",
+        "branch": "master",
+        "rootDir": "/"
+      },
+      "ports": [
+        {
+          "name": "web",
+          "value": 8080,
+          "protocol": "TCP"
+        }
+      ],
+      "env": [
+        {
+          "name": "DODO_POSTGRESQL_DB_URL"
+        },
+        {
+          "name": "DODO_PORT_WEB",
+          "alias": "PORT"
+        }
+      ],
+      "ingress": [
+        {
+          "nodeId": "bb4c754a-d50b-4686-b485-17ad1804f014",
+          "network": "Private",
+          "subdomain": "blog",
+          "port": {
+            "name": "web"
+          },
+          "auth": {
+            "enabled": false
+          }
+        }
+      ],
+      "expose": [],
+      "preBuildCommands": [
+        {
+          "bin": "deno run -A npm:prisma migrate dev"
+        }
+      ],
+      "dev": {
+        "enabled": false
+      }
+    }
+  ],
+  "agent": [
+    {
+      "nodeId": "76081511-fa20-4202-935a-a171c79a9daf",
+      "type": "sketch:latest",
+      "name": "lead",
+      "ports": [
+        {
+          "name": "agent",
+          "value": 2001,
+          "protocol": "TCP"
+        },
+        {
+          "name": "p8080",
+          "value": 8080,
+          "protocol": "TCP"
+        },
+        {
+          "name": "p8081",
+          "value": 8081,
+          "protocol": "TCP"
+        },
+        {
+          "name": "p8082",
+          "value": 8082,
+          "protocol": "TCP"
+        },
+        {
+          "name": "p8083",
+          "value": 8083,
+          "protocol": "TCP"
+        },
+        {
+          "name": "p8084",
+          "value": 8084,
+          "protocol": "TCP"
+        }
+      ],
+      "env": [
+        {
+          "name": "DODO_PORT_AGENT"
+        },
+        {
+          "name": "DODO_PORT_P8080"
+        },
+        {
+          "name": "DODO_PORT_P8081"
+        },
+        {
+          "name": "DODO_PORT_P8082"
+        },
+        {
+          "name": "DODO_PORT_P8083"
+        },
+        {
+          "name": "DODO_PORT_P8084"
+        }
+      ],
+      "ingress": [
+        {
+          "nodeId": "31cadf3f-0858-4a86-844b-733910817984",
+          "network": "Private",
+          "subdomain": "weq",
+          "port": {
+            "name": "agent"
+          },
+          "auth": {
+            "enabled": false
+          }
+        }
+      ],
+      "expose": [],
+      "preBuildCommands": [],
+      "dev": {
+        "enabled": false
+      }
+    }
+  ],
+  "volume": [],
+  "postgresql": [
+    {
+      "nodeId": "ba62db4b-2b07-49d0-ba29-ab65bd244997",
+      "name": "db",
+      "size": "1Gi",
+      "expose": []
+    }
+  ],
+  "mongodb": []
+}
+`
+
+func TestServiceAndAgent(t *testing.T) {
+	app, err := NewDodoApp([]byte(serviceAndAgent))
+	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, nil, map[string]any{
+		"managerAddr":  "",
+		"appId":        "",
+		"geminiApiKey": "dev",
+	}, nil, keyGen)
+	if err != nil {
+		t.Fatal(err)
+	}
+	t.Log(string(r.Raw))
+}