Using OpenStack With
Fog
houston.rb 6/10/14
• @mwhagedorn (mwhagedorn)
• github.com/mwhagedorn
employer
• hpcloud.com
• @hpcloud
what is OpenStack?
• Open source cloud infrastructure
• Broadly available
• Runs on non proprietary hardware
• Governed by the OpenStack Foundation
• AT&T, Canonical, HP, IBM, Rackspace
(others)
OpenStack birth
“ Launched Nova.  Apache-Licensed Cloud
Computing, in Python. It’s live.  it’s buggy, it’s
beta. Check it out “
- Joshua McKenty blog post, summer 2010
@jmckenty
(Joshua McKenty)
OpenStack birth
• NASA Aimes CTO
• Worked with Microsoft/Google
on some NASA visualizations
• Preferred Google’s approach
• NASA needs a cloud!
@kemp
(Chris Kemp)
OpenStack birth
• Rackspace spotted the blog
post
• They decided to collaborate
Philosophy
“Why Do This?”
brief history of computing
• PCs
• Data Centers
• Hypervisors
• Hypervisor chaos
the vision
OpenStack
Hyper-V VMware Xen KVM
OpenStack projects
• Nova (Compute)
• Swift (Object Storage)
• Cinder (Block Storage)
• Quantum (Networking)
• Horizon (Dashboard)
• Keystone (Identity)
• Glance (VM Images)
devstack.org
• git clone https://github.com/
openstack-dev/devstack.git
• cd devstack && ./stack.sh
trystack.org
• sandbox for exploration
horizon demo
ok, why should I care?
• Less than 2% of global
compute workloads run on
AWS
• Large companies have public
data concerns
• Countries have security
concerns
this stuff is too hard!
fog
• ruby cloud services
• fog.io
• github.com/fog/fog
• @fog
• @geemus (Wesley Beary)
• “gem install fog”
fog
• portable
• powerful
• established
fog
• libraries
• knife
• chef
• bosh
• carrierwave
• paperclip
fog providers
• set of adapters for specific cloud
• aws, hp, rackspace.. etc
fog
require "fog"	
require "ostruct"	
!
user = OpenStruct.new({	
:access_key=>{	
:access_key_id => "<MY_HP_KEYID>"	
:secret_key => "<MY_HP_SECRET_KEY>"	
}, :tenant_id => "<MY_HP_TENANT_ID>"	
})	
!
@connection ||= Fog::Compute.new(	
:provider => 'HP',	
:hp_access_key => user.access_key[:access_key_id],	
:hp_secret_key => user.access_key[:secret_key],	
:version => "v2",	
:hp_auth_uri => "https://region-a.geo-1.identity.hpcloudsvc.com:35357/v2.0/tokens",	
:hp_tenant_id => user.tenant_id,	
:hp_avl_zone => "region-b.geo-1"	
)
fog
flavors = @connection.list_flavors	
images = @connection.list_images	
server_response = @connection.create_server("my server", 	
flavors.body["flavors"].first["id"],	
images.body["images"].first["id"])	
	
server_id = server_response.body["server"]["id"]	
	
while(true){	
response = @connection.list_servers(:status => "ACTIVE")	
active_ids = response.body["servers"].map { |s| s["id"] }	
unless active_ids.select { |item| item == server_id }.empty?	
break	
end	
sleep(2)	
}	
!
#do stuff now
fog collections
module Fog	
module Compute	
class HPV2	
class VolumeAttachments < Fog::Collection	
!
model Fog::Compute::HPV2::VolumeAttachment	
!
attr_accessor :server	
!
def all	
requires :server	
data = service.list_server_volumes(server.id).body['volumeAttachments']	
load(data)	
end	
!
def get(volume_id)	
requires :server	
if data = service.get_server_volume_details(server.id, volume_id).body['volumeAttachment']	
new(data)	
end	
rescue Fog::Compute::HPV2::NotFound	
nil	
end	
end	
end	
end	
end
fog models
module Fog	
module Compute	
class HPV2	
!
class AvailabilityZone < Fog::Model	
!
identity :name, :aliases => 'zoneName'	
!
attribute :zoneState	
attribute :hosts	
!
def available?	
zoneState['available']	
end	
!
end	
!
end	
end	
end
fog requests
• actual business logic for request
def list_flavors(options = {})	
request(	
:expects => [200, 203],	
:method => 'GET',	
:path => 'flavors',	
:query => options	
)	
end
fog mocks
• test data to return example API responses
• requires no network connection
fog real
• actual request implementation
the fog “stack”
collections
models
requests
cloud provider
servers
server
list_servers
fog and OpenStack
• fog/openstack-core is the
official ruby sdk for
OpenStack
• Under active development
fog bin
• fog <provider>
• convenient way to explore
with fog
• uses .fog file in your home dir
demo
examples
• developer.rackspace.com (rails)
• http://goo.gl/HN78A3
• HP provider examples for compute (v2)
• http://goo.gl/bJaO6O
getting involved
• OpenStack
• https://wiki.openstack.org/wiki/How_To_Contribute
• Fog
• https://github.com/fog/fog/issues
questions?
@mwhagedorn
mike.hagedorn@hp.com

Using OpenStack With Fog