hetznercloud 1.0.0 → 1.1.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 75623886cacdbf6d5513f45eb32c0d34ef0c8f0c1adee2bc7e69bf049b9c77ce
4
- data.tar.gz: 8055fc431b7a33ef53c6f30ca9002e36f91e1c723197294bf1cc8c00d8035072
3
+ metadata.gz: 96dedcad6852bc32b89ff4a0df8ee183ed6a8c49a88c840b06dc6c0cd075d255
4
+ data.tar.gz: b5105539a02269441777a43e045b80d7400ff7674d88f28553a8105f19a8d8d2
5
5
  SHA512:
6
- metadata.gz: ccc0bcd9ea354b43cd7b235b788f516a2665066580f44cd25e9d17d6e206680e3cc33786c14c1e47a5948c606588ef517e0a371a6de8537365e8697fea04a16d
7
- data.tar.gz: cce03b3d75507f236152b04b731bd85cf88e15bef217805f6758e1fbf7dc12eb66e36b24717ee01680b16226f20d457b301436ca83d03aa183b6f7945f93dda0
6
+ metadata.gz: 20b1d95239793c7790db9ced2f88a3b44a6add5d553a4bf4e17420b6be2290af4fe452ae5146bb769395fb645b7526322c0d4c488e00280135bcc2128f6532b0
7
+ data.tar.gz: 5a5834d0ba17683ca5679ef7413297cca66200747e2ce36f37e6175db7c68b194ff267b832351c369ef8aaf98a82865ec2f0326a2a203640572db44d282e8a92
data/CHANGELOG.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # Changelog
2
2
 
3
+ ## HCloud v1.1.0
4
+
5
+ - Implemented Firewall Actions
6
+
3
7
  ## HCloud v1.0.0
4
8
 
5
9
  Initial release
data/README.md CHANGED
@@ -78,7 +78,7 @@ Not all Hetzner Cloud API endpoints have been implemented yet.
78
78
  | Certificate Actions | Not implemented |
79
79
  | Datacenters | Implemented |
80
80
  | Firewalls | Implemented |
81
- | Firewall Actions | Not implemented |
81
+ | Firewall Actions | Implemented |
82
82
  | Floating IPs | Implemented |
83
83
  | Floating IP Actions | Implemented |
84
84
  | Images | Implemented |
@@ -19,9 +19,14 @@ module HCloud
19
19
  action_names << name.to_s
20
20
 
21
21
  define_method(name) do |**params|
22
- Action.new client
22
+ response = client
23
23
  .post("/#{resource_name.pluralize}/#{id}/actions/#{name}", params)
24
- .fetch(:action)
24
+
25
+ if response.key?(:actions)
26
+ response[:actions].map { |r| Action.new r }
27
+ else
28
+ Action.new response[:action]
29
+ end
25
30
  end
26
31
  end
27
32
  end
data/lib/hcloud/errors.rb CHANGED
@@ -2,9 +2,30 @@
2
2
 
3
3
  module HCloud
4
4
  module Errors
5
+ class Error < StandardError
6
+ attr_reader :data
7
+
8
+ def initialize(data = {})
9
+ @data = data
10
+
11
+ super [data[:message], full_messages&.join("\n")].compact.join("\n\n")
12
+ end
13
+
14
+ def full_messages
15
+ return unless data[:details]
16
+
17
+ data[:details][:fields].flat_map do |field|
18
+ Array(field.fetch(:messages, data[:message])).map do |detail|
19
+ "#{field[:name]} #{detail}"
20
+ end
21
+ end
22
+ end
23
+ end
24
+
5
25
  class ActionFailed < Error; end
6
26
  class Conflict < Error; end
7
- class Error < StandardError; end
27
+ class FirewallAlreadyApplied < Error; end
28
+ class FirewallAlreadyRemoved < Error; end
8
29
  class FirewallResourceNotFound < Error; end
9
30
  class Forbidden < Error; end
10
31
  class IPNotAvailable < Error; end
data/lib/hcloud/http.rb CHANGED
@@ -23,7 +23,7 @@ module HCloud
23
23
 
24
24
  return data if response.status.success?
25
25
 
26
- raise Errors.const_get(data.dig(:error, :code).camelize), data.dig(:error, :message)
26
+ raise Errors.const_get(data.dig(:error, :code).camelize), data[:error]
27
27
  end
28
28
 
29
29
  def put(path, body = {})
@@ -36,7 +36,7 @@ module HCloud
36
36
 
37
37
  return data if response.status.success?
38
38
 
39
- raise Errors.const_get(data.dig(:error, :code).camelize), data.dig(:error, :message)
39
+ raise Errors.const_get(data.dig(:error, :code).camelize), data[:error]
40
40
  end
41
41
 
42
42
  def post(path, body = {})
@@ -49,7 +49,7 @@ module HCloud
49
49
 
50
50
  return data if response.status.success?
51
51
 
52
- raise Errors.const_get(data.dig(:error, :code).camelize), data.dig(:error, :message)
52
+ raise Errors.const_get(data.dig(:error, :code).camelize), data[:error]
53
53
  end
54
54
 
55
55
  def delete(path)
@@ -62,7 +62,7 @@ module HCloud
62
62
  .parse(:json)
63
63
  .deep_symbolize_keys
64
64
 
65
- raise Errors.const_get(data.dig(:error, :code).camelize), data.dig(:error, :message)
65
+ raise Errors.const_get(data.dig(:error, :code).camelize), data[:error]
66
66
  end
67
67
 
68
68
  private
@@ -50,9 +50,31 @@ module HCloud
50
50
  # firewall.deleted?
51
51
  # # => true
52
52
  #
53
- # TODO: firewall actions
53
+ # == Apply a firewall to resources
54
+ #
55
+ # firewall = HCloud::Firewall.find(1)
56
+ # server = HCloud::Server.find(1)
57
+ #
58
+ # firewall.apply_to_resources(apply_to: [{ type: "server", server: { id: server.id } }])
59
+ # # => #<HCloud::Action ...>
60
+ #
61
+ # == Remove a firewall from resources
62
+ #
63
+ # firewall = HCloud::Firewall.find(1)
64
+ # server = HCloud::Server.find(1)
65
+ #
66
+ # firewall.remove_from_resources(remove_from: [{ type: "server", server: { id: server.id } }])
67
+ # # => #<HCloud::Action ...>
68
+ #
69
+ # == Set firewall rules
70
+ #
71
+ # firewall = HCloud::Firewall.find(1)
72
+ #
73
+ # firewall.set_rules(rules: [{ direction: "in", protocol: "tcp", ... }])
74
+ # # => #<HCloud::Action ...>
54
75
  #
55
76
  class Firewall < Resource
77
+ actionable
56
78
  queryable
57
79
  creatable
58
80
  updatable
@@ -69,6 +91,10 @@ module HCloud
69
91
 
70
92
  attribute :labels, default: -> { {} }
71
93
 
94
+ action :apply_to_resources
95
+ action :remove_from_resources
96
+ action :set_rules
97
+
72
98
  def creatable_attributes
73
99
  [:name, :labels, :apply_to, :rules]
74
100
  end
@@ -3,7 +3,7 @@
3
3
  module HCloud
4
4
  module Version
5
5
  MAJOR = 1
6
- MINOR = 0
6
+ MINOR = 1
7
7
  PATCH = 0
8
8
  PRE = nil
9
9
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hetznercloud
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Florian Dejonckheere
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-01-16 00:00:00.000000000 Z
11
+ date: 2022-01-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activemodel