fog-google 0.3.2 → 0.4.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 (47) hide show
  1. checksums.yaml +4 -4
  2. data/examples/get_list_snapshots.rb +1 -1
  3. data/examples/load-balance.rb +23 -4
  4. data/fog-google.gemspec +1 -1
  5. data/lib/fog/compute/google.rb +113 -112
  6. data/lib/fog/compute/google/models/images.rb +21 -6
  7. data/lib/fog/compute/google/models/instance_group.rb +38 -2
  8. data/lib/fog/compute/google/models/instance_groups.rb +13 -7
  9. data/lib/fog/compute/google/models/resource_view.rb +1 -1
  10. data/lib/fog/compute/google/requests/{add_instance_group_instance.rb → add_instance_group_instances.rb} +11 -7
  11. data/lib/fog/compute/google/requests/get_image_from_family.rb +35 -0
  12. data/lib/fog/compute/google/requests/insert_server.rb +4 -0
  13. data/lib/fog/compute/google/requests/list_instance_group_instances.rb +3 -3
  14. data/lib/fog/compute/google/requests/{remove_instance_group_instance.rb → remove_instance_group_instances.rb} +11 -7
  15. data/lib/fog/google/version.rb +1 -1
  16. data/lib/fog/storage/google_json.rb +1 -2
  17. data/lib/fog/storage/google_json/models/directories.rb +4 -5
  18. data/lib/fog/storage/google_json/models/file.rb +2 -2
  19. data/lib/fog/storage/google_json/real.rb +6 -7
  20. data/lib/fog/storage/google_json/requests/get_object_http_url.rb +1 -1
  21. data/lib/fog/storage/google_json/requests/get_object_url.rb +1 -1
  22. data/lib/fog/storage/google_json/requests/list_buckets.rb +32 -0
  23. data/lib/fog/storage/google_json/requests/put_bucket.rb +12 -6
  24. data/lib/fog/storage/google_xml.rb +0 -1
  25. data/lib/fog/storage/google_xml/models/file.rb +2 -2
  26. data/lib/fog/storage/google_xml/real.rb +1 -1
  27. data/lib/fog/storage/google_xml/requests/get_object_http_url.rb +1 -4
  28. data/lib/fog/storage/google_xml/requests/get_object_https_url.rb +0 -3
  29. data/lib/fog/storage/google_xml/requests/get_object_url.rb +0 -3
  30. data/lib/fog/storage/google_xml/requests/put_bucket.rb +1 -1
  31. data/tasks/console.rake +3 -5
  32. data/test/integration/compute/test_servers.rb +1 -1
  33. data/test/integration/factories/backend_services_factory.rb +2 -2
  34. data/test/integration/factories/forwarding_rules_factory.rb +3 -3
  35. data/test/integration/factories/global_forwarding_rules_factory.rb +2 -2
  36. data/test/integration/factories/images_factory.rb +2 -2
  37. data/test/integration/factories/servers_factory.rb +4 -4
  38. data/test/integration/factories/target_http_proxies_factory.rb +2 -2
  39. data/test/integration/factories/target_pools_factory.rb +4 -4
  40. data/test/integration/factories/url_maps_factory.rb +2 -2
  41. data/test/integration/storage/test_buckets.rb +2 -3
  42. data/test/integration/storage/test_directories.rb +3 -3
  43. data/test/integration/storage/test_objects.rb +5 -9
  44. metadata +9 -10
  45. data/lib/fog/storage/google_json/requests/get_object_torrent.rb +0 -13
  46. data/lib/fog/storage/google_json/requests/get_service.rb +0 -54
  47. data/lib/fog/storage/google_xml/requests/get_object_torrent.rb +0 -39
@@ -14,7 +14,7 @@ module Fog
14
14
  end
15
15
  end
16
16
 
17
- load(data["items"])
17
+ load(data)
18
18
  end
19
19
 
20
20
  def get(identity, zone = nil)
@@ -32,16 +32,22 @@ module Fog
32
32
  nil
33
33
  end
34
34
 
35
+ # TODO: To be deprecated
35
36
  def add_instance(params)
36
- data = service.add_instance_group_instance(params[:group], params[:zone], params[:instance])
37
+ Fog::Logger.deprecation(
38
+ "#{self.class}.#{__method__} is deprecated, use Fog::Compute::Google::InstanceGroup.#{__method__} instead [light_black](#{caller.first})[/]"
39
+ )
40
+ params[:instance] = [params[:instance]] unless params[:instance] == Array
41
+ service.add_instance_group_instances(params[:group], params[:zone], params[:instance])
37
42
  end
38
43
 
44
+ # TODO: To be deprecated
39
45
  def remove_instance(params)
40
- data = service.remove_instance_group_instance(params[:group], params[:zone], params[:instance])
41
- end
42
-
43
- def get_instances(params)
44
- data = service.list_instance_group_instances(params[:group], params[:zone])
46
+ Fog::Logger.deprecation(
47
+ "#{self.class}.#{__method__} is deprecated, use Fog::Compute::Google::InstanceGroup.#{__method__} instead [light_black](#{caller.first})[/]"
48
+ )
49
+ params[:instance] = [params[:instance]] unless params[:instance] == Array
50
+ service.remove_instance_group_instances(params[:group], params[:zone], params[:instance])
45
51
  end
46
52
  end
47
53
  end
@@ -76,7 +76,7 @@ module Fog
76
76
  resources = [resources] unless resources.class == Array
77
77
  resources.map { |resource| resource.class == String ? resource : resource.self_link }
78
78
  service.add_zone_view_resources(self, resources, @zone) if @zone
79
- service.add_region_view_resources(self, reources, @region) if @region
79
+ service.add_region_view_resources(self, resources, @region) if @region
80
80
  reload
81
81
  end
82
82
 
@@ -2,13 +2,13 @@ module Fog
2
2
  module Compute
3
3
  class Google
4
4
  class Mock
5
- def add_instance_group_instance(_group_name, _zone, _instances)
5
+ def add_instance_group_instances(_group_name, _zone, _instances)
6
6
  Fog::Mock.not_implemented
7
7
  end
8
8
  end
9
9
 
10
10
  class Real
11
- def add_instance_group_instance(group_name, zone, instance_name)
11
+ def add_instance_group_instances(group_name, zone, instances)
12
12
  api_method = @compute.instance_groups.add_instances
13
13
 
14
14
  parameters = {
@@ -17,12 +17,16 @@ module Fog
17
17
  "zone" => zone
18
18
  }
19
19
 
20
+ instances.map! do |instance|
21
+ if instance.start_with?("https:")
22
+ { "instance" => instance }
23
+ else
24
+ { "instance" => "https://www.googleapis.com/compute/#{api_version}/projects/#{@project}/zones/#{zone}/instances/#{instance}\n" }
25
+ end
26
+ end
27
+
20
28
  body_object = {
21
- "instances" => [
22
- {
23
- "instance" => "https://www.googleapis.com/compute/#{api_version}/projects/#{@project}/zones/#{zone}/instances/#{instance_name}\n"
24
- }
25
- ]
29
+ "instances" => instances
26
30
  }
27
31
 
28
32
  request(api_method, parameters, body_object)
@@ -0,0 +1,35 @@
1
+ module Fog
2
+ module Compute
3
+ class Google
4
+ # Returns the latest non-deprecated image that is part of an image family.
5
+ #
6
+ # ==== Parameters
7
+ # * family<~String> - Name of the image resource to return.
8
+ #
9
+ # ==== Returns
10
+ # * response<~Excon::Response>:
11
+ # * body<~Hash> - corresponding compute#image resource
12
+ #
13
+ # ==== See also:
14
+ # https://cloud.google.com/compute/docs/reference/latest/images/getFromFamily
15
+ class Mock
16
+ def get_image_from_family(_family, _project = @project)
17
+ Fog::Mock.not_implemented
18
+ end
19
+ end
20
+
21
+ class Real
22
+ def get_image_from_family(family, project = nil)
23
+ api_method = @compute.images.get_from_family
24
+ project = @project if project.nil?
25
+ parameters = {
26
+ "family" => family,
27
+ "project" => project
28
+ }
29
+
30
+ request(api_method, parameters)
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -161,6 +161,10 @@ module Fog
161
161
  if options.key? "preemptible"
162
162
  scheduling["preemptible"] = options.delete "preemptible"
163
163
  scheduling["preemptible"] = scheduling["preemptible"].class == TrueClass
164
+ # If we don't have an explicit value for "on_host_maintenance, then
165
+ # force the value to be 'TERMINATE' as it's the default and
166
+ # only-accepted value for preemptible vms
167
+ scheduling["onHostMaintenance"] = "TERMINATE" unless options.key? "on_host_maintenance"
164
168
  end
165
169
  if options.key? "on_host_maintenance"
166
170
  ohm = options.delete "on_host_maintenance"
@@ -8,12 +8,12 @@ module Fog
8
8
  end
9
9
 
10
10
  class Real
11
- def list_instance_group_instances(group, zone)
11
+ def list_instance_group_instances(group_name, zone)
12
12
  api_method = @compute.instance_groups.list_instances
13
13
  parameters = {
14
+ "instanceGroup" => group_name,
14
15
  "project" => @project,
15
- "zone" => zone,
16
- "group" => group
16
+ "zone" => zone
17
17
  }
18
18
 
19
19
  request(api_method, parameters)
@@ -2,13 +2,13 @@ module Fog
2
2
  module Compute
3
3
  class Google
4
4
  class Mock
5
- def remove_instance_group_instance(_group_name, _zone, _instances)
5
+ def add_instance_group_instances(_group, _zone, _instances)
6
6
  Fog::Mock.not_implemented
7
7
  end
8
8
  end
9
9
 
10
10
  class Real
11
- def remove_instance_group_instance(group_name, zone, instance_name)
11
+ def remove_instance_group_instances(group_name, zone, instances)
12
12
  api_method = @compute.instance_groups.remove_instances
13
13
 
14
14
  parameters = {
@@ -17,12 +17,16 @@ module Fog
17
17
  "zone" => zone
18
18
  }
19
19
 
20
+ instances.map! do |instance|
21
+ if instance.start_with?("https:")
22
+ { "instance" => instance }
23
+ else
24
+ { "instance" => "https://www.googleapis.com/compute/#{api_version}/projects/#{@project}/zones/#{zone}/instances/#{instance}\n" }
25
+ end
26
+ end
27
+
20
28
  body_object = {
21
- "instances" => [
22
- {
23
- "instance" => "https://www.googleapis.com/compute/#{api_version}/projects/#{@project}/zones/#{zone}/instances/#{instance_name}\n"
24
- }
25
- ]
29
+ "instances" => instances
26
30
  }
27
31
 
28
32
  request(api_method, parameters, body_object)
@@ -1,5 +1,5 @@
1
1
  module Fog
2
2
  module Google
3
- VERSION = "0.3.2".freeze
3
+ VERSION = "0.4.0".freeze
4
4
  end
5
5
  end
@@ -35,12 +35,11 @@ module Fog
35
35
  request :get_bucket_acl
36
36
  request :get_object
37
37
  request :get_object_acl
38
- # request :get_object_torrent
39
38
  request :get_object_http_url
40
39
  request :get_object_https_url
41
40
  request :get_object_url
42
- # request :get_service
43
41
  request :head_object
42
+ request :list_buckets
44
43
  request :put_bucket
45
44
  request :put_bucket_acl
46
45
  request :put_object
@@ -4,11 +4,10 @@ module Fog
4
4
  class Directories < Fog::Collection
5
5
  model Fog::Storage::GoogleJSON::Directory
6
6
 
7
- # TODO: get_service does not return items like this
8
- # def all
9
- # data = service.get_service.body["items"]
10
- # load(data)
11
- # end
7
+ def all
8
+ data = service.list_buckets.body["items"] || []
9
+ load(data)
10
+ end
12
11
 
13
12
  def get(key, options = {})
14
13
  remap_attributes(options, :delimiter => "delimiter",
@@ -52,9 +52,9 @@ module Fog
52
52
 
53
53
  attr_reader :directory
54
54
 
55
- def copy(target_directory_key, target_file_key)
55
+ def copy(target_directory_key, target_file_key, options = {})
56
56
  requires :directory, :key
57
- service.copy_object(directory.key, key, target_directory_key, target_file_key)
57
+ service.copy_object(directory.key, key, target_directory_key, target_file_key, options)
58
58
  target_directory = service.directories.new(:key => target_directory_key)
59
59
  target_directory.files.get(target_file_key)
60
60
  end
@@ -18,13 +18,12 @@ module Fog
18
18
  end
19
19
 
20
20
  def signature(params)
21
- string_to_sign =
22
- <<-DATA
21
+ string_to_sign = <<-DATA
23
22
  #{params[:method]}
24
- #{params[:headers]['Content-MD5']}
25
- #{params[:headers]['Content-Type']}
26
- #{params[:headers]['Date']}
27
- DATA
23
+ #{params[:headers]['Content-MD5']}
24
+ #{params[:headers]['Content-Type']}
25
+ #{params[:headers]['Date']}
26
+ DATA
28
27
 
29
28
  google_headers = {}
30
29
  canonical_google_headers = ""
@@ -45,7 +44,7 @@ module Fog
45
44
  canonical_resource << params[:path].to_s
46
45
  canonical_resource << "?"
47
46
  for key in (params[:query] || {}).keys
48
- if %w(acl cors location logging requestPayment torrent versions versioning).include?(key)
47
+ if %w(acl cors location logging requestPayment versions versioning).include?(key)
49
48
  canonical_resource << "#{key}&"
50
49
  end
51
50
  end
@@ -15,7 +15,7 @@ module Fog
15
15
  end
16
16
 
17
17
  class Real
18
- # Get an expiring object http url from S3
18
+ # Get an expiring object http url from GCS
19
19
  #
20
20
  # ==== Parameters
21
21
  # * bucket_name<~String> - Name of bucket containing object
@@ -2,7 +2,7 @@ module Fog
2
2
  module Storage
3
3
  class GoogleJSON
4
4
  class Real
5
- # Get an expiring object url from Google Storage
5
+ # Get an expiring object url from GCS
6
6
  # Deprecated, redirects to get_object_https_url.rb
7
7
 
8
8
  def get_object_url(bucket_name, object_name, expires)
@@ -0,0 +1,32 @@
1
+ module Fog
2
+ module Storage
3
+ class GoogleJSON
4
+ class Real
5
+ # Retrieves a list of buckets for a given project.
6
+ #
7
+ # ==== Returns
8
+ # * response<~Excon::Response>:
9
+ # * body<~Hash> - Hash of bucket items
10
+ # * 'kind'<~String> - The kind of item this is (storage#buckets)
11
+ # * 'items'<~Array> - The array of items.
12
+ #
13
+ # ==== See Also
14
+ # https://cloud.google.com/storage/docs/json_api/v1/buckets/list
15
+ # TODO: check if very large lists require working with nextPageToken
16
+ def list_buckets
17
+ api_method = @storage_json.buckets.list
18
+ parameters = {
19
+ "project" => @project
20
+ }
21
+
22
+ request(api_method, parameters)
23
+ end
24
+ end
25
+ class Mock
26
+ def list_buckets
27
+ Fog::Mock.not_implemented
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -2,19 +2,24 @@ module Fog
2
2
  module Storage
3
3
  class GoogleJSON
4
4
  class Real
5
- # Create an Google Storage bucket
6
- # https://cloud.google.com/storage/docs/json_api/v1/buckets/insert
5
+ # Create a Google Storage bucket
7
6
  #
8
7
  # ==== Parameters
9
8
  # * bucket_name<~String> - name of bucket to create
10
9
  # * options<~Hash> - config arguments for bucket. Defaults to {}.
11
10
  # * 'LocationConstraint'<~Symbol> - sets the location for the bucket
12
- # * 'x-amz-acl'<~String> - Permissions, must be in ['private', 'public-read', 'public-read-write', 'authenticated-read']
11
+ # * 'predefinedAcl'<~String> - Apply a predefined set of access controls to this bucket.
12
+ # * 'predefinedDefaultObjectAcl'<~String> - Apply a predefined set of default object access controls to this bucket.
13
+ # * body_options<~Hash> - body arguments for bucket creation.
14
+ # See https://cloud.google.com/storage/docs/json_api/v1/buckets/insert#request-body
13
15
  #
14
16
  # ==== Returns
15
17
  # * response<~Excon::Response>:
16
18
  # * status<~Integer> - 200
17
- def put_bucket(bucket_name, options = {})
19
+ #
20
+ # ==== See also
21
+ # https://cloud.google.com/storage/docs/json_api/v1/buckets/insert
22
+ def put_bucket(bucket_name, options = {}, body_options = {})
18
23
  location = options["LocationConstraint"] if options["LocationConstraint"]
19
24
 
20
25
  api_method = @storage_json.buckets.insert
@@ -22,18 +27,19 @@ module Fog
22
27
  "project" => @project,
23
28
  "projection" => "full"
24
29
  }
30
+ parameters.merge! options
25
31
  body_object = {
26
32
  "name" => bucket_name,
27
33
  "location" => location
28
34
  }
29
- parameters.merge! options
35
+ body_object.merge! body_options
30
36
 
31
37
  request(api_method, parameters, body_object = body_object)
32
38
  end
33
39
  end
34
40
 
35
41
  class Mock
36
- def put_bucket(bucket_name, options = {})
42
+ def put_bucket(bucket_name, options = {}, _body_options = {})
37
43
  acl = options["x-goog-acl"] || "private"
38
44
  if !%w(private publicRead publicReadWrite authenticatedRead).include?(acl)
39
45
  raise Excon::Errors::BadRequest.new("invalid x-goog-acl")
@@ -22,7 +22,6 @@ module Fog
22
22
  request :get_bucket_acl
23
23
  request :get_object
24
24
  request :get_object_acl
25
- request :get_object_torrent
26
25
  request :get_object_http_url
27
26
  request :get_object_https_url
28
27
  request :get_object_url
@@ -45,9 +45,9 @@ module Fog
45
45
 
46
46
  attr_reader :directory
47
47
 
48
- def copy(target_directory_key, target_file_key)
48
+ def copy(target_directory_key, target_file_key, options = {})
49
49
  requires :directory, :key
50
- service.copy_object(directory.key, key, target_directory_key, target_file_key)
50
+ service.copy_object(directory.key, key, target_directory_key, target_file_key, options)
51
51
  target_directory = service.directories.new(:key => target_directory_key)
52
52
  target_directory.files.get(target_file_key)
53
53
  end
@@ -64,7 +64,7 @@ DATA
64
64
  canonical_resource << params[:path].to_s
65
65
  canonical_resource << "?"
66
66
  (params[:query] || {}).keys.each do |key|
67
- if %w(acl cors location logging requestPayment torrent versions versioning).include?(key)
67
+ if %w(acl cors location logging requestPayment versions versioning).include?(key)
68
68
  canonical_resource << "#{key}&"
69
69
  end
70
70
  end
@@ -15,7 +15,7 @@ module Fog
15
15
  end
16
16
 
17
17
  class Real
18
- # Get an expiring object http url from S3
18
+ # Get an expiring object http url from GCS
19
19
  #
20
20
  # ==== Parameters
21
21
  # * bucket_name<~String> - Name of bucket containing object
@@ -25,9 +25,6 @@ module Fog
25
25
  # ==== Returns
26
26
  # * response<~Excon::Response>:
27
27
  # * body<~String> - url for object
28
- #
29
- # ==== See Also
30
- # http://docs.amazonwebservices.com/AmazonS3/latest/dev/S3_QSAuth.html
31
28
 
32
29
  include GetObjectHttpUrl
33
30
  end
@@ -25,9 +25,6 @@ module Fog
25
25
  # ==== Returns
26
26
  # * response<~Excon::Response>:
27
27
  # * body<~String> - url for object
28
- #
29
- # ==== See Also
30
- # http://docs.amazonwebservices.com/AmazonS3/latest/dev/S3_QSAuth.html
31
28
 
32
29
  include GetObjectHttpsUrl
33
30
  end
@@ -12,9 +12,6 @@ module Fog
12
12
  # ==== Returns
13
13
  # * response<~Excon::Response>:
14
14
  # * body<~String> - url for object
15
- #
16
- # ==== See Also
17
- # http://docs.amazonwebservices.com/AmazonS3/latest/dev/S3_QSAuth.html
18
15
 
19
16
  def get_object_url(bucket_name, object_name, expires)
20
17
  Fog::Logger.deprecation("Fog::Storage::Google => ##{get_object_url} is deprecated, use ##{get_object_https_url} instead[/] [light_black](#{caller.first})")