Skip to content

Commit 95273c4

Browse files
authored
Merge branch 'main' into issues/1332-be
2 parents 197d34c + b4106e2 commit 95273c4

File tree

27 files changed

+269
-146
lines changed

27 files changed

+269
-146
lines changed

api/Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# The tag is ignored when a sha is included but the reason to add it are:
22
# 1. Self Documentation: It is difficult to find out what the expected tag is given a sha alone
33
# 2. Helps dependabot during discovery of upgrades
4-
FROM azul/zulu-openjdk-alpine:21.0.8-jre-headless@sha256:49992ca94d08736b6827ad3289114acc7934a0da543f3bff208c3df46ed1108c
4+
FROM azul/zulu-openjdk-alpine:21.0.8-jre-headless@sha256:48356cf1b81243b6e236509bb6ae281969fc0eade03f622220973a4e224cd768
55

66
RUN apk add --no-cache \
77
# snappy codec

api/src/main/java/io/kafbat/ui/mapper/KafkaConnectMapper.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@
22

33
import io.kafbat.ui.config.ClustersProperties;
44
import io.kafbat.ui.connect.model.ClusterInfo;
5+
import io.kafbat.ui.connect.model.Connector;
56
import io.kafbat.ui.connect.model.ConnectorStatusConnector;
67
import io.kafbat.ui.connect.model.ConnectorTask;
8+
import io.kafbat.ui.connect.model.ConnectorTopics;
79
import io.kafbat.ui.connect.model.ExpandedConnector;
810
import io.kafbat.ui.connect.model.NewConnector;
911
import io.kafbat.ui.model.ConnectDTO;
@@ -42,6 +44,14 @@ default ClusterInfo toClient(KafkaConnectState state) {
4244
@Mapping(target = "connect", ignore = true)
4345
ConnectorDTO fromClient(io.kafbat.ui.connect.model.Connector connector);
4446

47+
default ConnectorDTO fromClient(Connector connector, ConnectorTopics topics) {
48+
ConnectorDTO connectorDto = this.fromClient(connector);
49+
if (topics != null) {
50+
return connectorDto.topics(topics.getTopics());
51+
}
52+
return connectorDto;
53+
}
54+
4555
ConnectorStatusDTO fromClient(ConnectorStatusConnector connectorStatus);
4656

4757
@Mapping(target = "status", ignore = true)
@@ -177,6 +187,4 @@ default KafkaConnectState.ConnectorState toScrapeState(InternalConnectorInfo con
177187
connector.getTopics()
178188
);
179189
}
180-
181-
182190
}

api/src/main/java/io/kafbat/ui/model/rbac/permission/TopicAction.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ public enum TopicAction implements PermissibleAction {
1212
DELETE(VIEW),
1313
MESSAGES_READ(VIEW),
1414
MESSAGES_PRODUCE(VIEW),
15-
MESSAGES_DELETE(VIEW, EDIT),
15+
MESSAGES_DELETE(VIEW),
1616
ANALYSIS_VIEW(VIEW),
1717
ANALYSIS_RUN(VIEW, ANALYSIS_VIEW),
1818

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -226,8 +226,9 @@ private Mono<Boolean> connectorExists(KafkaCluster cluster, String connectName,
226226
public Mono<ConnectorDTO> getConnector(KafkaCluster cluster, String connectName,
227227
String connectorName) {
228228
return api(cluster, connectName)
229-
.mono(client -> client.getConnector(connectorName)
230-
.map(kafkaConnectMapper::fromClient)
229+
.mono(client ->
230+
Mono.zip(client.getConnector(connectorName), getConnectorTopics(cluster, connectName, connectorName))
231+
.map(t -> kafkaConnectMapper.fromClient(t.getT1(), t.getT2()))
231232
.flatMap(connector ->
232233
client.getConnectorStatus(connector.getName())
233234
// status request can return 404 if tasks not assigned yet

contract-typespec/api/kafka-connect.tsp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,7 @@ model Connector {
225225
type: ConnectorType;
226226
status: ConnectorStatus;
227227
connect: string;
228+
topics?: string[];
228229
}
229230

230231
enum ConnectorAction {

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3674,6 +3674,10 @@ components:
36743674
$ref: '#/components/schemas/ConnectorStatus'
36753675
connect:
36763676
type: string
3677+
topics:
3678+
type: array
3679+
items:
3680+
type: string
36773681
required:
36783682
- type
36793683
- status

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import ResourcePageHeading from 'components/common/ResourcePageHeading/ResourceP
2626
import BreakableTextCell from 'components/common/NewTable/BreakableTextCell';
2727
import { useQueryPersister } from 'components/common/NewTable/ColumnFilter';
2828
import { ActionPermissionWrapper } from 'components/common/ActionComponent';
29+
import ClusterContext from 'components/contexts/ClusterContext';
2930

3031
import * as S from './List.styled';
3132

@@ -35,6 +36,7 @@ const ACList: React.FC = () => {
3536
const [search, setSearch] = useState(searchParams.get('q') || '');
3637
const { data: aclList } = useAcls({ clusterName, search });
3738
const { deleteResource } = useDeleteAcl(clusterName);
39+
const { isReadOnly } = React.useContext(ClusterContext);
3840
const modal = useConfirm(true);
3941
const theme = useTheme();
4042
const {
@@ -198,6 +200,7 @@ const ACList: React.FC = () => {
198200
buttonType="primary"
199201
buttonSize="M"
200202
onClick={openFrom}
203+
disabled={isReadOnly}
201204
permission={{
202205
resource: ResourceType.ACL,
203206
action: Action.EDIT,
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import React from 'react';
2+
import { FullConnectorInfo } from 'generated-sources';
3+
import Table from 'components/common/NewTable';
4+
import { useLocalStoragePersister } from 'components/common/NewTable/ColumnResizer/lib';
5+
import { useQueryPersister } from 'components/common/NewTable/ColumnFilter';
6+
import { VisibilityState } from '@tanstack/react-table';
7+
8+
import { connectorsColumns } from './connectorsColumns/columns';
9+
10+
const setRowId = (originalRow: FullConnectorInfo) =>
11+
`${originalRow.name}-${originalRow.connect}`;
12+
13+
type ConnectorsTableProps = {
14+
connectors: FullConnectorInfo[];
15+
columnSizingPersistKey?: string;
16+
columnVisibility?: VisibilityState;
17+
};
18+
19+
export const ConnectorsTable = ({
20+
connectors,
21+
columnSizingPersistKey = 'KafkaConnect',
22+
columnVisibility,
23+
}: ConnectorsTableProps) => {
24+
const filterPersister = useQueryPersister(connectorsColumns);
25+
const columnSizingPersister = useLocalStoragePersister(
26+
columnSizingPersistKey
27+
);
28+
29+
return (
30+
<Table
31+
data={connectors}
32+
columns={connectorsColumns}
33+
enableSorting
34+
enableColumnResizing
35+
columnSizingPersister={columnSizingPersister}
36+
emptyMessage="No connectors found"
37+
setRowId={setRowId}
38+
filterPersister={filterPersister}
39+
columnVisibility={columnVisibility}
40+
/>
41+
);
42+
};

frontend/src/components/Connect/List/ActionsCell.tsx renamed to frontend/src/components/Connect/List/ConnectorsTable/connectorsColumns/cells/ActionsCell.tsx

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import {
77
ResourceType,
88
} from 'generated-sources';
99
import { CellContext } from '@tanstack/react-table';
10-
import { ClusterNameRoute } from 'lib/paths';
10+
import { RouteParamsClusterTopic } from 'lib/paths';
1111
import useAppParams from 'lib/hooks/useAppParams';
1212
import { Dropdown } from 'components/common/Dropdown';
1313
import {
@@ -24,7 +24,7 @@ const ActionsCell: React.FC<CellContext<FullConnectorInfo, unknown>> = ({
2424
row,
2525
}) => {
2626
const { connect, name, status } = row.original;
27-
const { clusterName } = useAppParams<ClusterNameRoute>();
27+
const { clusterName, topicName } = useAppParams<RouteParamsClusterTopic>();
2828
const { isReadOnly } = useContext(ClusterContext);
2929
const mutationsNumber = useIsMutating();
3030
const isMutating = mutationsNumber > 0;
@@ -33,16 +33,19 @@ const ActionsCell: React.FC<CellContext<FullConnectorInfo, unknown>> = ({
3333
clusterName,
3434
connectName: connect,
3535
connectorName: name,
36+
topicName,
3637
});
3738
const stateMutation = useUpdateConnectorState({
3839
clusterName,
3940
connectName: connect,
4041
connectorName: name,
42+
topicName,
4143
});
4244
const resetConnectorOffsetsMutation = useResetConnectorOffsets({
4345
clusterName,
4446
connectName: connect,
4547
connectorName: name,
48+
topicName,
4649
});
4750
const handleDelete = () => {
4851
confirm(
@@ -54,7 +57,7 @@ const ActionsCell: React.FC<CellContext<FullConnectorInfo, unknown>> = ({
5457
}
5558
);
5659
};
57-
// const stateMutation = useUpdateConnectorState(routerProps);
60+
5861
const resumeConnectorHandler = () =>
5962
stateMutation.mutateAsync(ConnectorAction.RESUME);
6063
const restartConnectorHandler = () =>

0 commit comments

Comments
 (0)