DodoApp: Introduce password role

Auto generate passwords for PostgreSQL and MongoDB.

Change-Id: Ibd9fb900ddc8dd505c60ae4dfba73f1c951e3470
diff --git a/core/installer/derived.go b/core/installer/derived.go
index ada4e95..cf792ef 100644
--- a/core/installer/derived.go
+++ b/core/installer/derived.go
@@ -4,6 +4,8 @@
 	"fmt"
 	"html/template"
 	"strings"
+
+	"github.com/sethvargo/go-password/password"
 )
 
 const defaultClusterName = "default"
@@ -92,6 +94,13 @@
 					"private": string(key.RawPrivateKey()),
 				}
 			}
+			if def.Kind() == KindPassword {
+				psswd, err := GeneratePassword()
+				if err != nil {
+					return nil, err
+				}
+				ret[k] = psswd
+			}
 			if def.Kind() == KindVPNAuthKey {
 				enabled := true
 				if v, ok := def.Meta()["enabledField"]; ok {
@@ -135,6 +144,8 @@
 			ret[k] = v
 		case KindVPNAuthKey:
 			ret[k] = v
+		case KindPassword:
+			ret[k] = v
 		case KindArrayString:
 			a, ok := v.([]string)
 			if !ok {
@@ -234,6 +245,8 @@
 			ret[k] = v
 		case KindVPNAuthKey:
 			ret[k] = v
+		case KindPassword:
+			ret[k] = v
 		case KindArrayString:
 			a, ok := v.([]string)
 			if !ok {
@@ -335,3 +348,7 @@
 	}
 	return nil, fmt.Errorf("Cluster not found: %s", name)
 }
+
+func GeneratePassword() (string, error) {
+	return password.Generate(20, 5, 0, false, true)
+}