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 | 2 +
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 | 15 +++--
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 e5978a1..41250a3 100644
--- a/src/app/models/cloud_account.rb
+++ b/src/app/models/cloud_account.rb
@@ -99,32 +99,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..f3dbf91 100644
--- a/src/db/migrate/20090801045212_create_cloud_accounts.rb
+++ b/src/db/migrate/20090801045212_create_cloud_accounts.rb
@@ -28,6 +28,8 @@ 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
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 42706e1..d06a24c 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..5d386c5 100644
--- a/src/runner/image_builder_service.rb
+++ b/src/runner/image_builder_service.rb
@@ -24,6 +24,7 @@
# ruby image_builder_service.rb
$: << File.join(File.dirname(__FILE__), "../dutils")
+$: << '/home/jprovazn/devel/deltacloud/image_builder/console/lib'
require 'dutils'
require "image_builder_console"
require 'logger'
@@ -47,8 +48,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 +67,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 +113,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 +144,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 +152,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