yao 0.1.1 → 0.2.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
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