yao 0.1.1 → 0.2.0.rc1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7de241c1b6e0fd16fbebd77ef168fb35672be6b6
4
- data.tar.gz: 4985a66290b6ef759ebe5b010d86b94f2355db02
3
+ metadata.gz: 496e37a3be347d2be82ee61a2297dd8bd7271c97
4
+ data.tar.gz: 920987ae4956f2cc74be462eefd5fcd67c906c4a
5
5
  SHA512:
6
- metadata.gz: 56ba2523368eaf6886d81b250f15e3b80b7c89919eec0e24c286129c991ede9518f10ffaab2400ecf661ebc0a2143114046b0c3c9af3e268b0f15d1ab859dbca
7
- data.tar.gz: bfad2eef1088c14dc96cbc20a33838b687c8be6d17dbaf42a59d663186a3bd83b3524dd26a84cc41b90e459c5420bd3eda31483bf589f3b3e59b5eaefb4078b6
6
+ metadata.gz: 8ca3a1ad84d0d95d36aa0802ea71df5455435bcd2eebdfda3b54c9b4bd468b9ed51a36665d063d330dd42e5625f83af73089e4563abd490e7a4b341be6597c8b
7
+ data.tar.gz: 1ddced2029721ec76beabce11277085d4044b76223e2e3049e19dc9f32e4d8d5cc63dd7935a53dfd8c898bce18594cacb054b169efe4697b2b3c51701817cb26
data/lib/yao/client.rb CHANGED
@@ -1,8 +1,7 @@
1
1
  require 'yao'
2
2
  require 'yao/config'
3
3
  require 'faraday'
4
- require 'faraday_middleware'
5
- require 'yao/faraday_middlewares'
4
+ require 'yao/plugins/default_client_generator'
6
5
 
7
6
  module Yao
8
7
  module Client
@@ -42,34 +41,13 @@ module Yao
42
41
  class << self
43
42
  attr_accessor :default_client
44
43
 
45
- def client_generator_hook
46
- lambda do |f, token|
47
- f.request :url_encoded
48
- f.request :json
49
-
50
- if token
51
- f.request :os_token, token
52
- end
53
-
54
- f.response :os_error_detector
55
- f.response :json, :content_type => /\bjson$/
56
-
57
- if Yao.config.debug
58
- f.response :logger
59
- f.response :os_dumper
60
- end
61
-
62
- if Yao.config.debug_record_response
63
- f.response :os_response_recorder
64
- end
65
-
66
- f.adapter Faraday.default_adapter
67
- end
44
+ def client_generator
45
+ Plugins::Registry.instance[:client_generator][Yao.config.client_generator].new
68
46
  end
69
47
 
70
48
  def gen_client(endpoint, token: nil)
71
49
  Faraday.new( endpoint ) do |f|
72
- client_generator_hook.call(f, token)
50
+ client_generator.call(f, token)
73
51
  end
74
52
  end
75
53
 
@@ -1,5 +1,18 @@
1
1
  require 'faraday'
2
2
 
3
+ class Faraday::Request::Accept
4
+ def initialize(app, accept=nil)
5
+ @app = app
6
+ @accept = accept || 'application/json'
7
+ end
8
+
9
+ def call(env)
10
+ env[:request_headers]['Accept'] = @accept
11
+ @app.call(env)
12
+ end
13
+ end
14
+ Faraday::Request.register_middleware accept: -> { Faraday::Request::Accept }
15
+
3
16
  class Faraday::Request::OSToken
4
17
  def initialize(app, token)
5
18
  @app = app
@@ -0,0 +1,37 @@
1
+ require 'yao/plugins'
2
+ require 'faraday'
3
+ require 'faraday_middleware'
4
+ require 'yao/faraday_middlewares'
5
+
6
+ module Yao::Plugins
7
+ class DefaultClientGenerator
8
+ def call(f, token)
9
+ f.request :accept, 'application/json'
10
+ f.request :url_encoded
11
+
12
+ if token
13
+ f.request :os_token, token
14
+ end
15
+
16
+ f.response :os_error_detector
17
+ f.response :json, :content_type => /\bjson$/
18
+
19
+ if Yao.config.debug
20
+ f.response :logger
21
+ f.response :os_dumper
22
+ end
23
+
24
+ if Yao.config.debug_record_response
25
+ f.response :os_response_recorder
26
+ end
27
+
28
+ f.adapter Faraday.default_adapter
29
+ end
30
+
31
+ Yao::Plugins.register(self, type: :client_generator)
32
+
33
+ Yao.config.param :client_generator, :default do |v|
34
+ raise("Invalid client_generator name %s.\nNote: name must be a Symbol" % v.inspect) unless Registry.instance[:client_generator][v]
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,25 @@
1
+ require 'singleton'
2
+
3
+ module Yao::Plugins
4
+ class Registry
5
+ include Singleton
6
+
7
+ def initialize
8
+ @types = {}
9
+ end
10
+
11
+ def [](type)
12
+ @types[type]
13
+ end
14
+
15
+ def register(klass, type: nil, name: :default)
16
+ raise("Plugin registration requires both type and name.") if !type or !name
17
+ @types[type] ||= {}
18
+ @types[type][name] = klass
19
+ end
20
+ end
21
+
22
+ def self.register(*a)
23
+ Registry.instance.register(*a)
24
+ end
25
+ end
@@ -0,0 +1,3 @@
1
+ module Yao::Plugins; end
2
+
3
+ require 'yao/plugins/registry'
@@ -0,0 +1,16 @@
1
+ module Yao::Resources
2
+ module Action
3
+ def action(id, query)
4
+ res = POST(action_path(id)) do |req|
5
+ req.body = query.to_json
6
+ req.headers['Content-Type'] = 'application/json'
7
+ end
8
+ return_resource(res.body[resource_name_in_json])
9
+ end
10
+
11
+ private
12
+ def action_path(id)
13
+ [resources_name, id, "action"].join("/")
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,36 @@
1
+ module Yao::Resources
2
+ class Meter < Base
3
+ friendly_attributes :meter_id, :name, :user_id, :resource_id, :project_id, :source, :type, :unit
4
+
5
+ def id
6
+ meter_id
7
+ end
8
+
9
+ def resource
10
+ @resource ||= Yao::Resource.get(resource_id)
11
+ end
12
+
13
+ def tenant
14
+ @tenant ||= Yao::User.get(project_id)
15
+ end
16
+
17
+ def user
18
+ @user ||= Yao::User.get(user_id)
19
+ end
20
+
21
+ self.service = "metering"
22
+ self.api_version = "v2"
23
+ self.resources_name = "meters"
24
+
25
+ class << self
26
+ private
27
+ def resource_from_json(json)
28
+ json
29
+ end
30
+
31
+ def resources_from_json(json)
32
+ json
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,54 @@
1
+ require 'time'
2
+ module Yao::Resources
3
+ class Resource < Base
4
+ friendly_attributes :user_id, :resource_id, :project_id,
5
+ :last_sample_timestamp, :first_sample_timestamp,
6
+ :metadata,
7
+ :links
8
+
9
+ def id
10
+ resource_id
11
+ end
12
+
13
+ def tenant
14
+ @tenant ||= Yao::User.get(project_id)
15
+ end
16
+
17
+ def user
18
+ @user ||= Yao::User.get(user_id)
19
+ end
20
+
21
+ def last_sampled_at
22
+ Time.parse last_sample_timestamp
23
+ end
24
+
25
+ def first_sampled_at
26
+ Time.parse first_sample_timestamp
27
+ end
28
+
29
+ def get_meter(name)
30
+ if link = links.find{|l| l["rel"] == name }
31
+ Yao::Sample.list(link["href"])
32
+ end
33
+ end
34
+
35
+ def meters
36
+ links.map{|l| l["rel"] }.delete_if{|n| n == 'self' }
37
+ end
38
+
39
+ self.service = "metering"
40
+ self.api_version = "v2"
41
+ self.resources_name = "resources"
42
+
43
+ class << self
44
+ private
45
+ def resource_from_json(json)
46
+ json
47
+ end
48
+
49
+ def resources_from_json(json)
50
+ json
51
+ end
52
+ end
53
+ end
54
+ end
@@ -18,10 +18,17 @@ module Yao::Resources
18
18
  def service=(name)
19
19
  @service = name
20
20
  end
21
+ attr_reader :service
21
22
 
22
- def service
23
- @service
23
+ def api_version=(v)
24
+ raise("Set api_version after service is declared") unless service
25
+ @api_version = v
26
+ if cli = client
27
+ cli.url_prefix.path = "/#{api_version}"
28
+ end
29
+ api_version
24
30
  end
31
+ attr_reader :api_version
25
32
 
26
33
  def admin=(bool)
27
34
  @admin = bool
@@ -71,14 +78,18 @@ module Yao::Resources
71
78
  def list(query={})
72
79
  json = GET(resources_path, query).body
73
80
  if @return_single_on_querying && !query.empty?
74
- return_resource(json[resource_name_in_json])
81
+ return_resource(resource_from_json(json))
75
82
  else
76
- return_resources(json[resources_name_in_json])
83
+ return_resources(resources_from_json(json))
77
84
  end
78
85
  end
79
86
 
80
87
  def list_detail(query={})
81
- return_resources(GET([resources_path, "detail"].join("/"), query).body[resources_name_in_json])
88
+ return_resources(
89
+ resources_from_json(
90
+ GET([resources_path, "detail"].join("/"), query).body
91
+ )
92
+ )
82
93
  end
83
94
 
84
95
  def get(id_or_permalink, query={})
@@ -87,7 +98,7 @@ module Yao::Resources
87
98
  else
88
99
  GET([resources_path, id_or_permalink].join("/"), query)
89
100
  end
90
- return_resource(res.body[resource_name_in_json])
101
+ return_resource(resource_from_json(res.body))
91
102
  end
92
103
  alias find get
93
104
 
@@ -99,7 +110,7 @@ module Yao::Resources
99
110
  req.body = params.to_json
100
111
  req.headers['Content-Type'] = 'application/json'
101
112
  end
102
- return_resource(res.body[resource_name_in_json])
113
+ return_resource(resource_from_json(res.body))
103
114
  end
104
115
 
105
116
  def update(id, resource_params)
@@ -110,7 +121,7 @@ module Yao::Resources
110
121
  req.body = params.to_json
111
122
  req.headers['Content-Type'] = 'application/json'
112
123
  end
113
- return_resource(res.body[resource_name_in_json])
124
+ return_resource(resource_from_json(res.body))
114
125
  end
115
126
 
116
127
  def destroy(id)
@@ -119,12 +130,14 @@ module Yao::Resources
119
130
  end
120
131
 
121
132
  private
122
- def resource_name_in_json
133
+ def resource_from_json(json)
123
134
  @resource_name_in_json ||= resource_name.sub(/^os-/, "").tr("-", "_")
135
+ json[@resource_name_in_json]
124
136
  end
125
137
 
126
- def resources_name_in_json
138
+ def resources_from_json(json)
127
139
  @resources_name_in_json ||= resources_name.sub(/^os-/, "").tr("-", "_")
140
+ json[@resources_name_in_json]
128
141
  end
129
142
 
130
143
  def return_resource(d)
@@ -0,0 +1,43 @@
1
+ module Yao::Resources
2
+ class Sample < Base
3
+ friendly_attributes :counter_name, :counter_type, :counter_unit, :counter_volume,
4
+ :message_id, :project_id, :resource_id, :timestamp, :resource_metadata, :user_id
5
+ :source
6
+
7
+ def recorded_at
8
+ Time.parse(self["recorded_at"] || self["timestamp"])
9
+ end
10
+ alias timestamp recorded_at
11
+
12
+ def id
13
+ meter_id
14
+ end
15
+
16
+ def resource
17
+ @resource ||= Yao::Resource.get(resource_id)
18
+ end
19
+
20
+ def tenant
21
+ @tenant ||= Yao::User.get(project_id)
22
+ end
23
+
24
+ def user
25
+ @user ||= Yao::User.get(user_id)
26
+ end
27
+
28
+ self.service = "metering"
29
+ self.api_version = "v2"
30
+
31
+ # get /v2/meters/{id} returns samples!
32
+ def self.list(id_or_url, query={})
33
+ json = if id_or_url =~ /^https?:\/\//
34
+ GET(id_or_url).body
35
+ else
36
+ GET("meters/#{id_or_url}", query).body
37
+ end
38
+ return_resources(json)
39
+ end
40
+
41
+ # TODO: implement `def self.create'
42
+ end
43
+ end
@@ -1,4 +1,5 @@
1
1
  require 'yao/resources/metadata_available'
2
+ require 'yao/resources/action'
2
3
  module Yao::Resources
3
4
  class Server < Base
4
5
  friendly_attributes :addresses, :metadata, :name, :progress,
@@ -21,6 +22,19 @@ module Yao::Resources
21
22
  self.resource_name = "server"
22
23
  self.resources_name = "servers"
23
24
 
25
+ def self.shutoff(id)
26
+ action(id, "os-stop" => nil)
27
+ end
28
+
29
+ def self.reboot(id)
30
+ action(id,"reboot" => { "type" => "HARD" })
31
+ end
32
+
33
+ def self.resize(id, flavor_id)
34
+ action(id,"resize" => { "flavorRef" => flavor_id })
35
+ end
36
+
24
37
  extend MetadataAvailable
38
+ extend Action
25
39
  end
26
40
  end
data/lib/yao/resources.rb CHANGED
@@ -17,6 +17,10 @@ module Yao
17
17
  autoload :Host, "yao/resources/host"
18
18
  autoload :User, "yao/resources/user"
19
19
  autoload :Role, "yao/resources/role"
20
+
21
+ autoload :Resource, "yao/resources/resource"
22
+ autoload :Meter, "yao/resources/meter"
23
+ autoload :Sample, "yao/resources/sample"
20
24
  end
21
25
 
22
26
  def self.const_missing(name)
data/lib/yao/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Yao
2
- VERSION = "0.1.1"
2
+ VERSION = "0.2.0.rc1"
3
3
  end
data/lib/yao.rb CHANGED
@@ -4,6 +4,7 @@ module Yao
4
4
  end
5
5
 
6
6
  require 'yao/config'
7
+ require 'yao/plugins'
7
8
  require 'yao/client'
8
9
  require 'yao/auth'
9
10
  require 'yao/resources'
@@ -9,8 +9,8 @@ class TestClient < Test::Unit::TestCase
9
9
  assert { cli.url_prefix.to_s == "http://cool-api.example.com:12345/v3.0" }
10
10
 
11
11
  handlers = [
12
+ Faraday::Request::Accept,
12
13
  Faraday::Request::UrlEncoded,
13
- FaradayMiddleware::EncodeJson,
14
14
  Faraday::Response::OSErrorDetector,
15
15
  FaradayMiddleware::ParseJson,
16
16
  Faraday::Adapter::NetHttp
@@ -21,8 +21,8 @@ class TestClient < Test::Unit::TestCase
21
21
  def test_gen_with_token
22
22
  cli = Yao::Client.gen_client("http://cool-api.example.com:12345/v3.0", token: "deadbeaf")
23
23
  handlers = [
24
+ Faraday::Request::Accept,
24
25
  Faraday::Request::UrlEncoded,
25
- FaradayMiddleware::EncodeJson,
26
26
  Faraday::Request::OSToken,
27
27
  Faraday::Response::OSErrorDetector,
28
28
  FaradayMiddleware::ParseJson,
@@ -36,8 +36,8 @@ class TestClient < Test::Unit::TestCase
36
36
 
37
37
  cli = Yao::Client.gen_client("http://cool-api.example.com:12345/v3.0")
38
38
  handlers = [
39
+ Faraday::Request::Accept,
39
40
  Faraday::Request::UrlEncoded,
40
- FaradayMiddleware::EncodeJson,
41
41
  Faraday::Response::OSErrorDetector,
42
42
  FaradayMiddleware::ParseJson,
43
43
  Faraday::Response::Logger,
@@ -0,0 +1,38 @@
1
+ class TestClientPlugin < Test::Unit::TestCase
2
+ def setup
3
+ stub(Yao.config).debug { false }
4
+ stub(Yao.config).debug_record_response { false }
5
+ end
6
+
7
+ def teardown
8
+ Yao.config.set :client_generator, :default
9
+ end
10
+
11
+ def test_raise_invalid_name
12
+ e = nil
13
+ begin
14
+ Yao.config.set :client_generator, :nonexist
15
+ rescue => e
16
+ end
17
+
18
+ assert { e.is_a? StandardError }
19
+ assert { e.message == "Invalid client_generator name :nonexist.\nNote: name must be a Symbol" }
20
+ end
21
+
22
+ class ::Yao::Plugins::TestCustomClientGenerator
23
+ def call(f, t)
24
+ f.response :xml, :content_type => /\/xml$/
25
+ end
26
+ ::Yao::Plugins.register self, type: :client_generator, name: :test_custom
27
+ end
28
+
29
+ def test_gen_client_with_custom
30
+ Yao.config.set :client_generator, :test_custom
31
+
32
+ cli = Yao::Client.gen_client("http://cool-api.example.com:12345/v3.0")
33
+ handlers = [
34
+ FaradayMiddleware::ParseXml,
35
+ ]
36
+ assert { cli.builder.handlers == handlers }
37
+ end
38
+ 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.1.1
4
+ version: 0.2.0.rc1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Uchio, KONDO
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-11-05 00:00:00.000000000 Z
11
+ date: 2015-11-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: json
@@ -170,7 +170,11 @@ files:
170
170
  - lib/yao/config.rb
171
171
  - lib/yao/faraday_middlewares.rb
172
172
  - lib/yao/is_openstack_client.rb
173
+ - lib/yao/plugins.rb
174
+ - lib/yao/plugins/default_client_generator.rb
175
+ - lib/yao/plugins/registry.rb
173
176
  - lib/yao/resources.rb
177
+ - lib/yao/resources/action.rb
174
178
  - lib/yao/resources/base.rb
175
179
  - lib/yao/resources/flavor.rb
176
180
  - lib/yao/resources/floating_ip.rb
@@ -179,10 +183,13 @@ files:
179
183
  - lib/yao/resources/image.rb
180
184
  - lib/yao/resources/keypair.rb
181
185
  - lib/yao/resources/metadata_available.rb
186
+ - lib/yao/resources/meter.rb
182
187
  - lib/yao/resources/network.rb
183
188
  - lib/yao/resources/port.rb
189
+ - lib/yao/resources/resource.rb
184
190
  - lib/yao/resources/restfully_accessible.rb
185
191
  - lib/yao/resources/role.rb
192
+ - lib/yao/resources/sample.rb
186
193
  - lib/yao/resources/security_group.rb
187
194
  - lib/yao/resources/security_group_rule.rb
188
195
  - lib/yao/resources/server.rb
@@ -195,6 +202,7 @@ files:
195
202
  - test/config.rb
196
203
  - test/yao/test_auth.rb
197
204
  - test/yao/test_client.rb
205
+ - test/yao/test_client_plugin.rb
198
206
  - test/yao/test_config.rb
199
207
  - test/yao/test_server_error.rb
200
208
  - test/yao/test_token.rb
@@ -214,12 +222,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
214
222
  version: '0'
215
223
  required_rubygems_version: !ruby/object:Gem::Requirement
216
224
  requirements:
217
- - - ">="
225
+ - - ">"
218
226
  - !ruby/object:Gem::Version
219
- version: '0'
227
+ version: 1.3.1
220
228
  requirements: []
221
229
  rubyforge_project:
222
- rubygems_version: 2.2.3
230
+ rubygems_version: 2.2.5
223
231
  signing_key:
224
232
  specification_version: 4
225
233
  summary: Yet Another OpenStack API Wrapper that rocks!!
@@ -227,6 +235,7 @@ test_files:
227
235
  - test/config.rb
228
236
  - test/yao/test_auth.rb
229
237
  - test/yao/test_client.rb
238
+ - test/yao/test_client_plugin.rb
230
239
  - test/yao/test_config.rb
231
240
  - test/yao/test_server_error.rb
232
241
  - test/yao/test_token.rb