> On May 19, 2015, at 05:59, exar...@twistedmatrix.com wrote:
> 
> On 12:07 pm, zadka.mo...@gmail.com wrote:
>> Background
>> 
>> Currently, "twistd" assumes one-run-one-plugin. It would be nice to load up
>> multiple plug-ins in Twisted, for many reasons. These include: serving the
>> same in-memory content via separate protocols, adding manhole to other
>> plug-ins (so the end-deployer can add it to other things, as opposed to the
>> original implementor, and a catch-all category of "auxiliary services".
>> 
>> Auxiliary services are those which are not useful in and of themselves, but
>> add value to a service which does something else of use.
>> 
>> Examples of auxiliary services -- a logging service (that connects to some
>> logging protocol on start-up), a metrics service (that sends statistics to
>> a collector like statsd or riemann) or an error-sending service (to
>> something like Sentry).
>> 
>> Proposal
>> 
>> tl;dr: four new tickets (codenamed SUBCOMMANDS, SERVICES, MANHOLE and
>> PROVIDERS) and one old ticket (3538)
>> 
>> SUBCOMMANDS: Add '+' as a special character in t.p.usage.Options. This
>> behavior will be off by default, and controlled by an attribute on the
>> Options instance "allowMultipleSubcommands".
>> 
>> The attribute will only be checked when the first sub-command starts, to
>> allow setting it based on global flags. When the option is on, '-+' will be
>> passed as '+' to the Options instance, to allow sending plain '+' to
>> sub-commands.
> 
> Having a new, weird, fragile syntax is probably the least interesting part of 
> this.  I suggest not doing this part - or at the very least, not doing it 
> first and not making it a general part of `Options`.
> 
> There are lots of other ways to get the service object from more than one 
> service plugin.  For example, read lines from a file.  Or have a variation of 
> `--python` or something else similar using the existing option syntax 
> `Options` supports.
> 
> The more interesting part to get right is the underlying model which you 
> discuss elsewhere.

I love new, weird syntaxes, but I have to agree here.  Let's do it with a 
boring syntax with no compatibility implications first.  The boring syntax 
would actually be quite similar to the exciting one; a "compose" plugin.  
Consider: "twistd compose web --path . + words --irc-port=6789".  There's no 
need to make this a general feature of Options to do it this way; just have the 
"compose" plugin take its argument list and pass it to two discrete other 
Options instances as lists of strings, looking for a "+" simply as the place to 
split the argument list.  You could also find some other way to split the 
argument list but "+" doesn't seem particularly obscure in this context to me.  
(If there's really a need to pass a literal "+" to a plugin we could add an 
escaping syntax as well.)

>> Glyph thinks there's a ticket for it. I couldn't find it in "search for
>> tickets in 'core' whose description mentionds 'command'". Unless anyone can
>> find it, I'll open a new ticket.
> 
> I think there is a ticket for being able to use multiple twistd plugins. I 
> don't think there's a ticket for a general change to `Options`.

I was referring to the multiple-twistd-plugin ticket.

>> SERVICES (depends on SUBCOMMANDS): In twistd, set the flag aMS if
>> '--allow-multiple-services' is given. Add to the application all services.
> 
> If you skip the `SUBCOMMANDS` ticket described above, then you can skip this 
> too.
>> 3538 (depends on SERVICES): If '--allow-multiple-services' is given, and
>> '--python <.tac file>' is given, process subcommands as usual.
> 
> Or just process the tac file and the subcommand if they're both given - 
> without requiring an extra option?  The current behavior, "silently ignore 
> one of the arguments", doesn't seem particularly worth keeping to me.

It seems halfway plausible to me that someone could have some automation that 
chooses a plugin and/or a python file and expects that one or the other will be 
ignored.  So we should do the usual incompatibility-notification dance but I 
don't anticipate any objections.

>> PROVIDERS: Add a function,
>>      "providersInHierarchy(IService, IInterface) -> List[IInterface]"
>> that returns all services in the hierarchy which provide the interface.
>> This ticket does not depend on any other tickets.
> 
> The first argument needs to be `IServiceCollection` instead of `IService`.
>> MANHOLE (depends on PROVIDERS, SERVICES): Add a built-in twistd plugin
>> named "manhole". The plugin will expose manhole as PB/telnet with a
>> namespace that includes
>> {'services': providersInHierarchy(manholeService, IService)}
>> This ticket technically could only depend on PROVIDERS, but to be useful,
>> it also depends on SERVICES
> 
> Manhole is part of Conch now and the telnet manhole is deprecated (and the PB 
> manhole really should be deprecated - using a structured protocol for manhole 
> isn't a bad idea but the existing implementation is half broken, mostly 
> untested, exposes tons of implementation details as part of the public 
> interface, etc.  If this were a piece of widely used software it would 
> probably be worth gradually renovating - but it's basically used by no one so 
> starting fresh makes more sense).
> 
> So it's part of Conch.  And ... it exists already.  I'm pretty sure no one 
> will object if you add a new name to the default namespace.
> 
> Thanks for taking this on.

Yeah.  It's great to have you around again, Moshe :).

-glyph


_______________________________________________
Twisted-Python mailing list
Twisted-Python@twistedmatrix.com
http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python

Reply via email to