fog-digitalocean 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.coveralls.yml +1 -0
- data/.document +3 -0
- data/.gitignore +30 -0
- data/.irbrc +82 -0
- data/.rubocop.yml +20 -0
- data/.rubocop_todo.yml +606 -0
- data/.travis.yml +35 -0
- data/CHANGELOG.md +3 -0
- data/CONTRIBUTING.md +276 -0
- data/CONTRIBUTORS.md +898 -0
- data/Gemfile +5 -0
- data/LICENSE.md +20 -0
- data/README.md +130 -0
- data/RELEASE.md +40 -0
- data/Rakefile +12 -0
- data/benchs/each_provider.sh +6 -0
- data/benchs/each_service.sh +6 -0
- data/benchs/fog_vs.rb +106 -0
- data/benchs/load_times.rb +37 -0
- data/benchs/params.rb +43 -0
- data/benchs/parse_vs_push.rb +67 -0
- data/bin/fog +78 -0
- data/fog-digitalocean.gemspec +61 -0
- data/gemfiles/Gemfile-edge +14 -0
- data/lib/fog/digitalocean.rb +1 -0
- data/lib/fog/digitalocean/CHANGELOG.md +6 -0
- data/lib/fog/digitalocean/compute.rb +109 -0
- data/lib/fog/digitalocean/core.rb +9 -0
- data/lib/fog/digitalocean/examples/getting_started.md +123 -0
- data/lib/fog/digitalocean/models/compute/flavor.rb +17 -0
- data/lib/fog/digitalocean/models/compute/flavors.rb +21 -0
- data/lib/fog/digitalocean/models/compute/image.rb +25 -0
- data/lib/fog/digitalocean/models/compute/images.rb +42 -0
- data/lib/fog/digitalocean/models/compute/region.rb +13 -0
- data/lib/fog/digitalocean/models/compute/regions.rb +21 -0
- data/lib/fog/digitalocean/models/compute/server.rb +170 -0
- data/lib/fog/digitalocean/models/compute/servers.rb +43 -0
- data/lib/fog/digitalocean/models/compute/ssh_key.rb +31 -0
- data/lib/fog/digitalocean/models/compute/ssh_keys.rb +40 -0
- data/lib/fog/digitalocean/models/paging_collection.rb +42 -0
- data/lib/fog/digitalocean/requests/compute/change_kernel.rb +44 -0
- data/lib/fog/digitalocean/requests/compute/convert_to_snapshot.rb +44 -0
- data/lib/fog/digitalocean/requests/compute/create_server.rb +93 -0
- data/lib/fog/digitalocean/requests/compute/create_ssh_key.rb +49 -0
- data/lib/fog/digitalocean/requests/compute/delete_ssh_key.rb +32 -0
- data/lib/fog/digitalocean/requests/compute/destroy_server.rb +35 -0
- data/lib/fog/digitalocean/requests/compute/disable_backups.rb +45 -0
- data/lib/fog/digitalocean/requests/compute/enable_ipv6.rb +44 -0
- data/lib/fog/digitalocean/requests/compute/enable_private_networking.rb +44 -0
- data/lib/fog/digitalocean/requests/compute/get_droplet_action.rb +36 -0
- data/lib/fog/digitalocean/requests/compute/get_image_details.rb +42 -0
- data/lib/fog/digitalocean/requests/compute/get_server_details.rb +84 -0
- data/lib/fog/digitalocean/requests/compute/get_ssh_key.rb +34 -0
- data/lib/fog/digitalocean/requests/compute/list_droplet_actions.rb +38 -0
- data/lib/fog/digitalocean/requests/compute/list_flavors.rb +132 -0
- data/lib/fog/digitalocean/requests/compute/list_images.rb +51 -0
- data/lib/fog/digitalocean/requests/compute/list_regions.rb +95 -0
- data/lib/fog/digitalocean/requests/compute/list_servers.rb +33 -0
- data/lib/fog/digitalocean/requests/compute/list_ssh_keys.rb +41 -0
- data/lib/fog/digitalocean/requests/compute/password_reset.rb +44 -0
- data/lib/fog/digitalocean/requests/compute/power_cycle.rb +44 -0
- data/lib/fog/digitalocean/requests/compute/power_off.rb +44 -0
- data/lib/fog/digitalocean/requests/compute/power_on.rb +44 -0
- data/lib/fog/digitalocean/requests/compute/reboot_server.rb +44 -0
- data/lib/fog/digitalocean/requests/compute/rebuild.rb +44 -0
- data/lib/fog/digitalocean/requests/compute/rename.rb +44 -0
- data/lib/fog/digitalocean/requests/compute/resize.rb +48 -0
- data/lib/fog/digitalocean/requests/compute/restore.rb +44 -0
- data/lib/fog/digitalocean/requests/compute/shutdown.rb +44 -0
- data/lib/fog/digitalocean/requests/compute/snapshot.rb +44 -0
- data/lib/fog/digitalocean/requests/compute/transfer_image.rb +44 -0
- data/lib/fog/digitalocean/requests/compute/update_ssh_key.rb +46 -0
- data/lib/fog/digitalocean/requests/compute/upgrade.rb +44 -0
- data/lib/fog/digitalocean/service.rb +51 -0
- data/lib/fog/digitalocean/version.rb +5 -0
- data/spec/fog/account_spec.rb +14 -0
- data/spec/fog/billing_spec.rb +14 -0
- data/spec/fog/bin/atmos_spec.rb +33 -0
- data/spec/fog/bin/aws_spec.rb +98 -0
- data/spec/fog/bin/baremetalcloud_spec.rb +33 -0
- data/spec/fog/bin/bluebox_spec.rb +55 -0
- data/spec/fog/bin/brightbox_spec.rb +30 -0
- data/spec/fog/bin/clodo_spec.rb +9 -0
- data/spec/fog/bin/cloudsigma_spec.rb +9 -0
- data/spec/fog/bin/cloudstack_spec.rb +9 -0
- data/spec/fog/bin/digitalocean_spec.rb +9 -0
- data/spec/fog/bin/dnsimple_spec.rb +9 -0
- data/spec/fog/bin/dnsmadeeasy_spec.rb +9 -0
- data/spec/fog/bin/dreamhost_spec.rb +9 -0
- data/spec/fog/bin/dynect_spec.rb +9 -0
- data/spec/fog/bin/ecloud_spec.rb +10 -0
- data/spec/fog/bin/fogdocker_spec.rb +10 -0
- data/spec/fog/bin/glesys_spec.rb +10 -0
- data/spec/fog/bin/gogrid_spec.rb +10 -0
- data/spec/fog/bin/google_spec.rb +10 -0
- data/spec/fog/bin/ibm_spec.rb +10 -0
- data/spec/fog/bin/internetarchive_spec.rb +10 -0
- data/spec/fog/bin/joyent_spec.rb +10 -0
- data/spec/fog/bin/linode_spec.rb +10 -0
- data/spec/fog/bin/local_spec.rb +10 -0
- data/spec/fog/bin/ninefold_spec.rb +10 -0
- data/spec/fog/bin/opennebula_spec.rb +10 -0
- data/spec/fog/bin/openstack_spec.rb +10 -0
- data/spec/fog/bin/openvz_spec.rb +10 -0
- data/spec/fog/bin/ovirt_spec.rb +10 -0
- data/spec/fog/bin/powerdns_spec.rb +9 -0
- data/spec/fog/bin/profitbricks_spec.rb +10 -0
- data/spec/fog/bin/rackspace_spec.rb +10 -0
- data/spec/fog/bin/rage4_spec.rb +10 -0
- data/spec/fog/bin/riakcs_spec.rb +10 -0
- data/spec/fog/bin/sakuracloud_spec.rb +10 -0
- data/spec/fog/bin/serverlove_spec.rb +10 -0
- data/spec/fog/bin/softlayer_spec.rb +10 -0
- data/spec/fog/bin/stormondemand_spec.rb +10 -0
- data/spec/fog/bin/vcloud_spec.rb +10 -0
- data/spec/fog/bin/vclouddirector_spec.rb +10 -0
- data/spec/fog/bin/vmfusion_spec.rb +10 -0
- data/spec/fog/bin/voxel_spec.rb +10 -0
- data/spec/fog/bin/vsphere_spec.rb +10 -0
- data/spec/fog/bin/xenserver_spec.rb +10 -0
- data/spec/fog/bin/zerigo_spec.rb +10 -0
- data/spec/fog/bin_spec.rb +161 -0
- data/spec/fog/cdn_spec.rb +14 -0
- data/spec/fog/compute_spec.rb +19 -0
- data/spec/fog/dns_spec.rb +19 -0
- data/spec/fog/identity_spec.rb +14 -0
- data/spec/fog/image_spec.rb +14 -0
- data/spec/fog/metering_spec.rb +14 -0
- data/spec/fog/monitoring_spec.rb +14 -0
- data/spec/fog/network_spec.rb +14 -0
- data/spec/fog/orchestration_spec.rb +14 -0
- data/spec/fog/storage_spec.rb +14 -0
- data/spec/fog/support_spec.rb +14 -0
- data/spec/fog/volume_spec.rb +14 -0
- data/spec/fog/vpn_spec.rb +14 -0
- data/spec/fog/xml/connection_spec.rb +33 -0
- data/spec/helpers/bin.rb +34 -0
- data/spec/spec_helper.rb +18 -0
- data/tests/digitalocean/helper.rb +56 -0
- data/tests/digitalocean/requests/compute/list_flavors_tests.rb +25 -0
- data/tests/digitalocean/requests/compute/list_images_tests.rb +25 -0
- data/tests/digitalocean/requests/compute/list_regions_tests.rb +21 -0
- data/tests/digitalocean/requests/compute/server_tests.rb +77 -0
- data/tests/digitalocean/requests/compute_v2/list_ssh_keys_tests.rb +20 -0
- data/tests/helper.rb +25 -0
- data/tests/helpers/format_helper.rb +100 -0
- data/tests/helpers/mock_helper.rb +14 -0
- data/tests/helpers/succeeds_helper.rb +10 -0
- data/tests/lorem.txt +1 -0
- data/tests/watchr.rb +22 -0
- metadata +428 -0
data/bin/fog
ADDED
@@ -0,0 +1,78 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib', 'fog'))
|
4
|
+
require 'optparse'
|
5
|
+
require 'irb'
|
6
|
+
require 'yaml'
|
7
|
+
|
8
|
+
options = OptionParser.new do |opts|
|
9
|
+
opts.banner = 'usage: fog [options] CREDENTIAL'
|
10
|
+
|
11
|
+
opts.on('-C', '--credentials-path FILE', 'Path to the credentials file') do |file|
|
12
|
+
Fog.credentials_path = file
|
13
|
+
end
|
14
|
+
|
15
|
+
opts.on_tail('-v', '--version', 'Prints the version') do
|
16
|
+
puts Fog::VERSION
|
17
|
+
exit
|
18
|
+
end
|
19
|
+
|
20
|
+
opts.on_tail('-h', '--help', 'Prints this message') do
|
21
|
+
puts opts
|
22
|
+
exit
|
23
|
+
end
|
24
|
+
end
|
25
|
+
options.parse!
|
26
|
+
|
27
|
+
Fog.credential = ARGV.first ? ARGV.first.to_sym : nil
|
28
|
+
Fog.mock! if ENV['FOG_MOCK']
|
29
|
+
if Fog.credentials.empty?
|
30
|
+
begin
|
31
|
+
Fog::Errors.missing_credentials
|
32
|
+
rescue Fog::Errors::LoadError => error
|
33
|
+
abort error.message
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
require 'fog/bin'
|
38
|
+
|
39
|
+
providers = Fog.available_providers
|
40
|
+
providers = if providers.length > 1
|
41
|
+
providers[0...-1].join(', ') << ' and ' << providers[-1]
|
42
|
+
else
|
43
|
+
providers.first
|
44
|
+
end
|
45
|
+
|
46
|
+
if ARGV.length > 1
|
47
|
+
|
48
|
+
result = instance_eval(ARGV[1..-1].join(' '))
|
49
|
+
puts(Fog::JSON.encode(result))
|
50
|
+
|
51
|
+
else
|
52
|
+
|
53
|
+
ARGV.clear # Avoid passing args to IRB
|
54
|
+
IRB.setup(nil)
|
55
|
+
@irb = IRB::Irb.new(nil)
|
56
|
+
IRB.conf[:MAIN_CONTEXT] = @irb.context
|
57
|
+
IRB.conf[:PROMPT][:FOG] = IRB.conf[:PROMPT][:SIMPLE].dup
|
58
|
+
IRB.conf[:PROMPT][:FOG][:RETURN] = "%s\n"
|
59
|
+
@irb.context.prompt_mode = :FOG
|
60
|
+
@irb.context.workspace = IRB::WorkSpace.new(binding)
|
61
|
+
|
62
|
+
trap 'INT' do
|
63
|
+
@irb.signal_handle
|
64
|
+
end
|
65
|
+
|
66
|
+
Fog::Formatador.display_line('Welcome to fog interactive!')
|
67
|
+
Fog::Formatador.display_line(":#{Fog.credential} provides #{providers}")
|
68
|
+
providers = Fog.providers
|
69
|
+
|
70
|
+
# FIXME: hacks until we can `include Fog` in bin
|
71
|
+
CDN = Fog::CDN
|
72
|
+
Compute = Fog::Compute
|
73
|
+
DNS = Fog::DNS
|
74
|
+
Storage = Fog::Storage
|
75
|
+
|
76
|
+
catch(:IRB_EXIT) { @irb.eval_input }
|
77
|
+
|
78
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path("../lib", __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require "fog/digitalocean/version"
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.specification_version = 2 if s.respond_to? :specification_version=
|
8
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
9
|
+
|
10
|
+
## Leave these as is they will be modified for you by the rake gemspec task.
|
11
|
+
## If your rubyforge_project name is different, then edit it and comment out
|
12
|
+
## the sub! line in the Rakefile
|
13
|
+
s.name = "fog-digitalocean"
|
14
|
+
s.version = Fog::Digitalocean::VERSION
|
15
|
+
s.date = "2016-03-30"
|
16
|
+
|
17
|
+
## Make sure your summary is short. The description may be as long
|
18
|
+
## as you like.
|
19
|
+
s.summary = %q{DigitalOcean fog provider gem}
|
20
|
+
s.description = %q{DigitalOcean fog provider gem}
|
21
|
+
|
22
|
+
## List the primary authors. If there are a bunch of authors, it's probably
|
23
|
+
## better to set the email to an email list or something. If you don't have
|
24
|
+
## a custom homepage, consider using your GitHub URL or the like.
|
25
|
+
s.authors = ["JJ Asghar", "Suraj Shirvankar"]
|
26
|
+
s.email = ["jj@chef.io", "surajshirvankar@gmail.com"]
|
27
|
+
s.homepage = "http://github.com/fog/fog-digitalocean"
|
28
|
+
s.license = "MIT"
|
29
|
+
|
30
|
+
## This sections is only necessary if you have C extensions.
|
31
|
+
# s.require_paths << 'ext'
|
32
|
+
# s.extensions = %w[ext/extconf.rb]
|
33
|
+
|
34
|
+
## This gets added to the $LOAD_PATH so that 'lib/NAME.rb' can be required as
|
35
|
+
## require 'NAME.rb' or'/lib/NAME/file.rb' can be as require 'NAME/file.rb'
|
36
|
+
s.require_paths = %w[lib]
|
37
|
+
|
38
|
+
## If your gem includes any executables, list them here.
|
39
|
+
s.executables = ["fog"]
|
40
|
+
|
41
|
+
## Specify any RDoc options here. You'll want to add your README and
|
42
|
+
## LICENSE files to the extra_rdoc_files list.
|
43
|
+
s.rdoc_options = ["--charset=UTF-8"]
|
44
|
+
s.extra_rdoc_files = %w[README.md]
|
45
|
+
|
46
|
+
s.add_development_dependency 'bundler', '~> 1.6'
|
47
|
+
s.add_development_dependency 'rake', '~> 10.0'
|
48
|
+
s.add_development_dependency 'shindo', '~> 0.3'
|
49
|
+
s.add_development_dependency 'rubyzip', '~> 0.9.9'
|
50
|
+
s.add_development_dependency 'mime-types'
|
51
|
+
s.add_development_dependency 'mime-types-data'
|
52
|
+
s.add_development_dependency 'rubocop'
|
53
|
+
|
54
|
+
s.add_dependency 'fog-core', '~> 1.42'
|
55
|
+
s.add_dependency 'fog-json', '>= 1.0'
|
56
|
+
s.add_dependency 'fog-xml', '>= 0.1'
|
57
|
+
s.add_dependency 'ipaddress', '>= 0.5'
|
58
|
+
|
59
|
+
s.files = `git ls-files`.split("\n")
|
60
|
+
s.test_files = `git ls-files -- {spec,tests}/*`.split("\n")
|
61
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
source "https://rubygems.org"
|
2
|
+
|
3
|
+
# Shared components
|
4
|
+
gem "fog-core", :github => "fog/fog-core"
|
5
|
+
gem "fog-json", :github => "fog/fog-json"
|
6
|
+
|
7
|
+
group :development, :test do
|
8
|
+
# This is here because gemspec doesn"t support require: false
|
9
|
+
gem "coveralls", :require => false
|
10
|
+
gem "netrc", :require => false
|
11
|
+
gem "octokit", :require => false
|
12
|
+
end
|
13
|
+
|
14
|
+
gemspec :path => "../"
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'fog/digitalocean/compute'
|
@@ -0,0 +1,109 @@
|
|
1
|
+
require 'fog/digitalocean/core'
|
2
|
+
|
3
|
+
module Fog
|
4
|
+
module Compute
|
5
|
+
class DigitalOcean < Fog::Service
|
6
|
+
requires :digitalocean_token
|
7
|
+
|
8
|
+
model_path 'fog/digitalocean/models/compute'
|
9
|
+
model :server
|
10
|
+
collection :servers
|
11
|
+
model :image
|
12
|
+
collection :images
|
13
|
+
model :region
|
14
|
+
collection :regions
|
15
|
+
model :flavor
|
16
|
+
collection :flavors
|
17
|
+
model :ssh_key
|
18
|
+
collection :ssh_keys
|
19
|
+
|
20
|
+
request_path 'fog/digitalocean/requests/compute'
|
21
|
+
request :change_kernel
|
22
|
+
request :create_server
|
23
|
+
request :create_ssh_key
|
24
|
+
request :destroy_server
|
25
|
+
request :delete_ssh_key
|
26
|
+
request :disable_backups
|
27
|
+
request :enable_ipv6
|
28
|
+
request :enable_private_networking
|
29
|
+
request :get_droplet_action
|
30
|
+
request :get_image_details
|
31
|
+
request :get_server_details
|
32
|
+
request :get_ssh_key
|
33
|
+
request :list_droplet_actions
|
34
|
+
request :list_flavors
|
35
|
+
request :list_images
|
36
|
+
request :list_regions
|
37
|
+
request :list_servers
|
38
|
+
request :list_ssh_keys
|
39
|
+
request :password_reset
|
40
|
+
request :power_cycle
|
41
|
+
request :power_off
|
42
|
+
request :power_on
|
43
|
+
request :reboot_server
|
44
|
+
request :rebuild
|
45
|
+
request :rename
|
46
|
+
request :resize
|
47
|
+
request :restore
|
48
|
+
request :shutdown
|
49
|
+
request :snapshot
|
50
|
+
request :update_ssh_key
|
51
|
+
request :upgrade
|
52
|
+
|
53
|
+
|
54
|
+
class Mock
|
55
|
+
def self.data
|
56
|
+
@data ||= Hash.new do |hash, key|
|
57
|
+
hash[key] = {
|
58
|
+
:servers => [],
|
59
|
+
:ssh_keys => []
|
60
|
+
}
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def initialize(options={})
|
65
|
+
@digitalocean_token = options[:digitalocean_token]
|
66
|
+
end
|
67
|
+
|
68
|
+
def data
|
69
|
+
self.class.data[@digitalocean_token]
|
70
|
+
end
|
71
|
+
|
72
|
+
def reset_data
|
73
|
+
self.class.data.delete(@digitalocean_token)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
class Real
|
78
|
+
def initialize(options={})
|
79
|
+
digitalocean_token = options[:digitalocean_token]
|
80
|
+
persistent = false
|
81
|
+
options = {
|
82
|
+
headers: {
|
83
|
+
'Authorization' => "Bearer #{digitalocean_token}",
|
84
|
+
}
|
85
|
+
}
|
86
|
+
@connection = Fog::Core::Connection.new 'https://api.digitalocean.com', persistent, options
|
87
|
+
end
|
88
|
+
|
89
|
+
def request(params)
|
90
|
+
params[:headers] ||= {}
|
91
|
+
begin
|
92
|
+
response = @connection.request(params)
|
93
|
+
rescue Excon::Errors::HTTPStatusError => error
|
94
|
+
raise case error
|
95
|
+
when Excon::Errors::NotFound
|
96
|
+
NotFound.slurp(error)
|
97
|
+
else
|
98
|
+
error
|
99
|
+
end
|
100
|
+
end
|
101
|
+
unless response.body.empty?
|
102
|
+
response.body = Fog::JSON.decode(response.body)
|
103
|
+
end
|
104
|
+
response
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
@@ -0,0 +1,123 @@
|
|
1
|
+
# Getting started: the compute service
|
2
|
+
|
3
|
+
You'll need a DigitalOcean account and an API token to use this provider.
|
4
|
+
|
5
|
+
Get one from https://cloud.digitalocean.com/settings/tokens/new
|
6
|
+
|
7
|
+
Write down the Access Token.
|
8
|
+
|
9
|
+
## Connecting, retrieving and managing server objects
|
10
|
+
|
11
|
+
Before we start, I guess it will be useful to the reader to know
|
12
|
+
that Fog servers are 'droplets' in DigitalOcean's parlance.
|
13
|
+
'Server' is the Fog way to name VMs, and we have
|
14
|
+
respected that in the DigitalOcean's Fog provider.
|
15
|
+
|
16
|
+
First, create a connection to the host:
|
17
|
+
|
18
|
+
```ruby
|
19
|
+
require 'fog/digitalocean'
|
20
|
+
|
21
|
+
docean = Fog::Compute.new({
|
22
|
+
:provider => 'DigitalOcean',
|
23
|
+
:digitalocean_token => 'poiuweoruwoeiuroiwuer', # your Access Token here
|
24
|
+
})
|
25
|
+
```
|
26
|
+
|
27
|
+
## SSH Key Management
|
28
|
+
|
29
|
+
Access to DigitalOcean servers can be managed with SSH keys. These can be assigned to servers at creation time so you can access them without having to use a password.
|
30
|
+
|
31
|
+
Creating a key:
|
32
|
+
|
33
|
+
```ruby
|
34
|
+
docean.ssh_keys.create(
|
35
|
+
:name => 'Default SSH Key',
|
36
|
+
:ssh_pub_key => File.read('~/.ssh/id_rsa.pub'))
|
37
|
+
)
|
38
|
+
```
|
39
|
+
|
40
|
+
Listing all keys:
|
41
|
+
|
42
|
+
```ruby
|
43
|
+
docean.ssh_keys.each do | key |
|
44
|
+
puts key.name
|
45
|
+
puts key.public_key
|
46
|
+
puts key.id
|
47
|
+
end
|
48
|
+
```
|
49
|
+
|
50
|
+
Destroying a key:
|
51
|
+
|
52
|
+
```ruby
|
53
|
+
docean.ssh_keys.destroy(:id => '27100')
|
54
|
+
```
|
55
|
+
## Listing servers
|
56
|
+
|
57
|
+
Listing servers and attributes:
|
58
|
+
|
59
|
+
```ruby
|
60
|
+
docean.servers.each do |server|
|
61
|
+
# remember, servers are droplets
|
62
|
+
puts server.id
|
63
|
+
puts server.name
|
64
|
+
puts server.status
|
65
|
+
puts (server.image['slug'] || server.image['name']) # slug is only for public images, private images use name
|
66
|
+
puts server.size['slug']
|
67
|
+
puts server.region['slug']
|
68
|
+
end
|
69
|
+
```
|
70
|
+
|
71
|
+
## Server creation and life-cycle management
|
72
|
+
|
73
|
+
Creating a new server (droplet):
|
74
|
+
|
75
|
+
```ruby
|
76
|
+
server = docean.servers.create :name => 'foobar',
|
77
|
+
# use the last image listed
|
78
|
+
:image => docean.images.last.id,
|
79
|
+
# use the first flavor (aka size) listed
|
80
|
+
:size => docean.flavors.first.slug,
|
81
|
+
# use the first region listed
|
82
|
+
:region => docean.regions.first.slug
|
83
|
+
```
|
84
|
+
|
85
|
+
The server is automatically started after that.
|
86
|
+
|
87
|
+
We didn't pay attention when choosing the flavor, image and region used
|
88
|
+
but you can easily list them too, and then decide:
|
89
|
+
|
90
|
+
```ruby
|
91
|
+
docean.images.each do |image|
|
92
|
+
puts image.id
|
93
|
+
puts image.name
|
94
|
+
puts image.distribution
|
95
|
+
end
|
96
|
+
|
97
|
+
docean.flavors.each do |flavor|
|
98
|
+
puts flavor.slug
|
99
|
+
end
|
100
|
+
|
101
|
+
docean.regions.each do |region|
|
102
|
+
puts region.slug
|
103
|
+
end
|
104
|
+
```
|
105
|
+
|
106
|
+
Rebooting a server:
|
107
|
+
|
108
|
+
```ruby
|
109
|
+
server = docean.servers.first
|
110
|
+
server.reboot
|
111
|
+
```
|
112
|
+
|
113
|
+
Power cycle a server:
|
114
|
+
|
115
|
+
```ruby
|
116
|
+
server.power_cycle
|
117
|
+
```
|
118
|
+
|
119
|
+
Destroying the server:
|
120
|
+
|
121
|
+
```ruby
|
122
|
+
server.destroy
|
123
|
+
```
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Fog
|
2
|
+
module Compute
|
3
|
+
class DigitalOcean
|
4
|
+
class Flavor < Fog::Model
|
5
|
+
identity :slug
|
6
|
+
attribute :available
|
7
|
+
attribute :transfer
|
8
|
+
attribute :price_monthly
|
9
|
+
attribute :price_hourly
|
10
|
+
attribute :memory
|
11
|
+
attribute :vcpus
|
12
|
+
attribute :disk
|
13
|
+
attribute :regions
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Fog
|
2
|
+
module Compute
|
3
|
+
class DigitalOcean
|
4
|
+
class Flavors < Fog::Collection
|
5
|
+
model Fog::Compute::DigitalOcean::Flavor
|
6
|
+
|
7
|
+
# Retrieves flavours (aka. sizes)
|
8
|
+
# @return [Fog::Compute::DigitalOceanV2:Flavor]
|
9
|
+
# @raise [Fog::Compute::DigitalOceanV2::NotFound] - HTTP 404
|
10
|
+
# @raise [Fog::Compute::DigitalOceanV2::BadRequest] - HTTP 400
|
11
|
+
# @raise [Fog::Compute::DigitalOceanV2::InternalServerError] - HTTP 500
|
12
|
+
# @raise [Fog::Compute::DigitalOceanV2::ServiceError]
|
13
|
+
# @see https://developers.digitalocean.com/documentation/v2/#list-all-sizes
|
14
|
+
def all(filters = {})
|
15
|
+
data = service.list_flavors(filters).body["sizes"]
|
16
|
+
load(data)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|