ClusterMapper.java 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. package com.provectus.kafka.ui.mapper;
  2. import com.provectus.kafka.ui.config.ClustersProperties;
  3. import com.provectus.kafka.ui.model.BrokerConfigDTO;
  4. import com.provectus.kafka.ui.model.BrokerDTO;
  5. import com.provectus.kafka.ui.model.BrokerDiskUsageDTO;
  6. import com.provectus.kafka.ui.model.BrokerMetricsDTO;
  7. import com.provectus.kafka.ui.model.ClusterDTO;
  8. import com.provectus.kafka.ui.model.ClusterFeature;
  9. import com.provectus.kafka.ui.model.ClusterMetricsDTO;
  10. import com.provectus.kafka.ui.model.ClusterStatsDTO;
  11. import com.provectus.kafka.ui.model.ConfigSourceDTO;
  12. import com.provectus.kafka.ui.model.ConfigSynonymDTO;
  13. import com.provectus.kafka.ui.model.ConnectDTO;
  14. import com.provectus.kafka.ui.model.InternalBroker;
  15. import com.provectus.kafka.ui.model.InternalBrokerConfig;
  16. import com.provectus.kafka.ui.model.InternalBrokerDiskUsage;
  17. import com.provectus.kafka.ui.model.InternalClusterState;
  18. import com.provectus.kafka.ui.model.InternalPartition;
  19. import com.provectus.kafka.ui.model.InternalReplica;
  20. import com.provectus.kafka.ui.model.InternalTopic;
  21. import com.provectus.kafka.ui.model.InternalTopicConfig;
  22. import com.provectus.kafka.ui.model.KafkaAclDTO;
  23. import com.provectus.kafka.ui.model.KafkaAclNamePatternTypeDTO;
  24. import com.provectus.kafka.ui.model.KafkaAclResourceTypeDTO;
  25. import com.provectus.kafka.ui.model.MetricDTO;
  26. import com.provectus.kafka.ui.model.Metrics;
  27. import com.provectus.kafka.ui.model.PartitionDTO;
  28. import com.provectus.kafka.ui.model.ReplicaDTO;
  29. import com.provectus.kafka.ui.model.TopicConfigDTO;
  30. import com.provectus.kafka.ui.model.TopicDTO;
  31. import com.provectus.kafka.ui.model.TopicDetailsDTO;
  32. import com.provectus.kafka.ui.service.metrics.RawMetric;
  33. import java.util.List;
  34. import java.util.Map;
  35. import java.util.stream.Collectors;
  36. import org.apache.kafka.clients.admin.ConfigEntry;
  37. import org.apache.kafka.common.acl.AccessControlEntry;
  38. import org.apache.kafka.common.acl.AclBinding;
  39. import org.apache.kafka.common.acl.AclOperation;
  40. import org.apache.kafka.common.acl.AclPermissionType;
  41. import org.apache.kafka.common.resource.PatternType;
  42. import org.apache.kafka.common.resource.ResourcePattern;
  43. import org.apache.kafka.common.resource.ResourceType;
  44. import org.mapstruct.Mapper;
  45. import org.mapstruct.Mapping;
  46. @Mapper(componentModel = "spring")
  47. public interface ClusterMapper {
  48. ClusterDTO toCluster(InternalClusterState clusterState);
  49. ClusterStatsDTO toClusterStats(InternalClusterState clusterState);
  50. default ClusterMetricsDTO toClusterMetrics(Metrics metrics) {
  51. return new ClusterMetricsDTO()
  52. .items(metrics.getSummarizedMetrics().map(this::convert).collect(Collectors.toList()));
  53. }
  54. private MetricDTO convert(RawMetric rawMetric) {
  55. return new MetricDTO()
  56. .name(rawMetric.name())
  57. .labels(rawMetric.labels())
  58. .value(rawMetric.value());
  59. }
  60. default BrokerMetricsDTO toBrokerMetrics(List<RawMetric> metrics) {
  61. return new BrokerMetricsDTO()
  62. .metrics(metrics.stream().map(this::convert).collect(Collectors.toList()));
  63. }
  64. @Mapping(target = "isSensitive", source = "sensitive")
  65. @Mapping(target = "isReadOnly", source = "readOnly")
  66. BrokerConfigDTO toBrokerConfig(InternalBrokerConfig config);
  67. default ConfigSynonymDTO toConfigSynonym(ConfigEntry.ConfigSynonym config) {
  68. if (config == null) {
  69. return null;
  70. }
  71. ConfigSynonymDTO configSynonym = new ConfigSynonymDTO();
  72. configSynonym.setName(config.name());
  73. configSynonym.setValue(config.value());
  74. if (config.source() != null) {
  75. configSynonym.setSource(ConfigSourceDTO.valueOf(config.source().name()));
  76. }
  77. return configSynonym;
  78. }
  79. TopicDTO toTopic(InternalTopic topic);
  80. PartitionDTO toPartition(InternalPartition topic);
  81. BrokerDTO toBrokerDto(InternalBroker broker);
  82. TopicDetailsDTO toTopicDetails(InternalTopic topic);
  83. @Mapping(target = "isReadOnly", source = "readOnly")
  84. @Mapping(target = "isSensitive", source = "sensitive")
  85. TopicConfigDTO toTopicConfig(InternalTopicConfig topic);
  86. ReplicaDTO toReplica(InternalReplica replica);
  87. ConnectDTO toKafkaConnect(ClustersProperties.ConnectCluster connect);
  88. List<ClusterDTO.FeaturesEnum> toFeaturesEnum(List<ClusterFeature> features);
  89. default List<PartitionDTO> map(Map<Integer, InternalPartition> map) {
  90. return map.values().stream().map(this::toPartition).collect(Collectors.toList());
  91. }
  92. default BrokerDiskUsageDTO map(Integer id, InternalBrokerDiskUsage internalBrokerDiskUsage) {
  93. final BrokerDiskUsageDTO brokerDiskUsage = new BrokerDiskUsageDTO();
  94. brokerDiskUsage.setBrokerId(id);
  95. brokerDiskUsage.segmentCount((int) internalBrokerDiskUsage.getSegmentCount());
  96. brokerDiskUsage.segmentSize(internalBrokerDiskUsage.getSegmentSize());
  97. return brokerDiskUsage;
  98. }
  99. static KafkaAclDTO.OperationEnum mapAclOperation(AclOperation operation) {
  100. return switch (operation) {
  101. case ALL -> KafkaAclDTO.OperationEnum.ALL;
  102. case READ -> KafkaAclDTO.OperationEnum.READ;
  103. case WRITE -> KafkaAclDTO.OperationEnum.WRITE;
  104. case CREATE -> KafkaAclDTO.OperationEnum.CREATE;
  105. case DELETE -> KafkaAclDTO.OperationEnum.DELETE;
  106. case ALTER -> KafkaAclDTO.OperationEnum.ALTER;
  107. case DESCRIBE -> KafkaAclDTO.OperationEnum.DESCRIBE;
  108. case CLUSTER_ACTION -> KafkaAclDTO.OperationEnum.CLUSTER_ACTION;
  109. case DESCRIBE_CONFIGS -> KafkaAclDTO.OperationEnum.DESCRIBE_CONFIGS;
  110. case ALTER_CONFIGS -> KafkaAclDTO.OperationEnum.ALTER_CONFIGS;
  111. case IDEMPOTENT_WRITE -> KafkaAclDTO.OperationEnum.IDEMPOTENT_WRITE;
  112. case CREATE_TOKENS -> KafkaAclDTO.OperationEnum.CREATE_TOKENS;
  113. case DESCRIBE_TOKENS -> KafkaAclDTO.OperationEnum.DESCRIBE_TOKENS;
  114. case ANY -> throw new IllegalArgumentException("ANY operation can be only part of filter");
  115. case UNKNOWN -> KafkaAclDTO.OperationEnum.UNKNOWN;
  116. };
  117. }
  118. static KafkaAclResourceTypeDTO mapAclResourceType(ResourceType resourceType) {
  119. return switch (resourceType) {
  120. case CLUSTER -> KafkaAclResourceTypeDTO.CLUSTER;
  121. case TOPIC -> KafkaAclResourceTypeDTO.TOPIC;
  122. case GROUP -> KafkaAclResourceTypeDTO.GROUP;
  123. case DELEGATION_TOKEN -> KafkaAclResourceTypeDTO.DELEGATION_TOKEN;
  124. case TRANSACTIONAL_ID -> KafkaAclResourceTypeDTO.TRANSACTIONAL_ID;
  125. case USER -> KafkaAclResourceTypeDTO.USER;
  126. case ANY -> throw new IllegalArgumentException("ANY type can be only part of filter");
  127. case UNKNOWN -> KafkaAclResourceTypeDTO.UNKNOWN;
  128. };
  129. }
  130. static ResourceType mapAclResourceTypeDto(KafkaAclResourceTypeDTO dto) {
  131. return ResourceType.valueOf(dto.name());
  132. }
  133. static PatternType mapPatternTypeDto(KafkaAclNamePatternTypeDTO dto) {
  134. return PatternType.valueOf(dto.name());
  135. }
  136. static AclBinding toAclBinding(KafkaAclDTO dto) {
  137. return new AclBinding(
  138. new ResourcePattern(
  139. mapAclResourceTypeDto(dto.getResourceType()),
  140. dto.getResourceName(),
  141. mapPatternTypeDto(dto.getNamePatternType())
  142. ),
  143. new AccessControlEntry(
  144. dto.getPrincipal(),
  145. dto.getHost(),
  146. AclOperation.valueOf(dto.getOperation().name()),
  147. AclPermissionType.valueOf(dto.getPermission().name())
  148. )
  149. );
  150. }
  151. static KafkaAclDTO toKafkaAclDto(AclBinding binding) {
  152. var pattern = binding.pattern();
  153. var filter = binding.toFilter().entryFilter();
  154. return new KafkaAclDTO()
  155. .resourceType(mapAclResourceType(pattern.resourceType()))
  156. .resourceName(pattern.name())
  157. .namePatternType(KafkaAclNamePatternTypeDTO.fromValue(pattern.patternType().name()))
  158. .principal(filter.principal())
  159. .host(filter.host())
  160. .operation(mapAclOperation(filter.operation()))
  161. .permission(KafkaAclDTO.PermissionEnum.fromValue(filter.permissionType().name()));
  162. }
  163. }