2012-05-14 14:10:36 -04:00
require 'fog/core'
2012-06-18 04:44:51 -04:00
require 'fog/aws/credential_fetcher'
2012-09-01 11:42:02 -04:00
require 'fog/aws/signaturev4'
2009-08-10 11:30:28 -04:00
module Fog
module AWS
2012-12-05 15:12:25 -05:00
COMPLIANT_BUCKET_NAMES = / ^(?:[a-z]| \ d(?! \ d{0,2}(?: \ . \ d{1,3}){3}$))(?:[a-z0-9]| \ -(?![ \ .])){1,61}[a-z0-9]$ /
2009-08-10 11:30:28 -04:00
2010-09-07 15:21:16 -04:00
extend Fog :: Provider
2011-09-22 20:00:48 -04:00
service ( :auto_scaling , 'aws/auto_scaling' , 'AutoScaling' )
2012-03-15 20:19:15 -04:00
service ( :beanstalk , 'aws/beanstalk' , 'ElasticBeanstalk' )
2011-09-22 20:00:48 -04:00
service ( :cdn , 'aws/cdn' , 'CDN' )
service ( :compute , 'aws/compute' , 'Compute' )
service ( :cloud_formation , 'aws/cloud_formation' , 'CloudFormation' )
service ( :cloud_watch , 'aws/cloud_watch' , 'CloudWatch' )
2012-01-21 21:31:36 -05:00
service ( :dynamodb , 'aws/dynamodb' , 'DynamoDB' )
2011-09-22 20:00:48 -04:00
service ( :dns , 'aws/dns' , 'DNS' )
2011-09-27 10:48:38 -04:00
service ( :elasticache , 'aws/elasticache' , 'Elasticache' )
2011-09-22 20:00:48 -04:00
service ( :elb , 'aws/elb' , 'ELB' )
2011-11-04 12:29:23 -04:00
service ( :emr , 'aws/emr' , 'EMR' )
2012-09-01 11:44:04 -04:00
service ( :glacier , 'aws/glacier' , 'Glacier' )
2011-09-22 20:00:48 -04:00
service ( :iam , 'aws/iam' , 'IAM' )
service ( :rds , 'aws/rds' , 'RDS' )
service ( :ses , 'aws/ses' , 'SES' )
service ( :simpledb , 'aws/simpledb' , 'SimpleDB' )
service ( :sns , 'aws/sns' , 'SNS' )
service ( :sqs , 'aws/sqs' , 'SQS' )
2011-11-13 15:16:22 -05:00
service ( :sts , 'aws/sts' , 'STS' )
2011-09-22 20:00:48 -04:00
service ( :storage , 'aws/storage' , 'Storage' )
2010-09-07 15:21:16 -04:00
2010-09-22 20:20:59 -04:00
def self . indexed_param ( key , values )
2010-01-31 17:07:26 -05:00
params = { }
2010-05-17 23:50:51 -04:00
unless key . include? ( '%d' )
key << '.%d'
end
2010-01-31 17:07:26 -05:00
[ * values ] . each_with_index do | value , index |
2011-09-14 00:46:41 -04:00
if value . respond_to? ( 'keys' )
k = format ( key , index + 1 )
value . each do | vkey , vvalue |
params [ " #{ k } . #{ vkey } " ] = vvalue
end
else
params [ format ( key , index + 1 ) ] = value
end
2010-01-31 17:07:26 -05:00
end
params
end
2012-01-21 21:31:36 -05:00
2011-09-14 00:46:41 -04:00
def self . serialize_keys ( key , value , options = { } )
case value
when Hash
value . each do | k , v |
options . merge! ( serialize_keys ( " #{ key } . #{ k } " , v ) )
end
return options
when Array
value . each_with_index do | it , idx |
options . merge! ( serialize_keys ( " #{ key } .member. #{ ( idx + 1 ) } " , it ) )
end
return options
else
return { key = > value }
end
end
2010-01-31 17:07:26 -05:00
2012-03-31 15:20:31 -04:00
def self . indexed_request_param ( name , values )
idx = - 1
Array ( values ) . inject ( { } ) do | params , value |
params [ " #{ name } . #{ idx += 1 } " ] = value
params
end
end
2010-10-04 18:46:12 -04:00
def self . indexed_filters ( filters )
params = { }
filters . keys . each_with_index do | key , key_index |
key_index += 1
params [ format ( 'Filter.%d.Name' , key_index ) ] = key
[ * filters [ key ] ] . each_with_index do | value , value_index |
value_index += 1
params [ format ( 'Filter.%d.Value.%d' , key_index , value_index ) ] = value
end
end
params
end
2011-04-09 20:16:42 -04:00
def self . escape ( string )
2011-07-13 05:13:59 -04:00
string . gsub ( / ([^a-zA-Z0-9_. \ -~]+) / ) {
2011-07-12 09:59:51 -04:00
" % " + $1 . unpack ( " H2 " * $1 . bytesize ) . join ( " % " ) . upcase
2011-07-13 05:13:59 -04:00
}
2011-04-09 20:16:42 -04:00
end
2011-05-18 15:33:13 -04:00
2010-05-02 16:25:39 -04:00
def self . signed_params ( params , options = { } )
params . merge! ( {
'AWSAccessKeyId' = > options [ :aws_access_key_id ] ,
'SignatureMethod' = > 'HmacSHA256' ,
'SignatureVersion' = > '2' ,
'Timestamp' = > Time . now . utc . strftime ( " %Y-%m-%dT%H:%M:%SZ " ) ,
'Version' = > options [ :version ]
} )
2011-11-13 15:16:46 -05:00
params . merge! ( {
'SecurityToken' = > options [ :aws_session_token ]
} ) if options [ :aws_session_token ]
2010-05-02 16:25:39 -04:00
body = ''
for key in params . keys . sort
unless ( value = params [ key ] ) . nil?
2011-04-09 20:16:42 -04:00
body << " #{ key } = #{ escape ( value . to_s ) } & "
2010-05-02 16:25:39 -04:00
end
end
2010-12-23 16:54:02 -05:00
string_to_sign = " POST \n #{ options [ :host ] } : #{ options [ :port ] } \n #{ options [ :path ] } \n " << body . chop
2010-06-16 00:04:16 -04:00
signed_string = options [ :hmac ] . sign ( string_to_sign )
2011-06-07 18:28:38 -04:00
body << " Signature= #{ escape ( Base64 . encode64 ( signed_string ) . chomp! ) } "
2010-05-02 16:25:39 -04:00
body
end
2010-03-18 00:02:11 -04:00
class Mock
2009-08-22 01:04:12 -04:00
2011-07-06 17:23:41 -04:00
def self . arn ( vendor , account_id , path , region = nil )
" arn:aws: #{ vendor } : #{ region } : #{ account_id } : #{ path } "
end
2011-05-17 13:32:44 -04:00
def self . availability_zone ( region )
" #{ region } #{ Fog :: Mock . random_selection ( 'abcd' , 1 ) } "
2010-03-18 00:02:11 -04:00
end
2009-09-08 00:25:50 -04:00
2010-03-18 00:02:11 -04:00
def self . box_usage
sprintf ( " %0.10f " , rand / 100 ) . to_f
end
2009-09-11 23:47:32 -04:00
2011-06-21 13:27:08 -04:00
def self . console_output
# "[ 0.000000] Linux version 2.6.18-xenU-ec2-v1.2 (root@domU-12-31-39-07-51-82) (gcc version 4.1.2 20070626 (Red Hat 4.1.2-13)) #2 SMP Wed Aug 19 09:04:38 EDT 2009"
Base64 . decode64 ( " WyAwLjAwMDAwMF0gTGludXggdmVyc2lvbiAyLjYuMTgteGVuVS1lYzItdjEu \n MiAocm9vdEBkb21VLTEyLTMxLTM5LTA3LTUxLTgyKSAoZ2NjIHZlcnNpb24g \n NC4xLjIgMjAwNzA2MjYgKFJlZCBIYXQgNC4xLjItMTMpKSAjMiBTTVAgV2Vk \n IEF1ZyAxOSAwOTowNDozOCBFRFQgMjAwOQ== \n " )
end
2010-05-13 16:59:33 -04:00
def self . dns_name_for ( ip_address )
" ec2- #{ ip_address . gsub ( '.' , '-' ) } .compute-1.amazonaws.com "
end
def self . private_dns_name_for ( ip_address )
" ip- #{ ip_address . gsub ( '.' , '-' ) } .ec2.internal "
end
2010-03-18 00:02:11 -04:00
def self . image
path = [ ]
( rand ( 3 ) + 2 ) . times do
2011-01-04 14:35:58 -05:00
path << Fog :: Mock . random_letters ( rand ( 9 ) + 8 )
2010-03-18 00:02:11 -04:00
end
{
2011-01-04 14:35:58 -05:00
" imageOwnerId " = > Fog :: Mock . random_letters ( rand ( 5 ) + 4 ) ,
2010-07-25 16:13:35 -04:00
" blockDeviceMapping " = > [ ] ,
2010-07-25 12:24:08 -04:00
" productCodes " = > [ ] ,
" kernelId " = > kernel_id ,
" ramdiskId " = > ramdisk_id ,
" imageState " = > " available " ,
" imageId " = > image_id ,
" architecture " = > " i386 " ,
" isPublic " = > true ,
" imageLocation " = > path . join ( '/' ) ,
" imageType " = > " machine " ,
" rootDeviceType " = > [ " ebs " , " instance-store " ] [ rand ( 2 ) ] ,
" rootDeviceName " = > " /dev/sda1 "
2010-03-18 00:02:11 -04:00
}
end
2009-09-12 14:58:05 -04:00
2010-03-18 00:02:11 -04:00
def self . image_id
2011-01-04 14:35:58 -05:00
" ami- #{ Fog :: Mock . random_hex ( 8 ) } "
2010-03-18 00:02:11 -04:00
end
2009-08-17 01:19:35 -04:00
2010-03-18 00:02:11 -04:00
def self . key_fingerprint
fingerprint = [ ]
20 . times do
2011-01-04 14:35:58 -05:00
fingerprint << Fog :: Mock . random_hex ( 2 )
2009-08-22 01:04:12 -04:00
end
2010-03-18 00:02:11 -04:00
fingerprint . join ( ':' )
end
2009-08-22 01:04:12 -04:00
2010-03-18 00:02:11 -04:00
def self . instance_id
2011-01-04 14:35:58 -05:00
" i- #{ Fog :: Mock . random_hex ( 8 ) } "
2010-03-18 00:02:11 -04:00
end
2009-08-14 13:35:16 -04:00
2010-03-18 00:02:11 -04:00
def self . ip_address
ip = [ ]
4 . times do
2011-01-04 14:35:58 -05:00
ip << Fog :: Mock . random_numbers ( rand ( 3 ) + 1 ) . to_i . to_s # remove leading 0
2009-08-22 01:04:12 -04:00
end
2010-03-18 00:02:11 -04:00
ip . join ( '.' )
end
2009-08-22 01:04:12 -04:00
2012-07-13 11:46:37 -04:00
def self . private_ip_address
ip_address . gsub ( / ^ \ d{1,3} \ . / , " 10. " )
end
2010-03-18 00:02:11 -04:00
def self . kernel_id
2011-01-04 14:35:58 -05:00
" aki- #{ Fog :: Mock . random_hex ( 8 ) } "
2010-03-18 00:02:11 -04:00
end
2009-08-17 01:19:35 -04:00
2010-03-18 00:02:11 -04:00
def self . key_material
2011-05-18 15:33:13 -04:00
OpenSSL :: PKey :: RSA . generate ( 1024 ) . to_s
2010-03-18 00:02:11 -04:00
end
2009-08-17 12:45:00 -04:00
2010-03-18 00:02:11 -04:00
def self . owner_id
2011-01-04 14:35:58 -05:00
Fog :: Mock . random_numbers ( 12 )
2010-03-18 00:02:11 -04:00
end
2009-09-12 14:58:05 -04:00
2010-03-18 00:02:11 -04:00
def self . ramdisk_id
2011-01-04 14:35:58 -05:00
" ari- #{ Fog :: Mock . random_hex ( 8 ) } "
2010-03-18 00:02:11 -04:00
end
2009-08-14 13:35:16 -04:00
2010-03-18 00:02:11 -04:00
def self . request_id
request_id = [ ]
2011-01-04 14:35:58 -05:00
request_id << Fog :: Mock . random_hex ( 8 )
2010-03-18 00:02:11 -04:00
3 . times do
2011-01-04 14:35:58 -05:00
request_id << Fog :: Mock . random_hex ( 4 )
2009-08-22 01:04:12 -04:00
end
2011-01-04 14:35:58 -05:00
request_id << Fog :: Mock . random_hex ( 12 )
2010-03-18 00:02:11 -04:00
request_id . join ( '-' )
end
2011-07-13 02:54:13 -04:00
class << self
alias :reserved_instances_id :request_id
alias :reserved_instances_offering_id :request_id
2011-09-18 16:00:58 -04:00
alias :sqs_message_id :request_id
alias :sqs_sender_id :request_id
2011-07-13 02:54:13 -04:00
end
2009-08-22 01:04:12 -04:00
2010-03-18 00:02:11 -04:00
def self . reservation_id
2011-01-04 14:35:58 -05:00
" r- #{ Fog :: Mock . random_hex ( 8 ) } "
2010-03-18 00:02:11 -04:00
end
2009-08-15 18:19:07 -04:00
2010-03-18 00:02:11 -04:00
def self . snapshot_id
2011-01-04 14:35:58 -05:00
" snap- #{ Fog :: Mock . random_hex ( 8 ) } "
2010-03-18 00:02:11 -04:00
end
2009-08-14 13:35:16 -04:00
2010-03-18 00:02:11 -04:00
def self . volume_id
2011-01-04 14:35:58 -05:00
" vol- #{ Fog :: Mock . random_hex ( 8 ) } "
2009-08-14 12:18:55 -04:00
end
2012-02-06 20:51:21 -05:00
2012-03-09 03:09:28 -05:00
def self . security_group_id
" sg- #{ Fog :: Mock . random_hex ( 8 ) } "
end
2012-04-01 22:01:57 -04:00
def self . network_interface_id
" eni- #{ Fog :: Mock . random_hex ( 8 ) } "
end
2012-05-29 19:21:00 -04:00
def self . internet_gateway_id
" igw- #{ Fog :: Mock . random_hex ( 8 ) } "
end
def self . dhcp_options_id
" dopt- #{ Fog :: Mock . random_hex ( 8 ) } "
end
def self . vpc_id
" vpc- #{ Fog :: Mock . random_hex ( 8 ) } "
end
def self . subnet_id
" subnet- #{ Fog :: Mock . random_hex ( 8 ) } "
end
2012-06-07 13:46:35 -04:00
def self . zone_id
" zone- #{ Fog :: Mock . random_hex ( 8 ) } "
end
def self . change_id
" change- #{ Fog :: Mock . random_hex ( 8 ) } "
end
def self . nameservers
[
'ns-2048.awsdns-64.com' ,
'ns-2049.awsdns-65.net' ,
'ns-2050.awsdns-66.org' ,
'ns-2051.awsdns-67.co.uk'
]
end
2012-04-01 22:01:57 -04:00
2012-02-06 20:51:21 -05:00
def self . key_id ( length = 21 )
#Probably close enough
Fog :: Mock . random_selection ( 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789' , length )
end
2011-11-29 13:40:36 -05:00
def self . rds_address ( db_name , region )
" #{ db_name } . #{ Fog :: Mock . random_letters ( rand ( 12 ) + 4 ) } . #{ region } .rds.amazonaws.com "
end
2010-03-18 00:02:11 -04:00
end
2012-03-09 03:09:28 -05:00
def self . parse_security_group_options ( group_name , options )
2012-03-29 03:52:14 -04:00
options || = Hash . new
2012-03-09 03:09:28 -05:00
if group_name . is_a? ( Hash )
options = group_name
elsif group_name
if options . key? ( 'GroupName' )
raise Fog :: Compute :: AWS :: Error , 'Arguments specified both group_name and GroupName in options'
end
options = options . clone
options [ 'GroupName' ] = group_name
end
2012-03-29 03:52:14 -04:00
name_specified = options . key? ( 'GroupName' ) && ! options [ 'GroupName' ] . nil?
group_id_specified = options . key? ( 'GroupId' ) && ! options [ 'GroupId' ] . nil?
unless name_specified || group_id_specified
2012-03-09 03:09:28 -05:00
raise Fog :: Compute :: AWS :: Error , 'Neither GroupName nor GroupId specified'
end
2012-03-29 03:52:14 -04:00
if name_specified && group_id_specified
options . delete ( 'GroupName' )
2012-03-09 03:09:28 -05:00
end
options
end
2009-08-10 11:30:28 -04:00
end
end