2009-08-10 11:30:28 -04:00
|
|
|
module Fog
|
|
|
|
module AWS
|
|
|
|
|
2010-09-07 15:21:16 -04:00
|
|
|
extend Fog::Provider
|
|
|
|
|
|
|
|
service_path 'fog/aws'
|
|
|
|
service 'ec2'
|
|
|
|
service 'elb'
|
|
|
|
service 's3'
|
|
|
|
service 'simpledb'
|
|
|
|
|
2010-05-17 23:50:51 -04:00
|
|
|
def self.indexed_param(key, values, offset = 0)
|
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-05-17 23:50:51 -04:00
|
|
|
params[format(key, index + offset)] = value
|
2010-01-31 17:07:26 -05:00
|
|
|
end
|
|
|
|
params
|
|
|
|
end
|
|
|
|
|
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?
|
|
|
|
body << "#{key}=#{CGI.escape(value.to_s).gsub(/\+/, '%20')}&"
|
|
|
|
end
|
|
|
|
end
|
|
|
|
string_to_sign = "POST\n#{options[:host]}\n/\n" << body.chop
|
2010-06-16 00:04:16 -04:00
|
|
|
signed_string = options[:hmac].sign(string_to_sign)
|
|
|
|
body << "Signature=#{CGI.escape(Base64.encode64(signed_string).chomp!).gsub(/\+/, '%20')}"
|
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
|
|
|
|
2010-03-18 00:02:11 -04:00
|
|
|
def self.availability_zone
|
|
|
|
"us-east-1" << random_selection('abcd', 1)
|
|
|
|
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
|
|
|
|
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
|
|
|
|
hex(32)
|
|
|
|
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
|
|
|
|
path << letters(rand(9) + 8)
|
|
|
|
end
|
|
|
|
{
|
2010-07-25 12:24:08 -04:00
|
|
|
"imageOwnerId" => 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
|
|
|
|
"ami-#{hex(8)}"
|
|
|
|
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
|
|
|
|
fingerprint << 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.image_id
|
|
|
|
"ami-#{hex(8)}"
|
|
|
|
end
|
2009-08-14 13:35:16 -04:00
|
|
|
|
2010-03-18 00:02:11 -04:00
|
|
|
def self.instance_id
|
|
|
|
"i-#{hex(8)}"
|
|
|
|
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
|
|
|
|
ip << 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
|
|
|
|
"aki-#{hex(8)}"
|
|
|
|
end
|
2009-08-17 01:19:35 -04:00
|
|
|
|
2010-03-18 00:02:11 -04:00
|
|
|
def self.key_material
|
|
|
|
key_material = ['-----BEGIN RSA PRIVATE KEY-----']
|
|
|
|
20.times do
|
|
|
|
key_material << base64(76)
|
2009-08-17 12:45:00 -04:00
|
|
|
end
|
2010-03-18 00:02:11 -04:00
|
|
|
key_material << base64(67) + '='
|
|
|
|
key_material << '-----END RSA PRIVATE KEY-----'
|
|
|
|
key_material.join("\n")
|
|
|
|
end
|
2009-08-17 12:45:00 -04:00
|
|
|
|
2010-03-18 00:02:11 -04:00
|
|
|
def self.owner_id
|
|
|
|
numbers(12)
|
|
|
|
end
|
2009-09-12 14:58:05 -04:00
|
|
|
|
2010-03-18 00:02:11 -04:00
|
|
|
def self.ramdisk_id
|
|
|
|
"ari-#{hex(8)}"
|
|
|
|
end
|
2009-08-14 13:35:16 -04:00
|
|
|
|
2010-03-18 00:02:11 -04:00
|
|
|
def self.request_id
|
|
|
|
request_id = []
|
|
|
|
request_id << hex(8)
|
|
|
|
3.times do
|
|
|
|
request_id << hex(4)
|
2009-08-22 01:04:12 -04:00
|
|
|
end
|
2010-03-18 00:02:11 -04:00
|
|
|
request_id << hex(12)
|
|
|
|
request_id.join('-')
|
|
|
|
end
|
2009-08-22 01:04:12 -04:00
|
|
|
|
2010-03-18 00:02:11 -04:00
|
|
|
def self.reservation_id
|
|
|
|
"r-#{hex(8)}"
|
|
|
|
end
|
2009-08-15 18:19:07 -04:00
|
|
|
|
2010-03-18 00:02:11 -04:00
|
|
|
def self.snapshot_id
|
|
|
|
"snap-#{hex(8)}"
|
|
|
|
end
|
2009-08-14 13:35:16 -04:00
|
|
|
|
2010-03-18 00:02:11 -04:00
|
|
|
def self.volume_id
|
|
|
|
"vol-#{hex(8)}"
|
|
|
|
end
|
2009-08-14 13:35:16 -04:00
|
|
|
|
2010-03-18 00:02:11 -04:00
|
|
|
private
|
2009-08-14 13:35:16 -04:00
|
|
|
|
2010-03-18 00:02:11 -04:00
|
|
|
def self.random_selection(characters, length)
|
|
|
|
selection = ''
|
|
|
|
length.times do
|
|
|
|
position = rand(characters.length)
|
|
|
|
selection << characters[position..position]
|
2009-08-14 12:18:55 -04:00
|
|
|
end
|
2010-03-18 00:02:11 -04:00
|
|
|
selection
|
|
|
|
end
|
2009-08-14 12:18:55 -04:00
|
|
|
|
2010-03-18 00:02:11 -04:00
|
|
|
def self.letters(length)
|
|
|
|
random_selection(
|
|
|
|
'abcdefghijklmnopqrstuvwxyz',
|
|
|
|
length
|
|
|
|
)
|
|
|
|
end
|
2009-08-14 12:18:55 -04:00
|
|
|
|
2010-03-18 00:02:11 -04:00
|
|
|
def self.numbers(length)
|
2010-05-13 17:30:57 -04:00
|
|
|
max = ('9' * length).to_i
|
|
|
|
rand(max).to_s
|
2010-03-18 00:02:11 -04:00
|
|
|
end
|
2009-08-14 12:18:55 -04:00
|
|
|
|
2010-03-18 00:02:11 -04:00
|
|
|
def self.hex(length)
|
2010-05-13 17:30:57 -04:00
|
|
|
max = ('f' * length).to_i(16)
|
|
|
|
rand(max).to_s(16)
|
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.base64(length)
|
|
|
|
random_selection(
|
|
|
|
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",
|
|
|
|
length
|
|
|
|
)
|
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
|