Merge branch 'master' of github.com:provectus/kafka-ui into ISSUE-3732_quotas_apis
This commit is contained in:
commit
13fcdced8d
13 changed files with 167 additions and 180 deletions
|
@ -2,12 +2,19 @@ package com.provectus.kafka.ui.controller;
|
||||||
|
|
||||||
import com.provectus.kafka.ui.exception.ClusterNotFoundException;
|
import com.provectus.kafka.ui.exception.ClusterNotFoundException;
|
||||||
import com.provectus.kafka.ui.model.KafkaCluster;
|
import com.provectus.kafka.ui.model.KafkaCluster;
|
||||||
|
import com.provectus.kafka.ui.model.rbac.AccessContext;
|
||||||
import com.provectus.kafka.ui.service.ClustersStorage;
|
import com.provectus.kafka.ui.service.ClustersStorage;
|
||||||
|
import com.provectus.kafka.ui.service.audit.AuditService;
|
||||||
|
import com.provectus.kafka.ui.service.rbac.AccessControlService;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import reactor.core.publisher.Mono;
|
||||||
|
import reactor.core.publisher.Signal;
|
||||||
|
|
||||||
public abstract class AbstractController {
|
public abstract class AbstractController {
|
||||||
|
|
||||||
private ClustersStorage clustersStorage;
|
protected ClustersStorage clustersStorage;
|
||||||
|
protected AccessControlService accessControlService;
|
||||||
|
protected AuditService auditService;
|
||||||
|
|
||||||
protected KafkaCluster getCluster(String name) {
|
protected KafkaCluster getCluster(String name) {
|
||||||
return clustersStorage.getClusterByName(name)
|
return clustersStorage.getClusterByName(name)
|
||||||
|
@ -15,8 +22,26 @@ public abstract class AbstractController {
|
||||||
String.format("Cluster with name '%s' not found", name)));
|
String.format("Cluster with name '%s' not found", name)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected Mono<Void> validateAccess(AccessContext context) {
|
||||||
|
return accessControlService.validateAccess(context);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void audit(AccessContext acxt, Signal<?> sig) {
|
||||||
|
auditService.audit(acxt, sig);
|
||||||
|
}
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
public void setClustersStorage(ClustersStorage clustersStorage) {
|
public void setClustersStorage(ClustersStorage clustersStorage) {
|
||||||
this.clustersStorage = clustersStorage;
|
this.clustersStorage = clustersStorage;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
public void setAccessControlService(AccessControlService accessControlService) {
|
||||||
|
this.accessControlService = accessControlService;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
public void setAuditService(AuditService auditService) {
|
||||||
|
this.auditService = auditService;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,8 +11,6 @@ import com.provectus.kafka.ui.model.KafkaAclResourceTypeDTO;
|
||||||
import com.provectus.kafka.ui.model.rbac.AccessContext;
|
import com.provectus.kafka.ui.model.rbac.AccessContext;
|
||||||
import com.provectus.kafka.ui.model.rbac.permission.AclAction;
|
import com.provectus.kafka.ui.model.rbac.permission.AclAction;
|
||||||
import com.provectus.kafka.ui.service.acl.AclsService;
|
import com.provectus.kafka.ui.service.acl.AclsService;
|
||||||
import com.provectus.kafka.ui.service.audit.AuditService;
|
|
||||||
import com.provectus.kafka.ui.service.rbac.AccessControlService;
|
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import org.apache.kafka.common.resource.PatternType;
|
import org.apache.kafka.common.resource.PatternType;
|
||||||
|
@ -29,8 +27,6 @@ import reactor.core.publisher.Mono;
|
||||||
public class AclsController extends AbstractController implements AclsApi {
|
public class AclsController extends AbstractController implements AclsApi {
|
||||||
|
|
||||||
private final AclsService aclsService;
|
private final AclsService aclsService;
|
||||||
private final AccessControlService accessControlService;
|
|
||||||
private final AuditService auditService;
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Mono<ResponseEntity<Void>> createAcl(String clusterName, Mono<KafkaAclDTO> kafkaAclDto,
|
public Mono<ResponseEntity<Void>> createAcl(String clusterName, Mono<KafkaAclDTO> kafkaAclDto,
|
||||||
|
@ -41,11 +37,11 @@ public class AclsController extends AbstractController implements AclsApi {
|
||||||
.operationName("createAcl")
|
.operationName("createAcl")
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
return accessControlService.validateAccess(context)
|
return validateAccess(context)
|
||||||
.then(kafkaAclDto)
|
.then(kafkaAclDto)
|
||||||
.map(ClusterMapper::toAclBinding)
|
.map(ClusterMapper::toAclBinding)
|
||||||
.flatMap(binding -> aclsService.createAcl(getCluster(clusterName), binding))
|
.flatMap(binding -> aclsService.createAcl(getCluster(clusterName), binding))
|
||||||
.doOnEach(sig -> auditService.audit(context, sig))
|
.doOnEach(sig -> audit(context, sig))
|
||||||
.thenReturn(ResponseEntity.ok().build());
|
.thenReturn(ResponseEntity.ok().build());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -58,11 +54,11 @@ public class AclsController extends AbstractController implements AclsApi {
|
||||||
.operationName("deleteAcl")
|
.operationName("deleteAcl")
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
return accessControlService.validateAccess(context)
|
return validateAccess(context)
|
||||||
.then(kafkaAclDto)
|
.then(kafkaAclDto)
|
||||||
.map(ClusterMapper::toAclBinding)
|
.map(ClusterMapper::toAclBinding)
|
||||||
.flatMap(binding -> aclsService.deleteAcl(getCluster(clusterName), binding))
|
.flatMap(binding -> aclsService.deleteAcl(getCluster(clusterName), binding))
|
||||||
.doOnEach(sig -> auditService.audit(context, sig))
|
.doOnEach(sig -> audit(context, sig))
|
||||||
.thenReturn(ResponseEntity.ok().build());
|
.thenReturn(ResponseEntity.ok().build());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -88,12 +84,12 @@ public class AclsController extends AbstractController implements AclsApi {
|
||||||
|
|
||||||
var filter = new ResourcePatternFilter(resourceType, resourceName, namePatternType);
|
var filter = new ResourcePatternFilter(resourceType, resourceName, namePatternType);
|
||||||
|
|
||||||
return accessControlService.validateAccess(context).then(
|
return validateAccess(context).then(
|
||||||
Mono.just(
|
Mono.just(
|
||||||
ResponseEntity.ok(
|
ResponseEntity.ok(
|
||||||
aclsService.listAcls(getCluster(clusterName), filter)
|
aclsService.listAcls(getCluster(clusterName), filter)
|
||||||
.map(ClusterMapper::toKafkaAclDto)))
|
.map(ClusterMapper::toKafkaAclDto)))
|
||||||
).doOnEach(sig -> auditService.audit(context, sig));
|
).doOnEach(sig -> audit(context, sig));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -104,11 +100,11 @@ public class AclsController extends AbstractController implements AclsApi {
|
||||||
.operationName("getAclAsCsv")
|
.operationName("getAclAsCsv")
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
return accessControlService.validateAccess(context).then(
|
return validateAccess(context).then(
|
||||||
aclsService.getAclAsCsvString(getCluster(clusterName))
|
aclsService.getAclAsCsvString(getCluster(clusterName))
|
||||||
.map(ResponseEntity::ok)
|
.map(ResponseEntity::ok)
|
||||||
.flatMap(Mono::just)
|
.flatMap(Mono::just)
|
||||||
.doOnEach(sig -> auditService.audit(context, sig))
|
.doOnEach(sig -> audit(context, sig))
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -120,10 +116,10 @@ public class AclsController extends AbstractController implements AclsApi {
|
||||||
.operationName("syncAclsCsv")
|
.operationName("syncAclsCsv")
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
return accessControlService.validateAccess(context)
|
return validateAccess(context)
|
||||||
.then(csvMono)
|
.then(csvMono)
|
||||||
.flatMap(csv -> aclsService.syncAclWithAclCsv(getCluster(clusterName), csv))
|
.flatMap(csv -> aclsService.syncAclWithAclCsv(getCluster(clusterName), csv))
|
||||||
.doOnEach(sig -> auditService.audit(context, sig))
|
.doOnEach(sig -> audit(context, sig))
|
||||||
.thenReturn(ResponseEntity.ok().build());
|
.thenReturn(ResponseEntity.ok().build());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -137,10 +133,10 @@ public class AclsController extends AbstractController implements AclsApi {
|
||||||
.operationName("createConsumerAcl")
|
.operationName("createConsumerAcl")
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
return accessControlService.validateAccess(context)
|
return validateAccess(context)
|
||||||
.then(createConsumerAclDto)
|
.then(createConsumerAclDto)
|
||||||
.flatMap(req -> aclsService.createConsumerAcl(getCluster(clusterName), req))
|
.flatMap(req -> aclsService.createConsumerAcl(getCluster(clusterName), req))
|
||||||
.doOnEach(sig -> auditService.audit(context, sig))
|
.doOnEach(sig -> audit(context, sig))
|
||||||
.thenReturn(ResponseEntity.ok().build());
|
.thenReturn(ResponseEntity.ok().build());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -154,10 +150,10 @@ public class AclsController extends AbstractController implements AclsApi {
|
||||||
.operationName("createProducerAcl")
|
.operationName("createProducerAcl")
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
return accessControlService.validateAccess(context)
|
return validateAccess(context)
|
||||||
.then(createProducerAclDto)
|
.then(createProducerAclDto)
|
||||||
.flatMap(req -> aclsService.createProducerAcl(getCluster(clusterName), req))
|
.flatMap(req -> aclsService.createProducerAcl(getCluster(clusterName), req))
|
||||||
.doOnEach(sig -> auditService.audit(context, sig))
|
.doOnEach(sig -> audit(context, sig))
|
||||||
.thenReturn(ResponseEntity.ok().build());
|
.thenReturn(ResponseEntity.ok().build());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -171,10 +167,10 @@ public class AclsController extends AbstractController implements AclsApi {
|
||||||
.operationName("createStreamAppAcl")
|
.operationName("createStreamAppAcl")
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
return accessControlService.validateAccess(context)
|
return validateAccess(context)
|
||||||
.then(createStreamAppAclDto)
|
.then(createStreamAppAclDto)
|
||||||
.flatMap(req -> aclsService.createStreamAppAcl(getCluster(clusterName), req))
|
.flatMap(req -> aclsService.createStreamAppAcl(getCluster(clusterName), req))
|
||||||
.doOnEach(sig -> auditService.audit(context, sig))
|
.doOnEach(sig -> audit(context, sig))
|
||||||
.thenReturn(ResponseEntity.ok().build());
|
.thenReturn(ResponseEntity.ok().build());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,8 +15,6 @@ import com.provectus.kafka.ui.model.UploadedFileInfoDTO;
|
||||||
import com.provectus.kafka.ui.model.rbac.AccessContext;
|
import com.provectus.kafka.ui.model.rbac.AccessContext;
|
||||||
import com.provectus.kafka.ui.service.ApplicationInfoService;
|
import com.provectus.kafka.ui.service.ApplicationInfoService;
|
||||||
import com.provectus.kafka.ui.service.KafkaClusterFactory;
|
import com.provectus.kafka.ui.service.KafkaClusterFactory;
|
||||||
import com.provectus.kafka.ui.service.audit.AuditService;
|
|
||||||
import com.provectus.kafka.ui.service.rbac.AccessControlService;
|
|
||||||
import com.provectus.kafka.ui.util.ApplicationRestarter;
|
import com.provectus.kafka.ui.util.ApplicationRestarter;
|
||||||
import com.provectus.kafka.ui.util.DynamicConfigOperations;
|
import com.provectus.kafka.ui.util.DynamicConfigOperations;
|
||||||
import com.provectus.kafka.ui.util.DynamicConfigOperations.PropertiesStructure;
|
import com.provectus.kafka.ui.util.DynamicConfigOperations.PropertiesStructure;
|
||||||
|
@ -39,7 +37,7 @@ import reactor.util.function.Tuples;
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@RestController
|
@RestController
|
||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
public class ApplicationConfigController implements ApplicationConfigApi {
|
public class ApplicationConfigController extends AbstractController implements ApplicationConfigApi {
|
||||||
|
|
||||||
private static final PropertiesMapper MAPPER = Mappers.getMapper(PropertiesMapper.class);
|
private static final PropertiesMapper MAPPER = Mappers.getMapper(PropertiesMapper.class);
|
||||||
|
|
||||||
|
@ -51,12 +49,10 @@ public class ApplicationConfigController implements ApplicationConfigApi {
|
||||||
ApplicationConfigPropertiesDTO toDto(PropertiesStructure propertiesStructure);
|
ApplicationConfigPropertiesDTO toDto(PropertiesStructure propertiesStructure);
|
||||||
}
|
}
|
||||||
|
|
||||||
private final AccessControlService accessControlService;
|
|
||||||
private final DynamicConfigOperations dynamicConfigOperations;
|
private final DynamicConfigOperations dynamicConfigOperations;
|
||||||
private final ApplicationRestarter restarter;
|
private final ApplicationRestarter restarter;
|
||||||
private final KafkaClusterFactory kafkaClusterFactory;
|
private final KafkaClusterFactory kafkaClusterFactory;
|
||||||
private final ApplicationInfoService applicationInfoService;
|
private final ApplicationInfoService applicationInfoService;
|
||||||
private final AuditService auditService;
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Mono<ResponseEntity<ApplicationInfoDTO>> getApplicationInfo(ServerWebExchange exchange) {
|
public Mono<ResponseEntity<ApplicationInfoDTO>> getApplicationInfo(ServerWebExchange exchange) {
|
||||||
|
@ -69,12 +65,12 @@ public class ApplicationConfigController implements ApplicationConfigApi {
|
||||||
.applicationConfigActions(VIEW)
|
.applicationConfigActions(VIEW)
|
||||||
.operationName("getCurrentConfig")
|
.operationName("getCurrentConfig")
|
||||||
.build();
|
.build();
|
||||||
return accessControlService.validateAccess(context)
|
return validateAccess(context)
|
||||||
.then(Mono.fromSupplier(() -> ResponseEntity.ok(
|
.then(Mono.fromSupplier(() -> ResponseEntity.ok(
|
||||||
new ApplicationConfigDTO()
|
new ApplicationConfigDTO()
|
||||||
.properties(MAPPER.toDto(dynamicConfigOperations.getCurrentProperties()))
|
.properties(MAPPER.toDto(dynamicConfigOperations.getCurrentProperties()))
|
||||||
)))
|
)))
|
||||||
.doOnEach(sig -> auditService.audit(context, sig));
|
.doOnEach(sig -> audit(context, sig));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -84,14 +80,14 @@ public class ApplicationConfigController implements ApplicationConfigApi {
|
||||||
.applicationConfigActions(EDIT)
|
.applicationConfigActions(EDIT)
|
||||||
.operationName("restartWithConfig")
|
.operationName("restartWithConfig")
|
||||||
.build();
|
.build();
|
||||||
return accessControlService.validateAccess(context)
|
return validateAccess(context)
|
||||||
.then(restartRequestDto)
|
.then(restartRequestDto)
|
||||||
.<ResponseEntity<Void>>map(dto -> {
|
.<ResponseEntity<Void>>map(dto -> {
|
||||||
dynamicConfigOperations.persist(MAPPER.fromDto(dto.getConfig().getProperties()));
|
dynamicConfigOperations.persist(MAPPER.fromDto(dto.getConfig().getProperties()));
|
||||||
restarter.requestRestart();
|
restarter.requestRestart();
|
||||||
return ResponseEntity.ok().build();
|
return ResponseEntity.ok().build();
|
||||||
})
|
})
|
||||||
.doOnEach(sig -> auditService.audit(context, sig));
|
.doOnEach(sig -> audit(context, sig));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -101,13 +97,13 @@ public class ApplicationConfigController implements ApplicationConfigApi {
|
||||||
.applicationConfigActions(EDIT)
|
.applicationConfigActions(EDIT)
|
||||||
.operationName("uploadConfigRelatedFile")
|
.operationName("uploadConfigRelatedFile")
|
||||||
.build();
|
.build();
|
||||||
return accessControlService.validateAccess(context)
|
return validateAccess(context)
|
||||||
.then(fileFlux.single())
|
.then(fileFlux.single())
|
||||||
.flatMap(file ->
|
.flatMap(file ->
|
||||||
dynamicConfigOperations.uploadConfigRelatedFile((FilePart) file)
|
dynamicConfigOperations.uploadConfigRelatedFile((FilePart) file)
|
||||||
.map(path -> new UploadedFileInfoDTO().location(path.toString()))
|
.map(path -> new UploadedFileInfoDTO().location(path.toString()))
|
||||||
.map(ResponseEntity::ok))
|
.map(ResponseEntity::ok))
|
||||||
.doOnEach(sig -> auditService.audit(context, sig));
|
.doOnEach(sig -> audit(context, sig));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -117,7 +113,7 @@ public class ApplicationConfigController implements ApplicationConfigApi {
|
||||||
.applicationConfigActions(EDIT)
|
.applicationConfigActions(EDIT)
|
||||||
.operationName("validateConfig")
|
.operationName("validateConfig")
|
||||||
.build();
|
.build();
|
||||||
return accessControlService.validateAccess(context)
|
return validateAccess(context)
|
||||||
.then(configDto)
|
.then(configDto)
|
||||||
.flatMap(config -> {
|
.flatMap(config -> {
|
||||||
PropertiesStructure propertiesStructure = MAPPER.fromDto(config.getProperties());
|
PropertiesStructure propertiesStructure = MAPPER.fromDto(config.getProperties());
|
||||||
|
@ -126,7 +122,7 @@ public class ApplicationConfigController implements ApplicationConfigApi {
|
||||||
.map(validations -> new ApplicationConfigValidationDTO().clusters(validations));
|
.map(validations -> new ApplicationConfigValidationDTO().clusters(validations));
|
||||||
})
|
})
|
||||||
.map(ResponseEntity::ok)
|
.map(ResponseEntity::ok)
|
||||||
.doOnEach(sig -> auditService.audit(context, sig));
|
.doOnEach(sig -> audit(context, sig));
|
||||||
}
|
}
|
||||||
|
|
||||||
private Mono<Map<String, ClusterConfigValidationDTO>> validateClustersConfig(
|
private Mono<Map<String, ClusterConfigValidationDTO>> validateClustersConfig(
|
||||||
|
|
|
@ -11,8 +11,6 @@ import com.provectus.kafka.ui.model.BrokersLogdirsDTO;
|
||||||
import com.provectus.kafka.ui.model.rbac.AccessContext;
|
import com.provectus.kafka.ui.model.rbac.AccessContext;
|
||||||
import com.provectus.kafka.ui.model.rbac.permission.ClusterConfigAction;
|
import com.provectus.kafka.ui.model.rbac.permission.ClusterConfigAction;
|
||||||
import com.provectus.kafka.ui.service.BrokerService;
|
import com.provectus.kafka.ui.service.BrokerService;
|
||||||
import com.provectus.kafka.ui.service.audit.AuditService;
|
|
||||||
import com.provectus.kafka.ui.service.rbac.AccessControlService;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
|
@ -31,9 +29,6 @@ public class BrokersController extends AbstractController implements BrokersApi
|
||||||
private final BrokerService brokerService;
|
private final BrokerService brokerService;
|
||||||
private final ClusterMapper clusterMapper;
|
private final ClusterMapper clusterMapper;
|
||||||
|
|
||||||
private final AuditService auditService;
|
|
||||||
private final AccessControlService accessControlService;
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Mono<ResponseEntity<Flux<BrokerDTO>>> getBrokers(String clusterName,
|
public Mono<ResponseEntity<Flux<BrokerDTO>>> getBrokers(String clusterName,
|
||||||
ServerWebExchange exchange) {
|
ServerWebExchange exchange) {
|
||||||
|
@ -43,9 +38,9 @@ public class BrokersController extends AbstractController implements BrokersApi
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
var job = brokerService.getBrokers(getCluster(clusterName)).map(clusterMapper::toBrokerDto);
|
var job = brokerService.getBrokers(getCluster(clusterName)).map(clusterMapper::toBrokerDto);
|
||||||
return accessControlService.validateAccess(context)
|
return validateAccess(context)
|
||||||
.thenReturn(ResponseEntity.ok(job))
|
.thenReturn(ResponseEntity.ok(job))
|
||||||
.doOnEach(sig -> auditService.audit(context, sig));
|
.doOnEach(sig -> audit(context, sig));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -57,14 +52,14 @@ public class BrokersController extends AbstractController implements BrokersApi
|
||||||
.operationParams(Map.of("id", id))
|
.operationParams(Map.of("id", id))
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
return accessControlService.validateAccess(context)
|
return validateAccess(context)
|
||||||
.then(
|
.then(
|
||||||
brokerService.getBrokerMetrics(getCluster(clusterName), id)
|
brokerService.getBrokerMetrics(getCluster(clusterName), id)
|
||||||
.map(clusterMapper::toBrokerMetrics)
|
.map(clusterMapper::toBrokerMetrics)
|
||||||
.map(ResponseEntity::ok)
|
.map(ResponseEntity::ok)
|
||||||
.onErrorReturn(ResponseEntity.notFound().build())
|
.onErrorReturn(ResponseEntity.notFound().build())
|
||||||
)
|
)
|
||||||
.doOnEach(sig -> auditService.audit(context, sig));
|
.doOnEach(sig -> audit(context, sig));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -80,10 +75,10 @@ public class BrokersController extends AbstractController implements BrokersApi
|
||||||
.operationParams(Map.of("brokerIds", brokerIds))
|
.operationParams(Map.of("brokerIds", brokerIds))
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
return accessControlService.validateAccess(context)
|
return validateAccess(context)
|
||||||
.thenReturn(ResponseEntity.ok(
|
.thenReturn(ResponseEntity.ok(
|
||||||
brokerService.getAllBrokersLogdirs(getCluster(clusterName), brokerIds)))
|
brokerService.getAllBrokersLogdirs(getCluster(clusterName), brokerIds)))
|
||||||
.doOnEach(sig -> auditService.audit(context, sig));
|
.doOnEach(sig -> audit(context, sig));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -97,11 +92,11 @@ public class BrokersController extends AbstractController implements BrokersApi
|
||||||
.operationParams(Map.of("brokerId", id))
|
.operationParams(Map.of("brokerId", id))
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
return accessControlService.validateAccess(context).thenReturn(
|
return validateAccess(context).thenReturn(
|
||||||
ResponseEntity.ok(
|
ResponseEntity.ok(
|
||||||
brokerService.getBrokerConfig(getCluster(clusterName), id)
|
brokerService.getBrokerConfig(getCluster(clusterName), id)
|
||||||
.map(clusterMapper::toBrokerConfig))
|
.map(clusterMapper::toBrokerConfig))
|
||||||
).doOnEach(sig -> auditService.audit(context, sig));
|
).doOnEach(sig -> audit(context, sig));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -116,11 +111,11 @@ public class BrokersController extends AbstractController implements BrokersApi
|
||||||
.operationParams(Map.of("brokerId", id))
|
.operationParams(Map.of("brokerId", id))
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
return accessControlService.validateAccess(context).then(
|
return validateAccess(context).then(
|
||||||
brokerLogdir
|
brokerLogdir
|
||||||
.flatMap(bld -> brokerService.updateBrokerLogDir(getCluster(clusterName), id, bld))
|
.flatMap(bld -> brokerService.updateBrokerLogDir(getCluster(clusterName), id, bld))
|
||||||
.map(ResponseEntity::ok)
|
.map(ResponseEntity::ok)
|
||||||
).doOnEach(sig -> auditService.audit(context, sig));
|
).doOnEach(sig -> audit(context, sig));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -136,11 +131,11 @@ public class BrokersController extends AbstractController implements BrokersApi
|
||||||
.operationParams(Map.of("brokerId", id))
|
.operationParams(Map.of("brokerId", id))
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
return accessControlService.validateAccess(context).then(
|
return validateAccess(context).then(
|
||||||
brokerConfig
|
brokerConfig
|
||||||
.flatMap(bci -> brokerService.updateBrokerConfigByName(
|
.flatMap(bci -> brokerService.updateBrokerConfigByName(
|
||||||
getCluster(clusterName), id, name, bci.getValue()))
|
getCluster(clusterName), id, name, bci.getValue()))
|
||||||
.map(ResponseEntity::ok)
|
.map(ResponseEntity::ok)
|
||||||
).doOnEach(sig -> auditService.audit(context, sig));
|
).doOnEach(sig -> audit(context, sig));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,8 +6,6 @@ import com.provectus.kafka.ui.model.ClusterMetricsDTO;
|
||||||
import com.provectus.kafka.ui.model.ClusterStatsDTO;
|
import com.provectus.kafka.ui.model.ClusterStatsDTO;
|
||||||
import com.provectus.kafka.ui.model.rbac.AccessContext;
|
import com.provectus.kafka.ui.model.rbac.AccessContext;
|
||||||
import com.provectus.kafka.ui.service.ClusterService;
|
import com.provectus.kafka.ui.service.ClusterService;
|
||||||
import com.provectus.kafka.ui.service.audit.AuditService;
|
|
||||||
import com.provectus.kafka.ui.service.rbac.AccessControlService;
|
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.http.ResponseEntity;
|
import org.springframework.http.ResponseEntity;
|
||||||
|
@ -21,8 +19,6 @@ import reactor.core.publisher.Mono;
|
||||||
@Slf4j
|
@Slf4j
|
||||||
public class ClustersController extends AbstractController implements ClustersApi {
|
public class ClustersController extends AbstractController implements ClustersApi {
|
||||||
private final ClusterService clusterService;
|
private final ClusterService clusterService;
|
||||||
private final AccessControlService accessControlService;
|
|
||||||
private final AuditService auditService;
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Mono<ResponseEntity<Flux<ClusterDTO>>> getClusters(ServerWebExchange exchange) {
|
public Mono<ResponseEntity<Flux<ClusterDTO>>> getClusters(ServerWebExchange exchange) {
|
||||||
|
@ -40,13 +36,13 @@ public class ClustersController extends AbstractController implements ClustersAp
|
||||||
.operationName("getClusterMetrics")
|
.operationName("getClusterMetrics")
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
return accessControlService.validateAccess(context)
|
return validateAccess(context)
|
||||||
.then(
|
.then(
|
||||||
clusterService.getClusterMetrics(getCluster(clusterName))
|
clusterService.getClusterMetrics(getCluster(clusterName))
|
||||||
.map(ResponseEntity::ok)
|
.map(ResponseEntity::ok)
|
||||||
.onErrorReturn(ResponseEntity.notFound().build())
|
.onErrorReturn(ResponseEntity.notFound().build())
|
||||||
)
|
)
|
||||||
.doOnEach(sig -> auditService.audit(context, sig));
|
.doOnEach(sig -> audit(context, sig));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -57,13 +53,13 @@ public class ClustersController extends AbstractController implements ClustersAp
|
||||||
.operationName("getClusterStats")
|
.operationName("getClusterStats")
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
return accessControlService.validateAccess(context)
|
return validateAccess(context)
|
||||||
.then(
|
.then(
|
||||||
clusterService.getClusterStats(getCluster(clusterName))
|
clusterService.getClusterStats(getCluster(clusterName))
|
||||||
.map(ResponseEntity::ok)
|
.map(ResponseEntity::ok)
|
||||||
.onErrorReturn(ResponseEntity.notFound().build())
|
.onErrorReturn(ResponseEntity.notFound().build())
|
||||||
)
|
)
|
||||||
.doOnEach(sig -> auditService.audit(context, sig));
|
.doOnEach(sig -> audit(context, sig));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -75,8 +71,8 @@ public class ClustersController extends AbstractController implements ClustersAp
|
||||||
.operationName("updateClusterInfo")
|
.operationName("updateClusterInfo")
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
return accessControlService.validateAccess(context)
|
return validateAccess(context)
|
||||||
.then(clusterService.updateCluster(getCluster(clusterName)).map(ResponseEntity::ok))
|
.then(clusterService.updateCluster(getCluster(clusterName)).map(ResponseEntity::ok))
|
||||||
.doOnEach(sig -> auditService.audit(context, sig));
|
.doOnEach(sig -> audit(context, sig));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,8 +19,6 @@ import com.provectus.kafka.ui.model.rbac.AccessContext;
|
||||||
import com.provectus.kafka.ui.model.rbac.permission.TopicAction;
|
import com.provectus.kafka.ui.model.rbac.permission.TopicAction;
|
||||||
import com.provectus.kafka.ui.service.ConsumerGroupService;
|
import com.provectus.kafka.ui.service.ConsumerGroupService;
|
||||||
import com.provectus.kafka.ui.service.OffsetsResetService;
|
import com.provectus.kafka.ui.service.OffsetsResetService;
|
||||||
import com.provectus.kafka.ui.service.audit.AuditService;
|
|
||||||
import com.provectus.kafka.ui.service.rbac.AccessControlService;
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.function.Supplier;
|
import java.util.function.Supplier;
|
||||||
|
@ -42,8 +40,6 @@ public class ConsumerGroupsController extends AbstractController implements Cons
|
||||||
|
|
||||||
private final ConsumerGroupService consumerGroupService;
|
private final ConsumerGroupService consumerGroupService;
|
||||||
private final OffsetsResetService offsetsResetService;
|
private final OffsetsResetService offsetsResetService;
|
||||||
private final AccessControlService accessControlService;
|
|
||||||
private final AuditService auditService;
|
|
||||||
|
|
||||||
@Value("${consumer.groups.page.size:25}")
|
@Value("${consumer.groups.page.size:25}")
|
||||||
private int defaultConsumerGroupsPageSize;
|
private int defaultConsumerGroupsPageSize;
|
||||||
|
@ -59,9 +55,9 @@ public class ConsumerGroupsController extends AbstractController implements Cons
|
||||||
.operationName("deleteConsumerGroup")
|
.operationName("deleteConsumerGroup")
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
return accessControlService.validateAccess(context)
|
return validateAccess(context)
|
||||||
.then(consumerGroupService.deleteConsumerGroupById(getCluster(clusterName), id))
|
.then(consumerGroupService.deleteConsumerGroupById(getCluster(clusterName), id))
|
||||||
.doOnEach(sig -> auditService.audit(context, sig))
|
.doOnEach(sig -> audit(context, sig))
|
||||||
.thenReturn(ResponseEntity.ok().build());
|
.thenReturn(ResponseEntity.ok().build());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -76,11 +72,11 @@ public class ConsumerGroupsController extends AbstractController implements Cons
|
||||||
.operationName("getConsumerGroup")
|
.operationName("getConsumerGroup")
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
return accessControlService.validateAccess(context)
|
return validateAccess(context)
|
||||||
.then(consumerGroupService.getConsumerGroupDetail(getCluster(clusterName), consumerGroupId)
|
.then(consumerGroupService.getConsumerGroupDetail(getCluster(clusterName), consumerGroupId)
|
||||||
.map(ConsumerGroupMapper::toDetailsDto)
|
.map(ConsumerGroupMapper::toDetailsDto)
|
||||||
.map(ResponseEntity::ok))
|
.map(ResponseEntity::ok))
|
||||||
.doOnEach(sig -> auditService.audit(context, sig));
|
.doOnEach(sig -> audit(context, sig));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -104,9 +100,9 @@ public class ConsumerGroupsController extends AbstractController implements Cons
|
||||||
.map(ResponseEntity::ok)
|
.map(ResponseEntity::ok)
|
||||||
.switchIfEmpty(Mono.just(ResponseEntity.notFound().build()));
|
.switchIfEmpty(Mono.just(ResponseEntity.notFound().build()));
|
||||||
|
|
||||||
return accessControlService.validateAccess(context)
|
return validateAccess(context)
|
||||||
.then(job)
|
.then(job)
|
||||||
.doOnEach(sig -> auditService.audit(context, sig));
|
.doOnEach(sig -> audit(context, sig));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -125,7 +121,7 @@ public class ConsumerGroupsController extends AbstractController implements Cons
|
||||||
.operationName("getConsumerGroupsPage")
|
.operationName("getConsumerGroupsPage")
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
return accessControlService.validateAccess(context).then(
|
return validateAccess(context).then(
|
||||||
consumerGroupService.getConsumerGroupsPage(
|
consumerGroupService.getConsumerGroupsPage(
|
||||||
getCluster(clusterName),
|
getCluster(clusterName),
|
||||||
Optional.ofNullable(page).filter(i -> i > 0).orElse(1),
|
Optional.ofNullable(page).filter(i -> i > 0).orElse(1),
|
||||||
|
@ -136,7 +132,7 @@ public class ConsumerGroupsController extends AbstractController implements Cons
|
||||||
)
|
)
|
||||||
.map(this::convertPage)
|
.map(this::convertPage)
|
||||||
.map(ResponseEntity::ok)
|
.map(ResponseEntity::ok)
|
||||||
).doOnEach(sig -> auditService.audit(context, sig));
|
).doOnEach(sig -> audit(context, sig));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -191,9 +187,9 @@ public class ConsumerGroupsController extends AbstractController implements Cons
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
return accessControlService.validateAccess(context)
|
return validateAccess(context)
|
||||||
.then(mono.get())
|
.then(mono.get())
|
||||||
.doOnEach(sig -> auditService.audit(context, sig));
|
.doOnEach(sig -> audit(context, sig));
|
||||||
}).thenReturn(ResponseEntity.ok().build());
|
}).thenReturn(ResponseEntity.ok().build());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -18,8 +18,6 @@ import com.provectus.kafka.ui.model.TaskDTO;
|
||||||
import com.provectus.kafka.ui.model.rbac.AccessContext;
|
import com.provectus.kafka.ui.model.rbac.AccessContext;
|
||||||
import com.provectus.kafka.ui.model.rbac.permission.ConnectAction;
|
import com.provectus.kafka.ui.model.rbac.permission.ConnectAction;
|
||||||
import com.provectus.kafka.ui.service.KafkaConnectService;
|
import com.provectus.kafka.ui.service.KafkaConnectService;
|
||||||
import com.provectus.kafka.ui.service.audit.AuditService;
|
|
||||||
import com.provectus.kafka.ui.service.rbac.AccessControlService;
|
|
||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
@ -40,8 +38,6 @@ public class KafkaConnectController extends AbstractController implements KafkaC
|
||||||
= Set.of(RESTART, RESTART_FAILED_TASKS, RESTART_ALL_TASKS);
|
= Set.of(RESTART, RESTART_FAILED_TASKS, RESTART_ALL_TASKS);
|
||||||
|
|
||||||
private final KafkaConnectService kafkaConnectService;
|
private final KafkaConnectService kafkaConnectService;
|
||||||
private final AccessControlService accessControlService;
|
|
||||||
private final AuditService auditService;
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Mono<ResponseEntity<Flux<ConnectDTO>>> getConnects(String clusterName,
|
public Mono<ResponseEntity<Flux<ConnectDTO>>> getConnects(String clusterName,
|
||||||
|
@ -64,9 +60,9 @@ public class KafkaConnectController extends AbstractController implements KafkaC
|
||||||
.operationName("getConnectors")
|
.operationName("getConnectors")
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
return accessControlService.validateAccess(context)
|
return validateAccess(context)
|
||||||
.thenReturn(ResponseEntity.ok(kafkaConnectService.getConnectorNames(getCluster(clusterName), connectName)))
|
.thenReturn(ResponseEntity.ok(kafkaConnectService.getConnectorNames(getCluster(clusterName), connectName)))
|
||||||
.doOnEach(sig -> auditService.audit(context, sig));
|
.doOnEach(sig -> audit(context, sig));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -81,10 +77,10 @@ public class KafkaConnectController extends AbstractController implements KafkaC
|
||||||
.operationName("createConnector")
|
.operationName("createConnector")
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
return accessControlService.validateAccess(context).then(
|
return validateAccess(context).then(
|
||||||
kafkaConnectService.createConnector(getCluster(clusterName), connectName, connector)
|
kafkaConnectService.createConnector(getCluster(clusterName), connectName, connector)
|
||||||
.map(ResponseEntity::ok)
|
.map(ResponseEntity::ok)
|
||||||
).doOnEach(sig -> auditService.audit(context, sig));
|
).doOnEach(sig -> audit(context, sig));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -100,10 +96,10 @@ public class KafkaConnectController extends AbstractController implements KafkaC
|
||||||
.operationName("getConnector")
|
.operationName("getConnector")
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
return accessControlService.validateAccess(context).then(
|
return validateAccess(context).then(
|
||||||
kafkaConnectService.getConnector(getCluster(clusterName), connectName, connectorName)
|
kafkaConnectService.getConnector(getCluster(clusterName), connectName, connectorName)
|
||||||
.map(ResponseEntity::ok)
|
.map(ResponseEntity::ok)
|
||||||
).doOnEach(sig -> auditService.audit(context, sig));
|
).doOnEach(sig -> audit(context, sig));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -119,10 +115,10 @@ public class KafkaConnectController extends AbstractController implements KafkaC
|
||||||
.operationParams(Map.of("connectorName", connectName))
|
.operationParams(Map.of("connectorName", connectName))
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
return accessControlService.validateAccess(context).then(
|
return validateAccess(context).then(
|
||||||
kafkaConnectService.deleteConnector(getCluster(clusterName), connectName, connectorName)
|
kafkaConnectService.deleteConnector(getCluster(clusterName), connectName, connectorName)
|
||||||
.map(ResponseEntity::ok)
|
.map(ResponseEntity::ok)
|
||||||
).doOnEach(sig -> auditService.audit(context, sig));
|
).doOnEach(sig -> audit(context, sig));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -150,7 +146,7 @@ public class KafkaConnectController extends AbstractController implements KafkaC
|
||||||
.sort(comparator);
|
.sort(comparator);
|
||||||
|
|
||||||
return Mono.just(ResponseEntity.ok(job))
|
return Mono.just(ResponseEntity.ok(job))
|
||||||
.doOnEach(sig -> auditService.audit(context, sig));
|
.doOnEach(sig -> audit(context, sig));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -166,11 +162,11 @@ public class KafkaConnectController extends AbstractController implements KafkaC
|
||||||
.operationName("getConnectorConfig")
|
.operationName("getConnectorConfig")
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
return accessControlService.validateAccess(context).then(
|
return validateAccess(context).then(
|
||||||
kafkaConnectService
|
kafkaConnectService
|
||||||
.getConnectorConfig(getCluster(clusterName), connectName, connectorName)
|
.getConnectorConfig(getCluster(clusterName), connectName, connectorName)
|
||||||
.map(ResponseEntity::ok)
|
.map(ResponseEntity::ok)
|
||||||
).doOnEach(sig -> auditService.audit(context, sig));
|
).doOnEach(sig -> audit(context, sig));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -187,11 +183,11 @@ public class KafkaConnectController extends AbstractController implements KafkaC
|
||||||
.operationParams(Map.of("connectorName", connectorName))
|
.operationParams(Map.of("connectorName", connectorName))
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
return accessControlService.validateAccess(context).then(
|
return validateAccess(context).then(
|
||||||
kafkaConnectService
|
kafkaConnectService
|
||||||
.setConnectorConfig(getCluster(clusterName), connectName, connectorName, requestBody)
|
.setConnectorConfig(getCluster(clusterName), connectName, connectorName, requestBody)
|
||||||
.map(ResponseEntity::ok))
|
.map(ResponseEntity::ok))
|
||||||
.doOnEach(sig -> auditService.audit(context, sig));
|
.doOnEach(sig -> audit(context, sig));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -214,11 +210,11 @@ public class KafkaConnectController extends AbstractController implements KafkaC
|
||||||
.operationParams(Map.of("connectorName", connectorName))
|
.operationParams(Map.of("connectorName", connectorName))
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
return accessControlService.validateAccess(context).then(
|
return validateAccess(context).then(
|
||||||
kafkaConnectService
|
kafkaConnectService
|
||||||
.updateConnectorState(getCluster(clusterName), connectName, connectorName, action)
|
.updateConnectorState(getCluster(clusterName), connectName, connectorName, action)
|
||||||
.map(ResponseEntity::ok)
|
.map(ResponseEntity::ok)
|
||||||
).doOnEach(sig -> auditService.audit(context, sig));
|
).doOnEach(sig -> audit(context, sig));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -234,11 +230,11 @@ public class KafkaConnectController extends AbstractController implements KafkaC
|
||||||
.operationParams(Map.of("connectorName", connectorName))
|
.operationParams(Map.of("connectorName", connectorName))
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
return accessControlService.validateAccess(context).thenReturn(
|
return validateAccess(context).thenReturn(
|
||||||
ResponseEntity
|
ResponseEntity
|
||||||
.ok(kafkaConnectService
|
.ok(kafkaConnectService
|
||||||
.getConnectorTasks(getCluster(clusterName), connectName, connectorName))
|
.getConnectorTasks(getCluster(clusterName), connectName, connectorName))
|
||||||
).doOnEach(sig -> auditService.audit(context, sig));
|
).doOnEach(sig -> audit(context, sig));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -254,11 +250,11 @@ public class KafkaConnectController extends AbstractController implements KafkaC
|
||||||
.operationParams(Map.of("connectorName", connectorName))
|
.operationParams(Map.of("connectorName", connectorName))
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
return accessControlService.validateAccess(context).then(
|
return validateAccess(context).then(
|
||||||
kafkaConnectService
|
kafkaConnectService
|
||||||
.restartConnectorTask(getCluster(clusterName), connectName, connectorName, taskId)
|
.restartConnectorTask(getCluster(clusterName), connectName, connectorName, taskId)
|
||||||
.map(ResponseEntity::ok)
|
.map(ResponseEntity::ok)
|
||||||
).doOnEach(sig -> auditService.audit(context, sig));
|
).doOnEach(sig -> audit(context, sig));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -272,11 +268,11 @@ public class KafkaConnectController extends AbstractController implements KafkaC
|
||||||
.operationName("getConnectorPlugins")
|
.operationName("getConnectorPlugins")
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
return accessControlService.validateAccess(context).then(
|
return validateAccess(context).then(
|
||||||
Mono.just(
|
Mono.just(
|
||||||
ResponseEntity.ok(
|
ResponseEntity.ok(
|
||||||
kafkaConnectService.getConnectorPlugins(getCluster(clusterName), connectName)))
|
kafkaConnectService.getConnectorPlugins(getCluster(clusterName), connectName)))
|
||||||
).doOnEach(sig -> auditService.audit(context, sig));
|
).doOnEach(sig -> audit(context, sig));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -9,9 +9,7 @@ import com.provectus.kafka.ui.model.KsqlTableDescriptionDTO;
|
||||||
import com.provectus.kafka.ui.model.KsqlTableResponseDTO;
|
import com.provectus.kafka.ui.model.KsqlTableResponseDTO;
|
||||||
import com.provectus.kafka.ui.model.rbac.AccessContext;
|
import com.provectus.kafka.ui.model.rbac.AccessContext;
|
||||||
import com.provectus.kafka.ui.model.rbac.permission.KsqlAction;
|
import com.provectus.kafka.ui.model.rbac.permission.KsqlAction;
|
||||||
import com.provectus.kafka.ui.service.audit.AuditService;
|
|
||||||
import com.provectus.kafka.ui.service.ksql.KsqlServiceV2;
|
import com.provectus.kafka.ui.service.ksql.KsqlServiceV2;
|
||||||
import com.provectus.kafka.ui.service.rbac.AccessControlService;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
@ -29,8 +27,6 @@ import reactor.core.publisher.Mono;
|
||||||
public class KsqlController extends AbstractController implements KsqlApi {
|
public class KsqlController extends AbstractController implements KsqlApi {
|
||||||
|
|
||||||
private final KsqlServiceV2 ksqlServiceV2;
|
private final KsqlServiceV2 ksqlServiceV2;
|
||||||
private final AccessControlService accessControlService;
|
|
||||||
private final AuditService auditService;
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Mono<ResponseEntity<KsqlCommandV2ResponseDTO>> executeKsql(String clusterName,
|
public Mono<ResponseEntity<KsqlCommandV2ResponseDTO>> executeKsql(String clusterName,
|
||||||
|
@ -44,13 +40,13 @@ public class KsqlController extends AbstractController implements KsqlApi {
|
||||||
.operationName("executeKsql")
|
.operationName("executeKsql")
|
||||||
.operationParams(command)
|
.operationParams(command)
|
||||||
.build();
|
.build();
|
||||||
return accessControlService.validateAccess(context).thenReturn(
|
return validateAccess(context).thenReturn(
|
||||||
new KsqlCommandV2ResponseDTO().pipeId(
|
new KsqlCommandV2ResponseDTO().pipeId(
|
||||||
ksqlServiceV2.registerCommand(
|
ksqlServiceV2.registerCommand(
|
||||||
getCluster(clusterName),
|
getCluster(clusterName),
|
||||||
command.getKsql(),
|
command.getKsql(),
|
||||||
Optional.ofNullable(command.getStreamsProperties()).orElse(Map.of()))))
|
Optional.ofNullable(command.getStreamsProperties()).orElse(Map.of()))))
|
||||||
.doOnEach(sig -> auditService.audit(context, sig));
|
.doOnEach(sig -> audit(context, sig));
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
.map(ResponseEntity::ok);
|
.map(ResponseEntity::ok);
|
||||||
|
@ -66,7 +62,7 @@ public class KsqlController extends AbstractController implements KsqlApi {
|
||||||
.operationName("openKsqlResponsePipe")
|
.operationName("openKsqlResponsePipe")
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
return accessControlService.validateAccess(context).thenReturn(
|
return validateAccess(context).thenReturn(
|
||||||
ResponseEntity.ok(ksqlServiceV2.execute(pipeId)
|
ResponseEntity.ok(ksqlServiceV2.execute(pipeId)
|
||||||
.map(table -> new KsqlResponseDTO()
|
.map(table -> new KsqlResponseDTO()
|
||||||
.table(
|
.table(
|
||||||
|
@ -86,9 +82,9 @@ public class KsqlController extends AbstractController implements KsqlApi {
|
||||||
.operationName("listStreams")
|
.operationName("listStreams")
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
return accessControlService.validateAccess(context)
|
return validateAccess(context)
|
||||||
.thenReturn(ResponseEntity.ok(ksqlServiceV2.listStreams(getCluster(clusterName))))
|
.thenReturn(ResponseEntity.ok(ksqlServiceV2.listStreams(getCluster(clusterName))))
|
||||||
.doOnEach(sig -> auditService.audit(context, sig));
|
.doOnEach(sig -> audit(context, sig));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -100,8 +96,8 @@ public class KsqlController extends AbstractController implements KsqlApi {
|
||||||
.operationName("listTables")
|
.operationName("listTables")
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
return accessControlService.validateAccess(context)
|
return validateAccess(context)
|
||||||
.thenReturn(ResponseEntity.ok(ksqlServiceV2.listTables(getCluster(clusterName))))
|
.thenReturn(ResponseEntity.ok(ksqlServiceV2.listTables(getCluster(clusterName))))
|
||||||
.doOnEach(sig -> auditService.audit(context, sig));
|
.doOnEach(sig -> audit(context, sig));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,8 +24,6 @@ import com.provectus.kafka.ui.model.rbac.permission.AuditAction;
|
||||||
import com.provectus.kafka.ui.model.rbac.permission.TopicAction;
|
import com.provectus.kafka.ui.model.rbac.permission.TopicAction;
|
||||||
import com.provectus.kafka.ui.service.DeserializationService;
|
import com.provectus.kafka.ui.service.DeserializationService;
|
||||||
import com.provectus.kafka.ui.service.MessagesService;
|
import com.provectus.kafka.ui.service.MessagesService;
|
||||||
import com.provectus.kafka.ui.service.audit.AuditService;
|
|
||||||
import com.provectus.kafka.ui.service.rbac.AccessControlService;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
@ -49,8 +47,6 @@ public class MessagesController extends AbstractController implements MessagesAp
|
||||||
|
|
||||||
private final MessagesService messagesService;
|
private final MessagesService messagesService;
|
||||||
private final DeserializationService deserializationService;
|
private final DeserializationService deserializationService;
|
||||||
private final AccessControlService accessControlService;
|
|
||||||
private final AuditService auditService;
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Mono<ResponseEntity<Void>> deleteTopicMessages(
|
public Mono<ResponseEntity<Void>> deleteTopicMessages(
|
||||||
|
@ -63,13 +59,13 @@ public class MessagesController extends AbstractController implements MessagesAp
|
||||||
.topicActions(MESSAGES_DELETE)
|
.topicActions(MESSAGES_DELETE)
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
return accessControlService.validateAccess(context).<ResponseEntity<Void>>then(
|
return validateAccess(context).<ResponseEntity<Void>>then(
|
||||||
messagesService.deleteTopicMessages(
|
messagesService.deleteTopicMessages(
|
||||||
getCluster(clusterName),
|
getCluster(clusterName),
|
||||||
topicName,
|
topicName,
|
||||||
Optional.ofNullable(partitions).orElse(List.of())
|
Optional.ofNullable(partitions).orElse(List.of())
|
||||||
).thenReturn(ResponseEntity.ok().build())
|
).thenReturn(ResponseEntity.ok().build())
|
||||||
).doOnEach(sig -> auditService.audit(context, sig));
|
).doOnEach(sig -> audit(context, sig));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -120,9 +116,9 @@ public class MessagesController extends AbstractController implements MessagesAp
|
||||||
);
|
);
|
||||||
|
|
||||||
var context = contextBuilder.build();
|
var context = contextBuilder.build();
|
||||||
return accessControlService.validateAccess(context)
|
return validateAccess(context)
|
||||||
.then(job)
|
.then(job)
|
||||||
.doOnEach(sig -> auditService.audit(context, sig));
|
.doOnEach(sig -> audit(context, sig));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -137,11 +133,11 @@ public class MessagesController extends AbstractController implements MessagesAp
|
||||||
.operationName("sendTopicMessages")
|
.operationName("sendTopicMessages")
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
return accessControlService.validateAccess(context).then(
|
return validateAccess(context).then(
|
||||||
createTopicMessage.flatMap(msg ->
|
createTopicMessage.flatMap(msg ->
|
||||||
messagesService.sendMessage(getCluster(clusterName), topicName, msg).then()
|
messagesService.sendMessage(getCluster(clusterName), topicName, msg).then()
|
||||||
).map(ResponseEntity::ok)
|
).map(ResponseEntity::ok)
|
||||||
).doOnEach(sig -> auditService.audit(context, sig));
|
).doOnEach(sig -> audit(context, sig));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -192,7 +188,7 @@ public class MessagesController extends AbstractController implements MessagesAp
|
||||||
? deserializationService.getSerdesForSerialize(getCluster(clusterName), topicName, VALUE)
|
? deserializationService.getSerdesForSerialize(getCluster(clusterName), topicName, VALUE)
|
||||||
: deserializationService.getSerdesForDeserialize(getCluster(clusterName), topicName, VALUE));
|
: deserializationService.getSerdesForDeserialize(getCluster(clusterName), topicName, VALUE));
|
||||||
|
|
||||||
return accessControlService.validateAccess(context).then(
|
return validateAccess(context).then(
|
||||||
Mono.just(dto)
|
Mono.just(dto)
|
||||||
.subscribeOn(Schedulers.boundedElastic())
|
.subscribeOn(Schedulers.boundedElastic())
|
||||||
.map(ResponseEntity::ok)
|
.map(ResponseEntity::ok)
|
||||||
|
|
|
@ -13,8 +13,6 @@ import com.provectus.kafka.ui.model.SchemaSubjectsResponseDTO;
|
||||||
import com.provectus.kafka.ui.model.rbac.AccessContext;
|
import com.provectus.kafka.ui.model.rbac.AccessContext;
|
||||||
import com.provectus.kafka.ui.model.rbac.permission.SchemaAction;
|
import com.provectus.kafka.ui.model.rbac.permission.SchemaAction;
|
||||||
import com.provectus.kafka.ui.service.SchemaRegistryService;
|
import com.provectus.kafka.ui.service.SchemaRegistryService;
|
||||||
import com.provectus.kafka.ui.service.audit.AuditService;
|
|
||||||
import com.provectus.kafka.ui.service.rbac.AccessControlService;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
@ -38,8 +36,6 @@ public class SchemasController extends AbstractController implements SchemasApi
|
||||||
private final KafkaSrMapper kafkaSrMapper = new KafkaSrMapperImpl();
|
private final KafkaSrMapper kafkaSrMapper = new KafkaSrMapperImpl();
|
||||||
|
|
||||||
private final SchemaRegistryService schemaRegistryService;
|
private final SchemaRegistryService schemaRegistryService;
|
||||||
private final AccessControlService accessControlService;
|
|
||||||
private final AuditService auditService;
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected KafkaCluster getCluster(String clusterName) {
|
protected KafkaCluster getCluster(String clusterName) {
|
||||||
|
@ -61,7 +57,7 @@ public class SchemasController extends AbstractController implements SchemasApi
|
||||||
.operationName("checkSchemaCompatibility")
|
.operationName("checkSchemaCompatibility")
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
return accessControlService.validateAccess(context).then(
|
return validateAccess(context).then(
|
||||||
newSchemaSubjectMono.flatMap(subjectDTO ->
|
newSchemaSubjectMono.flatMap(subjectDTO ->
|
||||||
schemaRegistryService.checksSchemaCompatibility(
|
schemaRegistryService.checksSchemaCompatibility(
|
||||||
getCluster(clusterName),
|
getCluster(clusterName),
|
||||||
|
@ -70,7 +66,7 @@ public class SchemasController extends AbstractController implements SchemasApi
|
||||||
))
|
))
|
||||||
.map(kafkaSrMapper::toDto)
|
.map(kafkaSrMapper::toDto)
|
||||||
.map(ResponseEntity::ok)
|
.map(ResponseEntity::ok)
|
||||||
).doOnEach(sig -> auditService.audit(context, sig));
|
).doOnEach(sig -> audit(context, sig));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -83,7 +79,7 @@ public class SchemasController extends AbstractController implements SchemasApi
|
||||||
.operationName("createNewSchema")
|
.operationName("createNewSchema")
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
return accessControlService.validateAccess(context).then(
|
return validateAccess(context).then(
|
||||||
newSchemaSubjectMono.flatMap(newSubject ->
|
newSchemaSubjectMono.flatMap(newSubject ->
|
||||||
schemaRegistryService.registerNewSchema(
|
schemaRegistryService.registerNewSchema(
|
||||||
getCluster(clusterName),
|
getCluster(clusterName),
|
||||||
|
@ -92,7 +88,7 @@ public class SchemasController extends AbstractController implements SchemasApi
|
||||||
)
|
)
|
||||||
).map(kafkaSrMapper::toDto)
|
).map(kafkaSrMapper::toDto)
|
||||||
.map(ResponseEntity::ok)
|
.map(ResponseEntity::ok)
|
||||||
).doOnEach(sig -> auditService.audit(context, sig));
|
).doOnEach(sig -> audit(context, sig));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -105,9 +101,9 @@ public class SchemasController extends AbstractController implements SchemasApi
|
||||||
.operationName("deleteLatestSchema")
|
.operationName("deleteLatestSchema")
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
return accessControlService.validateAccess(context).then(
|
return validateAccess(context).then(
|
||||||
schemaRegistryService.deleteLatestSchemaSubject(getCluster(clusterName), subject)
|
schemaRegistryService.deleteLatestSchemaSubject(getCluster(clusterName), subject)
|
||||||
.doOnEach(sig -> auditService.audit(context, sig))
|
.doOnEach(sig -> audit(context, sig))
|
||||||
.thenReturn(ResponseEntity.ok().build())
|
.thenReturn(ResponseEntity.ok().build())
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -122,9 +118,9 @@ public class SchemasController extends AbstractController implements SchemasApi
|
||||||
.operationName("deleteSchema")
|
.operationName("deleteSchema")
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
return accessControlService.validateAccess(context).then(
|
return validateAccess(context).then(
|
||||||
schemaRegistryService.deleteSchemaSubjectEntirely(getCluster(clusterName), subject)
|
schemaRegistryService.deleteSchemaSubjectEntirely(getCluster(clusterName), subject)
|
||||||
.doOnEach(sig -> auditService.audit(context, sig))
|
.doOnEach(sig -> audit(context, sig))
|
||||||
.thenReturn(ResponseEntity.ok().build())
|
.thenReturn(ResponseEntity.ok().build())
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -139,9 +135,9 @@ public class SchemasController extends AbstractController implements SchemasApi
|
||||||
.operationName("deleteSchemaByVersion")
|
.operationName("deleteSchemaByVersion")
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
return accessControlService.validateAccess(context).then(
|
return validateAccess(context).then(
|
||||||
schemaRegistryService.deleteSchemaSubjectByVersion(getCluster(clusterName), subjectName, version)
|
schemaRegistryService.deleteSchemaSubjectByVersion(getCluster(clusterName), subjectName, version)
|
||||||
.doOnEach(sig -> auditService.audit(context, sig))
|
.doOnEach(sig -> audit(context, sig))
|
||||||
.thenReturn(ResponseEntity.ok().build())
|
.thenReturn(ResponseEntity.ok().build())
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -160,9 +156,9 @@ public class SchemasController extends AbstractController implements SchemasApi
|
||||||
schemaRegistryService.getAllVersionsBySubject(getCluster(clusterName), subjectName)
|
schemaRegistryService.getAllVersionsBySubject(getCluster(clusterName), subjectName)
|
||||||
.map(kafkaSrMapper::toDto);
|
.map(kafkaSrMapper::toDto);
|
||||||
|
|
||||||
return accessControlService.validateAccess(context)
|
return validateAccess(context)
|
||||||
.thenReturn(ResponseEntity.ok(schemas))
|
.thenReturn(ResponseEntity.ok(schemas))
|
||||||
.doOnEach(sig -> auditService.audit(context, sig));
|
.doOnEach(sig -> audit(context, sig));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -185,11 +181,11 @@ public class SchemasController extends AbstractController implements SchemasApi
|
||||||
.operationName("getLatestSchema")
|
.operationName("getLatestSchema")
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
return accessControlService.validateAccess(context).then(
|
return validateAccess(context).then(
|
||||||
schemaRegistryService.getLatestSchemaVersionBySubject(getCluster(clusterName), subject)
|
schemaRegistryService.getLatestSchemaVersionBySubject(getCluster(clusterName), subject)
|
||||||
.map(kafkaSrMapper::toDto)
|
.map(kafkaSrMapper::toDto)
|
||||||
.map(ResponseEntity::ok)
|
.map(ResponseEntity::ok)
|
||||||
).doOnEach(sig -> auditService.audit(context, sig));
|
).doOnEach(sig -> audit(context, sig));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -203,12 +199,12 @@ public class SchemasController extends AbstractController implements SchemasApi
|
||||||
.operationParams(Map.of("subject", subject, "version", version))
|
.operationParams(Map.of("subject", subject, "version", version))
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
return accessControlService.validateAccess(context).then(
|
return validateAccess(context).then(
|
||||||
schemaRegistryService.getSchemaSubjectByVersion(
|
schemaRegistryService.getSchemaSubjectByVersion(
|
||||||
getCluster(clusterName), subject, version)
|
getCluster(clusterName), subject, version)
|
||||||
.map(kafkaSrMapper::toDto)
|
.map(kafkaSrMapper::toDto)
|
||||||
.map(ResponseEntity::ok)
|
.map(ResponseEntity::ok)
|
||||||
).doOnEach(sig -> auditService.audit(context, sig));
|
).doOnEach(sig -> audit(context, sig));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -244,7 +240,7 @@ public class SchemasController extends AbstractController implements SchemasApi
|
||||||
.map(subjs -> subjs.stream().map(kafkaSrMapper::toDto).toList())
|
.map(subjs -> subjs.stream().map(kafkaSrMapper::toDto).toList())
|
||||||
.map(subjs -> new SchemaSubjectsResponseDTO().pageCount(totalPages).schemas(subjs));
|
.map(subjs -> new SchemaSubjectsResponseDTO().pageCount(totalPages).schemas(subjs));
|
||||||
}).map(ResponseEntity::ok)
|
}).map(ResponseEntity::ok)
|
||||||
.doOnEach(sig -> auditService.audit(context, sig));
|
.doOnEach(sig -> audit(context, sig));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -257,14 +253,14 @@ public class SchemasController extends AbstractController implements SchemasApi
|
||||||
.operationName("updateGlobalSchemaCompatibilityLevel")
|
.operationName("updateGlobalSchemaCompatibilityLevel")
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
return accessControlService.validateAccess(context).then(
|
return validateAccess(context).then(
|
||||||
compatibilityLevelMono
|
compatibilityLevelMono
|
||||||
.flatMap(compatibilityLevelDTO ->
|
.flatMap(compatibilityLevelDTO ->
|
||||||
schemaRegistryService.updateGlobalSchemaCompatibility(
|
schemaRegistryService.updateGlobalSchemaCompatibility(
|
||||||
getCluster(clusterName),
|
getCluster(clusterName),
|
||||||
kafkaSrMapper.fromDto(compatibilityLevelDTO.getCompatibility())
|
kafkaSrMapper.fromDto(compatibilityLevelDTO.getCompatibility())
|
||||||
))
|
))
|
||||||
.doOnEach(sig -> auditService.audit(context, sig))
|
.doOnEach(sig -> audit(context, sig))
|
||||||
.thenReturn(ResponseEntity.ok().build())
|
.thenReturn(ResponseEntity.ok().build())
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -280,7 +276,7 @@ public class SchemasController extends AbstractController implements SchemasApi
|
||||||
.operationParams(Map.of("subject", subject))
|
.operationParams(Map.of("subject", subject))
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
return accessControlService.validateAccess(context).then(
|
return validateAccess(context).then(
|
||||||
compatibilityLevelMono
|
compatibilityLevelMono
|
||||||
.flatMap(compatibilityLevelDTO ->
|
.flatMap(compatibilityLevelDTO ->
|
||||||
schemaRegistryService.updateSchemaCompatibility(
|
schemaRegistryService.updateSchemaCompatibility(
|
||||||
|
@ -288,7 +284,7 @@ public class SchemasController extends AbstractController implements SchemasApi
|
||||||
subject,
|
subject,
|
||||||
kafkaSrMapper.fromDto(compatibilityLevelDTO.getCompatibility())
|
kafkaSrMapper.fromDto(compatibilityLevelDTO.getCompatibility())
|
||||||
))
|
))
|
||||||
.doOnEach(sig -> auditService.audit(context, sig))
|
.doOnEach(sig -> audit(context, sig))
|
||||||
.thenReturn(ResponseEntity.ok().build())
|
.thenReturn(ResponseEntity.ok().build())
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,8 +27,6 @@ import com.provectus.kafka.ui.model.TopicsResponseDTO;
|
||||||
import com.provectus.kafka.ui.model.rbac.AccessContext;
|
import com.provectus.kafka.ui.model.rbac.AccessContext;
|
||||||
import com.provectus.kafka.ui.service.TopicsService;
|
import com.provectus.kafka.ui.service.TopicsService;
|
||||||
import com.provectus.kafka.ui.service.analyze.TopicAnalysisService;
|
import com.provectus.kafka.ui.service.analyze.TopicAnalysisService;
|
||||||
import com.provectus.kafka.ui.service.audit.AuditService;
|
|
||||||
import com.provectus.kafka.ui.service.rbac.AccessControlService;
|
|
||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
@ -53,8 +51,6 @@ public class TopicsController extends AbstractController implements TopicsApi {
|
||||||
private final TopicsService topicsService;
|
private final TopicsService topicsService;
|
||||||
private final TopicAnalysisService topicAnalysisService;
|
private final TopicAnalysisService topicAnalysisService;
|
||||||
private final ClusterMapper clusterMapper;
|
private final ClusterMapper clusterMapper;
|
||||||
private final AccessControlService accessControlService;
|
|
||||||
private final AuditService auditService;
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Mono<ResponseEntity<TopicDTO>> createTopic(
|
public Mono<ResponseEntity<TopicDTO>> createTopic(
|
||||||
|
@ -67,12 +63,12 @@ public class TopicsController extends AbstractController implements TopicsApi {
|
||||||
.operationParams(topicCreation)
|
.operationParams(topicCreation)
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
return accessControlService.validateAccess(context)
|
return validateAccess(context)
|
||||||
.then(topicsService.createTopic(getCluster(clusterName), topicCreation))
|
.then(topicsService.createTopic(getCluster(clusterName), topicCreation))
|
||||||
.map(clusterMapper::toTopic)
|
.map(clusterMapper::toTopic)
|
||||||
.map(s -> new ResponseEntity<>(s, HttpStatus.OK))
|
.map(s -> new ResponseEntity<>(s, HttpStatus.OK))
|
||||||
.switchIfEmpty(Mono.just(ResponseEntity.notFound().build()))
|
.switchIfEmpty(Mono.just(ResponseEntity.notFound().build()))
|
||||||
.doOnEach(sig -> auditService.audit(context, sig));
|
.doOnEach(sig -> audit(context, sig));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -86,11 +82,11 @@ public class TopicsController extends AbstractController implements TopicsApi {
|
||||||
.operationName("recreateTopic")
|
.operationName("recreateTopic")
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
return accessControlService.validateAccess(context).then(
|
return validateAccess(context).then(
|
||||||
topicsService.recreateTopic(getCluster(clusterName), topicName)
|
topicsService.recreateTopic(getCluster(clusterName), topicName)
|
||||||
.map(clusterMapper::toTopic)
|
.map(clusterMapper::toTopic)
|
||||||
.map(s -> new ResponseEntity<>(s, HttpStatus.CREATED))
|
.map(s -> new ResponseEntity<>(s, HttpStatus.CREATED))
|
||||||
).doOnEach(sig -> auditService.audit(context, sig));
|
).doOnEach(sig -> audit(context, sig));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -105,11 +101,11 @@ public class TopicsController extends AbstractController implements TopicsApi {
|
||||||
.operationParams(Map.of("newTopicName", newTopicName))
|
.operationParams(Map.of("newTopicName", newTopicName))
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
return accessControlService.validateAccess(context)
|
return validateAccess(context)
|
||||||
.then(topicsService.cloneTopic(getCluster(clusterName), topicName, newTopicName)
|
.then(topicsService.cloneTopic(getCluster(clusterName), topicName, newTopicName)
|
||||||
.map(clusterMapper::toTopic)
|
.map(clusterMapper::toTopic)
|
||||||
.map(s -> new ResponseEntity<>(s, HttpStatus.CREATED))
|
.map(s -> new ResponseEntity<>(s, HttpStatus.CREATED))
|
||||||
).doOnEach(sig -> auditService.audit(context, sig));
|
).doOnEach(sig -> audit(context, sig));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -123,11 +119,11 @@ public class TopicsController extends AbstractController implements TopicsApi {
|
||||||
.operationName("deleteTopic")
|
.operationName("deleteTopic")
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
return accessControlService.validateAccess(context)
|
return validateAccess(context)
|
||||||
.then(
|
.then(
|
||||||
topicsService.deleteTopic(getCluster(clusterName), topicName)
|
topicsService.deleteTopic(getCluster(clusterName), topicName)
|
||||||
.thenReturn(ResponseEntity.ok().<Void>build())
|
.thenReturn(ResponseEntity.ok().<Void>build())
|
||||||
).doOnEach(sig -> auditService.audit(context, sig));
|
).doOnEach(sig -> audit(context, sig));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -142,7 +138,7 @@ public class TopicsController extends AbstractController implements TopicsApi {
|
||||||
.operationName("getTopicConfigs")
|
.operationName("getTopicConfigs")
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
return accessControlService.validateAccess(context).then(
|
return validateAccess(context).then(
|
||||||
topicsService.getTopicConfigs(getCluster(clusterName), topicName)
|
topicsService.getTopicConfigs(getCluster(clusterName), topicName)
|
||||||
.map(lst -> lst.stream()
|
.map(lst -> lst.stream()
|
||||||
.map(InternalTopicConfig::from)
|
.map(InternalTopicConfig::from)
|
||||||
|
@ -150,7 +146,7 @@ public class TopicsController extends AbstractController implements TopicsApi {
|
||||||
.collect(toList()))
|
.collect(toList()))
|
||||||
.map(Flux::fromIterable)
|
.map(Flux::fromIterable)
|
||||||
.map(ResponseEntity::ok)
|
.map(ResponseEntity::ok)
|
||||||
).doOnEach(sig -> auditService.audit(context, sig));
|
).doOnEach(sig -> audit(context, sig));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -164,11 +160,11 @@ public class TopicsController extends AbstractController implements TopicsApi {
|
||||||
.operationName("getTopicDetails")
|
.operationName("getTopicDetails")
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
return accessControlService.validateAccess(context).then(
|
return validateAccess(context).then(
|
||||||
topicsService.getTopicDetails(getCluster(clusterName), topicName)
|
topicsService.getTopicDetails(getCluster(clusterName), topicName)
|
||||||
.map(clusterMapper::toTopicDetails)
|
.map(clusterMapper::toTopicDetails)
|
||||||
.map(ResponseEntity::ok)
|
.map(ResponseEntity::ok)
|
||||||
).doOnEach(sig -> auditService.audit(context, sig));
|
).doOnEach(sig -> audit(context, sig));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -215,7 +211,7 @@ public class TopicsController extends AbstractController implements TopicsApi {
|
||||||
.pageCount(totalPages));
|
.pageCount(totalPages));
|
||||||
})
|
})
|
||||||
.map(ResponseEntity::ok)
|
.map(ResponseEntity::ok)
|
||||||
.doOnEach(sig -> auditService.audit(context, sig));
|
.doOnEach(sig -> audit(context, sig));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -230,12 +226,12 @@ public class TopicsController extends AbstractController implements TopicsApi {
|
||||||
.operationName("updateTopic")
|
.operationName("updateTopic")
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
return accessControlService.validateAccess(context).then(
|
return validateAccess(context).then(
|
||||||
topicsService
|
topicsService
|
||||||
.updateTopic(getCluster(clusterName), topicName, topicUpdate)
|
.updateTopic(getCluster(clusterName), topicName, topicUpdate)
|
||||||
.map(clusterMapper::toTopic)
|
.map(clusterMapper::toTopic)
|
||||||
.map(ResponseEntity::ok)
|
.map(ResponseEntity::ok)
|
||||||
).doOnEach(sig -> auditService.audit(context, sig));
|
).doOnEach(sig -> audit(context, sig));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -250,11 +246,11 @@ public class TopicsController extends AbstractController implements TopicsApi {
|
||||||
.topicActions(VIEW, EDIT)
|
.topicActions(VIEW, EDIT)
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
return accessControlService.validateAccess(context).then(
|
return validateAccess(context).then(
|
||||||
partitionsIncrease.flatMap(partitions ->
|
partitionsIncrease.flatMap(partitions ->
|
||||||
topicsService.increaseTopicPartitions(getCluster(clusterName), topicName, partitions)
|
topicsService.increaseTopicPartitions(getCluster(clusterName), topicName, partitions)
|
||||||
).map(ResponseEntity::ok)
|
).map(ResponseEntity::ok)
|
||||||
).doOnEach(sig -> auditService.audit(context, sig));
|
).doOnEach(sig -> audit(context, sig));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -270,12 +266,12 @@ public class TopicsController extends AbstractController implements TopicsApi {
|
||||||
.operationName("changeReplicationFactor")
|
.operationName("changeReplicationFactor")
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
return accessControlService.validateAccess(context).then(
|
return validateAccess(context).then(
|
||||||
replicationFactorChange
|
replicationFactorChange
|
||||||
.flatMap(rfc ->
|
.flatMap(rfc ->
|
||||||
topicsService.changeReplicationFactor(getCluster(clusterName), topicName, rfc))
|
topicsService.changeReplicationFactor(getCluster(clusterName), topicName, rfc))
|
||||||
.map(ResponseEntity::ok)
|
.map(ResponseEntity::ok)
|
||||||
).doOnEach(sig -> auditService.audit(context, sig));
|
).doOnEach(sig -> audit(context, sig));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -288,9 +284,9 @@ public class TopicsController extends AbstractController implements TopicsApi {
|
||||||
.operationName("analyzeTopic")
|
.operationName("analyzeTopic")
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
return accessControlService.validateAccess(context).then(
|
return validateAccess(context).then(
|
||||||
topicAnalysisService.analyze(getCluster(clusterName), topicName)
|
topicAnalysisService.analyze(getCluster(clusterName), topicName)
|
||||||
.doOnEach(sig -> auditService.audit(context, sig))
|
.doOnEach(sig -> audit(context, sig))
|
||||||
.thenReturn(ResponseEntity.ok().build())
|
.thenReturn(ResponseEntity.ok().build())
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -305,9 +301,9 @@ public class TopicsController extends AbstractController implements TopicsApi {
|
||||||
.operationName("cancelTopicAnalysis")
|
.operationName("cancelTopicAnalysis")
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
return accessControlService.validateAccess(context)
|
return validateAccess(context)
|
||||||
.then(Mono.fromRunnable(() -> topicAnalysisService.cancelAnalysis(getCluster(clusterName), topicName)))
|
.then(Mono.fromRunnable(() -> topicAnalysisService.cancelAnalysis(getCluster(clusterName), topicName)))
|
||||||
.doOnEach(sig -> auditService.audit(context, sig))
|
.doOnEach(sig -> audit(context, sig))
|
||||||
.thenReturn(ResponseEntity.ok().build());
|
.thenReturn(ResponseEntity.ok().build());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -324,11 +320,11 @@ public class TopicsController extends AbstractController implements TopicsApi {
|
||||||
.operationName("getTopicAnalysis")
|
.operationName("getTopicAnalysis")
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
return accessControlService.validateAccess(context)
|
return validateAccess(context)
|
||||||
.thenReturn(topicAnalysisService.getTopicAnalysis(getCluster(clusterName), topicName)
|
.thenReturn(topicAnalysisService.getTopicAnalysis(getCluster(clusterName), topicName)
|
||||||
.map(ResponseEntity::ok)
|
.map(ResponseEntity::ok)
|
||||||
.orElseGet(() -> ResponseEntity.notFound().build()))
|
.orElseGet(() -> ResponseEntity.notFound().build()))
|
||||||
.doOnEach(sig -> auditService.audit(context, sig));
|
.doOnEach(sig -> audit(context, sig));
|
||||||
}
|
}
|
||||||
|
|
||||||
private Comparator<InternalTopic> getComparatorForTopic(
|
private Comparator<InternalTopic> getComparatorForTopic(
|
||||||
|
|
|
@ -42,8 +42,9 @@ public class SchemaRegistryPaginationTest {
|
||||||
new SchemaRegistryService.SubjectWithCompatibilityLevel(
|
new SchemaRegistryService.SubjectWithCompatibilityLevel(
|
||||||
new SchemaSubject().subject(a.getArgument(1)), Compatibility.FULL)));
|
new SchemaSubject().subject(a.getArgument(1)), Compatibility.FULL)));
|
||||||
|
|
||||||
this.controller = new SchemasController(schemaRegistryService, new AccessControlServiceMock().getMock(),
|
this.controller = new SchemasController(schemaRegistryService);
|
||||||
mock(AuditService.class));
|
this.controller.setAccessControlService(new AccessControlServiceMock().getMock());
|
||||||
|
this.controller.setAuditService(mock(AuditService.class));
|
||||||
this.controller.setClustersStorage(clustersStorage);
|
this.controller.setClustersStorage(clustersStorage);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -45,8 +45,8 @@ class TopicsServicePaginationTest {
|
||||||
private final ClusterMapper clusterMapper = new ClusterMapperImpl();
|
private final ClusterMapper clusterMapper = new ClusterMapperImpl();
|
||||||
private final AccessControlService accessControlService = new AccessControlServiceMock().getMock();
|
private final AccessControlService accessControlService = new AccessControlServiceMock().getMock();
|
||||||
|
|
||||||
private final TopicsController topicsController = new TopicsController(
|
private final TopicsController topicsController =
|
||||||
topicsService, mock(TopicAnalysisService.class), clusterMapper, accessControlService, mock(AuditService.class));
|
new TopicsController(topicsService, mock(TopicAnalysisService.class), clusterMapper);
|
||||||
|
|
||||||
private void init(Map<String, InternalTopic> topicsInCache) {
|
private void init(Map<String, InternalTopic> topicsInCache) {
|
||||||
|
|
||||||
|
@ -59,6 +59,8 @@ class TopicsServicePaginationTest {
|
||||||
List<String> lst = a.getArgument(1);
|
List<String> lst = a.getArgument(1);
|
||||||
return Mono.just(lst.stream().map(topicsInCache::get).collect(Collectors.toList()));
|
return Mono.just(lst.stream().map(topicsInCache::get).collect(Collectors.toList()));
|
||||||
});
|
});
|
||||||
|
topicsController.setAccessControlService(accessControlService);
|
||||||
|
topicsController.setAuditService(mock(AuditService.class));
|
||||||
topicsController.setClustersStorage(clustersStorage);
|
topicsController.setClustersStorage(clustersStorage);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue