Re: [DISCUSS] KAFKA-4930 & KAFKA 4938 - Treatment of name parameter in create connector requests

2017-08-09 Thread Sönke Liebau
Could someone have a look at the PR for KAFKA-4930 if they get the chance
(not necessarily you Gwen, just bumping in general)? I've updated it
according to the latest comments a little while ago and would like to get
this done, before I forget what I did in case more changes are necessary :)

Thanks!

Jira: https://issues.apache.org/jira/browse/KAFKA-4930
PR: https://github.com/apache/kafka/pull/2755

On Thu, Jul 6, 2017 at 8:19 PM, Gwen Shapira  wrote:

> This sounds great. I'll try to review later today :)
>
> On Thu, Jul 6, 2017 at 12:35 AM Sönke Liebau
>  wrote:
>
> > I've updated the pull request to behave as follows:
> >  - reject create requests that contain no "name" element with a
> > BadRequestException
> >  - reject name that are empty or contain illegal characters with a
> > ConfigException
> >  - leave current logic around when to copy the name from the create
> request
> > to the config element intact
> >  - added unit tests for the validator to check that illegal characters
> are
> > correctly identified
> >
> > The list of illegal characters is the result of some quick testing I did,
> > all of the characters in the list currently cause issues when used in a
> > connector name (similar to KAFKA-4827), so this should not break anything
> > that anybody relies on.
> > I think we may want to start a larger discussion around connector names,
> > allowed characters, max length, ..  to come up with an airtight set of
> > rules that we can then enforce, I am sure this is currently not perfect
> as
> > is.
> >
> > Best regards,
> > Sönke
> >
> > On Wed, Jul 5, 2017 at 9:31 AM, Sönke Liebau  >
> > wrote:
> >
> > > Hi,
> > >
> > > regarding "breaking existing functionality" .. yes...that was me
> getting
> > > confused about intended and existing functionality :)
> > > You are right, this won't break anything that is currently working.
> > >
> > > I'll leave placement of "name" parameter as is and open a new issue to
> > > clarify this later on.
> > >
> > > Kind regards,
> > > Sönke
> > >
> > > On Wed, Jul 5, 2017 at 5:41 AM, Gwen Shapira 
> wrote:
> > >
> > >> Hey,
> > >>
> > >> Nice research and summary.
> > >>
> > >> Regarding the ability to have a "nameless" connector - I'm pretty sure
> > we
> > >> never intended to allow that.
> > >> I'm confused about breaking something that currently works though -
> > since
> > >> we get NPE, how will giving more intentional exceptions break
> anything?
> > >>
> > >> Regarding the placing of the name - inside or outside the config. It
> > looks
> > >> messy and I'm as confused as you are. I think Konstantine had some
> ideas
> > >> how this should be resolved. I hope he responds, but I think that for
> > your
> > >> PR, just accept current mess as given...
> > >>
> > >> Gwen
> > >>
> > >> On Tue, Jul 4, 2017 at 3:28 AM Sönke Liebau
> > >>  wrote:
> > >>
> > >> > While working on KAFKA-4930 and KAFKA-4938 I came across some sort
> of
> > >> > fundamental questions about the rest api for creating connectors in
> > >> Kafka
> > >> > Connect that I'd like to put up for discussion.
> > >> >
> > >> > Currently requests that do not contain a "name" element on the top
> > level
> > >> > are not accepted by the API, but that is due to a
> NullPointerException
> > >> [1]
> > >> > so not entirely intentional. Previous (and current if the lines
> > causing
> > >> the
> > >> > Exception are removed) functionality was to create a connector named
> > >> "null"
> > >> > if that parameter was missing. I am not sure if this is a good
> thing,
> > as
> > >> > for example that connector will be overwritten every time a new
> > request
> > >> > without a name is sent, as opposed to the expected warning that a
> > >> connector
> > >> > of that name already exists.
> > >> >
> > >> > I would propose to reject api calls without a name provided on the
> top
> > >> > level, but this might break requests that currently work, so should
> > >> > probably be mentioned in the release notes.
> > >> >
> > >> > 
> > >> >
> > >> > Additionally, the "name" parameter is also copied into the "config"
> > >> > sub-element of the connector request - unless a name parameter was
> > >> provided
> > >> > there in the original request[2].
> > >> >
> > >> > So this:
> > >> >
> > >> > {
> > >> >   "name": "connectorname",
> > >> >   "config": {
> > >> > "connector.class":
> > >> > "org.apache.kafka.connect.tools.MockSourceConnector",
> > >> > "tasks.max": "1",
> > >> > "topics": "test-topic"
> > >> >   }
> > >> > }
> > >> >
> > >> > would become this:
> > >> > {
> > >> >   "name": "connectorname",
> > >> >   "config": {
> > >> > "name": "connectorname",
> > >> > "connector.class":
> > >> > "org.apache.kafka.connect.tools.MockSourceConnector",
> > >> > "tasks.max": "1",
> > >> > "topics": "test-topic"
> > >> >   }
> > >> > }
> > >> >
> > >> > But a request that contains two different names like this:
> > >> >
> > >> >  {
> > >> >   "name": "connectorname",
> > >> >   "confi

Re: [DISCUSS] KAFKA-4930 & KAFKA 4938 - Treatment of name parameter in create connector requests

2017-07-06 Thread Gwen Shapira
This sounds great. I'll try to review later today :)

On Thu, Jul 6, 2017 at 12:35 AM Sönke Liebau
 wrote:

> I've updated the pull request to behave as follows:
>  - reject create requests that contain no "name" element with a
> BadRequestException
>  - reject name that are empty or contain illegal characters with a
> ConfigException
>  - leave current logic around when to copy the name from the create request
> to the config element intact
>  - added unit tests for the validator to check that illegal characters are
> correctly identified
>
> The list of illegal characters is the result of some quick testing I did,
> all of the characters in the list currently cause issues when used in a
> connector name (similar to KAFKA-4827), so this should not break anything
> that anybody relies on.
> I think we may want to start a larger discussion around connector names,
> allowed characters, max length, ..  to come up with an airtight set of
> rules that we can then enforce, I am sure this is currently not perfect as
> is.
>
> Best regards,
> Sönke
>
> On Wed, Jul 5, 2017 at 9:31 AM, Sönke Liebau 
> wrote:
>
> > Hi,
> >
> > regarding "breaking existing functionality" .. yes...that was me getting
> > confused about intended and existing functionality :)
> > You are right, this won't break anything that is currently working.
> >
> > I'll leave placement of "name" parameter as is and open a new issue to
> > clarify this later on.
> >
> > Kind regards,
> > Sönke
> >
> > On Wed, Jul 5, 2017 at 5:41 AM, Gwen Shapira  wrote:
> >
> >> Hey,
> >>
> >> Nice research and summary.
> >>
> >> Regarding the ability to have a "nameless" connector - I'm pretty sure
> we
> >> never intended to allow that.
> >> I'm confused about breaking something that currently works though -
> since
> >> we get NPE, how will giving more intentional exceptions break anything?
> >>
> >> Regarding the placing of the name - inside or outside the config. It
> looks
> >> messy and I'm as confused as you are. I think Konstantine had some ideas
> >> how this should be resolved. I hope he responds, but I think that for
> your
> >> PR, just accept current mess as given...
> >>
> >> Gwen
> >>
> >> On Tue, Jul 4, 2017 at 3:28 AM Sönke Liebau
> >>  wrote:
> >>
> >> > While working on KAFKA-4930 and KAFKA-4938 I came across some sort of
> >> > fundamental questions about the rest api for creating connectors in
> >> Kafka
> >> > Connect that I'd like to put up for discussion.
> >> >
> >> > Currently requests that do not contain a "name" element on the top
> level
> >> > are not accepted by the API, but that is due to a NullPointerException
> >> [1]
> >> > so not entirely intentional. Previous (and current if the lines
> causing
> >> the
> >> > Exception are removed) functionality was to create a connector named
> >> "null"
> >> > if that parameter was missing. I am not sure if this is a good thing,
> as
> >> > for example that connector will be overwritten every time a new
> request
> >> > without a name is sent, as opposed to the expected warning that a
> >> connector
> >> > of that name already exists.
> >> >
> >> > I would propose to reject api calls without a name provided on the top
> >> > level, but this might break requests that currently work, so should
> >> > probably be mentioned in the release notes.
> >> >
> >> > 
> >> >
> >> > Additionally, the "name" parameter is also copied into the "config"
> >> > sub-element of the connector request - unless a name parameter was
> >> provided
> >> > there in the original request[2].
> >> >
> >> > So this:
> >> >
> >> > {
> >> >   "name": "connectorname",
> >> >   "config": {
> >> > "connector.class":
> >> > "org.apache.kafka.connect.tools.MockSourceConnector",
> >> > "tasks.max": "1",
> >> > "topics": "test-topic"
> >> >   }
> >> > }
> >> >
> >> > would become this:
> >> > {
> >> >   "name": "connectorname",
> >> >   "config": {
> >> > "name": "connectorname",
> >> > "connector.class":
> >> > "org.apache.kafka.connect.tools.MockSourceConnector",
> >> > "tasks.max": "1",
> >> > "topics": "test-topic"
> >> >   }
> >> > }
> >> >
> >> > But a request that contains two different names like this:
> >> >
> >> >  {
> >> >   "name": "connectorname",
> >> >   "config": {
> >> > "name": "differentconnectorname",
> >> > "connector.class":
> >> > "org.apache.kafka.connect.tools.MockSourceConnector",
> >> > "tasks.max": "1",
> >> > "topics": "test-topic"
> >> >   }
> >> > }
> >> >
> >> > would be allowed as is.
> >> >
> >> > This might be intentional behavior in order to enable Connectors to
> >> have a
> >> > "name" parameter of their own - though I couldn't find any that do,
> but
> >> I
> >> > think this has the potential for misunderstandings, especially as
> there
> >> may
> >> > be code out there that references the connector name from the config
> >> object
> >> > and would thus grab the "wrong" one.
> >> >
> >> > Again, this may be intentional, so I am mostly looking for

Re: [DISCUSS] KAFKA-4930 & KAFKA 4938 - Treatment of name parameter in create connector requests

2017-07-06 Thread Sönke Liebau
I've updated the pull request to behave as follows:
 - reject create requests that contain no "name" element with a
BadRequestException
 - reject name that are empty or contain illegal characters with a
ConfigException
 - leave current logic around when to copy the name from the create request
to the config element intact
 - added unit tests for the validator to check that illegal characters are
correctly identified

The list of illegal characters is the result of some quick testing I did,
all of the characters in the list currently cause issues when used in a
connector name (similar to KAFKA-4827), so this should not break anything
that anybody relies on.
I think we may want to start a larger discussion around connector names,
allowed characters, max length, ..  to come up with an airtight set of
rules that we can then enforce, I am sure this is currently not perfect as
is.

Best regards,
Sönke

On Wed, Jul 5, 2017 at 9:31 AM, Sönke Liebau 
wrote:

> Hi,
>
> regarding "breaking existing functionality" .. yes...that was me getting
> confused about intended and existing functionality :)
> You are right, this won't break anything that is currently working.
>
> I'll leave placement of "name" parameter as is and open a new issue to
> clarify this later on.
>
> Kind regards,
> Sönke
>
> On Wed, Jul 5, 2017 at 5:41 AM, Gwen Shapira  wrote:
>
>> Hey,
>>
>> Nice research and summary.
>>
>> Regarding the ability to have a "nameless" connector - I'm pretty sure we
>> never intended to allow that.
>> I'm confused about breaking something that currently works though - since
>> we get NPE, how will giving more intentional exceptions break anything?
>>
>> Regarding the placing of the name - inside or outside the config. It looks
>> messy and I'm as confused as you are. I think Konstantine had some ideas
>> how this should be resolved. I hope he responds, but I think that for your
>> PR, just accept current mess as given...
>>
>> Gwen
>>
>> On Tue, Jul 4, 2017 at 3:28 AM Sönke Liebau
>>  wrote:
>>
>> > While working on KAFKA-4930 and KAFKA-4938 I came across some sort of
>> > fundamental questions about the rest api for creating connectors in
>> Kafka
>> > Connect that I'd like to put up for discussion.
>> >
>> > Currently requests that do not contain a "name" element on the top level
>> > are not accepted by the API, but that is due to a NullPointerException
>> [1]
>> > so not entirely intentional. Previous (and current if the lines causing
>> the
>> > Exception are removed) functionality was to create a connector named
>> "null"
>> > if that parameter was missing. I am not sure if this is a good thing, as
>> > for example that connector will be overwritten every time a new request
>> > without a name is sent, as opposed to the expected warning that a
>> connector
>> > of that name already exists.
>> >
>> > I would propose to reject api calls without a name provided on the top
>> > level, but this might break requests that currently work, so should
>> > probably be mentioned in the release notes.
>> >
>> > 
>> >
>> > Additionally, the "name" parameter is also copied into the "config"
>> > sub-element of the connector request - unless a name parameter was
>> provided
>> > there in the original request[2].
>> >
>> > So this:
>> >
>> > {
>> >   "name": "connectorname",
>> >   "config": {
>> > "connector.class":
>> > "org.apache.kafka.connect.tools.MockSourceConnector",
>> > "tasks.max": "1",
>> > "topics": "test-topic"
>> >   }
>> > }
>> >
>> > would become this:
>> > {
>> >   "name": "connectorname",
>> >   "config": {
>> > "name": "connectorname",
>> > "connector.class":
>> > "org.apache.kafka.connect.tools.MockSourceConnector",
>> > "tasks.max": "1",
>> > "topics": "test-topic"
>> >   }
>> > }
>> >
>> > But a request that contains two different names like this:
>> >
>> >  {
>> >   "name": "connectorname",
>> >   "config": {
>> > "name": "differentconnectorname",
>> > "connector.class":
>> > "org.apache.kafka.connect.tools.MockSourceConnector",
>> > "tasks.max": "1",
>> > "topics": "test-topic"
>> >   }
>> > }
>> >
>> > would be allowed as is.
>> >
>> > This might be intentional behavior in order to enable Connectors to
>> have a
>> > "name" parameter of their own - though I couldn't find any that do, but
>> I
>> > think this has the potential for misunderstandings, especially as there
>> may
>> > be code out there that references the connector name from the config
>> object
>> > and would thus grab the "wrong" one.
>> >
>> > Again, this may be intentional, so I am mostly looking for comments on
>> how
>> > to proceed here.
>> >
>> > My first instinct is to make the top-level "name" parameter mandatory as
>> > suggested above and then add a check to reject requests that contain a
>> > different "name" field in the config element.
>> >
>> > Any comments or thoughts welcome.
>> >
>> > TL/DR:
>> > Two questions up for discussion:
>> > 1. Should we reject api calls to create a 

Re: [DISCUSS] KAFKA-4930 & KAFKA 4938 - Treatment of name parameter in create connector requests

2017-07-05 Thread Sönke Liebau
Hi,

regarding "breaking existing functionality" .. yes...that was me getting
confused about intended and existing functionality :)
You are right, this won't break anything that is currently working.

I'll leave placement of "name" parameter as is and open a new issue to
clarify this later on.

Kind regards,
Sönke

On Wed, Jul 5, 2017 at 5:41 AM, Gwen Shapira  wrote:

> Hey,
>
> Nice research and summary.
>
> Regarding the ability to have a "nameless" connector - I'm pretty sure we
> never intended to allow that.
> I'm confused about breaking something that currently works though - since
> we get NPE, how will giving more intentional exceptions break anything?
>
> Regarding the placing of the name - inside or outside the config. It looks
> messy and I'm as confused as you are. I think Konstantine had some ideas
> how this should be resolved. I hope he responds, but I think that for your
> PR, just accept current mess as given...
>
> Gwen
>
> On Tue, Jul 4, 2017 at 3:28 AM Sönke Liebau
>  wrote:
>
> > While working on KAFKA-4930 and KAFKA-4938 I came across some sort of
> > fundamental questions about the rest api for creating connectors in Kafka
> > Connect that I'd like to put up for discussion.
> >
> > Currently requests that do not contain a "name" element on the top level
> > are not accepted by the API, but that is due to a NullPointerException
> [1]
> > so not entirely intentional. Previous (and current if the lines causing
> the
> > Exception are removed) functionality was to create a connector named
> "null"
> > if that parameter was missing. I am not sure if this is a good thing, as
> > for example that connector will be overwritten every time a new request
> > without a name is sent, as opposed to the expected warning that a
> connector
> > of that name already exists.
> >
> > I would propose to reject api calls without a name provided on the top
> > level, but this might break requests that currently work, so should
> > probably be mentioned in the release notes.
> >
> > 
> >
> > Additionally, the "name" parameter is also copied into the "config"
> > sub-element of the connector request - unless a name parameter was
> provided
> > there in the original request[2].
> >
> > So this:
> >
> > {
> >   "name": "connectorname",
> >   "config": {
> > "connector.class":
> > "org.apache.kafka.connect.tools.MockSourceConnector",
> > "tasks.max": "1",
> > "topics": "test-topic"
> >   }
> > }
> >
> > would become this:
> > {
> >   "name": "connectorname",
> >   "config": {
> > "name": "connectorname",
> > "connector.class":
> > "org.apache.kafka.connect.tools.MockSourceConnector",
> > "tasks.max": "1",
> > "topics": "test-topic"
> >   }
> > }
> >
> > But a request that contains two different names like this:
> >
> >  {
> >   "name": "connectorname",
> >   "config": {
> > "name": "differentconnectorname",
> > "connector.class":
> > "org.apache.kafka.connect.tools.MockSourceConnector",
> > "tasks.max": "1",
> > "topics": "test-topic"
> >   }
> > }
> >
> > would be allowed as is.
> >
> > This might be intentional behavior in order to enable Connectors to have
> a
> > "name" parameter of their own - though I couldn't find any that do, but I
> > think this has the potential for misunderstandings, especially as there
> may
> > be code out there that references the connector name from the config
> object
> > and would thus grab the "wrong" one.
> >
> > Again, this may be intentional, so I am mostly looking for comments on
> how
> > to proceed here.
> >
> > My first instinct is to make the top-level "name" parameter mandatory as
> > suggested above and then add a check to reject requests that contain a
> > different "name" field in the config element.
> >
> > Any comments or thoughts welcome.
> >
> > TL/DR:
> > Two questions up for discussion:
> > 1. Should we reject api calls to create a connector that do not contain a
> > "name" element on the top level?
> > 2. Is there a use case where it makes sense to have different "name"
> > elements in the connector config and as the connector name?
> >
> > Kind regards,
> > Sönke
> >
> > [1] https://github.com/apache/kafka/blob/trunk/connect/
> > runtime/src/main/java/org/apache/kafka/connect/runtime/rest/resources/
> > ConnectorsResource.java#L91
> >
> > [2] https://github.com/apache/kafka/blob/trunk/connect/
> > runtime/src/main/java/org/apache/kafka/connect/runtime/rest/resources/
> > ConnectorsResource.java#L96
> >
>



-- 
Sönke Liebau
Partner
Tel. +49 179 7940878
OpenCore GmbH & Co. KG - Thomas-Mann-Straße 8 - 22880 Wedel - Germany


Re: [DISCUSS] KAFKA-4930 & KAFKA 4938 - Treatment of name parameter in create connector requests

2017-07-04 Thread Gwen Shapira
Hey,

Nice research and summary.

Regarding the ability to have a "nameless" connector - I'm pretty sure we
never intended to allow that.
I'm confused about breaking something that currently works though - since
we get NPE, how will giving more intentional exceptions break anything?

Regarding the placing of the name - inside or outside the config. It looks
messy and I'm as confused as you are. I think Konstantine had some ideas
how this should be resolved. I hope he responds, but I think that for your
PR, just accept current mess as given...

Gwen

On Tue, Jul 4, 2017 at 3:28 AM Sönke Liebau
 wrote:

> While working on KAFKA-4930 and KAFKA-4938 I came across some sort of
> fundamental questions about the rest api for creating connectors in Kafka
> Connect that I'd like to put up for discussion.
>
> Currently requests that do not contain a "name" element on the top level
> are not accepted by the API, but that is due to a NullPointerException [1]
> so not entirely intentional. Previous (and current if the lines causing the
> Exception are removed) functionality was to create a connector named "null"
> if that parameter was missing. I am not sure if this is a good thing, as
> for example that connector will be overwritten every time a new request
> without a name is sent, as opposed to the expected warning that a connector
> of that name already exists.
>
> I would propose to reject api calls without a name provided on the top
> level, but this might break requests that currently work, so should
> probably be mentioned in the release notes.
>
> 
>
> Additionally, the "name" parameter is also copied into the "config"
> sub-element of the connector request - unless a name parameter was provided
> there in the original request[2].
>
> So this:
>
> {
>   "name": "connectorname",
>   "config": {
> "connector.class":
> "org.apache.kafka.connect.tools.MockSourceConnector",
> "tasks.max": "1",
> "topics": "test-topic"
>   }
> }
>
> would become this:
> {
>   "name": "connectorname",
>   "config": {
> "name": "connectorname",
> "connector.class":
> "org.apache.kafka.connect.tools.MockSourceConnector",
> "tasks.max": "1",
> "topics": "test-topic"
>   }
> }
>
> But a request that contains two different names like this:
>
>  {
>   "name": "connectorname",
>   "config": {
> "name": "differentconnectorname",
> "connector.class":
> "org.apache.kafka.connect.tools.MockSourceConnector",
> "tasks.max": "1",
> "topics": "test-topic"
>   }
> }
>
> would be allowed as is.
>
> This might be intentional behavior in order to enable Connectors to have a
> "name" parameter of their own - though I couldn't find any that do, but I
> think this has the potential for misunderstandings, especially as there may
> be code out there that references the connector name from the config object
> and would thus grab the "wrong" one.
>
> Again, this may be intentional, so I am mostly looking for comments on how
> to proceed here.
>
> My first instinct is to make the top-level "name" parameter mandatory as
> suggested above and then add a check to reject requests that contain a
> different "name" field in the config element.
>
> Any comments or thoughts welcome.
>
> TL/DR:
> Two questions up for discussion:
> 1. Should we reject api calls to create a connector that do not contain a
> "name" element on the top level?
> 2. Is there a use case where it makes sense to have different "name"
> elements in the connector config and as the connector name?
>
> Kind regards,
> Sönke
>
> [1] https://github.com/apache/kafka/blob/trunk/connect/
> runtime/src/main/java/org/apache/kafka/connect/runtime/rest/resources/
> ConnectorsResource.java#L91
>
> [2] https://github.com/apache/kafka/blob/trunk/connect/
> runtime/src/main/java/org/apache/kafka/connect/runtime/rest/resources/
> ConnectorsResource.java#L96
>