SlideShare uma empresa Scribd logo
1 de 94
Baixar para ler offline
Cutting Through The Fog Of
Cloud
Kyle Rames
Developer Advocate
@krames
Agenda
• Cloud 101
• Working in the Clouds
What is Cloud?
Software as a Service
SaaS
Platform as a Service
PaaS
Infrastructure as a Service
IaaS
Types of Cloud
SaaS
PaaS
IaaS
When I say Cloud,
you think...
When I say Cloud,
you think...
Agenda
• Cloud 101
• Working in the Clouds
source: https://www.ruby-toolbox.com/projects/fog
Fog Providers
>>	
  Fog.providers.keys	
  
=>	
  [:atmos,	
  :aws,	
  :baremetalcloud,	
  
	
  :bluebox,:brightbox,	
  :clodo,	
  :cloudsigma,	
  :clou
dstack,	
  :digitalocean,	
  :dnsimple,	
  :dnsmadeeasy,	
  
:dreamhost,	
  :dynect,	
  :ecloud,	
  :glesys,	
  :gogrid,	
  
:google,	
  :hp,	
  :ibm,	
  :internetarchive,	
  :joyent,	
  :
libvirt,	
  :linode,	
  :local,	
  :ninefold,	
  :openstack,	
  
:openvz,	
  :ovirt,	
  :rackspace,	
  :riakcs,	
  :serverlov
e,	
  :stormondemand,	
  :vcloud,	
  :vmfusion,	
  :voxel,	
  :
vsphere,	
  :xenserver,	
  :zerigo]	
  	
  
Rackspace Services
>>	
  Fog.services.select	
  {|k,v|	
  	
  
	
  	
  	
  	
  v.include?(:rackspace)	
  
	
  	
  	
  }.keys	
  
=>	
  [:storage,	
  :cdn,	
  :compute,	
  :dns,	
  	
  
:block_storage,	
  :compute_v2,	
  :load_balancers,	
  :i
dentity,	
  :databases]
Load Balancer
VMVM
DNS
bespin-mining.com
VMVM
Create Compute Service
>>	
  service	
  =	
  Fog::Compute.new	
  {	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  :provider	
  =>	
  'rackspace',	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  :version	
  =>	
  :v2,	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  :rackspace_username	
  =>	
  USERNAME,	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  :rackspace_api_key	
  =>	
  API_KEY,	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  :rackspace_region	
  =>	
  :ord
Required Server Parameters
Get List of Images
>>	
  images	
  =	
  service.images	
  
=>	
  <Fog::Compute::RackspaceV2::Images	
  [	
  
	
  	
  	
  	
  	
  	
  <Fog::Compute::RackspaceV2::Image	
  
	
  	
  	
  	
  	
  	
  	
  	
  id="ccaf99bc-­‐472a-­‐46ea-­‐a125-­‐d3ecfca66695",	
  
	
  	
  	
  	
  	
  	
  	
  	
  name="FreeBSD	
  9.1",	
  
	
  	
  	
  	
  	
  	
  	
  	
  ...>,	
  
	
  	
  	
  	
  	
  	
  <Fog::Compute::RackspaceV2::Image	
  
	
  	
  	
  	
  	
  	
  	
  	
  id="16e6c0ae-­‐f881-­‐4180-­‐95b0-­‐3450fe3f8e96",	
  
	
  	
  	
  	
  	
  	
  	
  	
  name="Red	
  Hat	
  Enterprise	
  Linux	
  6.4",	
  
	
  	
  	
  	
  	
  	
  	
  	
  ...>,	
  
	
  	
  	
  	
  	
  ...	
  
	
  	
  	
  	
  ]>
Get Ubuntu Image
>>	
  image	
  =	
  images.find	
  do	
  |img|	
  	
  
	
  	
  	
  	
  	
  img.name	
  =~	
  /Ubuntu/	
  
	
  	
  	
  end	
  
	
  	
  
=>	
  <Fog::Compute::RackspaceV2::Image	
  
	
  	
  	
  	
  id="23cebbc9-­‐3219-­‐4a27-­‐9210-­‐d63e1af7181b",	
  
	
  	
  	
  	
  name="Ubuntu	
  13.04	
  (Raring	
  Ringtail)",	
  
	
  	
  	
  	
  ...	
  
	
  	
  	
  >	
  
Get Flavor
>>	
  flavor	
  =	
  service.flavors.first	
  
=>	
  <Fog::Compute::RackspaceV2::Flavor	
  
	
  	
  	
  	
  id="2",	
  
	
  	
  	
  	
  name="512MB	
  Standard	
  Instance",	
  
	
  	
  	
  	
  ram=nil,	
  
	
  	
  	
  	
  disk=nil,	
  
	
  	
  	
  	
  vcpus=nil,	
  
	
  	
  	
  	
  links=[{"href"=>"https://
ord.servers.api.rackspacecloud.com/v2/772045/
flavors/2",	
  "rel"=>"self"},	
  {"href"=>"https://
ord.servers.api.rackspacecloud.com/772045/flavors/
2",	
  "rel"=>"bookmark"}]	
  
TK-421
Create Server
>>	
  tk_421	
  =	
  service.servers.create	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  :image_id	
  =>	
  image.id,	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  :flavor_id	
  =>	
  flavor.id,	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  :name	
  =>	
  'TK-­‐421'}	
  
=>	
  <Fog::Compute::RackspaceV2::Server	
  
	
  	
  	
  	
  id="308e5fd5-­‐ff50-­‐42bd-­‐911c-­‐b91a9180673d",	
  
	
  	
  	
  	
  name="TK-­‐421",	
  
	
  	
  	
  	
  created=nil,	
  
	
  	
  	
  	
  updated=nil,	
  
	
  	
  	
  	
  host_id=nil,	
  
	
  	
  	
  	
  state=nil,	
  
	
  	
  	
  	
  progress=nil,	
  
	
  	
  	
  	
  ...>
Update Server Object
>>	
  tk_421.reload

=>	
  <Fog::Compute::RackspaceV2::Server	
  
	
  	
  	
  	
  id="308e5fd5-­‐ff50-­‐42bd-­‐911c-­‐b91a9180673d",	
  
	
  	
  	
  	
  name="TK-­‐421",	
  
	
  	
  	
  	
  created="2013-­‐07-­‐03T18:08:40Z",	
  
	
  	
  	
  	
  updated="2013-­‐07-­‐03T18:08:43Z",	
  
	
  	
  	
  	
  host_id="",	
  
	
  	
  	
  	
  state="BUILD",	
  
	
  	
  	
  	
  progress=0,	
  
	
  	
  	
  ...>
Server Attributes
>>	
  tk_421.attributes	
  
=>	
  {:image_id=>"23cebbc9-­‐3219-­‐4a27-­‐9210-­‐d63e1af7181b",	
  
:flavor_id=>"2",	
  :name=>"TK-­‐421",	
  :disk_config=>"AUTO"
,	
  :id=>"308e5fd5-­‐ff50-­‐42bd-­‐911c-­‐
b91a9180673d"	
  :state=>"BUILD",	
  :progress=>0,	
  	
  
...}
Fog Meta Magic
>>	
  tk_421.state	
  
=>	
  "BUILD"	
  	
  
>>	
  tk_421.progress	
  
=>	
  0	
  
Is it ready?
>>	
  tk_421.reload	
  
>>	
  tk_421.state	
  
=>	
  "BUILD"	
  	
  	
  
>>	
  tk_421.progress	
  
=>	
  17	
  	
  
Waiting for TK-421
>>	
  tk_421.wait_for	
  {	
  ready?	
  }	
  
=>	
  {:duration=>197.0}	
  
Login
>>	
  tk_421.username	
  
=>	
  “root”	
  
>>	
  tk_421.password	
  
=>	
  “r3b3lz-­‐st1nk42”
Bootstrap
1. Creates server
2. Waits for server to finish building
3. Create ROOT_USER/.ssh/authorized_keys
4. Lock password for root user
5. Create ROOT_USER/attributes.json file
6. Create ROOT_USER/metadata.json file
Bootstrap
>>	
  tk_422	
  =	
  service.servers.bootstrap	
  {	
  
	
  	
  	
  	
  	
  	
  	
  :image_id	
  =>	
  image.id,	
  	
  
	
  	
  	
  	
  	
  	
  	
  :flavor_id	
  =>	
  flavor.id,	
  	
  
	
  	
  	
  	
  	
  	
  	
  :name	
  =>	
  'TK-­‐422',	
  
	
  	
  	
  	
  	
  	
  :public_key_path	
  =>	
  '~/.ssh/fog_rsa.pub',	
  
	
  	
  	
  	
  	
  	
  	
  :private_key_path	
  =>	
  '~/.ssh/fog_rsa'	
  
	
  	
  	
  }
SCP / SSH
>>	
  tk_422.scp	
  'setup.sh',	
  '/root/setup.sh'	
  
>>	
  results	
  =	
  tk_422.ssh	
  ‘sh	
  /root/setup.sh’	
  
>>	
  results.first.stdout	
  
=>	
  "Setting	
  up	
  VMrn"	
  
We have only scratched
the surface!
Remember?
service.images
Collection
Array
Fog::Collection
Fog::Compute::RackspaceV2::Images
Collection Methods
all
fetch every object of that type from the
provider.
get
fetch a single object by its identity from the
provider.
create
initialize a new record locally and a remote
resource with the provider.
new
initialize a new record locally, but do not
create a remote resource with the provider.
Collections
>>	
  service.collections	
  
[:servers,	
  :flavors,	
  :images,	
  :at
tachments,	
  :networks]
Model
Fog::Model
Fog::Compute::RackspaceV2:Image
Model Methods
attributes
Returns a hash containing the list of model
attributes and values.
save Saves object. (not all object support update)
reload
Updates object with latest state from
service.
ready?
Returns true if object is in a ready state and
able to perform actions.
wait_for Periodically reloads model yielding to block.
Model Layer
VMVM
Load Balancer
VMVM
Create Load Balancer Service
>>	
  lb_service	
  =	
  
	
  	
  	
  	
  	
  Fog::Rackspace::LoadBalancers.new	
  {	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  :rackspace_username	
  =>	
  USERNAME,	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  :rackspace_api_key	
  =>	
  API_KEY,	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  :rackspace_region	
  =>	
  :ord	
  	
  
	
  	
  	
  	
  	
  }
Load Balancer Collections
>>	
  lb_service.collections	
  
=>	
  [:load_balancers,	
  :nodes,	
  :virtual_ips,	
  	
  
	
  	
  	
  	
  :access_rules]	
  
Creating a Load Balancer
lb	
  =	
  lb_service.load_balancers.
Creating a Load Balancer
lb	
  =	
  lb_service.load_balancers.create	
  	
  
	
  	
  :name	
  =>	
  'bob-­‐the-­‐balancer',	
  
	
  	
  :protocol	
  =>	
  'HTTP',	
  	
  
	
  	
  :port	
  =>	
  80,	
  	
  
	
  	
  :virtual_ips	
  =>	
  [{:type	
  =>	
  'PUBLIC'}],	
  	
  
	
  	
  :nodes	
  =>	
  [{	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  :address	
  =>	
  tk_421.ipv4_address,	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  :port	
  =>	
  80,	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  :condition	
  =>	
  'ENABLED'	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  }]	
  
Add Additional Node
lb.nodes.
Add Additional Node
lb.nodes.create	
  {	
  
:address	
  =>	
  tk_422.ipv4_address,	
  	
  
	
  	
  :port	
  =>	
  80,	
  	
  
	
  	
  :condition	
  =>	
  'ENABLED'	
  
}
IP Address
>>	
  vip	
  =	
  lb.virtual_ips.find	
  do	
  |ip|	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  ip.ip_version	
  ==	
  "IPV4"	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  end	
  
>>	
  vip.address	
  
=>	
  "166.78.41.240"	
  	
  
Continuous Deployment
[tk_602,	
  tk_603].each	
  do	
  |server|	
  	
  
	
  	
  lb.nodes.create(:address	
  =>	
  
server.ipv4_address,	
  	
  
	
  	
  	
  	
  :port	
  =>	
  80,	
  	
  
	
  	
  	
  	
  :condition	
  =>	
  'ENABLED')	
  
end	
  
existing_nodes.each	
  do	
  |node|	
  	
  
	
  	
  node.condition	
  =	
  'DRAINING'	
  
	
  	
  node.save	
  
end
Request Layer
Request Layer
• Mirrors REST interface
• Most efficient way to access cloud
• Not portable between providers
• Preference model layer!
Requests
>>	
  service.requests	
  
[:copy_object,	
  :delete_container,	
  
:delete_object,	
  :get_container,	
  :
get_containers,	
  :get_object,	
  
...]
Load Balancer
VMVM
Load Balancer
VMVM
DNS
bespin-mining.com
Create DNS Service
>>	
  service	
  =	
  Fog::DNS.new	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  :provider	
  	
  =>	
  'rackspace',	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  :rackspace_username	
  =>	
  USERNAME,	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  :rackspace_api_key	
  	
  =>	
  API_KEY	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  }	
  
DNS Requests
>>	
  dns_service.requests	
  
=>	
  [:callback,	
  :list_domains,	
  	
  
:list_domain_details,	
  :modify_domain,	
  :create_do
mains,	
  :remove_domain,	
  :remove_domains,	
  :list_su
bdomains,	
  :list_records,	
  :list_record_details,	
  :
modify_record,	
  :remove_record,	
  :remove_records,	
  
:add_records]	
  	
  
List Domains
>>	
  r	
  =	
  service.list_domains	
  
#<Excon::Response:0x007fdf1ea0f7d0	
  
@data={:body=>{"domains"=>[{"name"=>"bespin-­‐
mining.com",	
  "id"=>3753036,	
  "accountId"=>772045,	
  
"emailAddress"=>"darth@empire.com",	
  
"updated"=>"2013-­‐06-­‐17T15:52:29.000+0000",	
  
"created"=>"2013-­‐06-­‐17T15:52:29.000+0000"},..]}}	
  
@headers={"Content-­‐Type"=>"application/json",	
  
"Via"=>"1.1	
  Repose	
  (Repose/2.6.11)",	
  "x-­‐api-­‐
version"=>"1.0.25",	
  "Content-­‐Length"=>"1509",	
  
"Date"=>"Fri,	
  05	
  Jul	
  2013	
  18:43:12	
  GMT",	
  
"Server"=>"Jetty(8.0.y.z-­‐SNAPSHOT)"},	
  @status=200,	
  
@remote_ip="50.56.3.32">	
  
List Domains
>>	
  r	
  =	
  service.list_domains	
  
#<Excon::Response:0x007fdf1ea0f7d0	
  
@data={:body=>{"domains"=>[{"name"=>"bespin-­‐
mining.com",	
  "id"=>3753036,	
  "accountId"=>772045,	
  
"emailAddress"=>"darth@empire.com",	
  
"updated"=>"2013-­‐06-­‐17T15:52:29.000+0000",	
  
"created"=>"2013-­‐06-­‐17T15:52:29.000+0000"},..]}}	
  
@headers={"Content-­‐Type"=>"application/json",	
  
"Via"=>"1.1	
  Repose	
  (Repose/2.6.11)",	
  "x-­‐api-­‐
version"=>"1.0.25",	
  "Content-­‐Length"=>"1509",	
  
"Date"=>"Fri,	
  05	
  Jul	
  2013	
  18:43:12	
  GMT",	
  
"Server"=>"Jetty(8.0.y.z-­‐SNAPSHOT)"},	
  @status=200,	
  
@remote_ip="50.56.3.32">	
  
List Domains
>>	
  r	
  =	
  service.list_domains	
  
#<Excon::Response:0x007fdf1ea0f7d0	
  
@data={:body=>{"domains"=>[{"name"=>"bespin-­‐
mining.com",	
  "id"=>3753036,	
  "accountId"=>772045,	
  
"emailAddress"=>"darth@empire.com",	
  
"updated"=>"2013-­‐06-­‐17T15:52:29.000+0000",	
  
"created"=>"2013-­‐06-­‐17T15:52:29.000+0000"},..]}}	
  
@headers={"Content-­‐Type"=>"application/json",	
  
"Via"=>"1.1	
  Repose	
  (Repose/2.6.11)",	
  "x-­‐api-­‐
version"=>"1.0.25",	
  "Content-­‐Length"=>"1509",	
  
"Date"=>"Fri,	
  05	
  Jul	
  2013	
  18:43:12	
  GMT",	
  
"Server"=>"Jetty(8.0.y.z-­‐SNAPSHOT)"},	
  @status=200,	
  
@remote_ip="50.56.3.32">	
  
List Domains
>>	
  r	
  =	
  service.list_domains	
  
#<Excon::Response:0x007fdf1ea0f7d0	
  
@data={:body=>{"domains"=>[{"name"=>"bespin-­‐
mining.com",	
  "id"=>3753036,	
  "accountId"=>772045,	
  
"emailAddress"=>"darth@empire.com",	
  
"updated"=>"2013-­‐06-­‐17T15:52:29.000+0000",	
  
"created"=>"2013-­‐06-­‐17T15:52:29.000+0000"},..]}}	
  
@headers={"Content-­‐Type"=>"application/json",	
  
"Via"=>"1.1	
  Repose	
  (Repose/2.6.11)",	
  "x-­‐api-­‐
version"=>"1.0.25",	
  "Content-­‐Length"=>"1509",	
  
"Date"=>"Fri,	
  05	
  Jul	
  2013	
  18:43:12	
  GMT",	
  
"Server"=>"Jetty(8.0.y.z-­‐SNAPSHOT)"},	
  @status=200,	
  
@remote_ip="50.56.3.32">	
  
Excon::Response
>>	
  domain	
  =	
  r.body["domains"].find	
  do	
  |h|	
  	
  
	
  	
  h["name"]	
  ==	
  "bespin-­‐mining.com"	
  
end	
  
=>	
  {"name"=>"bespin-­‐mining.com",	
  "id"=>3753036,	
  
"accountId"=>772045,	
  
"emailAddress"=>"darth@empire.com",	
  
"updated"=>"2013-­‐07-­‐05T19:07:42.000+0000",	
  
"created"=>"2013-­‐06-­‐17T15:52:29.000+0000"}	
  	
  
>>	
  r.status	
  
=>	
  	
  	
  200
Adding A Record
>>	
  vip	
  =	
  lb.virtual_ips.find	
  {|ip|	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  ip.ip_version	
  ==	
  "IPV4"	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  }	
  
>>	
  service.add_records	
  domain[“id”],	
  [{	
  
	
  :name	
  =>	
  'bespin-­‐mining.com',	
  	
  
	
  :type	
  =>	
  'A',	
  	
  
	
  :data	
  =>	
  vip.address,	
  	
  
	
  :ttl	
  =>	
  600	
  
}]
Load Balancer
VMVM
DNS
bespin-mining.com
Fog deep dive
Retrieve Image
service.images.get	
  "23cebbc9-­‐3219-­‐4a27-­‐9210-­‐d63e1af7181b"	
  
module	
  Fog	
  
	
  	
  module	
  Compute	
  
	
  	
  	
  	
  class	
  RackspaceV2	
  
	
  	
  	
  	
  	
  	
  class	
  Images	
  <	
  Fog::Collection	
  
def	
  get(image_id)	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  data	
  =	
  service.get_image(image_id).body['image']	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  new(data)	
  
	
  	
  	
  	
  	
  	
  	
  	
  rescue	
  Fog::Compute::RackspaceV2::NotFound	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  nil	
  
	
  	
  	
  	
  	
  	
  	
  	
  end	
  
	
  	
  	
  	
  	
  	
  end	
  
	
  	
  	
  	
  end	
  
	
  	
  end	
  
end	
  
module	
  Fog	
  
	
  	
  module	
  Compute	
  
	
  	
  	
  	
  class	
  RackspaceV2	
  
	
  	
  	
  	
  	
  	
  class	
  Images	
  <	
  Fog::Collection	
  
def	
  get(image_id)	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  data	
  =	
  service.get_image(image_id).body['image']	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  new(data)	
  
	
  	
  	
  	
  	
  	
  	
  	
  rescue	
  Fog::Compute::RackspaceV2::NotFound	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  nil	
  
	
  	
  	
  	
  	
  	
  	
  	
  end	
  
	
  	
  	
  	
  	
  	
  end	
  
	
  	
  	
  	
  end	
  
	
  	
  end	
  
end	
  
module	
  Fog	
  
	
  	
  module	
  Compute	
  
	
  	
  	
  	
  class	
  RackspaceV2	
  
	
  	
  	
  	
  	
  	
  class	
  Real	
  
	
  	
  	
  	
  	
  	
  	
  def	
  get_image(image_id)	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  request(	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  :expects	
  =>	
  [200,	
  203],	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  :method	
  =>	
  'GET',	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  :path	
  =>	
  "images/#{image_id}"	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  )	
  
	
  	
  	
  	
  	
  	
  	
  	
  end	
  
	
  	
  	
  	
  end	
  
	
  	
  end	
  
end	
  
module	
  Fog	
  
	
  	
  module	
  Compute	
  
	
  	
  	
  	
  class	
  RackspaceV2	
  
	
  	
  	
  	
  	
  	
  class	
  Real	
  
	
  	
  	
  	
  	
  	
  	
  def	
  get_image(image_id)	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  request(	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  :expects	
  =>	
  [200,	
  203],	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  :method	
  =>	
  'GET',	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  :path	
  =>	
  "images/#{image_id}"	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  )	
  
	
  	
  	
  	
  	
  	
  	
  	
  end	
  
	
  	
  	
  	
  end	
  
	
  	
  end	
  
end	
  
module	
  Fog	
  
	
  	
  module	
  Compute	
  
	
  	
  	
  	
  class	
  RackspaceV2	
  
	
  	
  	
  	
  	
  	
  class	
  Real	
  
	
  	
  	
  	
  	
  	
  	
  def	
  get_image(image_id)	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  request(	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  :expects	
  =>	
  [200,	
  203],	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  :method	
  =>	
  'GET',	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  :path	
  =>	
  "images/#{image_id}"	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  )	
  
	
  	
  	
  	
  	
  	
  	
  	
  end	
  
	
  	
  	
  	
  end	
  
	
  	
  end	
  
end	
  
module	
  Fog	
  
	
  	
  module	
  Compute	
  
	
  	
  	
  	
  class	
  RackspaceV2	
  
	
  	
  	
  	
  	
  	
  class	
  Real	
  
	
  	
  	
  	
  	
  	
  	
  def	
  get_image(image_id)	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  request(	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  :expects	
  =>	
  [200,	
  203],	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  :method	
  =>	
  'GET',	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  :path	
  =>	
  "images/#{image_id}"	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  )	
  
	
  	
  	
  	
  	
  	
  	
  	
  end	
  
	
  	
  	
  	
  end	
  
	
  	
  end	
  
end	
  
GET https://ord.servers.api.rackspacecloud.com:443/v2/5555/
images/23cebbc9-3219-4a27-9210-d63e1af7181b HTTP/1.1
Content-Type: application/json
Accept: application/json
X-Auth-Token: abc41dc54e594e9c8fb73b89b1b79142
Host: ord.servers.api.rackspacecloud.com:443
GET https://ord.servers.api.rackspacecloud.com:443/v2/5555/
images/23cebbc9-3219-4a27-9210-d63e1af7181b HTTP/1.1
Content-Type: application/json
Accept: application/json
X-Auth-Token: abc41dc54e594e9c8fb73b89b1b79142
Host: ord.servers.api.rackspacecloud.com:443
GET https://ord.servers.api.rackspacecloud.com:443/v2/5555/
images/23cebbc9-3219-4a27-9210-d63e1af7181b HTTP/1.1
Content-Type: application/json
Accept: application/json
X-Auth-Token: abc41dc54e594e9c8fb73b89b1b79142
Host: ord.servers.api.rackspacecloud.com:443
GET https://ord.servers.api.rackspacecloud.com:443/v2/5555/
images/23cebbc9-3219-4a27-9210-d63e1af7181b HTTP/1.1
Content-Type: application/json
Accept: application/json
X-Auth-Token: abc41dc54e594e9c8fb73b89b1b79142
Host: ord.servers.api.rackspacecloud.com:443
GET https://ord.servers.api.rackspacecloud.com:443/v2/5555/
images/23cebbc9-3219-4a27-9210-d63e1af7181b HTTP/1.1
Content-Type: application/json
Accept: application/json
X-Auth-Token: abc41dc54e594e9c8fb73b89b1b79142
Host: ord.servers.api.rackspacecloud.com:443
GET https://ord.servers.api.rackspacecloud.com:443/v2/5555/
images/23cebbc9-3219-4a27-9210-d63e1af7181b HTTP/1.1
Content-Type: application/json
Accept: application/json
X-Auth-Token: abc41dc54e594e9c8fb73b89b1b79142
Host: ord.servers.api.rackspacecloud.com:443
EXCON_DEBUG=true
Fog.mock!
Testing
RACKSPACE® HOSTING | WWW.RACKSPACE.COM
http://developer.rackspace.com/#ruby
@krames
Questions?
Images
tule fog, marya, CC BY-SA 2.0
Clouds, Daniel Boyd, CC BY 2.0
Metroid II: Return of Samus, Michel Ngilen, CC BY-SA 2.0
Lego Mindstorms Kit, Marlon J. Manrique, CC BY 2.0
CD,Visual Pharm, CC BY-SA 2.0
Public Bikes, Richard Masoner / Cyclelicious, CC BY 2.0
PRIVATE, Rupert Ganzer, CC BY 2.0
Hybrid
Sorry We Are Not Open, Alan Levine, CC BY 2.0
We are, e1ther, CC BY 2.0
Images (cont)
Yipwm_1b, Greg Goebel, CC BY-SA 2.0
Pause Button, GreenLantern33, CC BY-SA 2.0
3..., Cristiano Betta, CC BY-SA 2.0

Mais conteúdo relacionado

Mais procurados

Debugging Big Data Analytics in Apache Spark with BigDebug with Muhammad Gulz...
Debugging Big Data Analytics in Apache Spark with BigDebug with Muhammad Gulz...Debugging Big Data Analytics in Apache Spark with BigDebug with Muhammad Gulz...
Debugging Big Data Analytics in Apache Spark with BigDebug with Muhammad Gulz...
Databricks
 
Streaming Trend Discovery: Real-Time Discovery in a Sea of Events with Scott ...
Streaming Trend Discovery: Real-Time Discovery in a Sea of Events with Scott ...Streaming Trend Discovery: Real-Time Discovery in a Sea of Events with Scott ...
Streaming Trend Discovery: Real-Time Discovery in a Sea of Events with Scott ...
Databricks
 

Mais procurados (20)

Big Data and Machine Learning with FIWARE
Big Data and Machine Learning with FIWAREBig Data and Machine Learning with FIWARE
Big Data and Machine Learning with FIWARE
 
Debugging Big Data Analytics in Apache Spark with BigDebug with Muhammad Gulz...
Debugging Big Data Analytics in Apache Spark with BigDebug with Muhammad Gulz...Debugging Big Data Analytics in Apache Spark with BigDebug with Muhammad Gulz...
Debugging Big Data Analytics in Apache Spark with BigDebug with Muhammad Gulz...
 
PyData Texas 2015 Keynote
PyData Texas 2015 KeynotePyData Texas 2015 Keynote
PyData Texas 2015 Keynote
 
Improving Organizational Knowledge with Natural Language Processing Enriched ...
Improving Organizational Knowledge with Natural Language Processing Enriched ...Improving Organizational Knowledge with Natural Language Processing Enriched ...
Improving Organizational Knowledge with Natural Language Processing Enriched ...
 
Optimizing Delta/Parquet Data Lakes for Apache Spark
Optimizing Delta/Parquet Data Lakes for Apache SparkOptimizing Delta/Parquet Data Lakes for Apache Spark
Optimizing Delta/Parquet Data Lakes for Apache Spark
 
Streaming Trend Discovery: Real-Time Discovery in a Sea of Events with Scott ...
Streaming Trend Discovery: Real-Time Discovery in a Sea of Events with Scott ...Streaming Trend Discovery: Real-Time Discovery in a Sea of Events with Scott ...
Streaming Trend Discovery: Real-Time Discovery in a Sea of Events with Scott ...
 
Deep Dive Into Elasticsearch
Deep Dive Into ElasticsearchDeep Dive Into Elasticsearch
Deep Dive Into Elasticsearch
 
Log analysis with elastic stack
Log analysis with elastic stackLog analysis with elastic stack
Log analysis with elastic stack
 
Resilience: the key requirement of a [big] [data] architecture - StampedeCon...
Resilience: the key requirement of a [big] [data] architecture  - StampedeCon...Resilience: the key requirement of a [big] [data] architecture  - StampedeCon...
Resilience: the key requirement of a [big] [data] architecture - StampedeCon...
 
Open source monitoring systems
Open source monitoring systemsOpen source monitoring systems
Open source monitoring systems
 
Large Infrastructure Monitoring At CERN by Matthias Braeger at Big Data Spain...
Large Infrastructure Monitoring At CERN by Matthias Braeger at Big Data Spain...Large Infrastructure Monitoring At CERN by Matthias Braeger at Big Data Spain...
Large Infrastructure Monitoring At CERN by Matthias Braeger at Big Data Spain...
 
JOSA TechTalk: Realtime monitoring and alerts
JOSA TechTalk: Realtime monitoring and alerts JOSA TechTalk: Realtime monitoring and alerts
JOSA TechTalk: Realtime monitoring and alerts
 
A Developer’s View into Spark's Memory Model with Wenchen Fan
A Developer’s View into Spark's Memory Model with Wenchen FanA Developer’s View into Spark's Memory Model with Wenchen Fan
A Developer’s View into Spark's Memory Model with Wenchen Fan
 
Care and Feeding of Catalyst Optimizer
Care and Feeding of Catalyst OptimizerCare and Feeding of Catalyst Optimizer
Care and Feeding of Catalyst Optimizer
 
data science toolkit 101: set up Python, Spark, & Jupyter
data science toolkit 101: set up Python, Spark, & Jupyterdata science toolkit 101: set up Python, Spark, & Jupyter
data science toolkit 101: set up Python, Spark, & Jupyter
 
Kerberizing Spark: Spark Summit East talk by Abel Rincon and Jorge Lopez-Malla
Kerberizing Spark: Spark Summit East talk by Abel Rincon and Jorge Lopez-MallaKerberizing Spark: Spark Summit East talk by Abel Rincon and Jorge Lopez-Malla
Kerberizing Spark: Spark Summit East talk by Abel Rincon and Jorge Lopez-Malla
 
What and Why and How: Apache Drill ! - Tugdual Grall
What and Why and How: Apache Drill ! - Tugdual GrallWhat and Why and How: Apache Drill ! - Tugdual Grall
What and Why and How: Apache Drill ! - Tugdual Grall
 
Programmatic Bidding Data Streams & Druid
Programmatic Bidding Data Streams & DruidProgrammatic Bidding Data Streams & Druid
Programmatic Bidding Data Streams & Druid
 
Mining Your Logs - Gaining Insight Through Visualization
Mining Your Logs - Gaining Insight Through VisualizationMining Your Logs - Gaining Insight Through Visualization
Mining Your Logs - Gaining Insight Through Visualization
 
Lightning Talk: Why and How to Integrate MongoDB and NoSQL into Hadoop Big Da...
Lightning Talk: Why and How to Integrate MongoDB and NoSQL into Hadoop Big Da...Lightning Talk: Why and How to Integrate MongoDB and NoSQL into Hadoop Big Da...
Lightning Talk: Why and How to Integrate MongoDB and NoSQL into Hadoop Big Da...
 

Destaque

Big Data and Internet of Things: A Roadmap For Smart Environments, Fog Comput...
Big Data and Internet of Things: A Roadmap For Smart Environments, Fog Comput...Big Data and Internet of Things: A Roadmap For Smart Environments, Fog Comput...
Big Data and Internet of Things: A Roadmap For Smart Environments, Fog Comput...
Jiang Zhu
 
"Blending Cloud and Edge Machine Learning to Deliver Real-time Video Monitori...
"Blending Cloud and Edge Machine Learning to Deliver Real-time Video Monitori..."Blending Cloud and Edge Machine Learning to Deliver Real-time Video Monitori...
"Blending Cloud and Edge Machine Learning to Deliver Real-time Video Monitori...
Edge AI and Vision Alliance
 

Destaque (20)

Io t world_2016_iot_smart_gateways_moe
Io t world_2016_iot_smart_gateways_moeIo t world_2016_iot_smart_gateways_moe
Io t world_2016_iot_smart_gateways_moe
 
How Industry 4.0 Drives the Requirement for a Hybrid Cloud and Edge Architecture
How Industry 4.0 Drives the Requirement for a Hybrid Cloud and Edge ArchitectureHow Industry 4.0 Drives the Requirement for a Hybrid Cloud and Edge Architecture
How Industry 4.0 Drives the Requirement for a Hybrid Cloud and Edge Architecture
 
IoT Systems: Technology, Architecture & Performance
IoT Systems: Technology, Architecture & PerformanceIoT Systems: Technology, Architecture & Performance
IoT Systems: Technology, Architecture & Performance
 
IBM IoT Architecture and Capabilities at the Edge and Cloud
IBM IoT Architecture and Capabilities at the Edge and Cloud IBM IoT Architecture and Capabilities at the Edge and Cloud
IBM IoT Architecture and Capabilities at the Edge and Cloud
 
E3: Edge and Cloud Connectivity (Predix Transform 2016)
E3: Edge and Cloud Connectivity (Predix Transform 2016)E3: Edge and Cloud Connectivity (Predix Transform 2016)
E3: Edge and Cloud Connectivity (Predix Transform 2016)
 
Big Data and Internet of Things: A Roadmap For Smart Environments, Fog Comput...
Big Data and Internet of Things: A Roadmap For Smart Environments, Fog Comput...Big Data and Internet of Things: A Roadmap For Smart Environments, Fog Comput...
Big Data and Internet of Things: A Roadmap For Smart Environments, Fog Comput...
 
Edge-Fog Cloud
Edge-Fog CloudEdge-Fog Cloud
Edge-Fog Cloud
 
Fluid IoT Architectures
Fluid IoT ArchitecturesFluid IoT Architectures
Fluid IoT Architectures
 
Azure IoT Edge, the hybrid cloud answer for IoT (Glenn Colpaert @IoTFest NMCT...
Azure IoT Edge, the hybrid cloud answer for IoT (Glenn Colpaert @IoTFest NMCT...Azure IoT Edge, the hybrid cloud answer for IoT (Glenn Colpaert @IoTFest NMCT...
Azure IoT Edge, the hybrid cloud answer for IoT (Glenn Colpaert @IoTFest NMCT...
 
Edge-Fog Cloud: Scaling IoT computations on the edge
Edge-Fog Cloud: Scaling IoT computations on the edgeEdge-Fog Cloud: Scaling IoT computations on the edge
Edge-Fog Cloud: Scaling IoT computations on the edge
 
Fog Computing is the Future of the Industrial Internet of Things
Fog Computing is the Future of the Industrial Internet of ThingsFog Computing is the Future of the Industrial Internet of Things
Fog Computing is the Future of the Industrial Internet of Things
 
The Razor's Edge: Enabling Cloud While Mitigating the Risk of a Cloud Data Br...
The Razor's Edge: Enabling Cloud While Mitigating the Risk of a Cloud Data Br...The Razor's Edge: Enabling Cloud While Mitigating the Risk of a Cloud Data Br...
The Razor's Edge: Enabling Cloud While Mitigating the Risk of a Cloud Data Br...
 
"Blending Cloud and Edge Machine Learning to Deliver Real-time Video Monitori...
"Blending Cloud and Edge Machine Learning to Deliver Real-time Video Monitori..."Blending Cloud and Edge Machine Learning to Deliver Real-time Video Monitori...
"Blending Cloud and Edge Machine Learning to Deliver Real-time Video Monitori...
 
Security Issues of IoT with Fog
Security Issues of IoT with FogSecurity Issues of IoT with Fog
Security Issues of IoT with Fog
 
The data streaming paradigm and its use in Fog architectures
The data streaming paradigm and its use in Fog architecturesThe data streaming paradigm and its use in Fog architectures
The data streaming paradigm and its use in Fog architectures
 
Big data caching for networking : Moving from cloud to edge
Big data caching for networking : Moving from cloud to edgeBig data caching for networking : Moving from cloud to edge
Big data caching for networking : Moving from cloud to edge
 
Towards the extinction of mega data centres? To which extent should the Clou...
 Towards the extinction of mega data centres? To which extent should the Clou... Towards the extinction of mega data centres? To which extent should the Clou...
Towards the extinction of mega data centres? To which extent should the Clou...
 
From Cloud Computing to Edge Computing
From Cloud Computing to Edge ComputingFrom Cloud Computing to Edge Computing
From Cloud Computing to Edge Computing
 
IoT Analytics from Edge to Cloud - using IBM Informix
IoT Analytics from Edge to Cloud - using IBM InformixIoT Analytics from Edge to Cloud - using IBM Informix
IoT Analytics from Edge to Cloud - using IBM Informix
 
Fog computing
Fog computingFog computing
Fog computing
 

Semelhante a Cutting through the fog of cloud

Railsconf2011 deployment tips_for_slideshare
Railsconf2011 deployment tips_for_slideshareRailsconf2011 deployment tips_for_slideshare
Railsconf2011 deployment tips_for_slideshare
tomcopeland
 
Puppetpreso
PuppetpresoPuppetpreso
Puppetpreso
ke4qqq
 
fog or: How I Learned to Stop Worrying and Love the Cloud (OpenStack Edition)
fog or: How I Learned to Stop Worrying and Love the Cloud (OpenStack Edition)fog or: How I Learned to Stop Worrying and Love the Cloud (OpenStack Edition)
fog or: How I Learned to Stop Worrying and Love the Cloud (OpenStack Edition)
Wesley Beary
 
Infrastructure as code with Puppet and Apache CloudStack
Infrastructure as code with Puppet and Apache CloudStackInfrastructure as code with Puppet and Apache CloudStack
Infrastructure as code with Puppet and Apache CloudStack
ke4qqq
 
Puppet and CloudStack
Puppet and CloudStackPuppet and CloudStack
Puppet and CloudStack
ke4qqq
 
대용량 데이타 쉽고 빠르게 분석하기 :: 김일호 솔루션즈 아키텍트 :: Gaming on AWS 2016
대용량 데이타 쉽고 빠르게 분석하기 :: 김일호 솔루션즈 아키텍트 :: Gaming on AWS 2016대용량 데이타 쉽고 빠르게 분석하기 :: 김일호 솔루션즈 아키텍트 :: Gaming on AWS 2016
대용량 데이타 쉽고 빠르게 분석하기 :: 김일호 솔루션즈 아키텍트 :: Gaming on AWS 2016
Amazon Web Services Korea
 

Semelhante a Cutting through the fog of cloud (20)

An intro to Docker, Terraform, and Amazon ECS
An intro to Docker, Terraform, and Amazon ECSAn intro to Docker, Terraform, and Amazon ECS
An intro to Docker, Terraform, and Amazon ECS
 
Railsconf2011 deployment tips_for_slideshare
Railsconf2011 deployment tips_for_slideshareRailsconf2011 deployment tips_for_slideshare
Railsconf2011 deployment tips_for_slideshare
 
fog or: How I Learned to Stop Worrying and Love the Cloud
fog or: How I Learned to Stop Worrying and Love the Cloudfog or: How I Learned to Stop Worrying and Love the Cloud
fog or: How I Learned to Stop Worrying and Love the Cloud
 
Puppetpreso
PuppetpresoPuppetpreso
Puppetpreso
 
Fullstack conf 2017 - Basic dev pipeline end-to-end
Fullstack conf 2017 - Basic dev pipeline end-to-endFullstack conf 2017 - Basic dev pipeline end-to-end
Fullstack conf 2017 - Basic dev pipeline end-to-end
 
fog or: How I Learned to Stop Worrying and Love the Cloud (OpenStack Edition)
fog or: How I Learned to Stop Worrying and Love the Cloud (OpenStack Edition)fog or: How I Learned to Stop Worrying and Love the Cloud (OpenStack Edition)
fog or: How I Learned to Stop Worrying and Love the Cloud (OpenStack Edition)
 
Puppet and Apache CloudStack
Puppet and Apache CloudStackPuppet and Apache CloudStack
Puppet and Apache CloudStack
 
Infrastructure as code with Puppet and Apache CloudStack
Infrastructure as code with Puppet and Apache CloudStackInfrastructure as code with Puppet and Apache CloudStack
Infrastructure as code with Puppet and Apache CloudStack
 
Automating complex infrastructures with Puppet
Automating complex infrastructures with PuppetAutomating complex infrastructures with Puppet
Automating complex infrastructures with Puppet
 
Working in the multi-cloud with libcloud
Working in the multi-cloud with libcloudWorking in the multi-cloud with libcloud
Working in the multi-cloud with libcloud
 
Docker 1.11 Presentation
Docker 1.11 PresentationDocker 1.11 Presentation
Docker 1.11 Presentation
 
Puppet and CloudStack
Puppet and CloudStackPuppet and CloudStack
Puppet and CloudStack
 
Postgres the hardway
Postgres the hardwayPostgres the hardway
Postgres the hardway
 
Just one-shade-of-openstack
Just one-shade-of-openstackJust one-shade-of-openstack
Just one-shade-of-openstack
 
Easy Cloud Native Transformation using HashiCorp Nomad
Easy Cloud Native Transformation using HashiCorp NomadEasy Cloud Native Transformation using HashiCorp Nomad
Easy Cloud Native Transformation using HashiCorp Nomad
 
How I Learned to Stop Worrying and Love the Cloud - Wesley Beary, Engine Yard
How I Learned to Stop Worrying and Love the Cloud - Wesley Beary, Engine YardHow I Learned to Stop Worrying and Love the Cloud - Wesley Beary, Engine Yard
How I Learned to Stop Worrying and Love the Cloud - Wesley Beary, Engine Yard
 
Automating Complex Setups with Puppet
Automating Complex Setups with PuppetAutomating Complex Setups with Puppet
Automating Complex Setups with Puppet
 
Burn down the silos! Helping dev and ops gel on high availability websites
Burn down the silos! Helping dev and ops gel on high availability websitesBurn down the silos! Helping dev and ops gel on high availability websites
Burn down the silos! Helping dev and ops gel on high availability websites
 
Puppet at Opera Sofware - PuppetCamp Oslo 2013
Puppet at Opera Sofware - PuppetCamp Oslo 2013Puppet at Opera Sofware - PuppetCamp Oslo 2013
Puppet at Opera Sofware - PuppetCamp Oslo 2013
 
대용량 데이타 쉽고 빠르게 분석하기 :: 김일호 솔루션즈 아키텍트 :: Gaming on AWS 2016
대용량 데이타 쉽고 빠르게 분석하기 :: 김일호 솔루션즈 아키텍트 :: Gaming on AWS 2016대용량 데이타 쉽고 빠르게 분석하기 :: 김일호 솔루션즈 아키텍트 :: Gaming on AWS 2016
대용량 데이타 쉽고 빠르게 분석하기 :: 김일호 솔루션즈 아키텍트 :: Gaming on AWS 2016
 

Último

Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Safe Software
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
WSO2
 
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Victor Rentea
 

Último (20)

Spring Boot vs Quarkus the ultimate battle - DevoxxUK
Spring Boot vs Quarkus the ultimate battle - DevoxxUKSpring Boot vs Quarkus the ultimate battle - DevoxxUK
Spring Boot vs Quarkus the ultimate battle - DevoxxUK
 
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
 
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ..."I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
 
AI+A11Y 11MAY2024 HYDERBAD GAAD 2024 - HelloA11Y (11 May 2024)
AI+A11Y 11MAY2024 HYDERBAD GAAD 2024 - HelloA11Y (11 May 2024)AI+A11Y 11MAY2024 HYDERBAD GAAD 2024 - HelloA11Y (11 May 2024)
AI+A11Y 11MAY2024 HYDERBAD GAAD 2024 - HelloA11Y (11 May 2024)
 
FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024
 
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
 
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
 
JohnPollard-hybrid-app-RailsConf2024.pptx
JohnPollard-hybrid-app-RailsConf2024.pptxJohnPollard-hybrid-app-RailsConf2024.pptx
JohnPollard-hybrid-app-RailsConf2024.pptx
 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
 
WSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering DevelopersWSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering Developers
 
Six Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal OntologySix Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal Ontology
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
 
AI in Action: Real World Use Cases by Anitaraj
AI in Action: Real World Use Cases by AnitarajAI in Action: Real World Use Cases by Anitaraj
AI in Action: Real World Use Cases by Anitaraj
 
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot ModelMcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
 
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
 
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 AmsterdamDEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
 

Cutting through the fog of cloud

  • 1. Cutting Through The Fog Of Cloud Kyle Rames Developer Advocate @krames
  • 2. Agenda • Cloud 101 • Working in the Clouds
  • 4.
  • 5.
  • 6. Software as a Service SaaS
  • 7. Platform as a Service PaaS
  • 8. Infrastructure as a Service IaaS
  • 10. When I say Cloud, you think...
  • 11.
  • 12.
  • 13.
  • 14. When I say Cloud, you think...
  • 15.
  • 16.
  • 17. Agenda • Cloud 101 • Working in the Clouds
  • 19. Fog Providers >>  Fog.providers.keys   =>  [:atmos,  :aws,  :baremetalcloud,    :bluebox,:brightbox,  :clodo,  :cloudsigma,  :clou dstack,  :digitalocean,  :dnsimple,  :dnsmadeeasy,   :dreamhost,  :dynect,  :ecloud,  :glesys,  :gogrid,   :google,  :hp,  :ibm,  :internetarchive,  :joyent,  : libvirt,  :linode,  :local,  :ninefold,  :openstack,   :openvz,  :ovirt,  :rackspace,  :riakcs,  :serverlov e,  :stormondemand,  :vcloud,  :vmfusion,  :voxel,  : vsphere,  :xenserver,  :zerigo]    
  • 20. Rackspace Services >>  Fog.services.select  {|k,v|            v.include?(:rackspace)        }.keys   =>  [:storage,  :cdn,  :compute,  :dns,     :block_storage,  :compute_v2,  :load_balancers,  :i dentity,  :databases]
  • 22. VMVM
  • 23. Create Compute Service >>  service  =  Fog::Compute.new  {                                :provider  =>  'rackspace',                                :version  =>  :v2,                              :rackspace_username  =>  USERNAME,                              :rackspace_api_key  =>  API_KEY,                              :rackspace_region  =>  :ord
  • 25. Get List of Images >>  images  =  service.images   =>  <Fog::Compute::RackspaceV2::Images  [              <Fog::Compute::RackspaceV2::Image                  id="ccaf99bc-­‐472a-­‐46ea-­‐a125-­‐d3ecfca66695",                  name="FreeBSD  9.1",                  ...>,              <Fog::Compute::RackspaceV2::Image                  id="16e6c0ae-­‐f881-­‐4180-­‐95b0-­‐3450fe3f8e96",                  name="Red  Hat  Enterprise  Linux  6.4",                  ...>,            ...          ]>
  • 26. Get Ubuntu Image >>  image  =  images.find  do  |img|              img.name  =~  /Ubuntu/        end       =>  <Fog::Compute::RackspaceV2::Image          id="23cebbc9-­‐3219-­‐4a27-­‐9210-­‐d63e1af7181b",          name="Ubuntu  13.04  (Raring  Ringtail)",          ...        >  
  • 27. Get Flavor >>  flavor  =  service.flavors.first   =>  <Fog::Compute::RackspaceV2::Flavor          id="2",          name="512MB  Standard  Instance",          ram=nil,          disk=nil,          vcpus=nil,          links=[{"href"=>"https:// ord.servers.api.rackspacecloud.com/v2/772045/ flavors/2",  "rel"=>"self"},  {"href"=>"https:// ord.servers.api.rackspacecloud.com/772045/flavors/ 2",  "rel"=>"bookmark"}]  
  • 28.
  • 30. Create Server >>  tk_421  =  service.servers.create  {                                                        :image_id  =>  image.id,                                                          :flavor_id  =>  flavor.id,                                                          :name  =>  'TK-­‐421'}   =>  <Fog::Compute::RackspaceV2::Server          id="308e5fd5-­‐ff50-­‐42bd-­‐911c-­‐b91a9180673d",          name="TK-­‐421",          created=nil,          updated=nil,          host_id=nil,          state=nil,          progress=nil,          ...>
  • 31. Update Server Object >>  tk_421.reload
 =>  <Fog::Compute::RackspaceV2::Server          id="308e5fd5-­‐ff50-­‐42bd-­‐911c-­‐b91a9180673d",          name="TK-­‐421",          created="2013-­‐07-­‐03T18:08:40Z",          updated="2013-­‐07-­‐03T18:08:43Z",          host_id="",          state="BUILD",          progress=0,        ...>
  • 32. Server Attributes >>  tk_421.attributes   =>  {:image_id=>"23cebbc9-­‐3219-­‐4a27-­‐9210-­‐d63e1af7181b",   :flavor_id=>"2",  :name=>"TK-­‐421",  :disk_config=>"AUTO" ,  :id=>"308e5fd5-­‐ff50-­‐42bd-­‐911c-­‐ b91a9180673d"  :state=>"BUILD",  :progress=>0,     ...}
  • 33. Fog Meta Magic >>  tk_421.state   =>  "BUILD"     >>  tk_421.progress   =>  0  
  • 34. Is it ready? >>  tk_421.reload   >>  tk_421.state   =>  "BUILD"       >>  tk_421.progress   =>  17    
  • 35. Waiting for TK-421 >>  tk_421.wait_for  {  ready?  }   =>  {:duration=>197.0}  
  • 36. Login >>  tk_421.username   =>  “root”   >>  tk_421.password   =>  “r3b3lz-­‐st1nk42”
  • 37. Bootstrap 1. Creates server 2. Waits for server to finish building 3. Create ROOT_USER/.ssh/authorized_keys 4. Lock password for root user 5. Create ROOT_USER/attributes.json file 6. Create ROOT_USER/metadata.json file
  • 38. Bootstrap >>  tk_422  =  service.servers.bootstrap  {                :image_id  =>  image.id,                  :flavor_id  =>  flavor.id,                  :name  =>  'TK-­‐422',              :public_key_path  =>  '~/.ssh/fog_rsa.pub',                :private_key_path  =>  '~/.ssh/fog_rsa'        }
  • 39. SCP / SSH >>  tk_422.scp  'setup.sh',  '/root/setup.sh'   >>  results  =  tk_422.ssh  ‘sh  /root/setup.sh’   >>  results.first.stdout   =>  "Setting  up  VMrn"  
  • 40. We have only scratched the surface!
  • 41.
  • 44. Collection Methods all fetch every object of that type from the provider. get fetch a single object by its identity from the provider. create initialize a new record locally and a remote resource with the provider. new initialize a new record locally, but do not create a remote resource with the provider.
  • 45. Collections >>  service.collections   [:servers,  :flavors,  :images,  :at tachments,  :networks]
  • 47. Model Methods attributes Returns a hash containing the list of model attributes and values. save Saves object. (not all object support update) reload Updates object with latest state from service. ready? Returns true if object is in a ready state and able to perform actions. wait_for Periodically reloads model yielding to block.
  • 49. VMVM
  • 51. Create Load Balancer Service >>  lb_service  =            Fog::Rackspace::LoadBalancers.new  {                        :rackspace_username  =>  USERNAME,                      :rackspace_api_key  =>  API_KEY,                      :rackspace_region  =>  :ord              }
  • 52. Load Balancer Collections >>  lb_service.collections   =>  [:load_balancers,  :nodes,  :virtual_ips,            :access_rules]  
  • 53. Creating a Load Balancer lb  =  lb_service.load_balancers.
  • 54. Creating a Load Balancer lb  =  lb_service.load_balancers.create        :name  =>  'bob-­‐the-­‐balancer',      :protocol  =>  'HTTP',        :port  =>  80,        :virtual_ips  =>  [{:type  =>  'PUBLIC'}],        :nodes  =>  [{                              :address  =>  tk_421.ipv4_address,                                :port  =>  80,                                :condition  =>  'ENABLED'                          }]  
  • 56. Add Additional Node lb.nodes.create  {   :address  =>  tk_422.ipv4_address,        :port  =>  80,        :condition  =>  'ENABLED'   }
  • 57. IP Address >>  vip  =  lb.virtual_ips.find  do  |ip|                        ip.ip_version  ==  "IPV4"                    end   >>  vip.address   =>  "166.78.41.240"    
  • 58. Continuous Deployment [tk_602,  tk_603].each  do  |server|        lb.nodes.create(:address  =>   server.ipv4_address,            :port  =>  80,            :condition  =>  'ENABLED')   end   existing_nodes.each  do  |node|        node.condition  =  'DRAINING'      node.save   end
  • 59.
  • 61. Request Layer • Mirrors REST interface • Most efficient way to access cloud • Not portable between providers • Preference model layer!
  • 62. Requests >>  service.requests   [:copy_object,  :delete_container,   :delete_object,  :get_container,  : get_containers,  :get_object,   ...]
  • 65. Create DNS Service >>  service  =  Fog::DNS.new  {                                :provider    =>  'rackspace',                                  :rackspace_username  =>  USERNAME,                                :rackspace_api_key    =>  API_KEY                            }  
  • 66. DNS Requests >>  dns_service.requests   =>  [:callback,  :list_domains,     :list_domain_details,  :modify_domain,  :create_do mains,  :remove_domain,  :remove_domains,  :list_su bdomains,  :list_records,  :list_record_details,  : modify_record,  :remove_record,  :remove_records,   :add_records]    
  • 67. List Domains >>  r  =  service.list_domains   #<Excon::Response:0x007fdf1ea0f7d0   @data={:body=>{"domains"=>[{"name"=>"bespin-­‐ mining.com",  "id"=>3753036,  "accountId"=>772045,   "emailAddress"=>"darth@empire.com",   "updated"=>"2013-­‐06-­‐17T15:52:29.000+0000",   "created"=>"2013-­‐06-­‐17T15:52:29.000+0000"},..]}}   @headers={"Content-­‐Type"=>"application/json",   "Via"=>"1.1  Repose  (Repose/2.6.11)",  "x-­‐api-­‐ version"=>"1.0.25",  "Content-­‐Length"=>"1509",   "Date"=>"Fri,  05  Jul  2013  18:43:12  GMT",   "Server"=>"Jetty(8.0.y.z-­‐SNAPSHOT)"},  @status=200,   @remote_ip="50.56.3.32">  
  • 68. List Domains >>  r  =  service.list_domains   #<Excon::Response:0x007fdf1ea0f7d0   @data={:body=>{"domains"=>[{"name"=>"bespin-­‐ mining.com",  "id"=>3753036,  "accountId"=>772045,   "emailAddress"=>"darth@empire.com",   "updated"=>"2013-­‐06-­‐17T15:52:29.000+0000",   "created"=>"2013-­‐06-­‐17T15:52:29.000+0000"},..]}}   @headers={"Content-­‐Type"=>"application/json",   "Via"=>"1.1  Repose  (Repose/2.6.11)",  "x-­‐api-­‐ version"=>"1.0.25",  "Content-­‐Length"=>"1509",   "Date"=>"Fri,  05  Jul  2013  18:43:12  GMT",   "Server"=>"Jetty(8.0.y.z-­‐SNAPSHOT)"},  @status=200,   @remote_ip="50.56.3.32">  
  • 69. List Domains >>  r  =  service.list_domains   #<Excon::Response:0x007fdf1ea0f7d0   @data={:body=>{"domains"=>[{"name"=>"bespin-­‐ mining.com",  "id"=>3753036,  "accountId"=>772045,   "emailAddress"=>"darth@empire.com",   "updated"=>"2013-­‐06-­‐17T15:52:29.000+0000",   "created"=>"2013-­‐06-­‐17T15:52:29.000+0000"},..]}}   @headers={"Content-­‐Type"=>"application/json",   "Via"=>"1.1  Repose  (Repose/2.6.11)",  "x-­‐api-­‐ version"=>"1.0.25",  "Content-­‐Length"=>"1509",   "Date"=>"Fri,  05  Jul  2013  18:43:12  GMT",   "Server"=>"Jetty(8.0.y.z-­‐SNAPSHOT)"},  @status=200,   @remote_ip="50.56.3.32">  
  • 70. List Domains >>  r  =  service.list_domains   #<Excon::Response:0x007fdf1ea0f7d0   @data={:body=>{"domains"=>[{"name"=>"bespin-­‐ mining.com",  "id"=>3753036,  "accountId"=>772045,   "emailAddress"=>"darth@empire.com",   "updated"=>"2013-­‐06-­‐17T15:52:29.000+0000",   "created"=>"2013-­‐06-­‐17T15:52:29.000+0000"},..]}}   @headers={"Content-­‐Type"=>"application/json",   "Via"=>"1.1  Repose  (Repose/2.6.11)",  "x-­‐api-­‐ version"=>"1.0.25",  "Content-­‐Length"=>"1509",   "Date"=>"Fri,  05  Jul  2013  18:43:12  GMT",   "Server"=>"Jetty(8.0.y.z-­‐SNAPSHOT)"},  @status=200,   @remote_ip="50.56.3.32">  
  • 71. Excon::Response >>  domain  =  r.body["domains"].find  do  |h|        h["name"]  ==  "bespin-­‐mining.com"   end   =>  {"name"=>"bespin-­‐mining.com",  "id"=>3753036,   "accountId"=>772045,   "emailAddress"=>"darth@empire.com",   "updated"=>"2013-­‐07-­‐05T19:07:42.000+0000",   "created"=>"2013-­‐06-­‐17T15:52:29.000+0000"}     >>  r.status   =>      200
  • 72. Adding A Record >>  vip  =  lb.virtual_ips.find  {|ip|                        ip.ip_version  ==  "IPV4"                    }   >>  service.add_records  domain[“id”],  [{    :name  =>  'bespin-­‐mining.com',      :type  =>  'A',      :data  =>  vip.address,      :ttl  =>  600   }]
  • 74.
  • 77. module  Fog      module  Compute          class  RackspaceV2              class  Images  <  Fog::Collection   def  get(image_id)                      data  =  service.get_image(image_id).body['image']                      new(data)                  rescue  Fog::Compute::RackspaceV2::NotFound                      nil                  end              end          end      end   end  
  • 78. module  Fog      module  Compute          class  RackspaceV2              class  Images  <  Fog::Collection   def  get(image_id)                      data  =  service.get_image(image_id).body['image']                      new(data)                  rescue  Fog::Compute::RackspaceV2::NotFound                      nil                  end              end          end      end   end  
  • 79. module  Fog      module  Compute          class  RackspaceV2              class  Real                def  get_image(image_id)                    request(                      :expects  =>  [200,  203],                      :method  =>  'GET',                      :path  =>  "images/#{image_id}"                    )                  end          end      end   end  
  • 80. module  Fog      module  Compute          class  RackspaceV2              class  Real                def  get_image(image_id)                    request(                      :expects  =>  [200,  203],                      :method  =>  'GET',                      :path  =>  "images/#{image_id}"                    )                  end          end      end   end  
  • 81. module  Fog      module  Compute          class  RackspaceV2              class  Real                def  get_image(image_id)                    request(                      :expects  =>  [200,  203],                      :method  =>  'GET',                      :path  =>  "images/#{image_id}"                    )                  end          end      end   end  
  • 82. module  Fog      module  Compute          class  RackspaceV2              class  Real                def  get_image(image_id)                    request(                      :expects  =>  [200,  203],                      :method  =>  'GET',                      :path  =>  "images/#{image_id}"                    )                  end          end      end   end  
  • 83. GET https://ord.servers.api.rackspacecloud.com:443/v2/5555/ images/23cebbc9-3219-4a27-9210-d63e1af7181b HTTP/1.1 Content-Type: application/json Accept: application/json X-Auth-Token: abc41dc54e594e9c8fb73b89b1b79142 Host: ord.servers.api.rackspacecloud.com:443
  • 84. GET https://ord.servers.api.rackspacecloud.com:443/v2/5555/ images/23cebbc9-3219-4a27-9210-d63e1af7181b HTTP/1.1 Content-Type: application/json Accept: application/json X-Auth-Token: abc41dc54e594e9c8fb73b89b1b79142 Host: ord.servers.api.rackspacecloud.com:443
  • 85. GET https://ord.servers.api.rackspacecloud.com:443/v2/5555/ images/23cebbc9-3219-4a27-9210-d63e1af7181b HTTP/1.1 Content-Type: application/json Accept: application/json X-Auth-Token: abc41dc54e594e9c8fb73b89b1b79142 Host: ord.servers.api.rackspacecloud.com:443
  • 86. GET https://ord.servers.api.rackspacecloud.com:443/v2/5555/ images/23cebbc9-3219-4a27-9210-d63e1af7181b HTTP/1.1 Content-Type: application/json Accept: application/json X-Auth-Token: abc41dc54e594e9c8fb73b89b1b79142 Host: ord.servers.api.rackspacecloud.com:443
  • 87. GET https://ord.servers.api.rackspacecloud.com:443/v2/5555/ images/23cebbc9-3219-4a27-9210-d63e1af7181b HTTP/1.1 Content-Type: application/json Accept: application/json X-Auth-Token: abc41dc54e594e9c8fb73b89b1b79142 Host: ord.servers.api.rackspacecloud.com:443
  • 88. GET https://ord.servers.api.rackspacecloud.com:443/v2/5555/ images/23cebbc9-3219-4a27-9210-d63e1af7181b HTTP/1.1 Content-Type: application/json Accept: application/json X-Auth-Token: abc41dc54e594e9c8fb73b89b1b79142 Host: ord.servers.api.rackspacecloud.com:443
  • 90.
  • 92. RACKSPACE® HOSTING | WWW.RACKSPACE.COM http://developer.rackspace.com/#ruby @krames Questions?
  • 93. Images tule fog, marya, CC BY-SA 2.0 Clouds, Daniel Boyd, CC BY 2.0 Metroid II: Return of Samus, Michel Ngilen, CC BY-SA 2.0 Lego Mindstorms Kit, Marlon J. Manrique, CC BY 2.0 CD,Visual Pharm, CC BY-SA 2.0 Public Bikes, Richard Masoner / Cyclelicious, CC BY 2.0 PRIVATE, Rupert Ganzer, CC BY 2.0 Hybrid Sorry We Are Not Open, Alan Levine, CC BY 2.0 We are, e1ther, CC BY 2.0
  • 94. Images (cont) Yipwm_1b, Greg Goebel, CC BY-SA 2.0 Pause Button, GreenLantern33, CC BY-SA 2.0 3..., Cristiano Betta, CC BY-SA 2.0