fog 0.0.91 → 0.0.92
Sign up to get free protection for your applications and to get access to all the features.
- 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
|