fog 0.3.31 → 0.3.32

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 (192) hide show
  1. data/.document +3 -0
  2. data/.gitignore +10 -0
  3. data/Gemfile.lock +1 -4
  4. data/README.rdoc +29 -37
  5. data/Rakefile +5 -25
  6. data/bin/fog +1 -3
  7. data/examples/dns_methods.rb +389 -0
  8. data/examples/storage.rb +103 -0
  9. data/fog.gemspec +4 -778
  10. data/lib/fog.rb +5 -66
  11. data/lib/fog/aws.rb +3 -0
  12. data/lib/fog/aws/bin.rb +7 -2
  13. data/lib/fog/aws/cdn.rb +2 -2
  14. data/lib/fog/aws/compute.rb +2 -2
  15. data/lib/fog/aws/dns.rb +101 -0
  16. data/lib/fog/aws/elb.rb +2 -2
  17. data/lib/fog/aws/iam.rb +2 -2
  18. data/lib/fog/aws/models/compute/image.rb +1 -0
  19. data/lib/fog/aws/models/compute/server.rb +1 -1
  20. data/lib/fog/aws/models/compute/servers.rb +1 -13
  21. data/lib/fog/aws/parsers/compute/describe_images.rb +36 -34
  22. data/lib/fog/aws/parsers/dns/change_resource_record_sets.rb +26 -0
  23. data/lib/fog/aws/parsers/dns/create_hosted_zone.rb +55 -0
  24. data/lib/fog/aws/parsers/dns/delete_hosted_zone.rb +25 -0
  25. data/lib/fog/aws/parsers/dns/get_change.rb +26 -0
  26. data/lib/fog/aws/parsers/dns/get_hosted_zone.rb +43 -0
  27. data/lib/fog/aws/parsers/dns/list_hosted_zones.rb +35 -0
  28. data/lib/fog/aws/parsers/dns/list_resource_record_sets.rb +46 -0
  29. data/lib/fog/aws/requests/compute/describe_images.rb +1 -0
  30. data/lib/fog/aws/requests/dns/change_resource_record_sets.rb +90 -0
  31. data/lib/fog/aws/requests/dns/create_hosted_zone.rb +68 -0
  32. data/lib/fog/aws/requests/dns/delete_hosted_zone.rb +48 -0
  33. data/lib/fog/aws/requests/dns/get_change.rb +47 -0
  34. data/lib/fog/aws/requests/dns/get_hosted_zone.rb +51 -0
  35. data/lib/fog/aws/requests/dns/list_hosted_zones.rb +63 -0
  36. data/lib/fog/aws/requests/dns/list_resource_record_sets.rb +68 -0
  37. data/lib/fog/aws/requests/storage/get_object_url.rb +2 -2
  38. data/lib/fog/aws/requests/storage/put_object_url.rb +2 -2
  39. data/lib/fog/aws/requests/storage/sync_clock.rb +28 -0
  40. data/lib/fog/aws/simpledb.rb +2 -2
  41. data/lib/fog/aws/storage.rb +5 -3
  42. data/lib/fog/bluebox.rb +2 -0
  43. data/lib/fog/bluebox/compute.rb +2 -2
  44. data/lib/fog/brightbox.rb +2 -0
  45. data/lib/fog/brightbox/compute.rb +2 -2
  46. data/lib/fog/core.rb +21 -1
  47. data/lib/fog/core/bin.rb +3 -1
  48. data/lib/fog/core/compute.rb +1 -0
  49. data/lib/fog/core/credentials.rb +72 -50
  50. data/lib/fog/core/deprecation.rb +11 -5
  51. data/lib/fog/core/mock.rb +34 -0
  52. data/lib/fog/core/model.rb +9 -1
  53. data/lib/fog/core/service.rb +40 -26
  54. data/lib/fog/core/storage.rb +1 -0
  55. data/lib/fog/core/time.rb +21 -0
  56. data/lib/fog/core/wait_for.rb +17 -0
  57. data/lib/fog/go_grid.rb +2 -0
  58. data/lib/fog/go_grid/compute.rb +2 -2
  59. data/lib/fog/google.rb +2 -0
  60. data/lib/fog/google/requests/storage/get_bucket.rb +6 -5
  61. data/lib/fog/google/requests/storage/get_object_url.rb +4 -4
  62. data/lib/fog/google/requests/storage/put_object_url.rb +4 -4
  63. data/lib/fog/google/storage.rb +4 -3
  64. data/lib/fog/linode.rb +3 -0
  65. data/lib/fog/linode/bin.rb +5 -3
  66. data/lib/fog/linode/compute.rb +6 -2
  67. data/lib/fog/linode/dns.rb +80 -0
  68. data/lib/fog/linode/requests/dns/domain_create.rb +52 -0
  69. data/lib/fog/linode/requests/dns/domain_delete.rb +35 -0
  70. data/lib/fog/linode/requests/dns/domain_list.rb +50 -0
  71. data/lib/fog/linode/requests/dns/domain_resource_create.rb +53 -0
  72. data/lib/fog/linode/requests/dns/domain_resource_delete.rb +36 -0
  73. data/lib/fog/linode/requests/dns/domain_resource_list.rb +48 -0
  74. data/lib/fog/linode/requests/dns/domain_resource_update.rb +54 -0
  75. data/lib/fog/linode/requests/dns/domain_update.rb +48 -0
  76. data/lib/fog/local.rb +2 -0
  77. data/lib/fog/local/storage.rb +3 -3
  78. data/lib/fog/new_servers.rb +2 -0
  79. data/lib/fog/new_servers/compute.rb +2 -2
  80. data/lib/fog/rackspace.rb +2 -0
  81. data/lib/fog/rackspace/cdn.rb +2 -2
  82. data/lib/fog/rackspace/compute.rb +2 -2
  83. data/lib/fog/rackspace/storage.rb +2 -2
  84. data/lib/fog/slicehost.rb +3 -0
  85. data/lib/fog/slicehost/bin.rb +2 -0
  86. data/lib/fog/slicehost/compute.rb +2 -2
  87. data/lib/fog/slicehost/dns.rb +84 -0
  88. data/lib/fog/slicehost/parsers/dns/create_record.rb +26 -0
  89. data/lib/fog/slicehost/parsers/dns/create_zone.rb +26 -0
  90. data/lib/fog/slicehost/parsers/dns/get_record.rb +26 -0
  91. data/lib/fog/slicehost/parsers/dns/get_records.rb +30 -0
  92. data/lib/fog/slicehost/parsers/dns/get_zone.rb +26 -0
  93. data/lib/fog/slicehost/parsers/dns/get_zones.rb +30 -0
  94. data/lib/fog/slicehost/requests/compute/create_slice.rb +2 -2
  95. data/lib/fog/slicehost/requests/compute/delete_slice.rb +3 -17
  96. data/lib/fog/slicehost/requests/dns/create_record.rb +61 -0
  97. data/lib/fog/slicehost/requests/dns/create_zone.rb +54 -0
  98. data/lib/fog/slicehost/requests/dns/delete_record.rb +31 -0
  99. data/lib/fog/slicehost/requests/dns/delete_zone.rb +31 -0
  100. data/lib/fog/slicehost/requests/dns/get_record.rb +40 -0
  101. data/lib/fog/slicehost/requests/dns/get_records.rb +41 -0
  102. data/lib/fog/slicehost/requests/dns/get_zone.rb +40 -0
  103. data/lib/fog/slicehost/requests/dns/get_zones.rb +38 -0
  104. data/lib/fog/terremark.rb +2 -0
  105. data/lib/fog/terremark/ecloud.rb +2 -4
  106. data/lib/fog/vcloud.rb +4 -2
  107. data/lib/fog/vcloud/bin.rb +3 -1
  108. data/lib/fog/vcloud/mock_data_classes.rb +77 -11
  109. data/lib/fog/vcloud/terremark/ecloud.rb +22 -7
  110. data/lib/fog/vcloud/terremark/ecloud/models/backup_internet_service.rb +60 -0
  111. data/lib/fog/vcloud/terremark/ecloud/models/backup_internet_services.rb +36 -0
  112. data/lib/fog/vcloud/terremark/ecloud/models/internet_service.rb +28 -13
  113. data/lib/fog/vcloud/terremark/ecloud/models/internet_services.rb +2 -2
  114. data/lib/fog/vcloud/terremark/ecloud/models/ip.rb +1 -1
  115. data/lib/fog/vcloud/terremark/ecloud/models/network.rb +4 -1
  116. data/lib/fog/vcloud/terremark/ecloud/models/server.rb +5 -5
  117. data/lib/fog/vcloud/terremark/ecloud/models/vdc.rb +6 -2
  118. data/lib/fog/vcloud/terremark/ecloud/requests/add_backup_internet_service.rb +111 -0
  119. data/lib/fog/vcloud/terremark/ecloud/requests/add_internet_service.rb +2 -4
  120. data/lib/fog/vcloud/terremark/ecloud/requests/add_node.rb +1 -3
  121. data/lib/fog/vcloud/terremark/ecloud/requests/configure_internet_service.rb +39 -27
  122. data/lib/fog/vcloud/terremark/ecloud/requests/configure_network.rb +1 -2
  123. data/lib/fog/vcloud/terremark/ecloud/requests/configure_network_ip.rb +21 -6
  124. data/lib/fog/vcloud/terremark/ecloud/requests/delete_vapp.rb +2 -1
  125. data/lib/fog/vcloud/terremark/ecloud/requests/get_internet_services.rb +34 -17
  126. data/lib/fog/vcloud/terremark/ecloud/requests/get_network_extensions.rb +12 -10
  127. data/lib/fog/vcloud/terremark/ecloud/requests/get_network_ip.rb +15 -10
  128. data/lib/fog/vcloud/terremark/ecloud/requests/get_network_ips.rb +1 -12
  129. data/lib/fog/zerigo.rb +15 -0
  130. data/lib/fog/zerigo/bin.rb +25 -0
  131. data/lib/fog/zerigo/dns.rb +96 -0
  132. data/lib/fog/zerigo/parsers/dns/count_hosts.rb +24 -0
  133. data/lib/fog/zerigo/parsers/dns/count_zones.rb +24 -0
  134. data/lib/fog/zerigo/parsers/dns/create_host.rb +26 -0
  135. data/lib/fog/zerigo/parsers/dns/create_zone.rb +26 -0
  136. data/lib/fog/zerigo/parsers/dns/find_hosts.rb +30 -0
  137. data/lib/fog/zerigo/parsers/dns/get_host.rb +26 -0
  138. data/lib/fog/zerigo/parsers/dns/get_zone.rb +56 -0
  139. data/lib/fog/zerigo/parsers/dns/get_zone_stats.rb +26 -0
  140. data/lib/fog/zerigo/parsers/dns/list_hosts.rb +30 -0
  141. data/lib/fog/zerigo/parsers/dns/list_zones.rb +30 -0
  142. data/lib/fog/zerigo/requests/dns/count_hosts.rb +36 -0
  143. data/lib/fog/zerigo/requests/dns/count_zones.rb +36 -0
  144. data/lib/fog/zerigo/requests/dns/create_host.rb +70 -0
  145. data/lib/fog/zerigo/requests/dns/create_zone.rb +97 -0
  146. data/lib/fog/zerigo/requests/dns/delete_host.rb +32 -0
  147. data/lib/fog/zerigo/requests/dns/delete_zone.rb +33 -0
  148. data/lib/fog/zerigo/requests/dns/find_hosts.rb +63 -0
  149. data/lib/fog/zerigo/requests/dns/get_host.rb +47 -0
  150. data/lib/fog/zerigo/requests/dns/get_zone.rb +57 -0
  151. data/lib/fog/zerigo/requests/dns/get_zone_stats.rb +44 -0
  152. data/lib/fog/zerigo/requests/dns/list_hosts.rb +48 -0
  153. data/lib/fog/zerigo/requests/dns/list_zones.rb +53 -0
  154. data/lib/fog/zerigo/requests/dns/update_host.rb +60 -0
  155. data/lib/fog/zerigo/requests/dns/update_zone.rb +78 -0
  156. data/spec/spec_helper.rb +0 -5
  157. data/spec/vcloud/spec_helper.rb +3 -2
  158. data/spec/vcloud/terremark/ecloud/models/backup_internet_service_spec.rb +49 -0
  159. data/spec/vcloud/terremark/ecloud/models/backup_internet_services_spec.rb +29 -0
  160. data/spec/vcloud/terremark/ecloud/models/internet_service_spec.rb +32 -13
  161. data/spec/vcloud/terremark/ecloud/models/network_spec.rb +7 -4
  162. data/spec/vcloud/terremark/ecloud/models/server_spec.rb +20 -0
  163. data/spec/vcloud/terremark/ecloud/requests/add_backup_internet_service_spec.rb +60 -0
  164. data/spec/vcloud/terremark/ecloud/requests/configure_internet_service_spec.rb +3 -0
  165. data/spec/vcloud/terremark/ecloud/requests/configure_network_ip_spec.rb +55 -0
  166. data/spec/vcloud/terremark/ecloud/requests/delete_vapp_spec.rb +9 -0
  167. data/spec/vcloud/terremark/ecloud/requests/get_internet_services_spec.rb +60 -14
  168. data/spec/vcloud/terremark/ecloud/requests/get_network_ip_spec.rb +2 -0
  169. data/spec/vcloud/terremark/ecloud/requests/get_network_ips_spec.rb +3 -3
  170. data/tests/aws/requests/compute/image_tests.rb +15 -14
  171. data/tests/aws/requests/dns/dns_tests.rb +276 -0
  172. data/tests/brightbox/requests/compute/account_tests.rb +20 -9
  173. data/tests/brightbox/requests/compute/api_client_tests.rb +12 -4
  174. data/tests/brightbox/requests/compute/cloud_ip_tests.rb +20 -6
  175. data/tests/brightbox/requests/compute/image_tests.rb +9 -4
  176. data/tests/brightbox/requests/compute/interface_tests.rb +8 -2
  177. data/tests/brightbox/requests/compute/server_tests.rb +17 -5
  178. data/tests/brightbox/requests/compute/server_type_tests.rb +8 -4
  179. data/tests/brightbox/requests/compute/user_tests.rb +13 -5
  180. data/tests/brightbox/requests/compute/zone_tests.rb +8 -4
  181. data/tests/core/attribute_tests.rb +45 -0
  182. data/tests/helper.rb +0 -2
  183. data/tests/linode/requests/dns/dns_tests.rb +262 -0
  184. data/tests/rackspace/requests/compute/address_tests.rb +1 -1
  185. data/tests/rackspace/requests/compute/image_tests.rb +1 -1
  186. data/tests/slicehost/requests/dns_tests/dns_tests.rb +279 -0
  187. data/tests/zerigo/helper.rb +0 -0
  188. data/tests/zerigo/requests/dns/dns_tests.rb +374 -0
  189. metadata +280 -36
  190. data/spec/compact_progress_bar_formatter.rb +0 -195
  191. data/spec/core/attributes_spec.rb +0 -52
  192. data/spec/lorem.txt +0 -1
@@ -2,12 +2,18 @@ module Fog
2
2
  module Deprecation
3
3
 
4
4
  def deprecate(older, newer)
5
- class_eval <<-EOS, __FILE__, __LINE__
5
+ module_eval <<-EOS, __FILE__, __LINE__
6
6
  def #{older}(*args)
7
- location = caller.first
8
- warning = "[yellow][WARN] #{self} => ##{older} is deprecated, use ##{newer} instead[/]"
9
- warning << " [light_black](" << location << ")[/] "
10
- Formatador.display_line(warning)
7
+ Formatador.display_line("[yellow][WARN] #{self} => ##{older} is deprecated, use ##{newer} instead[/] [light_black](#{caller.first})[/]")
8
+ send(:#{newer}, *args)
9
+ end
10
+ EOS
11
+ end
12
+
13
+ def self_deprecate(older, newer)
14
+ module_eval <<-EOS, __FILE__, __LINE__
15
+ def self.#{older}(*args)
16
+ Formatador.display_line("[yellow][WARN] #{self} => ##{older} is deprecated, use ##{newer} instead[/] [light_black](#{caller.first})[/]")
11
17
  send(:#{newer}, *args)
12
18
  end
13
19
  EOS
@@ -0,0 +1,34 @@
1
+ module Fog
2
+
3
+ @mocking = false
4
+
5
+ def self.mock!
6
+ @mocking = true
7
+ end
8
+
9
+ def self.mock?
10
+ @mocking
11
+ end
12
+
13
+ def self.mocking?
14
+ @mocking
15
+ end
16
+
17
+ module Mock
18
+ @delay = 1
19
+ def self.delay
20
+ @delay
21
+ end
22
+
23
+ def self.delay=(new_delay)
24
+ raise ArgumentError, "delay must be non-negative" unless new_delay >= 0
25
+ @delay = new_delay
26
+ end
27
+
28
+ def self.not_implemented
29
+ raise Fog::Errors::MockNotImplemented.new("Contributions welcome!")
30
+ end
31
+
32
+ end
33
+
34
+ end
@@ -39,7 +39,15 @@ module Fog
39
39
  def wait_for(timeout=600, interval=1, &block)
40
40
  reload
41
41
  Fog.wait_for(timeout, interval) do
42
- reload or raise Fog::Errors::Error.new("Reload failed, #{self.class} #{self.identity} went away.")
42
+ retries = 3
43
+ if reload
44
+ retries = 3
45
+ elsif retries > 0
46
+ retries -= 1
47
+ sleep(1)
48
+ elsif retries == 0
49
+ raise Fog::Errors::Error.new("Reload failed, #{self.class} #{self.identity} went away.")
50
+ end
43
51
  instance_eval(&block)
44
52
  end
45
53
  end
@@ -18,26 +18,6 @@ module Fog
18
18
 
19
19
  class << self
20
20
 
21
- # this is to accomodate Real implementations of Service subclasses
22
- # NOTE: it might be good to enforce parameter specs to Mock classes as well.
23
- def inject_parameter_specs
24
- lambda do |spec|
25
- implementation = "Real"
26
- self.const_set(implementation, Class.new) unless self.const_defined? implementation
27
- realclass = self.const_get implementation
28
-
29
- if realclass.declared_parameters_for(:'self.new', :required).empty?
30
- required = declared_parameters_for(:'self.new', :required)
31
- realclass.send(:requires, *required)
32
- end
33
-
34
- if realclass.declared_parameters_for(:'self.new', :optional).empty?
35
- optional = declared_parameters_for(:'self.new', :optional)
36
- realclass.send(:recognizes, *optional)
37
- end
38
- end
39
- end
40
-
41
21
  def inherited(child)
42
22
  child.class_eval <<-EOS, __FILE__, __LINE__
43
23
  module Collections
@@ -54,16 +34,16 @@ module Fog
54
34
  EOS
55
35
  end
56
36
 
57
- def requirements
58
- declared_parameters_for :'self.new', :required
59
- end
60
-
61
37
  def new(options={})
62
- if Fog.bin
63
- default_credentials = filter_parameters(Fog.credentials)
38
+ # attempt to load credentials from config file
39
+ begin
40
+ default_credentials = Fog.credentials.reject {|key, value| !(recognized | requirements).include?(key)}
64
41
  options = default_credentials.merge(options)
42
+ rescue LoadError
43
+ # if there are no configured credentials, do nothing
65
44
  end
66
45
 
46
+ validate_options(options)
67
47
  setup_requirements
68
48
 
69
49
  if Fog.mocking?
@@ -133,10 +113,44 @@ module Fog
133
113
  @requests ||= []
134
114
  end
135
115
 
116
+ def requires(*args)
117
+ requirements.concat(args)
118
+ end
119
+
120
+ def requirements
121
+ @requirements ||= []
122
+ end
123
+
124
+ def recognizes(*args)
125
+ recognized.concat(args)
126
+ end
127
+
128
+ def recognized
129
+ @recognized ||= []
130
+ end
131
+
132
+ def reset_data(keys=Mock.data.keys)
133
+ Mock.reset_data(keys)
134
+ end
135
+
136
136
  def reset_data(keys=Mock.data.keys)
137
137
  Mock.reset_data(keys)
138
138
  end
139
139
 
140
+ def validate_options(options)
141
+ missing = requirements - options.keys
142
+ unless missing.empty?
143
+ raise ArgumentError, "Missing required arguments: #{missing.join(', ')}"
144
+ end
145
+
146
+ unless recognizes.empty?
147
+ unrecognized = options.keys - requirements - recognized
148
+ unless unrecognized.empty?
149
+ raise ArgumentError, "Unrecognized arguments: #{unrecognized.join(', ')}"
150
+ end
151
+ end
152
+ end
153
+
140
154
  end
141
155
 
142
156
  end
@@ -2,6 +2,7 @@ module Fog
2
2
  class Storage
3
3
 
4
4
  def self.new(attributes)
5
+ attributes = attributes.dup # prevent delete from having side effects
5
6
  case provider = attributes.delete(:provider)
6
7
  when 'AWS'
7
8
  require 'fog/aws'
@@ -0,0 +1,21 @@
1
+ module Fog
2
+ class Time < ::Time
3
+ class << self
4
+
5
+ def now
6
+ ::Time.now - offset
7
+ end
8
+
9
+ def now=(new_now)
10
+ old_now = ::Time.now
11
+ @offset = old_now - new_now
12
+ new_now
13
+ end
14
+
15
+ def offset
16
+ @offset ||= 0
17
+ end
18
+
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,17 @@
1
+ module Fog
2
+
3
+ def self.wait_for(timeout=600, interval=1, &block)
4
+ duration = 0
5
+ start = Time.now
6
+ until yield || duration > timeout
7
+ sleep(interval)
8
+ duration = Time.now - start
9
+ end
10
+ if duration > timeout
11
+ false
12
+ else
13
+ { :duration => duration }
14
+ end
15
+ end
16
+
17
+ end
@@ -1,3 +1,5 @@
1
+ require File.join(File.dirname(__FILE__), 'core')
2
+
1
3
  module Fog
2
4
  module GoGrid
3
5
 
@@ -2,8 +2,8 @@ module Fog
2
2
  module GoGrid
3
3
  class Compute < Fog::Service
4
4
 
5
- requires :go_grid_api_key, :go_grid_shared_secret, &inject_parameter_specs
6
- recognizes :host, :path, :port, :scheme, :persistent, &inject_parameter_specs
5
+ requires :go_grid_api_key, :go_grid_shared_secret
6
+ recognizes :host, :path, :port, :scheme, :persistent
7
7
 
8
8
  model_path 'fog/go_grid/models/compute'
9
9
  model :image
@@ -1,4 +1,6 @@
1
1
  require 'nokogiri'
2
+
3
+ require File.join(File.dirname(__FILE__), 'core')
2
4
  require 'fog/core/parser'
3
5
 
4
6
  module Fog
@@ -83,11 +83,12 @@ module Fog
83
83
 
84
84
  response.status = 200
85
85
  response.body = {
86
- 'Contents' => truncated_contents,
87
- 'IsTruncated' => truncated_contents.size != contents.size,
88
- 'Marker' => options['marker'],
89
- 'Name' => bucket['Name'],
90
- 'Prefix' => options['prefix']
86
+ 'CommonPrefixes' => [],
87
+ 'Contents' => truncated_contents,
88
+ 'IsTruncated' => truncated_contents.size != contents.size,
89
+ 'Marker' => options['marker'],
90
+ 'Name' => bucket['Name'],
91
+ 'Prefix' => options['prefix']
91
92
  }
92
93
  if options['max-keys'] && options['max-keys'] < response.body['Contents'].length
93
94
  response.body['IsTruncated'] = true
@@ -23,9 +23,9 @@ module Fog
23
23
  end
24
24
  url({
25
25
  :headers => {},
26
- :host => "#{bucket_name}.#{@host}",
26
+ :host => @host,
27
27
  :method => 'GET',
28
- :path => CGI.escape(object_name)
28
+ :path => "#{bucket_name}/#{object_name}"
29
29
  }, expires)
30
30
  end
31
31
 
@@ -42,9 +42,9 @@ module Fog
42
42
  end
43
43
  url({
44
44
  :headers => {},
45
- :host => "#{bucket_name}.#{@host}",
45
+ :host => @host,
46
46
  :method => 'GET',
47
- :path => CGI.escape(object_name)
47
+ :path => "#{bucket_name}/#{object_name}"
48
48
  }, expires)
49
49
  end
50
50
 
@@ -23,9 +23,9 @@ module Fog
23
23
  end
24
24
  url({
25
25
  :headers => {},
26
- :host => "#{bucket_name}.#{@host}",
26
+ :host => @host,
27
27
  :method => 'PUT',
28
- :path => CGI.escape(object_name)
28
+ :path => "#{bucket_name}/#{object_name}"
29
29
  }, expires)
30
30
  end
31
31
 
@@ -42,9 +42,9 @@ module Fog
42
42
  end
43
43
  url({
44
44
  :headers => {},
45
- :host => "#{bucket_name}.#{@host}",
45
+ :host => @host,
46
46
  :method => 'PUT',
47
- :path => CGI.escape(object_name)
47
+ :path => "#{bucket_name}/#{object_name}"
48
48
  }, expires)
49
49
  end
50
50
 
@@ -2,8 +2,8 @@ module Fog
2
2
  module Google
3
3
  class Storage < Fog::Service
4
4
 
5
- requires :google_storage_access_key_id, :google_storage_secret_access_key, &inject_parameter_specs
6
- recognizes :host, :port, :scheme, :persistent, &inject_parameter_specs
5
+ requires :google_storage_access_key_id, :google_storage_secret_access_key
6
+ recognizes :host, :port, :scheme, :persistent
7
7
 
8
8
  model_path 'fog/google/models/storage'
9
9
  collection :directories
@@ -57,7 +57,8 @@ module Fog
57
57
  query << "GoogleAccessKeyId=#{@google_storage_access_key_id}"
58
58
  query << "Signature=#{CGI.escape(signature(params))}"
59
59
  query << "Expires=#{params[:headers]['Date']}"
60
- "http://#{params[:host]}/#{params[:path]}?#{query.join('&')}"
60
+ path = CGI.escape(params[:path]).gsub('%2F', '/')
61
+ "http://#{params[:host]}/#{path}?#{query.join('&')}"
61
62
  end
62
63
 
63
64
  end
@@ -1,3 +1,5 @@
1
+ require File.join(File.dirname(__FILE__), 'core')
2
+
1
3
  module Fog
2
4
  module Linode
3
5
 
@@ -5,6 +7,7 @@ module Fog
5
7
 
6
8
  service_path 'fog/linode'
7
9
  service 'compute'
10
+ service 'dns'
8
11
 
9
12
  def self.new(attributes = {})
10
13
  location = caller.first
@@ -3,9 +3,11 @@ class Linode < Fog::Bin
3
3
 
4
4
  def class_for(key)
5
5
  case key
6
- when :compute, :linode
6
+ when :compute
7
7
  Fog::Linode::Compute
8
- else
8
+ when :dns
9
+ Fog::Linode::DNS
10
+ else
9
11
  raise ArgumentError, "Unsupported #{self} service: #{key}"
10
12
  end
11
13
  end
@@ -24,7 +26,7 @@ class Linode < Fog::Bin
24
26
  end
25
27
 
26
28
  def services
27
- [:compute]
29
+ [:compute, :dns]
28
30
  end
29
31
 
30
32
  end
@@ -2,8 +2,8 @@ module Fog
2
2
  module Linode
3
3
  class Compute < Fog::Service
4
4
 
5
- requires :linode_api_key, &inject_parameter_specs
6
- recognizes :port, :scheme, :persistent, &inject_parameter_specs
5
+ requires :linode_api_key
6
+ recognizes :port, :scheme, :persistent
7
7
 
8
8
  model_path 'fog/linode/models/compute'
9
9
 
@@ -13,10 +13,14 @@ module Fog
13
13
  request :avail_kernels
14
14
  request :avail_linodeplans
15
15
  request :avail_stackscripts
16
+ # request :linode_boot
16
17
  request :linode_create
17
18
  request :linode_delete
18
19
  request :linode_list
19
20
  request :linode_reboot
21
+ # request :linode_resize
22
+ # request :linode_shutdown
23
+ # request :linode_update
20
24
 
21
25
  class Mock
22
26
 
@@ -0,0 +1,80 @@
1
+ module Fog
2
+ module Linode
3
+ class DNS < Fog::Service
4
+
5
+ requires :linode_api_key
6
+ recognizes :port, :scheme, :persistent
7
+
8
+ model_path 'fog/linode/models/dns'
9
+
10
+ request_path 'fog/linode/requests/dns'
11
+ request :domain_create
12
+ request :domain_delete
13
+ request :domain_list
14
+ request :domain_update
15
+ request :domain_resource_create
16
+ request :domain_resource_delete
17
+ request :domain_resource_list
18
+ request :domain_resource_update
19
+
20
+ class Mock
21
+
22
+ def self.data
23
+ @data ||= Hash.new do |hash, key|
24
+ hash[key] = {}
25
+ end
26
+ end
27
+
28
+ def self.reset_data(keys=data.keys)
29
+ for key in [*keys]
30
+ data.delete(key)
31
+ end
32
+ end
33
+
34
+ def initialize(options={})
35
+ @linode_api_key = options[:linode_api_key]
36
+ @data = self.class.data[@linode_api_key]
37
+ end
38
+
39
+ end
40
+
41
+ class Real
42
+
43
+ def initialize(options={})
44
+ require 'json'
45
+ @linode_api_key = options[:linode_api_key]
46
+ @host = options[:host] || "api.linode.com"
47
+ @port = options[:port] || 443
48
+ @scheme = options[:scheme] || 'https'
49
+ @connection = Fog::Connection.new("#{@scheme}://#{@host}:#{@port}", options[:persistent])
50
+ end
51
+
52
+ def reload
53
+ @connection.reset
54
+ end
55
+
56
+ def request(params)
57
+ params[:query] ||= {}
58
+ params[:query].merge!(:api_key => @linode_api_key)
59
+
60
+ response = @connection.request(params.merge!({:host => @host}))
61
+
62
+ unless response.body.empty?
63
+ response.body = JSON.parse(response.body)
64
+ if data = response.body['ERRORARRAY'].first
65
+ error = case data['ERRORCODE']
66
+ when 5
67
+ Fog::Linode::DNS::NotFound
68
+ else
69
+ Fog::Linode::DNS::Error
70
+ end
71
+ raise error.new(data['ERRORMESSAGE'])
72
+ end
73
+ end
74
+ response
75
+ end
76
+
77
+ end
78
+ end
79
+ end
80
+ end