[Freeipa-devel] Optionistic approach for new DNS API

Endi Sukma Dewata edewata at redhat.com
Fri Dec 16 01:24:25 UTC 2011


On 12/15/2011 4:03 PM, Martin Kosek wrote:
>> If we use the raw data, it should be specified as an option instead of
>> an argument:
>>
>>     ipa dnsrecord-mod ZONE NAME --type=mx \
>>       --rec-data="10 server1.example.com." --new-preference=20
>
> I was also thinking about using current param "--mx-rec":
>
>      ipa dnsrecord-mod ZONE NAME --mx-rec="10 server1.example.com." \
>        --mx-preference=20
>
> But this would be a misuse and unexpected behavior. A new option would
> be better for that.

I'm OK with either options. The help doc describes the --mx-rec option 
as a "comma-separated list of MX records". It doesn't say how the 
parameter should be used. We could say the mod command can be used in 2 
different modes.

In the first mode (the original) the command modifies the entire record 
object and the --<RRTYPE>-rec is used to specify the new records.

In the second mode the command modifies a record specified in the 
--<RRTYPE>-rec. It also syntactically means we could perform the same 
modification against several records at once, although I'm not sure if 
it makes sense:

   ipa dnsrecord-mod ZONE NAME \
     --mx-rec="10 server1.example.com.,10 server2.example.com."
     --mx-preference=20

> Current command can do that:
>      ipa dnsrecord-del ZONE NAME --mx-rec="10 server1.example.com."
> We have this behavior for free.

This is probably another reason to use the same --mx-rec option in mod.

>> Alternatively we can use separate option for each parameter:
>>
>>     ipa dnsrecord-mod ZONE NAME --type=mx \
>>       --preference=10 --exchanger=server1.example.com. \
>>       --new-preference=0
>>
>>     ipa dnsrecord-del ZONE NAME --type=mx \
>>       --preference=10 --exchanger=server1.example.com.
>>
>> Or we can support both.
>
> I think I would implement the first option first. We can extend if we
> see it is useful. My point is that I don't think use would bother
> constructing structured DNS record from its options in dnsrecord-del/mod
> (fill --preference and --exchanger) but rather copy&paste raw DNS value
> or use the interactive mode.

It might be useful for someone writing an application using the CLI. 
This way we don't need to know the order of the parameters.

It's a low priority, but we should plan what parameter names we're going 
to use in the future. If now we use --mx-preference to specify the new 
value, later when we implement the new mechanism we will need to use 
something like --mx-old-preference to specify the old value. I'd rather 
use --mx-new-preference for the new value.

>>> - SHOW and FIND commands do not need this new --type parameter
>>
>> We can also add --types to specify the record types we want to get back
>> in the result. This could be useful in case we want to refresh a certain
>> table only in the record details page. Low priority.
>
> Ok, noted as an idea for enhancement. I would rather like to create a
> functional minimalistic API first and add all the bells and whistles
> later when we see it is useful.

OK.

>> BTW, I'd rather use --rec-type instead of just --type because 'type'
>> seems to be more generic. In case a certain DNS record type also has a
>> 'type' parameter, it might conflict with that. Another possibility is to
>> use a prefix for all type-specific options, e.g. --mx-preference.
>
> Actually, I was discussing this with Honza today. The problem is that we
> can't add conflicting options to one command (e.g. --preference for MX
> record and --preference for KX record). We would have to use
> --mx-preference and --kx-preference anyway.

It probably depends on how it's actually implemented. I suppose it's 
possible to keep a separate list of options for each type-specific 
command, then merge the lists for the main dnsrecord-add/mod/del command 
while removing duplicates. But using prefix is OK too.

> This would also remove the necessity to use --rec-type at all. I think
> we could detect the type from the options that were passed. I.e. when
> the following command is passed:
>
>     ipa dnsrecord-add ZONE NAME --mx-preference=0 --mx-exchanger=server1.example.com.
>
> We know that MX record is being created.

Without the --rec-type, it's syntactically possible to add/mod/del 
multiple RR types at once. I'm not sure if we want to support that:

   ipa dnsrecord-mod ZONE NAME \
     --mx-preference=0 --mx-exchanger=server1.example.com \
     --mx-new-preference=1
     --kx-preference=0 --kx-exchanger=server1.example.com \
     --kx-exchanger=server2.example.com

>>> - ADD command:
>>>     - when no option is passed to dnsrecord-add command, it may ask for
>>> --type and then for the options specific for the particular type
>>> - MOD command:
>>>     - when no option is passed to dnsrecord-mod command, it may provide a
>>> list of current DNS record values and ask for specific DNS record parts
>>> to be changed for chosen value
>>> - DEL command:
>>>     - when no option is passed to dnsrecord-del command, it may provide a
>>> list of current DNS record values remove the chosen value
>>
>> For consistency the mod&  del commands can also ask for the type, then
>> show the list of records in that type. This way the list can be shown in
>> a nicely formatted table rather than just raw data.
>
> IMO the interactive help I described is more effective - use just has to
> choose a record and start modification for a specific RR type. With your
> proposal, he would have to choose a type, then choose a record of that
> type and then start the modification - 2 steps instead of 1.

The difference is not that big. Also if we keep the --rec-type option we 
can skip the first step:

   ipa dnsrecord-mod ZONE NAME --rec-type=mx

> (And I don't think that formatting nice tables with records in CLI
> would be a priority).

Table is a compact way to show the data while still describing what the 
values in the raw data mean.

   No.  Preference   Exchanger
   --------------------------------------
   1.   10           server1.example.com.
   2.   20           server2.example.com.

Without table we might have to label each value:

   Record #1
   Preference: 10
   Exchanger: server1.example.com.

   Record #2
   Preference: 10
   Exchanger: server2.example.com.

or just show the raw data without labels:

   1) MX: "10 server1.example.com."
   2) MX: "20 server2.example.com."
   3) SRV: "0 100 464 ldap"

My preference would be using the table, but the other options are still 
acceptable.

-- 
Endi S. Dewata




More information about the Freeipa-devel mailing list