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

Reply via email to