fog-google 1.10.0 → 1.11.0

This diff has not been reviewed by any users.
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: 3563c5d9fb6cd9c28bd38b0b6c1ae1d619c33c81
4
- data.tar.gz: 41ecb920dbcb66a2f6aa13f6557ef2a044d26d80
3
+ metadata.gz: e41bc807cc19b9984780ffcc9c253bac3ec3d13d
4
+ data.tar.gz: 69df7076d8eda3dfb5e22b1afcdb2ef97ee16e43
5
5
  SHA512:
6
- metadata.gz: f4a9c9650d0824ad4dcd5389e63eb5c7e583d256c6c469481709cee80bd53f5fe168556e9e563a704878721ea733282c0af87fd24680c59513a6203d5026743c
7
- data.tar.gz: 2cc78e1c0731a87179ffb6179698e5fa5bd90635d141aec05d9c5faa1e7b18fe8e1123c5ded5f925f7065f5b3ae4893f8876f72c23b164ad1172953f5b74f829
6
+ metadata.gz: af8cff6ac06cab566a31db97eb6b2065c53a74be8a77e133b4816f132a9b8079d7ff01e0031a393120bc3c98e8d680371ebfb07c72c5ddabded8f96d6f4d8b54
7
+ data.tar.gz: f81555df397158c969d85dd2b3215842e46f2e2217371e54fae1125fef349b76ea8d02c8218ebe3dc9ba04c6965e9c93ba96db2f501d070dfaf060a772badc07
@@ -1,5 +1,5 @@
1
1
  # Fog custom enforced styles
2
- Metrics/LineLength:
2
+ Layout/LineLength:
3
3
  Enabled: false
4
4
 
5
5
  Style/ConditionalAssignment:
@@ -94,7 +94,7 @@ Naming/PredicateName:
94
94
  - is_
95
95
  - has_
96
96
  - have_
97
- NamePrefixBlacklist:
97
+ ForbiddenPrefixes:
98
98
  - is_
99
99
  Exclude:
100
100
  - spec/**/*
@@ -246,7 +246,7 @@ Style/WhenThen:
246
246
  Lint/EachWithObjectArgument:
247
247
  Description: Check for immutable argument given to each_with_object.
248
248
  Enabled: true
249
- Lint/HandleExceptions:
249
+ Lint/SuppressedException:
250
250
  Description: Don't suppress exception.
251
251
  StyleGuide: https://github.com/bbatsov/ruby-style-guide#dont-hide-exceptions
252
252
  Enabled: false
@@ -6,6 +6,26 @@ This project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html
6
6
 
7
7
  ## Next
8
8
 
9
+ ## 1.11.0
10
+
11
+ ### User-facing
12
+
13
+ #### Added
14
+
15
+ - \#503 - Add fallback URL signing mechanism via IAM SignBlob API [temikus]
16
+
17
+ #### Fixed
18
+
19
+ - \#498 Add `:idempotent` flag to Fog::Storage::GoogleXML::Real#head_object, fixing
20
+ `Excon::Error::Socket: end of file reached (EOFError)` in certain scenarios, see \#416 [temikus]
21
+ - \#500 Set default options automatically if missing in `Pubsub#pull_subscription`
22
+
23
+ ### Development changes
24
+
25
+ #### Fixed
26
+
27
+ - \#501 DRY'ed up the retry methods in monitoring tests [temikus]
28
+ - \#500 Cleanup unneeded constants in Server model, fix flaky PubSub tests [temikus]
9
29
 
10
30
  ## 1.10.0
11
31
 
data/README.md CHANGED
@@ -108,6 +108,43 @@ defined:
108
108
  => [ <Fog::Compute::Google::Server ... ]
109
109
  ```
110
110
 
111
+ #### CarrierWave integration
112
+
113
+ It is common to integrate Fog with Carrierwave. Here's a minimal config that's commonly put in `config/initializers/carrierwave.rb`:
114
+
115
+ ```
116
+ CarrierWave.configure do |config|
117
+ config.fog_provider = 'fog/google'
118
+ config.fog_credentials = {
119
+ provider: 'Google',
120
+ google_project: Rails.application.secrets.google_cloud_storage_project_name,
121
+ google_json_key_string: Rails.application.secrets.google_cloud_storage_credential_content
122
+ # can optionally use google_json_key_location if using an actual file;
123
+ }
124
+ config.fog_directory = Rails.application.secrets.google_cloud_storage_bucket_name
125
+ end
126
+ ```
127
+
128
+ This needs a corresponding secret in `config/secrets.yml`, e.g.:
129
+
130
+ ```
131
+ development:
132
+ google_cloud_storage_project_name: your-project-name
133
+ google_cloud_storage_credential_content: '{
134
+ "type": "service_account",
135
+ "project_id": "your-project-name",
136
+ "private_key_id": "REDACTED",
137
+ "private_key": "-----BEGIN PRIVATE KEY-----REDACTED-----END PRIVATE KEY-----\n",
138
+ "client_email": "REDACTED@your-project-name.iam.gserviceaccount.com",
139
+ "client_id": "REDACTED",
140
+ "auth_uri": "https://accounts.google.com/o/oauth2/auth",
141
+ "token_uri": "https://accounts.google.com/o/oauth2/token",
142
+ "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
143
+ "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/REDACTED%40your-project-name.iam.gserviceaccount.com"
144
+ }'
145
+ google_cloud_storage_bucket_name: your-bucket-name
146
+ ```
147
+
111
148
  #### SSH-ing into instances
112
149
 
113
150
  If you want to be able to bootstrap SSH-able instances, (using `servers.bootstrap`,) be sure you have a key in `~/.ssh/id_rsa` and `~/.ssh/id_rsa.pub`
@@ -25,9 +25,9 @@ Gem::Specification.new do |spec|
25
25
  spec.add_dependency "fog-json", "~> 1.2"
26
26
  spec.add_dependency "fog-xml", "~> 0.1.0"
27
27
 
28
- # Hard Requirement as of 1.0
29
28
  spec.add_dependency "google-api-client", ">= 0.32", "< 0.34"
30
-
29
+ spec.add_dependency "google-cloud-env", "~> 1.2"
30
+
31
31
  # Debugger
32
32
  spec.add_development_dependency "pry"
33
33
 
@@ -27,10 +27,6 @@ module Fog
27
27
  https://www.googleapis.com/auth/ndev.cloudman
28
28
  https://www.googleapis.com/auth/cloud-platform).freeze
29
29
  GOOGLE_COMPUTE_DEFAULT_NETWORK = "default".freeze
30
- # TODO: Do we need those constants?
31
- RUNNING = "RUNNING".freeze
32
- PROVISIONING = "PROVISIONING".freeze
33
- STAGING = "STAGING".freeze
34
30
 
35
31
  request_path "fog/compute/google/requests"
36
32
  request :add_backend_service_backends
@@ -447,7 +447,7 @@ module Fog
447
447
  #
448
448
  # @return [TrueClass or FalseClass]
449
449
  def provisioning?
450
- status == PROVISIONING
450
+ status == "PROVISIONING"
451
451
  end
452
452
 
453
453
  # Check if instance is staging. On staging vs. provisioning difference:
@@ -455,7 +455,7 @@ module Fog
455
455
  #
456
456
  # @return [TrueClass or FalseClass]
457
457
  def staging?
458
- status == STAGING
458
+ status == "STAGING"
459
459
  end
460
460
 
461
461
  # Check if instance is stopped.
@@ -469,7 +469,7 @@ module Fog
469
469
  #
470
470
  # @return [TrueClass or FalseClass]
471
471
  def ready?
472
- status == RUNNING
472
+ status == "RUNNING"
473
473
  end
474
474
 
475
475
  def zone_name
@@ -21,7 +21,7 @@ module Fog
21
21
  # fingerprint = instance.metadata['fingerprint']
22
22
  # @param [Hash] metadata A new metadata object
23
23
  # Should have the following structure:
24
- # {:items=>[{:key=>"foo", :value=>"bar"}, {:key=>"baz", :value=>"foo"}]}
24
+ # {'foo' => 'bar', 'baz'=>'foo'}
25
25
  #
26
26
  # @returns [::Google::Apis::ComputeV1::Operation] set operation
27
27
  def set_server_metadata(instance, zone, fingerprint, metadata_items = [])
@@ -16,7 +16,11 @@ module Fog
16
16
  # @option options [Number] :max_messages maximum number of messages to
17
17
  # retrieve (defaults to 10)
18
18
  # @see https://cloud.google.com/pubsub/reference/rest/v1/projects.subscriptions/pull
19
- def pull_subscription(subscription, options = { :return_immediately => true, :max_messages => 10 })
19
+ def pull_subscription(subscription, options = {})
20
+ defaults = { :return_immediately => true,
21
+ :max_messages => 10 }
22
+ options = defaults.merge(options)
23
+
20
24
  pull_request = ::Google::Apis::PubsubV1::PullRequest.new(
21
25
  :return_immediately => options[:return_immediately],
22
26
  :max_messages => options[:max_messages]
@@ -1,3 +1,5 @@
1
+ require "google-cloud-env"
2
+
1
3
  module Fog
2
4
  module Google
3
5
  module Shared
@@ -14,6 +16,9 @@ module Fog
14
16
  @project = project
15
17
  @api_version = api_version
16
18
  @api_url = base_url + api_version + "/projects/"
19
+ # google-cloud-env allows us to figure out which GCP runtime we're running in and query metadata
20
+ # e.g. whether we're running in GCE/GKE/AppEngine or what region the instance is running in
21
+ @google_cloud_env = ::Google::Cloud::Env.get
17
22
  end
18
23
 
19
24
  ##
@@ -33,14 +38,14 @@ module Fog
33
38
  def initialize_google_client(options)
34
39
  # NOTE: loaded here to avoid requiring this as a core Fog dependency
35
40
  begin
36
- # Because of how Google API gem was rewritten, we get to do all sorts
37
- # of funky things, like this nonsense.
41
+ # TODO: google-api-client is in gemspec now, re-assess if this initialization logic is still needed
38
42
  require "google/apis/monitoring_#{Fog::Google::Monitoring::GOOGLE_MONITORING_API_VERSION}"
39
43
  require "google/apis/compute_#{Fog::Compute::Google::GOOGLE_COMPUTE_API_VERSION}"
40
44
  require "google/apis/dns_#{Fog::DNS::Google::GOOGLE_DNS_API_VERSION}"
41
45
  require "google/apis/pubsub_#{Fog::Google::Pubsub::GOOGLE_PUBSUB_API_VERSION}"
42
46
  require "google/apis/sqladmin_#{Fog::Google::SQL::GOOGLE_SQL_API_VERSION}"
43
47
  require "google/apis/storage_#{Fog::Storage::GoogleJSON::GOOGLE_STORAGE_JSON_API_VERSION}"
48
+ require "google/apis/iamcredentials_#{Fog::Storage::GoogleJSON::GOOGLE_STORAGE_JSON_IAM_API_VERSION}"
44
49
  require "googleauth"
45
50
  rescue LoadError => error
46
51
  Fog::Errors::Error.new("Please install the google-api-client (>= 0.9) gem before using this provider")
@@ -1,5 +1,5 @@
1
1
  module Fog
2
2
  module Google
3
- VERSION = "1.10.0".freeze
3
+ VERSION = "1.11.0".freeze
4
4
  end
5
5
  end
@@ -27,6 +27,10 @@ module Fog
27
27
  GOOGLE_STORAGE_JSON_BASE_URL = "https://www.googleapis.com/storage/".freeze
28
28
  GOOGLE_STORAGE_BUCKET_BASE_URL = "https://storage.googleapis.com/".freeze
29
29
 
30
+ # Version of IAM API used for blob signing, see Fog::Storage::GoogleJSON::Real#iam_signer
31
+ GOOGLE_STORAGE_JSON_IAM_API_VERSION = "v1".freeze
32
+ GOOGLE_STORAGE_JSON_IAM_API_SCOPE_URLS = %w(https://www.googleapis.com/auth/devstorage.full_control).freeze
33
+
30
34
  # TODO: Come up with a way to only request a subset of permissions.
31
35
  # https://cloud.google.com/storage/docs/json_api/v1/how-tos/authorizing
32
36
  GOOGLE_STORAGE_JSON_API_SCOPE_URLS = %w(https://www.googleapis.com/auth/devstorage.full_control).freeze
@@ -10,11 +10,17 @@ module Fog
10
10
  def initialize(options = {})
11
11
  shared_initialize(options[:google_project], GOOGLE_STORAGE_JSON_API_VERSION, GOOGLE_STORAGE_JSON_BASE_URL)
12
12
  @client = MockClient.new('test')
13
+ @storage_json = MockClient.new('test')
14
+ @iam_service = MockClient.new('test')
13
15
  end
14
16
 
15
17
  def signature(_params)
16
18
  "foo"
17
19
  end
20
+
21
+ def google_access_id
22
+ "my-account@project.iam.gserviceaccount"
23
+ end
18
24
  end
19
25
  end
20
26
  end
@@ -13,7 +13,14 @@ module Fog
13
13
  options[:google_api_scope_url] = GOOGLE_STORAGE_JSON_API_SCOPE_URLS.join(" ")
14
14
  @host = options[:host] || "storage.googleapis.com"
15
15
 
16
+ # TODO(temikus): Do we even need this client?
16
17
  @client = initialize_google_client(options)
18
+ # IAM client used for SignBlob API
19
+ @iam_service = ::Google::Apis::IamcredentialsV1::IAMCredentialsService.new
20
+ apply_client_options(@iam_service, {
21
+ google_api_scope_url: GOOGLE_STORAGE_JSON_IAM_API_SCOPE_URLS.join(" ")
22
+ })
23
+
17
24
  @storage_json = ::Google::Apis::StorageV1::StorageService.new
18
25
  apply_client_options(@storage_json, options)
19
26
 
@@ -56,12 +63,108 @@ DATA
56
63
  canonical_resource.chop!
57
64
  string_to_sign << canonical_resource.to_s
58
65
 
59
- key = OpenSSL::PKey::RSA.new(@client.signing_key)
60
- digest = OpenSSL::Digest::SHA256.new
61
- signed_string = key.sign(digest, string_to_sign)
66
+ # TODO(temikus): make signer configurable or add ability to supply your own via lambda
67
+ if !@storage_json.authorization.signing_key.nil?
68
+ signed_string = default_signer(string_to_sign)
69
+ else
70
+ # If client doesn't contain signing key attempt to auth via IAM SignBlob API
71
+ signed_string = iam_signer(string_to_sign)
72
+ end
62
73
 
63
74
  Base64.encode64(signed_string).chomp!
64
75
  end
76
+
77
+ private
78
+
79
+ def google_access_id
80
+ @google_access_id ||= get_google_access_id
81
+ end
82
+
83
+ ##
84
+ # Fetches the google service account name
85
+ #
86
+ # @return [String] Service account name, typically needed for GoogleAccessId, e.g.
87
+ # my-account@project.iam.gserviceaccount
88
+ # @raises [Fog::Errors::Error] If authorisation is incorrect or inapplicable for current action
89
+ def get_google_access_id
90
+ if @storage_json.authorization.is_a?(::Google::Auth::UserRefreshCredentials)
91
+ raise Fog::Errors::Error.new("User / Application Default Credentials are not supported for storage"\
92
+ "url signing, please use a service account or metadata authentication.")
93
+ end
94
+
95
+ if !@storage_json.authorization.issuer.nil?
96
+ return @storage_json.authorization.issuer
97
+ else
98
+ get_access_id_from_metadata
99
+ end
100
+ end
101
+
102
+ ##
103
+ # Attempts to fetch the google service account name from metadata using Google::Cloud::Env
104
+ #
105
+ # @return [String] Service account name, typically needed for GoogleAccessId, e.g.
106
+ # my-account@project.iam.gserviceaccount
107
+ # @raises [Fog::Errors::Error] If Metadata service is not available or returns an invalid response
108
+ def get_access_id_from_metadata
109
+ if @google_cloud_env.metadata?
110
+ access_id = @google_cloud_env.lookup_metadata("instance", "service-accounts/default/email")
111
+ else
112
+ raise Fog::Errors::Error.new("Metadata service not available, unable to retrieve service account info.")
113
+ end
114
+
115
+ if access_id.nil?
116
+ raise Fog::Errors::Error.new("Metadata service found but didn't return data." \
117
+ "Please file a bug: https://github.com/fog/fog-google")
118
+ end
119
+
120
+ return access_id
121
+ end
122
+
123
+ ##
124
+ # Default url signer using service account keys
125
+ #
126
+ # @param [String] string_to_sign Special collection of headers and options for V2 storage signing, e.g.:
127
+ #
128
+ # StringToSign = HTTP_Verb + "\n" +
129
+ # Content_MD5 + "\n" +
130
+ # Content_Type + "\n" +
131
+ # Expires + "\n" +
132
+ # Canonicalized_Extension_Headers +
133
+ # Canonicalized_Resource
134
+ #
135
+ # See https://cloud.google.com/storage/docs/access-control/signed-urls-v2
136
+ # @return [String] Signature binary blob
137
+ def default_signer(string_to_sign)
138
+ key = OpenSSL::PKey::RSA.new(@storage_json.authorization.signing_key)
139
+ digest = OpenSSL::Digest::SHA256.new
140
+ return key.sign(digest, string_to_sign)
141
+ end
142
+
143
+ ##
144
+ # Fallback URL signer using the IAM SignServiceAccountBlob API, see
145
+ # Google::Apis::IamcredentialsV1::IAMCredentialsService#sign_service_account_blob
146
+ #
147
+ # @param [String] string_to_sign Special collection of headers and options for V2 storage signing, e.g.:
148
+ #
149
+ # StringToSign = HTTP_Verb + "\n" +
150
+ # Content_MD5 + "\n" +
151
+ # Content_Type + "\n" +
152
+ # Expires + "\n" +
153
+ # Canonicalized_Extension_Headers +
154
+ # Canonicalized_Resource
155
+ #
156
+ # See https://cloud.google.com/storage/docs/access-control/signed-urls-v2
157
+ # @return [String] Signature binary blob
158
+ def iam_signer(string_to_sign)
159
+ request = {
160
+ "payload": string_to_sign
161
+ }
162
+
163
+ resource = "projects/-/serviceAccounts/#{google_access_id}"
164
+ response = @iam_service.sign_service_account_blob resource, request, {}
165
+
166
+ return response.signed_blob
167
+ end
65
168
  end
66
169
  end
67
170
  end
@@ -27,7 +27,7 @@ module Fog
27
27
  query = filtered.map { |k, v| [k.to_s, Fog::Google.escape(v)].join("=") }
28
28
  end
29
29
 
30
- query << "GoogleAccessId=#{@client.issuer}"
30
+ query << "GoogleAccessId=#{google_access_id}"
31
31
  query << "Signature=#{CGI.escape(signature(params))}"
32
32
  query << "Expires=#{params[:headers]['Date']}"
33
33
  "#{params[:host]}/#{params[:path]}?#{query.join('&')}"
@@ -1,4 +1,3 @@
1
- require "pp"
2
1
  module Fog
3
2
  module Storage
4
3
  class GoogleXML
@@ -33,12 +33,13 @@ module Fog
33
33
  headers["If-Modified-Since"] = Fog::Time.at(options["If-Modified-Since"].to_i).to_date_header if options["If-Modified-Since"]
34
34
  headers["If-Unmodified-Since"] = Fog::Time.at(options["If-Unmodified-Since"].to_i).to_date_header if options["If-Modified-Since"]
35
35
  headers.merge!(options)
36
- request(:expects => [200, 206],
37
- :headers => headers,
38
- :host => "#{bucket_name}.#{@host}",
39
- :method => "HEAD",
40
- :path => Fog::Google.escape(object_name),
41
- :query => query)
36
+ request(:expects => [200, 206],
37
+ :headers => headers,
38
+ :host => "#{bucket_name}.#{@host}",
39
+ :idempotent => true,
40
+ :method => "HEAD",
41
+ :path => Fog::Google.escape(object_name),
42
+ :query => query)
42
43
  end
43
44
  end
44
45
 
@@ -20,11 +20,18 @@ end
20
20
 
21
21
  # Extracts all changes that have been made after the latest pushed tag
22
22
  def changes_since_last_tag
23
- `git --no-pager log $(git describe --tags --abbrev=0)..HEAD --oneline`
23
+ `git --no-pager log $(git describe --tags --abbrev=0)..HEAD --grep="Merge" --pretty=format:"%t - %s%n%b%n"`
24
+ end
25
+
26
+ # Extracts all github users contributed since last tag
27
+ def users_since_last_tag
28
+ `git --no-pager log $(git describe --tags --abbrev=0)..HEAD --grep="Merge" --pretty=format:"%s" | cut -d' ' -f 6 | cut -d/ -f1 | uniq`
24
29
  end
25
30
 
26
31
  namespace :changelog do
27
32
  task :generate do
28
33
  insert_after_line("CHANGELOG.md", changes_since_last_tag, /^## Next/)
34
+ printf("Users contributed since last release:\n")
35
+ printf(users_since_last_tag)
29
36
  end
30
37
  end
@@ -1,5 +1,6 @@
1
1
  require "helpers/test_helper"
2
2
  require "helpers/test_collection"
3
+ require "retriable"
3
4
 
4
5
  # Use :test credentials in ~/.fog for live integration testing
5
6
  # XXX not sure if this will work on Travis CI or not
@@ -22,7 +23,7 @@ TEST_IMAGE_FAMILY = "debian-9".freeze
22
23
 
23
24
  # XXX This depends on a public image in gs://fog-test-bucket; there may be a better way to do this
24
25
  # The image was created like so: https://cloud.google.com/compute/docs/images#export_an_image_to_google_cloud_storage
25
- TEST_RAW_DISK_SOURCE = "http://storage.googleapis.com/fog-test-bucket/fog-test-raw-disk-source.image.tar.gz".freeze
26
+ TEST_RAW_DISK_SOURCE = "https://storage.googleapis.com/fog-testing-bucket/fog-test-raw-disk-source.image.tar.gz".freeze
26
27
 
27
28
  TEST_SQL_TIER = "db-n1-standard-1".freeze
28
29
  TEST_SQL_REGION = TEST_REGION
@@ -87,8 +88,21 @@ wLjafhPTSAIS0jijglJ7uzaSbFUW11fw1/EIqIFNe0R0Xf9lsyPxFA==
87
88
  -----END RSA PRIVATE KEY-----
88
89
  KEY
89
90
 
91
+ # Retry module config - standard retriable gem settings
92
+ # see: https://github.com/kamui/retriable
93
+ RETRIABLE_TRIES = 3
94
+ RETRIABLE_BASE_INTERVAL = 50
95
+
90
96
  class FogIntegrationTest < MiniTest::Test
91
97
  def namespaced_name
92
98
  "#{self.class}_#{name}"
93
99
  end
100
+
101
+ def retry_on(klass)
102
+ Retriable.retriable(on: klass,
103
+ tries: RETRIABLE_TRIES,
104
+ base_interval: RETRIABLE_BASE_INTERVAL) do
105
+ yield
106
+ end
107
+ end
94
108
  end
@@ -1,12 +1,11 @@
1
1
  require "helpers/integration_test_helper"
2
- require "retriable"
3
2
 
4
3
  class TestMetricDescriptors < FogIntegrationTest
5
- # Retriable is used to wrap each request in this test due to Stackdriver API being slow with
6
- # metric propagation (sometimes 80+ seconds) and client returning
7
- # Google::Apis::ClientError: badRequest if the metric hasn't yet been created instead of a 404.
8
- RETRIABLE_TRIES = 3
9
- RETRIABLE_BASE_INTERVAL = 50
4
+ # This module has a decent amount of retry wrappers as the Stackdriver API
5
+ # can be quite slow with metric propagation (sometimes 80+ seconds) and client
6
+ # returning errors, e.g. Google::Apis::ClientError: badRequest if the metric
7
+ # hasn't yet been created instead of a 404.
8
+
10
9
  TEST_METRIC_PREFIX = "custom.googleapis.com/fog-google-test/timeseries".freeze
11
10
  LABEL_DESCRIPTORS = [
12
11
  {
@@ -51,10 +50,7 @@ class TestMetricDescriptors < FogIntegrationTest
51
50
  assert_empty(resp.to_h)
52
51
 
53
52
  # Wait for metric to be created
54
- # TODO: Dedup retries into a helper method
55
- Retriable.retriable(on: Google::Apis::ClientError,
56
- tries: RETRIABLE_TRIES,
57
- base_interval: RETRIABLE_BASE_INTERVAL) do
53
+ retry_on(Google::Apis::ClientError) do
58
54
  @client.list_timeseries(
59
55
  :filter => "metric.type = \"#{metric_type}\"",
60
56
  :interval => {
@@ -67,9 +63,7 @@ class TestMetricDescriptors < FogIntegrationTest
67
63
  ).time_series
68
64
  end
69
65
 
70
- series = Retriable.retriable(on: Google::Apis::ClientError,
71
- tries: RETRIABLE_TRIES,
72
- base_interval: RETRIABLE_BASE_INTERVAL) do
66
+ series = retry_on(Google::Apis::ClientError) do
73
67
  @client.timeseries_collection.all(
74
68
  :filter => "metric.type = \"#{metric_type}\"",
75
69
  :interval => {
@@ -115,9 +109,7 @@ class TestMetricDescriptors < FogIntegrationTest
115
109
  _some_timeseries(start_time, metric_type, labels)
116
110
  end
117
111
 
118
- Retriable.retriable(on: Google::Apis::ServerError,
119
- tries: RETRIABLE_TRIES,
120
- base_interval: RETRIABLE_BASE_INTERVAL) do
112
+ retry_on(Google::Apis::ServerError) do
121
113
  @client.create_timeseries(:timeseries => timeseries)
122
114
  end
123
115
  interval = {
@@ -132,9 +124,7 @@ class TestMetricDescriptors < FogIntegrationTest
132
124
  # Wait for metric to be created
133
125
  # Retriable is used instead of wait_for due to API client returning Google::Apis::ClientError: badRequest if the
134
126
  # metric hasn't yet been created
135
- Retriable.retriable(on: Google::Apis::ClientError,
136
- tries: RETRIABLE_TRIES,
137
- base_interval: RETRIABLE_BASE_INTERVAL) do
127
+ retry_on(Google::Apis::ClientError) do
138
128
  @client.list_timeseries(
139
129
  :filter => "metric.type = \"#{metric_type}\"",
140
130
  :interval => interval
@@ -142,9 +132,7 @@ class TestMetricDescriptors < FogIntegrationTest
142
132
  end
143
133
 
144
134
  # Test page size
145
- resp = Retriable.retriable(on: Google::Apis::ClientError,
146
- tries: RETRIABLE_TRIES,
147
- base_interval: RETRIABLE_BASE_INTERVAL) do
135
+ resp = retry_on(Google::Apis::ClientError) do
148
136
  @client.list_timeseries(
149
137
  :filter => "metric.type = \"#{metric_type}\"",
150
138
  :interval => interval,
@@ -170,9 +158,7 @@ class TestMetricDescriptors < FogIntegrationTest
170
158
  "expected different timeseries when using page_token")
171
159
 
172
160
  # Test filter
173
- series = Retriable.retriable(on: Google::Apis::ClientError,
174
- tries: RETRIABLE_TRIES,
175
- base_interval: RETRIABLE_BASE_INTERVAL) do
161
+ series = retry_on(Google::Apis::ClientError) do
176
162
  @client.timeseries_collection.all(
177
163
  :filter => %[
178
164
  metric.type = "#{metric_type}" AND
@@ -102,7 +102,7 @@ class TestPubsubModels < PubSubShared
102
102
  :topic => some_topic_name)
103
103
  @client.topics.get(some_topic_name).publish(["data" => message_bytes])
104
104
 
105
- result = subscription.pull
105
+ result = subscription.pull(:return_immediately => false)
106
106
  assert_operator(result.length, :>, 0)
107
107
 
108
108
  contained = result.any? { |received| received.message[:data] == message_bytes }
@@ -115,7 +115,7 @@ class TestPubsubModels < PubSubShared
115
115
  :topic => some_topic_name)
116
116
  @client.topics.get(some_topic_name).publish(["data" => Base64.strict_encode64("some message")])
117
117
 
118
- result = subscription.pull
118
+ result = subscription.pull(:return_immediately => false)
119
119
  assert_operator(result.length, :>, 0)
120
120
 
121
121
  subscription.acknowledge([result[0].ack_id])
@@ -127,7 +127,7 @@ class TestPubsubModels < PubSubShared
127
127
  :topic => some_topic_name)
128
128
  @client.topics.get(some_topic_name).publish(["data" => Base64.strict_encode64("some message")])
129
129
 
130
- result = subscription.pull
130
+ result = subscription.pull(:return_immediately => false)
131
131
  assert_operator(result.length, :>, 0)
132
132
 
133
133
  result[0].acknowledge
@@ -86,7 +86,7 @@ class TestPubsubRequests < PubSubShared
86
86
  @client.create_subscription(subscription_name, some_topic_name)
87
87
  @client.publish_topic(some_topic_name, [:data => message_bytes])
88
88
 
89
- result = @client.pull_subscription(subscription_name)
89
+ result = @client.pull_subscription(subscription_name, {:return_immediately => false})
90
90
 
91
91
  contained = result.received_messages.any? { |received| received.message.data == message_bytes }
92
92
  assert_equal(true, contained, "sent messsage not contained within pulled responses")
@@ -96,7 +96,7 @@ class TestPubsubRequests < PubSubShared
96
96
  subscription_name = new_subscription_name
97
97
  @client.create_subscription(subscription_name, some_topic_name)
98
98
  @client.publish_topic(some_topic_name, [:data => Base64.strict_encode64("some message")])
99
- pull_result = @client.pull_subscription(subscription_name)
99
+ pull_result = @client.pull_subscription(subscription_name, {:return_immediately => false})
100
100
  assert_operator(pull_result.received_messages.length, :>, 0)
101
101
 
102
102
  @client.acknowledge_subscription(subscription_name,
@@ -1,6 +1,5 @@
1
1
  require "helpers/integration_test_helper"
2
2
  require "integration/factories/sql_certs_factory"
3
- require "pry"
4
3
 
5
4
  class TestSQLCerts < FogIntegrationTest
6
5
  # This test doesn't include TestCollection as certs are not an independent resource.
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fog-google
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.10.0
4
+ version: 1.11.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nat Welch
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2020-04-21 00:00:00.000000000 Z
12
+ date: 2020-08-13 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: fog-core
@@ -73,6 +73,20 @@ dependencies:
73
73
  - - "<"
74
74
  - !ruby/object:Gem::Version
75
75
  version: '0.34'
76
+ - !ruby/object:Gem::Dependency
77
+ name: google-cloud-env
78
+ requirement: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '1.2'
83
+ type: :runtime
84
+ prerelease: false
85
+ version_requirements: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '1.2'
76
90
  - !ruby/object:Gem::Dependency
77
91
  name: pry
78
92
  requirement: !ruby/object:Gem::Requirement