vultrlife 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: a9836c0639934c0c3ba8c8f3d7868448f9407c3d
4
+ data.tar.gz: 39a9e88d238d3c792bf4f54885f947e775c76aa5
5
+ SHA512:
6
+ metadata.gz: 0763d20b670f0fe219ddffd785c65cbeb20b7e9e826f54e2744cf500457d5e57c05ddfe5e7234571c240c713d33beb399142ff5ed23c4b53a37361d3d6b122c2
7
+ data.tar.gz: 0a3acbffedf9558a8578c4259275b970e1f72726d2732872085482fa8632b3b6786e2fbebfb210d60da4109a47e39a3df4a3af9dd886da7b1ced43239cd619ed
data/.gitignore ADDED
@@ -0,0 +1,3 @@
1
+ vendor/bundle
2
+ .bundle/
3
+ pkg/
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ -fn
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 2.1.2
data/.travis.yml ADDED
@@ -0,0 +1,6 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.1.2
4
+ - 2.1.0
5
+ - 2.0.0
6
+ - 1.9.3
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,43 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ vultrlife (0.0.2)
5
+
6
+ GEM
7
+ remote: https://rubygems.org/
8
+ specs:
9
+ addressable (2.3.6)
10
+ coderay (1.1.0)
11
+ crack (0.4.2)
12
+ safe_yaml (~> 1.0.0)
13
+ diff-lcs (1.2.5)
14
+ method_source (0.8.2)
15
+ pry (0.9.12.6)
16
+ coderay (~> 1.0)
17
+ method_source (~> 0.8)
18
+ slop (~> 3.4)
19
+ rake (10.1.0)
20
+ rspec (2.14.1)
21
+ rspec-core (~> 2.14.0)
22
+ rspec-expectations (~> 2.14.0)
23
+ rspec-mocks (~> 2.14.0)
24
+ rspec-core (2.14.8)
25
+ rspec-expectations (2.14.5)
26
+ diff-lcs (>= 1.1.3, < 2.0)
27
+ rspec-mocks (2.14.6)
28
+ safe_yaml (1.0.3)
29
+ slop (3.5.0)
30
+ webmock (1.18.0)
31
+ addressable (>= 2.3.6)
32
+ crack (>= 0.3.2)
33
+
34
+ PLATFORMS
35
+ ruby
36
+
37
+ DEPENDENCIES
38
+ bundler (~> 1.5)
39
+ pry
40
+ rake
41
+ rspec
42
+ vultrlife!
43
+ webmock
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2014 Tsuyoshi Hoshino
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
6
+ this software and associated documentation files (the "Software"), to deal in
7
+ the Software without restriction, including without limitation the rights to
8
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
9
+ the Software, and to permit persons to whom the Software is furnished to do so,
10
+ subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
17
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
18
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
19
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
20
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,121 @@
1
+ # Vultrlife
2
+
3
+ Vultr VPS API wrapper
4
+
5
+ ![travis-batch](https://travis-ci.org/hoshinotsuyoshi/vultrlife.svg?branch=master)
6
+
7
+ ## Installation
8
+
9
+ Add this line to your application's Gemfile:
10
+
11
+ gem 'vultrlife'
12
+
13
+ And then execute:
14
+
15
+ $ bundle
16
+
17
+ Or install it yourself as:
18
+
19
+ $ gem install vultrlife
20
+
21
+ ## Usage
22
+
23
+ ### Create/Destroy Server
24
+
25
+ ```
26
+ require 'vultrlife'
27
+
28
+ # Create Your Account Object
29
+ account = Vultrlife::Account.new do |account|
30
+ account.api_key = 'xxxxxxxxxxxxxxxxxxx'
31
+ end
32
+
33
+ # Check Your Servers
34
+ puts account.servers
35
+ # => [] (if you have no servers)
36
+
37
+ # Create A Server(CentOS)
38
+ account.server_create! do |server|
39
+ server.plan = '768 MB RAM,15 GB SSD,0.10 TB BW'
40
+ server.region = :tokyo
41
+ server.os = 'CentOS 6 x64'
42
+ end
43
+
44
+ # Check The Server
45
+ puts account.servers.last
46
+ # => {"os"=>"CentOS 6 x64",
47
+ # "ram"=>"768 MB",
48
+ # "disk"=>"Virtual 15 GB",
49
+ # "main_ip"=>"108.61.200.210",
50
+ # "default_password"=>"eqsaqenynelu!2",
51
+ # ...and more....
52
+
53
+ # Create A Server(CustomOS)
54
+ account.server_create! do |server|
55
+ server.plan = '768 MB RAM,15 GB SSD,0.10 TB BW, Custom ISO'
56
+ server.region = :tokyo
57
+ server.os = 'Custom'
58
+ server.ipxe_chain_url = 'http://......' #(optional)
59
+ end
60
+
61
+ # Check Your Servers
62
+ puts account.servers
63
+
64
+ # Destroy A Server
65
+ account.servers.first.destroy!
66
+ ```
67
+
68
+ ### List Plans/OSs/Regions/Plans_Regions_Availavility
69
+
70
+ ```
71
+ require 'vultrlife'
72
+
73
+ Vultrlife::Agent.plans_list
74
+ #Same as API: GET /v1/plans/list
75
+
76
+ Vultrlife::Agent.regions_list
77
+ #Same as API: GET /v1/regions/list
78
+
79
+ Vultrlife::Agent.os_list
80
+ #Same as API: GET /v1/os/list
81
+
82
+ Vultrlife::Agent.regions_availability(dcid)
83
+ #Same as API: GET /v1/regions/availability
84
+
85
+ ```
86
+
87
+ ## Support API
88
+ ```
89
+ #GET /v1/plans/list
90
+ Vultrlife::Agent.plans_list
91
+
92
+ #GET /v1/regions/list
93
+ Vultrlife::Agent.regions_list
94
+
95
+ #GET /v1/os/list
96
+ Vultrlife::Agent.os_list
97
+
98
+ #GET /v1/regions/availability
99
+ Vultrlife::Agent.regions_availability(dcid)
100
+
101
+ #GET /v1/server/list (needs api_key)
102
+ Vultrlife::Agent.server_list(api_key)
103
+
104
+ #POST /v1/server/create (needs api_key)
105
+ Vultrlife::Agent.server_create(body)
106
+
107
+ #POST /v1/server/destroy (needs api_key)
108
+ Vultrlife::Agent.server_destroy(body)
109
+
110
+ ```
111
+
112
+ ## Requirement
113
+ * MRI(>=1.9.3)
114
+
115
+ ## Contributing
116
+
117
+ 1. Fork it ( http://github.com/<my-github-username>/vultrlife/fork )
118
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
119
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
120
+ 4. Push to the branch (`git push origin my-new-feature`)
121
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
@@ -0,0 +1,23 @@
1
+ module Vultrlife
2
+ class Account
3
+ attr_reader :config
4
+ attr_accessor :api_key
5
+ def initialize(&b)
6
+ @api_key = ''
7
+ if block_given?
8
+ yield self
9
+ end
10
+ self
11
+ end
12
+
13
+ def servers
14
+ Server.show_servers(self)
15
+ end
16
+
17
+ def server_create!(&b)
18
+ config = Server::Configuration.new(self)
19
+ yield config
20
+ Server.create!(config)
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,105 @@
1
+ require 'json'
2
+ require 'net/https'
3
+
4
+ module Vultrlife
5
+ module Agent
6
+ API_HOST = 'https://api.vultr.com'
7
+
8
+ # GET
9
+
10
+ def self.http_get(endpoint, params={})
11
+ response = ''
12
+
13
+ uri = URI.parse("#{API_HOST}#{endpoint}")
14
+ https = Net::HTTP.new(uri.host, 443)
15
+ https.use_ssl = true
16
+ https.start{|https|
17
+ response = https.get(uri.path + '?'+ query(params))
18
+ }
19
+
20
+ if response.body.to_s.empty?
21
+ ''
22
+ else
23
+ JSON.parse(response.body)
24
+ end
25
+ end
26
+
27
+ def self.plans_list
28
+ #/v1/plans/list
29
+ #GET - public
30
+
31
+ self.http_get('/v1/plans/list')
32
+ end
33
+
34
+ def self.regions_list
35
+ #/v1/regions/list
36
+ #GET - public
37
+
38
+ self.http_get('/v1/regions/list')
39
+ end
40
+
41
+ def self.os_list
42
+ #/v1/os/list
43
+ #GET - public
44
+
45
+ self.http_get('/v1/os/list')
46
+ end
47
+
48
+ def self.regions_availability(dcid)
49
+ #/v1/regions/availability
50
+ #GET - public
51
+
52
+ self.http_get('/v1/regions/availability', DCID: dcid)
53
+ .map(&:to_s)
54
+ end
55
+
56
+ def self.server_list(api_key)
57
+ #/v1/server/list
58
+ #GET - account
59
+
60
+ self.http_get('/v1/server/list', api_key: api_key)
61
+ end
62
+
63
+ # POST
64
+
65
+ def self.http_post(endpoint, body)
66
+ response = ''
67
+
68
+ api_key = body.delete(:api_key)
69
+
70
+ uri = URI.parse("#{API_HOST}#{endpoint}")
71
+ https = Net::HTTP.new(uri.host, 443)
72
+ https.use_ssl = true
73
+ https.start{|https|
74
+ response = https.post("#{uri.path}?api_key=#{api_key}",query(body))
75
+ }
76
+
77
+ if response.body.to_s.empty?
78
+ ''
79
+ else
80
+ JSON.parse(response.body)
81
+ end
82
+ end
83
+
84
+ def self.server_create(body)
85
+ #/v1/server/create
86
+ #POST - account
87
+
88
+ self.http_post('/v1/server/create', body)
89
+ end
90
+
91
+ def self.server_destroy(body)
92
+ #/v1/server/destroy
93
+ #POST - account
94
+
95
+ self.http_post('/v1/server/destroy', body)
96
+ end
97
+
98
+ # helper
99
+
100
+ def self.query(option)
101
+ return '' if option.empty?
102
+ option.map{|e| e.join '='}.join('&')
103
+ end
104
+ end
105
+ end
@@ -0,0 +1,4 @@
1
+ module Vultrlife
2
+ class PlanVerifier
3
+ end
4
+ end
@@ -0,0 +1,15 @@
1
+ module Vultrlife
2
+ class Server < Hash
3
+ class Configuration
4
+ attr_accessor :region, :plan, :os, :ipxe_chain_url, :api_key
5
+
6
+ def initialize(account)
7
+ @api_key = account.api_key
8
+ end
9
+
10
+ def verify_plan(&b)
11
+ yield Vultrlife::PlanVerifier.new
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,72 @@
1
+ require 'vultrlife/server/configuration'
2
+ module Vultrlife
3
+ class Server < Hash
4
+ attr_reader :subid
5
+ def initialize(subid, account=nil, hash=nil)
6
+ @subid = subid
7
+ @account = account
8
+ self.merge!(hash) if hash
9
+ end
10
+
11
+ def destroy!
12
+ Agent.server_destroy(SUBID: @subid, api_key: @account.api_key)
13
+ self['destroyed'] = true
14
+ @subid
15
+ end
16
+
17
+ def destroyed?
18
+ !!self['destroyed']
19
+ end
20
+
21
+ def self.create!(config)
22
+ self.validate_config(config)
23
+ self.exec_create
24
+ end
25
+
26
+ def self.show_servers(account)
27
+ servers = Agent.server_list(account.api_key)
28
+ servers = servers.map do |subid, attributes|
29
+ self.new(subid, account, attributes)
30
+ end
31
+ end
32
+
33
+ private
34
+ def self.exec_create
35
+ subid_hash = Agent.server_create(@option)
36
+ self.new(subid_hash['SUBID'].to_i)
37
+ end
38
+
39
+ def self.validate_config(config)
40
+ plans = Agent.plans_list
41
+ plans = plans.select{|key,value| config.plan == value['name'] }
42
+
43
+ raise if not plans.size == 1
44
+
45
+ regions = Agent.regions_list
46
+ regions = regions.select{|key,value| config.region.to_s == value['name'].downcase }
47
+
48
+ raise if not regions.keys.size == 1
49
+
50
+ oss = Agent.os_list
51
+ oss = oss.select{|key,value| config.os == value['name'] }
52
+
53
+ raise if not oss.keys.size == 1
54
+
55
+ dcid = regions.keys.first
56
+ available_plans = Agent.regions_availability(dcid).map(&:to_i)
57
+
58
+ raise if not available_plans.include?(plans.keys.first.to_i)
59
+
60
+ @option = {
61
+ VPSPLANID: plans.keys.first.to_i,
62
+ DCID: dcid.to_i,
63
+ OSID: oss.keys.first.to_i,
64
+ api_key: config.api_key,
65
+ }
66
+
67
+ if config.ipxe_chain_url
68
+ @option[:ipxe_chain_url] = config.ipxe_chain_url
69
+ end
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,3 @@
1
+ module Vultrlife
2
+ VERSION = "0.0.2"
3
+ end
data/lib/vultrlife.rb ADDED
@@ -0,0 +1,8 @@
1
+ require 'vultrlife/account'
2
+ require 'vultrlife/agent'
3
+ require 'vultrlife/server'
4
+ require 'vultrlife/plan_verifier'
5
+ require "vultrlife/version"
6
+
7
+ module Vultrlife
8
+ end
@@ -0,0 +1 @@
1
+ [31,52,47,32,53,48,51,8,54,33,49,50,34,55]
@@ -0,0 +1 @@
1
+ {"127":{"name":"CentOS 6 x64","arch":"x64","family":"centos","windows":false},"147":{"name":"CentOS 6 i386","arch":"i386","family":"centos","windows":false},"162":{"name":"CentOS 5 x64","arch":"x64","family":"centos","windows":false},"163":{"name":"CentOS 5 i386","arch":"i386","family":"centos","windows":false},"160":{"name":"Ubuntu 14.04 x64","arch":"x64","family":"ubuntu","windows":false},"161":{"name":"Ubuntu 14.04 i386","arch":"i386","family":"ubuntu","windows":false},"131":{"name":"Ubuntu 13.10 x64","arch":"x64","family":"ubuntu","windows":false},"150":{"name":"Ubuntu 13.10 i386","arch":"i386","family":"ubuntu","windows":false},"129":{"name":"Ubuntu 12.10 x64","arch":"x64","family":"ubuntu","windows":false},"149":{"name":"Ubuntu 12.10 i386","arch":"i386","family":"ubuntu","windows":false},"128":{"name":"Ubuntu 12.04 x64","arch":"x64","family":"ubuntu","windows":false},"148":{"name":"Ubuntu 12.04 i386","arch":"i386","family":"ubuntu","windows":false},"138":{"name":"Debian 6 x64 (squeeze)","arch":"x64","family":"debian","windows":false},"151":{"name":"Debian 6 i386 (squeeze)","arch":"i386","family":"debian","windows":false},"139":{"name":"Debian 7 x64 (wheezy)","arch":"x64","family":"debian","windows":false},"152":{"name":"Debian 7 i386 (wheezy)","arch":"i386","family":"debian","windows":false},"140":{"name":"FreeBSD 10 x64","arch":"x64","family":"freebsd","windows":false},"124":{"name":"Windows 2012 R2 x64","arch":"x64","family":"windows","windows":true},"159":{"name":"Custom","arch":"x64","family":"iso","windows":false},"164":{"name":"Snapshot","arch":"x64","family":"snapshot","windows":false}}
@@ -0,0 +1 @@
1
+ {"40":{"name":"512 MB RAM,160 GB SATA,1.00 TB BW, Custom ISO","vcpu_count":"1","ram":"512","disk":"160","bandwidth":"1.00","price_per_month":"5.00","windows":false},"11":{"name":"512 MB RAM,160 GB SATA,1.00 TB BW","vcpu_count":"1","ram":"512","disk":"160","bandwidth":"1.00","price_per_month":"5.00","windows":false},"45":{"name":"768 MB RAM,15 GB SSD,1.00 TB BW, Custom ISO","vcpu_count":"1","ram":"768","disk":"15","bandwidth":"1.00","price_per_month":"5.00","windows":false},"31":{"name":"768 MB RAM,15 GB SSD,0.10 TB BW","vcpu_count":"1","ram":"768","disk":"15","bandwidth":"0.10","price_per_month":"5.00","windows":false},"29":{"name":"768 MB RAM,15 GB SSD,1.00 TB BW","vcpu_count":"1","ram":"768","disk":"15","bandwidth":"1.00","price_per_month":"5.00","windows":false},"52":{"name":"768 MB RAM,15 GB SSD,0.10 TB BW, Custom ISO","vcpu_count":"1","ram":"768","disk":"15","bandwidth":"0.10","price_per_month":"5.00","windows":false},"41":{"name":"1024 MB RAM,320 GB SATA,2.00 TB BW, Custom ISO","vcpu_count":"1","ram":"1024","disk":"320","bandwidth":"2.00","price_per_month":"8.00","windows":false},"61":{"name":"1024 MB RAM,320 GB SATA,2.00 TB BW","vcpu_count":"1","ram":"1024","disk":"320","bandwidth":"2.00","price_per_month":"23.00","windows":true},"46":{"name":"1024 MB RAM,20 GB SSD,2.00 TB BW, Custom ISO","vcpu_count":"1","ram":"1024","disk":"20","bandwidth":"2.00","price_per_month":"7.00","windows":false},"35":{"name":"1024 MB RAM,20 GB SSD,1.00 TB BW","vcpu_count":"1","ram":"1024","disk":"20","bandwidth":"1.00","price_per_month":"23.00","windows":true},"47":{"name":"1024 MB RAM,20 GB SSD,0.10 TB BW","vcpu_count":"1","ram":"1024","disk":"20","bandwidth":"0.10","price_per_month":"23.00","windows":true},"32":{"name":"1024 MB RAM,20 GB SSD,0.20 TB BW","vcpu_count":"1","ram":"1024","disk":"20","bandwidth":"0.20","price_per_month":"7.00","windows":false},"12":{"name":"1024 MB RAM,320 GB SATA,2.00 TB BW","vcpu_count":"1","ram":"1024","disk":"320","bandwidth":"2.00","price_per_month":"8.00","windows":false},"30":{"name":"1024 MB RAM,20 GB SSD,2.00 TB BW","vcpu_count":"1","ram":"1024","disk":"20","bandwidth":"2.00","price_per_month":"7.00","windows":false},"53":{"name":"1024 MB RAM,20 GB SSD,0.20 TB BW, Custom ISO","vcpu_count":"1","ram":"1024","disk":"20","bandwidth":"0.20","price_per_month":"7.00","windows":false},"48":{"name":"2048 MB RAM,40 GB SSD,0.20 TB BW","vcpu_count":"1","ram":"2048","disk":"40","bandwidth":"0.20","price_per_month":"39.00","windows":true},"42":{"name":"2048 MB RAM,640 GB SATA,3.00 TB BW, Custom ISO","vcpu_count":"1","ram":"2048","disk":"640","bandwidth":"3.00","price_per_month":"15.00","windows":false},"51":{"name":"2048 MB RAM,40 GB SSD,0.30 TB BW, Custom ISO","vcpu_count":"2","ram":"2048","disk":"40","bandwidth":"0.30","price_per_month":"15.00","windows":false},"3":{"name":"2048 MB RAM,40 GB SSD,3.00 TB BW","vcpu_count":"2","ram":"2048","disk":"40","bandwidth":"3.00","price_per_month":"15.00","windows":false},"39":{"name":"2048 MB RAM,40 GB SSD,3.00 TB BW, Custom ISO","vcpu_count":"2","ram":"2048","disk":"40","bandwidth":"3.00","price_per_month":"15.00","windows":false},"8":{"name":"2048 MB RAM,40 GB SSD,0.30 TB BW","vcpu_count":"2","ram":"2048","disk":"40","bandwidth":"0.30","price_per_month":"15.00","windows":false},"13":{"name":"2048 MB RAM,640 GB SATA,3.00 TB BW","vcpu_count":"1","ram":"2048","disk":"640","bandwidth":"3.00","price_per_month":"15.00","windows":false},"60":{"name":"2048 MB RAM,640 GB SATA,3.00 TB BW","vcpu_count":"1","ram":"2048","disk":"640","bandwidth":"3.00","price_per_month":"39.00","windows":true},"36":{"name":"2048 MB RAM,40 GB SSD,2.00 TB BW","vcpu_count":"1","ram":"2048","disk":"40","bandwidth":"2.00","price_per_month":"39.00","windows":true},"37":{"name":"4096 MB RAM,60 GB SSD,4.00 TB BW","vcpu_count":"2","ram":"4096","disk":"60","bandwidth":"4.00","price_per_month":"49.00","windows":true},"54":{"name":"4096 MB RAM,65 GB SSD,0.40 TB BW, Custom ISO","vcpu_count":"2","ram":"4096","disk":"65","bandwidth":"0.40","price_per_month":"35.00","windows":false},"43":{"name":"4096 MB RAM,65 GB SSD,4.00 TB BW, Custom ISO","vcpu_count":"2","ram":"4096","disk":"65","bandwidth":"4.00","price_per_month":"35.00","windows":false},"27":{"name":"4096 MB RAM,65 GB SSD,4.00 TB BW","vcpu_count":"2","ram":"4096","disk":"65","bandwidth":"4.00","price_per_month":"35.00","windows":false},"33":{"name":"4096 MB RAM,65 GB SSD,0.40 TB BW","vcpu_count":"2","ram":"4096","disk":"65","bandwidth":"0.40","price_per_month":"35.00","windows":false},"49":{"name":"4096 MB RAM,60 GB SSD,0.30 TB BW","vcpu_count":"2","ram":"4096","disk":"60","bandwidth":"0.30","price_per_month":"49.00","windows":true},"50":{"name":"8192 MB RAM,120 GB SSD,0.40 TB BW","vcpu_count":"4","ram":"8192","disk":"120","bandwidth":"0.40","price_per_month":"90.00","windows":true},"28":{"name":"8192 MB RAM,120 GB SSD,5.00 TB BW","vcpu_count":"4","ram":"8192","disk":"120","bandwidth":"5.00","price_per_month":"70.00","windows":false},"44":{"name":"8192 MB RAM,120 GB SSD,5.00 TB BW, Custom ISO","vcpu_count":"4","ram":"8192","disk":"120","bandwidth":"5.00","price_per_month":"70.00","windows":false},"34":{"name":"8192 MB RAM,120 GB SSD,0.50 TB BW","vcpu_count":"4","ram":"8192","disk":"120","bandwidth":"0.50","price_per_month":"70.00","windows":false},"55":{"name":"8192 MB RAM,120 GB SSD,0.50 TB BW, Custom ISO","vcpu_count":"4","ram":"8192","disk":"120","bandwidth":"0.50","price_per_month":"70.00","windows":false},"38":{"name":"8192 MB RAM,120 GB SSD,5.00 TB BW","vcpu_count":"4","ram":"8192","disk":"120","bandwidth":"5.00","price_per_month":"90.00","windows":true}}
@@ -0,0 +1 @@
1
+ {"19":{"name":"Australia","country":"AU","continent":"Australia","state":""},"9":{"name":"Frankfurt","country":"DE","continent":"Europe","state":""},"24":{"name":"France","country":"FR","continent":"Europe","state":""},"8":{"name":"London","country":"GB","continent":"Europe","state":""},"25":{"name":"Tokyo","country":"JP","continent":"Asia","state":""},"7":{"name":"Amsterdam","country":"NL","continent":"Europe","state":""},"6":{"name":"Atlanta","country":"US","continent":"North America","state":"GA"},"2":{"name":"Chicago","country":"US","continent":"North America","state":"IL"},"3":{"name":"Dallas","country":"US","continent":"North America","state":"TX"},"5":{"name":"Los Angeles","country":"US","continent":"North America","state":"CA"},"1":{"name":"New Jersey","country":"US","continent":"North America","state":"NJ"},"4":{"name":"Seattle","country":"US","continent":"North America","state":"WA"}}
@@ -0,0 +1 @@
1
+ {"1356876":{"os":"CentOS 6 x64","ram":"768 MB","disk":"Virtual 15 GB","main_ip":"108.61.223.121","vcpu_count":"1","location":"Tokyo","default_password":"moskety!7j","date_created":"2014-05-25 07:28:35","pending_charges":"0.01","status":"active","cost_per_month":"5.00","current_bandwidth_gb":0,"netmask_v4":"255.255.255.0","gateway_v4":"108.61.223.1","power_status":"running"}}
@@ -0,0 +1,5 @@
1
+ $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
2
+ require 'vultrlife'
3
+ require 'rspec'
4
+ require 'pry'
5
+ require 'webmock/rspec'
@@ -0,0 +1,60 @@
1
+ require 'spec_helper'
2
+
3
+ describe Vultrlife::Account do
4
+ let(:account){ Vultrlife::Account.new }
5
+
6
+ describe '#servers' do
7
+ it 'calls Vultrlife::Server.show_servers' do
8
+ expect(Vultrlife::Server).to receive(:show_servers).with(account)
9
+
10
+ account.servers
11
+ end
12
+ end
13
+
14
+ describe '#server_create!' do
15
+ context 'given no block' do
16
+ it 'raises error' do
17
+ expect{ account.server_create! }.to raise_error
18
+ end
19
+ end
20
+
21
+ def server_create!(&b)
22
+ config = Server::Configuration.new(self)
23
+ yield config
24
+ Server.create!(config)
25
+ end
26
+
27
+ context 'given a block' do
28
+ it 'yields Vultrlife::Server::Configuration' do
29
+ config = double(:config)
30
+ expect(Vultrlife::Server::Configuration).to receive(:new).with(account).and_return(config)
31
+ expect(config).to receive(:setting_a=).with('setting_a')
32
+ expect(config).to receive(:setting_b=).with('setting_b')
33
+ config.stub(:plan)
34
+ expect(Vultrlife::Server).to receive(:create!).with(config)
35
+
36
+ server = account.server_create! do |server|
37
+ server.setting_a = 'setting_a'
38
+ server.setting_b = 'setting_b'
39
+ end
40
+ end
41
+
42
+ it 'returns a new Vultrlife::Server' do
43
+ pending('this spec must be feature test')
44
+ config = double(:config)
45
+ expect(Vultrlife::Server::Configuration).to receive(:new).with(account).and_return(config)
46
+ expect(config).to receive(:setting_a=).with('setting_a')
47
+ expect(config).to receive(:setting_b=).with('setting_b')
48
+ config.stub(:plan)
49
+ expect(Vultrlife::Server).to receive(:create!).with(config)
50
+
51
+ server = account.server_create! do |server|
52
+ server.setting_a = 'setting_a'
53
+ server.setting_b = 'setting_b'
54
+ end
55
+
56
+ server.should be_a(Vultrlife::Server)
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,170 @@
1
+ require 'spec_helper'
2
+
3
+ describe Vultrlife::Agent do
4
+ describe '.plans_list' do
5
+ context 'when API responds normally' do
6
+ let(:v1_plans) do
7
+ File.read('spec/fixtures/v1_plans.json')
8
+ end
9
+
10
+ it 'returns plans(Hash)' do
11
+ WebMock.stub_request(:get, 'https://api.vultr.com/v1/plans/list')
12
+ .to_return(:body => v1_plans)
13
+
14
+ response = Vultrlife::Agent.plans_list
15
+ expect(response.keys.sort).to eq(
16
+ %w(11 12 13 27 28 29 3 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 60 61 8)
17
+ )
18
+ end
19
+ end
20
+ end
21
+
22
+ describe '.regions_list' do
23
+ context 'when API responds normally' do
24
+ let(:v1_regions) do
25
+ File.read('spec/fixtures/v1_regions.json')
26
+ end
27
+
28
+ it 'returns regions(Hash)' do
29
+ WebMock.stub_request(:get, 'https://api.vultr.com/v1/regions/list')
30
+ .to_return(:body => v1_regions)
31
+
32
+ response = Vultrlife::Agent.regions_list
33
+ expect(response.keys.sort).to eq(
34
+ %w(1 19 2 24 25 3 4 5 6 7 8 9)
35
+ )
36
+ end
37
+ end
38
+ end
39
+
40
+ describe '.os_list' do
41
+ context 'when API responds normally' do
42
+ let(:v1_os) do
43
+ File.read('spec/fixtures/v1_os.json')
44
+ end
45
+
46
+ it 'returns oss(Hash)' do
47
+ WebMock.stub_request(:get, 'https://api.vultr.com/v1/os/list')
48
+ .to_return(:body => v1_os)
49
+
50
+ response = Vultrlife::Agent.os_list
51
+ expect(response.keys.sort).to eq(
52
+ %w(124 127 128 129 131 138 139 140 147 148 149 150 151 152 159 160 161 162 163 164)
53
+ )
54
+ end
55
+ end
56
+ end
57
+
58
+ describe '.regions_availability' do
59
+ context 'when API responds normally' do
60
+ let(:v1_availability_of_tokyo) do
61
+ File.read('spec/fixtures/v1_availability_of_tokyo.json')
62
+ end
63
+
64
+ it 'returns available plans(Array)' do
65
+ WebMock.stub_request(:get, 'https://api.vultr.com/v1/regions/availability?DCID=25')
66
+ .to_return(:body => v1_availability_of_tokyo)
67
+
68
+ response = Vultrlife::Agent.regions_availability('25') # 25 -> tokyo
69
+ expect(response.sort).to eq(
70
+ %w(31 32 33 34 47 48 49 50 51 52 53 54 55 8)
71
+ )
72
+ end
73
+ end
74
+ end
75
+
76
+ describe '.server_list' do
77
+ context 'when API responds normally' do
78
+ let(:v1_server_list) do
79
+ File.read('spec/fixtures/v1_server_list.json')
80
+ end
81
+
82
+ it 'returns my servers(Hash)' do
83
+ WebMock.stub_request(:get, 'https://api.vultr.com/v1/server/list?api_key=APIKEY')
84
+ .to_return(body: v1_server_list)
85
+
86
+ response = Vultrlife::Agent.server_list('APIKEY')
87
+ expect(response).to eq(
88
+ {
89
+ "1356876" => {
90
+ "os" => "CentOS 6 x64",
91
+ "ram" => "768 MB",
92
+ "disk" => "Virtual 15 GB",
93
+ "main_ip" => "108.61.223.121",
94
+ "vcpu_count" => "1",
95
+ "location" => "Tokyo",
96
+ "default_password" => "moskety!7j",
97
+ "date_created" => "2014-05-25 07:28:35",
98
+ "pending_charges" => "0.01",
99
+ "status" => "active",
100
+ "cost_per_month" => "5.00",
101
+ "current_bandwidth_gb" => 0,
102
+ "netmask_v4" => "255.255.255.0",
103
+ "gateway_v4" => "108.61.223.1",
104
+ "power_status" => "running"
105
+ }
106
+ }
107
+ )
108
+ end
109
+ end
110
+ end
111
+
112
+ describe '.server_create' do
113
+ context 'given valid option' do
114
+ context 'when API responds normally' do
115
+ it 'returns server\'s sub_id(Hash)' do
116
+ data = "DCID=25"
117
+ data << "&VPSPLANID=31"
118
+ data << "&OSID=127"
119
+ WebMock.stub_request(:post, 'https://api.vultr.com/v1/server/create?api_key=APIKEY')
120
+ .with(body: data)
121
+ .to_return(body: %q{{"SUBID" : "1312965"}})
122
+
123
+ option = {DCID: 25, VPSPLANID: 31, OSID: 127, api_key: 'APIKEY'}
124
+ response = Vultrlife::Agent.server_create(option)
125
+ expect(response).to eq(
126
+ {'SUBID' => '1312965'}
127
+ )
128
+ end
129
+ end
130
+ end
131
+
132
+ context 'given valid option with ipxe_chain_url(custom_os)' do
133
+ context 'when API responds normally' do
134
+ it 'returns server\'s sub_id(Hash)' do
135
+ data = "DCID=25"
136
+ data << "&VPSPLANID=52"
137
+ data << "&OSID=159"
138
+ data << "&ipxe_chain_url=http://example.com/script.txt"
139
+ WebMock.stub_request(:post, 'https://api.vultr.com/v1/server/create?api_key=APIKEY')
140
+ .with(body: data)
141
+ .to_return(body: %q{{"SUBID" : "1312965"}})
142
+
143
+ option = {DCID: 25, VPSPLANID: 52, OSID: 159, api_key: 'APIKEY', ipxe_chain_url: 'http://example.com/script.txt'}
144
+ response = Vultrlife::Agent.server_create(option)
145
+ expect(response).to eq(
146
+ {'SUBID' => '1312965'}
147
+ )
148
+ end
149
+ end
150
+ end
151
+ end
152
+
153
+ describe '.server_destroy' do
154
+ context 'given valid option' do
155
+ context 'when API responds normally server\'s "" with status 200' do
156
+ it 'returns ""' do
157
+ WebMock.stub_request(:post, 'https://api.vultr.com/v1/server/destroy?api_key=APIKEY')
158
+ .with(body: 'SUBID=111111')
159
+ .to_return(status: 200, body: '')
160
+
161
+ option = {SUBID: '111111', api_key: 'APIKEY'}
162
+ response = Vultrlife::Agent.server_destroy(option)
163
+ expect(response).to eq(
164
+ ''
165
+ )
166
+ end
167
+ end
168
+ end
169
+ end
170
+ end
@@ -0,0 +1,92 @@
1
+ require 'spec_helper'
2
+
3
+ describe Vultrlife::Server::Configuration do
4
+ let(:config) do
5
+
6
+ account = Vultrlife::Account.new
7
+
8
+ Vultrlife::Server::Configuration.new(account)
9
+ end
10
+
11
+ describe '#region=' do
12
+ context 'given :tokyo' do
13
+ it 'sets @region :tokyo' do
14
+ expect do
15
+ config.region= :tokyo
16
+ end.to change {
17
+ config.instance_variable_get(:@region)
18
+ }.from(nil).to(:tokyo)
19
+ end
20
+ end
21
+ end
22
+
23
+ describe '#plan=' do
24
+ context 'given :starter' do
25
+ it 'sets @plan :starter' do
26
+ expect do
27
+ config.plan = :starter
28
+ end.to change {
29
+ config.instance_variable_get(:@plan)
30
+ }.from(nil).to(:starter)
31
+ end
32
+ end
33
+ end
34
+
35
+ describe '#os=' do
36
+ context 'given :custom' do
37
+ it 'sets @os :custom' do
38
+ expect do
39
+ config.os = :custom
40
+ end.to change {
41
+ config.instance_variable_get(:@os)
42
+ }.from(nil).to(:custom)
43
+ end
44
+ end
45
+ end
46
+
47
+ describe '#ipxe_chain_url=' do
48
+ context 'given url' do
49
+ it 'sets @ipxe_chain_url the url' do
50
+ expect do
51
+ config.ipxe_chain_url = 'http://example.com/script.txt'
52
+ end.to change {
53
+ config.instance_variable_get(:@ipxe_chain_url)
54
+ }.from(nil).to('http://example.com/script.txt')
55
+ end
56
+ end
57
+ end
58
+
59
+ describe '#api_key=' do
60
+ context 'given api_key' do
61
+ it 'sets @api_key the api_key' do
62
+ expect do
63
+ config.api_key = 'API_KEY'
64
+ end.to change {
65
+ config.instance_variable_get(:@api_key)
66
+ }.from('').to('API_KEY')
67
+ end
68
+ end
69
+ end
70
+
71
+ describe '#verify_plan' do
72
+ context 'given block' do
73
+ it 'yields Vultrlife::PlanVerifier' do
74
+ verifier = double(:verifier)
75
+ Vultrlife::PlanVerifier.should_receive(:new).and_return(verifier)
76
+ verifier.should_receive(:costs_at_most=).with(7)
77
+ verifier.should_receive(:vcpu_count= ).with(1)
78
+ verifier.should_receive(:ram= ).with(1024)
79
+ verifier.should_receive(:disk= ).with(30)
80
+ verifier.should_receive(:bandwidth= ).with(2)
81
+
82
+ config.verify_plan do |verify|
83
+ verify.costs_at_most = 7
84
+ verify.vcpu_count = 1
85
+ verify.ram = 1024
86
+ verify.disk = 30
87
+ verify.bandwidth = 2
88
+ end
89
+ end
90
+ end
91
+ end
92
+ end
@@ -0,0 +1,139 @@
1
+ require 'spec_helper'
2
+ require 'json'
3
+
4
+ describe Vultrlife::Server do
5
+ describe '.show_servers' do
6
+ context 'when some servers exist' do
7
+ let(:account) do
8
+ Vultrlife::Account.new do |account|
9
+ account.api_key = 'APIKEY'
10
+ end
11
+ end
12
+ it 'returns Server array' do
13
+ server_hash = {"1356867"=>
14
+ {"os"=>"CentOS 6 x64",
15
+ "ram"=>"768 MB",
16
+ "disk"=>"Virtual 15 GB",
17
+ "main_ip"=>"108.61.223.121",
18
+ "vcpu_count"=>"1",
19
+ "location"=>"Tokyo",
20
+ "default_password"=>"moskety!7j",
21
+ "date_created"=>"2014-05-25 07:28:35",
22
+ "pending_charges"=>"0.02",
23
+ "status"=>"active",
24
+ "cost_per_month"=>"5.00",
25
+ "current_bandwidth_gb"=>0.028,
26
+ "netmask_v4"=>"255.255.255.0",
27
+ "gateway_v4"=>"108.61.223.1",
28
+ "power_status"=>"running"}
29
+ }
30
+ Vultrlife::Agent.should_receive(:server_list).with('APIKEY').and_return(server_hash)
31
+
32
+ servers = Vultrlife::Server.show_servers(account)
33
+ expect(servers.size).to eq 1
34
+ expect(servers.first).to include("os"=>"CentOS 6 x64")
35
+ expect(servers.first).to be_a Vultrlife::Server
36
+ end
37
+ end
38
+
39
+ context 'when no servers exist' do
40
+ it 'returns []' do
41
+ pending
42
+ end
43
+ end
44
+ end
45
+
46
+ describe '#destroy!' do
47
+ context 'when successfully' do
48
+ it 'returns subid' do
49
+ account = Vultrlife::Account.new do |account|
50
+ account.api_key = 'API_KEY'
51
+ end
52
+ server = Vultrlife::Server.new('111111', account)
53
+
54
+ Vultrlife::Agent.should_receive(:server_destroy).with(SUBID: '111111', api_key: 'API_KEY')
55
+ expect(server.destroy!).to eq '111111'
56
+ expect(server).to be_destroyed
57
+ end
58
+ end
59
+ end
60
+
61
+ describe '.create!' do
62
+ let(:v1_plans) do
63
+ JSON.parse File.read('spec/fixtures/v1_plans.json')
64
+ end
65
+
66
+ let(:v1_regions) do
67
+ JSON.parse File.read('spec/fixtures/v1_regions.json')
68
+ end
69
+
70
+ let(:v1_os) do
71
+ JSON.parse File.read('spec/fixtures/v1_os.json')
72
+ end
73
+
74
+ let(:v1_availability_of_tokyo) do
75
+ JSON.parse File.read('spec/fixtures/v1_availability_of_tokyo.json')
76
+ end
77
+
78
+ let(:centos_config) do
79
+ account = Vultrlife::Account.new do |account|
80
+ account.api_key = 'API_KEY'
81
+ end
82
+ centos_config = Vultrlife::Server::Configuration.new(account)
83
+ centos_config.instance_eval do
84
+ @plan = '768 MB RAM,15 GB SSD,0.10 TB BW'
85
+ @region = :tokyo
86
+ @os = 'CentOS 6 x64'
87
+ @api_key = 'API_KEY'
88
+ end
89
+ centos_config
90
+ end
91
+
92
+ context 'given a config for CentOS' do
93
+ context 'the instance has a valid specific @plan, @region, @os' do
94
+ it 'check plans, availability, region' do
95
+ Vultrlife::Agent.should_receive(:plans_list).and_return(v1_plans)
96
+ Vultrlife::Agent.should_receive(:regions_list).and_return(v1_regions)
97
+ Vultrlife::Agent.should_receive(:os_list).and_return(v1_os)
98
+ Vultrlife::Agent.should_receive(:regions_availability).with('25').and_return(v1_availability_of_tokyo)
99
+ Vultrlife::Agent.should_receive(:server_create).with(VPSPLANID: 31, DCID: 25, OSID: 127, api_key: 'API_KEY').and_return("SUBID" => "1312965")
100
+
101
+ server = Vultrlife::Server.create!(centos_config)
102
+ expect(server.subid).to eq(1312965)
103
+ end
104
+ end
105
+ end
106
+
107
+ let(:custom_os_config) do
108
+ account = Vultrlife::Account.new do |account|
109
+ account.api_key = 'API_KEY'
110
+ end
111
+ custom_os_config = Vultrlife::Server::Configuration.new(account)
112
+ custom_os_config.instance_eval do
113
+ @plan = '768 MB RAM,15 GB SSD,0.10 TB BW, Custom ISO'
114
+ @region = :tokyo
115
+ @os = 'Custom'
116
+ @api_key = 'API_KEY'
117
+ @ipxe_chain_url = 'http://example.com/script.txt'
118
+ end
119
+ custom_os_config
120
+ end
121
+
122
+ context 'given a config for custom_os' do
123
+ context 'the instance has a valid specific @plan, @region, @os' do
124
+ it 'check plans, availability, region' do
125
+ Vultrlife::Agent.should_receive(:plans_list).and_return(v1_plans)
126
+ Vultrlife::Agent.should_receive(:regions_list).and_return(v1_regions)
127
+ Vultrlife::Agent.should_receive(:os_list).and_return(v1_os)
128
+ Vultrlife::Agent.should_receive(:regions_availability).with('25').and_return(v1_availability_of_tokyo)
129
+ Vultrlife::Agent.should_receive(:server_create)
130
+ .with(VPSPLANID: 52, DCID: 25, OSID: 159, api_key: 'API_KEY',ipxe_chain_url: 'http://example.com/script.txt')
131
+ .and_return("SUBID" => "1312965")
132
+
133
+ server = Vultrlife::Server.create!(custom_os_config)
134
+ expect(server.subid).to eq(1312965)
135
+ end
136
+ end
137
+ end
138
+ end
139
+ end
@@ -0,0 +1,7 @@
1
+ require 'spec_helper'
2
+
3
+ describe Vultrlife do
4
+ it 'should have a version number' do
5
+ Vultrlife::VERSION.should_not be_nil
6
+ end
7
+ end
data/vultrlife.gemspec ADDED
@@ -0,0 +1,28 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'vultrlife/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "vultrlife"
8
+ spec.version = Vultrlife::VERSION
9
+ spec.authors = ["hoshinotsuyoshi"]
10
+ spec.email = ["guitarpopnot330@gmail.com"]
11
+ spec.summary = %q{Vultr VPS API wrapper}
12
+ spec.description = %q{Vultr VPS API wrapper}
13
+ spec.homepage = ""
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler", "~> 1.5"
22
+ spec.add_development_dependency "rake"
23
+ spec.add_development_dependency "rspec"
24
+ spec.add_development_dependency "pry"
25
+ spec.add_development_dependency "webmock"
26
+
27
+ spec.required_ruby_version = '>= 1.9.3'
28
+ end
metadata ADDED
@@ -0,0 +1,153 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: vultrlife
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ platform: ruby
6
+ authors:
7
+ - hoshinotsuyoshi
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-06-01 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.5'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.5'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: pry
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: webmock
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ description: Vultr VPS API wrapper
84
+ email:
85
+ - guitarpopnot330@gmail.com
86
+ executables: []
87
+ extensions: []
88
+ extra_rdoc_files: []
89
+ files:
90
+ - ".gitignore"
91
+ - ".rspec"
92
+ - ".ruby-version"
93
+ - ".travis.yml"
94
+ - Gemfile
95
+ - Gemfile.lock
96
+ - LICENSE
97
+ - README.md
98
+ - Rakefile
99
+ - lib/vultrlife.rb
100
+ - lib/vultrlife/account.rb
101
+ - lib/vultrlife/agent.rb
102
+ - lib/vultrlife/plan_verifier.rb
103
+ - lib/vultrlife/server.rb
104
+ - lib/vultrlife/server/configuration.rb
105
+ - lib/vultrlife/version.rb
106
+ - spec/fixtures/v1_availability_of_tokyo.json
107
+ - spec/fixtures/v1_os.json
108
+ - spec/fixtures/v1_plans.json
109
+ - spec/fixtures/v1_regions.json
110
+ - spec/fixtures/v1_server_list.json
111
+ - spec/spec_helper.rb
112
+ - spec/vultrlife/account_spec.rb
113
+ - spec/vultrlife/agent_spec.rb
114
+ - spec/vultrlife/server/configuration_spec.rb
115
+ - spec/vultrlife/server_spec.rb
116
+ - spec/vultrlife_spec.rb
117
+ - vultrlife.gemspec
118
+ homepage: ''
119
+ licenses:
120
+ - MIT
121
+ metadata: {}
122
+ post_install_message:
123
+ rdoc_options: []
124
+ require_paths:
125
+ - lib
126
+ required_ruby_version: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - ">="
129
+ - !ruby/object:Gem::Version
130
+ version: 1.9.3
131
+ required_rubygems_version: !ruby/object:Gem::Requirement
132
+ requirements:
133
+ - - ">="
134
+ - !ruby/object:Gem::Version
135
+ version: '0'
136
+ requirements: []
137
+ rubyforge_project:
138
+ rubygems_version: 2.2.2
139
+ signing_key:
140
+ specification_version: 4
141
+ summary: Vultr VPS API wrapper
142
+ test_files:
143
+ - spec/fixtures/v1_availability_of_tokyo.json
144
+ - spec/fixtures/v1_os.json
145
+ - spec/fixtures/v1_plans.json
146
+ - spec/fixtures/v1_regions.json
147
+ - spec/fixtures/v1_server_list.json
148
+ - spec/spec_helper.rb
149
+ - spec/vultrlife/account_spec.rb
150
+ - spec/vultrlife/agent_spec.rb
151
+ - spec/vultrlife/server/configuration_spec.rb
152
+ - spec/vultrlife/server_spec.rb
153
+ - spec/vultrlife_spec.rb