vultr 0.3.5 → 0.4.1

Sign up to get free protection for your applications and to get access to all the features.
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