From: Jozef Zigmund <jzigmund(a)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
--
1.7.4