fog-hetznercloud 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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