Repository: provectus/kafka-ui
Branch: master
Commit: 83b5a60cc085
Files: 1068
Total size: 2.9 MB
Directory structure:
gitextract_kz4bsw12/
├── .devcontainer/
│ └── devcontainer.json
├── .editorconfig
├── .github/
│ ├── CODEOWNERS
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug.yml
│ │ ├── config.yml
│ │ └── feature.yml
│ ├── PULL_REQUEST_TEMPLATE.md
│ ├── dependabot.yml
│ ├── release_drafter.yaml
│ └── workflows/
│ ├── aws_publisher.yaml
│ ├── backend.yml
│ ├── block_merge.yml
│ ├── branch-deploy.yml
│ ├── branch-remove.yml
│ ├── build-public-image.yml
│ ├── codeql-analysis.yml
│ ├── cve.yaml
│ ├── delete-public-image.yml
│ ├── documentation.yaml
│ ├── e2e-automation.yml
│ ├── e2e-checks.yaml
│ ├── e2e-manual.yml
│ ├── e2e-weekly.yml
│ ├── frontend.yaml
│ ├── master.yaml
│ ├── pr-checks.yaml
│ ├── release-serde-api.yaml
│ ├── release.yaml
│ ├── release_drafter.yml
│ ├── separate_env_public_create.yml
│ ├── separate_env_public_remove.yml
│ ├── stale.yaml
│ ├── terraform-deploy.yml
│ ├── triage_issues.yml
│ ├── triage_prs.yml
│ ├── welcome-first-time-contributors.yml
│ └── workflow_linter.yaml
├── .gitignore
├── .mvn/
│ └── wrapper/
│ ├── maven-wrapper.jar
│ └── maven-wrapper.properties
├── CODE-OF-CONDUCT.md
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── SECURITY.md
├── documentation/
│ └── compose/
│ ├── DOCKER_COMPOSE.md
│ ├── connectors/
│ │ ├── github-source.json
│ │ ├── s3-sink.json
│ │ ├── sink-activities.json
│ │ ├── source-activities.json
│ │ └── start.sh
│ ├── data/
│ │ ├── message.json
│ │ └── proxy.conf
│ ├── e2e-tests.yaml
│ ├── jaas/
│ │ ├── client.properties
│ │ ├── kafka_connect.jaas
│ │ ├── kafka_connect.password
│ │ ├── kafka_server.conf
│ │ ├── schema_registry.jaas
│ │ ├── schema_registry.password
│ │ └── zookeeper_jaas.conf
│ ├── jmx/
│ │ ├── clientkeystore
│ │ ├── clienttruststore
│ │ ├── jmxremote.access
│ │ ├── jmxremote.password
│ │ ├── serverkeystore
│ │ └── servertruststore
│ ├── jmx-exporter/
│ │ ├── kafka-broker.yml
│ │ └── kafka-prepare-and-run
│ ├── kafka-cluster-sr-auth.yaml
│ ├── kafka-connect/
│ │ └── Dockerfile
│ ├── kafka-ssl-components.yaml
│ ├── kafka-ssl.yml
│ ├── kafka-ui-acl-with-zk.yaml
│ ├── kafka-ui-arm64.yaml
│ ├── kafka-ui-auth-context.yaml
│ ├── kafka-ui-connectors-auth.yaml
│ ├── kafka-ui-jmx-secured.yml
│ ├── kafka-ui-sasl.yaml
│ ├── kafka-ui-serdes.yaml
│ ├── kafka-ui-with-jmx-exporter.yaml
│ ├── kafka-ui.yaml
│ ├── kafka-with-zookeeper.yaml
│ ├── ldap.yaml
│ ├── nginx-proxy.yaml
│ ├── postgres/
│ │ ├── Dockerfile
│ │ └── data.sql
│ ├── proto/
│ │ ├── key-types.proto
│ │ └── values.proto
│ ├── scripts/
│ │ ├── clusterID
│ │ ├── create_cluster_id.sh
│ │ ├── update_run.sh
│ │ └── update_run_cluster.sh
│ ├── ssl/
│ │ ├── creds
│ │ ├── generate_certs.sh
│ │ ├── kafka.keystore.jks
│ │ ├── kafka.truststore.jks
│ │ └── san.cnf
│ ├── traefik/
│ │ └── kafkaui.yaml
│ └── traefik-proxy.yaml
├── etc/
│ └── checkstyle/
│ ├── apache-header.txt
│ ├── checkstyle-e2e.xml
│ └── checkstyle.xml
├── kafka-ui-api/
│ ├── Dockerfile
│ ├── pom.xml
│ └── src/
│ ├── main/
│ │ ├── antlr4/
│ │ │ └── ksql/
│ │ │ └── KsqlGrammar.g4
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── provectus/
│ │ │ └── kafka/
│ │ │ └── ui/
│ │ │ ├── KafkaUiApplication.java
│ │ │ ├── client/
│ │ │ │ └── RetryingKafkaConnectClient.java
│ │ │ ├── config/
│ │ │ │ ├── ClustersProperties.java
│ │ │ │ ├── Config.java
│ │ │ │ ├── CorsGlobalConfiguration.java
│ │ │ │ ├── CustomWebFilter.java
│ │ │ │ ├── ReadOnlyModeFilter.java
│ │ │ │ ├── WebclientProperties.java
│ │ │ │ └── auth/
│ │ │ │ ├── AbstractAuthSecurityConfig.java
│ │ │ │ ├── AuthenticatedUser.java
│ │ │ │ ├── BasicAuthSecurityConfig.java
│ │ │ │ ├── DisabledAuthSecurityConfig.java
│ │ │ │ ├── LdapProperties.java
│ │ │ │ ├── LdapSecurityConfig.java
│ │ │ │ ├── OAuthProperties.java
│ │ │ │ ├── OAuthPropertiesConverter.java
│ │ │ │ ├── OAuthSecurityConfig.java
│ │ │ │ ├── RbacLdapUser.java
│ │ │ │ ├── RbacOAuth2User.java
│ │ │ │ ├── RbacOidcUser.java
│ │ │ │ ├── RbacUser.java
│ │ │ │ ├── RoleBasedAccessControlProperties.java
│ │ │ │ ├── condition/
│ │ │ │ │ ├── ActiveDirectoryCondition.java
│ │ │ │ │ └── CognitoCondition.java
│ │ │ │ └── logout/
│ │ │ │ ├── CognitoLogoutSuccessHandler.java
│ │ │ │ ├── LogoutSuccessHandler.java
│ │ │ │ └── OAuthLogoutSuccessHandler.java
│ │ │ ├── controller/
│ │ │ │ ├── AbstractController.java
│ │ │ │ ├── AccessController.java
│ │ │ │ ├── AclsController.java
│ │ │ │ ├── ApplicationConfigController.java
│ │ │ │ ├── AuthController.java
│ │ │ │ ├── BrokersController.java
│ │ │ │ ├── ClustersController.java
│ │ │ │ ├── ConsumerGroupsController.java
│ │ │ │ ├── KafkaConnectController.java
│ │ │ │ ├── KsqlController.java
│ │ │ │ ├── MessagesController.java
│ │ │ │ ├── SchemasController.java
│ │ │ │ ├── StaticController.java
│ │ │ │ └── TopicsController.java
│ │ │ ├── emitter/
│ │ │ │ ├── AbstractEmitter.java
│ │ │ │ ├── BackwardEmitter.java
│ │ │ │ ├── ConsumingStats.java
│ │ │ │ ├── EnhancedConsumer.java
│ │ │ │ ├── ForwardEmitter.java
│ │ │ │ ├── MessageFilters.java
│ │ │ │ ├── MessagesProcessing.java
│ │ │ │ ├── OffsetsInfo.java
│ │ │ │ ├── PolledRecords.java
│ │ │ │ ├── PollingSettings.java
│ │ │ │ ├── PollingThrottler.java
│ │ │ │ ├── RangePollingEmitter.java
│ │ │ │ ├── ResultSizeLimiter.java
│ │ │ │ ├── SeekOperations.java
│ │ │ │ └── TailingEmitter.java
│ │ │ ├── exception/
│ │ │ │ ├── ClusterNotFoundException.java
│ │ │ │ ├── ConnectNotFoundException.java
│ │ │ │ ├── CustomBaseException.java
│ │ │ │ ├── DuplicateEntityException.java
│ │ │ │ ├── ErrorCode.java
│ │ │ │ ├── FileUploadException.java
│ │ │ │ ├── GlobalErrorWebExceptionHandler.java
│ │ │ │ ├── IllegalEntityStateException.java
│ │ │ │ ├── InvalidRequestApiException.java
│ │ │ │ ├── JsonAvroConversionException.java
│ │ │ │ ├── KafkaConnectConflictReponseException.java
│ │ │ │ ├── KsqlApiException.java
│ │ │ │ ├── KsqlDbNotFoundException.java
│ │ │ │ ├── LogDirNotFoundApiException.java
│ │ │ │ ├── NotFoundException.java
│ │ │ │ ├── ReadOnlyModeException.java
│ │ │ │ ├── SchemaCompatibilityException.java
│ │ │ │ ├── SchemaFailedToDeleteException.java
│ │ │ │ ├── SchemaNotFoundException.java
│ │ │ │ ├── TopicAnalysisException.java
│ │ │ │ ├── TopicMetadataException.java
│ │ │ │ ├── TopicNotFoundException.java
│ │ │ │ ├── TopicOrPartitionNotFoundException.java
│ │ │ │ ├── TopicRecreationException.java
│ │ │ │ ├── UnprocessableEntityException.java
│ │ │ │ └── ValidationException.java
│ │ │ ├── mapper/
│ │ │ │ ├── ClusterMapper.java
│ │ │ │ ├── ConsumerGroupMapper.java
│ │ │ │ ├── DescribeLogDirsMapper.java
│ │ │ │ ├── KafkaConnectMapper.java
│ │ │ │ └── KafkaSrMapper.java
│ │ │ ├── model/
│ │ │ │ ├── BrokerMetrics.java
│ │ │ │ ├── CleanupPolicy.java
│ │ │ │ ├── ClusterFeature.java
│ │ │ │ ├── ConsumerPosition.java
│ │ │ │ ├── InternalBroker.java
│ │ │ │ ├── InternalBrokerConfig.java
│ │ │ │ ├── InternalBrokerDiskUsage.java
│ │ │ │ ├── InternalClusterMetrics.java
│ │ │ │ ├── InternalClusterState.java
│ │ │ │ ├── InternalConsumerGroup.java
│ │ │ │ ├── InternalLogDirStats.java
│ │ │ │ ├── InternalPartition.java
│ │ │ │ ├── InternalPartitionsOffsets.java
│ │ │ │ ├── InternalReplica.java
│ │ │ │ ├── InternalSegmentSizeDto.java
│ │ │ │ ├── InternalTopic.java
│ │ │ │ ├── InternalTopicConfig.java
│ │ │ │ ├── InternalTopicConsumerGroup.java
│ │ │ │ ├── KafkaCluster.java
│ │ │ │ ├── Metrics.java
│ │ │ │ ├── MetricsConfig.java
│ │ │ │ ├── PartitionDistributionStats.java
│ │ │ │ ├── PartitionsStats.java
│ │ │ │ ├── Statistics.java
│ │ │ │ ├── connect/
│ │ │ │ │ └── InternalConnectInfo.java
│ │ │ │ ├── rbac/
│ │ │ │ │ ├── AccessContext.java
│ │ │ │ │ ├── Permission.java
│ │ │ │ │ ├── Resource.java
│ │ │ │ │ ├── Role.java
│ │ │ │ │ ├── Subject.java
│ │ │ │ │ ├── permission/
│ │ │ │ │ │ ├── AclAction.java
│ │ │ │ │ │ ├── ApplicationConfigAction.java
│ │ │ │ │ │ ├── AuditAction.java
│ │ │ │ │ │ ├── ClusterConfigAction.java
│ │ │ │ │ │ ├── ConnectAction.java
│ │ │ │ │ │ ├── ConsumerGroupAction.java
│ │ │ │ │ │ ├── KsqlAction.java
│ │ │ │ │ │ ├── PermissibleAction.java
│ │ │ │ │ │ ├── SchemaAction.java
│ │ │ │ │ │ └── TopicAction.java
│ │ │ │ │ └── provider/
│ │ │ │ │ └── Provider.java
│ │ │ │ └── schemaregistry/
│ │ │ │ ├── ErrorResponse.java
│ │ │ │ ├── InternalCompatibilityCheck.java
│ │ │ │ ├── InternalCompatibilityLevel.java
│ │ │ │ ├── InternalNewSchema.java
│ │ │ │ └── SubjectIdResponse.java
│ │ │ ├── serdes/
│ │ │ │ ├── BuiltInSerde.java
│ │ │ │ ├── ClassloaderUtil.java
│ │ │ │ ├── ClusterSerdes.java
│ │ │ │ ├── ConsumerRecordDeserializer.java
│ │ │ │ ├── CustomSerdeLoader.java
│ │ │ │ ├── ProducerRecordCreator.java
│ │ │ │ ├── PropertyResolverImpl.java
│ │ │ │ ├── RecordHeaderImpl.java
│ │ │ │ ├── RecordHeadersImpl.java
│ │ │ │ ├── SerdeInstance.java
│ │ │ │ ├── SerdesInitializer.java
│ │ │ │ └── builtin/
│ │ │ │ ├── AvroEmbeddedSerde.java
│ │ │ │ ├── Base64Serde.java
│ │ │ │ ├── ConsumerOffsetsSerde.java
│ │ │ │ ├── HexSerde.java
│ │ │ │ ├── Int32Serde.java
│ │ │ │ ├── Int64Serde.java
│ │ │ │ ├── ProtobufFileSerde.java
│ │ │ │ ├── ProtobufRawSerde.java
│ │ │ │ ├── StringSerde.java
│ │ │ │ ├── UInt32Serde.java
│ │ │ │ ├── UInt64Serde.java
│ │ │ │ ├── UuidBinarySerde.java
│ │ │ │ └── sr/
│ │ │ │ ├── MessageFormatter.java
│ │ │ │ ├── SchemaRegistrySerde.java
│ │ │ │ ├── SchemaType.java
│ │ │ │ └── Serialize.java
│ │ │ ├── service/
│ │ │ │ ├── AdminClientService.java
│ │ │ │ ├── AdminClientServiceImpl.java
│ │ │ │ ├── ApplicationInfoService.java
│ │ │ │ ├── BrokerService.java
│ │ │ │ ├── ClusterService.java
│ │ │ │ ├── ClustersStatisticsScheduler.java
│ │ │ │ ├── ClustersStorage.java
│ │ │ │ ├── ConsumerGroupService.java
│ │ │ │ ├── DeserializationService.java
│ │ │ │ ├── FeatureService.java
│ │ │ │ ├── KafkaClusterFactory.java
│ │ │ │ ├── KafkaConfigSanitizer.java
│ │ │ │ ├── KafkaConnectService.java
│ │ │ │ ├── MessagesService.java
│ │ │ │ ├── OffsetsResetService.java
│ │ │ │ ├── ReactiveAdminClient.java
│ │ │ │ ├── SchemaRegistryService.java
│ │ │ │ ├── StatisticsCache.java
│ │ │ │ ├── StatisticsService.java
│ │ │ │ ├── TopicsService.java
│ │ │ │ ├── acl/
│ │ │ │ │ ├── AclCsv.java
│ │ │ │ │ └── AclsService.java
│ │ │ │ ├── analyze/
│ │ │ │ │ ├── AnalysisTasksStore.java
│ │ │ │ │ ├── TopicAnalysisService.java
│ │ │ │ │ ├── TopicAnalysisStats.java
│ │ │ │ │ └── TopicIdentity.java
│ │ │ │ ├── audit/
│ │ │ │ │ ├── AuditRecord.java
│ │ │ │ │ ├── AuditService.java
│ │ │ │ │ └── AuditWriter.java
│ │ │ │ ├── integration/
│ │ │ │ │ └── odd/
│ │ │ │ │ ├── ConnectorInfo.java
│ │ │ │ │ ├── ConnectorsExporter.java
│ │ │ │ │ ├── OddExporter.java
│ │ │ │ │ ├── OddExporterScheduler.java
│ │ │ │ │ ├── OddIntegrationConfig.java
│ │ │ │ │ ├── OddIntegrationProperties.java
│ │ │ │ │ ├── Oddrn.java
│ │ │ │ │ ├── SchemaReferencesResolver.java
│ │ │ │ │ ├── TopicsExporter.java
│ │ │ │ │ └── schema/
│ │ │ │ │ ├── AvroExtractor.java
│ │ │ │ │ ├── DataSetFieldsExtractors.java
│ │ │ │ │ ├── JsonSchemaExtractor.java
│ │ │ │ │ └── ProtoExtractor.java
│ │ │ │ ├── ksql/
│ │ │ │ │ ├── KsqlApiClient.java
│ │ │ │ │ ├── KsqlGrammar.java
│ │ │ │ │ ├── KsqlServiceV2.java
│ │ │ │ │ └── response/
│ │ │ │ │ ├── DynamicParser.java
│ │ │ │ │ └── ResponseParser.java
│ │ │ │ ├── masking/
│ │ │ │ │ ├── DataMasking.java
│ │ │ │ │ └── policies/
│ │ │ │ │ ├── FieldsSelector.java
│ │ │ │ │ ├── Mask.java
│ │ │ │ │ ├── MaskingPolicy.java
│ │ │ │ │ ├── Remove.java
│ │ │ │ │ └── Replace.java
│ │ │ │ ├── metrics/
│ │ │ │ │ ├── JmxMetricsFormatter.java
│ │ │ │ │ ├── JmxMetricsRetriever.java
│ │ │ │ │ ├── JmxSslSocketFactory.java
│ │ │ │ │ ├── MetricsCollector.java
│ │ │ │ │ ├── MetricsRetriever.java
│ │ │ │ │ ├── PrometheusEndpointMetricsParser.java
│ │ │ │ │ ├── PrometheusMetricsRetriever.java
│ │ │ │ │ ├── RawMetric.java
│ │ │ │ │ └── WellKnownMetrics.java
│ │ │ │ └── rbac/
│ │ │ │ ├── AbstractProviderCondition.java
│ │ │ │ ├── AccessControlService.java
│ │ │ │ └── extractor/
│ │ │ │ ├── CognitoAuthorityExtractor.java
│ │ │ │ ├── GithubAuthorityExtractor.java
│ │ │ │ ├── GoogleAuthorityExtractor.java
│ │ │ │ ├── OauthAuthorityExtractor.java
│ │ │ │ ├── ProviderAuthorityExtractor.java
│ │ │ │ └── RbacLdapAuthoritiesExtractor.java
│ │ │ └── util/
│ │ │ ├── ApplicationMetrics.java
│ │ │ ├── ApplicationRestarter.java
│ │ │ ├── DynamicConfigOperations.java
│ │ │ ├── EmptyRedirectStrategy.java
│ │ │ ├── GithubReleaseInfo.java
│ │ │ ├── KafkaServicesValidation.java
│ │ │ ├── KafkaVersion.java
│ │ │ ├── ReactiveFailover.java
│ │ │ ├── ResourceUtil.java
│ │ │ ├── SslPropertiesUtil.java
│ │ │ ├── WebClientConfigurator.java
│ │ │ ├── annotation/
│ │ │ │ └── KafkaClientInternalsDependant.java
│ │ │ └── jsonschema/
│ │ │ ├── AnyFieldSchema.java
│ │ │ ├── ArrayFieldSchema.java
│ │ │ ├── AvroJsonSchemaConverter.java
│ │ │ ├── EnumJsonType.java
│ │ │ ├── FieldSchema.java
│ │ │ ├── JsonAvroConversion.java
│ │ │ ├── JsonSchema.java
│ │ │ ├── JsonSchemaConverter.java
│ │ │ ├── JsonType.java
│ │ │ ├── MapFieldSchema.java
│ │ │ ├── ObjectFieldSchema.java
│ │ │ ├── OneOfFieldSchema.java
│ │ │ ├── ProtobufSchemaConverter.java
│ │ │ ├── RefFieldSchema.java
│ │ │ ├── SimpleFieldSchema.java
│ │ │ └── SimpleJsonType.java
│ │ └── resources/
│ │ ├── application-local.yml
│ │ ├── application.yml
│ │ ├── banner.txt
│ │ ├── logback-spring.xml
│ │ └── static/
│ │ └── static/
│ │ └── css/
│ │ ├── bootstrap.min.css
│ │ └── signin.css
│ └── test/
│ ├── java/
│ │ └── com/
│ │ └── provectus/
│ │ └── kafka/
│ │ └── ui/
│ │ ├── AbstractIntegrationTest.java
│ │ ├── KafkaConnectServiceTests.java
│ │ ├── KafkaConsumerGroupTests.java
│ │ ├── KafkaConsumerTests.java
│ │ ├── KafkaTopicCreateTests.java
│ │ ├── ReadOnlyModeTests.java
│ │ ├── SchemaRegistryServiceTests.java
│ │ ├── config/
│ │ │ └── ClustersPropertiesTest.java
│ │ ├── container/
│ │ │ ├── KafkaConnectContainer.java
│ │ │ ├── KsqlDbContainer.java
│ │ │ └── SchemaRegistryContainer.java
│ │ ├── controller/
│ │ │ └── ApplicationConfigControllerTest.java
│ │ ├── emitter/
│ │ │ ├── MessageFiltersTest.java
│ │ │ ├── MessagesProcessingTest.java
│ │ │ ├── OffsetsInfoTest.java
│ │ │ ├── SeekOperationsTest.java
│ │ │ └── TailingEmitterTest.java
│ │ ├── model/
│ │ │ └── PartitionDistributionStatsTest.java
│ │ ├── producer/
│ │ │ └── KafkaTestProducer.java
│ │ ├── serdes/
│ │ │ ├── ConsumerRecordDeserializerTest.java
│ │ │ ├── PropertyResolverImplTest.java
│ │ │ ├── SerdesInitializerTest.java
│ │ │ └── builtin/
│ │ │ ├── AvroEmbeddedSerdeTest.java
│ │ │ ├── Base64SerdeTest.java
│ │ │ ├── ConsumerOffsetsSerdeTest.java
│ │ │ ├── HexSerdeTest.java
│ │ │ ├── Int32SerdeTest.java
│ │ │ ├── Int64SerdeTest.java
│ │ │ ├── ProtobufFileSerdeTest.java
│ │ │ ├── ProtobufRawSerdeTest.java
│ │ │ ├── UInt32SerdeTest.java
│ │ │ ├── UInt64SerdeTest.java
│ │ │ ├── UuidBinarySerdeTest.java
│ │ │ └── sr/
│ │ │ └── SchemaRegistrySerdeTest.java
│ │ ├── service/
│ │ │ ├── BrokerServiceTest.java
│ │ │ ├── ConfigTest.java
│ │ │ ├── KafkaConfigSanitizerTest.java
│ │ │ ├── LogDirsTest.java
│ │ │ ├── MessagesServiceTest.java
│ │ │ ├── OffsetsResetServiceTest.java
│ │ │ ├── ReactiveAdminClientTest.java
│ │ │ ├── RecordEmitterTest.java
│ │ │ ├── SchemaRegistryPaginationTest.java
│ │ │ ├── SendAndReadTests.java
│ │ │ ├── TopicsServicePaginationTest.java
│ │ │ ├── acl/
│ │ │ │ ├── AclCsvTest.java
│ │ │ │ └── AclsServiceTest.java
│ │ │ ├── analyze/
│ │ │ │ └── TopicAnalysisServiceTest.java
│ │ │ ├── audit/
│ │ │ │ ├── AuditIntegrationTest.java
│ │ │ │ ├── AuditServiceTest.java
│ │ │ │ └── AuditWriterTest.java
│ │ │ ├── integration/
│ │ │ │ └── odd/
│ │ │ │ ├── ConnectorsExporterTest.java
│ │ │ │ ├── SchemaReferencesResolverTest.java
│ │ │ │ ├── TopicsExporterTest.java
│ │ │ │ └── schema/
│ │ │ │ ├── AvroExtractorTest.java
│ │ │ │ ├── JsonSchemaExtractorTest.java
│ │ │ │ └── ProtoExtractorTest.java
│ │ │ ├── ksql/
│ │ │ │ ├── KsqlApiClientTest.java
│ │ │ │ ├── KsqlServiceV2Test.java
│ │ │ │ └── response/
│ │ │ │ └── ResponseParserTest.java
│ │ │ ├── masking/
│ │ │ │ ├── DataMaskingTest.java
│ │ │ │ └── policies/
│ │ │ │ ├── FieldsSelectorTest.java
│ │ │ │ ├── MaskTest.java
│ │ │ │ ├── RemoveTest.java
│ │ │ │ └── ReplaceTest.java
│ │ │ └── metrics/
│ │ │ ├── JmxMetricsFormatterTest.java
│ │ │ ├── PrometheusEndpointMetricsParserTest.java
│ │ │ ├── PrometheusMetricsRetrieverTest.java
│ │ │ └── WellKnownMetricsTest.java
│ │ └── util/
│ │ ├── AccessControlServiceMock.java
│ │ ├── DynamicConfigOperationsTest.java
│ │ ├── GithubReleaseInfoTest.java
│ │ ├── PollingThrottlerTest.java
│ │ ├── ReactiveFailoverTest.java
│ │ └── jsonschema/
│ │ ├── AvroJsonSchemaConverterTest.java
│ │ ├── JsonAvroConversionTest.java
│ │ └── ProtobufSchemaConverterTest.java
│ └── resources/
│ ├── application-test.yml
│ ├── fileForUploadTest.txt
│ └── protobuf-serde/
│ ├── address-book.proto
│ ├── lang-description.proto
│ ├── language/
│ │ └── language.proto
│ └── sensor.proto
├── kafka-ui-contract/
│ ├── pom.xml
│ └── src/
│ └── main/
│ └── resources/
│ └── swagger/
│ ├── kafka-connect-api.yaml
│ ├── kafka-sr-api.yaml
│ └── kafka-ui-api.yaml
├── kafka-ui-e2e-checks/
│ ├── .gitignore
│ ├── QASE.md
│ ├── README.md
│ ├── docker/
│ │ ├── selenoid-git.yaml
│ │ └── selenoid-local.yaml
│ ├── pom.xml
│ ├── selenoid/
│ │ └── config/
│ │ ├── browsersGit.json
│ │ └── browsersLocal.json
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── provectus/
│ │ │ └── kafka/
│ │ │ └── ui/
│ │ │ ├── models/
│ │ │ │ ├── Connector.java
│ │ │ │ ├── Schema.java
│ │ │ │ └── Topic.java
│ │ │ ├── pages/
│ │ │ │ ├── BasePage.java
│ │ │ │ ├── brokers/
│ │ │ │ │ ├── BrokersConfigTab.java
│ │ │ │ │ ├── BrokersDetails.java
│ │ │ │ │ └── BrokersList.java
│ │ │ │ ├── connectors/
│ │ │ │ │ ├── ConnectorCreateForm.java
│ │ │ │ │ ├── ConnectorDetails.java
│ │ │ │ │ └── KafkaConnectList.java
│ │ │ │ ├── consumers/
│ │ │ │ │ ├── ConsumersDetails.java
│ │ │ │ │ └── ConsumersList.java
│ │ │ │ ├── ksqldb/
│ │ │ │ │ ├── KsqlDbList.java
│ │ │ │ │ ├── KsqlQueryForm.java
│ │ │ │ │ ├── enums/
│ │ │ │ │ │ ├── KsqlMenuTabs.java
│ │ │ │ │ │ └── KsqlQueryConfig.java
│ │ │ │ │ └── models/
│ │ │ │ │ ├── Stream.java
│ │ │ │ │ └── Table.java
│ │ │ │ ├── panels/
│ │ │ │ │ ├── NaviSideBar.java
│ │ │ │ │ ├── TopPanel.java
│ │ │ │ │ └── enums/
│ │ │ │ │ └── MenuItem.java
│ │ │ │ ├── schemas/
│ │ │ │ │ ├── SchemaCreateForm.java
│ │ │ │ │ ├── SchemaDetails.java
│ │ │ │ │ └── SchemaRegistryList.java
│ │ │ │ └── topics/
│ │ │ │ ├── ProduceMessagePanel.java
│ │ │ │ ├── TopicCreateEditForm.java
│ │ │ │ ├── TopicDetails.java
│ │ │ │ ├── TopicSettingsTab.java
│ │ │ │ ├── TopicsList.java
│ │ │ │ └── enums/
│ │ │ │ ├── CleanupPolicyValue.java
│ │ │ │ ├── CustomParameterType.java
│ │ │ │ ├── MaxSizeOnDisk.java
│ │ │ │ └── TimeToRetain.java
│ │ │ ├── services/
│ │ │ │ └── ApiService.java
│ │ │ ├── settings/
│ │ │ │ ├── BaseSource.java
│ │ │ │ ├── configs/
│ │ │ │ │ ├── Config.java
│ │ │ │ │ └── Profiles.java
│ │ │ │ ├── drivers/
│ │ │ │ │ └── WebDriver.java
│ │ │ │ └── listeners/
│ │ │ │ ├── AllureListener.java
│ │ │ │ ├── LoggerListener.java
│ │ │ │ ├── QaseCreateListener.java
│ │ │ │ └── QaseResultListener.java
│ │ │ ├── utilities/
│ │ │ │ ├── FileUtils.java
│ │ │ │ ├── StringUtils.java
│ │ │ │ ├── TimeUtils.java
│ │ │ │ ├── WebUtils.java
│ │ │ │ └── qase/
│ │ │ │ ├── QaseSetup.java
│ │ │ │ ├── annotations/
│ │ │ │ │ ├── Automation.java
│ │ │ │ │ ├── Status.java
│ │ │ │ │ └── Suite.java
│ │ │ │ └── enums/
│ │ │ │ ├── State.java
│ │ │ │ └── Status.java
│ │ │ └── variables/
│ │ │ ├── Browser.java
│ │ │ ├── Expected.java
│ │ │ ├── Suite.java
│ │ │ └── Url.java
│ │ └── resources/
│ │ ├── allure.properties
│ │ └── testData/
│ │ ├── connectors/
│ │ │ ├── config_for_create_connector.json
│ │ │ ├── config_for_create_connector_via_api.json
│ │ │ ├── config_for_update_connector.json
│ │ │ └── delete_connector_config.json
│ │ ├── schemas/
│ │ │ ├── schema_avro_for_update.json
│ │ │ ├── schema_avro_value.json
│ │ │ ├── schema_json_Value.json
│ │ │ └── schema_protobuf_value.txt
│ │ └── topics/
│ │ └── message_content_create_topic.json
│ └── test/
│ ├── java/
│ │ └── com/
│ │ └── provectus/
│ │ └── kafka/
│ │ └── ui/
│ │ ├── BaseTest.java
│ │ ├── Facade.java
│ │ ├── manualsuite/
│ │ │ ├── BaseManualTest.java
│ │ │ ├── backlog/
│ │ │ │ ├── SanityBacklog.java
│ │ │ │ └── SmokeBacklog.java
│ │ │ └── suite/
│ │ │ ├── DataMaskingTest.java
│ │ │ ├── RbacTest.java
│ │ │ ├── TopicsTest.java
│ │ │ └── WizardTest.java
│ │ ├── qasesuite/
│ │ │ ├── BaseQaseTest.java
│ │ │ └── Template.java
│ │ ├── sanitysuite/
│ │ │ └── TopicsTest.java
│ │ └── smokesuite/
│ │ ├── SmokeTest.java
│ │ ├── brokers/
│ │ │ └── BrokersTest.java
│ │ ├── connectors/
│ │ │ └── ConnectorsTest.java
│ │ ├── ksqldb/
│ │ │ └── KsqlDbTest.java
│ │ ├── schemas/
│ │ │ └── SchemasTest.java
│ │ └── topics/
│ │ ├── MessagesTest.java
│ │ └── TopicsTest.java
│ └── resources/
│ ├── manual.xml
│ ├── qase.xml
│ ├── regression.xml
│ ├── sanity.xml
│ └── smoke.xml
├── kafka-ui-react-app/
│ ├── .editorconfig
│ ├── .eslintignore
│ ├── .eslintrc.json
│ ├── .gitignore
│ ├── .jest/
│ │ ├── cssTransform.js
│ │ └── resolver.js
│ ├── .nvmrc
│ ├── .prettierrc
│ ├── README.md
│ ├── index.html
│ ├── jest.config.ts
│ ├── openapitools.json
│ ├── package.json
│ ├── public/
│ │ ├── manifest.json
│ │ └── robots.txt
│ ├── sonar-project.properties
│ ├── src/
│ │ ├── components/
│ │ │ ├── ACLPage/
│ │ │ │ ├── ACLPage.tsx
│ │ │ │ └── List/
│ │ │ │ ├── List.styled.ts
│ │ │ │ ├── List.tsx
│ │ │ │ └── __test__/
│ │ │ │ └── List.spec.tsx
│ │ │ ├── App.styled.ts
│ │ │ ├── App.tsx
│ │ │ ├── Brokers/
│ │ │ │ ├── Broker/
│ │ │ │ │ ├── Broker.tsx
│ │ │ │ │ ├── BrokerLogdir/
│ │ │ │ │ │ ├── BrokerLogdir.tsx
│ │ │ │ │ │ └── __test__/
│ │ │ │ │ │ └── BrokerLogdir.spec.tsx
│ │ │ │ │ ├── BrokerMetrics/
│ │ │ │ │ │ ├── BrokerMetrics.tsx
│ │ │ │ │ │ └── __test__/
│ │ │ │ │ │ └── BrokerMetrics.spec.tsx
│ │ │ │ │ ├── Configs/
│ │ │ │ │ │ ├── Configs.styled.ts
│ │ │ │ │ │ ├── Configs.tsx
│ │ │ │ │ │ ├── InputCell.tsx
│ │ │ │ │ │ └── __test__/
│ │ │ │ │ │ └── Configs.spec.tsx
│ │ │ │ │ └── __test__/
│ │ │ │ │ └── Broker.spec.tsx
│ │ │ │ ├── Brokers.tsx
│ │ │ │ ├── BrokersList/
│ │ │ │ │ ├── BrokersList.styled.ts
│ │ │ │ │ ├── BrokersList.tsx
│ │ │ │ │ ├── SkewHeader/
│ │ │ │ │ │ ├── SkewHeader.styled.ts
│ │ │ │ │ │ └── SkewHeader.tsx
│ │ │ │ │ └── __test__/
│ │ │ │ │ └── BrokersList.spec.tsx
│ │ │ │ ├── __test__/
│ │ │ │ │ └── Brokers.spec.tsx
│ │ │ │ └── utils/
│ │ │ │ ├── __test__/
│ │ │ │ │ ├── fixtures.ts
│ │ │ │ │ └── getEditorText.spec.tsx
│ │ │ │ └── getEditorText.ts
│ │ │ ├── ClusterPage/
│ │ │ │ ├── ClusterConfigPage.tsx
│ │ │ │ ├── ClusterPage.tsx
│ │ │ │ └── __tests__/
│ │ │ │ └── ClusterPage.spec.tsx
│ │ │ ├── Connect/
│ │ │ │ ├── Connect.tsx
│ │ │ │ ├── Details/
│ │ │ │ │ ├── Actions/
│ │ │ │ │ │ ├── Action.styled.ts
│ │ │ │ │ │ ├── Actions.tsx
│ │ │ │ │ │ └── __tests__/
│ │ │ │ │ │ └── Actions.spec.tsx
│ │ │ │ │ ├── Config/
│ │ │ │ │ │ ├── Config.styled.ts
│ │ │ │ │ │ ├── Config.tsx
│ │ │ │ │ │ └── __tests__/
│ │ │ │ │ │ └── Config.spec.tsx
│ │ │ │ │ ├── DetailsPage.tsx
│ │ │ │ │ ├── Overview/
│ │ │ │ │ │ ├── Overview.tsx
│ │ │ │ │ │ ├── __tests__/
│ │ │ │ │ │ │ ├── Overview.spec.tsx
│ │ │ │ │ │ │ └── getTaskMetrics.spec.ts
│ │ │ │ │ │ └── getTaskMetrics.ts
│ │ │ │ │ ├── Tasks/
│ │ │ │ │ │ ├── ActionsCellTasks.tsx
│ │ │ │ │ │ ├── Tasks.tsx
│ │ │ │ │ │ └── __tests__/
│ │ │ │ │ │ └── Tasks.spec.tsx
│ │ │ │ │ └── __tests__/
│ │ │ │ │ └── DetailsPage.spec.tsx
│ │ │ │ ├── List/
│ │ │ │ │ ├── ActionsCell.tsx
│ │ │ │ │ ├── List.styled.ts
│ │ │ │ │ ├── List.tsx
│ │ │ │ │ ├── ListPage.tsx
│ │ │ │ │ ├── RunningTasksCell.tsx
│ │ │ │ │ ├── TopicsCell.tsx
│ │ │ │ │ └── __tests__/
│ │ │ │ │ ├── List.spec.tsx
│ │ │ │ │ └── ListPage.spec.tsx
│ │ │ │ ├── New/
│ │ │ │ │ ├── New.styled.ts
│ │ │ │ │ ├── New.tsx
│ │ │ │ │ └── __tests__/
│ │ │ │ │ └── New.spec.tsx
│ │ │ │ └── __tests__/
│ │ │ │ └── Connect.spec.tsx
│ │ │ ├── ConsumerGroups/
│ │ │ │ ├── ConsumerGroups.tsx
│ │ │ │ ├── Details/
│ │ │ │ │ ├── Details.tsx
│ │ │ │ │ ├── ListItem.styled.ts
│ │ │ │ │ ├── ListItem.tsx
│ │ │ │ │ ├── ResetOffsets/
│ │ │ │ │ │ ├── Form.tsx
│ │ │ │ │ │ ├── ResetOffsets.styled.ts
│ │ │ │ │ │ └── ResetOffsets.tsx
│ │ │ │ │ └── TopicContents/
│ │ │ │ │ ├── TopicContent.styled.ts
│ │ │ │ │ ├── TopicContents.tsx
│ │ │ │ │ └── __test__/
│ │ │ │ │ └── TopicContents.spec.tsx
│ │ │ │ ├── List.tsx
│ │ │ │ └── __test__/
│ │ │ │ └── ConsumerGroups.spec.tsx
│ │ │ ├── Dashboard/
│ │ │ │ ├── ClusterName.tsx
│ │ │ │ ├── ClusterTableActionsCell.tsx
│ │ │ │ ├── Dashboard.styled.ts
│ │ │ │ └── Dashboard.tsx
│ │ │ ├── ErrorPage/
│ │ │ │ ├── ErrorPage.styled.ts
│ │ │ │ ├── ErrorPage.tsx
│ │ │ │ └── __tests__/
│ │ │ │ └── ErrorPage.spec.tsx
│ │ │ ├── KsqlDb/
│ │ │ │ ├── KsqlDb.tsx
│ │ │ │ ├── Query/
│ │ │ │ │ ├── Query.tsx
│ │ │ │ │ ├── QueryForm/
│ │ │ │ │ │ ├── QueryForm.styled.ts
│ │ │ │ │ │ └── QueryForm.tsx
│ │ │ │ │ └── renderer/
│ │ │ │ │ └── TableRenderer/
│ │ │ │ │ ├── TableRenderer.styled.tsx
│ │ │ │ │ └── TableRenderer.tsx
│ │ │ │ └── TableView.tsx
│ │ │ ├── Nav/
│ │ │ │ ├── ClusterMenu.tsx
│ │ │ │ ├── ClusterMenuItem.tsx
│ │ │ │ ├── ClusterTab/
│ │ │ │ │ ├── ClusterTab.styled.ts
│ │ │ │ │ ├── ClusterTab.tsx
│ │ │ │ │ └── __tests__/
│ │ │ │ │ ├── ClusterTab.spec.tsx
│ │ │ │ │ └── ClusterTab.styled.spec.tsx
│ │ │ │ ├── Nav.styled.ts
│ │ │ │ ├── Nav.tsx
│ │ │ │ └── __tests__/
│ │ │ │ ├── ClusterMenu.spec.tsx
│ │ │ │ ├── ClusterMenuItem.spec.tsx
│ │ │ │ └── Nav.spec.tsx
│ │ │ ├── NavBar/
│ │ │ │ ├── NavBar.styled.ts
│ │ │ │ ├── NavBar.tsx
│ │ │ │ ├── UserInfo/
│ │ │ │ │ ├── UserInfo.styled.ts
│ │ │ │ │ ├── UserInfo.tsx
│ │ │ │ │ └── __tests__/
│ │ │ │ │ └── UserInfo.spec.tsx
│ │ │ │ └── __tests__/
│ │ │ │ └── NavBar.spec.tsx
│ │ │ ├── PageContainer/
│ │ │ │ ├── PageContainer.styled.ts
│ │ │ │ ├── PageContainer.tsx
│ │ │ │ └── __tests__/
│ │ │ │ └── PageContainer.spec.tsx
│ │ │ ├── Schemas/
│ │ │ │ ├── Details/
│ │ │ │ │ ├── Details.tsx
│ │ │ │ │ ├── LatestVersion/
│ │ │ │ │ │ ├── LatestVersionItem.styled.tsx
│ │ │ │ │ │ └── LatestVersionItem.tsx
│ │ │ │ │ ├── SchemaVersion/
│ │ │ │ │ │ └── SchemaVersion.tsx
│ │ │ │ │ └── __test__/
│ │ │ │ │ ├── Details.spec.tsx
│ │ │ │ │ ├── LatestVersionItem.spec.tsx
│ │ │ │ │ ├── SchemaVersion.spec.tsx
│ │ │ │ │ └── fixtures.ts
│ │ │ │ ├── Diff/
│ │ │ │ │ ├── Diff.styled.ts
│ │ │ │ │ ├── Diff.tsx
│ │ │ │ │ ├── DiffContainer.ts
│ │ │ │ │ └── __test__/
│ │ │ │ │ ├── Diff.spec.tsx
│ │ │ │ │ └── fixtures.ts
│ │ │ │ ├── Edit/
│ │ │ │ │ ├── Edit.styled.ts
│ │ │ │ │ ├── Edit.tsx
│ │ │ │ │ ├── Form.tsx
│ │ │ │ │ └── __tests__/
│ │ │ │ │ └── Edit.spec.tsx
│ │ │ │ ├── List/
│ │ │ │ │ ├── GlobalSchemaSelector/
│ │ │ │ │ │ ├── GlobalSchemaSelector.styled.ts
│ │ │ │ │ │ ├── GlobalSchemaSelector.tsx
│ │ │ │ │ │ └── __test__/
│ │ │ │ │ │ └── GlobalSchemaSelector.spec.tsx
│ │ │ │ │ ├── List.tsx
│ │ │ │ │ └── __test__/
│ │ │ │ │ ├── List.spec.tsx
│ │ │ │ │ └── fixtures.ts
│ │ │ │ ├── New/
│ │ │ │ │ ├── New.styled.ts
│ │ │ │ │ ├── New.tsx
│ │ │ │ │ └── __test__/
│ │ │ │ │ └── New.spec.tsx
│ │ │ │ ├── Schemas.tsx
│ │ │ │ └── __test__/
│ │ │ │ └── Schemas.spec.tsx
│ │ │ ├── Topics/
│ │ │ │ ├── List/
│ │ │ │ │ ├── ActionsCell.tsx
│ │ │ │ │ ├── BatchActionsBar.tsx
│ │ │ │ │ ├── ListPage.tsx
│ │ │ │ │ ├── TopicTable.tsx
│ │ │ │ │ ├── TopicTitleCell.tsx
│ │ │ │ │ └── __tests__/
│ │ │ │ │ ├── ListPage.spec.tsx
│ │ │ │ │ └── TopicTable.spec.tsx
│ │ │ │ ├── New/
│ │ │ │ │ ├── New.tsx
│ │ │ │ │ └── __test__/
│ │ │ │ │ └── New.spec.tsx
│ │ │ │ ├── Topic/
│ │ │ │ │ ├── ConsumerGroups/
│ │ │ │ │ │ ├── TopicConsumerGroups.styled.ts
│ │ │ │ │ │ ├── TopicConsumerGroups.tsx
│ │ │ │ │ │ └── __test__/
│ │ │ │ │ │ └── TopicConsumerGroups.spec.tsx
│ │ │ │ │ ├── Edit/
│ │ │ │ │ │ ├── DangerZone/
│ │ │ │ │ │ │ ├── DangerZone.styled.tsx
│ │ │ │ │ │ │ ├── DangerZone.tsx
│ │ │ │ │ │ │ └── __test__/
│ │ │ │ │ │ │ └── DangerZone.spec.tsx
│ │ │ │ │ │ ├── Edit.tsx
│ │ │ │ │ │ ├── __test__/
│ │ │ │ │ │ │ ├── Edit.spec.tsx
│ │ │ │ │ │ │ └── topicParamsTransformer.spec.ts
│ │ │ │ │ │ └── topicParamsTransformer.ts
│ │ │ │ │ ├── Messages/
│ │ │ │ │ │ ├── Filters/
│ │ │ │ │ │ │ ├── AddEditFilterContainer.tsx
│ │ │ │ │ │ │ ├── AddFilter.tsx
│ │ │ │ │ │ │ ├── EditFilter.tsx
│ │ │ │ │ │ │ ├── FilterModal.tsx
│ │ │ │ │ │ │ ├── Filters.styled.ts
│ │ │ │ │ │ │ ├── Filters.tsx
│ │ │ │ │ │ │ ├── FiltersContainer.ts
│ │ │ │ │ │ │ ├── InfoModal.tsx
│ │ │ │ │ │ │ ├── SavedFilters.tsx
│ │ │ │ │ │ │ ├── __tests__/
│ │ │ │ │ │ │ │ ├── AddEditFilterContainer.spec.tsx
│ │ │ │ │ │ │ │ ├── AddFilter.spec.tsx
│ │ │ │ │ │ │ │ ├── EditFilter.spec.tsx
│ │ │ │ │ │ │ │ ├── FilterModal.spec.tsx
│ │ │ │ │ │ │ │ ├── Filters.spec.tsx
│ │ │ │ │ │ │ │ ├── Filters.styled.spec.tsx
│ │ │ │ │ │ │ │ ├── InfoModal.spec.tsx
│ │ │ │ │ │ │ │ └── SavedFilters.spec.tsx
│ │ │ │ │ │ │ └── utils.ts
│ │ │ │ │ │ ├── Message.tsx
│ │ │ │ │ │ ├── MessageContent/
│ │ │ │ │ │ │ ├── MessageContent.styled.ts
│ │ │ │ │ │ │ ├── MessageContent.tsx
│ │ │ │ │ │ │ └── __tests__/
│ │ │ │ │ │ │ └── MessageContent.spec.tsx
│ │ │ │ │ │ ├── Messages.styled.ts
│ │ │ │ │ │ ├── Messages.tsx
│ │ │ │ │ │ ├── MessagesTable.tsx
│ │ │ │ │ │ ├── PreviewModal.styled.ts
│ │ │ │ │ │ ├── PreviewModal.tsx
│ │ │ │ │ │ ├── __test__/
│ │ │ │ │ │ │ ├── FiltersContainer.spec.tsx
│ │ │ │ │ │ │ ├── Message.spec.tsx
│ │ │ │ │ │ │ ├── Messages.spec.tsx
│ │ │ │ │ │ │ ├── MessagesTable.spec.tsx
│ │ │ │ │ │ │ ├── PreviewModal.spec.tsx
│ │ │ │ │ │ │ └── utils.spec.ts
│ │ │ │ │ │ └── getDefaultSerdeName.ts
│ │ │ │ │ ├── Overview/
│ │ │ │ │ │ ├── ActionsCell.tsx
│ │ │ │ │ │ ├── Overview.styled.ts
│ │ │ │ │ │ ├── Overview.tsx
│ │ │ │ │ │ └── __test__/
│ │ │ │ │ │ └── Overview.spec.tsx
│ │ │ │ │ ├── SendMessage/
│ │ │ │ │ │ ├── SendMessage.styled.tsx
│ │ │ │ │ │ ├── SendMessage.tsx
│ │ │ │ │ │ ├── __test__/
│ │ │ │ │ │ │ ├── SendMessage.spec.tsx
│ │ │ │ │ │ │ └── utils.spec.ts
│ │ │ │ │ │ └── utils.ts
│ │ │ │ │ ├── Settings/
│ │ │ │ │ │ ├── Settings.styled.ts
│ │ │ │ │ │ ├── Settings.tsx
│ │ │ │ │ │ └── __test__/
│ │ │ │ │ │ └── Settings.spec.tsx
│ │ │ │ │ ├── Statistics/
│ │ │ │ │ │ ├── Indicators/
│ │ │ │ │ │ │ ├── SizeStats.tsx
│ │ │ │ │ │ │ └── Total.tsx
│ │ │ │ │ │ ├── Metrics.tsx
│ │ │ │ │ │ ├── PartitionInfoRow.tsx
│ │ │ │ │ │ ├── PartitionTable.tsx
│ │ │ │ │ │ ├── Statistics.styles.ts
│ │ │ │ │ │ ├── Statistics.tsx
│ │ │ │ │ │ └── __test__/
│ │ │ │ │ │ ├── Metrics.spec.tsx
│ │ │ │ │ │ └── Statistics.spec.tsx
│ │ │ │ │ ├── Topic.tsx
│ │ │ │ │ └── __test__/
│ │ │ │ │ └── Topic.spec.tsx
│ │ │ │ ├── Topics.tsx
│ │ │ │ ├── __tests__/
│ │ │ │ │ └── Topics.spec.tsx
│ │ │ │ └── shared/
│ │ │ │ └── Form/
│ │ │ │ ├── CustomParams/
│ │ │ │ │ ├── CustomParamField.tsx
│ │ │ │ │ ├── CustomParams.styled.ts
│ │ │ │ │ ├── CustomParams.tsx
│ │ │ │ │ └── __test__/
│ │ │ │ │ ├── CustomParamField.spec.tsx
│ │ │ │ │ ├── CustomParams.spec.tsx
│ │ │ │ │ └── fixtures.ts
│ │ │ │ ├── TimeToRetain.tsx
│ │ │ │ ├── TimeToRetainBtn.tsx
│ │ │ │ ├── TimeToRetainBtns.tsx
│ │ │ │ ├── TopicForm.styled.ts
│ │ │ │ ├── TopicForm.tsx
│ │ │ │ └── __tests__/
│ │ │ │ ├── TimeToRetainBtn.spec.tsx
│ │ │ │ ├── TimeToRetainBtns.spec.tsx
│ │ │ │ ├── TopicForm.spec.tsx
│ │ │ │ └── TopicForm.styled.spec.tsx
│ │ │ ├── Version/
│ │ │ │ ├── Version.styled.ts
│ │ │ │ ├── Version.tsx
│ │ │ │ ├── __tests__/
│ │ │ │ │ ├── Version.spec.tsx
│ │ │ │ │ └── compareVersions.spec.ts
│ │ │ │ └── compareVersions.ts
│ │ │ ├── __tests__/
│ │ │ │ └── App.spec.tsx
│ │ │ ├── common/
│ │ │ │ ├── ActionComponent/
│ │ │ │ │ ├── ActionButton/
│ │ │ │ │ │ ├── ActionButton.tsx
│ │ │ │ │ │ ├── ActionCanButton/
│ │ │ │ │ │ │ ├── ActionCanButton.tsx
│ │ │ │ │ │ │ └── __tests__/
│ │ │ │ │ │ │ └── ActionCanButton.spec.tsx
│ │ │ │ │ │ ├── ActionCreateButton/
│ │ │ │ │ │ │ ├── ActionCreateButton.tsx
│ │ │ │ │ │ │ └── __tests__/
│ │ │ │ │ │ │ └── ActionCreateButton.spec.tsx
│ │ │ │ │ │ ├── ActionPermissionButton/
│ │ │ │ │ │ │ ├── ActionPermissionButton.tsx
│ │ │ │ │ │ │ └── __tests__/
│ │ │ │ │ │ │ └── ActionPermissionButton.spec.tsx
│ │ │ │ │ │ └── __tests__/
│ │ │ │ │ │ └── ActionButton.spec.tsx
│ │ │ │ │ ├── ActionComponent.styled.ts
│ │ │ │ │ ├── ActionComponent.ts
│ │ │ │ │ ├── ActionDropDownItem/
│ │ │ │ │ │ └── ActionDropdownItem.tsx
│ │ │ │ │ ├── ActionNavLink/
│ │ │ │ │ │ ├── ActionNavLink.tsx
│ │ │ │ │ │ └── __tests__/
│ │ │ │ │ │ └── ActionNavLink.spec.tsx
│ │ │ │ │ ├── ActionSelect/
│ │ │ │ │ │ ├── ActionSelect.tsx
│ │ │ │ │ │ └── __tests__/
│ │ │ │ │ │ └── ActionSelect.spec.tsx
│ │ │ │ │ ├── __tests__/
│ │ │ │ │ │ └── fixtures.ts
│ │ │ │ │ └── index.ts
│ │ │ │ ├── Alert/
│ │ │ │ │ ├── Alert.styled.ts
│ │ │ │ │ ├── Alert.tsx
│ │ │ │ │ └── __tests__/
│ │ │ │ │ └── Alert.spec.tsx
│ │ │ │ ├── Button/
│ │ │ │ │ ├── Button.styled.ts
│ │ │ │ │ ├── Button.tsx
│ │ │ │ │ └── __tests__/
│ │ │ │ │ └── Button.spec.tsx
│ │ │ │ ├── BytesFormatted/
│ │ │ │ │ ├── BytesFormatted.styled.ts
│ │ │ │ │ ├── BytesFormatted.tsx
│ │ │ │ │ └── __tests__/
│ │ │ │ │ └── BytesFormatted.spec.tsx
│ │ │ │ ├── Checkbox/
│ │ │ │ │ └── Checkbox.tsx
│ │ │ │ ├── ConfirmationModal/
│ │ │ │ │ ├── ConfirmationModal.styled.tsx
│ │ │ │ │ └── ConfirmationModal.tsx
│ │ │ │ ├── ControlPanel/
│ │ │ │ │ └── ControlPanel.styled.ts
│ │ │ │ ├── DiffViewer/
│ │ │ │ │ ├── DiffViewer.tsx
│ │ │ │ │ └── __tests__/
│ │ │ │ │ └── DiffViewer.spec.tsx
│ │ │ │ ├── Dropdown/
│ │ │ │ │ ├── Dropdown.styled.ts
│ │ │ │ │ ├── Dropdown.tsx
│ │ │ │ │ ├── DropdownItem.tsx
│ │ │ │ │ └── index.ts
│ │ │ │ ├── Editor/
│ │ │ │ │ └── Editor.tsx
│ │ │ │ ├── EditorViewer/
│ │ │ │ │ ├── EditorViewer.styled.ts
│ │ │ │ │ ├── EditorViewer.tsx
│ │ │ │ │ └── __test__/
│ │ │ │ │ └── EditorViewer.spec.tsx
│ │ │ │ ├── Ellipsis/
│ │ │ │ │ ├── Ellipsis.styled.ts
│ │ │ │ │ └── Ellipsis.tsx
│ │ │ │ ├── Form/
│ │ │ │ │ └── Form.styled.ts
│ │ │ │ ├── Icons/
│ │ │ │ │ ├── ArrowDownIcon.tsx
│ │ │ │ │ ├── AutoIcon.tsx
│ │ │ │ │ ├── CancelIcon.tsx
│ │ │ │ │ ├── CheckMarkRoundIcon.tsx
│ │ │ │ │ ├── CheckmarkIcon.tsx
│ │ │ │ │ ├── ChevronDownIcon.tsx
│ │ │ │ │ ├── ClockIcon.tsx
│ │ │ │ │ ├── CloseCircleIcon.tsx
│ │ │ │ │ ├── CloseIcon.tsx
│ │ │ │ │ ├── DeleteIcon.tsx
│ │ │ │ │ ├── DiscordIcon.tsx
│ │ │ │ │ ├── DropdownArrowIcon.tsx
│ │ │ │ │ ├── EditIcon.tsx
│ │ │ │ │ ├── FileIcon.tsx
│ │ │ │ │ ├── GitIcon.tsx
│ │ │ │ │ ├── IconButtonWrapper.ts
│ │ │ │ │ ├── InfoIcon.tsx
│ │ │ │ │ ├── MessageToggleIcon.styled.ts
│ │ │ │ │ ├── MessageToggleIcon.tsx
│ │ │ │ │ ├── MoonIcon.tsx
│ │ │ │ │ ├── PlusIcon.tsx
│ │ │ │ │ ├── QuestionIcon.tsx
│ │ │ │ │ ├── SavedIcon.tsx
│ │ │ │ │ ├── SearchIcon.tsx
│ │ │ │ │ ├── SpinnerIcon.tsx
│ │ │ │ │ ├── StarIcon.tsx
│ │ │ │ │ ├── SunIcon.tsx
│ │ │ │ │ ├── UserIcon.tsx
│ │ │ │ │ ├── VerticalElipsisIcon.tsx
│ │ │ │ │ ├── WarningIcon.tsx
│ │ │ │ │ └── WarningRedIcon.tsx
│ │ │ │ ├── IndeterminateCheckbox/
│ │ │ │ │ └── IndeterminateCheckbox.tsx
│ │ │ │ ├── Input/
│ │ │ │ │ ├── Input.styled.ts
│ │ │ │ │ ├── Input.tsx
│ │ │ │ │ ├── InputLabel.styled.ts
│ │ │ │ │ └── __tests__/
│ │ │ │ │ └── Input.spec.tsx
│ │ │ │ ├── Logo/
│ │ │ │ │ └── Logo.tsx
│ │ │ │ ├── Metrics/
│ │ │ │ │ ├── Indicator.tsx
│ │ │ │ │ ├── Metrics.styled.tsx
│ │ │ │ │ ├── Section.tsx
│ │ │ │ │ ├── __tests__/
│ │ │ │ │ │ ├── Indicator.spec.tsx
│ │ │ │ │ │ └── Section.spec.tsx
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── MultiSelect/
│ │ │ │ │ └── MultiSelect.styled.ts
│ │ │ │ ├── Navigation/
│ │ │ │ │ └── Navbar.styled.ts
│ │ │ │ ├── NewTable/
│ │ │ │ │ ├── ColoredCell.tsx
│ │ │ │ │ ├── ExpanderCell.tsx
│ │ │ │ │ ├── LinkCell.tsx
│ │ │ │ │ ├── SelectRowCell.tsx
│ │ │ │ │ ├── SelectRowHeader.tsx
│ │ │ │ │ ├── SizeCell.tsx
│ │ │ │ │ ├── Table.styled.ts
│ │ │ │ │ ├── Table.tsx
│ │ │ │ │ ├── TagCell.tsx
│ │ │ │ │ ├── TimestampCell.tsx
│ │ │ │ │ ├── __test__/
│ │ │ │ │ │ └── Table.spec.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── utils/
│ │ │ │ │ ├── __test__/
│ │ │ │ │ │ └── updateSortingState.spec.ts
│ │ │ │ │ ├── updatePaginationState.ts
│ │ │ │ │ └── updateSortingState.ts
│ │ │ │ ├── PageHeading/
│ │ │ │ │ ├── PageHeading.styled.ts
│ │ │ │ │ └── PageHeading.tsx
│ │ │ │ ├── PageLoader/
│ │ │ │ │ ├── PageLoader.styled.ts
│ │ │ │ │ ├── PageLoader.tsx
│ │ │ │ │ └── __tests__/
│ │ │ │ │ └── PageLoader.spec.tsx
│ │ │ │ ├── ProgressBar/
│ │ │ │ │ ├── ProgressBar.styled.ts
│ │ │ │ │ ├── ProgressBar.tsx
│ │ │ │ │ └── __test__/
│ │ │ │ │ └── ProgressBar.spec.tsx
│ │ │ │ ├── PropertiesList/
│ │ │ │ │ └── PropertiesList.styled.tsx
│ │ │ │ ├── SQLEditor/
│ │ │ │ │ ├── SQLEditor.tsx
│ │ │ │ │ └── __tests__/
│ │ │ │ │ └── SQLEditor.spec.tsx
│ │ │ │ ├── Search/
│ │ │ │ │ ├── Search.tsx
│ │ │ │ │ └── __tests__/
│ │ │ │ │ └── Search.spec.tsx
│ │ │ │ ├── Select/
│ │ │ │ │ ├── ControlledSelect.tsx
│ │ │ │ │ ├── LiveIcon.styled.tsx
│ │ │ │ │ ├── Select.styled.ts
│ │ │ │ │ ├── Select.tsx
│ │ │ │ │ └── __tests__/
│ │ │ │ │ └── Select.spec.tsx
│ │ │ │ ├── SlidingSidebar/
│ │ │ │ │ ├── SlidingSidebar.styled.ts
│ │ │ │ │ ├── SlidingSidebar.tsx
│ │ │ │ │ └── index.ts
│ │ │ │ ├── Spinner/
│ │ │ │ │ ├── Spinner.styled.ts
│ │ │ │ │ ├── Spinner.tsx
│ │ │ │ │ └── types.ts
│ │ │ │ ├── SuspenseQueryComponent/
│ │ │ │ │ ├── SuspenseQueryComponent.tsx
│ │ │ │ │ └── __test__/
│ │ │ │ │ └── SuspenseQueryComponent.spec.tsx
│ │ │ │ ├── Switch/
│ │ │ │ │ ├── Switch.styled.ts
│ │ │ │ │ └── Switch.tsx
│ │ │ │ ├── Tag/
│ │ │ │ │ ├── Tag.styled.tsx
│ │ │ │ │ └── getTagColor.ts
│ │ │ │ ├── Textbox/
│ │ │ │ │ └── Textarea.styled.ts
│ │ │ │ ├── Tooltip/
│ │ │ │ │ ├── Tooltip.styled.ts
│ │ │ │ │ ├── Tooltip.tsx
│ │ │ │ │ └── __tests__/
│ │ │ │ │ └── Tooltip.spec.tsx
│ │ │ │ ├── heading/
│ │ │ │ │ └── Heading.styled.tsx
│ │ │ │ └── table/
│ │ │ │ ├── Table/
│ │ │ │ │ ├── Table.styled.ts
│ │ │ │ │ └── TableKeyLink.styled.ts
│ │ │ │ ├── TableHeaderCell/
│ │ │ │ │ ├── TableHeaderCell.styled.ts
│ │ │ │ │ ├── TableHeaderCell.tsx
│ │ │ │ │ └── __test__/
│ │ │ │ │ └── TableHeaderCell.styled.spec.tsx
│ │ │ │ ├── TableTitle/
│ │ │ │ │ └── TableTitle.styled.tsx
│ │ │ │ └── __tests__/
│ │ │ │ └── TableHeaderCell.spec.tsx
│ │ │ ├── contexts/
│ │ │ │ ├── ClusterContext.ts
│ │ │ │ ├── ConfirmContext.tsx
│ │ │ │ ├── GlobalSettingsContext.tsx
│ │ │ │ ├── ThemeModeContext.tsx
│ │ │ │ ├── TopicMessagesContext.ts
│ │ │ │ └── UserInfoRolesAccessContext.tsx
│ │ │ └── globalCss.ts
│ │ ├── index.tsx
│ │ ├── lib/
│ │ │ ├── __test__/
│ │ │ │ ├── dateTimeHelpers.spec.ts
│ │ │ │ ├── paths.spec.ts
│ │ │ │ ├── permission.spec.ts
│ │ │ │ └── yupExtended.spec.ts
│ │ │ ├── api.ts
│ │ │ ├── constants.ts
│ │ │ ├── dateTimeHelpers.ts
│ │ │ ├── errorHandling.tsx
│ │ │ ├── fixtures/
│ │ │ │ ├── acls.ts
│ │ │ │ ├── brokers.ts
│ │ │ │ ├── clusters.ts
│ │ │ │ ├── consumerGroups.ts
│ │ │ │ ├── kafkaConnect.ts
│ │ │ │ ├── latestVersion.ts
│ │ │ │ ├── topicMessages.ts
│ │ │ │ └── topics.ts
│ │ │ ├── hooks/
│ │ │ │ ├── __tests__/
│ │ │ │ │ ├── dateTimeHelpers.spec.ts
│ │ │ │ │ ├── fixtures.ts
│ │ │ │ │ ├── useBoolean.spec.ts
│ │ │ │ │ ├── useCreatePermission.spec.tsx
│ │ │ │ │ ├── useDataSaver.spec.tsx
│ │ │ │ │ └── usePermission.spec.tsx
│ │ │ │ ├── api/
│ │ │ │ │ ├── __tests__/
│ │ │ │ │ │ ├── brokers.spec.ts
│ │ │ │ │ │ ├── clusters.spec.ts
│ │ │ │ │ │ ├── kafkaConnect.spec.ts
│ │ │ │ │ │ ├── latestVersion.spec.ts
│ │ │ │ │ │ ├── topicMessages.spec.ts
│ │ │ │ │ │ └── topics.spec.ts
│ │ │ │ │ ├── acl.ts
│ │ │ │ │ ├── appConfig.ts
│ │ │ │ │ ├── brokers.ts
│ │ │ │ │ ├── clusters.ts
│ │ │ │ │ ├── consumers.ts
│ │ │ │ │ ├── kafkaConnect.ts
│ │ │ │ │ ├── ksqlDb.tsx
│ │ │ │ │ ├── latestVersion.ts
│ │ │ │ │ ├── roles.ts
│ │ │ │ │ ├── topicMessages.tsx
│ │ │ │ │ └── topics.ts
│ │ │ │ ├── redux.ts
│ │ │ │ ├── useActionTooltip.ts
│ │ │ │ ├── useAppParams.tsx
│ │ │ │ ├── useBoolean.ts
│ │ │ │ ├── useClickOutside.ts
│ │ │ │ ├── useConfirm.ts
│ │ │ │ ├── useCreatePermisson.ts
│ │ │ │ ├── useDataSaver.ts
│ │ │ │ ├── useLocalStorage.ts
│ │ │ │ ├── useMessageFiltersStore.ts
│ │ │ │ ├── usePermission.ts
│ │ │ │ └── useUserInfo.ts
│ │ │ ├── paths.ts
│ │ │ ├── permissions.ts
│ │ │ ├── testHelpers.tsx
│ │ │ └── yupExtended.ts
│ │ ├── react-app-env.d.ts
│ │ ├── redux/
│ │ │ ├── interfaces/
│ │ │ │ ├── cluster.ts
│ │ │ │ ├── consumerGroup.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── loader.ts
│ │ │ │ ├── schema.ts
│ │ │ │ └── topic.ts
│ │ │ ├── reducers/
│ │ │ │ ├── index.ts
│ │ │ │ ├── loader/
│ │ │ │ │ ├── loaderSlice.ts
│ │ │ │ │ └── selectors.ts
│ │ │ │ ├── schemas/
│ │ │ │ │ ├── __test__/
│ │ │ │ │ │ └── fixtures.ts
│ │ │ │ │ └── schemasSlice.ts
│ │ │ │ └── topicMessages/
│ │ │ │ ├── __test__/
│ │ │ │ │ ├── fixtures.ts
│ │ │ │ │ ├── reducer.spec.ts
│ │ │ │ │ └── selectors.spec.ts
│ │ │ │ ├── selectors.ts
│ │ │ │ └── topicMessagesSlice.ts
│ │ │ └── store/
│ │ │ └── index.ts
│ │ ├── setupTests.ts
│ │ ├── styled.d.ts
│ │ ├── theme/
│ │ │ ├── index.scss
│ │ │ ├── minireset.css
│ │ │ └── theme.ts
│ │ └── widgets/
│ │ └── ClusterConfigForm/
│ │ ├── ClusterConfigForm.styled.ts
│ │ ├── Sections/
│ │ │ ├── Authentication/
│ │ │ │ ├── Authentication.tsx
│ │ │ │ └── AuthenticationMethods.tsx
│ │ │ ├── CustomAuthentication.tsx
│ │ │ ├── KSQL.tsx
│ │ │ ├── KafkaCluster.tsx
│ │ │ ├── KafkaConnect.tsx
│ │ │ ├── Metrics.tsx
│ │ │ └── SchemaRegistry.tsx
│ │ ├── common/
│ │ │ ├── Credentials.tsx
│ │ │ ├── Fileupload.tsx
│ │ │ ├── SSLForm.tsx
│ │ │ └── SectionHeader.tsx
│ │ ├── index.tsx
│ │ ├── schema.ts
│ │ ├── types.ts
│ │ └── utils/
│ │ ├── convertFormKeyToPropsKey.ts
│ │ ├── convertPropsKeyToFormKey.ts
│ │ ├── getInitialFormData.ts
│ │ ├── getIsValidConfig.ts
│ │ ├── getJaasConfig.ts
│ │ └── transformFormDataToPayload.ts
│ ├── tsconfig.dev.json
│ ├── tsconfig.json
│ └── vite.config.ts
├── kafka-ui-serde-api/
│ ├── pom.xml
│ └── src/
│ └── main/
│ └── java/
│ └── com/
│ └── provectus/
│ └── kafka/
│ └── ui/
│ └── serde/
│ └── api/
│ ├── DeserializeResult.java
│ ├── PropertyResolver.java
│ ├── RecordHeader.java
│ ├── RecordHeaders.java
│ ├── SchemaDescription.java
│ └── Serde.java
├── mvnw
├── mvnw.cmd
├── pom.xml
└── settings.xml
================================================
FILE CONTENTS
================================================
================================================
FILE: .devcontainer/devcontainer.json
================================================
{
"name": "Java",
"image": "mcr.microsoft.com/devcontainers/java:0-17",
"features": {
"ghcr.io/devcontainers/features/java:1": {
"version": "none",
"installMaven": "true",
"installGradle": "false"
},
"ghcr.io/devcontainers/features/docker-in-docker:2": {}
},
// Use 'forwardPorts' to make a list of ports inside the container available locally.
// "forwardPorts": [],
// Use 'postCreateCommand' to run commands after the container is created.
// "postCreateCommand": "java -version",
"customizations": {
"vscode": {
"extensions" : [
"vscjava.vscode-java-pack",
"vscjava.vscode-maven",
"vscjava.vscode-java-debug",
"EditorConfig.EditorConfig",
"ms-azuretools.vscode-docker",
"antfu.vite",
"ms-kubernetes-tools.vscode-kubernetes-tools",
"github.vscode-pull-request-github"
]
}
}
}
================================================
FILE: .editorconfig
================================================
[*]
charset = utf-8
end_of_line = lf
indent_size = 4
indent_style = space
insert_final_newline = true
max_line_length = 120
tab_width = 4
ij_continuation_indent_size = 8
ij_formatter_off_tag = @formatter:off
ij_formatter_on_tag = @formatter:on
ij_formatter_tags_enabled = true
ij_smart_tabs = false
ij_visual_guides = none
ij_wrap_on_typing = false
trim_trailing_whitespace = true
[*.java]
indent_size = 2
ij_continuation_indent_size = 4
ij_java_align_consecutive_assignments = false
ij_java_align_consecutive_variable_declarations = false
ij_java_align_group_field_declarations = false
ij_java_align_multiline_annotation_parameters = false
ij_java_align_multiline_array_initializer_expression = false
ij_java_align_multiline_assignment = false
ij_java_align_multiline_binary_operation = false
ij_java_align_multiline_chained_methods = false
ij_java_align_multiline_extends_list = false
ij_java_align_multiline_for = true
ij_java_align_multiline_method_parentheses = false
ij_java_align_multiline_parameters = true
ij_java_align_multiline_parameters_in_calls = false
ij_java_align_multiline_parenthesized_expression = false
ij_java_align_multiline_records = true
ij_java_align_multiline_resources = true
ij_java_align_multiline_ternary_operation = false
ij_java_align_multiline_text_blocks = false
ij_java_align_multiline_throws_list = false
ij_java_align_subsequent_simple_methods = false
ij_java_align_throws_keyword = false
ij_java_align_types_in_multi_catch = true
ij_java_annotation_parameter_wrap = off
ij_java_array_initializer_new_line_after_left_brace = false
ij_java_array_initializer_right_brace_on_new_line = false
ij_java_array_initializer_wrap = normal
ij_java_assert_statement_colon_on_next_line = false
ij_java_assert_statement_wrap = normal
ij_java_assignment_wrap = normal
ij_java_binary_operation_sign_on_next_line = false
ij_java_binary_operation_wrap = normal
ij_java_blank_lines_after_anonymous_class_header = 0
ij_java_blank_lines_after_class_header = 0
ij_java_blank_lines_after_imports = 1
ij_java_blank_lines_after_package = 1
ij_java_blank_lines_around_class = 1
ij_java_blank_lines_around_field = 0
ij_java_blank_lines_around_field_in_interface = 0
ij_java_blank_lines_around_initializer = 1
ij_java_blank_lines_around_method = 1
ij_java_blank_lines_around_method_in_interface = 1
ij_java_blank_lines_before_class_end = 0
ij_java_blank_lines_before_imports = 1
ij_java_blank_lines_before_method_body = 0
ij_java_blank_lines_before_package = 1
ij_java_block_brace_style = end_of_line
ij_java_block_comment_add_space = false
ij_java_block_comment_at_first_column = true
ij_java_builder_methods = none
ij_java_call_parameters_new_line_after_left_paren = false
ij_java_call_parameters_right_paren_on_new_line = false
ij_java_call_parameters_wrap = normal
ij_java_case_statement_on_separate_line = true
ij_java_catch_on_new_line = false
ij_java_class_annotation_wrap = split_into_lines
ij_java_class_brace_style = end_of_line
ij_java_class_count_to_use_import_on_demand = 999
ij_java_class_names_in_javadoc = 1
ij_java_do_not_indent_top_level_class_members = false
ij_java_do_not_wrap_after_single_annotation = false
ij_java_do_not_wrap_after_single_annotation_in_parameter = false
ij_java_do_while_brace_force = always
ij_java_doc_add_blank_line_after_description = true
ij_java_doc_add_blank_line_after_param_comments = false
ij_java_doc_add_blank_line_after_return = false
ij_java_doc_add_p_tag_on_empty_lines = true
ij_java_doc_align_exception_comments = true
ij_java_doc_align_param_comments = true
ij_java_doc_do_not_wrap_if_one_line = false
ij_java_doc_enable_formatting = true
ij_java_doc_enable_leading_asterisks = true
ij_java_doc_indent_on_continuation = false
ij_java_doc_keep_empty_lines = true
ij_java_doc_keep_empty_parameter_tag = true
ij_java_doc_keep_empty_return_tag = true
ij_java_doc_keep_empty_throws_tag = true
ij_java_doc_keep_invalid_tags = true
ij_java_doc_param_description_on_new_line = false
ij_java_doc_preserve_line_breaks = false
ij_java_doc_use_throws_not_exception_tag = true
ij_java_else_on_new_line = false
ij_java_entity_dd_suffix = EJB
ij_java_entity_eb_suffix = Bean
ij_java_entity_hi_suffix = Home
ij_java_entity_lhi_prefix = Local
ij_java_entity_lhi_suffix = Home
ij_java_entity_li_prefix = Local
ij_java_entity_pk_class = java.lang.String
ij_java_entity_vo_suffix = VO
ij_java_enum_constants_wrap = normal
ij_java_extends_keyword_wrap = normal
ij_java_extends_list_wrap = normal
ij_java_field_annotation_wrap = split_into_lines
ij_java_finally_on_new_line = false
ij_java_for_brace_force = always
ij_java_for_statement_new_line_after_left_paren = false
ij_java_for_statement_right_paren_on_new_line = false
ij_java_for_statement_wrap = normal
ij_java_generate_final_locals = false
ij_java_generate_final_parameters = false
ij_java_if_brace_force = always
ij_java_imports_layout = $*,|,*
ij_java_indent_case_from_switch = true
ij_java_insert_inner_class_imports = false
ij_java_insert_override_annotation = true
ij_java_keep_blank_lines_before_right_brace = 2
ij_java_keep_blank_lines_between_package_declaration_and_header = 2
ij_java_keep_blank_lines_in_code = 2
ij_java_keep_blank_lines_in_declarations = 2
ij_java_keep_builder_methods_indents = false
ij_java_keep_control_statement_in_one_line = true
ij_java_keep_first_column_comment = true
ij_java_keep_indents_on_empty_lines = false
ij_java_keep_line_breaks = true
ij_java_keep_multiple_expressions_in_one_line = false
ij_java_keep_simple_blocks_in_one_line = false
ij_java_keep_simple_classes_in_one_line = false
ij_java_keep_simple_lambdas_in_one_line = false
ij_java_keep_simple_methods_in_one_line = false
ij_java_label_indent_absolute = false
ij_java_label_indent_size = 0
ij_java_lambda_brace_style = end_of_line
ij_java_layout_static_imports_separately = true
ij_java_line_comment_add_space = false
ij_java_line_comment_add_space_on_reformat = false
ij_java_line_comment_at_first_column = true
ij_java_message_dd_suffix = EJB
ij_java_message_eb_suffix = Bean
ij_java_method_annotation_wrap = split_into_lines
ij_java_method_brace_style = end_of_line
ij_java_method_call_chain_wrap = normal
ij_java_method_parameters_new_line_after_left_paren = false
ij_java_method_parameters_right_paren_on_new_line = false
ij_java_method_parameters_wrap = normal
ij_java_modifier_list_wrap = false
ij_java_multi_catch_types_wrap = normal
ij_java_names_count_to_use_import_on_demand = 999
ij_java_new_line_after_lparen_in_annotation = false
ij_java_new_line_after_lparen_in_record_header = false
ij_java_parameter_annotation_wrap = normal
ij_java_parentheses_expression_new_line_after_left_paren = false
ij_java_parentheses_expression_right_paren_on_new_line = false
ij_java_place_assignment_sign_on_next_line = false
ij_java_prefer_longer_names = true
ij_java_prefer_parameters_wrap = false
ij_java_record_components_wrap = normal
ij_java_repeat_synchronized = true
ij_java_replace_instanceof_and_cast = false
ij_java_replace_null_check = true
ij_java_replace_sum_lambda_with_method_ref = true
ij_java_resource_list_new_line_after_left_paren = false
ij_java_resource_list_right_paren_on_new_line = false
ij_java_resource_list_wrap = normal
ij_java_rparen_on_new_line_in_annotation = false
ij_java_rparen_on_new_line_in_record_header = false
ij_java_session_dd_suffix = EJB
ij_java_session_eb_suffix = Bean
ij_java_session_hi_suffix = Home
ij_java_session_lhi_prefix = Local
ij_java_session_lhi_suffix = Home
ij_java_session_li_prefix = Local
ij_java_session_si_suffix = Service
ij_java_space_after_closing_angle_bracket_in_type_argument = false
ij_java_space_after_colon = true
ij_java_space_after_comma = true
ij_java_space_after_comma_in_type_arguments = true
ij_java_space_after_for_semicolon = true
ij_java_space_after_quest = true
ij_java_space_after_type_cast = true
ij_java_space_before_annotation_array_initializer_left_brace = false
ij_java_space_before_annotation_parameter_list = false
ij_java_space_before_array_initializer_left_brace = true
ij_java_space_before_catch_keyword = true
ij_java_space_before_catch_left_brace = true
ij_java_space_before_catch_parentheses = true
ij_java_space_before_class_left_brace = true
ij_java_space_before_colon = true
ij_java_space_before_colon_in_foreach = true
ij_java_space_before_comma = false
ij_java_space_before_do_left_brace = true
ij_java_space_before_else_keyword = true
ij_java_space_before_else_left_brace = true
ij_java_space_before_finally_keyword = true
ij_java_space_before_finally_left_brace = true
ij_java_space_before_for_left_brace = true
ij_java_space_before_for_parentheses = true
ij_java_space_before_for_semicolon = false
ij_java_space_before_if_left_brace = true
ij_java_space_before_if_parentheses = true
ij_java_space_before_method_call_parentheses = false
ij_java_space_before_method_left_brace = true
ij_java_space_before_method_parentheses = false
ij_java_space_before_opening_angle_bracket_in_type_parameter = false
ij_java_space_before_quest = true
ij_java_space_before_switch_left_brace = true
ij_java_space_before_switch_parentheses = true
ij_java_space_before_synchronized_left_brace = true
ij_java_space_before_synchronized_parentheses = true
ij_java_space_before_try_left_brace = true
ij_java_space_before_try_parentheses = true
ij_java_space_before_type_parameter_list = false
ij_java_space_before_while_keyword = true
ij_java_space_before_while_left_brace = true
ij_java_space_before_while_parentheses = true
ij_java_space_inside_one_line_enum_braces = false
ij_java_space_within_empty_array_initializer_braces = false
ij_java_space_within_empty_method_call_parentheses = false
ij_java_space_within_empty_method_parentheses = false
ij_java_spaces_around_additive_operators = true
ij_java_spaces_around_annotation_eq = true
ij_java_spaces_around_assignment_operators = true
ij_java_spaces_around_bitwise_operators = true
ij_java_spaces_around_equality_operators = true
ij_java_spaces_around_lambda_arrow = true
ij_java_spaces_around_logical_operators = true
ij_java_spaces_around_method_ref_dbl_colon = false
ij_java_spaces_around_multiplicative_operators = true
ij_java_spaces_around_relational_operators = true
ij_java_spaces_around_shift_operators = true
ij_java_spaces_around_type_bounds_in_type_parameters = true
ij_java_spaces_around_unary_operator = false
ij_java_spaces_within_angle_brackets = false
ij_java_spaces_within_annotation_parentheses = false
ij_java_spaces_within_array_initializer_braces = false
ij_java_spaces_within_braces = false
ij_java_spaces_within_brackets = false
ij_java_spaces_within_cast_parentheses = false
ij_java_spaces_within_catch_parentheses = false
ij_java_spaces_within_for_parentheses = false
ij_java_spaces_within_if_parentheses = false
ij_java_spaces_within_method_call_parentheses = false
ij_java_spaces_within_method_parentheses = false
ij_java_spaces_within_parentheses = false
ij_java_spaces_within_record_header = false
ij_java_spaces_within_switch_parentheses = false
ij_java_spaces_within_synchronized_parentheses = false
ij_java_spaces_within_try_parentheses = false
ij_java_spaces_within_while_parentheses = false
ij_java_special_else_if_treatment = true
ij_java_subclass_name_suffix = Impl
ij_java_ternary_operation_signs_on_next_line = false
ij_java_ternary_operation_wrap = normal
ij_java_test_name_suffix = Test
ij_java_throws_keyword_wrap = normal
ij_java_throws_list_wrap = normal
ij_java_use_external_annotations = false
ij_java_use_fq_class_names = false
ij_java_use_relative_indents = false
ij_java_use_single_class_imports = true
ij_java_variable_annotation_wrap = normal
ij_java_visibility = public
ij_java_while_brace_force = always
ij_java_while_on_new_line = false
ij_java_wrap_comments = false
ij_java_wrap_first_method_in_call_chain = false
ij_java_wrap_long_lines = false
[*.md]
insert_final_newline = false
trim_trailing_whitespace = false
[*.yaml]
indent_size = 2
[*.yml]
indent_size = 2
================================================
FILE: .github/CODEOWNERS
================================================
* @Haarolean
# BACKEND
/pom.xml @provectus/kafka-backend
/kafka-ui-contract/ @provectus/kafka-backend
/kafka-ui-api/ @provectus/kafka-backend
# FRONTEND
/kafka-ui-react-app/ @provectus/kafka-frontend
# TESTS
/kafka-ui-e2e-checks/ @provectus/kafka-qa
# INFRA
/.github/workflows/ @provectus/kafka-devops
================================================
FILE: .github/ISSUE_TEMPLATE/bug.yml
================================================
name: "\U0001F41E Bug report"
description: File a bug report
labels: ["status/triage", "type/bug"]
assignees: []
body:
- type: markdown
attributes:
value: |
Hi, thanks for raising the issue(-s), all contributions really matter!
Please, note that we'll close the issue without further explanation if you don't follow
this template and don't provide the information requested within this template.
- type: checkboxes
id: terms
attributes:
label: Issue submitter TODO list
description: By you checking these checkboxes we can be sure you've done the essential things.
options:
- label: I've looked up my issue in [FAQ](https://docs.kafka-ui.provectus.io/faq/common-problems)
required: true
- label: I've searched for an already existing issues [here](https://github.com/provectus/kafka-ui/issues)
required: true
- label: I've tried running `master`-labeled docker image and the issue still persists there
required: true
- label: I'm running a supported version of the application which is listed [here](https://github.com/provectus/kafka-ui/blob/master/SECURITY.md)
required: true
- type: textarea
attributes:
label: Describe the bug (actual behavior)
description: A clear and concise description of what the bug is. Use a list, if there is more than one problem
validations:
required: true
- type: textarea
attributes:
label: Expected behavior
description: A clear and concise description of what you expected to happen
validations:
required: false
- type: textarea
attributes:
label: Your installation details
description: |
How do you run the app? Please provide as much info as possible:
1. App version (commit hash in the top left corner of the UI)
2. Helm chart version, if you use one
3. Your application config. Please remove the sensitive info like passwords or API keys.
4. Any IAAC configs
validations:
required: true
- type: textarea
attributes:
label: Steps to reproduce
description: |
Please write down the order of the actions required to reproduce the issue.
For the advanced setups/complicated issue, we might need you to provide
a minimal [reproducible example](https://stackoverflow.com/help/minimal-reproducible-example).
validations:
required: true
- type: textarea
attributes:
label: Screenshots
description: |
If applicable, add screenshots to help explain your problem
validations:
required: false
- type: textarea
attributes:
label: Logs
description: |
If applicable, *upload* screenshots to help explain your problem
validations:
required: false
- type: textarea
attributes:
label: Additional context
description: |
Add any other context about the problem here. E.G.:
1. Are there any alternative scenarios (different data/methods/configuration/setup) you have tried?
Were they successful or the same issue occurred? Please provide steps as well.
2. Related issues (if there are any).
3. Logs (if available)
4. Is there any serious impact or behaviour on the end-user because of this issue, that can be overlooked?
validations:
required: false
================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: false
contact_links:
- name: Report helm issue
url: https://github.com/provectus/kafka-ui-charts
about: Our helm charts are located in another repo. Please raise issues/PRs regarding charts in that repo.
- name: Official documentation
url: https://docs.kafka-ui.provectus.io/
about: Before reaching out for support, please refer to our documentation. Read "FAQ" and "Common problems", also try using search there.
- name: Community Discord
url: https://discord.gg/4DWzD7pGE5
about: Chat with other users, get some support or ask questions.
- name: GitHub Discussions
url: https://github.com/provectus/kafka-ui/discussions
about: An alternative place to ask questions or to get some support.
================================================
FILE: .github/ISSUE_TEMPLATE/feature.yml
================================================
name: "\U0001F680 Feature request"
description: Propose a new feature
labels: ["status/triage", "type/feature"]
assignees: []
body:
- type: markdown
attributes:
value: |
Hi, thanks for raising the issue(-s), all contributions really matter!
Please, note that we'll close the issue without further explanation if you don't follow
this template and don't provide the information requested within this template.
- type: checkboxes
id: terms
attributes:
label: Issue submitter TODO list
description: By you checking these checkboxes we can be sure you've done the essential things.
options:
- label: I've searched for an already existing issues [here](https://github.com/provectus/kafka-ui/issues)
required: true
- label: I'm running a supported version of the application which is listed [here](https://github.com/provectus/kafka-ui/blob/master/SECURITY.md) and the feature is not present there
required: true
- type: textarea
attributes:
label: Is your proposal related to a problem?
description: |
Provide a clear and concise description of what the problem is.
For example, "I'm always frustrated when..."
validations:
required: false
- type: textarea
attributes:
label: Describe the feature you're interested in
description: |
Provide a clear and concise description of what you want to happen.
validations:
required: true
- type: textarea
attributes:
label: Describe alternatives you've considered
description: |
Let us know about other solutions you've tried or researched.
validations:
required: false
- type: input
attributes:
label: Version you're running
description: |
Please provide the app version you're currently running:
1. App version (commit hash in the top left corner of the UI)
validations:
required: true
- type: textarea
attributes:
label: Additional context
description: |
Is there anything else you can add about the proposal?
You might want to link to related issues here, if you haven't already.
validations:
required: false
================================================
FILE: .github/PULL_REQUEST_TEMPLATE.md
================================================
- [ ] **Breaking change?** (if so, please describe the impact and migration path for existing application instances)
**What changes did you make?** (Give an overview)
**Is there anything you'd like reviewers to focus on?**
**How Has This Been Tested?** (put an "x" (case-sensitive!) next to an item)
- [ ] No need to
- [ ] Manually (please, describe, if necessary)
- [ ] Unit checks
- [ ] Integration checks
- [ ] Covered by existing automation
**Checklist** (put an "x" (case-sensitive!) next to all the items, otherwise the build will fail)
- [ ] I have performed a self-review of my own code
- [ ] I have commented my code, particularly in hard-to-understand areas
- [ ] I have made corresponding changes to the documentation (e.g. **ENVIRONMENT VARIABLES**)
- [ ] My changes generate no new warnings (e.g. Sonar is happy)
- [ ] I have added tests that prove my fix is effective or that my feature works
- [ ] New and existing unit tests pass locally with my changes
- [ ] Any dependent changes have been merged
Check out [Contributing](https://github.com/provectus/kafka-ui/blob/master/CONTRIBUTING.md) and [Code of Conduct](https://github.com/provectus/kafka-ui/blob/master/CODE-OF-CONDUCT.md)
**A picture of a cute animal (not mandatory but encouraged)**
================================================
FILE: .github/dependabot.yml
================================================
version: 2
updates:
- package-ecosystem: maven
directory: "/"
schedule:
interval: daily
time: "10:00"
timezone: Europe/Moscow
reviewers:
- "Haarolean"
labels:
- "scope/backend"
- "type/dependencies"
- package-ecosystem: npm
directory: "/kafka-ui-react-app"
schedule:
interval: weekly
time: "10:00"
timezone: Europe/Moscow
open-pull-requests-limit: 10
versioning-strategy: increase-if-necessary
labels:
- "scope/frontend"
- "type/dependencies"
ignore:
- dependency-name: react-hook-form
versions:
- 6.15.5
- 7.0.0
- 7.0.6
- dependency-name: "@hookform/error-message"
versions:
- 1.1.0
- dependency-name: use-debounce
versions:
- 6.0.0
- 6.0.1
- dependency-name: "@rooks/use-outside-click-ref"
versions:
- 4.10.1
- dependency-name: react-multi-select-component
versions:
- 3.1.6
- 4.0.0
- dependency-name: husky
versions:
- 5.1.3
- 5.2.0
- 6.0.0
- dependency-name: "@types/node-fetch"
versions:
- 2.5.9
- dependency-name: "@testing-library/jest-dom"
versions:
- 5.11.10
- dependency-name: "@typescript-eslint/eslint-plugin"
versions:
- 4.20.0
- dependency-name: "@openapitools/openapi-generator-cli"
versions:
- 2.2.5
- dependency-name: "@typescript-eslint/parser"
versions:
- 4.20.0
- dependency-name: react-datepicker
versions:
- 3.7.0
- dependency-name: eslint
versions:
- 7.23.0
- dependency-name: "@testing-library/user-event"
versions:
- 13.0.6
- dependency-name: immer
versions:
- 9.0.1
- dependency-name: react-scripts
versions:
- 4.0.3
- dependency-name: eslint-config-prettier
versions:
- 8.1.0
- dependency-name: "@testing-library/react"
versions:
- 11.2.5
- dependency-name: lodash
versions:
- 4.17.21
- dependency-name: react-json-tree
versions:
- 0.15.0
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: weekly
time: "10:00"
timezone: Europe/Moscow
reviewers:
- "Haarolean"
labels:
- "scope/infrastructure"
- "type/dependencies"
================================================
FILE: .github/release_drafter.yaml
================================================
name-template: '$RESOLVED_VERSION'
tag-template: 'v$RESOLVED_VERSION'
template: |
## Changes
$CHANGES
## Contributors
$CONTRIBUTORS
exclude-labels:
- 'scope/infrastructure'
- 'scope/QA'
- 'scope/AQA'
- 'type/dependencies'
- 'type/chore'
- 'type/documentation'
- 'type/refactoring'
categories:
- title: '🚩 Breaking Changes'
labels:
- 'impact/changelog'
- title: '⚙️Features'
labels:
- 'type/feature'
- title: '🪛Enhancements'
labels:
- 'type/enhancement'
- title: '🔨Bug Fixes'
labels:
- 'type/bug'
- title: 'Security'
labels:
- 'type/security'
- title: '⎈ Helm/K8S Changes'
labels:
- 'scope/k8s'
change-template: '- $TITLE @$AUTHOR (#$NUMBER)'
version-resolver:
major:
labels:
- 'major'
minor:
labels:
- 'minor'
patch:
labels:
- 'patch'
default: patch
================================================
FILE: .github/workflows/aws_publisher.yaml
================================================
name: "Infra: Release: AWS Marketplace Publisher"
on:
workflow_dispatch:
inputs:
KafkaUIInfraBranch:
description: 'Branch name of Kafka-UI-Infra repo, build commands will be executed from this branch'
required: true
default: 'master'
KafkaUIReleaseVersion:
description: 'Version of KafkaUI'
required: true
default: '0.3.2'
PublishOnMarketplace:
description: 'If set to true, the request to update AWS Server product version will be raised'
required: true
default: false
type: boolean
jobs:
build-ami:
name: Build AMI
runs-on: ubuntu-latest
steps:
- name: Clone infra repo
run: |
echo "Cloning repo..."
git clone https://infra-tech:${{ secrets.INFRA_USER_ACCESS_TOKEN }}@github.com/provectus/kafka-ui-infra.git --branch ${{ github.event.inputs.KafkaUIInfraBranch }}
echo "Cd to packer DIR..."
cd kafka-ui-infra/ami
echo "WORK_DIR=$(pwd)" >> $GITHUB_ENV
echo "Packer will be triggered in this dir $WORK_DIR"
- name: Configure AWS credentials for Kafka-UI account
uses: aws-actions/configure-aws-credentials@v3
with:
aws-access-key-id: ${{ secrets.AWS_AMI_PUBLISH_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_AMI_PUBLISH_KEY_SECRET }}
aws-region: us-east-1
# validate templates
- name: Validate Template
uses: hashicorp/packer-github-actions@master
with:
command: validate
arguments: -syntax-only
target: kafka-ui-infra/ami/kafka-ui.pkr.hcl
# build artifact
- name: Build Artifact
uses: hashicorp/packer-github-actions@master
with:
command: build
arguments: "-color=false -on-error=abort -var=kafka_ui_release_version=${{ github.event.inputs.KafkaUIReleaseVersion }}"
target: kafka-ui.pkr.hcl
working_directory: ${{ env.WORK_DIR }}
env:
PACKER_LOG: 1
# add fresh AMI to AWS Marketplace
- name: Publish Artifact at Marketplace
if: ${{ github.event.inputs.PublishOnMarketplace == 'true' }}
env:
PRODUCT_ID: ${{ secrets.AWS_SERVER_PRODUCT_ID }}
RELEASE_VERSION: "${{ github.event.inputs.KafkaUIReleaseVersion }}"
RELEASE_NOTES: "https://github.com/provectus/kafka-ui/releases/tag/v${{ github.event.inputs.KafkaUIReleaseVersion }}"
MP_ROLE_ARN: ${{ secrets.AWS_MARKETPLACE_AMI_ACCESS_ROLE }} # https://docs.aws.amazon.com/marketplace/latest/userguide/ami-single-ami-products.html#single-ami-marketplace-ami-access
AMI_OS_VERSION: "amzn2-ami-kernel-5.10-hvm-*-x86_64-gp2"
run: |
set -x
pwd
ls -la kafka-ui-infra/ami
echo $WORK_DIR/manifest.json
export AMI_ID=$(jq -r '.builds[-1].artifact_id' kafka-ui-infra/ami/manifest.json | cut -d ":" -f2)
/bin/bash kafka-ui-infra/aws-marketplace/prepare_changeset.sh > changeset.json
aws marketplace-catalog start-change-set \
--catalog "AWSMarketplace" \
--change-set "$(cat changeset.json)"
================================================
FILE: .github/workflows/backend.yml
================================================
name: "Backend: PR/master build & test"
on:
push:
branches:
- master
pull_request_target:
types: ["opened", "edited", "reopened", "synchronize"]
paths:
- "kafka-ui-api/**"
- "pom.xml"
permissions:
checks: write
pull-requests: write
jobs:
build-and-test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
with:
fetch-depth: 0
ref: ${{ github.event.pull_request.head.sha }}
- name: Set up JDK
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'zulu'
cache: 'maven'
- name: Cache SonarCloud packages
uses: actions/cache@v3
with:
path: ~/.sonar/cache
key: ${{ runner.os }}-sonar
restore-keys: ${{ runner.os }}-sonar
- name: Build and analyze pull request target
if: ${{ github.event_name == 'pull_request' }}
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN_BACKEND }}
HEAD_REF: ${{ github.head_ref }}
BASE_REF: ${{ github.base_ref }}
run: |
./mvnw -B -ntp versions:set -DnewVersion=${{ github.event.pull_request.head.sha }}
./mvnw -B -V -ntp verify org.sonarsource.scanner.maven:sonar-maven-plugin:sonar \
-Dsonar.projectKey=com.provectus:kafka-ui_backend \
-Dsonar.pullrequest.key=${{ github.event.pull_request.number }} \
-Dsonar.pullrequest.branch=$HEAD_REF \
-Dsonar.pullrequest.base=$BASE_REF
- name: Build and analyze push master
if: ${{ github.event_name == 'push' }}
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN_BACKEND }}
run: |
./mvnw -B -ntp versions:set -DnewVersion=$GITHUB_SHA
./mvnw -B -V -ntp verify org.sonarsource.scanner.maven:sonar-maven-plugin:sonar \
-Dsonar.projectKey=com.provectus:kafka-ui_backend
================================================
FILE: .github/workflows/block_merge.yml
================================================
name: "Infra: PR block merge"
on:
pull_request:
types: [opened, labeled, unlabeled, synchronize]
jobs:
block_merge:
runs-on: ubuntu-latest
steps:
- uses: mheap/github-action-required-labels@v5
with:
mode: exactly
count: 0
labels: "status/blocked, status/needs-attention, status/on-hold, status/pending, status/triage, status/pending-backend, status/pending-frontend, status/pending-QA"
================================================
FILE: .github/workflows/branch-deploy.yml
================================================
name: "Infra: Feature Testing: Init env"
on:
workflow_dispatch:
pull_request:
types: ['labeled']
jobs:
build:
if: ${{ github.event.label.name == 'status/feature_testing' || github.event.label.name == 'status/feature_testing_public' }}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
with:
ref: ${{ github.event.pull_request.head.sha }}
- name: get branch name
id: extract_branch
run: |
tag='pr${{ github.event.pull_request.number }}'
echo "tag=${tag}" >> $GITHUB_OUTPUT
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Set up JDK
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'zulu'
cache: 'maven'
- name: Build
id: build
run: |
./mvnw -B -ntp versions:set -DnewVersion=$GITHUB_SHA
./mvnw -B -V -ntp clean package -Pprod -DskipTests
export VERSION=$(./mvnw -q -Dexec.executable=echo -Dexec.args='${project.version}' --non-recursive exec:exec)
echo "version=${VERSION}" >> $GITHUB_OUTPUT
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
- name: Set up Docker Buildx
id: buildx
uses: docker/setup-buildx-action@v2
- name: Cache Docker layers
uses: actions/cache@v3
with:
path: /tmp/.buildx-cache
key: ${{ runner.os }}-buildx-${{ github.sha }}
restore-keys: |
${{ runner.os }}-buildx-
- name: Configure AWS credentials for Kafka-UI account
uses: aws-actions/configure-aws-credentials@v3
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: eu-central-1
- name: Login to Amazon ECR
id: login-ecr
uses: aws-actions/amazon-ecr-login@v1
- name: Build and push
id: docker_build_and_push
uses: docker/build-push-action@v4
with:
builder: ${{ steps.buildx.outputs.name }}
context: kafka-ui-api
push: true
tags: 297478128798.dkr.ecr.eu-central-1.amazonaws.com/kafka-ui:${{ steps.extract_branch.outputs.tag }}
build-args: |
JAR_FILE=kafka-ui-api-${{ steps.build.outputs.version }}.jar
cache-from: type=local,src=/tmp/.buildx-cache
cache-to: type=local,dest=/tmp/.buildx-cache
outputs:
tag: ${{ steps.extract_branch.outputs.tag }}
make-branch-env:
needs: build
runs-on: ubuntu-latest
steps:
- name: clone
run: |
git clone https://infra-tech:${{ secrets.INFRA_USER_ACCESS_TOKEN }}@github.com/provectus/kafka-ui-infra.git --branch envs
- name: create deployment
run: |
cd kafka-ui-infra/aws-infrastructure4eks/argocd/scripts
echo "Branch:${{ needs.build.outputs.tag }}"
./kafka-ui-deployment-from-branch.sh ${{ needs.build.outputs.tag }} ${{ github.event.label.name }} ${{ secrets.FEATURE_TESTING_UI_PASSWORD }}
git config --global user.email "infra-tech@provectus.com"
git config --global user.name "infra-tech"
git add ../kafka-ui-from-branch/
git commit -m "added env:${{ needs.build.outputs.deploy }}" && git push || true
- name: update status check for private deployment
if: ${{ github.event.label.name == 'status/feature_testing' }}
uses: Sibz/github-status-action@v1.1.6
with:
authToken: ${{secrets.GITHUB_TOKEN}}
context: "Click Details button to open custom deployment page"
state: "success"
sha: ${{ github.event.pull_request.head.sha || github.sha }}
target_url: "http://${{ needs.build.outputs.tag }}.internal.kafka-ui.provectus.io"
- name: update status check for public deployment
if: ${{ github.event.label.name == 'status/feature_testing_public' }}
uses: Sibz/github-status-action@v1.1.6
with:
authToken: ${{secrets.GITHUB_TOKEN}}
context: "Click Details button to open custom deployment page"
state: "success"
sha: ${{ github.event.pull_request.head.sha || github.sha }}
target_url: "http://${{ needs.build.outputs.tag }}.internal.kafka-ui.provectus.io"
================================================
FILE: .github/workflows/branch-remove.yml
================================================
name: "Infra: Feature Testing: Destroy env"
on:
workflow_dispatch:
pull_request:
types: ['unlabeled', 'closed']
jobs:
remove:
runs-on: ubuntu-latest
if: ${{ (github.event.label.name == 'status/feature_testing' || github.event.label.name == 'status/feature_testing_public') || (github.event.action == 'closed' && (contains(github.event.pull_request.labels.*.name, 'status/feature_testing') || contains(github.event.pull_request.labels.*.name, 'status/feature_testing_public'))) }}
steps:
- uses: actions/checkout@v3
- name: clone
run: |
git clone https://infra-tech:${{ secrets.INFRA_USER_ACCESS_TOKEN }}@github.com/provectus/kafka-ui-infra.git --branch envs
- name: remove env
run: |
cd kafka-ui-infra/aws-infrastructure4eks/argocd/scripts
./delete-env.sh pr${{ github.event.pull_request.number }} || true
git config --global user.email "infra-tech@provectus.com"
git config --global user.name "infra-tech"
git add ../kafka-ui-from-branch/
git commit -m "removed env:${{ needs.build.outputs.deploy }}" && git push || true
================================================
FILE: .github/workflows/build-public-image.yml
================================================
name: "Infra: Image Testing: Deploy"
on:
workflow_dispatch:
pull_request:
types: ['labeled']
jobs:
build:
if: ${{ github.event.label.name == 'status/image_testing' }}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
with:
ref: ${{ github.event.pull_request.head.sha }}
- name: get branch name
id: extract_branch
run: |
tag='${{ github.event.pull_request.number }}'
echo "tag=${tag}" >> $GITHUB_OUTPUT
- name: Set up JDK
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'zulu'
cache: 'maven'
- name: Build
id: build
run: |
./mvnw -B -ntp versions:set -DnewVersion=$GITHUB_SHA
./mvnw -B -V -ntp clean package -Pprod -DskipTests
export VERSION=$(./mvnw -q -Dexec.executable=echo -Dexec.args='${project.version}' --non-recursive exec:exec)
echo "version=${VERSION}" >> $GITHUB_OUTPUT
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
- name: Set up Docker Buildx
id: buildx
uses: docker/setup-buildx-action@v2
- name: Cache Docker layers
uses: actions/cache@v3
with:
path: /tmp/.buildx-cache
key: ${{ runner.os }}-buildx-${{ github.sha }}
restore-keys: |
${{ runner.os }}-buildx-
- name: Configure AWS credentials for Kafka-UI account
uses: aws-actions/configure-aws-credentials@v3
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: us-east-1
- name: Login to Amazon ECR
id: login-ecr
uses: aws-actions/amazon-ecr-login@v1
with:
registry-type: 'public'
- name: Build and push
id: docker_build_and_push
uses: docker/build-push-action@v4
with:
builder: ${{ steps.buildx.outputs.name }}
context: kafka-ui-api
push: true
tags: public.ecr.aws/provectus/kafka-ui-custom-build:${{ steps.extract_branch.outputs.tag }}
build-args: |
JAR_FILE=kafka-ui-api-${{ steps.build.outputs.version }}.jar
cache-from: type=local,src=/tmp/.buildx-cache
cache-to: type=local,dest=/tmp/.buildx-cache
- name: make comment with private deployment link
uses: peter-evans/create-or-update-comment@v3
with:
issue-number: ${{ github.event.pull_request.number }}
body: |
Image published at public.ecr.aws/provectus/kafka-ui-custom-build:${{ steps.extract_branch.outputs.tag }}
outputs:
tag: ${{ steps.extract_branch.outputs.tag }}
================================================
FILE: .github/workflows/codeql-analysis.yml
================================================
# For most projects, this workflow file will not need changing; you simply need
# to commit it to your repository.
#
# You may wish to alter this file to override the set of languages analyzed,
# or to provide custom queries or build logic.
#
# ******** NOTE ********
# We have attempted to detect the languages in your repository. Please check
# the `language` matrix defined below to confirm you have the correct set of
# supported CodeQL languages.
#
name: "CodeQL"
on:
push:
branches: [ master ]
pull_request:
# The branches below must be a subset of the branches above
branches: [ master ]
paths:
- 'kafka-ui-contract/**'
- 'kafka-ui-react-app/**'
- 'kafka-ui-api/**'
- 'kafka-ui-serde-api/**'
schedule:
- cron: '39 15 * * 6'
jobs:
analyze:
name: Analyze
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
language: [ 'javascript', 'java' ]
# CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python' ]
# Learn more:
# https://docs.github.com/en/free-pro-team@latest/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#changing-the-languages-that-are-analyzed
steps:
- name: Checkout repository
uses: actions/checkout@v3
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@v2
with:
languages: ${{ matrix.language }}
# If you wish to specify custom queries, you can do so here or in a config file.
# By default, queries listed here will override any specified in a config file.
# Prefix the list here with "+" to use these queries and those in the config file.
# queries: ./path/to/local/query, your-org/your-repo/queries@main
- name: Set up JDK
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'zulu'
cache: 'maven'
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
# If this step fails, then you should remove it and run the build manually (see below)
- name: Autobuild
uses: github/codeql-action/autobuild@v2
# ℹ️ Command-line programs to run using the OS shell.
# 📚 https://git.io/JvXDl
# ✏️ If the Autobuild fails above, remove it and uncomment the following three lines
# and modify them (or add more) to build your code if your project
# uses a compiled language
#- run: |
# make bootstrap
# make release
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v2
================================================
FILE: .github/workflows/cve.yaml
================================================
name: CVE checks docker master
on:
workflow_dispatch:
schedule:
# * is a special character in YAML so you have to quote this string
- cron: '0 8 15 * *'
jobs:
build-and-test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up JDK
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'zulu'
cache: 'maven'
- name: Build project
id: build
run: |
./mvnw -B -ntp versions:set -DnewVersion=$GITHUB_SHA
./mvnw -B -V -ntp clean package -DskipTests
export VERSION=$(./mvnw -q -Dexec.executable=echo -Dexec.args='${project.version}' --non-recursive exec:exec)
echo "version=${VERSION}" >> $GITHUB_OUTPUT
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Cache Docker layers
uses: actions/cache@v3
with:
path: /tmp/.buildx-cache
key: ${{ runner.os }}-buildx-${{ github.sha }}
restore-keys: |
${{ runner.os }}-buildx-
- name: Build docker image
uses: docker/build-push-action@v4
with:
builder: ${{ steps.buildx.outputs.name }}
context: kafka-ui-api
platforms: linux/amd64
push: false
load: true
tags: |
provectuslabs/kafka-ui:${{ steps.build.outputs.version }}
build-args: |
JAR_FILE=kafka-ui-api-${{ steps.build.outputs.version }}.jar
cache-from: type=local,src=/tmp/.buildx-cache
cache-to: type=local,dest=/tmp/.buildx-cache
- name: Run CVE checks
uses: aquasecurity/trivy-action@0.12.0
with:
image-ref: "provectuslabs/kafka-ui:${{ steps.build.outputs.version }}"
format: "table"
exit-code: "1"
================================================
FILE: .github/workflows/delete-public-image.yml
================================================
name: "Infra: Image Testing: Delete"
on:
workflow_dispatch:
pull_request:
types: ['unlabeled', 'closed']
jobs:
remove:
if: ${{ github.event.label.name == 'status/image_testing' || ( github.event.action == 'closed' && (contains(github.event.pull_request.labels, 'status/image_testing'))) }}
runs-on: ubuntu-latest
steps:
- name: get branch name
id: extract_branch
run: |
echo
tag='${{ github.event.pull_request.number }}'
echo "tag=${tag}" >> $GITHUB_OUTPUT
- name: Configure AWS credentials for Kafka-UI account
uses: aws-actions/configure-aws-credentials@v3
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: us-east-1
- name: Login to Amazon ECR
id: login-ecr
uses: aws-actions/amazon-ecr-login@v1
with:
registry-type: 'public'
- name: Remove from ECR
id: remove_from_ecr
run: |
aws ecr-public batch-delete-image \
--repository-name kafka-ui-custom-build \
--image-ids imageTag=${{ steps.extract_branch.outputs.tag }} \
--region us-east-1
================================================
FILE: .github/workflows/documentation.yaml
================================================
name: "Infra: Docs: URL linter"
on:
pull_request:
types:
- opened
- labeled
- reopened
- synchronize
paths:
- 'documentation/**'
- '**.md'
jobs:
build-and-test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Check URLs in files
uses: urlstechie/urlchecker-action@0.0.34
with:
exclude_patterns: localhost,127.0.,192.168.
exclude_urls: https://api.server,https://graph.microsoft.com/User.Read,https://dev-a63ggcut.auth0.com/,http://main-schema-registry:8081,http://schema-registry:8081,http://another-yet-schema-registry:8081,http://another-schema-registry:8081
print_all: false
file_types: .md
================================================
FILE: .github/workflows/e2e-automation.yml
================================================
name: "E2E: Automation suite"
on:
workflow_dispatch:
inputs:
test_suite:
description: 'Select test suite to run'
default: 'regression'
required: true
type: choice
options:
- regression
- sanity
- smoke
qase_token:
description: 'Set Qase token to enable integration'
required: false
type: string
jobs:
build-and-test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
with:
ref: ${{ github.sha }}
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v3
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: eu-central-1
- name: Set up environment
id: set_env_values
run: |
cat "./kafka-ui-e2e-checks/.env.ci" >> "./kafka-ui-e2e-checks/.env"
- name: Pull with Docker
id: pull_chrome
run: |
docker pull selenoid/vnc_chrome:103.0
- name: Set up JDK
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'zulu'
cache: 'maven'
- name: Build with Maven
id: build_app
run: |
./mvnw -B -ntp versions:set -DnewVersion=${{ github.sha }}
./mvnw -B -V -ntp clean install -Pprod -Dmaven.test.skip=true ${{ github.event.inputs.extraMavenOptions }}
- name: Compose with Docker
id: compose_app
# use the following command until #819 will be fixed
run: |
docker-compose -f kafka-ui-e2e-checks/docker/selenoid-git.yaml up -d
docker-compose -f ./documentation/compose/e2e-tests.yaml up -d
- name: Run test suite
run: |
./mvnw -B -ntp versions:set -DnewVersion=${{ github.sha }}
./mvnw -B -V -ntp -DQASEIO_API_TOKEN=${{ github.event.inputs.qase_token }} -Dsurefire.suiteXmlFiles='src/test/resources/${{ github.event.inputs.test_suite }}.xml' -Dsuite=${{ github.event.inputs.test_suite }} -f 'kafka-ui-e2e-checks' test -Pprod
- name: Generate Allure report
uses: simple-elf/allure-report-action@master
if: always()
id: allure-report
with:
allure_results: ./kafka-ui-e2e-checks/allure-results
gh_pages: allure-results
allure_report: allure-report
subfolder: allure-results
report_url: "http://kafkaui-allure-reports.s3-website.eu-central-1.amazonaws.com"
- uses: jakejarvis/s3-sync-action@master
if: always()
env:
AWS_S3_BUCKET: 'kafkaui-allure-reports'
AWS_REGION: 'eu-central-1'
SOURCE_DIR: 'allure-history/allure-results'
- name: Deploy report to Amazon S3
if: always()
uses: Sibz/github-status-action@v1.1.6
with:
authToken: ${{secrets.GITHUB_TOKEN}}
context: "Click Details button to open Allure report"
state: "success"
sha: ${{ github.sha }}
target_url: http://kafkaui-allure-reports.s3-website.eu-central-1.amazonaws.com/${{ github.run_number }}
- name: Dump Docker logs on failure
if: failure()
uses: jwalton/gh-docker-logs@v2.2.1
================================================
FILE: .github/workflows/e2e-checks.yaml
================================================
name: "E2E: PR healthcheck"
on:
pull_request_target:
types: [ "opened", "edited", "reopened", "synchronize" ]
paths:
- "kafka-ui-api/**"
- "kafka-ui-contract/**"
- "kafka-ui-react-app/**"
- "kafka-ui-e2e-checks/**"
- "pom.xml"
permissions:
statuses: write
jobs:
build-and-test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
with:
ref: ${{ github.event.pull_request.head.sha }}
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v3
with:
aws-access-key-id: ${{ secrets.S3_AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.S3_AWS_SECRET_ACCESS_KEY }}
aws-region: eu-central-1
- name: Set up environment
id: set_env_values
run: |
cat "./kafka-ui-e2e-checks/.env.ci" >> "./kafka-ui-e2e-checks/.env"
- name: Pull with Docker
id: pull_chrome
run: |
docker pull selenoid/vnc_chrome:103.0
- name: Set up JDK
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'zulu'
cache: 'maven'
- name: Build with Maven
id: build_app
run: |
./mvnw -B -ntp versions:set -DnewVersion=${{ github.event.pull_request.head.sha }}
./mvnw -B -V -ntp clean install -Pprod -Dmaven.test.skip=true ${{ github.event.inputs.extraMavenOptions }}
- name: Compose with Docker
id: compose_app
# use the following command until #819 will be fixed
run: |
docker-compose -f kafka-ui-e2e-checks/docker/selenoid-git.yaml up -d
docker-compose -f ./documentation/compose/e2e-tests.yaml up -d && until [ "$(docker exec kafka-ui wget --spider --server-response http://localhost:8080/actuator/health 2>&1 | grep -c 'HTTP/1.1 200 OK')" == "1" ]; do echo "Waiting for kafka-ui ..." && sleep 1; done
- name: Run test suite
run: |
./mvnw -B -ntp versions:set -DnewVersion=${{ github.event.pull_request.head.sha }}
./mvnw -B -V -ntp -Dsurefire.suiteXmlFiles='src/test/resources/smoke.xml' -f 'kafka-ui-e2e-checks' test -Pprod
- name: Generate allure report
uses: simple-elf/allure-report-action@master
if: always()
id: allure-report
with:
allure_results: ./kafka-ui-e2e-checks/allure-results
gh_pages: allure-results
allure_report: allure-report
subfolder: allure-results
report_url: "http://kafkaui-allure-reports.s3-website.eu-central-1.amazonaws.com"
- uses: jakejarvis/s3-sync-action@master
if: always()
env:
AWS_S3_BUCKET: 'kafkaui-allure-reports'
AWS_REGION: 'eu-central-1'
SOURCE_DIR: 'allure-history/allure-results'
- name: Deploy report to Amazon S3
if: always()
uses: Sibz/github-status-action@v1.1.6
with:
authToken: ${{secrets.GITHUB_TOKEN}}
context: "Click Details button to open Allure report"
state: "success"
sha: ${{ github.event.pull_request.head.sha || github.sha }}
target_url: http://kafkaui-allure-reports.s3-website.eu-central-1.amazonaws.com/${{ github.run_number }}
- name: Dump docker logs on failure
if: failure()
uses: jwalton/gh-docker-logs@v2.2.1
================================================
FILE: .github/workflows/e2e-manual.yml
================================================
name: "E2E: Manual suite"
on:
workflow_dispatch:
inputs:
test_suite:
description: 'Select test suite to run'
default: 'manual'
required: true
type: choice
options:
- manual
- qase
qase_token:
description: 'Set Qase token to enable integration'
required: true
type: string
jobs:
build-and-test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
with:
ref: ${{ github.sha }}
- name: Set up environment
id: set_env_values
run: |
cat "./kafka-ui-e2e-checks/.env.ci" >> "./kafka-ui-e2e-checks/.env"
- name: Set up JDK
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'zulu'
cache: 'maven'
- name: Build with Maven
id: build_app
run: |
./mvnw -B -ntp versions:set -DnewVersion=${{ github.sha }}
./mvnw -B -V -ntp clean install -Pprod -Dmaven.test.skip=true ${{ github.event.inputs.extraMavenOptions }}
- name: Run test suite
run: |
./mvnw -B -ntp versions:set -DnewVersion=${{ github.sha }}
./mvnw -B -V -ntp -DQASEIO_API_TOKEN=${{ github.event.inputs.qase_token }} -Dsurefire.suiteXmlFiles='src/test/resources/${{ github.event.inputs.test_suite }}.xml' -Dsuite=${{ github.event.inputs.test_suite }} -f 'kafka-ui-e2e-checks' test -Pprod
================================================
FILE: .github/workflows/e2e-weekly.yml
================================================
name: "E2E: Weekly suite"
on:
schedule:
- cron: '0 1 * * 1'
jobs:
build-and-test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
with:
ref: ${{ github.sha }}
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v3
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: eu-central-1
- name: Set up environment
id: set_env_values
run: |
cat "./kafka-ui-e2e-checks/.env.ci" >> "./kafka-ui-e2e-checks/.env"
- name: Pull with Docker
id: pull_chrome
run: |
docker pull selenoid/vnc_chrome:103.0
- name: Set up JDK
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'zulu'
cache: 'maven'
- name: Build with Maven
id: build_app
run: |
./mvnw -B -ntp versions:set -DnewVersion=${{ github.sha }}
./mvnw -B -V -ntp clean install -Pprod -Dmaven.test.skip=true ${{ github.event.inputs.extraMavenOptions }}
- name: Compose with Docker
id: compose_app
# use the following command until #819 will be fixed
run: |
docker-compose -f kafka-ui-e2e-checks/docker/selenoid-git.yaml up -d
docker-compose -f ./documentation/compose/e2e-tests.yaml up -d
- name: Run test suite
run: |
./mvnw -B -ntp versions:set -DnewVersion=${{ github.sha }}
./mvnw -B -V -ntp -DQASEIO_API_TOKEN=${{ secrets.QASEIO_API_TOKEN }} -Dsurefire.suiteXmlFiles='src/test/resources/sanity.xml' -Dsuite=weekly -f 'kafka-ui-e2e-checks' test -Pprod
- name: Generate Allure report
uses: simple-elf/allure-report-action@master
if: always()
id: allure-report
with:
allure_results: ./kafka-ui-e2e-checks/allure-results
gh_pages: allure-results
allure_report: allure-report
subfolder: allure-results
report_url: "http://kafkaui-allure-reports.s3-website.eu-central-1.amazonaws.com"
- uses: jakejarvis/s3-sync-action@master
if: always()
env:
AWS_S3_BUCKET: 'kafkaui-allure-reports'
AWS_REGION: 'eu-central-1'
SOURCE_DIR: 'allure-history/allure-results'
- name: Deploy report to Amazon S3
if: always()
uses: Sibz/github-status-action@v1.1.6
with:
authToken: ${{secrets.GITHUB_TOKEN}}
context: "Click Details button to open Allure report"
state: "success"
sha: ${{ github.sha }}
target_url: http://kafkaui-allure-reports.s3-website.eu-central-1.amazonaws.com/${{ github.run_number }}
- name: Dump Docker logs on failure
if: failure()
uses: jwalton/gh-docker-logs@v2.2.1
================================================
FILE: .github/workflows/frontend.yaml
================================================
name: "Frontend: PR/master build & test"
on:
push:
branches:
- master
pull_request_target:
types: ["opened", "edited", "reopened", "synchronize"]
paths:
- "kafka-ui-contract/**"
- "kafka-ui-react-app/**"
permissions:
checks: write
pull-requests: write
jobs:
build-and-test:
env:
CI: true
NODE_ENV: dev
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
with:
# Disabling shallow clone is recommended for improving relevancy of reporting
fetch-depth: 0
ref: ${{ github.event.pull_request.head.sha }}
- uses: pnpm/action-setup@v2.4.0
with:
version: 8.6.12
- name: Install node
uses: actions/setup-node@v3.8.1
with:
node-version: "18.17.1"
cache: "pnpm"
cache-dependency-path: "./kafka-ui-react-app/pnpm-lock.yaml"
- name: Install Node dependencies
run: |
cd kafka-ui-react-app/
pnpm install --frozen-lockfile
- name: Generate sources
run: |
cd kafka-ui-react-app/
pnpm gen:sources
- name: Linter
run: |
cd kafka-ui-react-app/
pnpm lint:CI
- name: Tests
run: |
cd kafka-ui-react-app/
pnpm test:CI
- name: SonarCloud Scan
uses: sonarsource/sonarcloud-github-action@master
with:
projectBaseDir: ./kafka-ui-react-app
args: -Dsonar.pullrequest.key=${{ github.event.pull_request.number }} -Dsonar.pullrequest.branch=${{ github.head_ref }} -Dsonar.pullrequest.base=${{ github.base_ref }}
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN_FRONTEND }}
================================================
FILE: .github/workflows/master.yaml
================================================
name: "Master: Build & deploy"
on:
workflow_dispatch:
push:
branches: [ "master" ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
with:
ref: ${{ github.event.pull_request.head.sha }}
- name: Set up JDK
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'zulu'
cache: 'maven'
- name: Build
id: build
run: |
./mvnw -B -ntp versions:set -DnewVersion=$GITHUB_SHA
./mvnw -V -B -ntp clean package -Pprod -DskipTests
export VERSION=$(./mvnw -q -Dexec.executable=echo -Dexec.args='${project.version}' --non-recursive exec:exec)
echo "version=${VERSION}" >> $GITHUB_OUTPUT
#################
# #
# Docker images #
# #
#################
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Cache Docker layers
uses: actions/cache@v3
with:
path: /tmp/.buildx-cache
key: ${{ runner.os }}-buildx-${{ github.sha }}
restore-keys: |
${{ runner.os }}-buildx-
- name: Login to DockerHub
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Build and push
id: docker_build_and_push
uses: docker/build-push-action@v4
with:
builder: ${{ steps.buildx.outputs.name }}
context: kafka-ui-api
platforms: linux/amd64,linux/arm64
provenance: false
push: true
tags: |
provectuslabs/kafka-ui:${{ steps.build.outputs.version }}
provectuslabs/kafka-ui:master
build-args: |
JAR_FILE=kafka-ui-api-${{ steps.build.outputs.version }}.jar
cache-from: type=local,src=/tmp/.buildx-cache
cache-to: type=local,dest=/tmp/.buildx-cache
#################################
# #
# Master image digest update #
# #
#################################
- name: update-master-deployment
run: |
git clone https://infra-tech:${{ secrets.INFRA_USER_ACCESS_TOKEN }}@github.com/provectus/kafka-ui-infra.git --branch master
cd kafka-ui-infra/aws-infrastructure4eks/argocd/scripts
echo "Image digest is:${{ steps.docker_build_and_push.outputs.digest }}"
./kafka-ui-update-master-digest.sh ${{ steps.docker_build_and_push.outputs.digest }}
git config --global user.email "infra-tech@provectus.com"
git config --global user.name "infra-tech"
git add ../kafka-ui/*
git commit -m "updated master image digest: ${{ steps.docker_build_and_push.outputs.digest }}" && git push
================================================
FILE: .github/workflows/pr-checks.yaml
================================================
name: "PR: Checklist linter"
on:
pull_request_target:
types: [opened, edited, synchronize, reopened]
permissions:
checks: write
jobs:
task-check:
runs-on: ubuntu-latest
steps:
- uses: kentaro-m/task-completed-checker-action@v0.1.2
with:
repo-token: "${{ secrets.GITHUB_TOKEN }}"
- uses: dekinderfiets/pr-description-enforcer@0.0.1
with:
repo-token: "${{ secrets.GITHUB_TOKEN }}"
================================================
FILE: .github/workflows/release-serde-api.yaml
================================================
name: "Infra: Release: Serde API"
on: workflow_dispatch
jobs:
release-serde-api:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
with:
fetch-depth: 0
- run: |
git config user.name github-actions
git config user.email github-actions@github.com
- name: Set up JDK
uses: actions/setup-java@v3
with:
java-version: "17"
distribution: "zulu"
cache: "maven"
- id: install-secret-key
name: Install GPG secret key
run: |
cat <(echo -e "${{ secrets.GPG_PRIVATE_KEY }}") | gpg --batch --import
- name: Publish to Maven Central
run: |
mvn source:jar javadoc:jar package gpg:sign -Dgpg.passphrase=${{ secrets.GPG_PASSPHRASE }} -Dserver.username=${{ secrets.NEXUS_USERNAME }} -Dserver.password=${{ secrets.NEXUS_PASSWORD }} nexus-staging:deploy -pl kafka-ui-serde-api -s settings.xml
================================================
FILE: .github/workflows/release.yaml
================================================
name: "Infra: Release"
on:
release:
types: [published]
jobs:
release:
runs-on: ubuntu-latest
outputs:
version: ${{steps.build.outputs.version}}
steps:
- uses: actions/checkout@v3
with:
fetch-depth: 0
ref: ${{ github.event.pull_request.head.sha }}
- run: |
git config user.name github-actions
git config user.email github-actions@github.com
- name: Set up JDK
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'zulu'
cache: 'maven'
- name: Build with Maven
id: build
run: |
./mvnw -B -ntp versions:set -DnewVersion=${{ github.event.release.tag_name }}
./mvnw -B -V -ntp clean package -Pprod -DskipTests
export VERSION=$(./mvnw -q -Dexec.executable=echo -Dexec.args='${project.version}' --non-recursive exec:exec)
echo "version=${VERSION}" >> $GITHUB_OUTPUT
- name: Upload files to a GitHub release
uses: svenstaro/upload-release-action@2.7.0
with:
repo_token: ${{ secrets.GITHUB_TOKEN }}
file: kafka-ui-api/target/kafka-ui-api-${{ steps.build.outputs.version }}.jar
tag: ${{ github.event.release.tag_name }}
- name: Archive JAR
uses: actions/upload-artifact@v3
with:
name: kafka-ui-${{ steps.build.outputs.version }}
path: kafka-ui-api/target/kafka-ui-api-${{ steps.build.outputs.version }}.jar
#################
# #
# Docker images #
# #
#################
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Cache Docker layers
uses: actions/cache@v3
with:
path: /tmp/.buildx-cache
key: ${{ runner.os }}-buildx-${{ github.sha }}
restore-keys: |
${{ runner.os }}-buildx-
- name: Login to DockerHub
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Build and push
id: docker_build_and_push
uses: docker/build-push-action@v4
with:
builder: ${{ steps.buildx.outputs.name }}
context: kafka-ui-api
platforms: linux/amd64,linux/arm64
provenance: false
push: true
tags: |
provectuslabs/kafka-ui:${{ steps.build.outputs.version }}
provectuslabs/kafka-ui:latest
build-args: |
JAR_FILE=kafka-ui-api-${{ steps.build.outputs.version }}.jar
cache-from: type=local,src=/tmp/.buildx-cache
cache-to: type=local,dest=/tmp/.buildx-cache
charts:
runs-on: ubuntu-latest
needs: release
steps:
- name: Repository Dispatch
uses: peter-evans/repository-dispatch@v2
with:
token: ${{ secrets.CHARTS_ACTIONS_TOKEN }}
repository: provectus/kafka-ui-charts
event-type: prepare-helm-release
client-payload: '{"appversion": "${{ needs.release.outputs.version }}"}'
================================================
FILE: .github/workflows/release_drafter.yml
================================================
name: "Infra: Release Drafter run"
on:
push:
branches:
- master
workflow_dispatch:
inputs:
version:
description: 'Release version'
required: false
branch:
description: 'Target branch'
required: false
default: 'master'
permissions:
contents: read
jobs:
update_release_draft:
runs-on: ubuntu-latest
permissions:
contents: write
pull-requests: write
steps:
- uses: release-drafter/release-drafter@v5
with:
config-name: release_drafter.yaml
disable-autolabeler: true
version: ${{ github.event.inputs.version }}
commitish: ${{ github.event.inputs.branch }}
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
================================================
FILE: .github/workflows/separate_env_public_create.yml
================================================
name: "Infra: Feature Testing Public: Init env"
on:
workflow_dispatch:
inputs:
ENV_NAME:
description: 'Will be used as subdomain in the public URL.'
required: true
default: 'demo'
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
with:
ref: ${{ github.event.pull_request.head.sha }}
- name: get branch name
id: extract_branch
run: |
tag="${{ github.event.inputs.ENV_NAME }}-$(date '+%F-%H-%M-%S')"
echo "tag=${tag}" >> $GITHUB_OUTPUT
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Set up JDK
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'zulu'
cache: 'maven'
- name: Build
id: build
run: |
./mvnw -B -ntp versions:set -DnewVersion=$GITHUB_SHA
./mvnw -B -V -ntp clean package -Pprod -DskipTests
export VERSION=$(./mvnw -q -Dexec.executable=echo -Dexec.args='${project.version}' --non-recursive exec:exec)
echo "version=${VERSION}" >> $GITHUB_OUTPUT
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
- name: Set up Docker Buildx
id: buildx
uses: docker/setup-buildx-action@v2
- name: Cache Docker layers
uses: actions/cache@v3
with:
path: /tmp/.buildx-cache
key: ${{ runner.os }}-buildx-${{ github.sha }}
restore-keys: |
${{ runner.os }}-buildx-
- name: Configure AWS credentials for Kafka-UI account
uses: aws-actions/configure-aws-credentials@v3
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: eu-central-1
- name: Login to Amazon ECR
id: login-ecr
uses: aws-actions/amazon-ecr-login@v1
- name: Build and push
id: docker_build_and_push
uses: docker/build-push-action@v4
with:
builder: ${{ steps.buildx.outputs.name }}
context: kafka-ui-api
push: true
tags: 297478128798.dkr.ecr.eu-central-1.amazonaws.com/kafka-ui:${{ steps.extract_branch.outputs.tag }}
build-args: |
JAR_FILE=kafka-ui-api-${{ steps.build.outputs.version }}.jar
cache-from: type=local,src=/tmp/.buildx-cache
cache-to: type=local,dest=/tmp/.buildx-cache
outputs:
tag: ${{ steps.extract_branch.outputs.tag }}
separate-env-create:
runs-on: ubuntu-latest
needs: build
steps:
- name: clone
run: |
git clone https://infra-tech:${{ secrets.INFRA_USER_ACCESS_TOKEN }}@github.com/provectus/kafka-ui-infra.git --branch envs
- name: separate env create
run: |
cd kafka-ui-infra/aws-infrastructure4eks/argocd/scripts
bash separate_env_create.sh ${{ github.event.inputs.ENV_NAME }} ${{ secrets.FEATURE_TESTING_UI_PASSWORD }} ${{ needs.build.outputs.tag }}
git config --global user.email "infra-tech@provectus.com"
git config --global user.name "infra-tech"
git add -A
git commit -m "separate env added: ${{ github.event.inputs.ENV_NAME }}" && git push || true
- name: echo separate environment public link
run: |
echo "Please note, separate environment creation takes up to 5-10 minutes."
echo "Separate environment will be available at http://${{ github.event.inputs.ENV_NAME }}.kafka-ui.provectus.io"
echo "Username: admin"
================================================
FILE: .github/workflows/separate_env_public_remove.yml
================================================
name: "Infra: Feature Testing Public: Destroy env"
on:
workflow_dispatch:
inputs:
ENV_NAME:
description: 'Will be used to remove previously deployed separate environment.'
required: true
default: 'demo'
jobs:
separate-env-remove:
runs-on: ubuntu-latest
steps:
- name: clone
run: |
git clone https://infra-tech:${{ secrets.INFRA_USER_ACCESS_TOKEN }}@github.com/provectus/kafka-ui-infra.git --branch envs
- name: separate environment remove
run: |
cd kafka-ui-infra/aws-infrastructure4eks/argocd/scripts
bash separate_env_remove.sh ${{ github.event.inputs.ENV_NAME }}
git config --global user.email "infra-tech@provectus.com"
git config --global user.name "infra-tech"
git add -A
git commit -m "separate env removed: ${{ github.event.inputs.ENV_NAME }}" && git push || true
================================================
FILE: .github/workflows/stale.yaml
================================================
name: 'Infra: Close stale issues'
on:
schedule:
- cron: '30 1 * * *'
jobs:
stale:
runs-on: ubuntu-latest
steps:
- uses: actions/stale@v8
with:
days-before-issue-stale: 7
days-before-issue-close: 3
days-before-pr-stale: 7
days-before-pr-close: 7
stale-issue-message: 'This issue has been automatically marked as stale because no requested feedback has been provided. It will be closed if no further activity occurs. Thank you for your contributions.'
stale-pr-message: 'This PR has been automatically marked as stale because no requested changes have been applied. It will be closed if no further activity occurs. Thank you for your contributions.'
stale-issue-label: 'status/stale'
stale-pr-label: 'status/stale'
only-labels: 'status/pending'
remove-issue-stale-when-updated: true
labels-to-remove-when-unstale: 'status/pending'
================================================
FILE: .github/workflows/terraform-deploy.yml
================================================
name: "Infra: Terraform deploy"
on:
workflow_dispatch:
inputs:
applyTerraform:
description: 'Do you want to apply the infra-repo terraform? Possible values [plan/apply].'
required: true
default: 'plan'
KafkaUIInfraBranch:
description: 'Branch name of Kafka-UI-Infra repo, tf will be executed from this branch'
required: true
default: 'master'
jobs:
terraform:
name: Terraform
runs-on: ubuntu-latest
steps:
- name: Clone infra repo
run: |
echo "Cloning repo..."
git clone https://kafka-ui-infra:${{ secrets.KAFKA_UI_INFRA_TOKEN }}@gitlab.provectus.com/provectus-internals/kafka-ui-infra.git --branch ${{ github.event.inputs.KafkaUIInfraBranch }}
echo "Cd to deployment..."
cd kafka-ui-infra/aws-infrastructure4eks/deployment
echo "TF_DIR=$(pwd)" >> $GITHUB_ENV
echo "Terraform will be triggered in this dir $TF_DIR"
- name: Configure AWS credentials for Kafka-UI account
uses: aws-actions/configure-aws-credentials@v3
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: eu-central-1
- name: Terraform Install
uses: hashicorp/setup-terraform@v2
- name: Terraform init
id: init
run: cd $TF_DIR && terraform init --backend-config="../envs/pro/terraform-backend.tfvars"
- name: Terraform validate
id: validate
run: cd $TF_DIR && terraform validate -no-color
- name: Terraform plan
id: plan
run: |
cd $TF_DIR
export TF_VAR_github_connector_access_token=${{ secrets.SOURCE_CONNECTOR_GITHUB_TOKEN }}
export TF_VAR_repo_secret=${{ secrets.KAFKA_UI_INFRA_TOKEN }}
terraform plan --var-file="../envs/pro/eks.tfvars"
- name: Terraform apply
id: apply
if: ${{ github.event.inputs.applyTerraform == 'apply' }}
run: |
cd $TF_DIR
export TF_VAR_github_connector_access_token=${{ secrets.SOURCE_CONNECTOR_GITHUB_TOKEN }}
export TF_VAR_repo_secret=${{ secrets.KAFKA_UI_INFRA_TOKEN }}
terraform apply --var-file="../envs/pro/eks.tfvars" -auto-approve
================================================
FILE: .github/workflows/triage_issues.yml
================================================
name: "Infra: Triage: Apply triage label for issues"
on:
issues:
types:
- opened
jobs:
triage_issues:
runs-on: ubuntu-latest
steps:
- name: Label issue
uses: andymckay/labeler@master
with:
add-labels: "status/triage"
ignore-if-assigned: true
================================================
FILE: .github/workflows/triage_prs.yml
================================================
name: "Infra: Triage: Apply triage label for PRs"
on:
pull_request:
types:
- opened
jobs:
triage_prs:
runs-on: ubuntu-latest
steps:
- name: Label PR
uses: andymckay/labeler@master
with:
add-labels: "status/triage"
ignore-if-labeled: true
================================================
FILE: .github/workflows/welcome-first-time-contributors.yml
================================================
name: Welcome first time contributors
on:
pull_request_target:
types:
- opened
issues:
types:
- opened
permissions:
issues: write
pull-requests: write
jobs:
welcome:
runs-on: ubuntu-latest
steps:
- uses: actions/first-interaction@v1
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
issue-message: |
Hello there ${{ github.actor }}! 👋
Thank you and congratulations 🎉 for opening your very first issue in this project! 💖
In case you want to claim this issue, please comment down below! We will try to get back to you as soon as we can. 👀
pr-message: |
Hello there ${{ github.actor }}! 👋
Thank you and congrats 🎉 for opening your first PR on this project! ✨ 💖
We will try to review it soon!
================================================
FILE: .github/workflows/workflow_linter.yaml
================================================
name: "Infra: Workflow linter"
on:
pull_request:
types:
- "opened"
- "reopened"
- "synchronize"
- "edited"
paths:
- ".github/workflows/**"
jobs:
build-and-test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
with:
fetch-depth: 0
ref: ${{ github.event.pull_request.head.sha }}
- name: Install yamllint
run: sudo apt install -y yamllint
- name: Validate workflow yaml files
run: yamllint .github/workflows/. -d relaxed -f github --no-warnings
================================================
FILE: .gitignore
================================================
HELP.md
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**
!**/src/test/**
### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
### VS Code ###
.vscode/
/kafka-ui-api/app/node
### SDKMAN ###
.sdkmanrc
.DS_Store
*.code-workspace
*.tar.gz
*.tgz
/docker/*.override.yaml
================================================
FILE: .mvn/wrapper/maven-wrapper.properties
================================================
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.6/apache-maven-3.8.6-bin.zip
wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar
================================================
FILE: CODE-OF-CONDUCT.md
================================================
# Contributor Covenant Code of Conduct
## Our Pledge
We as members, contributors, and leaders pledge to make participation in our
community a harassment-free experience for everyone, regardless of age, body
size, visible or invisible disability, ethnicity, sex characteristics, gender
identity and expression, level of experience, education, socio-economic status,
nationality, personal appearance, race, caste, color, religion, or sexual identity
and orientation.
We pledge to act and interact in ways that contribute to an open, welcoming,
diverse, inclusive, and healthy community.
## Our Standards
Examples of behavior that contributes to a positive environment for our
community include:
* Demonstrating empathy and kindness toward other people
* Being respectful of differing opinions, viewpoints, and experiences
* Giving and gracefully accepting constructive feedback
* Accepting responsibility and apologizing to those affected by our mistakes,
and learning from the experience
* Focusing on what is best not just for us as individuals, but for the
overall community
Examples of unacceptable behavior include:
* The use of sexualized language or imagery, and sexual attention or
advances of any kind
* Trolling, insulting or derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or email
address, without their explicit permission
* Other conduct which could reasonably be considered inappropriate in a
professional setting
## Enforcement Responsibilities
Community leaders are responsible for clarifying and enforcing our standards of
acceptable behavior and will take appropriate and fair corrective action in
response to any behavior that they deem inappropriate, threatening, offensive,
or harmful.
Community leaders have the right and responsibility to remove, edit, or reject
comments, commits, code, wiki edits, issues, and other contributions that are
not aligned to this Code of Conduct, and will communicate reasons for moderation
decisions when appropriate.
## Scope
This Code of Conduct applies within all community spaces, and also applies when
an individual is officially representing the community in public spaces.
Examples of representing our community include using an official e-mail address,
posting via an official social media account, or acting as an appointed
representative at an online or offline event.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported to the community leaders responsible for enforcement at email kafkaui@provectus.com.
All complaints will be reviewed and investigated promptly and fairly.
All community leaders are obligated to respect the privacy and security of the
reporter of any incident.
## Enforcement Guidelines
Community leaders will follow these Community Impact Guidelines in determining
the consequences for any action they deem in violation of this Code of Conduct:
### 1. Correction
**Community Impact**: Use of inappropriate language or other behavior deemed
unprofessional or unwelcome in the community.
**Consequence**: A private, written warning from community leaders, providing
clarity around the nature of the violation and an explanation of why the
behavior was inappropriate. A public apology may be requested.
### 2. Warning
**Community Impact**: A violation through a single incident or series
of actions.
**Consequence**: A warning with consequences for continued behavior. No
interaction with the people involved, including unsolicited interaction with
those enforcing the Code of Conduct, for a specified period of time. This
includes avoiding interactions in community spaces as well as external channels
like social media. Violating these terms may lead to a temporary or
permanent ban.
### 3. Temporary Ban
**Community Impact**: A serious violation of community standards, including
sustained inappropriate behavior.
**Consequence**: A temporary ban from any sort of interaction or public
communication with the community for a specified period of time. No public or
private interaction with the people involved, including unsolicited interaction
with those enforcing the Code of Conduct, is allowed during this period.
Violating these terms may lead to a permanent ban.
### 4. Permanent Ban
**Community Impact**: Demonstrating a pattern of violation of community
standards, including sustained inappropriate behavior, harassment of an
individual, or aggression toward or disparagement of classes of individuals.
**Consequence**: A permanent ban from any sort of public interaction within
the community.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
version 2.0, available at
[https://www.contributor-covenant.org/version/2/0/code_of_conduct.html][v2.0].
Community Impact Guidelines were inspired by
[Mozilla's code of conduct enforcement ladder][Mozilla CoC].
For answers to common questions about this code of conduct, see the FAQ at
[https://www.contributor-covenant.org/faq][FAQ]. Translations are available
at [https://www.contributor-covenant.org/translations][translations].
[homepage]: https://www.contributor-covenant.org
[v2.0]: https://www.contributor-covenant.org/version/2/0/code_of_conduct.html
[Mozilla CoC]: https://github.com/mozilla/diversity
[FAQ]: https://www.contributor-covenant.org/faq
[translations]: https://www.contributor-covenant.org/translations
================================================
FILE: CONTRIBUTING.md
================================================
This guide is an exact copy of the same documented located [in our official docs](https://docs.kafka-ui.provectus.io/development/contributing). If there are any differences between the documents, the one located in our official docs should prevail.
This guide aims to walk you through the process of working on issues and Pull Requests (PRs).
Bear in mind that you will not be able to complete some steps on your own if you do not have a “write” permission. Feel free to reach out to the maintainers to help you unlock these activities.
# General recommendations
Please note that we have a code of conduct (`CODE-OF-CONDUCT.md`). Make sure that you follow it in all of your interactions with the project.
# Issues
## Choosing an issue
There are two options to look for the issues to contribute to.
The first is our ["Up for grabs"](https://github.com/provectus/kafka-ui/projects/11) board. There the issues are sorted by a required experience level (beginner, intermediate, expert).
The second option is to search for ["good first issue"](https://github.com/provectus/kafka-ui/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22)-labeled issues. Some of them might not be displayed on the aforementioned board, or vice versa.
You also need to consider labels. You can sort the issues by scope labels, such as `scope/backend`, `scope/frontend` or even `scope/k8s`. If any issue covers several specific areas, and you do not have a required expertise for one of them, just do your part of work — others will do the rest.
## Grabbing the issue
There is a bunch of criteria that make an issue feasible for development.
The implementation of any features and/or their enhancements should be reasonable, must be backed by justified requirements (demanded by the community, [roadmap](https://docs.kafka-ui.provectus.io/project/roadmap) plans, etc.). The final decision is left for the maintainers' discretion.
All bugs should be confirmed as such (i.e. the behavior is unintended).
Any issue should be properly triaged by the maintainers beforehand, which includes:
1. Having a proper milestone set
2. Having required labels assigned: accepted label, scope labels, etc.
Formally, if these triage conditions are met, you can start to work on the issue.
With all these requirements met, feel free to pick the issue you want. Reach out to the maintainers if you have any questions.
## Working on the issue
Every issue “in-progress” needs to be assigned to a corresponding person.
To keep the status of the issue clear to everyone, please keep the card's status updated ("project" card to the right of the issue should match the milestone’s name).
## Setting up a local development environment
Please refer to [this guide](https://docs.kafka-ui.provectus.io/development/contributing).
# Pull Requests
## Branch naming
In order to keep branch names uniform and easy-to-understand, please use the following conventions for branch naming.
Generally speaking, it is a good idea to add a group/type prefix to a branch; e.g.,
if you are working on a specific branch, you could name it `issues/xxx`.
Here is a list of good examples:
`issues/123`
`feature/feature_name`
`bugfix/fix_thing`
## Code style
Java: There is a file called `checkstyle.xml` in project root under `etc` directory.
You can import it into IntelliJ IDEA via Checkstyle plugin.
## Naming conventions
REST paths should be written in **lowercase** and consist of **plural** nouns only.
Also, multiple words that are placed in a single path segment should be divided by a hyphen (`-`).
Query variable names should be formatted in `camelCase`.
Model names should consist of **plural** nouns only and should be formatted in `camelCase` as well.
## Creating a PR
When creating a PR please do the following:
1. In commit messages use these [closing keywords](https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue#linking-a-pull-request-to-an-issue-using-a-keyword).
2. Link an issue(-s) via "linked issues" block.
3. Set the PR labels. Ensure that you set only the same set of labels that is present in the issue, and ignore yellow `status/` labels.
4. If the PR does not close any of the issues, the PR itself might need to have a milestone set. Reach out to the maintainers to consult.
5. Assign the PR to yourself. A PR assignee is someone whose goal is to get the PR merged.
6. Add reviewers. As a rule, reviewers' suggestions are pretty good; please use them.
7. Upon merging the PR, please use a meaningful commit message, task name should be fine in this case.
### Pull Request checklist
1. When composing a build, ensure that any install or build dependencies have been removed before the end of the layer.
2. Update the `README.md` with the details of changes made to the interface. This includes new environment variables,
exposed ports, useful file locations, and container parameters.
## Reviewing a PR
WIP
### Pull Request reviewer checklist
WIP
================================================
FILE: LICENSE
================================================
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright 2020 CloudHut
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
================================================
FILE: README.md
================================================
 UI for Apache Kafka
------------------
#### Versatile, fast and lightweight web UI for managing Apache Kafka® clusters. Built by developers, for developers.
[](https://github.com/provectus/kafka-ui/blob/master/LICENSE)

[](https://github.com/provectus/kafka-ui/releases)
[](https://discord.gg/4DWzD7pGE5)
[](https://hub.docker.com/r/provectuslabs/kafka-ui)
DOCS •
QUICK START •
COMMUNITY DISCORD
AWS Marketplace •
ProductHunt
#### UI for Apache Kafka is a free, open-source web UI to monitor and manage Apache Kafka clusters.
UI for Apache Kafka is a simple tool that makes your data flows observable, helps find and troubleshoot issues faster and deliver optimal performance. Its lightweight dashboard makes it easy to track key metrics of your Kafka clusters - Brokers, Topics, Partitions, Production, and Consumption.
### DISCLAIMER
UI for Apache Kafka is a free tool built and supported by the open-source community. Curated by Provectus, it will remain free and open-source, without any paid features or subscription plans to be added in the future.
Looking for the help of Kafka experts? Provectus can help you design, build, deploy, and manage Apache Kafka clusters and streaming applications. Discover [Professional Services for Apache Kafka](https://provectus.com/professional-services-apache-kafka/), to unlock the full potential of Kafka in your enterprise!
Set up UI for Apache Kafka with just a couple of easy commands to visualize your Kafka data in a comprehensible way. You can run the tool locally or in
the cloud.

# Features
* **Multi-Cluster Management** — monitor and manage all your clusters in one place
* **Performance Monitoring with Metrics Dashboard** — track key Kafka metrics with a lightweight dashboard
* **View Kafka Brokers** — view topic and partition assignments, controller status
* **View Kafka Topics** — view partition count, replication status, and custom configuration
* **View Consumer Groups** — view per-partition parked offsets, combined and per-partition lag
* **Browse Messages** — browse messages with JSON, plain text, and Avro encoding
* **Dynamic Topic Configuration** — create and configure new topics with dynamic configuration
* **Configurable Authentification** — [secure](https://docs.kafka-ui.provectus.io/configuration/authentication) your installation with optional Github/Gitlab/Google OAuth 2.0
* **Custom serialization/deserialization plugins** - [use](https://docs.kafka-ui.provectus.io/configuration/serialization-serde) a ready-to-go serde for your data like AWS Glue or Smile, or code your own!
* **Role based access control** - [manage permissions](https://docs.kafka-ui.provectus.io/configuration/rbac-role-based-access-control) to access the UI with granular precision
* **Data masking** - [obfuscate](https://docs.kafka-ui.provectus.io/configuration/data-masking) sensitive data in topic messages
# The Interface
UI for Apache Kafka wraps major functions of Apache Kafka with an intuitive user interface.

## Topics
UI for Apache Kafka makes it easy for you to create topics in your browser by several clicks,
pasting your own parameters, and viewing topics in the list.

It's possible to jump from connectors view to corresponding topics and from a topic to consumers (back and forth) for more convenient navigation.
connectors, overview topic settings.

### Messages
Let's say we want to produce messages for our topic. With the UI for Apache Kafka we can send or write data/messages to the Kafka topics without effort by specifying parameters, and viewing messages in the list.

## Schema registry
There are 3 supported types of schemas: Avro®, JSON Schema, and Protobuf schemas.

Before producing avro/protobuf encoded messages, you have to add a schema for the topic in Schema Registry. Now all these steps are easy to do
with a few clicks in a user-friendly interface.

# Getting Started
To run UI for Apache Kafka, you can use either a pre-built Docker image or build it (or a jar file) yourself.
## Quick start (Demo run)
```
docker run -it -p 8080:8080 -e DYNAMIC_CONFIG_ENABLED=true provectuslabs/kafka-ui
```
Then access the web UI at [http://localhost:8080](http://localhost:8080)
The command is sufficient to try things out. When you're done trying things out, you can proceed with a [persistent installation](https://docs.kafka-ui.provectus.io/quick-start/persistent-start)
## Persistent installation
```
services:
kafka-ui:
container_name: kafka-ui
image: provectuslabs/kafka-ui:latest
ports:
- 8080:8080
environment:
DYNAMIC_CONFIG_ENABLED: 'true'
volumes:
- ~/kui/config.yml:/etc/kafkaui/dynamic_config.yaml
```
Please refer to our [configuration](https://docs.kafka-ui.provectus.io/configuration/quick-start) page to proceed with further app configuration.
## Some useful configuration related links
[Web UI Cluster Configuration Wizard](https://docs.kafka-ui.provectus.io/configuration/configuration-wizard)
[Configuration file explanation](https://docs.kafka-ui.provectus.io/configuration/configuration-file)
[Docker Compose examples](https://docs.kafka-ui.provectus.io/configuration/compose-examples)
[Misc configuration properties](https://docs.kafka-ui.provectus.io/configuration/misc-configuration-properties)
## Helm charts
[Quick start](https://docs.kafka-ui.provectus.io/configuration/helm-charts/quick-start)
## Building from sources
[Quick start](https://docs.kafka-ui.provectus.io/development/building/prerequisites) with building
## Liveliness and readiness probes
Liveliness and readiness endpoint is at `/actuator/health`.
Info endpoint (build info) is located at `/actuator/info`.
# Configuration options
All of the environment variables/config properties could be found [here](https://docs.kafka-ui.provectus.io/configuration/misc-configuration-properties).
# Contributing
Please refer to [contributing guide](https://docs.kafka-ui.provectus.io/development/contributing), we'll guide you from there.
================================================
FILE: SECURITY.md
================================================
# Security Policy
## Supported Versions
Following versions of the project are currently being supported with security updates.
| Version | Supported |
| ------- | ------------------ |
| 0.7.x | :white_check_mark: |
| 0.6.x | :x: |
| 0.5.x | :x: |
| 0.4.x | :x: |
| 0.3.x | :x: |
| 0.2.x | :x: |
| 0.1.x | :x: |
## Reporting a Vulnerability
Please **DO NOT** file a publicly available github issues regarding security vulnerabilities.
Send us details via email (maintainers.kafka-ui "at" provectus.com).
Consider adding something like "security vulnerability report" in the title of an email.
================================================
FILE: documentation/compose/DOCKER_COMPOSE.md
================================================
# Descriptions of docker-compose configurations (*.yaml)
1. [kafka-ui.yaml](./kafka-ui.yaml) - Default configuration with 2 kafka clusters with two nodes of Schema Registry, one kafka-connect and a few dummy topics.
2. [kafka-ui-arm64.yaml](./kafka-ui-arm64.yaml) - Default configuration for ARM64(Mac M1) architecture with 1 kafka cluster without zookeeper with one node of Schema Registry, one kafka-connect and a few dummy topics.
3. [kafka-clusters-only.yaml](./kafka-clusters-only.yaml) - A configuration for development purposes, everything besides `kafka-ui` itself (to be run locally).
4. [kafka-ui-ssl.yml](./kafka-ssl.yml) - Connect to Kafka via TLS/SSL
5. [kafka-cluster-sr-auth.yaml](./kafka-cluster-sr-auth.yaml) - Schema registry with authentication.
6. [kafka-ui-auth-context.yaml](./kafka-ui-auth-context.yaml) - Basic (username/password) authentication with custom path (URL) (issue 861).
7. [e2e-tests.yaml](./e2e-tests.yaml) - Configuration with different connectors (github-source, s3, sink-activities, source-activities) and Ksql functionality.
8. [kafka-ui-jmx-secured.yml](./kafka-ui-jmx-secured.yml) - Kafka’s JMX with SSL and authentication.
9. [kafka-ui-reverse-proxy.yaml](./nginx-proxy.yaml) - An example for using the app behind a proxy (like nginx).
10. [kafka-ui-sasl.yaml](./kafka-ui-sasl.yaml) - SASL auth for Kafka.
11. [kafka-ui-traefik-proxy.yaml](./traefik-proxy.yaml) - Traefik specific proxy configuration.
12. [oauth-cognito.yaml](./oauth-cognito.yaml) - OAuth2 with Cognito
13. [kafka-ui-with-jmx-exporter.yaml](./kafka-ui-with-jmx-exporter.yaml) - A configuration with 2 kafka clusters with enabled prometheus jmx exporters instead of jmx.
14. [kafka-with-zookeeper.yaml](./kafka-with-zookeeper.yaml) - An example for using kafka with zookeeper
================================================
FILE: documentation/compose/connectors/github-source.json
================================================
{
"name": "github-source",
"config":
{
"connector.class": "io.confluent.connect.github.GithubSourceConnector",
"confluent.topic.bootstrap.servers": "kafka0:29092, kafka1:29092",
"confluent.topic.replication.factor": "1",
"tasks.max": "1",
"github.service.url": "https://api.github.com",
"github.access.token": "",
"github.repositories": "provectus/kafka-ui",
"github.resources": "issues,commits,pull_requests",
"github.since": "2019-01-01",
"topic.name.pattern": "github-${resourceName}",
"key.converter": "org.apache.kafka.connect.json.JsonConverter",
"key.converter.schema.registry.url": "http://schemaregistry0:8085",
"value.converter": "org.apache.kafka.connect.json.JsonConverter",
"value.converter.schema.registry.url": "http://schemaregistry0:8085"
}
}
================================================
FILE: documentation/compose/connectors/s3-sink.json
================================================
{
"name": "s3-sink",
"config":
{
"connector.class": "io.confluent.connect.s3.S3SinkConnector",
"topics": "github-issues, github-pull_requests, github-commits",
"tasks.max": "1",
"s3.region": "eu-central-1",
"s3.bucket.name": "kafka-ui-s3-sink-connector",
"s3.part.size": "5242880",
"flush.size": "3",
"storage.class": "io.confluent.connect.s3.storage.S3Storage",
"format.class": "io.confluent.connect.s3.format.json.JsonFormat",
"schema.generator.class": "io.confluent.connect.storage.hive.schema.DefaultSchemaGenerator",
"partitioner.class": "io.confluent.connect.storage.partitioner.DefaultPartitioner",
"schema.compatibility": "BACKWARD"
}
}
================================================
FILE: documentation/compose/connectors/sink-activities.json
================================================
{
"name": "sink_postgres_activities",
"config": {
"connector.class": "io.confluent.connect.jdbc.JdbcSinkConnector",
"connection.url": "jdbc:postgresql://postgres-db:5432/test",
"connection.user": "dev_user",
"connection.password": "12345",
"topics": "source-activities",
"table.name.format": "sink_activities",
"key.converter": "org.apache.kafka.connect.storage.StringConverter",
"key.converter.schema.registry.url": "http://schemaregistry0:8085",
"value.converter": "io.confluent.connect.avro.AvroConverter",
"value.converter.schema.registry.url": "http://schemaregistry0:8085",
"auto.create": "true",
"pk.mode": "record_value",
"pk.fields": "id",
"insert.mode": "upsert"
}
}
================================================
FILE: documentation/compose/connectors/source-activities.json
================================================
{
"name": "source_postgres_activities",
"config": {
"connector.class": "io.confluent.connect.jdbc.JdbcSourceConnector",
"connection.url": "jdbc:postgresql://postgres-db:5432/test",
"connection.user": "dev_user",
"connection.password": "12345",
"topic.prefix": "source-",
"poll.interval.ms": 3600000,
"table.whitelist": "public.activities",
"mode": "bulk",
"transforms": "extractkey",
"transforms.extractkey.type": "org.apache.kafka.connect.transforms.ExtractField$Key",
"transforms.extractkey.field": "id",
"key.converter": "org.apache.kafka.connect.storage.StringConverter",
"key.converter.schema.registry.url": "http://schemaregistry0:8085",
"value.converter": "io.confluent.connect.avro.AvroConverter",
"value.converter.schema.registry.url": "http://schemaregistry0:8085"
}
}
================================================
FILE: documentation/compose/connectors/start.sh
================================================
#! /bin/bash
while [[ "$(curl -s -o /dev/null -w ''%{http_code}'' kafka-connect0:8083)" != "200" ]]
do sleep 5
done
echo "\n --------------Creating connectors..."
for filename in /connectors/*.json; do
curl -X POST -H "Content-Type: application/json" -d @$filename http://kafka-connect0:8083/connectors
done
================================================
FILE: documentation/compose/data/message.json
================================================
{}
================================================
FILE: documentation/compose/data/proxy.conf
================================================
server {
listen 80;
server_name localhost;
location /kafka-ui {
# rewrite /kafka-ui/(.*) /$1 break;
proxy_pass http://kafka-ui:8080;
}
}
================================================
FILE: documentation/compose/e2e-tests.yaml
================================================
---
version: '3.5'
services:
kafka-ui:
container_name: kafka-ui
image: provectuslabs/kafka-ui:latest
ports:
- 8080:8080
healthcheck:
test: wget --no-verbose --tries=1 --spider http://localhost:8080/actuator/health
interval: 30s
timeout: 10s
retries: 10
depends_on:
kafka0:
condition: service_healthy
schemaregistry0:
condition: service_healthy
kafka-connect0:
condition: service_healthy
environment:
KAFKA_CLUSTERS_0_NAME: local
KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS: kafka0:29092
KAFKA_CLUSTERS_0_METRICS_PORT: 9997
KAFKA_CLUSTERS_0_SCHEMAREGISTRY: http://schemaregistry0:8085
KAFKA_CLUSTERS_0_KAFKACONNECT_0_NAME: first
KAFKA_CLUSTERS_0_KAFKACONNECT_0_ADDRESS: http://kafka-connect0:8083
KAFKA_CLUSTERS_0_KSQLDBSERVER: http://ksqldb:8088
kafka0:
image: confluentinc/cp-kafka:7.2.1
hostname: kafka0
container_name: kafka0
healthcheck:
test: unset JMX_PORT && KAFKA_JMX_OPTS="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=kafka0 -Dcom.sun.management.jmxremote.rmi.port=9999" && kafka-broker-api-versions --bootstrap-server=localhost:9092
interval: 30s
timeout: 10s
retries: 10
ports:
- "9092:9092"
- "9997:9997"
environment:
KAFKA_BROKER_ID: 1
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: 'CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT'
KAFKA_ADVERTISED_LISTENERS: 'PLAINTEXT://kafka0:29092,PLAINTEXT_HOST://localhost:9092'
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1
KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1
KAFKA_JMX_PORT: 9997
KAFKA_JMX_HOSTNAME: localhost
KAFKA_JMX_OPTS: -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=kafka0 -Dcom.sun.management.jmxremote.rmi.port=9997
KAFKA_PROCESS_ROLES: 'broker,controller'
KAFKA_NODE_ID: 1
KAFKA_CONTROLLER_QUORUM_VOTERS: '1@kafka0:29093'
KAFKA_LISTENERS: 'PLAINTEXT://kafka0:29092,CONTROLLER://kafka0:29093,PLAINTEXT_HOST://0.0.0.0:9092'
KAFKA_INTER_BROKER_LISTENER_NAME: 'PLAINTEXT'
KAFKA_CONTROLLER_LISTENER_NAMES: 'CONTROLLER'
KAFKA_LOG_DIRS: '/tmp/kraft-combined-logs'
volumes:
- ./scripts/update_run.sh:/tmp/update_run.sh
command: "bash -c 'if [ ! -f /tmp/update_run.sh ]; then echo \"ERROR: Did you forget the update_run.sh file that came with this docker-compose.yml file?\" && exit 1 ; else /tmp/update_run.sh && /etc/confluent/docker/run ; fi'"
schemaregistry0:
image: confluentinc/cp-schema-registry:7.2.1
ports:
- 8085:8085
depends_on:
kafka0:
condition: service_healthy
healthcheck:
test: [ "CMD", "timeout", "1", "curl", "--silent", "--fail", "http://schemaregistry0:8085/subjects" ]
interval: 30s
timeout: 10s
retries: 10
environment:
SCHEMA_REGISTRY_KAFKASTORE_BOOTSTRAP_SERVERS: PLAINTEXT://kafka0:29092
SCHEMA_REGISTRY_KAFKASTORE_SECURITY_PROTOCOL: PLAINTEXT
SCHEMA_REGISTRY_HOST_NAME: schemaregistry0
SCHEMA_REGISTRY_LISTENERS: http://schemaregistry0:8085
SCHEMA_REGISTRY_SCHEMA_REGISTRY_INTER_INSTANCE_PROTOCOL: "http"
SCHEMA_REGISTRY_LOG4J_ROOT_LOGLEVEL: INFO
SCHEMA_REGISTRY_KAFKASTORE_TOPIC: _schemas
kafka-connect0:
build:
context: ./kafka-connect
args:
image: confluentinc/cp-kafka-connect:6.0.1
ports:
- 8083:8083
depends_on:
kafka0:
condition: service_healthy
schemaregistry0:
condition: service_healthy
healthcheck:
test: [ "CMD", "nc", "127.0.0.1", "8083" ]
interval: 30s
timeout: 10s
retries: 10
environment:
CONNECT_BOOTSTRAP_SERVERS: kafka0:29092
CONNECT_GROUP_ID: compose-connect-group
CONNECT_CONFIG_STORAGE_TOPIC: _connect_configs
CONNECT_CONFIG_STORAGE_REPLICATION_FACTOR: 1
CONNECT_OFFSET_STORAGE_TOPIC: _connect_offset
CONNECT_OFFSET_STORAGE_REPLICATION_FACTOR: 1
CONNECT_STATUS_STORAGE_TOPIC: _connect_status
CONNECT_STATUS_STORAGE_REPLICATION_FACTOR: 1
CONNECT_KEY_CONVERTER: org.apache.kafka.connect.storage.StringConverter
CONNECT_KEY_CONVERTER_SCHEMA_REGISTRY_URL: http://schemaregistry0:8085
CONNECT_VALUE_CONVERTER: org.apache.kafka.connect.storage.StringConverter
CONNECT_VALUE_CONVERTER_SCHEMA_REGISTRY_URL: http://schemaregistry0:8085
CONNECT_INTERNAL_KEY_CONVERTER: org.apache.kafka.connect.json.JsonConverter
CONNECT_INTERNAL_VALUE_CONVERTER: org.apache.kafka.connect.json.JsonConverter
CONNECT_REST_ADVERTISED_HOST_NAME: kafka-connect0
CONNECT_PLUGIN_PATH: "/usr/share/java,/usr/share/confluent-hub-components"
# AWS_ACCESS_KEY_ID: ""
# AWS_SECRET_ACCESS_KEY: ""
kafka-init-topics:
image: confluentinc/cp-kafka:7.2.1
volumes:
- ./data/message.json:/data/message.json
depends_on:
kafka0:
condition: service_healthy
command: "bash -c 'echo Waiting for Kafka to be ready... && \
cub kafka-ready -b kafka0:29092 1 30 && \
kafka-topics --create --topic users --partitions 3 --replication-factor 1 --if-not-exists --bootstrap-server kafka0:29092 && \
kafka-topics --create --topic messages --partitions 2 --replication-factor 1 --if-not-exists --bootstrap-server kafka0:29092 && \
kafka-console-producer --bootstrap-server kafka0:29092 --topic users < /data/message.json'"
postgres-db:
build:
context: ./postgres
args:
image: postgres:9.6.22
ports:
- 5432:5432
healthcheck:
test: [ "CMD-SHELL", "pg_isready -U dev_user" ]
interval: 10s
timeout: 5s
retries: 5
environment:
POSTGRES_USER: 'dev_user'
POSTGRES_PASSWORD: '12345'
create-connectors:
image: ellerbrock/alpine-bash-curl-ssl
depends_on:
postgres-db:
condition: service_healthy
kafka-connect0:
condition: service_healthy
volumes:
- ./connectors:/connectors
command: bash -c '/connectors/start.sh'
ksqldb:
image: confluentinc/ksqldb-server:0.18.0
healthcheck:
test: [ "CMD", "timeout", "1", "curl", "--silent", "--fail", "http://localhost:8088/info" ]
interval: 30s
timeout: 10s
retries: 10
depends_on:
kafka0:
condition: service_healthy
kafka-connect0:
condition: service_healthy
schemaregistry0:
condition: service_healthy
ports:
- 8088:8088
environment:
KSQL_CUB_KAFKA_TIMEOUT: 120
KSQL_LISTENERS: http://0.0.0.0:8088
KSQL_BOOTSTRAP_SERVERS: PLAINTEXT://kafka0:29092
KSQL_KSQL_LOGGING_PROCESSING_STREAM_AUTO_CREATE: "true"
KSQL_KSQL_LOGGING_PROCESSING_TOPIC_AUTO_CREATE: "true"
KSQL_KSQL_CONNECT_URL: http://kafka-connect0:8083
KSQL_KSQL_SCHEMA_REGISTRY_URL: http://schemaregistry0:8085
KSQL_KSQL_SERVICE_ID: my_ksql_1
KSQL_KSQL_HIDDEN_TOPICS: '^_.*'
KSQL_CACHE_MAX_BYTES_BUFFERING: 0
================================================
FILE: documentation/compose/jaas/client.properties
================================================
sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username="admin" password="admin-secret";
security.protocol=SASL_PLAINTEXT
sasl.mechanism=PLAIN
================================================
FILE: documentation/compose/jaas/kafka_connect.jaas
================================================
KafkaConnect {
org.apache.kafka.connect.rest.basic.auth.extension.PropertyFileLoginModule required
file="/conf/kafka_connect.password";
};
================================================
FILE: documentation/compose/jaas/kafka_connect.password
================================================
admin: admin-secret
================================================
FILE: documentation/compose/jaas/kafka_server.conf
================================================
KafkaServer {
org.apache.kafka.common.security.plain.PlainLoginModule required
username="admin"
password="admin-secret"
user_admin="admin-secret"
user_enzo="cisternino";
};
KafkaClient {
org.apache.kafka.common.security.plain.PlainLoginModule required
user_admin="admin-secret";
};
Client {
org.apache.zookeeper.server.auth.DigestLoginModule required
username="zkuser"
password="zkuserpassword";
};
================================================
FILE: documentation/compose/jaas/schema_registry.jaas
================================================
SchemaRegistryProps {
org.eclipse.jetty.jaas.spi.PropertyFileLoginModule required
file="/conf/schema_registry.password"
debug="false";
};
================================================
FILE: documentation/compose/jaas/schema_registry.password
================================================
admin: OBF:1w8t1tvf1w261w8v1w1c1tvn1w8x,admin
================================================
FILE: documentation/compose/jaas/zookeeper_jaas.conf
================================================
Server {
org.apache.zookeeper.server.auth.DigestLoginModule required
user_zkuser="zkuserpassword";
};
================================================
FILE: documentation/compose/jmx/jmxremote.access
================================================
root readwrite
================================================
FILE: documentation/compose/jmx/jmxremote.password
================================================
root password
================================================
FILE: documentation/compose/jmx-exporter/kafka-broker.yml
================================================
rules:
- pattern: ".*"
================================================
FILE: documentation/compose/jmx-exporter/kafka-prepare-and-run
================================================
#!/usr/bin/env bash
JAVA_AGENT_FILE="/usr/share/jmx_exporter/jmx_prometheus_javaagent.jar"
if [ ! -f "$JAVA_AGENT_FILE" ]
then
echo "Downloading jmx_exporter javaagent"
curl -o $JAVA_AGENT_FILE https://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/0.16.1/jmx_prometheus_javaagent-0.16.1.jar
fi
exec /etc/confluent/docker/run
================================================
FILE: documentation/compose/kafka-cluster-sr-auth.yaml
================================================
---
version: '2'
services:
kafka1:
image: confluentinc/cp-kafka:7.2.1
hostname: kafka1
container_name: kafka1
ports:
- "9092:9092"
- "9997:9997"
environment:
KAFKA_BROKER_ID: 1
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: 'CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT'
KAFKA_ADVERTISED_LISTENERS: 'PLAINTEXT://kafka1:29092,PLAINTEXT_HOST://localhost:9092'
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1
KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1
KAFKA_JMX_PORT: 9997
KAFKA_JMX_HOSTNAME: localhost
KAFKA_PROCESS_ROLES: 'broker,controller'
KAFKA_NODE_ID: 1
KAFKA_CONTROLLER_QUORUM_VOTERS: '1@kafka1:29093'
KAFKA_LISTENERS: 'PLAINTEXT://kafka1:29092,CONTROLLER://kafka1:29093,PLAINTEXT_HOST://0.0.0.0:9092'
KAFKA_INTER_BROKER_LISTENER_NAME: 'PLAINTEXT'
KAFKA_CONTROLLER_LISTENER_NAMES: 'CONTROLLER'
KAFKA_LOG_DIRS: '/tmp/kraft-combined-logs'
volumes:
- ./scripts/update_run.sh:/tmp/update_run.sh
command: "bash -c 'if [ ! -f /tmp/update_run.sh ]; then echo \"ERROR: Did you forget the update_run.sh file that came with this docker-compose.yml file?\" && exit 1 ; else /tmp/update_run.sh && /etc/confluent/docker/run ; fi'"
schemaregistry1:
image: confluentinc/cp-schema-registry:7.2.1
ports:
- 18085:8085
depends_on:
- kafka1
volumes:
- ./jaas:/conf
environment:
SCHEMA_REGISTRY_KAFKASTORE_BOOTSTRAP_SERVERS: PLAINTEXT://kafka1:29092
SCHEMA_REGISTRY_KAFKASTORE_SECURITY_PROTOCOL: PLAINTEXT
SCHEMA_REGISTRY_HOST_NAME: schemaregistry1
SCHEMA_REGISTRY_LISTENERS: http://schemaregistry1:8085
# Default credentials: admin/letmein
SCHEMA_REGISTRY_AUTHENTICATION_METHOD: BASIC
SCHEMA_REGISTRY_AUTHENTICATION_REALM: SchemaRegistryProps
SCHEMA_REGISTRY_AUTHENTICATION_ROLES: admin
SCHEMA_REGISTRY_OPTS: -Djava.security.auth.login.config=/conf/schema_registry.jaas
SCHEMA_REGISTRY_SCHEMA_REGISTRY_INTER_INSTANCE_PROTOCOL: "http"
SCHEMA_REGISTRY_LOG4J_ROOT_LOGLEVEL: INFO
SCHEMA_REGISTRY_KAFKASTORE_TOPIC: _schemas
kafka-init-topics:
image: confluentinc/cp-kafka:7.2.1
volumes:
- ./data/message.json:/data/message.json
depends_on:
- kafka1
command: "bash -c 'echo Waiting for Kafka to be ready... && \
cub kafka-ready -b kafka1:29092 1 30 && \
kafka-topics --create --topic users --partitions 3 --replication-factor 1 --if-not-exists --bootstrap-server kafka1:29092 && \
kafka-topics --create --topic messages --partitions 2 --replication-factor 1 --if-not-exists --bootstrap-server kafka1:29092 && \
kafka-console-producer --bootstrap-server kafka1:29092 --topic users < /data/message.json'"
kafka-ui:
container_name: kafka-ui
image: provectuslabs/kafka-ui:latest
ports:
- 8080:8080
depends_on:
- kafka1
- schemaregistry1
environment:
KAFKA_CLUSTERS_0_NAME: local
KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS: kafka1:29092
KAFKA_CLUSTERS_0_METRICS_PORT: 9997
KAFKA_CLUSTERS_0_SCHEMAREGISTRY: http://schemaregistry1:8085
KAFKA_CLUSTERS_0_SCHEMAREGISTRYAUTH_USERNAME: admin
KAFKA_CLUSTERS_0_SCHEMAREGISTRYAUTH_PASSWORD: letmein
================================================
FILE: documentation/compose/kafka-connect/Dockerfile
================================================
ARG image
FROM ${image}
## Install connectors
RUN echo "\nInstalling all required connectors...\n" && \
confluent-hub install --no-prompt confluentinc/kafka-connect-jdbc:latest && \
confluent-hub install --no-prompt confluentinc/kafka-connect-github:latest && \
confluent-hub install --no-prompt confluentinc/kafka-connect-s3:latest
================================================
FILE: documentation/compose/kafka-ssl-components.yaml
================================================
---
version: '3.4'
services:
kafka-ui:
container_name: kafka-ui
image: provectuslabs/kafka-ui:latest
ports:
- 8080:8080
depends_on:
- kafka0
- schemaregistry0
- kafka-connect0
- ksqldb0
environment:
KAFKA_CLUSTERS_0_NAME: local
KAFKA_CLUSTERS_0_PROPERTIES_SECURITY_PROTOCOL: SSL
KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS: kafka0:29092 # SSL LISTENER!
KAFKA_CLUSTERS_0_PROPERTIES_SSL_ENDPOINT_IDENTIFICATION_ALGORITHM: '' # DISABLE COMMON NAME VERIFICATION
KAFKA_CLUSTERS_0_SCHEMAREGISTRY: https://schemaregistry0:8085
KAFKA_CLUSTERS_0_SCHEMAREGISTRYSSL_KEYSTORELOCATION: /kafka.keystore.jks
KAFKA_CLUSTERS_0_SCHEMAREGISTRYSSL_KEYSTOREPASSWORD: "secret"
KAFKA_CLUSTERS_0_KSQLDBSERVER: https://ksqldb0:8088
KAFKA_CLUSTERS_0_KSQLDBSERVERSSL_KEYSTORELOCATION: /kafka.keystore.jks
KAFKA_CLUSTERS_0_KSQLDBSERVERSSL_KEYSTOREPASSWORD: "secret"
KAFKA_CLUSTERS_0_KAFKACONNECT_0_NAME: local
KAFKA_CLUSTERS_0_KAFKACONNECT_0_ADDRESS: https://kafka-connect0:8083
KAFKA_CLUSTERS_0_KAFKACONNECT_0_KEYSTORELOCATION: /kafka.keystore.jks
KAFKA_CLUSTERS_0_KAFKACONNECT_0_KEYSTOREPASSWORD: "secret"
KAFKA_CLUSTERS_0_SSL_TRUSTSTORELOCATION: /kafka.truststore.jks
KAFKA_CLUSTERS_0_SSL_TRUSTSTOREPASSWORD: "secret"
DYNAMIC_CONFIG_ENABLED: 'true' # not necessary for ssl, added for tests
volumes:
- ./ssl/kafka.truststore.jks:/kafka.truststore.jks
- ./ssl/kafka.keystore.jks:/kafka.keystore.jks
kafka0:
image: confluentinc/cp-kafka:7.2.1
hostname: kafka0
container_name: kafka0
ports:
- "9092:9092"
- "9997:9997"
environment:
KAFKA_BROKER_ID: 1
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: 'CONTROLLER:PLAINTEXT,SSL:SSL,PLAINTEXT_HOST:PLAINTEXT'
KAFKA_ADVERTISED_LISTENERS: 'SSL://kafka0:29092,PLAINTEXT_HOST://localhost:9092'
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1
KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1
KAFKA_JMX_PORT: 9997
KAFKA_JMX_HOSTNAME: localhost
KAFKA_PROCESS_ROLES: 'broker,controller'
KAFKA_NODE_ID: 1
KAFKA_CONTROLLER_QUORUM_VOTERS: '1@kafka0:29093'
KAFKA_LISTENERS: 'SSL://kafka0:29092,CONTROLLER://kafka0:29093,PLAINTEXT_HOST://0.0.0.0:9092'
KAFKA_INTER_BROKER_LISTENER_NAME: 'SSL'
KAFKA_CONTROLLER_LISTENER_NAMES: 'CONTROLLER'
KAFKA_LOG_DIRS: '/tmp/kraft-combined-logs'
KAFKA_SECURITY_PROTOCOL: SSL
KAFKA_SSL_ENABLED_MECHANISMS: PLAIN,SSL
KAFKA_SSL_KEYSTORE_FILENAME: kafka.keystore.jks
KAFKA_SSL_KEYSTORE_CREDENTIALS: creds
KAFKA_SSL_KEY_CREDENTIALS: creds
KAFKA_SSL_TRUSTSTORE_FILENAME: kafka.truststore.jks
KAFKA_SSL_TRUSTSTORE_CREDENTIALS: creds
#KAFKA_SSL_CLIENT_AUTH: 'required'
KAFKA_SSL_CLIENT_AUTH: 'requested'
KAFKA_SSL_ENDPOINT_IDENTIFICATION_ALGORITHM: '' # COMMON NAME VERIFICATION IS DISABLED SERVER-SIDE
volumes:
- ./scripts/update_run.sh:/tmp/update_run.sh
- ./ssl/creds:/etc/kafka/secrets/creds
- ./ssl/kafka.truststore.jks:/etc/kafka/secrets/kafka.truststore.jks
- ./ssl/kafka.keystore.jks:/etc/kafka/secrets/kafka.keystore.jks
command: "bash -c 'if [ ! -f /tmp/update_run.sh ]; then echo \"ERROR: Did you forget the update_run.sh file that came with this docker-compose.yml file?\" && exit 1 ; else /tmp/update_run.sh && /etc/confluent/docker/run ; fi'"
schemaregistry0:
image: confluentinc/cp-schema-registry:7.2.1
depends_on:
- kafka0
environment:
SCHEMA_REGISTRY_KAFKASTORE_BOOTSTRAP_SERVERS: SSL://kafka0:29092
SCHEMA_REGISTRY_KAFKASTORE_SECURITY_PROTOCOL: SSL
SCHEMA_REGISTRY_KAFKASTORE_SSL_TRUSTSTORE_LOCATION: /kafka.truststore.jks
SCHEMA_REGISTRY_KAFKASTORE_SSL_TRUSTSTORE_PASSWORD: secret
SCHEMA_REGISTRY_KAFKASTORE_SSL_KEYSTORE_LOCATION: /kafka.keystore.jks
SCHEMA_REGISTRY_KAFKASTORE_SSL_KEYSTORE_PASSWORD: secret
SCHEMA_REGISTRY_KAFKASTORE_SSL_KEY_PASSWORD: secret
SCHEMA_REGISTRY_HOST_NAME: schemaregistry0
SCHEMA_REGISTRY_LISTENERS: https://schemaregistry0:8085
SCHEMA_REGISTRY_INTER_INSTANCE_PROTOCOL: https
SCHEMA_REGISTRY_SCHEMA_REGISTRY_INTER_INSTANCE_PROTOCOL: "https"
SCHEMA_REGISTRY_LOG4J_ROOT_LOGLEVEL: INFO
SCHEMA_REGISTRY_KAFKASTORE_TOPIC: _schemas
SCHEMA_REGISTRY_SSL_CLIENT_AUTHENTICATION: "REQUIRED"
SCHEMA_REGISTRY_SSL_TRUSTSTORE_LOCATION: /kafka.truststore.jks
SCHEMA_REGISTRY_SSL_TRUSTSTORE_PASSWORD: secret
SCHEMA_REGISTRY_SSL_KEYSTORE_LOCATION: /kafka.keystore.jks
SCHEMA_REGISTRY_SSL_KEYSTORE_PASSWORD: secret
SCHEMA_REGISTRY_SSL_KEY_PASSWORD: secret
ports:
- 8085:8085
volumes:
- ./ssl/kafka.truststore.jks:/kafka.truststore.jks
- ./ssl/kafka.keystore.jks:/kafka.keystore.jks
kafka-connect0:
image: confluentinc/cp-kafka-connect:7.2.1
ports:
- 8083:8083
depends_on:
- kafka0
- schemaregistry0
environment:
CONNECT_BOOTSTRAP_SERVERS: kafka0:29092
CONNECT_GROUP_ID: compose-connect-group
CONNECT_CONFIG_STORAGE_TOPIC: _connect_configs
CONNECT_CONFIG_STORAGE_REPLICATION_FACTOR: 1
CONNECT_OFFSET_STORAGE_TOPIC: _connect_offset
CONNECT_OFFSET_STORAGE_REPLICATION_FACTOR: 1
CONNECT_STATUS_STORAGE_TOPIC: _connect_status
CONNECT_STATUS_STORAGE_REPLICATION_FACTOR: 1
CONNECT_KEY_CONVERTER: org.apache.kafka.connect.storage.StringConverter
CONNECT_KEY_CONVERTER_SCHEMA_REGISTRY_URL: https://schemaregistry0:8085
CONNECT_VALUE_CONVERTER: org.apache.kafka.connect.storage.StringConverter
CONNECT_VALUE_CONVERTER_SCHEMA_REGISTRY_URL: https://schemaregistry0:8085
CONNECT_INTERNAL_KEY_CONVERTER: org.apache.kafka.connect.json.JsonConverter
CONNECT_INTERNAL_VALUE_CONVERTER: org.apache.kafka.connect.json.JsonConverter
CONNECT_REST_ADVERTISED_HOST_NAME: kafka-connect0
CONNECT_PLUGIN_PATH: "/usr/share/java,/usr/share/confluent-hub-components"
CONNECT_SECURITY_PROTOCOL: "SSL"
CONNECT_SSL_KEYSTORE_LOCATION: "/kafka.keystore.jks"
CONNECT_SSL_KEY_PASSWORD: "secret"
CONNECT_SSL_KEYSTORE_PASSWORD: "secret"
CONNECT_SSL_TRUSTSTORE_LOCATION: "/kafka.truststore.jks"
CONNECT_SSL_TRUSTSTORE_PASSWORD: "secret"
CONNECT_SSL_CLIENT_AUTH: "requested"
CONNECT_REST_ADVERTISED_LISTENER: "https"
CONNECT_LISTENERS: "https://kafka-connect0:8083"
volumes:
- ./ssl/kafka.truststore.jks:/kafka.truststore.jks
- ./ssl/kafka.keystore.jks:/kafka.keystore.jks
ksqldb0:
image: confluentinc/ksqldb-server:0.18.0
depends_on:
- kafka0
- kafka-connect0
- schemaregistry0
ports:
- 8088:8088
environment:
KSQL_CUB_KAFKA_TIMEOUT: 120
KSQL_LISTENERS: https://0.0.0.0:8088
KSQL_BOOTSTRAP_SERVERS: SSL://kafka0:29092
KSQL_SECURITY_PROTOCOL: SSL
KSQL_SSL_TRUSTSTORE_LOCATION: /kafka.truststore.jks
KSQL_SSL_TRUSTSTORE_PASSWORD: secret
KSQL_SSL_KEYSTORE_LOCATION: /kafka.keystore.jks
KSQL_SSL_KEYSTORE_PASSWORD: secret
KSQL_SSL_KEY_PASSWORD: secret
KSQL_SSL_CLIENT_AUTHENTICATION: REQUIRED
KSQL_KSQL_LOGGING_PROCESSING_STREAM_AUTO_CREATE: "true"
KSQL_KSQL_LOGGING_PROCESSING_TOPIC_AUTO_CREATE: "true"
KSQL_KSQL_CONNECT_URL: https://kafka-connect0:8083
KSQL_KSQL_SCHEMA_REGISTRY_URL: https://schemaregistry0:8085
KSQL_KSQL_SERVICE_ID: my_ksql_1
KSQL_KSQL_HIDDEN_TOPICS: '^_.*'
KSQL_CACHE_MAX_BYTES_BUFFERING: 0
volumes:
- ./ssl/kafka.truststore.jks:/kafka.truststore.jks
- ./ssl/kafka.keystore.jks:/kafka.keystore.jks
================================================
FILE: documentation/compose/kafka-ssl.yml
================================================
---
version: '3.4'
services:
kafka-ui:
container_name: kafka-ui
image: provectuslabs/kafka-ui:latest
ports:
- 8080:8080
depends_on:
- kafka
environment:
KAFKA_CLUSTERS_0_NAME: local
KAFKA_CLUSTERS_0_PROPERTIES_SECURITY_PROTOCOL: SSL
KAFKA_CLUSTERS_0_PROPERTIES_SSL_KEYSTORE_LOCATION: /kafka.keystore.jks
KAFKA_CLUSTERS_0_PROPERTIES_SSL_KEYSTORE_PASSWORD: "secret"
KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS: kafka:29092 # SSL LISTENER!
KAFKA_CLUSTERS_0_SSL_TRUSTSTORELOCATION: /kafka.truststore.jks
KAFKA_CLUSTERS_0_SSL_TRUSTSTOREPASSWORD: "secret"
KAFKA_CLUSTERS_0_PROPERTIES_SSL_ENDPOINT_IDENTIFICATION_ALGORITHM: '' # DISABLE COMMON NAME VERIFICATION
volumes:
- ./ssl/kafka.truststore.jks:/kafka.truststore.jks
- ./ssl/kafka.keystore.jks:/kafka.keystore.jks
kafka:
image: confluentinc/cp-kafka:7.2.1
hostname: kafka
container_name: kafka
ports:
- "9092:9092"
- "9997:9997"
environment:
KAFKA_BROKER_ID: 1
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: 'CONTROLLER:PLAINTEXT,SSL:SSL,PLAINTEXT_HOST:PLAINTEXT'
KAFKA_ADVERTISED_LISTENERS: 'SSL://kafka:29092,PLAINTEXT_HOST://localhost:9092'
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1
KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1
KAFKA_JMX_PORT: 9997
KAFKA_JMX_HOSTNAME: localhost
KAFKA_PROCESS_ROLES: 'broker,controller'
KAFKA_NODE_ID: 1
KAFKA_CONTROLLER_QUORUM_VOTERS: '1@kafka:29093'
KAFKA_LISTENERS: 'SSL://kafka:29092,CONTROLLER://kafka:29093,PLAINTEXT_HOST://0.0.0.0:9092'
KAFKA_INTER_BROKER_LISTENER_NAME: 'SSL'
KAFKA_CONTROLLER_LISTENER_NAMES: 'CONTROLLER'
KAFKA_LOG_DIRS: '/tmp/kraft-combined-logs'
KAFKA_SECURITY_PROTOCOL: SSL
KAFKA_SSL_ENABLED_MECHANISMS: PLAIN,SSL
KAFKA_SSL_KEYSTORE_FILENAME: kafka.keystore.jks
KAFKA_SSL_KEYSTORE_CREDENTIALS: creds
KAFKA_SSL_KEY_CREDENTIALS: creds
KAFKA_SSL_TRUSTSTORE_FILENAME: kafka.truststore.jks
KAFKA_SSL_TRUSTSTORE_CREDENTIALS: creds
#KAFKA_SSL_CLIENT_AUTH: 'required'
KAFKA_SSL_CLIENT_AUTH: 'requested'
KAFKA_SSL_ENDPOINT_IDENTIFICATION_ALGORITHM: '' # COMMON NAME VERIFICATION IS DISABLED SERVER-SIDE
volumes:
- ./scripts/update_run.sh:/tmp/update_run.sh
- ./ssl/creds:/etc/kafka/secrets/creds
- ./ssl/kafka.truststore.jks:/etc/kafka/secrets/kafka.truststore.jks
- ./ssl/kafka.keystore.jks:/etc/kafka/secrets/kafka.keystore.jks
command: "bash -c 'if [ ! -f /tmp/update_run.sh ]; then echo \"ERROR: Did you forget the update_run.sh file that came with this docker-compose.yml file?\" && exit 1 ; else /tmp/update_run.sh && /etc/confluent/docker/run ; fi'"
================================================
FILE: documentation/compose/kafka-ui-acl-with-zk.yaml
================================================
---
version: '2'
services:
kafka-ui:
container_name: kafka-ui
image: provectuslabs/kafka-ui:latest
ports:
- 8080:8080
depends_on:
- zookeeper
- kafka
environment:
KAFKA_CLUSTERS_0_NAME: local
KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS: kafka:29092
KAFKA_CLUSTERS_0_PROPERTIES_SECURITY_PROTOCOL: SASL_PLAINTEXT
KAFKA_CLUSTERS_0_PROPERTIES_SASL_MECHANISM: PLAIN
KAFKA_CLUSTERS_0_PROPERTIES_SASL_JAAS_CONFIG: 'org.apache.kafka.common.security.plain.PlainLoginModule required username="admin" password="admin-secret";'
zookeeper:
image: wurstmeister/zookeeper:3.4.6
environment:
JVMFLAGS: "-Djava.security.auth.login.config=/etc/zookeeper/zookeeper_jaas.conf"
volumes:
- ./jaas/zookeeper_jaas.conf:/etc/zookeeper/zookeeper_jaas.conf
ports:
- 2181:2181
kafka:
image: confluentinc/cp-kafka:7.2.1
hostname: kafka
container_name: kafka
ports:
- "9092:9092"
- "9997:9997"
environment:
KAFKA_BROKER_ID: 1
KAFKA_ZOOKEEPER_CONNECT: 'zookeeper:2181'
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: 'CONTROLLER:PLAINTEXT,SASL_PLAINTEXT:SASL_PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT'
KAFKA_ADVERTISED_LISTENERS: 'SASL_PLAINTEXT://kafka:29092,PLAINTEXT_HOST://localhost:9092'
KAFKA_OPTS: "-Djava.security.auth.login.config=/etc/kafka/jaas/kafka_server.conf"
KAFKA_AUTHORIZER_CLASS_NAME: "kafka.security.authorizer.AclAuthorizer"
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1
KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1
KAFKA_JMX_PORT: 9997
KAFKA_JMX_HOSTNAME: localhost
KAFKA_NODE_ID: 1
KAFKA_CONTROLLER_QUORUM_VOTERS: '1@kafka:29093'
KAFKA_LISTENERS: 'SASL_PLAINTEXT://kafka:29092,CONTROLLER://kafka:29093,PLAINTEXT_HOST://0.0.0.0:9092'
KAFKA_INTER_BROKER_LISTENER_NAME: 'SASL_PLAINTEXT'
KAFKA_SASL_ENABLED_MECHANISMS: 'PLAIN'
KAFKA_SASL_MECHANISM_INTER_BROKER_PROTOCOL: 'PLAIN'
KAFKA_SECURITY_PROTOCOL: 'SASL_PLAINTEXT'
KAFKA_SUPER_USERS: 'User:admin'
volumes:
- ./scripts/update_run.sh:/tmp/update_run.sh
- ./jaas:/etc/kafka/jaas
================================================
FILE: documentation/compose/kafka-ui-arm64.yaml
================================================
# ARM64 supported images for kafka can be found here
# https://hub.docker.com/r/confluentinc/cp-kafka/tags?page=1&name=arm64
---
version: '2'
services:
kafka-ui:
container_name: kafka-ui
image: provectuslabs/kafka-ui:latest
ports:
- 8080:8080
depends_on:
- kafka0
- schema-registry0
- kafka-connect0
environment:
KAFKA_CLUSTERS_0_NAME: local
KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS: kafka0:29092
KAFKA_CLUSTERS_0_METRICS_PORT: 9997
KAFKA_CLUSTERS_0_SCHEMAREGISTRY: http://schema-registry0:8085
KAFKA_CLUSTERS_0_KAFKACONNECT_0_NAME: first
KAFKA_CLUSTERS_0_KAFKACONNECT_0_ADDRESS: http://kafka-connect0:8083
DYNAMIC_CONFIG_ENABLED: 'true' # not necessary, added for tests
KAFKA_CLUSTERS_0_AUDIT_TOPICAUDITENABLED: 'true'
KAFKA_CLUSTERS_0_AUDIT_CONSOLEAUDITENABLED: 'true'
kafka0:
image: confluentinc/cp-kafka:7.2.1.arm64
hostname: kafka0
container_name: kafka0
ports:
- 9092:9092
- 9997:9997
environment:
KAFKA_BROKER_ID: 1
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,CONTROLLER:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka0:29092,PLAINTEXT_HOST://localhost:9092
KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1
KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1
KAFKA_PROCESS_ROLES: 'broker,controller'
KAFKA_NODE_ID: 1
KAFKA_CONTROLLER_QUORUM_VOTERS: '1@kafka0:29093'
KAFKA_LISTENERS: 'PLAINTEXT://kafka0:29092,CONTROLLER://kafka0:29093,PLAINTEXT_HOST://0.0.0.0:9092'
KAFKA_CONTROLLER_LISTENER_NAMES: 'CONTROLLER'
KAFKA_LOG_DIRS: '/tmp/kraft-combined-logs'
KAFKA_JMX_PORT: 9997
KAFKA_JMX_OPTS: -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=kafka0 -Dcom.sun.management.jmxremote.rmi.port=9997
volumes:
- ./scripts/update_run.sh:/tmp/update_run.sh
command: "bash -c 'if [ ! -f /tmp/update_run.sh ]; then echo \"ERROR: Did you forget the update_run.sh file that came with this docker-compose.yml file?\" && exit 1 ; else /tmp/update_run.sh && /etc/confluent/docker/run ; fi'"
schema-registry0:
image: confluentinc/cp-schema-registry:7.2.1.arm64
ports:
- 8085:8085
depends_on:
- kafka0
environment:
SCHEMA_REGISTRY_KAFKASTORE_BOOTSTRAP_SERVERS: PLAINTEXT://kafka0:29092
SCHEMA_REGISTRY_KAFKASTORE_SECURITY_PROTOCOL: PLAINTEXT
SCHEMA_REGISTRY_HOST_NAME: schema-registry0
SCHEMA_REGISTRY_LISTENERS: http://schema-registry0:8085
SCHEMA_REGISTRY_SCHEMA_REGISTRY_INTER_INSTANCE_PROTOCOL: "http"
SCHEMA_REGISTRY_LOG4J_ROOT_LOGLEVEL: INFO
SCHEMA_REGISTRY_KAFKASTORE_TOPIC: _schemas
kafka-connect0:
image: confluentinc/cp-kafka-connect:7.2.1.arm64
ports:
- 8083:8083
depends_on:
- kafka0
- schema-registry0
environment:
CONNECT_BOOTSTRAP_SERVERS: kafka0:29092
CONNECT_GROUP_ID: compose-connect-group
CONNECT_CONFIG_STORAGE_TOPIC: _connect_configs
CONNECT_CONFIG_STORAGE_REPLICATION_FACTOR: 1
CONNECT_OFFSET_STORAGE_TOPIC: _connect_offset
CONNECT_OFFSET_STORAGE_REPLICATION_FACTOR: 1
CONNECT_STATUS_STORAGE_TOPIC: _connect_status
CONNECT_STATUS_STORAGE_REPLICATION_FACTOR: 1
CONNECT_KEY_CONVERTER: org.apache.kafka.connect.storage.StringConverter
CONNECT_KEY_CONVERTER_SCHEMA_REGISTRY_URL: http://schema-registry0:8085
CONNECT_VALUE_CONVERTER: org.apache.kafka.connect.storage.StringConverter
CONNECT_VALUE_CONVERTER_SCHEMA_REGISTRY_URL: http://schema-registry0:8085
CONNECT_INTERNAL_KEY_CONVERTER: org.apache.kafka.connect.json.JsonConverter
CONNECT_INTERNAL_VALUE_CONVERTER: org.apache.kafka.connect.json.JsonConverter
CONNECT_REST_ADVERTISED_HOST_NAME: kafka-connect0
CONNECT_PLUGIN_PATH: "/usr/share/java,/usr/share/confluent-hub-components"
kafka-init-topics:
image: confluentinc/cp-kafka:7.2.1.arm64
volumes:
- ./data/message.json:/data/message.json
depends_on:
- kafka0
command: "bash -c 'echo Waiting for Kafka to be ready... && \
cub kafka-ready -b kafka0:29092 1 30 && \
kafka-topics --create --topic second.users --partitions 3 --replication-factor 1 --if-not-exists --bootstrap-server kafka0:29092 && \
kafka-topics --create --topic second.messages --partitions 2 --replication-factor 1 --if-not-exists --bootstrap-server kafka0:29092 && \
kafka-topics --create --topic first.messages --partitions 2 --replication-factor 1 --if-not-exists --bootstrap-server kafka0:29092 && \
kafka-console-producer --bootstrap-server kafka0:29092 --topic second.users < /data/message.json'"
================================================
FILE: documentation/compose/kafka-ui-auth-context.yaml
================================================
---
version: '2'
services:
kafka-ui:
container_name: kafka-ui
image: provectuslabs/kafka-ui:latest
ports:
- 8080:8080
depends_on:
- kafka
environment:
KAFKA_CLUSTERS_0_NAME: local
KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS: kafka:29092
KAFKA_CLUSTERS_0_METRICS_PORT: 9997
SERVER_SERVLET_CONTEXT_PATH: /kafkaui
AUTH_TYPE: "LOGIN_FORM"
SPRING_SECURITY_USER_NAME: admin
SPRING_SECURITY_USER_PASSWORD: pass
kafka:
image: confluentinc/cp-kafka:7.2.1
hostname: kafka
container_name: kafka
ports:
- "9092:9092"
- "9997:9997"
environment:
KAFKA_BROKER_ID: 1
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: 'CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT'
KAFKA_ADVERTISED_LISTENERS: 'PLAINTEXT://kafka:29092,PLAINTEXT_HOST://localhost:9092'
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1
KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1
KAFKA_JMX_PORT: 9997
KAFKA_JMX_HOSTNAME: localhost
KAFKA_PROCESS_ROLES: 'broker,controller'
KAFKA_NODE_ID: 1
KAFKA_CONTROLLER_QUORUM_VOTERS: '1@kafka:29093'
KAFKA_LISTENERS: 'PLAINTEXT://kafka:29092,CONTROLLER://kafka:29093,PLAINTEXT_HOST://0.0.0.0:9092'
KAFKA_INTER_BROKER_LISTENER_NAME: 'PLAINTEXT'
KAFKA_CONTROLLER_LISTENER_NAMES: 'CONTROLLER'
KAFKA_LOG_DIRS: '/tmp/kraft-combined-logs'
volumes:
- ./scripts/update_run.sh:/tmp/update_run.sh
command: "bash -c 'if [ ! -f /tmp/update_run.sh ]; then echo \"ERROR: Did you forget the update_run.sh file that came with this docker-compose.yml file?\" && exit 1 ; else /tmp/update_run.sh && /etc/confluent/docker/run ; fi'"
================================================
FILE: documentation/compose/kafka-ui-connectors-auth.yaml
================================================
---
version: "2"
services:
kafka-ui:
container_name: kafka-ui
image: provectuslabs/kafka-ui:latest
ports:
- 8080:8080
depends_on:
- kafka0
- schemaregistry0
- kafka-connect0
environment:
KAFKA_CLUSTERS_0_NAME: local
KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS: kafka0:29092
KAFKA_CLUSTERS_0_METRICS_PORT: 9997
KAFKA_CLUSTERS_0_SCHEMAREGISTRY: http://schemaregistry0:8085
KAFKA_CLUSTERS_0_KAFKACONNECT_0_NAME: first
KAFKA_CLUSTERS_0_KAFKACONNECT_0_ADDRESS: http://kafka-connect0:8083
KAFKA_CLUSTERS_0_KAFKACONNECT_0_USERNAME: admin
KAFKA_CLUSTERS_0_KAFKACONNECT_0_PASSWORD: admin-secret
kafka0:
image: confluentinc/cp-kafka:7.2.1
hostname: kafka0
container_name: kafka0
ports:
- "9092:9092"
- "9997:9997"
environment:
KAFKA_BROKER_ID: 1
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: "CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT"
KAFKA_ADVERTISED_LISTENERS: "PLAINTEXT://kafka0:29092,PLAINTEXT_HOST://localhost:9092"
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1
KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1
KAFKA_JMX_PORT: 9997
KAFKA_JMX_HOSTNAME: localhost
KAFKA_JMX_OPTS: -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=kafka0 -Dcom.sun.management.jmxremote.rmi.port=9997
KAFKA_PROCESS_ROLES: "broker,controller"
KAFKA_NODE_ID: 1
KAFKA_CONTROLLER_QUORUM_VOTERS: "1@kafka0:29093"
KAFKA_LISTENERS: "PLAINTEXT://kafka0:29092,CONTROLLER://kafka0:29093,PLAINTEXT_HOST://0.0.0.0:9092"
KAFKA_INTER_BROKER_LISTENER_NAME: "PLAINTEXT"
KAFKA_CONTROLLER_LISTENER_NAMES: "CONTROLLER"
KAFKA_LOG_DIRS: "/tmp/kraft-combined-logs"
volumes:
- ./scripts/update_run.sh:/tmp/update_run.sh
command: 'bash -c ''if [ ! -f /tmp/update_run.sh ]; then echo "ERROR: Did you forget the update_run.sh file that came with this docker-compose.yml file?" && exit 1 ; else /tmp/update_run.sh && /etc/confluent/docker/run ; fi'''
schemaregistry0:
image: confluentinc/cp-schema-registry:7.2.1
ports:
- 8085:8085
depends_on:
- kafka0
environment:
SCHEMA_REGISTRY_KAFKASTORE_BOOTSTRAP_SERVERS: PLAINTEXT://kafka0:29092
SCHEMA_REGISTRY_KAFKASTORE_SECURITY_PROTOCOL: PLAINTEXT
SCHEMA_REGISTRY_HOST_NAME: schemaregistry0
SCHEMA_REGISTRY_LISTENERS: http://schemaregistry0:8085
SCHEMA_REGISTRY_SCHEMA_REGISTRY_INTER_INSTANCE_PROTOCOL: "http"
SCHEMA_REGISTRY_LOG4J_ROOT_LOGLEVEL: INFO
SCHEMA_REGISTRY_KAFKASTORE_TOPIC: _schemas
kafka-connect0:
build:
context: ./kafka-connect
args:
image: confluentinc/cp-kafka-connect:7.2.1
ports:
- 8083:8083
depends_on:
- kafka0
- schemaregistry0
volumes:
- ./jaas:/conf
environment:
CONNECT_BOOTSTRAP_SERVERS: kafka0:29092
CONNECT_GROUP_ID: compose-connect-group
CONNECT_CONFIG_STORAGE_TOPIC: _connect_configs
CONNECT_CONFIG_STORAGE_REPLICATION_FACTOR: 1
CONNECT_OFFSET_STORAGE_TOPIC: _connect_offset
CONNECT_OFFSET_STORAGE_REPLICATION_FACTOR: 1
CONNECT_STATUS_STORAGE_TOPIC: _connect_status
CONNECT_STATUS_STORAGE_REPLICATION_FACTOR: 1
CONNECT_KEY_CONVERTER: org.apache.kafka.connect.storage.StringConverter
CONNECT_KEY_CONVERTER_SCHEMA_REGISTRY_URL: http://schemaregistry0:8085
CONNECT_VALUE_CONVERTER: org.apache.kafka.connect.storage.StringConverter
CONNECT_VALUE_CONVERTER_SCHEMA_REGISTRY_URL: http://schemaregistry0:8085
CONNECT_INTERNAL_KEY_CONVERTER: org.apache.kafka.connect.json.JsonConverter
CONNECT_INTERNAL_VALUE_CONVERTER: org.apache.kafka.connect.json.JsonConverter
CONNECT_REST_ADVERTISED_HOST_NAME: kafka-connect0
CONNECT_REST_PORT: 8083
CONNECT_PLUGIN_PATH: "/usr/share/java,/usr/share/confluent-hub-components"
CONNECT_REST_EXTENSION_CLASSES: "org.apache.kafka.connect.rest.basic.auth.extension.BasicAuthSecurityRestExtension"
KAFKA_OPTS: "-Djava.security.auth.login.config=/conf/kafka_connect.jaas"
# AWS_ACCESS_KEY_ID: ""
# AWS_SECRET_ACCESS_KEY: ""
kafka-init-topics:
image: confluentinc/cp-kafka:7.2.1
volumes:
- ./data/message.json:/data/message.json
depends_on:
- kafka0
command: "bash -c 'echo Waiting for Kafka to be ready... && \
cub kafka-ready -b kafka0:29092 1 30 && \
kafka-topics --create --topic users --partitions 3 --replication-factor 1 --if-not-exists --bootstrap-server kafka0:29092 && \
kafka-topics --create --topic messages --partitions 2 --replication-factor 1 --if-not-exists --bootstrap-server kafka0:29092 && \
kafka-console-producer --bootstrap-server kafka0:29092 --topic users < /data/message.json'"
================================================
FILE: documentation/compose/kafka-ui-jmx-secured.yml
================================================
---
version: '2'
services:
kafka-ui:
container_name: kafka-ui
image: provectuslabs/kafka-ui:latest
ports:
- 8080:8080
depends_on:
- kafka0
environment:
KAFKA_CLUSTERS_0_NAME: local
KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS: kafka0:29092
KAFKA_CLUSTERS_0_SCHEMAREGISTRY: http://schemaregistry0:8085
KAFKA_CLUSTERS_0_KAFKACONNECT_0_NAME: first
KAFKA_CLUSTERS_0_KAFKACONNECT_0_ADDRESS: http://kafka-connect0:8083
KAFKA_CLUSTERS_0_METRICS_PORT: 9997
KAFKA_CLUSTERS_0_METRICS_USERNAME: root
KAFKA_CLUSTERS_0_METRICS_PASSWORD: password
KAFKA_CLUSTERS_0_METRICS_KEYSTORE_LOCATION: /jmx/clientkeystore
KAFKA_CLUSTERS_0_METRICS_KEYSTORE_PASSWORD: '12345678'
KAFKA_CLUSTERS_0_SSL_TRUSTSTORE_LOCATION: /jmx/clienttruststore
KAFKA_CLUSTERS_0_SSL_TRUSTSTORE_PASSWORD: '12345678'
volumes:
- ./jmx/clienttruststore:/jmx/clienttruststore
- ./jmx/clientkeystore:/jmx/clientkeystore
kafka0:
image: confluentinc/cp-kafka:7.2.1
hostname: kafka0
container_name: kafka0
ports:
- 9092:9092
- 9997:9997
environment:
KAFKA_BROKER_ID: 1
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: 'CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT'
KAFKA_ADVERTISED_LISTENERS: 'PLAINTEXT://kafka0:29092,PLAINTEXT_HOST://localhost:9092'
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1
KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1
KAFKA_JMX_PORT: 9997
KAFKA_PROCESS_ROLES: 'broker,controller'
KAFKA_NODE_ID: 1
KAFKA_CONTROLLER_QUORUM_VOTERS: '1@kafka0:29093'
KAFKA_LISTENERS: 'PLAINTEXT://kafka0:29092,CONTROLLER://kafka0:29093,PLAINTEXT_HOST://0.0.0.0:9092'
KAFKA_INTER_BROKER_LISTENER_NAME: 'PLAINTEXT'
KAFKA_CONTROLLER_LISTENER_NAMES: 'CONTROLLER'
KAFKA_LOG_DIRS: '/tmp/kraft-combined-logs'
# CHMOD 700 FOR JMXREMOTE.* FILES
KAFKA_JMX_OPTS: >-
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.authenticate=true
-Dcom.sun.management.jmxremote.ssl=true
-Dcom.sun.management.jmxremote.registry.ssl=true
-Dcom.sun.management.jmxremote.ssl.need.client.auth=true
-Djavax.net.ssl.keyStore=/jmx/serverkeystore
-Djavax.net.ssl.keyStorePassword=12345678
-Djavax.net.ssl.trustStore=/jmx/servertruststore
-Djavax.net.ssl.trustStorePassword=12345678
-Dcom.sun.management.jmxremote.password.file=/jmx/jmxremote.password
-Dcom.sun.management.jmxremote.access.file=/jmx/jmxremote.access
-Dcom.sun.management.jmxremote.rmi.port=9997
-Djava.rmi.server.hostname=kafka0
volumes:
- ./jmx/serverkeystore:/jmx/serverkeystore
- ./jmx/servertruststore:/jmx/servertruststore
- ./jmx/jmxremote.password:/jmx/jmxremote.password
- ./jmx/jmxremote.access:/jmx/jmxremote.access
- ./scripts/update_run.sh:/tmp/update_run.sh
command: "bash -c 'if [ ! -f /tmp/update_run.sh ]; then echo \"ERROR: Did you forget the update_run.sh file that came with this docker-compose.yml file?\" && exit 1 ; else /tmp/update_run.sh && /etc/confluent/docker/run ; fi'"
================================================
FILE: documentation/compose/kafka-ui-sasl.yaml
================================================
---
version: '2'
services:
kafka-ui:
container_name: kafka-ui
image: provectuslabs/kafka-ui:latest
ports:
- 8080:8080
depends_on:
- kafka
environment:
KAFKA_CLUSTERS_0_NAME: local
KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS: kafka:29092
KAFKA_CLUSTERS_0_PROPERTIES_SECURITY_PROTOCOL: SASL_PLAINTEXT
KAFKA_CLUSTERS_0_PROPERTIES_SASL_MECHANISM: PLAIN
KAFKA_CLUSTERS_0_PROPERTIES_SASL_JAAS_CONFIG: 'org.apache.kafka.common.security.plain.PlainLoginModule required username="admin" password="admin-secret";'
DYNAMIC_CONFIG_ENABLED: true # not necessary for sasl auth, added for tests
kafka:
image: confluentinc/cp-kafka:7.2.1
hostname: kafka
container_name: kafka
ports:
- "9092:9092"
- "9997:9997"
environment:
KAFKA_BROKER_ID: 1
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: 'CONTROLLER:PLAINTEXT,SASL_PLAINTEXT:SASL_PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT'
KAFKA_ADVERTISED_LISTENERS: 'SASL_PLAINTEXT://kafka:29092,PLAINTEXT_HOST://localhost:9092'
KAFKA_OPTS: "-Djava.security.auth.login.config=/etc/kafka/jaas/kafka_server.conf"
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1
KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1
KAFKA_JMX_PORT: 9997
KAFKA_JMX_HOSTNAME: localhost
KAFKA_PROCESS_ROLES: 'broker,controller'
KAFKA_NODE_ID: 1
KAFKA_CONTROLLER_QUORUM_VOTERS: '1@kafka:29093'
KAFKA_LISTENERS: 'SASL_PLAINTEXT://kafka:29092,CONTROLLER://kafka:29093,PLAINTEXT_HOST://0.0.0.0:9092'
KAFKA_INTER_BROKER_LISTENER_NAME: 'SASL_PLAINTEXT'
KAFKA_SASL_ENABLED_MECHANISMS: 'PLAIN'
KAFKA_SASL_MECHANISM_INTER_BROKER_PROTOCOL: 'PLAIN'
KAFKA_CONTROLLER_LISTENER_NAMES: 'CONTROLLER'
KAFKA_LOG_DIRS: '/tmp/kraft-combined-logs'
KAFKA_SECURITY_PROTOCOL: 'SASL_PLAINTEXT'
KAFKA_SUPER_USERS: 'User:admin,User:enzo'
volumes:
- ./scripts/update_run.sh:/tmp/update_run.sh
- ./jaas:/etc/kafka/jaas
command: "bash -c 'if [ ! -f /tmp/update_run.sh ]; then echo \"ERROR: Did you forget the update_run.sh file that came with this docker-compose.yml file?\" && exit 1 ; else /tmp/update_run.sh && /etc/confluent/docker/run ; fi'"
================================================
FILE: documentation/compose/kafka-ui-serdes.yaml
================================================
---
version: '2'
services:
kafka-ui:
container_name: kafka-ui
image: provectuslabs/kafka-ui:latest
ports:
- 8080:8080
depends_on:
- kafka0
- schemaregistry0
environment:
kafka.clusters.0.name: SerdeExampleCluster
kafka.clusters.0.bootstrapServers: kafka0:29092
kafka.clusters.0.schemaRegistry: http://schemaregistry0:8085
# optional SSL settings for cluster (will be used by SchemaRegistry serde, if set)
#kafka.clusters.0.ssl.keystoreLocation: /kafka.keystore.jks
#kafka.clusters.0.ssl.keystorePassword: "secret"
#kafka.clusters.0.ssl.truststoreLocation: /kafka.truststore.jks
#kafka.clusters.0.ssl.truststorePassword: "secret"
# optional auth properties for SR
#kafka.clusters.0.schemaRegistryAuth.username: "use"
#kafka.clusters.0.schemaRegistryAuth.password: "pswrd"
kafka.clusters.0.defaultKeySerde: Int32 #optional
kafka.clusters.0.defaultValueSerde: String #optional
kafka.clusters.0.serde.0.name: ProtobufFile
kafka.clusters.0.serde.0.topicKeysPattern: "topic1"
kafka.clusters.0.serde.0.topicValuesPattern: "topic1"
kafka.clusters.0.serde.0.properties.protobufFilesDir: /protofiles/
kafka.clusters.0.serde.0.properties.protobufMessageNameForKey: test.MyKey # default type for keys
kafka.clusters.0.serde.0.properties.protobufMessageName: test.MyValue # default type for values
kafka.clusters.0.serde.0.properties.protobufMessageNameForKeyByTopic.topic1: test.MySpecificTopicKey # keys type for topic "topic1"
kafka.clusters.0.serde.0.properties.protobufMessageNameByTopic.topic1: test.MySpecificTopicValue # values type for topic "topic1"
kafka.clusters.0.serde.1.name: String
#kafka.clusters.0.serde.1.properties.encoding: "UTF-16" #optional, default is UTF-8
kafka.clusters.0.serde.1.topicValuesPattern: "json-events|text-events"
kafka.clusters.0.serde.2.name: AsciiString
kafka.clusters.0.serde.2.className: com.provectus.kafka.ui.serdes.builtin.StringSerde
kafka.clusters.0.serde.2.properties.encoding: "ASCII"
kafka.clusters.0.serde.3.name: SchemaRegistry # will be configured automatically using cluster SR
kafka.clusters.0.serde.3.topicValuesPattern: "sr-topic.*"
kafka.clusters.0.serde.4.name: AnotherSchemaRegistry
kafka.clusters.0.serde.4.className: com.provectus.kafka.ui.serdes.builtin.sr.SchemaRegistrySerde
kafka.clusters.0.serde.4.properties.url: http://schemaregistry0:8085
kafka.clusters.0.serde.4.properties.keySchemaNameTemplate: "%s-key"
kafka.clusters.0.serde.4.properties.schemaNameTemplate: "%s-value"
#kafka.clusters.0.serde.4.topicValuesPattern: "sr2-topic.*"
# optional auth and ssl properties for SR (overrides cluster-level):
#kafka.clusters.0.serde.4.properties.username: "user"
#kafka.clusters.0.serde.4.properties.password: "passw"
#kafka.clusters.0.serde.4.properties.keystoreLocation: /kafka.keystore.jks
#kafka.clusters.0.serde.4.properties.keystorePassword: "secret"
#kafka.clusters.0.serde.4.properties.truststoreLocation: /kafka.truststore.jks
#kafka.clusters.0.serde.4.properties.truststorePassword: "secret"
kafka.clusters.0.serde.5.name: UInt64
kafka.clusters.0.serde.5.topicKeysPattern: "topic-with-uint64keys"
volumes:
- ./proto:/protofiles
kafka0:
image: confluentinc/cp-kafka:7.2.1
hostname: kafka0
container_name: kafka0
ports:
- "9092:9092"
- "9997:9997"
environment:
KAFKA_BROKER_ID: 1
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: 'CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT'
KAFKA_ADVERTISED_LISTENERS: 'PLAINTEXT://kafka0:29092,PLAINTEXT_HOST://localhost:9092'
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1
KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1
KAFKA_JMX_PORT: 9997
KAFKA_JMX_HOSTNAME: localhost
KAFKA_JMX_OPTS: -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=kafka0 -Dcom.sun.management.jmxremote.rmi.port=9997
KAFKA_PROCESS_ROLES: 'broker,controller'
KAFKA_NODE_ID: 1
KAFKA_CONTROLLER_QUORUM_VOTERS: '1@kafka0:29093'
KAFKA_LISTENERS: 'PLAINTEXT://kafka0:29092,CONTROLLER://kafka0:29093,PLAINTEXT_HOST://0.0.0.0:9092'
KAFKA_INTER_BROKER_LISTENER_NAME: 'PLAINTEXT'
KAFKA_CONTROLLER_LISTENER_NAMES: 'CONTROLLER'
KAFKA_LOG_DIRS: '/tmp/kraft-combined-logs'
volumes:
- ./scripts/update_run.sh:/tmp/update_run.sh
command: "bash -c 'if [ ! -f /tmp/update_run.sh ]; then echo \"ERROR: Did you forget the update_run.sh file that came with this docker-compose.yml file?\" && exit 1 ; else /tmp/update_run.sh && /etc/confluent/docker/run ; fi'"
schemaregistry0:
image: confluentinc/cp-schema-registry:7.2.1
ports:
- 8085:8085
depends_on:
- kafka0
environment:
SCHEMA_REGISTRY_KAFKASTORE_BOOTSTRAP_SERVERS: PLAINTEXT://kafka0:29092
SCHEMA_REGISTRY_KAFKASTORE_SECURITY_PROTOCOL: PLAINTEXT
SCHEMA_REGISTRY_HOST_NAME: schemaregistry0
SCHEMA_REGISTRY_LISTENERS: http://schemaregistry0:8085
SCHEMA_REGISTRY_SCHEMA_REGISTRY_INTER_INSTANCE_PROTOCOL: "http"
SCHEMA_REGISTRY_LOG4J_ROOT_LOGLEVEL: INFO
SCHEMA_REGISTRY_KAFKASTORE_TOPIC: _schemas
================================================
FILE: documentation/compose/kafka-ui-with-jmx-exporter.yaml
================================================
---
version: '2'
services:
kafka0:
image: confluentinc/cp-kafka:7.2.1
hostname: kafka0
container_name: kafka0
ports:
- "9092:9092"
- "11001:11001"
environment:
KAFKA_BROKER_ID: 1
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: 'CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT'
KAFKA_ADVERTISED_LISTENERS: 'PLAINTEXT://kafka0:29092,PLAINTEXT_HOST://localhost:9092'
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1
KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1
KAFKA_PROCESS_ROLES: 'broker,controller'
KAFKA_NODE_ID: 1
KAFKA_CONTROLLER_QUORUM_VOTERS: '1@kafka0:29093'
KAFKA_LISTENERS: 'PLAINTEXT://kafka0:29092,CONTROLLER://kafka0:29093,PLAINTEXT_HOST://0.0.0.0:9092'
KAFKA_INTER_BROKER_LISTENER_NAME: 'PLAINTEXT'
KAFKA_CONTROLLER_LISTENER_NAMES: 'CONTROLLER'
KAFKA_LOG_DIRS: '/tmp/kraft-combined-logs'
KAFKA_OPTS: -javaagent:/usr/share/jmx_exporter/jmx_prometheus_javaagent.jar=11001:/usr/share/jmx_exporter/kafka-broker.yml
volumes:
- ./jmx-exporter:/usr/share/jmx_exporter/
- ./scripts/update_run.sh:/tmp/update_run.sh
command: "bash -c 'if [ ! -f /tmp/update_run.sh ]; then echo \"ERROR: Did you forget the update_run.sh file that came with this docker-compose.yml file?\" && exit 1 ; else /tmp/update_run.sh && /usr/share/jmx_exporter/kafka-prepare-and-run ; fi'"
kafka-ui:
container_name: kafka-ui
image: provectuslabs/kafka-ui:latest
ports:
- 8080:8080
depends_on:
- kafka0
environment:
KAFKA_CLUSTERS_0_NAME: local
KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS: kafka0:29092
KAFKA_CLUSTERS_0_METRICS_PORT: 11001
KAFKA_CLUSTERS_0_METRICS_TYPE: PROMETHEUS
================================================
FILE: documentation/compose/kafka-ui.yaml
================================================
---
version: '2'
services:
kafka-ui:
container_name: kafka-ui
image: provectuslabs/kafka-ui:latest
ports:
- 8080:8080
depends_on:
- kafka0
- kafka1
- schemaregistry0
- schemaregistry1
- kafka-connect0
environment:
KAFKA_CLUSTERS_0_NAME: local
KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS: kafka0:29092
KAFKA_CLUSTERS_0_METRICS_PORT: 9997
KAFKA_CLUSTERS_0_SCHEMAREGISTRY: http://schemaregistry0:8085
KAFKA_CLUSTERS_0_KAFKACONNECT_0_NAME: first
KAFKA_CLUSTERS_0_KAFKACONNECT_0_ADDRESS: http://kafka-connect0:8083
KAFKA_CLUSTERS_1_NAME: secondLocal
KAFKA_CLUSTERS_1_BOOTSTRAPSERVERS: kafka1:29092
KAFKA_CLUSTERS_1_METRICS_PORT: 9998
KAFKA_CLUSTERS_1_SCHEMAREGISTRY: http://schemaregistry1:8085
DYNAMIC_CONFIG_ENABLED: 'true'
kafka0:
image: confluentinc/cp-kafka:7.2.1
hostname: kafka0
container_name: kafka0
ports:
- "9092:9092"
- "9997:9997"
environment:
KAFKA_BROKER_ID: 1
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: 'CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT'
KAFKA_ADVERTISED_LISTENERS: 'PLAINTEXT://kafka0:29092,PLAINTEXT_HOST://localhost:9092'
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1
KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1
KAFKA_JMX_PORT: 9997
KAFKA_JMX_OPTS: -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=kafka0 -Dcom.sun.management.jmxremote.rmi.port=9997
KAFKA_PROCESS_ROLES: 'broker,controller'
KAFKA_NODE_ID: 1
KAFKA_CONTROLLER_QUORUM_VOTERS: '1@kafka0:29093'
KAFKA_LISTENERS: 'PLAINTEXT://kafka0:29092,CONTROLLER://kafka0:29093,PLAINTEXT_HOST://0.0.0.0:9092'
KAFKA_INTER_BROKER_LISTENER_NAME: 'PLAINTEXT'
KAFKA_CONTROLLER_LISTENER_NAMES: 'CONTROLLER'
KAFKA_LOG_DIRS: '/tmp/kraft-combined-logs'
volumes:
- ./scripts/update_run.sh:/tmp/update_run.sh
command: "bash -c 'if [ ! -f /tmp/update_run.sh ]; then echo \"ERROR: Did you forget the update_run.sh file that came with this docker-compose.yml file?\" && exit 1 ; else /tmp/update_run.sh && /etc/confluent/docker/run ; fi'"
kafka1:
image: confluentinc/cp-kafka:7.2.1
hostname: kafka1
container_name: kafka1
ports:
- "9093:9092"
- "9998:9998"
environment:
KAFKA_BROKER_ID: 1
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: 'CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT'
KAFKA_ADVERTISED_LISTENERS: 'PLAINTEXT://kafka1:29092,PLAINTEXT_HOST://localhost:9092'
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1
KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1
KAFKA_JMX_PORT: 9998
KAFKA_JMX_OPTS: -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=kafka0 -Dcom.sun.management.jmxremote.rmi.port=9998
KAFKA_PROCESS_ROLES: 'broker,controller'
KAFKA_NODE_ID: 1
KAFKA_CONTROLLER_QUORUM_VOTERS: '1@kafka1:29093'
KAFKA_LISTENERS: 'PLAINTEXT://kafka1:29092,CONTROLLER://kafka1:29093,PLAINTEXT_HOST://0.0.0.0:9092'
KAFKA_INTER_BROKER_LISTENER_NAME: 'PLAINTEXT'
KAFKA_CONTROLLER_LISTENER_NAMES: 'CONTROLLER'
KAFKA_LOG_DIRS: '/tmp/kraft-combined-logs'
volumes:
- ./scripts/update_run.sh:/tmp/update_run.sh
command: "bash -c 'if [ ! -f /tmp/update_run.sh ]; then echo \"ERROR: Did you forget the update_run.sh file that came with this docker-compose.yml file?\" && exit 1 ; else /tmp/update_run.sh && /etc/confluent/docker/run ; fi'"
schemaregistry0:
image: confluentinc/cp-schema-registry:7.2.1
ports:
- 8085:8085
depends_on:
- kafka0
environment:
SCHEMA_REGISTRY_KAFKASTORE_BOOTSTRAP_SERVERS: PLAINTEXT://kafka0:29092
SCHEMA_REGISTRY_KAFKASTORE_SECURITY_PROTOCOL: PLAINTEXT
SCHEMA_REGISTRY_HOST_NAME: schemaregistry0
SCHEMA_REGISTRY_LISTENERS: http://schemaregistry0:8085
SCHEMA_REGISTRY_SCHEMA_REGISTRY_INTER_INSTANCE_PROTOCOL: "http"
SCHEMA_REGISTRY_LOG4J_ROOT_LOGLEVEL: INFO
SCHEMA_REGISTRY_KAFKASTORE_TOPIC: _schemas
schemaregistry1:
image: confluentinc/cp-schema-registry:7.2.1
ports:
- 18085:8085
depends_on:
- kafka1
environment:
SCHEMA_REGISTRY_KAFKASTORE_BOOTSTRAP_SERVERS: PLAINTEXT://kafka1:29092
SCHEMA_REGISTRY_KAFKASTORE_SECURITY_PROTOCOL: PLAINTEXT
SCHEMA_REGISTRY_HOST_NAME: schemaregistry1
SCHEMA_REGISTRY_LISTENERS: http://schemaregistry1:8085
SCHEMA_REGISTRY_SCHEMA_REGISTRY_INTER_INSTANCE_PROTOCOL: "http"
SCHEMA_REGISTRY_LOG4J_ROOT_LOGLEVEL: INFO
SCHEMA_REGISTRY_KAFKASTORE_TOPIC: _schemas
kafka-connect0:
image: confluentinc/cp-kafka-connect:7.2.1
ports:
- 8083:8083
depends_on:
- kafka0
- schemaregistry0
environment:
CONNECT_BOOTSTRAP_SERVERS: kafka0:29092
CONNECT_GROUP_ID: compose-connect-group
CONNECT_CONFIG_STORAGE_TOPIC: _connect_configs
CONNECT_CONFIG_STORAGE_REPLICATION_FACTOR: 1
CONNECT_OFFSET_STORAGE_TOPIC: _connect_offset
CONNECT_OFFSET_STORAGE_REPLICATION_FACTOR: 1
CONNECT_STATUS_STORAGE_TOPIC: _connect_status
CONNECT_STATUS_STORAGE_REPLICATION_FACTOR: 1
CONNECT_KEY_CONVERTER: org.apache.kafka.connect.storage.StringConverter
CONNECT_KEY_CONVERTER_SCHEMA_REGISTRY_URL: http://schemaregistry0:8085
CONNECT_VALUE_CONVERTER: org.apache.kafka.connect.storage.StringConverter
CONNECT_VALUE_CONVERTER_SCHEMA_REGISTRY_URL: http://schemaregistry0:8085
CONNECT_INTERNAL_KEY_CONVERTER: org.apache.kafka.connect.json.JsonConverter
CONNECT_INTERNAL_VALUE_CONVERTER: org.apache.kafka.connect.json.JsonConverter
CONNECT_REST_ADVERTISED_HOST_NAME: kafka-connect0
CONNECT_PLUGIN_PATH: "/usr/share/java,/usr/share/confluent-hub-components"
kafka-init-topics:
image: confluentinc/cp-kafka:7.2.1
volumes:
- ./data/message.json:/data/message.json
depends_on:
- kafka1
command: "bash -c 'echo Waiting for Kafka to be ready... && \
cub kafka-ready -b kafka1:29092 1 30 && \
kafka-topics --create --topic second.users --partitions 3 --replication-factor 1 --if-not-exists --bootstrap-server kafka1:29092 && \
kafka-topics --create --topic second.messages --partitions 2 --replication-factor 1 --if-not-exists --bootstrap-server kafka1:29092 && \
kafka-topics --create --topic first.messages --partitions 2 --replication-factor 1 --if-not-exists --bootstrap-server kafka0:29092 && \
kafka-console-producer --bootstrap-server kafka1:29092 -topic second.users < /data/message.json'"
================================================
FILE: documentation/compose/kafka-with-zookeeper.yaml
================================================
---
version: '2'
services:
zookeeper:
image: confluentinc/cp-zookeeper:7.2.1
hostname: zookeeper
container_name: zookeeper
ports:
- "2181:2181"
environment:
ZOOKEEPER_CLIENT_PORT: 2181
ZOOKEEPER_TICK_TIME: 2000
kafka:
image: confluentinc/cp-server:7.2.1
hostname: kafka
container_name: kafka
depends_on:
- zookeeper
ports:
- "9092:9092"
- "9997:9997"
environment:
KAFKA_BROKER_ID: 1
KAFKA_ZOOKEEPER_CONNECT: 'zookeeper:2181'
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:29092,PLAINTEXT_HOST://localhost:9092
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
KAFKA_CONFLUENT_LICENSE_TOPIC_REPLICATION_FACTOR: 1
KAFKA_CONFLUENT_BALANCER_TOPIC_REPLICATION_FACTOR: 1
KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1
KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1
KAFKA_JMX_PORT: 9997
KAFKA_JMX_HOSTNAME: kafka
kafka-init-topics:
image: confluentinc/cp-kafka:7.2.1
volumes:
- ./data/message.json:/data/message.json
depends_on:
- kafka
command: "bash -c 'echo Waiting for Kafka to be ready... && \
cub kafka-ready -b kafka:29092 1 30 && \
kafka-topics --create --topic users --partitions 3 --replication-factor 1 --if-not-exists --bootstrap-server kafka:29092 && \
kafka-topics --create --topic messages --partitions 2 --replication-factor 1 --if-not-exists --bootstrap-server kafka:29092 && \
kafka-console-producer --bootstrap-server kafka:29092 --topic users < /data/message.json'"
================================================
FILE: documentation/compose/ldap.yaml
================================================
---
version: '2'
services:
kafka-ui:
container_name: kafka-ui
image: provectuslabs/kafka-ui:latest
ports:
- 8080:8080
depends_on:
- kafka0
- schemaregistry0
environment:
KAFKA_CLUSTERS_0_NAME: local
KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS: kafka0:29092
KAFKA_CLUSTERS_0_METRICS_PORT: 9997
KAFKA_CLUSTERS_0_SCHEMAREGISTRY: http://schemaregistry0:8085
AUTH_TYPE: "LDAP"
SPRING_LDAP_URLS: "ldap://ldap:10389"
SPRING_LDAP_BASE: "cn={0},ou=people,dc=planetexpress,dc=com"
SPRING_LDAP_ADMIN_USER: "cn=admin,dc=planetexpress,dc=com"
SPRING_LDAP_ADMIN_PASSWORD: "GoodNewsEveryone"
SPRING_LDAP_USER_FILTER_SEARCH_BASE: "dc=planetexpress,dc=com"
SPRING_LDAP_USER_FILTER_SEARCH_FILTER: "(&(uid={0})(objectClass=inetOrgPerson))"
SPRING_LDAP_GROUP_FILTER_SEARCH_BASE: "ou=people,dc=planetexpress,dc=com"
# OAUTH2.LDAP.ACTIVEDIRECTORY: true
# OAUTH2.LDAP.AСTIVEDIRECTORY.DOMAIN: "memelord.lol"
ldap:
image: rroemhild/test-openldap:latest
hostname: "ldap"
ports:
- 10389:10389
kafka0:
image: confluentinc/cp-kafka:7.2.1
hostname: kafka0
container_name: kafka0
ports:
- "9092:9092"
- "9997:9997"
environment:
KAFKA_BROKER_ID: 1
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: 'CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT'
KAFKA_ADVERTISED_LISTENERS: 'PLAINTEXT://kafka0:29092,PLAINTEXT_HOST://localhost:9092'
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1
KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1
KAFKA_JMX_PORT: 9997
KAFKA_JMX_HOSTNAME: localhost
KAFKA_JMX_OPTS: -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=kafka0 -Dcom.sun.management.jmxremote.rmi.port=9997
KAFKA_PROCESS_ROLES: 'broker,controller'
KAFKA_NODE_ID: 1
KAFKA_CONTROLLER_QUORUM_VOTERS: '1@kafka0:29093'
KAFKA_LISTENERS: 'PLAINTEXT://kafka0:29092,CONTROLLER://kafka0:29093,PLAINTEXT_HOST://0.0.0.0:9092'
KAFKA_INTER_BROKER_LISTENER_NAME: 'PLAINTEXT'
KAFKA_CONTROLLER_LISTENER_NAMES: 'CONTROLLER'
KAFKA_LOG_DIRS: '/tmp/kraft-combined-logs'
volumes:
- ./scripts/update_run.sh:/tmp/update_run.sh
command: "bash -c 'if [ ! -f /tmp/update_run.sh ]; then echo \"ERROR: Did you forget the update_run.sh file that came with this docker-compose.yml file?\" && exit 1 ; else /tmp/update_run.sh && /etc/confluent/docker/run ; fi'"
schemaregistry0:
image: confluentinc/cp-schema-registry:7.2.1
ports:
- 8085:8085
depends_on:
- kafka0
environment:
SCHEMA_REGISTRY_KAFKASTORE_BOOTSTRAP_SERVERS: PLAINTEXT://kafka0:29092
SCHEMA_REGISTRY_KAFKASTORE_SECURITY_PROTOCOL: PLAINTEXT
SCHEMA_REGISTRY_HOST_NAME: schemaregistry0
SCHEMA_REGISTRY_LISTENERS: http://schemaregistry0:8085
SCHEMA_REGISTRY_SCHEMA_REGISTRY_INTER_INSTANCE_PROTOCOL: "http"
SCHEMA_REGISTRY_LOG4J_ROOT_LOGLEVEL: INFO
SCHEMA_REGISTRY_KAFKASTORE_TOPIC: _schemas
================================================
FILE: documentation/compose/nginx-proxy.yaml
================================================
---
version: '2'
services:
nginx:
image: nginx:latest
volumes:
- ./data/proxy.conf:/etc/nginx/conf.d/default.conf
ports:
- 8080:80
kafka-ui:
container_name: kafka-ui
image: provectuslabs/kafka-ui:latest
ports:
- 8082:8080
environment:
KAFKA_CLUSTERS_0_NAME: local
KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS: kafka:9092
SERVER_SERVLET_CONTEXT_PATH: /kafka-ui
================================================
FILE: documentation/compose/postgres/Dockerfile
================================================
ARG image
FROM ${image}
MAINTAINER Provectus Team
ADD data.sql /docker-entrypoint-initdb.d
EXPOSE 5432
================================================
FILE: documentation/compose/postgres/data.sql
================================================
CREATE DATABASE test WITH OWNER = dev_user;
\connect test
CREATE TABLE activities
(
id INTEGER PRIMARY KEY,
msg varchar(24),
action varchar(128),
browser varchar(24),
device json,
createdAt timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
);
insert into activities(id, action, msg, browser, device)
values (1, 'LOGIN', 'Success', 'Chrome', '{
"name": "Chrome",
"major": "67",
"version": "67.0.3396.99"
}'),
(2, 'LOGIN', 'Failed', 'Apple WebKit', '{
"name": "WebKit",
"major": "605",
"version": "605.1.15"
}');
================================================
FILE: documentation/compose/proto/key-types.proto
================================================
syntax = "proto3";
package test;
import "google/protobuf/wrappers.proto";
message MyKey {
string myKeyF1 = 1;
google.protobuf.UInt64Value uint_64_wrapper = 2;
}
message MySpecificTopicKey {
string special_field1 = 1;
string special_field2 = 2;
google.protobuf.FloatValue float_wrapper = 3;
}
================================================
FILE: documentation/compose/proto/values.proto
================================================
syntax = "proto3";
package test;
message MySpecificTopicValue {
string f1 = 1;
string f2 = 2;
}
message MyValue {
int32 version = 1;
string payload = 2;
map intToStringMap = 3;
map strToObjMap = 4;
}
================================================
FILE: documentation/compose/scripts/clusterID
================================================
zlFiTJelTOuhnklFwLWixw
================================================
FILE: documentation/compose/scripts/create_cluster_id.sh
================================================
kafka-storage random-uuid > /workspace/kafka-ui/documentation/compose/clusterID
================================================
FILE: documentation/compose/scripts/update_run.sh
================================================
# This script is required to run kafka cluster (without zookeeper)
#!/bin/sh
# Docker workaround: Remove check for KAFKA_ZOOKEEPER_CONNECT parameter
sed -i '/KAFKA_ZOOKEEPER_CONNECT/d' /etc/confluent/docker/configure
# Docker workaround: Ignore cub zk-ready
sed -i 's/cub zk-ready/echo ignore zk-ready/' /etc/confluent/docker/ensure
# KRaft required step: Format the storage directory with a new cluster ID
echo "kafka-storage format --ignore-formatted -t $(kafka-storage random-uuid) -c /etc/kafka/kafka.properties" >> /etc/confluent/docker/ensure
================================================
FILE: documentation/compose/scripts/update_run_cluster.sh
================================================
# This script is required to run kafka cluster (without zookeeper)
#!/bin/sh
# Docker workaround: Remove check for KAFKA_ZOOKEEPER_CONNECT parameter
sed -i '/KAFKA_ZOOKEEPER_CONNECT/d' /etc/confluent/docker/configure
# Docker workaround: Ignore cub zk-ready
sed -i 's/cub zk-ready/echo ignore zk-ready/' /etc/confluent/docker/ensure
# KRaft required step: Format the storage directory with a new cluster ID
echo "kafka-storage format --ignore-formatted -t $(cat /tmp/clusterID) -c /etc/kafka/kafka.properties" >> /etc/confluent/docker/ensure
================================================
FILE: documentation/compose/ssl/creds
================================================
secret
================================================
FILE: documentation/compose/ssl/generate_certs.sh
================================================
#!/usr/bin/env bash
set -eu
KEYSTORE_FILENAME="kafka.keystore.jks"
VALIDITY_IN_DAYS=3650
DEFAULT_TRUSTSTORE_FILENAME="kafka.truststore.jks"
TRUSTSTORE_WORKING_DIRECTORY="truststore"
KEYSTORE_WORKING_DIRECTORY="keystore"
CA_CERT_FILE="ca-cert"
KEYSTORE_SIGN_REQUEST="cert-file"
KEYSTORE_SIGN_REQUEST_SRL="ca-cert.srl"
KEYSTORE_SIGNED_CERT="cert-signed"
export COUNTRY=US
export STATE=IL
export ORGANIZATION_UNIT=SE
export CITY=Chicago
export PASSWORD=secret
COUNTRY=$COUNTRY
STATE=$STATE
OU=$ORGANIZATION_UNIT
CN=kafka0 # COMMON NAME VERIFICATION GOES BRR
LOCATION=$CITY
PASS=$PASSWORD
function file_exists_and_exit() {
echo "'$1' cannot exist. Move or delete it before"
echo "re-running this script."
exit 1
}
if [ -e "$KEYSTORE_WORKING_DIRECTORY" ]; then
file_exists_and_exit $KEYSTORE_WORKING_DIRECTORY
fi
if [ -e "$CA_CERT_FILE" ]; then
file_exists_and_exit $CA_CERT_FILE
fi
if [ -e "$KEYSTORE_SIGN_REQUEST" ]; then
file_exists_and_exit $KEYSTORE_SIGN_REQUEST
fi
if [ -e "$KEYSTORE_SIGN_REQUEST_SRL" ]; then
file_exists_and_exit $KEYSTORE_SIGN_REQUEST_SRL
fi
if [ -e "$KEYSTORE_SIGNED_CERT" ]; then
file_exists_and_exit $KEYSTORE_SIGNED_CERT
fi
echo "Welcome to the Kafka SSL keystore and trust store generator script."
trust_store_file=""
trust_store_private_key_file=""
if [ -e "$TRUSTSTORE_WORKING_DIRECTORY" ]; then
file_exists_and_exit $TRUSTSTORE_WORKING_DIRECTORY
fi
mkdir $TRUSTSTORE_WORKING_DIRECTORY
echo
echo "OK, we'll generate a trust store and associated private key."
echo
echo "First, the private key."
echo
openssl req -new -x509 -keyout $TRUSTSTORE_WORKING_DIRECTORY/ca-key \
-out $TRUSTSTORE_WORKING_DIRECTORY/ca-cert -days $VALIDITY_IN_DAYS -nodes \
-subj "/C=$COUNTRY/ST=$STATE/L=$LOCATION/O=$OU/CN=$CN"
trust_store_private_key_file="$TRUSTSTORE_WORKING_DIRECTORY/ca-key"
echo
echo "Two files were created:"
echo " - $TRUSTSTORE_WORKING_DIRECTORY/ca-key -- the private key used later to"
echo " sign certificates"
echo " - $TRUSTSTORE_WORKING_DIRECTORY/ca-cert -- the certificate that will be"
echo " stored in the trust store in a moment and serve as the certificate"
echo " authority (CA). Once this certificate has been stored in the trust"
echo " store, it will be deleted. It can be retrieved from the trust store via:"
echo " $ keytool -keystore -export -alias CARoot -rfc"
echo
echo "Now the trust store will be generated from the certificate."
echo
keytool -keystore $TRUSTSTORE_WORKING_DIRECTORY/$DEFAULT_TRUSTSTORE_FILENAME \
-alias CARoot -import -file $TRUSTSTORE_WORKING_DIRECTORY/ca-cert \
-noprompt -dname "C=$COUNTRY, ST=$STATE, L=$LOCATION, O=$OU, CN=$CN" -keypass $PASS -storepass $PASS -storetype JKS
trust_store_file="$TRUSTSTORE_WORKING_DIRECTORY/$DEFAULT_TRUSTSTORE_FILENAME"
echo
echo "$TRUSTSTORE_WORKING_DIRECTORY/$DEFAULT_TRUSTSTORE_FILENAME was created."
# don't need the cert because it's in the trust store.
rm $TRUSTSTORE_WORKING_DIRECTORY/$CA_CERT_FILE
echo
echo "Continuing with:"
echo " - trust store file: $trust_store_file"
echo " - trust store private key: $trust_store_private_key_file"
mkdir $KEYSTORE_WORKING_DIRECTORY
echo
echo "Now, a keystore will be generated. Each broker and logical client needs its own"
echo "keystore. This script will create only one keystore. Run this script multiple"
echo "times for multiple keystores."
echo
echo " NOTE: currently in Kafka, the Common Name (CN) does not need to be the FQDN of"
echo " this host. However, at some point, this may change. As such, make the CN"
echo " the FQDN. Some operating systems call the CN prompt 'first / last name'"
# To learn more about CNs and FQDNs, read:
# https://docs.oracle.com/javase/7/docs/api/javax/net/ssl/X509ExtendedTrustManager.html
keytool -keystore $KEYSTORE_WORKING_DIRECTORY/$KEYSTORE_FILENAME \
-alias localhost -validity $VALIDITY_IN_DAYS -genkey -keyalg RSA \
-noprompt -dname "C=$COUNTRY, ST=$STATE, L=$LOCATION, O=$OU, CN=$CN" -keypass $PASS -storepass $PASS -storetype JKS
echo
echo "'$KEYSTORE_WORKING_DIRECTORY/$KEYSTORE_FILENAME' now contains a key pair and a"
echo "self-signed certificate. Again, this keystore can only be used for one broker or"
echo "one logical client. Other brokers or clients need to generate their own keystores."
echo
echo "Fetching the certificate from the trust store and storing in $CA_CERT_FILE."
echo
keytool -keystore $trust_store_file -export -alias CARoot -rfc -file $CA_CERT_FILE -keypass $PASS -storepass $PASS
echo
echo "Now a certificate signing request will be made to the keystore."
echo
keytool -keystore $KEYSTORE_WORKING_DIRECTORY/$KEYSTORE_FILENAME -alias localhost \
-certreq -file $KEYSTORE_SIGN_REQUEST -keypass $PASS -storepass $PASS
echo
echo "Now the trust store's private key (CA) will sign the keystore's certificate."
echo
openssl x509 -req -CA $CA_CERT_FILE -CAkey $trust_store_private_key_file \
-in $KEYSTORE_SIGN_REQUEST -out $KEYSTORE_SIGNED_CERT \
-days $VALIDITY_IN_DAYS -CAcreateserial \
-extensions kafka -extfile san.cnf
# creates $KEYSTORE_SIGN_REQUEST_SRL which is never used or needed.
echo
echo "Now the CA will be imported into the keystore."
echo
keytool -keystore $KEYSTORE_WORKING_DIRECTORY/$KEYSTORE_FILENAME -alias CARoot \
-import -file $CA_CERT_FILE -keypass $PASS -storepass $PASS -noprompt
rm $CA_CERT_FILE # delete the trust store cert because it's stored in the trust store.
echo
echo "Now the keystore's signed certificate will be imported back into the keystore."
echo
keytool -keystore $KEYSTORE_WORKING_DIRECTORY/$KEYSTORE_FILENAME -alias localhost -import \
-file $KEYSTORE_SIGNED_CERT -keypass $PASS -storepass $PASS
echo
echo "All done!"
echo
echo "Deleting intermediate files. They are:"
echo " - '$KEYSTORE_SIGN_REQUEST_SRL': CA serial number"
echo " - '$KEYSTORE_SIGN_REQUEST': the keystore's certificate signing request"
echo " (that was fulfilled)"
echo " - '$KEYSTORE_SIGNED_CERT': the keystore's certificate, signed by the CA, and stored back"
echo " into the keystore"
rm $KEYSTORE_SIGN_REQUEST_SRL
rm $KEYSTORE_SIGN_REQUEST
rm $KEYSTORE_SIGNED_CERT
================================================
FILE: documentation/compose/ssl/san.cnf
================================================
[kafka]
subjectAltName = DNS:kafka0,DNS:schemaregistry0,DNS:kafka-connect0,DNS:ksqldb0
================================================
FILE: documentation/compose/traefik/kafkaui.yaml
================================================
http:
routers:
kafkaui:
rule: "PathPrefix(`/kafka-ui/`)"
entrypoints: web
service: kafkaui
services:
kafkaui:
loadBalancer:
servers:
- url: http://kafka-ui:8080
================================================
FILE: documentation/compose/traefik-proxy.yaml
================================================
---
version: '3.8'
services:
traefik:
restart: always
image: traefik:v2.4
container_name: traefik
command:
- --api.insecure=true
- --providers.file.directory=/etc/traefik
- --providers.file.watch=true
- --entrypoints.web.address=:80
- --log.level=debug
ports:
- 80:80
volumes:
- ./traefik:/etc/traefik
kafka-ui:
container_name: kafka-ui
image: provectuslabs/kafka-ui:latest
ports:
- 8082:8080
environment:
KAFKA_CLUSTERS_0_NAME: local
KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS: kafka:9092
SERVER_SERVLET_CONTEXT_PATH: /kafka-ui
================================================
FILE: etc/checkstyle/apache-header.txt
================================================
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
================================================
FILE: etc/checkstyle/checkstyle-e2e.xml
================================================
================================================
FILE: etc/checkstyle/checkstyle.xml
================================================
================================================
FILE: kafka-ui-api/Dockerfile
================================================
#FROM azul/zulu-openjdk-alpine:17-jre-headless
FROM azul/zulu-openjdk-alpine@sha256:a36679ac0d28cb835e2a8c00e1e0d95509c6c51c5081c7782b85edb1f37a771a
RUN apk add --no-cache \
# snappy codec
gcompat \
# configuring timezones
tzdata
RUN addgroup -S kafkaui && adduser -S kafkaui -G kafkaui
# creating folder for dynamic config usage (certificates uploads, etc)
RUN mkdir /etc/kafkaui/
RUN chown kafkaui /etc/kafkaui
USER kafkaui
ARG JAR_FILE
COPY "/target/${JAR_FILE}" "/kafka-ui-api.jar"
ENV JAVA_OPTS=
EXPOSE 8080
# see JmxSslSocketFactory docs to understand why add-opens is needed
CMD java --add-opens java.rmi/javax.rmi.ssl=ALL-UNNAMED $JAVA_OPTS -jar kafka-ui-api.jar
================================================
FILE: kafka-ui-api/pom.xml
================================================
kafka-ui
com.provectus
0.0.1-SNAPSHOT
4.0.0
kafka-ui-api
0.8.10
jacoco
reuseReports
${project.basedir}/target/jacoco.exec
${project.basedir}/target/site/jacoco/jacoco.xml
java
org.springframework.boot
spring-boot-starter-webflux
org.springframework.boot
spring-boot-starter-security
org.springframework.boot
spring-boot-actuator
org.springframework.boot
spring-boot-starter-oauth2-client
com.provectus
kafka-ui-contract
${project.version}
com.provectus
kafka-ui-serde-api
${kafka-ui-serde-api.version}
org.apache.kafka
kafka-clients
${kafka-clients.version}
org.apache.commons
commons-lang3
3.12.0
org.projectlombok
lombok
provided
org.mapstruct
mapstruct
${org.mapstruct.version}
io.confluent
kafka-schema-registry-client
${confluent.version}
io.confluent
kafka-avro-serializer
${confluent.version}
io.confluent
kafka-json-schema-serializer
${confluent.version}
commons-collections
commons-collections
io.confluent
kafka-protobuf-serializer
${confluent.version}
software.amazon.msk
aws-msk-iam-auth
1.1.7
org.apache.avro
avro
${avro.version}
org.springframework.boot
spring-boot-starter-logging
io.projectreactor.addons
reactor-extra
org.json
json
${org.json.version}
io.micrometer
micrometer-registry-prometheus
runtime
org.springframework.boot
spring-boot-starter-test
test
io.projectreactor
reactor-test
test
org.apache.commons
commons-pool2
${apache.commons.version}
org.apache.commons
commons-collections4
4.4
org.testcontainers
testcontainers
test
org.testcontainers
kafka
test
org.testcontainers
junit-jupiter
test
org.junit.jupiter
junit-jupiter-engine
test
org.mockito
mockito-core
${mockito.version}
test
org.mockito
mockito-junit-jupiter
${mockito.version}
test
net.bytebuddy
byte-buddy
${byte-buddy.version}
test
org.assertj
assertj-core
${assertj.version}
test
com.github.java-json-tools
json-schema-validator
2.2.14
test
com.squareup.okhttp3
mockwebserver
${okhttp3.mockwebserver.version}
test
com.squareup.okhttp3
okhttp
${okhttp3.mockwebserver.version}
test
org.springframework.boot
spring-boot-starter-actuator
org.antlr
antlr4-runtime
${antlr4-maven-plugin.version}
org.opendatadiscovery
oddrn-generator-java
${odd-oddrn-generator.version}
org.opendatadiscovery
ingestion-contract-client
org.springframework.boot
spring-boot-starter-webflux
io.projectreactor
reactor-core
io.projectreactor.ipc
reactor-netty
${odd-oddrn-client.version}
org.springframework.security
spring-security-ldap
org.codehaus.groovy
groovy-jsr223
${groovy.version}
org.codehaus.groovy
groovy-json
${groovy.version}
org.apache.datasketches
datasketches-java
${datasketches-java.version}
org.springframework.boot
spring-boot-devtools
true
org.springframework.boot
spring-boot-maven-plugin
${spring-boot.version}
repackage
build-info
org.apache.maven.plugins
maven-compiler-plugin
org.mapstruct
mapstruct-processor
${org.mapstruct.version}
org.projectlombok
lombok
${org.projectlombok.version}
org.projectlombok
lombok-mapstruct-binding
0.2.0
org.springframework.boot
spring-boot-configuration-processor
${spring-boot.version}
org.apache.maven.plugins
maven-surefire-plugin
@{argLine} --illegal-access=permit
org.apache.maven.plugins
maven-checkstyle-plugin
3.3.0
com.puppycrawl.tools
checkstyle
10.3.1
checkstyle
validate
check
warning
true
true
true
file:${basedir}/../etc/checkstyle/checkstyle.xml
file:${basedir}/../etc/checkstyle/apache-header.txt
org.antlr
antlr4-maven-plugin
${antlr4-maven-plugin.version}
false
generate-sources
antlr4
org.jacoco
jacoco-maven-plugin
${jacoco.version}
prepare-agent
prepare-agent
report
report
XML
prod
pl.project13.maven
git-commit-id-plugin
4.9.10
get-the-git-infos
revision
initialize
true
${project.build.outputDirectory}/git.properties
^git.build.(time|version)$
^git.commit.id.(abbrev|full)$
full
maven-resources-plugin
copy-resources
process-classes
copy-resources
${basedir}/target/classes/static
../kafka-ui-react-app/build
com.github.eirslett
frontend-maven-plugin
${frontend-maven-plugin.version}
${skipUIBuild}
../kafka-ui-react-app
${project.version}
${git.commit.id.abbrev}
install node and pnpm
install-node-and-pnpm
${node.version}
${pnpm.version}
pnpm install
pnpm
install
pnpm build
pnpm
build
io.fabric8
docker-maven-plugin
${fabric8-maven-plugin.version}
true
provectuslabs/kafka-ui:${git.revision}
${project.basedir}
${project.build.finalName}.jar
default
package
build
================================================
FILE: kafka-ui-api/src/main/antlr4/ksql/KsqlGrammar.g4
================================================
grammar KsqlGrammar;
tokens {
DELIMITER
}
@lexer::members {
public static final int COMMENTS = 2;
public static final int WHITESPACE = 3;
public static final int DIRECTIVES = 4;
}
statements
: (singleStatement)* EOF
;
testStatement
: (singleStatement | assertStatement ';' | runScript ';') EOF?
;
singleStatement
: statement ';'
;
singleExpression
: expression EOF
;
statement
: query #queryStatement
| (LIST | SHOW) PROPERTIES #listProperties
| (LIST | SHOW) ALL? TOPICS EXTENDED? #listTopics
| (LIST | SHOW) STREAMS EXTENDED? #listStreams
| (LIST | SHOW) TABLES EXTENDED? #listTables
| (LIST | SHOW) FUNCTIONS #listFunctions
| (LIST | SHOW) (SOURCE | SINK)? CONNECTORS #listConnectors
| (LIST | SHOW) CONNECTOR PLUGINS #listConnectorPlugins
| (LIST | SHOW) TYPES #listTypes
| (LIST | SHOW) VARIABLES #listVariables
| DESCRIBE sourceName EXTENDED? #showColumns
| DESCRIBE STREAMS EXTENDED? #describeStreams
| DESCRIBE FUNCTION identifier #describeFunction
| DESCRIBE CONNECTOR identifier #describeConnector
| PRINT (identifier| STRING) printClause #printTopic
| (LIST | SHOW) QUERIES EXTENDED? #listQueries
| TERMINATE identifier #terminateQuery
| TERMINATE ALL #terminateQuery
| SET STRING EQ STRING #setProperty
| UNSET STRING #unsetProperty
| DEFINE variableName EQ variableValue #defineVariable
| UNDEFINE variableName #undefineVariable
| CREATE (OR REPLACE)? (SOURCE)? STREAM (IF NOT EXISTS)? sourceName
(tableElements)?
(WITH tableProperties)? #createStream
| CREATE (OR REPLACE)? STREAM (IF NOT EXISTS)? sourceName
(WITH tableProperties)? AS query #createStreamAs
| CREATE (OR REPLACE)? (SOURCE)? TABLE (IF NOT EXISTS)? sourceName
(tableElements)?
(WITH tableProperties)? #createTable
| CREATE (OR REPLACE)? TABLE (IF NOT EXISTS)? sourceName
(WITH tableProperties)? AS query #createTableAs
| CREATE (SINK | SOURCE) CONNECTOR (IF NOT EXISTS)? identifier
WITH tableProperties #createConnector
| INSERT INTO sourceName (WITH tableProperties)? query #insertInto
| INSERT INTO sourceName (columns)? VALUES values #insertValues
| DROP STREAM (IF EXISTS)? sourceName (DELETE TOPIC)? #dropStream
| DROP TABLE (IF EXISTS)? sourceName (DELETE TOPIC)? #dropTable
| DROP CONNECTOR (IF EXISTS)? identifier #dropConnector
| EXPLAIN (statement | identifier) #explain
| CREATE TYPE (IF NOT EXISTS)? identifier AS type #registerType
| DROP TYPE (IF EXISTS)? identifier #dropType
| ALTER (STREAM | TABLE) sourceName alterOption (',' alterOption)* #alterSource
;
assertStatement
: ASSERT VALUES sourceName (columns)? VALUES values #assertValues
| ASSERT NULL VALUES sourceName (columns)? KEY values #assertTombstone
| ASSERT STREAM sourceName (tableElements)? (WITH tableProperties)? #assertStream
| ASSERT TABLE sourceName (tableElements)? (WITH tableProperties)? #assertTable
;
runScript
: RUN SCRIPT STRING
;
query
: SELECT selectItem (',' selectItem)*
FROM from=relation
(WINDOW windowExpression)?
(WHERE where=booleanExpression)?
(GROUP BY groupBy)?
(PARTITION BY partitionBy)?
(HAVING having=booleanExpression)?
(EMIT resultMaterialization)?
limitClause?
;
resultMaterialization
: CHANGES
| FINAL
;
alterOption
: ADD (COLUMN)? identifier type
;
tableElements
: '(' tableElement (',' tableElement)* ')'
;
tableElement
: identifier type columnConstraints?
;
columnConstraints
: ((PRIMARY)? KEY)
| HEADERS
| HEADER '(' STRING ')'
;
tableProperties
: '(' tableProperty (',' tableProperty)* ')'
;
tableProperty
: (identifier | STRING) EQ literal
;
printClause
: (FROM BEGINNING)? intervalClause? limitClause?
;
intervalClause
: (INTERVAL | SAMPLE) number
;
limitClause
: LIMIT number
;
retentionClause
: RETENTION number windowUnit
;
gracePeriodClause
: GRACE PERIOD number windowUnit
;
windowExpression
: (IDENTIFIER)?
( tumblingWindowExpression | hoppingWindowExpression | sessionWindowExpression )
;
tumblingWindowExpression
: TUMBLING '(' SIZE number windowUnit (',' retentionClause)? (',' gracePeriodClause)?')'
;
hoppingWindowExpression
: HOPPING '(' SIZE number windowUnit ',' ADVANCE BY number windowUnit (',' retentionClause)? (',' gracePeriodClause)?')'
;
sessionWindowExpression
: SESSION '(' number windowUnit (',' retentionClause)? (',' gracePeriodClause)?')'
;
windowUnit
: DAY
| HOUR
| MINUTE
| SECOND
| MILLISECOND
| DAYS
| HOURS
| MINUTES
| SECONDS
| MILLISECONDS
;
groupBy
: valueExpression (',' valueExpression)*
| '(' (valueExpression (',' valueExpression)*)? ')'
;
partitionBy
: valueExpression (',' valueExpression)*
| '(' (valueExpression (',' valueExpression)*)? ')'
;
values
: '(' (valueExpression (',' valueExpression)*)? ')'
;
selectItem
: expression (AS? identifier)? #selectSingle
| identifier '.' ASTERISK #selectAll
| ASTERISK #selectAll
;
relation
: left=aliasedRelation joinedSource+ #joinRelation
| aliasedRelation #relationDefault
;
joinedSource
: joinType JOIN aliasedRelation joinWindow? joinCriteria
;
joinType
: INNER? #innerJoin
| FULL OUTER? #outerJoin
| LEFT OUTER? #leftJoin
;
joinWindow
: WITHIN withinExpression
;
withinExpression
: '(' joinWindowSize ',' joinWindowSize ')' (gracePeriodClause)? # joinWindowWithBeforeAndAfter
| joinWindowSize (gracePeriodClause)? # singleJoinWindow
;
joinWindowSize
: number windowUnit
;
joinCriteria
: ON booleanExpression
;
aliasedRelation
: relationPrimary (AS? sourceName)?
;
columns
: '(' identifier (',' identifier)* ')'
;
relationPrimary
: sourceName #tableName
;
expression
: booleanExpression
;
booleanExpression
: predicated #booleanDefault
| NOT booleanExpression #logicalNot
| left=booleanExpression operator=AND right=booleanExpression #logicalBinary
| left=booleanExpression operator=OR right=booleanExpression #logicalBinary
;
predicated
: valueExpression predicate[$valueExpression.ctx]?
;
predicate[ParserRuleContext value]
: comparisonOperator right=valueExpression #comparison
| NOT? BETWEEN lower=valueExpression AND upper=valueExpression #between
| NOT? IN '(' expression (',' expression)* ')' #inList
| NOT? LIKE pattern=valueExpression (ESCAPE escape=STRING)? #like
| IS NOT? NULL #nullPredicate
| IS NOT? DISTINCT FROM right=valueExpression #distinctFrom
;
valueExpression
: primaryExpression #valueExpressionDefault
| valueExpression AT timeZoneSpecifier #atTimeZone
| operator=(MINUS | PLUS) valueExpression #arithmeticUnary
| left=valueExpression operator=(ASTERISK | SLASH | PERCENT) right=valueExpression #arithmeticBinary
| left=valueExpression operator=(PLUS | MINUS) right=valueExpression #arithmeticBinary
| left=valueExpression CONCAT right=valueExpression #concatenation
;
primaryExpression
: literal #literalExpression
| identifier STRING #typeConstructor
| CASE valueExpression whenClause+ (ELSE elseExpression=expression)? END #simpleCase
| CASE whenClause+ (ELSE elseExpression=expression)? END #searchedCase
| CAST '(' expression AS type ')' #cast
| ARRAY '[' (expression (',' expression)*)? ']' #arrayConstructor
| MAP '(' (expression ASSIGN expression (',' expression ASSIGN expression)*)? ')' #mapConstructor
| STRUCT '(' (identifier ASSIGN expression (',' identifier ASSIGN expression)*)? ')' #structConstructor
| identifier '(' ASTERISK ')' #functionCall
| identifier '(' (functionArgument (',' functionArgument)* (',' lambdaFunction)*)? ')' #functionCall
| value=primaryExpression '[' index=valueExpression ']' #subscript
| identifier #columnReference
| identifier '.' identifier #qualifiedColumnReference
| base=primaryExpression STRUCT_FIELD_REF fieldName=identifier #dereference
| '(' expression ')' #parenthesizedExpression
;
functionArgument
: expression
| windowUnit
;
timeZoneSpecifier
: TIME ZONE STRING #timeZoneString
;
comparisonOperator
: EQ | NEQ | LT | LTE | GT | GTE
;
booleanValue
: TRUE | FALSE
;
type
: type ARRAY
| ARRAY '<' type '>'
| MAP '<' type ',' type '>'
| STRUCT '<' (identifier type (',' identifier type)*)? '>'
| DECIMAL '(' number ',' number ')'
| baseType ('(' typeParameter (',' typeParameter)* ')')?
;
typeParameter
: INTEGER_VALUE | 'STRING'
;
baseType
: identifier
;
whenClause
: WHEN condition=expression THEN result=expression
;
identifier
: VARIABLE #variableIdentifier
| IDENTIFIER #unquotedIdentifier
| QUOTED_IDENTIFIER #quotedIdentifierAlternative
| nonReserved #unquotedIdentifier
| BACKQUOTED_IDENTIFIER #backQuotedIdentifier
| DIGIT_IDENTIFIER #digitIdentifier
;
lambdaFunction
: identifier '=>' expression #lambda
| '(' identifier (',' identifier)* ')' '=>' expression #lambda
;
variableName
: IDENTIFIER
;
variableValue
: STRING
;
sourceName
: identifier
;
number
: MINUS? DECIMAL_VALUE #decimalLiteral
| MINUS? FLOATING_POINT_VALUE #floatLiteral
| MINUS? INTEGER_VALUE #integerLiteral
;
literal
: NULL #nullLiteral
| number #numericLiteral
| booleanValue #booleanLiteral
| STRING #stringLiteral
| VARIABLE #variableLiteral
;
nonReserved
: SHOW | TABLES | COLUMNS | COLUMN | PARTITIONS | FUNCTIONS | FUNCTION | SESSION
| STRUCT | MAP | ARRAY | PARTITION
| INTEGER | DATE | TIME | TIMESTAMP | INTERVAL | ZONE | 'STRING'
| YEAR | MONTH | DAY | HOUR | MINUTE | SECOND
| EXPLAIN | ANALYZE | TYPE | TYPES
| SET | RESET
| IF
| SOURCE | SINK
| PRIMARY | KEY
| EMIT
| CHANGES
| FINAL
| ESCAPE
| REPLACE
| ASSERT
| ALTER
| ADD
;
EMIT: 'EMIT';
CHANGES: 'CHANGES';
FINAL: 'FINAL';
SELECT: 'SELECT';
FROM: 'FROM';
AS: 'AS';
ALL: 'ALL';
DISTINCT: 'DISTINCT';
WHERE: 'WHERE';
WITHIN: 'WITHIN';
WINDOW: 'WINDOW';
GROUP: 'GROUP';
BY: 'BY';
HAVING: 'HAVING';
LIMIT: 'LIMIT';
AT: 'AT';
OR: 'OR';
AND: 'AND';
IN: 'IN';
NOT: 'NOT';
EXISTS: 'EXISTS';
BETWEEN: 'BETWEEN';
LIKE: 'LIKE';
ESCAPE: 'ESCAPE';
IS: 'IS';
NULL: 'NULL';
TRUE: 'TRUE';
FALSE: 'FALSE';
INTEGER: 'INTEGER';
DATE: 'DATE';
TIME: 'TIME';
TIMESTAMP: 'TIMESTAMP';
INTERVAL: 'INTERVAL';
YEAR: 'YEAR';
MONTH: 'MONTH';
DAY: 'DAY';
HOUR: 'HOUR';
MINUTE: 'MINUTE';
SECOND: 'SECOND';
MILLISECOND: 'MILLISECOND';
YEARS: 'YEARS';
MONTHS: 'MONTHS';
DAYS: 'DAYS';
HOURS: 'HOURS';
MINUTES: 'MINUTES';
SECONDS: 'SECONDS';
MILLISECONDS: 'MILLISECONDS';
ZONE: 'ZONE';
TUMBLING: 'TUMBLING';
HOPPING: 'HOPPING';
SIZE: 'SIZE';
ADVANCE: 'ADVANCE';
RETENTION: 'RETENTION';
GRACE: 'GRACE';
PERIOD: 'PERIOD';
CASE: 'CASE';
WHEN: 'WHEN';
THEN: 'THEN';
ELSE: 'ELSE';
END: 'END';
JOIN: 'JOIN';
FULL: 'FULL';
OUTER: 'OUTER';
INNER: 'INNER';
LEFT: 'LEFT';
RIGHT: 'RIGHT';
ON: 'ON';
PARTITION: 'PARTITION';
STRUCT: 'STRUCT';
WITH: 'WITH';
VALUES: 'VALUES';
CREATE: 'CREATE';
TABLE: 'TABLE';
TOPIC: 'TOPIC';
STREAM: 'STREAM';
STREAMS: 'STREAMS';
INSERT: 'INSERT';
DELETE: 'DELETE';
INTO: 'INTO';
DESCRIBE: 'DESCRIBE';
EXTENDED: 'EXTENDED';
PRINT: 'PRINT';
EXPLAIN: 'EXPLAIN';
ANALYZE: 'ANALYZE';
TYPE: 'TYPE';
TYPES: 'TYPES';
CAST: 'CAST';
SHOW: 'SHOW';
LIST: 'LIST';
TABLES: 'TABLES';
TOPICS: 'TOPICS';
QUERY: 'QUERY';
QUERIES: 'QUERIES';
TERMINATE: 'TERMINATE';
LOAD: 'LOAD';
COLUMNS: 'COLUMNS';
COLUMN: 'COLUMN';
PARTITIONS: 'PARTITIONS';
FUNCTIONS: 'FUNCTIONS';
FUNCTION: 'FUNCTION';
DROP: 'DROP';
TO: 'TO';
RENAME: 'RENAME';
ARRAY: 'ARRAY';
MAP: 'MAP';
SET: 'SET';
DEFINE: 'DEFINE';
UNDEFINE: 'UNDEFINE';
RESET: 'RESET';
SESSION: 'SESSION';
SAMPLE: 'SAMPLE';
EXPORT: 'EXPORT';
CATALOG: 'CATALOG';
PROPERTIES: 'PROPERTIES';
BEGINNING: 'BEGINNING';
UNSET: 'UNSET';
RUN: 'RUN';
SCRIPT: 'SCRIPT';
DECIMAL: 'DECIMAL';
KEY: 'KEY';
CONNECTOR: 'CONNECTOR';
CONNECTORS: 'CONNECTORS';
SINK: 'SINK';
SOURCE: 'SOURCE';
NAMESPACE: 'NAMESPACE';
MATERIALIZED: 'MATERIALIZED';
VIEW: 'VIEW';
PRIMARY: 'PRIMARY';
REPLACE: 'REPLACE';
ASSERT: 'ASSERT';
ADD: 'ADD';
ALTER: 'ALTER';
VARIABLES: 'VARIABLES';
PLUGINS: 'PLUGINS';
HEADERS: 'HEADERS';
HEADER: 'HEADER';
IF: 'IF';
EQ : '=';
NEQ : '<>' | '!=';
LT : '<';
LTE : '<=';
GT : '>';
GTE : '>=';
PLUS: '+';
MINUS: '-';
ASTERISK: '*';
SLASH: '/';
PERCENT: '%';
CONCAT: '||';
ASSIGN: ':=';
STRUCT_FIELD_REF: '->';
LAMBDA_EXPRESSION: '=>';
STRING
: '\'' ( ~'\'' | '\'\'' )* '\''
;
INTEGER_VALUE
: DIGIT+
;
DECIMAL_VALUE
: DIGIT+ '.' DIGIT*
| '.' DIGIT+
;
FLOATING_POINT_VALUE
: DIGIT+ ('.' DIGIT*)? EXPONENT
| '.' DIGIT+ EXPONENT
;
IDENTIFIER
: (LETTER | '_') (LETTER | DIGIT | '_' | '@' )*
;
DIGIT_IDENTIFIER
: DIGIT (LETTER | DIGIT | '_' | '@' )+
;
QUOTED_IDENTIFIER
: '"' ( ~'"' | '""' )* '"'
;
BACKQUOTED_IDENTIFIER
: '`' ( ~'`' | '``' )* '`'
;
VARIABLE
: '${' IDENTIFIER '}'
;
fragment EXPONENT
: 'E' [+-]? DIGIT+
;
fragment DIGIT
: [0-9]
;
fragment LETTER
: [A-Z]
;
SIMPLE_COMMENT
: '--' ~'@' ~[\r\n]* '\r'? '\n'? -> channel(2) // channel(COMMENTS)
;
DIRECTIVE_COMMENT
: '--@' ~[\r\n]* '\r'? '\n'? -> channel(4) // channel(DIRECTIVES)
;
BRACKETED_COMMENT
: '/*' .*? '*/' -> channel(2) // channel(COMMENTS)
;
WS
: [ \r\n\t]+ -> channel(3) // channel(WHITESPACE)
;
// Catch-all for anything we can't recognize.
// We use this to be able to ignore and recover all the text
// when splitting statements with DelimiterLexer
UNRECOGNIZED
: .
;
================================================
FILE: kafka-ui-api/src/main/java/com/provectus/kafka/ui/KafkaUiApplication.java
================================================
package com.provectus.kafka.ui;
import com.provectus.kafka.ui.util.DynamicConfigOperations;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.ldap.LdapAutoConfiguration;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;
@SpringBootApplication(exclude = LdapAutoConfiguration.class)
@EnableScheduling
@EnableAsync
public class KafkaUiApplication {
public static void main(String[] args) {
startApplication(args);
}
public static ConfigurableApplicationContext startApplication(String[] args) {
return new SpringApplicationBuilder(KafkaUiApplication.class)
.initializers(DynamicConfigOperations.dynamicConfigPropertiesInitializer())
.build()
.run(args);
}
}
================================================
FILE: kafka-ui-api/src/main/java/com/provectus/kafka/ui/client/RetryingKafkaConnectClient.java
================================================
package com.provectus.kafka.ui.client;
import static com.provectus.kafka.ui.config.ClustersProperties.ConnectCluster;
import com.provectus.kafka.ui.config.ClustersProperties;
import com.provectus.kafka.ui.connect.ApiClient;
import com.provectus.kafka.ui.connect.api.KafkaConnectClientApi;
import com.provectus.kafka.ui.connect.model.Connector;
import com.provectus.kafka.ui.connect.model.ConnectorPlugin;
import com.provectus.kafka.ui.connect.model.ConnectorPluginConfigValidationResponse;
import com.provectus.kafka.ui.connect.model.ConnectorStatus;
import com.provectus.kafka.ui.connect.model.ConnectorTask;
import com.provectus.kafka.ui.connect.model.ConnectorTopics;
import com.provectus.kafka.ui.connect.model.NewConnector;
import com.provectus.kafka.ui.connect.model.TaskStatus;
import com.provectus.kafka.ui.exception.KafkaConnectConflictReponseException;
import com.provectus.kafka.ui.exception.ValidationException;
import com.provectus.kafka.ui.util.WebClientConfigurator;
import java.time.Duration;
import java.util.List;
import java.util.Map;
import javax.annotation.Nullable;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.util.unit.DataSize;
import org.springframework.web.client.RestClientException;
import org.springframework.web.reactive.function.client.WebClient;
import org.springframework.web.reactive.function.client.WebClientResponseException;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import reactor.util.retry.Retry;
@Slf4j
public class RetryingKafkaConnectClient extends KafkaConnectClientApi {
private static final int MAX_RETRIES = 5;
private static final Duration RETRIES_DELAY = Duration.ofMillis(200);
public RetryingKafkaConnectClient(ConnectCluster config,
@Nullable ClustersProperties.TruststoreConfig truststoreConfig,
DataSize maxBuffSize) {
super(new RetryingApiClient(config, truststoreConfig, maxBuffSize));
}
private static Retry conflictCodeRetry() {
return Retry
.fixedDelay(MAX_RETRIES, RETRIES_DELAY)
.filter(e -> e instanceof WebClientResponseException.Conflict)
.onRetryExhaustedThrow((spec, signal) ->
new KafkaConnectConflictReponseException(
(WebClientResponseException.Conflict) signal.failure()));
}
private static Mono withRetryOnConflict(Mono publisher) {
return publisher.retryWhen(conflictCodeRetry());
}
private static Flux withRetryOnConflict(Flux publisher) {
return publisher.retryWhen(conflictCodeRetry());
}
private static Mono withBadRequestErrorHandling(Mono publisher) {
return publisher
.onErrorResume(WebClientResponseException.BadRequest.class, e ->
Mono.error(new ValidationException("Invalid configuration")))
.onErrorResume(WebClientResponseException.InternalServerError.class, e ->
Mono.error(new ValidationException("Invalid configuration")));
}
@Override
public Mono createConnector(NewConnector newConnector) throws RestClientException {
return withBadRequestErrorHandling(
super.createConnector(newConnector)
);
}
@Override
public Mono setConnectorConfig(String connectorName, Map requestBody)
throws RestClientException {
return withBadRequestErrorHandling(
super.setConnectorConfig(connectorName, requestBody)
);
}
@Override
public Mono> createConnectorWithHttpInfo(NewConnector newConnector)
throws WebClientResponseException {
return withRetryOnConflict(super.createConnectorWithHttpInfo(newConnector));
}
@Override
public Mono deleteConnector(String connectorName) throws WebClientResponseException {
return withRetryOnConflict(super.deleteConnector(connectorName));
}
@Override
public Mono> deleteConnectorWithHttpInfo(String connectorName)
throws WebClientResponseException {
return withRetryOnConflict(super.deleteConnectorWithHttpInfo(connectorName));
}
@Override
public Mono getConnector(String connectorName) throws WebClientResponseException {
return withRetryOnConflict(super.getConnector(connectorName));
}
@Override
public Mono> getConnectorWithHttpInfo(String connectorName)
throws WebClientResponseException {
return withRetryOnConflict(super.getConnectorWithHttpInfo(connectorName));
}
@Override
public Mono