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.
Files changed (152) hide show
  1. checksums.yaml +7 -0
  2. data/.coveralls.yml +1 -0
  3. data/.document +3 -0
  4. data/.gitignore +30 -0
  5. data/.irbrc +82 -0
  6. data/.rubocop.yml +20 -0
  7. data/.rubocop_todo.yml +606 -0
  8. data/.travis.yml +35 -0
  9. data/CHANGELOG.md +3 -0
  10. data/CONTRIBUTING.md +276 -0
  11. data/CONTRIBUTORS.md +898 -0
  12. data/Gemfile +5 -0
  13. data/LICENSE.md +20 -0
  14. data/README.md +130 -0
  15. data/RELEASE.md +40 -0
  16. data/Rakefile +12 -0
  17. data/benchs/each_provider.sh +6 -0
  18. data/benchs/each_service.sh +6 -0
  19. data/benchs/fog_vs.rb +106 -0
  20. data/benchs/load_times.rb +37 -0
  21. data/benchs/params.rb +43 -0
  22. data/benchs/parse_vs_push.rb +67 -0
  23. data/bin/fog +78 -0
  24. data/fog-digitalocean.gemspec +61 -0
  25. data/gemfiles/Gemfile-edge +14 -0
  26. data/lib/fog/digitalocean.rb +1 -0
  27. data/lib/fog/digitalocean/CHANGELOG.md +6 -0
  28. data/lib/fog/digitalocean/compute.rb +109 -0
  29. data/lib/fog/digitalocean/core.rb +9 -0
  30. data/lib/fog/digitalocean/examples/getting_started.md +123 -0
  31. data/lib/fog/digitalocean/models/compute/flavor.rb +17 -0
  32. data/lib/fog/digitalocean/models/compute/flavors.rb +21 -0
  33. data/lib/fog/digitalocean/models/compute/image.rb +25 -0
  34. data/lib/fog/digitalocean/models/compute/images.rb +42 -0
  35. data/lib/fog/digitalocean/models/compute/region.rb +13 -0
  36. data/lib/fog/digitalocean/models/compute/regions.rb +21 -0
  37. data/lib/fog/digitalocean/models/compute/server.rb +170 -0
  38. data/lib/fog/digitalocean/models/compute/servers.rb +43 -0
  39. data/lib/fog/digitalocean/models/compute/ssh_key.rb +31 -0
  40. data/lib/fog/digitalocean/models/compute/ssh_keys.rb +40 -0
  41. data/lib/fog/digitalocean/models/paging_collection.rb +42 -0
  42. data/lib/fog/digitalocean/requests/compute/change_kernel.rb +44 -0
  43. data/lib/fog/digitalocean/requests/compute/convert_to_snapshot.rb +44 -0
  44. data/lib/fog/digitalocean/requests/compute/create_server.rb +93 -0
  45. data/lib/fog/digitalocean/requests/compute/create_ssh_key.rb +49 -0
  46. data/lib/fog/digitalocean/requests/compute/delete_ssh_key.rb +32 -0
  47. data/lib/fog/digitalocean/requests/compute/destroy_server.rb +35 -0
  48. data/lib/fog/digitalocean/requests/compute/disable_backups.rb +45 -0
  49. data/lib/fog/digitalocean/requests/compute/enable_ipv6.rb +44 -0
  50. data/lib/fog/digitalocean/requests/compute/enable_private_networking.rb +44 -0
  51. data/lib/fog/digitalocean/requests/compute/get_droplet_action.rb +36 -0
  52. data/lib/fog/digitalocean/requests/compute/get_image_details.rb +42 -0
  53. data/lib/fog/digitalocean/requests/compute/get_server_details.rb +84 -0
  54. data/lib/fog/digitalocean/requests/compute/get_ssh_key.rb +34 -0
  55. data/lib/fog/digitalocean/requests/compute/list_droplet_actions.rb +38 -0
  56. data/lib/fog/digitalocean/requests/compute/list_flavors.rb +132 -0
  57. data/lib/fog/digitalocean/requests/compute/list_images.rb +51 -0
  58. data/lib/fog/digitalocean/requests/compute/list_regions.rb +95 -0
  59. data/lib/fog/digitalocean/requests/compute/list_servers.rb +33 -0
  60. data/lib/fog/digitalocean/requests/compute/list_ssh_keys.rb +41 -0
  61. data/lib/fog/digitalocean/requests/compute/password_reset.rb +44 -0
  62. data/lib/fog/digitalocean/requests/compute/power_cycle.rb +44 -0
  63. data/lib/fog/digitalocean/requests/compute/power_off.rb +44 -0
  64. data/lib/fog/digitalocean/requests/compute/power_on.rb +44 -0
  65. data/lib/fog/digitalocean/requests/compute/reboot_server.rb +44 -0
  66. data/lib/fog/digitalocean/requests/compute/rebuild.rb +44 -0
  67. data/lib/fog/digitalocean/requests/compute/rename.rb +44 -0
  68. data/lib/fog/digitalocean/requests/compute/resize.rb +48 -0
  69. data/lib/fog/digitalocean/requests/compute/restore.rb +44 -0
  70. data/lib/fog/digitalocean/requests/compute/shutdown.rb +44 -0
  71. data/lib/fog/digitalocean/requests/compute/snapshot.rb +44 -0
  72. data/lib/fog/digitalocean/requests/compute/transfer_image.rb +44 -0
  73. data/lib/fog/digitalocean/requests/compute/update_ssh_key.rb +46 -0
  74. data/lib/fog/digitalocean/requests/compute/upgrade.rb +44 -0
  75. data/lib/fog/digitalocean/service.rb +51 -0
  76. data/lib/fog/digitalocean/version.rb +5 -0
  77. data/spec/fog/account_spec.rb +14 -0
  78. data/spec/fog/billing_spec.rb +14 -0
  79. data/spec/fog/bin/atmos_spec.rb +33 -0
  80. data/spec/fog/bin/aws_spec.rb +98 -0
  81. data/spec/fog/bin/baremetalcloud_spec.rb +33 -0
  82. data/spec/fog/bin/bluebox_spec.rb +55 -0
  83. data/spec/fog/bin/brightbox_spec.rb +30 -0
  84. data/spec/fog/bin/clodo_spec.rb +9 -0
  85. data/spec/fog/bin/cloudsigma_spec.rb +9 -0
  86. data/spec/fog/bin/cloudstack_spec.rb +9 -0
  87. data/spec/fog/bin/digitalocean_spec.rb +9 -0
  88. data/spec/fog/bin/dnsimple_spec.rb +9 -0
  89. data/spec/fog/bin/dnsmadeeasy_spec.rb +9 -0
  90. data/spec/fog/bin/dreamhost_spec.rb +9 -0
  91. data/spec/fog/bin/dynect_spec.rb +9 -0
  92. data/spec/fog/bin/ecloud_spec.rb +10 -0
  93. data/spec/fog/bin/fogdocker_spec.rb +10 -0
  94. data/spec/fog/bin/glesys_spec.rb +10 -0
  95. data/spec/fog/bin/gogrid_spec.rb +10 -0
  96. data/spec/fog/bin/google_spec.rb +10 -0
  97. data/spec/fog/bin/ibm_spec.rb +10 -0
  98. data/spec/fog/bin/internetarchive_spec.rb +10 -0
  99. data/spec/fog/bin/joyent_spec.rb +10 -0
  100. data/spec/fog/bin/linode_spec.rb +10 -0
  101. data/spec/fog/bin/local_spec.rb +10 -0
  102. data/spec/fog/bin/ninefold_spec.rb +10 -0
  103. data/spec/fog/bin/opennebula_spec.rb +10 -0
  104. data/spec/fog/bin/openstack_spec.rb +10 -0
  105. data/spec/fog/bin/openvz_spec.rb +10 -0
  106. data/spec/fog/bin/ovirt_spec.rb +10 -0
  107. data/spec/fog/bin/powerdns_spec.rb +9 -0
  108. data/spec/fog/bin/profitbricks_spec.rb +10 -0
  109. data/spec/fog/bin/rackspace_spec.rb +10 -0
  110. data/spec/fog/bin/rage4_spec.rb +10 -0
  111. data/spec/fog/bin/riakcs_spec.rb +10 -0
  112. data/spec/fog/bin/sakuracloud_spec.rb +10 -0
  113. data/spec/fog/bin/serverlove_spec.rb +10 -0
  114. data/spec/fog/bin/softlayer_spec.rb +10 -0
  115. data/spec/fog/bin/stormondemand_spec.rb +10 -0
  116. data/spec/fog/bin/vcloud_spec.rb +10 -0
  117. data/spec/fog/bin/vclouddirector_spec.rb +10 -0
  118. data/spec/fog/bin/vmfusion_spec.rb +10 -0
  119. data/spec/fog/bin/voxel_spec.rb +10 -0
  120. data/spec/fog/bin/vsphere_spec.rb +10 -0
  121. data/spec/fog/bin/xenserver_spec.rb +10 -0
  122. data/spec/fog/bin/zerigo_spec.rb +10 -0
  123. data/spec/fog/bin_spec.rb +161 -0
  124. data/spec/fog/cdn_spec.rb +14 -0
  125. data/spec/fog/compute_spec.rb +19 -0
  126. data/spec/fog/dns_spec.rb +19 -0
  127. data/spec/fog/identity_spec.rb +14 -0
  128. data/spec/fog/image_spec.rb +14 -0
  129. data/spec/fog/metering_spec.rb +14 -0
  130. data/spec/fog/monitoring_spec.rb +14 -0
  131. data/spec/fog/network_spec.rb +14 -0
  132. data/spec/fog/orchestration_spec.rb +14 -0
  133. data/spec/fog/storage_spec.rb +14 -0
  134. data/spec/fog/support_spec.rb +14 -0
  135. data/spec/fog/volume_spec.rb +14 -0
  136. data/spec/fog/vpn_spec.rb +14 -0
  137. data/spec/fog/xml/connection_spec.rb +33 -0
  138. data/spec/helpers/bin.rb +34 -0
  139. data/spec/spec_helper.rb +18 -0
  140. data/tests/digitalocean/helper.rb +56 -0
  141. data/tests/digitalocean/requests/compute/list_flavors_tests.rb +25 -0
  142. data/tests/digitalocean/requests/compute/list_images_tests.rb +25 -0
  143. data/tests/digitalocean/requests/compute/list_regions_tests.rb +21 -0
  144. data/tests/digitalocean/requests/compute/server_tests.rb +77 -0
  145. data/tests/digitalocean/requests/compute_v2/list_ssh_keys_tests.rb +20 -0
  146. data/tests/helper.rb +25 -0
  147. data/tests/helpers/format_helper.rb +100 -0
  148. data/tests/helpers/mock_helper.rb +14 -0
  149. data/tests/helpers/succeeds_helper.rb +10 -0
  150. data/tests/lorem.txt +1 -0
  151. data/tests/watchr.rb +22 -0
  152. 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,13 @@
1
+ module Fog
2
+ module Compute
3
+ class DigitalOcean
4
+ class Region < Fog::Model
5
+ identity :slug
6
+ attribute :name
7
+ attribute :sizes
8
+ attribute :available
9
+ attribute :features
10
+ end
11
+ end
12
+ end
13
+ 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