fog-digitalocean 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|