tim 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/MIT-LICENSE +20 -0
- data/README.rdoc +392 -0
- data/Rakefile +33 -0
- data/app/assets/javascripts/tim/application.js +15 -0
- data/app/assets/stylesheets/tim/application.css +13 -0
- data/app/controllers/tim/application_controller.rb +19 -0
- data/app/controllers/tim/base_images_controller.rb +59 -0
- data/app/controllers/tim/entrypoint_controller.rb +8 -0
- data/app/controllers/tim/image_versions_controller.rb +48 -0
- data/app/controllers/tim/provider_images_controller.rb +59 -0
- data/app/controllers/tim/target_images_controller.rb +61 -0
- data/app/controllers/tim/templates_controller.rb +47 -0
- data/app/filters/tim/user_keys_filter.rb +59 -0
- data/app/helpers/tim/application_helper.rb +4 -0
- data/app/models/tim/base.rb +6 -0
- data/app/models/tim/base_image.rb +15 -0
- data/app/models/tim/image_version.rb +13 -0
- data/app/models/tim/provider_image.rb +51 -0
- data/app/models/tim/target_image.rb +50 -0
- data/app/models/tim/template.rb +19 -0
- data/app/responders/tim/custom_responder.rb +24 -0
- data/app/validators/template_validator.rb +15 -0
- data/app/views/layouts/tim/application.html.erb +14 -0
- data/app/views/tim/base_images/_base_image.xml.haml +11 -0
- data/app/views/tim/base_images/_base_image_minimal.xml.haml +2 -0
- data/app/views/tim/base_images/_form.html.erb +17 -0
- data/app/views/tim/base_images/edit.html.erb +6 -0
- data/app/views/tim/base_images/index.html.erb +17 -0
- data/app/views/tim/base_images/index.xml.haml +4 -0
- data/app/views/tim/base_images/new.html.erb +5 -0
- data/app/views/tim/base_images/show.html.erb +5 -0
- data/app/views/tim/base_images/show.xml.haml +2 -0
- data/app/views/tim/entrypoint/index.xml.haml +7 -0
- data/app/views/tim/image_versions/_form.html.erb +17 -0
- data/app/views/tim/image_versions/_image_version.xml.haml +9 -0
- data/app/views/tim/image_versions/_image_version_minimal.xml.haml +2 -0
- data/app/views/tim/image_versions/edit.html.erb +6 -0
- data/app/views/tim/image_versions/index.html.erb +17 -0
- data/app/views/tim/image_versions/index.xml.haml +4 -0
- data/app/views/tim/image_versions/new.html.erb +5 -0
- data/app/views/tim/image_versions/show.html.erb +5 -0
- data/app/views/tim/image_versions/show.xml.haml +2 -0
- data/app/views/tim/images/_form.html.erb +17 -0
- data/app/views/tim/images/edit.html.erb +6 -0
- data/app/views/tim/images/index.html.erb +21 -0
- data/app/views/tim/images/new.html.erb +5 -0
- data/app/views/tim/images/show.html.erb +5 -0
- data/app/views/tim/layouts/application.html.erb +14 -0
- data/app/views/tim/provider_images/_form.html.erb +17 -0
- data/app/views/tim/provider_images/_provider_image.xml.haml +12 -0
- data/app/views/tim/provider_images/_provider_image_minimal.xml.haml +2 -0
- data/app/views/tim/provider_images/edit.html.erb +6 -0
- data/app/views/tim/provider_images/index.html.erb +17 -0
- data/app/views/tim/provider_images/index.xml.haml +4 -0
- data/app/views/tim/provider_images/new.html.erb +5 -0
- data/app/views/tim/provider_images/show.html.erb +5 -0
- data/app/views/tim/provider_images/show.xml.haml +2 -0
- data/app/views/tim/target_images/_form.html.erb +17 -0
- data/app/views/tim/target_images/_target_image.xml.haml +13 -0
- data/app/views/tim/target_images/_target_image_minimal.xml.haml +2 -0
- data/app/views/tim/target_images/edit.html.erb +6 -0
- data/app/views/tim/target_images/index.html.erb +21 -0
- data/app/views/tim/target_images/index.xml.haml +4 -0
- data/app/views/tim/target_images/new.html.erb +5 -0
- data/app/views/tim/target_images/show.html.erb +5 -0
- data/app/views/tim/target_images/show.xml.haml +2 -0
- data/app/views/tim/templates/_form.html.erb +17 -0
- data/app/views/tim/templates/_template.xml.haml +8 -0
- data/app/views/tim/templates/_template_minimal.xml.haml +2 -0
- data/app/views/tim/templates/edit.html.erb +6 -0
- data/app/views/tim/templates/index.html.erb +17 -0
- data/app/views/tim/templates/index.xml.haml +4 -0
- data/app/views/tim/templates/new.html.erb +5 -0
- data/app/views/tim/templates/show.html.erb +5 -0
- data/app/views/tim/templates/show.xml.haml +2 -0
- data/config/cucumber.yml +8 -0
- data/config/initializers/haml.rb +1 -0
- data/config/routes.rb +9 -0
- data/config/schemas/tdl.rng +282 -0
- data/config/user_keys.yml +26 -0
- data/db/migrate/20120906180351_create_tim_base_images.rb +12 -0
- data/db/migrate/20120906210106_create_tim_image_versions.rb +10 -0
- data/db/migrate/20120910175233_create_tim_templates.rb +9 -0
- data/db/migrate/20120911202321_create_tim_target_images.rb +14 -0
- data/db/migrate/20120911204329_create_tim_provider_images.rb +19 -0
- data/lib/generators/tim/install_generator.rb +15 -0
- data/lib/generators/tim/templates/README +6 -0
- data/lib/generators/tim/templates/tim.rb +8 -0
- data/lib/image_factory/image_factory.rb +4 -0
- data/lib/image_factory/model/base.rb +88 -0
- data/lib/image_factory/model/provider_image.rb +6 -0
- data/lib/image_factory/model/target_image.rb +6 -0
- data/lib/tasks/cucumber.rake +59 -0
- data/lib/tasks/tim_tasks.rake +4 -0
- data/lib/tim.rb +8 -0
- data/lib/tim/engine.rb +9 -0
- data/lib/tim/version.rb +3 -0
- data/spec/controllers/base_images_controller_spec.rb +131 -0
- data/spec/controllers/entrypoint_controller_spec.rb +32 -0
- data/spec/controllers/image_versions_controller_spec.rb +146 -0
- data/spec/controllers/provider_images_controller_spec.rb +156 -0
- data/spec/controllers/target_images_controller_spec.rb +153 -0
- data/spec/controllers/templates_controller_spec.rb +41 -0
- data/spec/decorators/controllers/templates_controller_decorator_spec.rb +13 -0
- data/spec/factories/tim/base_image.rb +10 -0
- data/spec/factories/tim/image_factory/provider_image.rb +10 -0
- data/spec/factories/tim/image_factory/status_detail.rb +0 -0
- data/spec/factories/tim/image_factory/target_image.rb +7 -0
- data/spec/factories/tim/image_version.rb +20 -0
- data/spec/factories/tim/provider_image.rb +9 -0
- data/spec/factories/tim/target_image.rb +10 -0
- data/spec/factories/tim/template.rb +23 -0
- data/spec/filters/user_keys_filter_spec.rb +41 -0
- data/spec/fixtures/template.xml +13 -0
- data/spec/models/base_image_spec.rb +39 -0
- data/spec/models/dummy/pool_family_spec.rb +14 -0
- data/spec/models/dummy/provider_account_spec.rb +18 -0
- data/spec/models/dummy/provider_type_spec.rb +18 -0
- data/spec/models/dummy/user_spec.rb +14 -0
- data/spec/models/image_version_spec.rb +27 -0
- data/spec/models/provider_image_spec.rb +69 -0
- data/spec/models/target_image_spec.rb +75 -0
- data/spec/models/template_spec.rb +16 -0
- data/spec/spec_helper.rb +56 -0
- data/spec/support/routes.rb +41 -0
- data/spec/validators/template_validator_spec.rb +19 -0
- data/spec/views/base_images_spec.rb +23 -0
- data/spec/views/image_versions_spec.rb +25 -0
- data/spec/views/provider_images_spec.rb +30 -0
- data/spec/views/target_images_spec.rb +25 -0
- data/spec/views/templates_spec.rb +24 -0
- data/test/dummy/Rakefile +7 -0
- data/test/dummy/app/assets/javascripts/application.js +15 -0
- data/test/dummy/app/assets/stylesheets/application.css +13 -0
- data/test/dummy/app/controllers/application_controller.rb +3 -0
- data/test/dummy/app/decorators/tim/controllers/templates_controller_decorator.rb +8 -0
- data/test/dummy/app/helpers/application_helper.rb +2 -0
- data/test/dummy/app/models/pool_family.rb +3 -0
- data/test/dummy/app/models/provider_account.rb +3 -0
- data/test/dummy/app/models/provider_type.rb +3 -0
- data/test/dummy/app/models/tim/base_image.rb +6 -0
- data/test/dummy/app/models/user.rb +3 -0
- data/test/dummy/app/views/layouts/application.html.erb +14 -0
- data/test/dummy/app/views/tim/base_images/_custom.xml.haml +1 -0
- data/test/dummy/app/views/tim/image_versions/_custom.xml.haml +1 -0
- data/test/dummy/app/views/tim/layouts/application.html.erb +14 -0
- data/test/dummy/app/views/tim/provider_images/_custom.xml.haml +1 -0
- data/test/dummy/app/views/tim/target_images/_custom.xml.haml +1 -0
- data/test/dummy/app/views/tim/templates/_custom.xml.haml +1 -0
- data/test/dummy/config.ru +4 -0
- data/test/dummy/config/application.rb +58 -0
- data/test/dummy/config/boot.rb +10 -0
- data/test/dummy/config/database.yml +28 -0
- data/test/dummy/config/environment.rb +5 -0
- data/test/dummy/config/environments/development.rb +37 -0
- data/test/dummy/config/environments/production.rb +67 -0
- data/test/dummy/config/environments/test.rb +37 -0
- data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/test/dummy/config/initializers/inflections.rb +15 -0
- data/test/dummy/config/initializers/mime_types.rb +5 -0
- data/test/dummy/config/initializers/secret_token.rb +7 -0
- data/test/dummy/config/initializers/session_store.rb +8 -0
- data/test/dummy/config/initializers/tim.rb +8 -0
- data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/test/dummy/config/locales/en.yml +5 -0
- data/test/dummy/config/routes.rb +4 -0
- data/test/dummy/db/development.sqlite3 +0 -0
- data/test/dummy/db/migrate/20120326103723532622_create_users.rb +9 -0
- data/test/dummy/db/migrate/20120423123114264114_create_pool_families.rb +7 -0
- data/test/dummy/db/migrate/20120911182850_add_pool_family_id_to_tim_base_image.rb +5 -0
- data/test/dummy/db/migrate/20120911202845_add_provider_type_id_to_tim_target_image.rb +5 -0
- data/test/dummy/db/migrate/20120911203222_create_provider_types.rb +7 -0
- data/test/dummy/db/migrate/20120911205431_create_provider_accounts.rb +7 -0
- data/test/dummy/db/schema.rb +86 -0
- data/test/dummy/db/test.sqlite3 +0 -0
- data/test/dummy/log/development.log +982 -0
- data/test/dummy/log/test.log +8629 -0
- data/test/dummy/public/404.html +26 -0
- data/test/dummy/public/422.html +26 -0
- data/test/dummy/public/500.html +26 -0
- data/test/dummy/public/favicon.ico +0 -0
- data/test/dummy/script/rails +6 -0
- data/test/dummy/test.rb +0 -0
- data/test/dummy/tmp/cache/assets/C7A/BB0/sprockets%2F13445f7a19078dd2df39517062aa6711 +0 -0
- data/test/dummy/tmp/cache/assets/C8C/CC0/sprockets%2F95d79f3b3096348427f3e4e38b5202e3 +0 -0
- data/test/dummy/tmp/cache/assets/CB0/2B0/sprockets%2F79106b90879c02a115d7f6f1c8390ac4 +0 -0
- data/test/dummy/tmp/cache/assets/CE0/690/sprockets%2F04c628c2a636286bfa92a4966b82b92a +0 -0
- data/test/dummy/tmp/cache/assets/D03/040/sprockets%2Fd9e94204d4b307145f12efc109b16c1f +0 -0
- data/test/dummy/tmp/cache/assets/D06/DC0/sprockets%2Fcd282851b6e4c463409ba3ece67e0510 +0 -0
- data/test/dummy/tmp/cache/assets/D23/5F0/sprockets%2F2a521f3183c6bbcd71bd26a5490b201e +0 -0
- data/test/dummy/tmp/cache/assets/D64/3A0/sprockets%2F56ac1aed10c39b12a88cb1b30f668f58 +0 -0
- data/test/dummy/tmp/cache/assets/D69/BD0/sprockets%2F0aaf75cf34556b33a9fec534fe4d0415 +0 -0
- data/test/dummy/tmp/cache/assets/D87/D80/sprockets%2Fefa3c8b210e87358c7add88cd6f49597 +0 -0
- data/test/dummy/tmp/cache/assets/D89/200/sprockets%2Ff9b4e953c874ed6a87de6490d055d9db +0 -0
- data/test/dummy/tmp/cache/assets/DF4/430/sprockets%2F403bb1de60cae4325cebd7e6c389b8ad +0 -0
- data/test/dummy/tmp/cache/assets/E00/500/sprockets%2Faaddc5b6f2cb6b98930cc54cf4c64a95 +0 -0
- data/test/dummy/tmp/cache/assets/EB3/CE0/sprockets%2Fd75a89c9fffacd99bce7eed96844eafc +0 -0
- metadata +432 -0
@@ -0,0 +1,26 @@
|
|
1
|
+
:template:
|
2
|
+
base_image: base_image_attributes
|
3
|
+
|
4
|
+
:base_image:
|
5
|
+
template: template_attributes
|
6
|
+
image_versions: image_versions_attributes
|
7
|
+
target_images: target_images_attributes
|
8
|
+
provider_images: provider_images_attributes
|
9
|
+
|
10
|
+
:image_version:
|
11
|
+
template: template_attributes
|
12
|
+
base_image: base_image_attributes
|
13
|
+
target_images: target_images_attributes
|
14
|
+
provider_images: provider_images_attributes
|
15
|
+
|
16
|
+
:target_image:
|
17
|
+
template: template_attributes
|
18
|
+
base_image: base_image_attributes
|
19
|
+
image_version: image_version_attributes
|
20
|
+
provider_images: provider_images_attributes
|
21
|
+
|
22
|
+
:provider_image:
|
23
|
+
template: template_attributes
|
24
|
+
base_image: base_image_attributes
|
25
|
+
image_version: image_version_attributes
|
26
|
+
target_image: target_image_attributes
|
@@ -0,0 +1,14 @@
|
|
1
|
+
class CreateTimTargetImages < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
create_table :tim_target_images do |t|
|
4
|
+
t.string :factory_id
|
5
|
+
t.integer :image_version_id
|
6
|
+
t.string :target
|
7
|
+
t.string :status
|
8
|
+
t.string :status_detail
|
9
|
+
t.string :progress # Factory Target Image percent_complete
|
10
|
+
|
11
|
+
t.timestamps
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
class CreateTimProviderImages < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
create_table :tim_provider_images do |t|
|
4
|
+
t.integer :id
|
5
|
+
t.string :factory_id
|
6
|
+
t.integer :target_image_id
|
7
|
+
t.string :provider
|
8
|
+
# The Cloud Specific ID. i.e. ami-12345678
|
9
|
+
t.string :external_image_id
|
10
|
+
t.string :provider_account_id
|
11
|
+
t.boolean :snapshot
|
12
|
+
|
13
|
+
t.string :status
|
14
|
+
t.string :status_detail
|
15
|
+
t.string :progress # Factory Target Image percent_complete
|
16
|
+
t.timestamps
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'rails/generators'
|
2
|
+
|
3
|
+
module Tim
|
4
|
+
class InstallGenerator < Rails::Generators::Base
|
5
|
+
desc "Copy Tim default files"
|
6
|
+
source_root File.expand_path('../templates', __FILE__)
|
7
|
+
|
8
|
+
def copy_config
|
9
|
+
copy_file "tim.rb", "config/initializers/tim.rb"
|
10
|
+
end
|
11
|
+
def show_readme
|
12
|
+
readme 'README' if behavior == :invoke
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,8 @@
|
|
1
|
+
Tim.user_class = "User"
|
2
|
+
Tim.provider_account_class = "ProviderAccount"
|
3
|
+
Tim.provider_type_class = "ProviderType"
|
4
|
+
# Image Factory URL
|
5
|
+
Tim::ImageFactory::Base.site = "http://localhost:8075/imagefactory"
|
6
|
+
# FIXME: We should be able to infer these from Routes
|
7
|
+
Tim::ImageFactory::TargetImage.callback_url = "http://localhost:3000/tim/target_images/"
|
8
|
+
Tim::ImageFactory::ProviderImage.callback_url = "http://localhost:3000/tim/provider_images/"
|
@@ -0,0 +1,88 @@
|
|
1
|
+
require "uri"
|
2
|
+
|
3
|
+
module Tim
|
4
|
+
module ImageFactory
|
5
|
+
class Base < ActiveResource::Base
|
6
|
+
self.format = :json
|
7
|
+
# TODO Verify Image Factory Certification Concerns that warrent removing SSL Verfication
|
8
|
+
self.ssl_options = {:verify_mode => OpenSSL::SSL::VERIFY_NONE}
|
9
|
+
|
10
|
+
class << self
|
11
|
+
# Add Callback URL for listening to callback requests
|
12
|
+
def callback_url=(url)
|
13
|
+
@callback_url = URI.parse(url)
|
14
|
+
end
|
15
|
+
|
16
|
+
def callback_url
|
17
|
+
@callback_url
|
18
|
+
end
|
19
|
+
|
20
|
+
## Remove format from the url for resources
|
21
|
+
def element_path(id, prefix_options = {}, query_options = nil)
|
22
|
+
prefix_options, query_options = split_options(prefix_options) if query_options.nil?
|
23
|
+
"#{prefix(prefix_options)}#{collection_name}/#{id}#{query_string(query_options)}"
|
24
|
+
end
|
25
|
+
|
26
|
+
## Remove format from the url for collections
|
27
|
+
def collection_path(prefix_options = {}, query_options = nil)
|
28
|
+
prefix_options, query_options = split_options(prefix_options) if query_options.nil?
|
29
|
+
"#{prefix(prefix_options)}#{collection_name}#{query_string(query_options)}"
|
30
|
+
end
|
31
|
+
|
32
|
+
## For a collection call, ActiveResource formatting is not
|
33
|
+
## compliant with Factory's output.
|
34
|
+
def instantiate_collection(collection, prefix_options = {})
|
35
|
+
unless collection.kind_of? Array
|
36
|
+
[instantiate_record(collection, prefix_options)]
|
37
|
+
else
|
38
|
+
collection.collect! { |record| instantiate_record(record, prefix_options) }
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
## The objects returned from this method are not automatically converted into ActiveResource instances - they are ordinary Hashes.
|
43
|
+
## Modifications below ensures that you get ActiveResource instances.
|
44
|
+
def get(method_name, options = {})
|
45
|
+
object_array = connection.get(custom_method_collection_url(method_name, options), headers)
|
46
|
+
if object_array.class.to_s=="Array"
|
47
|
+
object_array.collect! {|record| self.class.new.load(record)}
|
48
|
+
else
|
49
|
+
self.class.new.load(object_array)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
# This approach does mean you're limited to one server at a time
|
54
|
+
def config
|
55
|
+
defined?(@@config) ? @@config : {}
|
56
|
+
end
|
57
|
+
def config=(conf={})
|
58
|
+
@@config = conf
|
59
|
+
self.site = @@config[:site]
|
60
|
+
end
|
61
|
+
|
62
|
+
# Should we use OAuth?
|
63
|
+
def use_oauth?
|
64
|
+
config[:consumer_key] && config[:consumer_secret] && config[:site]
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
## Instance Methods: (modifying the ActiveRecord::CustomMethods).
|
69
|
+
## This modification is same as defined in above method
|
70
|
+
def get(method_name, options = {})
|
71
|
+
self.class.new.load(connection.get(custom_method_element_url(method_name, options), self.class.headers))
|
72
|
+
end
|
73
|
+
|
74
|
+
# Modifying the url formations to make them Factory compliant
|
75
|
+
def custom_method_element_url(method_name, options = {})
|
76
|
+
"#{self.class.prefix(prefix_options)}#{self.class.collection_name}/#{id}/" +
|
77
|
+
"#{method_name}#{self.class.send!(:query_string, options)}"
|
78
|
+
end
|
79
|
+
|
80
|
+
# Modifying the url formations to make them Factory compliant
|
81
|
+
def self.custom_method_collection_url(method_name, options = {})
|
82
|
+
prefix_options, query_options = split_options(options)
|
83
|
+
url = "#{prefix(prefix_options)}#{collection_name}/#{method_name}#{query_string(query_options)}"
|
84
|
+
url
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
@@ -0,0 +1,59 @@
|
|
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
|
data/lib/tim.rb
ADDED
data/lib/tim/engine.rb
ADDED
data/lib/tim/version.rb
ADDED
@@ -0,0 +1,131 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
module Tim
|
4
|
+
describe BaseImagesController do
|
5
|
+
render_views
|
6
|
+
|
7
|
+
describe "Base Images API" do
|
8
|
+
before(:each) do
|
9
|
+
send_and_accept_xml
|
10
|
+
BaseImagesController.any_instance.stub(:template_exists?).and_return false
|
11
|
+
end
|
12
|
+
|
13
|
+
describe "Create Base Image" do
|
14
|
+
|
15
|
+
context "Success" do
|
16
|
+
it "should return a new base image as xml" do
|
17
|
+
post :create, { :base_image => { :name => "Name", :description => "Description"}}
|
18
|
+
response.code.should == "201"
|
19
|
+
|
20
|
+
body = Hash.from_xml(response.body)
|
21
|
+
body.keys.should == ["base_image"]
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should return a new base image with template as xml" do
|
25
|
+
Template.any_instance.stub(:valid?).and_return true
|
26
|
+
post :create, { :base_image => { :name => "Name",
|
27
|
+
:description => "Description",
|
28
|
+
:template => {:xml => "<template></template>" }}}
|
29
|
+
response.code.should == "201"
|
30
|
+
|
31
|
+
body = Hash.from_xml(response.body)
|
32
|
+
body.keys.should == ["base_image"]
|
33
|
+
body["base_image"].keys.should =~ ["template", "id", "href", "name", "description", "image_versions"]
|
34
|
+
body["base_image"]["template"].keys.should =~ ["id", "href"]
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
context "failure" do
|
39
|
+
it "should return a unprocessable entity error when the client sends invalid content" do
|
40
|
+
post :create, { :invalid_image => FactoryGirl.build(:base_image).attributes }
|
41
|
+
response.code.should == "422"
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
describe "Show Base Image" do
|
47
|
+
context "Success" do
|
48
|
+
it "should return an existing base image as XML" do
|
49
|
+
base_image = FactoryGirl.create(:base_image)
|
50
|
+
get :show, :id => base_image.id
|
51
|
+
|
52
|
+
response.code.should == "200"
|
53
|
+
|
54
|
+
body = Hash.from_xml(response.body)
|
55
|
+
body.keys.should == ["base_image"]
|
56
|
+
body["base_image"].keys.should =~ ["id", "href", "name", "description", "image_versions"]
|
57
|
+
end
|
58
|
+
|
59
|
+
it "should return an existing base image as XML with template" do
|
60
|
+
base_image = FactoryGirl.create(:base_image_with_template)
|
61
|
+
get :show, :id => base_image.id
|
62
|
+
|
63
|
+
response.code.should == "200"
|
64
|
+
|
65
|
+
body = Hash.from_xml(response.body)
|
66
|
+
body.keys.should == ["base_image"]
|
67
|
+
body["base_image"].keys.should =~ ["template", "id", "href", "name", "description", "image_versions"]
|
68
|
+
body["base_image"]["template"].keys.should =~ ["id", "href"]
|
69
|
+
end
|
70
|
+
|
71
|
+
it "should return an existing base image as XML with image versions" do
|
72
|
+
base_image = FactoryGirl.create(:base_image_with_template)
|
73
|
+
2.times do
|
74
|
+
FactoryGirl.create(:image_version, :base_image => base_image)
|
75
|
+
end
|
76
|
+
|
77
|
+
get :show, :id => base_image.id
|
78
|
+
|
79
|
+
response.code.should == "200"
|
80
|
+
|
81
|
+
body = Hash.from_xml(response.body)
|
82
|
+
body.keys.should == ["base_image"]
|
83
|
+
body["base_image"].keys.should =~ ["image_versions", "template", "id", "href", "name", "description"]
|
84
|
+
body["base_image"]["image_versions"]["image_version"].size.should == 2
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
context "failure" do
|
89
|
+
it "should return a not found response when an base image does not exist" do
|
90
|
+
get :show, :id => -1
|
91
|
+
response.code.should == "404"
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
describe "List Base Images" do
|
97
|
+
context "Success" do
|
98
|
+
it "should return a list of existing base images as XML" do
|
99
|
+
3.times do
|
100
|
+
FactoryGirl.create(:base_image)
|
101
|
+
end
|
102
|
+
|
103
|
+
get :index
|
104
|
+
|
105
|
+
body = Hash.from_xml(response.body)
|
106
|
+
body.keys.should == ["base_images"]
|
107
|
+
body["base_images"]["base_image"].first.keys.should =~ ["id", "href"]
|
108
|
+
response.code.should == "200"
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
describe "List Delete Image" do
|
114
|
+
context "Success" do
|
115
|
+
it "should return a no content code when deleting an image" do
|
116
|
+
base_image = FactoryGirl.create(:base_image)
|
117
|
+
delete :destroy, :id => base_image.id
|
118
|
+
response.code.should == "204"
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
context "Failure" do
|
123
|
+
it "should return a not found code when deleting an image that does not exist" do
|
124
|
+
delete :destroy, :id => -1
|
125
|
+
response.code.should == "404"
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|