From 66025c7d59985a28125c45bf02933463cdda7a88 Mon Sep 17 00:00:00 2001 From: Nir Gazit Date: Sun, 17 Jan 2021 14:45:29 +0200 Subject: [PATCH] Added support for SSL connection to the Kafka cluster --- plugins/kafka-backend/README.md | 4 ++++ plugins/kafka-backend/config.d.ts | 5 +++++ plugins/kafka-backend/src/service/KafkaApi.ts | 18 +++++++++++++----- plugins/kafka-backend/src/service/router.ts | 6 +++++- yarn.lock | 11 ++++++----- 5 files changed, 33 insertions(+), 11 deletions(-) diff --git a/plugins/kafka-backend/README.md b/plugins/kafka-backend/README.md index 862a4e95b8..e9b73abd35 100644 --- a/plugins/kafka-backend/README.md +++ b/plugins/kafka-backend/README.md @@ -14,6 +14,10 @@ The name of the client to use when connecting to the cluster. A list of the brokers' host names and ports to connect to. +### ssl (optional) + +Configure TLS connection to the Kafka cluster. The options are passed directly to [tls.connect] and used to create the TLS secure context. Normally these would include `key` and `cert`. + Example: ```yaml diff --git a/plugins/kafka-backend/config.d.ts b/plugins/kafka-backend/config.d.ts index 692c8754d2..0eeeb42197 100644 --- a/plugins/kafka-backend/config.d.ts +++ b/plugins/kafka-backend/config.d.ts @@ -17,5 +17,10 @@ export interface Config { kafka?: { clientId: string; brokers: string[]; + ssl?: { + ca: string[]; + key: string; + cert: string; + }; }; } diff --git a/plugins/kafka-backend/src/service/KafkaApi.ts b/plugins/kafka-backend/src/service/KafkaApi.ts index b979796f4a..1eade40bf4 100644 --- a/plugins/kafka-backend/src/service/KafkaApi.ts +++ b/plugins/kafka-backend/src/service/KafkaApi.ts @@ -16,6 +16,7 @@ import { Kafka, SeekEntry } from 'kafkajs'; import { Logger } from 'winston'; +import { ConnectionOptions } from 'tls'; export type PartitionOffset = { id: number; @@ -27,6 +28,13 @@ export type TopicOffset = { partitions: PartitionOffset[]; }; +export type Options = { + clientId: string; + brokers: string[]; + ssl?: ConnectionOptions; + logger: Logger; +}; + export interface KafkaApi { fetchTopicOffsets(topic: string): Promise>; fetchGroupOffsets(groupId: string): Promise>; @@ -36,13 +44,13 @@ export class KafkaJsApiImpl implements KafkaApi { private readonly kafka: Kafka; private readonly logger: Logger; - constructor(clientId: string, brokers: string[], logger: Logger) { - logger.debug( - `creating kafka client with clientId=${clientId} and brokers=${brokers}`, + constructor(options: Options) { + options.logger.debug( + `creating kafka client with clientId=${options.clientId} and brokers=${options.brokers}`, ); - this.kafka = new Kafka({ clientId, brokers }); - this.logger = logger; + this.kafka = new Kafka(options); + this.logger = options.logger; } async fetchTopicOffsets(topic: string): Promise> { diff --git a/plugins/kafka-backend/src/service/router.ts b/plugins/kafka-backend/src/service/router.ts index 621de690d3..2bbc877fe2 100644 --- a/plugins/kafka-backend/src/service/router.ts +++ b/plugins/kafka-backend/src/service/router.ts @@ -20,6 +20,7 @@ import { Logger } from 'winston'; import { Config } from '@backstage/config'; import { KafkaApi, KafkaJsApiImpl } from './KafkaApi'; import _ from 'lodash'; +import { ConnectionOptions } from 'tls'; export interface RouterOptions { logger: Logger; @@ -71,7 +72,10 @@ export async function createRouter( const clientId = options.config.getString('kafka.clientId'); const brokers = options.config.getStringArray('kafka.brokers'); - const kafkaApi = new KafkaJsApiImpl(clientId, brokers, logger); + const sslConfig = options.config.getOptional('kafka.ssl'); + const ssl = sslConfig ? (sslConfig as ConnectionOptions) : undefined; + + const kafkaApi = new KafkaJsApiImpl({ clientId, brokers, logger, ssl }); return makeRouter(logger, kafkaApi); } diff --git a/yarn.lock b/yarn.lock index 71fb15d9dd..cb8aed7d86 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2437,7 +2437,7 @@ "@backstage/catalog-model@^0.2.0": version "0.6.1" dependencies: - "@backstage/config" "^0.1.1" + "@backstage/config" "^0.1.2" "@types/json-schema" "^7.0.5" "@types/yup" "^0.29.8" json-schema "^0.2.5" @@ -2448,7 +2448,7 @@ "@backstage/catalog-model@^0.3.0": version "0.6.1" dependencies: - "@backstage/config" "^0.1.1" + "@backstage/config" "^0.1.2" "@types/json-schema" "^7.0.5" "@types/yup" "^0.29.8" json-schema "^0.2.5" @@ -2459,13 +2459,14 @@ "@backstage/core@^0.3.0": version "0.4.4" dependencies: - "@backstage/config" "^0.1.1" - "@backstage/core-api" "^0.2.1" - "@backstage/theme" "^0.2.1" + "@backstage/config" "^0.1.2" + "@backstage/core-api" "^0.2.8" + "@backstage/theme" "^0.2.2" "@material-ui/core" "^4.11.0" "@material-ui/icons" "^4.9.1" "@material-ui/lab" "4.0.0-alpha.45" "@types/dagre" "^0.7.44" + "@types/prop-types" "^15.7.3" "@types/react" "^16.9" "@types/react-sparklines" "^1.7.0" classnames "^2.2.6"