Sfoglia il codice sorgente

#224 added deleteTopic operation api (#228)

* added deleteTopic operation

* added not found response
Ramazan Yapparov 4 anni fa
parent
commit
a9cb9567d6

+ 16 - 0
kafka-ui-api/src/main/java/com/provectus/kafka/ui/cluster/service/ClusterService.java

@@ -1,5 +1,6 @@
 package com.provectus.kafka.ui.cluster.service;
 
+import com.provectus.kafka.ui.cluster.exception.NotFoundException;
 import com.provectus.kafka.ui.cluster.mapper.ClusterMapper;
 import com.provectus.kafka.ui.cluster.model.ClustersStorage;
 import com.provectus.kafka.ui.cluster.model.ConsumerPosition;
@@ -169,12 +170,27 @@ public class ClusterService {
         ).orElse(Mono.empty());
     }
 
+    public Mono<Void> deleteTopic(String clusterName, String topicName) {
+        var cluster = clustersStorage.getClusterByName(clusterName)
+                .orElseThrow(() -> new NotFoundException("No such cluster"));
+        getTopicDetails(clusterName, topicName)
+                .orElseThrow(() -> new NotFoundException("No such topic"));
+        return kafkaService.deleteTopic(cluster, topicName)
+                .doOnNext(t -> updateCluster(topicName, clusterName, cluster));
+    }
+
     private KafkaCluster updateCluster(InternalTopic topic, String clusterName, KafkaCluster cluster) {
         final KafkaCluster updatedCluster = kafkaService.getUpdatedCluster(cluster, topic);
         clustersStorage.setKafkaCluster(clusterName, updatedCluster);
         return updatedCluster;
     }
 
+    private KafkaCluster updateCluster(String topicToDelete, String clusterName, KafkaCluster cluster) {
+        final KafkaCluster updatedCluster = kafkaService.getUpdatedCluster(cluster, topicToDelete);
+        clustersStorage.setKafkaCluster(clusterName, updatedCluster);
+        return updatedCluster;
+    }
+
     public Flux<TopicMessage> getMessages(String clusterName, String topicName, ConsumerPosition consumerPosition, String query, Integer limit) {
         return clustersStorage.getClusterByName(clusterName)
                 .map(c -> consumingService.loadMessages(c, topicName, consumerPosition, query, limit))

+ 13 - 0
kafka-ui-api/src/main/java/com/provectus/kafka/ui/kafka/KafkaService.java

@@ -56,6 +56,12 @@ public class KafkaService {
         return cluster.toBuilder().topics(topics).build();
     }
 
+    public KafkaCluster getUpdatedCluster(KafkaCluster cluster, String topicToDelete) {
+        final Map<String, InternalTopic> topics = new HashMap<>(cluster.getTopics());
+        topics.remove(topicToDelete);
+        return cluster.toBuilder().topics(topics).build();
+    }
+
     @SneakyThrows
     public Mono<KafkaCluster> getUpdatedCluster(KafkaCluster cluster) {
         return getOrCreateAdminClient(cluster)
@@ -184,6 +190,13 @@ public class KafkaService {
         return getOrCreateAdminClient(cluster).flatMap(ac -> createTopic(ac.getAdminClient(), topicFormData));
     }
 
+    public Mono<Void> deleteTopic(KafkaCluster cluster, String topicName) {
+        return getOrCreateAdminClient(cluster)
+                .map(ExtendedAdminClient::getAdminClient)
+                .map(adminClient -> adminClient.deleteTopics(List.of(topicName)))
+                .then();
+    }
+
     @SneakyThrows
     public Mono<InternalTopic> createTopic(AdminClient adminClient, Mono<TopicFormData> topicFormData) {
         return topicFormData.flatMap(

+ 5 - 0
kafka-ui-api/src/main/java/com/provectus/kafka/ui/rest/MetricsRestController.java

@@ -158,6 +158,11 @@ public class MetricsRestController implements ApiClustersApi {
         return clusterService.updateTopic(clusterId, topicName, topicFormData).map(ResponseEntity::ok);
     }
 
+    @Override
+    public Mono<ResponseEntity<Void>> deleteTopic(String clusterName, String topicName, ServerWebExchange exchange) {
+        return clusterService.deleteTopic(clusterName, topicName).map(ResponseEntity::ok);
+    }
+
     @Override
     public Mono<ResponseEntity<CompatibilityLevel>> getGlobalSchemaCompatibilityLevel(String clusterName, ServerWebExchange exchange) {
         return schemaRegistryService.getGlobalSchemaCompatibilityLevel(clusterName)

+ 21 - 0
kafka-ui-contract/src/main/resources/swagger/kafka-ui-api.yaml

@@ -215,6 +215,27 @@ paths:
             application/json:
               schema:
                 $ref: '#/components/schemas/Topic'
+    delete:
+      tags:
+        - /api/clusters
+      summary: deleteTopic
+      operationId: deleteTopic
+      parameters:
+        - name: clusterName
+          in: path
+          required: true
+          schema:
+            type: string
+        - name: topicName
+          in: path
+          required: true
+          schema:
+            type: string
+      responses:
+        200:
+          description: OK
+        404:
+          description: Not found
 
   /api/clusters/{clusterName}/topics/{topicName}/config:
     get: