Search in sources :

Example 6 with ApiVersionCollection

use of org.apache.kafka.common.message.ApiVersionsResponseData.ApiVersionCollection in project kafka by apache.

the class NodeApiVersionsTest method testUsableVersionCalculationNoKnownVersions.

@Test
public void testUsableVersionCalculationNoKnownVersions() {
    NodeApiVersions versions = new NodeApiVersions(new ApiVersionCollection());
    assertThrows(UnsupportedVersionException.class, () -> versions.latestUsableVersion(ApiKeys.FETCH));
}
Also used : ApiVersionCollection(org.apache.kafka.common.message.ApiVersionsResponseData.ApiVersionCollection) Test(org.junit.jupiter.api.Test) ParameterizedTest(org.junit.jupiter.params.ParameterizedTest)

Example 7 with ApiVersionCollection

use of org.apache.kafka.common.message.ApiVersionsResponseData.ApiVersionCollection in project kafka by apache.

the class SaslAuthenticatorTest method startServerApiVersionsUnsupportedByClient.

private NioEchoServer startServerApiVersionsUnsupportedByClient(final SecurityProtocol securityProtocol, String saslMechanism) throws Exception {
    final ListenerName listenerName = ListenerName.forSecurityProtocol(securityProtocol);
    final Map<String, ?> configs = Collections.emptyMap();
    final JaasContext jaasContext = JaasContext.loadServerContext(listenerName, saslMechanism, configs);
    final Map<String, JaasContext> jaasContexts = Collections.singletonMap(saslMechanism, jaasContext);
    boolean isScram = ScramMechanism.isScram(saslMechanism);
    if (isScram)
        ScramCredentialUtils.createCache(credentialCache, Arrays.asList(saslMechanism));
    Supplier<ApiVersionsResponse> apiVersionSupplier = () -> {
        ApiVersionCollection versionCollection = new ApiVersionCollection(2);
        versionCollection.add(new ApiVersion().setApiKey(ApiKeys.SASL_HANDSHAKE.id).setMinVersion((short) 0).setMaxVersion((short) 100));
        versionCollection.add(new ApiVersion().setApiKey(ApiKeys.SASL_AUTHENTICATE.id).setMinVersion((short) 0).setMaxVersion((short) 100));
        return new ApiVersionsResponse(new ApiVersionsResponseData().setApiKeys(versionCollection));
    };
    SaslChannelBuilder serverChannelBuilder = new SaslChannelBuilder(Mode.SERVER, jaasContexts, securityProtocol, listenerName, false, saslMechanism, true, credentialCache, null, null, time, new LogContext(), apiVersionSupplier);
    serverChannelBuilder.configure(saslServerConfigs);
    server = new NioEchoServer(listenerName, securityProtocol, new TestSecurityConfig(saslServerConfigs), "localhost", serverChannelBuilder, credentialCache, time);
    server.start();
    return server;
}
Also used : ApiVersionCollection(org.apache.kafka.common.message.ApiVersionsResponseData.ApiVersionCollection) ApiVersionsResponse(org.apache.kafka.common.requests.ApiVersionsResponse) ApiVersion(org.apache.kafka.common.message.ApiVersionsResponseData.ApiVersion) LogContext(org.apache.kafka.common.utils.LogContext) ListenerName(org.apache.kafka.common.network.ListenerName) JaasContext(org.apache.kafka.common.security.JaasContext) NioEchoServer(org.apache.kafka.common.network.NioEchoServer) TestSecurityConfig(org.apache.kafka.common.security.TestSecurityConfig) SaslChannelBuilder(org.apache.kafka.common.network.SaslChannelBuilder) ApiVersionsResponseData(org.apache.kafka.common.message.ApiVersionsResponseData)

Example 8 with ApiVersionCollection

use of org.apache.kafka.common.message.ApiVersionsResponseData.ApiVersionCollection in project kafka by apache.

the class SaslAuthenticatorTest method startServerWithoutSaslAuthenticateHeader.

private NioEchoServer startServerWithoutSaslAuthenticateHeader(final SecurityProtocol securityProtocol, String saslMechanism) throws Exception {
    final ListenerName listenerName = ListenerName.forSecurityProtocol(securityProtocol);
    final Map<String, ?> configs = Collections.emptyMap();
    final JaasContext jaasContext = JaasContext.loadServerContext(listenerName, saslMechanism, configs);
    final Map<String, JaasContext> jaasContexts = Collections.singletonMap(saslMechanism, jaasContext);
    boolean isScram = ScramMechanism.isScram(saslMechanism);
    if (isScram)
        ScramCredentialUtils.createCache(credentialCache, Arrays.asList(saslMechanism));
    Supplier<ApiVersionsResponse> apiVersionSupplier = () -> {
        ApiVersionsResponse defaultApiVersionResponse = ApiVersionsResponse.defaultApiVersionsResponse(ApiMessageType.ListenerType.ZK_BROKER);
        ApiVersionCollection apiVersions = new ApiVersionCollection();
        for (ApiVersion apiVersion : defaultApiVersionResponse.data().apiKeys()) {
            if (apiVersion.apiKey() != ApiKeys.SASL_AUTHENTICATE.id) {
                // ApiVersion can NOT be reused in second ApiVersionCollection
                // due to the internal pointers it contains.
                apiVersions.add(apiVersion.duplicate());
            }
        }
        ApiVersionsResponseData data = new ApiVersionsResponseData().setErrorCode(Errors.NONE.code()).setThrottleTimeMs(0).setApiKeys(apiVersions);
        return new ApiVersionsResponse(data);
    };
    SaslChannelBuilder serverChannelBuilder = new SaslChannelBuilder(Mode.SERVER, jaasContexts, securityProtocol, listenerName, false, saslMechanism, true, credentialCache, null, null, time, new LogContext(), apiVersionSupplier) {

        @Override
        protected SaslServerAuthenticator buildServerAuthenticator(Map<String, ?> configs, Map<String, AuthenticateCallbackHandler> callbackHandlers, String id, TransportLayer transportLayer, Map<String, Subject> subjects, Map<String, Long> connectionsMaxReauthMsByMechanism, ChannelMetadataRegistry metadataRegistry) {
            return new SaslServerAuthenticator(configs, callbackHandlers, id, subjects, null, listenerName, securityProtocol, transportLayer, connectionsMaxReauthMsByMechanism, metadataRegistry, time, apiVersionSupplier) {

                @Override
                protected void enableKafkaSaslAuthenticateHeaders(boolean flag) {
                // Don't enable Kafka SASL_AUTHENTICATE headers
                }
            };
        }
    };
    serverChannelBuilder.configure(saslServerConfigs);
    server = new NioEchoServer(listenerName, securityProtocol, new TestSecurityConfig(saslServerConfigs), "localhost", serverChannelBuilder, credentialCache, time);
    server.start();
    return server;
}
Also used : ApiVersionCollection(org.apache.kafka.common.message.ApiVersionsResponseData.ApiVersionCollection) ApiVersionsResponse(org.apache.kafka.common.requests.ApiVersionsResponse) ApiVersion(org.apache.kafka.common.message.ApiVersionsResponseData.ApiVersion) ChannelMetadataRegistry(org.apache.kafka.common.network.ChannelMetadataRegistry) LogContext(org.apache.kafka.common.utils.LogContext) ListenerName(org.apache.kafka.common.network.ListenerName) TransportLayer(org.apache.kafka.common.network.TransportLayer) JaasContext(org.apache.kafka.common.security.JaasContext) NioEchoServer(org.apache.kafka.common.network.NioEchoServer) TestSecurityConfig(org.apache.kafka.common.security.TestSecurityConfig) SaslChannelBuilder(org.apache.kafka.common.network.SaslChannelBuilder) Map(java.util.Map) HashMap(java.util.HashMap) ApiVersionsResponseData(org.apache.kafka.common.message.ApiVersionsResponseData)

Example 9 with ApiVersionCollection

use of org.apache.kafka.common.message.ApiVersionsResponseData.ApiVersionCollection in project kafka by apache.

the class ApiVersionsResponse method intersectForwardableApis.

/**
 * Find the common range of supported API versions between the locally
 * known range and that of another set.
 *
 * @param listenerType the listener type which constrains the set of exposed APIs
 * @param minRecordVersion min inter broker magic
 * @param activeControllerApiVersions controller ApiVersions
 * @return commonly agreed ApiVersion collection
 */
public static ApiVersionCollection intersectForwardableApis(final ApiMessageType.ListenerType listenerType, final RecordVersion minRecordVersion, final Map<ApiKeys, ApiVersion> activeControllerApiVersions) {
    ApiVersionCollection apiKeys = new ApiVersionCollection();
    for (ApiKeys apiKey : ApiKeys.apisForListener(listenerType)) {
        if (apiKey.minRequiredInterBrokerMagic <= minRecordVersion.value) {
            ApiVersion brokerApiVersion = toApiVersion(apiKey);
            final ApiVersion finalApiVersion;
            if (!apiKey.forwardable) {
                finalApiVersion = brokerApiVersion;
            } else {
                Optional<ApiVersion> intersectVersion = intersect(brokerApiVersion, activeControllerApiVersions.getOrDefault(apiKey, null));
                if (intersectVersion.isPresent()) {
                    finalApiVersion = intersectVersion.get();
                } else {
                    // Controller doesn't support this API key, or there is no intersection.
                    continue;
                }
            }
            apiKeys.add(finalApiVersion.duplicate());
        }
    }
    return apiKeys;
}
Also used : ApiVersionCollection(org.apache.kafka.common.message.ApiVersionsResponseData.ApiVersionCollection) ApiKeys(org.apache.kafka.common.protocol.ApiKeys) ApiVersion(org.apache.kafka.common.message.ApiVersionsResponseData.ApiVersion)

Example 10 with ApiVersionCollection

use of org.apache.kafka.common.message.ApiVersionsResponseData.ApiVersionCollection in project kafka by apache.

the class ApiVersionsRequest method getErrorResponse.

@Override
public ApiVersionsResponse getErrorResponse(int throttleTimeMs, Throwable e) {
    ApiVersionsResponseData data = new ApiVersionsResponseData().setErrorCode(Errors.forException(e).code());
    if (version() >= 1) {
        data.setThrottleTimeMs(throttleTimeMs);
    }
    // versions of the ApiVersionsRequest when an UNSUPPORTED_VERSION error is returned.
    if (Errors.forException(e) == Errors.UNSUPPORTED_VERSION) {
        ApiVersionCollection apiKeys = new ApiVersionCollection();
        apiKeys.add(ApiVersionsResponse.toApiVersion(ApiKeys.API_VERSIONS));
        data.setApiKeys(apiKeys);
    }
    return new ApiVersionsResponse(data);
}
Also used : ApiVersionCollection(org.apache.kafka.common.message.ApiVersionsResponseData.ApiVersionCollection) ApiVersionsResponseData(org.apache.kafka.common.message.ApiVersionsResponseData)

Aggregations

ApiVersionCollection (org.apache.kafka.common.message.ApiVersionsResponseData.ApiVersionCollection)10 ApiVersionsResponseData (org.apache.kafka.common.message.ApiVersionsResponseData)6 ApiVersion (org.apache.kafka.common.message.ApiVersionsResponseData.ApiVersion)6 Test (org.junit.jupiter.api.Test)5 ListenerName (org.apache.kafka.common.network.ListenerName)3 ApiKeys (org.apache.kafka.common.protocol.ApiKeys)3 ApiVersionsResponse (org.apache.kafka.common.requests.ApiVersionsResponse)3 ParameterizedTest (org.junit.jupiter.params.ParameterizedTest)3 ByteBuffer (java.nio.ByteBuffer)2 NioEchoServer (org.apache.kafka.common.network.NioEchoServer)2 SaslChannelBuilder (org.apache.kafka.common.network.SaslChannelBuilder)2 JaasContext (org.apache.kafka.common.security.JaasContext)2 TestSecurityConfig (org.apache.kafka.common.security.TestSecurityConfig)2 LogContext (org.apache.kafka.common.utils.LogContext)2 HashMap (java.util.HashMap)1 Map (java.util.Map)1 ChannelMetadataRegistry (org.apache.kafka.common.network.ChannelMetadataRegistry)1 Send (org.apache.kafka.common.network.Send)1 TransportLayer (org.apache.kafka.common.network.TransportLayer)1 RequestHeader (org.apache.kafka.common.requests.RequestHeader)1