hetzner-api 1.0.0.alpha.1 → 1.0.0.alpha.2
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile.lock +1 -1
- data/bin/hetzner +11 -1
- data/features/hetzner.feature +2 -2
- data/features/support/env.rb +1 -0
- data/hetzner-api.gemspec +2 -2
- data/lib/hetzner/api/boot/plesk.rb +8 -0
- data/lib/hetzner/api/boot/rescue.rb +21 -0
- data/lib/hetzner/api/boot/vnc.rb +27 -0
- data/lib/hetzner/api/boot/windows.rb +22 -0
- data/lib/{hetzner-api → hetzner}/api/boot.rb +5 -0
- data/lib/{hetzner-api → hetzner}/api/cli.rb +6 -7
- data/lib/{hetzner-api → hetzner}/api/failover.rb +1 -1
- data/lib/hetzner/api/ip.rb +35 -0
- data/lib/{hetzner-api → hetzner}/api/rdns.rb +0 -0
- data/lib/{hetzner-api → hetzner}/api/reset.rb +0 -0
- data/lib/hetzner/api/server.rb +6 -0
- data/lib/hetzner/api/subnet.rb +6 -0
- data/lib/hetzner/api/traffic.rb +6 -0
- data/lib/hetzner/api/version.rb +5 -0
- data/lib/{hetzner-api → hetzner}/api/wol.rb +0 -0
- data/lib/hetzner-api.rb +20 -13
- data/spec/api_stubs.rb +74 -12
- data/spec/fixtures/boot/get_with_ip.raw +29 -0
- data/spec/fixtures/boot/rescue/delete.raw +12 -0
- data/spec/fixtures/boot/rescue/post.raw +12 -0
- data/spec/fixtures/boot/vnc/delete.raw +13 -0
- data/spec/fixtures/boot/vnc/get.raw +13 -0
- data/spec/fixtures/boot/vnc/post.raw +13 -0
- data/spec/fixtures/ip/get.raw +27 -0
- data/spec/fixtures/ip/get_with_ip.raw +14 -0
- data/spec/fixtures/ip/get_with_server_ip.raw +27 -0
- data/spec/fixtures/ip/post_activate_with_data.raw +14 -0
- data/spec/fixtures/ip/post_deactivate_with_data.raw +14 -0
- data/spec/fixtures/rdns/delete_with_ip.raw +3 -0
- data/spec/fixtures/rdns/get_with_ip.raw +9 -0
- data/spec/fixtures/rdns/post_with_ip.raw +9 -0
- data/spec/fixtures/wol/get.raw +9 -0
- data/spec/fixtures/wol/post.raw +9 -0
- data/spec/{hetzner_spec.rb → hetzner_api_spec.rb} +75 -21
- data/spec/spec_constants.rb +3 -1
- metadata +37 -15
- data/lib/hetzner-api/api/rescue.rb +0 -19
- data/lib/hetzner-api/api/vnc.rb +0 -25
- data/lib/hetzner-api/api/windows.rb +0 -20
- data/lib/hetzner-api/version.rb +0 -5
data/Gemfile.lock
CHANGED
data/bin/hetzner
CHANGED
@@ -1,3 +1,13 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
-
require
|
2
|
+
require "rubygems"
|
3
|
+
require "bundler/setup"
|
4
|
+
require "hetzner-api"
|
5
|
+
|
6
|
+
if ENV['HETZNER_API_CUCUMBER_TEST']
|
7
|
+
puts 'testing mode'
|
8
|
+
require 'fakeweb'
|
9
|
+
require File.expand_path File.dirname(__FILE__) + '/../spec/spec_constants'
|
10
|
+
require File.expand_path File.dirname(__FILE__) + '/../spec/api_stubs'
|
11
|
+
end
|
12
|
+
|
3
13
|
Hetzner::API::CLI.start
|
data/features/hetzner.feature
CHANGED
@@ -4,5 +4,5 @@ Feature: Hetzner
|
|
4
4
|
I want to provider a decent, objective interface
|
5
5
|
|
6
6
|
Scenario: Display boot options for one server
|
7
|
-
When I run "hetzner boot
|
8
|
-
Then the output should contain "
|
7
|
+
When I run "hetzner boot get 11.11.11.111 --username='myusername' --password='mycoolpassword'"
|
8
|
+
Then the output should contain "11.11.11.111"
|
@@ -0,0 +1 @@
|
|
1
|
+
ENV['HETZNER_API_CUCUMBER_TEST'] = "1"
|
data/hetzner-api.gemspec
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
|
-
require File.expand_path("../lib/hetzner
|
2
|
+
require File.expand_path("../lib/hetzner/api/version", __FILE__)
|
3
3
|
|
4
4
|
Gem::Specification.new do |s|
|
5
5
|
s.name = "hetzner-api"
|
6
|
-
s.version = Hetzner::
|
6
|
+
s.version = Hetzner::API::VERSION
|
7
7
|
s.platform = Gem::Platform::RUBY
|
8
8
|
s.authors = ['Roland Moriz']
|
9
9
|
s.email = ['roland@moriz.de']
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Hetzner
|
2
|
+
class API
|
3
|
+
module Boot
|
4
|
+
module Rescue
|
5
|
+
# enables the rescue systm for given IP address/server using <em>os</em> (operating system) and <em>arch</em> (architecture)
|
6
|
+
#
|
7
|
+
# see <em>boot?</em> method to query the API for available options
|
8
|
+
#
|
9
|
+
# defaults to 64bit Linux
|
10
|
+
def enable_rescue!(ip, os = 'linux', arch = '64')
|
11
|
+
perform_post "/boot/#{ip}/rescue", :query => { :os => os, :arch => arch }
|
12
|
+
end
|
13
|
+
|
14
|
+
# disables the rescue system for a given IP address/server
|
15
|
+
def disable_rescue!(ip)
|
16
|
+
perform_delete "/boot/#{ip}/rescue"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Hetzner
|
2
|
+
class API
|
3
|
+
module Boot
|
4
|
+
module VNC
|
5
|
+
# queries the vnc boot status of one IP address/server
|
6
|
+
def boot_vnc?(ip)
|
7
|
+
path = "/boot/#{ip}/vnc"
|
8
|
+
perform_get path
|
9
|
+
end
|
10
|
+
|
11
|
+
# enables vnc boot option for one IP address/server
|
12
|
+
#
|
13
|
+
# see <em>Boot</em> to query the API for available options
|
14
|
+
def boot_vnc!(ip, dist, arch, lang)
|
15
|
+
path = "/boot/#{ip}/vnc"
|
16
|
+
perform_post path, :query => { :dist => dist, :arch => arch, :lang => lang }
|
17
|
+
end
|
18
|
+
|
19
|
+
# disables the vnc boot status of one IP address/server
|
20
|
+
def disable_boot_vnc!(ip)
|
21
|
+
path = "/boot/#{ip}/vnc"
|
22
|
+
perform_delete path
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Hetzner
|
2
|
+
class API
|
3
|
+
module Boot
|
4
|
+
module Windows
|
5
|
+
def boot_windows?(ip)
|
6
|
+
path = "/boot/#{ip}/windows"
|
7
|
+
perform_get path
|
8
|
+
end
|
9
|
+
|
10
|
+
def boot_windows!(ip, lan)
|
11
|
+
path = "/boot/#{ip}/windows"
|
12
|
+
perform_post path, :query => { :lang => lang }
|
13
|
+
end
|
14
|
+
|
15
|
+
def disable_boot_windows!(ip)
|
16
|
+
path = "/boot/#{ip}/windows"
|
17
|
+
perform_delete path
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -15,13 +15,12 @@ module Hetzner
|
|
15
15
|
def boot(action, ip = '')
|
16
16
|
generate_api_instance
|
17
17
|
case action
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
raise UnknownArgumentError, "'#{action}' is not a valid action!"
|
18
|
+
when 'get'
|
19
|
+
require_ip ip
|
20
|
+
result = @api.boot? ip
|
21
|
+
pp result.parsed_response
|
22
|
+
else
|
23
|
+
raise UnknownArgumentError, "'#{action}' is not a valid action!"
|
25
24
|
end
|
26
25
|
end
|
27
26
|
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module Hetzner
|
2
|
+
class API
|
3
|
+
module IP
|
4
|
+
# shows all addresses that belong to the main server IP
|
5
|
+
def ips_for_server?(server_ip)
|
6
|
+
path = "/ip"
|
7
|
+
perform_get path, :query => { :server_ip => server_ip }
|
8
|
+
end
|
9
|
+
|
10
|
+
# shows information of all IP addresses of the customer
|
11
|
+
def ips?
|
12
|
+
get_ip_or_ips
|
13
|
+
end
|
14
|
+
|
15
|
+
# shows information of a given IP addresses of the customer
|
16
|
+
def ip?(ip)
|
17
|
+
get_ip_or_ips ip
|
18
|
+
end
|
19
|
+
|
20
|
+
# sets or unsets traffic warning limits on a specific IP address
|
21
|
+
def ip!(ip, options = {})
|
22
|
+
path = "/ip/#{ip}"
|
23
|
+
perform_post path, :query => options
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def get_ip_or_ips(ip = nil)
|
29
|
+
path = "/ip"
|
30
|
+
path << "/#{ip}" if ip
|
31
|
+
perform_get path
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
File without changes
|
File without changes
|
File without changes
|
data/lib/hetzner-api.rb
CHANGED
@@ -1,15 +1,21 @@
|
|
1
1
|
require 'httparty'
|
2
|
-
require 'forwardable'
|
2
|
+
#require 'forwardable'
|
3
3
|
|
4
|
-
require 'hetzner
|
5
|
-
|
6
|
-
require 'hetzner
|
7
|
-
require 'hetzner
|
8
|
-
require 'hetzner
|
9
|
-
require 'hetzner
|
10
|
-
require 'hetzner
|
11
|
-
require 'hetzner
|
12
|
-
require 'hetzner
|
4
|
+
require 'hetzner/api/cli'
|
5
|
+
|
6
|
+
require 'hetzner/api/failover'
|
7
|
+
require 'hetzner/api/rdns'
|
8
|
+
require 'hetzner/api/reset'
|
9
|
+
require 'hetzner/api/wol'
|
10
|
+
require 'hetzner/api/server'
|
11
|
+
require 'hetzner/api/ip'
|
12
|
+
require 'hetzner/api/subnet'
|
13
|
+
require 'hetzner/api/traffic'
|
14
|
+
require 'hetzner/api/boot/rescue'
|
15
|
+
require 'hetzner/api/boot/vnc'
|
16
|
+
require 'hetzner/api/boot/windows'
|
17
|
+
require 'hetzner/api/boot/plesk'
|
18
|
+
require 'hetzner/api/boot'
|
13
19
|
|
14
20
|
module Hetzner
|
15
21
|
class API
|
@@ -20,11 +26,12 @@ module Hetzner
|
|
20
26
|
include Boot
|
21
27
|
include Failover
|
22
28
|
include Rdns
|
23
|
-
include Rescue
|
24
29
|
include Reset
|
25
|
-
include VNC
|
26
|
-
include Windows
|
27
30
|
include WOL
|
31
|
+
include Server
|
32
|
+
include IP
|
33
|
+
include Subnet
|
34
|
+
include Traffic
|
28
35
|
|
29
36
|
def initialize(username, password)
|
30
37
|
@auth = {:username => username, :password => password}
|
data/spec/api_stubs.rb
CHANGED
@@ -3,47 +3,109 @@ require 'fakeweb'
|
|
3
3
|
@base_dir = File.dirname(__FILE__)
|
4
4
|
|
5
5
|
def fixture(path)
|
6
|
-
File.expand_path(@base_dir + '/fixtures/' + @resource + '/' + path)
|
6
|
+
file = File.expand_path(@base_dir + '/fixtures/' + @resource + '/' + path)
|
7
|
+
file
|
7
8
|
end
|
8
9
|
|
9
|
-
def uri(path = nil)
|
10
|
+
def uri(path = nil, args = nil)
|
10
11
|
url = "https://#{API_USERNAME}:#{API_PASSWORD}@#{API_SERVER}/#{@resource}"
|
11
12
|
url << "/#{path}" if path
|
13
|
+
url << "#{args}" if args
|
12
14
|
url
|
13
15
|
end
|
14
16
|
|
17
|
+
|
15
18
|
FakeWeb.allow_net_connect = false
|
16
19
|
|
17
20
|
|
18
21
|
@resource = 'reset'
|
19
22
|
|
20
|
-
FakeWeb.register_uri :get,
|
23
|
+
FakeWeb.register_uri :get, uri,
|
21
24
|
:response => fixture('get.raw')
|
22
25
|
|
23
|
-
FakeWeb.register_uri :get,
|
26
|
+
FakeWeb.register_uri :get, uri("#{WORKING_IP}"),
|
24
27
|
:response => fixture('get_with_ip.raw')
|
25
28
|
|
26
|
-
FakeWeb.register_uri :get,
|
29
|
+
FakeWeb.register_uri :get, uri("#{UNKOWN_IP}"),
|
27
30
|
:response => fixture('get_with_ip_unknown.raw')
|
28
31
|
|
29
|
-
FakeWeb.register_uri :get,
|
32
|
+
FakeWeb.register_uri :get, uri("#{RESET_IP_NOT_AVAILABLE}"),
|
30
33
|
:response => fixture('get_with_ip_unavailable.raw')
|
31
34
|
|
32
|
-
|
33
|
-
FakeWeb.register_uri :post, uri("#{WORKING_IP}?type=sw"),
|
35
|
+
FakeWeb.register_uri :post, uri("#{WORKING_IP}?type=sw"),
|
34
36
|
:response => fixture('post_with_ip.raw')
|
35
37
|
|
36
|
-
FakeWeb.register_uri :post,
|
38
|
+
FakeWeb.register_uri :post, uri("#{WORKING_IP}?type=foo"),
|
37
39
|
:response => fixture('post_with_ip_invalid_input.raw')
|
38
40
|
|
39
|
-
FakeWeb.register_uri :post,
|
41
|
+
FakeWeb.register_uri :post, uri("#{RESET_IP_MANUAL_ACTIVE}?type=sw"),
|
40
42
|
:response => fixture('post_with_ip_manual_active.raw')
|
41
43
|
|
42
|
-
FakeWeb.register_uri :post,
|
44
|
+
FakeWeb.register_uri :post, uri("#{RESET_IP_NOT_AVAILABLE}?type=sw"),
|
43
45
|
:response => fixture('post_with_ip_unavailable.raw')
|
44
46
|
|
45
|
-
FakeWeb.register_uri :post,
|
47
|
+
FakeWeb.register_uri :post, uri("#{UNKOWN_IP}?type=sw"),
|
46
48
|
:response => fixture('post_with_ip_unknown.raw')
|
47
49
|
|
48
50
|
|
51
|
+
@resource = 'boot'
|
52
|
+
|
53
|
+
FakeWeb.register_uri :get, uri("#{WORKING_IP}"),
|
54
|
+
:response => fixture('get_with_ip.raw')
|
55
|
+
|
56
|
+
FakeWeb.register_uri :post, uri("#{WORKING_IP}/rescue?arch=64&os=linux"),
|
57
|
+
:response => fixture('rescue/post.raw')
|
58
|
+
|
59
|
+
FakeWeb.register_uri :delete, uri("#{WORKING_IP}/rescue"),
|
60
|
+
:response => fixture('rescue/delete.raw')
|
61
|
+
|
62
|
+
FakeWeb.register_uri :get, uri("#{WORKING_IP}/vnc"),
|
63
|
+
:response => fixture('vnc/get.raw')
|
64
|
+
|
65
|
+
FakeWeb.register_uri :post, uri("#{WORKING_IP}/vnc?arch=32&lang=en_US&dist=Fedora-13"),
|
66
|
+
:response => fixture('vnc/post.raw')
|
67
|
+
|
68
|
+
FakeWeb.register_uri :delete, uri("#{WORKING_IP}/vnc"),
|
69
|
+
:response => fixture('vnc/delete.raw')
|
70
|
+
|
71
|
+
|
72
|
+
@resource = 'wol'
|
73
|
+
|
74
|
+
FakeWeb.register_uri :get, uri("#{WORKING_IP}"),
|
75
|
+
:response => fixture('get.raw')
|
76
|
+
|
77
|
+
FakeWeb.register_uri :post, uri("#{WORKING_IP}"),
|
78
|
+
:response => fixture('post.raw')
|
79
|
+
|
80
|
+
|
81
|
+
@resource = 'rdns'
|
82
|
+
|
83
|
+
FakeWeb.register_uri :get, uri("#{WORKING_IP}"),
|
84
|
+
:response => fixture('get_with_ip.raw')
|
85
|
+
|
86
|
+
FakeWeb.register_uri :post, uri("#{WORKING_IP}?ptr=testen.de"),
|
87
|
+
:response => fixture('post_with_ip.raw')
|
88
|
+
|
89
|
+
FakeWeb.register_uri :delete, uri("#{WORKING_IP}"),
|
90
|
+
:response => fixture('delete_with_ip.raw')
|
91
|
+
|
92
|
+
|
93
|
+
@resource = 'ip'
|
94
|
+
|
95
|
+
FakeWeb.register_uri :get, uri,
|
96
|
+
:response => fixture('get.raw')
|
97
|
+
|
98
|
+
FakeWeb.register_uri :get, uri(nil, "?server_ip=#{WORKING_IP}"),
|
99
|
+
:response => fixture('get_with_server_ip.raw')
|
100
|
+
|
101
|
+
FakeWeb.register_uri :get, uri("#{WORKING_IP}"),
|
102
|
+
:response => fixture('get_with_ip.raw')
|
103
|
+
|
104
|
+
FakeWeb.register_uri :post, uri("#{WORKING_IP}?traffic_warnings=true&traffic_monthly=2342"),
|
105
|
+
:response => fixture('post_activate_with_data.raw')
|
106
|
+
|
107
|
+
FakeWeb.register_uri :post, uri("#{WORKING_IP}?traffic_warnings=false"),
|
108
|
+
:response => fixture('post_deactivate_with_data.raw')
|
109
|
+
|
110
|
+
|
49
111
|
#pp FakeWeb::Registry.instance.uri_map
|
@@ -0,0 +1,29 @@
|
|
1
|
+
HTTP/1.1 200 OK
|
2
|
+
Content-Type: application/json
|
3
|
+
|
4
|
+
{
|
5
|
+
"boot": {
|
6
|
+
"rescue": {
|
7
|
+
"server_ip" : "11.11.11.111",
|
8
|
+
"os": ["linux","freebsd","opensolaris","vkvm"],
|
9
|
+
"arch": [64,32],
|
10
|
+
"active": false,
|
11
|
+
"password": null
|
12
|
+
},
|
13
|
+
"vnc": {
|
14
|
+
"server_ip": "11.11.11.111",
|
15
|
+
"dist": ["centOS-5.0","Fedora-6","openSUSE-10.2"],
|
16
|
+
"arch": [64,32],
|
17
|
+
"lang": ["de_DE","en_US"],
|
18
|
+
"active": false,
|
19
|
+
"password": null
|
20
|
+
},
|
21
|
+
"windows": {
|
22
|
+
"server_ip": "11.11.11.111",
|
23
|
+
"dist": null,
|
24
|
+
"lang": null,
|
25
|
+
"active": false,
|
26
|
+
"password": null
|
27
|
+
}
|
28
|
+
}
|
29
|
+
}
|
@@ -0,0 +1,27 @@
|
|
1
|
+
HTTP/1.1 200 OK
|
2
|
+
Content-Type: application/json
|
3
|
+
|
4
|
+
[
|
5
|
+
{
|
6
|
+
"ip": {
|
7
|
+
"ip":"11.11.11.111",
|
8
|
+
"server_ip": "11.11.11.111",
|
9
|
+
"locked": false,
|
10
|
+
"traffic_warnings": false,
|
11
|
+
"traffic_hourly": 50,
|
12
|
+
"traffic_daily": 50,
|
13
|
+
"traffic_monthly":8
|
14
|
+
}
|
15
|
+
},
|
16
|
+
{
|
17
|
+
"ip": {
|
18
|
+
"ip": "11.11.11.112",
|
19
|
+
"server_ip": "11.11.11.111",
|
20
|
+
"locked": false,
|
21
|
+
"traffic_warnings": false,
|
22
|
+
"traffic_hourly": 200,
|
23
|
+
"traffic_daily": 2000,
|
24
|
+
"traffic_monthly": 20
|
25
|
+
}
|
26
|
+
}
|
27
|
+
]
|
@@ -0,0 +1,27 @@
|
|
1
|
+
HTTP/1.1 200 OK
|
2
|
+
Content-Type: application/json
|
3
|
+
|
4
|
+
[
|
5
|
+
{
|
6
|
+
"ip": {
|
7
|
+
"ip":"11.11.11.111",
|
8
|
+
"server_ip": "11.11.11.111",
|
9
|
+
"locked": false,
|
10
|
+
"traffic_warnings": false,
|
11
|
+
"traffic_hourly": 50,
|
12
|
+
"traffic_daily": 50,
|
13
|
+
"traffic_monthly":8
|
14
|
+
}
|
15
|
+
},
|
16
|
+
{
|
17
|
+
"ip": {
|
18
|
+
"ip": "11.11.11.112",
|
19
|
+
"server_ip": "11.11.11.111",
|
20
|
+
"locked": false,
|
21
|
+
"traffic_warnings": false,
|
22
|
+
"traffic_hourly": 200,
|
23
|
+
"traffic_daily": 2000,
|
24
|
+
"traffic_monthly": 20
|
25
|
+
}
|
26
|
+
}
|
27
|
+
]
|
@@ -4,7 +4,7 @@ require 'spec_helper'
|
|
4
4
|
describe "Reset" do
|
5
5
|
describe "query" do
|
6
6
|
before(:all) do
|
7
|
-
@h = Hetzner::API.new
|
7
|
+
@h = Hetzner::API.new API_USERNAME, API_PASSWORD
|
8
8
|
end
|
9
9
|
|
10
10
|
it "should list available reset options for all servers" do
|
@@ -34,7 +34,7 @@ describe "Reset" do
|
|
34
34
|
|
35
35
|
describe "execution" do
|
36
36
|
before(:all) do
|
37
|
-
@h = Hetzner::API.new
|
37
|
+
@h = Hetzner::API.new API_USERNAME, API_PASSWORD
|
38
38
|
end
|
39
39
|
|
40
40
|
it "should reset the specific IP" do
|
@@ -71,65 +71,71 @@ end
|
|
71
71
|
describe "Boot" do
|
72
72
|
describe "query boot configuration" do
|
73
73
|
before(:all) do
|
74
|
-
@h = Hetzner::API.new
|
74
|
+
@h = Hetzner::API.new API_USERNAME, API_PASSWORD
|
75
75
|
end
|
76
|
-
|
76
|
+
|
77
77
|
it "should display the boot configuration" do
|
78
78
|
result = @h.boot? WORKING_IP
|
79
|
-
result.should
|
79
|
+
result.response.should be_an_instance_of Net::HTTPOK
|
80
80
|
end
|
81
81
|
end
|
82
|
+
|
82
83
|
|
83
|
-
describe "
|
84
|
+
describe "the rescue system" do
|
84
85
|
before(:all) do
|
85
|
-
@h = Hetzner::API.new
|
86
|
+
@h = Hetzner::API.new API_USERNAME, API_PASSWORD
|
86
87
|
end
|
88
|
+
|
87
89
|
it "should be able to activate" do
|
88
90
|
result = @h.enable_rescue! WORKING_IP
|
89
|
-
|
91
|
+
result.response.should be_an_instance_of Net::HTTPOK
|
92
|
+
|
90
93
|
# {"rescue"=>{"arch"=>64, "os"=>"linux", "server_ip"=>WORKING_IP, "password"=>"h9JbXPz8", "active"=>true}}
|
91
|
-
result['rescue']['arch'].should == 64
|
92
|
-
result['rescue']['os'].should == 'linux'
|
93
|
-
result['rescue']['active'].should be_true
|
94
|
+
#result['rescue']['arch'].should == 64
|
95
|
+
#result['rescue']['os'].should == 'linux'
|
96
|
+
#result['rescue']['active'].should be_true
|
94
97
|
end
|
95
|
-
|
98
|
+
|
96
99
|
it "should be able to deactivate" do
|
97
100
|
result = @h.disable_rescue! WORKING_IP
|
98
|
-
result.should
|
101
|
+
result.response.should be_an_instance_of Net::HTTPOK
|
99
102
|
end
|
100
103
|
end
|
101
104
|
end
|
102
105
|
|
103
106
|
describe "Rdns" do
|
104
107
|
before(:all) do
|
105
|
-
@h = Hetzner::API.new
|
108
|
+
@h = Hetzner::API.new API_USERNAME, API_PASSWORD
|
106
109
|
end
|
107
110
|
|
108
111
|
it "should query the current rdns status" do
|
109
112
|
result = @h.rdns? WORKING_IP
|
113
|
+
result.response.should be_an_instance_of Net::HTTPOK
|
110
114
|
result['rdns']['ip'].should == WORKING_IP
|
111
115
|
result['rdns']['ptr'].should == TEST_PTR
|
112
116
|
end
|
113
117
|
|
114
118
|
it "should be able to set a new ptr" do
|
115
|
-
result = @h.rdns!
|
116
|
-
result
|
117
|
-
result['rdns']['
|
119
|
+
result = @h.rdns! WORKING_IP, TEST_PTR
|
120
|
+
result.response.should be_an_instance_of Net::HTTPOK
|
121
|
+
result['rdns']['ip'].should == WORKING_IP
|
122
|
+
result['rdns']['ptr'].should == TEST_PTR
|
118
123
|
end
|
119
124
|
|
120
125
|
it "should be able to remove a new ptr" do
|
121
|
-
result = @h.delete_rdns!
|
122
|
-
|
126
|
+
result = @h.delete_rdns! WORKING_IP
|
127
|
+
result.response.should be_an_instance_of Net::HTTPOK
|
123
128
|
end
|
124
129
|
end
|
125
130
|
|
126
131
|
describe "VNC" do
|
127
132
|
before(:all) do
|
128
|
-
@h = Hetzner::API.new
|
133
|
+
@h = Hetzner::API.new API_USERNAME, API_PASSWORD
|
129
134
|
end
|
130
135
|
|
131
136
|
it "should be able to query vnc boot status" do
|
132
137
|
result = @h.boot_vnc? WORKING_IP
|
138
|
+
result.response.should be_an_instance_of Net::HTTPOK
|
133
139
|
result['vnc']['server_ip'].should == WORKING_IP
|
134
140
|
result['vnc']['active'].should be_false
|
135
141
|
result['vnc']['password'].should be_nil
|
@@ -137,6 +143,7 @@ describe "VNC" do
|
|
137
143
|
|
138
144
|
it "should be able to set vnc boot status" do
|
139
145
|
result = @h.boot_vnc! WORKING_IP, 'Fedora-13', '32', 'en_US'
|
146
|
+
result.response.should be_an_instance_of Net::HTTPOK
|
140
147
|
result['vnc']['server_ip'].should == WORKING_IP
|
141
148
|
result['vnc']['active'].should be_true
|
142
149
|
result['vnc']['password'].should_not be_nil
|
@@ -144,6 +151,7 @@ describe "VNC" do
|
|
144
151
|
|
145
152
|
it "should be able to disable vnc boot status" do
|
146
153
|
result = @h.disable_boot_vnc! WORKING_IP
|
154
|
+
result.response.should be_an_instance_of Net::HTTPOK
|
147
155
|
result['vnc']['server_ip'].should == WORKING_IP
|
148
156
|
result['vnc']['active'].should be_false
|
149
157
|
result['vnc']['password'].should be_nil
|
@@ -152,16 +160,62 @@ end
|
|
152
160
|
|
153
161
|
describe "WOL" do
|
154
162
|
before(:all) do
|
155
|
-
@h = Hetzner::API.new
|
163
|
+
@h = Hetzner::API.new API_USERNAME, API_PASSWORD
|
156
164
|
end
|
157
165
|
|
158
166
|
it "should be able to query WOL status" do
|
159
167
|
result = @h.wol? WORKING_IP
|
168
|
+
result.response.should be_an_instance_of Net::HTTPOK
|
160
169
|
result['wol']['server_ip'].should == WORKING_IP
|
161
170
|
end
|
162
171
|
|
163
172
|
it "should be able to send a WOL notification" do
|
164
173
|
result = @h.wol! WORKING_IP
|
174
|
+
result.response.should be_an_instance_of Net::HTTPOK
|
165
175
|
result['wol']['server_ip'].should == WORKING_IP
|
166
176
|
end
|
167
177
|
end
|
178
|
+
|
179
|
+
describe 'IP' do
|
180
|
+
describe "information" do
|
181
|
+
before(:all) do
|
182
|
+
@h = Hetzner::API.new API_USERNAME, API_PASSWORD
|
183
|
+
end
|
184
|
+
it "should be able to display all IP addresses of the customer account" do
|
185
|
+
result = @h.ips?
|
186
|
+
result.response.should be_an_instance_of Net::HTTPOK
|
187
|
+
result.parsed_response.should have_at_least(2).entries
|
188
|
+
end
|
189
|
+
|
190
|
+
it "should be able to display a IP address of the customer account" do
|
191
|
+
result = @h.ip? WORKING_IP
|
192
|
+
result.response.should be_an_instance_of Net::HTTPOK
|
193
|
+
result.parsed_response.should have(1).entry
|
194
|
+
end
|
195
|
+
|
196
|
+
it "should be able to display all IP addresses for a given server IP address" do
|
197
|
+
result = @h.ips_for_server? WORKING_IP
|
198
|
+
result.response.should be_an_instance_of Net::HTTPOK
|
199
|
+
result.parsed_response.should have(2).entry
|
200
|
+
end
|
201
|
+
end
|
202
|
+
|
203
|
+
describe "manage traffic warnings" do
|
204
|
+
before(:all) do
|
205
|
+
@h = Hetzner::API.new API_USERNAME, API_PASSWORD
|
206
|
+
end
|
207
|
+
|
208
|
+
it "should be able to activate and set traffic warning limits on a specific IP address" do
|
209
|
+
result = @h.ip! WORKING_IP, :traffic_warnings => 'true', :traffic_monthly => TRAFFIC_LIMIT_IN_GIGABYTE
|
210
|
+
result.response.should be_an_instance_of Net::HTTPOK
|
211
|
+
result.parsed_response.should have(1).entry
|
212
|
+
end
|
213
|
+
|
214
|
+
it "should be able to deactivate traffic warnings for a specific IP address" do
|
215
|
+
result = @h.ip! WORKING_IP, :traffic_warnings => 'false'
|
216
|
+
result.response.should be_an_instance_of Net::HTTPOK
|
217
|
+
result.parsed_response.should have(1).entry
|
218
|
+
end
|
219
|
+
end
|
220
|
+
end
|
221
|
+
|
data/spec/spec_constants.rb
CHANGED
@@ -5,9 +5,11 @@ RESET_IP_NOT_AVAILABLE = '11.11.11.223'
|
|
5
5
|
RESET_IP_MANUAL_ACTIVE = '11.11.11.224'
|
6
6
|
RESET_IP_FAILED = '11.11.11.225'
|
7
7
|
|
8
|
-
TEST_PTR = ''
|
8
|
+
TEST_PTR = 'testen.de'
|
9
9
|
RDNS_TEST_IP = ''
|
10
10
|
|
11
|
+
TRAFFIC_LIMIT_IN_GIGABYTE = 2342
|
12
|
+
|
11
13
|
API_SERVER = 'robot-ws.your-server.de'
|
12
14
|
API_USERNAME = 'myusername'
|
13
15
|
API_PASSWORD = 'mycoolpassword'
|
metadata
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hetzner-api
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash: -
|
4
|
+
hash: -3702664328
|
5
5
|
prerelease: true
|
6
6
|
segments:
|
7
7
|
- 1
|
8
8
|
- 0
|
9
9
|
- 0
|
10
10
|
- alpha
|
11
|
-
-
|
12
|
-
version: 1.0.0.alpha.
|
11
|
+
- 2
|
12
|
+
version: 1.0.0.alpha.2
|
13
13
|
platform: ruby
|
14
14
|
authors:
|
15
15
|
- Roland Moriz
|
@@ -17,7 +17,7 @@ autorequire:
|
|
17
17
|
bindir: bin
|
18
18
|
cert_chain: []
|
19
19
|
|
20
|
-
date: 2010-10-
|
20
|
+
date: 2010-10-08 00:00:00 +02:00
|
21
21
|
default_executable:
|
22
22
|
dependencies:
|
23
23
|
- !ruby/object:Gem::Dependency
|
@@ -169,20 +169,40 @@ files:
|
|
169
169
|
- bin/hetzner
|
170
170
|
- cucumber.yml
|
171
171
|
- features/hetzner.feature
|
172
|
+
- features/support/env.rb
|
172
173
|
- features/support/setup.rb
|
173
174
|
- hetzner-api.gemspec
|
174
175
|
- lib/hetzner-api.rb
|
175
|
-
- lib/hetzner
|
176
|
-
- lib/hetzner
|
177
|
-
- lib/hetzner
|
178
|
-
- lib/hetzner
|
179
|
-
- lib/hetzner
|
180
|
-
- lib/hetzner
|
181
|
-
- lib/hetzner
|
182
|
-
- lib/hetzner
|
183
|
-
- lib/hetzner
|
184
|
-
- lib/hetzner
|
176
|
+
- lib/hetzner/api/boot.rb
|
177
|
+
- lib/hetzner/api/boot/plesk.rb
|
178
|
+
- lib/hetzner/api/boot/rescue.rb
|
179
|
+
- lib/hetzner/api/boot/vnc.rb
|
180
|
+
- lib/hetzner/api/boot/windows.rb
|
181
|
+
- lib/hetzner/api/cli.rb
|
182
|
+
- lib/hetzner/api/failover.rb
|
183
|
+
- lib/hetzner/api/ip.rb
|
184
|
+
- lib/hetzner/api/rdns.rb
|
185
|
+
- lib/hetzner/api/reset.rb
|
186
|
+
- lib/hetzner/api/server.rb
|
187
|
+
- lib/hetzner/api/subnet.rb
|
188
|
+
- lib/hetzner/api/traffic.rb
|
189
|
+
- lib/hetzner/api/version.rb
|
190
|
+
- lib/hetzner/api/wol.rb
|
185
191
|
- spec/api_stubs.rb
|
192
|
+
- spec/fixtures/boot/get_with_ip.raw
|
193
|
+
- spec/fixtures/boot/rescue/delete.raw
|
194
|
+
- spec/fixtures/boot/rescue/post.raw
|
195
|
+
- spec/fixtures/boot/vnc/delete.raw
|
196
|
+
- spec/fixtures/boot/vnc/get.raw
|
197
|
+
- spec/fixtures/boot/vnc/post.raw
|
198
|
+
- spec/fixtures/ip/get.raw
|
199
|
+
- spec/fixtures/ip/get_with_ip.raw
|
200
|
+
- spec/fixtures/ip/get_with_server_ip.raw
|
201
|
+
- spec/fixtures/ip/post_activate_with_data.raw
|
202
|
+
- spec/fixtures/ip/post_deactivate_with_data.raw
|
203
|
+
- spec/fixtures/rdns/delete_with_ip.raw
|
204
|
+
- spec/fixtures/rdns/get_with_ip.raw
|
205
|
+
- spec/fixtures/rdns/post_with_ip.raw
|
186
206
|
- spec/fixtures/reset/get.raw
|
187
207
|
- spec/fixtures/reset/get_with_ip.raw
|
188
208
|
- spec/fixtures/reset/get_with_ip_unavailable.raw
|
@@ -192,7 +212,9 @@ files:
|
|
192
212
|
- spec/fixtures/reset/post_with_ip_manual_active.raw
|
193
213
|
- spec/fixtures/reset/post_with_ip_unavailable.raw
|
194
214
|
- spec/fixtures/reset/post_with_ip_unknown.raw
|
195
|
-
- spec/
|
215
|
+
- spec/fixtures/wol/get.raw
|
216
|
+
- spec/fixtures/wol/post.raw
|
217
|
+
- spec/hetzner_api_spec.rb
|
196
218
|
- spec/spec_constants.rb
|
197
219
|
- spec/spec_helper.rb
|
198
220
|
has_rdoc: true
|
@@ -1,19 +0,0 @@
|
|
1
|
-
module Hetzner
|
2
|
-
class API
|
3
|
-
module Rescue
|
4
|
-
# enables the rescue systm for given IP address/server using <em>os</em> (operating system) and <em>arch</em> (architecture)
|
5
|
-
#
|
6
|
-
# see <em>boot?</em> method to query the API for available options
|
7
|
-
#
|
8
|
-
# defaults to 64bit Linux
|
9
|
-
def enable_rescue!(ip, os = 'linux', arch = '64')
|
10
|
-
perform_post "/boot/#{ip}/rescue", :query => { :os => os, :arch => arch }
|
11
|
-
end
|
12
|
-
|
13
|
-
# disables the rescue system for a given IP address/server
|
14
|
-
def disable_rescue!(ip)
|
15
|
-
perform_delete "/boot/#{ip}/rescue"
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
data/lib/hetzner-api/api/vnc.rb
DELETED
@@ -1,25 +0,0 @@
|
|
1
|
-
module Hetzner
|
2
|
-
class API
|
3
|
-
module VNC
|
4
|
-
# queries the vnc boot status of one IP address/server
|
5
|
-
def boot_vnc?(ip)
|
6
|
-
path = "/boot/#{ip}/vnc"
|
7
|
-
perform_get path
|
8
|
-
end
|
9
|
-
|
10
|
-
# enables vnc boot option for one IP address/server
|
11
|
-
#
|
12
|
-
# see <em>Boot</em> to query the API for available options
|
13
|
-
def boot_vnc!(ip, dist, arch, lang)
|
14
|
-
path = "/boot/#{ip}/vnc"
|
15
|
-
perform_post path, :query => { :dist => dist, :arch => arch, :lang => lang }
|
16
|
-
end
|
17
|
-
|
18
|
-
# disables the vnc boot status of one IP address/server
|
19
|
-
def disable_boot_vnc!(ip)
|
20
|
-
path = "/boot/#{ip}/vnc"
|
21
|
-
perform_delete path
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
@@ -1,20 +0,0 @@
|
|
1
|
-
module Hetzner
|
2
|
-
class API
|
3
|
-
module Windows
|
4
|
-
def boot_windows?(ip)
|
5
|
-
path = "/boot/#{ip}/windows"
|
6
|
-
perform_get path
|
7
|
-
end
|
8
|
-
|
9
|
-
def boot_windows!(ip, lan)
|
10
|
-
path = "/boot/#{ip}/windows"
|
11
|
-
perform_post path, :query => { :lang => lang }
|
12
|
-
end
|
13
|
-
|
14
|
-
def disable_boot_windows!(ip)
|
15
|
-
path = "/boot/#{ip}/windows"
|
16
|
-
perform_delete path
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|