warm-blanket 1.0.0

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.
@@ -0,0 +1,98 @@
1
+ # WarmBlanket: Ruby gem for warming up web services on boot
2
+ # Copyright (C) 2017 Talkdesk, Inc. <tech@talkdesk.com>
3
+ #
4
+ # This file is part of WarmBlanket.
5
+ #
6
+ # WarmBlanket is free software: you can redistribute it and/or modify
7
+ # it under the terms of the GNU Lesser General Public License as published by
8
+ # the Free Software Foundation, either version 3 of the License, or
9
+ # (at your option) any later version.
10
+ #
11
+ # WarmBlanket is distributed in the hope that it will be useful,
12
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ # GNU Lesser General Public License for more details.
15
+ #
16
+ # You should have received a copy of the GNU Lesser General Public License
17
+ # along with WarmBlanket. If not, see <http://www.gnu.org/licenses/>.
18
+
19
+ require 'faraday'
20
+
21
+ module WarmBlanket
22
+ # Issues one request per call to the configured endpoint
23
+ class Requester
24
+
25
+ InvalidHTTPVerb = Class.new(StandardError)
26
+
27
+ private
28
+
29
+ SUPPORTED_VERBS = [:get, :post, :put].freeze
30
+ private_constant :SUPPORTED_VERBS
31
+
32
+ attr_reader :base_url
33
+ attr_reader :default_headers
34
+ attr_reader :endpoints
35
+ attr_reader :logger
36
+ attr_reader :connection_factory
37
+
38
+ attr_accessor :next_endpoint_position
39
+
40
+ public
41
+
42
+ def initialize(base_url:, default_headers:, endpoints:, logger: WarmBlanket.config.logger, connection_factory: Faraday)
43
+ @base_url = base_url
44
+ @default_headers = default_headers
45
+ @endpoints = endpoints
46
+ @logger = logger
47
+ @connection_factory = connection_factory
48
+ @next_endpoint_position = 0
49
+ end
50
+
51
+ def call
52
+ connection = connection_factory.new(url: base_url)
53
+
54
+ endpoint = next_endpoint
55
+
56
+ http_verb = extract_verb(endpoint)
57
+
58
+ logger.debug "Requesting #{endpoint.fetch(http_verb)}"
59
+
60
+ response = connection.public_send(http_verb) do |request|
61
+ apply_headers(request, default_headers)
62
+ apply_headers(request, endpoint[:headers])
63
+ request.url(endpoint.fetch(http_verb))
64
+ request.body = endpoint[:body] if endpoint[:body]
65
+ end
66
+
67
+ if response.status == 200
68
+ logger.debug "Request successful"
69
+ else
70
+ logger.warn "Request to #{endpoint.fetch(http_verb)} failed with code #{response.status}"
71
+ end
72
+
73
+ nil
74
+ end
75
+
76
+ private
77
+
78
+ def apply_headers(request, headers)
79
+ headers&.each do |header, value|
80
+ request.headers[header.to_s] = value
81
+ end
82
+ end
83
+
84
+ def next_endpoint
85
+ next_endpoint = endpoints[next_endpoint_position]
86
+ self.next_endpoint_position = (next_endpoint_position + 1) % endpoints.size
87
+ next_endpoint
88
+ end
89
+
90
+ def extract_verb(endpoint)
91
+ SUPPORTED_VERBS.each do |verb|
92
+ return verb if endpoint.key?(verb)
93
+ end
94
+
95
+ raise InvalidHTTPVerb, "Unsupported or missing HTTP verb for request: #{endpoint.inspect}"
96
+ end
97
+ end
98
+ end
@@ -0,0 +1,23 @@
1
+ # WarmBlanket: Ruby gem for warming up web services on boot
2
+ # Copyright (C) 2017 Talkdesk, Inc. <tech@talkdesk.com>
3
+ #
4
+ # This file is part of WarmBlanket.
5
+ #
6
+ # WarmBlanket is free software: you can redistribute it and/or modify
7
+ # it under the terms of the GNU Lesser General Public License as published by
8
+ # the Free Software Foundation, either version 3 of the License, or
9
+ # (at your option) any later version.
10
+ #
11
+ # WarmBlanket is distributed in the hope that it will be useful,
12
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ # GNU Lesser General Public License for more details.
15
+ #
16
+ # You should have received a copy of the GNU Lesser General Public License
17
+ # along with WarmBlanket. If not, see <http://www.gnu.org/licenses/>.
18
+
19
+ # frozen_string_literal: true
20
+
21
+ module WarmBlanket
22
+ VERSION = '1.0.0'
23
+ end
@@ -0,0 +1,67 @@
1
+ # WarmBlanket: Ruby gem for warming up web services on boot
2
+ # Copyright (C) 2017 Talkdesk, Inc. <tech@talkdesk.com>
3
+ #
4
+ # This file is part of WarmBlanket.
5
+ #
6
+ # WarmBlanket is free software: you can redistribute it and/or modify
7
+ # it under the terms of the GNU Lesser General Public License as published by
8
+ # the Free Software Foundation, either version 3 of the License, or
9
+ # (at your option) any later version.
10
+ #
11
+ # WarmBlanket is distributed in the hope that it will be useful,
12
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ # GNU Lesser General Public License for more details.
15
+ #
16
+ # You should have received a copy of the GNU Lesser General Public License
17
+ # along with WarmBlanket. If not, see <http://www.gnu.org/licenses/>.
18
+
19
+ require 'socket'
20
+ require 'time'
21
+
22
+ module WarmBlanket
23
+ # Waits for given port to be available
24
+ class WaitForPort
25
+
26
+ InvalidPort = Class.new(StandardError)
27
+
28
+ private
29
+
30
+ attr_reader :hostname
31
+ attr_reader :port
32
+ attr_reader :logger
33
+ attr_reader :time_deadline
34
+
35
+ public
36
+
37
+ def initialize(hostname: 'localhost', port:, time_deadline: (Time.now + 90), logger: WarmBlanket.config.logger)
38
+ port = Integer(port) rescue nil
39
+ raise InvalidPort, "Invalid port (#{port.inspect})" unless (1...2**16).include?(port)
40
+
41
+ @hostname = hostname
42
+ @port = port
43
+ @logger = logger
44
+ @time_deadline = time_deadline
45
+ end
46
+
47
+ def call
48
+ logger.debug "Waiting for #{hostname}:#{port} to be available"
49
+
50
+ while true
51
+ socket = nil
52
+ begin
53
+ socket = TCPSocket.new(hostname, port)
54
+ logger.debug "Service at #{hostname}:#{port} is up"
55
+ return true
56
+ rescue StandardError => e
57
+ logger.debug "Exception while waiting for port to be available #{e.class}: #{e.message}"
58
+ ensure
59
+ socket&.close
60
+ end
61
+
62
+ return false if Time.now >= time_deadline
63
+ sleep 1
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,32 @@
1
+ lib = File.expand_path('../lib', __FILE__)
2
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
+
4
+ require 'warm_blanket/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'warm-blanket'
8
+ spec.version = WarmBlanket::VERSION
9
+ spec.authors = ['Talkdesk Engineering']
10
+ spec.email = ['tech@talkdesk.com']
11
+ spec.license = 'LGPL-3.0+'
12
+
13
+ spec.summary = 'Ruby gem for warming up web services on boot'
14
+ spec.description = 'Ruby gem for warming up web services on boot'
15
+ spec.homepage = 'https://github.com/Talkdesk/warm-blanket'
16
+
17
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
18
+ spec.require_paths = ['lib']
19
+
20
+ spec.add_development_dependency 'bundler', '~> 1.15'
21
+ spec.add_development_dependency 'rspec', '~> 3.6'
22
+ spec.add_development_dependency 'webmock', '~> 3.0'
23
+ spec.add_development_dependency 'timecop', '~> 0.9'
24
+ spec.add_development_dependency 'rake', '~> 12.0'
25
+ spec.add_development_dependency 'pry'
26
+ spec.add_development_dependency 'pry-byebug' unless RUBY_PLATFORM == 'java'
27
+ spec.add_development_dependency 'pry-debugger-jruby' if RUBY_PLATFORM == 'java'
28
+
29
+ spec.add_dependency 'faraday', '~> 0.9'
30
+ spec.add_dependency 'dry-configurable', '~> 0.7'
31
+ spec.add_dependency 'logging', '~> 2.1'
32
+ end
metadata ADDED
@@ -0,0 +1,201 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: warm-blanket
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Talkdesk Engineering
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2017-07-28 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - "~>"
17
+ - !ruby/object:Gem::Version
18
+ version: '1.15'
19
+ name: bundler
20
+ prerelease: false
21
+ type: :development
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.15'
27
+ - !ruby/object:Gem::Dependency
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - "~>"
31
+ - !ruby/object:Gem::Version
32
+ version: '3.6'
33
+ name: rspec
34
+ prerelease: false
35
+ type: :development
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '3.6'
41
+ - !ruby/object:Gem::Dependency
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '3.0'
47
+ name: webmock
48
+ prerelease: false
49
+ type: :development
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3.0'
55
+ - !ruby/object:Gem::Dependency
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '0.9'
61
+ name: timecop
62
+ prerelease: false
63
+ type: :development
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '0.9'
69
+ - !ruby/object:Gem::Dependency
70
+ requirement: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: '12.0'
75
+ name: rake
76
+ prerelease: false
77
+ type: :development
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '12.0'
83
+ - !ruby/object:Gem::Dependency
84
+ requirement: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ name: pry
90
+ prerelease: false
91
+ type: :development
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ requirement: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - ">="
101
+ - !ruby/object:Gem::Version
102
+ version: '0'
103
+ name: pry-debugger-jruby
104
+ prerelease: false
105
+ type: :development
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ requirement: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - "~>"
115
+ - !ruby/object:Gem::Version
116
+ version: '0.9'
117
+ name: faraday
118
+ prerelease: false
119
+ type: :runtime
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '0.9'
125
+ - !ruby/object:Gem::Dependency
126
+ requirement: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - "~>"
129
+ - !ruby/object:Gem::Version
130
+ version: '0.7'
131
+ name: dry-configurable
132
+ prerelease: false
133
+ type: :runtime
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '0.7'
139
+ - !ruby/object:Gem::Dependency
140
+ requirement: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - "~>"
143
+ - !ruby/object:Gem::Version
144
+ version: '2.1'
145
+ name: logging
146
+ prerelease: false
147
+ type: :runtime
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: '2.1'
153
+ description: Ruby gem for warming up web services on boot
154
+ email:
155
+ - tech@talkdesk.com
156
+ executables: []
157
+ extensions: []
158
+ extra_rdoc_files: []
159
+ files:
160
+ - ".gitignore"
161
+ - ".rspec"
162
+ - ".ruby-version"
163
+ - COPYING
164
+ - COPYING.LESSER
165
+ - Gemfile
166
+ - README.md
167
+ - Rakefile
168
+ - bin/console
169
+ - bin/pry
170
+ - bin/rspec
171
+ - lib/warm-blanket.rb
172
+ - lib/warm_blanket/orchestrator.rb
173
+ - lib/warm_blanket/requester.rb
174
+ - lib/warm_blanket/version.rb
175
+ - lib/warm_blanket/wait_for_port.rb
176
+ - warm-blanket.gemspec
177
+ homepage: https://github.com/Talkdesk/warm-blanket
178
+ licenses:
179
+ - LGPL-3.0+
180
+ metadata: {}
181
+ post_install_message:
182
+ rdoc_options: []
183
+ require_paths:
184
+ - lib
185
+ required_ruby_version: !ruby/object:Gem::Requirement
186
+ requirements:
187
+ - - ">="
188
+ - !ruby/object:Gem::Version
189
+ version: '0'
190
+ required_rubygems_version: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - ">="
193
+ - !ruby/object:Gem::Version
194
+ version: '0'
195
+ requirements: []
196
+ rubyforge_project:
197
+ rubygems_version: 2.6.11
198
+ signing_key:
199
+ specification_version: 4
200
+ summary: Ruby gem for warming up web services on boot
201
+ test_files: []