gerrit: auto configure ssh keys

Change-Id: I9c3091e4bb998fa6c846c3c60c2801c7daa45bcf
diff --git a/core/installer/repoio.go b/core/installer/repoio.go
index 01a8f91..ffbdcb0 100644
--- a/core/installer/repoio.go
+++ b/core/installer/repoio.go
@@ -395,10 +395,22 @@
 
 func deriveValues(values any, schema Schema, networks []Network) (map[string]any, error) {
 	ret := make(map[string]any)
-	for k, v := range values.(map[string]any) { // TODO(giolekva): validate
-		def, ok := schema.Fields()[k]
+	for k, def := range schema.Fields() {
+		// TODO(gio): validate that it is map
+		v, ok := values.(map[string]any)[k]
+		// TODO(gio): if missing use default value
 		if !ok {
-			return nil, fmt.Errorf("Field not found: %s", k)
+			if def.Kind() == KindSSHKey {
+				key, err := NewECDSASSHKeyPair("tmp")
+				if err != nil {
+					return nil, err
+				}
+				ret[k] = map[string]string{
+					"public":  string(key.RawAuthorizedKey()),
+					"private": string(key.RawPrivateKey()),
+				}
+			}
+			continue
 		}
 		switch def.Kind() {
 		case KindBoolean:
@@ -417,6 +429,12 @@
 				return nil, err
 			}
 			ret[k] = r
+		case KindSSHKey:
+			r, err := deriveValues(v, SSHKeySchema, networks)
+			if err != nil {
+				return nil, err
+			}
+			ret[k] = r
 		case KindStruct:
 			r, err := deriveValues(v, def, networks)
 			if err != nil {