yao 0.7.0 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (72) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/macos.yml +15 -0
  3. data/.github/workflows/ubuntu-rvm.yml +29 -0
  4. data/.github/workflows/ubuntu.yml +22 -0
  5. data/Gemfile +10 -2
  6. data/README.md +3 -3
  7. data/lib/yao/resources.rb +5 -0
  8. data/lib/yao/resources/action.rb +1 -1
  9. data/lib/yao/resources/compute_services.rb +46 -0
  10. data/lib/yao/resources/flavor.rb +1 -10
  11. data/lib/yao/resources/floating_ip.rb +6 -6
  12. data/lib/yao/resources/hypervisor.rb +6 -12
  13. data/lib/yao/resources/keypair.rb +22 -3
  14. data/lib/yao/resources/meter.rb +6 -7
  15. data/lib/yao/resources/network.rb +3 -1
  16. data/lib/yao/resources/network_associationable.rb +14 -0
  17. data/lib/yao/resources/old_sample.rb +5 -7
  18. data/lib/yao/resources/port.rb +6 -6
  19. data/lib/yao/resources/port_associationable.rb +14 -0
  20. data/lib/yao/resources/project.rb +16 -0
  21. data/lib/yao/resources/resource.rb +12 -7
  22. data/lib/yao/resources/restfully_accessible.rb +72 -35
  23. data/lib/yao/resources/role.rb +73 -18
  24. data/lib/yao/resources/router.rb +3 -1
  25. data/lib/yao/resources/sample.rb +1 -5
  26. data/lib/yao/resources/security_group.rb +3 -1
  27. data/lib/yao/resources/server.rb +4 -9
  28. data/lib/yao/resources/subnet.rb +5 -5
  29. data/lib/yao/resources/tenant.rb +1 -1
  30. data/lib/yao/resources/tenant_associationable.rb +17 -0
  31. data/lib/yao/resources/user.rb +15 -4
  32. data/lib/yao/resources/volume.rb +1 -10
  33. data/lib/yao/version.rb +1 -1
  34. data/test/config.rb +1 -0
  35. data/test/support/auth_stub.rb +1 -0
  36. data/test/support/test_yao_resource.rb +49 -0
  37. data/test/yao/resources/test_aggregates.rb +1 -4
  38. data/test/yao/resources/test_base.rb +1 -1
  39. data/test/yao/resources/test_compute_services.rb +118 -0
  40. data/test/yao/resources/test_flavor.rb +15 -9
  41. data/test/yao/resources/test_floating_ip.rb +24 -19
  42. data/test/yao/resources/test_host.rb +1 -1
  43. data/test/yao/resources/test_hypervisor.rb +17 -10
  44. data/test/yao/resources/test_image.rb +1 -1
  45. data/test/yao/resources/test_keypair.rb +3 -6
  46. data/test/yao/resources/test_loadbalancer.rb +1 -3
  47. data/test/yao/resources/test_loadbalancer_healthmonitor.rb +1 -3
  48. data/test/yao/resources/test_loadbalancer_listener.rb +1 -5
  49. data/test/yao/resources/test_loadbalancer_pool.rb +1 -3
  50. data/test/yao/resources/test_loadbalancer_pool_member.rb +1 -3
  51. data/test/yao/resources/test_meter.rb +13 -14
  52. data/test/yao/resources/test_network.rb +28 -1
  53. data/test/yao/resources/test_old_sample.rb +86 -0
  54. data/test/yao/resources/test_port.rb +29 -7
  55. data/test/yao/resources/test_project.rb +32 -0
  56. data/test/yao/resources/test_resource.rb +56 -0
  57. data/test/yao/resources/test_role.rb +255 -1
  58. data/test/yao/resources/test_role_assignment.rb +4 -6
  59. data/test/yao/resources/test_router.rb +26 -6
  60. data/test/yao/resources/test_sample.rb +61 -0
  61. data/test/yao/resources/test_security_group.rb +23 -1
  62. data/test/yao/resources/test_security_group_rule.rb +1 -1
  63. data/test/yao/resources/test_server.rb +34 -8
  64. data/test/yao/resources/test_subnet.rb +25 -6
  65. data/test/yao/resources/test_user.rb +73 -1
  66. data/test/yao/resources/test_volume.rb +31 -1
  67. data/test/yao/resources/test_volume_type.rb +1 -1
  68. data/test/yao/test_config.rb +21 -8
  69. data/test/yao/test_read_only.rb +3 -3
  70. data/yao.gemspec +0 -8
  71. metadata +22 -101
  72. data/.travis.yml +0 -28
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 74b1d157a6a9fbf7bb533bf9bf95755c44fc29f76a412c71a492ca849310fefb
4
- data.tar.gz: 93fe712c7e19d8a007c29258d9c3f619df4765bf6934e10937121fec77afcdb6
3
+ metadata.gz: 97e6146fda8345c89f804cb55928c3011e8603999355e27e5416d13eb336e569
4
+ data.tar.gz: b47ac5d66e43b08e2482f157c13ff9fa45a335b8ac6992737d6554d08a2c4ca3
5
5
  SHA512:
6
- metadata.gz: 449ee882dafffefe8839b0fd39d857e15801967e4c73b650e39412d14c0121d833a3b11ff1c875b6de5ecd94d4da1a33424e5bf19a36ea58a7a4e8e639251cb5
7
- data.tar.gz: 443e2353eadf6df3c5f6b357d46f7c23d8fa4a87ff493f11f0e82c14d47562e9a5670cf88d2f6043992a64c7d5e8368eb15525ee6c57b1890f9464f6ff1822c7
6
+ metadata.gz: f4066fa6911823b55df1b9e61d6796b3efa7719b7dc6afb4858b1daf28153bf16754aed5f4646fdbbbf8a80b540235f2cbf0d763c98e8ec428d1d8de7cb78077
7
+ data.tar.gz: 545be1baceecc9ad556b207f19e01dc2658a37321038225707643005f802cbbbfea57f7fba5ba581ad4df1d1a7f2c331d4168ff7ee13c181f2ffb2f7d43056ff
@@ -0,0 +1,15 @@
1
+ name: macos
2
+
3
+ on: [push]
4
+
5
+ jobs:
6
+ build:
7
+ runs-on: macos-latest
8
+ steps:
9
+ - uses: actions/checkout@master
10
+ - name: Install dependencies
11
+ run: |
12
+ gem install bundler --no-document
13
+ bundle install
14
+ - name: Run test
15
+ run: bundle exec rake test
@@ -0,0 +1,29 @@
1
+ name: ubuntu-rvm
2
+
3
+ on: [push]
4
+
5
+ jobs:
6
+ build:
7
+ runs-on: ubuntu-latest
8
+ strategy:
9
+ matrix:
10
+ ruby: [ 'ruby-head' ]
11
+ steps:
12
+ - uses: actions/checkout@master
13
+ - name: Set up RVM
14
+ run: |
15
+ curl -sSL https://get.rvm.io | bash
16
+ - name: Set up Ruby
17
+ run: |
18
+ source $HOME/.rvm/scripts/rvm
19
+ rvm install ${{ matrix.ruby }} --binary
20
+ rvm --default use ${{ matrix.ruby }}
21
+ - name: Install dependencies
22
+ run: |
23
+ source $HOME/.rvm/scripts/rvm
24
+ gem install bundler --no-document
25
+ bundle install
26
+ - name: Run test
27
+ run: |
28
+ source $HOME/.rvm/scripts/rvm
29
+ bundle exec rake test
@@ -0,0 +1,22 @@
1
+ name: ubuntu
2
+
3
+ on: [push]
4
+
5
+ jobs:
6
+ build:
7
+ runs-on: ubuntu-latest
8
+ strategy:
9
+ matrix:
10
+ ruby: [ '2.6.x', '2.5.x', '2.4.x' ]
11
+ steps:
12
+ - uses: actions/checkout@master
13
+ - name: Set up Ruby
14
+ uses: actions/setup-ruby@v1
15
+ with:
16
+ version: ${{ matrix.ruby }}
17
+ - name: Install dependencies
18
+ run: |
19
+ gem install bundler --no-document
20
+ bundle install
21
+ - name: Run test
22
+ run: bundle exec rake test
data/Gemfile CHANGED
@@ -3,5 +3,13 @@ source 'https://rubygems.org'
3
3
  # Specify your gem's dependencies in yao.gemspec
4
4
  gemspec
5
5
 
6
- gem 'travis'
7
- gem 'rubocop'
6
+ group :development do
7
+ gem 'rubocop'
8
+ gem "bundler", ">= 1.10"
9
+ gem "rake", "~> 10.0"
10
+ gem "test-unit", ">= 3"
11
+ gem "test-unit-rr"
12
+ gem "power_assert"
13
+ gem "pry"
14
+ gem "webmock"
15
+ end
data/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  ![Logo](./yao-logo.png)
4
4
 
5
- YAO is a Yet Another OpenStack API Wrapper that rocks!! [![Build Status](https://travis-ci.org/yaocloud/yao.svg)](https://travis-ci.org/yaocloud/yao)
5
+ YAO is a Yet Another OpenStack API Wrapper that rocks!!
6
6
 
7
7
  ## Installation
8
8
 
@@ -43,7 +43,7 @@ Yao.configure do
43
43
  end
44
44
 
45
45
  Yao::Network.list # list up networks...
46
- Yao::Server.list_detail # list up instances...
46
+ Yao::Server.list # list up instances...
47
47
  ```
48
48
 
49
49
  If you want to override some of endpoints by service, you can do:
@@ -79,7 +79,7 @@ OpenStack.configure do
79
79
  password "tonk0tsu-r@men"
80
80
  end
81
81
 
82
- OpenStack::Server.list_detail # And let's go on
82
+ OpenStack::Server.list # And let's go on
83
83
  ```
84
84
 
85
85
  ## Contributing
@@ -1,6 +1,9 @@
1
1
  module Yao
2
2
  module Resources
3
3
  require "yao/resources/base"
4
+ require "yao/resources/tenant_associationable"
5
+ require "yao/resources/port_associationable"
6
+ require "yao/resources/network_associationable"
4
7
 
5
8
  autoload :Server, "yao/resources/server"
6
9
  autoload :Flavor, "yao/resources/flavor"
@@ -27,6 +30,8 @@ module Yao
27
30
  autoload :RoleAssignment, "yao/resources/role_assignment"
28
31
  autoload :Volume, "yao/resources/volume"
29
32
  autoload :VolumeType, "yao/resources/volume_type"
33
+ autoload :ComputeServices, "yao/resources/compute_services"
34
+ autoload :Project, "yao/resources/project"
30
35
 
31
36
  autoload :Resource, "yao/resources/resource"
32
37
  autoload :Meter, "yao/resources/meter"
@@ -5,7 +5,7 @@ module Yao::Resources
5
5
  req.body = query.to_json
6
6
  req.headers['Content-Type'] = 'application/json'
7
7
  end
8
- res.body ? return_resource(resource_from_json(res.body)) : nil
8
+ res.body ? resource_from_json(res.body) : nil
9
9
  end
10
10
 
11
11
  private
@@ -0,0 +1,46 @@
1
+ module Yao::Resources
2
+ class ComputeServices < Base
3
+ friendly_attributes :status, :binary, :host, :zone, :state, :disabled_reason, :forced_down
4
+
5
+ self.service = "compute"
6
+ self.resource_name = "service"
7
+ self.resources_name = "os-services"
8
+
9
+ class << self
10
+ def enable(host, binary)
11
+ params = {
12
+ "host" => host,
13
+ "binary" => binary,
14
+ }
15
+ put("enable", params)
16
+ end
17
+
18
+ def disable(host, binary, reason = nil)
19
+ params = {
20
+ "host" => host,
21
+ "binary" => binary,
22
+ }
23
+ if reason
24
+ params["disabled_reason"] = reason
25
+ put("disable-log-reason", params)
26
+ else
27
+ put("disable", params)
28
+ end
29
+ end
30
+
31
+ private
32
+
33
+ # @param path [String]
34
+ # @param params [Hash]
35
+ # @return [Yao::Resources::ComputeServices]
36
+ def put(path, params)
37
+ res = PUT(create_url(path), params) do |req|
38
+ req.body = params.to_json
39
+ req.headers['Content-Type'] = 'application/json'
40
+ end
41
+ resource_from_json(res.body)
42
+ end
43
+ end
44
+
45
+ end
46
+ end
@@ -17,15 +17,6 @@ module Yao::Resources
17
17
  self.service = "compute"
18
18
  self.resource_name = "flavor"
19
19
  self.resources_name = "flavors"
20
-
21
- class << self
22
- def list_detail(query={})
23
- return_resources(
24
- resources_from_json(
25
- GET([resources_path, "detail"].join("/"), query).body
26
- )
27
- )
28
- end
29
- end
20
+ self.resources_detail_available = true
30
21
  end
31
22
  end
@@ -1,9 +1,13 @@
1
1
  module Yao::Resources
2
2
  class FloatingIP < Base
3
+
4
+ include PortAssociationable
5
+ include TenantAssociationable
6
+
3
7
  friendly_attributes :router_id, :description, :dns_domain, :dns_name,
4
- :revision_number, :project_id, :tenant_id,
8
+ :revision_number,
5
9
  :floating_network_id, :fixed_ip_address,
6
- :floating_ip_address, :port_id,
10
+ :floating_ip_address,
7
11
  :status, :port_details, :tags, :port_forwardings
8
12
 
9
13
  self.service = "network"
@@ -18,9 +22,5 @@ module Yao::Resources
18
22
  @project ||= Yao::Tenant.get(project_id)
19
23
  end
20
24
  alias :tenant :project
21
-
22
- def port
23
- @port ||= Yao::Port.find(port_id)
24
- end
25
25
  end
26
26
  end
@@ -22,26 +22,20 @@ module Yao::Resources
22
22
  self.service = "compute"
23
23
  self.resource_name = "os-hypervisor"
24
24
  self.resources_name = "os-hypervisors"
25
+ self.resources_detail_available = true
25
26
 
26
27
  class << self
27
- def list_detail(query={})
28
- return_resources(
29
- resources_from_json(
30
- GET([resources_path, "detail"].join("/"), query).body
31
- )
32
- )
33
- end
34
-
28
+ # @return [Yao::Resources::Hypervisor::Statistics]
35
29
  def statistics
36
30
  json = GET([resources_path, "statistics"].join("/")).body
37
31
  Yao::Resources::Hypervisor::Statistics.new(json["hypervisor_statistics"])
38
32
  end
39
33
 
34
+ # @param id [String]
35
+ # @return [Yao::Resources::Hypervisor::Uptime]
40
36
  def uptime(id)
41
- res = resource_from_json(
42
- GET([resources_path, id, "uptime"].join("/")).body
43
- )
44
- Yao::Resources::Hypervisor::Uptime.new(res)
37
+ json = GET([resources_path, id, "uptime"].join("/")).body
38
+ Yao::Resources::Hypervisor::Uptime.new(json["hypervisor"])
45
39
  end
46
40
  end
47
41
 
@@ -6,10 +6,29 @@ module Yao::Resources
6
6
  self.resource_name = "os-keypair"
7
7
  self.resources_name = "os-keypairs"
8
8
 
9
+ # os-keypairs API returns very complicated JSON.
10
+ # For example.
11
+ # {
12
+ # "keypairs": [
13
+ # {
14
+ # "keypair": {
15
+ # "fingerprint": "...",
16
+ # }
17
+ # },
18
+ # {
19
+ # "keypair": {
20
+ # "fingerprint": "...",
21
+ # }
22
+ # },
23
+ # ]
24
+ #
25
+ # @param query [Hash]
26
+ # @return [Array<Yao::Resources::Keypairs>]
9
27
  def self.list(query={})
10
- return_resources(
11
- resources_from_json(GET(resources_name, query).body).map{|r| resource_from_json(r)}
12
- )
28
+ res = GET(resources_name, query)
29
+ res.body['keypairs'].map { |attribute|
30
+ new(attribute['keypair'])
31
+ }
13
32
  end
14
33
  end
15
34
  end
@@ -1,6 +1,9 @@
1
1
  module Yao::Resources
2
2
  class Meter < Base
3
- friendly_attributes :meter_id, :name, :user_id, :resource_id, :project_id, :source, :type, :unit
3
+
4
+ include TenantAssociationable
5
+
6
+ friendly_attributes :meter_id, :name, :user_id, :resource_id, :source, :type, :unit
4
7
 
5
8
  def id
6
9
  meter_id
@@ -10,10 +13,6 @@ module Yao::Resources
10
13
  @resource ||= Yao::Resource.get(resource_id)
11
14
  end
12
15
 
13
- def tenant
14
- @tenant ||= Yao::Tenant.get(project_id)
15
- end
16
-
17
16
  def user
18
17
  @user ||= Yao::User.get(user_id)
19
18
  end
@@ -25,11 +24,11 @@ module Yao::Resources
25
24
  class << self
26
25
  private
27
26
  def resource_from_json(json)
28
- json
27
+ new(json)
29
28
  end
30
29
 
31
30
  def resources_from_json(json)
32
- json
31
+ new(json)
33
32
  end
34
33
  end
35
34
  end
@@ -1,6 +1,8 @@
1
1
  module Yao::Resources
2
2
  class Network < Base
3
- friendly_attributes :name, :status, :shared, :tenant_id, :subnets, :admin_state_up
3
+ include TenantAssociationable
4
+
5
+ friendly_attributes :name, :status, :shared, :subnets, :admin_state_up
4
6
  map_attribute_to_attribute "provider:physical_network" => :physical_network
5
7
  map_attribute_to_attribute "provider:network_type" => :type
6
8
  map_attribute_to_attribute "provider:segmentation_id" => :segmentation_id
@@ -0,0 +1,14 @@
1
+ module Yao
2
+ module Resources
3
+ module NetworkAssociationable
4
+
5
+ def self.included(base)
6
+ base.friendly_attributes :network_id
7
+ end
8
+
9
+ def network
10
+ @tenant ||= Yao::Network.find(network_id)
11
+ end
12
+ end
13
+ end
14
+ end
@@ -1,7 +1,9 @@
1
1
  module Yao::Resources
2
2
  class OldSample < Base
3
+ include TenantAssociationable
4
+
3
5
  friendly_attributes :counter_name, :counter_type, :counter_unit, :counter_volume,
4
- :message_id, :project_id, :resource_id, :timestamp, :resource_metadata, :user_id,
6
+ :message_id, :resource_id, :timestamp, :resource_metadata, :user_id,
5
7
  :source
6
8
 
7
9
  def recorded_at
@@ -10,17 +12,13 @@ module Yao::Resources
10
12
  alias timestamp recorded_at
11
13
 
12
14
  def id
13
- meter_id
15
+ message_id
14
16
  end
15
17
 
16
18
  def resource
17
19
  @resource ||= Yao::Resource.get(resource_id)
18
20
  end
19
21
 
20
- def tenant
21
- @tenant ||= Yao::Tenant.get(project_id)
22
- end
23
-
24
22
  def user
25
23
  @user ||= Yao::User.get(user_id)
26
24
  end
@@ -32,7 +30,7 @@ module Yao::Resources
32
30
  def self.list(meter_name, query={})
33
31
  cache_key = [meter_name, *query].join
34
32
  cache[cache_key] = GET("#{self.api_version}/meters/#{meter_name}", query).body unless cache[cache_key]
35
- return_resources(cache[cache_key])
33
+ new(cache[cache_key])
36
34
  end
37
35
 
38
36
  def self.cache
@@ -1,8 +1,12 @@
1
1
  module Yao::Resources
2
2
  class Port < Base
3
+
4
+ include NetworkAssociationable
5
+ include TenantAssociationable
6
+
3
7
  friendly_attributes :name, :mac_address, :status, :allowed_address_pairs,
4
8
  :device_owner, :fixed_ips, :security_groups, :device_id,
5
- :network_id, :tenant_id, :admin_state_up
9
+ :admin_state_up
6
10
  map_attribute_to_attribute "binding:host_id" => :host_id
7
11
 
8
12
  def primary_ip
@@ -10,11 +14,7 @@ module Yao::Resources
10
14
  end
11
15
 
12
16
  def primary_subnet
13
- Yao::Subnet.find fixed_ips.first["subnet_id"]
14
- end
15
-
16
- def network
17
- Yao::Network.find network_id
17
+ @subnet ||= Yao::Subnet.find fixed_ips.first["subnet_id"]
18
18
  end
19
19
 
20
20
  self.service = "network"
@@ -0,0 +1,14 @@
1
+ module Yao
2
+ module Resources
3
+ module PortAssociationable
4
+
5
+ def self.included(base)
6
+ base.friendly_attributes :port_id
7
+ end
8
+
9
+ def port
10
+ @port ||= Yao::Port.find(port_id)
11
+ end
12
+ end
13
+ end
14
+ end