Skip to content

Commit fcd19d2

Browse files
add reserved ipv6 support (#332)
* add support for reserved ipv6 api * fix rubocop warning + failing test * disable module length check on dropket_kit module/class * Update spec/lib/droplet_kit/resources/reserved_ipv6_resource_spec.rb Co-authored-by: Ben Tranter <[email protected]> * Update README.md Co-authored-by: Ben Tranter <[email protected]> --------- Co-authored-by: Ben Tranter <[email protected]>
1 parent 2a7e6e1 commit fcd19d2

File tree

16 files changed

+902
-0
lines changed

16 files changed

+902
-0
lines changed

README.md

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -585,6 +585,31 @@ Actions supported:
585585
* `client.reserved_ip_actions.assign(ip: reserved_ip.ip, droplet_id: droplet.id)`
586586
* `client.reserved_ip_actions.unassign(ip: reserved_ip.ip)`
587587

588+
## Reserved IPv6 resource
589+
590+
client = DropletKit::Client.new(access_token: 'TOKEN')
591+
client.reserved_ipv6s #=> DropletKit::ReservedIpv6Resource
592+
reserved_ipv6 = DropletKit::ReservedIpv6.new(
593+
region_slug: 'nyc1'
594+
)
595+
596+
Actions supported:
597+
598+
* `client.reserved_ipv6s.all()`
599+
* `client.reserved_ipv6s.find(ip: 'ip address')`
600+
* `client.reserved_ipv6s.create(reserved_ipv6)`
601+
* `client.reserved_ipv6s.delete(ip: 'ip address')`
602+
603+
## Reserved IPv6 Action resource
604+
605+
client = DropletKit::Client.new(access_token: 'TOKEN')
606+
client.reserved_ipv6_actions #=> DropletKit::ReservedIpv6ActionResource
607+
608+
Actions supported:
609+
610+
* `client.reserved_ipv6_actions.assign(ip: reserved_ipv6.ip, droplet_id: droplet.id)`
611+
* `client.reserved_ipv6_actions.unassign(ip: reserved_ipv6.ip)`
612+
588613
## Volume resource
589614

590615
client = DropletKit::Client.new(access_token: 'TOKEN')

lib/droplet_kit.rb

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
require 'resource_kit'
55
require 'kartograph'
66

7+
# rubocop:disable Metrics/ModuleLength
78
module DropletKit
89
autoload :Client, 'droplet_kit/client'
910

@@ -31,6 +32,7 @@ module DropletKit
3132
autoload :DropletUpgrade, 'droplet_kit/models/droplet_upgrade'
3233
autoload :FloatingIp, 'droplet_kit/models/floating_ip'
3334
autoload :ReservedIp, 'droplet_kit/models/reserved_ip'
35+
autoload :ReservedIpv6, 'droplet_kit/models/reserved_ipv6'
3436
autoload :Project, 'droplet_kit/models/project'
3537
autoload :ProjectAssignment, 'droplet_kit/models/project_assignment'
3638
autoload :Links, 'droplet_kit/models/links'
@@ -155,7 +157,9 @@ module DropletKit
155157
autoload :FloatingIpResource, 'droplet_kit/resources/floating_ip_resource'
156158
autoload :FloatingIpActionResource, 'droplet_kit/resources/floating_ip_action_resource'
157159
autoload :ReservedIpResource, 'droplet_kit/resources/reserved_ip_resource'
160+
autoload :ReservedIpv6Resource, 'droplet_kit/resources/reserved_ipv6_resource'
158161
autoload :ReservedIpActionResource, 'droplet_kit/resources/reserved_ip_action_resource'
162+
autoload :ReservedIpv6ActionResource, 'droplet_kit/resources/reserved_ipv6_action_resource'
159163
autoload :ProjectResource, 'droplet_kit/resources/project_resource'
160164
autoload :TagResource, 'droplet_kit/resources/tag_resource'
161165
autoload :VolumeResource, 'droplet_kit/resources/volume_resource'
@@ -197,6 +201,7 @@ module DropletKit
197201
autoload :DropletUpgradeMapping, 'droplet_kit/mappings/droplet_upgrade_mapping'
198202
autoload :FloatingIpMapping, 'droplet_kit/mappings/floating_ip_mapping'
199203
autoload :ReservedIpMapping, 'droplet_kit/mappings/reserved_ip_mapping'
204+
autoload :ReservedIpv6Mapping, 'droplet_kit/mappings/reserved_ipv6_mapping'
200205
autoload :ProjectMapping, 'droplet_kit/mappings/project_mapping'
201206
autoload :ProjectAssignmentMapping, 'droplet_kit/mappings/project_assignment_mapping'
202207
autoload :LinksMapping, 'droplet_kit/mappings/links_mapping'
@@ -324,3 +329,4 @@ def remaining
324329
end
325330
end
326331
end
332+
# rubocop:enable Metrics/ModuleLength

lib/droplet_kit/client.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,9 @@ def self.resources
7575
floating_ips: FloatingIpResource,
7676
floating_ip_actions: FloatingIpActionResource,
7777
reserved_ips: ReservedIpResource,
78+
reserved_ipv6s: ReservedIpv6Resource,
7879
reserved_ip_actions: ReservedIpActionResource,
80+
reserved_ipv6_actions: ReservedIpv6ActionResource,
7981
tags: TagResource,
8082
projects: ProjectResource,
8183
volumes: VolumeResource,
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
# frozen_string_literal: true
2+
3+
module DropletKit
4+
class ReservedIpv6Mapping
5+
include Kartograph::DSL
6+
7+
kartograph do
8+
mapping ReservedIpv6
9+
root_key plural: 'reserved_ipv6s', singular: 'reserved_ipv6', scopes: [:read]
10+
11+
property :ip, scopes: [:read]
12+
property :region_slug, scopes: %i[read create]
13+
property :droplet, scopes: [:read], include: DropletMapping
14+
property :reserved_at, scopes: [:read]
15+
end
16+
end
17+
end
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# frozen_string_literal: true
2+
3+
module DropletKit
4+
class ReservedIpv6 < BaseModel
5+
attribute :ip
6+
attribute :droplet
7+
attribute :reserved_at
8+
# Used for creates
9+
attribute :region_slug
10+
11+
def identifier
12+
ip
13+
end
14+
15+
def self.from_identifier(identifier)
16+
new(ip: identifier)
17+
end
18+
end
19+
end
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
# frozen_string_literal: true
2+
3+
module DropletKit
4+
class ReservedIpv6ActionResource < ResourceKit::Resource
5+
resources do
6+
default_handler(422) { |response| ErrorMapping.fail_with(FailedCreate, response.body) }
7+
default_handler(400) { |response| ErrorMapping.fail_with(FailedCreate, response.body) }
8+
9+
action :assign, 'POST /v2/reserved_ipv6/:ip/actions' do
10+
body { |hash| { type: 'assign', droplet_id: hash[:droplet_id] }.to_json }
11+
handler(201, 200) { |response| ActionMapping.extract_single(response.body, :read) }
12+
end
13+
14+
action :unassign, 'POST /v2/reserved_ipv6/:ip/actions' do
15+
body { |hash| { type: 'unassign' }.to_json }
16+
handler(201, 200) { |response| ActionMapping.extract_single(response.body, :read) }
17+
end
18+
end
19+
end
20+
end
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
# frozen_string_literal: true
2+
3+
module DropletKit
4+
class ReservedIpv6Resource < ResourceKit::Resource
5+
resources do
6+
action :all, 'GET /v2/reserved_ipv6' do
7+
query_keys :per_page, :page
8+
handler(200) { |response| ReservedIpv6Mapping.extract_collection(response.body, :read) }
9+
end
10+
11+
action :find, 'GET /v2/reserved_ipv6/:ip' do
12+
handler(200) { |response| ReservedIpv6Mapping.extract_single(response.body, :read) }
13+
handler(404) { |response| ErrorMapping.fail_with(Error, response.body) }
14+
end
15+
16+
action :create, 'POST /v2/reserved_ipv6' do
17+
body { |object| ReservedIpv6Mapping.representation_for(:create, object) }
18+
handler(201) { |response| ReservedIpv6Mapping.extract_single(response.body, :read) }
19+
handler(422) { |response| ErrorMapping.fail_with(FailedCreate, response.body) }
20+
end
21+
22+
action :delete, 'DELETE /v2/reserved_ipv6/:ip' do
23+
handler(404) { |response| ErrorMapping.fail_with(FailedDelete, response.body) }
24+
handler(202) { |response| ActionMapping.extract_single(response.body, :read) }
25+
handler(204) { |response| true }
26+
end
27+
end
28+
29+
def all(*args)
30+
PaginatedResource.new(action(:all), self, *args)
31+
end
32+
end
33+
end

0 commit comments

Comments
 (0)