fog 0.0.91 → 0.0.92
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.
- data/Gemfile +1 -1
- data/Gemfile.lock +39 -39
- data/fog.gemspec +17 -16
- data/lib/fog.rb +1 -1
- data/lib/fog/aws/elb.rb +4 -0
- data/lib/fog/aws/models/ec2/snapshot.rb +3 -0
- data/lib/fog/aws/parsers/ec2/create_snapshot.rb +5 -1
- data/lib/fog/aws/parsers/ec2/describe_snapshots.rb +5 -1
- data/lib/fog/aws/parsers/elb/create_load_balancer.rb +26 -0
- data/lib/fog/aws/parsers/elb/delete_load_balancer.rb +24 -0
- data/lib/fog/aws/parsers/s3/access_control_list.rb +46 -0
- data/lib/fog/aws/requests/ec2/create_snapshot.rb +11 -7
- data/lib/fog/aws/requests/ec2/describe_snapshots.rb +3 -0
- data/lib/fog/aws/requests/ec2/revoke_security_group_ingress.rb +0 -1
- data/lib/fog/aws/requests/ec2/run_instances.rb +0 -2
- data/lib/fog/aws/requests/ec2/terminate_instances.rb +0 -1
- data/lib/fog/aws/requests/elb/create_load_balancer.rb +57 -0
- data/lib/fog/aws/requests/elb/delete_load_balancer.rb +40 -0
- data/lib/fog/aws/requests/s3/copy_object.rb +0 -1
- data/lib/fog/aws/requests/s3/get_bucket.rb +2 -3
- data/lib/fog/aws/requests/s3/get_bucket_acl.rb +53 -0
- data/lib/fog/aws/requests/s3/get_object.rb +1 -31
- data/lib/fog/aws/requests/s3/get_object_acl.rb +58 -0
- data/lib/fog/aws/requests/s3/get_object_torrent.rb +55 -0
- data/lib/fog/aws/requests/s3/get_object_url.rb +54 -0
- data/lib/fog/aws/requests/s3/put_bucket_acl.rb +80 -0
- data/lib/fog/aws/s3.rb +8 -2
- data/lib/fog/collection.rb +1 -1
- data/lib/fog/connection.rb +7 -5
- data/lib/fog/model.rb +5 -2
- data/lib/fog/rackspace/files.rb +2 -2
- data/lib/fog/rackspace/requests/files/get_object.rb +1 -1
- data/lib/fog/terremark/parsers/shared/get_internet_services.rb +2 -2
- data/lib/fog/terremark/parsers/shared/get_node_services.rb +3 -0
- data/lib/fog/terremark/parsers/shared/vapp.rb +33 -3
- data/lib/fog/terremark/requests/shared/delete_internet_service.rb +0 -12
- data/lib/fog/terremark/requests/shared/delete_node_service.rb +0 -12
- data/lib/fog/terremark/requests/shared/delete_vapp.rb +0 -12
- data/lib/fog/terremark/shared.rb +0 -1
- data/spec/aws/models/s3/file_spec.rb +2 -2
- data/spec/aws/models/s3/files_spec.rb +2 -2
- data/spec/aws/requests/ec2/get_console_output_spec.rb +4 -4
- data/spec/aws/requests/s3/get_bucket_spec.rb +9 -9
- data/tests/aws/helper.rb +105 -0
- data/tests/aws/requests/ec2/address_tests.rb +88 -0
- data/tests/aws/requests/ec2/snapshot_tests.rb +50 -0
- data/tests/aws/requests/ec2/volume_tests.rb +84 -0
- data/tests/helper.rb +21 -6
- data/tests/helper_tests.rb +38 -7
- data/tests/rackspace/requests/servers/create_image_tests.rb +1 -1
- data/tests/rackspace/requests/servers/create_server_tests.rb +1 -1
- data/tests/rackspace/requests/servers/delete_image_tests.rb +1 -4
- data/tests/rackspace/requests/servers/delete_server_tests.rb +1 -4
- data/tests/rackspace/requests/servers/get_flavor_details_tests.rb +2 -5
- data/tests/rackspace/requests/servers/get_image_details_tests.rb +2 -5
- data/tests/rackspace/requests/servers/get_server_details_tests.rb +2 -5
- data/tests/rackspace/requests/servers/list_addresses_tests.rb +2 -5
- data/tests/rackspace/requests/servers/list_flavors_detail_tests.rb +1 -1
- data/tests/rackspace/requests/servers/list_flavors_tests.rb +1 -1
- data/tests/rackspace/requests/servers/list_images_detail_tests.rb +1 -1
- data/tests/rackspace/requests/servers/list_images_tests.rb +1 -1
- data/tests/rackspace/requests/servers/list_private_addresses_tests.rb +2 -5
- data/tests/rackspace/requests/servers/list_public_addresses_tests.rb +2 -5
- data/tests/rackspace/requests/servers/list_servers_detail_tests.rb +1 -1
- data/tests/rackspace/requests/servers/list_servers_tests.rb +1 -1
- data/tests/rackspace/requests/servers/reboot_server_tests.rb +1 -4
- data/tests/rackspace/requests/servers/update_server_tests.rb +2 -5
- data/tests/slicehost/requests/create_slice_tests.rb +1 -1
- data/tests/slicehost/requests/delete_slice_tests.rb +1 -4
- data/tests/slicehost/requests/get_backups_tests.rb +1 -2
- data/tests/slicehost/requests/get_flavor_tests.rb +2 -5
- data/tests/slicehost/requests/get_flavors_tests.rb +1 -1
- data/tests/slicehost/requests/get_image_tests.rb +2 -5
- data/tests/slicehost/requests/get_images_tests.rb +1 -1
- data/tests/slicehost/requests/get_slice_tests.rb +2 -5
- data/tests/slicehost/requests/get_slices_tests.rb +1 -1
- data/tests/slicehost/requests/reboot_slice_tests.rb +2 -5
- metadata +19 -18
- data/spec/aws/requests/ec2/allocate_address_spec.rb +0 -18
- data/spec/aws/requests/ec2/associate_address_spec.rb +0 -43
- data/spec/aws/requests/ec2/attach_volume_spec.rb +0 -51
- data/spec/aws/requests/ec2/create_snapshot_spec.rb +0 -36
- data/spec/aws/requests/ec2/create_volume_spec.rb +0 -23
- data/spec/aws/requests/ec2/delete_snapshot_spec.rb +0 -34
- data/spec/aws/requests/ec2/delete_volume_spec.rb +0 -26
- data/spec/aws/requests/ec2/describe_addresses_spec.rb +0 -38
- data/spec/aws/requests/ec2/describe_snapshots_spec.rb +0 -50
- data/spec/aws/requests/ec2/describe_volumes_spec.rb +0 -50
- data/spec/aws/requests/ec2/detach_volume_spec.rb +0 -41
- data/spec/aws/requests/ec2/disassociate_address_spec.rb +0 -36
- data/spec/aws/requests/ec2/release_address_spec.rb +0 -26
|
@@ -33,7 +33,6 @@ module Fog
|
|
|
33
33
|
|
|
34
34
|
class Mock
|
|
35
35
|
|
|
36
|
-
# TODO: handle the GroupName/Source/Source case
|
|
37
36
|
def revoke_security_group_ingress(options = {})
|
|
38
37
|
if options['GroupName'] && options['SourceSecurityGroupName'] && options['SourceSecurityGroupOwnerId']
|
|
39
38
|
raise MockNotImplemented.new("Contributions welcome!")
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
module Fog
|
|
2
|
+
module AWS
|
|
3
|
+
module ELB
|
|
4
|
+
class Real
|
|
5
|
+
|
|
6
|
+
# Create a new Elastic Load Balancer
|
|
7
|
+
#
|
|
8
|
+
# ==== Parameters
|
|
9
|
+
# * availability_zones<~Array> - List of availability zones for the ELB
|
|
10
|
+
# * lb_name<~String> - Name for the new ELB -- must be unique
|
|
11
|
+
# * listeners<~Array> - Array of Hashes describing ELB listeners to assign to the ELB
|
|
12
|
+
# * 'Protocol'<~String> - Protocol to use. Either HTTP or TCP.
|
|
13
|
+
# * 'LoadBalancerPort'<~Integer> - The port that the ELB will listen to for outside traffic
|
|
14
|
+
# * 'InstancePort'<~Integer> - The port on the instance that the ELB will forward traffic to
|
|
15
|
+
# ==== Returns
|
|
16
|
+
# * response<~Excon::Response>:
|
|
17
|
+
# * body<~Hash>:
|
|
18
|
+
# * 'ResponseMetadata'<~Hash>:
|
|
19
|
+
# * 'RequestId'<~String> - Id of request
|
|
20
|
+
# * 'CreateLoadBalancerResult'<~Hash>:
|
|
21
|
+
# * 'DNSName'<~String> - DNS name for the newly created ELB
|
|
22
|
+
def create_load_balancer(availability_zones, lb_name, listeners)
|
|
23
|
+
params = ELB.indexed_param('AvailabilityZones.member', [*availability_zones], 1)
|
|
24
|
+
|
|
25
|
+
listener_protocol = []
|
|
26
|
+
listener_lb_port = []
|
|
27
|
+
listener_instance_port = []
|
|
28
|
+
listeners.each do |listener|
|
|
29
|
+
listener_protocol.push(listener['Protocol'])
|
|
30
|
+
listener_lb_port.push(listener['LoadBalancerPort'])
|
|
31
|
+
listener_instance_port.push(listener['InstancePort'])
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
params.merge!(ELB.indexed_param('Listeners.member.%.Protocol', listener_protocol, 1))
|
|
35
|
+
params.merge!(ELB.indexed_param('Listeners.member.%.LoadBalancerPort', listener_lb_port, 1))
|
|
36
|
+
params.merge!(ELB.indexed_param('Listeners.member.%.InstancePort', listener_instance_port, 1))
|
|
37
|
+
|
|
38
|
+
request({
|
|
39
|
+
'Action' => 'CreateLoadBalancer',
|
|
40
|
+
'LoadBalancerName' => lb_name,
|
|
41
|
+
:parser => Fog::Parsers::AWS::ELB::CreateLoadBalancer.new
|
|
42
|
+
}.merge!(params))
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
class Mock
|
|
48
|
+
|
|
49
|
+
def create_load_balancer(availability_zones, lb_name, listeners)
|
|
50
|
+
raise MockNotImplemented.new("Contributions welcome!")
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
module Fog
|
|
2
|
+
module AWS
|
|
3
|
+
module ELB
|
|
4
|
+
class Real
|
|
5
|
+
|
|
6
|
+
# Delete an existing Elastic Load Balancer
|
|
7
|
+
#
|
|
8
|
+
# Note that this API call, as defined by Amazon, is idempotent.
|
|
9
|
+
# That is, it will not return an error if you try to delete an
|
|
10
|
+
# ELB that does not exist.
|
|
11
|
+
#
|
|
12
|
+
# ==== Parameters
|
|
13
|
+
# * lb_name<~String> - Name of the ELB to be deleted
|
|
14
|
+
# ==== Returns
|
|
15
|
+
# * response<~Excon::Response>:
|
|
16
|
+
# * body<~Hash>:
|
|
17
|
+
# * 'DeleteLoadBalancerResponse'<~nil>
|
|
18
|
+
# * 'ResponseMetadata'<~Hash>:
|
|
19
|
+
# * 'RequestId'<~String> - Id of request
|
|
20
|
+
def delete_load_balancer(lb_name)
|
|
21
|
+
request({
|
|
22
|
+
'Action' => 'DeleteLoadBalancer',
|
|
23
|
+
'LoadBalancerName' => lb_name,
|
|
24
|
+
:parser => Fog::Parsers::AWS::ELB::DeleteLoadBalancer.new
|
|
25
|
+
})
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
class Mock
|
|
31
|
+
|
|
32
|
+
def delete_load_balancer(lb_name)
|
|
33
|
+
raise MockNotImplemented.new("Contributions welcome!")
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
@@ -23,7 +23,6 @@ module Fog
|
|
|
23
23
|
# * 'ETag'<~String> - etag of new object
|
|
24
24
|
# * 'LastModified'<~Time> - date object was last modified
|
|
25
25
|
#
|
|
26
|
-
# TODO: allow specifying new metadata (support all/some of put_object?)
|
|
27
26
|
def copy_object(source_bucket_name, source_object_name, target_bucket_name, target_object_name, options = {})
|
|
28
27
|
headers = { 'x-amz-copy-source' => "/#{source_bucket_name}/#{source_object_name}" }.merge!(options)
|
|
29
28
|
request({
|
|
@@ -57,7 +57,6 @@ module Fog
|
|
|
57
57
|
|
|
58
58
|
class Mock
|
|
59
59
|
|
|
60
|
-
# FIXME: implement delimiter
|
|
61
60
|
def get_bucket(bucket_name, options = {})
|
|
62
61
|
unless bucket_name
|
|
63
62
|
raise ArgumentError.new('bucket_name is required')
|
|
@@ -79,10 +78,10 @@ module Fog
|
|
|
79
78
|
data
|
|
80
79
|
end,
|
|
81
80
|
'IsTruncated' => false,
|
|
82
|
-
'Marker' => options['marker']
|
|
81
|
+
'Marker' => options['marker'],
|
|
83
82
|
'MaxKeys' => options['max-keys'] || 1000,
|
|
84
83
|
'Name' => bucket['Name'],
|
|
85
|
-
'Prefix' => options['prefix']
|
|
84
|
+
'Prefix' => options['prefix']
|
|
86
85
|
}
|
|
87
86
|
if options['max-keys'] && options['max-keys'] < response.body['Contents'].length
|
|
88
87
|
response.body['IsTruncated'] = true
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
module Fog
|
|
2
|
+
module AWS
|
|
3
|
+
module S3
|
|
4
|
+
class Real
|
|
5
|
+
|
|
6
|
+
# Get access control list for an S3 bucket
|
|
7
|
+
#
|
|
8
|
+
# ==== Parameters
|
|
9
|
+
# * bucket_name<~String> - name of bucket to get access control list for
|
|
10
|
+
#
|
|
11
|
+
# ==== Returns
|
|
12
|
+
# * response<~Excon::Response>:
|
|
13
|
+
# * body<~Hash>:
|
|
14
|
+
# * 'AccessControlPolicy'<~Hash>
|
|
15
|
+
# * 'Owner'<~Hash>:
|
|
16
|
+
# * 'DisplayName'<~String> - Display name of object owner
|
|
17
|
+
# * 'ID'<~String> - Id of object owner
|
|
18
|
+
# * 'AccessControlList'<~Array>:
|
|
19
|
+
# * 'Grant'<~Hash>:
|
|
20
|
+
# * 'Grantee'<~Hash>:
|
|
21
|
+
# * 'DisplayName'<~String> - Display name of grantee
|
|
22
|
+
# * 'ID'<~String> - Id of grantee
|
|
23
|
+
# or
|
|
24
|
+
# * 'URI'<~String> - URI of group to grant access for
|
|
25
|
+
# * 'Permission'<~String> - Permission, in [FULL_CONTROL, WRITE, WRITE_ACP, READ, READ_ACP]
|
|
26
|
+
#
|
|
27
|
+
def get_bucket_acl(bucket_name)
|
|
28
|
+
unless bucket_name
|
|
29
|
+
raise ArgumentError.new('bucket_name is required')
|
|
30
|
+
end
|
|
31
|
+
request({
|
|
32
|
+
:expects => 200,
|
|
33
|
+
:headers => {},
|
|
34
|
+
:host => "#{bucket_name}.#{@host}",
|
|
35
|
+
:idempotent => true,
|
|
36
|
+
:method => 'GET',
|
|
37
|
+
:parser => Fog::Parsers::AWS::S3::AccessControlList.new,
|
|
38
|
+
:query => 'acl'
|
|
39
|
+
})
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
class Mock
|
|
45
|
+
|
|
46
|
+
def get_bucket_acl(bucket_name)
|
|
47
|
+
raise MockNotImplemented.new("Contributions welcome!")
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
@@ -34,29 +34,13 @@ module Fog
|
|
|
34
34
|
headers['If-Unmodified-Since'] = options['If-Unmodified-Since'].utc.strftime("%a, %d %b %Y %H:%M:%S +0000") if options['If-Modified-Since']
|
|
35
35
|
headers.merge!(options)
|
|
36
36
|
request({
|
|
37
|
-
:block => block,
|
|
38
37
|
:expects => 200,
|
|
39
38
|
:headers => headers,
|
|
40
39
|
:host => "#{bucket_name}.#{@host}",
|
|
41
40
|
:idempotent => true,
|
|
42
41
|
:method => 'GET',
|
|
43
42
|
:path => CGI.escape(object_name)
|
|
44
|
-
})
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
def get_object_url(bucket_name, object_name, expires)
|
|
48
|
-
unless bucket_name
|
|
49
|
-
raise ArgumentError.new('bucket_name is required')
|
|
50
|
-
end
|
|
51
|
-
unless object_name
|
|
52
|
-
raise ArgumentError.new('object_name is required')
|
|
53
|
-
end
|
|
54
|
-
url({
|
|
55
|
-
:headers => {},
|
|
56
|
-
:host => "#{bucket_name}.#{@host}",
|
|
57
|
-
:method => 'GET',
|
|
58
|
-
:path => CGI.escape(object_name)
|
|
59
|
-
}, expires)
|
|
43
|
+
}, &block)
|
|
60
44
|
end
|
|
61
45
|
|
|
62
46
|
end
|
|
@@ -107,20 +91,6 @@ module Fog
|
|
|
107
91
|
response
|
|
108
92
|
end
|
|
109
93
|
|
|
110
|
-
def get_object_url(bucket_name, object_name, expires)
|
|
111
|
-
unless bucket_name
|
|
112
|
-
raise ArgumentError.new('bucket_name is required')
|
|
113
|
-
end
|
|
114
|
-
unless object_name
|
|
115
|
-
raise ArgumentError.new('object_name is required')
|
|
116
|
-
end
|
|
117
|
-
url({
|
|
118
|
-
:headers => {},
|
|
119
|
-
:host => "#{bucket_name}.#{@host}",
|
|
120
|
-
:method => 'GET',
|
|
121
|
-
:path => CGI.escape(object_name)
|
|
122
|
-
}, expires)
|
|
123
|
-
end
|
|
124
94
|
end
|
|
125
95
|
end
|
|
126
96
|
end
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
module Fog
|
|
2
|
+
module AWS
|
|
3
|
+
module S3
|
|
4
|
+
class Real
|
|
5
|
+
|
|
6
|
+
# Get access control list for an S3 object
|
|
7
|
+
#
|
|
8
|
+
# ==== Parameters
|
|
9
|
+
# * bucket_name<~String> - name of bucket containing object
|
|
10
|
+
# * object_name<~String> - name of object to get access control list for
|
|
11
|
+
#
|
|
12
|
+
# ==== Returns
|
|
13
|
+
# * response<~Excon::Response>:
|
|
14
|
+
# * body<~Hash>:
|
|
15
|
+
# * 'AccessControlPolicy'<~Hash>
|
|
16
|
+
# * 'Owner'<~Hash>:
|
|
17
|
+
# * 'DisplayName'<~String> - Display name of object owner
|
|
18
|
+
# * 'ID'<~String> - Id of object owner
|
|
19
|
+
# * 'AccessControlList'<~Array>:
|
|
20
|
+
# * 'Grant'<~Hash>:
|
|
21
|
+
# * 'Grantee'<~Hash>:
|
|
22
|
+
# * 'DisplayName'<~String> - Display name of grantee
|
|
23
|
+
# * 'ID'<~String> - Id of grantee
|
|
24
|
+
# or
|
|
25
|
+
# * 'URI'<~String> - URI of group to grant access for
|
|
26
|
+
# * 'Permission'<~String> - Permission, in [FULL_CONTROL, WRITE, WRITE_ACP, READ, READ_ACP]
|
|
27
|
+
#
|
|
28
|
+
def get_object_acl(bucket_name, object_name)
|
|
29
|
+
unless bucket_name
|
|
30
|
+
raise ArgumentError.new('bucket_name is required')
|
|
31
|
+
end
|
|
32
|
+
unless object_name
|
|
33
|
+
raise ArgumentError.new('object_name is required')
|
|
34
|
+
end
|
|
35
|
+
request({
|
|
36
|
+
:expects => 200,
|
|
37
|
+
:headers => {},
|
|
38
|
+
:host => "#{bucket_name}.#{@host}",
|
|
39
|
+
:idempotent => true,
|
|
40
|
+
:method => 'GET',
|
|
41
|
+
:parser => Fog::Parsers::AWS::S3::AccessControlList.new,
|
|
42
|
+
:path => CGI.escape(object_name),
|
|
43
|
+
:query => 'acl'
|
|
44
|
+
})
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
class Mock
|
|
50
|
+
|
|
51
|
+
def get_object_acl(bucket_name, object_name)
|
|
52
|
+
raise MockNotImplemented.new("Contributions welcome!")
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
module Fog
|
|
2
|
+
module AWS
|
|
3
|
+
module S3
|
|
4
|
+
class Real
|
|
5
|
+
|
|
6
|
+
# Get torrent for an S3 object
|
|
7
|
+
#
|
|
8
|
+
# ==== Parameters
|
|
9
|
+
# * bucket_name<~String> - name of bucket containing object
|
|
10
|
+
# * object_name<~String> - name of object to get torrent for
|
|
11
|
+
#
|
|
12
|
+
# ==== Returns
|
|
13
|
+
# * response<~Excon::Response>:
|
|
14
|
+
# * body<~Hash>:
|
|
15
|
+
# * 'AccessControlPolicy'<~Hash>
|
|
16
|
+
# * 'Owner'<~Hash>:
|
|
17
|
+
# * 'DisplayName'<~String> - Display name of object owner
|
|
18
|
+
# * 'ID'<~String> - Id of object owner
|
|
19
|
+
# * 'AccessControlList'<~Array>:
|
|
20
|
+
# * 'Grant'<~Hash>:
|
|
21
|
+
# * 'Grantee'<~Hash>:
|
|
22
|
+
# * 'DisplayName'<~String> - Display name of grantee
|
|
23
|
+
# * 'ID'<~String> - Id of grantee
|
|
24
|
+
# * 'Permission'<~String> - Permission, in [FULL_CONTROL, WRITE, WRITE_ACP, READ, READ_ACP]
|
|
25
|
+
#
|
|
26
|
+
def get_object_torrent(bucket_name, object_name)
|
|
27
|
+
unless bucket_name
|
|
28
|
+
raise ArgumentError.new('bucket_name is required')
|
|
29
|
+
end
|
|
30
|
+
unless object_name
|
|
31
|
+
raise ArgumentError.new('object_name is required')
|
|
32
|
+
end
|
|
33
|
+
request({
|
|
34
|
+
:expects => 200,
|
|
35
|
+
:headers => {},
|
|
36
|
+
:host => "#{bucket_name}.#{@host}",
|
|
37
|
+
:idempotent => true,
|
|
38
|
+
:method => 'GET',
|
|
39
|
+
:path => CGI.escape(object_name),
|
|
40
|
+
:query => 'torrent'
|
|
41
|
+
})
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
class Mock
|
|
47
|
+
|
|
48
|
+
def get_object_object(bucket_name, object_name)
|
|
49
|
+
raise MockNotImplemented.new("Contributions welcome!")
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
module Fog
|
|
2
|
+
module AWS
|
|
3
|
+
module S3
|
|
4
|
+
class Real
|
|
5
|
+
|
|
6
|
+
# Get an expiring object url from S3
|
|
7
|
+
#
|
|
8
|
+
# ==== Parameters
|
|
9
|
+
# * bucket_name<~String> - Name of bucket containing object
|
|
10
|
+
# * object_name<~String> - Name of object to get expiring url for
|
|
11
|
+
# * expires<~Time> - An expiry time for this url
|
|
12
|
+
#
|
|
13
|
+
# ==== Returns
|
|
14
|
+
# * response<~Excon::Response>:
|
|
15
|
+
# * body<~String> - url for object
|
|
16
|
+
#
|
|
17
|
+
def get_object_url(bucket_name, object_name, expires)
|
|
18
|
+
unless bucket_name
|
|
19
|
+
raise ArgumentError.new('bucket_name is required')
|
|
20
|
+
end
|
|
21
|
+
unless object_name
|
|
22
|
+
raise ArgumentError.new('object_name is required')
|
|
23
|
+
end
|
|
24
|
+
url({
|
|
25
|
+
:headers => {},
|
|
26
|
+
:host => "#{bucket_name}.#{@host}",
|
|
27
|
+
:method => 'GET',
|
|
28
|
+
:path => CGI.escape(object_name)
|
|
29
|
+
}, expires)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
class Mock
|
|
35
|
+
|
|
36
|
+
def get_object_url(bucket_name, object_name, expires)
|
|
37
|
+
unless bucket_name
|
|
38
|
+
raise ArgumentError.new('bucket_name is required')
|
|
39
|
+
end
|
|
40
|
+
unless object_name
|
|
41
|
+
raise ArgumentError.new('object_name is required')
|
|
42
|
+
end
|
|
43
|
+
url({
|
|
44
|
+
:headers => {},
|
|
45
|
+
:host => "#{bucket_name}.#{@host}",
|
|
46
|
+
:method => 'GET',
|
|
47
|
+
:path => CGI.escape(object_name)
|
|
48
|
+
}, expires)
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
module Fog
|
|
2
|
+
module AWS
|
|
3
|
+
module S3
|
|
4
|
+
class Real
|
|
5
|
+
|
|
6
|
+
# Change access control list for an S3 bucket
|
|
7
|
+
#
|
|
8
|
+
# ==== Parameters
|
|
9
|
+
# * bucket_name<~String> - name of bucket to modify
|
|
10
|
+
# * acl<~Hash>:
|
|
11
|
+
# * Owner<~Hash>:
|
|
12
|
+
# * ID<~String>: id of owner
|
|
13
|
+
# * DisplayName<~String>: display name of owner
|
|
14
|
+
# * AccessControlList<~Array>:
|
|
15
|
+
# * Grantee<~Hash>:
|
|
16
|
+
# * 'DisplayName'<~String> - Display name of grantee
|
|
17
|
+
# * 'ID'<~String> - Id of grantee
|
|
18
|
+
# or
|
|
19
|
+
# * 'EmailAddress'<~String> - Email address of grantee
|
|
20
|
+
# or
|
|
21
|
+
# * 'URI'<~String> - URI of group to grant access for
|
|
22
|
+
# * Permission<~String> - Permission, in [FULL_CONTROL, WRITE, WRITE_ACP, READ, READ_ACP]
|
|
23
|
+
def put_bucket_acl(bucket_name, acl)
|
|
24
|
+
data =
|
|
25
|
+
<<-DATA
|
|
26
|
+
<AccessControlPolicy>
|
|
27
|
+
<Owner>
|
|
28
|
+
<ID>#{acl['Owner']['ID']}</ID>
|
|
29
|
+
<DisplayName>#{acl['Owner']['DisplayName']}</DisplayName>
|
|
30
|
+
</Owner>
|
|
31
|
+
<AccessControlList>
|
|
32
|
+
DATA
|
|
33
|
+
|
|
34
|
+
acl['AccessControlList'].each do |grant|
|
|
35
|
+
data << " <Grant>"
|
|
36
|
+
type = case grant['Grantee'].keys.sort
|
|
37
|
+
when ['DisplayName', 'ID']
|
|
38
|
+
'CanonicalUser'
|
|
39
|
+
when ['EmailAddress']
|
|
40
|
+
'AmazonCustomerByEmail'
|
|
41
|
+
when ['URI']
|
|
42
|
+
'Group'
|
|
43
|
+
end
|
|
44
|
+
data << " <Grantee xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:type=\"#{type}\">"
|
|
45
|
+
for key, value in grant['Grantee']
|
|
46
|
+
data << " <#{key}>#{value}</#{key}>"
|
|
47
|
+
end
|
|
48
|
+
data << " </Grantee>"
|
|
49
|
+
data << " <Permission>#{grant['Permission']}</Permission>"
|
|
50
|
+
data << " </Grant>"
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
data <<
|
|
54
|
+
<<-DATA
|
|
55
|
+
</AccessControlList>
|
|
56
|
+
</AccessControlPolicy>
|
|
57
|
+
DATA
|
|
58
|
+
|
|
59
|
+
request({
|
|
60
|
+
:body => data,
|
|
61
|
+
:expects => 200,
|
|
62
|
+
:headers => {},
|
|
63
|
+
:host => "#{bucket_name}.#{@host}",
|
|
64
|
+
:method => 'PUT',
|
|
65
|
+
:query => 'acl'
|
|
66
|
+
})
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
class Mock
|
|
72
|
+
|
|
73
|
+
def put_bucket_acl(bucket_name, acl)
|
|
74
|
+
raise MockNotImplemented.new("Contributions welcome!")
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
end
|