DodoApp: Support MongoDB

Change-Id: I275f662848fb7d78b98d5e935f5ca87d73ca60ec
diff --git a/core/installer/app_configs/app_base.cue b/core/installer/app_configs/app_base.cue
index 74860fa..122faa7 100644
--- a/core/installer/app_configs/app_base.cue
+++ b/core/installer/app_configs/app_base.cue
@@ -305,6 +305,134 @@
 	}
 }
 
+#MongoDB: #WithOut & {
+	cluster?: #Cluster
+	_cluster: cluster
+	name: string
+	version: "8.0.1"
+	size: string | *"1Gi"
+	initdbScripts: {...}
+	_initdbScripts: initdbScripts
+
+	_size: size
+	_volumeClaimName: "\(name)-mongodb"
+
+	images: {
+		mongodb: {
+			registry: "docker.io"
+			repository: "bitnami"
+			name: "mongodb"
+			tag: version
+			pullPolicy: "IfNotPresent"
+		}
+	}
+	charts: {
+		mongodb: {
+			kind: "GitRepository"
+			address: "https://code.v1.dodo.cloud/helm-charts"
+			branch: "main"
+			path: "charts/mongodb"
+		}
+	}
+	volumes: {
+		"\(_volumeClaimName)": {
+			size: _size
+			if _cluster != _|_ {
+				cluster: _cluster
+			}
+		}
+	}
+	helm: {
+		mongodb: {
+			chart: charts.mongodb
+			if _cluster != _|_ {
+				cluster: _cluster
+			}
+			annotations: {
+				"dodo.cloud/resource-type": "mongodb"
+				"dodo.cloud/resource.mongodb.name": name
+				"dodo.cloud/resource.mongodb.version": version
+				"dodo.cloud/resource.mongodb.volume": _volumeClaimName
+			}
+			values: {
+				fullnameOverride: "mongodb-\(name)"
+				image: {
+					registry: images.mongodb.registry
+					repository: images.mongodb.imageName
+					tag: images.mongodb.tag
+					pullPolicy: images.mongodb.pullPolicy
+				}
+				architecture: "standalone"
+				useStatefulSet: false
+				auth: {
+					enabled: true
+					rootUser: "root"
+					rootPassword: "root"
+					usernames: ["mongo"]
+					passwords: ["mongo"]
+					databases: ["mongo"]
+				}
+				tls: enabled: false
+				disableJavascript: false
+				enableJournal: true
+				initdbScripts: _initdbScripts
+				service: {
+					type: "ClusterIP"
+					portName: "mongodb"
+					ports: mongodb: 27017
+				}
+				arbiter: enabled: false
+				hidden: enabled: false
+				persistence: {
+					enabled: true
+					existingClaim: _volumeClaimName
+					mountPath: "/bitnami/mongodb"
+				}
+				volumePermissions: securityContext: runAsUser: 0
+			}
+		}
+	}
+}
+
+#WithOut: {
+	cluster?: #Cluster
+	_cluster: cluster
+	mongodb: {...}
+	mongodb: {
+		for k, v in mongodb {
+			"\(k)": #MongoDB & v & {
+				if _cluster != _|_ {
+					cluster: _cluster
+				}
+			}
+		}
+		...
+	}
+	images: {
+		for k, v in mongodb {
+			for x, y in v.images {
+				"\(x)": y
+			}
+		}
+	}
+	charts: {
+		for k, v in mongodb {
+			for x, y in v.charts {
+				"\(x)": y
+			}
+		}
+	}
+	helmR: {
+		for k, v in mongodb {
+			for x, y in v.helmR {
+				"\(x)": y
+			}
+		}
+		...
+	}
+	...
+}
+
 #PostgreSQL: #WithOut & {
 	cluster?: #Cluster
 	_cluster: cluster
diff --git a/core/installer/app_configs/dodo_app.cue b/core/installer/app_configs/dodo_app.cue
index aa3b527..6fdb412 100644
--- a/core/installer/app_configs/dodo_app.cue
+++ b/core/installer/app_configs/dodo_app.cue
@@ -95,6 +95,7 @@
 	ingress: #AppIngress
 	volumes: [...#volume]
 	postgresql: [...#PostgreSQL]
+	mongodb: [...#MongoDB]
 	rootDir: string
 	runConfiguration: [...#Command]
 	dev: #Dev | *{ enabled: false }
@@ -104,8 +105,11 @@
 		for v in volumes {
 			"DODO_VOLUME_\(strings.ToUpper(v.name))=/dodo-volume/\(v.name)"
 		}
-		for v in postgresql {
-			"DODO_POSTGRESQL_\(strings.ToUpper(v.name))_URL=postgresql://postgres:postgres@postgres-\(v.name).\(release.namespace).svc.cluster.local/postgres"
+		for p in postgresql {
+			"DODO_POSTGRESQL_\(strings.ToUpper(p.name))_URL=postgresql://postgres:postgres@postgres-\(p.name).\(release.namespace).svc.cluster.local/postgres"
+		}
+		for m in mongodb {
+			"DODO_MONGODB_\(strings.ToUpper(m.name))_URL=mongodb://mongo:mongo@mongodb-\(m.name).\(release.namespace).svc.cluster.local/mongo"
 		}
     ]
 
@@ -412,6 +416,11 @@
 			"\(v.name)": v
 		}
 	}
+	mongodb: {
+		for v in app.mongodb {
+			"\(v.name)": v
+		}
+	}
 	vm: {
 		"\(_vmName)": _devVM
 	}
diff --git a/core/installer/app_test.go b/core/installer/app_test.go
index 47eb02c..a59571d 100644
--- a/core/installer/app_test.go
+++ b/core/installer/app_test.go
@@ -483,7 +483,7 @@
       name: "data"
       size: "5Gi"
     }]
-    postgresql: [{
+    mongodb: [{
       name: "db"
       size: "10Gi"
     }]
diff --git a/core/installer/server/dodo-app/schemas/app.schema.json b/core/installer/server/dodo-app/schemas/app.schema.json
index 455829c..f400c17 100644
--- a/core/installer/server/dodo-app/schemas/app.schema.json
+++ b/core/installer/server/dodo-app/schemas/app.schema.json
@@ -48,6 +48,9 @@
         "postgresql": {
           "$ref": "#/definitions/postgresql"
         },
+        "mongodb": {
+          "$ref": "#/definitions/mongodb"
+        },
         "dev": {
           "$ref": "#/definitions/dev"
         }
@@ -100,6 +103,9 @@
         "postgresql": {
           "$ref": "#/definitions/postgresql"
         },
+        "mongodb": {
+          "$ref": "#/definitions/mongodb"
+        },
         "dev": {
           "$ref": "#/definitions/dev"
         }
@@ -129,6 +135,9 @@
         "postgresql": {
           "$ref": "#/definitions/postgresql"
         },
+        "mongodb": {
+          "$ref": "#/definitions/mongodb"
+        },
         "dev": {
           "$ref": "#/definitions/dev"
         },
@@ -258,6 +267,93 @@
         "subdomain"
       ]
     },
+	// mongo start
+    "mongo": {
+      "type": "object",
+      "properties": {
+        "name": {
+          "type": "string"
+        },
+        "size": {
+          "$ref": "#/definitions/size"
+        },
+		"initdbScripts": { "type": "object" }
+      },
+      "additionalProperties": false,
+      "required": [
+        "name",
+        "size"
+      ]
+    },
+    "mongodb": {
+      "type": "array",
+      "items": {
+        "$ref": "#/definitions/mongo"
+      }
+    },
+    "size": {
+      "type": "string",
+      "pattern": "[1-9][0-9]*(Mi|Gi)"
+    },
+    "ingress": {
+      "type": "object",
+      "properties": {
+        "network": {
+          "type": "string",
+          "oneOf": {{ .Networks }}
+        },
+        "subdomain": {
+          "type": "string",
+          "minLength": 1
+        },
+        "auth": {
+          "type": "object",
+          "oneOf": [
+            {
+              "type": "object",
+              "properties": {
+                "enabled": {
+                  "enum": [
+                    false
+                  ]
+                }
+              },
+              "additionalProperties": false,
+              "required": [
+                "enabled"
+              ]
+            },
+            {
+              "type": "object",
+              "properties": {
+                "enabled": {
+                  "enum": [
+                    true
+                  ]
+                },
+                "groups": {
+                  "type": "string"
+                },
+                "noAuthPathPatterns": {
+                  "type": "array",
+                  "items": { "type": "string" }
+                }
+              },
+              "additionalProperties": false,
+              "required": [
+                "enabled"
+              ]
+            }
+          ]
+        }
+      },
+      "additionalProperties": false,
+      "required": [
+        "network",
+        "subdomain"
+      ]
+    },
+
     "command": {
       "type": "object",
       "properties": {
diff --git a/core/installer/server/dodo-app/server.go b/core/installer/server/dodo-app/server.go
index 609ce9f..4fbd6c2 100644
--- a/core/installer/server/dodo-app/server.go
+++ b/core/installer/server/dodo-app/server.go
@@ -630,6 +630,12 @@
 	Volume  string
 }
 
+type mongodb struct {
+	Name    string
+	Version string
+	Volume  string
+}
+
 type ingress struct {
 	Name string
 	Host string
@@ -646,6 +652,7 @@
 type resourceData struct {
 	Volume         []volume
 	PostgreSQL     []postgresql
+	MongoDB        []mongodb
 	Ingress        []ingress
 	VirtualMachine []vm
 }
@@ -1815,6 +1822,20 @@
 				return resourceData{}, fmt.Errorf("no volume")
 			}
 			ret.PostgreSQL = append(ret.PostgreSQL, postgresql{name, version, volume})
+		case "mongodb":
+			name, ok := r.Annotations["dodo.cloud/resource.mongodb.name"]
+			if !ok {
+				return resourceData{}, fmt.Errorf("no name")
+			}
+			version, ok := r.Annotations["dodo.cloud/resource.mongodb.version"]
+			if !ok {
+				return resourceData{}, fmt.Errorf("no version")
+			}
+			volume, ok := r.Annotations["dodo.cloud/resource.mongodb.volume"]
+			if !ok {
+				return resourceData{}, fmt.Errorf("no volume")
+			}
+			ret.MongoDB = append(ret.MongoDB, mongodb{name, version, volume})
 		case "ingress":
 			name, ok := r.Annotations["dodo.cloud/resource.ingress.name"]
 			if !ok {
diff --git a/core/installer/server/dodo-app/templates/base.html b/core/installer/server/dodo-app/templates/base.html
index 19aaf52..722c640 100644
--- a/core/installer/server/dodo-app/templates/base.html
+++ b/core/installer/server/dodo-app/templates/base.html
@@ -46,6 +46,15 @@
 <br/>
 {{- end -}}
 {{- end -}}
+{{- if gt (len .MongoDB) 0 -}}
+<h3>MongoDB</h3>
+{{- range $m := .MongoDB -}}
+Name: {{ $m.Name }}<br/>
+Version: {{ $m.Version }}<br/>
+Volume: {{ $m.Volume }}<br/>
+<br/>
+{{- end -}}
+{{- end -}}
 {{- if gt (len .Volume) 0 -}}
 <h3>Volumes</h3>
 {{- range $v := .Volume -}}