aws-sdk 1.5.4 → 1.5.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,67 @@
1
+ # Copyright 2011-2012 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License"). You
4
+ # may not use this file except in compliance with the License. A copy of
5
+ # the License is located at
6
+ #
7
+ # http://aws.amazon.com/apache2.0/
8
+ #
9
+ # or in the "license" file accompanying this file. This file is
10
+ # distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
11
+ # ANY KIND, either express or implied. See the License for the specific
12
+ # language governing permissions and limitations under the License.
13
+
14
+ module AWS
15
+ class EC2
16
+
17
+ # = Getting Export Tasks
18
+ #
19
+ # Allows you to enumerate export tasks.
20
+ #
21
+ # ec2.export_tasks.each do |task|
22
+ # # yield ExportTask objects
23
+ # end
24
+ #
25
+ # You can also get an export task by id
26
+ #
27
+ # task = ec2.export_tasks['export-task-id']
28
+ #
29
+ # = Creating Export Tasks
30
+ #
31
+ # To create an export task you start with the {Instance}:
32
+ #
33
+ # task = ec2.instances['i-12345678'].export_to_s3('bucket-name')
34
+ #
35
+ # See {Instance#export_to_s3} for more options.
36
+ #
37
+ class ExportTaskCollection < Collection
38
+
39
+ include Core::Collection::Simple
40
+
41
+ # @param [String] export_task_id
42
+ # @return [ExportTask] Returns reference to the export task with the
43
+ # given export task id.
44
+ def [] export_task_id
45
+ ExportTask.new(export_task_id, :config => config)
46
+ end
47
+
48
+ protected
49
+
50
+ def _each_item options = {}, &block
51
+ resp = filtered_request(:describe_export_tasks, options, &block)
52
+ resp.data[:export_task_set].each do |details|
53
+
54
+ task = ExportTask.new_from(
55
+ :describe_export_tasks,
56
+ details,
57
+ details[:export_task_id],
58
+ :config => config)
59
+
60
+ yield(task)
61
+
62
+ end
63
+ end
64
+
65
+ end
66
+ end
67
+ end
@@ -647,6 +647,87 @@ module AWS
647
647
  instance_action :stop
648
648
  end
649
649
 
650
+ # This produces an image of an EC2 instance for use in another
651
+ # virtualization environment and then writes the image to a
652
+ # S3 bucket.
653
+ #
654
+ # == Granting EC2 write access to your bucket
655
+ #
656
+ # Before you can export an image to an S3 bucket, you must modify
657
+ # the bucket ACL. You only need to do this once per bucket.
658
+ #
659
+ # s3.buckets['bucket-name'].acl.change do |acl|
660
+ # acl.grant(:read_acp).to(:amazon_customer_email => 'vm-import-export@amazon.com')
661
+ # acl.grant(:write).to(:amazon_customer_email => 'vm-import-export@amazon.com')
662
+ # end
663
+ #
664
+ # == Performing the export
665
+ #
666
+ # Simply call #export_to_s3 on your instance. Only instances
667
+ # derived from your own ImportInstance tasks may be exported.
668
+ #
669
+ # task = ec2.instances['i-12345678'].export_to_s3('bucket-name')
670
+ #
671
+ # == Downloading the results
672
+ #
673
+ # Given a completed export task you can download the final image:
674
+ #
675
+ # File.open('image.ova', 'w') {|f| f.write(task.s3_object.read) }
676
+ #
677
+ # @param [S3::Bucket,String] bucket The destination bucket. May
678
+ # be the name of the bucket (string) or a {S3::Bucket} object. The
679
+ # bucket must exist and grant write permissiosn to the AWS account
680
+ # 'vm-import-export@amazon.com.'.
681
+ #
682
+ # @param [Hash] options
683
+ #
684
+ # @option options [String] :target_environment ('vmware') The target
685
+ # virtualization environment. Valid values include: 'vmware', 'citrix'
686
+ # and 'microsoft'.
687
+ #
688
+ # @option options [String] :disk_image_format The format for the exported
689
+ # image. Defaults to 'vmdk' if +:target_environemnt+ is 'vmware',
690
+ # otherwise, 'vhd'.
691
+ #
692
+ # @option options [String] :container_format The container format used to
693
+ # combine disk images with metadata (such as OVF). If absent, only
694
+ # the disk image will be exported. Defaults to 'ova' if
695
+ # +:target_environment+ is 'vmware', otherwise ommited.
696
+ #
697
+ # @option options [String] :description Description of the conversion
698
+ # task or the resource being exported.
699
+ #
700
+ # @option options [String] :prefix (nil) The image is written to a
701
+ # single object in the bucket at the key:
702
+ #
703
+ # "#{prefix}#{export_task_id}.#{disk_image_format}"
704
+ #
705
+ # @return [ExportTask]
706
+ #
707
+ def export_to_s3 bucket, options = {}
708
+
709
+ bucket_name = bucket.is_a?(S3::Bucket) ? bucket.name : bucket.to_s
710
+
711
+ opts = {}
712
+ opts[:instance_id] = instance_id
713
+ opts[:description] = options[:description] if options[:description]
714
+ opts[:target_environment] = options[:target_environment] || 'vmware'
715
+ opts[:export_to_s3] = {}
716
+ opts[:export_to_s3][:s3_bucket] = bucket_name
717
+ [:disk_image_format, :container_format, :s3_prefix].each do |opt|
718
+ opts[:export_to_s3][opt] = options[opt] if options.key?(opt)
719
+ end
720
+
721
+ resp = client.create_instance_export_task(opts)
722
+
723
+ ExportTask.new_from(
724
+ :create_instance_export_task,
725
+ resp[:export_task],
726
+ resp[:export_task][:export_task_id],
727
+ :config => config)
728
+
729
+ end
730
+
650
731
  protected
651
732
 
652
733
  def find_in_response resp
@@ -77,6 +77,7 @@ module AWS
77
77
  :vpn_gateways,
78
78
  :dhcp_options,
79
79
  :vpn_connections,
80
+ :export_tasks,
80
81
  ]
81
82
 
82
83
  PROXIED_METHODS.each do |method|
@@ -27,7 +27,7 @@ module AWS
27
27
  #
28
28
  # string_attr :title
29
29
  # string_attr :author
30
- # integer :number_of_pages
30
+ # integer_attr :number_of_pages
31
31
  #
32
32
  # timestamps # adds a :created_at and :updated_at pair of timestamps
33
33
  #
data/lib/aws/s3.rb CHANGED
@@ -97,6 +97,7 @@ module AWS
97
97
  AWS.register_autoloads(self) do
98
98
  autoload :AccessControlList, 'access_control_list'
99
99
  autoload :ACLObject, 'acl_object'
100
+ autoload :ACLOptions, 'acl_options'
100
101
  autoload :Bucket, 'bucket'
101
102
  autoload :BucketCollection, 'bucket_collection'
102
103
  autoload :BucketLifecycleConfiguration, 'bucket_lifecycle_configuration'
@@ -98,13 +98,17 @@ module AWS
98
98
  class Grantee
99
99
  include ACLObject
100
100
 
101
- SIGNAL_ATTRIBUTES = [:amazon_customer_email,
102
- :canonical_user_id,
103
- :group_uri]
101
+ SIGNAL_ATTRIBUTES = [
102
+ :amazon_customer_email,
103
+ :canonical_user_id,
104
+ :group_uri,
105
+ :uri,
106
+ ]
104
107
 
105
108
  string_attr "EmailAddress", :method_name => "amazon_customer_email"
106
109
  string_attr "ID", :method_name => "canonical_user_id"
107
110
  string_attr "URI", :method_name => "group_uri"
111
+ string_attr "URI", :method_name => "uri"
108
112
  string_attr "DisplayName"
109
113
 
110
114
  # (see ACLObject#validate!)
@@ -133,9 +137,12 @@ module AWS
133
137
 
134
138
  # @private
135
139
  def type_for_attr(attr)
136
- { :amazon_customer_email => "AmazonCustomerByEmail",
140
+ {
141
+ :amazon_customer_email => "AmazonCustomerByEmail",
137
142
  :canonical_user_id => "CanonicalUser",
138
- :group_uri => "Group" }[attr]
143
+ :group_uri => "Group",
144
+ :uri => "Group",
145
+ }[attr]
139
146
  end
140
147
 
141
148
  end
@@ -0,0 +1,204 @@
1
+ # Copyright 2011-2012 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License"). You
4
+ # may not use this file except in compliance with the License. A copy of
5
+ # the License is located at
6
+ #
7
+ # http://aws.amazon.com/apache2.0/
8
+ #
9
+ # or in the "license" file accompanying this file. This file is
10
+ # distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
11
+ # ANY KIND, either express or implied. See the License for the specific
12
+ # language governing permissions and limitations under the License.
13
+
14
+ require 'rexml/document'
15
+
16
+ module AWS
17
+ class S3
18
+
19
+ # Provides a method to {Bucket} and {S3Object} that parses a wide
20
+ # range of ACL options.
21
+ # @private
22
+ module ACLOptions
23
+
24
+ protected
25
+
26
+ # @param [Symbol,String,Hash,AccessControlList] acl Accepts an ACL
27
+ # description in one of the following formats:
28
+ #
29
+ # ==== Canned ACL
30
+ #
31
+ # S3 supports a number of canned ACLs for buckets and
32
+ # objects. These include:
33
+ #
34
+ # * +:private+
35
+ # * +:public_read+
36
+ # * +:public_read_write+
37
+ # * +:authenticated_read+
38
+ # * +:bucket_owner_read+ (object-only)
39
+ # * +:bucket_owner_full_control+ (object-only)
40
+ # * +:log_delivery_write+ (bucket-only)
41
+ #
42
+ # Here is an example of providing a canned ACL to a bucket:
43
+ #
44
+ # s3.buckets['bucket-name'].acl = :public_read
45
+ #
46
+ # ==== ACL Grant Hash
47
+ #
48
+ # You can provide a hash of grants. The hash is composed of grants (keys)
49
+ # and grantees (values). Accepted grant keys are:
50
+ #
51
+ # * +:grant_read+
52
+ # * +:grant_write+
53
+ # * +:grant_read_acp+
54
+ # * +:grant_write_acp+
55
+ # * +:grant_full_control+
56
+ #
57
+ # Grantee strings (values) should be formatted like some of the
58
+ # following examples:
59
+ #
60
+ # id="8a6925ce4adf588a4532142d3f74dd8c71fa124b1ddee97f21c32aa379004fef"
61
+ # uri="http://acs.amazonaws.com/groups/global/AllUsers"
62
+ # emailAddress="xyz@amazon.com"
63
+ #
64
+ # You can provide a comma delimited list of multiple grantees in a single
65
+ # string. Please note the use of quotes inside the grantee string.
66
+ # Here is a simple example:
67
+ #
68
+ # {
69
+ # :grant_full_control => "emailAddress=\"foo@bar.com\", id=\"abc..mno\""
70
+ # }
71
+ #
72
+ # See the S3 API documentation for more information on formatting
73
+ # grants.
74
+ #
75
+ # ==== AcessControlList Object
76
+ #
77
+ # You can build an ACL using the {AccessControlList} class and
78
+ # pass this object.
79
+ #
80
+ # acl = AWS::S3::AccessControlList.new
81
+ # acl.grant(:full_control).to(:canonical_user_id => "8a6...fef")
82
+ # acl #=> this is acceptible
83
+ #
84
+ # ==== ACL XML String
85
+ #
86
+ # Lastly you can build your own ACL XML document and pass it as a string.
87
+ #
88
+ # <<-XML
89
+ # <AccessControlPolicy xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
90
+ # <Owner>
91
+ # <ID>8a6...fef</ID>
92
+ # <DisplayName>owner-display-name</DisplayName>
93
+ # </Owner>
94
+ # <AccessControlList>
95
+ # <Grant>
96
+ # <Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="Canonical User">
97
+ # <ID>8a6...fef</ID>
98
+ # <DisplayName>owner-display-name</DisplayName>
99
+ # </Grantee>
100
+ # <Permission>FULL_CONTROL</Permission>
101
+ # </Grant>
102
+ # </AccessControlList>
103
+ # </AccessControlPolicy>
104
+ # XML
105
+ #
106
+ # @return [Hash] Returns a hash of options suitable for
107
+ # passing to {Client#put_bucket_acl} and {Client#put_object_acl}
108
+ # with a mixture of ACL options.
109
+ #
110
+ def acl_options acl
111
+ case acl
112
+ when Symbol
113
+ { :acl => acl.to_s.tr('_', '-') }
114
+ when String
115
+ # Strings are either access control policies (xml strings)
116
+ # or they are canned acls
117
+ xml?(acl) ?
118
+ { :access_control_policy => acl } :
119
+ { :acl => acl }
120
+ when AccessControlList
121
+ { :access_control_policy => acl.to_xml }
122
+ when Hash
123
+ # Hashes are either grant hashes or constructor args for an
124
+ # access control list (deprecated)
125
+ grant_hash?(acl) ?
126
+ format_grants(acl) :
127
+ { :access_control_policy => AccessControlList.new(acl).to_xml }
128
+ else
129
+ # failed to parse the acl option
130
+ msg = "expected a canned ACL, AccessControlList object, ACL "
131
+ "XML string or a grants hash"
132
+ raise ArgumentError, msg
133
+ end
134
+ end
135
+
136
+ # @param [Hash] acl_hash
137
+ # @return [Boolean] Retursn +true+ if this hash is a hash of grants.
138
+ def grant_hash? acl_hash
139
+ grant_keys = [
140
+ :grant_read,
141
+ :grant_write,
142
+ :grant_read_acp,
143
+ :grant_write_acp,
144
+ :grant_full_control,
145
+ ]
146
+ acl_hash.keys.all?{|key| grant_keys.include?(key) }
147
+ end
148
+
149
+ # @param [String] acl_string
150
+ # @return [Boolean] Returns +true+ if this string is an xml document.
151
+ def xml? acl_string
152
+ begin
153
+ REXML::Document.new(acl_string).has_elements?
154
+ rescue
155
+ false
156
+ end
157
+ end
158
+
159
+ # @param [Hash] acl_hash
160
+ # @return [Hash] Returns a hash of grant options suitable for
161
+ # passing to the various S3 client methods that accept ACL grants.
162
+ def format_grants acl_hash
163
+ grants = {}
164
+ acl_hash.each_pair do |grant,grantees|
165
+ grantees = [grantees] unless grantees.is_a?(Array)
166
+ grants[grant] = grantees.map{|g| format_grantee(g) }.join(', ')
167
+ end
168
+ grants
169
+ end
170
+
171
+ def format_grantee grantee
172
+ case grantee
173
+ when String then grantee
174
+ when Hash
175
+
176
+ if grantee.keys.count != 1
177
+ msg = "grantee hashes must have exactly 1 key"
178
+ raise ArgumentError, msg
179
+ end
180
+
181
+ # A granee hash looks like:
182
+ # { :id => 'abc...fec' }
183
+ # { :uri => 'http://abc.com/foo' }
184
+ # { :email_address => 'xyz@amazon.com }
185
+ #
186
+ # It needs to look like
187
+ # 'id="abc...fec"'
188
+ # 'uri="http://abc.com/foo"'
189
+ # 'emailAddress="xyz@amazon.com"'
190
+ type, token = grantee.to_a.flatten
191
+ type = type.to_s.split('_').map{|part| ucfirst(part) }.join
192
+ "#{type[0,1].downcase}#{type[1..-1]}=\"#{token}\""
193
+ else
194
+ raise ArgumentError, "grantees must be a string or a hash"
195
+ end
196
+ end
197
+
198
+ def ucfirst str
199
+ str[0,1].upcase + str[1..-1]
200
+ end
201
+
202
+ end
203
+ end
204
+ end
data/lib/aws/s3/bucket.rb CHANGED
@@ -27,6 +27,7 @@ module AWS
27
27
  class Bucket
28
28
 
29
29
  include Core::Model
30
+ include ACLOptions
30
31
 
31
32
  # @param [String] name
32
33
  # @param [Hash] options
@@ -212,18 +213,12 @@ module AWS
212
213
 
213
214
  end
214
215
 
215
- # Sets the bucket's access control list. +acl+ can be:
216
- #
217
- # * An XML policy as a string (which is passed to S3 uninterpreted)
218
- # * An AccessControlList object
219
- # * Any object that responds to +to_xml+
220
- # * Any Hash that is acceptable as an argument to
221
- # AccessControlList#initialize.
222
- #
223
- # @param [AccessControlList] acl
216
+ # Sets the bucket's ACL (access control list). You can provide an ACL
217
+ # in a number of different formats.
218
+ # @param (see ACLOptions#acl_options)
224
219
  # @return [nil]
225
- def acl=(acl)
226
- client.set_bucket_acl(:bucket_name => name, :acl => acl)
220
+ def acl= acl
221
+ client.set_bucket_acl(acl_options(acl).merge(:bucket_name => name))
227
222
  nil
228
223
  end
229
224