fog-google 1.5.0 → 1.6.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.
Files changed (38) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +4 -0
  3. data/CHANGELOG.md +53 -0
  4. data/CONTRIBUTING.md +9 -1
  5. data/MIGRATING.md +11 -0
  6. data/README.md +16 -2
  7. data/ci/pipeline.yml +31 -1
  8. data/examples/bootstrap.rb +18 -9
  9. data/lib/fog/compute/google/models/server.rb +9 -0
  10. data/lib/fog/compute/google/models/servers.rb +21 -12
  11. data/lib/fog/compute/google/models/ssl_certificate.rb +1 -1
  12. data/lib/fog/google/models/sql/instance.rb +19 -4
  13. data/lib/fog/google/models/sql/user.rb +9 -3
  14. data/lib/fog/google/requests/sql/insert_instance.rb +2 -2
  15. data/lib/fog/google/version.rb +1 -1
  16. data/lib/fog/storage/google_xml/utils.rb +1 -1
  17. data/tasks/lint.rake +6 -0
  18. data/tasks/test.rake +21 -8
  19. data/test/helpers/integration_test_helper.rb +1 -1
  20. data/test/integration/compute/test_disk_types.rb +6 -11
  21. data/test/integration/compute/test_servers.rb +35 -1
  22. data/test/integration/factories/sql_v1_certs_factory.rb +20 -0
  23. data/test/integration/factories/sql_v1_instances_factory.rb +19 -0
  24. data/test/integration/factories/sql_v1_users_factory.rb +20 -0
  25. data/test/integration/factories/sql_v2_instances_factory.rb +19 -0
  26. data/test/integration/monitoring/test_timeseries.rb +6 -8
  27. data/test/integration/sql/{test_flags.rb → test_common_flags.rb} +1 -1
  28. data/test/integration/sql/{test_tiers.rb → test_common_tiers.rb} +5 -13
  29. data/test/integration/sql/test_v1_certs.rb +50 -0
  30. data/test/integration/sql/test_v1_instances.rb +31 -0
  31. data/test/integration/sql/test_v1_users.rb +37 -0
  32. data/test/integration/sql/test_v2_instances.rb +81 -0
  33. data/test/unit/compute/test_server.rb +28 -0
  34. data/test/unit/storage/test_xml_requests.rb +24 -0
  35. metadata +27 -12
  36. data/test/integration/sql/sql_instances_shared.rb +0 -57
  37. data/test/integration/sql/test_instances.rb +0 -97
  38. data/test/integration/sql/test_instances_second_gen.rb +0 -88
@@ -1,5 +1,5 @@
1
1
  module Fog
2
2
  module Google
3
- VERSION = "1.5.0".freeze
3
+ VERSION = "1.6.0".freeze
4
4
  end
5
5
  end
@@ -30,7 +30,7 @@ module Fog
30
30
 
31
31
  def host_path_query(params, expires)
32
32
  params[:headers]["Date"] = expires.to_i
33
- params[:path] = CGI.escape(params[:path]).gsub("%2F", "/")
33
+ params[:path] = Fog::Google.escape(params[:path]).gsub("%2F", "/")
34
34
  query = [params[:query]].compact
35
35
  query << "GoogleAccessId=#{@google_storage_access_key_id}"
36
36
  query << "Signature=#{CGI.escape(signature(params))}"
data/tasks/lint.rake CHANGED
@@ -1,3 +1,9 @@
1
1
  require "rubocop/rake_task"
2
2
 
3
3
  RuboCop::RakeTask.new(:lint)
4
+
5
+ namespace :lint do
6
+ task :changed do
7
+ sh("git status --porcelain | cut -c4- | grep '.rb' | xargs rubocop")
8
+ end
9
+ end
data/tasks/test.rake CHANGED
@@ -17,7 +17,8 @@ namespace :test do
17
17
  multitask :parallel => ["test:compute",
18
18
  "test:monitoring",
19
19
  "test:pubsub",
20
- "test:sql",
20
+ "test:sqlv1",
21
+ "test:sqlv2",
21
22
  "test:storage"]
22
23
 
23
24
  Rake::TestTask.new do |t|
@@ -33,7 +34,7 @@ namespace :test do
33
34
  t.name = "compute"
34
35
  t.description = "Run Compute API tests"
35
36
  t.libs << "test"
36
- t.pattern = FileList['test/integration/compute/test_*.rb']
37
+ t.pattern = FileList["test/integration/compute/test_*.rb"]
37
38
  t.warning = false
38
39
  t.verbose = true
39
40
  end
@@ -42,7 +43,7 @@ namespace :test do
42
43
  t.name = "monitoring"
43
44
  t.description = "Run Monitoring API tests"
44
45
  t.libs << "test"
45
- t.pattern = FileList['test/integration/monitoring/test_*.rb']
46
+ t.pattern = FileList["test/integration/monitoring/test_*.rb"]
46
47
  t.warning = false
47
48
  t.verbose = true
48
49
  end
@@ -51,16 +52,28 @@ namespace :test do
51
52
  t.name = "pubsub"
52
53
  t.description = "Run PubSub API tests"
53
54
  t.libs << "test"
54
- t.pattern = FileList['test/integration/pubsub/test_*.rb']
55
+ t.pattern = FileList["test/integration/pubsub/test_*.rb"]
56
+ t.warning = false
57
+ t.verbose = true
58
+ end
59
+
60
+ desc "Run all SQL API tests"
61
+ task :sql => [:sqlv1, :sqlv2]
62
+
63
+ Rake::TestTask.new do |t|
64
+ t.name = "sqlv1"
65
+ t.description = "Run SQLv1 API tests"
66
+ t.libs << "test"
67
+ t.pattern = FileList["test/integration/sql/test_common*.rb", "test/integration/sql/test_v1*.rb"]
55
68
  t.warning = false
56
69
  t.verbose = true
57
70
  end
58
71
 
59
72
  Rake::TestTask.new do |t|
60
- t.name = "sql"
61
- t.description = "Run SQL API tests"
73
+ t.name = "sqlv2"
74
+ t.description = "Run SQLv2 API tests"
62
75
  t.libs << "test"
63
- t.pattern = FileList['test/integration/sql/test_*.rb']
76
+ t.pattern = FileList["test/integration/sql/test_v2*.rb"]
64
77
  t.warning = false
65
78
  t.verbose = true
66
79
  end
@@ -69,7 +82,7 @@ namespace :test do
69
82
  t.name = "storage"
70
83
  t.description = "Run Storage API tests"
71
84
  t.libs << "test"
72
- t.pattern = FileList['test/integration/storage/test_*.rb']
85
+ t.pattern = FileList["test/integration/storage/test_*.rb"]
73
86
  t.warning = false
74
87
  t.verbose = true
75
88
  end
@@ -18,7 +18,7 @@ TEST_RAW_DISK_SOURCE = "http://storage.googleapis.com/fog-test-bucket/fog-test-r
18
18
  TEST_SQL_TIER_FIRST = "D1".freeze
19
19
  TEST_SQL_REGION_FIRST = "us-central".freeze
20
20
 
21
- TEST_SQL_TIER_SECOND = "db-f1-micro".freeze
21
+ TEST_SQL_TIER_SECOND = "db-n1-standard-1".freeze
22
22
  TEST_SQL_REGION_SECOND = TEST_REGION
23
23
 
24
24
  class FogIntegrationTest < MiniTest::Test
@@ -2,23 +2,18 @@ require "helpers/integration_test_helper"
2
2
 
3
3
  class TestDiskTypes < FogIntegrationTest
4
4
  NAMES = %w(local-ssd pd-ssd pd-standard).freeze
5
- ZONES = %w(https://www.googleapis.com/compute/v1/projects/graphite-fog/zones/us-central1-a
6
- https://www.googleapis.com/compute/v1/projects/graphite-fog/zones/us-central1-b
7
- https://www.googleapis.com/compute/v1/projects/graphite-fog/zones/us-central1-c
8
- https://www.googleapis.com/compute/v1/projects/graphite-fog/zones/us-central1-f
9
- https://www.googleapis.com/compute/v1/projects/graphite-fog/zones/europe-west1-b
10
- https://www.googleapis.com/compute/v1/projects/graphite-fog/zones/europe-west1-c
11
- https://www.googleapis.com/compute/v1/projects/graphite-fog/zones/europe-west1-d
12
- https://www.googleapis.com/compute/v1/projects/graphite-fog/zones/asia-east1-a
13
- https://www.googleapis.com/compute/v1/projects/graphite-fog/zones/asia-east1-b
14
- https://www.googleapis.com/compute/v1/projects/graphite-fog/zones/asia-east1-c).freeze
5
+ # Testing in one random zone per region (region list as of May 2018)
6
+ ZONES = %w(asia-east1-a asia-northeast1-b asia-south1-c asia-southeast1-a australia-southeast1-b
7
+ europe-west1-c europe-west2-a europe-west3-b europe-west4-c northamerica-northeast1-a
8
+ southamerica-east1-b us-central1-c us-east1-b us-east4-a us-west1-c).freeze
15
9
 
16
10
  def setup
17
11
  @subject = Fog::Compute[:google].disk_types
18
12
  end
19
13
 
20
14
  def test_all
21
- assert_operator(@subject.all.size, :>=, 1, "expected multiple disk types")
15
+ assert_operator(@subject.all.size, :>=, NAMES.size * ZONES.size,
16
+ "Number of all disk type references should be greater or equal to test zones * disk types")
22
17
  end
23
18
 
24
19
  def test_get
@@ -15,6 +15,40 @@ class TestServers < FogIntegrationTest
15
15
  server.wait_for { ready? }
16
16
  server.set_metadata({ "foo" => "bar", "baz" => "foo" }, false)
17
17
  assert_equal [{ :key => "foo", :value => "bar" },
18
- { :key=>"baz", :value=>"foo" }], server.metadata[:items]
18
+ { :key => "baz", :value => "foo" }], server.metadata[:items]
19
+ end
20
+
21
+ def test_bootstrap
22
+ key = "ssh-rsa IAMNOTAREALSSHKEYAMA== user@host.subdomain.example.com"
23
+ user = "username"
24
+
25
+ File.stub :read, key do
26
+ # Name is set this way so it will be cleaned up by CollectionFactory
27
+ # Public_key_path is set to avoid stubbing out File.exist?
28
+ server = @subject.bootstrap(:name => "#{CollectionFactory::PREFIX}-#{Time.now.to_i}",
29
+ :username => user,
30
+ :public_key_path => "foo")
31
+ boot_disk = server.disks.detect { |disk| disk[:boot] }
32
+
33
+ assert_equal("RUNNING", server.status, "Bootstrapped server should be running")
34
+ assert_equal(key, server.public_key, "Bootstrapped server should have a public key set")
35
+ assert_equal(user, server.username, "Bootstrapped server should have user set to #{user}")
36
+ assert(boot_disk[:auto_delete], "Bootstrapped server should have disk set to autodelete")
37
+
38
+ network_adapter = server.network_interfaces.detect { |x| x.has_key?(:access_configs) }
39
+
40
+ refute_nil(network_adapter[:access_configs].detect { |x| x[:nat_ip] },
41
+ "Bootstrapped server should have an external ip by default")
42
+ end
43
+ end
44
+
45
+ def test_bootstrap_fail
46
+ # Pretend the ssh key does not exist
47
+ File.stub :exist?, nil do
48
+ assert_raises(Fog::Errors::Error) {
49
+ @subject.bootstrap(:name => "#{CollectionFactory::PREFIX}-#{Time.now.to_i}",
50
+ :public_key_path => nil)
51
+ }
52
+ end
19
53
  end
20
54
  end
@@ -0,0 +1,20 @@
1
+ require "integration/factories/collection_factory"
2
+ require "integration/factories/sql_v1_instances_factory"
3
+
4
+ class SqlV1CertsFactory < CollectionFactory
5
+ def initialize(example)
6
+ @instances = SqlV1InstancesFactory.new(example)
7
+ super(Fog::Google[:sql].ssl_certs, example)
8
+ end
9
+
10
+ def cleanup
11
+ # Certs will be cleaned up with the test instance.
12
+ @instances.cleanup
13
+ end
14
+
15
+ def params
16
+ # Certificate name should not be longer than 16 characters
17
+ { :common_name => resource_name,
18
+ :instance => @instances.create.name }
19
+ end
20
+ end
@@ -0,0 +1,19 @@
1
+ require "integration/factories/collection_factory"
2
+
3
+ class SqlV1InstancesFactory < CollectionFactory
4
+ def initialize(example)
5
+ super(Fog::Google[:sql].instances, example)
6
+ end
7
+
8
+ def cleanup
9
+ super
10
+ end
11
+
12
+ def params
13
+ # Name has a time suffix due to SQL resources API objects having
14
+ # a _very_ long life on the backend (n(days)) after deletion.
15
+ { :name => "#{resource_name}-#{Time.now.to_i}",
16
+ :region => TEST_SQL_REGION_FIRST,
17
+ :tier => TEST_SQL_TIER_FIRST }
18
+ end
19
+ end
@@ -0,0 +1,20 @@
1
+ require "integration/factories/collection_factory"
2
+ require "integration/factories/sql_v1_instances_factory"
3
+
4
+ class SqlV1UsersFactory < CollectionFactory
5
+ def initialize(example)
6
+ @instances = SqlV1InstancesFactory.new(example)
7
+ super(Fog::Google[:sql].users, example)
8
+ end
9
+
10
+ def cleanup
11
+ # Users will be cleaned up with the test instance.
12
+ @instances.cleanup
13
+ end
14
+
15
+ def params
16
+ # Username should not be longer than 16 characters
17
+ { :name => resource_name[0..15],
18
+ :instance => @instances.create.name }
19
+ end
20
+ end
@@ -0,0 +1,19 @@
1
+ require "integration/factories/collection_factory"
2
+
3
+ class SqlV2InstancesFactory < CollectionFactory
4
+ def initialize(example)
5
+ super(Fog::Google[:sql].instances, example)
6
+ end
7
+
8
+ def cleanup
9
+ super
10
+ end
11
+
12
+ def params
13
+ # Name has a time suffix due to SQL resources API objects having
14
+ # a _very_ long life on the backend (n(days)) after deletion.
15
+ { :name => "#{resource_name}-#{Time.now.to_i}",
16
+ :region => TEST_SQL_REGION_SECOND,
17
+ :tier => TEST_SQL_TIER_SECOND }
18
+ end
19
+ end
@@ -5,7 +5,6 @@ class TestMetricDescriptors < FogIntegrationTest
5
5
  # Retriable is used to wrap each request in this test due to Stackdriver API being slow with
6
6
  # metric propagation (sometimes 80+ seconds) and client returning
7
7
  # Google::Apis::ClientError: badRequest if the metric hasn't yet been created instead of a 404.
8
- NOT_READY_REGEX = /The provided filter doesn't refer to any known metric./
9
8
  RETRIABLE_TRIES = 3
10
9
  RETRIABLE_BASE_INTERVAL = 30
11
10
  TEST_METRIC_PREFIX = "custom.googleapis.com/fog-google-test/timeseries".freeze
@@ -52,7 +51,8 @@ class TestMetricDescriptors < FogIntegrationTest
52
51
  assert_empty(resp.to_h)
53
52
 
54
53
  # Wait for metric to be created
55
- Retriable.retriable(on: {Google::Apis::ClientError => NOT_READY_REGEX},
54
+ # TODO: Dedup retries into a helper method
55
+ Retriable.retriable(on: Google::Apis::ClientError,
56
56
  tries: RETRIABLE_TRIES,
57
57
  base_interval: RETRIABLE_BASE_INTERVAL) do
58
58
  @client.list_timeseries(
@@ -67,7 +67,7 @@ class TestMetricDescriptors < FogIntegrationTest
67
67
  ).time_series
68
68
  end
69
69
 
70
- series = Retriable.retriable(on: { Google::Apis::ClientError => NOT_READY_REGEX },
70
+ series = Retriable.retriable(on: Google::Apis::ClientError,
71
71
  tries: RETRIABLE_TRIES,
72
72
  base_interval: RETRIABLE_BASE_INTERVAL) do
73
73
  @client.timeseries_collection.all(
@@ -132,7 +132,7 @@ class TestMetricDescriptors < FogIntegrationTest
132
132
  # Wait for metric to be created
133
133
  # Retriable is used instead of wait_for due to API client returning Google::Apis::ClientError: badRequest if the
134
134
  # metric hasn't yet been created
135
- Retriable.retriable(on: { Google::Apis::ClientError => NOT_READY_REGEX },
135
+ Retriable.retriable(on: Google::Apis::ClientError,
136
136
  tries: RETRIABLE_TRIES,
137
137
  base_interval: RETRIABLE_BASE_INTERVAL) do
138
138
  @client.list_timeseries(
@@ -142,7 +142,7 @@ class TestMetricDescriptors < FogIntegrationTest
142
142
  end
143
143
 
144
144
  # Test page size
145
- resp = Retriable.retriable(on: { Google::Apis::ClientError => NOT_READY_REGEX },
145
+ resp = Retriable.retriable(on: Google::Apis::ClientError,
146
146
  tries: RETRIABLE_TRIES,
147
147
  base_interval: RETRIABLE_BASE_INTERVAL) do
148
148
  @client.list_timeseries(
@@ -168,7 +168,7 @@ class TestMetricDescriptors < FogIntegrationTest
168
168
  "expected different timeseries when using page_token")
169
169
 
170
170
  # Test filter
171
- series = Retriable.retriable(on: { Google::Apis::ClientError => NOT_READY_REGEX },
171
+ series = Retriable.retriable(on: Google::Apis::ClientError,
172
172
  tries: RETRIABLE_TRIES,
173
173
  base_interval: RETRIABLE_BASE_INTERVAL) do
174
174
  @client.timeseries_collection.all(
@@ -191,9 +191,7 @@ class TestMetricDescriptors < FogIntegrationTest
191
191
  filter: "metric.type = starts_with(\"#{TEST_METRIC_PREFIX}\")"
192
192
  )
193
193
  unless list_resp.metric_descriptors.nil?
194
- puts "Found #{list_resp.metric_descriptors.size} test metric descriptors."
195
194
  list_resp.metric_descriptors.each do |md|
196
- puts "deleting #{md.type}..."
197
195
  @client.monitoring.delete_project_metric_descriptor(md.name)
198
196
  end
199
197
  end
@@ -1,6 +1,6 @@
1
1
  require "helpers/integration_test_helper"
2
2
 
3
- class TestFlags < FogIntegrationTest
3
+ class TestCommonFlags < FogIntegrationTest
4
4
  def setup
5
5
  @client = Fog::Google::SQL.new
6
6
  end
@@ -1,24 +1,16 @@
1
1
  require "helpers/integration_test_helper"
2
2
 
3
- class TestTiers < FogIntegrationTest
3
+ class TestCommonTiers < FogIntegrationTest
4
4
  def setup
5
- @client = Fog::Google::SQL.new
6
- end
7
-
8
- def test_list
9
- resp = @client.list_tiers
10
-
11
- assert_operator(resp.items.size, :>, 0,
12
- "response tiers count should be positive")
13
- _sanity_check_tier(resp.items.first)
5
+ @subject = Fog::Google[:sql].tiers
14
6
  end
15
7
 
16
8
  def test_all
17
- resp = @client.tiers.all
9
+ tiers = @subject.all
18
10
 
19
- assert_operator(resp.size, :>, 0,
11
+ assert_operator(tiers.size, :>, 0,
20
12
  "tier count should be positive")
21
- _sanity_check_tier(resp.first)
13
+ _sanity_check_tier(tiers.first)
22
14
  end
23
15
 
24
16
  def _sanity_check_tier(tier)
@@ -0,0 +1,50 @@
1
+ require "helpers/integration_test_helper"
2
+ require "integration/factories/sql_v1_certs_factory"
3
+
4
+ class TestSQLV1Certs < FogIntegrationTest
5
+ # This test doesn't include TestCollection as certs are not an independent resource.
6
+
7
+ def setup
8
+ @subject = Fog::Google[:sql].ssl_certs
9
+ @factory = SqlV1CertsFactory.new(namespaced_name)
10
+ @client = Fog::Google::SQL.new
11
+ end
12
+
13
+ def teardown
14
+ @factory.cleanup
15
+ end
16
+
17
+ def test_ssl_certs
18
+ # Create an instance and an SSL cert
19
+ ssl_cert = @factory.create
20
+ instance_name = ssl_cert.instance
21
+
22
+ # Create a second cert and attach to the same instance
23
+ ssl_cert2 = @subject.new(:common_name => "#{ssl_cert.common_name}-2",
24
+ :instance => instance_name)
25
+ ssl_cert2.save
26
+
27
+ # Verify it can be retrieved
28
+ @subject.get(instance_name, ssl_cert2.sha1_fingerprint).tap do |result|
29
+ assert_equal(ssl_cert2.common_name, result.common_name)
30
+ assert_equal("sql#sslCert", result.kind)
31
+ end
32
+
33
+ # Verify instance returns 2 certs
34
+ list_result = @subject.all(instance_name)
35
+ assert_equal(2, list_result.size,
36
+ "expected 2 SSL certs")
37
+
38
+ # Delete one cert
39
+ ssl_cert2.destroy(:async => false)
40
+ list_result = @subject.all(instance_name)
41
+ assert_equal(1, list_result.size,
42
+ "expected one less SSL cert after deletion")
43
+
44
+ # Test if SSL config is reset correctly
45
+ instance = @client.instances.get(instance_name)
46
+ instance.reset_ssl_config(:async => false)
47
+ assert_equal(0, @subject.all(instance_name).size,
48
+ "expected no SSL certs after reset")
49
+ end
50
+ end
@@ -0,0 +1,31 @@
1
+ require "helpers/integration_test_helper"
2
+ require "integration/factories/sql_v1_instances_factory"
3
+
4
+ class TestSQLV1Instances < FogIntegrationTest
5
+ include TestCollection
6
+
7
+ def setup
8
+ @subject = Fog::Google[:sql].instances
9
+ @factory = SqlV1InstancesFactory.new(namespaced_name)
10
+ end
11
+
12
+ def test_update
13
+ instance = @factory.create
14
+
15
+ settings_version = instance.settings_version
16
+ labels = {
17
+ :foo => "bar"
18
+ }
19
+ instance.settings[:user_labels] = labels
20
+ instance.save
21
+
22
+ updated = @subject.get(instance.name)
23
+ assert_equal(labels, updated.settings[:user_labels])
24
+ assert_operator(updated.settings_version, :>, settings_version)
25
+ end
26
+
27
+ def test_default_settings
28
+ instance = @factory.create
29
+ assert_equal([], instance.ssl_certs, "new instance should have 0 initial ssl certs")
30
+ end
31
+ end