yao 0.15.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/.github/workflows/rubocop.yml +2 -2
- data/.github/workflows/ubuntu-rvm.yml +1 -1
- data/.github/workflows/ubuntu.yml +2 -2
- data/lib/yao/error.rb +1 -1
- data/lib/yao/resources/base.rb +17 -5
- data/lib/yao/resources/flavor.rb +10 -0
- data/lib/yao/resources/floating_ip.rb +26 -5
- data/lib/yao/resources/loadbalancer_pool.rb +10 -20
- data/lib/yao/resources/meter.rb +1 -1
- data/lib/yao/resources/network.rb +1 -1
- data/lib/yao/resources/old_sample.rb +1 -1
- data/lib/yao/resources/port.rb +17 -1
- data/lib/yao/resources/{tenant_associationable.rb → project_associationable.rb} +5 -5
- data/lib/yao/resources/resource.rb +1 -1
- data/lib/yao/resources/restfully_accessible.rb +11 -6
- data/lib/yao/resources/role_assignment.rb +2 -2
- data/lib/yao/resources/router.rb +19 -10
- data/lib/yao/resources/security_group.rb +1 -1
- data/lib/yao/resources/server.rb +6 -1
- data/lib/yao/resources/subnet.rb +1 -1
- data/lib/yao/resources/volume.rb +2 -0
- data/lib/yao/resources.rb +1 -1
- data/lib/yao/version.rb +1 -1
- data/test/yao/resources/test_base.rb +21 -0
- data/test/yao/resources/test_flavor.rb +67 -33
- data/test/yao/resources/test_floating_ip.rb +96 -5
- data/test/yao/resources/test_loadbalancer_pool.rb +146 -1
- data/test/yao/resources/test_meter.rb +5 -5
- data/test/yao/resources/test_network.rb +6 -6
- data/test/yao/resources/test_port.rb +54 -6
- data/test/yao/resources/test_restfully_accessible.rb +87 -5
- data/test/yao/resources/test_role_assignment.rb +3 -3
- data/test/yao/resources/test_router.rb +33 -12
- data/test/yao/resources/test_security_group.rb +5 -5
- data/test/yao/resources/test_server.rb +52 -6
- data/test/yao/resources/test_subnet.rb +6 -6
- data/test/yao/resources/test_volume.rb +21 -0
- data/yao.gemspec +1 -1
- metadata +6 -6
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
|
@@ -8,9 +8,9 @@ jobs:
|
|
8
8
|
steps:
|
9
9
|
- uses: actions/checkout@master
|
10
10
|
- name: Set up Ruby
|
11
|
-
uses:
|
11
|
+
uses: ruby/setup-ruby@v1
|
12
12
|
with:
|
13
|
-
ruby-version: 3.
|
13
|
+
ruby-version: 3.1
|
14
14
|
- name: Install dependencies
|
15
15
|
run: |
|
16
16
|
gem install bundler --no-document
|
@@ -7,11 +7,11 @@ jobs:
|
|
7
7
|
runs-on: ubuntu-latest
|
8
8
|
strategy:
|
9
9
|
matrix:
|
10
|
-
ruby: [3.
|
10
|
+
ruby: [3.1, 3.0, 2.7]
|
11
11
|
steps:
|
12
12
|
- uses: actions/checkout@master
|
13
13
|
- name: Set up Ruby
|
14
|
-
uses:
|
14
|
+
uses: ruby/setup-ruby@v1
|
15
15
|
with:
|
16
16
|
ruby-version: ${{ matrix.ruby }}
|
17
17
|
- name: Install dependencies
|
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)
|
data/lib/yao/resources/base.rb
CHANGED
@@ -8,9 +8,6 @@ module Yao::Resources
|
|
8
8
|
def self.friendly_attributes(*names)
|
9
9
|
names.map(&:to_s).each do |name|
|
10
10
|
define_method(name) do
|
11
|
-
if !@data.key?(name) && id
|
12
|
-
@data = self.class.get(id).to_hash
|
13
|
-
end
|
14
11
|
self[name]
|
15
12
|
end
|
16
13
|
end
|
@@ -58,6 +55,9 @@ module Yao::Resources
|
|
58
55
|
# @param name [String]
|
59
56
|
# @return [String]
|
60
57
|
def [](name)
|
58
|
+
unless @data["id"].nil? || @data.key?(name) || name.include?("__")
|
59
|
+
@data = self.class.get(@data["id"]).to_hash
|
60
|
+
end
|
61
61
|
@data[name]
|
62
62
|
end
|
63
63
|
|
@@ -80,18 +80,30 @@ module Yao::Resources
|
|
80
80
|
|
81
81
|
# @return [Date]
|
82
82
|
def created
|
83
|
-
if date = self["
|
83
|
+
if date = self["created_at"] || self["created"]
|
84
84
|
Time.parse(date)
|
85
85
|
end
|
86
86
|
end
|
87
87
|
|
88
88
|
# @return [Date]
|
89
89
|
def updated
|
90
|
-
if date = self["
|
90
|
+
if date = self["updated_at"] || self["updated"]
|
91
91
|
Time.parse(date)
|
92
92
|
end
|
93
93
|
end
|
94
94
|
|
95
|
+
# @param resource_params [Hash]
|
96
|
+
# @return [Yao::Resources::*]
|
97
|
+
def update(resource_params)
|
98
|
+
self.class.update(id, resource_params)
|
99
|
+
end
|
100
|
+
|
101
|
+
# @return [String]
|
102
|
+
def destroy
|
103
|
+
self.class.destroy(id)
|
104
|
+
end
|
105
|
+
alias delete destroy
|
106
|
+
|
95
107
|
extend RestfullyAccessible
|
96
108
|
end
|
97
109
|
end
|
data/lib/yao/resources/flavor.rb
CHANGED
@@ -20,5 +20,15 @@ module Yao::Resources
|
|
20
20
|
self.resource_name = "flavor"
|
21
21
|
self.resources_name = "flavors"
|
22
22
|
self.resources_detail_available = true
|
23
|
+
|
24
|
+
class << self
|
25
|
+
# override Yao::Resources::RestfullyAccessible#find_by_name
|
26
|
+
# @return [Array<Yao::Resources::Role>]
|
27
|
+
def find_by_name(name, query={})
|
28
|
+
list(query).select do |flavor|
|
29
|
+
flavor.name == name
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
23
33
|
end
|
24
34
|
end
|
@@ -2,7 +2,7 @@ module Yao::Resources
|
|
2
2
|
class FloatingIP < Base
|
3
3
|
|
4
4
|
include PortAssociationable
|
5
|
-
include
|
5
|
+
include ProjectAssociationable
|
6
6
|
|
7
7
|
friendly_attributes :router_id, :description, :dns_domain, :dns_name,
|
8
8
|
:revision_number,
|
@@ -19,10 +19,31 @@ module Yao::Resources
|
|
19
19
|
@router ||= Yao::Router.get(router_id)
|
20
20
|
end
|
21
21
|
|
22
|
-
# @
|
23
|
-
|
24
|
-
|
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
|
25
47
|
end
|
26
|
-
alias :tenant :project
|
27
48
|
end
|
28
49
|
end
|
@@ -7,21 +7,11 @@ module Yao::Resources
|
|
7
7
|
map_attribute_to_resources loadbalancers: LoadBalancer
|
8
8
|
map_attribute_to_resources listeners: LoadBalancerListener
|
9
9
|
|
10
|
-
# @return [Date]
|
11
|
-
def created_at
|
12
|
-
Date.parse(self["created_at"])
|
13
|
-
end
|
14
|
-
|
15
|
-
# @return [Date]
|
16
|
-
def updated_at
|
17
|
-
Date.parse(self["updated_at"])
|
18
|
-
end
|
19
|
-
|
20
10
|
# @return [Yao::Resources::LoadBalancerListener]
|
21
11
|
def listeners
|
22
|
-
self["listeners"].map do |listener|
|
23
|
-
|
24
|
-
|
12
|
+
@listeners ||= self["listeners"].map do |listener|
|
13
|
+
Yao::LoadBalancerListener.get(listener["id"])
|
14
|
+
end
|
25
15
|
end
|
26
16
|
|
27
17
|
# @return [Yao::Resources::Tenant]
|
@@ -32,18 +22,18 @@ module Yao::Resources
|
|
32
22
|
end
|
33
23
|
alias :tenant :project
|
34
24
|
|
35
|
-
# @return [Yao::Resources::
|
25
|
+
# @return [Yao::Resources::LoadBalancerPoolMember]
|
36
26
|
def members
|
37
|
-
self["members"].map do |member|
|
38
|
-
|
39
|
-
|
27
|
+
@members ||= self["members"].map do |member|
|
28
|
+
Yao::LoadBalancerPoolMember.get(self, member["id"])
|
29
|
+
end
|
40
30
|
end
|
41
31
|
|
42
32
|
# @return [Yao::Resources::LoadBalancerHealthMonitor]
|
43
33
|
def healthmonitor
|
44
|
-
if healthmonitor_id = self["healthmonitor_id"]
|
45
|
-
|
46
|
-
|
34
|
+
@healthmonitor ||= if healthmonitor_id = self["healthmonitor_id"]
|
35
|
+
Yao::LoadBalancerHealthMonitor.get(healthmonitor_id)
|
36
|
+
end
|
47
37
|
end
|
48
38
|
|
49
39
|
self.service = "load-balancer"
|
data/lib/yao/resources/meter.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
module Yao::Resources
|
2
2
|
class OldSample < Base
|
3
|
-
include
|
3
|
+
include ProjectAssociationable
|
4
4
|
|
5
5
|
friendly_attributes :counter_name, :counter_type, :counter_unit, :counter_volume,
|
6
6
|
:message_id, :resource_id, :timestamp, :resource_metadata, :user_id,
|
data/lib/yao/resources/port.rb
CHANGED
@@ -2,7 +2,7 @@ module Yao::Resources
|
|
2
2
|
class Port < Base
|
3
3
|
|
4
4
|
include NetworkAssociationable
|
5
|
-
include
|
5
|
+
include ProjectAssociationable
|
6
6
|
|
7
7
|
friendly_attributes :name, :mac_address, :status, :allowed_address_pairs,
|
8
8
|
:device_owner, :fixed_ips, :security_groups, :device_id,
|
@@ -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"
|
@@ -1,18 +1,18 @@
|
|
1
1
|
module Yao
|
2
2
|
module Resources
|
3
|
-
module
|
3
|
+
module ProjectAssociationable
|
4
4
|
|
5
5
|
def self.included(base)
|
6
6
|
base.friendly_attributes :project_id
|
7
7
|
base.friendly_attributes :tenant_id
|
8
8
|
end
|
9
9
|
|
10
|
-
# @return [Yao::Resources::
|
11
|
-
def
|
12
|
-
@
|
10
|
+
# @return [Yao::Resources::Project]
|
11
|
+
def project
|
12
|
+
@project ||= Yao::Project.find(project_id || tenant_id)
|
13
13
|
end
|
14
14
|
|
15
|
-
alias :
|
15
|
+
alias :tenant :project
|
16
16
|
end
|
17
17
|
end
|
18
18
|
end
|
@@ -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
|
151
|
+
rescue Yao::ItemNotFound, Yao::NotFound, Yao::InvalidRequest
|
152
152
|
nil
|
153
153
|
end
|
154
154
|
|
@@ -188,6 +188,7 @@ module Yao::Resources
|
|
188
188
|
res = DELETE(create_url(id))
|
189
189
|
res.body
|
190
190
|
end
|
191
|
+
alias delete destroy
|
191
192
|
|
192
193
|
private
|
193
194
|
|
@@ -234,15 +235,19 @@ module Yao::Resources
|
|
234
235
|
# @return [Yao::Resources::*]
|
235
236
|
def get_by_name(name, query={})
|
236
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
|
+
|
237
243
|
begin
|
238
244
|
GET(create_url(name), query)
|
239
|
-
rescue => e
|
240
|
-
|
241
|
-
item = find_by_name(name)
|
245
|
+
rescue Yao::ItemNotFound, Yao::NotFound => e
|
246
|
+
item = find_by_name(name).select { |r| r.name == name }
|
242
247
|
if item.size > 1
|
243
248
|
raise Yao::TooManyItemFonud.new("More than one resource exists with the name '#{name}'")
|
244
249
|
elsif item.size.zero?
|
245
|
-
raise
|
250
|
+
raise e
|
246
251
|
end
|
247
252
|
GET(create_url(item.first.id), query)
|
248
253
|
end
|
@@ -11,9 +11,9 @@ module Yao::Resources
|
|
11
11
|
self.admin = true
|
12
12
|
self.api_version = "v3"
|
13
13
|
|
14
|
-
# @return [Yao::Resources::
|
14
|
+
# @return [Yao::Resources::Project]
|
15
15
|
def project
|
16
|
-
@project ||= Yao::
|
16
|
+
@project ||= Yao::Project.get(scope["project"]["id"])
|
17
17
|
end
|
18
18
|
|
19
19
|
class << self
|
data/lib/yao/resources/router.rb
CHANGED
@@ -1,15 +1,31 @@
|
|
1
1
|
module Yao::Resources
|
2
2
|
class Router < Base
|
3
|
-
include
|
3
|
+
include ProjectAssociationable
|
4
4
|
|
5
5
|
friendly_attributes :name, :description, :admin_state_up, :status, :external_gateway_info,
|
6
|
-
:
|
7
|
-
:ha, :availability_zone_hints, :availability_zones
|
6
|
+
:routes, :distributed, :ha, :availability_zone_hints, :availability_zones
|
8
7
|
|
9
8
|
self.service = 'network'
|
10
9
|
self.resource_name = 'router'
|
11
10
|
self.resources_name = 'routers'
|
12
11
|
|
12
|
+
# @return [bool]
|
13
|
+
def enable_snat
|
14
|
+
external_gateway_info["enable_snat"]
|
15
|
+
end
|
16
|
+
|
17
|
+
# @return [Array<Hash>]
|
18
|
+
def external_fixed_ips
|
19
|
+
external_gateway_info["external_fixed_ips"]
|
20
|
+
end
|
21
|
+
|
22
|
+
# @return [Yao::Resource::Network]
|
23
|
+
def external_network
|
24
|
+
@external_network ||= if network_id = external_gateway_info["network_id"]
|
25
|
+
Yao::Network.get(network_id)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
13
29
|
# @return [Array<Yao::Resources::Port>]
|
14
30
|
def interfaces
|
15
31
|
Yao::Port.list(device_id: id)
|
@@ -29,13 +45,6 @@ module Yao::Resources
|
|
29
45
|
def remove_interface(id, param)
|
30
46
|
PUT(['routers', id, 'remove_router_interface.json'].join('/'), param.to_json)
|
31
47
|
end
|
32
|
-
|
33
|
-
# @param name [String]
|
34
|
-
# @return [Array<Yao::Resources::Router>]
|
35
|
-
def get_by_name(name)
|
36
|
-
self.list(name: name)
|
37
|
-
end
|
38
|
-
alias find_by_name get_by_name
|
39
48
|
end
|
40
49
|
end
|
41
50
|
end
|
data/lib/yao/resources/server.rb
CHANGED
@@ -2,7 +2,7 @@ require 'yao/resources/metadata_available'
|
|
2
2
|
require 'yao/resources/action'
|
3
3
|
module Yao::Resources
|
4
4
|
class Server < Base
|
5
|
-
include
|
5
|
+
include ProjectAssociationable
|
6
6
|
|
7
7
|
friendly_attributes :addresses, :metadata, :name, :progress,
|
8
8
|
:status, :user_id, :key_name
|
@@ -32,6 +32,11 @@ module Yao::Resources
|
|
32
32
|
Yao::OldSample.list(counter_name, query).select{|os| os.resource_metadata["instance_id"] == id}
|
33
33
|
end
|
34
34
|
|
35
|
+
# @return [Array<Yao::Resources::Port>]
|
36
|
+
def ports
|
37
|
+
@ports ||= Yao::Port.list(device_id: id)
|
38
|
+
end
|
39
|
+
|
35
40
|
# @param id [String]
|
36
41
|
# @return [Hash]
|
37
42
|
def self.start(id)
|
data/lib/yao/resources/subnet.rb
CHANGED
data/lib/yao/resources/volume.rb
CHANGED
@@ -2,6 +2,8 @@ require 'yao/resources/volume_action'
|
|
2
2
|
|
3
3
|
module Yao::Resources
|
4
4
|
class Volume < Base
|
5
|
+
include ProjectAssociationable
|
6
|
+
|
5
7
|
friendly_attributes :attachments, :availability_zone, :bootable, :descriptions, :encrypted, :metadata, :multiattach, :name, :replication_status, :size, :snapshot_id, :status, :user_id, :volume_type
|
6
8
|
alias :type :volume_type
|
7
9
|
|
data/lib/yao/resources.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
module Yao
|
2
2
|
module Resources
|
3
3
|
require "yao/resources/base"
|
4
|
-
require "yao/resources/
|
4
|
+
require "yao/resources/project_associationable"
|
5
5
|
require "yao/resources/port_associationable"
|
6
6
|
require "yao/resources/network_associationable"
|
7
7
|
require "yao/resources/server_usage_associationable"
|
data/lib/yao/version.rb
CHANGED
@@ -23,4 +23,25 @@ class TestResourceBase < TestYaoResource
|
|
23
23
|
assert_equal(nil, base.empty)
|
24
24
|
end
|
25
25
|
|
26
|
+
def test_update
|
27
|
+
stub(Yao::Resources::Base).update('foo', {name: 'BAR'}) { Yao::Resources::Base.new('id' => 'foo', 'name' => 'BAR')}
|
28
|
+
base = Yao::Resources::Base.new({'id' => 'foo', 'name' => 'bar'})
|
29
|
+
got = base.update(name: 'BAR')
|
30
|
+
assert_equal(got.name, 'BAR')
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_destroy
|
34
|
+
stub(Yao::Resources::Base).destroy('foo') { nil }
|
35
|
+
base = Yao::Resources::Base.new({'id' => 'foo'})
|
36
|
+
got = base.destroy
|
37
|
+
assert_equal(got, nil)
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_delete
|
41
|
+
stub(Yao::Resources::Base).destroy('foo') { nil }
|
42
|
+
base = Yao::Resources::Base.new({'id' => 'foo'})
|
43
|
+
got = base.delete
|
44
|
+
assert_equal(got, nil)
|
45
|
+
end
|
46
|
+
|
26
47
|
end
|
@@ -46,48 +46,64 @@ class TestFlavor < TestYaoResource
|
|
46
46
|
assert_equal(512, flavor.memory)
|
47
47
|
end
|
48
48
|
|
49
|
-
def
|
50
|
-
|
49
|
+
def flavor_detail
|
50
|
+
JSON.parse(<<~JSON)
|
51
|
+
{
|
52
|
+
"OS-FLV-DISABLED:disabled": false,
|
53
|
+
"disk": 20,
|
54
|
+
"OS-FLV-EXT-DATA:ephemeral": 0,
|
55
|
+
"os-flavor-access:is_public": true,
|
56
|
+
"id": "7",
|
57
|
+
"links": [
|
58
|
+
{
|
59
|
+
"href": "http://openstack.example.com/v2/6f70656e737461636b20342065766572/flavors/7",
|
60
|
+
"rel": "self"
|
61
|
+
},
|
62
|
+
{
|
63
|
+
"href": "http://openstack.example.com/6f70656e737461636b20342065766572/flavors/7",
|
64
|
+
"rel": "bookmark"
|
65
|
+
}
|
66
|
+
],
|
67
|
+
"name": "m1.small.description",
|
68
|
+
"ram": 2048,
|
69
|
+
"swap": 0,
|
70
|
+
"vcpus": 1,
|
71
|
+
"rxtx_factor": 1.0,
|
72
|
+
"description": "test description",
|
73
|
+
"extra_specs": {
|
74
|
+
"hw:cpu_policy": "shared",
|
75
|
+
"hw:numa_nodes": "1"
|
76
|
+
}
|
77
|
+
}
|
78
|
+
JSON
|
79
|
+
end
|
80
|
+
|
81
|
+
def stub_flavors_detail(query=nil)
|
82
|
+
url = ['https://example.com:12345/flavors/detail',query].compact.join('?')
|
83
|
+
stub_request(:get, url).
|
51
84
|
to_return(
|
52
85
|
status: 200,
|
53
|
-
body:
|
54
|
-
{
|
55
|
-
"flavors": [
|
56
|
-
{
|
57
|
-
"OS-FLV-DISABLED:disabled": false,
|
58
|
-
"disk": 1,
|
59
|
-
"OS-FLV-EXT-DATA:ephemeral": 0,
|
60
|
-
"os-flavor-access:is_public": true,
|
61
|
-
"id": "1",
|
62
|
-
"links": [
|
63
|
-
{
|
64
|
-
"href": "http://openstack.example.com/v2/6f70656e737461636b20342065766572/flavors/1",
|
65
|
-
"rel": "self"
|
66
|
-
},
|
67
|
-
{
|
68
|
-
"href": "http://openstack.example.com/6f70656e737461636b20342065766572/flavors/1",
|
69
|
-
"rel": "bookmark"
|
70
|
-
}
|
71
|
-
],
|
72
|
-
"name": "m1.tiny",
|
73
|
-
"ram": 512,
|
74
|
-
"swap": "",
|
75
|
-
"vcpus": 1,
|
76
|
-
"rxtx_factor": 1.0,
|
77
|
-
"description": null,
|
78
|
-
"extra_specs": {}
|
79
|
-
}
|
80
|
-
]
|
81
|
-
}
|
82
|
-
JSON
|
86
|
+
body: { flavors:[flavor_detail] }.to_json,
|
83
87
|
headers: {'Content-Type' => 'application/json'}
|
84
88
|
)
|
89
|
+
end
|
85
90
|
|
91
|
+
def stub_flavor(id)
|
92
|
+
stub_request(:get, "https://example.com:12345/flavors/#{id}").
|
93
|
+
to_return(
|
94
|
+
status: 200,
|
95
|
+
body: { 'flavor': flavor_detail }.to_json,
|
96
|
+
headers: {'Content-Type' => 'application/json'}
|
97
|
+
)
|
98
|
+
end
|
99
|
+
|
100
|
+
def test_list
|
101
|
+
stub = stub_flavors_detail
|
86
102
|
assert(Yao::Flavor.resources_detail_available)
|
87
103
|
|
88
104
|
flavors = Yao::Flavor.list
|
89
105
|
assert_instance_of(Yao::Flavor, flavors.first)
|
90
|
-
assert_equal("m1.
|
106
|
+
assert_equal("m1.small.description", flavors.first.name)
|
91
107
|
|
92
108
|
assert_requested(stub)
|
93
109
|
end
|
@@ -97,4 +113,22 @@ class TestFlavor < TestYaoResource
|
|
97
113
|
# see also: https://stackoverflow.com/questions/25883618/how-to-test-method-alias-ruby
|
98
114
|
assert_equal(Yao::Flavor.method(:list), Yao::Flavor.method(:list_detail))
|
99
115
|
end
|
116
|
+
|
117
|
+
def test_get_by_id
|
118
|
+
stub = stub_flavor(7)
|
119
|
+
flavor = Yao::Flavor.get('7')
|
120
|
+
assert_equal('m1.small.description', flavor.name)
|
121
|
+
assert_requested(stub)
|
122
|
+
end
|
123
|
+
|
124
|
+
def test_get_by_name
|
125
|
+
stub = stub_request(:get, "https://example.com:12345/flavors/m1.small.description").to_return(status: 404)
|
126
|
+
stub2 = stub_flavors_detail
|
127
|
+
stub3 = stub_flavor(7)
|
128
|
+
flavor = Yao::Flavor.get('m1.small.description')
|
129
|
+
assert_equal('7', flavor.id)
|
130
|
+
assert_requested(stub)
|
131
|
+
assert_requested(stub2)
|
132
|
+
assert_requested(stub3)
|
133
|
+
end
|
100
134
|
end
|