tim 0.2.0 → 0.3.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.
- data/README.rdoc +29 -0
- data/lib/image_factory/image_factory.rb +2 -1
- data/lib/image_factory/oauth/active_resource_oauth_client.rb +52 -0
- data/lib/tim/version.rb +1 -1
- data/test/dummy/config/initializers/tim.rb +8 -0
- data/tim.gemspec +1 -0
- metadata +32 -21
- data/lib/tasks/cucumber.rake +0 -59
data/README.rdoc
CHANGED
@@ -1,5 +1,34 @@
|
|
1
1
|
= Tim
|
2
2
|
|
3
|
+
== Summary
|
4
|
+
|
5
|
+
Tim is a Rails Engine responsible for Cloud image management. It
|
6
|
+
allows clients to create, delete and upload images to a multitude of
|
7
|
+
Cloud providers. Tim builds on top of Imagefactory’s cloud
|
8
|
+
abstraction layer.
|
9
|
+
|
10
|
+
Adding the ability for clients to store meta-data (used for searching
|
11
|
+
and sorting) as well as versioning and support for access control.
|
12
|
+
Tim wraps all this up in a clean, simply RESTful API.
|
13
|
+
|
14
|
+
You can read the full presentation
|
15
|
+
here[http://www.aeolusproject.org/docs/presentations/2012-nov-conference/tim.odp].
|
16
|
+
|
17
|
+
== Configuration
|
18
|
+
|
19
|
+
=== Securing Image Factory requests
|
20
|
+
|
21
|
+
It is possible to secure Image Factory requests using 2 Legged OAuth. To use 2
|
22
|
+
Legged OAuth you must set the OAuth consumer key, consumer secret and url in the
|
23
|
+
Tim::ImageFactory::Base.config.
|
24
|
+
|
25
|
+
Example:
|
26
|
+
|
27
|
+
oauth_config = {:consumer_key => "mock-key",
|
28
|
+
:consumer_secret => "mock-secret",
|
29
|
+
:site => "http://localhost:8075/imagefactory/"}
|
30
|
+
Tim::ImageFactory::Base.config = oauth_config
|
31
|
+
|
3
32
|
== Running Tests
|
4
33
|
|
5
34
|
{<img src="https://secure.travis-ci.org/aeolus-incubator/tim.png"
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require "active_resource"
|
2
|
+
require File.join(File.dirname(__FILE__), 'oauth', 'active_resource_oauth_client')
|
2
3
|
require File.join(File.dirname(__FILE__), 'model', 'base')
|
3
4
|
require File.join(File.dirname(__FILE__), 'model', 'target_image')
|
4
|
-
require File.join(File.dirname(__FILE__), 'model', 'provider_image')
|
5
|
+
require File.join(File.dirname(__FILE__), 'model', 'provider_image')
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'oauth'
|
2
|
+
|
3
|
+
# Monkey-patch ActiveResource to allow us to merge our OAuth headers in.
|
4
|
+
# Portions of the below are taken from Active Resource which is MIT licensed;
|
5
|
+
# hence this whole file is being licensed under the MIT License to err on the side of safety.
|
6
|
+
module ActiveResourceOAuthClient
|
7
|
+
ActiveResource::Connection.class_eval do
|
8
|
+
def request_with_oauth(method, path, *arguments)
|
9
|
+
@oauth_config = Tim::ImageFactory::Base.config || {}
|
10
|
+
# Take care to fall back to the standard request method if we don't have full OAuth credentials
|
11
|
+
unless use_oauth_for_url?("#{site.scheme}://#{site.host}:#{site.port}#{path}")
|
12
|
+
return request_without_oauth(method, path, *arguments)
|
13
|
+
end
|
14
|
+
result = ActiveSupport::Notifications.instrument("request.active_resource") do |payload|
|
15
|
+
payload[:method] = method
|
16
|
+
payload[:request_uri] = "#{site.scheme}://#{site.host}:#{site.port}#{path}"
|
17
|
+
puts "#{payload[:method]} #{payload[:request_uri]}"
|
18
|
+
oauth_consumer = OAuth::Consumer.new(
|
19
|
+
@oauth_config[:consumer_key],
|
20
|
+
@oauth_config[:consumer_secret],
|
21
|
+
:site => @oauth_config[:site] )
|
22
|
+
puts @oauth_config[:consumer_key] + " " + @oauth_config[:consumer_secret]
|
23
|
+
token = OAuth::AccessToken.new(oauth_consumer)
|
24
|
+
base_request = oauth_consumer.create_signed_request(method, path, token, {}, *arguments)
|
25
|
+
payload[:result] = http.request(base_request)
|
26
|
+
end
|
27
|
+
# Error-handling code from OAuth
|
28
|
+
# http://wiki.oauth.net/w/page/12238543/ProblemReporting
|
29
|
+
auth_header = result.to_hash['www-authenticate']
|
30
|
+
problem_header = auth_header ? auth_header.select{|h| h =~ /^OAuth /}.select{|h| h =~ /oauth_problem/}.first : nil
|
31
|
+
if auth_header && problem_header
|
32
|
+
params = OAuth::Helper.parse_header(problem_header)
|
33
|
+
raise OAuth::Problem.new(params.delete("oauth_problem"), result, params)
|
34
|
+
end
|
35
|
+
# Error-handling code from ActiveResource
|
36
|
+
handle_response(result)
|
37
|
+
rescue Timeout::Error => e
|
38
|
+
raise TimeoutError.new(e.message)
|
39
|
+
rescue OpenSSL::SSL::SSLError => e
|
40
|
+
raise SSLError.new(e.message)
|
41
|
+
end
|
42
|
+
|
43
|
+
# Currently, only Factory calls should use OAuth -- extend as needed
|
44
|
+
def use_oauth_for_url?(url)
|
45
|
+
Tim::ImageFactory::Base.use_oauth? and
|
46
|
+
url.include?(Tim::ImageFactory::Base.config[:site])
|
47
|
+
end
|
48
|
+
|
49
|
+
alias_method_chain :request, :oauth
|
50
|
+
|
51
|
+
end
|
52
|
+
end
|
data/lib/tim/version.rb
CHANGED
@@ -1,8 +1,16 @@
|
|
1
1
|
Tim.user_class = "User"
|
2
2
|
Tim.provider_account_class = "ProviderAccount"
|
3
3
|
Tim.provider_type_class = "ProviderType"
|
4
|
+
|
4
5
|
# Image Factory URL
|
5
6
|
Tim::ImageFactory::Base.site = "http://localhost:8075/imagefactory"
|
7
|
+
|
8
|
+
# Example OAuth Configuration
|
9
|
+
#oauth_config = {:consumer_key => "mock-key",
|
10
|
+
# :consumer_secret => "mock-secret",
|
11
|
+
# :site => "http://localhost:8075/imagefactory/"}#
|
12
|
+
#Tim::ImageFactory::Base.config = oauth_config
|
13
|
+
|
6
14
|
# FIXME: We should be able to infer these from Routes
|
7
15
|
Tim::ImageFactory::TargetImage.callback_url = "http://localhost:3000/tim/target_images/"
|
8
16
|
Tim::ImageFactory::ProviderImage.callback_url = "http://localhost:3000/tim/provider_images/"
|
data/tim.gemspec
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tim
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -10,11 +10,11 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2013-
|
13
|
+
date: 2013-02-19 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rails
|
17
|
-
requirement: &
|
17
|
+
requirement: &12953140 !ruby/object:Gem::Requirement
|
18
18
|
none: false
|
19
19
|
requirements:
|
20
20
|
- - ~>
|
@@ -22,10 +22,10 @@ dependencies:
|
|
22
22
|
version: '3.2'
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
|
-
version_requirements: *
|
25
|
+
version_requirements: *12953140
|
26
26
|
- !ruby/object:Gem::Dependency
|
27
27
|
name: haml
|
28
|
-
requirement: &
|
28
|
+
requirement: &12950400 !ruby/object:Gem::Requirement
|
29
29
|
none: false
|
30
30
|
requirements:
|
31
31
|
- - ! '>='
|
@@ -33,10 +33,10 @@ dependencies:
|
|
33
33
|
version: '0'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
|
-
version_requirements: *
|
36
|
+
version_requirements: *12950400
|
37
37
|
- !ruby/object:Gem::Dependency
|
38
38
|
name: nokogiri
|
39
|
-
requirement: &
|
39
|
+
requirement: &12965480 !ruby/object:Gem::Requirement
|
40
40
|
none: false
|
41
41
|
requirements:
|
42
42
|
- - ! '>='
|
@@ -44,10 +44,21 @@ dependencies:
|
|
44
44
|
version: '0'
|
45
45
|
type: :runtime
|
46
46
|
prerelease: false
|
47
|
-
version_requirements: *
|
47
|
+
version_requirements: *12965480
|
48
|
+
- !ruby/object:Gem::Dependency
|
49
|
+
name: oauth
|
50
|
+
requirement: &12962440 !ruby/object:Gem::Requirement
|
51
|
+
none: false
|
52
|
+
requirements:
|
53
|
+
- - ! '>='
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: '0'
|
56
|
+
type: :runtime
|
57
|
+
prerelease: false
|
58
|
+
version_requirements: *12962440
|
48
59
|
- !ruby/object:Gem::Dependency
|
49
60
|
name: sqlite3
|
50
|
-
requirement: &
|
61
|
+
requirement: &12958660 !ruby/object:Gem::Requirement
|
51
62
|
none: false
|
52
63
|
requirements:
|
53
64
|
- - ! '>='
|
@@ -55,10 +66,10 @@ dependencies:
|
|
55
66
|
version: '0'
|
56
67
|
type: :development
|
57
68
|
prerelease: false
|
58
|
-
version_requirements: *
|
69
|
+
version_requirements: *12958660
|
59
70
|
- !ruby/object:Gem::Dependency
|
60
71
|
name: rspec-rails
|
61
|
-
requirement: &
|
72
|
+
requirement: &12973520 !ruby/object:Gem::Requirement
|
62
73
|
none: false
|
63
74
|
requirements:
|
64
75
|
- - ! '>='
|
@@ -66,10 +77,10 @@ dependencies:
|
|
66
77
|
version: '0'
|
67
78
|
type: :development
|
68
79
|
prerelease: false
|
69
|
-
version_requirements: *
|
80
|
+
version_requirements: *12973520
|
70
81
|
- !ruby/object:Gem::Dependency
|
71
82
|
name: database_cleaner
|
72
|
-
requirement: &
|
83
|
+
requirement: &12971700 !ruby/object:Gem::Requirement
|
73
84
|
none: false
|
74
85
|
requirements:
|
75
86
|
- - ! '>='
|
@@ -77,10 +88,10 @@ dependencies:
|
|
77
88
|
version: '0'
|
78
89
|
type: :development
|
79
90
|
prerelease: false
|
80
|
-
version_requirements: *
|
91
|
+
version_requirements: *12971700
|
81
92
|
- !ruby/object:Gem::Dependency
|
82
93
|
name: factory_girl_rails
|
83
|
-
requirement: &
|
94
|
+
requirement: &12970380 !ruby/object:Gem::Requirement
|
84
95
|
none: false
|
85
96
|
requirements:
|
86
97
|
- - ~>
|
@@ -88,10 +99,10 @@ dependencies:
|
|
88
99
|
version: 4.1.0
|
89
100
|
type: :development
|
90
101
|
prerelease: false
|
91
|
-
version_requirements: *
|
102
|
+
version_requirements: *12970380
|
92
103
|
- !ruby/object:Gem::Dependency
|
93
104
|
name: minitest
|
94
|
-
requirement: &
|
105
|
+
requirement: &12969260 !ruby/object:Gem::Requirement
|
95
106
|
none: false
|
96
107
|
requirements:
|
97
108
|
- - ! '>='
|
@@ -99,7 +110,7 @@ dependencies:
|
|
99
110
|
version: '0'
|
100
111
|
type: :development
|
101
112
|
prerelease: false
|
102
|
-
version_requirements: *
|
113
|
+
version_requirements: *12969260
|
103
114
|
description: Rails engine client for the Aeolus Image Factory cross-cloud virtual
|
104
115
|
machine image builder.
|
105
116
|
email:
|
@@ -198,7 +209,6 @@ files:
|
|
198
209
|
- db/migrate/20121210131423_add_build_method_to_target_image.rb
|
199
210
|
- db/migrate/20120910175233_create_tim_templates.rb
|
200
211
|
- lib/tasks/tim_tasks.rake
|
201
|
-
- lib/tasks/cucumber.rake
|
202
212
|
- lib/tim/engine.rb
|
203
213
|
- lib/tim/version.rb
|
204
214
|
- lib/generators/tim/templates/README
|
@@ -210,6 +220,7 @@ files:
|
|
210
220
|
- lib/image_factory/model/base.rb
|
211
221
|
- lib/image_factory/model/target_image.rb
|
212
222
|
- lib/image_factory/image_factory.rb
|
223
|
+
- lib/image_factory/oauth/active_resource_oauth_client.rb
|
213
224
|
- MIT-LICENSE
|
214
225
|
- Rakefile
|
215
226
|
- README.rdoc
|
@@ -315,7 +326,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
315
326
|
version: '0'
|
316
327
|
segments:
|
317
328
|
- 0
|
318
|
-
hash:
|
329
|
+
hash: -2467413164711160043
|
319
330
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
320
331
|
none: false
|
321
332
|
requirements:
|
@@ -324,7 +335,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
324
335
|
version: '0'
|
325
336
|
segments:
|
326
337
|
- 0
|
327
|
-
hash:
|
338
|
+
hash: -2467413164711160043
|
328
339
|
requirements: []
|
329
340
|
rubyforge_project:
|
330
341
|
rubygems_version: 1.8.15
|
data/lib/tasks/cucumber.rake
DELETED
@@ -1,59 +0,0 @@
|
|
1
|
-
# IMPORTANT: This file is generated by cucumber-rails - edit at your own peril.
|
2
|
-
# It is recommended to regenerate this file in the future when you upgrade to a
|
3
|
-
# newer version of cucumber-rails. Consider adding your own code to a new file
|
4
|
-
# instead of editing this one. Cucumber will automatically load all features/**/*.rb
|
5
|
-
# files.
|
6
|
-
|
7
|
-
|
8
|
-
unless ARGV.any? {|a| a =~ /^gems/} # Don't load anything when running the gems:* tasks
|
9
|
-
|
10
|
-
begin
|
11
|
-
require 'cucumber/rake/task'
|
12
|
-
|
13
|
-
namespace :cucumber do
|
14
|
-
Cucumber::Rake::Task.new({:ok => 'db:test:prepare'}, 'Run features that should pass') do |t|
|
15
|
-
t.fork = true # You may get faster startup if you set this to false
|
16
|
-
t.profile = 'default'
|
17
|
-
end
|
18
|
-
|
19
|
-
Cucumber::Rake::Task.new({:wip => 'db:test:prepare'}, 'Run features that are being worked on') do |t|
|
20
|
-
t.fork = true # You may get faster startup if you set this to false
|
21
|
-
t.profile = 'wip'
|
22
|
-
end
|
23
|
-
|
24
|
-
Cucumber::Rake::Task.new({:rerun => 'db:test:prepare'}, 'Record failing features and run only them if any exist') do |t|
|
25
|
-
t.fork = true # You may get faster startup if you set this to false
|
26
|
-
t.profile = 'rerun'
|
27
|
-
end
|
28
|
-
|
29
|
-
desc 'Run all features'
|
30
|
-
task :all => [:ok, :wip]
|
31
|
-
|
32
|
-
task :statsetup do
|
33
|
-
require 'rails/code_statistics'
|
34
|
-
::STATS_DIRECTORIES << %w(Cucumber\ features features) if File.exist?('features')
|
35
|
-
::CodeStatistics::TEST_TYPES << "Cucumber features" if File.exist?('features')
|
36
|
-
end
|
37
|
-
end
|
38
|
-
desc 'Alias for cucumber:ok'
|
39
|
-
task :cucumber => 'cucumber:ok'
|
40
|
-
|
41
|
-
task :default => :cucumber
|
42
|
-
|
43
|
-
task :features => :cucumber do
|
44
|
-
STDERR.puts "*** The 'features' task is deprecated. See rake -T cucumber ***"
|
45
|
-
end
|
46
|
-
|
47
|
-
# In case we don't have ActiveRecord, append a no-op task that we can depend upon.
|
48
|
-
task 'db:test:prepare' do
|
49
|
-
end
|
50
|
-
|
51
|
-
task :stats => 'cucumber:statsetup'
|
52
|
-
rescue LoadError
|
53
|
-
desc 'cucumber rake task not available (cucumber not installed)'
|
54
|
-
task :cucumber do
|
55
|
-
abort 'Cucumber rake task is not available. Be sure to install cucumber as a gem or plugin'
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
end
|