2014-02-01 21:13:17 -05:00
require 'fog/aws/core'
2011-08-31 16:52:53 -04:00
2010-11-01 15:31:39 -04:00
module Fog
2011-06-15 20:32:15 -04:00
module CDN
class AWS < Fog :: Service
2012-06-18 04:44:51 -04:00
extend Fog :: AWS :: CredentialFetcher :: ServiceMethods
2010-11-01 15:31:39 -04:00
2010-12-16 18:31:24 -05:00
requires :aws_access_key_id , :aws_secret_access_key
2012-06-18 04:44:51 -04:00
recognizes :host , :path , :port , :scheme , :version , :persistent , :use_iam_profile , :aws_session_token , :aws_credentials_expire_at
2010-11-01 15:31:39 -04:00
2012-09-26 12:51:00 -04:00
model_path 'fog/aws/models/cdn'
model :distribution
collection :distributions
model :streaming_distribution
collection :streaming_distributions
2010-11-01 15:31:39 -04:00
2011-08-24 15:20:21 -04:00
request_path 'fog/aws/requests/cdn'
2010-11-01 20:44:14 -04:00
request 'delete_distribution'
2011-07-25 15:42:12 -04:00
request 'delete_streaming_distribution'
2010-11-01 20:44:14 -04:00
request 'get_distribution'
2010-11-01 15:31:39 -04:00
request 'get_distribution_list'
2011-07-25 15:42:12 -04:00
request 'get_invalidation_list'
2012-09-20 14:25:27 -04:00
request 'get_invalidation'
2011-07-25 15:42:12 -04:00
request 'get_streaming_distribution'
request 'get_streaming_distribution_list'
2010-11-01 20:44:14 -04:00
request 'post_distribution'
2011-07-25 15:42:12 -04:00
request 'post_streaming_distribution'
2010-11-01 18:01:55 -04:00
request 'post_invalidation'
2010-11-09 18:49:38 -05:00
request 'put_distribution_config'
2011-07-25 15:42:12 -04:00
request 'put_streaming_distribution_config'
2010-11-01 15:31:39 -04:00
class Mock
def self . data
2012-09-27 18:00:16 -04:00
@data || = Hash . new do | hash , key |
hash [ key ] = {
:distributions = > { } ,
:streaming_distributions = > { } ,
:invalidations = > { }
2010-11-01 15:31:39 -04:00
}
end
end
2011-05-19 10:05:33 -04:00
def self . reset
@data = nil
end
2010-11-01 15:31:39 -04:00
def initialize ( options = { } )
2012-06-18 04:44:51 -04:00
@use_iam_profile = options [ :use_iam_profile ]
setup_credentials ( options )
2011-05-19 18:35:33 -04:00
end
def data
2012-09-27 18:00:16 -04:00
self . class . data [ @aws_access_key_id ]
2011-03-10 14:16:55 -05:00
end
def reset_data
2012-09-27 18:00:16 -04:00
self . class . data . delete ( @aws_access_key_id )
2010-11-01 15:31:39 -04:00
end
def signature ( params )
" foo "
end
2011-03-10 14:16:55 -05:00
2012-06-18 04:44:51 -04:00
def setup_credentials ( options = { } )
@aws_access_key_id = options [ :aws_access_key_id ]
end
2012-09-27 18:00:16 -04:00
def self . distribution_id
random_id ( 14 )
end
def self . generic_id
random_id ( 14 )
end
def self . domain_name
" #{ random_id ( 12 ) . downcase } .cloudfront.net "
end
def self . random_id ( length )
Fog :: Mock . random_selection ( " abcdefghijklmnopqrstuvwxyz0123456789 " , length ) . upcase
end
CDN_ERRORS = {
:access_denies = > { :code = > 'AccessDenied' , :msg = > 'Access denied.' , :status = > 403 } ,
:inappropriate_xml = > { :code = > 'InappropriateXML' , :msg = > 'The XML document you provided was well-formed and valid, but not appropriate for this operation.' , :status = > 400 } ,
:internal_error = > { :code = > 'InternalError' , :msg = > 'We encountered an internal error. Please try again.' , :status = > 500 } ,
:invalid_action = > { :code = > 'InvalidAction' , :msg = > 'The action specified is not valid.' , :status = > 400 } ,
:invalid_argument = > { :code = > 'InvalidArgument' , :msg = > '%s' , :status = > 400 } ,
:not_implemented = > { :code = > 'NotImplemented' , :msg = > 'Not implemented.' , :status = > 501 } ,
:no_such_distribution = > { :code = > 'NoSuchDistribution' , :msg = > 'The specified distribution does not exist' , :status = > 404 } ,
:no_such_streaming_distribution = > { :code = > 'NoSuchStreamingDistribution' , :msg = > 'The specified streaming distribution does not exist' , :status = > 404 } ,
:no_such_invalidation = > { :code = > 'NoSuchInvalidation' , :msg = > 'The specified invalidation does not exist' , :status = > 404 } ,
:cname_exists = > { :code = > 'CNAMEAlreadyExists' , :msg = > 'One or more of the CNAMEs you provided are already associated with a different distribution' , :status = > 409 } ,
:illegal_update = > { :code = > 'IllegalUpdate' , :msg = > 'Origin and CallerReference cannot be updated.' , :status = > 400 } ,
:invalid_if_match_version = > { :code = > 'InvalidIfMatchVersion' , :msg = > 'The If-Match version is missing or not valid for the distribution.' , :status = > 400 } ,
:distribution_not_disabled = > { :code = > 'DistributionNotDisabled' , :msg = > 'The distribution you are trying to delete has not been disabled.' , :status = > 409 } ,
}
def self . error ( code , argument = '' )
if error = CDN_ERRORS [ code ]
raise_error ( error [ :status ] , error [ :code ] , error [ :msg ] % argument )
end
end
def self . raise_error ( status , code , message = '' )
response = Excon :: Response . new
response . status = status
response . body = <<EOF
< ErrorResponse xmlns = " http://cloudfront.amazonaws.com/doc/2010-11-01/ " >
< Error >
< Type > Sender < / Type>
< Code > #{code}</Code>
< Message > #{message}.</Message>
< / Error>
< RequestId > #{Fog::AWS::Mock.request_id}</RequestId>
< / ErrorResponse>
EOF
raise ( Excon :: Errors . status_error ( { :expects = > 201 } , response ) )
end
2010-11-01 15:31:39 -04:00
end
class Real
2012-06-18 04:44:51 -04:00
include Fog :: AWS :: CredentialFetcher :: ConnectionMethods
2010-11-01 15:31:39 -04:00
# Initialize connection to Cloudfront
#
# ==== Notes
# options parameter must include values for :aws_access_key_id and
# :aws_secret_access_key in order to create a connection
#
# ==== Examples
# cdn = Fog::AWS::CDN.new(
# :aws_access_key_id => your_aws_access_key_id,
# :aws_secret_access_key => your_aws_secret_access_key
# )
#
# ==== Parameters
# * options<~Hash> - config arguments for connection. Defaults to {}.
#
# ==== Returns
# * cdn object with connection to aws.
def initialize ( options = { } )
2011-02-16 20:25:50 -05:00
require 'fog/core/parser'
2012-06-18 04:44:51 -04:00
@use_iam_profile = options [ :use_iam_profile ]
setup_credentials ( options )
2011-09-12 11:01:48 -04:00
@connection_options = options [ :connection_options ] || { }
@host = options [ :host ] || 'cloudfront.amazonaws.com'
@path = options [ :path ] || '/'
2012-06-21 07:56:46 -04:00
@persistent = options . fetch ( :persistent , true )
2011-09-12 11:01:48 -04:00
@port = options [ :port ] || 443
@scheme = options [ :scheme ] || 'https'
@version = options [ :version ] || '2010-11-01'
2014-02-25 16:42:34 -05:00
@connection = Fog :: XML :: SAXParserConnection . new ( " #{ @scheme } :// #{ @host } : #{ @port } #{ @path } " , @persistent , @connection_options )
2010-11-01 15:31:39 -04:00
end
def reload
@connection . reset
end
private
2012-06-18 04:44:51 -04:00
def setup_credentials ( options )
@aws_access_key_id = options [ :aws_access_key_id ]
@aws_secret_access_key = options [ :aws_secret_access_key ]
@aws_session_token = options [ :aws_session_token ]
@aws_credentials_expire_at = options [ :aws_credentials_expire_at ]
@hmac = Fog :: HMAC . new ( 'sha1' , @aws_secret_access_key )
end
2010-11-01 15:31:39 -04:00
def request ( params , & block )
2012-06-18 04:44:51 -04:00
refresh_credentials_if_expired
2010-11-01 15:31:39 -04:00
params [ :headers ] || = { }
2011-01-28 18:33:35 -05:00
params [ :headers ] [ 'Date' ] = Fog :: Time . now . to_date_header
[AWS] make beanstalk, cdn, cloudformation, cloudwatch, elasticache, elb, storage, rds, ses, sns, route53 temporary credential friendly
2012-06-20 18:16:34 -04:00
params [ :headers ] [ 'x-amz-security-token' ] = @aws_session_token if @aws_session_token
2010-11-01 15:31:39 -04:00
params [ :headers ] [ 'Authorization' ] = " AWS #{ @aws_access_key_id } : #{ signature ( params ) } "
2013-06-14 01:55:03 -04:00
params [ :path ] = " / #{ @version } / #{ params [ :path ] } "
2010-11-01 15:31:39 -04:00
@connection . request ( params , & block )
end
def signature ( params )
string_to_sign = params [ :headers ] [ 'Date' ]
signed_string = @hmac . sign ( string_to_sign )
2012-05-14 15:24:29 -04:00
Base64 . encode64 ( signed_string ) . chomp!
2010-11-01 15:31:39 -04:00
end
end
end
end
end