bits_service_client 3.3.0 → 3.4.0.pre.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: eb5333ac7373fd26d9ef9be01cffff94b9a3dece
4
- data.tar.gz: 65704f0fbb475e1ce6b324da8a727fe7d673bde1
3
+ metadata.gz: 7d7684746adb5996dafb5100c93d96a42bbeae06
4
+ data.tar.gz: e79ddcd829e6e8bb761e23b387dbd629cd3057b1
5
5
  SHA512:
6
- metadata.gz: 9568f6dcb72e7b4a566b77d4b2ab4e31ff80113a65f8c384fa0339acb641d79a180252ed7000ea63f5410ecd8a220e5f262aedb013a1843f4e438759e9568a1c
7
- data.tar.gz: 52ae5702b69aa85aba90604e1d6c4d8b9b3868779e038a9bbc9cae7e284f79f40ae8ac12ac5945af91991fbc7d5e024dd25077570bc6a60400051a2edd661562
6
+ metadata.gz: d8cde1d30a5f69dcc48e0a4cac67517847ae64c0a4b118afe232f15a1a04ad71e12ebd2b95e028a4f32e80e71b22b0f3addb25efdead0228990cde01c40f5309
7
+ data.tar.gz: dc17b670fd6403cd8627e943a7083ccc593c56967413d93765eea0fc4a87564a89ec21c72fec4f2716c50923c25558f8c6df2004526d33ac1af1cb02ad92e3da
data/.rubocop.yml CHANGED
@@ -1,5 +1,5 @@
1
1
  AllCops:
2
- TargetRubyVersion: 2.3
2
+ TargetRubyVersion: 2.4
3
3
  Include:
4
4
  - '**/Gemfile'
5
5
  - '**/Rakefile'
@@ -157,3 +157,9 @@ Style/WordArray:
157
157
 
158
158
  Style/ZeroLengthPredicate:
159
159
  Enabled: false
160
+
161
+ Metrics/BlockLength:
162
+ Exclude:
163
+ - 'Rakefile'
164
+ - '**/*.rake'
165
+ - 'spec/**/*.rb'
data/Gemfile CHANGED
@@ -1,3 +1,4 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  source 'https://rubygems.org'
3
4
  gemspec
data/Guardfile CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  guard :bundler do
2
4
  require 'guard/bundler'
3
5
  require 'guard/bundler/verify'
@@ -12,12 +14,12 @@ end
12
14
 
13
15
  guard :rspec, cmd: 'bundle exec rspec' do
14
16
  watch(%r{^spec/.+_spec\.rb$})
15
- watch(%r{^lib/bits_service_client/(.+)\.rb$}){|m| "spec/unit/bits_service_client/#{m[1]}_spec.rb"}
16
- watch(%r{^lib/bits_service_client/client.rb$}){|m| "spec/unit/bits_service_client/bits_service_client_spec.rb"}
17
- watch('spec/spec_helper.rb') { 'spec' }
17
+ watch(%r{^lib/bits_service_client/(.+)\.rb$}) { |m| "spec/unit/bits_service_client/#{m[1]}_spec.rb" }
18
+ watch(%r{^lib/bits_service_client/client.rb$}) { |m| 'spec/unit/bits_service_client/bits_service_client_spec.rb' }
19
+ watch('spec/spec_helper.rb') { 'spec' }
18
20
  end
19
21
 
20
22
  guard :rubocop do
21
- watch(%r{.+\.rb$})
23
+ watch(/.+\.rb$/)
22
24
  watch(%r{(?:.+/)?\.rubocop\.yml$}) { |m| File.dirname(m[0]) }
23
25
  end
data/Rakefile CHANGED
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'bundler/gem_tasks'
3
4
  require 'rspec/core/rake_task'
4
5
  require 'rubocop/rake_task'
@@ -1,5 +1,5 @@
1
- # coding: utf-8
2
1
  # frozen_string_literal: true
2
+
3
3
  lib = File.expand_path('../lib', __FILE__)
4
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
5
  require 'bits_service_client/version'
@@ -18,6 +18,7 @@ Gem::Specification.new do |spec|
18
18
 
19
19
  spec.add_dependency 'activesupport'
20
20
  spec.add_dependency 'steno'
21
+ spec.add_dependency 'statsd-ruby', '~> 1.4'
21
22
 
22
23
  spec.add_development_dependency 'bundler', '~> 1.11'
23
24
  spec.add_development_dependency 'multipart-post'
@@ -27,4 +28,7 @@ Gem::Specification.new do |spec|
27
28
  spec.add_development_dependency 'rspec', '~> 3.0'
28
29
  spec.add_development_dependency 'rubocop'
29
30
  spec.add_development_dependency 'webmock', '= 2.3.1'
31
+ spec.add_development_dependency 'sinatra'
32
+ spec.add_development_dependency 'pry'
33
+ spec.add_development_dependency 'pry-nav'
30
34
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module BitsService
3
4
  class Blob
4
5
  attr_reader :key
@@ -8,7 +9,7 @@ module BitsService
8
9
  @private_http_client = private_http_client
9
10
  @vcap_request_id = vcap_request_id
10
11
  @username = username
11
- @password =password
12
+ @password = password
12
13
  @resource_type = resource_type
13
14
  @private_endpoint = private_endpoint
14
15
  end
@@ -26,7 +27,7 @@ module BitsService
26
27
  end
27
28
 
28
29
  def public_upload_url
29
- signed_url(key, verb: 'put')+'&async=true'
30
+ signed_url(key, verb: 'put') + '&async=true'
30
31
  end
31
32
 
32
33
  def internal_download_url
@@ -1,15 +1,16 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'active_support/inflector'
3
4
  require 'bits_service_client/logging_http_client'
4
5
  require 'tmpdir'
5
- require "open3"
6
+ require 'open3'
6
7
 
7
8
  module BitsService
8
9
  class Client
9
10
  ResourceTypeNotPresent = Class.new(StandardError)
10
11
  ConfigurationError = Class.new(StandardError)
11
12
 
12
- def initialize(bits_service_options:, resource_type:, vcap_request_id: '', request_timeout_in_seconds: 900)
13
+ def initialize(bits_service_options:, resource_type:, vcap_request_id: '', request_timeout_in_seconds: 900, request_timeout_in_seconds_fast: 10)
13
14
  @username = validated(bits_service_options, :username)
14
15
  @password = validated(bits_service_options, :password)
15
16
  @private_endpoint = validated_http_url(bits_service_options, :private_endpoint)
@@ -20,6 +21,7 @@ module BitsService
20
21
  @vcap_request_id = vcap_request_id
21
22
 
22
23
  @private_http_client = create_logging_http_client(@private_endpoint, bits_service_options, request_timeout_in_seconds)
24
+ @private_http_client_fast_timeout = create_logging_http_client(@private_endpoint, bits_service_options, request_timeout_in_seconds_fast)
23
25
  @public_http_client = create_logging_http_client(@public_endpoint, bits_service_options, request_timeout_in_seconds)
24
26
  end
25
27
 
@@ -28,7 +30,7 @@ module BitsService
28
30
  end
29
31
 
30
32
  def exists?(key)
31
- response = @private_http_client.head(resource_path(key), @vcap_request_id)
33
+ response = @private_http_client_fast_timeout.head(resource_path(key), @vcap_request_id)
32
34
  validate_response_code!([200, 302, 404], response)
33
35
 
34
36
  response.code.to_i != 404
@@ -50,14 +52,14 @@ module BitsService
50
52
 
51
53
  body = { :"#{@resource_type.to_s.singularize}" => UploadIO.new(source_path, 'application/octet-stream') }
52
54
 
53
- if resources != nil
55
+ if !resources.nil?
54
56
  body[:resources] = resources.to_json
55
57
  end
56
58
 
57
59
  response = @private_http_client.do_request(Net::HTTP::Put::Multipart.new(resource_path(destination_key), body), @vcap_request_id)
58
60
  validate_response_code!(201, response)
59
- if response.body == nil
60
- logger.error("UnexpectedMissingBody: expected body with json payload. Got empty body.")
61
+ if response.body.nil?
62
+ logger.error('UnexpectedMissingBody: expected body with json payload. Got empty body.')
61
63
 
62
64
  fail BlobstoreError.new({
63
65
  response_code: response.code,
@@ -66,8 +68,8 @@ module BitsService
66
68
  }.to_json)
67
69
  end
68
70
  shas = JSON.parse(response.body, symbolize_names: true)
69
- validate_keys_present!([:sha1, :sha256], shas, response)
70
- return shas
71
+ validate_keys_present!(%i[sha1 sha256], shas, response)
72
+ shas
71
73
  end
72
74
 
73
75
  def download_from_blobstore(source_key, destination_path, mode: nil)
@@ -92,9 +94,8 @@ module BitsService
92
94
  end
93
95
 
94
96
  def delete(key)
95
- response = @private_http_client.delete(resource_path(key), @vcap_request_id)
97
+ response = @private_http_client_fast_timeout.delete(resource_path(key), @vcap_request_id)
96
98
  validate_response_code!([204, 404], response)
97
-
98
99
  if response.code.to_i == 404
99
100
  raise FileNotFound.new("Could not find object '#{key}', #{response.code}/#{response.body}")
100
101
  end
@@ -117,17 +118,17 @@ module BitsService
117
118
  end
118
119
 
119
120
  def delete_all(_=nil)
120
- raise NotImplementedError unless :buildpack_cache == resource_type
121
+ raise NotImplementedError unless resource_type == :buildpack_cache
121
122
 
122
- @private_http_client.delete(resource_path(''), @vcap_request_id).tap do |response|
123
+ @private_http_client_fast_timeout.delete(resource_path(''), @vcap_request_id).tap do |response|
123
124
  validate_response_code!(204, response)
124
125
  end
125
126
  end
126
127
 
127
128
  def delete_all_in_path(path)
128
- raise NotImplementedError unless :buildpack_cache == resource_type
129
+ raise NotImplementedError unless resource_type == :buildpack_cache
129
130
 
130
- @private_http_client.delete(resource_path(path.to_s), @vcap_request_id).tap do |response|
131
+ @private_http_client_fast_timeout.delete(resource_path(path.to_s), @vcap_request_id).tap do |response|
131
132
  validate_response_code!(204, response)
132
133
  end
133
134
  end
@@ -140,10 +141,10 @@ module BitsService
140
141
  LoggingHttpClient.new(
141
142
  Net::HTTP.new(endpoint.host, endpoint.port).tap do |c|
142
143
  c.read_timeout = request_timeout_in_seconds
143
- if bits_service_options.has_key?(:ca_cert_path)
144
+ if bits_service_options.key?(:ca_cert_path)
144
145
  ca_cert_path = bits_service_options[:ca_cert_path]
145
146
  else
146
- logger.info("Using bits-service client with root ca certs only (no configured ca_cert_path).")
147
+ logger.info('Using bits-service client with root ca certs only (no configured ca_cert_path).')
147
148
  ca_cert_path = nil
148
149
  end
149
150
  enable_ssl(c, ca_cert_path) if endpoint.scheme == 'https'
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module BitsService
3
4
  module Errors
4
5
  class Error < StandardError; end
@@ -1,9 +1,13 @@
1
1
  # frozen_string_literal: true
2
+
3
+ require 'statsd'
4
+
2
5
  module BitsService
3
6
  class LoggingHttpClient
4
7
  def initialize(http_client)
5
8
  @http_client = http_client
6
9
  @logger = Steno.logger('cc.bits_service_client')
10
+ @statsd = Statsd.new
7
11
  end
8
12
 
9
13
  def get(path, vcap_request_id, credentials=nil)
@@ -37,9 +41,22 @@ module BitsService
37
41
 
38
42
  request.add_field('X-VCAP-REQUEST-ID', vcap_request_id)
39
43
 
40
- @http_client.request(request).tap do |response|
44
+ begin
45
+ response = @http_client.request(request)
41
46
  @logger.info('Response', { code: response.code, vcap_request_id: vcap_request_id })
47
+ rescue Net::ReadTimeout => ex
48
+ @statsd.increment("cc.bits_#{request.method.downcase}.timeout")
49
+
50
+ @logger.info('Request timeout', {
51
+ method: request.method,
52
+ path: request.path,
53
+ address: @http_client.address,
54
+ port: @http_client.port,
55
+ vcap_request_id: vcap_request_id,
56
+ })
57
+ raise ex
42
58
  end
59
+ response
43
60
  end
44
61
  end
45
62
  end
@@ -18,7 +18,7 @@ module BitsService
18
18
  end
19
19
  end
20
20
 
21
- def signed_matches_url()
21
+ def signed_matches_url
22
22
  req = Net::HTTP::Get.new('/sign/app_stash/matches?verb=post')
23
23
  req.basic_auth(@username, @password)
24
24
  response = do_request(http_client, req, @vcap_request_id)
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module BitsServiceClient
4
- VERSION = '3.3.0'
4
+ VERSION = '3.4.0.pre.1'
5
5
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'json'
3
4
  require 'net/http/post/multipart'
4
5
  require 'openssl'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bits_service_client
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.3.0
4
+ version: 3.4.0.pre.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rizwan Reza
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2018-10-31 00:00:00.000000000 Z
14
+ date: 2018-12-07 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: activesupport
@@ -41,6 +41,20 @@ dependencies:
41
41
  - - ">="
42
42
  - !ruby/object:Gem::Version
43
43
  version: '0'
44
+ - !ruby/object:Gem::Dependency
45
+ name: statsd-ruby
46
+ requirement: !ruby/object:Gem::Requirement
47
+ requirements:
48
+ - - "~>"
49
+ - !ruby/object:Gem::Version
50
+ version: '1.4'
51
+ type: :runtime
52
+ prerelease: false
53
+ version_requirements: !ruby/object:Gem::Requirement
54
+ requirements:
55
+ - - "~>"
56
+ - !ruby/object:Gem::Version
57
+ version: '1.4'
44
58
  - !ruby/object:Gem::Dependency
45
59
  name: bundler
46
60
  requirement: !ruby/object:Gem::Requirement
@@ -153,6 +167,48 @@ dependencies:
153
167
  - - '='
154
168
  - !ruby/object:Gem::Version
155
169
  version: 2.3.1
170
+ - !ruby/object:Gem::Dependency
171
+ name: sinatra
172
+ requirement: !ruby/object:Gem::Requirement
173
+ requirements:
174
+ - - ">="
175
+ - !ruby/object:Gem::Version
176
+ version: '0'
177
+ type: :development
178
+ prerelease: false
179
+ version_requirements: !ruby/object:Gem::Requirement
180
+ requirements:
181
+ - - ">="
182
+ - !ruby/object:Gem::Version
183
+ version: '0'
184
+ - !ruby/object:Gem::Dependency
185
+ name: pry
186
+ requirement: !ruby/object:Gem::Requirement
187
+ requirements:
188
+ - - ">="
189
+ - !ruby/object:Gem::Version
190
+ version: '0'
191
+ type: :development
192
+ prerelease: false
193
+ version_requirements: !ruby/object:Gem::Requirement
194
+ requirements:
195
+ - - ">="
196
+ - !ruby/object:Gem::Version
197
+ version: '0'
198
+ - !ruby/object:Gem::Dependency
199
+ name: pry-nav
200
+ requirement: !ruby/object:Gem::Requirement
201
+ requirements:
202
+ - - ">="
203
+ - !ruby/object:Gem::Version
204
+ version: '0'
205
+ type: :development
206
+ prerelease: false
207
+ version_requirements: !ruby/object:Gem::Requirement
208
+ requirements:
209
+ - - ">="
210
+ - !ruby/object:Gem::Version
211
+ version: '0'
156
212
  description:
157
213
  email:
158
214
  - rizwanreza@gmail.com
@@ -195,12 +251,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
195
251
  version: '0'
196
252
  required_rubygems_version: !ruby/object:Gem::Requirement
197
253
  requirements:
198
- - - ">="
254
+ - - ">"
199
255
  - !ruby/object:Gem::Version
200
- version: '0'
256
+ version: 1.3.1
201
257
  requirements: []
202
258
  rubyforge_project:
203
- rubygems_version: 2.6.14.1
259
+ rubygems_version: 2.6.14.3
204
260
  signing_key:
205
261
  specification_version: 4
206
262
  summary: Bits Services client for Cloud Foundry