private Set<ApiKeys> apiKeysInResponse(final ApiVersionsResponse apiVersions) { final Set<ApiKeys> apiKeys = new HashSet<>(); for (final ApiVersionsResponse.ApiVersion version : apiVersions.apiVersions()) { apiKeys.add(ApiKeys.forId(version.apiKey)); } return apiKeys; }
private void verifyApiKeysForMagic(final ApiVersionsResponse response, final byte maxMagic) { for (final ApiVersionsResponse.ApiVersion version : response.apiVersions()) { assertTrue(ApiKeys.forId(version.apiKey).minRequiredInterBrokerMagic <= maxMagic); } }
private void handleApiVersionsResponse(List<ClientResponse> responses, InFlightRequest req, long now, ApiVersionsResponse apiVersionsResponse) { final String node = req.destination; if (apiVersionsResponse.error() != Errors.NONE) { if (req.request.version() == 0 || apiVersionsResponse.error() != Errors.UNSUPPORTED_VERSION) { log.warn("Received error {} from node {} when making an ApiVersionsRequest with correlation id {}. Disconnecting.", apiVersionsResponse.error(), node, req.header.correlationId()); this.selector.close(node); processDisconnection(responses, node, now, ChannelState.LOCAL_CLOSE); } else { nodesNeedingApiVersionsFetch.put(node, new ApiVersionsRequest.Builder((short) 0)); } return; } NodeApiVersions nodeVersionInfo = new NodeApiVersions(apiVersionsResponse.apiVersions()); apiVersions.update(node, nodeVersionInfo); this.connectionStates.ready(node); log.debug("Recorded API versions for node {}: {}", node, nodeVersionInfo); }
@Test public void testUsableVersionLatestVersions() { List<ApiVersion> versionList = new LinkedList<>(); for (ApiVersion apiVersion: ApiVersionsResponse.defaultApiVersionsResponse().apiVersions()) { versionList.add(apiVersion); } // Add an API key that we don't know about. versionList.add(new ApiVersion((short) 100, (short) 0, (short) 1)); NodeApiVersions versions = new NodeApiVersions(versionList); for (ApiKeys apiKey: ApiKeys.values()) { assertEquals(apiKey.latestVersion(), versions.latestUsableVersion(apiKey)); } } }
AbstractResponse.parseResponse(ApiKeys.API_VERSIONS, struct, (short) 0); assertEquals(Errors.UNSUPPORTED_VERSION, response.error()); assertTrue(response.apiVersions().isEmpty());
@Test public void shouldHaveCorrectDefaultApiVersionsResponse() { Collection<ApiVersionsResponse.ApiVersion> apiVersions = ApiVersionsResponse.defaultApiVersionsResponse().apiVersions(); assertEquals("API versions for all API keys must be maintained.", apiVersions.size(), ApiKeys.values().length); for (ApiKeys key : ApiKeys.values()) { ApiVersionsResponse.ApiVersion version = ApiVersionsResponse.defaultApiVersionsResponse().apiVersion(key.id); assertNotNull("Could not find ApiVersion for API " + key.name, version); assertEquals("Incorrect min version for Api " + key.name, version.minVersion, key.oldestVersion()); assertEquals("Incorrect max version for Api " + key.name, version.maxVersion, key.latestVersion()); // Check if versions less than min version are indeed set as null, i.e., deprecated. for (int i = 0; i < version.minVersion; ++i) { assertNull("Request version " + i + " for API " + version.apiKey + " must be null", key.requestSchemas[i]); assertNull("Response version " + i + " for API " + version.apiKey + " must be null", key.responseSchemas[i]); } // Check if versions between min and max versions are non null, i.e., valid. for (int i = version.minVersion; i <= version.maxVersion; ++i) { assertNotNull("Request version " + i + " for API " + version.apiKey + " must not be null", key.requestSchemas[i]); assertNotNull("Response version " + i + " for API " + version.apiKey + " must not be null", key.responseSchemas[i]); } } }