hetznercloud 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/CHANGELOG.md +5 -0
- data/Gemfile +6 -0
- data/LICENSE.md +21 -0
- data/README.md +123 -0
- data/config/inflections.rb +19 -0
- data/lib/core_ext/send_wrap.rb +15 -0
- data/lib/hcloud/action_collection.rb +37 -0
- data/lib/hcloud/client.rb +38 -0
- data/lib/hcloud/collection.rb +77 -0
- data/lib/hcloud/concerns/actionable.rb +29 -0
- data/lib/hcloud/concerns/concerns.rb +29 -0
- data/lib/hcloud/concerns/creatable.rb +46 -0
- data/lib/hcloud/concerns/deletable.rb +20 -0
- data/lib/hcloud/concerns/queryable.rb +41 -0
- data/lib/hcloud/concerns/updatable.rb +24 -0
- data/lib/hcloud/entities/amount.rb +8 -0
- data/lib/hcloud/entities/applied_to.rb +7 -0
- data/lib/hcloud/entities/applied_to_resource.rb +9 -0
- data/lib/hcloud/entities/apply_to.rb +15 -0
- data/lib/hcloud/entities/datacenter_server_type.rb +9 -0
- data/lib/hcloud/entities/dns_pointer.rb +8 -0
- data/lib/hcloud/entities/error.rb +8 -0
- data/lib/hcloud/entities/metrics.rb +12 -0
- data/lib/hcloud/entities/price.rb +9 -0
- data/lib/hcloud/entities/protection.rb +11 -0
- data/lib/hcloud/entities/rule.rb +15 -0
- data/lib/hcloud/entity.rb +23 -0
- data/lib/hcloud/errors.rb +36 -0
- data/lib/hcloud/http.rb +100 -0
- data/lib/hcloud/resource.rb +42 -0
- data/lib/hcloud/resource_type.rb +73 -0
- data/lib/hcloud/resources/action.rb +49 -0
- data/lib/hcloud/resources/datacenter.rb +43 -0
- data/lib/hcloud/resources/firewall.rb +80 -0
- data/lib/hcloud/resources/floating_ip.rb +144 -0
- data/lib/hcloud/resources/image.rb +140 -0
- data/lib/hcloud/resources/iso.rb +36 -0
- data/lib/hcloud/resources/location.rb +37 -0
- data/lib/hcloud/resources/placement_group.rb +75 -0
- data/lib/hcloud/resources/server.rb +179 -0
- data/lib/hcloud/resources/server_type.rb +42 -0
- data/lib/hcloud/resources/ssh_key.rb +77 -0
- data/lib/hcloud/resources/volume.rb +147 -0
- data/lib/hcloud/version.rb +17 -0
- data/lib/hcloud.rb +42 -0
- metadata +286 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 75623886cacdbf6d5513f45eb32c0d34ef0c8f0c1adee2bc7e69bf049b9c77ce
|
4
|
+
data.tar.gz: 8055fc431b7a33ef53c6f30ca9002e36f91e1c723197294bf1cc8c00d8035072
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: ccc0bcd9ea354b43cd7b235b788f516a2665066580f44cd25e9d17d6e206680e3cc33786c14c1e47a5948c606588ef517e0a371a6de8537365e8697fea04a16d
|
7
|
+
data.tar.gz: cce03b3d75507f236152b04b731bd85cf88e15bef217805f6758e1fbf7dc12eb66e36b24717ee01680b16226f20d457b301436ca83d03aa183b6f7945f93dda0
|
data/CHANGELOG.md
ADDED
data/Gemfile
ADDED
data/LICENSE.md
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) 2021 Florian Dejonckheere
|
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
|
13
|
+
all 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
|
21
|
+
THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,123 @@
|
|
1
|
+
# HCloud
|
2
|
+
|
3
|
+

|
4
|
+

|
5
|
+
|
6
|
+
Unofficial Ruby integration with the [Hetzner Cloud API](https://docs.hetzner.cloud/).
|
7
|
+
|
8
|
+
## Installation
|
9
|
+
|
10
|
+
Add this line to your application's Gemfile:
|
11
|
+
|
12
|
+
```ruby
|
13
|
+
git_source(:github) { |repo| "https://github.com/#{repo}.git" }
|
14
|
+
|
15
|
+
gem "hetznercloud"
|
16
|
+
```
|
17
|
+
|
18
|
+
And then execute:
|
19
|
+
|
20
|
+
$ bundle install
|
21
|
+
|
22
|
+
Or install it yourself as:
|
23
|
+
|
24
|
+
$ gem install hcloud
|
25
|
+
|
26
|
+
## Usage
|
27
|
+
|
28
|
+
```ruby
|
29
|
+
require "hcloud"
|
30
|
+
|
31
|
+
# Create a new client
|
32
|
+
client = HCloud::Client.new(access_token: "my_access_token")
|
33
|
+
|
34
|
+
# Set client as default connection
|
35
|
+
HCloud::Client.connection = client
|
36
|
+
|
37
|
+
# Create resource
|
38
|
+
ssh_key = HCloud::SSHKey.new(name: "My SSH key", public_key: "ssh-rsa ...")
|
39
|
+
ssh_key.create
|
40
|
+
|
41
|
+
# Alternate syntax:
|
42
|
+
ssh_key = HCloud::SSHKey.create(name: "My SSH key", public_key: "ssh-rsa ...")
|
43
|
+
|
44
|
+
# Find resource by ID
|
45
|
+
ssh_key = HCloud::SSHKey.find(1)
|
46
|
+
|
47
|
+
# Update resource
|
48
|
+
ssh_key.updatable_attributes # => [:name, :labels]
|
49
|
+
ssh_key.name = "New name"
|
50
|
+
ssh_key.update
|
51
|
+
|
52
|
+
# Delete resource
|
53
|
+
ssh_key.delete
|
54
|
+
ssh_key.deleted?
|
55
|
+
# => true
|
56
|
+
|
57
|
+
# For detailed usage of resources, refer to the class documentation
|
58
|
+
|
59
|
+
# When specifying associated resources, you can either use an instance of the resource, an integer as ID or a string as name.
|
60
|
+
# The following calls are equivalent:
|
61
|
+
server = HCloud::Server.new(name: "my_server", location: "fsn", ...)
|
62
|
+
server = HCloud::Server.new(name: "my_server", location: 1, ...)
|
63
|
+
server = HCloud::Server.new(name: "my_server", location: Location.new(name: "fsn"), ...)
|
64
|
+
```
|
65
|
+
|
66
|
+
The gem aims to provide a simple, object-oriented interface to the Hetzner Cloud API.
|
67
|
+
It does not aim to be an authoritative source of information, and as such does little validation on your input data or behaviour.
|
68
|
+
It expects you to use it in a sane way.
|
69
|
+
|
70
|
+
## Features
|
71
|
+
|
72
|
+
Not all Hetzner Cloud API endpoints have been implemented yet.
|
73
|
+
|
74
|
+
| Resource | State |
|
75
|
+
|-----------------------|-----------------------|
|
76
|
+
| Actions | Implemented |
|
77
|
+
| Certificates | Not implemented |
|
78
|
+
| Certificate Actions | Not implemented |
|
79
|
+
| Datacenters | Implemented |
|
80
|
+
| Firewalls | Implemented |
|
81
|
+
| Firewall Actions | Not implemented |
|
82
|
+
| Floating IPs | Implemented |
|
83
|
+
| Floating IP Actions | Implemented |
|
84
|
+
| Images | Implemented |
|
85
|
+
| Image Actions | Implemented |
|
86
|
+
| ISOs | Implemented |
|
87
|
+
| Load Balancers | Not implemented |
|
88
|
+
| Load Balancer Actions | Not implemented |
|
89
|
+
| Load Balancer Types | Not implemented |
|
90
|
+
| Locations | Implemented |
|
91
|
+
| Networks | Not implemented |
|
92
|
+
| Network Actions | Not implemented |
|
93
|
+
| Placement Groups | Implemented |
|
94
|
+
| Pricing | Not implemented |
|
95
|
+
| Servers | Partially implemented |
|
96
|
+
| Server Actions | Not implemented |
|
97
|
+
| Server Types | Implemented |
|
98
|
+
| SSH Keys | Implemented |
|
99
|
+
| Volumes | Implemented |
|
100
|
+
| Volume Actions | Implemented |
|
101
|
+
|
102
|
+
## Testing
|
103
|
+
|
104
|
+
```ssh
|
105
|
+
# Run test suite (without integration tests)
|
106
|
+
bundle exec rspec
|
107
|
+
|
108
|
+
# Run integration tests (WARNING: THIS WILL DESTROY **ALL** RESOURCES AFTER EACH RUN)
|
109
|
+
bundle exec rspec --tag integration
|
110
|
+
```
|
111
|
+
|
112
|
+
## Releasing
|
113
|
+
|
114
|
+
To release a new version, update the version number in `lib/hcloud/version.rb`, update the changelog, commit the files and create a git tag starting with `v`, and push it to the repository.
|
115
|
+
Github Actions will automatically run the test suite, build the `.gem` file and push it to [rubygems.org](https://rubygems.org).
|
116
|
+
|
117
|
+
## Contributing
|
118
|
+
|
119
|
+
Bug reports and pull requests are welcome on GitHub at [https://github.com/floriandejonckheere/hcloud](https://github.com/floriandejonckheere/hcloud).
|
120
|
+
|
121
|
+
## License
|
122
|
+
|
123
|
+
The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
HCloud.loader.inflector.inflect(
|
4
|
+
"dns_pointer" => "DNSPointer",
|
5
|
+
"hcloud" => "HCloud",
|
6
|
+
"ssh_key" => "SSHKey",
|
7
|
+
"floating_ip" => "FloatingIP",
|
8
|
+
"http" => "HTTP",
|
9
|
+
"ip_not_available" => "IPNotAvailable",
|
10
|
+
"iso" => "ISO",
|
11
|
+
"iso_type" => "ISOType",
|
12
|
+
)
|
13
|
+
|
14
|
+
ActiveSupport::Inflector.inflections(:en) do |inflect|
|
15
|
+
inflect.acronym "DNS"
|
16
|
+
inflect.acronym "JSON"
|
17
|
+
inflect.acronym "IP"
|
18
|
+
inflect.acronym "ISO"
|
19
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module CoreExt
|
4
|
+
module SendWrap
|
5
|
+
# Send a message to self, or all objects contained in self (for enumerables)
|
6
|
+
|
7
|
+
# FIXME: { env: "prod" }.send_wrap(:try, :to_h) returns { env: nil }
|
8
|
+
|
9
|
+
def send_wrap(method_name, ...)
|
10
|
+
is_a?(Array) ? map { |v| v.send(method_name, ...) } : send(method_name, ...)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
Object.include CoreExt::SendWrap
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module HCloud
|
4
|
+
class ActionCollection < Collection
|
5
|
+
attr_reader :resource
|
6
|
+
|
7
|
+
def initialize(resource)
|
8
|
+
super(&method(:all))
|
9
|
+
|
10
|
+
@resource = resource
|
11
|
+
end
|
12
|
+
|
13
|
+
def find(id)
|
14
|
+
Action.new resource
|
15
|
+
.client
|
16
|
+
.get("/#{resource.resource_name.pluralize}/#{resource.id}/actions/#{id}")
|
17
|
+
.fetch(:action)
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def all(params)
|
23
|
+
response = resource
|
24
|
+
.client
|
25
|
+
.get("/#{resource.resource_name.pluralize}/#{resource.id}/actions", params)
|
26
|
+
|
27
|
+
data = response
|
28
|
+
.fetch(:actions)
|
29
|
+
.map { |attrs| Action.new attrs }
|
30
|
+
|
31
|
+
meta = response
|
32
|
+
.fetch(:meta)
|
33
|
+
|
34
|
+
[data, meta]
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "logger"
|
4
|
+
|
5
|
+
module HCloud
|
6
|
+
class NilConnection
|
7
|
+
def raise_error(...)
|
8
|
+
raise ArgumentError, "no default client configured, set HCloud::Client.connection to an instance of HCloud::Client"
|
9
|
+
end
|
10
|
+
|
11
|
+
alias get raise_error
|
12
|
+
alias put raise_error
|
13
|
+
alias post raise_error
|
14
|
+
alias delete raise_error
|
15
|
+
end
|
16
|
+
|
17
|
+
class Client
|
18
|
+
class_attribute :connection
|
19
|
+
|
20
|
+
self.connection = NilConnection.new
|
21
|
+
|
22
|
+
attr_reader :access_token, :endpoint, :logger
|
23
|
+
|
24
|
+
def initialize(access_token:, endpoint: "https://api.hetzner.cloud/v1", logger: Logger.new("/dev/null"))
|
25
|
+
@access_token = access_token
|
26
|
+
@endpoint = endpoint
|
27
|
+
@logger = logger
|
28
|
+
end
|
29
|
+
|
30
|
+
delegate :get, :put, :post, :delete, to: :http
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def http
|
35
|
+
@http ||= HTTP.new(access_token, endpoint, logger)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module HCloud
|
4
|
+
class Collection
|
5
|
+
include Enumerable
|
6
|
+
|
7
|
+
attr_accessor :page, :previous_page, :next_page, :last_page, :per_page, :total_entries, :proc
|
8
|
+
|
9
|
+
attr_reader :sort_by, :filter_by
|
10
|
+
|
11
|
+
def initialize(&block)
|
12
|
+
@proc = block
|
13
|
+
|
14
|
+
@page = 1
|
15
|
+
@per_page = 50
|
16
|
+
|
17
|
+
@sort_by = nil
|
18
|
+
@filter_by = {}
|
19
|
+
end
|
20
|
+
|
21
|
+
def sort(*sort_by)
|
22
|
+
@sort_by = sort_by
|
23
|
+
|
24
|
+
self
|
25
|
+
end
|
26
|
+
|
27
|
+
def where(**filter_by)
|
28
|
+
@filter_by = filter_by
|
29
|
+
|
30
|
+
self
|
31
|
+
end
|
32
|
+
|
33
|
+
def each(&block)
|
34
|
+
return to_enum(:each) unless block
|
35
|
+
|
36
|
+
loop do
|
37
|
+
# Fetch page
|
38
|
+
data, meta = proc.call(params)
|
39
|
+
|
40
|
+
# Yield data in page
|
41
|
+
data.each(&block)
|
42
|
+
|
43
|
+
# Set cursor and other page attributes
|
44
|
+
meta[:pagination].each { |k, v| send(:"#{k}=", v) }
|
45
|
+
|
46
|
+
break if page == last_page
|
47
|
+
|
48
|
+
# Increment page
|
49
|
+
@page += 1
|
50
|
+
end
|
51
|
+
|
52
|
+
self
|
53
|
+
end
|
54
|
+
|
55
|
+
def count
|
56
|
+
# Fetch total_entries if not present
|
57
|
+
@count ||= (total_entries || proc.call(params.merge(page: 1)).last.dig(:pagination, :total_entries))
|
58
|
+
end
|
59
|
+
|
60
|
+
def empty?
|
61
|
+
count.zero?
|
62
|
+
end
|
63
|
+
|
64
|
+
delegate :[], :last, to: :to_a
|
65
|
+
|
66
|
+
private
|
67
|
+
|
68
|
+
def params
|
69
|
+
{
|
70
|
+
page: page,
|
71
|
+
per_page: per_page,
|
72
|
+
sort: sort_by,
|
73
|
+
**filter_by,
|
74
|
+
}
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module HCloud
|
4
|
+
module Actionable
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
included do
|
8
|
+
class_attribute :action_names
|
9
|
+
|
10
|
+
self.action_names = []
|
11
|
+
|
12
|
+
def actions
|
13
|
+
ActionCollection.new(self)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
class_methods do
|
18
|
+
def action(name)
|
19
|
+
action_names << name.to_s
|
20
|
+
|
21
|
+
define_method(name) do |**params|
|
22
|
+
Action.new client
|
23
|
+
.post("/#{resource_name.pluralize}/#{id}/actions/#{name}", params)
|
24
|
+
.fetch(:action)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module HCloud
|
4
|
+
module Concerns
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
class_methods do
|
8
|
+
def actionable
|
9
|
+
include Actionable
|
10
|
+
end
|
11
|
+
|
12
|
+
def queryable
|
13
|
+
include Queryable
|
14
|
+
end
|
15
|
+
|
16
|
+
def creatable
|
17
|
+
include Creatable
|
18
|
+
end
|
19
|
+
|
20
|
+
def updatable
|
21
|
+
include Updatable
|
22
|
+
end
|
23
|
+
|
24
|
+
def deletable
|
25
|
+
include Deletable
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module HCloud
|
4
|
+
module Creatable
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
included do
|
8
|
+
attribute :created, :datetime
|
9
|
+
|
10
|
+
def create
|
11
|
+
assign_attributes client
|
12
|
+
.post("/#{resource_name.pluralize}", creatable_params)
|
13
|
+
.fetch(resource_name.to_sym)
|
14
|
+
end
|
15
|
+
|
16
|
+
def created?
|
17
|
+
created.present?
|
18
|
+
end
|
19
|
+
|
20
|
+
def creatable_attributes
|
21
|
+
[]
|
22
|
+
end
|
23
|
+
|
24
|
+
# Convert creatable_attributes into a key-value list
|
25
|
+
# rubocop:disable Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity
|
26
|
+
def creatable_params
|
27
|
+
# Split simple and nested attributes
|
28
|
+
nested_attributes, simple_attributes = creatable_attributes.partition { |a| a.respond_to? :each }
|
29
|
+
|
30
|
+
attributes
|
31
|
+
.slice(*simple_attributes.map(&:to_s))
|
32
|
+
.transform_values { |v| v&.send_wrap(:try, :to_h) || v&.send_wrap(:to_s) }
|
33
|
+
.merge(nested_attributes.reduce(&:merge)&.map { |k, v| [k.to_s, Array(v).filter_map { |w| send(k)&.send_wrap(w) }.first] }.to_h)
|
34
|
+
.compact
|
35
|
+
end
|
36
|
+
# rubocop:enable Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity
|
37
|
+
end
|
38
|
+
|
39
|
+
class_methods do
|
40
|
+
def create(**attributes)
|
41
|
+
new(attributes)
|
42
|
+
.tap(&:create)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module HCloud
|
4
|
+
module Deletable
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
included do
|
8
|
+
def delete
|
9
|
+
client
|
10
|
+
.delete("/#{resource_name.pluralize}/#{id}")
|
11
|
+
|
12
|
+
@deleted = true
|
13
|
+
end
|
14
|
+
|
15
|
+
def deleted?
|
16
|
+
@deleted.present?
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module HCloud
|
4
|
+
module Queryable
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
included do
|
8
|
+
def reload
|
9
|
+
assign_attributes client
|
10
|
+
.get("/#{resource_name.pluralize}/#{id}")
|
11
|
+
.fetch(resource_name.to_sym)
|
12
|
+
|
13
|
+
self
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
class_methods do
|
18
|
+
def find(id)
|
19
|
+
new client
|
20
|
+
.get("/#{resource_name.pluralize}/#{id}")
|
21
|
+
.fetch(resource_name.to_sym)
|
22
|
+
end
|
23
|
+
|
24
|
+
def all
|
25
|
+
Collection.new do |params|
|
26
|
+
response = client
|
27
|
+
.get("/#{resource_name.pluralize}", params)
|
28
|
+
|
29
|
+
data = response
|
30
|
+
.fetch(resource_name.pluralize.to_sym)
|
31
|
+
.map { |attrs| new attrs }
|
32
|
+
|
33
|
+
meta = response
|
34
|
+
.fetch(:meta)
|
35
|
+
|
36
|
+
[data, meta]
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module HCloud
|
4
|
+
module Updatable
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
included do
|
8
|
+
def update
|
9
|
+
assign_attributes client
|
10
|
+
.put("/#{resource_name.pluralize}/#{id}", updatable_params)
|
11
|
+
.fetch(resource_name.to_sym)
|
12
|
+
end
|
13
|
+
|
14
|
+
def updatable_attributes
|
15
|
+
[]
|
16
|
+
end
|
17
|
+
|
18
|
+
# Convert updatable_attributes into a key-value list
|
19
|
+
def updatable_params
|
20
|
+
attributes.slice(*updatable_attributes.map(&:to_s))
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module HCloud
|
4
|
+
class ApplyTo < Entity
|
5
|
+
attribute :type
|
6
|
+
|
7
|
+
attribute :server, :server
|
8
|
+
attribute :label_selector
|
9
|
+
|
10
|
+
def to_h
|
11
|
+
# Omit `label_selector` if type is `server` and vice versa
|
12
|
+
super.except(type == "server" ? "label_selector" : "server")
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module HCloud
|
4
|
+
class DatacenterServerType < Entity
|
5
|
+
attribute :available, array: true, default: -> { [] }
|
6
|
+
attribute :available_for_migration, array: true, default: -> { [] }
|
7
|
+
attribute :supported, array: true, default: -> { [] }
|
8
|
+
end
|
9
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module HCloud
|
4
|
+
class Rule < Entity
|
5
|
+
attribute :description
|
6
|
+
|
7
|
+
attribute :source_ips, array: true, default: -> { [] }
|
8
|
+
attribute :destination_ips, array: true, default: -> { [] }
|
9
|
+
|
10
|
+
attribute :port
|
11
|
+
attribute :protocol
|
12
|
+
|
13
|
+
attribute :direction
|
14
|
+
end
|
15
|
+
end
|