diff --git a/src/main/java/com/michelin/ns4kafka/controller/ConnectorController.java b/src/main/java/com/michelin/ns4kafka/controller/ConnectorController.java index fd41b93fe..d6d605ddc 100644 --- a/src/main/java/com/michelin/ns4kafka/controller/ConnectorController.java +++ b/src/main/java/com/michelin/ns4kafka/controller/ConnectorController.java @@ -78,11 +78,12 @@ public Optional get(String namespace, String connector) { * * @param namespace The namespace * @param connector The connector to create - * @param dryrun Does the creation is a dry run + * @param dryrun Is dry run mode or not? * @return The created connector */ @Post("{?dryrun}") - public Mono> apply(String namespace, @Valid @Body Connector connector, + public Mono> apply(String namespace, + @Valid @Body Connector connector, @QueryValue(defaultValue = "false") boolean dryrun) { Namespace ns = getNamespace(namespace); @@ -162,14 +163,15 @@ public Mono> apply(String namespace, @Valid @Body Connec * * @param namespace The current namespace * @param connector The current connector name to delete - * @param dryrun Run in dry mode or not + * @param dryrun Is dry run mode or not? * @return A HTTP response * @deprecated use {@link #bulkDelete(String, String, boolean)} instead. */ - @Status(HttpStatus.NO_CONTENT) @Delete("/{connector}{?dryrun}") @Deprecated(since = "1.13.0") - public Mono> delete(String namespace, String connector, + @Status(HttpStatus.NO_CONTENT) + public Mono> delete(String namespace, + String connector, @QueryValue(defaultValue = "false") boolean dryrun) { Namespace ns = getNamespace(namespace); @@ -206,14 +208,15 @@ public Mono> delete(String namespace, String connector, * Delete connectors. * * @param namespace The current namespace - * @param name The name parameter - * @param dryrun Run in dry mode or not + * @param name The name parameter + * @param dryrun Run in dry mode or not? * @return A HTTP response */ - @Status(HttpStatus.NO_CONTENT) @Delete - public Mono> bulkDelete(String namespace, @QueryValue(defaultValue = "*") String name, - @QueryValue(defaultValue = "false") boolean dryrun) { + @Status(HttpStatus.OK) + public Mono>> bulkDelete(String namespace, + @QueryValue(defaultValue = "*") String name, + @QueryValue(defaultValue = "false") boolean dryrun) { Namespace ns = getNamespace(namespace); List connectors = connectorService.findByWildcardName(ns, name); @@ -233,7 +236,7 @@ public Mono> bulkDelete(String namespace, @QueryValue(default } if (dryrun) { - return Mono.just(HttpResponse.noContent()); + return Mono.just(HttpResponse.ok(connectors)); } return Flux.fromIterable(connectors) @@ -241,7 +244,7 @@ public Mono> bulkDelete(String namespace, @QueryValue(default sendEventLog(connector, ApplyStatus.deleted, connector.getSpec(), null, EMPTY_STRING); return connectorService.delete(ns, connector); }) - .then(Mono.just(HttpResponse.noContent())); + .then(Mono.just(HttpResponse.ok(connectors))); } /** @@ -305,7 +308,7 @@ public Mono> changeState(String namesp * Import unsynchronized connectors. * * @param namespace The namespace - * @param dryrun Is dry run mode or not ? + * @param dryrun Is dry run mode or not? * @return The list of imported connectors */ @Post("/_/import{?dryrun}") diff --git a/src/main/java/com/michelin/ns4kafka/controller/ConsumerGroupController.java b/src/main/java/com/michelin/ns4kafka/controller/ConsumerGroupController.java index d5c06d9a4..bdf8c5184 100644 --- a/src/main/java/com/michelin/ns4kafka/controller/ConsumerGroupController.java +++ b/src/main/java/com/michelin/ns4kafka/controller/ConsumerGroupController.java @@ -41,11 +41,12 @@ public class ConsumerGroupController extends NamespacedResourceController { * @param namespace The namespace * @param consumerGroup The consumer group * @param consumerGroupResetOffsets The information about how to reset - * @param dryrun Is dry run mode or not ? + * @param dryrun Is dry run mode or not? * @return The reset offsets response */ @Post("/{consumerGroup}/reset{?dryrun}") - public List resetOffsets(String namespace, String consumerGroup, + public List resetOffsets(String namespace, + String consumerGroup, @Valid @Body ConsumerGroupResetOffsets consumerGroupResetOffsets, @QueryValue(defaultValue = "false") boolean dryrun) diff --git a/src/main/java/com/michelin/ns4kafka/controller/NamespaceController.java b/src/main/java/com/michelin/ns4kafka/controller/NamespaceController.java index 5ea2167e0..e73e61ae8 100644 --- a/src/main/java/com/michelin/ns4kafka/controller/NamespaceController.java +++ b/src/main/java/com/michelin/ns4kafka/controller/NamespaceController.java @@ -66,7 +66,7 @@ public Optional get(String namespace) { * Create a namespace. * * @param namespace The namespace - * @param dryrun Does the creation is a dry run + * @param dryrun Is dry run mode or not? * @return The created namespace */ @Post("{?dryrun}") @@ -118,7 +118,7 @@ public HttpResponse apply(@Valid @Body Namespace namespace, * Delete a namespace. * * @param namespace The namespace - * @param dryrun Is dry run mode or not ? + * @param dryrun Is dry run mode or not? * @return An HTTP response * @deprecated use bulkDelete instead. */ @@ -126,11 +126,13 @@ public HttpResponse apply(@Valid @Body Namespace namespace, @Deprecated(since = "1.13.0") public HttpResponse delete(String namespace, @QueryValue(defaultValue = "false") boolean dryrun) { Optional optionalNamespace = namespaceService.findByName(namespace); + if (optionalNamespace.isEmpty()) { return HttpResponse.notFound(); } List namespaceResources = namespaceService.findAllResourcesByNamespace(optionalNamespace.get()); + if (!namespaceResources.isEmpty()) { List validationErrors = namespaceResources .stream() @@ -143,21 +145,31 @@ public HttpResponse delete(String namespace, @QueryValue(defaultValue = "f return HttpResponse.noContent(); } - performDeletion(optionalNamespace.get()); + sendEventLog( + optionalNamespace.get(), + ApplyStatus.deleted, + optionalNamespace.get().getSpec(), + null, + EMPTY_STRING + ); + + namespaceService.delete(optionalNamespace.get()); + return HttpResponse.noContent(); } /** * Delete namespaces. * - * @param dryrun Is dry run mode or not ? - * @param name The name parameter + * @param dryrun Is dry run mode or not? + * @param name The name parameter * @return An HTTP response */ @Delete - public HttpResponse bulkDelete(@QueryValue(defaultValue = "*") String name, - @QueryValue(defaultValue = "false") boolean dryrun) { + public HttpResponse> bulkDelete(@QueryValue(defaultValue = "*") String name, + @QueryValue(defaultValue = "false") boolean dryrun) { List namespaces = namespaceService.findByWildcardName(name); + if (namespaces.isEmpty()) { return HttpResponse.notFound(); } @@ -182,26 +194,21 @@ public HttpResponse bulkDelete(@QueryValue(defaultValue = "*") String name } if (dryrun) { - return HttpResponse.noContent(); + return HttpResponse.ok(namespaces); } - namespaces.forEach(this::performDeletion); - return HttpResponse.noContent(); - } + namespaces.forEach(namespace -> { + sendEventLog( + namespace, + ApplyStatus.deleted, + namespace.getSpec(), + null, + EMPTY_STRING + ); - /** - * Perform the deletion of the namespace and send an event log. - * - * @param namespace The namespace to delete - */ - private void performDeletion(Namespace namespace) { - sendEventLog( - namespace, - ApplyStatus.deleted, - namespace.getSpec(), - null, - EMPTY_STRING - ); - namespaceService.delete(namespace); + namespaceService.delete(namespace); + }); + + return HttpResponse.ok(namespaces); } } diff --git a/src/main/java/com/michelin/ns4kafka/controller/RoleBindingController.java b/src/main/java/com/michelin/ns4kafka/controller/RoleBindingController.java index a96438b71..4572f0e7b 100644 --- a/src/main/java/com/michelin/ns4kafka/controller/RoleBindingController.java +++ b/src/main/java/com/michelin/ns4kafka/controller/RoleBindingController.java @@ -67,11 +67,12 @@ public Optional get(String namespace, String name) { * * @param namespace The namespace * @param roleBinding The role binding - * @param dryrun Does the creation is a dry run + * @param dryrun Is dry run mode or not? * @return The created role binding */ @Post("{?dryrun}") - public HttpResponse apply(String namespace, @Valid @Body RoleBinding roleBinding, + public HttpResponse apply(String namespace, + @Valid @Body RoleBinding roleBinding, @QueryValue(defaultValue = "false") boolean dryrun) { Namespace ns = getNamespace(namespace); @@ -112,9 +113,10 @@ public HttpResponse apply(String namespace, @Valid @Body RoleBindin * @deprecated use {@link #bulkDelete(String, String, boolean)} instead. */ @Delete("/{name}{?dryrun}") - @Status(HttpStatus.NO_CONTENT) @Deprecated(since = "1.13.0") - public HttpResponse delete(String namespace, String name, + @Status(HttpStatus.NO_CONTENT) + public HttpResponse delete(String namespace, + String name, @QueryValue(defaultValue = "false") boolean dryrun) { Optional roleBinding = roleBindingService.findByName(namespace, name); if (roleBinding.isEmpty()) { @@ -147,17 +149,19 @@ public HttpResponse delete(String namespace, String name, * @param dryrun Is dry run mode or not? * @return An HTTP response */ - @Status(HttpStatus.NO_CONTENT) @Delete - public HttpResponse bulkDelete(String namespace, @QueryValue(defaultValue = "*") String name, - @QueryValue(defaultValue = "false") boolean dryrun) { + @Status(HttpStatus.OK) + public HttpResponse> bulkDelete(String namespace, + @QueryValue(defaultValue = "*") String name, + @QueryValue(defaultValue = "false") boolean dryrun) { List roleBindings = roleBindingService.findByWildcardName(namespace, name); + if (roleBindings.isEmpty()) { return HttpResponse.notFound(); } if (dryrun) { - return HttpResponse.noContent(); + return HttpResponse.ok(roleBindings); } roleBindings.forEach(roleBinding -> { @@ -171,6 +175,6 @@ public HttpResponse bulkDelete(String namespace, @QueryValue(defaultValue roleBindingService.delete(roleBinding); }); - return HttpResponse.noContent(); + return HttpResponse.ok(roleBindings); } } diff --git a/src/main/java/com/michelin/ns4kafka/controller/SchemaController.java b/src/main/java/com/michelin/ns4kafka/controller/SchemaController.java index e6ce34cfc..0b321b7e0 100644 --- a/src/main/java/com/michelin/ns4kafka/controller/SchemaController.java +++ b/src/main/java/com/michelin/ns4kafka/controller/SchemaController.java @@ -29,6 +29,7 @@ import java.time.Instant; import java.util.Comparator; import java.util.Date; +import java.util.List; import java.util.Optional; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; @@ -88,11 +89,12 @@ public Mono get(String namespace, String subject) { * * @param namespace The namespace * @param schema The schema to create - * @param dryrun Does the creation is a dry run + * @param dryrun Is dry run mode or not? * @return The created schema */ @Post - public Mono> apply(String namespace, @Valid @Body Schema schema, + public Mono> apply(String namespace, + @Valid @Body Schema schema, @QueryValue(defaultValue = "false") boolean dryrun) { Namespace ns = getNamespace(namespace); @@ -161,12 +163,12 @@ public Mono> apply(String namespace, @Valid @Body Schema sc * @param dryrun Run in dry mode or not? * @return A HTTP response */ - @Status(HttpStatus.NO_CONTENT) @Delete - public Mono> bulkDelete(String namespace, - @QueryValue(defaultValue = "*") String name, - @QueryValue("version") Optional versionOptional, - @QueryValue(defaultValue = "false") boolean dryrun) { + @Status(HttpStatus.OK) + public Mono>> bulkDelete(String namespace, + @QueryValue(defaultValue = "*") String name, + @QueryValue("version") Optional versionOptional, + @QueryValue(defaultValue = "false") boolean dryrun) { Namespace ns = getNamespace(namespace); return schemaService.findByWildcardName(ns, name) @@ -176,17 +178,22 @@ public Mono> bulkDelete(String namespace, .map(Optional::of) .defaultIfEmpty(Optional.empty())) .collectList() - .flatMap(schemas -> { - if (schemas.isEmpty() || schemas.stream().anyMatch(Optional::isEmpty)) { + .flatMap(optionalSchemas -> { + if (optionalSchemas.isEmpty() || optionalSchemas.stream().anyMatch(Optional::isEmpty)) { return Mono.just(HttpResponse.notFound()); } + List schemas = optionalSchemas + .stream() + .filter(Optional::isPresent) + .map(Optional::get) + .toList(); + if (dryrun) { - return Mono.just(HttpResponse.noContent()); + return Mono.just(HttpResponse.ok(schemas)); } return Flux.fromIterable(schemas) - .map(Optional::get) .flatMap(schema -> (versionOptional.isEmpty() ? schemaService.deleteAllVersions(ns, schema.getMetadata().getName()) : schemaService.deleteVersion(ns, schema.getMetadata().getName(), versionOptional.get())) @@ -201,7 +208,7 @@ public Mono> bulkDelete(String namespace, ); return Mono.just(HttpResponse.noContent()); })) - .then(Mono.just(HttpResponse.noContent())); + .then(Mono.just(HttpResponse.ok(schemas))); }); } @@ -215,9 +222,9 @@ public Mono> bulkDelete(String namespace, * @return A HTTP response * @deprecated use {@link #bulkDelete(String, String, Optional, boolean)} instead. */ - @Status(HttpStatus.NO_CONTENT) @Delete("/{subject}") @Deprecated(since = "1.13.0") + @Status(HttpStatus.NO_CONTENT) public Mono> delete(String namespace, @PathVariable String subject, @QueryValue("version") Optional versionOptional, @@ -273,7 +280,8 @@ public Mono> delete(String namespace, * @return A schema compatibility state */ @Post("/{subject}/config") - public Mono> config(String namespace, @PathVariable String subject, + public Mono> config(String namespace, + @PathVariable String subject, Schema.Compatibility compatibility) { Namespace ns = getNamespace(namespace); diff --git a/src/main/java/com/michelin/ns4kafka/controller/StreamController.java b/src/main/java/com/michelin/ns4kafka/controller/StreamController.java index 3ae71890e..c5d8289bb 100644 --- a/src/main/java/com/michelin/ns4kafka/controller/StreamController.java +++ b/src/main/java/com/michelin/ns4kafka/controller/StreamController.java @@ -71,7 +71,8 @@ Optional get(String namespace, String stream) { * @return An HTTP response */ @Post("/{?dryrun}") - HttpResponse apply(String namespace, @Body @Valid KafkaStream stream, + HttpResponse apply(String namespace, + @Body @Valid KafkaStream stream, @QueryValue(defaultValue = "false") boolean dryrun) { Namespace ns = getNamespace(namespace); if (!streamService.isNamespaceOwnerOfKafkaStream(ns, stream.getMetadata().getName())) { @@ -114,9 +115,9 @@ HttpResponse apply(String namespace, @Body @Valid KafkaStream strea * @return An HTTP response * @deprecated use {@link #bulkDelete(String, String, boolean)} instead. */ - @Status(HttpStatus.NO_CONTENT) @Delete("/{stream}{?dryrun}") @Deprecated(since = "1.13.0") + @Status(HttpStatus.NO_CONTENT) HttpResponse delete(String namespace, String stream, @QueryValue(defaultValue = "false") boolean dryrun) { Namespace ns = getNamespace(namespace); if (!streamService.isNamespaceOwnerOfKafkaStream(ns, stream)) { @@ -155,19 +156,19 @@ HttpResponse delete(String namespace, String stream, @QueryValue(defaultVa * @param dryrun Is dry run mode or not? * @return An HTTP response */ - @Status(HttpStatus.NO_CONTENT) @Delete - HttpResponse bulkDelete(String namespace, @QueryValue(defaultValue = "*") String name, - @QueryValue(defaultValue = "false") boolean dryrun) { + @Status(HttpStatus.OK) + HttpResponse> bulkDelete(String namespace, + @QueryValue(defaultValue = "*") String name, + @QueryValue(defaultValue = "false") boolean dryrun) { Namespace ns = getNamespace(namespace); - List kafkaStreams = streamService.findByWildcardName(ns, name); List validationErrors = kafkaStreams.stream() - .filter(kafkaStream -> - !streamService.isNamespaceOwnerOfKafkaStream(ns, kafkaStream.getMetadata().getName())) - .map(kafkaStream -> invalidOwner(kafkaStream.getMetadata().getName())) - .toList(); + .filter(kafkaStream -> + !streamService.isNamespaceOwnerOfKafkaStream(ns, kafkaStream.getMetadata().getName())) + .map(kafkaStream -> invalidOwner(kafkaStream.getMetadata().getName())) + .toList(); if (!validationErrors.isEmpty()) { throw new ResourceValidationException(KAFKA_STREAM, name, validationErrors); @@ -178,8 +179,9 @@ HttpResponse bulkDelete(String namespace, @QueryValue(defaultValue = "*") } if (dryrun) { - return HttpResponse.noContent(); + return HttpResponse.ok(kafkaStreams); } + kafkaStreams.forEach(kafkaStream -> { sendEventLog( kafkaStream, @@ -188,9 +190,10 @@ HttpResponse bulkDelete(String namespace, @QueryValue(defaultValue = "*") null, EMPTY_STRING ); + streamService.delete(ns, kafkaStream); }); - return HttpResponse.noContent(); + return HttpResponse.ok(kafkaStreams); } } diff --git a/src/main/java/com/michelin/ns4kafka/controller/acl/AclController.java b/src/main/java/com/michelin/ns4kafka/controller/acl/AclController.java index f0b24ec9f..49bc9e4c0 100644 --- a/src/main/java/com/michelin/ns4kafka/controller/acl/AclController.java +++ b/src/main/java/com/michelin/ns4kafka/controller/acl/AclController.java @@ -99,7 +99,8 @@ public Optional get(String namespace, String acl) { * @return An HTTP response */ @Post("{?dryrun}") - public HttpResponse apply(Authentication authentication, String namespace, + public HttpResponse apply(Authentication authentication, + String namespace, @Valid @Body AccessControlEntry accessControlEntry, @QueryValue(defaultValue = "false") boolean dryrun) { Namespace ns = getNamespace(namespace); @@ -163,10 +164,11 @@ public HttpResponse apply(Authentication authentication, Str * @return An HTTP response */ @Delete - @Status(HttpStatus.NO_CONTENT) - public HttpResponse bulkDelete(Authentication authentication, String namespace, - @QueryValue(defaultValue = "*") String name, - @QueryValue(defaultValue = "false") boolean dryrun) { + @Status(HttpStatus.OK) + public HttpResponse> bulkDelete(Authentication authentication, + String namespace, + @QueryValue(defaultValue = "*") String name, + @QueryValue(defaultValue = "false") boolean dryrun) { Namespace ns = getNamespace(namespace); List acls = aclService.findAllGrantedByNamespaceByWildcardName(ns, name); @@ -192,7 +194,7 @@ public HttpResponse bulkDelete(Authentication authentication, String names } if (dryrun) { - return HttpResponse.noContent(); + return HttpResponse.ok(acls); } acls.forEach(acl -> { @@ -205,7 +207,7 @@ public HttpResponse bulkDelete(Authentication authentication, String names aclService.delete(acl); }); - return HttpResponse.noContent(); + return HttpResponse.ok(acls); } /** @@ -219,9 +221,11 @@ public HttpResponse bulkDelete(Authentication authentication, String names * @deprecated use {@link #bulkDelete(Authentication, String, String, boolean)} instead. */ @Delete("/{name}{?dryrun}") - @Status(HttpStatus.NO_CONTENT) @Deprecated(since = "1.13.0") - public HttpResponse delete(Authentication authentication, String namespace, String name, + @Status(HttpStatus.NO_CONTENT) + public HttpResponse delete(Authentication authentication, + String namespace, + String name, @QueryValue(defaultValue = "false") boolean dryrun) { AccessControlEntry accessControlEntry = aclService .findByName(namespace, name) diff --git a/src/main/java/com/michelin/ns4kafka/controller/connect/ConnectClusterController.java b/src/main/java/com/michelin/ns4kafka/controller/connect/ConnectClusterController.java index 794986e71..413ad94a6 100644 --- a/src/main/java/com/michelin/ns4kafka/controller/connect/ConnectClusterController.java +++ b/src/main/java/com/michelin/ns4kafka/controller/connect/ConnectClusterController.java @@ -81,11 +81,12 @@ public Optional get(String namespace, String connectCluster) { * * @param namespace The namespace * @param connectCluster The connect worker - * @param dryrun Does the creation is a dry run + * @param dryrun Is dry run mode or not? * @return The created Kafka Connect cluster */ @Post("/{?dryrun}") - public Mono> apply(String namespace, @Body @Valid ConnectCluster connectCluster, + public Mono> apply(String namespace, + @Body @Valid ConnectCluster connectCluster, @QueryValue(defaultValue = "false") boolean dryrun) { Namespace ns = getNamespace(namespace); @@ -137,10 +138,11 @@ public Mono> apply(String namespace, @Body @Valid C * @return A HTTP response * @deprecated use {@link #bulkDelete(String, String, boolean)} instead. */ - @Status(HttpStatus.NO_CONTENT) @Delete("/{connectCluster}{?dryrun}") @Deprecated(since = "1.13.0") - public HttpResponse delete(String namespace, String connectCluster, + @Status(HttpStatus.NO_CONTENT) + public HttpResponse delete(String namespace, + String connectCluster, @QueryValue(defaultValue = "false") boolean dryrun) { Namespace ns = getNamespace(namespace); @@ -160,15 +162,26 @@ public HttpResponse delete(String namespace, String connectCluster, Optional optionalConnectCluster = connectClusterService.findByNameWithOwnerPermission(ns, connectCluster); + if (optionalConnectCluster.isEmpty()) { return HttpResponse.notFound(); } + if (dryrun) { return HttpResponse.noContent(); } - performDeletion(optionalConnectCluster.get()); + sendEventLog( + optionalConnectCluster.get(), + ApplyStatus.deleted, + optionalConnectCluster.get().getSpec(), + null, + EMPTY_STRING + ); + + connectClusterService.delete(optionalConnectCluster.get()); + return HttpResponse.noContent(); } @@ -180,10 +193,11 @@ public HttpResponse delete(String namespace, String connectCluster, * @param dryrun Run in dry mode or not * @return A HTTP response */ - @Status(HttpStatus.NO_CONTENT) @Delete - public HttpResponse bulkDelete(String namespace, @QueryValue(defaultValue = "*") String name, - @QueryValue(defaultValue = "false") boolean dryrun) { + @Status(HttpStatus.OK) + public HttpResponse> bulkDelete(String namespace, + @QueryValue(defaultValue = "*") String name, + @QueryValue(defaultValue = "false") boolean dryrun) { Namespace ns = getNamespace(namespace); List connectClusters = connectClusterService.findByWildcardNameWithOwnerPermission(ns, name); @@ -205,27 +219,22 @@ public HttpResponse bulkDelete(String namespace, @QueryValue(defaultValue } if (dryrun) { - return HttpResponse.noContent(); + return HttpResponse.ok(connectClusters); } - connectClusters.forEach(this::performDeletion); - return HttpResponse.noContent(); - } - - /** - * Perform the deletion of the connectCluster and send an event log. - * - * @param connectCluster The connectCluster to delete - */ - private void performDeletion(ConnectCluster connectCluster) { - sendEventLog( - connectCluster, + connectClusters.forEach(cc -> { + sendEventLog( + cc, ApplyStatus.deleted, - connectCluster.getSpec(), + cc.getSpec(), null, EMPTY_STRING - ); - connectClusterService.delete(connectCluster); + ); + + connectClusterService.delete(cc); + }); + + return HttpResponse.ok(connectClusters); } /** @@ -250,7 +259,8 @@ public List listVaults(final String namespace) { * @return The encrypted password. */ @Post("/{connectCluster}/vaults") - public List vaultPassword(final String namespace, final String connectCluster, + public List vaultPassword(final String namespace, + final String connectCluster, @Body final List passwords) { final Namespace ns = getNamespace(namespace); diff --git a/src/main/java/com/michelin/ns4kafka/controller/quota/ResourceQuotaController.java b/src/main/java/com/michelin/ns4kafka/controller/quota/ResourceQuotaController.java index 25a3a7078..9b5dccb9c 100644 --- a/src/main/java/com/michelin/ns4kafka/controller/quota/ResourceQuotaController.java +++ b/src/main/java/com/michelin/ns4kafka/controller/quota/ResourceQuotaController.java @@ -78,11 +78,12 @@ public Optional get(String namespace, String quota) { * * @param namespace The namespace * @param quota The resource quota - * @param dryrun Does the creation is a dry run + * @param dryrun Is dry run mode or not? * @return The created quota */ @Post("{?dryrun}") - public HttpResponse apply(String namespace, @Body @Valid ResourceQuota quota, + public HttpResponse apply(String namespace, + @Body @Valid ResourceQuota quota, @QueryValue(defaultValue = "false") boolean dryrun) { Namespace ns = getNamespace(namespace); @@ -125,9 +126,10 @@ public HttpResponse apply(String namespace, @Body @Valid Resource * @return An HTTP response */ @Delete - @Status(HttpStatus.NO_CONTENT) - public HttpResponse bulkDelete(String namespace, @QueryValue(defaultValue = "*") String name, - @QueryValue(defaultValue = "false") boolean dryrun) { + @Status(HttpStatus.OK) + public HttpResponse> bulkDelete(String namespace, + @QueryValue(defaultValue = "*") String name, + @QueryValue(defaultValue = "false") boolean dryrun) { List resourceQuotas = resourceQuotaService.findByWildcardName(namespace, name); @@ -136,7 +138,7 @@ public HttpResponse bulkDelete(String namespace, @QueryValue(defaultValue } if (dryrun) { - return HttpResponse.noContent(); + return HttpResponse.ok(resourceQuotas); } resourceQuotas.forEach(resourceQuota -> { @@ -150,7 +152,7 @@ public HttpResponse bulkDelete(String namespace, @QueryValue(defaultValue resourceQuotaService.delete(resourceQuota); }); - return HttpResponse.noContent(); + return HttpResponse.ok(resourceQuotas); } /** @@ -163,9 +165,10 @@ public HttpResponse bulkDelete(String namespace, @QueryValue(defaultValue * @deprecated use {@link #bulkDelete(String, String, boolean)} instead. */ @Delete("/{name}{?dryrun}") - @Status(HttpStatus.NO_CONTENT) @Deprecated(since = "1.13.0") - public HttpResponse delete(String namespace, String name, + @Status(HttpStatus.NO_CONTENT) + public HttpResponse delete(String namespace, + String name, @QueryValue(defaultValue = "false") boolean dryrun) { Optional resourceQuota = resourceQuotaService.findByName(namespace, name); if (resourceQuota.isEmpty()) { diff --git a/src/main/java/com/michelin/ns4kafka/controller/topic/TopicController.java b/src/main/java/com/michelin/ns4kafka/controller/topic/TopicController.java index bf9aee26b..44e0d007e 100644 --- a/src/main/java/com/michelin/ns4kafka/controller/topic/TopicController.java +++ b/src/main/java/com/michelin/ns4kafka/controller/topic/TopicController.java @@ -84,7 +84,8 @@ public Optional get(String namespace, String topic) { * @return The created topic */ @Post - public HttpResponse apply(String namespace, @Valid @Body Topic topic, + public HttpResponse apply(String namespace, + @Valid @Body Topic topic, @QueryValue(defaultValue = "false") boolean dryrun) throws InterruptedException, ExecutionException, TimeoutException { Namespace ns = getNamespace(namespace); @@ -164,23 +165,24 @@ public HttpResponse apply(String namespace, @Valid @Body Topic topic, * @param dryrun Is dry run mode or not? * @return An HTTP response */ - @Status(HttpStatus.NO_CONTENT) @Delete - public HttpResponse bulkDelete(String namespace, @QueryValue(defaultValue = "*") String name, - @QueryValue(defaultValue = "false") boolean dryrun) + @Status(HttpStatus.OK) + public HttpResponse> bulkDelete(String namespace, + @QueryValue(defaultValue = "*") String name, + @QueryValue(defaultValue = "false") boolean dryrun) throws InterruptedException, ExecutionException, TimeoutException { Namespace ns = getNamespace(namespace); - List topicsToDelete = topicService.findByWildcardName(ns, name); + List topics = topicService.findByWildcardName(ns, name); - if (topicsToDelete.isEmpty()) { + if (topics.isEmpty()) { return HttpResponse.notFound(); } if (dryrun) { - return HttpResponse.noContent(); + return HttpResponse.ok(topics); } - topicsToDelete.forEach(topicToDelete -> + topics.forEach(topicToDelete -> sendEventLog( topicToDelete, ApplyStatus.deleted, @@ -188,9 +190,9 @@ public HttpResponse bulkDelete(String namespace, @QueryValue(defaultValue null, EMPTY_STRING)); - topicService.deleteTopics(topicsToDelete); + topicService.deleteTopics(topics); - return HttpResponse.noContent(); + return HttpResponse.ok(topics); } /** @@ -202,10 +204,11 @@ public HttpResponse bulkDelete(String namespace, @QueryValue(defaultValue * @return An HTTP response * @deprecated use {@link #bulkDelete(String, String, boolean)} instead. */ - @Status(HttpStatus.NO_CONTENT) @Delete("/{topic}{?dryrun}") @Deprecated(since = "1.13.0") - public HttpResponse delete(String namespace, String topic, + @Status(HttpStatus.NO_CONTENT) + public HttpResponse delete(String namespace, + String topic, @QueryValue(defaultValue = "false") boolean dryrun) throws InterruptedException, ExecutionException, TimeoutException { Namespace ns = getNamespace(namespace); @@ -242,7 +245,7 @@ public HttpResponse delete(String namespace, String topic, * Import unsynchronized topics. * * @param namespace The namespace - * @param dryrun Is dry run mode or not ? + * @param dryrun Is dry run mode or not? * @return The list of imported topics * @throws ExecutionException Any execution exception * @throws InterruptedException Any interrupted exception @@ -286,13 +289,14 @@ public List importResources(String namespace, @QueryValue(defaultValue = * * @param namespace The namespace * @param topic The topic - * @param dryrun Is dry run mode or not ? + * @param dryrun Is dry run mode or not? * @return The list of topic-partitions where records have been deleted * @throws ExecutionException Any execution exception * @throws InterruptedException Any interrupted exception */ @Post("{topic}/delete-records{?dryrun}") - public List deleteRecords(String namespace, String topic, + public List deleteRecords(String namespace, + String topic, @QueryValue(defaultValue = "false") boolean dryrun) throws InterruptedException, ExecutionException { Namespace ns = getNamespace(namespace); diff --git a/src/main/java/com/michelin/ns4kafka/service/executor/AccessControlEntryAsyncExecutor.java b/src/main/java/com/michelin/ns4kafka/service/executor/AccessControlEntryAsyncExecutor.java index 680df73da..d2a698393 100644 --- a/src/main/java/com/michelin/ns4kafka/service/executor/AccessControlEntryAsyncExecutor.java +++ b/src/main/java/com/michelin/ns4kafka/service/executor/AccessControlEntryAsyncExecutor.java @@ -166,7 +166,7 @@ private List collectNs4KafkaAcls() { /** * Collect the ACLs from broker. * - * @param managedUsersOnly Only retrieve ACLs from Kafka user managed by Ns4Kafka or not ? + * @param managedUsersOnly Only retrieve ACLs from Kafka user managed by Ns4Kafka or not? * @return A list of ACLs * @throws ExecutionException Any execution exception during ACLs description * @throws InterruptedException Any interrupted exception during ACLs description @@ -310,7 +310,6 @@ private List buildAclBindingsFromKafkaStream(KafkaStream stream, Str * Convert Ns4Kafka connect ACL into Kafka ACL. * * @param accessControlEntry The Ns4Kafka ACL - * @param kafkaUser The ACL owner * @return A list of Kafka ACLs */ private AclBinding convertConnectorAccessControlEntryToAclBinding(AccessControlEntry accessControlEntry) { diff --git a/src/test/java/com/michelin/ns4kafka/controller/AclControllerTest.java b/src/test/java/com/michelin/ns4kafka/controller/AclControllerTest.java index c68bb3b44..ea51bb5c3 100644 --- a/src/test/java/com/michelin/ns4kafka/controller/AclControllerTest.java +++ b/src/test/java/com/michelin/ns4kafka/controller/AclControllerTest.java @@ -831,7 +831,7 @@ void shouldNotDeleteInDryRunMode() { } @Test - void shouldNotBulkDeleteAclWhenNotFound() { + void shouldNotBulkDeleteAclsWhenNotFound() { Authentication authentication = Authentication.build("user", Map.of("roles", List.of())); Namespace namespace = Namespace.builder() .metadata(Metadata.builder() @@ -843,12 +843,12 @@ void shouldNotBulkDeleteAclWhenNotFound() { when(namespaceService.findByName("test")).thenReturn(Optional.of(namespace)); when(aclService.findAllGrantedByNamespaceByWildcardName(namespace, "ace1")).thenReturn(List.of()); - HttpResponse actual = accessControlListController.bulkDelete(authentication, "test", "ace1", false); + var actual = accessControlListController.bulkDelete(authentication, "test", "ace1", false); assertEquals(HttpStatus.NOT_FOUND, actual.status()); } @Test - void shouldNotBulkDeleteSelfAssignedAclWhenNotAdmin() { + void shouldNotBulkDeleteSelfAssignedAclsWhenNotAdmin() { Namespace namespace = Namespace.builder() .metadata(Metadata.builder() .name("test") @@ -897,7 +897,7 @@ void shouldNotBulkDeleteSelfAssignedAclWhenNotAdmin() { } @Test - void shouldBulkDeleteSelfAssignedAclAsAdmin() { + void shouldBulkDeleteSelfAssignedAclsAsAdmin() { Namespace namespace = Namespace.builder() .metadata(Metadata.builder() .name("test") @@ -925,13 +925,13 @@ void shouldBulkDeleteSelfAssignedAclAsAdmin() { when(aclService.findAllGrantedByNamespaceByWildcardName(namespace, "ace1")) .thenReturn(List.of(accessControlEntry)); - HttpResponse actual = accessControlListController.bulkDelete(authentication, "test", "ace1", false); + var actual = accessControlListController.bulkDelete(authentication, "test", "ace1", false); - assertEquals(HttpStatus.NO_CONTENT, actual.status()); + assertEquals(HttpStatus.OK, actual.status()); } @Test - void shouldBulkDeleteAcl() { + void shouldBulkDeleteAcls() { Namespace namespace = Namespace.builder() .metadata(Metadata.builder() .name("test") @@ -976,13 +976,13 @@ void shouldBulkDeleteAcl() { when(securityService.hasRole(ResourceBasedSecurityRule.IS_ADMIN)).thenReturn(false); doNothing().when(applicationEventPublisher).publishEvent(any()); - HttpResponse actual = accessControlListController.bulkDelete(authentication, "test", "ace*", false); + var actual = accessControlListController.bulkDelete(authentication, "test", "ace*", false); - assertEquals(HttpStatus.NO_CONTENT, actual.status()); + assertEquals(HttpStatus.OK, actual.status()); } @Test - void shouldNotBulkDeleteInDryRunMode() { + void shouldNotBulkDeleteAclsInDryRunMode() { Namespace namespace = Namespace.builder() .metadata(Metadata.builder() .name("test") @@ -1008,9 +1008,9 @@ void shouldNotBulkDeleteInDryRunMode() { when(namespaceService.findByName("test")).thenReturn(Optional.of(namespace)); when(aclService.findAllGrantedByNamespaceByWildcardName(namespace, "ace1")) .thenReturn(List.of(accessControlEntry)); - HttpResponse actual = accessControlListController.bulkDelete(authentication, "test", "ace1", true); + var actual = accessControlListController.bulkDelete(authentication, "test", "ace1", true); verify(aclService, never()).delete(any()); - assertEquals(HttpStatus.NO_CONTENT, actual.status()); + assertEquals(HttpStatus.OK, actual.status()); } } diff --git a/src/test/java/com/michelin/ns4kafka/controller/ConnectClusterControllerTest.java b/src/test/java/com/michelin/ns4kafka/controller/ConnectClusterControllerTest.java index 9bcbae45a..88d5e04f4 100644 --- a/src/test/java/com/michelin/ns4kafka/controller/ConnectClusterControllerTest.java +++ b/src/test/java/com/michelin/ns4kafka/controller/ConnectClusterControllerTest.java @@ -264,7 +264,7 @@ void shouldDeleteConnectClusterInDryRunMode() { @Test @SuppressWarnings("deprecation") - void shouldNotDeleteConnectClusterWithConnectorsAssociated() { + void shouldNotDeleteConnectClusterWithConnectors() { Namespace ns = Namespace.builder() .metadata(Metadata.builder() .name("test") @@ -296,128 +296,128 @@ void shouldNotDeleteConnectClusterWithConnectorsAssociated() { } @Test - void shouldDeleteConnectClusters() { + void shouldBulkDeleteConnectClusters() { Namespace ns = Namespace.builder() - .metadata(Metadata.builder() - .name("test") - .cluster("local") - .build()) - .build(); + .metadata(Metadata.builder() + .name("test") + .cluster("local") + .build()) + .build(); ConnectCluster connectCluster1 = ConnectCluster.builder() - .metadata(Metadata.builder() - .name("connect-cluster1") - .build()) - .build(); + .metadata(Metadata.builder() + .name("connect-cluster1") + .build()) + .build(); ConnectCluster connectCluster2 = ConnectCluster.builder() - .metadata(Metadata.builder() - .name("connect-cluster2") - .build()) - .build(); + .metadata(Metadata.builder() + .name("connect-cluster2") + .build()) + .build(); when(namespaceService.findByName("test")) - .thenReturn(Optional.of(ns)); + .thenReturn(Optional.of(ns)); when(connectorService.findAllByConnectCluster(ns, "connect-cluster1")) - .thenReturn(List.of()); + .thenReturn(List.of()); when(connectorService.findAllByConnectCluster(ns, "connect-cluster2")) - .thenReturn(List.of()); + .thenReturn(List.of()); when(connectClusterService.findByWildcardNameWithOwnerPermission(ns, "connect-cluster*")) - .thenReturn(List.of(connectCluster1, connectCluster2)); + .thenReturn(List.of(connectCluster1, connectCluster2)); doNothing().when(connectClusterService).delete(connectCluster1); doNothing().when(connectClusterService).delete(connectCluster2); when(securityService.username()).thenReturn(Optional.of("test-user")); when(securityService.hasRole(ResourceBasedSecurityRule.IS_ADMIN)).thenReturn(false); doNothing().when(applicationEventPublisher).publishEvent(any()); - HttpResponse actual = connectClusterController.bulkDelete("test", "connect-cluster*", false); - assertEquals(HttpStatus.NO_CONTENT, actual.getStatus()); + var actual = connectClusterController.bulkDelete("test", "connect-cluster*", false); + assertEquals(HttpStatus.OK, actual.getStatus()); } @Test - void shouldDeleteConnectClustersInDryRunMode() { + void shouldNotBulkDeleteConnectClustersInDryRunMode() { Namespace ns = Namespace.builder() - .metadata(Metadata.builder() - .name("test") - .cluster("local") - .build()) - .build(); + .metadata(Metadata.builder() + .name("test") + .cluster("local") + .build()) + .build(); ConnectCluster connectCluster = ConnectCluster.builder() - .metadata(Metadata.builder() - .name("connect-cluster") - .build()) - .build(); + .metadata(Metadata.builder() + .name("connect-cluster") + .build()) + .build(); when(namespaceService.findByName("test")) - .thenReturn(Optional.of(ns)); + .thenReturn(Optional.of(ns)); when(connectorService.findAllByConnectCluster(ns, "connect-cluster")) - .thenReturn(List.of()); + .thenReturn(List.of()); when(connectClusterService.findByWildcardNameWithOwnerPermission(ns, "connect-cluster*")) - .thenReturn(List.of(connectCluster)); + .thenReturn(List.of(connectCluster)); - HttpResponse actual = connectClusterController.bulkDelete("test", "connect-cluster*", true); - assertEquals(HttpStatus.NO_CONTENT, actual.getStatus()); + var actual = connectClusterController.bulkDelete("test", "connect-cluster*", true); + assertEquals(HttpStatus.OK, actual.getStatus()); verify(connectClusterService, never()).delete(any()); } @Test - void shouldNotDeleteConnectClustersWhenNotFound() { + void shouldNotBulkDeleteConnectClustersWhenNotFound() { Namespace ns = Namespace.builder() - .metadata(Metadata.builder() - .name("test") - .cluster("local") - .build()) - .build(); + .metadata(Metadata.builder() + .name("test") + .cluster("local") + .build()) + .build(); when(namespaceService.findByName("test")) - .thenReturn(Optional.of(ns)); + .thenReturn(Optional.of(ns)); when(connectClusterService.findByWildcardNameWithOwnerPermission(ns, "connect-cluster*")) - .thenReturn(List.of()); + .thenReturn(List.of()); - HttpResponse actual = connectClusterController.bulkDelete("test", "connect-cluster*", false); + var actual = connectClusterController.bulkDelete("test", "connect-cluster*", false); assertEquals(HttpStatus.NOT_FOUND, actual.getStatus()); } @Test - void shouldNotDeleteConnectClustersWithConnectorsAssociated() { + void shouldNotBulkDeleteConnectClustersWithConnectors() { Namespace ns = Namespace.builder() - .metadata(Metadata.builder() - .name("test") - .cluster("local") - .build()) - .build(); + .metadata(Metadata.builder() + .name("test") + .cluster("local") + .build()) + .build(); Connector connector = Connector.builder() - .metadata(Metadata.builder() - .name("connect1") - .build()) - .build(); + .metadata(Metadata.builder() + .name("connect1") + .build()) + .build(); ConnectCluster connectCluster1 = ConnectCluster.builder() - .metadata(Metadata.builder() - .name("connect-cluster1") - .build()) - .build(); + .metadata(Metadata.builder() + .name("connect-cluster1") + .build()) + .build(); ConnectCluster connectCluster2 = ConnectCluster.builder() - .metadata(Metadata.builder() - .name("connect-cluster2") - .build()) - .build(); + .metadata(Metadata.builder() + .name("connect-cluster2") + .build()) + .build(); when(namespaceService.findByName("test")) - .thenReturn(Optional.of(ns)); + .thenReturn(Optional.of(ns)); when(connectorService.findAllByConnectCluster(ns, "connect-cluster1")) - .thenReturn(List.of()); + .thenReturn(List.of()); when(connectorService.findAllByConnectCluster(ns, "connect-cluster2")) - .thenReturn(List.of()); + .thenReturn(List.of()); when(connectClusterService.findByWildcardNameWithOwnerPermission(ns, "connect-cluster*")) - .thenReturn(List.of(connectCluster1, connectCluster2)); + .thenReturn(List.of(connectCluster1, connectCluster2)); when(connectorService.findAllByConnectCluster(ns, "connect-cluster2")) - .thenReturn(List.of(connector)); + .thenReturn(List.of(connector)); ResourceValidationException result = assertThrows(ResourceValidationException.class, () -> connectClusterController.bulkDelete("test", "connect-cluster*", false)); diff --git a/src/test/java/com/michelin/ns4kafka/controller/ConnectorControllerTest.java b/src/test/java/com/michelin/ns4kafka/controller/ConnectorControllerTest.java index 6194e7028..89038cedf 100644 --- a/src/test/java/com/michelin/ns4kafka/controller/ConnectorControllerTest.java +++ b/src/test/java/com/michelin/ns4kafka/controller/ConnectorControllerTest.java @@ -263,7 +263,7 @@ void shouldNotDeleteConnectorWhenNotFound() { } @Test - void shouldDeleteConnectors() { + void shouldBulkDeleteConnectors() { Namespace ns = Namespace.builder() .metadata(Metadata.builder() .name("test") @@ -290,12 +290,12 @@ void shouldDeleteConnectors() { doNothing().when(applicationEventPublisher).publishEvent(any()); StepVerifier.create(connectorController.bulkDelete("test", "connect*", false)) - .consumeNextWith(response -> assertEquals(HttpStatus.NO_CONTENT, response.getStatus())) + .consumeNextWith(response -> assertEquals(HttpStatus.OK, response.getStatus())) .verifyComplete(); } @Test - void shouldNotDeleteConnectorsWhenNotFound() { + void shouldNotBulkDeleteConnectorsWhenNotFound() { Namespace ns = Namespace.builder() .metadata(Metadata.builder() .name("test") @@ -316,7 +316,7 @@ void shouldNotDeleteConnectorsWhenNotFound() { } @Test - void shouldDeleteConnectorsInDryRunMode() { + void shouldBulkDeleteConnectorsInDryRunMode() { Namespace ns = Namespace.builder() .metadata(Metadata.builder() .name("test") @@ -346,14 +346,14 @@ void shouldDeleteConnectorsInDryRunMode() { .thenReturn(true); StepVerifier.create(connectorController.bulkDelete("test", "connect*", true)) - .consumeNextWith(response -> assertEquals(HttpStatus.NO_CONTENT, response.getStatus())) + .consumeNextWith(response -> assertEquals(HttpStatus.OK, response.getStatus())) .verifyComplete(); verify(connectorService, never()).delete(any(), any()); } @Test - void shouldNotDeleteConnectorsWhenNotOwned() { + void shouldNotBulkDeleteConnectorsWhenNotOwner() { Namespace ns = Namespace.builder() .metadata(Metadata.builder() .name("test") diff --git a/src/test/java/com/michelin/ns4kafka/controller/NamespaceControllerTest.java b/src/test/java/com/michelin/ns4kafka/controller/NamespaceControllerTest.java index 078e0cb95..73a1bb606 100644 --- a/src/test/java/com/michelin/ns4kafka/controller/NamespaceControllerTest.java +++ b/src/test/java/com/michelin/ns4kafka/controller/NamespaceControllerTest.java @@ -18,6 +18,7 @@ import com.michelin.ns4kafka.util.exception.ResourceValidationException; import io.micronaut.context.event.ApplicationEventPublisher; import io.micronaut.http.HttpResponse; +import io.micronaut.http.HttpStatus; import io.micronaut.security.utils.SecurityService; import java.util.List; import java.util.Map; @@ -377,7 +378,7 @@ void shouldNotDeleteNamespaceWhenResourcesAreStillLinkedWithIt() { } @Test - void shouldDeleteNamespaces() { + void shouldBulkDeleteNamespaces() { Namespace namespace1 = Namespace.builder() .metadata(Metadata.builder() .name("namespace1") @@ -411,11 +412,11 @@ void shouldDeleteNamespaces() { doNothing().when(applicationEventPublisher).publishEvent(any()); var result = namespaceController.bulkDelete("namespace*", false); - assertEquals(HttpResponse.noContent().getStatus(), result.getStatus()); + assertEquals(HttpStatus.OK, result.getStatus()); } @Test - void shouldDeleteNamespacesInDryRunMode() { + void shouldNotBulkDeleteNamespacesInDryRunMode() { Namespace namespace1 = Namespace.builder() .metadata(Metadata.builder() .name("namespace1") @@ -445,11 +446,11 @@ void shouldDeleteNamespacesInDryRunMode() { var result = namespaceController.bulkDelete("namespace*", true); verify(namespaceService, never()).delete(any()); - assertEquals(HttpResponse.noContent().getStatus(), result.getStatus()); + assertEquals(HttpStatus.OK, result.getStatus()); } @Test - void shouldNotDeleteNamespacesWhenResourcesAreStillLinkedWithIt() { + void shouldNoBulkDeleteNamespacesWithResources() { Namespace namespace1 = Namespace.builder() .metadata(Metadata.builder() .name("namespace1") @@ -483,7 +484,7 @@ void shouldNotDeleteNamespacesWhenResourcesAreStillLinkedWithIt() { } @Test - void shouldNotDeleteNamespacesWhenPatternMatchesNothing() { + void shouldNotBulkDeleteNamespacesWhenNoPatternMatches() { when(namespaceService.findByWildcardName("namespace*")).thenReturn(List.of()); var result = namespaceController.bulkDelete("namespace*", false); assertEquals(HttpResponse.notFound().getStatus(), result.getStatus()); diff --git a/src/test/java/com/michelin/ns4kafka/controller/ResourceQuotaControllerTest.java b/src/test/java/com/michelin/ns4kafka/controller/ResourceQuotaControllerTest.java index ad426b39a..4db09a354 100644 --- a/src/test/java/com/michelin/ns4kafka/controller/ResourceQuotaControllerTest.java +++ b/src/test/java/com/michelin/ns4kafka/controller/ResourceQuotaControllerTest.java @@ -371,13 +371,13 @@ void shouldDeleteQuota() { @Test void shouldNotBulkDeleteQuotaWhenNotFound() { when(resourceQuotaService.findByWildcardName("test", "quota*")).thenReturn(List.of()); - HttpResponse actual = resourceQuotaController.bulkDelete("test", "quota*", false); + var actual = resourceQuotaController.bulkDelete("test", "quota*", false); assertEquals(HttpStatus.NOT_FOUND, actual.getStatus()); verify(resourceQuotaService, never()).delete(ArgumentMatchers.any()); } @Test - void shouldNotBulkDeleteQuotaWhenDryRun() { + void shouldNotBulkDeleteQuotaInDryRunMode() { ResourceQuota resourceQuota1 = ResourceQuota.builder() .metadata(Metadata.builder() .cluster("local") @@ -387,8 +387,8 @@ void shouldNotBulkDeleteQuotaWhenDryRun() { .build(); when(resourceQuotaService.findByWildcardName("test", "quota*")).thenReturn(List.of(resourceQuota1)); - HttpResponse actual = resourceQuotaController.bulkDelete("test", "quota*", true); - assertEquals(HttpStatus.NO_CONTENT, actual.getStatus()); + var actual = resourceQuotaController.bulkDelete("test", "quota*", true); + assertEquals(HttpStatus.OK, actual.getStatus()); verify(resourceQuotaService, never()).delete(ArgumentMatchers.any()); } @@ -408,8 +408,8 @@ void shouldBulkDeleteQuota() { doNothing().when(applicationEventPublisher).publishEvent(any()); doNothing().when(resourceQuotaService).delete(resourceQuota); - HttpResponse actual = resourceQuotaController.bulkDelete("test", "quota*", false); - assertEquals(HttpStatus.NO_CONTENT, actual.getStatus()); + var actual = resourceQuotaController.bulkDelete("test", "quota*", false); + assertEquals(HttpStatus.OK, actual.getStatus()); verify(resourceQuotaService).delete(resourceQuota); } } diff --git a/src/test/java/com/michelin/ns4kafka/controller/RoleBindingControllerTest.java b/src/test/java/com/michelin/ns4kafka/controller/RoleBindingControllerTest.java index 94c64b544..b2d1aa139 100644 --- a/src/test/java/com/michelin/ns4kafka/controller/RoleBindingControllerTest.java +++ b/src/test/java/com/michelin/ns4kafka/controller/RoleBindingControllerTest.java @@ -201,55 +201,56 @@ void shouldDeleteRoleBindingInDryRunMode() { } @Test - void shouldDeleteRoleBindings() { + void shouldBulkDeleteRoleBindings() { RoleBinding rolebinding1 = RoleBinding.builder() - .metadata(Metadata.builder() - .name("test.rolebinding1") - .build()) - .build(); + .metadata(Metadata.builder() + .name("test.rolebinding1") + .build()) + .build(); RoleBinding rolebinding2 = RoleBinding.builder() - .metadata(Metadata.builder() - .name("test.rolebinding2") - .build()) - .build(); + .metadata(Metadata.builder() + .name("test.rolebinding2") + .build()) + .build(); when(roleBindingService.findByWildcardName(any(), any())) - .thenReturn(List.of(rolebinding1, rolebinding2)); + .thenReturn(List.of(rolebinding1, rolebinding2)); when(securityService.username()) - .thenReturn(Optional.of("test-user")); + .thenReturn(Optional.of("test-user")); when(securityService.hasRole(ResourceBasedSecurityRule.IS_ADMIN)) - .thenReturn(false); + .thenReturn(false); doNothing().when(applicationEventPublisher).publishEvent(any()); - assertDoesNotThrow( - () -> roleBindingController.bulkDelete("test", "test.rolebinding*", false) - ); + var result = roleBindingController.bulkDelete("test", "test.rolebinding*", false); + assertEquals(HttpStatus.OK, result.getStatus()); } @Test - void shouldDeleteRoleBindingsInDryRunMode() { + void shouldNotBulkDeleteRoleBindingsInDryRunMode() { RoleBinding rolebinding1 = RoleBinding.builder() - .metadata(Metadata.builder() - .name("test.rolebinding1") - .build()) - .build(); + .metadata(Metadata.builder() + .name("test.rolebinding1") + .build()) + .build(); + RoleBinding rolebinding2 = RoleBinding.builder() - .metadata(Metadata.builder() - .name("test.rolebinding2") - .build()) - .build(); + .metadata(Metadata.builder() + .name("test.rolebinding2") + .build()) + .build(); when(roleBindingService.findByWildcardName(any(), any())) - .thenReturn(List.of(rolebinding1, rolebinding2)); + .thenReturn(List.of(rolebinding1, rolebinding2)); - roleBindingController.bulkDelete("test", "test.rolebinding*", true); + var result = roleBindingController.bulkDelete("test", "test.rolebinding*", true); + assertEquals(HttpStatus.OK, result.getStatus()); verify(roleBindingService, never()).delete(any()); } @Test - void shouldNotDeleteRoleBindingsWhenNotFound() { + void shouldNotBulkDeleteRoleBindingsWhenNotFound() { when(roleBindingService.findByWildcardName(any(), any())) - .thenReturn(List.of()); + .thenReturn(List.of()); var response = roleBindingController.bulkDelete("test", "test.rolebinding*", false); verify(roleBindingService, never()).delete(any()); diff --git a/src/test/java/com/michelin/ns4kafka/controller/SchemaControllerTest.java b/src/test/java/com/michelin/ns4kafka/controller/SchemaControllerTest.java index 607c9a1bc..3bedef174 100644 --- a/src/test/java/com/michelin/ns4kafka/controller/SchemaControllerTest.java +++ b/src/test/java/com/michelin/ns4kafka/controller/SchemaControllerTest.java @@ -650,7 +650,7 @@ void shouldBulkDeleteAllSchemaVersions() { .thenReturn(Mono.just(new Integer[1])); StepVerifier.create(schemaController.bulkDelete("myNamespace", "prefix.subject-value", Optional.empty(), false)) - .consumeNextWith(response -> assertEquals(HttpStatus.NO_CONTENT, response.getStatus())) + .consumeNextWith(response -> assertEquals(HttpStatus.OK, response.getStatus())) .verifyComplete(); verify(applicationEventPublisher).publishEvent(any()); @@ -671,7 +671,7 @@ void shouldBulkDeleteSchemaVersion() { .thenReturn(Mono.just(1)); StepVerifier.create(schemaController.bulkDelete("myNamespace", "prefix.subject-value", Optional.of("1"), false)) - .consumeNextWith(response -> assertEquals(HttpStatus.NO_CONTENT, response.getStatus())) + .consumeNextWith(response -> assertEquals(HttpStatus.OK, response.getStatus())) .verifyComplete(); verify(applicationEventPublisher).publishEvent(any()); @@ -769,7 +769,7 @@ void shouldNotBulkDeleteAllSchemaVersionsInDryRunMode() { .thenReturn(Mono.just(schema)); StepVerifier.create(schemaController.bulkDelete("myNamespace", "prefix.subject-value", Optional.empty(), true)) - .consumeNextWith(response -> assertEquals(HttpStatus.NO_CONTENT, response.getStatus())) + .consumeNextWith(response -> assertEquals(HttpStatus.OK, response.getStatus())) .verifyComplete(); verify(schemaService, never()).deleteAllVersions(namespace, "prefix.subject-value"); @@ -788,7 +788,7 @@ void shouldNotBulkDeleteSchemaVersionInDryRunMode() { .thenReturn(Mono.just(schema)); StepVerifier.create(schemaController.bulkDelete("myNamespace", "prefix.subject-value", Optional.of("1"), true)) - .consumeNextWith(response -> assertEquals(HttpStatus.NO_CONTENT, response.getStatus())) + .consumeNextWith(response -> assertEquals(HttpStatus.OK, response.getStatus())) .verifyComplete(); verify(schemaService, never()).deleteVersion(namespace, "prefix.subject-value", "1"); diff --git a/src/test/java/com/michelin/ns4kafka/controller/StreamControllerTest.java b/src/test/java/com/michelin/ns4kafka/controller/StreamControllerTest.java index 71a783091..933555bbf 100644 --- a/src/test/java/com/michelin/ns4kafka/controller/StreamControllerTest.java +++ b/src/test/java/com/michelin/ns4kafka/controller/StreamControllerTest.java @@ -434,7 +434,7 @@ void shouldNotDeleteStreamsWhenNotOwner() { } @Test - void shouldDeleteMultipleStreams() { + void shouldBulkDeleteStreams() { Namespace ns = Namespace.builder() .metadata(Metadata.builder() .name("test") @@ -472,11 +472,11 @@ void shouldDeleteMultipleStreams() { doNothing().when(streamService).delete(ns, stream1); doNothing().when(streamService).delete(ns, stream2); var response = streamController.bulkDelete("test", "test_stream*", false); - assertEquals(HttpStatus.NO_CONTENT, response.getStatus()); + assertEquals(HttpStatus.OK, response.getStatus()); } @Test - void shouldDeleteMultipleStreamsInDryRunMode() { + void shouldNotBulkDeleteStreamsInDryRunMode() { Namespace ns = Namespace.builder() .metadata(Metadata.builder() .name("test") @@ -510,11 +510,11 @@ void shouldDeleteMultipleStreamsInDryRunMode() { var response = streamController.bulkDelete("test", "test_stream*", true); verify(streamService, never()).delete(any(), any()); - assertEquals(HttpStatus.NO_CONTENT, response.getStatus()); + assertEquals(HttpStatus.OK, response.getStatus()); } @Test - void shouldNotDeleteMultipleStreamsWhenNotFound() { + void shouldNotBulkDeleteStreamsWhenNotFound() { Namespace ns = Namespace.builder() .metadata(Metadata.builder() .name("test") @@ -535,7 +535,7 @@ void shouldNotDeleteMultipleStreamsWhenNotFound() { } @Test - void shouldNotDeleteMultipleStreamsWhenNotOwner() { + void shouldNotBulkDeleteStreamsWhenNotOwner() { Namespace ns = Namespace.builder() .metadata(Metadata.builder() .name("test") diff --git a/src/test/java/com/michelin/ns4kafka/controller/TopicControllerTest.java b/src/test/java/com/michelin/ns4kafka/controller/TopicControllerTest.java index cfb65b9eb..180038b47 100644 --- a/src/test/java/com/michelin/ns4kafka/controller/TopicControllerTest.java +++ b/src/test/java/com/michelin/ns4kafka/controller/TopicControllerTest.java @@ -178,7 +178,7 @@ void shouldGetTopic() { } @Test - void shouldDeleteMultipleTopics() throws InterruptedException, ExecutionException, TimeoutException { + void shouldBulkDeleteTopics() throws InterruptedException, ExecutionException, TimeoutException { Namespace ns = Namespace.builder() .metadata(Metadata.builder() .name("test") @@ -198,13 +198,12 @@ void shouldDeleteMultipleTopics() throws InterruptedException, ExecutionExceptio doNothing().when(topicService).deleteTopics(toDelete); doNothing().when(applicationEventPublisher).publishEvent(any()); - HttpResponse actual = topicController.bulkDelete("test", "prefix1.*", false); - - assertEquals(HttpStatus.NO_CONTENT, actual.getStatus()); + var actual = topicController.bulkDelete("test", "prefix1.*", false); + assertEquals(HttpStatus.OK, actual.getStatus()); } @Test - void shouldNotDeleteMultipleTopicsWhenNotFound() throws InterruptedException, ExecutionException, TimeoutException { + void shouldNotBulkDeleteTopicsWhenNotFound() throws InterruptedException, ExecutionException, TimeoutException { Namespace ns = Namespace.builder() .metadata(Metadata.builder() .name("test") @@ -218,14 +217,14 @@ void shouldNotDeleteMultipleTopicsWhenNotFound() throws InterruptedException, Ex when(topicService.findByWildcardName(ns, "topic*")) .thenReturn(List.of()); - HttpResponse actual = topicController.bulkDelete("test", "topic*", false); + var actual = topicController.bulkDelete("test", "topic*", false); assertEquals(HttpStatus.NOT_FOUND, actual.getStatus()); verify(topicService, never()).delete(any()); } @Test - void shouldNotDeleteMultipleTopicsInDryRunMode() throws InterruptedException, ExecutionException, TimeoutException { + void shouldNotBulkDeleteTopicsInDryRunMode() throws InterruptedException, ExecutionException, TimeoutException { Namespace ns = Namespace.builder() .metadata(Metadata.builder() .name("test") @@ -246,8 +245,8 @@ void shouldNotDeleteMultipleTopicsInDryRunMode() throws InterruptedException, Ex when(topicService.findByWildcardName(ns, "prefix.topic")) .thenReturn(toDelete); - topicController.bulkDelete("test", "prefix.topic", true); - + var actual = topicController.bulkDelete("test", "prefix.topic", true); + assertEquals(HttpStatus.OK, actual.getStatus()); verify(topicService, never()).delete(any()); } diff --git a/src/test/java/com/michelin/ns4kafka/integration/ConnectorIntegrationTest.java b/src/test/java/com/michelin/ns4kafka/integration/ConnectorIntegrationTest.java index 6409c95e2..ff607783b 100644 --- a/src/test/java/com/michelin/ns4kafka/integration/ConnectorIntegrationTest.java +++ b/src/test/java/com/michelin/ns4kafka/integration/ConnectorIntegrationTest.java @@ -2,6 +2,7 @@ import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -490,6 +491,7 @@ void shouldRestartConnector() throws InterruptedException { .retrieve(HttpRequest.GET("/connectors/ns1-co1/status"), ConnectorStateInfo.class); assertEquals("RUNNING", actual.connector().getState()); + assertFalse(actual.tasks().isEmpty()); assertEquals("RUNNING", actual.tasks().getFirst().getState()); } diff --git a/src/test/java/com/michelin/ns4kafka/integration/SchemaIntegrationTest.java b/src/test/java/com/michelin/ns4kafka/integration/SchemaIntegrationTest.java index c79f0fd8f..49ea21c8c 100644 --- a/src/test/java/com/michelin/ns4kafka/integration/SchemaIntegrationTest.java +++ b/src/test/java/com/michelin/ns4kafka/integration/SchemaIntegrationTest.java @@ -411,7 +411,7 @@ void shouldCheckSchemaStatus() { // Create person Schema schemaPersonWithRefs = Schema.builder() .metadata(Metadata.builder() - .name("ns1-person-subject-value") + .name("ns1-person2-subject-value") .build()) .spec(Schema.SchemaSpec.builder() .schema("{\"namespace\":\"com.michelin.kafka.producer.showcase.avro\"," @@ -451,7 +451,7 @@ void shouldCheckSchemaStatus() { // Create person v2, result should be changed Schema newSchemaVersionPersonWithRefs = Schema.builder() .metadata(Metadata.builder() - .name("ns1-person-subject-value") + .name("ns1-person2-subject-value") .build()) .spec(Schema.SchemaSpec.builder() .schema("{\"namespace\":\"com.michelin.kafka.producer.showcase.avro\"," @@ -483,11 +483,11 @@ void shouldCheckSchemaStatus() { SchemaResponse newActualPerson = schemaRegistryClient .toBlocking() - .retrieve(HttpRequest.GET("/subjects/ns1-person-subject-value/versions/latest"), SchemaResponse.class); + .retrieve(HttpRequest.GET("/subjects/ns1-person2-subject-value/versions/latest"), SchemaResponse.class); assertNotNull(newActualPerson.id()); assertEquals(2, newActualPerson.version()); - assertEquals("ns1-person-subject-value", newActualPerson.subject()); + assertEquals("ns1-person2-subject-value", newActualPerson.subject()); // Recreate person v1, result should be unchanged var personCreateV1Response = ns4KafkaClient @@ -864,7 +864,7 @@ void shouldDeleteSchemaVersion() { .create(HttpMethod.DELETE, "/api/namespaces/ns1/schemas?name=ns1-subject4-value&version=latest") .bearerAuth(token), Schema.class); - assertEquals(HttpStatus.NO_CONTENT, deleteLatestVersionResponse.getStatus()); + assertEquals(HttpStatus.OK, deleteLatestVersionResponse.getStatus()); // Get schemas versions var getSchemaAfterLatestVersionDeletionResponse = schemaRegistryClient @@ -882,7 +882,7 @@ void shouldDeleteSchemaVersion() { .create(HttpMethod.DELETE, "/api/namespaces/ns1/schemas?name=ns1-subject4-value&version=1") .bearerAuth(token), Schema.class); - assertEquals(HttpStatus.NO_CONTENT, deleteOldVersionResponse.getStatus()); + assertEquals(HttpStatus.OK, deleteOldVersionResponse.getStatus()); // Get schemas versions var getSchemaAfterOldVersionDeletionResponse = schemaRegistryClient @@ -900,7 +900,7 @@ void shouldDeleteSchemaVersion() { .create(HttpMethod.DELETE, "/api/namespaces/ns1/schemas?name=ns1-subject4-value") .bearerAuth(token), Schema.class); - assertEquals(HttpStatus.NO_CONTENT, deleteAllVersionsResponse.getStatus()); + assertEquals(HttpStatus.OK, deleteAllVersionsResponse.getStatus()); // Get all schemas var getSchemaAfterAllVersionsDeletionResponse = schemaRegistryClient @@ -993,10 +993,10 @@ void shouldBulkDeleteSchemas() { var deleteResponse = ns4KafkaClient .toBlocking() .exchange(HttpRequest - .create(HttpMethod.DELETE, "/api/namespaces/ns1/schemas?name=ns1-subject5-*") - .bearerAuth(token), Schema.class); + .create(HttpMethod.DELETE, "/api/namespaces/ns1/schemas?name=ns1-*-key") + .bearerAuth(token), Argument.listOf(Schema.class)); - assertEquals(HttpStatus.NO_CONTENT, deleteResponse.getStatus()); + assertEquals(HttpStatus.OK, deleteResponse.getStatus()); var getSchemasAfterDeletionResponse = schemaRegistryClient .toBlocking() @@ -1006,7 +1006,6 @@ void shouldBulkDeleteSchemas() { assertTrue(getSchemasAfterDeletionResponse.getBody().isPresent()); assertTrue(getSchemasAfterDeletionResponse.getBody().get() .stream() - .noneMatch(subject -> List.of("ns1-subject5-key", "ns1-subject5-value").contains(subject))); - assertTrue(getSchemasAfterDeletionResponse.getBody().get().contains("ns1-subject6-value")); + .noneMatch(subject -> subject.equals("ns1-subject5-key"))); } } diff --git a/src/test/java/com/michelin/ns4kafka/integration/TopicIntegrationTest.java b/src/test/java/com/michelin/ns4kafka/integration/TopicIntegrationTest.java index ccc9a5cba..f62342316 100644 --- a/src/test/java/com/michelin/ns4kafka/integration/TopicIntegrationTest.java +++ b/src/test/java/com/michelin/ns4kafka/integration/TopicIntegrationTest.java @@ -680,7 +680,7 @@ void shouldDeleteTopics() throws InterruptedException, ExecutionException { .create(HttpMethod.DELETE, "/api/namespaces/ns1/topics?name=ns1-*Topic") .bearerAuth(token)); - assertEquals(HttpStatus.NO_CONTENT, deleteResponse.getStatus()); + assertEquals(HttpStatus.OK, deleteResponse.getStatus()); forceTopicSynchronization();