fog-google 1.5.0 → 1.6.0

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