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
@@ -0,0 +1,25 @@
|
|
1
|
+
module Fog
|
2
|
+
module Compute
|
3
|
+
class DigitalOcean
|
4
|
+
class Image < Fog::Model
|
5
|
+
identity :id
|
6
|
+
attribute :name
|
7
|
+
attribute :type
|
8
|
+
attribute :distribution
|
9
|
+
attribute :slug
|
10
|
+
attribute :public
|
11
|
+
attribute :regions
|
12
|
+
attribute :min_disk_size
|
13
|
+
attribute :created_at
|
14
|
+
end
|
15
|
+
|
16
|
+
def transfer
|
17
|
+
perform_action :transfer_image
|
18
|
+
end
|
19
|
+
|
20
|
+
def convert_to_snapshot
|
21
|
+
perform_action :convert_image_to_snapshot
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'fog/digitalocean/models/paging_collection'
|
2
|
+
|
3
|
+
module Fog
|
4
|
+
module Compute
|
5
|
+
class DigitalOcean
|
6
|
+
class Images < Fog::Compute::DigitalOcean::PagingCollection
|
7
|
+
model Fog::Compute::DigitalOcean::Image
|
8
|
+
|
9
|
+
# Retrieves images
|
10
|
+
# @return [Fog::Compute::DigitalOceanV2:Image]
|
11
|
+
# @raise [Fog::Compute::DigitalOceanV2::NotFound] - HTTP 404
|
12
|
+
# @raise [Fog::Compute::DigitalOceanV2::BadRequest] - HTTP 400
|
13
|
+
# @raise [Fog::Compute::DigitalOceanV2::InternalServerError] - HTTP 500
|
14
|
+
# @raise [Fog::Compute::DigitalOceanV2::ServiceError]
|
15
|
+
# @see https://developers.digitalocean.com/documentation/v2/#list-all-images
|
16
|
+
def all(filters = {})
|
17
|
+
data = service.list_images(filters)
|
18
|
+
links = data.body["links"]
|
19
|
+
get_paged_links(links)
|
20
|
+
images = data.body["images"]
|
21
|
+
load(images)
|
22
|
+
end
|
23
|
+
|
24
|
+
# Retrieves image
|
25
|
+
# @param [String] id for image to be returned
|
26
|
+
# @return [Fog::Compute::DigitalOceanV2:Image]
|
27
|
+
# @raise [Fog::Compute::DigitalOceanV2::NotFound] - HTTP 404
|
28
|
+
# @raise [Fog::Compute::DigitalOceanV2::BadRequest] - HTTP 400
|
29
|
+
# @raise [Fog::Compute::DigitalOceanV2::InternalServerError] - HTTP 500
|
30
|
+
# @raise [Fog::Compute::DigitalOceanV2::ServiceError]
|
31
|
+
# @see https://developers.digitalocean.com/documentation/v2/#retrieve-an-existing-image-by-id
|
32
|
+
def get(id)
|
33
|
+
image = service.get_image_details(id).body['image']
|
34
|
+
new(image) if image
|
35
|
+
rescue Fog::Errors::NotFound
|
36
|
+
nil
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Fog
|
2
|
+
module Compute
|
3
|
+
class DigitalOcean
|
4
|
+
class Regions < Fog::Collection
|
5
|
+
model Fog::Compute::DigitalOcean::Region
|
6
|
+
|
7
|
+
# Retrieves regions
|
8
|
+
# @return [Fog::Compute::DigitalOceanV2:Regions]
|
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-regions
|
14
|
+
def all(filters = {})
|
15
|
+
data = service.list_regions(filters).body["regions"]
|
16
|
+
load(data)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,170 @@
|
|
1
|
+
require 'fog/compute/models/server'
|
2
|
+
|
3
|
+
module Fog
|
4
|
+
module Compute
|
5
|
+
class DigitalOcean
|
6
|
+
# A DigitalOcean Droplet
|
7
|
+
#
|
8
|
+
class Server < Fog::Compute::Server
|
9
|
+
identity :id
|
10
|
+
attribute :name
|
11
|
+
attribute :memory
|
12
|
+
attribute :vcpus
|
13
|
+
attribute :disk
|
14
|
+
attribute :locked
|
15
|
+
attribute :created_at
|
16
|
+
attribute :status, :aliases => 'state'
|
17
|
+
attribute :backup_ids
|
18
|
+
attribute :snapshot_ids
|
19
|
+
attribute :features
|
20
|
+
attribute :region
|
21
|
+
attribute :image
|
22
|
+
attribute :size
|
23
|
+
attribute :size_slug
|
24
|
+
attribute :networks
|
25
|
+
attribute :kernel
|
26
|
+
attribute :next_backup_window
|
27
|
+
attribute :private_networking
|
28
|
+
attribute :backups
|
29
|
+
attribute :ipv6
|
30
|
+
attribute :ssh_keys
|
31
|
+
|
32
|
+
def public_ip_address
|
33
|
+
ipv4_address
|
34
|
+
end
|
35
|
+
|
36
|
+
def ipv6_address
|
37
|
+
if (net = networks['v6'].find { |n| n['type'] == 'public' })
|
38
|
+
net['ip_address']
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def ipv4_address
|
43
|
+
if (net = networks['v4'].find { |n| n['type'] == 'public' })
|
44
|
+
net['ip_address']
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def save
|
49
|
+
raise Fog::Errors::Error.new('Re-saving an existing object may create a duplicate') if persisted?
|
50
|
+
requires :name, :region, :size, :image
|
51
|
+
|
52
|
+
options = {}
|
53
|
+
if attributes[:ssh_keys]
|
54
|
+
options[:ssh_keys] = attributes[:ssh_keys]
|
55
|
+
elsif @ssh_keys
|
56
|
+
options[:ssh_keys] = @ssh_keys.map(&:id)
|
57
|
+
end
|
58
|
+
|
59
|
+
options[:private_networking] = private_networking
|
60
|
+
options[:backups] = backups
|
61
|
+
options[:ipv6] = ipv6
|
62
|
+
|
63
|
+
data = service.create_server(name, size, image, region, options)
|
64
|
+
|
65
|
+
merge_attributes(data.body['droplet'])
|
66
|
+
true
|
67
|
+
end
|
68
|
+
|
69
|
+
def delete
|
70
|
+
requires :id
|
71
|
+
response = service.delete_server id
|
72
|
+
response.body
|
73
|
+
end
|
74
|
+
|
75
|
+
def ready?
|
76
|
+
status == 'active'
|
77
|
+
end
|
78
|
+
|
79
|
+
def locked?
|
80
|
+
locked
|
81
|
+
end
|
82
|
+
|
83
|
+
def actions
|
84
|
+
requires :id
|
85
|
+
response = service.list_droplet_actions id
|
86
|
+
response.body
|
87
|
+
end
|
88
|
+
|
89
|
+
def action(action_id)
|
90
|
+
requires :id
|
91
|
+
response = service.get_droplet_action(id, action_id)
|
92
|
+
response.body
|
93
|
+
end
|
94
|
+
|
95
|
+
def reboot
|
96
|
+
perform_action :reboot_server
|
97
|
+
end
|
98
|
+
|
99
|
+
def disable_backups
|
100
|
+
perform_action :disable_backups
|
101
|
+
end
|
102
|
+
|
103
|
+
def power_cycle
|
104
|
+
perform_action :power_cycle
|
105
|
+
end
|
106
|
+
|
107
|
+
def shutdown
|
108
|
+
perform_action :shutdown
|
109
|
+
end
|
110
|
+
|
111
|
+
def power_off
|
112
|
+
perform_action :power_off
|
113
|
+
end
|
114
|
+
|
115
|
+
def power_on
|
116
|
+
perform_action :power_on
|
117
|
+
end
|
118
|
+
|
119
|
+
def restore(image)
|
120
|
+
perform_action :restore, image
|
121
|
+
end
|
122
|
+
|
123
|
+
def password_reset
|
124
|
+
perform_action :password_reset
|
125
|
+
end
|
126
|
+
|
127
|
+
def resize(resize_disk, size)
|
128
|
+
perform_action :resize, resize_disk, size
|
129
|
+
end
|
130
|
+
|
131
|
+
def rebuild(image)
|
132
|
+
perform_action :rebuild, image
|
133
|
+
end
|
134
|
+
|
135
|
+
def rename(name)
|
136
|
+
perform_action :rename, name
|
137
|
+
end
|
138
|
+
|
139
|
+
def change_kernel(kernel)
|
140
|
+
perform_action :change_kernel, kernel
|
141
|
+
end
|
142
|
+
|
143
|
+
def enable_ipv6
|
144
|
+
perform_action :enable_ipv6
|
145
|
+
end
|
146
|
+
|
147
|
+
def enable_private_networking
|
148
|
+
perform_action :enable_private_networking
|
149
|
+
end
|
150
|
+
|
151
|
+
def snapshot(name)
|
152
|
+
perform_action :snapshot, name
|
153
|
+
end
|
154
|
+
|
155
|
+
def upgrade
|
156
|
+
perform_action :upgrade
|
157
|
+
end
|
158
|
+
|
159
|
+
private
|
160
|
+
|
161
|
+
# Performs a droplet action with the given set of arguments.
|
162
|
+
def perform_action(action, *args)
|
163
|
+
requires :id
|
164
|
+
response = service.send(action, id, *args)
|
165
|
+
response.body
|
166
|
+
end
|
167
|
+
end
|
168
|
+
end
|
169
|
+
end
|
170
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'fog/core/collection'
|
2
|
+
require 'fog/digitalocean/models/compute/server'
|
3
|
+
require 'fog/digitalocean/models/paging_collection'
|
4
|
+
|
5
|
+
module Fog
|
6
|
+
module Compute
|
7
|
+
class DigitalOcean
|
8
|
+
class Servers < Fog::Compute::DigitalOcean::PagingCollection
|
9
|
+
model Fog::Compute::DigitalOcean::Server
|
10
|
+
|
11
|
+
# Returns list of servers
|
12
|
+
# @return [Fog::Compute::DigitalOceanV2::Servers]
|
13
|
+
# @raise [Fog::Compute::DigitalOceanV2::NotFound] - HTTP 404
|
14
|
+
# @raise [Fog::Compute::DigitalOceanV2::BadRequest] - HTTP 400
|
15
|
+
# @raise [Fog::Compute::DigitalOceanV2::InternalServerError] - HTTP 500
|
16
|
+
# @raise [Fog::Compute::DigitalOceanV2::ServiceError]
|
17
|
+
# @see https://developers.digitalocean.com/documentation/v2/#droplets
|
18
|
+
def all(filters = {})
|
19
|
+
data = service.list_servers(filters)
|
20
|
+
links = data.body["links"]
|
21
|
+
get_paged_links(links)
|
22
|
+
droplets = data.body["droplets"]
|
23
|
+
load(droplets)
|
24
|
+
end
|
25
|
+
|
26
|
+
# Retrieves server
|
27
|
+
# @param [String] id for server to be returned
|
28
|
+
# @return [Fog::Compute::DigitalOceanV2:Server]
|
29
|
+
# @raise [Fog::Compute::DigitalOceanV2::NotFound] - HTTP 404
|
30
|
+
# @raise [Fog::Compute::DigitalOceanV2::BadRequest] - HTTP 400
|
31
|
+
# @raise [Fog::Compute::DigitalOceanV2::InternalServerError] - HTTP 500
|
32
|
+
# @raise [Fog::Compute::DigitalOceanV2::ServiceError]
|
33
|
+
# @see https://developers.digitalocean.com/documentation/v2/#retrieve-an-existing-droplet-by-id
|
34
|
+
def get(id)
|
35
|
+
server = service.get_server_details(id).body['droplet']
|
36
|
+
new(server) if server
|
37
|
+
rescue Fog::Errors::NotFound
|
38
|
+
nil
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module Fog
|
2
|
+
module Compute
|
3
|
+
class DigitalOcean
|
4
|
+
class SshKey < Fog::Model
|
5
|
+
identity :id
|
6
|
+
attribute :fingerprint
|
7
|
+
attribute :public_key
|
8
|
+
attribute :name
|
9
|
+
|
10
|
+
def save
|
11
|
+
requires :name, :public_key
|
12
|
+
merge_attributes(service.create_ssh_key(name, public_key).body['ssh_key'])
|
13
|
+
true
|
14
|
+
end
|
15
|
+
|
16
|
+
def destroy
|
17
|
+
requires :id
|
18
|
+
service.delete_ssh_key id
|
19
|
+
end
|
20
|
+
|
21
|
+
def update
|
22
|
+
requires :id, :name
|
23
|
+
data = service.update_server(id, name)
|
24
|
+
merge_attributes(data.body['ssh_key'])
|
25
|
+
true
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'fog/digitalocean/models/paging_collection'
|
2
|
+
|
3
|
+
module Fog
|
4
|
+
module Compute
|
5
|
+
class DigitalOcean
|
6
|
+
class SshKeys < Fog::Compute::DigitalOcean::PagingCollection
|
7
|
+
model Fog::Compute::DigitalOcean::SshKey
|
8
|
+
|
9
|
+
# Returns list of ssh keys
|
10
|
+
# @return [Fog::Compute::DigitalOceanV2::Sshkeys] Retrieves a list of ssh keys.
|
11
|
+
# @raise [Fog::Compute::DigitalOceanV2::NotFound] - HTTP 404
|
12
|
+
# @raise [Fog::Compute::DigitalOceanV2::BadRequest] - HTTP 400
|
13
|
+
# @raise [Fog::Compute::DigitalOceanV2::InternalServerError] - HTTP 500
|
14
|
+
# @raise [Fog::Compute::DigitalOceanV2::ServiceError]
|
15
|
+
# @see https://developers.digitalocean.com/documentation/v2/#list-all-keys
|
16
|
+
def all(filters = {})
|
17
|
+
data = service.list_ssh_keys(filters)
|
18
|
+
links = data.body["links"]
|
19
|
+
get_paged_links(links)
|
20
|
+
keys = data.body["ssh_keys"]
|
21
|
+
load(keys)
|
22
|
+
end
|
23
|
+
|
24
|
+
# Returns ssh key
|
25
|
+
# @return [Fog::Compute::DigitalOceanV2::Sshkeys] Retrieves a list of ssh keys.
|
26
|
+
# @raise [Fog::Compute::DigitalOceanV2::NotFound] - HTTP 404
|
27
|
+
# @raise [Fog::Compute::DigitalOceanV2::BadRequest] - HTTP 400
|
28
|
+
# @raise [Fog::Compute::DigitalOceanV2::InternalServerError] - HTTP 500
|
29
|
+
# @raise [Fog::Compute::DigitalOceanV2::ServiceError]
|
30
|
+
# @see https://developers.digitalocean.com/documentation/v2/#retrieve-an-existing-key
|
31
|
+
def get(id)
|
32
|
+
key = service.get_ssh_key(id).body['ssh_key']
|
33
|
+
new(key) if key
|
34
|
+
rescue Fog::Errors::NotFound
|
35
|
+
nil
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module Fog
|
2
|
+
module Compute
|
3
|
+
class DigitalOcean
|
4
|
+
class PagingCollection < Fog::Collection
|
5
|
+
|
6
|
+
attribute :next
|
7
|
+
attribute :last
|
8
|
+
|
9
|
+
def next_page
|
10
|
+
all(page: @next) if @next != @last
|
11
|
+
end
|
12
|
+
|
13
|
+
def previous_page
|
14
|
+
if @next.to_i > 2
|
15
|
+
all(page: @next.to_i - 2)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def deep_fetch(hash, *path)
|
22
|
+
path.inject(hash) do |acc, key|
|
23
|
+
acc.respond_to?(:keys) ? acc[key] : nil
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def get_page(link)
|
28
|
+
if match = link.match(/page=(?<page>\d+)/)
|
29
|
+
match.captures.last
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def get_paged_links(links)
|
34
|
+
next_link = deep_fetch(links, "pages", "next").to_s
|
35
|
+
last_link = deep_fetch(links, "pages", "last").to_s
|
36
|
+
@next = get_page(next_link) || @next
|
37
|
+
@last = get_page(last_link) || @last
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
module Fog
|
2
|
+
module Compute
|
3
|
+
class DigitalOcean
|
4
|
+
class Real
|
5
|
+
def change_kernel(id, kernel)
|
6
|
+
body = { :type => "change_kernel", :kernel => kernel }
|
7
|
+
|
8
|
+
encoded_body = Fog::JSON.encode(body)
|
9
|
+
|
10
|
+
request(
|
11
|
+
:expects => [201],
|
12
|
+
:headers => {
|
13
|
+
'Content-Type' => "application/json; charset=UTF-8",
|
14
|
+
},
|
15
|
+
:method => 'POST',
|
16
|
+
:path => "v2/droplets/#{id}/actions",
|
17
|
+
:body => encoded_body,
|
18
|
+
)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
class Mock
|
23
|
+
def change_kernel(id, kernel)
|
24
|
+
response = Excon::Response.new
|
25
|
+
response.status = 201
|
26
|
+
response.body = {
|
27
|
+
'action' => {
|
28
|
+
'id' => Fog::Mock.random_numbers(1).to_i,
|
29
|
+
'status' => "in-progress",
|
30
|
+
'type' => "change_kernel",
|
31
|
+
'started_at' => "2014-11-14T16:31:00Z",
|
32
|
+
'completed_at' => null,
|
33
|
+
'resource_id' => id,
|
34
|
+
'resource_type' => "droplet",
|
35
|
+
'region' => "nyc3",
|
36
|
+
'region_slug' => "nyc3"
|
37
|
+
}
|
38
|
+
}
|
39
|
+
response
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|