From: Jan Provaznik <[email protected]>

TBD: passing credentials and image uuid to image_builder_service.rb
---
 src/app/models/cloud_account.rb                    |   26 ---------
 src/app/models/image.rb                            |   59 +++++++++-----------
 src/app/models/image_descriptor.rb                 |   30 ----------
 src/app/models/image_descriptor_target.rb          |   26 ---------
 src/app/models/instance.rb                         |    7 +--
 src/app/models/provider.rb                         |    8 +-
 src/app/models/replicated_image.rb                 |    7 ++
 src/app/models/template.rb                         |   59 ++++++++++++++++++++
 src/config/image_warehouse.yml                     |    1 +
 .../20090801045212_create_cloud_accounts.rb        |    3 +
 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  |   17 ++++++
 src/runner/image_builder_service.rb                |   14 ++--
 16 files changed, 142 insertions(+), 170 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/replicated_image.rb
 create mode 100644 src/app/models/template.rb
 create mode 100644 src/config/image_warehouse.yml
 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 5f8e8e1..7cc056f 100644
--- a/src/app/models/cloud_account.rb
+++ b/src/app/models/cloud_account.rb
@@ -101,32 +101,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..d4f4fa4 100644
--- a/src/app/models/image.rb
+++ b/src/app/models/image.rb
@@ -22,49 +22,42 @@
 class Image < ActiveRecord::Base
   include SearchFilter
 
+  before_save :generate_uuid
+
   cattr_reader :per_page
   @@per_page = 15
 
-  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]
+  belongs_to :template
+  has_many :replicated_images, :dependent => :destroy
+  has_many :providers, :through => :replicated_images
 
   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_template_id(data[:template_id], :conditions => {:target => 
data[:target]})
+      Image.new(data).save!
     end
   end
+
+  def self.available_targets
+    return YAML.load_file("#{RAILS_ROOT}/config/image_descriptor_targets.yml")
+  end
+
+  def generate_uuid
+    self.uuid ||= "image-#{self.template_id}-#{Time.now.to_f.to_s}"
+  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/instance.rb b/src/app/models/instance.rb
index 0212e24..d1a0dce 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 :template
   belongs_to :realm
 
   validates_presence_of :pool_id
   validates_presence_of :hardware_profile_id
-  validates_presence_of :image_id
+  validates_presence_of :template_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 0fec5ca..f5701aa 100644
--- a/src/app/models/provider.rb
+++ b/src/app/models/provider.rb
@@ -23,10 +23,10 @@ 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 :replicated_images, :dependent => :destroy
+  has_many :realms, :dependent => :destroy
 
   validates_presence_of :name
   validates_uniqueness_of :name
diff --git a/src/app/models/replicated_image.rb 
b/src/app/models/replicated_image.rb
new file mode 100644
index 0000000..ace66fc
--- /dev/null
+++ b/src/app/models/replicated_image.rb
@@ -0,0 +1,7 @@
+class ReplicatedImage < ActiveRecord::Base
+  belongs_to :provider
+  belongs_to :image
+
+  validates_presence_of :provider_id
+  validates_presence_of :image_id
+end
diff --git a/src/app/models/template.rb b/src/app/models/template.rb
new file mode 100644
index 0000000..6469b04
--- /dev/null
+++ b/src/app/models/template.rb
@@ -0,0 +1,59 @@
+require 'util/image_descriptor_xml'
+require 'typhoeus'
+
+class Template < ActiveRecord::Base
+  has_many :images,  :dependent => :destroy
+  before_validation :update_attrs
+
+  WAREHOUSE_CONFIG = YAML.load_file("#{RAILS_ROOT}/config/image_warehouse.yml")
+
+  validates_presence_of :uuid
+  #validates_presence_of :name
+  validates_uniqueness_of :uuid
+
+  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, :timeout 
=> 30000)
+    if response.code == 200
+      save!
+    else
+      raise "failed to upload template (return code #{response.code}): 
#{response.body}"
+    end
+    return true
+  end
+
+  def update_attrs
+    # TODO: generate real uuid here, e.g. with some ruby uuid generator
+    self.uuid ||= "#{xml.name}-#{Time.now.to_f.to_s}"
+    self.name = xml.name
+    self.summary = xml.description
+  end
+
+  def providers
+    # TODO: rewrite cleanly
+    ReplicatedImage.all(
+      :include => [:image, :provider],
+      :conditions => {:images => {:template_id => self.id}}
+    ).map {|p| p.provider}
+  end
+end
diff --git a/src/config/image_warehouse.yml b/src/config/image_warehouse.yml
new file mode 100644
index 0000000..ccc3571
--- /dev/null
+++ b/src/config/image_warehouse.yml
@@ -0,0 +1 @@
+baseurl: http://localhost:9090/my_bucket/
diff --git a/src/db/migrate/20090801045212_create_cloud_accounts.rb 
b/src/db/migrate/20090801045212_create_cloud_accounts.rb
index fb5d2c5..e1f2e7b 100644
--- a/src/db/migrate/20090801045212_create_cloud_accounts.rb
+++ b/src/db/migrate/20090801045212_create_cloud_accounts.rb
@@ -28,6 +28,9 @@ class CreateCloudAccounts < ActiveRecord::Migration
       t.integer :provider_id, :null => false
       t.integer :quota_id
       t.integer :lock_version, :default => 0
+      t.string  :account_number
+      t.text    :x509_cert_priv
+      t.text    :x509_cert_pub
       t.timestamps
     end
   end
diff --git a/src/db/migrate/20090804140143_create_images.rb 
b/src/db/migrate/20090804140143_create_images.rb
index 8c9c962..3a31c49 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
+      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 :replicated_images do |t|
+      t.integer :image_id, :null => false
+      t.integer :provider_id, :null => false
+      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 :replicated_images
     drop_table :images
   end
 end
diff --git a/src/db/migrate/20090804142049_create_instances.rb 
b/src/db/migrate/20090804142049_create_instances.rb
index 4222782..949ad05 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   :template_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..e3a2ac1
--- /dev/null
+++ b/src/db/migrate/20100830150014_create_templates.rb
@@ -0,0 +1,17 @@
+class CreateTemplates < ActiveRecord::Migration
+  def self.up
+    create_table :templates do |t|
+      t.string  :uuid, :null => false
+      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
diff --git a/src/runner/image_builder_service.rb 
b/src/runner/image_builder_service.rb
index 5d42725..f6a361b 100644
--- a/src/runner/image_builder_service.rb
+++ b/src/runner/image_builder_service.rb
@@ -47,8 +47,8 @@ class ImageBuilderService
   end
 
   def check_for_queued
-    queue = ImageDescriptorTarget.find(:all, :conditions => {:status => 
ImageDescriptorTarget::STATE_QUEUED})
-    cur_builds = ImageDescriptorTarget.find(:all, :conditions => "build_id IS 
NOT NULL AND status != 'complete'")
+    queue = Image.find(:all, :conditions => {:status => Image::STATE_QUEUED})
+    cur_builds = Image.find(:all, :conditions => "build_id IS NOT NULL AND 
status != 'complete'")
     if queue.size > 0 || cur_builds.size > 0
       puts "========================================"
       puts "Queued Builds: " + queue.size.to_s
@@ -66,7 +66,7 @@ class ImageBuilderService
       puts "========================================"
       puts "target: " + descriptor_target.name + ", status: " + 
descriptor_target.status
       puts "========================================"
-      ab = @console.build_image(descriptor_target.image_descriptor.xml.to_xml, 
descriptor_target.name)
+      ab = @console.build_image(descriptor_target.template.xml.to_xml, 
descriptor_target.name)
       if ab
         update_build_list(ab, descriptor_target)
         descriptor_target.build_id = ab.object_id.to_s
@@ -112,8 +112,8 @@ class ImageBuilderService
     puts "========================================"
     puts "Getting ar object to update using " + obj[:build].target.inspect + " 
and " + obj[:ar_id].inspect + " ..."
     puts "========================================"
-    idt = ImageDescriptorTarget.find(:first, :conditions => { :name => 
obj[:build].target.to_s,
-                                                              
:image_descriptor_id => obj[:ar_id].to_i })
+    idt = Image.find(:first, :conditions => { :name => obj[:build].target.to_s,
+                                                              :template_id => 
obj[:ar_id].to_i })
     puts "========================================"
     puts "Updating with status: " + new_status
     puts "========================================"
@@ -143,7 +143,7 @@ class ImageBuilderService
 
   def update_build_list(ab, target)
     @activebuilds <<
-          { :ar_id => target.image_descriptor.id,
+          { :ar_id => target.template.id,
             :build => ab,
             :status => target.status,
             :build_id => ab.object_id.to_s
@@ -151,4 +151,4 @@ class ImageBuilderService
   end
 end
 
-ImageBuilderService.new
\ No newline at end of file
+ImageBuilderService.new
-- 
1.7.2.2

_______________________________________________
deltacloud-devel mailing list
[email protected]
https://fedorahosted.org/mailman/listinfo/deltacloud-devel

Reply via email to