Skip to content

Commit f15be53

Browse files
authored
Merge branch 'main' into fix/displaying-instance
2 parents e538f91 + 772d137 commit f15be53

File tree

3 files changed

+70
-6
lines changed

3 files changed

+70
-6
lines changed

api/src/main/java/io/kafbat/ui/service/ReactiveAdminClient.java

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import io.kafbat.ui.exception.NotFoundException;
1414
import io.kafbat.ui.exception.ValidationException;
1515
import io.kafbat.ui.util.KafkaVersion;
16+
import io.kafbat.ui.util.MetadataVersion;
1617
import io.kafbat.ui.util.annotation.KafkaClientInternalsDependant;
1718
import java.io.Closeable;
1819
import java.time.Duration;
@@ -49,6 +50,8 @@
4950
import org.apache.kafka.clients.admin.DescribeClusterOptions;
5051
import org.apache.kafka.clients.admin.DescribeClusterResult;
5152
import org.apache.kafka.clients.admin.DescribeConfigsOptions;
53+
import org.apache.kafka.clients.admin.FeatureMetadata;
54+
import org.apache.kafka.clients.admin.FinalizedVersionRange;
5255
import org.apache.kafka.clients.admin.ListConsumerGroupOffsetsSpec;
5356
import org.apache.kafka.clients.admin.ListOffsetsResult;
5457
import org.apache.kafka.clients.admin.ListTopicsOptions;
@@ -96,6 +99,7 @@
9699
@Slf4j
97100
@AllArgsConstructor
98101
public class ReactiveAdminClient implements Closeable {
102+
private static final String DEFAULT_UNKNOWN_VERSION = "Unknown";
99103

100104
public enum SupportedFeature {
101105
INCREMENTAL_ALTER_CONFIGS(2.3f),
@@ -114,8 +118,8 @@ public enum SupportedFeature {
114118
this.predicate = (admin, ver) -> Mono.just(ver != null && ver >= fromVersion);
115119
}
116120

117-
static Mono<Set<SupportedFeature>> forVersion(AdminClient ac, String kafkaVersionStr) {
118-
@Nullable Float kafkaVersion = KafkaVersion.parse(kafkaVersionStr).orElse(null);
121+
static Mono<Set<SupportedFeature>> forVersion(AdminClient ac, Optional<String> kafkaVersionStr) {
122+
@Nullable Float kafkaVersion = kafkaVersionStr.flatMap(KafkaVersion::parse).orElse(null);
119123
return Flux.fromArray(SupportedFeature.values())
120124
.flatMap(f -> f.predicate.apply(ac, kafkaVersion).map(enabled -> Tuples.of(f, enabled)))
121125
.filter(Tuple2::getT2)
@@ -150,18 +154,28 @@ private static Mono<ConfigRelatedInfo> extract(AdminClient ac) {
150154
.orElse(desc.getNodes().iterator().next().id());
151155
return loadBrokersConfig(ac, List.of(targetNodeId))
152156
.map(map -> map.isEmpty() ? List.<ConfigEntry>of() : map.get(targetNodeId))
153-
.flatMap(configs -> {
154-
String version = "1.0-UNKNOWN";
157+
.zipWith(toMono(ac.describeFeatures().featureMetadata()))
158+
.flatMap(tuple -> {
159+
List<ConfigEntry> configs = tuple.getT1();
160+
FeatureMetadata featureMetadata = tuple.getT2();
161+
Optional<String> version = Optional.empty();
155162
boolean topicDeletionEnabled = true;
156163
for (ConfigEntry entry : configs) {
157164
if (entry.name().contains("inter.broker.protocol.version")) {
158-
version = entry.value();
165+
version = Optional.of(entry.value());
159166
}
160167
if (entry.name().equals("delete.topic.enable")) {
161168
topicDeletionEnabled = Boolean.parseBoolean(entry.value());
162169
}
163170
}
164-
final String finalVersion = version;
171+
if (version.isEmpty()) {
172+
FinalizedVersionRange metadataVersion =
173+
featureMetadata.finalizedFeatures().get("metadata.version");
174+
if (metadataVersion != null) {
175+
version = MetadataVersion.findVersion(metadataVersion.maxVersionLevel());
176+
}
177+
}
178+
final String finalVersion = version.orElse(DEFAULT_UNKNOWN_VERSION);
165179
final boolean finalTopicDeletionEnabled = topicDeletionEnabled;
166180
return SupportedFeature.forVersion(ac, version)
167181
.map(features -> new ConfigRelatedInfo(finalVersion, features, finalTopicDeletionEnabled));
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package io.kafbat.ui.util;
2+
3+
import java.util.Arrays;
4+
import java.util.Optional;
5+
6+
public enum MetadataVersion {
7+
IBP_3_0_IV1(1, "3.0-IV1"),
8+
IBP_3_1_IV0(2, "3.1-IV0"),
9+
IBP_3_2_IV0(3, "3.2-IV0"),
10+
IBP_3_3_IV0(4, "3.3-IV0"),
11+
IBP_3_3_IV1(5, "3.3-IV1"),
12+
IBP_3_3_IV2(6, "3.3-IV2"),
13+
IBP_3_3_IV3(7, "3.3-IV3"),
14+
IBP_3_4_IV0(8, "3.4-IV0"),
15+
IBP_3_5_IV0(9, "3.5-IV0"),
16+
IBP_3_5_IV1(10, "3.5-IV1"),
17+
IBP_3_5_IV2(11, "3.5-IV2"),
18+
IBP_3_6_IV0(12, "3.6-IV0"),
19+
IBP_3_6_IV1(13, "3.6-IV1"),
20+
IBP_3_6_IV2(14, "3.6-IV2"),
21+
IBP_3_7_IV0(15, "3.7-IV0"),
22+
IBP_3_7_IV1(16, "3.7-IV1"),
23+
IBP_3_7_IV2(17, "3.7-IV2"),
24+
IBP_3_7_IV3(18, "3.7-IV3"),
25+
IBP_3_7_IV4(19, "3.7-IV4"),
26+
IBP_3_8_IV0(20, "3.8-IV0"),
27+
IBP_3_9_IV0(21, "3.9-IV0"),
28+
IBP_4_0_IV0(22, "4.0-IV0"),
29+
IBP_4_0_IV1(23, "4.0-IV1"),
30+
IBP_4_0_IV2(24, "4.0-IV2"),
31+
IBP_4_0_IV3(25, "4.0-IV3"),
32+
IBP_4_1_IV0(26, "4.1-IV0");
33+
34+
private final int featureLevel;
35+
private final String release;
36+
37+
MetadataVersion(int featureLevel, String release) {
38+
this.featureLevel = featureLevel;
39+
this.release = release;
40+
}
41+
42+
public static Optional<String> findVersion(int featureLevel) {
43+
return Arrays.stream(values())
44+
.filter(v -> v.featureLevel == featureLevel)
45+
.findFirst().map(v -> v.release);
46+
}
47+
48+
}

frontend/src/widgets/ClusterConfigForm/schema.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,7 @@ const authSchema = lazy((value) => {
167167
'SASL/LDAP',
168168
'SASL/AWS IAM',
169169
'SASL/Azure Entra',
170+
'SASL/GCP IAM',
170171
'mTLS',
171172
]),
172173
securityProtocol: string()
@@ -183,6 +184,7 @@ const authSchema = lazy((value) => {
183184
'SASL/LDAP',
184185
'SASL/AWS IAM',
185186
'SASL/Azure Entra',
187+
'SASL/GCP IAM',
186188
].includes(v);
187189
},
188190
then: (schema) => schema.required('required field'),

0 commit comments

Comments
 (0)