warm-blanket 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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: []