AppManager: Fix derived value calculation

Change-Id: I97c429437b5df4ea782883190f420f9f60111ff4
diff --git a/core/installer/app.go b/core/installer/app.go
index c4604c8..e054964 100644
--- a/core/installer/app.go
+++ b/core/installer/app.go
@@ -734,8 +734,11 @@
 	if err != nil {
 		return EnvAppRendered{}, err
 	}
+	if dv == nil {
+		dv = map[string]any{}
+	}
 	mv := merge(dv.(map[string]any), values)
-	derived, err := deriveValues(mv, values, a.Schema(), networks, clusters, vpnKeyGen)
+	derived, err := deriveValues(mv, mv, a.Schema(), networks, clusters, vpnKeyGen)
 	if err != nil {
 		return EnvAppRendered{}, err
 	}
diff --git a/core/installer/derived.go b/core/installer/derived.go
index cf792ef..4030623 100644
--- a/core/installer/derived.go
+++ b/core/installer/derived.go
@@ -83,7 +83,7 @@
 		// TODO(gio): validate that it is map
 		v, ok := values.(map[string]any)[k]
 		// TODO(gio): if missing use default value
-		if !ok {
+		if !ok || v == nil {
 			if def.Kind() == KindSSHKey {
 				key, err := NewECDSASSHKeyPair("tmp")
 				if err != nil {
diff --git a/core/installer/dodo_app_test.go b/core/installer/dodo_app_test.go
index b2cca5d..ec78325 100644
--- a/core/installer/dodo_app_test.go
+++ b/core/installer/dodo_app_test.go
@@ -10,6 +10,12 @@
 )
 
 var exposed = `
+input: {
+  key: {
+    private: "asd"
+    public: "qwe"
+  }
+}
 service: [{
     name: "app"
 	type: "golang:1.20.0"
diff --git a/core/installer/schema.go b/core/installer/schema.go
index b48217f..2b150a6 100644
--- a/core/installer/schema.go
+++ b/core/installer/schema.go
@@ -376,7 +376,7 @@
 func ExtractDefaultValues(v cue.Value) (any, error) {
 	switch v.IncompleteKind() {
 	case cue.StringKind:
-		if d, ok := v.Default(); ok {
+		if d, ok := v.Default(); ok || d.IsConcrete() {
 			return d.String()
 		}
 	case cue.BoolKind:
@@ -399,8 +399,6 @@
 			return nil, nil
 		} else if isAuth(v) {
 			return nil, nil
-		} else if isSSHKey(v) {
-			return nil, nil
 		} else if isCluster(v) {
 			return nil, nil
 		}
@@ -414,7 +412,12 @@
 			if err != nil {
 				return nil, err
 			}
-			ret[f.Selector().String()] = fv
+			if fv != nil {
+				ret[f.Selector().String()] = fv
+			}
+		}
+		if len(ret) == 0 {
+			return nil, nil
 		}
 		return ret, nil
 	default: