fog 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/.document +5 -0
- data/.gitignore +6 -0
- data/LICENSE +20 -0
- data/README.rdoc +7 -0
- data/Rakefile +98 -0
- data/VERSION +1 -0
- data/benchs/fog_vs.rb +135 -0
- data/benchs/headers_split_vs_match.rb +18 -0
- data/benchs/params.rb +43 -0
- data/benchs/parse_vs_push.rb +60 -0
- data/benchs/stripping.rb +26 -0
- data/lib/fog.rb +21 -0
- data/lib/fog/aws.rb +145 -0
- data/lib/fog/aws/ec2.rb +173 -0
- data/lib/fog/aws/models/ec2/address.rb +31 -0
- data/lib/fog/aws/models/ec2/addresses.rb +36 -0
- data/lib/fog/aws/models/ec2/key_pair.rb +35 -0
- data/lib/fog/aws/models/ec2/key_pairs.rb +36 -0
- data/lib/fog/aws/models/ec2/volume.rb +47 -0
- data/lib/fog/aws/models/ec2/volumes.rb +36 -0
- data/lib/fog/aws/models/s3/bucket.rb +77 -0
- data/lib/fog/aws/models/s3/buckets.rb +83 -0
- data/lib/fog/aws/models/s3/object.rb +76 -0
- data/lib/fog/aws/models/s3/objects.rb +97 -0
- data/lib/fog/aws/models/s3/owner.rb +18 -0
- data/lib/fog/aws/parsers/ec2/allocate_address.rb +19 -0
- data/lib/fog/aws/parsers/ec2/attach_volume.rb +22 -0
- data/lib/fog/aws/parsers/ec2/basic.rb +25 -0
- data/lib/fog/aws/parsers/ec2/create_key_pair.rb +20 -0
- data/lib/fog/aws/parsers/ec2/create_snapshot.rb +22 -0
- data/lib/fog/aws/parsers/ec2/create_volume.rb +24 -0
- data/lib/fog/aws/parsers/ec2/describe_addresses.rb +30 -0
- data/lib/fog/aws/parsers/ec2/describe_availability_zones.rb +30 -0
- data/lib/fog/aws/parsers/ec2/describe_images.rb +49 -0
- data/lib/fog/aws/parsers/ec2/describe_instances.rb +73 -0
- data/lib/fog/aws/parsers/ec2/describe_key_pairs.rb +30 -0
- data/lib/fog/aws/parsers/ec2/describe_regions.rb +30 -0
- data/lib/fog/aws/parsers/ec2/describe_security_groups.rb +75 -0
- data/lib/fog/aws/parsers/ec2/describe_snapshots.rb +30 -0
- data/lib/fog/aws/parsers/ec2/describe_volumes.rb +57 -0
- data/lib/fog/aws/parsers/ec2/detach_volume.rb +22 -0
- data/lib/fog/aws/parsers/ec2/get_console_output.rb +28 -0
- data/lib/fog/aws/parsers/ec2/run_instances.rb +65 -0
- data/lib/fog/aws/parsers/ec2/terminate_instances.rb +55 -0
- data/lib/fog/aws/parsers/s3/copy_object.rb +22 -0
- data/lib/fog/aws/parsers/s3/get_bucket.rb +46 -0
- data/lib/fog/aws/parsers/s3/get_bucket_location.rb +20 -0
- data/lib/fog/aws/parsers/s3/get_request_payment.rb +20 -0
- data/lib/fog/aws/parsers/s3/get_service.rb +32 -0
- data/lib/fog/aws/parsers/simpledb/basic.rb +31 -0
- data/lib/fog/aws/parsers/simpledb/domain_metadata.rb +30 -0
- data/lib/fog/aws/parsers/simpledb/get_attributes.rb +34 -0
- data/lib/fog/aws/parsers/simpledb/list_domains.rb +28 -0
- data/lib/fog/aws/parsers/simpledb/select.rb +39 -0
- data/lib/fog/aws/requests/ec2/allocate_address.rb +50 -0
- data/lib/fog/aws/requests/ec2/associate_address.rb +59 -0
- data/lib/fog/aws/requests/ec2/attach_volume.rb +71 -0
- data/lib/fog/aws/requests/ec2/authorize_security_group_ingress.rb +32 -0
- data/lib/fog/aws/requests/ec2/create_key_pair.rb +60 -0
- data/lib/fog/aws/requests/ec2/create_security_group.rb +61 -0
- data/lib/fog/aws/requests/ec2/create_snapshot.rb +65 -0
- data/lib/fog/aws/requests/ec2/create_volume.rb +66 -0
- data/lib/fog/aws/requests/ec2/delete_key_pair.rb +49 -0
- data/lib/fog/aws/requests/ec2/delete_security_group.rb +52 -0
- data/lib/fog/aws/requests/ec2/delete_snapshot.rb +53 -0
- data/lib/fog/aws/requests/ec2/delete_volume.rb +55 -0
- data/lib/fog/aws/requests/ec2/describe_addresses.rb +61 -0
- data/lib/fog/aws/requests/ec2/describe_availability_zones.rb +64 -0
- data/lib/fog/aws/requests/ec2/describe_images.rb +41 -0
- data/lib/fog/aws/requests/ec2/describe_instances.rb +114 -0
- data/lib/fog/aws/requests/ec2/describe_key_pairs.rb +63 -0
- data/lib/fog/aws/requests/ec2/describe_regions.rb +61 -0
- data/lib/fog/aws/requests/ec2/describe_security_groups.rb +71 -0
- data/lib/fog/aws/requests/ec2/describe_snapshots.rb +78 -0
- data/lib/fog/aws/requests/ec2/describe_volumes.rb +85 -0
- data/lib/fog/aws/requests/ec2/detach_volume.rb +62 -0
- data/lib/fog/aws/requests/ec2/disassociate_address.rb +55 -0
- data/lib/fog/aws/requests/ec2/get_console_output.rb +26 -0
- data/lib/fog/aws/requests/ec2/reboot_instances.rb +24 -0
- data/lib/fog/aws/requests/ec2/release_address.rb +50 -0
- data/lib/fog/aws/requests/ec2/revoke_security_group_ingress.rb +32 -0
- data/lib/fog/aws/requests/ec2/run_instances.rb +134 -0
- data/lib/fog/aws/requests/ec2/terminate_instances.rb +80 -0
- data/lib/fog/aws/requests/s3/copy_object.rb +79 -0
- data/lib/fog/aws/requests/s3/delete_bucket.rb +53 -0
- data/lib/fog/aws/requests/s3/delete_object.rb +52 -0
- data/lib/fog/aws/requests/s3/get_bucket.rb +100 -0
- data/lib/fog/aws/requests/s3/get_bucket_location.rb +53 -0
- data/lib/fog/aws/requests/s3/get_object.rb +82 -0
- data/lib/fog/aws/requests/s3/get_request_payment.rb +53 -0
- data/lib/fog/aws/requests/s3/get_service.rb +58 -0
- data/lib/fog/aws/requests/s3/head_object.rb +61 -0
- data/lib/fog/aws/requests/s3/put_bucket.rb +69 -0
- data/lib/fog/aws/requests/s3/put_object.rb +76 -0
- data/lib/fog/aws/requests/s3/put_request_payment.rb +56 -0
- data/lib/fog/aws/requests/simpledb/batch_put_attributes.rb +31 -0
- data/lib/fog/aws/requests/simpledb/create_domain.rb +25 -0
- data/lib/fog/aws/requests/simpledb/delete_attributes.rb +34 -0
- data/lib/fog/aws/requests/simpledb/delete_domain.rb +25 -0
- data/lib/fog/aws/requests/simpledb/domain_metadata.rb +30 -0
- data/lib/fog/aws/requests/simpledb/get_attributes.rb +35 -0
- data/lib/fog/aws/requests/simpledb/list_domains.rb +30 -0
- data/lib/fog/aws/requests/simpledb/put_attributes.rb +29 -0
- data/lib/fog/aws/requests/simpledb/select.rb +29 -0
- data/lib/fog/aws/s3.rb +157 -0
- data/lib/fog/aws/simpledb.rb +157 -0
- data/lib/fog/collection.rb +77 -0
- data/lib/fog/connection.rb +130 -0
- data/lib/fog/errors.rb +145 -0
- data/lib/fog/model.rb +72 -0
- data/lib/fog/parser.rb +30 -0
- data/lib/fog/response.rb +12 -0
- data/spec/aws/models/s3/bucket_spec.rb +130 -0
- data/spec/aws/models/s3/buckets_spec.rb +79 -0
- data/spec/aws/models/s3/object_spec.rb +121 -0
- data/spec/aws/models/s3/objects_spec.rb +112 -0
- data/spec/aws/models/s3/owner_spec.rb +18 -0
- data/spec/aws/requests/ec2/allocate_address_spec.rb +18 -0
- data/spec/aws/requests/ec2/associate_address_spec.rb +42 -0
- data/spec/aws/requests/ec2/attach_volume_spec.rb +53 -0
- data/spec/aws/requests/ec2/authorize_security_group_ingress_spec.rb +26 -0
- data/spec/aws/requests/ec2/create_key_pair_spec.rb +36 -0
- data/spec/aws/requests/ec2/create_security_group_spec.rb +34 -0
- data/spec/aws/requests/ec2/create_snapshot_spec.rb +37 -0
- data/spec/aws/requests/ec2/create_volume_spec.rb +23 -0
- data/spec/aws/requests/ec2/delete_key_pair_spec.rb +21 -0
- data/spec/aws/requests/ec2/delete_security_group_spec.rb +26 -0
- data/spec/aws/requests/ec2/delete_snapshot_spec.rb +35 -0
- data/spec/aws/requests/ec2/delete_volume_spec.rb +26 -0
- data/spec/aws/requests/ec2/describe_addresses_spec.rb +38 -0
- data/spec/aws/requests/ec2/describe_availability_zones_spec.rb +23 -0
- data/spec/aws/requests/ec2/describe_images_spec.rb +39 -0
- data/spec/aws/requests/ec2/describe_instances_spec.rb +86 -0
- data/spec/aws/requests/ec2/describe_key_pairs_spec.rb +42 -0
- data/spec/aws/requests/ec2/describe_regions_spec.rb +21 -0
- data/spec/aws/requests/ec2/describe_security_groups_spec.rb +51 -0
- data/spec/aws/requests/ec2/describe_snapshots_spec.rb +54 -0
- data/spec/aws/requests/ec2/describe_volumes_spec.rb +50 -0
- data/spec/aws/requests/ec2/detach_volume_spec.rb +43 -0
- data/spec/aws/requests/ec2/disassociate_address_spec.rb +35 -0
- data/spec/aws/requests/ec2/get_console_output_spec.rb +23 -0
- data/spec/aws/requests/ec2/reboot_instances_spec.rb +21 -0
- data/spec/aws/requests/ec2/release_address_spec.rb +26 -0
- data/spec/aws/requests/ec2/revoke_security_group_ingress_spec.rb +32 -0
- data/spec/aws/requests/ec2/run_instances_spec.rb +41 -0
- data/spec/aws/requests/ec2/terminate_instances_spec.rb +35 -0
- data/spec/aws/requests/s3/copy_object_spec.rb +62 -0
- data/spec/aws/requests/s3/delete_bucket_spec.rb +36 -0
- data/spec/aws/requests/s3/delete_object_spec.rb +37 -0
- data/spec/aws/requests/s3/get_bucket_location_spec.rb +30 -0
- data/spec/aws/requests/s3/get_bucket_spec.rb +110 -0
- data/spec/aws/requests/s3/get_object_spec.rb +45 -0
- data/spec/aws/requests/s3/get_request_payment_spec.rb +30 -0
- data/spec/aws/requests/s3/get_service_spec.rb +33 -0
- data/spec/aws/requests/s3/head_object_spec.rb +28 -0
- data/spec/aws/requests/s3/put_bucket_spec.rb +19 -0
- data/spec/aws/requests/s3/put_object_spec.rb +38 -0
- data/spec/aws/requests/s3/put_request_payment_spec.rb +29 -0
- data/spec/aws/requests/simpledb/batch_put_attributes_spec.rb +22 -0
- data/spec/aws/requests/simpledb/create_domain_spec.rb +21 -0
- data/spec/aws/requests/simpledb/delete_attributes_spec.rb +22 -0
- data/spec/aws/requests/simpledb/delete_domain_spec.rb +21 -0
- data/spec/aws/requests/simpledb/domain_metadata_spec.rb +43 -0
- data/spec/aws/requests/simpledb/get_attributes_spec.rb +31 -0
- data/spec/aws/requests/simpledb/list_domains_spec.rb +30 -0
- data/spec/aws/requests/simpledb/put_attributes_spec.rb +22 -0
- data/spec/aws/requests/simpledb/select_spec.rb +9 -0
- data/spec/lorem.txt +1 -0
- data/spec/spec.opts +1 -0
- data/spec/spec_helper.rb +66 -0
- metadata +309 -0
@@ -0,0 +1,130 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'openssl'
|
3
|
+
require 'socket'
|
4
|
+
require 'uri'
|
5
|
+
|
6
|
+
require "#{File.dirname(__FILE__)}/errors"
|
7
|
+
require "#{File.dirname(__FILE__)}/response"
|
8
|
+
|
9
|
+
unless Fog.mocking?
|
10
|
+
|
11
|
+
module Fog
|
12
|
+
class Connection
|
13
|
+
|
14
|
+
def initialize(url)
|
15
|
+
@uri = URI.parse(url)
|
16
|
+
@connection = TCPSocket.open(@uri.host, @uri.port)
|
17
|
+
if @uri.scheme == 'https'
|
18
|
+
@ssl_context = OpenSSL::SSL::SSLContext.new
|
19
|
+
@ssl_context.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
20
|
+
@connection = OpenSSL::SSL::SSLSocket.new(@connection, @ssl_context)
|
21
|
+
@connection.sync_close = true
|
22
|
+
@connection.connect
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def request(params)
|
27
|
+
params[:path] ||= ''
|
28
|
+
unless params[:path][0] == '/'
|
29
|
+
params[:path] = '/' + params[:path].to_s
|
30
|
+
end
|
31
|
+
if params[:query] && !params[:query].empty?
|
32
|
+
params[:path] << "?#{params[:query]}"
|
33
|
+
end
|
34
|
+
request = "#{params[:method]} #{params[:path]} HTTP/1.1\r\n"
|
35
|
+
params[:headers] ||= {}
|
36
|
+
params[:headers]['Host'] = params[:host]
|
37
|
+
if params[:body]
|
38
|
+
params[:headers]['Content-Length'] = params[:body].length
|
39
|
+
end
|
40
|
+
for key, value in params[:headers]
|
41
|
+
request << "#{key}: #{value}\r\n"
|
42
|
+
end
|
43
|
+
request << "\r\n#{params[:body]}"
|
44
|
+
@connection.write(request)
|
45
|
+
|
46
|
+
response = Fog::Response.new
|
47
|
+
response.request = params
|
48
|
+
response.status = @connection.readline[9..11].to_i
|
49
|
+
if params[:expects] && params[:expects] != response.status
|
50
|
+
error = true
|
51
|
+
end
|
52
|
+
while true
|
53
|
+
data = @connection.readline.chomp!
|
54
|
+
if data == ""
|
55
|
+
break
|
56
|
+
end
|
57
|
+
header = data.split(': ')
|
58
|
+
response.headers[capitalize(header[0])] = header[1]
|
59
|
+
end
|
60
|
+
|
61
|
+
if error || params[:parser]
|
62
|
+
if error
|
63
|
+
parser = Fog::Errors::Parser.new
|
64
|
+
elsif params[:parser]
|
65
|
+
parser = params[:parser]
|
66
|
+
end
|
67
|
+
body = Nokogiri::XML::SAX::PushParser.new(parser)
|
68
|
+
else
|
69
|
+
body = ''
|
70
|
+
end
|
71
|
+
|
72
|
+
unless params[:method] == 'HEAD'
|
73
|
+
if response.headers['Content-Length']
|
74
|
+
body << @connection.read(response.headers['Content-Length'].to_i)
|
75
|
+
elsif response.headers['Transfer-Encoding'] == 'chunked'
|
76
|
+
while true
|
77
|
+
# 2 == "/r/n".length
|
78
|
+
chunk_size = @connection.readline.chomp!.to_i(16) + 2
|
79
|
+
chunk = @connection.read(chunk_size)
|
80
|
+
body << chunk[0...-2]
|
81
|
+
if chunk_size == 2
|
82
|
+
break
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
if parser
|
89
|
+
body.finish
|
90
|
+
response.body = parser.response
|
91
|
+
else
|
92
|
+
response.body = body
|
93
|
+
end
|
94
|
+
|
95
|
+
if error
|
96
|
+
raise(Fog::Errors.status_error(params[:expects], response.status, response))
|
97
|
+
else
|
98
|
+
response
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
private
|
103
|
+
|
104
|
+
def capitalize(header)
|
105
|
+
words = header.split('-')
|
106
|
+
header = ''
|
107
|
+
for word in words
|
108
|
+
header << word[0..0].upcase << word[1..-1] << '-'
|
109
|
+
end
|
110
|
+
header.chop!
|
111
|
+
end
|
112
|
+
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
else
|
117
|
+
|
118
|
+
module Fog
|
119
|
+
class Connection
|
120
|
+
|
121
|
+
def initialize(url)
|
122
|
+
end
|
123
|
+
|
124
|
+
def request(params)
|
125
|
+
end
|
126
|
+
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
end
|
data/lib/fog/errors.rb
ADDED
@@ -0,0 +1,145 @@
|
|
1
|
+
require "#{File.dirname(__FILE__)}/parser"
|
2
|
+
|
3
|
+
module Fog
|
4
|
+
module Errors
|
5
|
+
class Continue < StandardError; end # 100
|
6
|
+
class SwitchingProtocols < StandardError; end # 101
|
7
|
+
class OK < StandardError; end # 200
|
8
|
+
class Created < StandardError; end # 201
|
9
|
+
class Accepted < StandardError; end # 202
|
10
|
+
class NonAuthoritativeInformation < StandardError; end # 203
|
11
|
+
class NoContent < StandardError; end # 204
|
12
|
+
class ResetContent < StandardError; end # 205
|
13
|
+
class PartialContent < StandardError; end # 206
|
14
|
+
class MultipleChoices < StandardError; end # 300
|
15
|
+
class MovedPermanently < StandardError; end # 301
|
16
|
+
class Found < StandardError; end # 302
|
17
|
+
class SeeOther < StandardError; end # 303
|
18
|
+
class NotModified < StandardError; end # 304
|
19
|
+
class UseProxy < StandardError; end # 305
|
20
|
+
class TemporaryRedirect < StandardError; end # 307
|
21
|
+
class BadRequest < StandardError; end # 400
|
22
|
+
class Unauthorized < StandardError; end # 401
|
23
|
+
class PaymentRequired < StandardError; end # 402
|
24
|
+
class Forbidden < StandardError; end # 403
|
25
|
+
class NotFound < StandardError; end # 404
|
26
|
+
class MethodNotAllowed < StandardError; end # 405
|
27
|
+
class NotAcceptable < StandardError; end #406
|
28
|
+
class ProxyAuthenticationRequired < StandardError; end #407
|
29
|
+
class RequestTimeout < StandardError; end # 408
|
30
|
+
class Conflict < StandardError; end # 409
|
31
|
+
class Gone < StandardError; end # 410
|
32
|
+
class LengthRequired < StandardError; end # 411
|
33
|
+
class PreconditionFailed < StandardError; end # 412
|
34
|
+
class RequestEntityTooLarge < StandardError; end # 412
|
35
|
+
class RequestURITooLong < StandardError; end # 414
|
36
|
+
class UnsupportedMediaType < StandardError; end # 415
|
37
|
+
class RequestedRangeNotSatisfiable < StandardError; end # 416
|
38
|
+
class ExpectationFailed < StandardError; end # 417
|
39
|
+
class InternalServerError < StandardError; end # 500
|
40
|
+
class NotImplemented < StandardError; end # 501
|
41
|
+
class BadGateway < StandardError; end # 502
|
42
|
+
class ServiceUnavailable < StandardError; end # 503
|
43
|
+
class GatewayTimeout < StandardError; end # 504
|
44
|
+
|
45
|
+
# Messages for nicer exceptions, from rfc2616
|
46
|
+
def self.status_error(expected, actual, response)
|
47
|
+
@errors ||= {
|
48
|
+
100 => Fog::Errors::Continue,
|
49
|
+
101 => Fog::Errors::SwitchingProtocols,
|
50
|
+
200 => Fog::Errors::OK,
|
51
|
+
201 => Fog::Errors::Created,
|
52
|
+
202 => Fog::Errors::Accepted,
|
53
|
+
203 => Fog::Errors::NonAuthoritativeInformation,
|
54
|
+
204 => Fog::Errors::NoContent,
|
55
|
+
205 => Fog::Errors::ResetContent,
|
56
|
+
206 => Fog::Errors::PartialContent,
|
57
|
+
300 => Fog::Errors::MultipleChoices,
|
58
|
+
301 => Fog::Errors::MovedPermanently,
|
59
|
+
302 => Fog::Errors::Found,
|
60
|
+
303 => Fog::Errors::SeeOther,
|
61
|
+
304 => Fog::Errors::NotModified,
|
62
|
+
305 => Fog::Errors::UseProxy,
|
63
|
+
307 => Fog::Errors::TemporaryRedirect,
|
64
|
+
400 => Fog::Errors::BadRequest,
|
65
|
+
401 => Fog::Errors::Unauthorized,
|
66
|
+
402 => Fog::Errors::PaymentRequired,
|
67
|
+
403 => Fog::Errors::Forbidden,
|
68
|
+
404 => Fog::Errors::NotFound,
|
69
|
+
405 => Fog::Errors::MethodNotAllowed,
|
70
|
+
406 => Fog::Errors::NotAcceptable,
|
71
|
+
407 => Fog::Errors::ProxyAuthenticationRequired,
|
72
|
+
408 => Fog::Errors::RequestTimeout,
|
73
|
+
409 => Fog::Errors::Conflict,
|
74
|
+
410 => Fog::Errors::Gone,
|
75
|
+
411 => Fog::Errors::LengthRequired,
|
76
|
+
412 => Fog::Errors::PreconditionFailed,
|
77
|
+
413 => Fog::Errors::RequestEntityTooLarge,
|
78
|
+
414 => Fog::Errors::RequestURITooLong,
|
79
|
+
415 => Fog::Errors::UnsupportedMediaType,
|
80
|
+
416 => Fog::Errors::RequestedRangeNotSatisfiable,
|
81
|
+
417 => Fog::Errors::ExpectationFailed,
|
82
|
+
500 => Fog::Errors::InternalServerError,
|
83
|
+
501 => Fog::Errors::NotImplemented,
|
84
|
+
502 => Fog::Errors::BadGateway,
|
85
|
+
503 => Fog::Errors::ServiceUnavailable,
|
86
|
+
504 => Fog::Errors::GatewayTimeout
|
87
|
+
}
|
88
|
+
@messages ||= {
|
89
|
+
100 => 'Continue',
|
90
|
+
101 => 'Switching Protocols',
|
91
|
+
200 => 'OK',
|
92
|
+
201 =>'Created',
|
93
|
+
202 => 'Accepted',
|
94
|
+
203 => 'Non-Authoritative Information',
|
95
|
+
204 => 'No Content',
|
96
|
+
205 => 'Reset Content',
|
97
|
+
206 => 'Partial Content',
|
98
|
+
300 => 'Multiple Choices',
|
99
|
+
301 => 'Moved Permanently',
|
100
|
+
302 => 'Found',
|
101
|
+
303 => 'See Other',
|
102
|
+
304 => 'Not Modified',
|
103
|
+
305 => 'Use Proxy',
|
104
|
+
307 => 'Temporary Redirect',
|
105
|
+
400 => 'Bad Request',
|
106
|
+
401 => 'Unauthorized',
|
107
|
+
402 => 'Payment Required',
|
108
|
+
403 => 'Forbidden',
|
109
|
+
404 => 'Not Found',
|
110
|
+
405 => 'Method Not Allowed',
|
111
|
+
406 => 'Not Acceptable',
|
112
|
+
407 => 'Proxy Authentication Required',
|
113
|
+
408 => 'Request Timeout',
|
114
|
+
409 => 'Conflict',
|
115
|
+
410 => 'Gone',
|
116
|
+
411 => 'Length Required',
|
117
|
+
412 => 'Precondition Failed',
|
118
|
+
413 => 'Request Entity Too Large',
|
119
|
+
414 => 'Request-URI Too Long',
|
120
|
+
415 => 'Unsupported Media Type',
|
121
|
+
416 => 'Requested Range Not Satisfiable',
|
122
|
+
417 => 'Expectation Failed',
|
123
|
+
500 => 'Internal Server Error',
|
124
|
+
501 => 'Not Implemented',
|
125
|
+
502 => 'Bad Gateway',
|
126
|
+
503 => 'Service Unavailable',
|
127
|
+
504 => 'Gateway Timeout'
|
128
|
+
}
|
129
|
+
response = "#{response.body['Code']} => #{response.body['Message']}"
|
130
|
+
@errors[actual].new("Expected(#{expected} #{@messages[expected]}) <=> Actual(#{actual} #{@messages[actual]}): #{response}")
|
131
|
+
end
|
132
|
+
|
133
|
+
class Parser < Fog::Parsers::Base
|
134
|
+
|
135
|
+
def end_element(name)
|
136
|
+
case name
|
137
|
+
when 'Code', 'Message'
|
138
|
+
@response[name] = @value
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
end
|
143
|
+
|
144
|
+
end
|
145
|
+
end
|
data/lib/fog/model.rb
ADDED
@@ -0,0 +1,72 @@
|
|
1
|
+
module Fog
|
2
|
+
class Model
|
3
|
+
|
4
|
+
def self.attribute(name, other_names = [])
|
5
|
+
class_eval <<-EOS, __FILE__, __LINE__
|
6
|
+
attr_accessor :#{name}
|
7
|
+
EOS
|
8
|
+
attributes << name
|
9
|
+
for other_name in [*other_names]
|
10
|
+
aliases[other_name] = name
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.aliases
|
15
|
+
@aliases ||= {}
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.attributes
|
19
|
+
@attributes ||= []
|
20
|
+
end
|
21
|
+
|
22
|
+
def initialize(new_attributes = {})
|
23
|
+
merge_attributes(new_attributes)
|
24
|
+
end
|
25
|
+
|
26
|
+
def inspect
|
27
|
+
data = "#<#{self.class.name}"
|
28
|
+
for attribute in self.class.attributes
|
29
|
+
data << " #{attribute}=#{send(attribute).inspect}"
|
30
|
+
end
|
31
|
+
data << ">"
|
32
|
+
end
|
33
|
+
|
34
|
+
def attributes
|
35
|
+
attributes = {}
|
36
|
+
for attribute in self.class.attributes
|
37
|
+
attributes[attribute] = send(:"#{attribute}")
|
38
|
+
end
|
39
|
+
attributes
|
40
|
+
end
|
41
|
+
|
42
|
+
def merge_attributes(new_attributes = {})
|
43
|
+
for key, value in new_attributes
|
44
|
+
if aliased_key = self.class.aliases[key]
|
45
|
+
send(:"#{aliased_key}=", value)
|
46
|
+
else
|
47
|
+
send(:"#{key}=", value)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
self
|
51
|
+
end
|
52
|
+
|
53
|
+
private
|
54
|
+
|
55
|
+
def connection=(new_connection)
|
56
|
+
@connection = new_connection
|
57
|
+
end
|
58
|
+
|
59
|
+
def connection
|
60
|
+
@connection
|
61
|
+
end
|
62
|
+
|
63
|
+
def remap_attributes(attributes, mapping)
|
64
|
+
for key, value in mapping
|
65
|
+
if attributes.key?(key)
|
66
|
+
attributes[value] = attributes.delete(key)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
72
|
+
end
|
data/lib/fog/parser.rb
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'base64'
|
3
|
+
require 'nokogiri'
|
4
|
+
require 'time'
|
5
|
+
|
6
|
+
module Fog
|
7
|
+
module Parsers
|
8
|
+
class Base < Nokogiri::XML::SAX::Document
|
9
|
+
|
10
|
+
attr_reader :response
|
11
|
+
|
12
|
+
def initialize
|
13
|
+
reset
|
14
|
+
end
|
15
|
+
|
16
|
+
def reset
|
17
|
+
@response = {}
|
18
|
+
end
|
19
|
+
|
20
|
+
def characters(string)
|
21
|
+
@value << string.strip
|
22
|
+
end
|
23
|
+
|
24
|
+
def start_element(name, attrs = [])
|
25
|
+
@value = ''
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
data/lib/fog/response.rb
ADDED
@@ -0,0 +1,130 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../../spec_helper'
|
2
|
+
|
3
|
+
describe 'Fog::AWS::S3::Bucket' do
|
4
|
+
|
5
|
+
describe "#initialize" do
|
6
|
+
|
7
|
+
it "should remap attributes from parser" do
|
8
|
+
now = Time.now
|
9
|
+
bucket = Fog::AWS::S3::Bucket.new(
|
10
|
+
'CreationDate' => now,
|
11
|
+
'Name' => 'bucketname'
|
12
|
+
)
|
13
|
+
bucket.creation_date.should == now
|
14
|
+
bucket.name.should == 'bucketname'
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
|
19
|
+
describe "#buckets" do
|
20
|
+
|
21
|
+
it "should return a Fog::AWS::S3::Buckets" do
|
22
|
+
s3.buckets.new.buckets.should be_a(Fog::AWS::S3::Buckets)
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should be the buckets the bucket is related to" do
|
26
|
+
buckets = s3.buckets
|
27
|
+
buckets.new.buckets.should == buckets
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
|
32
|
+
describe "#destroy" do
|
33
|
+
|
34
|
+
it "should return true if the bucket is deleted" do
|
35
|
+
bucket = s3.buckets.create(:name => 'fogmodelbucket')
|
36
|
+
bucket.destroy.should be_true
|
37
|
+
end
|
38
|
+
|
39
|
+
it "should return false if the bucket does not exist" do
|
40
|
+
bucket = s3.buckets.new(:name => 'fogmodelbucket')
|
41
|
+
bucket.destroy.should be_false
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
|
46
|
+
describe "#location" do
|
47
|
+
|
48
|
+
it "should return the location constraint" do
|
49
|
+
bucket = s3.buckets.create(:name => 'fogmodeleubucket', :location => 'EU')
|
50
|
+
bucket.location.should == 'EU'
|
51
|
+
eu_s3.buckets.new(:name => 'fogmodeleubucket').destroy
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
|
56
|
+
describe "#objects" do
|
57
|
+
|
58
|
+
it "should return a Fog::AWS::S3::Objects" do
|
59
|
+
bucket = s3.buckets.new(:name => 'fogmodelbucket')
|
60
|
+
bucket.objects.should be_an(Fog::AWS::S3::Objects)
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
64
|
+
|
65
|
+
describe "#payer" do
|
66
|
+
|
67
|
+
it "should return the request payment value" do
|
68
|
+
bucket = s3.buckets.create(:name => 'fogmodelbucket')
|
69
|
+
bucket.payer.should == 'BucketOwner'
|
70
|
+
bucket.destroy.should be_true
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
74
|
+
|
75
|
+
describe "#payer=" do
|
76
|
+
|
77
|
+
it "should set the request payment value" do
|
78
|
+
bucket = s3.buckets.create(:name => 'fogmodelbucket')
|
79
|
+
(bucket.payer = 'Requester').should == 'Requester'
|
80
|
+
bucket.destroy.should
|
81
|
+
end
|
82
|
+
|
83
|
+
end
|
84
|
+
|
85
|
+
describe "#reload" do
|
86
|
+
|
87
|
+
before(:each) do
|
88
|
+
@bucket = s3.buckets.create(:name => 'fogmodelbucket')
|
89
|
+
@reloaded = @bucket.reload
|
90
|
+
end
|
91
|
+
|
92
|
+
after(:each) do
|
93
|
+
@bucket.destroy
|
94
|
+
end
|
95
|
+
|
96
|
+
it "should return a Fog::AWS::S3::Bucket" do
|
97
|
+
@reloaded.should be_a(Fog::AWS::S3::Bucket)
|
98
|
+
end
|
99
|
+
|
100
|
+
it "should reset attributes to remote state" do
|
101
|
+
@bucket.creation_date = Time.now
|
102
|
+
@bucket.attributes.should == @reloaded.attributes
|
103
|
+
end
|
104
|
+
|
105
|
+
end
|
106
|
+
|
107
|
+
describe "#save" do
|
108
|
+
|
109
|
+
before(:each) do
|
110
|
+
@bucket = s3.buckets.new(:name => 'fogmodelbucket')
|
111
|
+
end
|
112
|
+
|
113
|
+
it "should return true when it succeeds" do
|
114
|
+
@bucket.save.should be_true
|
115
|
+
@bucket.destroy
|
116
|
+
end
|
117
|
+
|
118
|
+
it "should not exist in buckets before save" do
|
119
|
+
@bucket.buckets.key?(@bucket.name).should be_false
|
120
|
+
end
|
121
|
+
|
122
|
+
it "should exist in buckets after save" do
|
123
|
+
@bucket.save
|
124
|
+
@bucket.buckets.key?(@bucket.name).should be_true
|
125
|
+
@bucket.destroy
|
126
|
+
end
|
127
|
+
|
128
|
+
end
|
129
|
+
|
130
|
+
end
|