fog 1.40.0 → 1.41.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 (188) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +3 -0
  3. data/CHANGELOG.md +30 -0
  4. data/fog.gemspec +6 -4
  5. data/lib/fog/ovirt/compute.rb +2 -0
  6. data/lib/fog/ovirt/models/compute/server.rb +7 -2
  7. data/lib/fog/ovirt/requests/compute/activate_volume.rb +22 -0
  8. data/lib/fog/ovirt/requests/compute/deactivate_volume.rb +22 -0
  9. data/lib/fog/version.rb +1 -1
  10. data/lib/tasks/changelog_task.rb +2 -1
  11. data/tests/compute/helper.rb +0 -3
  12. data/tests/helpers/mock_helper.rb +0 -2
  13. data/tests/storage/helper.rb +0 -3
  14. metadata +49 -224
  15. data/lib/fog/bin/internet_archive.rb +0 -32
  16. data/lib/fog/bin/joyent.rb +0 -33
  17. data/lib/fog/internet_archive.rb +0 -1
  18. data/lib/fog/internet_archive/core.rb +0 -291
  19. data/lib/fog/internet_archive/models/storage/directories.rb +0 -39
  20. data/lib/fog/internet_archive/models/storage/directory.rb +0 -105
  21. data/lib/fog/internet_archive/models/storage/file.rb +0 -254
  22. data/lib/fog/internet_archive/models/storage/files.rb +0 -119
  23. data/lib/fog/internet_archive/models/storage/ia_attributes.rb +0 -36
  24. data/lib/fog/internet_archive/parsers/storage/access_control_list.rb +0 -42
  25. data/lib/fog/internet_archive/parsers/storage/complete_multipart_upload.rb +0 -20
  26. data/lib/fog/internet_archive/parsers/storage/copy_object.rb +0 -18
  27. data/lib/fog/internet_archive/parsers/storage/cors_configuration.rb +0 -38
  28. data/lib/fog/internet_archive/parsers/storage/delete_multiple_objects.rb +0 -45
  29. data/lib/fog/internet_archive/parsers/storage/get_bucket.rb +0 -58
  30. data/lib/fog/internet_archive/parsers/storage/get_bucket_lifecycle.rb +0 -64
  31. data/lib/fog/internet_archive/parsers/storage/get_bucket_location.rb +0 -16
  32. data/lib/fog/internet_archive/parsers/storage/get_bucket_logging.rb +0 -36
  33. data/lib/fog/internet_archive/parsers/storage/get_bucket_website.rb +0 -22
  34. data/lib/fog/internet_archive/parsers/storage/get_request_payment.rb +0 -16
  35. data/lib/fog/internet_archive/parsers/storage/get_service.rb +0 -28
  36. data/lib/fog/internet_archive/parsers/storage/initiate_multipart_upload.rb +0 -20
  37. data/lib/fog/internet_archive/parsers/storage/list_multipart_uploads.rb +0 -52
  38. data/lib/fog/internet_archive/parsers/storage/list_parts.rb +0 -36
  39. data/lib/fog/internet_archive/requests/storage/abort_multipart_upload.rb +0 -27
  40. data/lib/fog/internet_archive/requests/storage/acl_utils.rb +0 -60
  41. data/lib/fog/internet_archive/requests/storage/complete_multipart_upload.rb +0 -46
  42. data/lib/fog/internet_archive/requests/storage/copy_object.rb +0 -77
  43. data/lib/fog/internet_archive/requests/storage/cors_utils.rb +0 -39
  44. data/lib/fog/internet_archive/requests/storage/delete_bucket.rb +0 -42
  45. data/lib/fog/internet_archive/requests/storage/delete_bucket_cors.rb +0 -26
  46. data/lib/fog/internet_archive/requests/storage/delete_bucket_lifecycle.rb +0 -26
  47. data/lib/fog/internet_archive/requests/storage/delete_bucket_policy.rb +0 -26
  48. data/lib/fog/internet_archive/requests/storage/delete_bucket_website.rb +0 -26
  49. data/lib/fog/internet_archive/requests/storage/delete_multiple_objects.rb +0 -88
  50. data/lib/fog/internet_archive/requests/storage/delete_object.rb +0 -46
  51. data/lib/fog/internet_archive/requests/storage/get_bucket.rb +0 -108
  52. data/lib/fog/internet_archive/requests/storage/get_bucket_acl.rb +0 -65
  53. data/lib/fog/internet_archive/requests/storage/get_bucket_cors.rb +0 -61
  54. data/lib/fog/internet_archive/requests/storage/get_bucket_lifecycle.rb +0 -35
  55. data/lib/fog/internet_archive/requests/storage/get_bucket_location.rb +0 -54
  56. data/lib/fog/internet_archive/requests/storage/get_bucket_logging.rb +0 -45
  57. data/lib/fog/internet_archive/requests/storage/get_bucket_policy.rb +0 -31
  58. data/lib/fog/internet_archive/requests/storage/get_bucket_website.rb +0 -38
  59. data/lib/fog/internet_archive/requests/storage/get_object.rb +0 -163
  60. data/lib/fog/internet_archive/requests/storage/get_object_acl.rb +0 -72
  61. data/lib/fog/internet_archive/requests/storage/get_object_http_url.rb +0 -48
  62. data/lib/fog/internet_archive/requests/storage/get_object_https_url.rb +0 -30
  63. data/lib/fog/internet_archive/requests/storage/get_object_torrent.rb +0 -45
  64. data/lib/fog/internet_archive/requests/storage/get_object_url.rb +0 -49
  65. data/lib/fog/internet_archive/requests/storage/get_request_payment.rb +0 -45
  66. data/lib/fog/internet_archive/requests/storage/get_service.rb +0 -50
  67. data/lib/fog/internet_archive/requests/storage/head_object.rb +0 -57
  68. data/lib/fog/internet_archive/requests/storage/initiate_multipart_upload.rb +0 -42
  69. data/lib/fog/internet_archive/requests/storage/list_multipart_uploads.rb +0 -52
  70. data/lib/fog/internet_archive/requests/storage/list_parts.rb +0 -53
  71. data/lib/fog/internet_archive/requests/storage/post_object_hidden_fields.rb +0 -36
  72. data/lib/fog/internet_archive/requests/storage/put_bucket.rb +0 -70
  73. data/lib/fog/internet_archive/requests/storage/put_bucket_acl.rb +0 -69
  74. data/lib/fog/internet_archive/requests/storage/put_bucket_cors.rb +0 -47
  75. data/lib/fog/internet_archive/requests/storage/put_bucket_lifecycle.rb +0 -76
  76. data/lib/fog/internet_archive/requests/storage/put_bucket_logging.rb +0 -79
  77. data/lib/fog/internet_archive/requests/storage/put_bucket_policy.rb +0 -25
  78. data/lib/fog/internet_archive/requests/storage/put_bucket_website.rb +0 -59
  79. data/lib/fog/internet_archive/requests/storage/put_object.rb +0 -94
  80. data/lib/fog/internet_archive/requests/storage/put_object_acl.rb +0 -73
  81. data/lib/fog/internet_archive/requests/storage/put_object_url.rb +0 -43
  82. data/lib/fog/internet_archive/requests/storage/put_request_payment.rb +0 -45
  83. data/lib/fog/internet_archive/requests/storage/sync_clock.rb +0 -24
  84. data/lib/fog/internet_archive/requests/storage/upload_part.rb +0 -39
  85. data/lib/fog/internet_archive/signaturev4.rb +0 -71
  86. data/lib/fog/internet_archive/storage.rb +0 -381
  87. data/lib/fog/joyent.rb +0 -12
  88. data/lib/fog/joyent/analytics.rb +0 -310
  89. data/lib/fog/joyent/compute.rb +0 -272
  90. data/lib/fog/joyent/core.rb +0 -10
  91. data/lib/fog/joyent/errors.rb +0 -91
  92. data/lib/fog/joyent/models/analytics/field.rb +0 -13
  93. data/lib/fog/joyent/models/analytics/fields.rb +0 -24
  94. data/lib/fog/joyent/models/analytics/instrumentation.rb +0 -82
  95. data/lib/fog/joyent/models/analytics/instrumentations.rb +0 -23
  96. data/lib/fog/joyent/models/analytics/joyent_module.rb +0 -13
  97. data/lib/fog/joyent/models/analytics/joyent_modules.rb +0 -24
  98. data/lib/fog/joyent/models/analytics/metric.rb +0 -17
  99. data/lib/fog/joyent/models/analytics/metrics.rb +0 -16
  100. data/lib/fog/joyent/models/analytics/transformation.rb +0 -13
  101. data/lib/fog/joyent/models/analytics/transformations.rb +0 -24
  102. data/lib/fog/joyent/models/analytics/type.rb +0 -16
  103. data/lib/fog/joyent/models/analytics/types.rb +0 -24
  104. data/lib/fog/joyent/models/analytics/value.rb +0 -20
  105. data/lib/fog/joyent/models/compute/datacenter.rb +0 -11
  106. data/lib/fog/joyent/models/compute/datacenters.rb +0 -21
  107. data/lib/fog/joyent/models/compute/flavor.rb +0 -19
  108. data/lib/fog/joyent/models/compute/flavors.rb +0 -21
  109. data/lib/fog/joyent/models/compute/image.rb +0 -26
  110. data/lib/fog/joyent/models/compute/images.rb +0 -30
  111. data/lib/fog/joyent/models/compute/key.rb +0 -19
  112. data/lib/fog/joyent/models/compute/keys.rb +0 -32
  113. data/lib/fog/joyent/models/compute/network.rb +0 -12
  114. data/lib/fog/joyent/models/compute/networks.rb +0 -14
  115. data/lib/fog/joyent/models/compute/server.rb +0 -124
  116. data/lib/fog/joyent/models/compute/servers.rb +0 -35
  117. data/lib/fog/joyent/models/compute/snapshot.rb +0 -44
  118. data/lib/fog/joyent/models/compute/snapshots.rb +0 -35
  119. data/lib/fog/joyent/requests/analytics/create_instrumentation.rb +0 -25
  120. data/lib/fog/joyent/requests/analytics/delete_instrumentation.rb +0 -23
  121. data/lib/fog/joyent/requests/analytics/describe_analytics.rb +0 -26
  122. data/lib/fog/joyent/requests/analytics/get_instrumentation.rb +0 -26
  123. data/lib/fog/joyent/requests/analytics/get_instrumentation_value.rb +0 -30
  124. data/lib/fog/joyent/requests/analytics/list_instrumentations.rb +0 -25
  125. data/lib/fog/joyent/requests/compute/add_machine_tags.rb +0 -19
  126. data/lib/fog/joyent/requests/compute/create_key.rb +0 -54
  127. data/lib/fog/joyent/requests/compute/create_machine.rb +0 -16
  128. data/lib/fog/joyent/requests/compute/create_machine_snapshot.rb +0 -16
  129. data/lib/fog/joyent/requests/compute/delete_all_machine_metadata.rb +0 -16
  130. data/lib/fog/joyent/requests/compute/delete_all_machine_tags.rb +0 -15
  131. data/lib/fog/joyent/requests/compute/delete_key.rb +0 -27
  132. data/lib/fog/joyent/requests/compute/delete_machine.rb +0 -15
  133. data/lib/fog/joyent/requests/compute/delete_machine_metadata.rb +0 -16
  134. data/lib/fog/joyent/requests/compute/delete_machine_snapshot.rb +0 -18
  135. data/lib/fog/joyent/requests/compute/delete_machine_tag.rb +0 -15
  136. data/lib/fog/joyent/requests/compute/get_dataset.rb +0 -27
  137. data/lib/fog/joyent/requests/compute/get_image.rb +0 -28
  138. data/lib/fog/joyent/requests/compute/get_key.rb +0 -29
  139. data/lib/fog/joyent/requests/compute/get_machine.rb +0 -29
  140. data/lib/fog/joyent/requests/compute/get_machine_metadata.rb +0 -24
  141. data/lib/fog/joyent/requests/compute/get_machine_snapshot.rb +0 -15
  142. data/lib/fog/joyent/requests/compute/get_machine_tag.rb +0 -18
  143. data/lib/fog/joyent/requests/compute/get_package.rb +0 -32
  144. data/lib/fog/joyent/requests/compute/list_datacenters.rb +0 -16
  145. data/lib/fog/joyent/requests/compute/list_datasets.rb +0 -24
  146. data/lib/fog/joyent/requests/compute/list_images.rb +0 -25
  147. data/lib/fog/joyent/requests/compute/list_keys.rb +0 -25
  148. data/lib/fog/joyent/requests/compute/list_machine_snapshots.rb +0 -15
  149. data/lib/fog/joyent/requests/compute/list_machine_tags.rb +0 -20
  150. data/lib/fog/joyent/requests/compute/list_machines.rb +0 -26
  151. data/lib/fog/joyent/requests/compute/list_networks.rb +0 -26
  152. data/lib/fog/joyent/requests/compute/list_packages.rb +0 -34
  153. data/lib/fog/joyent/requests/compute/reboot_machine.rb +0 -15
  154. data/lib/fog/joyent/requests/compute/resize_machine.rb +0 -16
  155. data/lib/fog/joyent/requests/compute/start_machine.rb +0 -16
  156. data/lib/fog/joyent/requests/compute/start_machine_from_snapshot.rb +0 -15
  157. data/lib/fog/joyent/requests/compute/stop_machine.rb +0 -16
  158. data/lib/fog/joyent/requests/compute/update_machine_metadata.rb +0 -15
  159. data/spec/fog/bin/internetarchive_spec.rb +0 -10
  160. data/tests/internet_archive/models/storage/directory_tests.rb +0 -42
  161. data/tests/internet_archive/models/storage/file_tests.rb +0 -61
  162. data/tests/internet_archive/models/storage/files_tests.rb +0 -58
  163. data/tests/internet_archive/models/storage/url_tests.rb +0 -28
  164. data/tests/internet_archive/requests/storage/acl_utils_tests.rb +0 -209
  165. data/tests/internet_archive/requests/storage/bucket_tests.rb +0 -324
  166. data/tests/internet_archive/requests/storage/cors_utils_tests.rb +0 -108
  167. data/tests/internet_archive/requests/storage/multipart_upload_tests.rb +0 -132
  168. data/tests/internet_archive/requests/storage/object_tests.rb +0 -166
  169. data/tests/internet_archive/signaturev4_tests.rb +0 -41
  170. data/tests/internet_archive/signed_params_tests.rb +0 -5
  171. data/tests/joyent/models/analytics/field_tests.rb +0 -10
  172. data/tests/joyent/models/analytics/fields_tests.rb +0 -13
  173. data/tests/joyent/models/analytics/instrumentation_tests.rb +0 -13
  174. data/tests/joyent/models/analytics/instrumentations_tests.rb +0 -3
  175. data/tests/joyent/models/analytics/joyent_module_tests.rb +0 -10
  176. data/tests/joyent/models/analytics/joyent_modules_tests.rb +0 -13
  177. data/tests/joyent/models/analytics/metric_tests.rb +0 -10
  178. data/tests/joyent/models/analytics/metrics_tests.rb +0 -20
  179. data/tests/joyent/models/analytics/transformation_tests.rb +0 -10
  180. data/tests/joyent/models/analytics/transformations_tests.rb +0 -13
  181. data/tests/joyent/models/analytics/type_tests.rb +0 -10
  182. data/tests/joyent/models/analytics/types_tests.rb +0 -13
  183. data/tests/joyent/requests/analytics/instrumentation_tests.rb +0 -44
  184. data/tests/joyent/requests/compute/datasets_tests.rb +0 -58
  185. data/tests/joyent/requests/compute/keys_tests.rb +0 -47
  186. data/tests/joyent/requests/compute/machines_tests.rb +0 -66
  187. data/tests/joyent/requests/compute/networks_tests.rb +0 -39
  188. data/tests/joyent/requests/compute/packages_tests.rb +0 -68
@@ -1,12 +0,0 @@
1
- require 'fog/joyent/compute'
2
- require 'fog/joyent/errors'
3
- require 'fog/core'
4
-
5
- module Fog
6
- module Joyent
7
- extend Fog::Provider
8
-
9
- service(:analytics, 'Analytics')
10
- service(:compute, 'Compute')
11
- end
12
- end
@@ -1,310 +0,0 @@
1
- require 'fog/joyent'
2
- require 'fog/joyent/errors'
3
- require 'thread'
4
-
5
- module Fog
6
- module Joyent
7
- class Analytics < Fog::Service
8
- requires :joyent_username
9
-
10
- recognizes :joyent_password
11
- recognizes :joyent_url
12
-
13
- recognizes :joyent_keyname
14
- recognizes :joyent_keyfile
15
- recognizes :joyent_keydata
16
- recognizes :joyent_keyphrase
17
- recognizes :joyent_version
18
- request_path 'fog/joyent/requests/analytics'
19
-
20
- request :describe_analytics
21
- request :list_instrumentations
22
- request :get_instrumentation
23
- request :create_instrumentation
24
- request :delete_instrumentation
25
- request :get_instrumentation_value
26
-
27
- model_path 'fog/joyent/models/analytics'
28
-
29
- collection :joyent_modules
30
- model :joyent_module
31
-
32
- collection :metrics
33
- model :metric
34
-
35
- collection :fields
36
- model :field
37
-
38
- collection :types
39
- model :type
40
-
41
- collection :transformations
42
- model :transformation
43
-
44
- collection :instrumentations
45
- model :instrumentation
46
-
47
- model :value
48
-
49
- class Mock
50
- def self.data
51
- @data ||= Hash.new do |hash, key|
52
- hash[key] =case key
53
- when :instrumentation
54
- { 'module' => "cpu",
55
- 'stat' => "usage",
56
- 'predicate' => {},
57
- 'decomposition' => ["zonename"],
58
- 'value-dimension' => 2,
59
- 'value-arity' => "discrete-decomposition",
60
- 'enabled' => true,
61
- 'retention-time' => 86400,
62
- 'idle-max' => 86400,
63
- 'transformations' => [],
64
- 'nsources' => 3,
65
- 'granularity' => 30,
66
- 'persist-data' => false,
67
- 'crtime' => 1388690982000,
68
- 'value-scope' => "point",
69
- 'id' => "63",
70
- 'uris' =>
71
- [{ "uri" => "/#{@joyent_username}/analytics/instrumentations/63/value/raw",
72
- "name" => "value_raw" }] }
73
- when :values
74
- {
75
- 'value' => { 'zoneid' => 0 },
76
- 'transformations' => {},
77
- 'start_time' => Time.now.utc - 600,
78
- 'duration' => 30,
79
- 'end_time' => Time.now.utc - 570,
80
- 'nsources' => 1,
81
- 'minreporting' => 1,
82
- 'requested_start_time' => Time.now.utc - 600,
83
- 'requested_duration' => 30,
84
- 'requested_end_time' => Time.now.utc - 570
85
- }
86
- when :describe_analytics
87
- {
88
- 'fields' => {
89
- 'zonename' => {
90
- 'label' => 'zone name',
91
- 'type' => 'string'
92
- },
93
- 'pid' => {
94
- 'label' => 'process identifier',
95
- 'type' => 'string'
96
- }
97
- },
98
- 'modules' => {
99
- 'cpu' => {
100
- 'label' => 'CPU'
101
- }
102
- },
103
- 'transformations' => {
104
- 'geolocate' => {
105
- 'label' => 'geolocate IP addresses',
106
- 'fields' => ['raddr'] }
107
- },
108
- 'metrics' => [{
109
- "module" => "cpu",
110
- "stat" => "thread_executions",
111
- "label" => "thread executions",
112
- "interval" => "interval",
113
- "fields" => ["hostname", "zonename", "runtime"],
114
- "unit" => "operations"
115
- }],
116
- 'types' => {
117
- 'string' => {
118
- 'arity' => "discrete",
119
- 'unit' => ""
120
- }
121
- }
122
- }
123
- else
124
- {}
125
- end
126
- end
127
- end
128
-
129
- def data
130
- self.class.data
131
- end
132
-
133
- def initialize(options = {})
134
- @joyent_username = options[:joyent_username]
135
- @joyent_password = options[:joyent_password]
136
- @joyent_url = 'https://us-sw-1.api.joyentcloud.com'
137
- @joyent_version = '~7'
138
- end
139
-
140
- def request(opts)
141
- raise "Not Implemented"
142
- end
143
- end # Mock
144
-
145
- class Real
146
- def initialize(options = {})
147
- @mutex = Mutex.new
148
- @connection_options = options[:connection_options] || {}
149
- @persistent = options[:persistent] || false
150
-
151
- @joyent_url = options[:joyent_url] || 'https://us-sw-1.api.joyentcloud.com'
152
- @joyent_version = options[:joyent_version] || '~7'
153
- @joyent_username = options[:joyent_username]
154
-
155
- unless @joyent_username
156
- raise ArgumentError, "options[:joyent_username] required"
157
- end
158
-
159
- if options[:joyent_keyname]
160
- @joyent_keyname = options[:joyent_keyname]
161
- @joyent_keyphrase = options[:joyent_keyphrase]
162
- @key_manager = Net::SSH::Authentication::KeyManager.new(nil, {
163
- :keys_only => true,
164
- :passphrase => @joyent_keyphrase
165
- })
166
- @header_method = method(:header_for_signature_auth)
167
-
168
- if options[:joyent_keyfile]
169
- if File.exist?(options[:joyent_keyfile])
170
- @joyent_keyfile = options[:joyent_keyfile]
171
- @key_manager.add(@joyent_keyfile)
172
- else
173
- raise ArgumentError, "options[:joyent_keyfile] provided does not exist."
174
- end
175
- elsif options[:joyent_keydata]
176
- if options[:joyent_keydata].to_s.empty?
177
- raise ArgumentError, 'options[:joyent_keydata] must not be blank'
178
- else
179
- @joyent_keydata = options[:joyent_keydata]
180
- @key_manager.add_key_data(@joyent_keydata)
181
- end
182
- end
183
- elsif options[:joyent_password]
184
- @joyent_password = options[:joyent_password]
185
- @header_method = method(:header_for_basic_auth)
186
- else
187
- raise ArgumentError, "Must provide either a joyent_password or joyent_keyname and joyent_keyfile pair"
188
- end
189
-
190
- @connection = Fog::XML::Connection.new(
191
- @joyent_url,
192
- @persistent,
193
- @connection_options
194
- )
195
- end
196
-
197
- def request(opts = {})
198
- opts[:headers] = {
199
- "X-Api-Version" => @joyent_version,
200
- "Content-Type" => "application/json",
201
- "Accept" => "application/json"
202
- }.merge(opts[:headers] || {}).merge(@header_method.call)
203
-
204
- if opts[:body]
205
- opts[:body] = Fog::JSON.encode(opts[:body])
206
- end
207
-
208
- response = @connection.request(opts)
209
- if response.headers["Content-Type"] == "application/json"
210
- response.body = json_decode(response.body)
211
- end
212
-
213
- response
214
- rescue Excon::Errors::HTTPStatusError => e
215
- if e.response.headers["Content-Type"] == "application/json"
216
- e.response.body = json_decode(e.response.body)
217
- end
218
- raise_if_error!(e.request, e.response)
219
- end
220
-
221
- private
222
-
223
- def json_decode(body)
224
- parsed = Fog::JSON.decode(body)
225
- decode_time_attrs(parsed)
226
- end
227
-
228
- def header_for_basic_auth
229
- {
230
- "Authorization" => "Basic #{Base64.encode64("#{@joyent_username}:#{@joyent_password}").delete("\r\n")}"
231
- }
232
- end
233
-
234
- def header_for_signature_auth
235
- date = Time.now.utc.httpdate
236
-
237
- # Force KeyManager to load the key(s)
238
- @mutex.synchronize do
239
- @key_manager.each_identity {}
240
- end
241
-
242
- key = @key_manager.known_identities.keys.first
243
-
244
- sig = if key.kind_of? OpenSSL::PKey::RSA
245
- @key_manager.sign(key, date)[15..-1]
246
- else
247
- key = OpenSSL::PKey::DSA.new(File.read(@joyent_keyfile), @joyent_keyphrase)
248
- key.sign('sha1', date)
249
- end
250
-
251
- key_id = "/#{@joyent_username}/keys/#{@joyent_keyname}"
252
- key_type = key.class.to_s.split('::').last.downcase.to_sym
253
-
254
- unless [:rsa, :dsa].include? key_type
255
- raise Joyent::Errors::Unauthorized.new('Invalid key type -- only rsa or dsa key is supported')
256
- end
257
-
258
- signature = Base64.encode64(sig).delete("\r\n")
259
-
260
- {
261
- "Date" => date,
262
- "Authorization" => "Signature keyId=\"#{key_id}\",algorithm=\"#{key_type}-sha1\" #{signature}"
263
- }
264
- rescue Net::SSH::Authentication::KeyManagerError => e
265
- raise Joyent::Errors::Unauthorized.new('SSH Signing Error: :#{e.message}', e)
266
- end
267
-
268
- def decode_time_attrs(obj)
269
- if obj.kind_of?(Hash)
270
- obj["created"] = Time.parse(obj["created"]) unless obj["created"].nil? or obj["created"] == ''
271
- obj["updated"] = Time.parse(obj["updated"]) unless obj["updated"].nil? or obj["updated"] == ''
272
- elsif obj.kind_of?(Array)
273
- obj.map do |o|
274
- decode_time_attrs(o)
275
- end
276
- end
277
-
278
- obj
279
- end
280
-
281
- def raise_if_error!(request, response)
282
- case response.status
283
- when 401 then
284
- raise Fog::Compute::Joyent::Errors::Unauthorized.new('Invalid credentials were used', request, response)
285
- when 403 then
286
- raise Fog::Compute::Joyent::Errors::Forbidden.new('No permissions to the specified resource', request, response)
287
- when 404 then
288
- raise Fog::Compute::Joyent::Errors::NotFound.new('Requested resource was not found', request, response)
289
- when 405 then
290
- raise Fog::Compute::Joyent::Errors::MethodNotAllowed.new('Method not supported for the given resource', request, response)
291
- when 406 then
292
- raise Fog::Compute::Joyent::Errors::NotAcceptable.new('Try sending a different Accept header', request, response)
293
- when 409 then
294
- raise Fog::Compute::Joyent::Errors::Conflict.new('Most likely invalid or missing parameters', request, response)
295
- when 414 then
296
- raise Fog::Compute::Joyent::Errors::RequestEntityTooLarge.new('You sent too much data', request, response)
297
- when 415 then
298
- raise Fog::Compute::Joyent::Errors::UnsupportedMediaType.new('You encoded your request in a format we don\'t understand', request, response)
299
- when 420 then
300
- raise Fog::Compute::Joyent::Errors::PolicyNotForfilled.new('You are sending too many requests', request, response)
301
- when 449 then
302
- raise Fog::Compute::Joyent::Errors::RetryWith.new('Invalid API Version requested; try with a different API Version', request, response)
303
- when 503 then
304
- raise Fog::Compute::Joyent::Errors::ServiceUnavailable.new('Either there\'s no capacity in this datacenter, or we\'re in a maintenance window', request, response)
305
- end
306
- end
307
- end # Real
308
- end
309
- end
310
- end
@@ -1,272 +0,0 @@
1
- require 'fog/joyent/core'
2
- require 'fog/joyent/errors'
3
-
4
- module Fog
5
- module Compute
6
- class Joyent < Fog::Service
7
- requires :joyent_username
8
-
9
- recognizes :joyent_url
10
-
11
- recognizes :joyent_keyname
12
- recognizes :joyent_keyfile
13
- recognizes :joyent_keydata
14
- recognizes :joyent_keyphrase
15
- recognizes :joyent_version
16
-
17
- secrets :joyent_keydata, :joyent_keyphrase
18
-
19
- model_path 'fog/joyent/models/compute'
20
- request_path 'fog/joyent/requests/compute'
21
-
22
- request :list_datacenters
23
- # request :get_datacenter
24
-
25
- # Datacenters
26
- collection :datacenters
27
- model :datacenter
28
-
29
- # Keys
30
- collection :keys
31
- model :key
32
-
33
- request :list_keys
34
- request :get_key
35
- request :create_key
36
- request :delete_key
37
-
38
- # Images
39
- collection :images
40
- model :image
41
- request :list_datasets
42
- request :get_dataset
43
- request :list_images
44
- request :get_image
45
-
46
- # Flavors
47
- collection :flavors
48
- model :flavor
49
- request :list_packages
50
- request :get_package
51
-
52
- # Servers
53
- collection :servers
54
- model :server
55
- request :list_machines
56
- request :get_machine
57
- request :create_machine
58
- request :start_machine
59
- request :stop_machine
60
- request :reboot_machine
61
- request :resize_machine
62
- request :delete_machine
63
-
64
- # Snapshots
65
- collection :snapshots
66
- model :snapshot
67
- request :create_machine_snapshot
68
- request :start_machine_from_snapshot
69
- request :list_machine_snapshots
70
- request :get_machine_snapshot
71
- request :delete_machine_snapshot
72
- request :update_machine_metadata
73
- request :get_machine_metadata
74
- request :delete_machine_metadata
75
- request :delete_all_machine_metadata
76
-
77
- # MachineTags
78
- request :add_machine_tags
79
- request :list_machine_tags
80
- request :get_machine_tag
81
- request :delete_machine_tag
82
- request :delete_all_machine_tags
83
-
84
- # Networks
85
- collection :networks
86
- model :network
87
- request :list_networks
88
-
89
- class Mock
90
- def self.data
91
- @data ||= Hash.new do |hash, key|
92
- hash[key] = {}
93
- end
94
- end
95
-
96
- def data
97
- self.class.data
98
- end
99
-
100
- def initialize(options = {})
101
- @joyent_username = options[:joyent_username]
102
- end
103
-
104
- def request(opts)
105
- raise "Not Implemented"
106
- end
107
- end # Mock
108
-
109
- class Real
110
- attr_accessor :joyent_version
111
- attr_accessor :joyent_url
112
-
113
- def initialize(options = {})
114
- @connection_options = options[:connection_options] || {}
115
- @persistent = options[:persistent] || false
116
-
117
- @joyent_url = options[:joyent_url] || 'https://us-sw-1.api.joyentcloud.com'
118
- @joyent_version = options[:joyent_version] || '~7'
119
- @joyent_username = options[:joyent_username]
120
-
121
- unless @joyent_username
122
- raise ArgumentError, "options[:joyent_username] required"
123
- end
124
-
125
- if options[:joyent_keyname]
126
- begin
127
- require "net/ssh"
128
- rescue LoadError
129
- Fog::Logger.warning("'net/ssh' missing, please install and try again.")
130
- exit(1)
131
- end
132
- @joyent_keyname = options[:joyent_keyname]
133
- @joyent_keyphrase = options[:joyent_keyphrase]
134
- @key_manager = Net::SSH::Authentication::KeyManager.new(nil, {
135
- :keys_only => true,
136
- :passphrase => @joyent_keyphrase
137
- })
138
-
139
- if options[:joyent_keyfile]
140
- if File.exist?(options[:joyent_keyfile])
141
- @joyent_keyfile = options[:joyent_keyfile]
142
- @key_manager.add(@joyent_keyfile)
143
- else
144
- raise ArgumentError, "options[:joyent_keyfile] provided does not exist."
145
- end
146
- elsif options[:joyent_keydata]
147
- if options[:joyent_keydata].to_s.empty?
148
- raise ArgumentError, 'options[:joyent_keydata] must not be blank'
149
- else
150
- @joyent_keydata = options[:joyent_keydata]
151
- @key_manager.add_key_data(@joyent_keydata)
152
- end
153
- end
154
- else
155
- raise ArgumentError, "Must provide a joyent_keyname and joyent_keyfile pair"
156
- end
157
-
158
- @connection = Fog::XML::Connection.new(
159
- @joyent_url,
160
- @persistent,
161
- @connection_options
162
- )
163
- end
164
-
165
- def request(opts = {})
166
- opts[:headers] = {
167
- "X-Api-Version" => @joyent_version,
168
- "Content-Type" => "application/json",
169
- "Accept" => "application/json"
170
- }.merge(opts[:headers] || {}).merge(header_for_signature_auth)
171
-
172
- if opts[:body]
173
- opts[:body] = Fog::JSON.encode(opts[:body])
174
- end
175
-
176
- response = @connection.request(opts)
177
- if response.headers["Content-Type"] == "application/json"
178
- response.body = json_decode(response.body)
179
- end
180
-
181
- response
182
- rescue Excon::Errors::HTTPStatusError => e
183
- if e.response.headers["Content-Type"] == "application/json"
184
- e.response.body = json_decode(e.response.body)
185
- end
186
- raise_if_error!(e.request, e.response)
187
- end
188
-
189
- private
190
-
191
- def json_decode(body)
192
- parsed = Fog::JSON.decode(body)
193
- decode_time_attrs(parsed)
194
- end
195
-
196
- def header_for_signature_auth
197
- date = Time.now.utc.httpdate
198
-
199
- # Force KeyManager to load the key(s)
200
- @key_manager.each_identity {}
201
-
202
- key = @key_manager.known_identities.keys.first
203
-
204
- sig = if key.kind_of? OpenSSL::PKey::RSA
205
- @key_manager.sign(key, date)[15..-1]
206
- else
207
- key = OpenSSL::PKey::DSA.new(File.read(@joyent_keyfile), @joyent_keyphrase)
208
- key.sign('sha1', date)
209
- end
210
-
211
- key_id = "/#{@joyent_username}/keys/#{@joyent_keyname}"
212
- key_type = key.class.to_s.split('::').last.downcase.to_sym
213
-
214
- unless [:rsa, :dsa].include? key_type
215
- raise Joyent::Errors::Unauthorized.new('Invalid key type -- only rsa or dsa key is supported')
216
- end
217
-
218
- signature = Base64.encode64(sig).delete("\r\n")
219
-
220
- {
221
- "Date" => date,
222
- "Authorization" => "Signature keyId=\"#{key_id}\",algorithm=\"#{key_type}-sha1\" #{signature}"
223
- }
224
- rescue Net::SSH::Authentication::KeyManagerError => e
225
- raise Joyent::Errors::Unauthorized.new('SSH Signing Error: :#{e.message}', e)
226
- end
227
-
228
- def decode_time_attrs(obj)
229
- if obj.kind_of?(Hash)
230
- obj["created"] = Time.parse(obj["created"]) unless obj["created"].nil? or obj["created"] == ''
231
- obj["updated"] = Time.parse(obj["updated"]) unless obj["updated"].nil? or obj["updated"] == ''
232
- elsif obj.kind_of?(Array)
233
- obj.map do |o|
234
- decode_time_attrs(o)
235
- end
236
- end
237
-
238
- obj
239
- end
240
-
241
- def raise_if_error!(request, response)
242
- case response.status
243
- when 400 then
244
- raise Joyent::Errors::BadRequest.new('Bad Request', request, response)
245
- when 401 then
246
- raise Joyent::Errors::Unauthorized.new('Invalid credentials were used', request, response)
247
- when 403 then
248
- raise Joyent::Errors::Forbidden.new('No permissions to the specified resource', request, response)
249
- when 404 then
250
- raise Joyent::Errors::NotFound.new('Requested resource was not found', request, response)
251
- when 405 then
252
- raise Joyent::Errors::MethodNotAllowed.new('Method not supported for the given resource', request, response)
253
- when 406 then
254
- raise Joyent::Errors::NotAcceptable.new('Try sending a different Accept header', request, response)
255
- when 409 then
256
- raise Joyent::Errors::Conflict.new('Most likely invalid or missing parameters', request, response)
257
- when 414 then
258
- raise Joyent::Errors::RequestEntityTooLarge.new('You sent too much data', request, response)
259
- when 415 then
260
- raise Joyent::Errors::UnsupportedMediaType.new('You encoded your request in a format we don\'t understand', request, response)
261
- when 420 then
262
- raise Joyent::Errors::PolicyNotForfilled.new('You are sending too many requests', request, response)
263
- when 449 then
264
- raise Joyent::Errors::RetryWith.new('Invalid API Version requested; try with a different API Version', request, response)
265
- when 503 then
266
- raise Joyent::Errors::ServiceUnavailable.new('Either there\'s no capacity in this datacenter, or we\'re in a maintenance window', request, response)
267
- end
268
- end
269
- end # Real
270
- end
271
- end
272
- end