DodoApp: Support MongoDB

Change-Id: I275f662848fb7d78b98d5e935f5ca87d73ca60ec
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 -}}