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

Reply via email to