hcloud 1.0.3 → 1.2.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: a461edd72b44398c79ea0fb49a47457864551df5157572f9ce7e41fb8761b2c1
4
- data.tar.gz: 8dcfe208c66dd462d444da2cdcc6e5ef65fa5595cea900c7406fdff0e5da8f7b
3
+ metadata.gz: cdd378e8381d39a1fccf8cd2ce72ff3f024985fb5d5599978e928464e0018576
4
+ data.tar.gz: 885c2e766e37f274622be8a3519da323608576a765ba5dd7d104da1fd9c3237d
5
5
  SHA512:
6
- metadata.gz: eabc376f9c8d3fe45a8b09aa30195a8d877cdf7bfa18c2a9dab93d19be45e418a745a270aba90213ccf9adf7eee772a6880e9a8e6cacf20bbe26fc5410985438
7
- data.tar.gz: 5e4bb090f48e683bbf0895d091ed8b6e74bb53f8d1f965638a5c8749241d1e562b5e9387dfe4306570666dd9b88c10fae00446a52723ff62b663caf6646707b8
6
+ metadata.gz: 3e163d935512c077fbc7e3c94281d48aa1ba95eab1e5743190a66ab800e729ab1c8a905a974f86ca78c0e280bd77bc5763b9ec25e3b8b55db4725a8115cbabce
7
+ data.tar.gz: e26b48bb02882a3ec78b4412236466619a0e21759b9ba2f9f518fd17a591a0e1a0f9d3e344f63ef3502cbf3e293fc62577250247cc4f1b04908c2532bdbee7e2
data/CHANGELOG.md CHANGED
@@ -1,5 +1,62 @@
1
1
  # Changelog
2
2
 
3
+ ## [v1.2.0](https://github.com/tonobo/hcloud-ruby/tree/v1.2.0) (2023-10-10)
4
+
5
+ [Full Changelog](https://github.com/tonobo/hcloud-ruby/compare/v1.1.0...v1.2.0)
6
+
7
+ **Closed issues:**
8
+
9
+ - \[Feature\] Add Primary IPs [\#57](https://github.com/tonobo/hcloud-ruby/issues/57)
10
+ - \[Feature\] Add Primary IPs [\#56](https://github.com/tonobo/hcloud-ruby/issues/56)
11
+ - \[Bug\] Firewalls do not expose actions [\#54](https://github.com/tonobo/hcloud-ruby/issues/54)
12
+ - \[Bug\] IPv6 global address is not parsed correctly [\#49](https://github.com/tonobo/hcloud-ruby/issues/49)
13
+ - \[Feature\] Add LoadBalancers and -Types [\#29](https://github.com/tonobo/hcloud-ruby/issues/29)
14
+ - \[Feature\] Add PlacementGroups [\#27](https://github.com/tonobo/hcloud-ruby/issues/27)
15
+ - \[Feature\] Add Certificates [\#26](https://github.com/tonobo/hcloud-ruby/issues/26)
16
+ - \[Feature\] Add Firewalls [\#25](https://github.com/tonobo/hcloud-ruby/issues/25)
17
+
18
+ **Merged pull requests:**
19
+
20
+ - lib: import active\_support before cherry-picking imports [\#77](https://github.com/tonobo/hcloud-ruby/pull/77) ([aufziehvogel](https://github.com/aufziehvogel))
21
+ - Dependencies: Drop rake, as it's unnecessary [\#74](https://github.com/tonobo/hcloud-ruby/pull/74) ([Kjarrigan](https://github.com/Kjarrigan))
22
+ - server: return `next_actions` data on create [\#72](https://github.com/tonobo/hcloud-ruby/pull/72) ([aufziehvogel](https://github.com/aufziehvogel))
23
+ - lib: implement primary IPs [\#65](https://github.com/tonobo/hcloud-ruby/pull/65) ([aufziehvogel](https://github.com/aufziehvogel))
24
+ - lib: implement certificates [\#64](https://github.com/tonobo/hcloud-ruby/pull/64) ([aufziehvogel](https://github.com/aufziehvogel))
25
+ - spec: include context doubles for doubles tests [\#63](https://github.com/tonobo/hcloud-ruby/pull/63) ([aufziehvogel](https://github.com/aufziehvogel))
26
+ - fix: return actions info on firewall create [\#59](https://github.com/tonobo/hcloud-ruby/pull/59) ([aufziehvogel](https://github.com/aufziehvogel))
27
+ - fix: do not interpret leading : in JSON as symbol [\#58](https://github.com/tonobo/hcloud-ruby/pull/58) ([aufziehvogel](https://github.com/aufziehvogel))
28
+ - lib: implement load balancer [\#55](https://github.com/tonobo/hcloud-ruby/pull/55) ([aufziehvogel](https://github.com/aufziehvogel))
29
+ - implement double tests for existing resources [\#53](https://github.com/tonobo/hcloud-ruby/pull/53) ([aufziehvogel](https://github.com/aufziehvogel))
30
+ - Add PlacementGroup [\#52](https://github.com/tonobo/hcloud-ruby/pull/52) ([aufziehvogel](https://github.com/aufziehvogel))
31
+ - firewall: please linter [\#51](https://github.com/tonobo/hcloud-ruby/pull/51) ([RaphaelPour](https://github.com/RaphaelPour))
32
+
33
+ ## [v1.1.0](https://github.com/tonobo/hcloud-ruby/tree/v1.1.0) (2022-11-29)
34
+
35
+ [Full Changelog](https://github.com/tonobo/hcloud-ruby/compare/v1.0.3...v1.1.0)
36
+
37
+ **Closed issues:**
38
+
39
+ - Doubles tests failure with seed 50938 [\#46](https://github.com/tonobo/hcloud-ruby/issues/46)
40
+ - \[Feature\] Add missing Resources/Endpoints Q1/2022 [\#24](https://github.com/tonobo/hcloud-ruby/issues/24)
41
+ - \[Dependencies\] Unpin activesupport [\#23](https://github.com/tonobo/hcloud-ruby/issues/23)
42
+
43
+ **Merged pull requests:**
44
+
45
+ - version: bump to v1.1.0 [\#50](https://github.com/tonobo/hcloud-ruby/pull/50) ([aufziehvogel](https://github.com/aufziehvogel))
46
+ - handle action array responses for firewall actions [\#48](https://github.com/tonobo/hcloud-ruby/pull/48) ([aufziehvogel](https://github.com/aufziehvogel))
47
+ - fix auto pagination test to always use three pages [\#47](https://github.com/tonobo/hcloud-ruby/pull/47) ([aufziehvogel](https://github.com/aufziehvogel))
48
+ - label support \(create, update, search\) [\#45](https://github.com/tonobo/hcloud-ruby/pull/45) ([aufziehvogel](https://github.com/aufziehvogel))
49
+ - set Github Workflow badge for build status [\#44](https://github.com/tonobo/hcloud-ruby/pull/44) ([aufziehvogel](https://github.com/aufziehvogel))
50
+ - fix rubocop linting warnings [\#42](https://github.com/tonobo/hcloud-ruby/pull/42) ([aufziehvogel](https://github.com/aufziehvogel))
51
+ - Implement firewall support [\#41](https://github.com/tonobo/hcloud-ruby/pull/41) ([aufziehvogel](https://github.com/aufziehvogel))
52
+ - Create unit tests for networks [\#40](https://github.com/tonobo/hcloud-ruby/pull/40) ([aufziehvogel](https://github.com/aufziehvogel))
53
+ - fix typo in exception name ResourceUnavailable [\#39](https://github.com/tonobo/hcloud-ruby/pull/39) ([aufziehvogel](https://github.com/aufziehvogel))
54
+ - Bump rack from 2.2.3 to 2.2.3.1 [\#38](https://github.com/tonobo/hcloud-ruby/pull/38) ([dependabot[bot]](https://github.com/apps/dependabot))
55
+ - dependency: update + unpin activesupport [\#36](https://github.com/tonobo/hcloud-ruby/pull/36) ([RaphaelPour](https://github.com/RaphaelPour))
56
+ - Add MIT license to gemspec [\#34](https://github.com/tonobo/hcloud-ruby/pull/34) ([bastelfreak](https://github.com/bastelfreak))
57
+ - Create LICENSE [\#33](https://github.com/tonobo/hcloud-ruby/pull/33) ([RaphaelPour](https://github.com/RaphaelPour))
58
+ - Update server attributes [\#32](https://github.com/tonobo/hcloud-ruby/pull/32) ([RaphaelPour](https://github.com/RaphaelPour))
59
+
3
60
  ## [v1.0.3](https://github.com/tonobo/hcloud-ruby/tree/v1.0.3) (2022-02-17)
4
61
 
5
62
  [Full Changelog](https://github.com/tonobo/hcloud-ruby/compare/v1.0.2...v1.0.3)
@@ -10,6 +67,7 @@
10
67
 
11
68
  **Merged pull requests:**
12
69
 
70
+ - bump version to v1.0.3 [\#22](https://github.com/tonobo/hcloud-ruby/pull/22) ([RaphaelPour](https://github.com/RaphaelPour))
13
71
  - lib: adjust code to work with 3.x ruby versions [\#21](https://github.com/tonobo/hcloud-ruby/pull/21) ([Kjarrigan](https://github.com/Kjarrigan))
14
72
  - ci: add github workflow [\#20](https://github.com/tonobo/hcloud-ruby/pull/20) ([RaphaelPour](https://github.com/RaphaelPour))
15
73
 
data/Gemfile.lock CHANGED
@@ -1,58 +1,52 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- hcloud (1.0.3)
4
+ hcloud (1.2.0)
5
5
  activemodel
6
- activesupport (= 6.1.4.4)
7
6
  oj
8
7
  typhoeus
9
8
 
10
9
  GEM
11
10
  remote: https://rubygems.org/
12
11
  specs:
13
- activemodel (6.1.4.4)
14
- activesupport (= 6.1.4.4)
15
- activesupport (6.1.4.4)
12
+ activemodel (7.0.4)
13
+ activesupport (= 7.0.4)
14
+ activesupport (7.0.4)
16
15
  concurrent-ruby (~> 1.0, >= 1.0.2)
17
16
  i18n (>= 1.6, < 2)
18
17
  minitest (>= 5.1)
19
18
  tzinfo (~> 2.0)
20
- zeitwerk (~> 2.3)
21
- addressable (2.8.0)
22
- public_suffix (>= 2.0.2, < 5.0)
19
+ addressable (2.8.1)
20
+ public_suffix (>= 2.0.2, < 6.0)
23
21
  ast (2.4.2)
24
22
  builder (3.2.4)
25
23
  codecov (0.6.0)
26
24
  simplecov (>= 0.15, < 0.22)
27
25
  coderay (1.1.3)
28
- concurrent-ruby (1.1.9)
26
+ concurrent-ruby (1.1.10)
29
27
  crack (0.4.5)
30
28
  rexml
31
29
  diff-lcs (1.5.0)
32
30
  docile (1.4.0)
33
- dry-configurable (0.14.0)
31
+ dry-core (1.0.0)
34
32
  concurrent-ruby (~> 1.0)
35
- dry-core (~> 0.6)
36
- dry-container (0.9.0)
33
+ zeitwerk (~> 2.6)
34
+ dry-inflector (1.0.0)
35
+ dry-logic (1.5.0)
37
36
  concurrent-ruby (~> 1.0)
38
- dry-configurable (~> 0.13, >= 0.13.0)
39
- dry-core (0.7.1)
37
+ dry-core (~> 1.0, < 2)
38
+ zeitwerk (~> 2.6)
39
+ dry-types (1.7.0)
40
40
  concurrent-ruby (~> 1.0)
41
- dry-inflector (0.2.1)
42
- dry-logic (1.2.0)
43
- concurrent-ruby (~> 1.0)
44
- dry-core (~> 0.5, >= 0.5)
45
- dry-types (1.5.1)
46
- concurrent-ruby (~> 1.0)
47
- dry-container (~> 0.3)
48
- dry-core (~> 0.5, >= 0.5)
49
- dry-inflector (~> 0.1, >= 0.1.2)
50
- dry-logic (~> 1.0, >= 1.0.2)
51
- ethon (0.15.0)
41
+ dry-core (~> 1.0, < 2)
42
+ dry-inflector (~> 1.0, < 2)
43
+ dry-logic (>= 1.4, < 2)
44
+ zeitwerk (~> 2.6)
45
+ ethon (0.16.0)
52
46
  ffi (>= 1.15.0)
53
- faker (2.19.0)
54
- i18n (>= 1.6, < 2)
55
- ffi (1.15.5)
47
+ faker (3.0.0)
48
+ i18n (>= 1.8.11, < 2)
49
+ ffi (1.16.3)
56
50
  grape (1.6.2)
57
51
  activesupport
58
52
  builder
@@ -61,53 +55,54 @@ GEM
61
55
  rack (>= 1.3.0)
62
56
  rack-accept
63
57
  hashdiff (1.0.1)
64
- i18n (1.10.0)
58
+ i18n (1.12.0)
65
59
  concurrent-ruby (~> 1.0)
60
+ json (2.6.2)
66
61
  method_source (1.0.0)
67
- minitest (5.15.0)
68
- mustermann (1.1.1)
62
+ minitest (5.16.3)
63
+ mustermann (3.0.0)
69
64
  ruby2_keywords (~> 0.0.1)
70
- mustermann-grape (1.0.1)
65
+ mustermann-grape (1.0.2)
71
66
  mustermann (>= 1.0.0)
72
- oj (3.13.11)
73
- parallel (1.21.0)
74
- parser (3.1.0.0)
67
+ oj (3.16.1)
68
+ parallel (1.22.1)
69
+ parser (3.1.3.0)
75
70
  ast (~> 2.4.1)
76
71
  pry (0.14.1)
77
72
  coderay (~> 1.1)
78
73
  method_source (~> 1.0)
79
- public_suffix (4.0.6)
80
- rack (2.2.3)
74
+ public_suffix (5.0.0)
75
+ rack (3.0.1)
81
76
  rack-accept (0.4.5)
82
77
  rack (>= 0.4)
83
78
  rainbow (3.1.1)
84
- rake (13.0.6)
85
- regexp_parser (2.2.1)
79
+ regexp_parser (2.6.1)
86
80
  rexml (3.2.5)
87
- rspec (3.11.0)
88
- rspec-core (~> 3.11.0)
89
- rspec-expectations (~> 3.11.0)
90
- rspec-mocks (~> 3.11.0)
91
- rspec-core (3.11.0)
92
- rspec-support (~> 3.11.0)
93
- rspec-expectations (3.11.0)
81
+ rspec (3.12.0)
82
+ rspec-core (~> 3.12.0)
83
+ rspec-expectations (~> 3.12.0)
84
+ rspec-mocks (~> 3.12.0)
85
+ rspec-core (3.12.0)
86
+ rspec-support (~> 3.12.0)
87
+ rspec-expectations (3.12.0)
94
88
  diff-lcs (>= 1.2.0, < 2.0)
95
- rspec-support (~> 3.11.0)
96
- rspec-mocks (3.11.0)
89
+ rspec-support (~> 3.12.0)
90
+ rspec-mocks (3.12.0)
97
91
  diff-lcs (>= 1.2.0, < 2.0)
98
- rspec-support (~> 3.11.0)
99
- rspec-support (3.11.0)
100
- rubocop (1.25.1)
92
+ rspec-support (~> 3.12.0)
93
+ rspec-support (3.12.0)
94
+ rubocop (1.39.0)
95
+ json (~> 2.3)
101
96
  parallel (~> 1.10)
102
- parser (>= 3.1.0.0)
97
+ parser (>= 3.1.2.1)
103
98
  rainbow (>= 2.2.2, < 4.0)
104
99
  regexp_parser (>= 1.8, < 3.0)
105
- rexml
106
- rubocop-ast (>= 1.15.1, < 2.0)
100
+ rexml (>= 3.2.5, < 4.0)
101
+ rubocop-ast (>= 1.23.0, < 2.0)
107
102
  ruby-progressbar (~> 1.7)
108
103
  unicode-display_width (>= 1.4.0, < 3.0)
109
- rubocop-ast (1.15.2)
110
- parser (>= 3.0.1.1)
104
+ rubocop-ast (1.23.0)
105
+ parser (>= 3.1.1.0)
111
106
  ruby-progressbar (1.11.0)
112
107
  ruby2_keywords (0.0.5)
113
108
  simplecov (0.21.2)
@@ -118,14 +113,14 @@ GEM
118
113
  simplecov_json_formatter (0.1.4)
119
114
  typhoeus (1.4.0)
120
115
  ethon (>= 0.9.0)
121
- tzinfo (2.0.4)
116
+ tzinfo (2.0.5)
122
117
  concurrent-ruby (~> 1.0)
123
- unicode-display_width (2.1.0)
124
- webmock (3.14.0)
118
+ unicode-display_width (2.3.0)
119
+ webmock (3.18.1)
125
120
  addressable (>= 2.8.0)
126
121
  crack (>= 0.3.2)
127
122
  hashdiff (>= 0.4.0, < 2.0.0)
128
- zeitwerk (2.5.4)
123
+ zeitwerk (2.6.6)
129
124
 
130
125
  PLATFORMS
131
126
  ruby
@@ -133,17 +128,15 @@ PLATFORMS
133
128
 
134
129
  DEPENDENCIES
135
130
  activemodel
136
- activesupport (= 6.1.4.4)
137
131
  bundler
138
132
  codecov
139
133
  faker
140
134
  grape
141
135
  hcloud!
142
136
  pry
143
- rake
144
137
  rspec
145
138
  rubocop
146
139
  webmock
147
140
 
148
141
  BUNDLED WITH
149
- 2.3.7
142
+ 2.3.25
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2022 Tim Foerster
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Hcloud
2
2
 
3
- [![Build Status](https://travis-ci.org/tonobo/hcloud-ruby.svg?branch=master)](https://travis-ci.org/tonobo/hcloud-ruby)
3
+ [![Build Status](https://github.com/tonobo/hcloud-ruby/actions/workflows/ruby.yml/badge.svg)](https://github.com/tonobo/hcloud-ruby/actions/workflows/ruby.yml)
4
4
  [![codecov](https://codecov.io/gh/tonobo/hcloud-ruby/branch/master/graph/badge.svg)](https://codecov.io/gh/tonobo/hcloud-ruby)
5
5
  [![Gem Version](https://badge.fury.io/rb/hcloud.svg)](https://badge.fury.io/rb/hcloud)
6
6
  [![Maintainability](https://api.codeclimate.com/v1/badges/aa67f9d590d86845822f/maintainability)](https://codeclimate.com/github/tonobo/hcloud-ruby/maintainability)
data/bin/console CHANGED
@@ -8,8 +8,8 @@ require 'hcloud'
8
8
  # with your gem easier. You can also use a different console, if you like.
9
9
 
10
10
  # (If you use this, don't forget to add pry to your Gemfile!)
11
- # require "pry"
12
- # Pry.start
11
+ require 'pry'
12
+ Pry.start
13
13
 
14
- require 'irb'
15
- IRB.start(__FILE__)
14
+ # require 'irb'
15
+ # IRB.start(__FILE__)
data/hcloud.gemspec CHANGED
@@ -12,6 +12,7 @@ Gem::Specification.new do |spec|
12
12
 
13
13
  spec.summary = 'HetznerCloud native Ruby client'
14
14
  spec.homepage = 'https://github.com/tonobo/hcloud-ruby'
15
+ spec.license = 'MIT'
15
16
 
16
17
  spec.required_ruby_version = '>= 2.7.0'
17
18
 
@@ -23,14 +24,11 @@ Gem::Specification.new do |spec|
23
24
  spec.require_paths = ['lib']
24
25
 
25
26
  spec.add_development_dependency 'activemodel'
26
- spec.add_development_dependency 'activesupport', '6.1.4.4'
27
27
  spec.add_development_dependency 'bundler'
28
28
  spec.add_development_dependency 'grape'
29
- spec.add_development_dependency 'rake'
30
29
  spec.add_development_dependency 'rspec'
31
30
  spec.add_development_dependency 'webmock'
32
31
  spec.add_runtime_dependency 'activemodel'
33
- spec.add_runtime_dependency 'activesupport', '6.1.4.4'
34
32
  spec.add_runtime_dependency 'oj'
35
33
  spec.add_runtime_dependency 'typhoeus'
36
34
  end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Hcloud
4
+ class Certificate
5
+ require 'hcloud/certificate_resource'
6
+
7
+ include EntryLoader
8
+
9
+ schema(
10
+ created: :time
11
+ )
12
+
13
+ updatable :name
14
+ destructible
15
+
16
+ has_actions
17
+
18
+ def retry
19
+ prepare_request('actions/retry', j: COLLECT_ARGS.call(__method__, binding))
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Hcloud
4
+ class CertificateResource < AbstractResource
5
+ filter_attributes :name, :label_selector, :type
6
+
7
+ def [](arg)
8
+ case arg
9
+ when Integer then find_by(id: arg)
10
+ when String then find_by(name: arg)
11
+ end
12
+ end
13
+
14
+ def create(
15
+ name:,
16
+ type: :uploaded,
17
+ certificate: nil,
18
+ private_key: nil,
19
+ domain_names: nil,
20
+ labels: {}
21
+ )
22
+ raise Hcloud::Error::InvalidInput, 'no name given' if name.blank?
23
+
24
+ case type
25
+ when :uploaded
26
+ raise Hcloud::Error::InvalidInput, 'no certificate given' if certificate.blank?
27
+ raise Hcloud::Error::InvalidInput, 'no private_key given' if private_key.blank?
28
+ when :managed
29
+ raise Hcloud::Error::InvalidInput, 'no domain_names given' if domain_names.to_a.empty?
30
+ end
31
+
32
+ prepare_request(
33
+ 'certificates', j: COLLECT_ARGS.call(__method__, binding),
34
+ expected_code: 201
35
+ ) do |response|
36
+ [
37
+ Action.new(client, response.parsed_json[:action]),
38
+ Certificate.new(client, response.parsed_json[:certificate])
39
+ ]
40
+ end
41
+ end
42
+ end
43
+ end
data/lib/hcloud/client.rb CHANGED
@@ -86,18 +86,42 @@ module Hcloud
86
86
  SSHKeyResource.new(client: self)
87
87
  end
88
88
 
89
+ def certificates
90
+ CertificateResource.new(client: self)
91
+ end
92
+
89
93
  def floating_ips
90
94
  FloatingIPResource.new(client: self)
91
95
  end
92
96
 
97
+ def primary_ips
98
+ PrimaryIPResource.new(client: self)
99
+ end
100
+
93
101
  def networks
94
102
  NetworkResource.new(client: self)
95
103
  end
96
104
 
105
+ def firewalls
106
+ FirewallResource.new(client: self)
107
+ end
108
+
97
109
  def volumes
98
110
  VolumeResource.new(client: self)
99
111
  end
100
112
 
113
+ def placement_groups
114
+ PlacementGroupResource.new(client: self)
115
+ end
116
+
117
+ def load_balancer_types
118
+ LoadBalancerTypeResource.new(client: self)
119
+ end
120
+
121
+ def load_balancers
122
+ LoadBalancerResource.new(client: self)
123
+ end
124
+
101
125
  class ResourceFuture < Delegator
102
126
  def initialize(request) # rubocop:disable Lint/MissingSuper
103
127
  @request = request
@@ -68,40 +68,84 @@ module Hcloud
68
68
  end
69
69
  end
70
70
 
71
+ def has_metrics # rubocop:disable Naming/PredicateName
72
+ define_method(:metrics) do |**kwargs|
73
+ raise Hcloud::Error::InvalidInput, 'no type given' if kwargs[:type].blank?
74
+ raise Hcloud::Error::InvalidInput, 'no start given' if kwargs[:start].blank?
75
+ raise Hcloud::Error::InvalidInput, 'no end given' if kwargs[:end].blank?
76
+ if kwargs[:start] > kwargs[:end]
77
+ raise Hcloud::Error::InvalidInput, 'start time must be before end time'
78
+ end
79
+
80
+ params = {
81
+ type: kwargs[:type],
82
+ start: kwargs[:start].iso8601,
83
+ end: kwargs[:end].iso8601,
84
+ step: kwargs[:step].to_i
85
+ }
86
+ prepare_request('metrics', method: :get, params: params) do |response|
87
+ response.parsed_json[:metrics].with_indifferent_access
88
+ end
89
+ end
90
+ end
91
+
71
92
  def resource_class
72
93
  ancestors.reverse.find { |const| const.include?(Hcloud::EntryLoader) }
73
94
  end
74
95
 
75
96
  def from_response(response, autoload_action: nil)
76
97
  attributes = response.resource_attributes
77
- action = response.parsed_json[:action] if autoload_action
98
+
99
+ action_resp = _try_load_action(response) if autoload_action
100
+ return action_resp unless attributes || action_resp.nil?
101
+
78
102
  client = response.context.client
79
103
  if attributes.is_a?(Array)
80
- results = attributes.map { |item| new(item).tap { |entity| entity.response = response } }
104
+ results = attributes.map do |item|
105
+ new(client, item).tap do |entity|
106
+ entity.response = response
107
+ end
108
+ end
81
109
  results.tap { |ary| ary.extend(Collection) }.response = response
82
110
  return results
83
111
  end
84
112
 
85
- return Action.new(client, action) if attributes.nil? && action
86
- return new(attributes).tap { |entity| entity.response = response } if action.nil?
113
+ if action_resp.nil?
114
+ return new(client, attributes).tap { |entity| entity.response = response }
115
+ end
87
116
 
88
117
  [
89
- Action.new(client, action),
90
- new(attributes).tap { |entity| entity.response = response }
118
+ action_resp,
119
+ new(client, attributes).tap { |entity| entity.response = response }
91
120
  ]
92
121
  end
93
- end
94
122
 
95
- attr_accessor :response
123
+ def _try_load_action(response)
124
+ # some API endpoints return a list of actions (e.g. firewall action
125
+ # apply_to_resources), some a single action (e.g. server action
126
+ # attach_iso)
127
+ actions = response.parsed_json[:actions]
128
+ action = response.parsed_json[:action]
129
+
130
+ client = response.context.client
96
131
 
97
- def initialize(client = nil, kwargs = {})
98
- if client.is_a?(Hash)
99
- kwargs = client
100
- client = nil
132
+ if actions
133
+ return actions.map do |act|
134
+ Action.new(client, act)
135
+ end
136
+ elsif action
137
+ return Action.new(client, action)
138
+ end
139
+
140
+ nil
101
141
  end
142
+ end
102
143
 
144
+ attr_accessor :response
145
+
146
+ def initialize(client = nil, resource = {})
103
147
  @client = client
104
- _load(kwargs)
148
+ _load(resource)
105
149
  end
106
150
 
107
151
  def inspect
@@ -179,7 +223,10 @@ module Hcloud
179
223
  instance_variable_set("@#{key}", value)
180
224
  end
181
225
 
226
+ # rubocop: disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity, Metrics/MethodLength, Metrics/AbcSize
182
227
  def _load(resource)
228
+ return if resource.nil?
229
+
183
230
  @_attributes = {}.with_indifferent_access
184
231
 
185
232
  resource.each do |key, value|
@@ -195,8 +242,30 @@ module Hcloud
195
242
  next
196
243
  end
197
244
 
245
+ # if schema definition is [Class]
246
+ if definition.is_a?(Array) && definition.first.include?(EntryLoader)
247
+
248
+ # just set attribute to an empty array if value is no array or empty
249
+ if !value.is_a?(Array) || value.empty?
250
+ _update_attribute(key, [])
251
+ next
252
+ end
253
+
254
+ if value.first.is_a?(Integer)
255
+ # If value is an integer, this is the id of an object which's class can be
256
+ # retreived from definition. Load a future object that can on access retreive the
257
+ # data from the api and convert it to a proper object.
258
+ _update_attribute(key, value.map { |id| Future.new(client, definition.first, id) })
259
+ else
260
+ # Otherwise the value *is* the content of the object
261
+ _update_attribute(key, value.map { |item| definition.first.new(client, item) })
262
+ end
263
+ next
264
+ end
265
+
198
266
  _update_attribute(key, value.is_a?(Hash) ? value.with_indifferent_access : value)
199
267
  end
200
268
  end
269
+ # rubocop: enable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity, Metrics/MethodLength, Metrics/AbcSize
201
270
  end
202
271
  end
data/lib/hcloud/errors.rb CHANGED
@@ -9,7 +9,7 @@ module Hcloud
9
9
  class Locked < Error; end
10
10
  class NotFound < Error; end
11
11
  class RateLimitExceeded < Error; end
12
- class ResourceUnavilable < Error; end
12
+ class ResourceUnavailable < Error; end
13
13
  class ServiceError < Error; end
14
14
  class UniquenessError < Error; end
15
15
  class UnknownError < Error; end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Hcloud
4
+ class Firewall
5
+ require 'hcloud/firewall_resource'
6
+
7
+ include EntryLoader
8
+
9
+ schema(
10
+ created: :time
11
+ )
12
+
13
+ updatable :name
14
+ destructible
15
+
16
+ has_actions
17
+
18
+ def set_rules(rules:)
19
+ # Set rules to empty when nil is passed
20
+ rules = rules.to_a
21
+
22
+ prepare_request('actions/set_rules', j: COLLECT_ARGS.call(__method__, binding))
23
+ end
24
+
25
+ def apply_to_resources(apply_to:)
26
+ raise Hcloud::Error::InvalidInput, 'no apply_to resources given' if apply_to.nil?
27
+
28
+ prepare_request('actions/apply_to_resources', j: COLLECT_ARGS.call(__method__, binding))
29
+ end
30
+
31
+ def remove_from_resources(remove_from:)
32
+ raise Hcloud::Error::InvalidInput, 'no remove_from resources given' if remove_from.nil?
33
+
34
+ prepare_request('actions/remove_from_resources', j: COLLECT_ARGS.call(__method__, binding))
35
+ end
36
+ end
37
+ end