vultr 0.3.5 → 0.4.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9d228aac0df7c724995a66e8825e4627d2578557427a08fdfd3472c9fa4c8f67
4
- data.tar.gz: cbaadf4151d305cac4946f756a4f6a5974a7eb60821c43c5eb7505f0bd6ccd15
3
+ metadata.gz: dbb52a12c7cdc57603fa024d78fdad2d7dcbcf4c0d9671366bffb1d77e10f4c8
4
+ data.tar.gz: 03c29fab7c22d02da8899cb7991179af78c7b5401d3e6a77d8dd8f6be13f3d6c
5
5
  SHA512:
6
- metadata.gz: 6f94f4581bac3bc02b65c57f1d5906250d0c2f256bfbd2a1df26274409836ca1da10ba03d046dc857fb0f4b433aedf98b2592344ac16603a3b297ccb9e9b16fb
7
- data.tar.gz: 9d64fdd19409ccc87834c1bb86b4e04cc299bcb69d183051729e27d1c46639ebc7103a0a64cee29479677a3c0f18742b7bb8ea0f1af4c6283289ab727832491a
6
+ metadata.gz: 600a9f8c3a4254770c3c45dc16d9c744bff7775e44350a67b73dc86525e7c6c80ac20c273456279d4e3384b1315731071604a25fd7787452d7203afc2a1521a0
7
+ data.tar.gz: aeed5037be9893cbf7765127ac0f1c6d6f5d60050192ddd79623c15f029b68bb4c48bbcfc4b80d1ae2eb3ea152f7c8a0126d102b20ec4e97616ca761c9be9304
@@ -1,3 +1,16 @@
1
+ == 0.4.1 / 2018-09-25
2
+
3
+ * Make the params of Vultr::Server.list correct.
4
+ * Fix #11, pass params to query string only giving their values.
5
+
6
+ == 0.4.0 / 2018-09-12
7
+
8
+ * Update to the latest APIs.
9
+
10
+ == 0.3.5 / 2018-08-14
11
+
12
+ * Update dependencies.
13
+
1
14
  == 0.3.4 / 2017-09-26
2
15
 
3
16
  * Fix ReservedIP API
data/Gemfile CHANGED
@@ -1,5 +1,12 @@
1
1
  source 'https://rubygems.org'
2
- gemspec
3
2
 
4
3
  gem 'rake', '~> 10.5.0' if RUBY_VERSION < '1.9.3'
5
4
  gem 'rake' if RUBY_VERSION >= '1.9.3'
5
+
6
+ group :test do
7
+ gem 'coveralls', :require => false
8
+ gem 'minitest', '>= 5.0.5'
9
+ gem 'simplecov'
10
+ end
11
+
12
+ gemspec
data/README.md CHANGED
@@ -1,5 +1,10 @@
1
1
  # VULTR Rubygem
2
2
 
3
+ [![Waffle.io - Columns and their card count](https://badge.waffle.io/tolbkni/vultr.rb.svg?columns=all)](https://waffle.io/tolbkni/vultr.rb)
4
+ [![Build Status](https://img.shields.io/travis/tolbkni/vultr.rb.svg)](https://travis-ci.org/tolbkni/vultr.rb)
5
+ [![Gem Version](https://badge.fury.io/rb/vultr.svg)](https://badge.fury.io/rb/vultr)
6
+
7
+
3
8
  The easiest and most complete rubygem for [VULTR](https://www.vultr.com).
4
9
 
5
10
  ```ruby
data/Rakefile CHANGED
@@ -1 +1,10 @@
1
1
  require 'bundler/gem_tasks'
2
+ require 'rake/testtask'
3
+
4
+ Rake::TestTask.new(:test) do |t|
5
+ t.libs << 'test'
6
+ t.libs << 'lib'
7
+ t.test_files = FileList['test/**/*_test.rb']
8
+ end
9
+
10
+ task :default => :test
@@ -2,246 +2,886 @@ require 'faraday'
2
2
  require 'faraday_middleware'
3
3
  require 'vultr/version'
4
4
 
5
- module Vultr
6
- extend self
5
+ module Vultr extend self
7
6
 
8
- DEFINITIONS = {
9
- Account: {
10
- info: [:get, '/v1/account/info?api_key=[api_key]']
11
- },
12
- App: {
13
- list: [:get, '/v1/app/list']
14
- },
15
- Auth: {
16
- info: [:get, '/v1/auth/info?api_key=[api_key]']
17
- },
18
- Backup: {
19
- list: [:get, '/v1/backup/list?api_key=[api_key]']
20
- },
21
- Block: {
22
- attach: [:post, '/v1/block/attach?api_key=[api_key]', ['SUBID', 'attach_to_SUBID']],
23
- create: [:post, '/v1/block/create?api_key=[api_key]', ['DCID', 'size_gb', 'label']],
24
- delete: [:post, '/v1/block/delete?api_key=[api_key]', ['SUBID']],
25
- detach: [:post, '/v1/block/detach?api_key=[api_key]', ['SUBID']],
26
- label_set: [:post, '/v1/block/label_set?api_key=[api_key]', ['SUBID', 'label']],
27
- list: [:get, '/v1/block/list?api_key=[api_key]&SUBID=[SUBID]'],
28
- resize: [:post, '/v1/block/resize?api_key=[api_key]', ['SUBID', 'size_gb']]
29
- },
30
- DNS: {
31
- create_domain: [:post, '/v1/dns/create_domain?api_key=[api_key]', ['domain', 'serverip']],
32
- create_record: [:post, '/v1/dns/create_record?api_key=[api_key]', ['domain', 'name', 'type', 'data', 'ttl', 'priority']],
33
- delete_domain: [:post, '/v1/dns/delete_domain?api_key=[api_key]', ['domain']],
34
- delete_record: [:post, '/v1/dns/delete_record?api_key=[api_key]', ['domain', 'RECORDID']],
35
- list: [:get, '/v1/dns/list?api_key=[api_key]'],
36
- records: [:get, '/v1/dns/records?api_key=[api_key]&domain=[domain]'],
37
- update_record: [:post, '/v1/dns/update_record?api_key=[api_key]', ['domain', 'RECORDID', 'name', 'type', 'data', 'ttl', 'priority']]
38
- },
39
- ISO: {
40
- list: [:get, '/v1/iso/list?api_key=[api_key]']
41
- },
42
- OS: {
43
- list: [:get, '/v1/os/list']
44
- },
45
- Plans: {
46
- list: [:get, '/v1/plans/list?type=[type]'],
47
- list_vc2: [:get, '/v1/plans/list_vc2'],
48
- list_vdc2: [:get, '/v1/plans/list_vdc2']
49
- },
50
- Regions: {
51
- availability: [:get, '/v1/regions/availability?DCID=[DCID]'],
52
- list: [:get, '/v1/regions/list']
53
- },
54
- ReservedIP: {
55
- attach: [:post, '/v1/reservedip/attach?api_key=[api_key]', ['ip_address', 'attach_SUBID']],
56
- convert: [:post, '/v1/reservedip/convert?api_key=[api_key]', ['SUBID', 'ip_address', 'label']],
57
- create: [:post, '/v1/reservedip/create?api_key=[api_key]', ['DCID', 'ip_type', 'label']],
58
- destroy: [:post, '/v1/reservedip/destroy?api_key=[api_key]', ['ip_address']],
59
- detach: [:post, '/v1/reservedip/detach?api_key=[api_key]', ['ip_address', 'detach_SUBID']],
60
- list: [:get, '/v1/reservedip/list?api_key=[api_key]']
61
- },
62
- Server: {
63
- app_change: [:post, '/v1/server/app_change?api_key=[api_key]', ['SUBID', 'APPID']],
64
- app_change_list: [:get, '/v1/server/app_change?api_key=[api_key]&SUBID=[SUBID]'],
65
- backup_disable: [:post, '/v1/server/backup_disable?api_key=[api_key]', ['SUBID']],
66
- backup_enable: [:post, '/v1/server/backup_enable?api_key=[api_key]', ['SUBID']],
67
- backup_get_schedule: [:post, '/v1/server/backup_get_schedule?api_key=[api_key]', ['SUBID']],
68
- backup_set_schedule: [:post, '/v1/server/backup_set_schedule?api_key=[api_key]', ['SUBID', 'cron_type', 'hour', 'dow', 'dom']],
69
- bandwidth: [:get, '/v1/server/bandwidth?api_key=[api_key]&SUBID=[SUBID]'],
70
- create: [:post, '/v1/server/create?api_key=[api_key]',
71
- ['DCID', 'VPSPLANID', 'OSID', 'ipxe_chain_url', 'ISOID', 'SCRIPTID', 'SNAPSHOTID',
72
- 'enable_ipv6', 'enable_private_network', 'private_network', 'label', 'SSHKEYID', 'auto_backups',
73
- 'APPID', 'userdata', 'notify_activate', 'ddos_protection', 'reserved_ip_v4', 'hostname', 'tag']],
74
- create_ipv4: [:post, '/v1/server/create_ipv4?api_key=[api_key]', ['SUBID', 'reboot']],
75
- destroy: [:post, '/v1/server/destroy?api_key=[api_key]', ['SUBID']],
76
- destroy_ipv4: [:post, '/v1/server/destroy_ipv4?api_key=[api_key]', ['SUBID', 'ip']],
77
- get_app_info: [:get, '/v1/server/get_app_info?api_key=[api_key]&SUBID=[SUBID]'],
78
- get_user_data: [:get, '/v1/server/set_user_data?api_key=[api_key]&SUBID=[SUBID]'],
79
- halt: [:post, '/v1/server/halt?api_key=[api_key]', ['SUBID']],
80
- iso_attach: [:post, '/v1/server/iso_detach?api_key=[api_key]', ['SUBID', 'ISOID']],
81
- iso_detach: [:post, '/v1/server/iso_detach?api_key=[api_key]', ['SUBID']],
82
- iso_status: [:get, '/v1/server/iso_status?api_key=[api_key]&SUBID=[SUBID]'],
83
- label_set: [:post, '/v1/server/label_set?api_key=[api_key]', ['SUBID', 'label']],
84
- list: [:get, '/v1/server/list?api_key=[api_key]&SUBID=[SUBID]&tag=[tag]'],
85
- list_ipv4: [:get, '/v1/server/list_ipv4?api_key=[api_key]&SUBID=[SUBID]'],
86
- list_ipv6: [:get, '/v1/server/list_ipv6?api_key=[api_key]&SUBID=[SUBID]'],
87
- neighbors: [:get, '/v1/server/neighbors?api_key=[api_key]&SUBID=[SUBID]'],
88
- os_change: [:post, '/v1/server/os_change?api_key=[api_key]', ['SUBID', 'OSID']],
89
- os_change_list: [:get, '/v1/server/os_change_list?api_key=[api_key]&SUBID=[SUBID]'],
90
- reboot: [:post, '/v1/server/reboot?api_key=[api_key]', ['SUBID']],
91
- reinstall: [:post, '/v1/server/reinstall?api_key=[api_key]', ['SUBID', 'hostname']],
92
- restore_backup: [:post, '/v1/server/restore_backup?api_key=[api_key]', ['SUBID', 'BACKUPID']],
93
- restore_snapshot: [:post, '/v1/server/restore_snapshot?api_key=[api_key]', ['SUBID', 'SNAPSHOTID']],
94
- reverse_default_ipv4: [:post, '/v1/server/reverse_default_ipv4?api_key=[api_key]', ['SUBID', 'ip']],
95
- reverse_delete_ipv6: [:post, '/v1/server/reverse_delete_ipv6?api_key=[api_key]', ['SUBID', 'ip']],
96
- reverse_list_ipv6: [:get, '/v1/server/reverse_list_ipv6?api_key=[api_key]&SUBID=[SUBID]'],
97
- reverse_set_ipv4: [:post, '/v1/server/reverse_set_ipv4?api_key=[api_key]', ['SUBID', 'ip', 'entry']],
98
- reverse_set_ipv6: [:post, '/v1/server/reverse_set_ipv6?api_key=[api_key]', ['SUBID', 'ip', 'entry']],
99
- set_user_data: [:post, '/v1/server/set_user_data?api_key=[api_key]', ['SUBID', 'userdata']],
100
- start: [:post, '/v1/server/start?api_key=[api_key]', ['SUBID']],
101
- upgrade_plan: [:post, '/v1/server/upgrade_plan?api_key=[api_key]', ['SUBID', 'VPSPLANID']],
102
- upgrade_plan_list: [:get, '/v1/server/upgrade_plan_list?api_key=[api_key]&SUBID=[SUBID]']
103
- },
104
- Snapshot: {
105
- destroy: [:post, '/v1/snapshot/destroy?api_key=[api_key]', ['SNAPSHOTID']],
106
- create: [:post, '/v1/snapshot/create?api_key=[api_key]', ['SUBID']],
107
- list: [:get, '/v1/snapshot/list?api_key=[api_key]']
108
- },
109
- SSHKey: {
110
- create: [:post, '/v1/sshkey/create?api_key=[api_key]', ['name', 'ssh_key']],
111
- destroy: [:post, '/v1/sshkey/destroy?api_key=[api_key]', ['SSHKEYID']],
112
- list: [:get, '/v1/sshkey/list?api_key=[api_key]'],
113
- update: [:post, '/v1/sshkey/update?api_key=[api_key]', ['SSHKEYID', 'name', 'ssh_key']]
114
- },
115
- StartupScript: {
116
- create: [:post, '/v1/startupscript/create?api_key=[api_key]', ['name', 'script', 'type']],
117
- destroy: [:post, '/v1/startupscript/destroy?api_key=[api_key]', ['SCRIPTID']],
118
- list: [:get, '/v1/startupscript/list?api_key=[api_key]'],
119
- update: [:post, '/v1/startupscript/update?api_key=[api_key]', ['SCRIPTID', 'name', 'script']]
120
- },
121
- User: {
122
- create: [:post, '/v1/user/create?api_key=[api_key]', ['email', 'name', 'password', 'api_enabled', 'acls']],
123
- delete: [:post, '/v1/user/delete?api_key=[api_key]', ['USERID']],
124
- list: [:get, '/v1/user/list?api_key=[api_key]'],
125
- update: [:post, '/v1/user/update?api_key=[api_key]', ['USERID', 'email', 'name', 'password', 'api_enabled', 'acls']]
126
- }
127
- }
128
-
129
- DEFINITIONS.each do |resource|
130
- resource_name = resource[0]
7
+ DEFINITIONS = {
8
+ # Account
9
+ Account: {
10
+ info: {
11
+ :method => :get,
12
+ :path => '/v1/account/info',
13
+ :apikey_required => true
14
+ }
15
+ },
16
+ # Application
17
+ App: {
18
+ list: {
19
+ :method => :get,
20
+ :path => '/v1/app/list',
21
+ :apikey_required => false
22
+ }
23
+ },
24
+ # API Key
25
+ Auth: {
26
+ info: {
27
+ :method => :get,
28
+ :path => '/v1/auth/info',
29
+ :apikey_required => true
30
+ }
31
+ },
32
+ # Backup
33
+ Backup: {
34
+ list: {
35
+ :method => :get,
36
+ :path => '/v1/backup/list',
37
+ :params => %w(SUBID BACKUPID),
38
+ :apikey_required => true
39
+ }
40
+ },
41
+ # Bare Metal
42
+ BareMetal: {
43
+ app_change: {
44
+ :method => :post,
45
+ :path => '/v1/baremetal/app_change',
46
+ :params => %w(SUBID APPID),
47
+ :apikey_required => true
48
+ },
49
+ app_change_list: {
50
+ :method => :get,
51
+ :path => '/v1/baremetal/app_change_list',
52
+ :params => %w(SUBID),
53
+ :apikey_required => true
54
+ },
55
+ bandwidth: {
56
+ :method => :get,
57
+ :path => '/v1/baremetal/bandwidth',
58
+ :apikey_required => true
59
+ },
60
+ create: {
61
+ :method => :post,
62
+ :path => '/v1/baremetal/create',
63
+ :params => %w(DCID METALPLANID OSID SCRIPTID SNAPSHOTID enable_ipv6 label SSHKEYID APPID userdata notify_activate hostname tag),
64
+ :apikey_required => true
65
+ },
66
+ destroy: {
67
+ :method => :post,
68
+ :path => '/v1/baremetal/destroy',
69
+ :params => %w(SUBID),
70
+ :apikey_required => true
71
+ },
72
+ get_app_info: {
73
+ :method => :get,
74
+ :path => '/v1/baremetal/get_app_info',
75
+ :params => %w(SUBID),
76
+ :apikey_required => true
77
+ },
78
+ get_user_data: {
79
+ :method => :get,
80
+ :path => '/v1/baremetal/get_user_data',
81
+ :params => %w(SUBID),
82
+ :apikey_required => true
83
+ },
84
+ halt: {
85
+ :method => :post,
86
+ :path => '/v1/baremetal/halt',
87
+ :params => %w(SUBID),
88
+ :apikey_required => true
89
+ },
90
+ ipv6_enable: {
91
+ :method => :post,
92
+ :path => '/v1/baremetal/ipv6_enable',
93
+ :params => %w(SUBID),
94
+ :apikey_required => true
95
+ },
96
+ label_set: {
97
+ :method => :post,
98
+ :path => '/v1/baremetal/label_set',
99
+ :params => %w(SUBID label),
100
+ :apikey_required => true
101
+ },
102
+ list: {
103
+ :method => :get,
104
+ :path => '/v1/baremetal/list',
105
+ :params => %w(SUBID tag label main_ip),
106
+ :apikey_required => true
107
+ },
108
+ list_ipv4: {
109
+ :method => :get,
110
+ :path => '/v1/baremetal/list_ipv4',
111
+ :params => %w(SUBID),
112
+ :apikey_required => true
113
+ },
114
+ list_ipv6: {
115
+ :method => :get,
116
+ :path => '/v1/baremetal/list_ipv6',
117
+ :params => %w(SUBID),
118
+ :apikey_required => true
119
+ },
120
+ os_change: {
121
+ :method => :post,
122
+ :path => '/v1/baremetal/os_change',
123
+ :params => %w(SUBID OSID),
124
+ :apikey_required => true
125
+ },
126
+ os_change_list: {
127
+ :method => :get,
128
+ :path => '/v1/baremetal/os_change_list',
129
+ :params => %w(SUBID),
130
+ :apikey_required => true
131
+ },
132
+ reboot: {
133
+ :method => :post,
134
+ :path => '/v1/baremetal/reboot',
135
+ :params => %w(SUBID),
136
+ :apikey_required => true
137
+ },
138
+ reinstall: {
139
+ :method => :post,
140
+ :path => '/v1/baremetal/reinstall',
141
+ :params => %w(SUBID),
142
+ :apikey_required => true
143
+ },
144
+ set_user_data: {
145
+ :method => :post,
146
+ :path => '/v1/baremetal/set_user_data',
147
+ :params => %w(SUBID userdata),
148
+ :apikey_required => true
149
+ },
150
+ tag_set: {
151
+ :method => :post,
152
+ :path => '/v1/baremetal/tag_set',
153
+ :params => %w(SUBID tag),
154
+ :apikey_required => true
155
+ }
156
+ },
157
+ # Block Storage
158
+ Block: {
159
+ attach: {
160
+ :method => :post,
161
+ :path => '/v1/block/attach?api_key=[api_key]',
162
+ :params => %w(SUBID attach_to_SUBID),
163
+ :apikey_required => true
164
+ },
165
+ create: {
166
+ :method => :post,
167
+ :path => '/v1/block/create',
168
+ :params => %w(DCID size_gb label),
169
+ :apikey_required => true
170
+ },
171
+ delete: {
172
+ :method => :post,
173
+ :path => '/v1/block/delete',
174
+ :params => %w(SUBID),
175
+ :apikey_required => true
176
+ },
177
+ detach: {
178
+ :method => :post,
179
+ :path => '/v1/block/detach',
180
+ :params => %w(SUBID),
181
+ :apikey_required => true
182
+ },
183
+ label_set: {
184
+ :method => :post,
185
+ :path => '/v1/block/label_set',
186
+ :params => %w(SUBID label),
187
+ :apikey_required => true
188
+ },
189
+ list: {
190
+ :method => :get,
191
+ :path => '/v1/block/list',
192
+ :params => %w(SUBID),
193
+ :apikey_required => true
194
+ },
195
+ resize: {
196
+ :method => :post,
197
+ :path => '/v1/block/resize',
198
+ :params => %w(SUBID size_gb),
199
+ :apikey_required => true
200
+ }
201
+ },
202
+ # DNS
203
+ DNS: {
204
+ create_domain: {
205
+ :method => :post,
206
+ :path => '/v1/dns/create_domain',
207
+ :params => %w(domain serverip),
208
+ :apikey_required => true
209
+ },
210
+ create_record: {
211
+ :method => :post,
212
+ :path => '/v1/dns/create_record',
213
+ :params => %w(domain name type data ttl priority),
214
+ :apikey_required => true
215
+ },
216
+ delete_domain: {
217
+ :method => :post,
218
+ :path => '/v1/dns/delete_domain',
219
+ :params => %w(domain),
220
+ :apikey_required => true
221
+ },
222
+ delete_record: {
223
+ :method => :post,
224
+ :path => '/v1/dns/delete_record',
225
+ :params => %w(domain RECORDID),
226
+ :apikey_required => true
227
+ },
228
+ dnssec_enable: {
229
+ :method => :post,
230
+ :path => '/v1/dns/dnssec_enable',
231
+ :params => %w(domain enable),
232
+ :apikey_required => true
233
+ },
234
+ dnssec_info: {
235
+ :method => :post,
236
+ :path => '/v1/dns/dnssec_info',
237
+ :params => %w(domain),
238
+ :apikey_required => true
239
+ },
240
+ list: {
241
+ :method => :get,
242
+ :path => '/v1/dns/list',
243
+ :apikey_required => true
244
+ },
245
+ records: {
246
+ :method => :get,
247
+ :path => '/v1/dns/records',
248
+ :params => %w(domain),
249
+ :apikey_required => true
250
+ },
251
+ soa_info: {
252
+ :method => :get,
253
+ :path => '/v1/dns/records',
254
+ :params => %w(domain),
255
+ :apikey_required => true
256
+ },
257
+ soa_update: {
258
+ :method => :get,
259
+ :path => '/v1/dns/records',
260
+ :params => %w(domain),
261
+ :apikey_required => true
262
+ },
263
+ update_record: {
264
+ :method => :post,
265
+ :path => '/v1/dns/update_record',
266
+ :params => %w(domain RECORDID name type data ttl priority),
267
+ :apikey_required => true
268
+ }
269
+ },
270
+ # Firewall
271
+ Firewall: {
272
+ group_create: {
273
+ :method => :post,
274
+ :path => '/v1/firewall/group_create',
275
+ :params => %w(description),
276
+ :apikey_required => true
277
+ },
278
+ group_delete: {
279
+ :method => :post,
280
+ :path => '/v1/firewall/group_delete',
281
+ :params => %w(FIREWALLGROUPID),
282
+ :apikey_required => true
283
+ },
284
+ group_list: {
285
+ :method => :get,
286
+ :path => '/v1/firewall/group_list',
287
+ :params => %w(FIREWALLGROUPID),
288
+ :apikey_required => true
289
+ },
290
+ group_set_description: {
291
+ :method => :post,
292
+ :path => '/v1/firewall/group_set_description',
293
+ :params => %w(FIREWALLGROUPID description),
294
+ :apikey_required => true
295
+ },
296
+ rule_create: {
297
+ :method => :post,
298
+ :path => '/v1/firewall/rule_create',
299
+ :params => %w(FIREWALLGROUPID direction ip_type protocol subnet subnet_size port notes),
300
+ :apikey_required => true
301
+ },
302
+ rule_delete: {
303
+ :method => :post,
304
+ :path => '/v1/firewall/rule_delete',
305
+ :params => %w(FIREWALLGROUPID rulenumber),
306
+ :apikey_required => true
307
+ },
308
+ rule_list: {
309
+ :method => :get,
310
+ :path => '/v1/firewall/rule_list',
311
+ :params => %w(FIREWALLGROUPID direction ip_type),
312
+ :apikey_required => true
313
+ }
314
+ },
315
+ # ISO Image
316
+ ISO: {
317
+ create_from_url: {
318
+ :method => :post,
319
+ :path => '/v1/iso/create_from_url',
320
+ :params => %w(url),
321
+ :apikey_required => true
322
+ },
323
+ list: {
324
+ :method => :get,
325
+ :path => '/v1/iso/list',
326
+ :apikey_required => true
327
+ },
328
+ list_public: {
329
+ :method => :get,
330
+ :path => '/v1/iso/list_public',
331
+ :apikey_required => true
332
+ }
333
+ },
334
+ # Network
335
+ Network: {
336
+ create: {
337
+ :method => :post,
338
+ :path => '/v1/network/create',
339
+ :params => %w(DCID description v4_subnet v4_subnet_mask),
340
+ :apikey_required => true
341
+ },
342
+ destroy: {
343
+ :method => :post,
344
+ :path => '/v1/network/destroy',
345
+ :params => %w(NETWORKID),
346
+ :apikey_required => true
347
+ },
348
+ list: {
349
+ :method => :get,
350
+ :path => '/v1/network/list',
351
+ :apikey_required => true
352
+ }
353
+ },
354
+ # Operating System
355
+ OS: {
356
+ list: {
357
+ :method => :get,
358
+ :path => '/v1/os/list',
359
+ :auth_required => false
360
+ }
361
+ },
362
+ # Plans
363
+ Plans: {
364
+ list: {
365
+ :method => :get,
366
+ :path => '/v1/plans/list',
367
+ :params => %w(type),
368
+ :auth_required => true
369
+ },
370
+ list_baremetal: {
371
+ :method => :get,
372
+ :path => '/v1/plans/list_baremetal',
373
+ :auth_required => true
374
+ },
375
+ list_vc2: {
376
+ :method => :get,
377
+ :path => '/v1/plans/list_vc2',
378
+ :apikey_required => false
379
+ },
380
+ list_vdc2: {
381
+ :method => :get,
382
+ :path => '/v1/plans/list_vdc2',
383
+ :apikey_required => false
384
+ }
385
+ },
386
+ # Regions
387
+ Regions: {
388
+ availability: {
389
+ :method => :get,
390
+ :path => '/v1/regions/availability',
391
+ :params => %w(DCID type),
392
+ :apikey_required => false
393
+ },
394
+ availability_baremetal: {
395
+ :method => :get,
396
+ :path => '/v1/regions/availability_baremetal',
397
+ :params => %w(DCID),
398
+ :apikey_required => true
399
+ },
400
+ availability_vc2: {
401
+ :method => :get,
402
+ :path => '/v1/regions/availability_vc2',
403
+ :params => %w(DCID),
404
+ :apikey_required => false
405
+ },
406
+ availability_vdc2: {
407
+ :method => :get,
408
+ :path => '/v1/regions/availability_vdc2',
409
+ :params => %w(DCID),
410
+ :apikey_required => false
411
+ },
412
+ list: {
413
+ :method => :get,
414
+ :path => '/v1/regions/list',
415
+ :params => %w(availability),
416
+ :apikey_required => false
417
+ }
418
+ },
419
+ # Reserved IP
420
+ ReservedIP: {
421
+ attach: {
422
+ :method => :post,
423
+ :path => '/v1/reservedip/attach',
424
+ :params => %w(ip_address attach_SUBID),
425
+ :apikey_required => true
426
+ },
427
+ convert: {
428
+ :method => :post,
429
+ :path => '/v1/reservedip/convert',
430
+ :params => %w(SUBID ip_address label),
431
+ :apikey_required => true
432
+ },
433
+ create: {
434
+ :method => :post,
435
+ :path => '/v1/reservedip/create',
436
+ :params => %w(DCID ip_type label),
437
+ :apikey_required => true
438
+ },
439
+ destroy: {
440
+ :method => :post,
441
+ :path => '/v1/reservedip/destroy',
442
+ :params => %w(ip_address),
443
+ :apikey_required => true
444
+ },
445
+ detach: {
446
+ :method => :post,
447
+ :path => '/v1/reservedip/detach',
448
+ :params => %w(ip_address detach_SUBID),
449
+ :apikey_required => true
450
+ },
451
+ list: {
452
+ :method => :get,
453
+ :path => '/v1/reservedip/list',
454
+ :apikey_required => true
455
+ }
456
+ },
457
+ # Server
458
+ Server: {
459
+ app_change: {
460
+ :method => :post,
461
+ :path => '/v1/server/app_change',
462
+ :params => %w(SUBID APPID),
463
+ :auth_required => true
464
+ },
465
+ app_change_list: {
466
+ :method => :get,
467
+ :path => '/v1/server/app_change_list',
468
+ :params => ['SUBID'],
469
+ :auth_required => true
470
+ },
471
+ backup_disable: {
472
+ :method => :post,
473
+ :path => '/v1/server/backup_disable',
474
+ :params => %w(SUBID),
475
+ :auth_required => true
476
+ },
477
+ backup_enable: {
478
+ :method => :post,
479
+ :path => '/v1/server/backup_enable',
480
+ :params => %w(SUBID),
481
+ :auth_required => true
482
+ },
483
+ backup_get_schedule: {
484
+ :method => :post,
485
+ :path => '/v1/server/backup_get_schedule',
486
+ :params => %w(SUBID),
487
+ :auth_required => true
488
+ },
489
+ backup_set_schedule: {
490
+ :method => :post,
491
+ :path => '/v1/server/backup_set_schedule',
492
+ :params => %w(SUBID cron_type hour dow dom),
493
+ :auth_required => true
494
+ },
495
+ bandwidth: {
496
+ :method => :get,
497
+ :path => '/v1/server/bandwidth',
498
+ :params => %w(SUBID),
499
+ :auth_required => true
500
+ },
501
+ create: {
502
+ :method => :post,
503
+ :path => '/v1/server/create',
504
+ :params => %w(DCID VPSPLANID OSID ipxe_chain_url ISOID SCRIPTID SNAPSHOTID enable_ipv6 enable_private_network NETWORKID label SSHKEYID auto_backups APPID userdata notify_activate ddos_protection reserved_ip_v4 hostname tag FIREWALLGROUPID),
505
+ :auth_required => true
506
+ },
507
+ create_ipv4: {
508
+ :method => :post,
509
+ :path => '/v1/server/create_ipv4',
510
+ :params => %w(SUBID reboot),
511
+ :auth_required => true
512
+ },
513
+ destroy: {
514
+ :method => :post,
515
+ :path => '/v1/server/destroy',
516
+ :params => %w(SUBID),
517
+ :apikey_required => true
518
+ },
519
+ destroy_ipv4: {
520
+ :method => :post,
521
+ :path => '/v1/server/destroy_ipv4',
522
+ :params => %w(SUBID ip),
523
+ :apikey_required => true
524
+ },
525
+ firewall_group_set: {
526
+ :method => :post,
527
+ :path => '/v1/server/firewall_group_set',
528
+ :params => %w(SUBID FIREWALLGROUPID),
529
+ :apikey_required => true
530
+ },
531
+ get_app_info: {
532
+ :method => :get,
533
+ :path => '/v1/server/get_app_info',
534
+ :params => %w(SUBID),
535
+ :apikey_required => true
536
+ },
537
+ get_user_data: {
538
+ :method => :get,
539
+ :path => '/v1/server/set_user_data',
540
+ :params => %w(SUBID),
541
+ :apikey_required => true
542
+ },
543
+ halt: {
544
+ :method => :post,
545
+ :path => '/v1/server/halt',
546
+ :params => %w('SUBID'),
547
+ :apikey_required => true
548
+ },
549
+ ipv6_enable: {
550
+ :method => :post,
551
+ :path => '/v1/server/ipv6_enable',
552
+ :params => %w(SUBID),
553
+ :apikey_required => true
554
+ },
555
+ iso_attach: {
556
+ :method => :post,
557
+ :path => '/v1/server/iso_detach',
558
+ :params => %w(SUBID, ISOID),
559
+ :apikey_required => true
560
+ },
561
+ iso_detach: {
562
+ :method => :post,
563
+ :path => '/v1/server/iso_detach',
564
+ :params => %w(SUBID),
565
+ :apikey_required => true
566
+ },
567
+ iso_status: {
568
+ :method => :get,
569
+ :path => '/v1/server/iso_status',
570
+ :params => %w(SUBID),
571
+ :apikey_required => true
572
+ },
573
+ label_set: {
574
+ :method => :post,
575
+ :path => '/v1/server/label_set',
576
+ :params => %w(SUBID label),
577
+ :apikey_required => true
578
+ },
579
+ list: {
580
+ :method => :get,
581
+ :path => '/v1/server/list',
582
+ :params => %w(SUBID tag label main_ip),
583
+ :apikey_required => true
584
+ },
585
+ list_ipv4: {
586
+ :method => :get,
587
+ :path => '/v1/server/list_ipv4',
588
+ :params => %w(SUBID),
589
+ :apikey_required => true
590
+ },
591
+ list_ipv6: {
592
+ :method => :get,
593
+ :path => '/v1/server/list_ipv6',
594
+ :params => %w(SUBID),
595
+ :apikey_required => true
596
+ },
597
+ neighbors: {
598
+ :method => :get,
599
+ :path => '/v1/server/neighbors',
600
+ :params => %w(SUBID),
601
+ :apikey_required => true
602
+ },
603
+ os_change: {
604
+ :method => :post,
605
+ :path => '/v1/server/os_change',
606
+ :params => %w(SUBID OSID),
607
+ :apikey_required => true
608
+ },
609
+ os_change_list: {
610
+ :method => :get,
611
+ :path => '/v1/server/os_change_list',
612
+ :params => %w(SUBID),
613
+ :apikey_required => true
614
+ },
615
+ private_network_disable: {
616
+ :method => :post,
617
+ :path => '/v1/server/private_network_disable',
618
+ :params => %w(SUBID NETWORKID),
619
+ :apikey_required => true
620
+ },
621
+ private_network_enable: {
622
+ :method => :post,
623
+ :path => '/v1/server/private_network_enable',
624
+ :params => %w(SUBID NETWORKID),
625
+ :apikey_required => true
626
+ },
627
+ private_networks: {
628
+ :method => :get,
629
+ :path => '/v1/server/private_networks',
630
+ :params => %w(SUBID),
631
+ :apikey_required => true
632
+ },
633
+ reboot: {
634
+ :method => :post,
635
+ :path => '/v1/server/reboot' 'SUBID',
636
+ :params => %w(SUBID),
637
+ :apikey_required => true
638
+ },
639
+ reinstall: {
640
+ :method => :post,
641
+ :path => '/v1/server/reinstall',
642
+ :params => %w(SUBID hostname),
643
+ :apikey_required => true
644
+ },
645
+ restore_backup: {
646
+ :method => :post,
647
+ :path => '/v1/server/restore_backup',
648
+ :params => %w(SUBID BACKUPID),
649
+ :apikey_required => true
650
+ },
651
+ restore_snapshot: {
652
+ :method => :post,
653
+ :path => '/v1/server/restore_snapshot',
654
+ :params => %w(SUBID SNAPSHOTID),
655
+ :apikey_required => true
656
+ },
657
+ reverse_default_ipv4: {
658
+ :method => :post,
659
+ :path => '/v1/server/reverse_default_ipv4',
660
+ :params => %w(SUBID ip),
661
+ :apikey_required => true
662
+ },
663
+ reverse_delete_ipv6: {
664
+ :method => :post,
665
+ :path => '/v1/server/reverse_delete_ipv6',
666
+ :params => %w(SUBID ip),
667
+ :apikey_required => true
668
+ },
669
+ reverse_list_ipv6: {
670
+ :method => :get,
671
+ :path => '/v1/server/reverse_list_ipv6',
672
+ :params => %w(SUBID),
673
+ :apikey_required => true
674
+ },
675
+ reverse_set_ipv4: {
676
+ :method => :post,
677
+ :path => '/v1/server/reverse_set_ipv4',
678
+ :params => %w(SUBID ip entry),
679
+ :apikey_required => true
680
+ },
681
+ reverse_set_ipv6: {
682
+ :method => :post,
683
+ :path => '/v1/server/reverse_set_ipv6',
684
+ :params => %w(SUBID ip entry),
685
+ :apikey_required => true
686
+ },
687
+ set_user_data: {
688
+ :method => :post,
689
+ :path => '/v1/server/set_user_data',
690
+ :params => %w(SUBID userdata),
691
+ :apikey_required => true
692
+ },
693
+ start: {
694
+ :method => :post,
695
+ :path => '/v1/server/start',
696
+ :params => %w(SUBID),
697
+ :apikey_required => true
698
+ },
699
+ tag_set: {
700
+ :method => :post,
701
+ :path => '/v1/server/tag_set',
702
+ :params => %w(SUBID tag),
703
+ :apikey_required => true
704
+ },
705
+ upgrade_plan: {
706
+ :method => :post,
707
+ :path => '/v1/server/upgrade_plan',
708
+ :params => %w(SUBID VPSPLANID),
709
+ :apikey_required => true
710
+ },
711
+ upgrade_plan_list: {
712
+ :method => :get,
713
+ :path => '/v1/server/upgrade_plan_list',
714
+ :params => %w(SUBID),
715
+ :apikey_required => true
716
+ }
717
+ },
718
+ # Snapshot
719
+ Snapshot: {
720
+ create: {
721
+ :method => :post,
722
+ :path => '/v1/snapshot/create',
723
+ :params => %w(SUBID),
724
+ :apikey_required => true
725
+ },
726
+ destroy: {
727
+ :method => :post,
728
+ :path => '/v1/snapshot/destroy',
729
+ :params => %w(SNAPSHOTID),
730
+ :apikey_required => true
731
+ },
732
+ list: {
733
+ :method => :get,
734
+ :path => '/v1/snapshot/list',
735
+ :apikey_required => true
736
+ }
737
+ },
738
+ # SSH Key
739
+ SSHKey: {
740
+ create: {
741
+ :method => :post,
742
+ :path => '/v1/sshkey/create',
743
+ :params => %w(name ssh_key),
744
+ :apikey_required => true
745
+ },
746
+ destroy: {
747
+ :method => :post,
748
+ :path => '/v1/sshkey/destroy',
749
+ :params => %w(SSHKEYID),
750
+ :apikey_required => true
751
+ },
752
+ list: {
753
+ :method => :get,
754
+ :path => '/v1/sshkey/list',
755
+ :apikey_required => true
756
+ },
757
+ update: {
758
+ :method => :post,
759
+ :path => '/v1/sshkey/update',
760
+ :params => %w(SSHKEYID name ssh_key)
761
+ }
762
+ },
763
+ # Startup Script
764
+ StartupScript: {
765
+ create: {
766
+ :method => :post,
767
+ :path => '/v1/startupscript/create',
768
+ :params => %w(name script type),
769
+ :apikey_required => true
770
+ },
771
+ destroy: {
772
+ :method => :post,
773
+ :path => '/v1/startupscript/destroy',
774
+ :params => %w(SCRIPTID),
775
+ :apikey_required => true
776
+ },
777
+ list: {
778
+ :method => :get,
779
+ :path => '/v1/startupscript/list',
780
+ :apikey_required => true
781
+ },
782
+ update: {
783
+ :method => :post,
784
+ :path => '/v1/startupscript/update',
785
+ :params => %w(SCRIPTID name script),
786
+ :apikey_required => true
787
+ }
788
+ },
789
+ # User Management
790
+ User: {
791
+ create: {
792
+ :method => :post,
793
+ :path => '/v1/user/create',
794
+ :params => %w(email name password api_enabled acls),
795
+ :apikey_required => true
796
+ },
797
+ delete: {
798
+ :method => :post,
799
+ :path => '/v1/user/delete',
800
+ :params => %w(USERID),
801
+ :apikey_required => true
802
+ },
803
+ list: {
804
+ :method => :get,
805
+ :path => '/v1/user/list',
806
+ :apikey_required => true
807
+ },
808
+ update: {
809
+ :method => :post,
810
+ :path => '/v1/user/update',
811
+ :params => %w(USERID email name password api_enabled acls),
812
+ :apikey_required => true
813
+ }
814
+ }
815
+ }
131
816
 
132
- resource_class = Class.new(Object) do
133
- DEFINITIONS[resource_name].each do |action, array|
134
- method_name = array[0]
135
- path, query = array[1].split('?')
136
- params = array[2]
817
+ DEFINITIONS.each do |resource_name, actions|
818
+ resource_class = Class.new(Object) do
819
+ actions.each do |action, config|
820
+ method = config.fetch(:method)
821
+ path = config.fetch(:path)
822
+ params = config.fetch(:params, nil)
823
+ apikey_required = config.fetch(:apikey_required, false)
137
824
 
138
- define_singleton_method "_#{action}" do |*args|
139
- query_for_method = Vultr.process_query_args_from_path(query, args)
140
- url = [Vultr.api_endpoint, path].join('')
825
+ define_singleton_method action do |*args|
826
+ headers = apikey_required ? {'API-Key': Vultr::APIKey} : {}
827
+ body = nil
828
+ if method == :get
829
+ extra_params = Hash.new
830
+ hash = args[-1]
831
+ if hash.is_a?(Hash)
832
+ hash.each do |key, value|
833
+ extra_params[key] = value if params.include? key.to_s
834
+ end
835
+ end
836
+ url = Vultr.request.build_url(path, extra_params)
837
+ elsif method == :post
838
+ body = Hash.new
839
+ hash = args[-1]
840
+ if hash.is_a?(Hash)
841
+ hash.each do |key, value|
842
+ body[key] = value if params.include? key.to_s
843
+ end
844
+ end
845
+ url = Vultr.request.build_url(path)
846
+ end
141
847
 
142
- if query_for_method.nil?
143
- url
144
- else
145
- [url, query_for_method].join('?')
146
- end
848
+ resp = Vultr.request.run_request(method, url, body, headers)
849
+ {status: resp.status, result: resp.body}
850
+ end
851
+ end
147
852
  end
148
853
 
149
- define_singleton_method action do |*args|
150
- post_for_method = Vultr.process_params_args_from_keys(params, args)
151
- Vultr.request_and_respond(method_name, send("_#{action}", *args), post_for_method)
152
- end
153
- end
154
- end
155
-
156
- Vultr.const_set(resource_name, resource_class)
157
- end
158
-
159
- def request=(request)
160
- @request = request
161
- end
162
-
163
- def request
164
- @request
165
- end
166
-
167
- def api_key=(api_key)
168
- @api_key = api_key
169
- setup_request!
170
-
171
- @api_key
172
- end
173
-
174
- def api_key
175
- return @api_key if @api_key
176
- 'api_key_required'
177
- end
178
-
179
- def api_endpoint
180
- 'https://api.vultr.com'
181
- end
182
-
183
- def request_and_respond(method_name, url, body = nil)
184
- if body.nil?
185
- resp = Vultr.request.send method_name, url
186
- else
187
- resp = Vultr.request.send method_name, url, body
854
+ Vultr.const_set(resource_name, resource_class)
188
855
  end
189
- {status: resp.status, result: resp.body}
190
- end
191
-
192
- def process_api_key(parts)
193
- api_key_index = parts.index 'api_key=[api_key]'
194
- parts[api_key_index].sub!(/\[api_key\]/, api_key) if api_key_index
195
-
196
- parts
197
- end
198
-
199
- def process_query_args_from_path(query, args)
200
- return if query.nil?
201
856
 
202
- parts = query.split('&')
203
- parts = process_api_key(parts)
204
-
205
- hash = args[-1]
206
- if hash.is_a?(Hash)
207
- hash.each do |key, value|
208
- query_arg_index = parts.index "#{key}=[#{key}]"
209
- parts[query_arg_index].sub!(/\[.*\]/, value.to_s) if query_arg_index
210
- end
857
+ def request=(request)
858
+ @request = request
211
859
  end
212
860
 
213
- parts.delete_if do |x|
214
- x =~ /=\[.*\]/
861
+ def request
862
+ @request
215
863
  end
216
- parts.join('&')
217
- end
218
864
 
219
- def process_params_args_from_keys(params, args)
220
- return if params.nil?
865
+ def api_key=(api_key)
866
+ Vultr.const_set('APIKey', api_key)
867
+ setup_request!
221
868
 
222
- body = Hash.new
223
- hash = args[-1]
224
- if hash.is_a?(Hash)
225
- hash.each do |key, value|
226
- body[key] = value if params.include? key.to_s
227
- end
869
+ Vultr::APIKey
228
870
  end
229
871
 
230
- body unless body.empty?
231
- end
872
+ def api_key
873
+ return Vultr::APIKey if Vultr::APIKey
874
+ 'API Key is required'
875
+ end
232
876
 
233
- private
877
+ private
234
878
 
235
- def setup_request!
236
- options = {
237
- headers: {:Accept => 'application/json'}
238
- }
239
-
240
- Vultr.request = Faraday.new(options) do |faraday|
241
- faraday.request :url_encoded
242
- faraday.response :json, :content_type => 'application/json'
243
- faraday.response :follow_redirects
244
- faraday.adapter Faraday.default_adapter
879
+ def setup_request!
880
+ Vultr.request = Faraday.new do |faraday|
881
+ faraday.url_prefix = 'https://api.vultr.com'
882
+ faraday.request :url_encoded
883
+ faraday.response :json, :content_type => 'application/json'
884
+ faraday.adapter :net_http
885
+ end
245
886
  end
246
- end
247
887
  end