Patchset implements new model for Provider Types, does all refactoring according Provider Type model and fixes tests after refactoring.
From: Jozef Zigmund jzigmund@redhat.com
It will create new table in DB and fill in it with predefined provider's types. Also it changes provider_type column for providers table, and transform it to provider_type_id.The same in images table, but name of id is target_id. --- src/app/models/image.rb | 43 +++++++++---------- src/app/models/provider.rb | 35 +++++----------- src/app/models/provider_account.rb | 4 +- src/app/models/provider_account_observer.rb | 2 +- src/app/models/provider_type.rb | 25 +++++++++++ .../20110217110836_create_provider_types.rb | 16 +++++++ ...10217133104_add_provider_type_id_to_provider.rb | 43 ++++++++++++++++++++ ...0110223132404_add_target_id_column_to_images.rb | 28 +++++++++++++ src/db/seeds.rb | 10 +++++ src/test/fixtures/images.yml | 22 +++++----- 10 files changed, 167 insertions(+), 61 deletions(-) create mode 100644 src/app/models/provider_type.rb create mode 100644 src/db/migrate/20110217110836_create_provider_types.rb create mode 100644 src/db/migrate/20110217133104_add_provider_type_id_to_provider.rb create mode 100644 src/db/migrate/20110223132404_add_target_id_column_to_images.rb
diff --git a/src/app/models/image.rb b/src/app/models/image.rb index 7d71089..cfa15e4 100644 --- a/src/app/models/image.rb +++ b/src/app/models/image.rb @@ -1,18 +1,18 @@ # == Schema Information -# Schema version: 20110207110131 +# Schema version: 20110223132404 # # Table name: images # -# id :integer not null, primary key -# uuid :string(255) -# name :string(255) not null -# build_id :string(255) -# uri :string(255) -# status :string(255) -# template_id :integer -# created_at :datetime -# updated_at :datetime -# target :integer +# id :integer not null, primary key +# uuid :string(255) +# name :string(255) not null +# build_id :string(255) +# uri :string(255) +# status :string(255) +# template_id :integer +# created_at :datetime +# updated_at :datetime +# provider_type_id :integer default(100), not null #
# @@ -49,12 +49,13 @@ class Image < ActiveRecord::Base belongs_to :template, :counter_cache => true has_many :provider_images, :dependent => :destroy has_many :providers, :through => :provider_images + belongs_to :provider_type
validates_presence_of :name validates_length_of :name, :maximum => 1024 validates_presence_of :status - validates_presence_of :target validates_presence_of :template_id + validates_presence_of :provider_type_id
SEARCHABLE_COLUMNS = %w(name)
@@ -68,10 +69,6 @@ class Image < ActiveRecord::Base ACTIVE_STATES = [ STATE_QUEUED, STATE_CREATED, STATE_BUILDING ] INACTIVE_STATES = [STATE_COMPLETE, STATE_FAILED, STATE_CANCELED]
- def self.available_targets - Provider::PROVIDER_BUILD_TARGETS - end - def generate_uuid self.uuid ||= "image-#{self.template_id}-#{Time.now.to_f.to_s}" end @@ -79,19 +76,19 @@ class Image < ActiveRecord::Base def self.build(template, target) # FIXME: This will need to be enhanced to handle multiple # providers of same type, only one is supported right now - if Image.find_by_template_id_and_target(template.id, target) - raise ImageExistsError, "An attempted build of this template for the target '#{target}' already exists" + if Image.find_by_template_id_and_provider_type_id(template.id, target.id) + raise ImageExistsError, "An attempted build of this template for the target '#{target.name}' already exists" end
- unless provider = Provider.find_by_target_with_account(target) - raise "There is no provider for '#{target}' type with valid account." + unless provider = Provider.find_by_target_with_account(target.id) + raise "There is no provider for '#{target.name}' type with valid account." end
img = nil Image.transaction do img = Image.create!( - :name => "#{template.name}/#{target}", - :target => target, + :name => "#{template.name}/#{target.codename}", + :provider_type_id => target.id, :template_id => template.id, :status => Image::STATE_QUEUED ) @@ -146,7 +143,7 @@ class Image < ActiveRecord::Base image = Image.new( :name => raw_image.name, :status => 'complete', - :target => account.provider.provider_type, + :provider_type_id => account.provider.provider_type_id, :template_id => template.id ) image.save! diff --git a/src/app/models/provider.rb b/src/app/models/provider.rb index dfb94c3..b933fdb 100644 --- a/src/app/models/provider.rb +++ b/src/app/models/provider.rb @@ -1,15 +1,15 @@ # == Schema Information -# Schema version: 20110207110131 +# Schema version: 20110223132404 # # Table name: providers # -# id :integer not null, primary key -# name :string(255) not null -# url :string(255) not null -# lock_version :integer default(0) -# created_at :datetime -# updated_at :datetime -# provider_type :integer +# id :integer not null, primary key +# name :string(255) not null +# url :string(255) not null +# lock_version :integer default(0) +# created_at :datetime +# updated_at :datetime +# provider_type_id :integer default(100), not null #
# @@ -43,35 +43,22 @@ class Provider < ActiveRecord::Base require 'util/conductor' include PermissionedObject
- MOCK = 0 - AWS = 1 - GOGRID = 2 - RACKSPACE = 3 - RHEVM = 4 - OPENNEBULA = 5 - - PROVIDER_TYPES = { MOCK => "mock", AWS => "AWS", - GOGRID => "GoGrid", RACKSPACE => "Rackspace", RHEVM => "RHEVM", - OPENNEBULA => "OpenNebula" } - - PROVIDER_BUILD_TARGETS = { AWS => 'ec2', MOCK => 'mock' } - has_many :provider_accounts, :dependent => :destroy has_many :hardware_profiles, :dependent => :destroy has_many :provider_images, :dependent => :destroy has_many :realms, :dependent => :destroy has_many :realm_backend_targets, :as => :realm_or_provider has_many :frontend_realms, :through => :realm_backend_targets + belongs_to :provider_type
validates_presence_of :name validates_uniqueness_of :name - + validates_presence_of :provider_type_id validates_presence_of :url
validates_format_of :name, :with => /^[\w -]*$/n, :message => "must only contain: numbers, letters, spaces, '_' and '-'" validates_length_of :name, :maximum => 255
- validates_inclusion_of :provider_type, :in => PROVIDER_TYPES
has_many :permissions, :as => :permission_object, :dependent => :destroy, :include => [:role], @@ -144,7 +131,7 @@ class Provider < ActiveRecord::Base
# returns first provider of provider_type which has at least one cloud account def self.find_by_target_with_account(provider_type) - Provider.all(:conditions => {:provider_type => provider_type}).each do |p| + Provider.all(:conditions => {:provider_type_id => provider_type}).each do |p| return p unless p.provider_accounts.empty? end nil diff --git a/src/app/models/provider_account.rb b/src/app/models/provider_account.rb index 8c01a5f..6ed677b 100644 --- a/src/app/models/provider_account.rb +++ b/src/app/models/provider_account.rb @@ -69,14 +69,14 @@ class ProviderAccount < ActiveRecord::Base validates_presence_of :username validates_uniqueness_of :username, :scope => :provider_id validates_presence_of :password - validates_presence_of :account_number,:if => Proc.new{ |account| account.provider.provider_type == Provider::AWS} + validates_presence_of :account_number,:if => Proc.new{ |account| account.provider.provider_type_id == ProviderType.find_by_codename("ec2").id} validate :validate_presence_of_x509_certs validate :validate_credentials
# We're using this instead of <tt>validates_presence_of</tt> helper because # we want to show errors on different attributes ending with '_file'. def validate_presence_of_x509_certs - if self.provider.provider_type == Provider::AWS + if self.provider.provider_type_id == ProviderType.find_by_codename("ec2").id errors.add(:x509_cert_pub_file, "can't be blank") if x509_cert_pub.blank? errors.add(:x509_cert_priv_file, "can't be blank") if x509_cert_priv.blank? end diff --git a/src/app/models/provider_account_observer.rb b/src/app/models/provider_account_observer.rb index 8d3ca9e..396743c 100644 --- a/src/app/models/provider_account_observer.rb +++ b/src/app/models/provider_account_observer.rb @@ -3,7 +3,7 @@ class ProviderAccountObserver < ActiveRecord::Observer # FIXME: new boxgrinder doesn't create bucket for amis automatically, # for now we create bucket from conductor # remove this hotfix when fixed on boxgrinder side - if account.provider.provider_type == Provider::AWS + if account.provider.provider_type_id == ProviderType.find_by_codename("ec2").id create_bucket(account) end if key = account.generate_auth_key diff --git a/src/app/models/provider_type.rb b/src/app/models/provider_type.rb new file mode 100644 index 0000000..1f1f58f --- /dev/null +++ b/src/app/models/provider_type.rb @@ -0,0 +1,25 @@ +# == Schema Information +# Schema version: 20110223132404 +# +# Table name: provider_types +# +# id :integer not null, primary key +# name :string(255) not null +# ssh_user :string(255) +# home_dir :string(255) +# build_supported :boolean +# created_at :datetime +# updated_at :datetime +# + +class ProviderType < ActiveRecord::Base + + has_many :providers + has_many :images + + validates_presence_of :name + validates_uniqueness_of :name + validates_presence_of :codename + validates_uniqueness_of :codename + +end diff --git a/src/db/migrate/20110217110836_create_provider_types.rb b/src/db/migrate/20110217110836_create_provider_types.rb new file mode 100644 index 0000000..0cadc8e --- /dev/null +++ b/src/db/migrate/20110217110836_create_provider_types.rb @@ -0,0 +1,16 @@ +class CreateProviderTypes < ActiveRecord::Migration + def self.up + create_table :provider_types do |t| + t.string :name, :null => false + t.string :codename, :null => false + t.string :ssh_user + t.string :home_dir + t.boolean :build_supported, :default => false + t.timestamps + end + end + + def self.down + drop_table :provider_types + end +end diff --git a/src/db/migrate/20110217133104_add_provider_type_id_to_provider.rb b/src/db/migrate/20110217133104_add_provider_type_id_to_provider.rb new file mode 100644 index 0000000..c0029d5 --- /dev/null +++ b/src/db/migrate/20110217133104_add_provider_type_id_to_provider.rb @@ -0,0 +1,43 @@ +class AddProviderTypeIdToProvider < ActiveRecord::Migration + + PROVIDER_TYPES = { 0 => "Mock", 1 => "Amazon EC2", 2 => "GoGrid", 3 => "Rackspace", 4 => "RHEV-M", 5 => "OpenNebula" } + INVERTED_PROVIDER_TYPES = PROVIDER_TYPES.invert + + def self.up + load_provider_types + add_column :providers, :provider_type_id, :integer, :null => false, :default => 100 + rename_column :providers, :provider_type, :provider_type_int + transform_provider_type_column + remove_column :providers, :provider_type_int + end + + def self.down + add_column :providers, :provider_type_temporary, :integer + transform_provider_type_column_back + rename_column :providers, :provider_type_temporary, :provider_type + remove_column :providers, :provider_type_id + end + + def self.load_provider_types + if ProviderType.all.empty? + ProviderType.create!(:name => "Mock", :build_supported => true, :codename =>"mock", :ssh_user => "ec2-user", :home_dir => "/home/ec2-user") + ProviderType.create!(:name => "Amazon EC2", :build_supported => true, :codename =>"ec2") + ProviderType.create!(:name => "GoGrid", :codename =>"gogrid") + ProviderType.create!(:name => "Rackspace", :codename =>"rackspace") + ProviderType.create!(:name => "RHEV-M", :codename =>"rhevm") + ProviderType.create!(:name => "OpenNebula", :codename =>"opennebula") + end + end + + def self.transform_provider_type_column + Provider.all.each do |provider| + provider.update_attribute(:provider_type_id, ProviderType.first(:conditions => {:name => PROVIDER_TYPES[provider.provider_type_int]}).id) + end + end + + def self.transform_provider_type_column_back + Provider.all.each do |provider| + provider.update_attribute(:provider_type_temporary, INVERTED_PROVIDER_TYPES[provider.provider_type.name]) + end + end +end diff --git a/src/db/migrate/20110223132404_add_target_id_column_to_images.rb b/src/db/migrate/20110223132404_add_target_id_column_to_images.rb new file mode 100644 index 0000000..c88953d --- /dev/null +++ b/src/db/migrate/20110223132404_add_target_id_column_to_images.rb @@ -0,0 +1,28 @@ +class AddTargetIdColumnToImages < ActiveRecord::Migration + + PROVIDER_TYPES = { 0 => "Mock", 1 => "Amazon EC2", 2 => "GoGrid", 3 => "Rackspace", 4 => "RHEV-M", 5 => "OpenNebula" } + INVERTED_PROVIDER_TYPES = PROVIDER_TYPES.invert + + def self.up + add_column :images, :provider_type_id, :integer, :null => false, :default => 100 + transform_target_column + remove_column :images, :target end + + def self.down + add_column :images, :target, :integer + transform_target_column_back + remove_column :images, :provider_type_id + end + + def self.transform_target_column + Image.all.each do |image| + image.update_attribute(:provider_type_id, ProviderType.first(:conditions => {:name => PROVIDER_TYPES[image.target] }).id) + end + end + + def self.transform_target_column_back + Image.all.each do |image| + image.update_attribute(:target, INVERTED_PROVIDER_TYPES[image.provider_type.name]) + end + end +end diff --git a/src/db/seeds.rb b/src/db/seeds.rb index f1f04f5..44dbd08 100644 --- a/src/db/seeds.rb +++ b/src/db/seeds.rb @@ -103,3 +103,13 @@ settings = {"allow_self_service_logins" => "true", settings.each_pair do |key, value| MetadataObject.set(key, value) end + +# Provider types actually supported +if ProviderType.all.empty? + ProviderType.create!(:name => "Mock", :build_supported => true, :codename =>"mock", :ssh_user => "ec2-user", :home_dir => "/home/ec2-user") + ProviderType.create!(:name => "Amazon EC2", :build_supported => true, :codename =>"ec2") + ProviderType.create!(:name => "GoGrid", :codename =>"gogrid") + ProviderType.create!(:name => "Rackspace", :codename =>"rackspace") + ProviderType.create!(:name => "RHEV-M", :codename =>"rhevm") + ProviderType.create!(:name => "OpenNebula", :codename =>"opennebula") + end diff --git a/src/test/fixtures/images.yml b/src/test/fixtures/images.yml index 3b800ac..cf4fe55 100644 --- a/src/test/fixtures/images.yml +++ b/src/test/fixtures/images.yml @@ -1,18 +1,18 @@ # == Schema Information -# Schema version: 20110207110131 +# Schema version: 20110223132404 # # Table name: images # -# id :integer not null, primary key -# uuid :string(255) -# name :string(255) not null -# build_id :string(255) -# uri :string(255) -# status :string(255) -# template_id :integer -# created_at :datetime -# updated_at :datetime -# target :integer +# id :integer not null, primary key +# uuid :string(255) +# name :string(255) not null +# build_id :string(255) +# uri :string(255) +# status :string(255) +# template_id :integer +# created_at :datetime +# updated_at :datetime +# provider_type_id :integer default(100), not null #
# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html
From: Jozef Zigmund jzigmund@redhat.com
--- .../controllers/image_factory/builds_controller.rb | 9 +++-- .../image_factory/templates_controller.rb | 2 +- src/app/helpers/admin/provider_accounts_helper.rb | 15 +------- src/app/views/admin/provider_accounts/_aws.haml | 39 -------------------- src/app/views/admin/provider_accounts/_ec2.haml | 39 ++++++++++++++++++++ src/app/views/admin/provider_accounts/_list.haml | 2 +- .../provider_accounts/_provider_selection.haml | 3 +- src/app/views/admin/providers/_form.haml | 4 +- src/app/views/admin/providers/_list.haml | 2 +- src/app/views/image_factory/builds/new.haml | 6 ++-- src/config/locales/en.yml | 6 --- src/image_builder_service/image_builder_service | 6 ++-- src/script/use-existing-ec2-templates | 2 +- 13 files changed, 59 insertions(+), 76 deletions(-) delete mode 100644 src/app/views/admin/provider_accounts/_aws.haml create mode 100644 src/app/views/admin/provider_accounts/_ec2.haml
diff --git a/src/app/controllers/image_factory/builds_controller.rb b/src/app/controllers/image_factory/builds_controller.rb index 13cfd7b..ac0a3e2 100644 --- a/src/app/controllers/image_factory/builds_controller.rb +++ b/src/app/controllers/image_factory/builds_controller.rb @@ -9,13 +9,13 @@ class ImageFactory::BuildsController < ApplicationController flash[:warning] = "Build imported template is not supported" redirect_to image_factory_templates_path end - @all_targets = Image.available_targets + @all_targets = ProviderType.all(:conditions => {:build_supported => true}) end
def create @tpl = Template.find(params[:template_id]) check_permission - @all_targets = Image.available_targets + @all_targets = ProviderType.all(:conditions => {:build_supported => true})
if params[:targets].blank? flash.now[:warning] = 'You need to check at least one provider format' @@ -26,13 +26,14 @@ class ImageFactory::BuildsController < ApplicationController @tpl.upload unless @tpl.uploaded errors = {} warnings = [] - params[:targets].each do |target| + params[:targets].each do |target_id| begin + target = ProviderType.find(target_id) Image.build(@tpl, target) rescue ImageExistsError warnings << $!.message rescue - errors[target] = $!.message + errors[target ? target.name : target_id] = $!.message end end flash[:warning] = 'Warning: ' + warnings.join unless warnings.empty? diff --git a/src/app/controllers/image_factory/templates_controller.rb b/src/app/controllers/image_factory/templates_controller.rb index f4ab91d..5f905fa 100644 --- a/src/app/controllers/image_factory/templates_controller.rb +++ b/src/app/controllers/image_factory/templates_controller.rb @@ -163,7 +163,7 @@ class ImageFactory::TemplatesController < ApplicationController
def deployment_definition # FIXME: do we need perm check here? - @all_targets = Image.available_targets + @all_targets = ProviderType.all(:conditions => {:build_supported => true}) end
def remove_package diff --git a/src/app/helpers/admin/provider_accounts_helper.rb b/src/app/helpers/admin/provider_accounts_helper.rb index d4c234d..a6bf5ef 100644 --- a/src/app/helpers/admin/provider_accounts_helper.rb +++ b/src/app/helpers/admin/provider_accounts_helper.rb @@ -1,19 +1,8 @@ module Admin::ProviderAccountsHelper
def display_provider_account_login_form(provider_type) - case provider_type - when 0 - render :partial => "mock" - when 1 - render :partial => "aws" - when 2 - render :partial => "gogrid" - when 3 - render :partial => "rackspace" - when 4 - render :partial => "rhevm" - when 5 - render :partial => "opennebula" + unless provider_type.codename.nil? + render :partial => provider_type.codename else flash.now[:warning] = "You don't have any provider yet" end diff --git a/src/app/views/admin/provider_accounts/_aws.haml b/src/app/views/admin/provider_accounts/_aws.haml deleted file mode 100644 index 43c4078..0000000 --- a/src/app/views/admin/provider_accounts/_aws.haml +++ /dev/null @@ -1,39 +0,0 @@ -%fieldset.nomargin.clearfix - = label_tag "Account name:" - = text_field :provider_account, :label - = label_tag "Username" - = text_field :provider_account, :username - = label_tag "Password" - = password_field :provider_account, :password - = label_tag "Quota" - = text_field :quota, :maximum_running_instances, :title => t('provider_accounts.form.quota_instances'), :value => @quota.maximum_running_instances || "unlimited", :id => "quota_instances", :class => "grid_3 omega" -%fieldset.nomargin.clearfix - .grid_3.prefix_10.alpha.omega - ( - %button.linkbutton.nospace{ :type => 'button', :onclick => "set_unlimited_quota("quota_instances");" }<> - = t('provider_accounts.form.unlimited_quota') - ) - -%fieldset.clearfix.nomargin - %label.grid_4.la.alpha - = t('provider_accounts.form.account_number') - %span.required * - = text_field :provider_account, :account_number - %label.grid_3.la - = t('provider_accounts.form.account_private_cert') - %span.required * - = file_field :provider_account, :x509_cert_priv_file, :title => t('provider_accounts.form.account_private_cert') - %label.grid_3.la - = t('provider_accounts.form.account_public_cert') - %span.required * - = file_field :provider_account, :x509_cert_pub_file, :title => t('provider_accounts.form.account_public_cert') - .grid_3.omega - ( - %button.linkbutton.nospace{ :type => 'submit', :value => t('provider_accounts.form.test_account'), :name => 'test_account', :id => 'test_account' }<> - = t('provider_accounts.form.test_account') - ) - -:javascript - function set_unlimited_quota(elem_id) { - $("#" + elem_id)[0].value = "unlimited"; - } diff --git a/src/app/views/admin/provider_accounts/_ec2.haml b/src/app/views/admin/provider_accounts/_ec2.haml new file mode 100644 index 0000000..43c4078 --- /dev/null +++ b/src/app/views/admin/provider_accounts/_ec2.haml @@ -0,0 +1,39 @@ +%fieldset.nomargin.clearfix + = label_tag "Account name:" + = text_field :provider_account, :label + = label_tag "Username" + = text_field :provider_account, :username + = label_tag "Password" + = password_field :provider_account, :password + = label_tag "Quota" + = text_field :quota, :maximum_running_instances, :title => t('provider_accounts.form.quota_instances'), :value => @quota.maximum_running_instances || "unlimited", :id => "quota_instances", :class => "grid_3 omega" +%fieldset.nomargin.clearfix + .grid_3.prefix_10.alpha.omega + ( + %button.linkbutton.nospace{ :type => 'button', :onclick => "set_unlimited_quota("quota_instances");" }<> + = t('provider_accounts.form.unlimited_quota') + ) + +%fieldset.clearfix.nomargin + %label.grid_4.la.alpha + = t('provider_accounts.form.account_number') + %span.required * + = text_field :provider_account, :account_number + %label.grid_3.la + = t('provider_accounts.form.account_private_cert') + %span.required * + = file_field :provider_account, :x509_cert_priv_file, :title => t('provider_accounts.form.account_private_cert') + %label.grid_3.la + = t('provider_accounts.form.account_public_cert') + %span.required * + = file_field :provider_account, :x509_cert_pub_file, :title => t('provider_accounts.form.account_public_cert') + .grid_3.omega + ( + %button.linkbutton.nospace{ :type => 'submit', :value => t('provider_accounts.form.test_account'), :name => 'test_account', :id => 'test_account' }<> + = t('provider_accounts.form.test_account') + ) + +:javascript + function set_unlimited_quota(elem_id) { + $("#" + elem_id)[0].value = "unlimited"; + } diff --git a/src/app/views/admin/provider_accounts/_list.haml b/src/app/views/admin/provider_accounts/_list.haml index 07e28a3..687c32e 100644 --- a/src/app/views/admin/provider_accounts/_list.haml +++ b/src/app/views/admin/provider_accounts/_list.haml @@ -17,4 +17,4 @@ %td =account.username %td - =t(Provider::PROVIDER_TYPES[account.provider.provider_type]) + =account.provider.provider_type.name diff --git a/src/app/views/admin/provider_accounts/_provider_selection.haml b/src/app/views/admin/provider_accounts/_provider_selection.haml index 073c181..a6ffb45 100644 --- a/src/app/views/admin/provider_accounts/_provider_selection.haml +++ b/src/app/views/admin/provider_accounts/_provider_selection.haml @@ -3,9 +3,8 @@ = select(:provider_account ,:provider_id, options_for_select(@providers.map{ |p| [p.name, p.id] }, :selected => @selected_provider.id)) = restful_submit_tag "Choose", 'set_selected_provider',set_selected_provider_admin_provider_accounts_path, 'GET', :class => 'button' = label_tag "Cloud type: " - = t(Provider::PROVIDER_TYPES[@selected_provider.provider_type]) + = @selected_provider.provider_type.name = display_provider_account_login_form(@selected_provider.provider_type) -
:javascript $(document).ready(function(){ diff --git a/src/app/views/admin/providers/_form.haml b/src/app/views/admin/providers/_form.haml index a07a615..df888dc 100644 --- a/src/app/views/admin/providers/_form.haml +++ b/src/app/views/admin/providers/_form.haml @@ -1,6 +1,6 @@ = form.error_message_on :name, 'Name ' = form.error_message_on :url, 'URL ' -= form.error_message_on :provider_type += form.error_message_on :provider_type_id %fieldset.clear = form.label :name,'Provider name :' = form.text_field :name, :title => 'provider_name', :value => @provider.name, :class => "clear grid_4 alpha" @@ -13,7 +13,7 @@ ) %fieldset.clear = form.label :provider_type - = form.select(:provider_type, Provider::PROVIDER_TYPES.collect {|id, provider_type| [t(provider_type),id] }, :prompt => "Select type of provider") + = form.select(:provider_type_id, ProviderType.all.collect {|provider_type| [provider_type.name,provider_type.id] }, :prompt => "Select type of provider")
%fieldset.clear = form.submit "Save", :class => "submit formbutton" diff --git a/src/app/views/admin/providers/_list.haml b/src/app/views/admin/providers/_list.haml index 7b660a3..7de6e32 100644 --- a/src/app/views/admin/providers/_list.haml +++ b/src/app/views/admin/providers/_list.haml @@ -17,4 +17,4 @@ %input{:name => "provider_selected[]", :type => "checkbox", :value => provider.id, :id => "provider_checkbox_#{provider.id}", :checked => selected } = link_to provider.name, admin_provider_path(provider) %td= provider.url - %td= t(Provider::PROVIDER_TYPES[provider.provider_type]) + %td= provider.provider_type.name diff --git a/src/app/views/image_factory/builds/new.haml b/src/app/views/image_factory/builds/new.haml index a467912..cf17e88 100644 --- a/src/app/views/image_factory/builds/new.haml +++ b/src/app/views/image_factory/builds/new.haml @@ -46,10 +46,10 @@ %label Choose Provider Format: %section.clearfix.gap %ul.block - - @all_targets.each do |target_id, target| + - @all_targets.each do |target| %li - = check_box_tag 'targets[]', target_id, false, :id => target - = label_tag target + = check_box_tag 'targets[]', target.id, false, :id => target.name + = label_tag target.name
= submit_tag "Submit to Build", :name => "build" = link_to 'Cancel', image_factory_templates_path, :class => 'button' diff --git a/src/config/locales/en.yml b/src/config/locales/en.yml index 8ae2036..233cd14 100644 --- a/src/config/locales/en.yml +++ b/src/config/locales/en.yml @@ -85,12 +85,6 @@ en: pool_families: Pool Families setting: Settings name: Name - AWS: Amazon EC2 - RHEVM: RHEV-M - GoGrid: GoGrid - Rackspace: Rackspace - OpenNebula: OpenNebula - mock: Mock admin: settings: index: diff --git a/src/image_builder_service/image_builder_service b/src/image_builder_service/image_builder_service index 81f6098..d449a03 100755 --- a/src/image_builder_service/image_builder_service +++ b/src/image_builder_service/image_builder_service @@ -108,14 +108,14 @@ class ImageBuilderService def build(image) #targets.each do |t| @log.debug "========================================" - @log.debug "target: " + Provider::PROVIDER_BUILD_TARGETS[image.target] + ", status: " + image.status + @log.debug "target: " + image.provider_type.codename + ", status: " + image.status @log.debug "========================================" # FIXME: this should be contained elsewhere (probably Image model) so we # can keep logic out of here. Also, this currently only handles one # account, we will need to be able to specify at some point. creds = image.provider_images.first.provider.provider_accounts.first.build_credentials #TODO: switch this back to uri once ActiveBuild retrieves it properly - ab = @console.build_image(image.template.xml.to_xml, Provider::PROVIDER_BUILD_TARGETS[image.target], image.uuid, creds) + ab = @console.build_image(image.template.xml.to_xml, image.provider_type.codename, image.uuid, creds) if ab update_build_list(ab, image) image.build_id = ab.object_id.to_s @@ -161,7 +161,7 @@ class ImageBuilderService @log.debug "========================================" @log.debug "Getting ar object to update using " + obj[:build].target.inspect + " and " + obj[:ar_id].inspect + " ..." @log.debug "========================================" - image = Image.find(:first, :conditions => { :target => Provider::PROVIDER_BUILD_TARGETS.invert[obj[:build].target.to_s], + image = Image.find(:first, :conditions => { :provider_type_id => ProviderType.find_by_codename(obj[:build].target.to_s).id, :template_id => obj[:ar_id].to_i }) @log.debug "========================================" @log.debug "Updating with status: " + new_status diff --git a/src/script/use-existing-ec2-templates b/src/script/use-existing-ec2-templates index ee08288..9b6f51b 100755 --- a/src/script/use-existing-ec2-templates +++ b/src/script/use-existing-ec2-templates @@ -13,7 +13,7 @@ require 'optparse' def add_ec2_template(xml_info, summary, ec2_ami)
provider = Provider.find(:first) - if provider == nil || provider.provider_type != Provider::AWS + if provider == nil || provider.provider_type != ProviderType.find_by_codename("ec2") puts "You need to set up an EC2 provider before you can run this script." exit end
From: Jozef Zigmund jzigmund@redhat.com
--- src/features/provider.feature | 2 +- src/features/step_definitions/template_steps.rb | 2 +- src/features/template.feature | 6 ++-- src/spec/controllers/builds_controller_spec.rb | 4 +- src/spec/factories/image.rb | 2 +- src/spec/factories/provider.rb | 8 ++-- src/spec/factories/provider_type.rb | 10 ++++++ src/spec/models/image_spec.rb | 4 +- src/spec/models/provider_spec.rb | 6 +-- src/test/fixtures/providers.yml | 20 ------------- src/test/unit/provider_test.rb | 35 ----------------------- 11 files changed, 26 insertions(+), 73 deletions(-) create mode 100644 src/spec/factories/provider_type.rb delete mode 100644 src/test/fixtures/providers.yml delete mode 100644 src/test/unit/provider_test.rb
diff --git a/src/features/provider.feature b/src/features/provider.feature index 7566e61..4b6c50c 100644 --- a/src/features/provider.feature +++ b/src/features/provider.feature @@ -34,7 +34,7 @@ Feature: Manage Providers Then I should be on the new admin provider page When I fill in "provider[name]" with "testprovider" And I fill in "provider[url]" with "http://localhost:3001/api" - And I select "Amazon EC2" from "Provider type" + And I select "Amazon EC2" from "provider_provider_type_id" And I press "Save" Then I should be on the admin providers page And I should see "Provider added" diff --git a/src/features/step_definitions/template_steps.rb b/src/features/step_definitions/template_steps.rb index 921e47f..3491eb4 100644 --- a/src/features/step_definitions/template_steps.rb +++ b/src/features/step_definitions/template_steps.rb @@ -98,7 +98,7 @@ Given /^there is Amazon AWS provider account$/ do end
Given /^there is Amazon AWS build for this template$/ do - Image.build(@template, Provider::AWS) + Image.build(@template, ProviderType.find_by_codename("ec2")) end
Given /^there is an imported template$/ do diff --git a/src/features/template.feature b/src/features/template.feature index e0e58d4..336b194 100644 --- a/src/features/template.feature +++ b/src/features/template.feature @@ -113,7 +113,7 @@ Feature: Manage Templates And I follow "Build" Then I should be on the new image factory build page And I should see "Build Request" - When I check "Ec2" + When I check "Amazon EC2" And I press "Submit to Build" Then I should be on the image factory template page And I should see "mock1" @@ -128,11 +128,11 @@ Feature: Manage Templates And I follow "Build" Then I should be on the new image factory build page And I should see "Build Request" - When I check "Ec2" + When I check "Amazon EC2" And I press "Submit to Build" Then I should be on the image factory template page And I should see "mock1" - And I should see "An attempted build of this template for the target '1' already exists" + And I should see "An attempted build of this template for the target 'Amazon EC2' already exists"
Scenario: Build imported template Given there is an imported template diff --git a/src/spec/controllers/builds_controller_spec.rb b/src/spec/controllers/builds_controller_spec.rb index 79eaa17..b0f1885 100644 --- a/src/spec/controllers/builds_controller_spec.rb +++ b/src/spec/controllers/builds_controller_spec.rb @@ -24,13 +24,13 @@ describe ImageFactory::BuildsController do
it "should create a new Image" do lambda do - post :create, :template_id => @template.id, :targets => ["0"] + post :create, :template_id => @template.id, :targets => ProviderType.find_by_codename("mock").id end.should change(Image, :count).by(1) end
it "should create a new ProviderImage" do lambda do - post :create, :template_id => @template.id, :targets => ["0"] + post :create, :template_id => @template.id, :targets => ProviderType.find_by_codename("mock").id end.should change(ProviderImage, :count).by(1) end end diff --git a/src/spec/factories/image.rb b/src/spec/factories/image.rb index 293ac22..c8b34e3 100644 --- a/src/spec/factories/image.rb +++ b/src/spec/factories/image.rb @@ -4,6 +4,6 @@ Factory.define :image do |i| i.sequence(:name) { |n| "image#{n}" } i.status 'queued' - i.target 'ec2' + i.provider_type_id { ProviderType.find_by_codename("ec2").id } i.association(:template) end diff --git a/src/spec/factories/provider.rb b/src/spec/factories/provider.rb index f6288dc..03f8773 100644 --- a/src/spec/factories/provider.rb +++ b/src/spec/factories/provider.rb @@ -1,11 +1,11 @@ Factory.define :provider do |p| p.sequence(:name) { |n| "provider#{n}" } - p.provider_type '0' + p.provider_type { ProviderType.find_by_codename("mock") } p.url { |p| "http://www." + p.name + ".com/api" } end
Factory.define :mock_provider, :parent => :provider do |p| - p.provider_type '0' + p.provider_type { ProviderType.find_by_codename("mock") } p.url 'http://localhost:3001/api' p.hardware_profiles { |hp| [hp.association(:mock_hwp1), hp.association(:mock_hwp2)] } p.after_create { |p| p.realms << Factory(:realm1, :provider => p) << Factory(:realm2, :provider => p) } @@ -13,14 +13,14 @@ end
Factory.define :mock_provider2, :parent => :provider do |p| p.name 'mock2' - p.provider_type '0' + p.provider_type { ProviderType.find_by_codename("mock") } p.url 'http://localhost:3001/api' p.after_create { |p| p.realms << Factory(:realm3, :provider => p) } end
Factory.define :ec2_provider, :parent => :provider do |p| p.name 'amazon-ec2' - p.provider_type '1' + p.provider_type { ProviderType.find_by_codename("ec2") } p.url 'http://localhost:3001/api' p.hardware_profiles { |hp| [hp.association(:ec2_hwp1)] } p.after_create { |p| p.realms << Factory(:realm4, :provider => p) } diff --git a/src/spec/factories/provider_type.rb b/src/spec/factories/provider_type.rb new file mode 100644 index 0000000..0fed927 --- /dev/null +++ b/src/spec/factories/provider_type.rb @@ -0,0 +1,10 @@ +Factory.define :provider_type do |p| +end + +Factory.define :mock_provider_type, :parent => :provider_type do |p| + p.name 'Mock' +end + +Factory.define :ec2_provider_type, :parent => :provider_type do |p| + p.name 'Amazon EC2' +end diff --git a/src/spec/models/image_spec.rb b/src/spec/models/image_spec.rb index 63b11dc..a5c3534 100644 --- a/src/spec/models/image_spec.rb +++ b/src/spec/models/image_spec.rb @@ -38,7 +38,7 @@ describe Image do it "should not build image if image already exists for specified target" do old = Factory.build(:image) old.save! - lambda {Image.build(old.template, old.target)}.should raise_error(ImageExistsError) + lambda {Image.build(old.template, old.provider_type)}.should raise_error(ImageExistsError) end
it "should build image if there is provider and cloud account for specified target" do @@ -47,7 +47,7 @@ describe Image do acc.save! tpl = Factory.build(:template) tpl.save! - img = Image.build(tpl, '0') + img = Image.build(tpl, ProviderType.find_by_codename("mock")) Image.find(img).should == img ProviderImage.find_by_image_id(img.id).should_not be_nil end diff --git a/src/spec/models/provider_spec.rb b/src/spec/models/provider_spec.rb index a9cde6b..0771c9a 100644 --- a/src/spec/models/provider_spec.rb +++ b/src/spec/models/provider_spec.rb @@ -28,10 +28,8 @@ describe Provider do end
it "should require a valid provider_type" do - [nil, ""].each do |invalid_value| - @provider.provider_type = invalid_value + @provider.provider_type = nil @provider.should_not be_valid - end end
it "should require a valid url" do @@ -67,7 +65,7 @@ describe Provider do it "should set valid cloud type" do @client.driver_name = @provider.provider_type @provider.provider_type = nil - @provider.provider_type = 0 + @provider.provider_type = ProviderType.find_by_codename "mock" @provider.should be_valid end
diff --git a/src/test/fixtures/providers.yml b/src/test/fixtures/providers.yml deleted file mode 100644 index 85d3c9d..0000000 --- a/src/test/fixtures/providers.yml +++ /dev/null @@ -1,20 +0,0 @@ -# == Schema Information -# Schema version: 20110207110131 -# -# Table name: providers -# -# id :integer not null, primary key -# name :string(255) not null -# url :string(255) not null -# lock_version :integer default(0) -# created_at :datetime -# updated_at :datetime -# provider_type :integer -# - -# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html - -mock_provider: - name: mock - provider_type: Mock - url: http://localhost:3001/api diff --git a/src/test/unit/provider_test.rb b/src/test/unit/provider_test.rb deleted file mode 100644 index 5029a3d..0000000 --- a/src/test/unit/provider_test.rb +++ /dev/null @@ -1,35 +0,0 @@ -require File.dirname(__FILE__) + '/../test_helper' - -class ProviderTest < ActiveSupport::TestCase - fixtures :providers - - def setup - @provider = Provider.new(:name => "my_ec2", - :provider_type => "EC2") - end - # The following three tests assume you have the deltacloud-framework - # running and configured on localhost:3000 - - test "is valid with good url" do - @provider.url = "http://localhost:3000/api" - flunk "That URL should have worked. Is framework running?" if @provider.invalid? - end - - test "requires url" do - flunk "Providers require a url" if @provider.valid? - end - - test "fails with invalid provider url" do - @provider.url = "http://conductor.awesome/api" - flunk "Invalid url passed validation" unless @provider.invalid? - end - - test "should return nil if no connection" do - assert_equal(nil, @provider.connect) - end - - test "should return DeltaCloud if successful connection" do - @provider.url = "http://localhost:3000/api" - assert_instance_of(DeltaCloud, @provider.connect) - end -end
aeolus-devel@lists.fedorahosted.org