hetznercloud 1.0.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
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