hetznercloud 1.3.1 → 1.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +27 -6
  3. data/Gemfile +13 -0
  4. data/LICENSE.md +1 -1
  5. data/README.md +76 -30
  6. data/config/inflections.rb +6 -0
  7. data/lib/hcloud/client.rb +4 -3
  8. data/lib/hcloud/collection.rb +4 -2
  9. data/lib/hcloud/concerns/concerns.rb +4 -0
  10. data/lib/hcloud/concerns/creatable.rb +2 -0
  11. data/lib/hcloud/concerns/deletable.rb +2 -0
  12. data/lib/hcloud/concerns/labelable.rb +11 -0
  13. data/lib/hcloud/concerns/queryable.rb +2 -0
  14. data/lib/hcloud/concerns/updatable.rb +5 -1
  15. data/lib/hcloud/entities/primary_ip_prices.rb +8 -0
  16. data/lib/hcloud/entities/private_network.rb +15 -0
  17. data/lib/hcloud/entities/protection.rb +0 -2
  18. data/lib/hcloud/entities/server_protection.rb +11 -0
  19. data/lib/hcloud/errors.rb +8 -0
  20. data/lib/hcloud/http.rb +4 -2
  21. data/lib/hcloud/resource_type.rb +33 -2
  22. data/lib/hcloud/resources/action.rb +5 -6
  23. data/lib/hcloud/resources/certificate.rb +8 -6
  24. data/lib/hcloud/resources/datacenter.rb +1 -1
  25. data/lib/hcloud/resources/firewall.rb +7 -5
  26. data/lib/hcloud/resources/floating_ip.rb +7 -5
  27. data/lib/hcloud/resources/image.rb +6 -7
  28. data/lib/hcloud/resources/iso.rb +1 -1
  29. data/lib/hcloud/resources/load_balancer.rb +7 -5
  30. data/lib/hcloud/resources/load_balancer_type.rb +1 -1
  31. data/lib/hcloud/resources/location.rb +1 -1
  32. data/lib/hcloud/resources/metadata.rb +33 -0
  33. data/lib/hcloud/resources/network.rb +5 -3
  34. data/lib/hcloud/resources/placement_group.rb +7 -5
  35. data/lib/hcloud/resources/pricing.rb +2 -0
  36. data/lib/hcloud/resources/primary_ip.rb +150 -0
  37. data/lib/hcloud/resources/server.rb +9 -7
  38. data/lib/hcloud/resources/server_type.rb +1 -1
  39. data/lib/hcloud/resources/ssh_key.rb +8 -6
  40. data/lib/hcloud/resources/volume.rb +8 -6
  41. data/lib/hcloud/version.rb +2 -2
  42. data/lib/hcloud.rb +1 -1
  43. data/lib/http/mime_type/yaml.rb +23 -0
  44. data/lib/http/rate_limiter.rb +40 -0
  45. metadata +11 -129
@@ -11,15 +11,18 @@ module HCloud
11
11
  #
12
12
  # == Sort firewalls
13
13
  #
14
- # HCloud::Firewall.all.sort(name: :desc)
14
+ # HCloud::Firewall.sort(name: :desc)
15
15
  # # => [#<HCloud::Firewall id: 1, ...>, ...]
16
16
  #
17
- # HCloud::Firewall.all.sort(:id, name: :asc)
17
+ # HCloud::Firewall.sort(:id, name: :asc)
18
18
  # # => [#<HCloud::Firewall id: 1, ...>, ...]
19
19
  #
20
20
  # == Search firewalls
21
21
  #
22
- # HCloud::Firewall.all.where(name: "my_firewall")
22
+ # HCloud::Firewall.where(name: "my_firewall")
23
+ # # => #<HCloud::Firewall id: 1, ...>
24
+ #
25
+ # HCloud::Firewall.where(label_selector: { environment: "production" })
23
26
  # # => #<HCloud::Firewall id: 1, ...>
24
27
  #
25
28
  # == Find firewall by ID
@@ -107,6 +110,7 @@ module HCloud
107
110
  creatable
108
111
  updatable
109
112
  deletable
113
+ labelable
110
114
 
111
115
  attribute :id, :integer
112
116
  attribute :name
@@ -117,8 +121,6 @@ module HCloud
117
121
 
118
122
  attribute :rules, :rule, array: true, default: -> { [] }
119
123
 
120
- attribute :labels, default: -> { {} }
121
-
122
124
  action :apply_to_resources
123
125
  action :remove_from_resources
124
126
  action :set_rules
@@ -11,15 +11,18 @@ module HCloud
11
11
  #
12
12
  # == Sort floating IPs
13
13
  #
14
- # HCloud::FloatingIP.all.sort(id: :asc)
14
+ # HCloud::FloatingIP.sort(id: :asc)
15
15
  # # => [#<HCloud::FloatingIP id: 1, ...>, ...]
16
16
  #
17
- # HCloud::FloatingIP.all.sort(:id, created: :asc)
17
+ # HCloud::FloatingIP.sort(:id, created: :asc)
18
18
  # # => [#<HCloud::FloatingIP id: 1, ...>, ...]
19
19
  #
20
20
  # == Search floating IPs
21
21
  #
22
- # HCloud::FloatingIP.all.where(name: "my_floating_ip")
22
+ # HCloud::FloatingIP.where(name: "my_floating_ip")
23
+ # # => #<HCloud::FloatingIP id: 1, ...>
24
+ #
25
+ # HCloud::FloatingIP.where(label_selector: { environment: "production" })
23
26
  # # => #<HCloud::FloatingIP id: 1, ...>
24
27
  #
25
28
  # == Find floating IP by ID
@@ -104,6 +107,7 @@ module HCloud
104
107
  creatable
105
108
  updatable
106
109
  deletable
110
+ labelable
107
111
 
108
112
  attribute :id, :integer
109
113
  attribute :name
@@ -121,8 +125,6 @@ module HCloud
121
125
 
122
126
  attribute :server, :server
123
127
 
124
- attribute :labels, default: -> { {} }
125
-
126
128
  alias blocked? blocked
127
129
 
128
130
  action :assign
@@ -11,21 +11,21 @@ module HCloud
11
11
  #
12
12
  # == Sort images
13
13
  #
14
- # HCloud::Image.all.sort(name: :desc)
14
+ # HCloud::Image.sort(name: :desc)
15
15
  # # => [#<HCloud::Image id: 1, ...>, ...]
16
16
  #
17
- # HCloud::Image.all.sort(:id, name: :asc)
17
+ # HCloud::Image.sort(:id, name: :asc)
18
18
  # # => [#<HCloud::Image id: 1, ...>, ...]
19
19
  #
20
20
  # == Search images
21
21
  #
22
- # HCloud::Image.all.where(name: "my_image")
22
+ # HCloud::Image.where(name: "my_image")
23
23
  # # => #<HCloud::Image id: 1, ...>
24
24
  #
25
- # HCloud::Image.all.where(status: "available", include_deprecated: false)
25
+ # HCloud::Image.where(status: "available", include_deprecated: false)
26
26
  # # => #<HCloud::Image id: 1, ...>
27
27
  #
28
- # HCloud::Image.all.where(type: "backup", bound_to: 1)
28
+ # HCloud::Image.where(type: "backup", bound_to: 1)
29
29
  # # => #<HCloud::Image id: 1, ...>
30
30
  #
31
31
  # == Find image by ID
@@ -85,6 +85,7 @@ module HCloud
85
85
  queryable
86
86
  updatable
87
87
  deletable
88
+ labelable
88
89
 
89
90
  attribute :id, :integer
90
91
  attribute :name
@@ -113,8 +114,6 @@ module HCloud
113
114
 
114
115
  attribute :rapid_deploy
115
116
 
116
- attribute :labels, default: -> { {} }
117
-
118
117
  action :change_protection
119
118
 
120
119
  def created?
@@ -11,7 +11,7 @@ module HCloud
11
11
  #
12
12
  # == Search ISOs
13
13
  #
14
- # HCloud::ISO.all.where(name: "debian-10.10.0-amd64-netinst.iso")
14
+ # HCloud::ISO.where(name: "debian-10.10.0-amd64-netinst.iso")
15
15
  # # => #<HCloud::ISO id: 7631, ...>
16
16
  #
17
17
  # == Find ISO by ID
@@ -11,15 +11,18 @@ module HCloud
11
11
  #
12
12
  # == Sort load balancers
13
13
  #
14
- # HCloud::LoadBalancer.all.sort(name: :desc)
14
+ # HCloud::LoadBalancer.sort(name: :desc)
15
15
  # # => [#<HCloud::LoadBalancer id: 1, ...>, ...]
16
16
  #
17
- # HCloud::LoadBalancer.all.sort(:id, name: :asc)
17
+ # HCloud::LoadBalancer.sort(:id, name: :asc)
18
18
  # # => [#<HCloud::LoadBalancer id: 1, ...>, ...]
19
19
  #
20
20
  # == Search load balancers
21
21
  #
22
- # HCloud::LoadBalancer.all.where(name: "my_load_balancer")
22
+ # HCloud::LoadBalancer.where(name: "my_load_balancer")
23
+ # # => #<HCloud::LoadBalancer id: 1, ...>
24
+ #
25
+ # HCloud::LoadBalancer.where(label_selector: { environment: "production" })
23
26
  # # => #<HCloud::LoadBalancer id: 1, ...>
24
27
  #
25
28
  # == Find load balancer by ID
@@ -65,6 +68,7 @@ module HCloud
65
68
  updatable
66
69
  deletable
67
70
  meterable
71
+ labelable
68
72
 
69
73
  attribute :id, :integer
70
74
  attribute :name
@@ -94,8 +98,6 @@ module HCloud
94
98
 
95
99
  attribute :protection, :protection
96
100
 
97
- attribute :labels, default: -> { {} }
98
-
99
101
  def creatable_attributes
100
102
  [:name, :labels, :algorithm, :network_zone, :public_interface, :services, :targets, load_balancer_type: [:id, :name], location: [:id, :name], network: [:id, :name]]
101
103
  end
@@ -11,7 +11,7 @@ module HCloud
11
11
  #
12
12
  # == Search load balancer types
13
13
  #
14
- # HCloud::LoadBalancerType.all.where(name: "cx11")
14
+ # HCloud::LoadBalancerType.where(name: "cx11")
15
15
  # # => #<HCloud::LoadBalancerType id: 1, ...>
16
16
  #
17
17
  # == Find load balancer type by ID
@@ -11,7 +11,7 @@ module HCloud
11
11
  #
12
12
  # == Search locations
13
13
  #
14
- # HCloud::Location.all.where(name: "fsn1")
14
+ # HCloud::Location.where(name: "fsn1")
15
15
  # # => #<HCloud::Location id: 1, ...>
16
16
  #
17
17
  # == Find location by ID
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module HCloud
4
+ ##
5
+ # Server metadata.
6
+ #
7
+ # This resource allows a Hetzner server to retrieve metadata about itself.
8
+ # It cannot be used outside of Hetzner servers.
9
+ #
10
+ # == Find metadata
11
+ #
12
+ # HCloud::Metadata.find
13
+ # # => #<HCloud::Metadata ...>
14
+ #
15
+ class Metadata < Resource
16
+ ENDPOINT = "https://169.254.169.254/hetzner/v1/metadata"
17
+
18
+ attribute :hostname
19
+ attribute :instance_id, :integer
20
+ attribute :public_ipv4
21
+ attribute :availability_zone
22
+ attribute :region
23
+
24
+ attribute :private_networks, :private_network, array: true, default: -> { [] }
25
+
26
+ def self.find
27
+ new(::HTTP
28
+ .get(ENDPOINT)
29
+ .parse(:yaml)
30
+ .deep_transform_keys { |key| key.underscore.to_sym })
31
+ end
32
+ end
33
+ end
@@ -11,7 +11,10 @@ module HCloud
11
11
  #
12
12
  # == Search networks
13
13
  #
14
- # HCloud::Network.all.where(name: "my_network")
14
+ # HCloud::Network.where(name: "my_network")
15
+ # # => #<HCloud::Network id: 1, ...>
16
+ #
17
+ # HCloud::Network.where(label_selector: { environment: "production" })
15
18
  # # => #<HCloud::Network id: 1, ...>
16
19
  #
17
20
  # == Find network by ID
@@ -106,6 +109,7 @@ module HCloud
106
109
  creatable
107
110
  updatable
108
111
  deletable
112
+ labelable
109
113
 
110
114
  attribute :id, :integer
111
115
  attribute :name
@@ -121,8 +125,6 @@ module HCloud
121
125
 
122
126
  attribute :protection, :protection
123
127
 
124
- attribute :labels, default: -> { {} }
125
-
126
128
  action :change_protection
127
129
 
128
130
  action :add_route
@@ -11,15 +11,18 @@ module HCloud
11
11
  #
12
12
  # == Sort placement groups
13
13
  #
14
- # HCloud::PlacementGroup.all.sort(name: :desc)
14
+ # HCloud::PlacementGroup.sort(name: :desc)
15
15
  # # => [#<HCloud::PlacementGroup id: 1, ...>, ...]
16
16
  #
17
- # HCloud::PlacementGroup.all.sort(:id, name: :asc)
17
+ # HCloud::PlacementGroup.sort(:id, name: :asc)
18
18
  # # => [#<HCloud::PlacementGroup id: 1, ...>, ...]
19
19
  #
20
20
  # == Search placement groups
21
21
  #
22
- # HCloud::PlacementGroup.all.where(name: "my_placement_group")
22
+ # HCloud::PlacementGroup.where(name: "my_placement_group")
23
+ # # => #<HCloud::PlacementGroup id: 2, ...>
24
+ #
25
+ # HCloud::PlacementGroup.where(label_selector: { environment: "production" })
23
26
  # # => #<HCloud::PlacementGroup id: 2, ...>
24
27
  #
25
28
  # == Find placement group by ID
@@ -55,6 +58,7 @@ module HCloud
55
58
  creatable
56
59
  updatable
57
60
  deletable
61
+ labelable
58
62
 
59
63
  attribute :id, :integer
60
64
  attribute :name
@@ -62,8 +66,6 @@ module HCloud
62
66
 
63
67
  attribute :servers, :server, array: true, default: -> { [] }
64
68
 
65
- attribute :labels, default: -> { {} }
66
-
67
69
  def creatable_attributes
68
70
  [:name, :type, :labels]
69
71
  end
@@ -21,6 +21,8 @@ module HCloud
21
21
 
22
22
  attribute :load_balancer_types, :load_balancer_type_price, array: true, default: -> { [] }
23
23
 
24
+ attribute :primary_ips, :primary_ip_prices, array: true, default: -> { [] }
25
+
24
26
  attribute :server_backup, :server_backup_price
25
27
 
26
28
  attribute :server_types, :server_type_price, array: true, default: -> { [] }
@@ -0,0 +1,150 @@
1
+ # frozen_string_literal: true
2
+
3
+ module HCloud
4
+ ##
5
+ # Represents a primary IP
6
+ #
7
+ # == List all primary IPs
8
+ #
9
+ # HCloud::PrimaryIP.all
10
+ # # => [#<HCloud::PrimaryIP id: 1, ...>, ...]
11
+ #
12
+ # == Sort primary IPs
13
+ #
14
+ # HCloud::PrimaryIP.sort(id: :asc)
15
+ # # => [#<HCloud::PrimaryIP id: 1, ...>, ...]
16
+ #
17
+ # HCloud::PrimaryIP.sort(:id, created: :asc)
18
+ # # => [#<HCloud::PrimaryIP id: 1, ...>, ...]
19
+ #
20
+ # == Search primary IPs
21
+ #
22
+ # HCloud::PrimaryIP.where(name: "my_primary_ip")
23
+ # # => #<HCloud::PrimaryIP id: 1, ...>
24
+ #
25
+ # HCloud::PrimaryIP.where(ip: "1.2.3.4")
26
+ # # => #<HCloud::PrimaryIP id: 1, ...>
27
+ #
28
+ # HCloud::PrimaryIP.where(label_selector: { environment: "production" })
29
+ # # => #<HCloud::PrimaryIP id: 1, ...>
30
+ #
31
+ # == Find primary IP by ID
32
+ #
33
+ # HCloud::PrimaryIP.find(1)
34
+ # # => #<HCloud::PrimaryIP id: 1, ...>
35
+ #
36
+ # == Create primary IP
37
+ #
38
+ # primary IP = HCloud::PrimaryIP.new(name: "my_primary_ip", type: "ipv4", datacenter: "fsn1-dc8")
39
+ # primary IP.create
40
+ # primary IP.created?
41
+ # # => true
42
+ #
43
+ # firewall = HCloud::PrimaryIP.create(name: "my_primary_ip")
44
+ # # => #<HCloud::PrimaryIP id: 1, ...>
45
+ #
46
+ # == Update primary IP
47
+ #
48
+ # primary IP = HCloud::PrimaryIP.find(1)
49
+ # primary IP.name = "another_primary_ip"
50
+ # primary IP.update
51
+ #
52
+ # == Delete primary IP
53
+ #
54
+ # primary IP = HCloud::PrimaryIP.find(1)
55
+ # primary IP.delete
56
+ # primary IP.deleted?
57
+ # # => true
58
+ #
59
+ # = Actions
60
+ # == List actions
61
+ #
62
+ # actions = HCloud::PrimaryIP.find(1).actions
63
+ # # => [#<HCloud::Action id: 1, ...>, ...]
64
+ #
65
+ # == Sort actions
66
+ #
67
+ # HCloud::PrimaryIP.find(1).actions.sort(finished: :desc)
68
+ # # => [#<HCloud::Action id: 1, ...>, ...]
69
+ #
70
+ # HCloud::PrimaryIP.find(1).actions.sort(:command, finished: :asc)
71
+ # # => [#<HCloud::Actions id: 1, ...>, ...]
72
+ #
73
+ # == Search actions
74
+ #
75
+ # HCloud::PrimaryIP.find(1).actions.where(command: "assign_primary_ip")
76
+ # # => #<HCloud::Action id: 1, ...>
77
+ #
78
+ # HCloud::PrimaryIP.find(1).actions.where(status: "success")
79
+ # # => #<HCloud::Action id: 1, ...>
80
+ #
81
+ # == Find action by ID
82
+ #
83
+ # HCloud::PrimaryIP.find(1).actions.find(1)
84
+ # # => #<HCloud::Action id: 1, ...>
85
+ #
86
+ # = Resource-specific actions
87
+ # == Assign a primary IP to a server
88
+ #
89
+ # HCloud::PrimaryIP.find(1).assign(assignee_id: 1, assignee_type: "server")
90
+ # # => #<HCloud::Action id: 1, ...>
91
+ #
92
+ # == Unassign a primary IP from a server
93
+ #
94
+ # HCloud::PrimaryIP.find(1).unassign
95
+ # # => #<HCloud::Action id: 1, ...>
96
+ #
97
+ # == Change reverse DNS entry
98
+ #
99
+ # HCloud::PrimaryIP.find(1).change_dns_ptr(dns_ptr: "server.example.com", ip: "1.2.3.4")
100
+ # # => #<HCloud::Action id: 1, ...>
101
+ #
102
+ # == Change protection
103
+ #
104
+ # HCloud::PrimaryIP.find(1).change_protection(delete: true)
105
+ # # => #<HCloud::Action id: 1, ...>
106
+ #
107
+ class PrimaryIP < Resource
108
+ actionable
109
+ queryable
110
+ creatable
111
+ updatable
112
+ deletable
113
+ labelable
114
+
115
+ attribute :id, :integer
116
+ attribute :name
117
+
118
+ attribute :type
119
+ attribute :ip
120
+ attribute :dns_ptr, :dns_pointer, array: true, default: -> { [] }
121
+
122
+ attribute :assignee_id
123
+ attribute :assignee_type, default: "server"
124
+
125
+ attribute :auto_delete, :boolean
126
+ attribute :blocked, :boolean
127
+
128
+ attribute :datacenter, :datacenter
129
+
130
+ attribute :protection, :protection
131
+
132
+ alias auto_delete? auto_delete
133
+ alias blocked? blocked
134
+
135
+ action :assign
136
+ action :unassign
137
+
138
+ action :change_dns_ptr
139
+
140
+ action :change_protection
141
+
142
+ def creatable_attributes
143
+ [:name, :type, :assignee_id, :assignee_type, :auto_delete, :labels, datacenter: [:id, :name]]
144
+ end
145
+
146
+ def updatable_attributes
147
+ [:name, :auto_delete, :labels]
148
+ end
149
+ end
150
+ end
@@ -11,18 +11,21 @@ module HCloud
11
11
  #
12
12
  # == Sort servers
13
13
  #
14
- # HCloud::Server.all.sort(name: :desc)
14
+ # HCloud::Server.sort(name: :desc)
15
15
  # # => [#<HCloud::Server id: 1, ...>, ...]
16
16
  #
17
- # HCloud::Server.all.sort(:id, name: :asc)
17
+ # HCloud::Server.sort(:id, name: :asc)
18
18
  # # => [#<HCloud::Server id: 1, ...>, ...]
19
19
  #
20
20
  # == Search servers
21
21
  #
22
- # HCloud::Server.all.where(name: "my_server")
22
+ # HCloud::Server.where(name: "my_server")
23
23
  # # => #<HCloud::Server id: 1, ...>
24
24
  #
25
- # HCloud::Server.all.where(status: "running")
25
+ # HCloud::Server.where(status: "running")
26
+ # # => #<HCloud::Server id: 1, ...>
27
+ #
28
+ # HCloud::Server.where(label_selector: { environment: "production" })
26
29
  # # => #<HCloud::Server id: 1, ...>
27
30
  #
28
31
  # == Find server by ID
@@ -72,6 +75,7 @@ module HCloud
72
75
  updatable
73
76
  deletable
74
77
  meterable
78
+ labelable
75
79
 
76
80
  attribute :id, :integer
77
81
  attribute :name
@@ -107,7 +111,7 @@ module HCloud
107
111
 
108
112
  attribute :primary_disk_size, :integer
109
113
 
110
- attribute :protection, :protection
114
+ attribute :protection, :server_protection
111
115
 
112
116
  attribute :image, :image
113
117
 
@@ -118,8 +122,6 @@ module HCloud
118
122
 
119
123
  attribute :iso, :iso
120
124
 
121
- attribute :labels, default: -> { {} }
122
-
123
125
  attribute :load_balancers, :load_balancer, array: true, default: -> { [] }
124
126
 
125
127
  attribute :volumes, :volume, array: true, default: -> { [] }
@@ -11,7 +11,7 @@ module HCloud
11
11
  #
12
12
  # == Search server types
13
13
  #
14
- # HCloud::ServerType.all.where(name: "cx11")
14
+ # HCloud::ServerType.where(name: "cx11")
15
15
  # # => #<HCloud::ServerType id: 1, ...>
16
16
  #
17
17
  # == Find server type by ID
@@ -11,18 +11,21 @@ module HCloud
11
11
  #
12
12
  # == Sort SSH keys
13
13
  #
14
- # HCloud::SSHKey.all.sort(name: :desc)
14
+ # HCloud::SSHKey.sort(name: :desc)
15
15
  # # => [#<HCloud::SSHKey id: 1, ...>, ...]
16
16
  #
17
- # HCloud::SSHKey.all.sort(:id, name: :asc)
17
+ # HCloud::SSHKey.sort(:id, name: :asc)
18
18
  # # => [#<HCloud::SSHKey id: 1, ...>, ...]
19
19
  #
20
20
  # == Search SSH keys
21
21
  #
22
- # HCloud::SSHKey.all.where(name: "cx11")
22
+ # HCloud::SSHKey.where(name: "cx11")
23
23
  # # => #<HCloud::SSHKey id: 1, ...>
24
24
  #
25
- # HCloud::SSHKey.all.where(fingerprint: "B6:6C:CD:DA:A2:24:43:39:98:80:0F:F5:51:17:7E")
25
+ # HCloud::SSHKey.where(fingerprint: "B6:6C:CD:DA:A2:24:43:39:98:80:0F:F5:51:17:7E")
26
+ # # => #<HCloud::SSHKey id: 1, ...>
27
+ #
28
+ # HCloud::SSHKey.where(label_selector: { environment: "production" })
26
29
  # # => #<HCloud::SSHKey id: 1, ...>
27
30
  #
28
31
  # == Find SSH key by ID
@@ -58,14 +61,13 @@ module HCloud
58
61
  creatable
59
62
  updatable
60
63
  deletable
64
+ labelable
61
65
 
62
66
  attribute :id, :integer
63
67
  attribute :name
64
68
  attribute :public_key
65
69
  attribute :fingerprint
66
70
 
67
- attribute :labels, default: -> { {} }
68
-
69
71
  def creatable_attributes
70
72
  [:name, :public_key, :labels]
71
73
  end
@@ -11,18 +11,21 @@ module HCloud
11
11
  #
12
12
  # == Sort volumes
13
13
  #
14
- # HCloud::Volume.all.sort(name: :desc)
14
+ # HCloud::Volume.sort(name: :desc)
15
15
  # # => [#<HCloud::Volume id: 1, ...>, ...]
16
16
  #
17
- # HCloud::Volume.all.sort(:id, name: :asc)
17
+ # HCloud::Volume.sort(:id, name: :asc)
18
18
  # # => [#<HCloud::Volume id: 1, ...>, ...]
19
19
  #
20
20
  # == Search volumes
21
21
  #
22
- # HCloud::Volume.all.where(name: "my_volume")
22
+ # HCloud::Volume.where(name: "my_volume")
23
23
  # # => #<HCloud::Volume id: 1, ...>
24
24
  #
25
- # HCloud::Volume.all.where(status: "available")
25
+ # HCloud::Volume.where(status: "available")
26
+ # # => #<HCloud::Volume id: 1, ...>
27
+ #
28
+ # HCloud::Volume.where(label_selector: { environment: "production" })
26
29
  # # => #<HCloud::Volume id: 1, ...>
27
30
  #
28
31
  # == Find volume by ID
@@ -107,6 +110,7 @@ module HCloud
107
110
  creatable
108
111
  updatable
109
112
  deletable
113
+ labelable
110
114
 
111
115
  attribute :id, :integer
112
116
  attribute :name
@@ -124,8 +128,6 @@ module HCloud
124
128
 
125
129
  attribute :server, :server
126
130
 
127
- attribute :labels, default: -> { {} }
128
-
129
131
  alias automount? automount
130
132
 
131
133
  action :attach
@@ -3,8 +3,8 @@
3
3
  module HCloud
4
4
  module Version
5
5
  MAJOR = 1
6
- MINOR = 3
7
- PATCH = 1
6
+ MINOR = 5
7
+ PATCH = 0
8
8
  PRE = nil
9
9
 
10
10
  VERSION = [MAJOR, MINOR, PATCH].compact.join(".")
data/lib/hcloud.rb CHANGED
@@ -16,7 +16,7 @@ module HCloud
16
16
  end
17
17
 
18
18
  def setup
19
- @loader = Zeitwerk::Loader.for_gem
19
+ @loader = Zeitwerk::Loader.for_gem(warn_on_extra_files: false)
20
20
 
21
21
  # Register inflections
22
22
  require root.join("config/inflections.rb")
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "yaml"
4
+
5
+ module HTTP
6
+ module MimeType
7
+ class YAML < Adapter
8
+ def encode(obj)
9
+ return obj.to_yaml if obj.respond_to?(:to_yaml)
10
+
11
+ ::YAML.dump(obj)
12
+ end
13
+
14
+ # Decodes JSON
15
+ def decode(str)
16
+ ::YAML.safe_load(str)
17
+ end
18
+ end
19
+ end
20
+ end
21
+
22
+ HTTP::MimeType.register_adapter "application/x-yaml", HTTP::MimeType::YAML
23
+ HTTP::MimeType.register_alias "application/x-yaml", :yaml
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ module HTTP
4
+ class RateLimiter < Feature
5
+ attr_reader :limit, :remaining, :reset, :at, :rate
6
+
7
+ def initialize(...)
8
+ super
9
+
10
+ @limit = Float::INFINITY
11
+ @remaining = Float::INFINITY
12
+ @reset = Time.at(0)
13
+ @at = Time.at(0)
14
+ @rate = 1
15
+ end
16
+
17
+ def wrap_request(request)
18
+ sleep rate while remaining.zero? && (at + rate).future?
19
+
20
+ request
21
+ end
22
+
23
+ def wrap_response(response)
24
+ # Extract rate limits
25
+ @limit = response["RateLimit-Limit"].to_i
26
+ @remaining = response["RateLimit-Remaining"].to_i
27
+ @reset = Time.at(response["RateLimit-Reset"].to_i)
28
+
29
+ # Extract request date
30
+ @at = Time.parse(response.headers["Date"])
31
+
32
+ # Calculate remaining increment rate
33
+ @rate = 3600 / limit
34
+
35
+ response
36
+ end
37
+ end
38
+ end
39
+
40
+ HTTP::Options.register_feature(:rate_limiter, HTTP::RateLimiter)