On 05/15/2014 04:30 PM, Nick Coghlan wrote:
On 05/15/2014 09:36 AM, Matt Jia wrote:
> I agree with amit, I donnot see any point of having a ordering between
"onabort", "onfail" and "onwarn here.
>
> Based on my understanding, correct me if I am wrong. To determine whether or not the
system is actually reserved
> in the relevant situations:
>
> - never = never reserve system
> - onabort = reserve system if the recipe status is onabort
> - onfail = reserve system if the recipe status is oncompleted and the recipe result
is onfail
> - onwarn = reserve system if the recipe status is oncompleted and the recipe result
is onwarn
So how do I express the following?:
- reserve if it fails *or* aborts
- reserve it it warns, fails *or* aborts
More importantly, what is the use case for reserving *only* if it fails,
but not if it aborts, and *only* if it warns, but not if it fails or aborts?
My contention is that the "simple" meanings for "onfail" and
"onwarn"
are actually useless from an end user perspective, and the "implied or"
approach is far more useful.
From a docs perspective, explaining it in terms of implications rather
than "ordering" may be clearer. So:
- never
- onabort
- onfail (implies onabort)
- onwarn (implies onfail and onabort)
- always
And then the individual meanings are still:
- never = never reserve system
- onabort = reserve system if the recipe status is Abort
- onfail = reserve system if the recipe status is Complete and the
recipe result is Fail
- onwarn = reserve system if the recipe status is Complete and the
recipe result is Warn
- always = reserve system if the recipe status is Abort or Complete
From an implementation perspective, those checks then become something like:
def should_reserve(status, result, when):
# check the recipe is actually finished
if status not in (Abort, Complete):
return False
# check the status and result independent options
if when == ReserveAlways:
return True
if when == ReserveNever:
return Falsenick
# check for an aborted recipe
# onfail and onwarn both imply onabort
if status == Abort:
return True
if when == ReserveOnAbort:
return False
# check for a failed recipe
# onwarn implies onfail
if result == Fail:
return True
if when == ReserveOnFail:
return False
# only thing left to do is check for a warning
assert when == ReserveOnWarn
return result == Warn
Cheers,
Nick.
+1, we can take amit's idea to remove "never" here.
Cheers, Matt Jia