mirror of
https://github.com/fog/fog.git
synced 2022-11-09 13:51:43 -05:00
Merge pull request #1545 from rackspace/purge_objects
[Rackspace|CDN] Purge CDN-Enabled Objects
This commit is contained in:
commit
73e823f56e
10 changed files with 250 additions and 6 deletions
|
@ -19,6 +19,8 @@ module Fog
|
|||
class LoadError < LoadError; end
|
||||
|
||||
class TimeoutError< Fog::Errors::Error; end
|
||||
|
||||
class NotImplemented < Fog::Errors::Error; end
|
||||
|
||||
# @return [String] The error message that will be raised, if credentials cannot be found
|
||||
def self.missing_credentials
|
||||
|
|
|
@ -8,13 +8,12 @@ module Fog
|
|||
requires :rackspace_api_key, :rackspace_username
|
||||
recognizes :rackspace_auth_url, :persistent
|
||||
|
||||
model_path 'fog/rackspace/models/cdn'
|
||||
|
||||
request_path 'fog/rackspace/requests/cdn'
|
||||
request :get_containers
|
||||
request :head_container
|
||||
request :post_container
|
||||
request :put_container
|
||||
request :delete_object
|
||||
|
||||
class Mock
|
||||
|
||||
|
@ -39,6 +38,11 @@ module Fog
|
|||
def reset_data
|
||||
self.class.data.delete(@rackspace_username)
|
||||
end
|
||||
|
||||
def purge(object)
|
||||
return true if object.is_a? Fog::Storage::Rackspace::File
|
||||
raise Fog::Errors::NotImplemented.new("#{object.class} does not support CDN purging") if object
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
|
@ -61,6 +65,15 @@ module Fog
|
|||
@enabled = true
|
||||
end
|
||||
end
|
||||
|
||||
def purge(object)
|
||||
if object.is_a? Fog::Storage::Rackspace::File
|
||||
delete_object object.directory.key, object.key
|
||||
else
|
||||
raise Fog::Errors::NotImplemented.new("#{object.class} does not support CDN purging") if object
|
||||
end
|
||||
true
|
||||
end
|
||||
|
||||
def enabled?
|
||||
@enabled
|
||||
|
|
|
@ -31,9 +31,13 @@ module Fog
|
|||
end
|
||||
end
|
||||
|
||||
def public=(new_public)
|
||||
def public=(new_public)
|
||||
@public = new_public
|
||||
end
|
||||
|
||||
def public?
|
||||
@public ||= !public_url.nil?
|
||||
end
|
||||
|
||||
def public_url
|
||||
requires :key
|
||||
|
@ -56,17 +60,17 @@ module Fog
|
|||
requires :key
|
||||
service.put_container(key)
|
||||
|
||||
if service.cdn && @public
|
||||
if service.cdn && public?
|
||||
# if public and CDN connection then update cdn to public
|
||||
uri_header = 'X-CDN-URI'
|
||||
if service.rackspace_cdn_ssl == true
|
||||
uri_header = 'X-CDN-SSL-URI'
|
||||
end
|
||||
@public_url = service.cdn.put_container(key, 'X-CDN-Enabled' => 'True').headers[uri_header]
|
||||
elsif service.cdn && !@public
|
||||
elsif service.cdn && !public?
|
||||
service.cdn.put_container(key, 'X-CDN-Enabled' => 'False')
|
||||
@public_url = nil
|
||||
elsif !service.cdn && @public
|
||||
elsif !service.cdn && public?
|
||||
# if public but no CDN connection then error
|
||||
raise(Fog::Storage::Rackspace::Error.new("Directory can not be set as :public without a CDN provided"))
|
||||
end
|
||||
|
|
|
@ -63,11 +63,23 @@ module Fog
|
|||
def public=(new_public)
|
||||
new_public
|
||||
end
|
||||
|
||||
def public?
|
||||
directory.public?
|
||||
end
|
||||
|
||||
def public_url
|
||||
requires :key
|
||||
self.collection.get_url(self.key)
|
||||
end
|
||||
|
||||
def purge_from_cdn
|
||||
if public?
|
||||
service.cdn.purge(self)
|
||||
else
|
||||
false
|
||||
end
|
||||
end
|
||||
|
||||
def save(options = {})
|
||||
requires :body, :directory, :key
|
||||
|
|
37
lib/fog/rackspace/requests/cdn/delete_object.rb
Normal file
37
lib/fog/rackspace/requests/cdn/delete_object.rb
Normal file
|
@ -0,0 +1,37 @@
|
|||
module Fog
|
||||
module CDN
|
||||
class Rackspace
|
||||
class Real
|
||||
|
||||
# Delete an existing object
|
||||
#
|
||||
# ==== Parameters
|
||||
# * container<~String> - Name of container to delete
|
||||
# * object<~String> - Name of object to delete
|
||||
#
|
||||
def delete_object(container, object)
|
||||
request(
|
||||
:expects => 204,
|
||||
:method => 'DELETE',
|
||||
:path => "#{Fog::Rackspace.escape(container)}/#{Fog::Rackspace.escape(object)}"
|
||||
)
|
||||
end
|
||||
end
|
||||
|
||||
class Mock
|
||||
|
||||
def delete_object(container, object)
|
||||
response = Excon::Response.new
|
||||
response.status = 204
|
||||
response.headers = {
|
||||
"Content-Length"=>"0",
|
||||
"Date"=>"Fri, 01 Feb 2013 21:34:33 GMT",
|
||||
"X-Trans-Id"=>"tx860f26bd76284a849384c0a467767b57"
|
||||
}
|
||||
response.body = ""
|
||||
response
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
|
@ -26,6 +26,40 @@ module Fog
|
|||
end
|
||||
|
||||
end
|
||||
|
||||
class Mock
|
||||
|
||||
def get_containers(options = {})
|
||||
response = Excon::Response.new
|
||||
response.status = 200
|
||||
response.headers = {
|
||||
"Content-Length"=>"4402",
|
||||
"Date"=>"Fri, 01 Feb 2013 21:16:54 GMT",
|
||||
"Content-Type"=>"application/json",
|
||||
"X-Trans-Id"=>"tx6c79ea47300941c49f2291b4d47d4ef5"
|
||||
}
|
||||
response.body = [
|
||||
{ "log_retention"=>false,
|
||||
"cdn_ios_uri"=>"http://a590286a323fec6aed22-d1e9259b2132e81da48ed3e1e802ef22.iosr.cf1.rackcdn.com",
|
||||
"ttl"=>3600,
|
||||
"cdn_enabled"=>true,
|
||||
"cdn_streaming_uri"=>"http://168e307d41afe64f1a62-d1e9259b2132e81da48ed3e1e802ef22.r2.stream.cf1.rackcdn.com",
|
||||
"name"=>"brown", "cdn_uri"=>"http://6e8f4bf5125c9c2e4e3a-d1e9259b2132e81da48ed3e1e802ef22.r2.cf1.rackcdn.com",
|
||||
"cdn_ssl_uri"=>"https://f83cb7d39e0b9ff9581b-d1e9259b2132e81da48ed3e1e802ef22.ssl.cf1.rackcdn.com"
|
||||
},
|
||||
{ "log_retention"=>false,
|
||||
"cdn_ios_uri"=>"http://b141f80caedd02158f10-cf33674d895dc8b8e6e5207fdbd5cae4.iosr.cf1.rackcdn.com",
|
||||
"ttl"=>5000,
|
||||
"cdn_enabled"=>false,
|
||||
"cdn_streaming_uri"=>"http://ea5feee96b8087a3d5e5-cf33674d895dc8b8e6e5207fdbd5cae4.r72.stream.cf1.rackcdn.com",
|
||||
"name"=>"fogcontainertests", "cdn_uri"=>"http://0115a9de56617a5d5473-cf33674d895dc8b8e6e5207fdbd5cae4.r72.cf1.rackcdn.com",
|
||||
"cdn_ssl_uri"=>"https://a5df8bd8a418ca88061e-cf33674d895dc8b8e6e5207fdbd5cae4.ssl.cf1.rackcdn.com"
|
||||
}
|
||||
]
|
||||
response
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -28,6 +28,30 @@ module Fog
|
|||
end
|
||||
|
||||
end
|
||||
|
||||
class Mock
|
||||
|
||||
def head_container(container)
|
||||
raise Fog::Storage::Rackspace::NotFound.new "#{container} not found" unless container == 'fogcontainertests'
|
||||
response = Excon::Response.new
|
||||
response.status = 204
|
||||
response.headers = {
|
||||
"X-Cdn-Uri"=>"http://e4bbc22477d80eaf22bd-ca4e4e61e477bbd430e1f5b9dc9a19f5.r53.cf1.rackcdn.com",
|
||||
"X-Cdn-Ios-Uri"=>"http://3c10ef49037f74416445-ca4e4e61e477bbd430e1f5b9dc9a19f5.iosr.cf1.rackcdn.com",
|
||||
"X-Cdn-Ssl-Uri"=>"https://b722b8ee248259c37901-ca4e4e61e477bbd430e1f5b9dc9a19f5.ssl.cf1.rackcdn.com",
|
||||
"X-Log-Retention"=>"False",
|
||||
"X-Cdn-Enabled"=>"True",
|
||||
"Content-Length"=>"0",
|
||||
"Date"=>"Fri, 01 Feb 2013 21:25:57 GMT",
|
||||
"X-Cdn-Streaming-Uri"=>"http://b82027c64cb4dd03670a-ca4e4e61e477bbd430e1f5b9dc9a19f5.r53.stream.cf1.rackcdn.com",
|
||||
"X-Ttl"=>"259200",
|
||||
"X-Trans-Id"=>"txca40ffd0412943608bb3e9656c8b81ef"
|
||||
}
|
||||
response.body = ""
|
||||
response
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -25,6 +25,27 @@ module Fog
|
|||
end
|
||||
|
||||
end
|
||||
|
||||
class Mock
|
||||
|
||||
def post_container(name, options = {})
|
||||
raise Fog::Storage::Rackspace::NotFound.new "#{name} not found" unless name == 'fogcontainertests'
|
||||
response = Excon::Response.new
|
||||
response.status = 202
|
||||
response.headers = {
|
||||
"X-Cdn-Uri"=>"http://e4bbc22477d80eaf22bd-ca4e4e61e477bbd430e1f5b9dc9a19f5.r53.cf1.rackcdn.com",
|
||||
"X-Cdn-Ios-Uri"=>"http://3c10ef49037f74416445-ca4e4e61e477bbd430e1f5b9dc9a19f5.iosr.cf1.rackcdn.com",
|
||||
"X-Cdn-Ssl-Uri"=>"https://b722b8ee248259c37901-ca4e4e61e477bbd430e1f5b9dc9a19f5.ssl.cf1.rackcdn.com",
|
||||
"Content-Length"=>"58", "Date"=>"Fri, 01 Feb 2013 21:31:30 GMT",
|
||||
"Content-Type"=>"text/plain; charset=UTF-8",
|
||||
"X-Cdn-Streaming-Uri"=>"http://b82027c64cb4dd03670a-ca4e4e61e477bbd430e1f5b9dc9a19f5.r53.stream.cf1.rackcdn.com",
|
||||
"X-Trans-Id"=>"tx4a3206e63dfc446bb5b60e34a62f749d"
|
||||
}
|
||||
response.body = "202 Accepted\n\nThe request is accepted for processing.\n\n "
|
||||
response
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -25,6 +25,27 @@ module Fog
|
|||
end
|
||||
|
||||
end
|
||||
|
||||
class Mock
|
||||
|
||||
def put_container(name, options = {})
|
||||
response = Excon::Response.new
|
||||
response.status = 201
|
||||
response.headers = {
|
||||
"X-Cdn-Uri"=>"http://e4bbc22477d80eaf22bd-ca4e4e61e477bbd430e1f5b9dc9a19f5.r53.cf1.rackcdn.com",
|
||||
"X-Cdn-Ios-Uri"=>"http://3c10ef49037f74416445-ca4e4e61e477bbd430e1f5b9dc9a19f5.iosr.cf1.rackcdn.com",
|
||||
"X-Cdn-Ssl-Uri"=>"https://b722b8ee248259c37901-ca4e4e61e477bbd430e1f5b9dc9a19f5.ssl.cf1.rackcdn.com",
|
||||
"Content-Length"=>"18",
|
||||
"Date"=>"Fri, 01 Feb 2013 21:21:45 GMT",
|
||||
"Content-Type"=>"text/plain; charset=UTF-8",
|
||||
"X-Cdn-Streaming-Uri"=>"http://b82027c64cb4dd03670a-ca4e4e61e477bbd430e1f5b9dc9a19f5.r53.stream.cf1.rackcdn.com",
|
||||
"X-Trans-Id"=>"tx1b41ec63189f4862baa65e0c08711772"
|
||||
}
|
||||
response.body = "201 Created\n\n\n\n "
|
||||
response
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
76
tests/rackspace/requests/cdn/cdn_tests.rb
Normal file
76
tests/rackspace/requests/cdn/cdn_tests.rb
Normal file
|
@ -0,0 +1,76 @@
|
|||
Shindo.tests('Fog::CDN[:rackspace] | CDN requests', ['rackspace']) do
|
||||
|
||||
@container_format = [String]
|
||||
|
||||
@containers_format = [{
|
||||
"cdn_ios_uri" => String,
|
||||
"log_retention" => Fog::Boolean,
|
||||
"ttl" => Fixnum,
|
||||
"cdn_streaming_uri" => String,
|
||||
"cdn_enabled" => Fog::Boolean,
|
||||
"name" => String,
|
||||
"cdn_ssl_uri" => String,
|
||||
"cdn_uri" => String
|
||||
}]
|
||||
|
||||
@container_headers = {
|
||||
"Content-Length" => String,
|
||||
"X-Cdn-Enabled" => String,
|
||||
"X-Log-Retention" => String,
|
||||
"X-Cdn-Ios-Uri" => String,
|
||||
"X-Ttl" => String,
|
||||
"X-Cdn-Uri" => String,
|
||||
"X-Cdn-Ssl-Uri" => String,
|
||||
"X-Cdn-Streaming-Uri" => String,
|
||||
"X-Trans-Id" => String,
|
||||
"Date" => String
|
||||
}
|
||||
|
||||
begin
|
||||
unless Fog.mocking?
|
||||
@directory = Fog::Storage[:rackspace].directories.create(:key => 'fogcontainertests')
|
||||
@file = @directory.files.create(:key => 'fog_object', :body => lorem_file)
|
||||
end
|
||||
|
||||
tests('success') do
|
||||
|
||||
tests("#put_container('fogcontainertests')").succeeds do
|
||||
Fog::CDN[:rackspace].put_container('fogcontainertests', {'X-CDN-Enabled' => true })
|
||||
end
|
||||
|
||||
tests("#get_containers").formats(@containers_format) do
|
||||
Fog::CDN[:rackspace].get_containers.body
|
||||
end
|
||||
|
||||
tests("#head_container('fogcontainertests')").formats(@container_headers) do
|
||||
Fog::CDN[:rackspace].head_container('fogcontainertests').headers
|
||||
end
|
||||
|
||||
tests("#post_container('fogcontainertests')").succeeds do
|
||||
Fog::CDN[:rackspace].post_container('fogcontainertests', 'X-TTL' => 5000)
|
||||
end
|
||||
|
||||
#NOTE: you are only allow 25 object purges per day. If this fails, you may be over the limit
|
||||
tests("#delete_object('fog_object')").succeeds do
|
||||
Fog::CDN[:rackspace].delete_object('fogcontainertests', 'fog_object')
|
||||
end
|
||||
end
|
||||
ensure
|
||||
unless Fog.mocking?
|
||||
@file.destroy if @file
|
||||
@directory.destroy if @directory
|
||||
end
|
||||
end
|
||||
|
||||
tests('failure') do
|
||||
|
||||
tests("#head_container('missing_container')").raises(Fog::Storage::Rackspace::NotFound) do
|
||||
Fog::CDN[:rackspace].head_container('missing_container')
|
||||
end
|
||||
|
||||
tests("#post_container('missing_container')").raises(Fog::Storage::Rackspace::NotFound) do
|
||||
Fog::CDN[:rackspace].post_container('missing_container', 'X-TTL' => 5000)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
Loading…
Reference in a new issue