tonobo / hcloud-ruby

Native ruby client for HetznerCloud
MIT License
32 stars 11 forks source link
hcloud hetzner hetzner-cloud

Hcloud

Build Status codecov Gem Version Maintainability

This is an unoffical ruby client for HetznerCloud Api service.

Its currently in development and lacking a lot of feature. The bindings are also not considered stable.

Installation

Add this line to your application's Gemfile:

gem 'hcloud'

And then execute:

$ bundle

Or install it yourself as:

$ gem install hcloud

Usage

Client

c = Hcloud::Client.new(token: "<your project token>")
c = Hcloud::Client.new(
  token: "<your project token>", 
  auto_pagination: true,
  concurrency: 50 # default 20
)
Hcloud::Client.connection = Hcloud::Client.new(...)

Client concurrency

Each action could be handled concurrently. The actual downsides are located at the exception handling. Means one request could break the whole bunch of requests, you currently have to deal with that.

servers = []
client.concurrent do
  10.times do 
    servers << client.servers.create(...)
  end
end 

servers.each do |(action, server, root_password)|
  # do something with your servers ...
end

Server Resource

# default page(1)
# default per_page(50)
c.servers.page(2).per_page(40).each do |server|
  server.datacenter.location.id #=> 1
end
# default nolimit
c.servers.limit(80).each do |server|
  server.datacenter.location.id #=> 1
end
Server.limit(10).each do |server|
  # do something with the server
end

Nonblocking:

c.servers.create(name: "moo5", server_type: "cx11", image: "ubuntu-16.04")
#=> [#<Hcloud::Action>, <#Hcloud::Server>, "root_password"]

Wating for finish:

action,server = c.servers.create(name: "moo5", server_type: "cx11", image: "ubuntu-16.04")

while action.status == "running"
  puts "Waiting for Action #{action.id} to complete ..."
  action = c.actions.find(action.id)
  server = c.servers.find(server.id)
  puts "Action Status: #{action.status}"
  puts "Server Status: #{server.status}"
  puts "Server IP Config: #{server.public_net["ipv4"]}"
  sleep 5
end
c.servers.count
#=> 2
c.servers.first.update(name: "moo")
#=> #<Hcloud::Server>
c.servers.each{|x| x.update(name: "moo") }
Hcloud::Error::UniquenessError: server name is already used
c.servers.first.destroy
#=> #<Hcloud::Action>