vultr 0.4.3 → 2.0.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 (241) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +38 -0
  3. data/.standard.yml +1 -0
  4. data/Appraisals +8 -0
  5. data/CHANGELOG.md +9 -0
  6. data/Gemfile +6 -10
  7. data/README.md +307 -137
  8. data/Rakefile +10 -6
  9. data/bin/console +21 -0
  10. data/bin/setup +8 -0
  11. data/bin/test +6 -0
  12. data/gemfiles/faraday_1.gemfile +12 -0
  13. data/gemfiles/faraday_1.gemfile.lock +102 -0
  14. data/gemfiles/faraday_2.gemfile +11 -0
  15. data/gemfiles/faraday_2.gemfile.lock +82 -0
  16. data/lib/vultr/client.rb +111 -0
  17. data/lib/vultr/collection.rb +22 -0
  18. data/lib/vultr/error.rb +4 -0
  19. data/lib/vultr/middleware.rb +32 -0
  20. data/lib/vultr/object.rb +19 -0
  21. data/lib/vultr/objects/account.rb +4 -0
  22. data/lib/vultr/objects/application.rb +4 -0
  23. data/lib/vultr/objects/backup.rb +4 -0
  24. data/lib/vultr/objects/bare_metal.rb +4 -0
  25. data/lib/vultr/objects/block_storage.rb +4 -0
  26. data/lib/vultr/objects/domain.rb +4 -0
  27. data/lib/vultr/objects/firewall_group.rb +4 -0
  28. data/lib/vultr/objects/instance.rb +4 -0
  29. data/lib/vultr/objects/iso.rb +4 -0
  30. data/lib/vultr/objects/kubernetes_cluster.rb +4 -0
  31. data/lib/vultr/objects/load_balancer.rb +4 -0
  32. data/lib/vultr/objects/object_storage.rb +4 -0
  33. data/lib/vultr/objects/operating_system.rb +4 -0
  34. data/lib/vultr/objects/plan.rb +4 -0
  35. data/lib/vultr/objects/private_network.rb +4 -0
  36. data/lib/vultr/objects/region.rb +4 -0
  37. data/lib/vultr/objects/reserved_ip.rb +4 -0
  38. data/lib/vultr/objects/snapshot.rb +4 -0
  39. data/lib/vultr/objects/ssh_key.rb +4 -0
  40. data/lib/vultr/objects/startup_script.rb +4 -0
  41. data/lib/vultr/objects/user.rb +4 -0
  42. data/lib/vultr/resource.rb +52 -0
  43. data/lib/vultr/resources/account.rb +7 -0
  44. data/lib/vultr/resources/applications.rb +8 -0
  45. data/lib/vultr/resources/backups.rb +12 -0
  46. data/lib/vultr/resources/bare_metal.rb +79 -0
  47. data/lib/vultr/resources/block_storage.rb +32 -0
  48. data/lib/vultr/resources/dns.rb +58 -0
  49. data/lib/vultr/resources/firewall.rb +42 -0
  50. data/lib/vultr/resources/instances.rb +145 -0
  51. data/lib/vultr/resources/iso.rb +25 -0
  52. data/lib/vultr/resources/kubernetes.rb +61 -0
  53. data/lib/vultr/resources/load_balancers.rb +50 -0
  54. data/lib/vultr/resources/object_storage.rb +33 -0
  55. data/lib/vultr/resources/operating_systems.rb +8 -0
  56. data/lib/vultr/resources/plans.rb +13 -0
  57. data/lib/vultr/resources/private_networks.rb +24 -0
  58. data/lib/vultr/resources/regions.rb +12 -0
  59. data/lib/vultr/resources/reserved_ips.rb +32 -0
  60. data/lib/vultr/resources/snapshots.rb +28 -0
  61. data/lib/vultr/resources/ssh_keys.rb +24 -0
  62. data/lib/vultr/resources/startup_scripts.rb +24 -0
  63. data/lib/vultr/resources/users.rb +24 -0
  64. data/lib/vultr/version.rb +1 -8
  65. data/lib/vultr.rb +58 -887
  66. data/test/fixtures/account/info.json +11 -0
  67. data/test/fixtures/applications/list.json +29 -0
  68. data/test/fixtures/backups/list.json +18 -0
  69. data/test/fixtures/backups/retrieve.json +9 -0
  70. data/test/fixtures/bare_metals/bandwidth.json +12 -0
  71. data/test/fixtures/bare_metals/create.json +26 -0
  72. data/test/fixtures/bare_metals/list.json +36 -0
  73. data/test/fixtures/bare_metals/list_ipv4.json +18 -0
  74. data/test/fixtures/bare_metals/list_ipv6.json +17 -0
  75. data/test/fixtures/bare_metals/reinstall.json +25 -0
  76. data/test/fixtures/bare_metals/retrieve.json +26 -0
  77. data/test/fixtures/bare_metals/update.json +26 -0
  78. data/test/fixtures/bare_metals/upgrades.json +47 -0
  79. data/test/fixtures/bare_metals/user_data.json +5 -0
  80. data/test/fixtures/bare_metals/vnc.json +5 -0
  81. data/test/fixtures/block_storage/attach.json +4 -0
  82. data/test/fixtures/block_storage/create.json +13 -0
  83. data/test/fixtures/block_storage/detach.json +4 -0
  84. data/test/fixtures/block_storage/list.json +22 -0
  85. data/test/fixtures/block_storage/retrieve.json +13 -0
  86. data/test/fixtures/domains/create.json +6 -0
  87. data/test/fixtures/domains/dnssec.json +7 -0
  88. data/test/fixtures/domains/list.json +15 -0
  89. data/test/fixtures/domains/record.json +10 -0
  90. data/test/fixtures/domains/records.json +19 -0
  91. data/test/fixtures/domains/retrieve.json +6 -0
  92. data/test/fixtures/domains/soa.json +6 -0
  93. data/test/fixtures/firewall/create.json +11 -0
  94. data/test/fixtures/firewall/create_rule.json +9 -0
  95. data/test/fixtures/firewall/delete.json +1 -0
  96. data/test/fixtures/firewall/delete_rule.json +1 -0
  97. data/test/fixtures/firewall/list.json +20 -0
  98. data/test/fixtures/firewall/list_rules.json +22 -0
  99. data/test/fixtures/firewall/retrieve.json +11 -0
  100. data/test/fixtures/firewall/retrieve_rule.json +13 -0
  101. data/test/fixtures/firewall/update.json +1 -0
  102. data/test/fixtures/instances/attach_iso.json +6 -0
  103. data/test/fixtures/instances/attach_private_network.json +1 -0
  104. data/test/fixtures/instances/backup_schedule.json +10 -0
  105. data/test/fixtures/instances/bandwidth.json +12 -0
  106. data/test/fixtures/instances/create.json +36 -0
  107. data/test/fixtures/instances/create_ipv4_reverse.json +1 -0
  108. data/test/fixtures/instances/create_ipv6_reverse.json +1 -0
  109. data/test/fixtures/instances/delete.json +1 -0
  110. data/test/fixtures/instances/delete_ipv4.json +1 -0
  111. data/test/fixtures/instances/delete_ipv6.json +1 -0
  112. data/test/fixtures/instances/detach_iso.json +5 -0
  113. data/test/fixtures/instances/detach_private_network.json +1 -0
  114. data/test/fixtures/instances/halt.json +1 -0
  115. data/test/fixtures/instances/halt_instances.json +1 -0
  116. data/test/fixtures/instances/ipv4.json +9 -0
  117. data/test/fixtures/instances/ipv6_reverse.json +15 -0
  118. data/test/fixtures/instances/iso.json +6 -0
  119. data/test/fixtures/instances/list.json +44 -0
  120. data/test/fixtures/instances/list_ipv4.json +32 -0
  121. data/test/fixtures/instances/list_ipv6.json +17 -0
  122. data/test/fixtures/instances/list_private_networks.json +16 -0
  123. data/test/fixtures/instances/neighbors.json +6 -0
  124. data/test/fixtures/instances/reboot.json +1 -0
  125. data/test/fixtures/instances/reboot_instances.json +1 -0
  126. data/test/fixtures/instances/reinstall.json +35 -0
  127. data/test/fixtures/instances/restore.json +7 -0
  128. data/test/fixtures/instances/retrieve.json +35 -0
  129. data/test/fixtures/instances/set_backup_schedule.json +1 -0
  130. data/test/fixtures/instances/set_default_reverse_dns_entry.json +1 -0
  131. data/test/fixtures/instances/start.json +1 -0
  132. data/test/fixtures/instances/start_instances.json +1 -0
  133. data/test/fixtures/instances/update.json +1 -0
  134. data/test/fixtures/instances/upgrades.json +55 -0
  135. data/test/fixtures/instances/user_data.json +5 -0
  136. data/test/fixtures/isos/create.json +8 -0
  137. data/test/fixtures/isos/list.json +20 -0
  138. data/test/fixtures/isos/list_public.json +17 -0
  139. data/test/fixtures/isos/retrieve.json +11 -0
  140. data/test/fixtures/kubernetes/config.json +3 -0
  141. data/test/fixtures/kubernetes/create.json +39 -0
  142. data/test/fixtures/kubernetes/create_node_pool.json +25 -0
  143. data/test/fixtures/kubernetes/list.json +85 -0
  144. data/test/fixtures/kubernetes/list_node_pools.json +56 -0
  145. data/test/fixtures/kubernetes/list_resources.json +26 -0
  146. data/test/fixtures/kubernetes/retrieve.json +39 -0
  147. data/test/fixtures/kubernetes/retrieve_node_pool.json +25 -0
  148. data/test/fixtures/kubernetes/update_node_pool.json +19 -0
  149. data/test/fixtures/load_balancers/create.json +48 -0
  150. data/test/fixtures/load_balancers/create_forwarding_rule.json +1 -0
  151. data/test/fixtures/load_balancers/delete.json +1 -0
  152. data/test/fixtures/load_balancers/delete_forwarding_rule.json +1 -0
  153. data/test/fixtures/load_balancers/list.json +57 -0
  154. data/test/fixtures/load_balancers/list_firewall_rules.json +17 -0
  155. data/test/fixtures/load_balancers/list_forwarding_rules.json +18 -0
  156. data/test/fixtures/load_balancers/retrieve.json +48 -0
  157. data/test/fixtures/load_balancers/retrieve_firewall_rule.json +8 -0
  158. data/test/fixtures/load_balancers/retrieve_forwarding_rule.json +9 -0
  159. data/test/fixtures/load_balancers/update.json +1 -0
  160. data/test/fixtures/object_storage/create.json +14 -0
  161. data/test/fixtures/object_storage/delete.json +1 -0
  162. data/test/fixtures/object_storage/list.json +22 -0
  163. data/test/fixtures/object_storage/list_clusters.json +17 -0
  164. data/test/fixtures/object_storage/regenerate_keys.json +7 -0
  165. data/test/fixtures/object_storage/retrieve.json +13 -0
  166. data/test/fixtures/object_storage/update.json +1 -0
  167. data/test/fixtures/operating_systems/list.json +17 -0
  168. data/test/fixtures/plans/list.json +22 -0
  169. data/test/fixtures/plans/list_metal.json +24 -0
  170. data/test/fixtures/private_networks/create.json +10 -0
  171. data/test/fixtures/private_networks/delete.json +1 -0
  172. data/test/fixtures/private_networks/list.json +19 -0
  173. data/test/fixtures/private_networks/retrieve.json +10 -0
  174. data/test/fixtures/private_networks/update.json +1 -0
  175. data/test/fixtures/regions/list.json +20 -0
  176. data/test/fixtures/regions/list_availability.json +24 -0
  177. data/test/fixtures/reserved_ips/attach.json +1 -0
  178. data/test/fixtures/reserved_ips/convert.json +11 -0
  179. data/test/fixtures/reserved_ips/create.json +11 -0
  180. data/test/fixtures/reserved_ips/delete.json +1 -0
  181. data/test/fixtures/reserved_ips/detach.json +1 -0
  182. data/test/fixtures/reserved_ips/list.json +29 -0
  183. data/test/fixtures/reserved_ips/retrieve.json +11 -0
  184. data/test/fixtures/snapshots/create.json +11 -0
  185. data/test/fixtures/snapshots/create_from_url.json +11 -0
  186. data/test/fixtures/snapshots/delete.json +1 -0
  187. data/test/fixtures/snapshots/list.json +20 -0
  188. data/test/fixtures/snapshots/retrieve.json +11 -0
  189. data/test/fixtures/snapshots/update.json +1 -0
  190. data/test/fixtures/ssh_keys/create.json +8 -0
  191. data/test/fixtures/ssh_keys/delete.json +1 -0
  192. data/test/fixtures/ssh_keys/list.json +17 -0
  193. data/test/fixtures/ssh_keys/retrieve.json +8 -0
  194. data/test/fixtures/ssh_keys/update.json +1 -0
  195. data/test/fixtures/startup_scripts/create.json +10 -0
  196. data/test/fixtures/startup_scripts/delete.json +1 -0
  197. data/test/fixtures/startup_scripts/list.json +18 -0
  198. data/test/fixtures/startup_scripts/retrieve.json +10 -0
  199. data/test/fixtures/startup_scripts/update.json +1 -0
  200. data/test/fixtures/users/create.json +9 -0
  201. data/test/fixtures/users/delete.json +1 -0
  202. data/test/fixtures/users/list.json +29 -0
  203. data/test/fixtures/users/retrieve.json +20 -0
  204. data/test/fixtures/users/update.json +1 -0
  205. data/test/test_helper.rb +18 -5
  206. data/test/vultr/client_test.rb +8 -0
  207. data/test/vultr/object_test.rb +21 -0
  208. data/test/vultr/resources/account_test.rb +12 -0
  209. data/test/vultr/resources/applications_test.rb +15 -0
  210. data/test/vultr/resources/backups_test.rb +24 -0
  211. data/test/vultr/resources/bare_metal_test.rb +267 -0
  212. data/test/vultr/resources/block_storage_test.rb +85 -0
  213. data/test/vultr/resources/dns_test.rb +134 -0
  214. data/test/vultr/resources/firewall_test.rb +88 -0
  215. data/test/vultr/resources/instances_test.rb +325 -0
  216. data/test/vultr/resources/iso_test.rb +58 -0
  217. data/test/vultr/resources/kubernetes_test.rb +185 -0
  218. data/test/vultr/resources/load_balancers_test.rb +110 -0
  219. data/test/vultr/resources/object_storage_test.rb +71 -0
  220. data/test/vultr/resources/operating_systems_test.rb +15 -0
  221. data/test/vultr/resources/plans_test.rb +25 -0
  222. data/test/vultr/resources/private_networks_test.rb +50 -0
  223. data/test/vultr/resources/regions_test.rb +26 -0
  224. data/test/vultr/resources/reserved_ips_test.rb +67 -0
  225. data/test/vultr/resources/snapshots_test.rb +60 -0
  226. data/test/vultr/resources/ssh_keys_test.rb +50 -0
  227. data/test/vultr/resources/startup_scripts_test.rb +50 -0
  228. data/test/vultr/resources/users_test.rb +50 -0
  229. data/vultr.gemspec +15 -17
  230. metadata +237 -54
  231. data/.travis.yml +0 -26
  232. data/test/vultr/vultr_account_test.rb +0 -29
  233. data/test/vultr/vultr_app_test.rb +0 -26
  234. data/test/vultr/vultr_backup_test.rb +0 -22
  235. data/test/vultr/vultr_iso_test.rb +0 -27
  236. data/test/vultr/vultr_os_test.rb +0 -21
  237. data/test/vultr/vultr_plan_test.rb +0 -22
  238. data/test/vultr/vultr_region_test.rb +0 -33
  239. data/test/vultr/vultr_snapshot_test.rb +0 -30
  240. data/test/vultr/vultr_sshkey_test.rb +0 -50
  241. data/test/vultr/vultr_startupscript_test.rb +0 -53
@@ -0,0 +1,102 @@
1
+ PATH
2
+ remote: ..
3
+ specs:
4
+ vultr (2.0.0)
5
+ faraday (>= 1.0, < 3.0)
6
+
7
+ GEM
8
+ remote: https://rubygems.org/
9
+ specs:
10
+ appraisal (2.5.0)
11
+ bundler
12
+ rake
13
+ thor (>= 0.14.0)
14
+ ast (2.4.2)
15
+ base64 (0.2.0)
16
+ faraday (1.10.3)
17
+ faraday-em_http (~> 1.0)
18
+ faraday-em_synchrony (~> 1.0)
19
+ faraday-excon (~> 1.1)
20
+ faraday-httpclient (~> 1.0)
21
+ faraday-multipart (~> 1.0)
22
+ faraday-net_http (~> 1.0)
23
+ faraday-net_http_persistent (~> 1.0)
24
+ faraday-patron (~> 1.0)
25
+ faraday-rack (~> 1.0)
26
+ faraday-retry (~> 1.0)
27
+ ruby2_keywords (>= 0.0.4)
28
+ faraday-em_http (1.0.0)
29
+ faraday-em_synchrony (1.0.0)
30
+ faraday-excon (1.1.0)
31
+ faraday-httpclient (1.0.1)
32
+ faraday-multipart (1.0.4)
33
+ multipart-post (~> 2)
34
+ faraday-net_http (1.0.1)
35
+ faraday-net_http_persistent (1.2.0)
36
+ faraday-patron (1.0.0)
37
+ faraday-rack (1.0.0)
38
+ faraday-retry (1.0.3)
39
+ json (2.7.2)
40
+ language_server-protocol (3.17.0.3)
41
+ lint_roller (1.1.0)
42
+ minitest (5.23.1)
43
+ multipart-post (2.4.1)
44
+ parallel (1.24.0)
45
+ parser (3.3.2.0)
46
+ ast (~> 2.4.1)
47
+ racc
48
+ racc (1.8.0)
49
+ rainbow (3.1.1)
50
+ rake (13.2.1)
51
+ regexp_parser (2.9.2)
52
+ rexml (3.2.8)
53
+ strscan (>= 3.0.9)
54
+ rubocop (1.63.5)
55
+ json (~> 2.3)
56
+ language_server-protocol (>= 3.17.0)
57
+ parallel (~> 1.10)
58
+ parser (>= 3.3.0.2)
59
+ rainbow (>= 2.2.2, < 4.0)
60
+ regexp_parser (>= 1.8, < 3.0)
61
+ rexml (>= 3.2.5, < 4.0)
62
+ rubocop-ast (>= 1.31.1, < 2.0)
63
+ ruby-progressbar (~> 1.7)
64
+ unicode-display_width (>= 2.4.0, < 3.0)
65
+ rubocop-ast (1.31.3)
66
+ parser (>= 3.3.1.0)
67
+ rubocop-performance (1.21.0)
68
+ rubocop (>= 1.48.1, < 2.0)
69
+ rubocop-ast (>= 1.31.1, < 2.0)
70
+ ruby-progressbar (1.13.0)
71
+ ruby2_keywords (0.0.5)
72
+ standard (1.36.0)
73
+ language_server-protocol (~> 3.17.0.2)
74
+ lint_roller (~> 1.0)
75
+ rubocop (~> 1.63.0)
76
+ standard-custom (~> 1.0.0)
77
+ standard-performance (~> 1.4)
78
+ standard-custom (1.0.2)
79
+ lint_roller (~> 1.0)
80
+ rubocop (~> 1.50)
81
+ standard-performance (1.4.0)
82
+ lint_roller (~> 1.1)
83
+ rubocop-performance (~> 1.21.0)
84
+ strscan (3.1.0)
85
+ thor (1.3.1)
86
+ unicode-display_width (2.5.0)
87
+
88
+ PLATFORMS
89
+ ruby
90
+ x86_64-darwin-23
91
+
92
+ DEPENDENCIES
93
+ appraisal
94
+ base64 (~> 0.2.0)
95
+ faraday (~> 1.10)
96
+ minitest (>= 5.0.5)
97
+ rake
98
+ standard
99
+ vultr!
100
+
101
+ BUNDLED WITH
102
+ 2.5.10
@@ -0,0 +1,11 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "rake"
6
+ gem "minitest", ">= 5.0.5"
7
+ gem "standard"
8
+ gem "appraisal"
9
+ gem "faraday", "~> 2.0"
10
+
11
+ gemspec path: "../"
@@ -0,0 +1,82 @@
1
+ PATH
2
+ remote: ..
3
+ specs:
4
+ vultr (2.0.0)
5
+ faraday (>= 1.0, < 3.0)
6
+
7
+ GEM
8
+ remote: https://rubygems.org/
9
+ specs:
10
+ appraisal (2.5.0)
11
+ bundler
12
+ rake
13
+ thor (>= 0.14.0)
14
+ ast (2.4.2)
15
+ faraday (2.9.0)
16
+ faraday-net_http (>= 2.0, < 3.2)
17
+ faraday-net_http (3.1.0)
18
+ net-http
19
+ json (2.7.2)
20
+ language_server-protocol (3.17.0.3)
21
+ lint_roller (1.1.0)
22
+ minitest (5.23.1)
23
+ net-http (0.4.1)
24
+ uri
25
+ parallel (1.24.0)
26
+ parser (3.3.2.0)
27
+ ast (~> 2.4.1)
28
+ racc
29
+ racc (1.8.0)
30
+ rainbow (3.1.1)
31
+ rake (13.2.1)
32
+ regexp_parser (2.9.2)
33
+ rexml (3.2.8)
34
+ strscan (>= 3.0.9)
35
+ rubocop (1.63.5)
36
+ json (~> 2.3)
37
+ language_server-protocol (>= 3.17.0)
38
+ parallel (~> 1.10)
39
+ parser (>= 3.3.0.2)
40
+ rainbow (>= 2.2.2, < 4.0)
41
+ regexp_parser (>= 1.8, < 3.0)
42
+ rexml (>= 3.2.5, < 4.0)
43
+ rubocop-ast (>= 1.31.1, < 2.0)
44
+ ruby-progressbar (~> 1.7)
45
+ unicode-display_width (>= 2.4.0, < 3.0)
46
+ rubocop-ast (1.31.3)
47
+ parser (>= 3.3.1.0)
48
+ rubocop-performance (1.21.0)
49
+ rubocop (>= 1.48.1, < 2.0)
50
+ rubocop-ast (>= 1.31.1, < 2.0)
51
+ ruby-progressbar (1.13.0)
52
+ standard (1.36.0)
53
+ language_server-protocol (~> 3.17.0.2)
54
+ lint_roller (~> 1.0)
55
+ rubocop (~> 1.63.0)
56
+ standard-custom (~> 1.0.0)
57
+ standard-performance (~> 1.4)
58
+ standard-custom (1.0.2)
59
+ lint_roller (~> 1.0)
60
+ rubocop (~> 1.50)
61
+ standard-performance (1.4.0)
62
+ lint_roller (~> 1.1)
63
+ rubocop-performance (~> 1.21.0)
64
+ strscan (3.1.0)
65
+ thor (1.3.1)
66
+ unicode-display_width (2.5.0)
67
+ uri (0.13.0)
68
+
69
+ PLATFORMS
70
+ ruby
71
+ x86_64-darwin-23
72
+
73
+ DEPENDENCIES
74
+ appraisal
75
+ faraday (~> 2.0)
76
+ minitest (>= 5.0.5)
77
+ rake
78
+ standard
79
+ vultr!
80
+
81
+ BUNDLED WITH
82
+ 2.5.10
@@ -0,0 +1,111 @@
1
+ module Vultr
2
+ class Client
3
+ BASE_URL = "https://api.vultr.com/v2"
4
+
5
+ attr_reader :api_key, :adapter
6
+
7
+ def initialize(api_key:, adapter: Faraday.default_adapter, stubs: nil)
8
+ @api_key = api_key
9
+ @adapter = adapter
10
+
11
+ # Test stubs for requests
12
+ @stubs = stubs
13
+ end
14
+
15
+ def account
16
+ AccountResource.new(self)
17
+ end
18
+
19
+ def applications
20
+ ApplicationsResource.new(self)
21
+ end
22
+
23
+ def backups
24
+ BackupsResource.new(self)
25
+ end
26
+
27
+ def bare_metal
28
+ BareMetalResource.new(self)
29
+ end
30
+
31
+ def block_storage
32
+ BlockStorageResource.new(self)
33
+ end
34
+
35
+ def dns
36
+ DnsResource.new(self)
37
+ end
38
+
39
+ def firewall
40
+ FirewallResource.new(self)
41
+ end
42
+
43
+ def instances
44
+ InstancesResource.new(self)
45
+ end
46
+
47
+ def iso
48
+ IsoResource.new(self)
49
+ end
50
+
51
+ def kubernetes
52
+ KubernetesResource.new(self)
53
+ end
54
+
55
+ def load_balancers
56
+ LoadBalancersResource.new(self)
57
+ end
58
+
59
+ def object_storage
60
+ ObjectStorageResource.new(self)
61
+ end
62
+
63
+ def operating_systems
64
+ OperatingSystemsResource.new(self)
65
+ end
66
+
67
+ def plans
68
+ PlansResource.new(self)
69
+ end
70
+
71
+ def private_networks
72
+ PrivateNetworksResource.new(self)
73
+ end
74
+
75
+ def reserved_ips
76
+ ReservedIpsResource.new(self)
77
+ end
78
+
79
+ def regions
80
+ RegionsResource.new(self)
81
+ end
82
+
83
+ def snapshots
84
+ SnapshotsResource.new(self)
85
+ end
86
+
87
+ def ssh_keys
88
+ SshKeysResource.new(self)
89
+ end
90
+
91
+ def startup_scripts
92
+ StartupScriptsResource.new(self)
93
+ end
94
+
95
+ def users
96
+ UserResource.new(self)
97
+ end
98
+
99
+ def connection
100
+ @connection ||= Faraday.new(BASE_URL) do |conn|
101
+ conn.request :authorization, :Bearer, api_key
102
+ conn.request :json
103
+
104
+ conn.response :vultr
105
+ conn.response :json, content_type: "application/json"
106
+
107
+ conn.adapter adapter, @stubs
108
+ end
109
+ end
110
+ end
111
+ end
@@ -0,0 +1,22 @@
1
+ module Vultr
2
+ class Collection
3
+ attr_reader :data, :total, :next_cursor, :prev_cursor
4
+
5
+ def self.from_response(response, key:, type:)
6
+ body = response.body
7
+ new(
8
+ data: body[key].map { |attrs| type.new(attrs) },
9
+ total: body.dig("meta", "total"),
10
+ next_cursor: body.dig("meta", "links", "next"),
11
+ prev_cursor: body.dig("meta", "links", "prev")
12
+ )
13
+ end
14
+
15
+ def initialize(data:, total:, next_cursor:, prev_cursor:)
16
+ @data = data
17
+ @total = total
18
+ @next_cursor = next_cursor.empty? ? nil : next_cursor
19
+ @prev_cursor = prev_cursor.empty? ? nil : prev_cursor
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,4 @@
1
+ module Vultr
2
+ class Error < StandardError
3
+ end
4
+ end
@@ -0,0 +1,32 @@
1
+ require "time"
2
+
3
+ module Vultr
4
+ class Middleware < Faraday::Middleware
5
+ ISO_DATE_FORMAT = /\A\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?(Z|((\+|-)\d{2}:?\d{2}))\Z/xm
6
+
7
+ # This method will be called when the response is being processed.
8
+ # You can alter it as you like, accessing things like response_body, response_headers, and more.
9
+ # Refer to Faraday::Env for a list of accessible fields:
10
+ # https://github.com/lostisland/faraday/blob/main/lib/faraday/options/env.rb
11
+ #
12
+ # @param env [Faraday::Env] the environment of the response being processed.
13
+ def on_complete(env)
14
+ parse_dates! env[:body]
15
+ end
16
+
17
+ private
18
+
19
+ def parse_dates!(value)
20
+ case value
21
+ when Hash
22
+ value.each { |key, element| value[key] = parse_dates!(element) }
23
+ when Array
24
+ value.each_with_index { |element, index| value[index] = parse_dates!(element) }
25
+ when ISO_DATE_FORMAT
26
+ Time.parse(value)
27
+ else
28
+ value
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,19 @@
1
+ require "ostruct"
2
+
3
+ module Vultr
4
+ class Object < OpenStruct
5
+ def initialize(attributes)
6
+ super(to_ostruct(attributes))
7
+ end
8
+
9
+ def to_ostruct(obj)
10
+ if obj.is_a?(Hash)
11
+ OpenStruct.new(obj.map { |key, val| [key, to_ostruct(val)] }.to_h)
12
+ elsif obj.is_a?(Array)
13
+ obj.map { |o| to_ostruct(o) }
14
+ else # Assumed to be a primitive value
15
+ obj
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,4 @@
1
+ module Vultr
2
+ class Account < Object
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module Vultr
2
+ class Application < Object
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module Vultr
2
+ class Backup < Object
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module Vultr
2
+ class BareMetal < Object
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module Vultr
2
+ class BlockStorage < Object
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module Vultr
2
+ class Domain < Object
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module Vultr
2
+ class FirewallGroup < Object
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module Vultr
2
+ class Instance < Object
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module Vultr
2
+ class Iso < Object
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module Vultr
2
+ class KubernetesCluster < Object
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module Vultr
2
+ class LoadBalancer < Object
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module Vultr
2
+ class ObjectStorage < Object
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module Vultr
2
+ class OperatingSystem < Object
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module Vultr
2
+ class Plan < Object
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module Vultr
2
+ class PrivateNetwork < Object
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module Vultr
2
+ class Region < Object
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module Vultr
2
+ class ReservedIp < Object
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module Vultr
2
+ class Snapshot < Object
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module Vultr
2
+ class SshKey < Object
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module Vultr
2
+ class StartupScript < Object
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module Vultr
2
+ class User < Object
3
+ end
4
+ end
@@ -0,0 +1,52 @@
1
+ module Vultr
2
+ class Resource
3
+ attr_reader :client
4
+
5
+ def initialize(client)
6
+ @client = client
7
+ end
8
+
9
+ private
10
+
11
+ def get_request(url, params: {}, headers: {})
12
+ handle_response client.connection.get(url, params, headers)
13
+ end
14
+
15
+ def post_request(url, body:, headers: {})
16
+ handle_response client.connection.post(url, body, headers)
17
+ end
18
+
19
+ def patch_request(url, body:, headers: {})
20
+ handle_response client.connection.patch(url, body, headers)
21
+ end
22
+
23
+ def put_request(url, body:, headers: {})
24
+ handle_response client.connection.put(url, body, headers)
25
+ end
26
+
27
+ def delete_request(url, params: {}, headers: {})
28
+ handle_response client.connection.delete(url, params, headers)
29
+ end
30
+
31
+ def handle_response(response)
32
+ case response.status
33
+ when 400
34
+ raise Error, "Your request was malformed. #{response.body["error"]}"
35
+ when 401
36
+ raise Error, "You did not supply valid authentication credentials. #{response.body["error"]}"
37
+ when 403
38
+ raise Error, "You are not allowed to perform that action. #{response.body["error"]}"
39
+ when 404
40
+ raise Error, "No results were found for your request. #{response.body["error"]}"
41
+ when 429
42
+ raise Error, "Your request exceeded the API rate limit. #{response.body["error"]}"
43
+ when 500
44
+ raise Error, "We were unable to perform the request due to server-side problems. #{response.body["error"]}"
45
+ when 503
46
+ raise Error, "You have been rate limited for sending more than 20 requests per second. #{response.body["error"]}"
47
+ end
48
+
49
+ response
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,7 @@
1
+ module Vultr
2
+ class AccountResource < Resource
3
+ def info
4
+ Account.new get_request("account").body.dig("account")
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,8 @@
1
+ module Vultr
2
+ class ApplicationsResource < Resource
3
+ def list(**params)
4
+ response = get_request("applications", params: params)
5
+ Collection.from_response(response, key: "applications", type: Application)
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,12 @@
1
+ module Vultr
2
+ class BackupsResource < Resource
3
+ def list(**params)
4
+ response = get_request("backups", params: params)
5
+ Collection.from_response(response, key: "backups", type: Backup)
6
+ end
7
+
8
+ def retrieve(backup_id:)
9
+ Backup.new get_request("backups/#{backup_id}").body.dig("backup")
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,79 @@
1
+ module Vultr
2
+ class BareMetalResource < Resource
3
+ def list(**params)
4
+ response = get_request("bare-metals", params: params)
5
+ Collection.from_response(response, key: "bare_metals", type: BareMetal)
6
+ end
7
+
8
+ def create(**attributes)
9
+ BareMetal.new post_request("bare-metals", body: attributes).body.dig("bare_metal")
10
+ end
11
+
12
+ def retrieve(baremetal_id:)
13
+ BareMetal.new get_request("bare-metals/#{baremetal_id}").body.dig("bare_metal")
14
+ end
15
+
16
+ def update(baremetal_id:, **attributes)
17
+ BareMetal.new patch_request("bare-metals/#{baremetal_id}", body: attributes).body.dig("bare_metal")
18
+ end
19
+
20
+ def delete(baremetal_id:)
21
+ delete_request("bare-metals/#{baremetal_id}")
22
+ end
23
+
24
+ def start(baremetal_id:)
25
+ post_request("bare-metals/#{baremetal_id}/start", body: {})
26
+ end
27
+
28
+ def reboot(baremetal_id:)
29
+ post_request("bare-metals/#{baremetal_id}/reboot", body: {})
30
+ end
31
+
32
+ def reinstall(baremetal_id:)
33
+ BareMetal.new post_request("bare-metals/#{baremetal_id}/reinstall", body: {}).body.dig("bare_metal")
34
+ end
35
+
36
+ def halt(baremetal_id:)
37
+ post_request("bare-metals/#{baremetal_id}/halt", body: {})
38
+ end
39
+
40
+ def bandwidth(baremetal_id:)
41
+ Object.new get_request("bare-metals/#{baremetal_id}/bandwidth").body.dig("bandwidth")
42
+ end
43
+
44
+ def user_data(baremetal_id:)
45
+ Object.new get_request("bare-metals/#{baremetal_id}/user-data").body.dig("user_data")
46
+ end
47
+
48
+ def upgrades(baremetal_id:, **params)
49
+ Object.new get_request("bare-metals/#{baremetal_id}/upgrades", params: params).body.dig("upgrades")
50
+ end
51
+
52
+ def vnc(baremetal_id:)
53
+ Object.new get_request("bare-metals/#{baremetal_id}/vnc").body.dig("vnc")
54
+ end
55
+
56
+ def list_ipv4(baremetal_id:)
57
+ response = get_request("bare-metals/#{baremetal_id}/ipv4")
58
+ Collection.from_response(response, key: "ipv4s", type: Object)
59
+ end
60
+
61
+ def list_ipv6(baremetal_id:)
62
+ response = get_request("bare-metals/#{baremetal_id}/ipv6")
63
+ Collection.from_response(response, key: "ipv6s", type: Object)
64
+ end
65
+
66
+ # Bulk operations
67
+ def halt_instances(baremetal_ids:)
68
+ post_request("bare-metals/halt", body: {baremetal_ids: Array(baremetal_ids)})
69
+ end
70
+
71
+ def reboot_instances(baremetal_ids:)
72
+ post_request("bare-metals/reboot", body: {baremetal_ids: Array(baremetal_ids)})
73
+ end
74
+
75
+ def start_instances(baremetal_ids:)
76
+ post_request("bare-metals/start", body: {baremetal_ids: Array(baremetal_ids)})
77
+ end
78
+ end
79
+ end