Skip to content

Commit d23380a

Browse files
authored
Merge branch 'main' into table_filters
2 parents 9714f62 + ef20ab2 commit d23380a

File tree

8 files changed

+56
-21
lines changed

8 files changed

+56
-21
lines changed

api/build.gradle

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -53,15 +53,13 @@ dependencies {
5353
exclude group: 'io.projectreactor.ipc', module: 'reactor-netty'
5454
}
5555

56-
runtimeOnly libs.micrometer.registry.prometheus
56+
runtimeOnly(libs.micrometer.registry.prometheus) {
57+
exclude group: 'com.google.protobuf', module: 'protobuf-java' because("Micrometer uses protobuf-java 4.x, which is incompatible with protobuf-java 3.x used by various dependencies of this project. See https://github.com/prometheus/client_java/issues/1431")
58+
}
5759

5860
// CVE Fixes
5961
implementation libs.apache.commons.compress
6062
implementation libs.okhttp3.logging.intercepter
61-
implementation libs.json.smart
62-
implementation libs.netty.common
63-
implementation libs.netty.handler
64-
implementation libs.spring.context
6563

6664
implementation libs.modelcontextprotocol.spring.webflux
6765
implementation libs.victools.jsonschema.generator

api/src/main/java/io/kafbat/ui/controller/AclsController.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ public Mono<ResponseEntity<Flux<KafkaAclDTO>>> listAcls(String clusterName,
6868
KafkaAclResourceTypeDTO resourceTypeDto,
6969
String resourceName,
7070
KafkaAclNamePatternTypeDTO namePatternTypeDto,
71+
String search,
7172
ServerWebExchange exchange) {
7273
AccessContext context = AccessContext.builder()
7374
.cluster(clusterName)
@@ -88,7 +89,7 @@ public Mono<ResponseEntity<Flux<KafkaAclDTO>>> listAcls(String clusterName,
8889
return validateAccess(context).then(
8990
Mono.just(
9091
ResponseEntity.ok(
91-
aclsService.listAcls(getCluster(clusterName), filter)
92+
aclsService.listAcls(getCluster(clusterName), filter, search)
9293
.map(ClusterMapper::toKafkaAclDto)))
9394
).doOnEach(sig -> audit(context, sig));
9495
}

api/src/main/java/io/kafbat/ui/service/acl/AclsService.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,10 +68,11 @@ public Mono<Void> deleteAcl(KafkaCluster cluster, AclBinding aclBinding) {
6868
.doOnSuccess(v -> log.info("ACL DELETED: [{}]", aclString));
6969
}
7070

71-
public Flux<AclBinding> listAcls(KafkaCluster cluster, ResourcePatternFilter filter) {
71+
public Flux<AclBinding> listAcls(KafkaCluster cluster, ResourcePatternFilter filter, String principalSearch) {
7272
return adminClientService.get(cluster)
7373
.flatMap(c -> c.listAcls(filter))
7474
.flatMapIterable(acls -> acls)
75+
.filter(acl -> principalSearch == null || acl.entry().principal().contains(principalSearch))
7576
.sort(Comparator.comparing(AclBinding::toString)); //sorting to keep stable order on different calls
7677
}
7778

contract/src/main/resources/swagger/kafbat-ui-api.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1965,6 +1965,11 @@ paths:
19651965
required: false
19661966
schema:
19671967
$ref: '#/components/schemas/KafkaAclNamePatternType'
1968+
- name: search
1969+
in: query
1970+
required: false
1971+
schema:
1972+
type: string
19681973
responses:
19691974
200:
19701975
description: OK

frontend/src/components/ACLPage/List/List.tsx

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
import React from 'react';
1+
import React, { useEffect, useState } from 'react';
2+
import { useSearchParams } from 'react-router-dom';
23
import { ColumnDef, Row } from '@tanstack/react-table';
34
import Table from 'components/common/NewTable';
45
import { useConfirm } from 'lib/hooks/useConfirm';
@@ -19,14 +20,18 @@ import { useTheme } from 'styled-components';
1920
import ACLFormContext from 'components/ACLPage/Form/AclFormContext';
2021
import PlusIcon from 'components/common/Icons/PlusIcon';
2122
import ActionButton from 'components/common/ActionComponent/ActionButton/ActionButton';
23+
import { ControlPanelWrapper } from 'components/common/ControlPanel/ControlPanel.styled';
24+
import Search from 'components/common/Search/Search';
2225
import ResourcePageHeading from 'components/common/ResourcePageHeading/ResourcePageHeading';
2326
import BreakableTextCell from 'components/common/NewTable/BreakableTextCell';
2427

2528
import * as S from './List.styled';
2629

2730
const ACList: React.FC = () => {
2831
const { clusterName } = useAppParams<{ clusterName: ClusterName }>();
29-
const { data: aclList } = useAcls(clusterName);
32+
const [searchParams, setSearchParams] = useSearchParams();
33+
const [search, setSearch] = useState(searchParams.get('q') || '');
34+
const { data: aclList } = useAcls({ clusterName, search });
3035
const { deleteResource } = useDeleteAcl(clusterName);
3136
const modal = useConfirm(true);
3237
const theme = useTheme();
@@ -37,6 +42,17 @@ const ACList: React.FC = () => {
3742
} = useBoolean();
3843
const [rowId, setRowId] = React.useState('');
3944

45+
useEffect(() => {
46+
const params = new URLSearchParams(searchParams);
47+
if (search) {
48+
params.set('q', search);
49+
params.set('page', '1'); // reset to first page on new search
50+
} else {
51+
params.delete('q');
52+
}
53+
setSearchParams(params, { replace: true });
54+
}, [search]);
55+
4056
const handleDeleteClick = (acl: KafkaAcl | null) => {
4157
if (acl) {
4258
modal('Are you sure want to delete this ACL record?', () =>
@@ -164,6 +180,13 @@ const ACList: React.FC = () => {
164180
<PlusIcon /> Create ACL
165181
</ActionButton>
166182
</ResourcePageHeading>
183+
<ControlPanelWrapper hasInput>
184+
<Search
185+
placeholder="Search by Principal Name"
186+
value={search}
187+
onChange={setSearch}
188+
/>
189+
</ControlPanelWrapper>
167190
<Table
168191
columns={columns}
169192
data={aclList ?? []}

frontend/src/components/ConsumerGroups/Details/ResetOffsets/Form.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ const Form: React.FC<FormProps> = ({ defaultValues, partitions, topics }) => {
9898

9999
const onSubmit = async (data: ConsumerGroupOffsetsReset) => {
100100
await reset.mutateAsync(data);
101-
navigate('../');
101+
navigate(-1);
102102
};
103103

104104
return (

frontend/src/lib/hooks/api/acl.ts

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,22 @@ import {
1414
KafkaAcl,
1515
} from 'generated-sources';
1616

17-
export function useAcls(clusterName: ClusterName) {
17+
export function useAcls({
18+
clusterName,
19+
search,
20+
}: {
21+
clusterName: ClusterName;
22+
search?: string;
23+
}) {
1824
return useQuery(
19-
['clusters', clusterName, 'acls'],
20-
() => api.listAcls({ clusterName }),
25+
['clusters', clusterName, 'acls', { search }],
26+
() =>
27+
api.listAcls({
28+
clusterName,
29+
search,
30+
}),
2131
{
32+
keepPreviousData: true,
2233
suspense: false,
2334
}
2435
);

gradle/libs.versions.toml

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
[versions]
2-
spring-boot = '3.4.5'
2+
spring-boot = '3.5.3'
33

44
aws-msk-auth = '2.3.0'
55
azure-identity = '1.15.4'
@@ -21,7 +21,9 @@ lombok = '1.18.34'
2121
odd-oddrn-generator = '0.1.17'
2222
odd-oddrn-client = '0.1.41'
2323
cel = '0.3.0'
24-
junit = '5.11.2'
24+
# This version should be compatible with the version used by spring-boot-starter-test to avoid conflicts
25+
# See https://github.com/spring-projects/spring-boot/blob/b6b570ebebb6ea233e00af5e554adcf40256f224/gradle.properties#L16C21-L16C27
26+
junit = '5.12.2'
2527
mockito = '5.16.0'
2628
okhttp3 = '4.12.0'
2729
testcontainers = '1.20.6'
@@ -126,12 +128,6 @@ aspectj = { module = 'org.aspectj:aspectjweaver', version.ref = 'aspectj' }
126128
bonigarcia-webdrivermanager = { module = 'io.github.bonigarcia:webdrivermanager', version.ref = 'bonigarcia-webdrivermanager' }
127129
netty-resolver-dns-native = { module = 'io.netty:netty-resolver-dns-native-macos' }
128130

129-
# CVE fixes
130-
json-smart = { module = 'net.minidev:json-smart', version = '2.5.2' }
131-
netty-common = { module = 'io.netty:netty-common', version.ref = 'netty' }
132-
netty-handler = { module = 'io.netty:netty-handler', version.ref = 'netty' }
133-
spring-context = { module = 'org.springframework:spring-context', version = '6.2.7' }
134-
135131
# test scope
136132
bouncycastle-bcpkix = { module = 'org.bouncycastle:bcpkix-jdk18on', version = '1.80' }
137133

0 commit comments

Comments
 (0)