2011-01-10 01:12:48 -05:00
require 'fog/core'
2010-10-29 18:25:14 -04:00
require 'fog/core/parser'
2011-05-18 15:33:13 -04:00
require 'openssl' # For RSA key pairs
2011-06-21 13:27:08 -04:00
require 'base64' # For console output
2010-10-29 18:25:14 -04:00
2009-08-10 11:30:28 -04:00
module Fog
module AWS
2010-09-07 15:21:16 -04:00
extend Fog :: Provider
2011-06-12 16:07:42 -04:00
service ( :auto_scaling , 'aws/auto_scaling' )
2011-02-26 15:18:42 -05:00
service ( :cdn , 'cdn/aws' )
service ( :compute , 'compute/aws' )
service ( :cloud_formation , 'aws/cloud_formation' )
2011-05-16 05:48:09 -04:00
service ( :cloud_watch , 'aws/cloud_watch' )
2011-02-26 15:18:42 -05:00
service ( :dns , 'dns/aws' )
service ( :elb , 'aws/elb' )
service ( :iam , 'aws/iam' )
service ( :rds , 'aws/rds' )
service ( :ses , 'aws/ses' )
service ( :simpledb , 'aws/simpledb' )
service ( :storage , 'storage/aws' )
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 |
2010-09-22 20:20:59 -04:00
params [ format ( key , index + 1 ) ] = value
2010-01-31 17:07:26 -05:00
end
params
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-04-09 20:36:00 -04:00
string . gsub ( / ([^-a-zA-Z0-9_.~]+) /n ) { | match | '%' + match . unpack ( 'H2' * match . size ) . join ( '%' ) . upcase }
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 ]
} )
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 . etag
2011-01-04 14:35:58 -05:00
Fog :: Mock . random_hex ( 32 )
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
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
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
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
2011-07-12 20:48:53 -04:00
def self . reserved_instances_offering_id
request_id
end
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
2010-03-18 00:02:11 -04:00
end
2009-08-10 11:30:28 -04:00
end
end