yao 0.17.0 → 0.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/yao/error.rb +1 -1
- data/lib/yao/resources/floating_ip.rb +27 -0
- data/lib/yao/resources/port.rb +16 -0
- data/lib/yao/resources/restfully_accessible.rb +9 -5
- data/lib/yao/version.rb +1 -1
- data/test/yao/resources/test_floating_ip.rb +91 -0
- data/test/yao/resources/test_port.rb +48 -0
- data/test/yao/resources/test_restfully_accessible.rb +41 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a30ea9865b8d2944f386d9fe9cfc843a6414b1de2fe3fa53f0515c6679042697
|
4
|
+
data.tar.gz: 3e3ff0f51fccd67726f8e70e5801db2299963d7627898312a4640e37027bc8ad
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7b13454b9f63ce5388d5f5402a7b75db56a23a080ede490748d9928ac2a96e6d094418e3e247b120a3d41224d7896e732d1e8a19d12d13c84e0a73a9dc3d86d9
|
7
|
+
data.tar.gz: a3fdc1732d6d1853c612a204180968f6a62accddf65c66b74983f23bacbfd89bf699e4bb30086c6e10ba9eaefa7976ed8357b9da7e32c98bc046dd60f394d206
|
data/lib/yao/error.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
module Yao
|
2
2
|
class ReadOnlyViolationError < ::StandardError; end
|
3
3
|
class TooManyItemFonud < ::StandardError; end
|
4
|
-
class
|
4
|
+
class InvalidRequest < ::StandardError; end
|
5
5
|
|
6
6
|
class ServerError < ::StandardError
|
7
7
|
def initialize(message, requested_env)
|
@@ -18,5 +18,32 @@ module Yao::Resources
|
|
18
18
|
def router
|
19
19
|
@router ||= Yao::Router.get(router_id)
|
20
20
|
end
|
21
|
+
|
22
|
+
# @param [Yao::Resources::Port]
|
23
|
+
# @return [Yao::Resources::FloatingIP]
|
24
|
+
def associate_port(port)
|
25
|
+
self.class.associate_port(id, port.id)
|
26
|
+
end
|
27
|
+
|
28
|
+
# @return [Yao::Resources::FloatingIP]
|
29
|
+
def disassociate_port
|
30
|
+
self.class.disassociate_port(id)
|
31
|
+
end
|
32
|
+
|
33
|
+
class << self
|
34
|
+
|
35
|
+
# @param id [String] ID of floating_ip
|
36
|
+
# @param port_id [String] ID of port
|
37
|
+
# @return [Yao::Resources::FloatingIP]
|
38
|
+
def associate_port(id, port_id)
|
39
|
+
update(id, port_id: port_id)
|
40
|
+
end
|
41
|
+
|
42
|
+
# @param id [String] ID of floating_ip
|
43
|
+
# @return [Yao::Resources::FloatingIP]
|
44
|
+
def disassociate_port(id)
|
45
|
+
update(id, port_id: nil)
|
46
|
+
end
|
47
|
+
end
|
21
48
|
end
|
22
49
|
end
|
data/lib/yao/resources/port.rb
CHANGED
@@ -19,6 +19,22 @@ module Yao::Resources
|
|
19
19
|
@subnet ||= Yao::Subnet.find fixed_ips.first["subnet_id"]
|
20
20
|
end
|
21
21
|
|
22
|
+
# @return [Yao::FloatingIP]
|
23
|
+
def floating_ip
|
24
|
+
# notice: port が floating_ip を持たない場合has_floating_ip? を呼び出す度に
|
25
|
+
# Yao::FloatingIP.list を評価しなくていいように defined? を入れている
|
26
|
+
if defined?(@floating_ip)
|
27
|
+
@floating_ip
|
28
|
+
else
|
29
|
+
@floating_ip = Yao::FloatingIP.list(port_id: id).first
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
# @return [Bool]
|
34
|
+
def has_floating_ip?
|
35
|
+
!!floating_ip
|
36
|
+
end
|
37
|
+
|
22
38
|
self.service = "network"
|
23
39
|
self.resource_name = "port"
|
24
40
|
self.resources_name = "ports"
|
@@ -131,7 +131,7 @@ module Yao::Resources
|
|
131
131
|
# @param query [Hash]
|
132
132
|
# @return [Yao::Resources::*]
|
133
133
|
def get(id_or_name_or_permalink, query={})
|
134
|
-
res = if id_or_name_or_permalink
|
134
|
+
res = if id_or_name_or_permalink&.start_with?("http://", "https://")
|
135
135
|
GET(id_or_name_or_permalink, query)
|
136
136
|
elsif uuid?(id_or_name_or_permalink)
|
137
137
|
GET(create_url(id_or_name_or_permalink), query)
|
@@ -148,7 +148,7 @@ module Yao::Resources
|
|
148
148
|
# @return [Yao::Resources::*]
|
149
149
|
def get!(id_or_name_or_permalink, query={})
|
150
150
|
get(id_or_name_or_permalink, query)
|
151
|
-
rescue Yao::ItemNotFound, Yao::NotFound, Yao::
|
151
|
+
rescue Yao::ItemNotFound, Yao::NotFound, Yao::InvalidRequest
|
152
152
|
nil
|
153
153
|
end
|
154
154
|
|
@@ -235,15 +235,19 @@ module Yao::Resources
|
|
235
235
|
# @return [Yao::Resources::*]
|
236
236
|
def get_by_name(name, query={})
|
237
237
|
|
238
|
+
# 空またnilの場合listと同じURLにリクエストしてしまい意図しないレスポンスが返ってくる
|
239
|
+
if name.nil? || name.empty?
|
240
|
+
raise Yao::InvalidRequest.new("Invalid request with empty name or nil")
|
241
|
+
end
|
242
|
+
|
238
243
|
begin
|
239
244
|
GET(create_url(name), query)
|
240
|
-
rescue => e
|
241
|
-
raise e unless e.class == Yao::ItemNotFound || e.class == Yao::NotFound
|
245
|
+
rescue Yao::ItemNotFound, Yao::NotFound => e
|
242
246
|
item = find_by_name(name).select { |r| r.name == name }
|
243
247
|
if item.size > 1
|
244
248
|
raise Yao::TooManyItemFonud.new("More than one resource exists with the name '#{name}'")
|
245
249
|
elsif item.size.zero?
|
246
|
-
raise
|
250
|
+
raise e
|
247
251
|
end
|
248
252
|
GET(create_url(item.first.id), query)
|
249
253
|
end
|
data/lib/yao/version.rb
CHANGED
@@ -131,4 +131,95 @@ class TestFloatingIP < TestYaoResource
|
|
131
131
|
|
132
132
|
assert_requested(stub)
|
133
133
|
end
|
134
|
+
|
135
|
+
def test_associate_port
|
136
|
+
|
137
|
+
floating_ip = Yao::FloatingIP.new("id" => "00000000-0000-0000-0000-000000000000")
|
138
|
+
port = Yao::Port.new("id" => "01234567-0123-0123-0123-0123456789ab")
|
139
|
+
|
140
|
+
stub = stub_request(:put, "https://example.com:12345/floatingips/00000000-0000-0000-0000-000000000000").
|
141
|
+
with(
|
142
|
+
body: '{"floatingip":{"port_id":"01234567-0123-0123-0123-0123456789ab"}}'
|
143
|
+
)
|
144
|
+
.to_return(
|
145
|
+
status: 200,
|
146
|
+
body: <<-JSON,
|
147
|
+
{
|
148
|
+
"floatingip": {
|
149
|
+
"id": "00000000-0000-0000-0000-000000000000"
|
150
|
+
}
|
151
|
+
}
|
152
|
+
JSON
|
153
|
+
headers: {'Content-Type' => 'application/json'}
|
154
|
+
)
|
155
|
+
|
156
|
+
resource = Yao::FloatingIP.associate_port(floating_ip.id, port.id)
|
157
|
+
assert_instance_of(Yao::FloatingIP, resource)
|
158
|
+
assert_equal("00000000-0000-0000-0000-000000000000", resource.id)
|
159
|
+
|
160
|
+
assert_requested(stub)
|
161
|
+
end
|
162
|
+
|
163
|
+
sub_test_case 'Yao::FloatingIP#associate_port' do
|
164
|
+
|
165
|
+
def setup
|
166
|
+
stub(Yao::Resources::FloatingIP).associate_port {}
|
167
|
+
end
|
168
|
+
|
169
|
+
def test_associate_port
|
170
|
+
floating_ip = Yao::FloatingIP.new("id" => "00000000-0000-0000-0000-000000000000")
|
171
|
+
port = Yao::Port.new("id" => "01234567-0123-0123-0123-0123456789ab")
|
172
|
+
|
173
|
+
floating_ip.associate_port(port)
|
174
|
+
|
175
|
+
assert_received(Yao::Resources::FloatingIP) { |subject|
|
176
|
+
subject.associate_port(floating_ip.id, port.id)
|
177
|
+
}
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
181
|
+
def test_disassociate_port
|
182
|
+
|
183
|
+
stub = stub_request(:put, "https://example.com:12345/floatingips/00000000-0000-0000-0000-000000000000").
|
184
|
+
with(
|
185
|
+
body: '{"floatingip":{"port_id":null}}'
|
186
|
+
)
|
187
|
+
.to_return(
|
188
|
+
status: 200,
|
189
|
+
body: <<-JSON,
|
190
|
+
{
|
191
|
+
"floatingip": {
|
192
|
+
"id": "00000000-0000-0000-0000-000000000000"
|
193
|
+
}
|
194
|
+
}
|
195
|
+
JSON
|
196
|
+
headers: {'Content-Type' => 'application/json'}
|
197
|
+
)
|
198
|
+
|
199
|
+
floating_ip = Yao::FloatingIP.new("id" => "00000000-0000-0000-0000-000000000000")
|
200
|
+
|
201
|
+
resource = Yao::FloatingIP.disassociate_port(floating_ip.id)
|
202
|
+
assert_instance_of(Yao::FloatingIP, resource)
|
203
|
+
assert_equal("00000000-0000-0000-0000-000000000000", resource.id)
|
204
|
+
|
205
|
+
assert_requested(stub)
|
206
|
+
end
|
207
|
+
|
208
|
+
sub_test_case 'Yao::FloatingIP#disassociate_port' do
|
209
|
+
|
210
|
+
def setup
|
211
|
+
stub(Yao::Resources::FloatingIP).disassociate_port {}
|
212
|
+
end
|
213
|
+
|
214
|
+
def test_associate_port
|
215
|
+
floating_ip = Yao::FloatingIP.new("id" => "00000000-0000-0000-0000-000000000000")
|
216
|
+
port = Yao::Port.new("id" => "01234567-0123-0123-0123-0123456789ab")
|
217
|
+
|
218
|
+
floating_ip.disassociate_port
|
219
|
+
|
220
|
+
assert_received(Yao::Resources::FloatingIP) { |subject|
|
221
|
+
subject.disassociate_port(floating_ip.id)
|
222
|
+
}
|
223
|
+
end
|
224
|
+
end
|
134
225
|
end
|
@@ -170,4 +170,52 @@ class TestPort < TestYaoResource
|
|
170
170
|
|
171
171
|
assert_requested(stub)
|
172
172
|
end
|
173
|
+
|
174
|
+
def test_floating_ip
|
175
|
+
|
176
|
+
stub = stub_request(:get, "https://example.com:12345/floatingips?port_id")
|
177
|
+
.to_return(
|
178
|
+
status: 200,
|
179
|
+
body: <<-JSON,
|
180
|
+
{
|
181
|
+
"floatingips": [{
|
182
|
+
"id": "00000000-0000-0000-0000-000000000000"
|
183
|
+
}]
|
184
|
+
}
|
185
|
+
JSON
|
186
|
+
headers: {'Content-Type' => 'application/json'}
|
187
|
+
)
|
188
|
+
|
189
|
+
params = {
|
190
|
+
"port_id" => "00000000-0000-0000-0000-000000000000",
|
191
|
+
}
|
192
|
+
|
193
|
+
port = Yao::Port.new(params)
|
194
|
+
assert_instance_of(Yao::FloatingIP, port.floating_ip)
|
195
|
+
assert_true(port.has_floating_ip?)
|
196
|
+
assert_requested(stub)
|
197
|
+
end
|
198
|
+
|
199
|
+
def test_floating_ip_empty
|
200
|
+
|
201
|
+
stub = stub_request(:get, "https://example.com:12345/floatingips?port_id")
|
202
|
+
.to_return(
|
203
|
+
status: 200,
|
204
|
+
body: <<-JSON,
|
205
|
+
{
|
206
|
+
"floatingips": []
|
207
|
+
}
|
208
|
+
JSON
|
209
|
+
headers: {'Content-Type' => 'application/json'}
|
210
|
+
)
|
211
|
+
|
212
|
+
params = {
|
213
|
+
"port_id" => "00000000-0000-0000-0000-000000000000",
|
214
|
+
}
|
215
|
+
|
216
|
+
port = Yao::Port.new(params)
|
217
|
+
assert_nil(port.floating_ip)
|
218
|
+
assert_false(port.has_floating_ip?)
|
219
|
+
assert_requested(stub)
|
220
|
+
end
|
173
221
|
end
|
@@ -88,7 +88,7 @@ class TestRestfullyAccesible < Test::Unit::TestCase
|
|
88
88
|
stub_get_request_not_found([@url, @resources_name, name].join('/'))
|
89
89
|
stub_get_request_with_json_response([@url, "#{@resources_name}?name=#{name}"].join('/'), body)
|
90
90
|
|
91
|
-
assert_raise(Yao::
|
91
|
+
assert_raise(Yao::ItemNotFound, "raise proper exception") do
|
92
92
|
Test.get(name)
|
93
93
|
end
|
94
94
|
end
|
@@ -139,6 +139,46 @@ class TestRestfullyAccesible < Test::Unit::TestCase
|
|
139
139
|
|
140
140
|
assert_equal(uuid, Test.send(:get_by_name, 'dummy').body[@resource_name]['id'])
|
141
141
|
end
|
142
|
+
|
143
|
+
test 'multiple same name found' do
|
144
|
+
name = 'dummy'
|
145
|
+
uuid = '00112233-4455-6677-8899-aabbccddeeff'
|
146
|
+
list_body = { @resources_name => [
|
147
|
+
{ 'name' => 'dummy', 'id' => uuid },
|
148
|
+
{ 'name' => 'dummy', 'id' => '308cb410-9c84-40ec-a3eb-583001aaa7fd' }
|
149
|
+
]}
|
150
|
+
stub1 = stub_get_request_not_found([@url, @resources_name, name].join('/'))
|
151
|
+
stub2 = stub_get_request_with_json_response([@url, "#{@resources_name}?name=#{name}"].join('/'), list_body)
|
152
|
+
|
153
|
+
assert_raise(Yao::TooManyItemFonud, "More than one resource exists with the name '#{name}'") do
|
154
|
+
Test.send(:get_by_name, name)
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
test 'empty name' do
|
159
|
+
assert_raise(Yao::InvalidRequest, "Invalid requeset with empty name or nil") do
|
160
|
+
Test.send(:get_by_name, '')
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
test 'nil' do
|
165
|
+
assert_raise(Yao::InvalidRequest, "Invalid requeset with empty name or nil") do
|
166
|
+
Test.send(:get_by_name, nil)
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
test 'not found' do
|
171
|
+
name = "dummy"
|
172
|
+
uuid = "00112233-4455-6677-8899-aabbccddeeff"
|
173
|
+
body = {@resources_name => []}
|
174
|
+
|
175
|
+
stub1 = stub_get_request_not_found([@url, @resources_name, name].join('/'))
|
176
|
+
stub2 = stub_get_request_with_json_response([@url, "#{@resources_name}?name=#{name}"].join('/'), body)
|
177
|
+
|
178
|
+
assert_raise(Yao::ItemNotFound) do
|
179
|
+
Test.send(:get_by_name, name)
|
180
|
+
end
|
181
|
+
end
|
142
182
|
end
|
143
183
|
|
144
184
|
def test_find_by_name
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: yao
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.18.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Uchio, KONDO
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-04-
|
11
|
+
date: 2022-04-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: json
|