bits_service_client 3.3.0 → 3.4.0.pre.1

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
  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