Looks good to me. Thanks for quickly making the changes! Great work! Best regards,
Randall > On May 16, 2018, at 8:07 PM, Magesh Nandakumar <mage...@confluent.io> wrote: > > Randall, > > I have adjusted the package names per Ewen's suggestions and also made some > minor edits per your suggestions. Since there are no major outstanding > issues, i'm moving this to vote. > > Thanks > Magesh > >> On Wed, May 16, 2018 at 4:38 PM, Randall Hauch <rha...@gmail.com> wrote: >> >> A few very minor suggestions: >> >> >> 1. There are a few formatting issues with paragraphs that use a >> monospace font. Minor, but it would be nice to fix. >> 2. Would be nice to link to the PR >> 3. Do we need the org.apache.kafka.connect.rest.extension.entities >> package? Could we just move the two classes into the parent >> org.apache.kafka.connect.rest.extension package? >> 4. This sentence "The above approach helps alleviate any issues that >> could arise if Extension accidentally reregister the" is cut off. >> 5. The "ConnectRestExtensionContext.configure(...)" method's JavaDoc >> should describe the behaviors that are mentioned in the "Rest Extension >> Integration with Connect" section; e.g., behavior when an extension >> adds a >> resource that is already registered, whether unregistering works, etc. >> Also, ideally the "close()" method would have JavaDoc that explained >> when >> it is called (e.g., no other methods will be called on the extension >> after >> this, etc.). >> 6. Packaging requirements are different for this component vs >> connectors, transformations, and converters, since this now mandates the >> Service Loader manifest file. This should be called out more explicitly. >> 7. It'd be nice if the example included how extension-specific config >> properties are to be defined in the worker configuration file. >> >> As I said, these are all minor suggestions that only affect the KIP >> document. Once these are fixed, I think this is ready to move to voting. >> >> Best regards, >> >> Randall >> >> On Tue, May 15, 2018 at 11:30 AM, Magesh Nandakumar <mage...@confluent.io> >> wrote: >> >>> Randall- I think I have addressed all the comments. Let me know if we can >>> take this to Vote. >>> >>> Thanks >>> Magesh >>> >>> On Tue, May 8, 2018 at 10:12 PM, Magesh Nandakumar <mage...@confluent.io >>> >>> wrote: >>> >>>> Hi All, >>>> >>>> I have updated the KIP to reflect changes based on the PR >>>> https://github.com/apache/kafka/pull/4931. Its mostly has minor >> changes >>>> to the interfaces and includes details on packages for the interfaces >> and >>>> the classes. Let me know your thoughts. >>>> >>>> Thanks >>>> Magesh >>>> >>>> On Fri, Apr 27, 2018 at 12:03 PM, Randall Hauch <rha...@gmail.com> >>> wrote: >>>> >>>>> Great work, Magesh. I like the overall approach a lot, so I left some >>>>> pretty nuanced comments about specific details. >>>>> >>>>> Best regards, >>>>> >>>>> Randall >>>>> >>>>> On Wed, Apr 25, 2018 at 3:03 PM, Magesh Nandakumar < >>> mage...@confluent.io> >>>>> wrote: >>>>> >>>>>> Thanks Randall for your thoughts. I have created a replica of the >>>>> required >>>>>> entities in the draft implementation. If you can take a look at the >> PR >>>>> and >>>>>> let me know your thoughts, I will update the KIP to reflect the same >>>>>> >>>>>> https://github.com/apache/kafka/pull/4931 >>>>>> >>>>>> On Tue, Apr 24, 2018 at 11:44 AM, Randall Hauch <rha...@gmail.com> >>>>> wrote: >>>>>> >>>>>>> Magesh, I think our last emails cross in mid-stream. >>>>>>> >>>>>>> We definitely want to put the new public interfaces/classes in the >>> API >>>>>>> module, and implementation in the runtime module. Yes, this will >>>>> affect >>>>>> the >>>>>>> design, since for example we don't want to expose runtime types to >>> the >>>>>> API, >>>>>>> and we want to prevent breaking changes. We don't really want to >>> move >>>>> the >>>>>>> REST entities if we don't have to, since that may break projects >>> that >>>>> are >>>>>>> extending the runtime module -- even though the runtime module is >>> not >>>>> a >>>>>>> public API we still want to _try_ to change things. >>>>>>> >>>>>>> Do you want to try to create a prototype to see what kind of >> impact >>>>> and >>>>>>> choices we'll have to make? >>>>>>> >>>>>>> Best regards, >>>>>>> >>>>>>> Randall >>>>>>> >>>>>>> On Tue, Apr 24, 2018 at 12:48 PM, Randall Hauch <rha...@gmail.com >>> >>>>>> wrote: >>>>>>> >>>>>>>> Thanks for updating the KIP, Magesh. You've resolved all of my >>>>>> concerns, >>>>>>>> though I have one more: we should specify the package names for >>> all >>>>> new >>>>>>>> interfaces/classes. >>>>>>>> >>>>>>>> I'm looking forward to more feedback from others. >>>>>>>> >>>>>>>> Best regards, >>>>>>>> >>>>>>>> Randall >>>>>>>> >>>>>>>> On Fri, Apr 20, 2018 at 12:17 AM, Magesh Nandakumar < >>>>>>> mage...@confluent.io> >>>>>>>> wrote: >>>>>>>> >>>>>>>>> Hi All, >>>>>>>>> >>>>>>>>> I have updated the KIP with following changes >>>>>>>>> >>>>>>>>> 1. Expanded the Motivation section >>>>>>>>> 2. Included details about the interface in the public >>> interface >>>>>>> section >>>>>>>>> 3. Modified the config name to rest.extension.classes >>>>>>>>> 4. Modified the ConnectRestExtension to include Configurable >>>>>> instead >>>>>>> of >>>>>>>>> ResourceConfig >>>>>>>>> 5. Modified the "Rest Extension Integration with Connect" in >>>>>>> "Proposed >>>>>>>>> Approach" to include a new Custom implementation for >>>>> Configurable >>>>>>>>> 6. Provided examples for the Java Service provider mechanism >>>>>>>>> 7. Included a reference implementation in scope >>>>>>>>> >>>>>>>>> Kindly let me know your thoughts on the updates. >>>>>>>>> >>>>>>>>> Thanks >>>>>>>>> Magesh >>>>>>>>> >>>>>>>>> On Thu, Apr 19, 2018 at 10:39 AM, Magesh Nandakumar < >>>>>>> mage...@confluent.io >>>>>>>>>> >>>>>>>>> wrote: >>>>>>>>> >>>>>>>>>> Hi Randall, >>>>>>>>>> >>>>>>>>>> Thanks for your feedback. I also would like to go with >>>>>>>>>> rest.extension.classes`. >>>>>>>>>> >>>>>>>>>> For exposing Configurable, my original intention was just to >>>>> expose >>>>>>> that >>>>>>>>>> to the extension because that's all one needs to register JAX >>> RS >>>>>>>>> resources. >>>>>>>>>> The fact that we use Jersey shouldn't even be exposed in the >>>>>>> interface. >>>>>>>>>> Hence it doesn't affect the public API by any means. >>>>>>>>>> >>>>>>>>>> I will update the KIP and let everyone know. >>>>>>>>>> >>>>>>>>>> Thanks >>>>>>>>>> Magesh >>>>>>>>>> >>>>>>>>>> On Thu, Apr 19, 2018 at 9:51 AM, Randall Hauch < >>> rha...@gmail.com >>>>>> >>>>>>>>> wrote: >>>>>>>>>> >>>>>>>>>>> On Thu, Apr 12, 2018 at 10:59 AM, Magesh Nandakumar < >>>>>>>>> mage...@confluent.io >>>>>>>>>>>> >>>>>>>>>>> wrote: >>>>>>>>>>> >>>>>>>>>>>> Hi Randall, >>>>>>>>>>>> >>>>>>>>>>>> Thanks a lot for your feedback. >>>>>>>>>>>> >>>>>>>>>>>> I will update the KIP to reflect your comments in (1), >> (2), >>>>> (7) >>>>>> and >>>>>>>>> (8). >>>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> Looking forward to these. >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> For comment # (3) , while it would be great to >> automatically >>>>>>>>> configure >>>>>>>>>>> the >>>>>>>>>>>> Rest Extensions, I would prefer that to be specified >>>>> explicitly. >>>>>>> Lets >>>>>>>>>>>> assume a connector archive includes a implementation for >> the >>>>>>>>>>> RestExtension >>>>>>>>>>>> to do authentication using some header. We don't want this >>> to >>>>> be >>>>>>>>>>>> automatically included. Having said that I think that the >>>>> config >>>>>>> key >>>>>>>>>>> name >>>>>>>>>>>> should probably be changed to something like >>> "rest.extension" >>>>> or >>>>>>>>>>>> "rest.extension.class". >>>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> That's a good point. I do like `rest.extension.class` (or >>>>>>> `..classes`?) >>>>>>>>>>> much more than `rest.plugins`. >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> For the comment regarding the resource loading into >> jersey, >>> I >>>>>> have >>>>>>>>> the >>>>>>>>>>>> following proposal >>>>>>>>>>>> >>>>>>>>>>>> Create an implementation of Configurable( >>>>>>>>>>>> https://docs.oracle.com/javaee/7/api/javax/ws/rs/core/ >>> Config >>>>>>>>> urable.html >>>>>>>>>>> ) >>>>>>>>>>>> that delegates to ResourceConfig. In the >>>>> ConnectRestExtension, we >>>>>>>>> would >>>>>>>>>>>> expose only Configurable which is sufficient enough to >>>>> register >>>>>> new >>>>>>>>>>>> resources. In the new implementation, we will check if the >>>>>> resource >>>>>>>>> is >>>>>>>>>>>> already registered using ResourceConfig.isRegistered() >>> method >>>>> and >>>>>>>>> log a >>>>>>>>>>>> warning if the resource is already registered. This will >>> make >>>>> it >>>>>> a >>>>>>>>>>>> deterministic behavior and avoid any potential >>>>> re-registrations. >>>>>>> Let >>>>>>>>> me >>>>>>>>>>>> know your thoughts on these. >>>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> This sounds a good idea. Is it as flexible as the current >>>>> proposal? >>>>>>> If >>>>>>>>>>> not, >>>>>>>>>>> then I'd love to see how this affects the public APIs. >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> Thanks >>>>>>>>>>>> Magesh >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> On Wed, Apr 11, 2018 at 10:06 AM, Randall Hauch < >>>>>> rha...@gmail.com> >>>>>>>>>>> wrote: >>>>>>>>>>>> >>>>>>>>>>>>> Very nice proposal, Magesh. I like the approach and the >>> new >>>>>>>>> concepts >>>>>>>>>>> and >>>>>>>>>>>>> interfaces, but I do have a few comments/suggestions >> about >>>>> some >>>>>>>>>>> specific >>>>>>>>>>>>> details: >>>>>>>>>>>>> >>>>>>>>>>>>> 1. In the "Motivation" section, perhaps it makes >> sense >>> to >>>>>>>>> briefly >>>>>>>>>>>>> describe one or two somewhat concrete examples of how >>>>> this >>>>>> is >>>>>>>>>>> useful. >>>>>>>>>>>>> 2. Maybe in the "Public Interfaces" section you could >>>>>> briefly >>>>>>>>>>> describe >>>>>>>>>>>>> each of the interfaces, what they represent, and >> which >>>>> are >>>>>>>>>>> implemented >>>>>>>>>>>>> by >>>>>>>>>>>>> the framework vs implemented by an extension. I think >>>>> it'd >>>>>>> help >>>>>>>>> to >>>>>>>>>>>>> explain >>>>>>>>>>>>> that only the `ConnectRestPlugin` needs to be >>>>> implemented, >>>>>> and >>>>>>>>> the >>>>>>>>>>>> rest >>>>>>>>>>>>> will be provided by the framework. I know the next >>>>> section >>>>>>> goes >>>>>>>>>>> into >>>>>>>>>>>> it >>>>>>>>>>>>> a >>>>>>>>>>>>> bit, but it'd be useful in this section when first >>>>> talking >>>>>>> about >>>>>>>>>>> the >>>>>>>>>>>> new >>>>>>>>>>>>> interfaces. >>>>>>>>>>>>> 3. Also in the "Public Interfaces" section: I don't >>>>> think we >>>>>>>>> should >>>>>>>>>>>>> introduce a "rest.plugins" configuration property. >>>>> Instead, >>>>>>> can >>>>>>>>> we >>>>>>>>>>> not >>>>>>>>>>>>> just >>>>>>>>>>>>> instantiate and call all of the ConnectRestPlugins >> that >>>>> we >>>>>>> find >>>>>>>>> on >>>>>>>>>>> the >>>>>>>>>>>>> plugin path? Besides, it seems too close to the >>>>>> `plugin.path` >>>>>>>>>>>>> configuration >>>>>>>>>>>>> property. >>>>>>>>>>>>> 4. Why would the implementation register Connect >>>>> resources >>>>>>>>> *after* >>>>>>>>>>> the >>>>>>>>>>>>> plugins, if Jersey currently registers only the first >>>>> one? >>>>>> The >>>>>>>>>>>> "Rejected >>>>>>>>>>>>> Alternatives" mentions why, but this section should >> be >>>>>>> explicit >>>>>>>>>>> about >>>>>>>>>>>>> why. >>>>>>>>>>>>> For example, "The plugin's would be registered in the >>>>>>>>>>>>> RestServer.start(Herder herder) method before >>> registering >>>>>> the >>>>>>>>>>> default >>>>>>>>>>>>> Connect resources, which ensures that plugins cannot >>>>> remove >>>>>>>>> Connect >>>>>>>>>>>>> resources." >>>>>>>>>>>>> 5. "Hence, it is recommended that the plugins don't >>>>>>> re-register >>>>>>>>> the >>>>>>>>>>>>> default Connect Resources. This could potentially >> lead >>> to >>>>>>>>>>> unexpected >>>>>>>>>>>>> errors." First, we should not say "recommended" and >>>>> should >>>>>>> just >>>>>>>>> say >>>>>>>>>>>>> plugins >>>>>>>>>>>>> should not register any resources that conflict with >>> the >>>>>>>>> built-in >>>>>>>>>>>>> Connect >>>>>>>>>>>>> resources. Second, if the worker does find conflicts, >>>>> can we >>>>>>>>> just >>>>>>>>>>>> remove >>>>>>>>>>>>> them before adding the built-in Connect resources? >>>>>>>>>>>>> 6. Is it possible for implementations to check >> whether >>>>>>> resources >>>>>>>>>>>> already >>>>>>>>>>>>> exist before registering their own? If so, we should >>>>>> recommend >>>>>>>>> that >>>>>>>>>>>>> implementations do this and log any problems. >>>>>>>>>>>>> 7. We should be explicit that the "Service Provider" >> is >>>>>> Java's >>>>>>>>>>> Service >>>>>>>>>>>>> Provider API. We also need to be explicit that an >>>>>>> implementation >>>>>>>>>>> must >>>>>>>>>>>>> provide a `META-INF/services/org.apache. >> kafka.connect. >>>>>>>>>>>>> ConnectRestPlugin` >>>>>>>>>>>>> file (or whatever the package name of the >>>>>> `ConnectRestPlugin` >>>>>>>>> will >>>>>>>>>>> be) >>>>>>>>>>>>> with >>>>>>>>>>>>> the fully-qualified name of the implementation >>> class(es). >>>>>>>>>>>>> 8. The example should include the META-INF file >>> required >>>>> by >>>>>>> the >>>>>>>>>>>> Service >>>>>>>>>>>>> Provider API. >>>>>>>>>>>>> >>>>>>>>>>>>> Again, overall this is really great! >>>>>>>>>>>>> >>>>>>>>>>>>> Best regards, >>>>>>>>>>>>> >>>>>>>>>>>>> Randall >>>>>>>>>>>>> >>>>>>>>>>>>> On Wed, Apr 11, 2018 at 12:14 AM, Magesh Nandakumar < >>>>>>>>>>>> mage...@confluent.io> >>>>>>>>>>>>> wrote: >>>>>>>>>>>>> >>>>>>>>>>>>>> Hi, >>>>>>>>>>>>>> >>>>>>>>>>>>>> We have posted KIP-285: Connect Rest Extension Plugin >> to >>>>> add >>>>>>> the >>>>>>>>>>>> ability >>>>>>>>>>>>> to >>>>>>>>>>>>>> provide Rest Extensions to Connect Rest API. >>>>>>>>>>>>>> >>>>>>>>>>>>>> https://cwiki.apache.org/ >> confluence/display/KAFKA/KIP- >>>>>>>>>>>>>> 285%3A+Connect+Rest+Extension+Plugin >>>>>>>>>>>>>> >>>>>>>>>>>>>> Please take a look. Your feedback is appreciated. >>>>>>>>>>>>>> >>>>>>>>>>>>>> Thanks, >>>>>>>>>>>>>> >>>>>>>>>>>>>> Magesh >>>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>> >>>>>>>>>> >>>>>>>>> >>>>>>>> >>>>>>>> >>>>>>> >>>>>> >>>>> >>>> >>>> >>> >>