Derive all api classes from Request / Response base classes (#1030)
This commit is contained in:
		@@ -257,18 +257,14 @@ class SimpleClient(object):
 | 
			
		||||
                continue
 | 
			
		||||
 | 
			
		||||
            request = encoder_fn(payloads=broker_payloads)
 | 
			
		||||
            # decoder_fn=None signal that the server is expected to not
 | 
			
		||||
            # send a response.  This probably only applies to
 | 
			
		||||
            # ProduceRequest w/ acks = 0
 | 
			
		||||
            expect_response = (decoder_fn is not None)
 | 
			
		||||
            future = conn.send(request, expect_response=expect_response)
 | 
			
		||||
            future = conn.send(request)
 | 
			
		||||
 | 
			
		||||
            if future.failed():
 | 
			
		||||
                refresh_metadata = True
 | 
			
		||||
                failed_payloads(broker_payloads)
 | 
			
		||||
                continue
 | 
			
		||||
 | 
			
		||||
            if not expect_response:
 | 
			
		||||
            if not request.expect_response():
 | 
			
		||||
                for payload in broker_payloads:
 | 
			
		||||
                    topic_partition = (str(payload.topic), payload.partition)
 | 
			
		||||
                    responses[topic_partition] = None
 | 
			
		||||
 
 | 
			
		||||
@@ -464,12 +464,7 @@ class KafkaClient(object):
 | 
			
		||||
        if not self._maybe_connect(node_id):
 | 
			
		||||
            return Future().failure(Errors.NodeNotReadyError(node_id))
 | 
			
		||||
 | 
			
		||||
        # Every request gets a response, except one special case:
 | 
			
		||||
        expect_response = True
 | 
			
		||||
        if isinstance(request, tuple(ProduceRequest)) and request.required_acks == 0:
 | 
			
		||||
            expect_response = False
 | 
			
		||||
 | 
			
		||||
        return self._conns[node_id].send(request, expect_response=expect_response)
 | 
			
		||||
        return self._conns[node_id].send(request)
 | 
			
		||||
 | 
			
		||||
    def poll(self, timeout_ms=None, future=None, sleep=True, delayed_tasks=True):
 | 
			
		||||
        """Try to read and write to sockets.
 | 
			
		||||
 
 | 
			
		||||
@@ -525,7 +525,7 @@ class BrokerConnection(object):
 | 
			
		||||
            ifr.future.failure(error)
 | 
			
		||||
        self.config['state_change_callback'](self)
 | 
			
		||||
 | 
			
		||||
    def send(self, request, expect_response=True):
 | 
			
		||||
    def send(self, request):
 | 
			
		||||
        """send request, return Future()
 | 
			
		||||
 | 
			
		||||
        Can block on network if request is larger than send_buffer_bytes
 | 
			
		||||
@@ -537,9 +537,9 @@ class BrokerConnection(object):
 | 
			
		||||
            return future.failure(Errors.ConnectionError(str(self)))
 | 
			
		||||
        elif not self.can_send_more():
 | 
			
		||||
            return future.failure(Errors.TooManyInFlightRequests(str(self)))
 | 
			
		||||
        return self._send(request, expect_response=expect_response)
 | 
			
		||||
        return self._send(request)
 | 
			
		||||
 | 
			
		||||
    def _send(self, request, expect_response=True):
 | 
			
		||||
    def _send(self, request):
 | 
			
		||||
        assert self.state in (ConnectionStates.AUTHENTICATING, ConnectionStates.CONNECTED)
 | 
			
		||||
        future = Future()
 | 
			
		||||
        correlation_id = self._next_correlation_id()
 | 
			
		||||
@@ -569,7 +569,7 @@ class BrokerConnection(object):
 | 
			
		||||
            return future.failure(error)
 | 
			
		||||
        log.debug('%s Request %d: %s', self, correlation_id, request)
 | 
			
		||||
 | 
			
		||||
        if expect_response:
 | 
			
		||||
        if request.expect_response():
 | 
			
		||||
            ifr = InFlightRequest(request=request,
 | 
			
		||||
                                  correlation_id=correlation_id,
 | 
			
		||||
                                  response_type=request.RESPONSE_TYPE,
 | 
			
		||||
 
 | 
			
		||||
@@ -1,10 +1,10 @@
 | 
			
		||||
from __future__ import absolute_import
 | 
			
		||||
 | 
			
		||||
from .struct import Struct
 | 
			
		||||
from .api import Request, Response
 | 
			
		||||
from .types import Array, Boolean, Bytes, Int16, Int32, Schema, String
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class ApiVersionResponse_v0(Struct):
 | 
			
		||||
class ApiVersionResponse_v0(Response):
 | 
			
		||||
    API_KEY = 18
 | 
			
		||||
    API_VERSION = 0
 | 
			
		||||
    SCHEMA = Schema(
 | 
			
		||||
@@ -16,7 +16,7 @@ class ApiVersionResponse_v0(Struct):
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class ApiVersionRequest_v0(Struct):
 | 
			
		||||
class ApiVersionRequest_v0(Request):
 | 
			
		||||
    API_KEY = 18
 | 
			
		||||
    API_VERSION = 0
 | 
			
		||||
    RESPONSE_TYPE = ApiVersionResponse_v0
 | 
			
		||||
@@ -27,7 +27,7 @@ ApiVersionRequest = [ApiVersionRequest_v0]
 | 
			
		||||
ApiVersionResponse = [ApiVersionResponse_v0]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class CreateTopicsResponse_v0(Struct):
 | 
			
		||||
class CreateTopicsResponse_v0(Response):
 | 
			
		||||
    API_KEY = 19
 | 
			
		||||
    API_VERSION = 0
 | 
			
		||||
    SCHEMA = Schema(
 | 
			
		||||
@@ -37,7 +37,7 @@ class CreateTopicsResponse_v0(Struct):
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class CreateTopicsResponse_v1(Struct):
 | 
			
		||||
class CreateTopicsResponse_v1(Response):
 | 
			
		||||
    API_KEY = 19
 | 
			
		||||
    API_VERSION = 1
 | 
			
		||||
    SCHEMA = Schema(
 | 
			
		||||
@@ -48,7 +48,7 @@ class CreateTopicsResponse_v1(Struct):
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class CreateTopicsRequest_v0(Struct):
 | 
			
		||||
class CreateTopicsRequest_v0(Request):
 | 
			
		||||
    API_KEY = 19
 | 
			
		||||
    API_VERSION = 0
 | 
			
		||||
    RESPONSE_TYPE = CreateTopicsResponse_v0
 | 
			
		||||
@@ -67,7 +67,7 @@ class CreateTopicsRequest_v0(Struct):
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class CreateTopicsRequest_v1(Struct):
 | 
			
		||||
class CreateTopicsRequest_v1(Request):
 | 
			
		||||
    API_KEY = 19
 | 
			
		||||
    API_VERSION = 1
 | 
			
		||||
    RESPONSE_TYPE = CreateTopicsResponse_v1
 | 
			
		||||
@@ -91,7 +91,7 @@ CreateTopicsRequest = [CreateTopicsRequest_v0, CreateTopicsRequest_v1]
 | 
			
		||||
CreateTopicsResponse = [CreateTopicsResponse_v0, CreateTopicsRequest_v1]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class DeleteTopicsResponse_v0(Struct):
 | 
			
		||||
class DeleteTopicsResponse_v0(Response):
 | 
			
		||||
    API_KEY = 20
 | 
			
		||||
    API_VERSION = 0
 | 
			
		||||
    SCHEMA = Schema(
 | 
			
		||||
@@ -101,7 +101,7 @@ class DeleteTopicsResponse_v0(Struct):
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class DeleteTopicsRequest_v0(Struct):
 | 
			
		||||
class DeleteTopicsRequest_v0(Request):
 | 
			
		||||
    API_KEY = 20
 | 
			
		||||
    API_VERSION = 0
 | 
			
		||||
    RESPONSE_TYPE = DeleteTopicsResponse_v0
 | 
			
		||||
@@ -115,7 +115,7 @@ DeleteTopicsRequest = [DeleteTopicsRequest_v0]
 | 
			
		||||
DeleteTopicsResponse = [DeleteTopicsResponse_v0]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class ListGroupsResponse_v0(Struct):
 | 
			
		||||
class ListGroupsResponse_v0(Response):
 | 
			
		||||
    API_KEY = 16
 | 
			
		||||
    API_VERSION = 0
 | 
			
		||||
    SCHEMA = Schema(
 | 
			
		||||
@@ -126,7 +126,7 @@ class ListGroupsResponse_v0(Struct):
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class ListGroupsRequest_v0(Struct):
 | 
			
		||||
class ListGroupsRequest_v0(Request):
 | 
			
		||||
    API_KEY = 16
 | 
			
		||||
    API_VERSION = 0
 | 
			
		||||
    RESPONSE_TYPE = ListGroupsResponse_v0
 | 
			
		||||
@@ -137,7 +137,7 @@ ListGroupsRequest = [ListGroupsRequest_v0]
 | 
			
		||||
ListGroupsResponse = [ListGroupsResponse_v0]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class DescribeGroupsResponse_v0(Struct):
 | 
			
		||||
class DescribeGroupsResponse_v0(Response):
 | 
			
		||||
    API_KEY = 15
 | 
			
		||||
    API_VERSION = 0
 | 
			
		||||
    SCHEMA = Schema(
 | 
			
		||||
@@ -156,7 +156,7 @@ class DescribeGroupsResponse_v0(Struct):
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class DescribeGroupsRequest_v0(Struct):
 | 
			
		||||
class DescribeGroupsRequest_v0(Request):
 | 
			
		||||
    API_KEY = 15
 | 
			
		||||
    API_VERSION = 0
 | 
			
		||||
    RESPONSE_TYPE = DescribeGroupsResponse_v0
 | 
			
		||||
@@ -169,7 +169,7 @@ DescribeGroupsRequest = [DescribeGroupsRequest_v0]
 | 
			
		||||
DescribeGroupsResponse = [DescribeGroupsResponse_v0]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class SaslHandShakeResponse_v0(Struct):
 | 
			
		||||
class SaslHandShakeResponse_v0(Response):
 | 
			
		||||
    API_KEY = 17
 | 
			
		||||
    API_VERSION = 0
 | 
			
		||||
    SCHEMA = Schema(
 | 
			
		||||
@@ -178,7 +178,7 @@ class SaslHandShakeResponse_v0(Struct):
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class SaslHandShakeRequest_v0(Struct):
 | 
			
		||||
class SaslHandShakeRequest_v0(Request):
 | 
			
		||||
    API_KEY = 17
 | 
			
		||||
    API_VERSION = 0
 | 
			
		||||
    RESPONSE_TYPE = SaslHandShakeResponse_v0
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,7 @@
 | 
			
		||||
from __future__ import absolute_import
 | 
			
		||||
 | 
			
		||||
import abc
 | 
			
		||||
 | 
			
		||||
from .struct import Struct
 | 
			
		||||
from .types import Int16, Int32, String, Schema
 | 
			
		||||
 | 
			
		||||
@@ -16,3 +18,50 @@ class RequestHeader(Struct):
 | 
			
		||||
        super(RequestHeader, self).__init__(
 | 
			
		||||
            request.API_KEY, request.API_VERSION, correlation_id, client_id
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Request(Struct):
 | 
			
		||||
    __metaclass__ = abc.ABCMeta
 | 
			
		||||
 | 
			
		||||
    @abc.abstractproperty
 | 
			
		||||
    def API_KEY(self):
 | 
			
		||||
        """Integer identifier for api request"""
 | 
			
		||||
        pass
 | 
			
		||||
 | 
			
		||||
    @abc.abstractproperty
 | 
			
		||||
    def API_VERSION(self):
 | 
			
		||||
        """Integer of api request version"""
 | 
			
		||||
        pass
 | 
			
		||||
 | 
			
		||||
    @abc.abstractproperty
 | 
			
		||||
    def SCHEMA(self):
 | 
			
		||||
        """An instance of Schema() representing the request structure"""
 | 
			
		||||
        pass
 | 
			
		||||
 | 
			
		||||
    @abc.abstractproperty
 | 
			
		||||
    def RESPONSE_TYPE(self):
 | 
			
		||||
        """The Response class associated with the api request"""
 | 
			
		||||
        pass
 | 
			
		||||
 | 
			
		||||
    def expect_response(self):
 | 
			
		||||
        """Override this method if an api request does not always generate a response"""
 | 
			
		||||
        return True
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Response(Struct):
 | 
			
		||||
    __metaclass__ = abc.ABCMeta
 | 
			
		||||
 | 
			
		||||
    @abc.abstractproperty
 | 
			
		||||
    def API_KEY(self):
 | 
			
		||||
        """Integer identifier for api request/response"""
 | 
			
		||||
        pass
 | 
			
		||||
 | 
			
		||||
    @abc.abstractproperty
 | 
			
		||||
    def API_VERSION(self):
 | 
			
		||||
        """Integer of api request/response version"""
 | 
			
		||||
        pass
 | 
			
		||||
 | 
			
		||||
    @abc.abstractproperty
 | 
			
		||||
    def SCHEMA(self):
 | 
			
		||||
        """An instance of Schema() representing the response structure"""
 | 
			
		||||
        pass
 | 
			
		||||
 
 | 
			
		||||
@@ -1,10 +1,10 @@
 | 
			
		||||
from __future__ import absolute_import
 | 
			
		||||
 | 
			
		||||
from .struct import Struct
 | 
			
		||||
from .api import Request, Response
 | 
			
		||||
from .types import Array, Int16, Int32, Int64, Schema, String
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class OffsetCommitResponse_v0(Struct):
 | 
			
		||||
class OffsetCommitResponse_v0(Response):
 | 
			
		||||
    API_KEY = 8
 | 
			
		||||
    API_VERSION = 0
 | 
			
		||||
    SCHEMA = Schema(
 | 
			
		||||
@@ -16,19 +16,19 @@ class OffsetCommitResponse_v0(Struct):
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class OffsetCommitResponse_v1(Struct):
 | 
			
		||||
class OffsetCommitResponse_v1(Response):
 | 
			
		||||
    API_KEY = 8
 | 
			
		||||
    API_VERSION = 1
 | 
			
		||||
    SCHEMA = OffsetCommitResponse_v0.SCHEMA
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class OffsetCommitResponse_v2(Struct):
 | 
			
		||||
class OffsetCommitResponse_v2(Response):
 | 
			
		||||
    API_KEY = 8
 | 
			
		||||
    API_VERSION = 2
 | 
			
		||||
    SCHEMA = OffsetCommitResponse_v1.SCHEMA
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class OffsetCommitRequest_v0(Struct):
 | 
			
		||||
class OffsetCommitRequest_v0(Request):
 | 
			
		||||
    API_KEY = 8
 | 
			
		||||
    API_VERSION = 0  # Zookeeper-backed storage
 | 
			
		||||
    RESPONSE_TYPE = OffsetCommitResponse_v0
 | 
			
		||||
@@ -43,7 +43,7 @@ class OffsetCommitRequest_v0(Struct):
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class OffsetCommitRequest_v1(Struct):
 | 
			
		||||
class OffsetCommitRequest_v1(Request):
 | 
			
		||||
    API_KEY = 8
 | 
			
		||||
    API_VERSION = 1  # Kafka-backed storage
 | 
			
		||||
    RESPONSE_TYPE = OffsetCommitResponse_v1
 | 
			
		||||
@@ -61,7 +61,7 @@ class OffsetCommitRequest_v1(Struct):
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class OffsetCommitRequest_v2(Struct):
 | 
			
		||||
class OffsetCommitRequest_v2(Request):
 | 
			
		||||
    API_KEY = 8
 | 
			
		||||
    API_VERSION = 2  # added retention_time, dropped timestamp
 | 
			
		||||
    RESPONSE_TYPE = OffsetCommitResponse_v2
 | 
			
		||||
@@ -87,7 +87,7 @@ OffsetCommitResponse = [OffsetCommitResponse_v0, OffsetCommitResponse_v1,
 | 
			
		||||
                        OffsetCommitResponse_v2]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class OffsetFetchResponse_v0(Struct):
 | 
			
		||||
class OffsetFetchResponse_v0(Response):
 | 
			
		||||
    API_KEY = 9
 | 
			
		||||
    API_VERSION = 0
 | 
			
		||||
    SCHEMA = Schema(
 | 
			
		||||
@@ -101,13 +101,13 @@ class OffsetFetchResponse_v0(Struct):
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class OffsetFetchResponse_v1(Struct):
 | 
			
		||||
class OffsetFetchResponse_v1(Response):
 | 
			
		||||
    API_KEY = 9
 | 
			
		||||
    API_VERSION = 1
 | 
			
		||||
    SCHEMA = OffsetFetchResponse_v0.SCHEMA
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class OffsetFetchResponse_v2(Struct):
 | 
			
		||||
class OffsetFetchResponse_v2(Response):
 | 
			
		||||
    # Added in KIP-88
 | 
			
		||||
    API_KEY = 9
 | 
			
		||||
    API_VERSION = 2
 | 
			
		||||
@@ -123,7 +123,7 @@ class OffsetFetchResponse_v2(Struct):
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class OffsetFetchRequest_v0(Struct):
 | 
			
		||||
class OffsetFetchRequest_v0(Request):
 | 
			
		||||
    API_KEY = 9
 | 
			
		||||
    API_VERSION = 0  # zookeeper-backed storage
 | 
			
		||||
    RESPONSE_TYPE = OffsetFetchResponse_v0
 | 
			
		||||
@@ -135,14 +135,14 @@ class OffsetFetchRequest_v0(Struct):
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class OffsetFetchRequest_v1(Struct):
 | 
			
		||||
class OffsetFetchRequest_v1(Request):
 | 
			
		||||
    API_KEY = 9
 | 
			
		||||
    API_VERSION = 1  # kafka-backed storage
 | 
			
		||||
    RESPONSE_TYPE = OffsetFetchResponse_v1
 | 
			
		||||
    SCHEMA = OffsetFetchRequest_v0.SCHEMA
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class OffsetFetchRequest_v2(Struct):
 | 
			
		||||
class OffsetFetchRequest_v2(Request):
 | 
			
		||||
    # KIP-88: Allows passing null topics to return offsets for all partitions
 | 
			
		||||
    # that the consumer group has a stored offset for, even if no consumer in
 | 
			
		||||
    # the group is currently consuming that partition.
 | 
			
		||||
@@ -158,7 +158,7 @@ OffsetFetchResponse = [OffsetFetchResponse_v0, OffsetFetchResponse_v1,
 | 
			
		||||
    OffsetFetchResponse_v2]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class GroupCoordinatorResponse_v0(Struct):
 | 
			
		||||
class GroupCoordinatorResponse_v0(Response):
 | 
			
		||||
    API_KEY = 10
 | 
			
		||||
    API_VERSION = 0
 | 
			
		||||
    SCHEMA = Schema(
 | 
			
		||||
@@ -169,7 +169,7 @@ class GroupCoordinatorResponse_v0(Struct):
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class GroupCoordinatorRequest_v0(Struct):
 | 
			
		||||
class GroupCoordinatorRequest_v0(Request):
 | 
			
		||||
    API_KEY = 10
 | 
			
		||||
    API_VERSION = 0
 | 
			
		||||
    RESPONSE_TYPE = GroupCoordinatorResponse_v0
 | 
			
		||||
 
 | 
			
		||||
@@ -1,11 +1,11 @@
 | 
			
		||||
from __future__ import absolute_import
 | 
			
		||||
 | 
			
		||||
from .api import Request, Response
 | 
			
		||||
from .message import MessageSet
 | 
			
		||||
from .struct import Struct
 | 
			
		||||
from .types import Array, Int16, Int32, Int64, Schema, String
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class FetchResponse_v0(Struct):
 | 
			
		||||
class FetchResponse_v0(Response):
 | 
			
		||||
    API_KEY = 1
 | 
			
		||||
    API_VERSION = 0
 | 
			
		||||
    SCHEMA = Schema(
 | 
			
		||||
@@ -19,7 +19,7 @@ class FetchResponse_v0(Struct):
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class FetchResponse_v1(Struct):
 | 
			
		||||
class FetchResponse_v1(Response):
 | 
			
		||||
    API_KEY = 1
 | 
			
		||||
    API_VERSION = 1
 | 
			
		||||
    SCHEMA = Schema(
 | 
			
		||||
@@ -34,19 +34,19 @@ class FetchResponse_v1(Struct):
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class FetchResponse_v2(Struct):
 | 
			
		||||
class FetchResponse_v2(Response):
 | 
			
		||||
    API_KEY = 1
 | 
			
		||||
    API_VERSION = 2
 | 
			
		||||
    SCHEMA = FetchResponse_v1.SCHEMA  # message format changed internally
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class FetchResponse_v3(Struct):
 | 
			
		||||
class FetchResponse_v3(Response):
 | 
			
		||||
    API_KEY = 1
 | 
			
		||||
    API_VERSION = 3
 | 
			
		||||
    SCHEMA = FetchResponse_v2.SCHEMA
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class FetchRequest_v0(Struct):
 | 
			
		||||
class FetchRequest_v0(Request):
 | 
			
		||||
    API_KEY = 1
 | 
			
		||||
    API_VERSION = 0
 | 
			
		||||
    RESPONSE_TYPE = FetchResponse_v0
 | 
			
		||||
@@ -63,21 +63,21 @@ class FetchRequest_v0(Struct):
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class FetchRequest_v1(Struct):
 | 
			
		||||
class FetchRequest_v1(Request):
 | 
			
		||||
    API_KEY = 1
 | 
			
		||||
    API_VERSION = 1
 | 
			
		||||
    RESPONSE_TYPE = FetchResponse_v1
 | 
			
		||||
    SCHEMA = FetchRequest_v0.SCHEMA
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class FetchRequest_v2(Struct):
 | 
			
		||||
class FetchRequest_v2(Request):
 | 
			
		||||
    API_KEY = 1
 | 
			
		||||
    API_VERSION = 2
 | 
			
		||||
    RESPONSE_TYPE = FetchResponse_v2
 | 
			
		||||
    SCHEMA = FetchRequest_v1.SCHEMA
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class FetchRequest_v3(Struct):
 | 
			
		||||
class FetchRequest_v3(Request):
 | 
			
		||||
    API_KEY = 1
 | 
			
		||||
    API_VERSION = 3
 | 
			
		||||
    RESPONSE_TYPE = FetchResponse_v3
 | 
			
		||||
 
 | 
			
		||||
@@ -1,10 +1,11 @@
 | 
			
		||||
from __future__ import absolute_import
 | 
			
		||||
 | 
			
		||||
from .api import Request, Response
 | 
			
		||||
from .struct import Struct
 | 
			
		||||
from .types import Array, Bytes, Int16, Int32, Schema, String
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class JoinGroupResponse_v0(Struct):
 | 
			
		||||
class JoinGroupResponse_v0(Response):
 | 
			
		||||
    API_KEY = 11
 | 
			
		||||
    API_VERSION = 0
 | 
			
		||||
    SCHEMA = Schema(
 | 
			
		||||
@@ -19,13 +20,13 @@ class JoinGroupResponse_v0(Struct):
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class JoinGroupResponse_v1(Struct):
 | 
			
		||||
class JoinGroupResponse_v1(Response):
 | 
			
		||||
    API_KEY = 11
 | 
			
		||||
    API_VERSION = 1
 | 
			
		||||
    SCHEMA = JoinGroupResponse_v0.SCHEMA
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class JoinGroupRequest_v0(Struct):
 | 
			
		||||
class JoinGroupRequest_v0(Request):
 | 
			
		||||
    API_KEY = 11
 | 
			
		||||
    API_VERSION = 0
 | 
			
		||||
    RESPONSE_TYPE = JoinGroupResponse_v0
 | 
			
		||||
@@ -41,7 +42,7 @@ class JoinGroupRequest_v0(Struct):
 | 
			
		||||
    UNKNOWN_MEMBER_ID = ''
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class JoinGroupRequest_v1(Struct):
 | 
			
		||||
class JoinGroupRequest_v1(Request):
 | 
			
		||||
    API_KEY = 11
 | 
			
		||||
    API_VERSION = 1
 | 
			
		||||
    RESPONSE_TYPE = JoinGroupResponse_v1
 | 
			
		||||
@@ -70,7 +71,7 @@ class ProtocolMetadata(Struct):
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class SyncGroupResponse_v0(Struct):
 | 
			
		||||
class SyncGroupResponse_v0(Response):
 | 
			
		||||
    API_KEY = 14
 | 
			
		||||
    API_VERSION = 0
 | 
			
		||||
    SCHEMA = Schema(
 | 
			
		||||
@@ -79,7 +80,7 @@ class SyncGroupResponse_v0(Struct):
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class SyncGroupRequest_v0(Struct):
 | 
			
		||||
class SyncGroupRequest_v0(Request):
 | 
			
		||||
    API_KEY = 14
 | 
			
		||||
    API_VERSION = 0
 | 
			
		||||
    RESPONSE_TYPE = SyncGroupResponse_v0
 | 
			
		||||
@@ -107,7 +108,7 @@ class MemberAssignment(Struct):
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class HeartbeatResponse_v0(Struct):
 | 
			
		||||
class HeartbeatResponse_v0(Response):
 | 
			
		||||
    API_KEY = 12
 | 
			
		||||
    API_VERSION = 0
 | 
			
		||||
    SCHEMA = Schema(
 | 
			
		||||
@@ -115,7 +116,7 @@ class HeartbeatResponse_v0(Struct):
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class HeartbeatRequest_v0(Struct):
 | 
			
		||||
class HeartbeatRequest_v0(Request):
 | 
			
		||||
    API_KEY = 12
 | 
			
		||||
    API_VERSION = 0
 | 
			
		||||
    RESPONSE_TYPE = HeartbeatResponse_v0
 | 
			
		||||
@@ -130,7 +131,7 @@ HeartbeatRequest = [HeartbeatRequest_v0]
 | 
			
		||||
HeartbeatResponse = [HeartbeatResponse_v0]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class LeaveGroupResponse_v0(Struct):
 | 
			
		||||
class LeaveGroupResponse_v0(Response):
 | 
			
		||||
    API_KEY = 13
 | 
			
		||||
    API_VERSION = 0
 | 
			
		||||
    SCHEMA = Schema(
 | 
			
		||||
@@ -138,7 +139,7 @@ class LeaveGroupResponse_v0(Struct):
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class LeaveGroupRequest_v0(Struct):
 | 
			
		||||
class LeaveGroupRequest_v0(Request):
 | 
			
		||||
    API_KEY = 13
 | 
			
		||||
    API_VERSION = 0
 | 
			
		||||
    RESPONSE_TYPE = LeaveGroupResponse_v0
 | 
			
		||||
 
 | 
			
		||||
@@ -1,10 +1,10 @@
 | 
			
		||||
from __future__ import absolute_import
 | 
			
		||||
 | 
			
		||||
from .struct import Struct
 | 
			
		||||
from .api import Request, Response
 | 
			
		||||
from .types import Array, Boolean, Int16, Int32, Schema, String
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class MetadataResponse_v0(Struct):
 | 
			
		||||
class MetadataResponse_v0(Response):
 | 
			
		||||
    API_KEY = 3
 | 
			
		||||
    API_VERSION = 0
 | 
			
		||||
    SCHEMA = Schema(
 | 
			
		||||
@@ -24,7 +24,7 @@ class MetadataResponse_v0(Struct):
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class MetadataResponse_v1(Struct):
 | 
			
		||||
class MetadataResponse_v1(Response):
 | 
			
		||||
    API_KEY = 3
 | 
			
		||||
    API_VERSION = 1
 | 
			
		||||
    SCHEMA = Schema(
 | 
			
		||||
@@ -47,7 +47,7 @@ class MetadataResponse_v1(Struct):
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class MetadataResponse_v2(Struct):
 | 
			
		||||
class MetadataResponse_v2(Response):
 | 
			
		||||
    API_KEY = 3
 | 
			
		||||
    API_VERSION = 2
 | 
			
		||||
    SCHEMA = Schema(
 | 
			
		||||
@@ -71,7 +71,7 @@ class MetadataResponse_v2(Struct):
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class MetadataRequest_v0(Struct):
 | 
			
		||||
class MetadataRequest_v0(Request):
 | 
			
		||||
    API_KEY = 3
 | 
			
		||||
    API_VERSION = 0
 | 
			
		||||
    RESPONSE_TYPE = MetadataResponse_v0
 | 
			
		||||
@@ -81,7 +81,7 @@ class MetadataRequest_v0(Struct):
 | 
			
		||||
    ALL_TOPICS = None  # Empty Array (len 0) for topics returns all topics
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class MetadataRequest_v1(Struct):
 | 
			
		||||
class MetadataRequest_v1(Request):
 | 
			
		||||
    API_KEY = 3
 | 
			
		||||
    API_VERSION = 1
 | 
			
		||||
    RESPONSE_TYPE = MetadataResponse_v1
 | 
			
		||||
@@ -90,7 +90,7 @@ class MetadataRequest_v1(Struct):
 | 
			
		||||
    NO_TOPICS = None  # Empty array (len 0) for topics returns no topics
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class MetadataRequest_v2(Struct):
 | 
			
		||||
class MetadataRequest_v2(Request):
 | 
			
		||||
    API_KEY = 3
 | 
			
		||||
    API_VERSION = 2
 | 
			
		||||
    RESPONSE_TYPE = MetadataResponse_v2
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
from __future__ import absolute_import
 | 
			
		||||
 | 
			
		||||
from .struct import Struct
 | 
			
		||||
from .api import Request, Response
 | 
			
		||||
from .types import Array, Int16, Int32, Int64, Schema, String
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -10,7 +10,7 @@ class OffsetResetStrategy(object):
 | 
			
		||||
    NONE = 0
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class OffsetResponse_v0(Struct):
 | 
			
		||||
class OffsetResponse_v0(Response):
 | 
			
		||||
    API_KEY = 2
 | 
			
		||||
    API_VERSION = 0
 | 
			
		||||
    SCHEMA = Schema(
 | 
			
		||||
@@ -22,7 +22,7 @@ class OffsetResponse_v0(Struct):
 | 
			
		||||
                ('offsets', Array(Int64))))))
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
class OffsetResponse_v1(Struct):
 | 
			
		||||
class OffsetResponse_v1(Response):
 | 
			
		||||
    API_KEY = 2
 | 
			
		||||
    API_VERSION = 1
 | 
			
		||||
    SCHEMA = Schema(
 | 
			
		||||
@@ -36,7 +36,7 @@ class OffsetResponse_v1(Struct):
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class OffsetRequest_v0(Struct):
 | 
			
		||||
class OffsetRequest_v0(Request):
 | 
			
		||||
    API_KEY = 2
 | 
			
		||||
    API_VERSION = 0
 | 
			
		||||
    RESPONSE_TYPE = OffsetResponse_v0
 | 
			
		||||
@@ -53,7 +53,7 @@ class OffsetRequest_v0(Struct):
 | 
			
		||||
        'replica_id': -1
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
class OffsetRequest_v1(Struct):
 | 
			
		||||
class OffsetRequest_v1(Request):
 | 
			
		||||
    API_KEY = 2
 | 
			
		||||
    API_VERSION = 1
 | 
			
		||||
    RESPONSE_TYPE = OffsetResponse_v1
 | 
			
		||||
 
 | 
			
		||||
@@ -1,11 +1,11 @@
 | 
			
		||||
from __future__ import absolute_import
 | 
			
		||||
 | 
			
		||||
from .api import Request, Response
 | 
			
		||||
from .message import MessageSet
 | 
			
		||||
from .struct import Struct
 | 
			
		||||
from .types import Int16, Int32, Int64, String, Array, Schema
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class ProduceResponse_v0(Struct):
 | 
			
		||||
class ProduceResponse_v0(Response):
 | 
			
		||||
    API_KEY = 0
 | 
			
		||||
    API_VERSION = 0
 | 
			
		||||
    SCHEMA = Schema(
 | 
			
		||||
@@ -18,7 +18,7 @@ class ProduceResponse_v0(Struct):
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class ProduceResponse_v1(Struct):
 | 
			
		||||
class ProduceResponse_v1(Response):
 | 
			
		||||
    API_KEY = 0
 | 
			
		||||
    API_VERSION = 1
 | 
			
		||||
    SCHEMA = Schema(
 | 
			
		||||
@@ -32,7 +32,7 @@ class ProduceResponse_v1(Struct):
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class ProduceResponse_v2(Struct):
 | 
			
		||||
class ProduceResponse_v2(Response):
 | 
			
		||||
    API_KEY = 0
 | 
			
		||||
    API_VERSION = 2
 | 
			
		||||
    SCHEMA = Schema(
 | 
			
		||||
@@ -47,7 +47,7 @@ class ProduceResponse_v2(Struct):
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class ProduceRequest_v0(Struct):
 | 
			
		||||
class ProduceRequest_v0(Request):
 | 
			
		||||
    API_KEY = 0
 | 
			
		||||
    API_VERSION = 0
 | 
			
		||||
    RESPONSE_TYPE = ProduceResponse_v0
 | 
			
		||||
@@ -61,20 +61,35 @@ class ProduceRequest_v0(Struct):
 | 
			
		||||
                ('messages', MessageSet)))))
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    def expect_response(self):
 | 
			
		||||
        if self.required_acks == 0: # pylint: disable=no-member
 | 
			
		||||
            return False
 | 
			
		||||
        return True
 | 
			
		||||
 | 
			
		||||
class ProduceRequest_v1(Struct):
 | 
			
		||||
 | 
			
		||||
class ProduceRequest_v1(Request):
 | 
			
		||||
    API_KEY = 0
 | 
			
		||||
    API_VERSION = 1
 | 
			
		||||
    RESPONSE_TYPE = ProduceResponse_v1
 | 
			
		||||
    SCHEMA = ProduceRequest_v0.SCHEMA
 | 
			
		||||
 | 
			
		||||
    def expect_response(self):
 | 
			
		||||
        if self.required_acks == 0: # pylint: disable=no-member
 | 
			
		||||
            return False
 | 
			
		||||
        return True
 | 
			
		||||
 | 
			
		||||
class ProduceRequest_v2(Struct):
 | 
			
		||||
 | 
			
		||||
class ProduceRequest_v2(Request):
 | 
			
		||||
    API_KEY = 0
 | 
			
		||||
    API_VERSION = 2
 | 
			
		||||
    RESPONSE_TYPE = ProduceResponse_v2
 | 
			
		||||
    SCHEMA = ProduceRequest_v1.SCHEMA
 | 
			
		||||
 | 
			
		||||
    def expect_response(self):
 | 
			
		||||
        if self.required_acks == 0: # pylint: disable=no-member
 | 
			
		||||
            return False
 | 
			
		||||
        return True
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
ProduceRequest = [ProduceRequest_v0, ProduceRequest_v1, ProduceRequest_v2]
 | 
			
		||||
ProduceResponse = [ProduceResponse_v0, ProduceResponse_v1, ProduceResponse_v2]
 | 
			
		||||
 
 | 
			
		||||
@@ -236,13 +236,14 @@ def test_send(cli, conn):
 | 
			
		||||
    cli._maybe_connect(0)
 | 
			
		||||
    # ProduceRequest w/ 0 required_acks -> no response
 | 
			
		||||
    request = ProduceRequest[0](0, 0, [])
 | 
			
		||||
    assert request.expect_response() is False
 | 
			
		||||
    ret = cli.send(0, request)
 | 
			
		||||
    assert conn.send.called_with(request, expect_response=False)
 | 
			
		||||
    assert conn.send.called_with(request)
 | 
			
		||||
    assert isinstance(ret, Future)
 | 
			
		||||
 | 
			
		||||
    request = MetadataRequest[0]([])
 | 
			
		||||
    cli.send(0, request)
 | 
			
		||||
    assert conn.send.called_with(request, expect_response=True)
 | 
			
		||||
    assert conn.send.called_with(request)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def test_poll(mocker):
 | 
			
		||||
 
 | 
			
		||||
@@ -11,6 +11,7 @@ import pytest
 | 
			
		||||
from kafka.conn import BrokerConnection, ConnectionStates, collect_hosts
 | 
			
		||||
from kafka.protocol.api import RequestHeader
 | 
			
		||||
from kafka.protocol.metadata import MetadataRequest
 | 
			
		||||
from kafka.protocol.produce import ProduceRequest
 | 
			
		||||
 | 
			
		||||
import kafka.common as Errors
 | 
			
		||||
 | 
			
		||||
@@ -112,7 +113,7 @@ def test_send_max_ifr(conn):
 | 
			
		||||
def test_send_no_response(_socket, conn):
 | 
			
		||||
    conn.connect()
 | 
			
		||||
    assert conn.state is ConnectionStates.CONNECTED
 | 
			
		||||
    req = MetadataRequest[0]([])
 | 
			
		||||
    req = ProduceRequest[0](required_acks=0, timeout=0, topics=[])
 | 
			
		||||
    header = RequestHeader(req, client_id=conn.config['client_id'])
 | 
			
		||||
    payload_bytes = len(header.encode()) + len(req.encode())
 | 
			
		||||
    third = payload_bytes // 3
 | 
			
		||||
@@ -120,7 +121,7 @@ def test_send_no_response(_socket, conn):
 | 
			
		||||
    _socket.send.side_effect = [4, third, third, third, remainder]
 | 
			
		||||
 | 
			
		||||
    assert len(conn.in_flight_requests) == 0
 | 
			
		||||
    f = conn.send(req, expect_response=False)
 | 
			
		||||
    f = conn.send(req)
 | 
			
		||||
    assert f.succeeded() is True
 | 
			
		||||
    assert f.value is None
 | 
			
		||||
    assert len(conn.in_flight_requests) == 0
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user