1
0
Fork 0
mirror of https://github.com/fog/fog.git synced 2022-11-09 13:51:43 -05:00
fog--fog/lib/fog/openstack/examples/image/upload-test-image.rb
Sergio Rubio 987f6abc83 [openstack|glance] Added image service example
Download CirrOS 0.3.0 image from launchpad (~6.5MB) to /tmp
and upload it to Glance (the OpenStack Image Service).
2013-03-20 17:14:56 +01:00

77 lines
2.7 KiB
Ruby

require 'securerandom'
require 'rubygems/package'
require 'zlib'
require 'fog'
#
# Download CirrOS 0.3.0 image from launchpad (~6.5MB) to /tmp
# and upload it to Glance (the OpenStack Image Service).
#
# You will need to source OpenStack credentials since the script
# reads the following envionment variables:
#
# OS_PASSWORD
# OS_USERNAME
# OS_AUTH_URL
# OS_TENANT_NAME
#
# Should work with Fog >= 1.9, ruby 1.8.7 and 2.0
#
image_url = "https://launchpadlibrarian.net/83305869/cirros-0.3.0-x86_64-uec.tar.gz"
image_out = File.open("/tmp/cirros-image-#{SecureRandom.hex}", 'wb')
extract_path = "/tmp/cirros-#{SecureRandom.hex}-dir"
ami = "#{extract_path}/cirros-0.3.0-x86_64-blank.img"
aki = "#{extract_path}/cirros-0.3.0-x86_64-vmlinuz"
ari = "#{extract_path}/cirros-0.3.0-x86_64-initrd"
FileUtils.mkdir_p extract_path
# Efficient image write
puts "Downloading Cirros image..."
streamer = lambda do |chunk, remaining_bytes, total_bytes|
image_out.write chunk
end
Excon.get image_url, :response_block => streamer
image_out.close
puts "Image downloaded to #{image_out.path}"
puts "Extracting image contents to #{extract_path}..."
Gem::Package::TarReader.new(Zlib::GzipReader.open(image_out.path)).each do |entry|
FileUtils.mkdir_p "#{extract_path}/#{File.dirname(entry.full_name)}"
File.open "#{extract_path}/#{entry.full_name}", 'w' do |f|
f.write entry.read
end
end
image_service = Fog::Image.new({
:provider => 'OpenStack',
:openstack_api_key => ENV['OS_PASSWORD'],
:openstack_username => ENV["OS_USERNAME"],
:openstack_auth_url => ENV["OS_AUTH_URL"] + "/tokens",
:openstack_tenant => ENV["OS_TENANT_NAME"]
})
puts "Uploading AKI..."
aki = image_service.images.create :name => 'cirros-0.3.0-amd64-aki',
:size => File.size(aki),
:disk_format => 'aki',
:container_format => 'aki',
:location => aki
puts "Uploading ARI..."
ari = image_service.images.create :name => 'cirros-0.3.0-amd64-ari',
:size => File.size(ari),
:disk_format => 'ari',
:container_format => 'ari',
:location => ari
puts "Uploading AMI..."
image_service.images.create :name => 'cirros-0.3.0-amd64',
:size => File.size(ami),
:disk_format => 'ami',
:container_format => 'ami',
:location => ami,
:properties => {
'kernel_id' => aki.id,
'ramdisk_id' => ari.id
}