summaryrefslogtreecommitdiff
path: root/doc/todo/info_propigation_out_of_nested_properties.mdwn
diff options
context:
space:
mode:
authorJoey Hess2014-12-07 18:49:42 -0400
committerJoey Hess2014-12-07 18:49:42 -0400
commit19a1d6b7ed29aecf1ff3313eac9f07bf762d1dc6 (patch)
treef6e2681f2fafef59489a1b53b262dd06f3176c3c /doc/todo/info_propigation_out_of_nested_properties.mdwn
parentf692e1ceb28e1fedf2739fa9eb9786c35b5ad780 (diff)
expand
Diffstat (limited to 'doc/todo/info_propigation_out_of_nested_properties.mdwn')
-rw-r--r--doc/todo/info_propigation_out_of_nested_properties.mdwn75
1 files changed, 52 insertions, 23 deletions
diff --git a/doc/todo/info_propigation_out_of_nested_properties.mdwn b/doc/todo/info_propigation_out_of_nested_properties.mdwn
index 3beba037..b83a862c 100644
--- a/doc/todo/info_propigation_out_of_nested_properties.mdwn
+++ b/doc/todo/info_propigation_out_of_nested_properties.mdwn
@@ -1,7 +1,7 @@
Currently, Info about a Host's Properties is manually gathered and
-propigated. propertyList combines the Info of the Properties in the list.
+propigated. propertyList combines the Info of the Properties in the list;
Docker.docked extracts relevant Info from the Properties of the container
-(but not al of it, intentionally!).
+(but not al of it, intentionally!); etc.
This works, but it's error-prone. Consider this example:
@@ -9,26 +9,55 @@ This works, but it's error-prone. Consider this example:
(Just (System (Debian Unstable) _)) -> ensureProperty foo
_ -> ensureProperty bar
-Here, the Info of `foo` is not propigated out. Nor is `bar`'s Info.
-Of course, only one of them will be run, and only its info should be propigated
-out..
-
-This commonly afflicts eg, privData. For example, `User.hasPassword'`
-used to have this problem, which prevented --list-fields from listing privdata
-that's not set from that property. (That was worked around.)
+Here, the Info of `foo` is not propigated out. Nor is `bar`'s Info. Of
+course, only one of them will be run, and only its info should be
+propigated out..
One approach might be to make the Propellor monad be able to be run in two
-modes. In one mode, it actually perform IO, etc. In the other mode, all
-liftIO is a no-op, but all Info encountered is accumulated using a Reader
-monad. This might need two separate monad definitions.
-
-That is surely doable, but the withOS example above shows a problem with it --
-the OS is itself part of a Host's info, so won't be known until all its
-properties have been examined for info!
-
-Perhaps that can be finessed. We don't really need to propigate out OS info.
-Just DNS and PrivDataField Info. So info could be collected in 2 passes,
-first as it's done now by static propertyInfo values. Then take that
-and use it as the Info when running the Properties in the Reader monad.
-Combine what the Reader accumulates with the static info to get the full
-info.
+modes. In run mode, it actually performs IO, etc. In introspection mode, all
+liftIO is a no-op, but all Info encountered is accumulated using a Reader.
+This might need two separate monad definitions.
+
+That is surely doable, but consider this example:
+
+ property "demo" = do
+ needfoo <- liftIO checkFoo
+ if needfoo
+ then ensureProperty foo
+ else ensureProperty bar
+
+In introspection mode, the liftIO is a no-op, but needs to return a Bool.
+That seems unlikely (how to pick which?), but even if some defaulting is
+used, only one of foo or bar's info will be seen.
+
+Another approach could be something like this:
+
+ withInfoFrom foo $ \callfoo ->
+ withInfoFrom bar $ \callbar ->
+ property "demo" = do
+ needfoo <- liftIO checkFoo
+ if needfoo
+ then callfoo
+ else callbar
+
+Here withInfoFrom is able to add foo and bar's Info to the info of the
+property that (may) call them.
+
+This approach is not fully type safe; it would be possible to call
+withInfoFrom in a way that didn't let it propigate the info.
+
+Also it has the problem that it doesn't support this:
+
+ property "demo" = do
+ needfoo <- liftIO checkFoo
+ if needfoo
+ then do
+ foop <- liftIO getFooParam
+ ensureProperty (foo foop)
+ else ensureProperty bar
+
+----
+
+Currently, ensureProperty detects if it's called on a property with a
+non-empty Info, and prints a warning. Would prefer to handle this at the
+type level though..