yao 0.14.0 → 0.17.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/rubocop.yml +2 -2
  3. data/.github/workflows/ubuntu-rvm.yml +1 -1
  4. data/.github/workflows/ubuntu.yml +2 -2
  5. data/lib/yao/resources/base.rb +17 -5
  6. data/lib/yao/resources/flavor.rb +10 -0
  7. data/lib/yao/resources/floating_ip.rb +1 -7
  8. data/lib/yao/resources/loadbalancer_pool.rb +10 -20
  9. data/lib/yao/resources/meter.rb +1 -1
  10. data/lib/yao/resources/network.rb +1 -1
  11. data/lib/yao/resources/old_sample.rb +1 -1
  12. data/lib/yao/resources/port.rb +1 -1
  13. data/lib/yao/resources/project.rb +5 -0
  14. data/lib/yao/resources/{tenant_associationable.rb → project_associationable.rb} +5 -5
  15. data/lib/yao/resources/resource.rb +1 -1
  16. data/lib/yao/resources/restfully_accessible.rb +3 -2
  17. data/lib/yao/resources/role_assignment.rb +37 -5
  18. data/lib/yao/resources/router.rb +19 -10
  19. data/lib/yao/resources/security_group.rb +1 -1
  20. data/lib/yao/resources/server.rb +6 -1
  21. data/lib/yao/resources/subnet.rb +1 -1
  22. data/lib/yao/resources/tenant.rb +5 -0
  23. data/lib/yao/resources/user.rb +6 -1
  24. data/lib/yao/resources/volume.rb +14 -1
  25. data/lib/yao/resources/volume_action.rb +13 -0
  26. data/lib/yao/resources.rb +1 -1
  27. data/lib/yao/version.rb +1 -1
  28. data/test/yao/resources/test_base.rb +21 -0
  29. data/test/yao/resources/test_flavor.rb +67 -33
  30. data/test/yao/resources/test_floating_ip.rb +5 -5
  31. data/test/yao/resources/test_loadbalancer_pool.rb +146 -1
  32. data/test/yao/resources/test_meter.rb +5 -5
  33. data/test/yao/resources/test_network.rb +6 -6
  34. data/test/yao/resources/test_port.rb +6 -6
  35. data/test/yao/resources/test_project.rb +25 -5
  36. data/test/yao/resources/test_restfully_accessible.rb +46 -4
  37. data/test/yao/resources/test_role_assignment.rb +100 -3
  38. data/test/yao/resources/test_router.rb +33 -12
  39. data/test/yao/resources/test_security_group.rb +5 -5
  40. data/test/yao/resources/test_server.rb +52 -6
  41. data/test/yao/resources/test_subnet.rb +6 -6
  42. data/test/yao/resources/test_user.rb +28 -1
  43. data/test/yao/resources/test_volume.rb +81 -1
  44. data/yao.gemspec +1 -1
  45. metadata +7 -6
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 55df2a0420c42a9448a180f6b0378d82bd8c6fb2d9efac004c152675d357ee3a
4
- data.tar.gz: ff5477041bca286e2283ef8130c3659cd4762a8b415dbc374df73ff077dae51a
3
+ metadata.gz: 22e30555da286a1d595d60c3278cb2d3b63d1353defa42ebfade5851341d486b
4
+ data.tar.gz: 27ed61a3d891a286a54c78af0f6b7eea591e461b7bca75e5e2da93e30f2e6741
5
5
  SHA512:
6
- metadata.gz: 75274af855b318f6be285de56b21260f350e5dd892a291b4ef128db9683b9559e06a6284024f555e4123c879530a2b903b3abea29cc08be0c76fe54417638d38
7
- data.tar.gz: 66ee630a29f13cd94eb4639fcabc711da46d71f1ff8ff779777b7833a052cf6899b5076f9bac7c25669449fb28a87d4c1d6a63857e5bbeae22bd27280834d84f
6
+ metadata.gz: e5610760a589bb5e0bbdd8bbfd6da917628865faa8b64f46f8cc9dbe94f6e9eb95929daf93d1831de5b2bc8a520b94da33455619bb1f412bbeda8dc51833cd5e
7
+ data.tar.gz: 8c2e8f48490af04d4f3a7cb9b42506f74f36fb99d39dc91a7036444de996838639443e3064a01616a9354078b98ca1092a9dfe9dd05feee96dd0cfb7198efadb
@@ -8,9 +8,9 @@ jobs:
8
8
  steps:
9
9
  - uses: actions/checkout@master
10
10
  - name: Set up Ruby
11
- uses: actions/setup-ruby@v1
11
+ uses: ruby/setup-ruby@v1
12
12
  with:
13
- ruby-version: 3.0
13
+ ruby-version: 3.1
14
14
  - name: Install dependencies
15
15
  run: |
16
16
  gem install bundler --no-document
@@ -7,7 +7,7 @@ jobs:
7
7
  runs-on: ubuntu-latest
8
8
  strategy:
9
9
  matrix:
10
- ruby: [ 'ruby-3.0.3' ]
10
+ ruby: [ 'ruby-3.1.1' ]
11
11
  steps:
12
12
  - uses: actions/checkout@master
13
13
  - name: Set up RVM
@@ -7,11 +7,11 @@ jobs:
7
7
  runs-on: ubuntu-latest
8
8
  strategy:
9
9
  matrix:
10
- ruby: [3.0, 2.7, 2.6]
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: actions/setup-ruby@v1
14
+ uses: ruby/setup-ruby@v1
15
15
  with:
16
16
  ruby-version: ${{ matrix.ruby }}
17
17
  - name: Install dependencies
@@ -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["created"] || self["created_at"]
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["updated"] || self["updated_at"]
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
@@ -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 TenantAssociationable
5
+ include ProjectAssociationable
6
6
 
7
7
  friendly_attributes :router_id, :description, :dns_domain, :dns_name,
8
8
  :revision_number,
@@ -18,11 +18,5 @@ module Yao::Resources
18
18
  def router
19
19
  @router ||= Yao::Router.get(router_id)
20
20
  end
21
-
22
- # @return [Yao::Resources::Tenant]
23
- def project
24
- @project ||= Yao::Tenant.get(project_id)
25
- end
26
- alias :tenant :project
27
21
  end
28
22
  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
- Yao::LoadBalancerListener.find listener["id"]
24
- end
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::LoadBalancerListener]
25
+ # @return [Yao::Resources::LoadBalancerPoolMember]
36
26
  def members
37
- self["members"].map do |member|
38
- Yao::LoadBalancerPoolMember.find(self,member["id"])
39
- end
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
- Yao::LoadBalancerHealthMonitor.find healthmonitor_id
46
- end
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"
@@ -1,7 +1,7 @@
1
1
  module Yao::Resources
2
2
  class Meter < Base
3
3
 
4
- include TenantAssociationable
4
+ include ProjectAssociationable
5
5
 
6
6
  friendly_attributes :meter_id, :name, :user_id, :resource_id, :source, :type, :unit
7
7
 
@@ -1,6 +1,6 @@
1
1
  module Yao::Resources
2
2
  class Network < Base
3
- include TenantAssociationable
3
+ include ProjectAssociationable
4
4
 
5
5
  friendly_attributes :name, :status, :shared, :subnets, :admin_state_up
6
6
  map_attribute_to_attribute "provider:physical_network" => :physical_network
@@ -1,6 +1,6 @@
1
1
  module Yao::Resources
2
2
  class OldSample < Base
3
- include TenantAssociationable
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,
@@ -2,7 +2,7 @@ module Yao::Resources
2
2
  class Port < Base
3
3
 
4
4
  include NetworkAssociationable
5
- include TenantAssociationable
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,
@@ -25,6 +25,11 @@ module Yao::Resources
25
25
  @ports ||= Yao::Port.list(tenant_id: id)
26
26
  end
27
27
 
28
+ # @return [Yao::Resources::RoleAssignment]
29
+ def role_assignment
30
+ Yao::RoleAssignment.get(project: id)
31
+ end
32
+
28
33
  class << self
29
34
 
30
35
  def accessible
@@ -1,18 +1,18 @@
1
1
  module Yao
2
2
  module Resources
3
- module TenantAssociationable
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::Tenant]
11
- def tenant
12
- @tenant ||= Yao::Tenant.find(project_id || tenant_id)
10
+ # @return [Yao::Resources::Project]
11
+ def project
12
+ @project ||= Yao::Project.find(project_id || tenant_id)
13
13
  end
14
14
 
15
- alias :project :tenant
15
+ alias :tenant :project
16
16
  end
17
17
  end
18
18
  end
@@ -1,7 +1,7 @@
1
1
  require 'time'
2
2
  module Yao::Resources
3
3
  class Resource < Base
4
- include TenantAssociationable
4
+ include ProjectAssociationable
5
5
 
6
6
  friendly_attributes :user_id, :resource_id,
7
7
  :last_sample_timestamp, :first_sample_timestamp,
@@ -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::InvalidResponse
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
 
@@ -238,7 +239,7 @@ module Yao::Resources
238
239
  GET(create_url(name), query)
239
240
  rescue => e
240
241
  raise e unless e.class == Yao::ItemNotFound || e.class == Yao::NotFound
241
- item = find_by_name(name)
242
+ item = find_by_name(name).select { |r| r.name == name }
242
243
  if item.size > 1
243
244
  raise Yao::TooManyItemFonud.new("More than one resource exists with the name '#{name}'")
244
245
  elsif item.size.zero?
@@ -1,19 +1,51 @@
1
1
  module Yao::Resources
2
2
  class RoleAssignment < Base
3
3
  friendly_attributes :scope, :role, :user
4
+
5
+ map_attribute_to_resource role: Role
6
+ map_attribute_to_resource user: User
7
+
4
8
  self.service = "identity"
5
9
  self.resource_name = "role_assignment"
6
10
  self.resources_name = "role_assignments"
7
11
  self.admin = true
8
12
  self.api_version = "v3"
9
- self.client.url_prefix = Yao.config.auth_url.gsub(/v2.0|v3/, '')
10
13
 
11
- # @return [Yao::Resources::Tenant]
14
+ # @return [Yao::Resources::Project]
12
15
  def project
13
- @project ||= Yao::Tenant.get(scope["project"]["id"])
16
+ @project ||= Yao::Project.get(scope["project"]["id"])
14
17
  end
15
18
 
16
- map_attribute_to_resource role: Role
17
- map_attribute_to_resource user: User
19
+ class << self
20
+ # @param _subpath [String]
21
+ # @return [String]
22
+ def create_url(_subpath='')
23
+ resources_name
24
+ end
25
+
26
+ # @param query [Hash]
27
+ def get(opt = {})
28
+ query = {}
29
+
30
+ if (user = opt[:user])
31
+ query['user.id'] = resource_id_or_string(user)
32
+ end
33
+
34
+ if (project = opt[:project] || opt[:tenant])
35
+ query['scope.project.id'] = resource_id_or_string(project)
36
+ end
37
+
38
+ list(query)
39
+ end
40
+
41
+ private
42
+ def resource_id_or_string(item)
43
+ if item.respond_to?(:id)
44
+ item.id
45
+ else
46
+ item
47
+ end
48
+ end
49
+ end
18
50
  end
19
51
  end
@@ -1,15 +1,31 @@
1
1
  module Yao::Resources
2
2
  class Router < Base
3
- include TenantAssociationable
3
+ include ProjectAssociationable
4
4
 
5
5
  friendly_attributes :name, :description, :admin_state_up, :status, :external_gateway_info,
6
- :network_id, :enable_snat, :external_fixed_ips, :routes, :destination, :nexthop, :distributed,
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
@@ -1,7 +1,7 @@
1
1
  require 'yao/resources/security_group_rule'
2
2
  module Yao::Resources
3
3
  class SecurityGroup < Base
4
- include TenantAssociationable
4
+ include ProjectAssociationable
5
5
 
6
6
  friendly_attributes :name, :description
7
7
 
@@ -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 TenantAssociationable
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)
@@ -2,7 +2,7 @@ module Yao::Resources
2
2
  class Subnet < Base
3
3
 
4
4
  include NetworkAssociationable
5
- include TenantAssociationable
5
+ include ProjectAssociationable
6
6
 
7
7
  friendly_attributes :name, :cidr, :gateway_ip, :network_id, :ip_version,
8
8
  :dns_nameservers, :host_routes, :enable_dhcp
@@ -30,6 +30,11 @@ module Yao::Resources
30
30
  meters.select{|m| m.name == meter_name}
31
31
  end
32
32
 
33
+ # @return [Yao::Resources::RoleAssignment]
34
+ def role_assignment
35
+ Yao::RoleAssignment.get(tenant: id)
36
+ end
37
+
33
38
  class << self
34
39
  def accessible
35
40
  as_member { self.list }
@@ -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,6 +9,11 @@ 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
13
18
  # @return [Bool]
14
19
  def return_single_on_querying
@@ -1,12 +1,25 @@
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
+ include ProjectAssociationable
6
+
7
+ friendly_attributes :attachments, :availability_zone, :bootable, :descriptions, :encrypted, :metadata, :multiattach, :name, :replication_status, :size, :snapshot_id, :status, :user_id, :volume_type
8
+ alias :type :volume_type
4
9
 
10
+ map_attribute_to_attribute 'os-vol-host-attr:host' => :host
5
11
  map_attribute_to_attribute 'os-vol-tenant-attr:tenant_id' => :tenant_id
6
12
 
7
13
  self.service = "volumev3"
8
14
  self.resource_name = "volume"
9
15
  self.resources_name = "volumes"
10
16
  self.resources_detail_available = true
17
+
18
+ def status=(s)
19
+ self.class.set_status(self.id, s)
20
+ self['status'] = s
21
+ end
22
+
23
+ extend VolumeAction
11
24
  end
12
25
  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
@@ -1,7 +1,7 @@
1
1
  module Yao
2
2
  module Resources
3
3
  require "yao/resources/base"
4
- require "yao/resources/tenant_associationable"
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
@@ -1,3 +1,3 @@
1
1
  module Yao
2
- VERSION = "0.14.0"
2
+ VERSION = "0.17.0"
3
3
  end
@@ -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