From: Jan Provaznik <[email protected]>
This is first shoot in image/template models refactoring, lotof TODOs
- method for uploading template to warehouse is stubbed, expects uri to template
to be returned
- 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 | 34 +++++++++++++
src/db/migrate/20090804140143_create_images.rb | 22 +++++---
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 | 14 +++++
13 files changed, 94 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..65cb5cb
--- /dev/null
+++ b/src/app/models/template.rb
@@ -0,0 +1,34 @@
+require 'util/image_descriptor_xml'
+
+class Template < ActiveRecord::Base
+ has_many :images, :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
+ @xml ||= ImageDescriptorXML.new(self[:xml].to_s)
+ end
+
+ def upload_template
+ # TODO: upload template to warehouse
+ self.uri = "http://uri_to_warehouse/path_to_template"
+ save!
+ return true
+ end
+end
diff --git a/src/db/migrate/20090804140143_create_images.rb
b/src/db/migrate/20090804140143_create_images.rb
index 8c9c962..75caf87 100644
--- a/src/db/migrate/20090804140143_create_images.rb
+++ b/src/db/migrate/20090804140143_create_images.rb
@@ -22,21 +22,25 @@
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
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..2f3ab14
--- /dev/null
+++ b/src/db/migrate/20100830150014_create_templates.rb
@@ -0,0 +1,14 @@
+class CreateTemplates < ActiveRecord::Migration
+ def self.up
+ create_table :templates do |t|
+ t.binary :xml, :null => false
+ t.string :uri
+ 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
[email protected]
https://fedorahosted.org/mailman/listinfo/deltacloud-devel