fog-hetznercloud 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (62) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +4 -0
  3. data/LICENSE +201 -0
  4. data/README.md +139 -0
  5. data/Rakefile +24 -0
  6. data/bin/console +14 -0
  7. data/bin/setup +8 -0
  8. data/fog-hetznercloud.gemspec +33 -0
  9. data/lib/fog/hetznercloud.rb +13 -0
  10. data/lib/fog/hetznercloud/client.rb +55 -0
  11. data/lib/fog/hetznercloud/compute.rb +146 -0
  12. data/lib/fog/hetznercloud/errors.rb +37 -0
  13. data/lib/fog/hetznercloud/models/compute/action.rb +31 -0
  14. data/lib/fog/hetznercloud/models/compute/actions.rb +22 -0
  15. data/lib/fog/hetznercloud/models/compute/datacenter.rb +15 -0
  16. data/lib/fog/hetznercloud/models/compute/datacenters.rb +22 -0
  17. data/lib/fog/hetznercloud/models/compute/floating_ip.rb +154 -0
  18. data/lib/fog/hetznercloud/models/compute/floating_ips.rb +22 -0
  19. data/lib/fog/hetznercloud/models/compute/image.rb +78 -0
  20. data/lib/fog/hetznercloud/models/compute/images.rb +22 -0
  21. data/lib/fog/hetznercloud/models/compute/location.rb +18 -0
  22. data/lib/fog/hetznercloud/models/compute/locations.rb +22 -0
  23. data/lib/fog/hetznercloud/models/compute/server.rb +393 -0
  24. data/lib/fog/hetznercloud/models/compute/server_type.rb +17 -0
  25. data/lib/fog/hetznercloud/models/compute/server_types.rb +22 -0
  26. data/lib/fog/hetznercloud/models/compute/servers.rb +47 -0
  27. data/lib/fog/hetznercloud/models/compute/ssh_key.rb +65 -0
  28. data/lib/fog/hetznercloud/models/compute/ssh_keys.rb +22 -0
  29. data/lib/fog/hetznercloud/request_helper.rb +32 -0
  30. data/lib/fog/hetznercloud/requests/compute/create_floating_ip.rb +29 -0
  31. data/lib/fog/hetznercloud/requests/compute/create_server.rb +31 -0
  32. data/lib/fog/hetznercloud/requests/compute/create_ssh_key.rb +24 -0
  33. data/lib/fog/hetznercloud/requests/compute/delete_floating_ip.rb +17 -0
  34. data/lib/fog/hetznercloud/requests/compute/delete_image.rb +17 -0
  35. data/lib/fog/hetznercloud/requests/compute/delete_server.rb +17 -0
  36. data/lib/fog/hetznercloud/requests/compute/delete_ssh_key.rb +17 -0
  37. data/lib/fog/hetznercloud/requests/compute/execute_server_action.rb +17 -0
  38. data/lib/fog/hetznercloud/requests/compute/floating_ip_assign_to_server.rb +17 -0
  39. data/lib/fog/hetznercloud/requests/compute/floating_ip_unassign.rb +17 -0
  40. data/lib/fog/hetznercloud/requests/compute/floating_ip_update_dns_ptr.rb +17 -0
  41. data/lib/fog/hetznercloud/requests/compute/get_action.rb +17 -0
  42. data/lib/fog/hetznercloud/requests/compute/get_datacenter.rb +17 -0
  43. data/lib/fog/hetznercloud/requests/compute/get_floating_ip.rb +17 -0
  44. data/lib/fog/hetznercloud/requests/compute/get_image.rb +17 -0
  45. data/lib/fog/hetznercloud/requests/compute/get_location.rb +17 -0
  46. data/lib/fog/hetznercloud/requests/compute/get_server.rb +17 -0
  47. data/lib/fog/hetznercloud/requests/compute/get_server_type.rb +17 -0
  48. data/lib/fog/hetznercloud/requests/compute/get_ssh_key.rb +17 -0
  49. data/lib/fog/hetznercloud/requests/compute/list_actions.rb +17 -0
  50. data/lib/fog/hetznercloud/requests/compute/list_datacenters.rb +17 -0
  51. data/lib/fog/hetznercloud/requests/compute/list_floating_ips.rb +17 -0
  52. data/lib/fog/hetznercloud/requests/compute/list_images.rb +17 -0
  53. data/lib/fog/hetznercloud/requests/compute/list_locations.rb +17 -0
  54. data/lib/fog/hetznercloud/requests/compute/list_server_types.rb +17 -0
  55. data/lib/fog/hetznercloud/requests/compute/list_servers.rb +17 -0
  56. data/lib/fog/hetznercloud/requests/compute/list_ssh_keys.rb +17 -0
  57. data/lib/fog/hetznercloud/requests/compute/update_floating_ip.rb +17 -0
  58. data/lib/fog/hetznercloud/requests/compute/update_image.rb +17 -0
  59. data/lib/fog/hetznercloud/requests/compute/update_server.rb +77 -0
  60. data/lib/fog/hetznercloud/requests/compute/update_ssh_key.rb +17 -0
  61. data/lib/fog/hetznercloud/version.rb +5 -0
  62. metadata +244 -0
@@ -0,0 +1,17 @@
1
+ module Fog
2
+ module Hetznercloud
3
+ class Compute
4
+ class ServerType < Fog::Model
5
+ identity :id
6
+
7
+ attribute :name
8
+ attribute :description
9
+ attribute :cores
10
+ attribute :memory
11
+ attribute :disk
12
+ attribute :prices
13
+ attribute :storage_type
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,22 @@
1
+ module Fog
2
+ module Hetznercloud
3
+ class Compute
4
+ class ServerTypes < Fog::Collection
5
+ model Fog::Hetznercloud::Compute::ServerType
6
+
7
+ def all(filters = {})
8
+ server_types = service.list_server_types(filters).body['server_types'] || []
9
+ load(server_types)
10
+ end
11
+
12
+ def get(identity)
13
+ if (server_type = service.get_server_type(identity).body['server_type'])
14
+ new(server_type)
15
+ end
16
+ rescue Fog::Hetznercloud::Compute::UnknownResourceError
17
+ nil
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,47 @@
1
+ module Fog
2
+ module Hetznercloud
3
+ class Compute
4
+ class Servers < Fog::Collection
5
+ model Fog::Hetznercloud::Compute::Server
6
+
7
+ def all(filters = {})
8
+ servers = service.list_servers(filters).body['servers'] || []
9
+ load(servers)
10
+ end
11
+
12
+ def get(identity)
13
+ if (server = service.get_server(identity).body['server'])
14
+ new(server)
15
+ end
16
+ rescue Fog::Hetznercloud::Compute::UnknownResourceError
17
+ nil
18
+ end
19
+
20
+ def bootstrap(bootstap_timeout: 120, new_attributes: {}, ssh_keys:)
21
+ require 'securerandom'
22
+
23
+ defaults = {
24
+ name: "hc-#{SecureRandom.hex(3)}",
25
+ image: 'centos-7',
26
+ server_type: 'cx11',
27
+ ssh_keys: ssh_keys
28
+ }
29
+
30
+ server = create(defaults.merge(new_attributes))
31
+
32
+ status = false
33
+ begin
34
+ status = Timeout.timeout(bootstap_timeout) do
35
+ server.wait_for { sshable?(auth_methods: %w[publickey]) }
36
+ end
37
+ rescue Timeout::Error => e
38
+ server.destroy
39
+ raise e
40
+ end
41
+
42
+ server
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,65 @@
1
+ # https://docs.hetzner.cloud/#resources-actions-get
2
+ module Fog
3
+ module Hetznercloud
4
+ class Compute
5
+ class SshKey < Fog::Model
6
+ identity :id
7
+
8
+ attribute :name
9
+ attribute :fingerprint
10
+ attribute :public_key
11
+
12
+ def destroy
13
+ requires :identity
14
+
15
+ service.delete_ssh_key(identity)
16
+ true
17
+ end
18
+
19
+ def public_key=(value)
20
+ attributes[:public_key] = if value =~ /^\.?\/[^\/]+/
21
+ File.read(value)
22
+ else
23
+ value
24
+ end
25
+ end
26
+
27
+ def save
28
+ if persisted?
29
+ update
30
+ else
31
+ create
32
+ end
33
+ end
34
+
35
+ private
36
+
37
+ def create
38
+ requires :name, :public_key
39
+
40
+ if (ssh_key = service.create_ssh_key(name, public_key).body['ssh_key'])
41
+ merge_attributes(ssh_key)
42
+ true
43
+ else
44
+ false
45
+ end
46
+ end
47
+
48
+ def update
49
+ requires :identity, :name
50
+
51
+ body = attributes.dup
52
+
53
+ body[:name] = name
54
+
55
+ if (ssh_key = service.update_ssh_key(identity, body).body['ssh_key'])
56
+ merge_attributes(ssh_key)
57
+ true
58
+ else
59
+ false
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,22 @@
1
+ module Fog
2
+ module Hetznercloud
3
+ class Compute
4
+ class SshKeys < Fog::Collection
5
+ model Fog::Hetznercloud::Compute::SshKey
6
+
7
+ def all(filters = {})
8
+ ssh_keys = service.list_ssh_keys(filters).body['ssh_keys'] || []
9
+ load(ssh_keys)
10
+ end
11
+
12
+ def get(identity)
13
+ if (ssh_key = service.get_ssh_key(identity).body['ssh_key'])
14
+ new(ssh_key)
15
+ end
16
+ rescue Fog::Hetznercloud::Compute::UnknownResourceError
17
+ nil
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,32 @@
1
+ module Fog
2
+ module Hetznercloud
3
+ module RequestHelper
4
+ def create(path, body)
5
+ request(method: :post,
6
+ path: "/v1#{path}",
7
+ body: body,
8
+ expects: [201])
9
+ end
10
+
11
+ def get(path, query = {})
12
+ request(method: :get,
13
+ path: "/v1#{path}",
14
+ query: query,
15
+ expects: [200])
16
+ end
17
+
18
+ def update(path, body)
19
+ request(method: :put,
20
+ path: "/v1#{path}",
21
+ body: body,
22
+ expects: [200])
23
+ end
24
+
25
+ def delete(path)
26
+ request(method: :delete,
27
+ path: "/v1#{path}",
28
+ expects: [200, 204])
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,29 @@
1
+ module Fog
2
+ module Hetznercloud
3
+ class Compute
4
+ class Real
5
+ def create_floating_ip(type, options = {})
6
+ body = {
7
+ type: type
8
+ }
9
+
10
+ # if !@datacenter.nil?
11
+ # body.merge!({datacenter: @datacenter})
12
+ # elsif !@location.nil?
13
+ # body.merge!({location: @location})
14
+ # end
15
+
16
+ body.merge!(options)
17
+
18
+ create('/floating_ips', body)
19
+ end
20
+ end
21
+
22
+ class Mock
23
+ def create_floating_ip(_type, _options = {})
24
+ Fog::Mock.not_implemented
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,31 @@
1
+ module Fog
2
+ module Hetznercloud
3
+ class Compute
4
+ class Real
5
+ def create_server(name, image, server_type, options = {})
6
+ body = {
7
+ name: name,
8
+ image: image,
9
+ server_type: server_type
10
+ }
11
+
12
+ # if !@datacenter.nil?
13
+ # body.merge!({datacenter: @datacenter})
14
+ # elsif !@location.nil?
15
+ # body.merge!({location: @location})
16
+ # end
17
+
18
+ body.merge!(options)
19
+
20
+ create('/servers', body)
21
+ end
22
+ end
23
+
24
+ class Mock
25
+ def create_server(_name, _image, _volumes, _options = {})
26
+ Fog::Mock.not_implemented
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,24 @@
1
+ module Fog
2
+ module Hetznercloud
3
+ class Compute
4
+ class Real
5
+ def create_ssh_key(name, public_key, options = {})
6
+ body = {
7
+ name: name,
8
+ public_key: public_key
9
+ }
10
+
11
+ body.merge!(options)
12
+
13
+ create('/ssh_keys', body)
14
+ end
15
+ end
16
+
17
+ class Mock
18
+ def create_ssh_key(_type, _home_location, _server, _options = {})
19
+ Fog::Mock.not_implemented
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,17 @@
1
+ module Fog
2
+ module Hetznercloud
3
+ class Compute
4
+ class Real
5
+ def delete_floating_ip(id)
6
+ delete("/floating_ips/#{id}")
7
+ end
8
+ end
9
+
10
+ class Mock
11
+ def delete_floating_ip(_id)
12
+ Fog::Mock.not_implemented
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ module Fog
2
+ module Hetznercloud
3
+ class Compute
4
+ class Real
5
+ def delete_image(id)
6
+ delete("/images/#{id}")
7
+ end
8
+ end
9
+
10
+ class Mock
11
+ def delete_image(_id)
12
+ Fog::Mock.not_implemented
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ module Fog
2
+ module Hetznercloud
3
+ class Compute
4
+ class Real
5
+ def delete_server(server_id)
6
+ delete("/servers/#{server_id}")
7
+ end
8
+ end
9
+
10
+ class Mock
11
+ def delete_server(_server_id)
12
+ Fog::Mock.not_implemented
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ module Fog
2
+ module Hetznercloud
3
+ class Compute
4
+ class Real
5
+ def delete_ssh_key(id)
6
+ delete("/ssh_keys/#{id}")
7
+ end
8
+ end
9
+
10
+ class Mock
11
+ def delete_ssh_key(_id)
12
+ Fog::Mock.not_implemented
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ module Fog
2
+ module Hetznercloud
3
+ class Compute
4
+ class Real
5
+ def execute_server_action(id, action, body = {})
6
+ create("/servers/#{id}/actions/#{action}", body)
7
+ end
8
+ end
9
+
10
+ class Mock
11
+ def execute_server_action(_id, _action)
12
+ Fog::Mock.not_implemented
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ module Fog
2
+ module Hetznercloud
3
+ class Compute
4
+ class Real
5
+ def floating_ip_assign_to_server(id, body)
6
+ create("/floating_ips/#{id}/actions/assign", body)
7
+ end
8
+ end
9
+
10
+ class Mock
11
+ def floating_ip_assign_to_server(_type, _body)
12
+ Fog::Mock.not_implemented
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ module Fog
2
+ module Hetznercloud
3
+ class Compute
4
+ class Real
5
+ def floating_ip_unassign(id, body)
6
+ create("/floating_ips/#{id}/actions/unassign", body)
7
+ end
8
+ end
9
+
10
+ class Mock
11
+ def floating_ip_unassign(_type, _body)
12
+ Fog::Mock.not_implemented
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ module Fog
2
+ module Hetznercloud
3
+ class Compute
4
+ class Real
5
+ def floating_ip_update_dns_ptr(id, body)
6
+ create("/floating_ips/#{id}/actions/change_dns_ptr", body)
7
+ end
8
+ end
9
+
10
+ class Mock
11
+ def floating_ip_update_dns_ptr(_type, _body)
12
+ Fog::Mock.not_implemented
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end