[Freeipa-devel] [RFE] Warnings and client capabilities (Was: [PATCH] 0062 Don't crash when server returns extra output)

Jan Cholasta jcholast at redhat.com
Thu Oct 25 14:55:45 UTC 2012


Hi,

On 23.10.2012 17:57, Petr Viktorin wrote:
> Here is a draft design document for ticket 2732.
> Please comment on both the feature itself, and on how to write design
> documents.
> Petr¹, please add how the UI should handle this.
>
> == Ticket summary ([https://fedorahosted.org/freeipa/ticket/2732 #2732]) ==
>
> Currently the only way to display a warning on client is to raise
> NonFatalError. This is not particularly good, as it mutes normal command
> output and only one warning can be displayed at a time.
>
> Provide a mechanism for displaying arbitrary number of warnings and
> other messages on clients along with the normal command output.
>
> == Additional problem ==
>
> The client validates the response it receives from the server. If it
> gets any extra items, the validation fails. Relaxing our validation is
> not an option. To support older clients, we need a mechanism for
> backwards-incompatible extensions to the API.
>
> == Solution ==
>
> === Backend ===
>
> Introduce a "capability" mechanism for backwards-incompatible API
> changes. The first capability will be "warnings": a client with this
> capability can get an extra key in the response dictionary, "warnings",
> which contains a list of non-fatal error messages.
>
> Capabilities are determined by API version. The version is linear; it is
> not possible for a client to support any custom subset of capabilities.
>
> If a client does not send an API version number, we will assume this is
> a testing client (such as a curl from the command line). Such a client
> is assumed to have all capabilities, but it will always receive a
> warning saying that forward compatibility is not guaranteed if the
> version number is not sent.

I think this has potential to break stuff. An old client unaware of 
capabilities might not send version and as a result receive unexpected 
data, which might trigger some error.

>
> Capabilities will be recorded in API.txt. When a new one is added, the
> API version must be incremented.
>
> All Commands will be updated to explicitly list 'version?' as one of
> their options in API.txt (most already do, and all take it).
>
> A missing version option will be set as part of validation/filling in
> defaults, so execute() will always get it.
>
> Helper methods will be available for checking a capability and for
> adding a warning to the result:
>
>      add_warning(version, result, _("What you're doing is a bad idea"))
>
> will be equivalent to:
>
>      if client_has_capability(version, 'warnings'):
>          result.setdefault('warnings', []).append(_("What you're doing
> is a bad idea"))
>

Here's a couple of things to consider:

   * There should be an API that doesn't require the version and result 
arguments, because they might not be at hand when a warning needs to be 
issued (e.g. in pre/post command callbacks or utility functions).

   * There should be more message levels than just "warning". I think it 
should be at least "error", "warning", "info".

     I have included "error" here, because currently we can't send more 
than one error back to the client, but it might be handy:

     # ipa command --opt1 ugly --opt2 uglier
     ipa: ERROR: invalid 'opt1': must be an integer
     ipa: ERROR: invalid 'opt2': must be at least 10 characters

   * We have numeric codes for errors, perhaps we should have them for 
warnings as well.

   * We might want to integrate this with the standard Python warnings 
module <http://docs.python.org/library/warnings.html>.

>
> === Frontend ===
>
> In the CLI, warnings will be printed after the normal command
> output.Example (from [https://fedorahosted.org/freeipa/ticket/2563 #2563])
>
>    # ipa dnsrecord-add --ttl=555 localnet r1 --txt-rec=TEST
>      Record name: r1
>      Time to live: 555
>      A record: 1.2.3.4
>      TXT record: TEST
>     Warnings:
>         It's not possible to have two records with same name and
> different TTL values.

I would prefer if we did the same thing as we do for errors here, so 
that warnings are printed to stderr and can be clearly distinguished 
from normal command output:

# ipa dnsrecord-add --ttl=555 localnet r1 --txt-rec=TEST
ipa: WARNING: It's not possible to have two records with same name and 
different TTL values
   Record name: r1
   Time to live: 555
   A record: 1.2.3.4
   TXT record: TEST

>
> The Web UI will display warnings in a modal message box.
>

Honza

-- 
Jan Cholasta




More information about the Freeipa-devel mailing list