On Fri, Mar 07, 2014 at 12:48:31PM +0100, Pavel Březina wrote:
> On 03/07/2014 12:00 PM, Jakub Hrozek wrote:
> >On Fri, Mar 07, 2014 at 11:08:17AM +0100, Pavel Březina wrote:
> >>On 02/25/2014 10:11 AM, Pavel Březina wrote:
> >>>On 02/24/2014 01:17 PM, Jakub Hrozek wrote:
> >>>>On Mon, Feb 24, 2014 at 12:32:04PM +0100, Pavel Březina wrote:
> >>>>>https://fedorahosted.org/sssd/wiki/DesignDocs/DBusResponder
> >>>>>
> >>>>>Hi, I couldn't find the original thread so I'm starting a new
> >>>>>one.
> >>>>
> >>>>The design was reviewed in a private thread mostly as the API
> >>>>evolved organically from a proof of concept. You're right we
> >>>>should have followed up on the devel list.
> >>>>
> >>>>>I would like us to agree on best practice of naming methods. The
> >>>>>current design is somewhat inconsistent, since it uses e.g.
> >>>>>FindUserByName(name) and GetDomain(name) for obtaining one
> >>>>>object path by name.
> >>>>>
> >>>>>I'm proposing the following convention: * List<class>()
> >>>>>returning array of object paths, no arguments - ListUsers -
> >>>>>ListDomains * Find<class><condition>(arg1, ...) returning array
> >>>>>of object paths - FindUsersByName(filter) -
> >>>>>FindGroupsByName(filter) * Get<class><condition>(arg1, ...)
> >>>>>returning single object path - GetUserById(id) -
> >>>>>GetDomainByName(name)
> >>>>
> >>>>FWIW, I modeled the API based on the existing AccountsService API
> >>>>and Nalin's subsequent redesign document. I agree that more
> >>>>consistent API would be good, but I would prefer to always use
> >>>>Find everywhere to avoid clashing with Get/GetAll from
> >>>>DBus.Properties.
> >>>
> >>>Simple D-Bus API design:
> >>>https://fedorahosted.org/sssd/wiki/DesignDocs/DBusSimpleAPI
> >>>
> >>>I suggested this convention namely for the following three functions:
> >>>* char ** sss_dbus_invoke_list * char ** sss_dbus_invoke_find * char
> >>>*  sss_dbus_invoke_get
> >>>
> >>>These functions invoke [List|Find|Get]<method> D-Bus method and
> >>>parse the result into either array of object path (list, find) or
> >>>single item (get).
> >>>
> >>>If we strictly follow the convention (or other we agree on), it will
> >>>allow us to expose new D-Bus methods via this API without actually
> >>>modifying the API which I find quite nice.
> >>>
> >>>You can oppose that user still needs to remember D-Bus method name
> >>>and its arguments but I think this is a good compromise between
> >>>simplicity and generality. Also user can provide invalid method name
> >>>or invalid arguments but than it will simply return an error as it
> >>>would do so with libdbus.
> >>
> >>I have done few changes into the API:
> >>
> >>* A statement about multi threaded usage was added: each thread needs to
> >>   use its own context.
> >>
> >>* Error reporting changed. Previously, the functions returned structure
> >>   (code, message), but this proved to be quite an inconvenience.
> >>   Since the only purpose of returning message was to pass a D-Bus error
> >>   to user, I changed it to:
> >>   - return only error code
> >>   - save last D-Bus error in sss_dbus context
> >>   - provide a function to fetch this error
> >
> >I general, I think the proposal is good. I have a couple of comments:
> >
> >* I still disagree that we should use Get* at all in the DBus API, but
> >   rather we should use FindXXXX only to avoid clashing with the
> >   ObjectManager API
> 
> Sure, I don't really oppose. I just want to see consistency between
> method prefix and returned value.
> 
> So should we have List* without parameters, Find* with parameters
> both returning array of object class?
> 
> Or List* with parameters, returning array of object class, and Find*
> with parameters, returning single object class?

I like this approach better. I'm (finally!) able to do some more DBus
responder work today and I'm incorporating some input from Stef into the
design page. I would appreciate your feedback. I'll reply to this thread
when I'm done.

> 
> >* Please add a comment to the header saying that the interface is
> >   minimal on purpose and the user should use the full DBus power
> >   instead. Yes, this conflicts with the next point somewhat, but I think
> >   we should strike the right balance.
> 
> OK.
> 
> >* The API is a wrapper around DBus interface that is supposed to shield
> >   you from DBus completely. I wonder if the API should simply do
> >   s/dbus/ifp/ ?
> 
> I actually never wanted to shield D-Bus completely. I wanted it only
> to hide the complex things (error handling, many calls to D-Bus API
> to simply send a message, parsing attributes, ...).

Fair enough. I saw both complaints from potential consumers -- some
developers were going "omg dbus is such a heavyweight desktop technology,
do I really need to use it" ? I realize 'hiding' dbus behind a different
name might be a little irrational, but so were their concerns in my
opinion.

> 
> >* Similar for accepting method names as parameters. I see the point in
> >   having a lot of flexibility, but it seems like the interface is
> >   exposing too many details this way and being a bit error-prone (Do I
> >   user "user" or "User"? What happens if you use a class that doesn't
> >   exist?)
> 
> I think the flexibility here is a very key point. It will allow you
> to use the API without adding new functions/enum for every new
> object we expose in SSSD. I wanted to avoid this.
> 
> If you put an invalid method, it is the same as if you use D-Bus and
> put there an invalid method. It will error out with a nice message
> coming from D-Bus explaining what's wrong.

How often would we add new objects?

But I'm not too opposed, anyway.

> 
> >   What about adding an enum that would encapsulate the types and passing
> >   an enum instead of a free-form name? So instead of:
> >     ret = sss_dbus_invoke_list(ctx, "user", &paths);
> >     ret = sss_dbus_invoke_list(ctx, "group", &paths);
> >   you would call:
> >     ret = sss_ifp_invoke_list(ctx, IFP_CLS_USR, &paths);
> >     ret = sss_ifp_invoke_list(ctx, IFP_CLS_GRP, &paths);
> 
> 
> I thought of it. But then again, you will add a new object class,
> say sudorules. You will need to amend the library as well.
> 
> If we do this, we would also have to create symbols for every
> method. To make the check complete, we would have to also check
> parameters of every method. Doing it on compile time would require
> to create a function for every method we want to expose via this
> library.
> 
> It's getting kinda big, isn't it?
> 
> >* The API still uses types:
> >     sss_dbus_invoke_get(sss_dbus_ctx *ctx, const char *method,
> >                         char **_object_path, int first_arg_type, ...);
> >    Didn't we say the API should be type-less and everythign should be a
> >    string?
> 
> Did we agree also on input attribute? I think we said this to be
> true only for output.

Ah, I see. Yes, it would be possible to deduct the type from the method,
but let's not do that. Especially if the goal is not to build a layer
that shields from dbus completely.

> 
> >* Similarly, find_attr_as_string could drop the _string suffix.
> 
> It's meant that attributes are arrays, in general. _string will
> return it only as single value, _array will return it as is. Do you
> have a better name?

Simply find_attr(). Just drop the suffix.

> 
> >* I think we could remove sss_dbus_fetch_attrs() and only allow
> >   either one attribute or all of them. The bus would publish them all 
> > anyway.
> 
> How so? Properties.Get should return only one attribute at time,
> GetAll all of them.

Right, that's what I'm saying. I don't get the point of a function that
only lets you filter some attributes, it seems that a single attribute
or all of them would be OK.

> 
> >* How does the API deal with requesting an object that is not yet
> >   published on the bus? There should be an error code for this (common)
> >   mistake
> 
> D-Bus error. The same as if you would request it via D-Bus.

OK. Needs a special error code, though.
_______________________________________________
sssd-devel mailing list
sssd-devel@lists.fedorahosted.org
https://lists.fedorahosted.org/mailman/listinfo/sssd-devel

Reply via email to