Class: Aws::AcfInterface
- Includes:
- AwsBaseInterface
- Defined in:
- lib/acf/acf_interface.rb
Overview
Aws::AcfInterface – RightScale Amazon’s CloudFront interface
The AcfInterface class provides a complete interface to Amazon’s CloudFront service.
For explanations of the semantics of each call, please refer to Amazon’s documentation at developer.amazonwebservices.com/connect/kbcategory.jspa?categoryID=211
Example:
acf = Aws::AcfInterface.new('1E3GDYEOGFJPIT7XXXXXX','hgTHt68JY07JKUY08ftHYtERkjgtfERn57XXXXXX')
list = acf.list_distributions #=>
[{:status => "Deployed",
:domain_name => "d74zzrxmpmygb.6hops.net",
:aws_id => "E4U91HCJHGXVC",
:origin => "my-bucket.s3.amazonaws.com",
:cnames => ["x1.my-awesome-site.net", "x1.my-awesome-site.net"]
:comment => "My comments",
:last_modified_time => Wed Sep 10 17:00:04 UTC 2008 }, ..., {...} ]
distibution = list.first
info = acf.get_distribution(distibution[:aws_id]) #=>
{:enabled => true,
:caller_reference => "200809102100536497863003",
:e_tag => "E39OHHU1ON65SI",
:status => "Deployed",
:domain_name => "d3dxv71tbbt6cd.6hops.net",
:cnames => ["web1.my-awesome-site.net", "web2.my-awesome-site.net"]
:aws_id => "E2REJM3VUN5RSI",
:comment => "Woo-Hoo!",
:origin => "my-bucket.s3.amazonaws.com",
:last_modified_time => Wed Sep 10 17:00:54 UTC 2008 }
config = acf.get_distribution_config(distibution[:aws_id]) #=>
{:enabled => true,
:caller_reference => "200809102100536497863003",
:e_tag => "E39OHHU1ON65SI",
:cnames => ["web1.my-awesome-site.net", "web2.my-awesome-site.net"]
:comment => "Woo-Hoo!",
:origin => "my-bucket.s3.amazonaws.com"}
config[:comment] = 'Olah-lah!'
config[:enabled] = false
config[:cnames] << "web3.my-awesome-site.net"
acf.set_distribution_config(distibution[:aws_id], config) #=> true
Defined Under Namespace
Classes: AcfBaseDistributionParser, AcfDistributionConfigParser, AcfDistributionListParser, AcfDistributionParser, AcfStreamingDistributionListParser
Constant Summary collapse
- API_VERSION =
"2010-08-01"
- DEFAULT_HOST =
'cloudfront.amazonaws.com'
- DEFAULT_PORT =
443
- DEFAULT_PROTOCOL =
'https'
- DEFAULT_PATH =
'/'
- @@bench =
AwsBenchmarkingBlock.new
Constants included from AwsBaseInterface
Aws::AwsBaseInterface::DEFAULT_SIGNATURE_VERSION
Constants inherited from AwsBase
Instance Attribute Summary
Attributes included from AwsBaseInterface
#aws_access_key_id, #cache, #last_errors, #last_request, #last_request_id, #last_response, #logger, #params, #signature_version
Class Method Summary collapse
- .bench ⇒ Object
- .bench_service ⇒ Object
- .bench_xml ⇒ Object
- .connection_name ⇒ Object
-
.escape(text) ⇒ Object
—————————————————————– Helpers: —————————————————————–.
-
.unescape(text) ⇒ Object
:nodoc:.
Instance Method Summary collapse
-
#create_distribution(origin, comment = '', enabled = true, cnames = [], caller_reference = nil, default_root_object = nil) ⇒ Object
Create a new distribution.
- #create_streaming_distribution(origin, comment = '', enabled = true, cnames = [], caller_reference = nil, default_root_object = nil) ⇒ Object
-
#delete_distribution(aws_id, e_tag) ⇒ Object
Delete a distribution.
- #delete_streaming_distribution(aws_id, e_tag) ⇒ Object
- #distribution_config_for(origin, comment = '', enabled = true, cnames = [], caller_reference = nil, streaming = false, default_root_object = nil) ⇒ Object
-
#generate_call_reference ⇒ Object
:nodoc:.
-
#generate_request(method, path, body = nil, headers = {}) ⇒ Object
Generates request hash for REST API.
-
#get_distribution(aws_id) ⇒ Object
Get a distribution’s information.
-
#get_distribution_config(aws_id) ⇒ Object
Get a distribution’s configuration.
- #get_streaming_distribution(aws_id) ⇒ Object
-
#initialize(aws_access_key_id = nil, aws_secret_access_key = nil, params = {}) ⇒ AcfInterface
constructor
Create a new handle to a CloudFront account.
-
#list_distributions ⇒ Object
List distributions.
- #list_streaming_distributions ⇒ Object
-
#merge_headers(hash) ⇒ Object
:nodoc:.
-
#request_info(request, parser, options = {}, &block) ⇒ Object
Sends request to Amazon and parses the response.
-
#set_distribution_config(aws_id, config) ⇒ Object
Set a distribution’s configuration (the :origin and the :caller_reference cannot be changed).
- #set_streaming_distribution_config(aws_id, config) ⇒ Object
-
#xmlns ⇒ Object
:nodoc:.
Methods included from AwsBaseInterface
#cache_hits?, caching, caching=, #caching?, #close_conn, #close_connection, #connection, #generate_request2, #get_conn, #hash_params, #init, #multi_thread, #on_exception, #request_cache_or_info, #request_info2, #request_info3, #request_info_impl, #request_info_xml_simple, #signed_service_params, #symbolize, #update_cache
Methods inherited from AwsBase
amazon_problems, amazon_problems=
Constructor Details
#initialize(aws_access_key_id = nil, aws_secret_access_key = nil, params = {}) ⇒ AcfInterface
Create a new handle to a CloudFront account. All handles share the same per process or per thread HTTP connection to CloudFront. Each handle is for a specific account. The params have the following options:
-
:server
: CloudFront service host, default: DEFAULT_HOST -
:port
: CloudFront service port, default: DEFAULT_PORT -
:protocol
: ‘http’ or ‘https’, default: DEFAULT_PROTOCOL -
:multi_thread
: true=HTTP connection per thread, false=per process -
:logger
: for log messages, default: Rails.logger else STDOUT -
:cache
: true/false: caching for list_distributions method, default: false.
acf = Aws::AcfInterface.new('1E3GDYEOGFJPIT7XXXXXX','hgTHt68JY07JKUY08ftHYtERkjgtfERn57XXXXXX',
{:multi_thread => true, :logger => Logger.new('/tmp/x.log')}) #=> #<Aws::AcfInterface::0xb7b3c30c>
115 116 117 118 119 120 121 122 123 124 |
# File 'lib/acf/acf_interface.rb', line 115 def initialize(aws_access_key_id=nil, aws_secret_access_key=nil, params={}) init({:name => 'ACF', :default_host => ENV['ACF_URL'] ? URI.parse(ENV['ACF_URL']).host : DEFAULT_HOST, :default_port => ENV['ACF_URL'] ? URI.parse(ENV['ACF_URL']).port : DEFAULT_PORT, :default_service => ENV['ACF_URL'] ? URI.parse(ENV['ACF_URL']).path : DEFAULT_PATH, :default_protocol => ENV['ACF_URL'] ? URI.parse(ENV['ACF_URL']).scheme : DEFAULT_PROTOCOL}, aws_access_key_id || ENV['AWS_ACCESS_KEY_ID'], aws_secret_access_key || ENV['AWS_SECRET_ACCESS_KEY'], params) end |
Class Method Details
.bench ⇒ Object
91 92 93 |
# File 'lib/acf/acf_interface.rb', line 91 def self.bench @@bench end |
.bench_service ⇒ Object
98 99 100 |
# File 'lib/acf/acf_interface.rb', line 98 def self.bench_service @@bench.service end |
.bench_xml ⇒ Object
94 95 96 |
# File 'lib/acf/acf_interface.rb', line 94 def self.bench_xml @@bench.xml end |
.connection_name ⇒ Object
86 87 88 |
# File 'lib/acf/acf_interface.rb', line 86 def self.connection_name :acf_connection end |
.escape(text) ⇒ Object
Helpers:
162 163 164 |
# File 'lib/acf/acf_interface.rb', line 162 def self.escape(text) # :nodoc: REXML::Text::normalize(text) end |
.unescape(text) ⇒ Object
:nodoc:
166 167 168 |
# File 'lib/acf/acf_interface.rb', line 166 def self.unescape(text) # :nodoc: REXML::Text::unnormalize(text) end |
Instance Method Details
#create_distribution(origin, comment = '', enabled = true, cnames = [], caller_reference = nil, default_root_object = nil) ⇒ Object
Create a new distribution. Returns the just created distribution or Aws::AwsError exception.
acf.create_distribution('bucket-for-k-dzreyev.s3.amazonaws.com', 'Woo-Hoo!', true, ['web1.my-awesome-site.net'] ) #=>
{:comment => "Woo-Hoo!",
:enabled => true,
:location => "https://cloudfront.amazonaws.com/2008-06-30/distribution/E2REJM3VUN5RSI",
:status => "InProgress",
:aws_id => "E2REJM3VUN5RSI",
:domain_name => "d3dxv71tbbt6cd.6hops.net",
:origin => "my-bucket.s3.amazonaws.com",
:cnames => ["web1.my-awesome-site.net"]
:last_modified_time => Wed Sep 10 17:00:54 UTC 2008,
:caller_reference => "200809102100536497863003"}
227 228 229 230 231 |
# File 'lib/acf/acf_interface.rb', line 227 def create_distribution(origin, comment='', enabled=true, cnames=[], caller_reference=nil, default_root_object=nil) body = distribution_config_for(origin, comment, enabled, cnames, caller_reference, false, default_root_object) request_hash = generate_request('POST', 'distribution', body.strip) merge_headers(request_info(request_hash, AcfDistributionParser.new)) end |
#create_streaming_distribution(origin, comment = '', enabled = true, cnames = [], caller_reference = nil, default_root_object = nil) ⇒ Object
233 234 235 236 237 |
# File 'lib/acf/acf_interface.rb', line 233 def create_streaming_distribution(origin, comment='', enabled=true, cnames=[], caller_reference=nil, default_root_object=nil) body = distribution_config_for(origin, comment, enabled, cnames, caller_reference, true, default_root_object) request_hash = generate_request('POST', 'streaming-distribution', body.strip) merge_headers(request_info(request_hash, AcfDistributionParser.new)) end |
#delete_distribution(aws_id, e_tag) ⇒ Object
Delete a distribution. The enabled distribution cannot be deleted. Returns true
on success or Aws::AwsError exception.
acf.delete_distribution('E2REJM3VUN5RSI', 'E39OHHU1ON65SI') #=> true
338 339 340 341 342 |
# File 'lib/acf/acf_interface.rb', line 338 def delete_distribution(aws_id, e_tag) request_hash = generate_request('DELETE', "distribution/#{aws_id}", nil, 'If-Match' => e_tag) request_info(request_hash, RightHttp2xxParser.new) end |
#delete_streaming_distribution(aws_id, e_tag) ⇒ Object
344 345 346 347 348 |
# File 'lib/acf/acf_interface.rb', line 344 def delete_streaming_distribution(aws_id, e_tag) request_hash = generate_request('DELETE', "streaming-distribution/#{aws_id}", nil, 'If-Match' => e_tag) request_info(request_hash, RightHttp2xxParser.new) end |
#distribution_config_for(origin, comment = '', enabled = true, cnames = [], caller_reference = nil, streaming = false, default_root_object = nil) ⇒ Object
239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 |
# File 'lib/acf/acf_interface.rb', line 239 def distribution_config_for(origin, comment='', enabled=true, cnames=[], caller_reference=nil, streaming = false, default_root_object=nil) rootElement = streaming ? "StreamingDistributionConfig" : "DistributionConfig" # join CNAMES cnames_str = '' unless cnames.blank? cnames.to_a.each { |cname| cnames_str += "\n <CNAME>#{cname}</CNAME>" } end caller_reference ||= generate_call_reference root_ob = default_root_object ? "<DefaultRootObject>#{config[:default_root_object]}</DefaultRootObject>" : "" body = <<-EOXML <?xml version="1.0" encoding="UTF-8"?> <#{rootElement} xmlns=#{xmlns}> <Origin>#{origin}</Origin> <CallerReference>#{caller_reference}</CallerReference> #{cnames_str.lstrip} <Comment>#{AcfInterface::escape(comment.to_s)}</Comment> <Enabled>#{enabled}</Enabled> #{root_ob} </#{rootElement}> EOXML end |
#generate_call_reference ⇒ Object
:nodoc:
174 175 176 177 178 |
# File 'lib/acf/acf_interface.rb', line 174 def generate_call_reference # :nodoc: result = Time.now.strftime('%Y%m%d%H%M%S') 10.times { result << rand(10).to_s } result end |
#generate_request(method, path, body = nil, headers = {}) ⇒ Object
Generates request hash for REST API.
131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 |
# File 'lib/acf/acf_interface.rb', line 131 def generate_request(method, path, body=nil, headers={}) # :nodoc: headers['content-type'] ||= 'text/xml' if body headers['date'] = Time.now.httpdate # Auth signature = AwsUtils::sign(@aws_secret_access_key, headers['date']) headers['Authorization'] = "AWS #{@aws_access_key_id}:#{signature}" # Request path = "#{@params[:default_service]}/#{API_VERSION}/#{path}" request = "Net::HTTP::#{method.capitalize}".constantize.new(path) request.body = body if body # Set request headers headers.each { |key, value| request[key.to_s] = value } # prepare output hash {:request => request, :server => @params[:server], :port => @params[:port], :protocol => @params[:protocol]} end |
#get_distribution(aws_id) ⇒ Object
Get a distribution’s information. Returns a distribution’s information or Aws::AwsError exception.
acf.get_distribution('E2REJM3VUN5RSI') #=>
{:enabled => true,
:caller_reference => "200809102100536497863003",
:e_tag => "E39OHHU1ON65SI",
:status => "Deployed",
:domain_name => "d3dxv71tbbt6cd.6hops.net",
:cnames => ["web1.my-awesome-site.net", "web2.my-awesome-site.net"]
:aws_id => "E2REJM3VUN5RSI",
:comment => "Woo-Hoo!",
:origin => "my-bucket.s3.amazonaws.com",
:last_modified_time => Wed Sep 10 17:00:54 UTC 2008 }
276 277 278 279 |
# File 'lib/acf/acf_interface.rb', line 276 def get_distribution(aws_id) request_hash = generate_request('GET', "distribution/#{aws_id}") merge_headers(request_info(request_hash, AcfDistributionParser.new)) end |
#get_distribution_config(aws_id) ⇒ Object
Get a distribution’s configuration. Returns a distribution’s configuration or Aws::AwsError exception.
acf.get_distribution_config('E2REJM3VUN5RSI') #=>
{:enabled => true,
:caller_reference => "200809102100536497863003",
:e_tag => "E39OHHU1ON65SI",
:cnames => ["web1.my-awesome-site.net", "web2.my-awesome-site.net"]
:comment => "Woo-Hoo!",
:origin => "my-bucket.s3.amazonaws.com"}
297 298 299 300 |
# File 'lib/acf/acf_interface.rb', line 297 def get_distribution_config(aws_id) request_hash = generate_request('GET', "distribution/#{aws_id}/config") merge_headers(request_info(request_hash, AcfDistributionConfigParser.new)) end |
#get_streaming_distribution(aws_id) ⇒ Object
281 282 283 284 |
# File 'lib/acf/acf_interface.rb', line 281 def get_streaming_distribution(aws_id) request_hash = generate_request('GET', "streaming-distribution/#{aws_id}") merge_headers(request_info(request_hash, AcfDistributionParser.new)) end |
#list_distributions ⇒ Object
List distributions. Returns an array of distributions or Aws::AwsError exception.
acf.list_distributions #=>
[{:status => "Deployed",
:domain_name => "d74zzrxmpmygb.6hops.net",
:aws_id => "E4U91HCJHGXVC",
:cnames => ["web1.my-awesome-site.net", "web2.my-awesome-site.net"]
:origin => "my-bucket.s3.amazonaws.com",
:comment => "My comments",
:last_modified_time => Wed Sep 10 17:00:04 UTC 2008 }, ..., {...} ]
202 203 204 205 |
# File 'lib/acf/acf_interface.rb', line 202 def list_distributions request_hash = generate_request('GET', 'distribution') request_cache_or_info :list_distributions, request_hash, AcfDistributionListParser, @@bench end |
#list_streaming_distributions ⇒ Object
207 208 209 210 |
# File 'lib/acf/acf_interface.rb', line 207 def list_streaming_distributions request_hash = generate_request('GET', 'streaming-distribution') request_cache_or_info :list_streaming_distributions, request_hash, AcfStreamingDistributionListParser, @@bench end |
#merge_headers(hash) ⇒ Object
:nodoc:
180 181 182 183 184 |
# File 'lib/acf/acf_interface.rb', line 180 def merge_headers(hash) # :nodoc: hash[:location] = @last_response['Location'] if @last_response['Location'] hash[:e_tag] = @last_response['ETag'] if @last_response['ETag'] hash end |
#request_info(request, parser, options = {}, &block) ⇒ Object
Sends request to Amazon and parses the response. Raises AwsError if any banana happened. todo: remove this and switch to using request_info2
153 154 155 156 |
# File 'lib/acf/acf_interface.rb', line 153 def request_info(request, parser, ={}, &block) # :nodoc: conn = get_conn(self.class.connection_name, @params, @logger) request_info_impl(conn, @@bench, request, parser, , &block) end |
#set_distribution_config(aws_id, config) ⇒ Object
Set a distribution’s configuration (the :origin and the :caller_reference cannot be changed). Returns true
on success or Aws::AwsError exception.
config = acf.get_distribution_config('E2REJM3VUN5RSI') #=>
{:enabled => true,
:caller_reference => "200809102100536497863003",
:e_tag => "E39OHHU1ON65SI",
:cnames => ["web1.my-awesome-site.net", "web2.my-awesome-site.net"]
:comment => "Woo-Hoo!",
:origin => "my-bucket.s3.amazonaws.com",
:default_root_object =>
}
config[:comment] = 'Olah-lah!'
config[:enabled] = false
acf.set_distribution_config('E2REJM3VUN5RSI', config) #=> true
319 320 321 322 323 324 |
# File 'lib/acf/acf_interface.rb', line 319 def set_distribution_config(aws_id, config) body = distribution_config_for(config[:origin], config[:comment], config[:enabled], config[:cnames], config[:caller_reference], false) request_hash = generate_request('PUT', "distribution/#{aws_id}/config", body.strip, 'If-Match' => config[:e_tag]) request_info(request_hash, RightHttp2xxParser.new) end |
#set_streaming_distribution_config(aws_id, config) ⇒ Object
326 327 328 329 330 331 |
# File 'lib/acf/acf_interface.rb', line 326 def set_streaming_distribution_config(aws_id, config) body = distribution_config_for(config[:origin], config[:comment], config[:enabled], config[:cnames], config[:caller_reference], true) request_hash = generate_request('PUT', "streaming-distribution/#{aws_id}/config", body.strip, 'If-Match' => config[:e_tag]) request_info(request_hash, RightHttp2xxParser.new) end |
#xmlns ⇒ Object
:nodoc:
170 171 172 |
# File 'lib/acf/acf_interface.rb', line 170 def xmlns # :nodoc: %Q{"http://#{@params[:server]}/doc/#{API_VERSION}/"} end |