hcloud 0.1.2 → 1.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.github/workflows/ruby.yml +32 -0
- data/.gitignore +0 -1
- data/.rubocop.yml +28 -10
- data/.rubocop_todo.yml +18 -121
- data/CHANGELOG.md +60 -2
- data/Gemfile +3 -0
- data/Gemfile.lock +149 -0
- data/README.md +34 -1
- data/Rakefile +2 -0
- data/bin/console +1 -0
- data/hcloud.gemspec +14 -9
- data/lib/hcloud/abstract_resource.rb +165 -60
- data/lib/hcloud/action.rb +8 -10
- data/lib/hcloud/action_resource.rb +3 -29
- data/lib/hcloud/client.rb +70 -29
- data/lib/hcloud/datacenter.rb +7 -7
- data/lib/hcloud/datacenter_resource.rb +6 -31
- data/lib/hcloud/entry_loader.rb +186 -20
- data/lib/hcloud/errors.rb +2 -0
- data/lib/hcloud/floating_ip.rb +18 -29
- data/lib/hcloud/floating_ip_resource.rb +15 -30
- data/lib/hcloud/image.rb +12 -32
- data/lib/hcloud/image_resource.rb +7 -38
- data/lib/hcloud/iso.rb +4 -1
- data/lib/hcloud/iso_resource.rb +7 -28
- data/lib/hcloud/location.rb +3 -9
- data/lib/hcloud/location_resource.rb +6 -27
- data/lib/hcloud/network.rb +33 -0
- data/lib/hcloud/network_resource.rb +25 -0
- data/lib/hcloud/pagination.rb +2 -9
- data/lib/hcloud/server.rb +37 -70
- data/lib/hcloud/server_resource.rb +17 -38
- data/lib/hcloud/server_type.rb +3 -10
- data/lib/hcloud/server_type_resource.rb +6 -28
- data/lib/hcloud/ssh_key.rb +6 -17
- data/lib/hcloud/ssh_key_resource.rb +13 -32
- data/lib/hcloud/typhoeus_ext.rb +110 -0
- data/lib/hcloud/version.rb +3 -1
- data/lib/hcloud/volume.rb +32 -0
- data/lib/hcloud/volume_resource.rb +29 -0
- data/lib/hcloud.rb +31 -5
- metadata +56 -22
- data/.travis.yml +0 -9
- data/lib/hcloud/multi_reply.rb +0 -21
data/lib/hcloud/entry_loader.rb
CHANGED
@@ -1,36 +1,202 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'active_support/concern'
|
4
|
+
require 'active_model'
|
5
|
+
|
2
6
|
module Hcloud
|
3
|
-
module EntryLoader
|
7
|
+
module EntryLoader # rubocop:disable Metrics/ModuleLength
|
4
8
|
extend ActiveSupport::Concern
|
5
9
|
|
10
|
+
module Collection
|
11
|
+
attr_accessor :response
|
12
|
+
end
|
13
|
+
|
6
14
|
included do |klass|
|
7
|
-
klass.send(:
|
8
|
-
klass.
|
9
|
-
klass.send(:attr_accessor, attribute)
|
10
|
-
end
|
15
|
+
klass.send(:attr_writer, :client)
|
16
|
+
klass.include(ActiveModel::Dirty)
|
11
17
|
end
|
12
18
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
19
|
+
class_methods do # rubocop:disable Metrics/BlockLength
|
20
|
+
attr_accessor :resource_url
|
21
|
+
|
22
|
+
def _callbacks
|
23
|
+
@_callbacks ||= { before: [], after: [] }
|
24
|
+
end
|
25
|
+
|
26
|
+
%i[before after].each do |method|
|
27
|
+
define_method(method) { |&block| _callbacks[method] << block }
|
28
|
+
end
|
29
|
+
|
30
|
+
def schema(**kwargs)
|
31
|
+
@schema ||= {}.with_indifferent_access
|
32
|
+
return @schema if kwargs.empty?
|
33
|
+
|
34
|
+
@schema.merge!(kwargs)
|
35
|
+
end
|
36
|
+
|
37
|
+
def updatable(*args)
|
38
|
+
define_attribute_methods(*args)
|
39
|
+
args.each do |updateable_attribute|
|
40
|
+
define_method(updateable_attribute) { _attributes[updateable_attribute] }
|
41
|
+
define_method("#{updateable_attribute}=") do |value|
|
42
|
+
if _attributes[updateable_attribute] != value
|
43
|
+
public_send("#{updateable_attribute}_will_change!")
|
44
|
+
end
|
45
|
+
_update_attribute(updateable_attribute, value)
|
23
46
|
end
|
24
|
-
|
25
|
-
|
26
|
-
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def destructible
|
51
|
+
define_method(:destroy) { prepare_request(method: :delete) }
|
52
|
+
end
|
53
|
+
|
54
|
+
def protectable(*args)
|
55
|
+
define_method(:change_protection) do |**kwargs|
|
56
|
+
kwargs.each_key do |key|
|
57
|
+
next if args.map(&:to_s).include? key.to_s
|
58
|
+
|
59
|
+
raise ArgumentError, "#{key} not an allowed protection mode (allowed: #{args})"
|
27
60
|
end
|
61
|
+
prepare_request('actions/change_protection', j: kwargs)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def has_actions # rubocop:disable Naming/PredicateName
|
66
|
+
define_method(:actions) do
|
67
|
+
ActionResource.new(client: client, base_path: resource_url)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def resource_class
|
72
|
+
ancestors.reverse.find { |const| const.include?(Hcloud::EntryLoader) }
|
73
|
+
end
|
74
|
+
|
75
|
+
def from_response(response, autoload_action: nil)
|
76
|
+
attributes = response.resource_attributes
|
77
|
+
action = response.parsed_json[:action] if autoload_action
|
78
|
+
client = response.context.client
|
79
|
+
if attributes.is_a?(Array)
|
80
|
+
results = attributes.map { |item| new(item).tap { |entity| entity.response = response } }
|
81
|
+
results.tap { |ary| ary.extend(Collection) }.response = response
|
82
|
+
return results
|
83
|
+
end
|
84
|
+
|
85
|
+
return Action.new(client, action) if attributes.nil? && action
|
86
|
+
return new(attributes).tap { |entity| entity.response = response } if action.nil?
|
87
|
+
|
88
|
+
[
|
89
|
+
Action.new(client, action),
|
90
|
+
new(attributes).tap { |entity| entity.response = response }
|
91
|
+
]
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
attr_accessor :response
|
96
|
+
|
97
|
+
def initialize(client = nil, kwargs = {})
|
98
|
+
if client.is_a?(Hash)
|
99
|
+
kwargs = client
|
100
|
+
client = nil
|
101
|
+
end
|
102
|
+
|
103
|
+
@client = client
|
104
|
+
_load(kwargs)
|
105
|
+
end
|
106
|
+
|
107
|
+
def inspect
|
108
|
+
"#<#{self.class.name}:0x#{__id__.to_s(16)} #{_attributes.inspect}>"
|
109
|
+
end
|
110
|
+
|
111
|
+
def client
|
112
|
+
@client || response&.context&.client
|
113
|
+
end
|
114
|
+
|
115
|
+
def resource_url
|
116
|
+
if block = self.class.resource_url
|
117
|
+
return instance_exec(&block)
|
118
|
+
end
|
119
|
+
|
120
|
+
[self.class.resource_class.name.demodulize.tableize, id].compact.join('/')
|
121
|
+
end
|
122
|
+
|
123
|
+
def resource_path
|
124
|
+
self.class.resource_class.name.demodulize.underscore
|
125
|
+
end
|
126
|
+
|
127
|
+
def prepare_request(url_suffix = nil, **kwargs, &block)
|
128
|
+
kwargs[:resource_path] ||= resource_path
|
129
|
+
kwargs[:resource_class] ||= self.class
|
130
|
+
kwargs[:autoload_action] = true unless kwargs.key?(:autoload_action)
|
131
|
+
|
132
|
+
client.prepare_request(
|
133
|
+
[resource_url, url_suffix].compact.join('/'),
|
134
|
+
**kwargs,
|
135
|
+
&block
|
136
|
+
)
|
137
|
+
end
|
138
|
+
|
139
|
+
def _attributes
|
140
|
+
@_attributes ||= {}.with_indifferent_access
|
141
|
+
end
|
142
|
+
|
143
|
+
def method_missing(method, *args, &block)
|
144
|
+
_attributes.key?(method) ? _attributes[method] : super
|
145
|
+
end
|
146
|
+
|
147
|
+
def respond_to_missing?(method, *args, &block)
|
148
|
+
_attributes.key?(method) || super
|
149
|
+
end
|
150
|
+
|
151
|
+
def update(**kwargs)
|
152
|
+
context = self
|
153
|
+
_run_callbacks(:before)
|
154
|
+
prepare_request(j: kwargs, method: :put) do |response|
|
155
|
+
response.resource_class.from_response(
|
156
|
+
response,
|
157
|
+
autoload_action: response.autoload_action
|
158
|
+
).tap do |*_args|
|
159
|
+
_run_callbacks(:after)
|
160
|
+
context.send(:changes_applied)
|
28
161
|
end
|
29
162
|
end
|
30
163
|
end
|
31
164
|
|
32
|
-
def
|
33
|
-
|
165
|
+
def save
|
166
|
+
update(changes.map { |key, _value| [key.to_sym, _attributes[key]] }.to_h)
|
167
|
+
end
|
168
|
+
|
169
|
+
def rollback
|
170
|
+
restore_attributes
|
171
|
+
end
|
172
|
+
|
173
|
+
def _run_callbacks(order)
|
174
|
+
self.class._callbacks[order].each { |block| instance_exec(&block) }
|
175
|
+
end
|
176
|
+
|
177
|
+
def _update_attribute(key, value)
|
178
|
+
_attributes[key] = value
|
179
|
+
instance_variable_set("@#{key}", value)
|
180
|
+
end
|
181
|
+
|
182
|
+
def _load(resource)
|
183
|
+
@_attributes = {}.with_indifferent_access
|
184
|
+
|
185
|
+
resource.each do |key, value|
|
186
|
+
definition = self.class.schema[key]
|
187
|
+
|
188
|
+
if definition == :time
|
189
|
+
_update_attribute(key, value ? Time.parse(value) : nil)
|
190
|
+
next
|
191
|
+
end
|
192
|
+
|
193
|
+
if definition.is_a?(Class) && definition.include?(EntryLoader)
|
194
|
+
_update_attribute(key, value ? definition.new(client, value) : nil)
|
195
|
+
next
|
196
|
+
end
|
197
|
+
|
198
|
+
_update_attribute(key, value.is_a?(Hash) ? value.with_indifferent_access : value)
|
199
|
+
end
|
34
200
|
end
|
35
201
|
end
|
36
202
|
end
|
data/lib/hcloud/errors.rb
CHANGED
data/lib/hcloud/floating_ip.rb
CHANGED
@@ -1,43 +1,32 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Hcloud
|
2
4
|
class FloatingIP
|
3
|
-
|
4
|
-
|
5
|
-
description: nil,
|
6
|
-
ip: nil,
|
7
|
-
type: nil,
|
8
|
-
dns_ptr: nil,
|
9
|
-
server: nil,
|
10
|
-
home_location: Location,
|
11
|
-
blocked: nil
|
12
|
-
}.freeze
|
5
|
+
require 'hcloud/floating_ip_resource'
|
6
|
+
|
13
7
|
include EntryLoader
|
14
8
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
9
|
+
schema(
|
10
|
+
home_location: Location,
|
11
|
+
created: :time
|
12
|
+
)
|
13
|
+
|
14
|
+
protectable :delete
|
15
|
+
updatable :description
|
16
|
+
destructible
|
17
|
+
|
18
|
+
has_actions
|
21
19
|
|
22
20
|
def assign(server:)
|
23
|
-
|
24
|
-
j: { server: server }).run.body)
|
25
|
-
Action.new(j['action'], self, client)
|
21
|
+
prepare_request('actions/assign', j: COLLECT_ARGS.call(__method__, binding))
|
26
22
|
end
|
27
23
|
|
28
24
|
def unassign
|
29
|
-
|
30
|
-
method: :post).run.body)
|
31
|
-
Action.new(j['action'], self, client)
|
32
|
-
end
|
33
|
-
|
34
|
-
def actions
|
35
|
-
ActionResource.new(client: client, parent: self, base_path: "floating_ips/#{id.to_i}")
|
25
|
+
prepare_request('actions/unassign', method: :post)
|
36
26
|
end
|
37
27
|
|
38
|
-
def
|
39
|
-
|
40
|
-
true
|
28
|
+
def change_dns_ptr(ip:, dns_ptr:)
|
29
|
+
prepare_request('actions/change_dns_ptr', j: COLLECT_ARGS.call(__method__, binding))
|
41
30
|
end
|
42
31
|
end
|
43
32
|
end
|
@@ -1,40 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Hcloud
|
2
4
|
class FloatingIPResource < AbstractResource
|
3
|
-
|
5
|
+
filter_attributes :name
|
4
6
|
|
5
|
-
|
6
|
-
mj('floating_ips') do |j|
|
7
|
-
j.flat_map { |x| x['floating_ips'].map { |x| FloatingIP.new(x, self, client) } }
|
8
|
-
end
|
9
|
-
end
|
7
|
+
bind_to FloatingIP
|
10
8
|
|
11
|
-
def
|
12
|
-
|
13
|
-
|
14
|
-
|
9
|
+
def [](arg)
|
10
|
+
case arg
|
11
|
+
when Integer then find_by(id: arg)
|
12
|
+
when String then find_by(name: arg)
|
15
13
|
end
|
16
|
-
j = Oj.load(request('floating_ips', j: query, code: 200).run.body)
|
17
|
-
[
|
18
|
-
j.key?('action') ? Action.new(j['action'], self, client) : nil,
|
19
|
-
FloatingIP.new(j['floating_ip'], self, client)
|
20
|
-
]
|
21
14
|
end
|
22
15
|
|
23
|
-
def
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
def [](arg)
|
32
|
-
case arg
|
33
|
-
when Integer
|
34
|
-
begin
|
35
|
-
find(arg)
|
36
|
-
rescue Error::NotFound
|
37
|
-
end
|
16
|
+
def create(type:, server: nil, home_location: nil, description: nil)
|
17
|
+
prepare_request(
|
18
|
+
'floating_ips', j: COLLECT_ARGS.call(__method__, binding),
|
19
|
+
expected_code: 201
|
20
|
+
) do |response|
|
21
|
+
action = Action.new(client, response[:action]) if response[:action]
|
22
|
+
[action, FloatingIP.new(client, response[:floating_ip])]
|
38
23
|
end
|
39
24
|
end
|
40
25
|
end
|
data/lib/hcloud/image.rb
CHANGED
@@ -1,42 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Hcloud
|
2
4
|
class Image
|
3
|
-
|
4
|
-
id: nil,
|
5
|
-
type: nil,
|
6
|
-
status: nil,
|
7
|
-
name: nil,
|
8
|
-
description: nil,
|
9
|
-
image_size: nil,
|
10
|
-
disk_size: nil,
|
11
|
-
created: :time,
|
12
|
-
created_from: nil,
|
13
|
-
bound_to: nil,
|
14
|
-
os_flavor: nil,
|
15
|
-
os_version: nil,
|
16
|
-
rapid_deploy: nil
|
17
|
-
}.freeze
|
5
|
+
require 'hcloud/image_resource'
|
18
6
|
|
19
7
|
include EntryLoader
|
20
8
|
|
21
|
-
|
22
|
-
|
23
|
-
|
9
|
+
schema(
|
10
|
+
created: :time,
|
11
|
+
deprecated: :time
|
12
|
+
)
|
24
13
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
(var = eval(x.last.to_s)).nil? ? r : r.merge!(x.last => var)
|
29
|
-
end
|
30
|
-
Image.new(
|
31
|
-
Oj.load(request("images/#{id.to_i}", j: query, method: :put).run.body)['image'],
|
32
|
-
parent,
|
33
|
-
client
|
34
|
-
)
|
35
|
-
end
|
14
|
+
protectable :delete
|
15
|
+
updatable :description, :type
|
16
|
+
destructible
|
36
17
|
|
37
|
-
def
|
38
|
-
|
39
|
-
true
|
18
|
+
def to_snapshot
|
19
|
+
update(type: 'snapshot')
|
40
20
|
end
|
41
21
|
end
|
42
22
|
end
|
@@ -1,46 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Hcloud
|
2
4
|
class ImageResource < AbstractResource
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
end
|
7
|
-
end
|
5
|
+
filter_attributes :type, :bound_to, :name
|
6
|
+
|
7
|
+
bind_to Image
|
8
8
|
|
9
9
|
def [](arg)
|
10
10
|
case arg
|
11
|
-
when Integer
|
12
|
-
|
13
|
-
find(arg)
|
14
|
-
rescue Error::NotFound
|
15
|
-
end
|
16
|
-
when String
|
17
|
-
find_by(name: arg)
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
def find(id)
|
22
|
-
Image.new(
|
23
|
-
Oj.load(request("images/#{id.to_i}").run.body)['image'],
|
24
|
-
self,
|
25
|
-
client
|
26
|
-
)
|
27
|
-
end
|
28
|
-
|
29
|
-
def where(sort: nil, type: nil, bound_to: nil, name: nil)
|
30
|
-
query = {}
|
31
|
-
method(:where).parameters.inject(query) do |r, x|
|
32
|
-
(var = eval(x.last.to_s)).nil? ? r : r.merge!(x.last => var)
|
33
|
-
end
|
34
|
-
mj('images', q: query) do |j|
|
35
|
-
j.flat_map { |x| x['images'].map { |x| Image.new(x, self, client) } }
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
def find_by(name:)
|
40
|
-
j = Oj.load(request('images', q: { name: name }).run.body)['images']
|
41
|
-
return if j.none?
|
42
|
-
j.each do |x|
|
43
|
-
return Image.new(x, self, client)
|
11
|
+
when Integer then find_by(id: arg)
|
12
|
+
when String then find_by(name: arg)
|
44
13
|
end
|
45
14
|
end
|
46
15
|
end
|
data/lib/hcloud/iso.rb
CHANGED
data/lib/hcloud/iso_resource.rb
CHANGED
@@ -1,36 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Hcloud
|
2
4
|
class IsoResource < AbstractResource
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
end
|
7
|
-
end
|
5
|
+
filter_attributes :name
|
6
|
+
|
7
|
+
bind_to Iso
|
8
8
|
|
9
9
|
def [](arg)
|
10
10
|
case arg
|
11
|
-
when Integer
|
12
|
-
|
13
|
-
find(arg)
|
14
|
-
rescue Error::NotFound
|
15
|
-
end
|
16
|
-
when String
|
17
|
-
find_by(name: arg)
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
def find(id)
|
22
|
-
Iso.new(
|
23
|
-
Oj.load(request("isos/#{id.to_i}").run.body)['iso'],
|
24
|
-
self,
|
25
|
-
client
|
26
|
-
)
|
27
|
-
end
|
28
|
-
|
29
|
-
def find_by(name:)
|
30
|
-
j = Oj.load(request('isos', q: { name: name }).run.body)['isos']
|
31
|
-
return if j.none?
|
32
|
-
j.each do |x|
|
33
|
-
return Iso.new(x, self, client)
|
11
|
+
when Integer then find_by(id: arg)
|
12
|
+
when String then find_by(name: arg)
|
34
13
|
end
|
35
14
|
end
|
36
15
|
end
|
data/lib/hcloud/location.rb
CHANGED
@@ -1,14 +1,8 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Hcloud
|
2
4
|
class Location
|
3
|
-
|
4
|
-
id: nil,
|
5
|
-
name: nil,
|
6
|
-
description: nil,
|
7
|
-
country: nil,
|
8
|
-
city: nil,
|
9
|
-
longitude: nil,
|
10
|
-
latitude: nil
|
11
|
-
}.freeze
|
5
|
+
require 'hcloud/location_resource'
|
12
6
|
|
13
7
|
include EntryLoader
|
14
8
|
end
|
@@ -1,36 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Hcloud
|
2
4
|
class LocationResource < AbstractResource
|
3
|
-
|
4
|
-
mj('locations') do |j|
|
5
|
-
j.flat_map { |x| x['locations'].map { |x| Location.new(x, self, client) } }
|
6
|
-
end
|
7
|
-
end
|
5
|
+
filter_attributes :name
|
8
6
|
|
9
|
-
|
10
|
-
Location.new(
|
11
|
-
Oj.load(request("locations/#{id}").run.body)['location'],
|
12
|
-
self,
|
13
|
-
client
|
14
|
-
)
|
15
|
-
end
|
16
|
-
|
17
|
-
def find_by(name:)
|
18
|
-
x = Oj.load(request('locations', q: { name: name }).run.body)['locations']
|
19
|
-
return nil if x.none?
|
20
|
-
x.each do |s|
|
21
|
-
return Location.new(s, self, client)
|
22
|
-
end
|
23
|
-
end
|
7
|
+
bind_to Location
|
24
8
|
|
25
9
|
def [](arg)
|
26
10
|
case arg
|
27
|
-
when Integer
|
28
|
-
|
29
|
-
find(arg)
|
30
|
-
rescue Error::NotFound
|
31
|
-
end
|
32
|
-
when String
|
33
|
-
find_by(name: arg)
|
11
|
+
when Integer then find_by(id: arg)
|
12
|
+
when String then find_by(name: arg)
|
34
13
|
end
|
35
14
|
end
|
36
15
|
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Hcloud
|
4
|
+
class Network
|
5
|
+
include EntryLoader
|
6
|
+
|
7
|
+
schema(
|
8
|
+
created: :time
|
9
|
+
)
|
10
|
+
|
11
|
+
protectable :delete
|
12
|
+
updatable :name
|
13
|
+
destructible
|
14
|
+
|
15
|
+
has_actions
|
16
|
+
|
17
|
+
def add_subnet(type:, network_zone:, ip_range: nil)
|
18
|
+
prepare_request('actions/add_subnet', j: COLLECT_ARGS.call(__method__, binding))
|
19
|
+
end
|
20
|
+
|
21
|
+
def del_subnet(ip_range:)
|
22
|
+
prepare_request('actions/del_subnet', j: COLLECT_ARGS.call(__method__, binding))
|
23
|
+
end
|
24
|
+
|
25
|
+
def add_route(destination:, gateway:)
|
26
|
+
prepare_request('actions/add_route', j: COLLECT_ARGS.call(__method__, binding))
|
27
|
+
end
|
28
|
+
|
29
|
+
def del_route(destination:, gateway:)
|
30
|
+
prepare_request('actions/del_route', j: COLLECT_ARGS.call(__method__, binding))
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Hcloud
|
4
|
+
class NetworkResource < AbstractResource
|
5
|
+
filter_attributes :name
|
6
|
+
|
7
|
+
bind_to Network
|
8
|
+
|
9
|
+
def [](arg)
|
10
|
+
case arg
|
11
|
+
when Integer then find_by(id: arg)
|
12
|
+
when String then find_by(name: arg)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def create(name:, ip_range:, subnets: nil, routes: nil)
|
17
|
+
prepare_request(
|
18
|
+
'networks', j: COLLECT_ARGS.call(__method__, binding),
|
19
|
+
expected_code: 201
|
20
|
+
) do |response|
|
21
|
+
Network.new(client, response.parsed_json[:network])
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
data/lib/hcloud/pagination.rb
CHANGED