From: Jan Provaznik <jprov...@redhat.com> This is second shoot in image/template models refactoring, lotof TODOs - suppose image uuid is generated by aggregator for now when image is created in CE - when image factory builds image, image's status should be updated - image_providers table represents images uploaded to providers, suppose user can create instances only from uploaded images - instance is now connected with image_provider instead of image - when image is uploaded to provider, image_providers mapping should be updated
--- src/app/models/cloud_account.rb | 26 ---------- src/app/models/image.rb | 53 ++++++++------------ src/app/models/image_descriptor.rb | 30 ----------- src/app/models/image_descriptor_target.rb | 26 ---------- src/app/models/image_provider.rb | 4 ++ src/app/models/instance.rb | 7 +-- src/app/models/provider.rb | 9 ++-- src/app/models/template.rb | 48 ++++++++++++++++++ src/db/migrate/20090804140143_create_images.rb | 24 ++++++--- src/db/migrate/20090804142049_create_instances.rb | 2 +- .../20100527095400_create_image_descriptors.rb | 14 ----- ...100527095428_create_image_descriptor_targets.rb | 15 ------ src/db/migrate/20100830150014_create_templates.rb | 16 ++++++ 13 files changed, 112 insertions(+), 162 deletions(-) delete mode 100644 src/app/models/image_descriptor.rb delete mode 100644 src/app/models/image_descriptor_target.rb create mode 100644 src/app/models/image_provider.rb create mode 100644 src/app/models/template.rb delete mode 100644 src/db/migrate/20100527095400_create_image_descriptors.rb delete mode 100644 src/db/migrate/20100527095428_create_image_descriptor_targets.rb create mode 100644 src/db/migrate/20100830150014_create_templates.rb diff --git a/src/app/models/cloud_account.rb b/src/app/models/cloud_account.rb index 69c8b87..2cc7a7e 100644 --- a/src/app/models/cloud_account.rb +++ b/src/app/models/cloud_account.rb @@ -98,32 +98,6 @@ class CloudAccount < ActiveRecord::Base ar_realm.save! end end - images.each do |image| - #ignore if it exists - #FIXME: we need to handle keeping in sync for updates as well as - # account permissions - ar_image = Image.find_by_external_key_and_provider_id(image.id, - provider.id) - unless ar_image - ar_image = Image.new(:external_key => image.id, - :name => image.name ? image.name : - (image.description ? image.description : - image.id), - :architecture => image.architecture, - :provider_id => provider.id) - ar_image.save! - front_end_image = Image.new(:external_key => - provider.name + - Realm::AGGREGATOR_REALM_ACCOUNT_DELIMITER + - ar_image.external_key, - :name => provider.name + - Realm::AGGREGATOR_REALM_ACCOUNT_DELIMITER + - ar_image.name, - :architecture => ar_image.architecture) - front_end_image.provider_images << ar_image - front_end_image.save! - end - end end end diff --git a/src/app/models/image.rb b/src/app/models/image.rb index f3304cf..954668b 100644 --- a/src/app/models/image.rb +++ b/src/app/models/image.rb @@ -25,46 +25,35 @@ class Image < ActiveRecord::Base cattr_reader :per_page @@per_page = 15 + belongs_to :template has_many :instances - belongs_to :provider - - has_and_belongs_to_many :aggregator_images, - :class_name => "Image", - :join_table => "image_map", - :foreign_key => "provider_image_id", - :association_foreign_key => "aggregator_image_id" - - has_and_belongs_to_many :provider_images, - :class_name => "Image", - :join_table => "image_map", - :foreign_key => "aggregator_image_id", - :association_foreign_key => "provider_image_id" - - validates_presence_of :external_key - validates_uniqueness_of :external_key, :scope => [:provider_id] + has_many :image_providers, :dependent => :destroy + has_many :providers, :through => :image_providers + validates_presence_of :uuid 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 :architecture, :if => :provider + SEARCHABLE_COLUMNS = %w(name) - SEARCHABLE_COLUMNS = %w(name architecture) + STATE_QUEUED = 'queued' + STATE_WAITING = 'waiting' + STATE_BUILDING = 'building' + STATE_COMPLETE = 'complete' + STATE_CANCELED = 'canceled' - def provider_image? - !provider.nil? - end + ACTIVE_STATES = [ STATE_WAITING, STATE_BUILDING ] - def validate - if provider.nil? - if !aggregator_images.empty? - errors.add(:aggregator_images, - "Aggregator image only allowed for provider images") - end - else - if !provider_images.empty? - errors.add(:provider_images, - "Provider images only allowed for aggregator images") - end + def self.new_if_not_exists(data) + unless find_by_uuid(data[:uuid]) + Image.new(data).save! end end + + def self.available_targets + return YAML.load_file("#{RAILS_ROOT}/config/image_descriptor_targets.yml") + end end diff --git a/src/app/models/image_descriptor.rb b/src/app/models/image_descriptor.rb deleted file mode 100644 index 3ce7e25..0000000 --- a/src/app/models/image_descriptor.rb +++ /dev/null @@ -1,30 +0,0 @@ -require 'util/image_descriptor_xml' - -class ImageDescriptor < ActiveRecord::Base - has_many :image_descriptor_targets, :dependent => :destroy - - #TODO: validations - - def update_xml_attributes!(opts = {}) - doc = xml - doc.name = opts[:name] if opts[:name] - doc.platform = opts[:platform] if opts[:platform] - doc.description = opts[:description] if opts[:description] - doc.services = (opts[:services] || []) if opts[:services] or opts[:set_services] - doc.packages = (opts[:packages] || []) if opts[:packages] or opts[:set_packages] - save_xml! - end - - def save_xml! - self[:xml] = xml.to_xml - @xml = nil - save! - end - - def xml - unless @xml - @xml = ImageDescriptorXML.new(self[:xml].to_s) - end - return @xml - end -end diff --git a/src/app/models/image_descriptor_target.rb b/src/app/models/image_descriptor_target.rb deleted file mode 100644 index 33437f1..0000000 --- a/src/app/models/image_descriptor_target.rb +++ /dev/null @@ -1,26 +0,0 @@ -require 'yaml' - -class ImageDescriptorTarget < ActiveRecord::Base - belongs_to :image_descriptor - - #TODO: validations - validates_presence_of :name - - STATE_QUEUED = 'queued' - STATE_WAITING = 'waiting' - STATE_BUILDING = 'building' - STATE_COMPLETE = 'complete' - STATE_CANCELED = 'canceled' - - ACTIVE_STATES = [ STATE_WAITING, STATE_BUILDING ] - - def self.new_if_not_exists(data) - unless find(:first, :conditions => {:name => data[:name], :image_descriptor_id => data[:image_descriptor_id]}) - ImageDescriptorTarget.new(data).save! - end - end - - def self.available_targets - return YAML.load_file("#{RAILS_ROOT}/config/image_descriptor_targets.yml") - end -end diff --git a/src/app/models/image_provider.rb b/src/app/models/image_provider.rb new file mode 100644 index 0000000..873f9a1 --- /dev/null +++ b/src/app/models/image_provider.rb @@ -0,0 +1,4 @@ +class ImageProvider < ActiveRecord::Base + belongs_to :provider + belongs_to :image +end diff --git a/src/app/models/instance.rb b/src/app/models/instance.rb index 0212e24..7439297 100644 --- a/src/app/models/instance.rb +++ b/src/app/models/instance.rb @@ -30,12 +30,12 @@ class Instance < ActiveRecord::Base belongs_to :cloud_account belongs_to :hardware_profile - belongs_to :image + belongs_to :image_provider belongs_to :realm validates_presence_of :pool_id validates_presence_of :hardware_profile_id - validates_presence_of :image_id + validates_presence_of :image_provider_id #validates_presence_of :external_key # TODO: can we do uniqueness validation on indirect association @@ -46,9 +46,6 @@ class Instance < ActiveRecord::Base validates_uniqueness_of :name, :scope => :pool_id validates_length_of :name, :maximum => 1024 - validates_presence_of :hardware_profile_id - validates_presence_of :image_id - STATE_NEW = "new" STATE_PENDING = "pending" STATE_RUNNING = "running" diff --git a/src/app/models/provider.rb b/src/app/models/provider.rb index ed8fc70..ca87f05 100644 --- a/src/app/models/provider.rb +++ b/src/app/models/provider.rb @@ -23,10 +23,11 @@ class Provider < ActiveRecord::Base require 'util/deltacloud' include PermissionedObject - has_many :cloud_accounts, :dependent => :destroy - has_many :hardware_profiles, :dependent => :destroy - has_many :images, :dependent => :destroy - has_many :realms, :dependent => :destroy + has_many :cloud_accounts, :dependent => :destroy + has_many :hardware_profiles, :dependent => :destroy + has_many :image_providers, :dependent => :destroy + has_many :images, :through => :image_providers + has_many :realms, :dependent => :destroy validates_presence_of :name validates_uniqueness_of :name diff --git a/src/app/models/template.rb b/src/app/models/template.rb new file mode 100644 index 0000000..04f3a37 --- /dev/null +++ b/src/app/models/template.rb @@ -0,0 +1,48 @@ +require 'util/image_descriptor_xml' +require 'typhoeus' + +class Template < ActiveRecord::Base + has_many :images, :dependent => :destroy + before_save :update_attrs_from_xml + + WAREHOUSE_CONFIG = YAML.load_file("#{RAILS_ROOT}/config/image_warehouse.yml") + + #TODO: validations + #validates_uniqueness_of :name + + def update_xml_attributes!(opts = {}) + doc = xml + doc.name = opts[:name] if opts[:name] + doc.platform = opts[:platform] if opts[:platform] + doc.description = opts[:description] if opts[:description] + doc.services = (opts[:services] || []) if opts[:services] or opts[:set_services] + doc.packages = (opts[:packages] || []) if opts[:packages] or opts[:set_packages] + save_xml! + end + + def save_xml! + self[:xml] = xml.to_xml + @xml = nil + save! + end + + def xml + @xml ||= ImageDescriptorXML.new(self[:xml].to_s) + end + + def upload_template + self.uri = File.join(WAREHOUSE_CONFIG['baseurl'], "template_#{id}") + response = Typhoeus::Request.put(self.uri, :body => xml.to_xml) + if response.code == 200 + save! + else + raise "failed to upload template (return code #{response.code}): #{response.body}" + end + return true + end + + def update_attrs_from_xml + self.name = xml.name + self.summary = xml.description + end +end diff --git a/src/db/migrate/20090804140143_create_images.rb b/src/db/migrate/20090804140143_create_images.rb index 8c9c962..f963a6a 100644 --- a/src/db/migrate/20090804140143_create_images.rb +++ b/src/db/migrate/20090804140143_create_images.rb @@ -22,21 +22,27 @@ class CreateImages < ActiveRecord::Migration def self.up create_table :images do |t| - t.string :external_key, :null => false - t.string :name, :null => false, :limit => 1024 - t.string :architecture, :null => false - t.integer :provider_id - t.integer :lock_version, :default => 0 + t.string :uuid, :null => false + t.string :name, :null => false + t.string :build_id + t.string :uri + t.string :status + t.string :target + t.integer :template_id t.timestamps end - create_table "image_map", :force => true, :id => false do |t| - t.column "aggregator_image_id", :integer - t.column "provider_image_id", :integer + + create_table :image_providers do |t| + t.integer :image_id + t.integer :provider_id + t.string :provider_image_key + t.boolean :uploaded, :default => false + t.boolean :registered, :default => false end end def self.down - drop_table :image_map + drop_table :image_providers drop_table :images end end diff --git a/src/db/migrate/20090804142049_create_instances.rb b/src/db/migrate/20090804142049_create_instances.rb index 42706e1..640b194 100644 --- a/src/db/migrate/20090804142049_create_instances.rb +++ b/src/db/migrate/20090804142049_create_instances.rb @@ -25,7 +25,7 @@ class CreateInstances < ActiveRecord::Migration t.string :external_key t.string :name, :null => false, :limit => 1024 t.integer :hardware_profile_id, :null => false - t.integer :image_id, :null => false + t.integer :image_provider_id, :null => false t.integer :realm_id t.integer :pool_id, :null => false t.integer :cloud_account_id diff --git a/src/db/migrate/20100527095400_create_image_descriptors.rb b/src/db/migrate/20100527095400_create_image_descriptors.rb deleted file mode 100644 index 8802b68..0000000 --- a/src/db/migrate/20100527095400_create_image_descriptors.rb +++ /dev/null @@ -1,14 +0,0 @@ -class CreateImageDescriptors < ActiveRecord::Migration - def self.up - create_table :image_descriptors do |t| - t.binary :xml, :null => false - t.string :uri - t.boolean :complete, :default => false - t.timestamps - end - end - - def self.down - drop_table :image_descriptors - end -end diff --git a/src/db/migrate/20100527095428_create_image_descriptor_targets.rb b/src/db/migrate/20100527095428_create_image_descriptor_targets.rb deleted file mode 100644 index b760b90..0000000 --- a/src/db/migrate/20100527095428_create_image_descriptor_targets.rb +++ /dev/null @@ -1,15 +0,0 @@ -class CreateImageDescriptorTargets < ActiveRecord::Migration - def self.up - create_table :image_descriptor_targets do |t| - t.string :name, :null => false - t.string :build_id - t.string :status - t.integer :image_descriptor_id - t.timestamps - end - end - - def self.down - drop_table :image_descriptor_targets - end -end diff --git a/src/db/migrate/20100830150014_create_templates.rb b/src/db/migrate/20100830150014_create_templates.rb new file mode 100644 index 0000000..0204d27 --- /dev/null +++ b/src/db/migrate/20100830150014_create_templates.rb @@ -0,0 +1,16 @@ +class CreateTemplates < ActiveRecord::Migration + def self.up + create_table :templates do |t| + t.binary :xml, :null => false + t.string :uri + t.string :name + t.text :summary + t.boolean :complete, :default => false + t.timestamps + end + end + + def self.down + drop_table :templates + end +end -- 1.7.2.2 _______________________________________________ deltacloud-devel mailing list deltacloud-devel@lists.fedorahosted.org https://fedorahosted.org/mailman/listinfo/deltacloud-devel