yao 0.13.2 → 0.15.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.
Files changed (64) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/rubocop.yml +19 -0
  3. data/.github/workflows/ubuntu-rvm.yml +1 -1
  4. data/.github/workflows/ubuntu.yml +1 -1
  5. data/.rubocop.yml +3 -6
  6. data/README.md +2 -1
  7. data/lib/yao/auth.rb +19 -1
  8. data/lib/yao/client.rb +12 -8
  9. data/lib/yao/config.rb +19 -0
  10. data/lib/yao/faraday_middlewares.rb +37 -3
  11. data/lib/yao/mode.rb +4 -0
  12. data/lib/yao/plugins/default_client_generator.rb +0 -1
  13. data/lib/yao/plugins/registry.rb +2 -1
  14. data/lib/yao/resources/action.rb +7 -0
  15. data/lib/yao/resources/aggregates.rb +1 -0
  16. data/lib/yao/resources/base.rb +22 -1
  17. data/lib/yao/resources/compute_services.rb +8 -1
  18. data/lib/yao/resources/flavor.rb +2 -0
  19. data/lib/yao/resources/floating_ip.rb +2 -0
  20. data/lib/yao/resources/hypervisor.rb +1 -1
  21. data/lib/yao/resources/image.rb +2 -0
  22. data/lib/yao/resources/loadbalancer.rb +4 -0
  23. data/lib/yao/resources/loadbalancer_healthmonitor.rb +3 -0
  24. data/lib/yao/resources/loadbalancer_listener.rb +2 -0
  25. data/lib/yao/resources/loadbalancer_pool.rb +6 -0
  26. data/lib/yao/resources/loadbalancer_pool_member.rb +21 -0
  27. data/lib/yao/resources/metadata_available.rb +21 -0
  28. data/lib/yao/resources/meter.rb +8 -1
  29. data/lib/yao/resources/network.rb +1 -0
  30. data/lib/yao/resources/network_associationable.rb +1 -0
  31. data/lib/yao/resources/old_sample.rb +4 -0
  32. data/lib/yao/resources/port.rb +2 -0
  33. data/lib/yao/resources/port_associationable.rb +1 -0
  34. data/lib/yao/resources/project.rb +11 -0
  35. data/lib/yao/resources/resource.rb +8 -2
  36. data/lib/yao/resources/restfully_accessible.rb +15 -0
  37. data/lib/yao/resources/role.rb +6 -4
  38. data/lib/yao/resources/role_assignment.rb +36 -3
  39. data/lib/yao/resources/router.rb +9 -0
  40. data/lib/yao/resources/sample.rb +4 -0
  41. data/lib/yao/resources/security_group.rb +1 -0
  42. data/lib/yao/resources/security_group_rule.rb +10 -0
  43. data/lib/yao/resources/server.rb +20 -0
  44. data/lib/yao/resources/server_group.rb +1 -1
  45. data/lib/yao/resources/server_usage_associationable.rb +12 -0
  46. data/lib/yao/resources/subnet.rb +1 -0
  47. data/lib/yao/resources/tenant.rb +11 -0
  48. data/lib/yao/resources/tenant_associationable.rb +1 -0
  49. data/lib/yao/resources/user.rb +8 -1
  50. data/lib/yao/resources/volume.rb +12 -1
  51. data/lib/yao/resources/volume_action.rb +13 -0
  52. data/lib/yao/resources.rb +3 -0
  53. data/lib/yao/token.rb +1 -0
  54. data/lib/yao/version.rb +1 -1
  55. data/test/yao/resources/test_base.rb +11 -0
  56. data/test/yao/resources/test_image.rb +5 -0
  57. data/test/yao/resources/test_project.rb +45 -6
  58. data/test/yao/resources/test_role_assignment.rb +98 -1
  59. data/test/yao/resources/test_server_group.rb +1 -1
  60. data/test/yao/resources/test_user.rb +28 -1
  61. data/test/yao/resources/test_volume.rb +60 -1
  62. data/test/yao/test_client.rb +2 -1
  63. data/yao.gemspec +1 -1
  64. metadata +8 -5
@@ -1,5 +1,7 @@
1
1
  module Yao::Resources
2
2
  class Tenant < Base
3
+ include ServerUsageAssociationable
4
+
3
5
  friendly_attributes :id, :name, :description, :enabled
4
6
 
5
7
  self.service = "identity"
@@ -8,22 +10,31 @@ module Yao::Resources
8
10
  self.admin = true
9
11
  self.return_single_on_querying = true
10
12
 
13
+ # @return [Yao::Resources::Server]
11
14
  def servers
12
15
  @servers ||= Yao::Server.list(all_tenants: 1, project_id: id)
13
16
  end
14
17
 
18
+ # @return [Yao::Resources::Meter]
15
19
  def meters
16
20
  @meters ||= Yao::Meter.list({'q.field' => 'project_id', 'q.op' => 'eq', 'q.value' => id})
17
21
  end
18
22
 
23
+ # @return [Yao::Resources::Port]
19
24
  def ports
20
25
  @ports ||= Yao::Port.list(tenant_id: id)
21
26
  end
22
27
 
28
+ # @return [Array<Yao::Resources::Meter>]
23
29
  def meters_by_name(meter_name)
24
30
  meters.select{|m| m.name == meter_name}
25
31
  end
26
32
 
33
+ # @return [Yao::Resources::RoleAssignment]
34
+ def role_assignment
35
+ Yao::RoleAssignment.get(tenant: id)
36
+ end
37
+
27
38
  class << self
28
39
  def accessible
29
40
  as_member { self.list }
@@ -7,6 +7,7 @@ module Yao
7
7
  base.friendly_attributes :tenant_id
8
8
  end
9
9
 
10
+ # @return [Yao::Resources::Tenant]
10
11
  def tenant
11
12
  @tenant ||= Yao::Tenant.find(project_id || tenant_id)
12
13
  end
@@ -1,6 +1,6 @@
1
1
  module Yao::Resources
2
2
  class User < Base
3
- friendly_attributes :name, :email, :enabled, :id
3
+ friendly_attributes :name, :email, :enabled
4
4
 
5
5
  alias enabled? enabled
6
6
 
@@ -9,12 +9,19 @@ module Yao::Resources
9
9
  self.resources_name = "users"
10
10
  self.admin = true
11
11
 
12
+ # @return [Yao::Resources::RoleAssignment]
13
+ def role_assignment
14
+ Yao::RoleAssignment.get(user: self)
15
+ end
16
+
12
17
  class << self
18
+ # @return [Bool]
13
19
  def return_single_on_querying
14
20
  api_verion_v2?
15
21
  end
16
22
 
17
23
  private
24
+ # @return [Bool]
18
25
  def api_verion_v2?
19
26
  client.url_prefix.to_s.match?(/v2\.0/)
20
27
  end
@@ -1,12 +1,23 @@
1
+ require 'yao/resources/volume_action'
2
+
1
3
  module Yao::Resources
2
4
  class Volume < Base
3
- friendly_attributes :name, :size, :volume_type
5
+ friendly_attributes :attachments, :availability_zone, :bootable, :descriptions, :encrypted, :metadata, :multiattach, :name, :replication_status, :size, :snapshot_id, :status, :user_id, :volume_type
6
+ alias :type :volume_type
4
7
 
8
+ map_attribute_to_attribute 'os-vol-host-attr:host' => :host
5
9
  map_attribute_to_attribute 'os-vol-tenant-attr:tenant_id' => :tenant_id
6
10
 
7
11
  self.service = "volumev3"
8
12
  self.resource_name = "volume"
9
13
  self.resources_name = "volumes"
10
14
  self.resources_detail_available = true
15
+
16
+ def status=(s)
17
+ self.class.set_status(self.id, s)
18
+ self['status'] = s
19
+ end
20
+
21
+ extend VolumeAction
11
22
  end
12
23
  end
@@ -0,0 +1,13 @@
1
+ require 'yao/resources/action'
2
+
3
+ module Yao::Resources
4
+ module VolumeAction
5
+ include Action
6
+
7
+ def set_status(id, status)
8
+ action(id, 'os-reset_status' => {
9
+ 'status' => status,
10
+ })
11
+ end
12
+ end
13
+ end
data/lib/yao/resources.rb CHANGED
@@ -4,6 +4,7 @@ module Yao
4
4
  require "yao/resources/tenant_associationable"
5
5
  require "yao/resources/port_associationable"
6
6
  require "yao/resources/network_associationable"
7
+ require "yao/resources/server_usage_associationable"
7
8
 
8
9
  autoload :Server, "yao/resources/server"
9
10
  autoload :ServerGroup, "yao/resources/server_group"
@@ -42,6 +43,8 @@ module Yao
42
43
  autoload :Sample, "yao/resources/sample"
43
44
  end
44
45
 
46
+ # @param name [String]
47
+ # @return [object]
45
48
  def self.const_missing(name)
46
49
  new_klass = Yao::Resources.const_get(name)
47
50
  Yao.const_set(name, new_klass)
data/lib/yao/token.rb CHANGED
@@ -2,6 +2,7 @@ require 'yao/client'
2
2
 
3
3
  module Yao
4
4
  class Token
5
+
5
6
  def self.issue(cli, auth_info)
6
7
  t = new(auth_info)
7
8
  t.refresh(cli)
data/lib/yao/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Yao
2
- VERSION = "0.13.2"
2
+ VERSION = "0.15.0"
3
3
  end
@@ -12,4 +12,15 @@ class TestResourceBase < TestYaoResource
12
12
  base.class.friendly_attributes(:name)
13
13
  assert_equal("bar", base.name)
14
14
  end
15
+
16
+ def test_map_attribute_to_resource
17
+ base = Yao::Resources::Base.new("string" => "hoge")
18
+ base.class.map_attribute_to_resource string: String
19
+ assert_equal("hoge", base.string)
20
+
21
+ base = Yao::Resources::Base.new({"empty" => ""})
22
+ base.class.map_attribute_to_resource empty: NilClass
23
+ assert_equal(nil, base.empty)
24
+ end
25
+
15
26
  end
@@ -41,6 +41,11 @@ class TestImage < TestYaoResource
41
41
 
42
42
  end
43
43
 
44
+ def test_empty_image
45
+ image = Yao::Server.new("image"=>"").image
46
+ assert_equal(image, nil)
47
+ end
48
+
44
49
  def test_to_hash
45
50
  server = Yao::Resources::Server.new(
46
51
  "OS-DCF:diskConfig" => "AUTO",
@@ -1,9 +1,4 @@
1
1
  class TestProject < TestYaoResource
2
- def setup
3
- super
4
- Yao.default_client.admin_pool["identity"] = Yao::Client.gen_client("https://example.com:12345/v2.0")
5
- end
6
-
7
2
  # https://docs.openstack.org/api-ref/identity/v3/?expanded=list-projects-detail#projects
8
3
  def test_project
9
4
  params = {
@@ -254,4 +249,48 @@ class TestProject < TestYaoResource
254
249
  assert_instance_of(Array, project.servers)
255
250
  assert_requested(stub)
256
251
  end
257
- end
252
+
253
+ def test_server_usage
254
+ stub = stub_request(:get, "https://example.com:12345/os-simple-tenant-usage/0123456789abcdef0123456789abcdef")
255
+ .to_return(
256
+ status: 200,
257
+ body: <<-JSON,
258
+ {
259
+ "tenant_usage": {
260
+ "total_memory_mb_usage": 1024
261
+ }
262
+ }
263
+ JSON
264
+ headers: {'Content-Type' => 'application/json'}
265
+ )
266
+
267
+ project = Yao::Project::new("id" => "0123456789abcdef0123456789abcdef")
268
+ usage = project.server_usage
269
+ assert_equal(1024, usage["total_memory_mb_usage"])
270
+ end
271
+
272
+ def test_role_assignment
273
+ project_id = 'aaaa166533fd49f3b11b1cdce2430000'
274
+ stub = stub_request(:get, "https://example.com:12345/role_assignments?scope.project.id=#{project_id}").
275
+ to_return(
276
+ status: 200,
277
+ body: <<-JSON,
278
+ {
279
+ "role_assignments": [{
280
+ "scope": {
281
+ "project": {
282
+ "id": "aaaa166533fd49f3b11b1cdce2430000"
283
+ }
284
+ }
285
+ }]
286
+ }
287
+ JSON
288
+ headers: {'Content-Type' => 'application/json'}
289
+ )
290
+
291
+ project = Yao::Project.new('id' => project_id)
292
+ role_assignment = project.role_assignment
293
+ assert_equal('aaaa166533fd49f3b11b1cdce2430000', role_assignment.first.scope['project']['id'])
294
+ assert_requested(stub)
295
+ end
296
+ end
@@ -32,8 +32,105 @@ class TestRoleAssignment < TestYaoResource
32
32
  assert_equal("313233", role_assignment.user.id)
33
33
  end
34
34
 
35
+ def test_list
36
+ stub = stub_request(:get, "https://example.com:12345/role_assignments").
37
+ to_return(
38
+ status: 200,
39
+ body: <<-JSON,
40
+ {
41
+ "role_assignments": [{
42
+ "scope": {
43
+ "project": {
44
+ "id": "aaaa166533fd49f3b11b1cdce2430000"
45
+ }
46
+ }
47
+ }]
48
+ }
49
+ JSON
50
+ headers: {'Content-Type' => 'application/json'}
51
+ )
52
+ role_assignment = Yao::RoleAssignment.list
53
+ assert_equal('aaaa166533fd49f3b11b1cdce2430000', role_assignment.first.scope['project']['id'])
54
+ assert_requested(stub)
55
+ end
56
+
57
+ def test_get_user
58
+ user_id = '123456'
59
+ stub = stub_request(:get, "https://example.com:12345/role_assignments?user.id=#{user_id}").
60
+ to_return(
61
+ status: 200,
62
+ body: <<-JSON,
63
+ {
64
+ "role_assignments": [{
65
+ "scope": {
66
+ "project": {
67
+ "id": "aaaa166533fd49f3b11b1cdce2430000"
68
+ }
69
+ }
70
+ }]
71
+ }
72
+ JSON
73
+ headers: {'Content-Type' => 'application/json'}
74
+ )
75
+
76
+ user = Yao::User.new('id' => user_id)
77
+ role_assignment = Yao::RoleAssignment.get(user: user)
78
+ assert_equal('aaaa166533fd49f3b11b1cdce2430000', role_assignment.first.scope['project']['id'])
79
+ assert_requested(stub)
80
+ end
81
+
82
+ def test_get_project
83
+ project_id = 'aaaa166533fd49f3b11b1cdce2430000'
84
+ stub = stub_request(:get, "https://example.com:12345/role_assignments?scope.project.id=#{project_id}").
85
+ to_return(
86
+ status: 200,
87
+ body: <<-JSON,
88
+ {
89
+ "role_assignments": [{
90
+ "scope": {
91
+ "project": {
92
+ "id": "aaaa166533fd49f3b11b1cdce2430000"
93
+ }
94
+ }
95
+ }]
96
+ }
97
+ JSON
98
+ headers: {'Content-Type' => 'application/json'}
99
+ )
100
+
101
+ project = Yao::Project.new('id' => project_id)
102
+ role_assignment = Yao::RoleAssignment.get(project: project)
103
+ assert_equal('aaaa166533fd49f3b11b1cdce2430000', role_assignment.first.scope['project']['id'])
104
+ assert_requested(stub)
105
+ end
106
+
107
+ def test_get_tenant
108
+ tenant_id = 'aaaa166533fd49f3b11b1cdce2430000'
109
+ stub = stub_request(:get, "https://example.com:12345/role_assignments?scope.project.id=#{tenant_id}").
110
+ to_return(
111
+ status: 200,
112
+ body: <<-JSON,
113
+ {
114
+ "role_assignments": [{
115
+ "scope": {
116
+ "project": {
117
+ "id": "aaaa166533fd49f3b11b1cdce2430000"
118
+ }
119
+ }
120
+ }]
121
+ }
122
+ JSON
123
+ headers: {'Content-Type' => 'application/json'}
124
+ )
125
+
126
+ tenant = Yao::Project.new('id' => tenant_id)
127
+ role_assignment = Yao::RoleAssignment.get(tenant: tenant)
128
+ assert_equal('aaaa166533fd49f3b11b1cdce2430000', role_assignment.first.scope['project']['id'])
129
+ assert_requested(stub)
130
+ end
131
+
35
132
  def test_project
36
- stub = stub_request(:get, "http://example.com:12345/tenants/456789").
133
+ stub = stub_request(:get, "https://example.com:12345/tenants/456789").
37
134
  to_return(
38
135
  status: 200,
39
136
  body: <<-JSON,
@@ -20,4 +20,4 @@ class TestServerGroup < TestYaoResource
20
20
  assert_equal("6f70656e737461636b20342065766572", sg.project_id)
21
21
  assert_equal("fake", sg.user_id)
22
22
  end
23
- end
23
+ end
@@ -1,16 +1,43 @@
1
1
  class TestUser < TestYaoResource
2
- def test_sg_attributes
2
+ def test_user
3
3
  params = {
4
+ "id" => '1234567890',
4
5
  "name" => "test_user",
5
6
  "email" => "test-user@example.com",
6
7
  "password" => "passw0rd"
7
8
  }
8
9
 
9
10
  user = Yao::User.new(params)
11
+ assert_equal("1234567890", user.id)
10
12
  assert_equal("test_user", user.name)
11
13
  assert_equal("test-user@example.com", user.email)
12
14
  end
13
15
 
16
+ def test_role_assignment
17
+ user_id = '123456'
18
+ stub = stub_request(:get, "https://example.com:12345/role_assignments?user.id=#{user_id}").
19
+ to_return(
20
+ status: 200,
21
+ body: <<-JSON,
22
+ {
23
+ "role_assignments": [{
24
+ "scope": {
25
+ "project": {
26
+ "id": "aaaa166533fd49f3b11b1cdce2430000"
27
+ }
28
+ }
29
+ }]
30
+ }
31
+ JSON
32
+ headers: {'Content-Type' => 'application/json'}
33
+ )
34
+
35
+ user = Yao::User.new('id' => user_id)
36
+ role_assignment = user.role_assignment
37
+ assert_equal('aaaa166533fd49f3b11b1cdce2430000', role_assignment.first.scope['project']['id'])
38
+ assert_requested(stub)
39
+ end
40
+
14
41
  sub_test_case 'with keystone v2.0' do
15
42
  def setup
16
43
  super
@@ -1,13 +1,35 @@
1
1
  class TestVolume < TestYaoResource
2
2
  def test_volume
3
3
  params = {
4
+ 'attachments' => [],
5
+ 'availability_zone' => 'test',
6
+ 'bootable' => true,
7
+ 'encrypted' => false,
8
+ 'metadata' => {},
9
+ 'multiattach' => false,
4
10
  'name' => 'cinder',
5
- 'size' => 10
11
+ 'replication_status' => 'disabled',
12
+ 'size' => 10,
13
+ 'snapshot_id' => nil,
14
+ 'status' => 'available',
15
+ 'user_id' => 'aaaa166533fd49f3b11b1cdce2430000',
16
+ 'volume_type' => 'test'
6
17
  }
7
18
 
8
19
  volume = Yao::Volume.new(params)
20
+ assert_equal(volume.attachments, [])
21
+ assert_equal(volume.availability_zone, 'test')
22
+ assert_equal(volume.bootable, true)
23
+ assert_equal(volume.encrypted, false)
24
+ assert_equal(volume.metadata, {})
25
+ assert_equal(volume.multiattach, false)
9
26
  assert_equal(volume.name, 'cinder')
27
+ assert_equal(volume.replication_status, 'disabled')
10
28
  assert_equal(volume.size, 10)
29
+ assert_equal(volume.snapshot_id, nil)
30
+ assert_equal(volume.user_id, 'aaaa166533fd49f3b11b1cdce2430000')
31
+ assert_equal(volume.volume_type, 'test')
32
+ assert_equal(volume.type, 'test')
11
33
  end
12
34
 
13
35
  def test_list
@@ -39,4 +61,41 @@ class TestVolume < TestYaoResource
39
61
  def test_list_detail
40
62
  assert_equal(Yao::Volume.method(:list), Yao::Volume.method(:list_detail))
41
63
  end
64
+
65
+ def stub_action_request(id, body)
66
+ # https://docs.openstack.org/api-ref/block-storage/v3/index.html?expanded=list-accessible-volumes-with-details-detail,reset-a-volume-s-statuses-detail#reset-a-volume-s-statuses
67
+ stub_request(:post, "https://example.com:12345/volumes/#{id}/action").
68
+ with(
69
+ body: body,
70
+ headers: {
71
+ 'Accept'=>'application/json',
72
+ 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
73
+ 'Content-Type'=>'application/json',
74
+ 'User-Agent'=>"Yao/#{Yao::VERSION} Faraday/#{Faraday::VERSION}"
75
+ }).
76
+ to_return(
77
+ status: 202,
78
+ body: '',
79
+ headers: {'Content-Type' => 'application/json'}
80
+ )
81
+ end
82
+
83
+ def test_set_status
84
+ volume_id = '00000000-0000-0000-0000-000000000000'
85
+
86
+ stub = stub_action_request(volume_id, {'os-reset_status': {'status': 'error'}})
87
+ Yao::Volume.set_status(volume_id, 'error')
88
+ assert_requested(stub)
89
+ end
90
+
91
+ def test_set_status_on_instance
92
+ volume_id = '00000000-0000-0000-0000-000000000000'
93
+ stub = stub_action_request(volume_id, {'os-reset_status': {'status': 'error'}})
94
+ params = {
95
+ 'id' => volume_id,
96
+ }
97
+ volume = Yao::Volume.new(params)
98
+ volume.status = 'error'
99
+ assert_requested(stub)
100
+ end
42
101
  end
@@ -51,7 +51,6 @@ class TestClient < Test::Unit::TestCase
51
51
  Faraday::Request::ReadOnly,
52
52
  Faraday::Response::OSErrorDetector,
53
53
  FaradayMiddleware::ParseJson,
54
- Faraday::Response::Logger,
55
54
  Faraday::Response::OSDumper
56
55
  ]
57
56
  assert { cli.builder.handlers == handlers }
@@ -64,6 +63,7 @@ class TestClient < Test::Unit::TestCase
64
63
  end
65
64
 
66
65
  def test_cert_key
66
+ stub(Yao.config).ca_cert { File.expand_path("../../fixtures/dummy.pem", __FILE__) }
67
67
  stub(Yao.config).client_cert { File.expand_path("../../fixtures/dummy.pem", __FILE__) }
68
68
  stub(Yao.config).client_key { File.expand_path("../../fixtures/dummy.key", __FILE__) }
69
69
  stub(OpenSSL::X509::Certificate).new { "DummyCert" }
@@ -71,6 +71,7 @@ class TestClient < Test::Unit::TestCase
71
71
 
72
72
  cli = Yao::Client.gen_client("http://cool-api.example.com:12345/v3.0")
73
73
  ssl = cli.ssl
74
+ assert { ssl[:ca_file] == File.expand_path("../../fixtures/dummy.pem", __FILE__) }
74
75
  assert { ssl[:client_cert] == "DummyCert" }
75
76
  assert { ssl[:client_key] == "DummyKey" }
76
77
  end
data/yao.gemspec CHANGED
@@ -19,6 +19,6 @@ Gem::Specification.new do |spec|
19
19
 
20
20
  spec.add_dependency "json"
21
21
  spec.add_dependency "deep_merge"
22
- spec.add_dependency "faraday", "~> 1.0.1"
22
+ spec.add_dependency "faraday", "~> 1.8.0"
23
23
  spec.add_dependency "faraday_middleware"
24
24
  end
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.13.2
4
+ version: 0.15.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: 2020-07-16 00:00:00.000000000 Z
11
+ date: 2021-12-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: json
@@ -44,14 +44,14 @@ dependencies:
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: 1.0.1
47
+ version: 1.8.0
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: 1.0.1
54
+ version: 1.8.0
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: faraday_middleware
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -74,6 +74,7 @@ extensions: []
74
74
  extra_rdoc_files: []
75
75
  files:
76
76
  - ".github/workflows/macos.yml"
77
+ - ".github/workflows/rubocop.yml"
77
78
  - ".github/workflows/ubuntu-rvm.yml"
78
79
  - ".github/workflows/ubuntu.yml"
79
80
  - ".gitignore"
@@ -131,11 +132,13 @@ files:
131
132
  - lib/yao/resources/security_group_rule.rb
132
133
  - lib/yao/resources/server.rb
133
134
  - lib/yao/resources/server_group.rb
135
+ - lib/yao/resources/server_usage_associationable.rb
134
136
  - lib/yao/resources/subnet.rb
135
137
  - lib/yao/resources/tenant.rb
136
138
  - lib/yao/resources/tenant_associationable.rb
137
139
  - lib/yao/resources/user.rb
138
140
  - lib/yao/resources/volume.rb
141
+ - lib/yao/resources/volume_action.rb
139
142
  - lib/yao/resources/volume_type.rb
140
143
  - lib/yao/setup.rb
141
144
  - lib/yao/token.rb
@@ -213,7 +216,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
213
216
  - !ruby/object:Gem::Version
214
217
  version: '0'
215
218
  requirements: []
216
- rubygems_version: 3.0.6
219
+ rubygems_version: 3.2.32
217
220
  signing_key:
218
221
  specification_version: 4
219
222
  summary: Yet Another OpenStack API Wrapper that rocks!!