Skip to content

Commit 7d0ff44

Browse files
authored
* Fix kroxylicious#3002 Signed-off-by: Tom Bentley <tbentley@redhat.com>
1 parent b5c2826 commit 7d0ff44

3 files changed

Lines changed: 58 additions & 1 deletion

File tree

kroxylicious-filters/kroxylicious-authorization/src/main/java/io/kroxylicious/filter/authorization/AuthorizationFilter.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ CompletionStage<ResponseFilterResult> onResponse(ResponseHeaderData header, ApiV
9696
apiEnforcement.put(ApiKeys.ALTER_CONFIGS, new AlterConfigsEnforcement());
9797
apiEnforcement.put(ApiKeys.INCREMENTAL_ALTER_CONFIGS, new IncrementalAlterConfigsEnforcement());
9898
apiEnforcement.put(ApiKeys.CONSUMER_GROUP_DESCRIBE, new ConsumerGroupDescribeEnforcement());
99+
apiEnforcement.put(ApiKeys.DESCRIBE_GROUPS, new Passthrough<>(0, 6));
99100
}
100101

101102
@VisibleForTesting

kroxylicious-filters/kroxylicious-authorization/src/test/java/io/kroxylicious/filter/authorization/AuthorizationFilterTest.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,8 @@ void shouldSupportApis() {
203203
ApiKeys.DESCRIBE_CONFIGS,
204204
ApiKeys.ALTER_CONFIGS,
205205
ApiKeys.INCREMENTAL_ALTER_CONFIGS,
206-
ApiKeys.CONSUMER_GROUP_DESCRIBE);
206+
ApiKeys.CONSUMER_GROUP_DESCRIBE,
207+
ApiKeys.DESCRIBE_GROUPS);
207208
EnumSet<ApiKeys> someVersionsSupported = of(ApiKeys.PRODUCE,
208209
ApiKeys.FETCH,
209210
ApiKeys.OFFSET_COMMIT,

kroxylicious-integration-tests/src/test/java/io/kroxylicious/proxy/filter/authorization/ClientAuthzIT.java

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@
2727
import org.apache.kafka.clients.admin.AlterConfigOp;
2828
import org.apache.kafka.clients.admin.Config;
2929
import org.apache.kafka.clients.admin.ConfigEntry;
30+
import org.apache.kafka.clients.admin.ConsumerGroupDescription;
31+
import org.apache.kafka.clients.admin.MemberDescription;
3032
import org.apache.kafka.clients.admin.NewPartitions;
3133
import org.apache.kafka.clients.admin.NewTopic;
3234
import org.apache.kafka.clients.admin.TopicDescription;
@@ -95,6 +97,7 @@ class ClientAuthzIT extends AuthzIT {
9597
public static final IntegerSerializer INTEGER_SERIALIZER = new IntegerSerializer();
9698
public static final StringDeserializer STRING_DESERIALIZER = new StringDeserializer();
9799
public static final IntegerDeserializer INTEGER_DESERIALIZER = new IntegerDeserializer();
100+
public static final int UUID_STRING_LENGTH = 36;
98101

99102
@Name("kafkaClusterWithAuthz")
100103
static Admin kafkaClusterWithAuthzAdmin;
@@ -349,6 +352,24 @@ public Outcome<Void> alterConfigs(ConfigResource.Type type, String resourceName,
349352
}
350353
return trace("alterConfigs", outcome);
351354
}
355+
356+
public Outcome<ConsumerGroupDescription> describeConsumerGroup(String groupId) {
357+
Outcome<ConsumerGroupDescription> outcome;
358+
try {
359+
outcome = new Success<>(admin
360+
.describeConsumerGroups(List.of(groupId))
361+
.all()
362+
.get().get(groupId));
363+
}
364+
catch (ExecutionException e) {
365+
outcome = Fail.of(e);
366+
}
367+
catch (InterruptedException e) {
368+
throw new RuntimeException(e);
369+
}
370+
trace("describeConsumerGroup", outcome.map(ClientAuthzIT::cleanConsumerGroupDescription));
371+
return outcome;
372+
}
352373
}
353374

354375
record ProducerContext<V>(String user,
@@ -651,6 +672,7 @@ public void run(ClientFactory clientFactory) throws InterruptedException {
651672
String setupUser = ALICE;
652673
String producerUser = ALICE;
653674
String consumerUser = ALICE;
675+
String adminUser = ALICE;
654676

655677
try (var setup = clientFactory.newAdmin(setupUser, Map.of(AdminClientConfig.CLIENT_ID_CONFIG, "setup"))) {
656678
setup.createTopic(topicA);
@@ -721,6 +743,12 @@ public void run(ClientFactory clientFactory) throws InterruptedException {
721743
transactionalProducer.commitTransaction();
722744

723745
}
746+
747+
try (var admin = clientFactory.newAdmin(adminUser, Map.of(AdminClientConfig.CLIENT_ID_CONFIG, "admin"))) {
748+
ConsumerGroupDescription actual = admin.describeConsumerGroup(GROUP_2).value();
749+
assertThat(actual.groupId()).isEqualTo(GROUP_2);
750+
assertThat(actual.members()).hasSize(1);
751+
}
724752
}
725753
setup.deleteTopic(topicA);
726754
}
@@ -921,6 +949,33 @@ static TopicPartitionInfo cleanTopicPartitionInfo(TopicPartitionInfo topicPartit
921949
}
922950
}
923951

952+
static ConsumerGroupDescription cleanConsumerGroupDescription(ConsumerGroupDescription groupDescription) {
953+
return new ConsumerGroupDescription(
954+
groupDescription.groupId(),
955+
groupDescription.isSimpleConsumerGroup(),
956+
groupDescription.members().stream().map(ClientAuthzIT::cleanGroupMember).toList(),
957+
groupDescription.partitionAssignor(),
958+
groupDescription.type(),
959+
groupDescription.groupState(),
960+
cleanNode(groupDescription.coordinator()),
961+
groupDescription.authorizedOperations(),
962+
groupDescription.groupEpoch(),
963+
groupDescription.targetAssignmentEpoch());
964+
}
965+
966+
private static MemberDescription cleanGroupMember(MemberDescription memberDescription) {
967+
return new MemberDescription(
968+
memberDescription.consumerId().substring(0,
969+
memberDescription.consumerId().length() - UUID_STRING_LENGTH),
970+
memberDescription.groupInstanceId(),
971+
memberDescription.clientId(),
972+
memberDescription.host(),
973+
memberDescription.assignment(),
974+
memberDescription.targetAssignment(),
975+
memberDescription.memberEpoch(),
976+
memberDescription.upgraded());
977+
}
978+
924979
static List<Node> cleanNodes(List<Node> nodes) {
925980
return nodes.stream()
926981
.map(ClientAuthzIT::cleanNode)

0 commit comments

Comments
 (0)