ianneub-right_aws 1.10.1 → 1.10.2
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/acf/right_acf_interface.rb +379 -0
- data/test/acf/test_helper.rb +2 -0
- data/test/acf/test_right_acf.rb +146 -0
- metadata +10 -17
@@ -0,0 +1,379 @@
|
|
1
|
+
#
|
2
|
+
# Copyright (c) 2008 RightScale Inc
|
3
|
+
#
|
4
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
5
|
+
# a copy of this software and associated documentation files (the
|
6
|
+
# "Software"), to deal in the Software without restriction, including
|
7
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
8
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
9
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
10
|
+
# the following conditions:
|
11
|
+
#
|
12
|
+
# The above copyright notice and this permission notice shall be
|
13
|
+
# included in all copies or substantial portions of the Software.
|
14
|
+
#
|
15
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
16
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
17
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
18
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
19
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
20
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
21
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
22
|
+
#
|
23
|
+
|
24
|
+
module RightAws
|
25
|
+
|
26
|
+
# = RightAws::AcfInterface -- RightScale Amazon's CloudFront interface
|
27
|
+
# The AcfInterface class provides a complete interface to Amazon's
|
28
|
+
# CloudFront service.
|
29
|
+
#
|
30
|
+
# For explanations of the semantics of each call, please refer to
|
31
|
+
# Amazon's documentation at
|
32
|
+
# http://developer.amazonwebservices.com/connect/kbcategory.jspa?categoryID=211
|
33
|
+
#
|
34
|
+
# Example:
|
35
|
+
#
|
36
|
+
# acf = RightAws::AcfInterface.new('1E3GDYEOGFJPIT7XXXXXX','hgTHt68JY07JKUY08ftHYtERkjgtfERn57XXXXXX')
|
37
|
+
#
|
38
|
+
# list = acf.list_distributions #=>
|
39
|
+
# [{:status => "Deployed",
|
40
|
+
# :domain_name => "d74zzrxmpmygb.6hops.net",
|
41
|
+
# :aws_id => "E4U91HCJHGXVC",
|
42
|
+
# :origin => "my-bucket.s3.amazonaws.com",
|
43
|
+
# :cnames => ["x1.my-awesome-site.net", "x1.my-awesome-site.net"]
|
44
|
+
# :comment => "My comments",
|
45
|
+
# :last_modified_time => Wed Sep 10 17:00:04 UTC 2008 }, ..., {...} ]
|
46
|
+
#
|
47
|
+
# distibution = list.first
|
48
|
+
#
|
49
|
+
# info = acf.get_distribution(distibution[:aws_id]) #=>
|
50
|
+
# {:enabled => true,
|
51
|
+
# :caller_reference => "200809102100536497863003",
|
52
|
+
# :e_tag => "E39OHHU1ON65SI",
|
53
|
+
# :status => "Deployed",
|
54
|
+
# :domain_name => "d3dxv71tbbt6cd.6hops.net",
|
55
|
+
# :cnames => ["web1.my-awesome-site.net", "web2.my-awesome-site.net"]
|
56
|
+
# :aws_id => "E2REJM3VUN5RSI",
|
57
|
+
# :comment => "Woo-Hoo!",
|
58
|
+
# :origin => "my-bucket.s3.amazonaws.com",
|
59
|
+
# :last_modified_time => Wed Sep 10 17:00:54 UTC 2008 }
|
60
|
+
#
|
61
|
+
# config = acf.get_distribution_config(distibution[:aws_id]) #=>
|
62
|
+
# {:enabled => true,
|
63
|
+
# :caller_reference => "200809102100536497863003",
|
64
|
+
# :e_tag => "E39OHHU1ON65SI",
|
65
|
+
# :cnames => ["web1.my-awesome-site.net", "web2.my-awesome-site.net"]
|
66
|
+
# :comment => "Woo-Hoo!",
|
67
|
+
# :origin => "my-bucket.s3.amazonaws.com"}
|
68
|
+
#
|
69
|
+
# config[:comment] = 'Olah-lah!'
|
70
|
+
# config[:enabled] = false
|
71
|
+
# config[:cnames] << "web3.my-awesome-site.net"
|
72
|
+
#
|
73
|
+
# acf.set_distribution_config(distibution[:aws_id], config) #=> true
|
74
|
+
#
|
75
|
+
class AcfInterface < RightAwsBase
|
76
|
+
|
77
|
+
include RightAwsBaseInterface
|
78
|
+
|
79
|
+
API_VERSION = "2008-06-30"
|
80
|
+
DEFAULT_HOST = 'cloudfront.amazonaws.com'
|
81
|
+
DEFAULT_PORT = 443
|
82
|
+
DEFAULT_PROTOCOL = 'https'
|
83
|
+
DEFAULT_PATH = '/'
|
84
|
+
|
85
|
+
@@bench = AwsBenchmarkingBlock.new
|
86
|
+
def self.bench_xml
|
87
|
+
@@bench.xml
|
88
|
+
end
|
89
|
+
def self.bench_service
|
90
|
+
@@bench.service
|
91
|
+
end
|
92
|
+
|
93
|
+
# Create a new handle to a CloudFront account. All handles share the same per process or per thread
|
94
|
+
# HTTP connection to CloudFront. Each handle is for a specific account. The params have the
|
95
|
+
# following options:
|
96
|
+
# * <tt>:server</tt>: CloudFront service host, default: DEFAULT_HOST
|
97
|
+
# * <tt>:port</tt>: CloudFront service port, default: DEFAULT_PORT
|
98
|
+
# * <tt>:protocol</tt>: 'http' or 'https', default: DEFAULT_PROTOCOL
|
99
|
+
# * <tt>:multi_thread</tt>: true=HTTP connection per thread, false=per process
|
100
|
+
# * <tt>:logger</tt>: for log messages, default: RAILS_DEFAULT_LOGGER else STDOUT
|
101
|
+
# * <tt>:cache</tt>: true/false: caching for list_distributions method, default: false.
|
102
|
+
#
|
103
|
+
# acf = RightAws::AcfInterface.new('1E3GDYEOGFJPIT7XXXXXX','hgTHt68JY07JKUY08ftHYtERkjgtfERn57XXXXXX',
|
104
|
+
# {:multi_thread => true, :logger => Logger.new('/tmp/x.log')}) #=> #<RightAws::AcfInterface::0xb7b3c30c>
|
105
|
+
#
|
106
|
+
def initialize(aws_access_key_id=nil, aws_secret_access_key=nil, params={})
|
107
|
+
init({ :name => 'ACF',
|
108
|
+
:default_host => ENV['ACF_URL'] ? URI.parse(ENV['ACF_URL']).host : DEFAULT_HOST,
|
109
|
+
:default_port => ENV['ACF_URL'] ? URI.parse(ENV['ACF_URL']).port : DEFAULT_PORT,
|
110
|
+
:default_service => ENV['ACF_URL'] ? URI.parse(ENV['ACF_URL']).path : DEFAULT_PATH,
|
111
|
+
:default_protocol => ENV['ACF_URL'] ? URI.parse(ENV['ACF_URL']).scheme : DEFAULT_PROTOCOL },
|
112
|
+
aws_access_key_id || ENV['AWS_ACCESS_KEY_ID'],
|
113
|
+
aws_secret_access_key || ENV['AWS_SECRET_ACCESS_KEY'],
|
114
|
+
params)
|
115
|
+
end
|
116
|
+
|
117
|
+
#-----------------------------------------------------------------
|
118
|
+
# Requests
|
119
|
+
#-----------------------------------------------------------------
|
120
|
+
|
121
|
+
# Generates request hash for REST API.
|
122
|
+
def generate_request(method, path, body=nil, headers={}) # :nodoc:
|
123
|
+
headers['content-type'] ||= 'text/xml' if body
|
124
|
+
headers['date'] = Time.now.httpdate
|
125
|
+
# Auth
|
126
|
+
signature = AwsUtils::sign(@aws_secret_access_key, headers['date'])
|
127
|
+
headers['Authorization'] = "AWS #{@aws_access_key_id}:#{signature}"
|
128
|
+
# Request
|
129
|
+
path = "#{@params[:default_service]}/#{API_VERSION}/#{path}"
|
130
|
+
request = "Net::HTTP::#{method.capitalize}".constantize.new(path)
|
131
|
+
request.body = body if body
|
132
|
+
# Set request headers
|
133
|
+
headers.each { |key, value| request[key.to_s] = value }
|
134
|
+
# prepare output hash
|
135
|
+
{ :request => request,
|
136
|
+
:server => @params[:server],
|
137
|
+
:port => @params[:port],
|
138
|
+
:protocol => @params[:protocol] }
|
139
|
+
end
|
140
|
+
|
141
|
+
# Sends request to Amazon and parses the response.
|
142
|
+
# Raises AwsError if any banana happened.
|
143
|
+
def request_info(request, parser, &block) # :nodoc:
|
144
|
+
thread = @params[:multi_thread] ? Thread.current : Thread.main
|
145
|
+
thread[:acf_connection] ||= Rightscale::HttpConnection.new(:exception => RightAws::AwsError, :logger => @logger)
|
146
|
+
request_info_impl(thread[:acf_connection], @@bench, request, parser, &block)
|
147
|
+
end
|
148
|
+
|
149
|
+
#-----------------------------------------------------------------
|
150
|
+
# Helpers:
|
151
|
+
#-----------------------------------------------------------------
|
152
|
+
|
153
|
+
def self.escape(text) # :nodoc:
|
154
|
+
REXML::Text::normalize(text)
|
155
|
+
end
|
156
|
+
|
157
|
+
def self.unescape(text) # :nodoc:
|
158
|
+
REXML::Text::unnormalize(text)
|
159
|
+
end
|
160
|
+
|
161
|
+
def xmlns # :nodoc:
|
162
|
+
%Q{"http://#{@params[:server]}/doc/#{API_VERSION}/"}
|
163
|
+
end
|
164
|
+
|
165
|
+
def generate_call_reference # :nodoc:
|
166
|
+
result = Time.now.strftime('%Y%m%d%H%M%S')
|
167
|
+
10.times{ result << rand(10).to_s }
|
168
|
+
result
|
169
|
+
end
|
170
|
+
|
171
|
+
def merge_headers(hash) # :nodoc:
|
172
|
+
hash[:location] = @last_response['Location'] if @last_response['Location']
|
173
|
+
hash[:e_tag] = @last_response['ETag'] if @last_response['ETag']
|
174
|
+
hash
|
175
|
+
end
|
176
|
+
|
177
|
+
#-----------------------------------------------------------------
|
178
|
+
# API Calls:
|
179
|
+
#-----------------------------------------------------------------
|
180
|
+
|
181
|
+
# List distributions.
|
182
|
+
# Returns an array of distributions or RightAws::AwsError exception.
|
183
|
+
#
|
184
|
+
# acf.list_distributions #=>
|
185
|
+
# [{:status => "Deployed",
|
186
|
+
# :domain_name => "d74zzrxmpmygb.6hops.net",
|
187
|
+
# :aws_id => "E4U91HCJHGXVC",
|
188
|
+
# :cnames => ["web1.my-awesome-site.net", "web2.my-awesome-site.net"]
|
189
|
+
# :origin => "my-bucket.s3.amazonaws.com",
|
190
|
+
# :comment => "My comments",
|
191
|
+
# :last_modified_time => Wed Sep 10 17:00:04 UTC 2008 }, ..., {...} ]
|
192
|
+
#
|
193
|
+
def list_distributions
|
194
|
+
request_hash = generate_request('GET', 'distribution')
|
195
|
+
request_cache_or_info :list_distributions, request_hash, AcfDistributionListParser, @@bench
|
196
|
+
end
|
197
|
+
|
198
|
+
# Create a new distribution.
|
199
|
+
# Returns the just created distribution or RightAws::AwsError exception.
|
200
|
+
#
|
201
|
+
# acf.create_distribution('bucket-for-k-dzreyev.s3.amazonaws.com', 'Woo-Hoo!', true, ['web1.my-awesome-site.net'] ) #=>
|
202
|
+
# {:comment => "Woo-Hoo!",
|
203
|
+
# :enabled => true,
|
204
|
+
# :location => "https://cloudfront.amazonaws.com/2008-06-30/distribution/E2REJM3VUN5RSI",
|
205
|
+
# :status => "InProgress",
|
206
|
+
# :aws_id => "E2REJM3VUN5RSI",
|
207
|
+
# :domain_name => "d3dxv71tbbt6cd.6hops.net",
|
208
|
+
# :origin => "my-bucket.s3.amazonaws.com",
|
209
|
+
# :cnames => ["web1.my-awesome-site.net"]
|
210
|
+
# :last_modified_time => Wed Sep 10 17:00:54 UTC 2008,
|
211
|
+
# :caller_reference => "200809102100536497863003"}
|
212
|
+
#
|
213
|
+
def create_distribution(origin, comment='', enabled=true, cnames=[], caller_reference=nil)
|
214
|
+
# join CNAMES
|
215
|
+
cnames_str = ''
|
216
|
+
unless cnames.blank?
|
217
|
+
cnames.to_a.each { |cname| cnames_str += "\n <CNAME>#{cname}</CNAME>" }
|
218
|
+
end
|
219
|
+
# reference
|
220
|
+
caller_reference ||= generate_call_reference
|
221
|
+
body = <<-EOXML
|
222
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
223
|
+
<DistributionConfig xmlns=#{xmlns}>
|
224
|
+
<Origin>#{origin}</Origin>
|
225
|
+
<CallerReference>#{caller_reference}</CallerReference>
|
226
|
+
#{cnames_str.lstrip}
|
227
|
+
<Comment>#{AcfInterface::escape(comment.to_s)}</Comment>
|
228
|
+
<Enabled>#{enabled}</Enabled>
|
229
|
+
</DistributionConfig>
|
230
|
+
EOXML
|
231
|
+
request_hash = generate_request('POST', 'distribution', body.strip)
|
232
|
+
merge_headers(request_info(request_hash, AcfDistributionParser.new))
|
233
|
+
end
|
234
|
+
|
235
|
+
# Get a distribution's information.
|
236
|
+
# Returns a distribution's information or RightAws::AwsError exception.
|
237
|
+
#
|
238
|
+
# acf.get_distribution('E2REJM3VUN5RSI') #=>
|
239
|
+
# {:enabled => true,
|
240
|
+
# :caller_reference => "200809102100536497863003",
|
241
|
+
# :e_tag => "E39OHHU1ON65SI",
|
242
|
+
# :status => "Deployed",
|
243
|
+
# :domain_name => "d3dxv71tbbt6cd.6hops.net",
|
244
|
+
# :cnames => ["web1.my-awesome-site.net", "web2.my-awesome-site.net"]
|
245
|
+
# :aws_id => "E2REJM3VUN5RSI",
|
246
|
+
# :comment => "Woo-Hoo!",
|
247
|
+
# :origin => "my-bucket.s3.amazonaws.com",
|
248
|
+
# :last_modified_time => Wed Sep 10 17:00:54 UTC 2008 }
|
249
|
+
#
|
250
|
+
def get_distribution(aws_id)
|
251
|
+
request_hash = generate_request('GET', "distribution/#{aws_id}")
|
252
|
+
merge_headers(request_info(request_hash, AcfDistributionParser.new))
|
253
|
+
end
|
254
|
+
|
255
|
+
# Get a distribution's configuration.
|
256
|
+
# Returns a distribution's configuration or RightAws::AwsError exception.
|
257
|
+
#
|
258
|
+
# acf.get_distribution_config('E2REJM3VUN5RSI') #=>
|
259
|
+
# {:enabled => true,
|
260
|
+
# :caller_reference => "200809102100536497863003",
|
261
|
+
# :e_tag => "E39OHHU1ON65SI",
|
262
|
+
# :cnames => ["web1.my-awesome-site.net", "web2.my-awesome-site.net"]
|
263
|
+
# :comment => "Woo-Hoo!",
|
264
|
+
# :origin => "my-bucket.s3.amazonaws.com"}
|
265
|
+
#
|
266
|
+
def get_distribution_config(aws_id)
|
267
|
+
request_hash = generate_request('GET', "distribution/#{aws_id}/config")
|
268
|
+
merge_headers(request_info(request_hash, AcfDistributionConfigParser.new))
|
269
|
+
end
|
270
|
+
|
271
|
+
# Set a distribution's configuration
|
272
|
+
# (the :origin and the :caller_reference cannot be changed).
|
273
|
+
# Returns +true+ on success or RightAws::AwsError exception.
|
274
|
+
#
|
275
|
+
# config = acf.get_distribution_config('E2REJM3VUN5RSI') #=>
|
276
|
+
# {:enabled => true,
|
277
|
+
# :caller_reference => "200809102100536497863003",
|
278
|
+
# :e_tag => "E39OHHU1ON65SI",
|
279
|
+
# :cnames => ["web1.my-awesome-site.net", "web2.my-awesome-site.net"]
|
280
|
+
# :comment => "Woo-Hoo!",
|
281
|
+
# :origin => "my-bucket.s3.amazonaws.com"}
|
282
|
+
# config[:comment] = 'Olah-lah!'
|
283
|
+
# config[:enabled] = false
|
284
|
+
# acf.set_distribution_config('E2REJM3VUN5RSI', config) #=> true
|
285
|
+
#
|
286
|
+
def set_distribution_config(aws_id, config)
|
287
|
+
# join CNAMES
|
288
|
+
cnames_str = ''
|
289
|
+
unless config[:cnames].blank?
|
290
|
+
config[:cnames].to_a.each { |cname| cnames_str += "\n <CNAME>#{cname}</CNAME>" }
|
291
|
+
end
|
292
|
+
# format request's XML body
|
293
|
+
body = <<-EOXML
|
294
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
295
|
+
<DistributionConfig xmlns=#{xmlns}>
|
296
|
+
<Origin>#{config[:origin]}</Origin>
|
297
|
+
<CallerReference>#{config[:caller_reference]}</CallerReference>
|
298
|
+
#{cnames_str.lstrip}
|
299
|
+
<Comment>#{AcfInterface::escape(config[:comment].to_s)}</Comment>
|
300
|
+
<Enabled>#{config[:enabled]}</Enabled>
|
301
|
+
</DistributionConfig>
|
302
|
+
EOXML
|
303
|
+
request_hash = generate_request('PUT', "distribution/#{aws_id}/config", body.strip,
|
304
|
+
'If-Match' => config[:e_tag])
|
305
|
+
request_info(request_hash, RightHttp2xxParser.new)
|
306
|
+
end
|
307
|
+
|
308
|
+
# Delete a distribution. The enabled distribution cannot be deleted.
|
309
|
+
# Returns +true+ on success or RightAws::AwsError exception.
|
310
|
+
#
|
311
|
+
# acf.delete_distribution('E2REJM3VUN5RSI', 'E39OHHU1ON65SI') #=> true
|
312
|
+
#
|
313
|
+
def delete_distribution(aws_id, e_tag)
|
314
|
+
request_hash = generate_request('DELETE', "distribution/#{aws_id}", nil,
|
315
|
+
'If-Match' => e_tag)
|
316
|
+
request_info(request_hash, RightHttp2xxParser.new)
|
317
|
+
end
|
318
|
+
|
319
|
+
#-----------------------------------------------------------------
|
320
|
+
# PARSERS:
|
321
|
+
#-----------------------------------------------------------------
|
322
|
+
|
323
|
+
class AcfDistributionListParser < RightAWSParser # :nodoc:
|
324
|
+
def reset
|
325
|
+
@result = []
|
326
|
+
end
|
327
|
+
def tagstart(name, attributes)
|
328
|
+
@distribution = { :cnames => [] } if name == 'DistributionSummary'
|
329
|
+
end
|
330
|
+
def tagend(name)
|
331
|
+
case name
|
332
|
+
when 'Id' then @distribution[:aws_id] = @text
|
333
|
+
when 'Status' then @distribution[:status] = @text
|
334
|
+
when 'LastModifiedTime' then @distribution[:last_modified_time] = Time.parse(@text)
|
335
|
+
when 'DomainName' then @distribution[:domain_name] = @text
|
336
|
+
when 'Origin' then @distribution[:origin] = @text
|
337
|
+
when 'Comment' then @distribution[:comment] = AcfInterface::unescape(@text)
|
338
|
+
when 'CNAME' then @distribution[:cnames] << @text
|
339
|
+
when 'DistributionSummary' then @result << @distribution
|
340
|
+
end
|
341
|
+
end
|
342
|
+
end
|
343
|
+
|
344
|
+
class AcfDistributionParser < RightAWSParser # :nodoc:
|
345
|
+
def reset
|
346
|
+
@result = { :cnames => [] }
|
347
|
+
end
|
348
|
+
def tagend(name)
|
349
|
+
case name
|
350
|
+
when 'Id' then @result[:aws_id] = @text
|
351
|
+
when 'Status' then @result[:status] = @text
|
352
|
+
when 'LastModifiedTime' then @result[:last_modified_time] = Time.parse(@text)
|
353
|
+
when 'DomainName' then @result[:domain_name] = @text
|
354
|
+
when 'Origin' then @result[:origin] = @text
|
355
|
+
when 'CallerReference' then @result[:caller_reference] = @text
|
356
|
+
when 'Comment' then @result[:comment] = AcfInterface::unescape(@text)
|
357
|
+
when 'Enabled' then @result[:enabled] = @text == 'true' ? true : false
|
358
|
+
when 'CNAME' then @result[:cnames] << @text
|
359
|
+
end
|
360
|
+
end
|
361
|
+
end
|
362
|
+
|
363
|
+
class AcfDistributionConfigParser < RightAWSParser # :nodoc:
|
364
|
+
def reset
|
365
|
+
@result = { :cnames => [] }
|
366
|
+
end
|
367
|
+
def tagend(name)
|
368
|
+
case name
|
369
|
+
when 'Origin' then @result[:origin] = @text
|
370
|
+
when 'CallerReference' then @result[:caller_reference] = @text
|
371
|
+
when 'Comment' then @result[:comment] = AcfInterface::unescape(@text)
|
372
|
+
when 'Enabled' then @result[:enabled] = @text == 'true' ? true : false
|
373
|
+
when 'CNAME' then @result[:cnames] << @text
|
374
|
+
end
|
375
|
+
end
|
376
|
+
end
|
377
|
+
|
378
|
+
end
|
379
|
+
end
|
@@ -0,0 +1,146 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/test_helper.rb'
|
2
|
+
|
3
|
+
class TestAcf < Test::Unit::TestCase
|
4
|
+
|
5
|
+
RIGHT_OBJECT_TEXT = 'Right test message'
|
6
|
+
|
7
|
+
STDOUT.sync = true
|
8
|
+
|
9
|
+
def setup
|
10
|
+
@acf= Rightscale::AcfInterface.new(TestCredentials.aws_access_key_id, TestCredentials.aws_secret_access_key)
|
11
|
+
@s3 = Rightscale::S3.new(TestCredentials.aws_access_key_id, TestCredentials.aws_secret_access_key)
|
12
|
+
@bucket_name = "right-acf-awesome-test-bucket-0001"
|
13
|
+
@bucket_domain = "#{@bucket_name}.s3.amazonaws.com"
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_01_list_distributions_part1
|
17
|
+
distributions = nil
|
18
|
+
assert_nothing_raised(Rightscale::AwsError) do
|
19
|
+
distributions = @acf.list_distributions
|
20
|
+
end
|
21
|
+
assert distributions.is_a?(Array)
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_02_try_to_create_for_bad_bucket
|
25
|
+
# a bucket does not exist
|
26
|
+
assert_raise(Rightscale::AwsError) do
|
27
|
+
@acf.create_distribution("right-cloudfront-awesome-test-bucket-not-exist", "Mustn't to be born", true)
|
28
|
+
end
|
29
|
+
# a bucket is not a domain naming complied guy
|
30
|
+
bucket_name = 'right_cloudfront_awesome_test_bucket_BAD'
|
31
|
+
@s3.bucket(bucket_name, :create)
|
32
|
+
assert_raise(Rightscale::AwsError) do
|
33
|
+
@acf.create_distribution(bucket_name, "Mustn't to be born", true)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_03_create
|
38
|
+
comment = 'WooHoo!!!'
|
39
|
+
# create a test bucket
|
40
|
+
@s3.bucket(@bucket_name, :create)
|
41
|
+
# create a distribution
|
42
|
+
distribution = @acf.create_distribution(@bucket_domain, comment, true)
|
43
|
+
assert_equal comment, distribution[:comment]
|
44
|
+
assert distribution[:cnames].size == 0
|
45
|
+
assert distribution[:enabled]
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_04_list_distributions_part2
|
49
|
+
distributions = @acf.list_distributions
|
50
|
+
assert distributions.size > 0
|
51
|
+
end
|
52
|
+
|
53
|
+
def get_test_distribution
|
54
|
+
@acf.list_distributions.select{ |d| d[:origin] == @bucket_domain }.first
|
55
|
+
end
|
56
|
+
|
57
|
+
def test_05_get_distribution
|
58
|
+
old = get_test_distribution
|
59
|
+
assert_nothing_raised do
|
60
|
+
@acf.get_distribution(old[:aws_id])
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def test_06_get_and_set_config
|
65
|
+
config = nil
|
66
|
+
old = get_test_distribution
|
67
|
+
assert_nothing_raised do
|
68
|
+
config = @acf.get_distribution_config(old[:aws_id])
|
69
|
+
end
|
70
|
+
# change a config
|
71
|
+
config[:enabled] = false
|
72
|
+
config[:cnames] << 'x1.myawesomesite.com'
|
73
|
+
config[:cnames] << 'x2.myawesomesite.com'
|
74
|
+
# set config
|
75
|
+
set_config_result = nil
|
76
|
+
assert_nothing_raised do
|
77
|
+
set_config_result = @acf.set_distribution_config(old[:aws_id], config)
|
78
|
+
end
|
79
|
+
assert set_config_result
|
80
|
+
# reget the config and check
|
81
|
+
new_config = nil
|
82
|
+
assert_nothing_raised do
|
83
|
+
new_config = @acf.get_distribution_config(old[:aws_id])
|
84
|
+
end
|
85
|
+
assert !new_config[:enabled]
|
86
|
+
assert_equal new_config[:cnames].sort, ['x1.myawesomesite.com', 'x2.myawesomesite.com']
|
87
|
+
assert_not_equal config[:e_tag], new_config[:e_tag]
|
88
|
+
|
89
|
+
# try to update the old config again (must fail because ETAG has changed)
|
90
|
+
assert_raise(Rightscale::AwsError) do
|
91
|
+
@acf.set_distribution_config(old[:aws_id], config)
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
def test_07_caching
|
96
|
+
# enable caching
|
97
|
+
@acf.params[:cache] = true
|
98
|
+
# list distributions
|
99
|
+
@acf.list_distributions
|
100
|
+
# list the distributions again - cache should hit
|
101
|
+
assert_raise(Rightscale::AwsNoChange) do
|
102
|
+
@acf.list_distributions
|
103
|
+
end
|
104
|
+
# disable caching
|
105
|
+
@acf.params[:cache] = true
|
106
|
+
end
|
107
|
+
|
108
|
+
def test_08_delete_distribution
|
109
|
+
# we need ETAG so use get_distribution
|
110
|
+
distribution = @acf.get_distribution(get_test_distribution[:aws_id])
|
111
|
+
# try to delete a distribution
|
112
|
+
# should fail because
|
113
|
+
if distribution[:status] == 'InProgress'
|
114
|
+
# should fail because the distribution is not deployed yet
|
115
|
+
assert_raise(Rightscale::AwsError) do
|
116
|
+
@acf.delete_distribution(distribution[:aws_id], distribution[:e_tag])
|
117
|
+
end
|
118
|
+
# wait for a deployed state
|
119
|
+
print "waiting up to 5 min while the distribution is being deployed: "
|
120
|
+
100.times do
|
121
|
+
print '.'
|
122
|
+
distribution = @acf.get_distribution(distribution[:aws_id])
|
123
|
+
if distribution[:status] == 'Deployed'
|
124
|
+
print ' done'
|
125
|
+
break
|
126
|
+
end
|
127
|
+
sleep 3
|
128
|
+
end
|
129
|
+
puts
|
130
|
+
end
|
131
|
+
|
132
|
+
# only disabled and deployed distribution can be deleted
|
133
|
+
assert_equal 'Deployed', distribution[:status]
|
134
|
+
assert !distribution[:enabled]
|
135
|
+
|
136
|
+
# delete the distribution
|
137
|
+
assert_nothing_raised do
|
138
|
+
@acf.delete_distribution(distribution[:aws_id], distribution[:e_tag])
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
def test_09_drop_bucket
|
143
|
+
assert @s3.bucket(@bucket_name).delete
|
144
|
+
end
|
145
|
+
|
146
|
+
end
|
metadata
CHANGED
@@ -1,10 +1,11 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ianneub-right_aws
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.10.
|
4
|
+
version: 1.10.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- RightScale, Inc.
|
8
|
+
- Ian Neubert
|
8
9
|
autorequire:
|
9
10
|
bindir: bin
|
10
11
|
cert_chain: []
|
@@ -20,20 +21,10 @@ dependencies:
|
|
20
21
|
requirements:
|
21
22
|
- - ">="
|
22
23
|
- !ruby/object:Gem::Version
|
23
|
-
version: 1.2.
|
24
|
+
version: 1.2.4
|
24
25
|
version:
|
25
|
-
-
|
26
|
-
|
27
|
-
type: :development
|
28
|
-
version_requirement:
|
29
|
-
version_requirements: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - ">="
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: 1.9.0
|
34
|
-
version:
|
35
|
-
description: The RightScale AWS gems have been designed to provide a robust, fast, and secure interface to Amazon EC2, Amazon S3, Amazon SQS, and Amazon SDB.
|
36
|
-
email: support@rightscale.com
|
26
|
+
description: "== DESCRIPTION: The RightScale AWS gems have been designed to provide a robust, fast, and secure interface to Amazon EC2, EBS, S3, SQS, SDB, and CloudFront. These gems have been used in production by RightScale since late 2006 and are being maintained to track enhancements made by Amazon. The RightScale AWS gems comprise: - RightAws::Ec2 -- interface to Amazon EC2 (Elastic Compute Cloud) and the associated EBS (Elastic Block Store) - RightAws::S3 and RightAws::S3Interface -- interface to Amazon S3 (Simple Storage Service) - RightAws::Sqs and RightAws::SqsInterface -- interface to first-generation Amazon SQS (Simple Queue Service) (API version 2007-05-01) - RightAws::SqsGen2 and RightAws::SqsGen2Interface -- interface to second-generation Amazon SQS (Simple Queue Service) (API version 2008-01-01) - RightAws::SdbInterface and RightAws::ActiveSdb -- interface to Amazon SDB (SimpleDB) - RightAws::AcfInterface -- interface to Amazon CloudFront, a content distribution service == FEATURES:"
|
27
|
+
email: rubygems@rightscale.com
|
37
28
|
executables: []
|
38
29
|
|
39
30
|
extensions: []
|
@@ -48,7 +39,6 @@ files:
|
|
48
39
|
- README.txt
|
49
40
|
- Rakefile
|
50
41
|
- lib/awsbase/benchmark_fix.rb
|
51
|
-
- lib/awsbase/file_fix.rb
|
52
42
|
- lib/awsbase/right_awsbase.rb
|
53
43
|
- lib/awsbase/support.rb
|
54
44
|
- lib/ec2/right_ec2.rb
|
@@ -61,6 +51,7 @@ files:
|
|
61
51
|
- lib/sqs/right_sqs_gen2.rb
|
62
52
|
- lib/sqs/right_sqs_gen2_interface.rb
|
63
53
|
- lib/sqs/right_sqs_interface.rb
|
54
|
+
- lib/acf/right_acf_interface.rb
|
64
55
|
- test/ec2/test_helper.rb
|
65
56
|
- test/ec2/test_right_ec2.rb
|
66
57
|
- test/http_connection.rb
|
@@ -75,6 +66,8 @@ files:
|
|
75
66
|
- test/sqs/test_right_sqs_gen2.rb
|
76
67
|
- test/test_credentials.rb
|
77
68
|
- test/ts_right_aws.rb
|
69
|
+
- test/acf/test_helper.rb
|
70
|
+
- test/acf/test_right_acf.rb
|
78
71
|
has_rdoc: true
|
79
72
|
homepage:
|
80
73
|
post_install_message:
|
@@ -97,10 +90,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
97
90
|
version:
|
98
91
|
requirements: []
|
99
92
|
|
100
|
-
rubyforge_project:
|
93
|
+
rubyforge_project: rightscale
|
101
94
|
rubygems_version: 1.2.0
|
102
95
|
signing_key:
|
103
96
|
specification_version: 2
|
104
|
-
summary: Interface classes for the Amazon EC2, SQS, and
|
97
|
+
summary: Interface classes for the Amazon EC2/EBS, SQS, S3, SDB, and ACF Web Services
|
105
98
|
test_files:
|
106
99
|
- test/ts_right_aws.rb
|