ruby-kafka 0.5.4 → 0.5.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5c4c29bd5a3b7adccced77247c440446e9caa88cec568e71a5b75a7c72356f75
4
- data.tar.gz: 38ed9f15e4384c1f0cc3c000a08075785d5a73779fa0ab0dafff3881328de9e7
3
+ metadata.gz: 63ec54e4024c83bb5a73583700391db7b89fed005bb4b196cf912424351bba0e
4
+ data.tar.gz: d567d51c5434f6ef034b769f78cc03286d91e875aa5ea9058623cd2e755cf28c
5
5
  SHA512:
6
- metadata.gz: b84905cc979247733dd0d44056adcd876b6d5bdae264c1fa8b52fea9b04d3bd2f0c2dc3b4a22c875c228f5d6ef94cb4dff32e9e1f50f3d3a7ce19ad32615a479
7
- data.tar.gz: b2de57d34f12c2e448383b7eb79263bdadc093a49b96e99bfbdda1db16566307702c09c4a18d38fd5452f1f5b63c27cf28f50c73c36b426b920ae6775ba56b6a
6
+ metadata.gz: 3f9f8269075c30eb60a3ee7afcca5c1fe8eab9aa6c5cf51c5512dc6b564299a5366d33bc97d08b61a17ecc4a299e066ecb48f86938c93643324a8083289ed3af
7
+ data.tar.gz: 92767b83a152bef74992d1b4dc4b1818bdce8715a4e1e32c53671eaf6ee8d28d8e76d4800bf141c8cdd6cc44ef51aef78335464dbe504f8f72245ec8fc964a9a
@@ -4,9 +4,13 @@ Changes and additions to the library will be listed here.
4
4
 
5
5
  ## Unreleased
6
6
 
7
+ ## v0.5.5
8
+
9
+ - Support PLAINTEXT and SSL URI schemes (#550).
10
+
7
11
  ## v0.5.4
8
12
 
9
- - Add support for config entries in the topic creation API.
13
+ - Add support for config entries in the topic creation API (#540).
10
14
  - Don't fail on retry when the cluster is secured (#545).
11
15
 
12
16
  ## v0.5.3
data/README.md CHANGED
@@ -2,7 +2,6 @@
2
2
 
3
3
  A Ruby client library for [Apache Kafka](http://kafka.apache.org/), a distributed log and message bus. The focus of this library will be operational simplicity, with good logging and metrics that can make debugging issues easier.
4
4
 
5
- Although parts of this library work with Kafka 0.8 – specifically, the Producer API – it's being tested and developed against Kafka 0.9. The Consumer API is Kafka 0.9+ only.
6
5
 
7
6
  ## Table of Contents
8
7
 
@@ -0,0 +1,41 @@
1
+ require "uri"
2
+
3
+ module Kafka
4
+ module BrokerUri
5
+ DEFAULT_PORT = 9092
6
+ URI_SCHEMES = ["kafka", "kafka+ssl", "plaintext", "ssl"]
7
+
8
+ # Parses a Kafka broker URI string.
9
+ #
10
+ # Examples of valid strings:
11
+ # * `kafka1.something`
12
+ # * `kafka1.something:1234`
13
+ # * `kafka://kafka1.something:1234`
14
+ # * `kafka+ssl://kafka1.something:1234`
15
+ # * `plaintext://kafka1.something:1234`
16
+ #
17
+ # @param str [String] a Kafka broker URI string.
18
+ # @return [URI]
19
+ def self.parse(str)
20
+ # Make sure there's a scheme part if it's missing.
21
+ str = "kafka://" + str unless str.include?("://")
22
+
23
+ uri = URI.parse(str)
24
+ uri.port ||= DEFAULT_PORT
25
+
26
+ # Map some schemes to others.
27
+ case uri.scheme
28
+ when 'plaintext'
29
+ uri.scheme = 'kafka'
30
+ when 'ssl'
31
+ uri.scheme = 'kafka+ssl'
32
+ end
33
+
34
+ unless URI_SCHEMES.include?(uri.scheme)
35
+ raise Kafka::Error, "invalid protocol `#{uri.scheme}` in `#{str}`"
36
+ end
37
+
38
+ uri
39
+ end
40
+ end
41
+ end
@@ -1,10 +1,9 @@
1
- require "openssl"
2
- require "uri"
3
-
1
+ require "kafka/ssl_context"
4
2
  require "kafka/cluster"
5
3
  require "kafka/producer"
6
4
  require "kafka/consumer"
7
5
  require "kafka/heartbeat"
6
+ require "kafka/broker_uri"
8
7
  require "kafka/async_producer"
9
8
  require "kafka/fetched_message"
10
9
  require "kafka/fetch_operation"
@@ -14,8 +13,6 @@ require "kafka/sasl_authenticator"
14
13
 
15
14
  module Kafka
16
15
  class Client
17
- URI_SCHEMES = ["kafka", "kafka+ssl"]
18
-
19
16
  # Initializes a new Kafka client.
20
17
  #
21
18
  # @param seed_brokers [Array<String>, String] the list of brokers used to initialize
@@ -65,7 +62,13 @@ module Kafka
65
62
  @instrumenter = Instrumenter.new(client_id: client_id)
66
63
  @seed_brokers = normalize_seed_brokers(seed_brokers)
67
64
 
68
- ssl_context = build_ssl_context(ssl_ca_cert_file_path, ssl_ca_cert, ssl_client_cert, ssl_client_cert_key, ssl_ca_certs_from_system)
65
+ ssl_context = SslContext.build(
66
+ ca_cert_file_path: ssl_ca_cert_file_path,
67
+ ca_cert: ssl_ca_cert,
68
+ client_cert: ssl_client_cert,
69
+ client_cert_key: ssl_client_cert_key,
70
+ ca_certs_from_system: ssl_ca_certs_from_system,
71
+ )
69
72
 
70
73
  sasl_authenticator = SaslAuthenticator.new(
71
74
  sasl_gssapi_principal: sasl_gssapi_principal,
@@ -605,55 +608,12 @@ module Kafka
605
608
  )
606
609
  end
607
610
 
608
- def build_ssl_context(ca_cert_file_path, ca_cert, client_cert, client_cert_key, ssl_ca_certs_from_system)
609
- return nil unless ca_cert_file_path || ca_cert || client_cert || client_cert_key || ssl_ca_certs_from_system
610
-
611
- ssl_context = OpenSSL::SSL::SSLContext.new
612
-
613
- if client_cert && client_cert_key
614
- ssl_context.set_params(
615
- cert: OpenSSL::X509::Certificate.new(client_cert),
616
- key: OpenSSL::PKey.read(client_cert_key)
617
- )
618
- elsif client_cert && !client_cert_key
619
- raise ArgumentError, "Kafka client initialized with `ssl_client_cert` but no `ssl_client_cert_key`. Please provide both."
620
- elsif !client_cert && client_cert_key
621
- raise ArgumentError, "Kafka client initialized with `ssl_client_cert_key`, but no `ssl_client_cert`. Please provide both."
622
- end
623
-
624
- if ca_cert || ca_cert_file_path || ssl_ca_certs_from_system
625
- store = OpenSSL::X509::Store.new
626
- Array(ca_cert).each do |cert|
627
- store.add_cert(OpenSSL::X509::Certificate.new(cert))
628
- end
629
- if ca_cert_file_path
630
- store.add_file(ca_cert_file_path)
631
- end
632
- if ssl_ca_certs_from_system
633
- store.set_default_paths
634
- end
635
- ssl_context.cert_store = store
636
- end
637
-
638
- ssl_context
639
- end
640
-
641
611
  def normalize_seed_brokers(seed_brokers)
642
612
  if seed_brokers.is_a?(String)
643
613
  seed_brokers = seed_brokers.split(",")
644
614
  end
645
615
 
646
- seed_brokers.map do |connection|
647
- connection = "kafka://" + connection unless connection =~ /:\/\//
648
- uri = URI.parse(connection)
649
- uri.port ||= 9092 # Default Kafka port.
650
-
651
- unless URI_SCHEMES.include?(uri.scheme)
652
- raise Kafka::Error, "invalid protocol `#{uri.scheme}` in `#{connection}`"
653
- end
654
-
655
- uri
656
- end
616
+ seed_brokers.map {|str| BrokerUri.parse(str) }
657
617
  end
658
618
  end
659
619
  end
@@ -186,6 +186,11 @@ module Kafka
186
186
  @logger.warn "Leader not yet available for `#{name}`, waiting 1s..."
187
187
  sleep 1
188
188
 
189
+ retry
190
+ rescue Kafka::UnknownTopicOrPartition
191
+ @logger.warn "Topic `#{name}` not yet created, waiting 1s..."
192
+ sleep 1
193
+
189
194
  retry
190
195
  end
191
196
 
@@ -0,0 +1,39 @@
1
+ require "openssl"
2
+
3
+ module Kafka
4
+ module SslContext
5
+
6
+ def self.build(ca_cert_file_path: nil, ca_cert: nil, client_cert: nil, client_cert_key: nil, ca_certs_from_system: nil)
7
+ return nil unless ca_cert_file_path || ca_cert || client_cert || client_cert_key || ca_certs_from_system
8
+
9
+ ssl_context = OpenSSL::SSL::SSLContext.new
10
+
11
+ if client_cert && client_cert_key
12
+ ssl_context.set_params(
13
+ cert: OpenSSL::X509::Certificate.new(client_cert),
14
+ key: OpenSSL::PKey.read(client_cert_key)
15
+ )
16
+ elsif client_cert && !client_cert_key
17
+ raise ArgumentError, "Kafka client initialized with `ssl_client_cert` but no `ssl_client_cert_key`. Please provide both."
18
+ elsif !client_cert && client_cert_key
19
+ raise ArgumentError, "Kafka client initialized with `ssl_client_cert_key`, but no `ssl_client_cert`. Please provide both."
20
+ end
21
+
22
+ if ca_cert || ca_cert_file_path || ca_certs_from_system
23
+ store = OpenSSL::X509::Store.new
24
+ Array(ca_cert).each do |cert|
25
+ store.add_cert(OpenSSL::X509::Certificate.new(cert))
26
+ end
27
+ if ca_cert_file_path
28
+ store.add_file(ca_cert_file_path)
29
+ end
30
+ if ca_certs_from_system
31
+ store.set_default_paths
32
+ end
33
+ ssl_context.cert_store = store
34
+ end
35
+
36
+ ssl_context
37
+ end
38
+ end
39
+ end
@@ -1,3 +1,3 @@
1
1
  module Kafka
2
- VERSION = "0.5.4"
2
+ VERSION = "0.5.5"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby-kafka
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.4
4
+ version: 0.5.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daniel Schierbeck
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-03-16 00:00:00.000000000 Z
11
+ date: 2018-04-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -310,6 +310,7 @@ files:
310
310
  - lib/kafka/async_producer.rb
311
311
  - lib/kafka/broker.rb
312
312
  - lib/kafka/broker_pool.rb
313
+ - lib/kafka/broker_uri.rb
313
314
  - lib/kafka/client.rb
314
315
  - lib/kafka/cluster.rb
315
316
  - lib/kafka/compression.rb
@@ -382,6 +383,7 @@ files:
382
383
  - lib/kafka/sasl_authenticator.rb
383
384
  - lib/kafka/snappy_codec.rb
384
385
  - lib/kafka/socket_with_timeout.rb
386
+ - lib/kafka/ssl_context.rb
385
387
  - lib/kafka/ssl_socket_with_timeout.rb
386
388
  - lib/kafka/statsd.rb
387
389
  - lib/kafka/version.rb