@Override public AbstractResponse getErrorResponse(int throttleTimeMs, Throwable throwable) { short versionId = version(); switch (versionId) { case 0: case 1: return new DescribeAclsResponse(throttleTimeMs, ApiError.fromThrowable(throwable), Collections.emptySet()); default: throw new IllegalArgumentException(String.format("Version %d is not valid. Valid versions for %s are 0 to %d", versionId, this.getClass().getSimpleName(), ApiKeys.DESCRIBE_ACLS.latestVersion())); } }
@Override public Map<Errors, Integer> errorCounts() { return errorCounts(error.error()); }
@Test(expected = UnsupportedVersionException.class) public void shouldThrowOnV0IfNotLiteral() { new DescribeAclsResponse(10, ApiError.NONE, aclBindings(PREFIXED_ACL1)).toStruct(V0); }
private static void assertResponseEquals(final DescribeAclsResponse original, final DescribeAclsResponse actual) { final Set<AclBinding> originalBindings = new HashSet<>(original.acls()); final Set<AclBinding> actualBindings = new HashSet<>(actual.acls()); assertEquals(originalBindings, actualBindings); }
@Override protected Struct toStruct(short version) { validate(version); Struct struct = new Struct(ApiKeys.DESCRIBE_ACLS.responseSchema(version)); struct.set(THROTTLE_TIME_MS, throttleTimeMs); error.write(struct); Map<ResourcePattern, List<AccessControlEntry>> resourceToData = new HashMap<>(); for (AclBinding acl : acls) { resourceToData .computeIfAbsent(acl.pattern(), k -> new ArrayList<>()) .add(acl.entry()); } List<Struct> resourceStructs = new ArrayList<>(); for (Map.Entry<ResourcePattern, List<AccessControlEntry>> tuple : resourceToData.entrySet()) { ResourcePattern resource = tuple.getKey(); Struct resourceStruct = struct.instance(RESOURCES_KEY_NAME); RequestUtils.resourcePatternSetStructFields(resource, resourceStruct); List<Struct> dataStructs = new ArrayList<>(); for (AccessControlEntry entry : tuple.getValue()) { Struct dataStruct = resourceStruct.instance(ACLS_KEY_NAME); RequestUtils.aceSetStructFields(entry, dataStruct); dataStructs.add(dataStruct); } resourceStruct.set(ACLS_KEY_NAME, dataStructs.toArray()); resourceStructs.add(resourceStruct); } struct.set(RESOURCES_KEY_NAME, resourceStructs.toArray()); return struct; }
@Test public void shouldRoundTripV0() { final DescribeAclsResponse original = new DescribeAclsResponse(10, ApiError.NONE, aclBindings(LITERAL_ACL1, LITERAL_ACL2)); final Struct struct = original.toStruct(V0); final DescribeAclsResponse result = new DescribeAclsResponse(struct); assertResponseEquals(original, result); }
@Test public void shouldRoundTripV1() { final DescribeAclsResponse original = new DescribeAclsResponse(100, ApiError.NONE, aclBindings(LITERAL_ACL1, PREFIXED_ACL1)); final Struct struct = original.toStruct(V1); final DescribeAclsResponse result = new DescribeAclsResponse(struct); assertResponseEquals(original, result); }
public static DescribeAclsResponse parse(ByteBuffer buffer, short version) { return new DescribeAclsResponse(ApiKeys.DESCRIBE_ACLS.responseSchema(version).read(buffer)); }
@Test(expected = IllegalArgumentException.class) public void shouldThrowIfUnknown() { new DescribeAclsResponse(10, ApiError.NONE, aclBindings(UNKNOWN_ACL)).toStruct(V0); }
private DescribeAclsResponse createDescribeAclsResponse() { return new DescribeAclsResponse(0, ApiError.NONE, Collections.singleton(new AclBinding( new ResourcePattern(ResourceType.TOPIC, "mytopic", PatternType.LITERAL), new AccessControlEntry("User:ANONYMOUS", "*", AclOperation.WRITE, AclPermissionType.ALLOW)))); }
@Test public void testDescribeAcls() throws Exception { try (AdminClientUnitTestEnv env = mockClientEnv()) { env.kafkaClient().setNodeApiVersions(NodeApiVersions.create()); // Test a call where we get back ACL1 and ACL2. env.kafkaClient().prepareResponse(new DescribeAclsResponse(0, ApiError.NONE, asList(ACL1, ACL2))); assertCollectionIs(env.adminClient().describeAcls(FILTER1).values().get(), ACL1, ACL2); // Test a call where we get back no results. env.kafkaClient().prepareResponse(new DescribeAclsResponse(0, ApiError.NONE, Collections.<AclBinding>emptySet())); assertTrue(env.adminClient().describeAcls(FILTER2).values().get().isEmpty()); // Test a call where we get back an error. env.kafkaClient().prepareResponse(new DescribeAclsResponse(0, new ApiError(Errors.SECURITY_DISABLED, "Security is disabled"), Collections.<AclBinding>emptySet())); TestUtils.assertFutureError(env.adminClient().describeAcls(FILTER2).values(), SecurityDisabledException.class); // Test a call where we supply an invalid filter. TestUtils.assertFutureError(env.adminClient().describeAcls(UNKNOWN_FILTER).values(), InvalidRequestException.class); } }
return new TxnOffsetCommitResponse(struct); case DESCRIBE_ACLS: return new DescribeAclsResponse(struct); case CREATE_ACLS: return new CreateAclsResponse(struct);