app/models/tim/provider_image.rb in tim-0.1.2 vs app/models/tim/provider_image.rb in tim-0.2.0

- old
+ new

@@ -1,39 +1,65 @@ module Tim class ProviderImage < Tim::Base - belongs_to :target_image + belongs_to :target_image, :inverse_of => :provider_images belongs_to :provider_account, :class_name => Tim.provider_account_class accepts_nested_attributes_for :target_image attr_accessible :target_image_attributes + attr_accessible :external_image_id, :if => :imported? attr_accessible :status, :status_detail, :progress #, :as => :image_factory attr_accessible :provider attr_writer :credentials attr_protected :id - after_create :create_factory_provider_image + validates_presence_of :target_image + validates_presence_of :external_image_id, :if => :imported? + after_create :create_factory_provider_image, :unless => :imported? + after_create :create_import, :if => :imported? + + def imported? + target_image.imported? + end + private + def factory_provider_credentials + @credentials + end + + def factory_provider + self.provider + end + def create_factory_provider_image begin - provider_image = ImageFactory::ProviderImage.new(:target_image_id => self.target_image.factory_id, - :provider => self.provider, - :credentials => @credentials, + provider_image = ImageFactory::ProviderImage.new(:credentials => factory_provider_credentials, # TODO Remove this when upgrading to 3.2 # target conflicts with rails 3.0.10 # ActiveRecord::Associations::Association#target :target => target_image.target, :parameters => "") + provider_image.provider = factory_provider # TODO There is a bug in ARes 3.0.10 that will add map name twice when setting in mass assign. So we set # parameters separately. # Setting parameters at mass assign results in json => {"target_image":"parameters":{"parameters":{"..."}}}" # This should be tested and removed if fixed in 3.2 provider_image.parameters = { :callbacks => ["#{ImageFactory::ProviderImage.callback_url}/#{self.id}"] } + if target_image.snapshot? + provider_image.parameters[:snapshot] = true + provider_image.template = self.target_image.template.xml + else + provider_image.target_image_id = self.target_image.factory_id + end + provider_image.save! populate_factory_fields(provider_image) self.save + rescue Errno::ECONNREFUSED + raise Tim::Error::ImagefactoryConnectionRefused.new("Unable to connect"\ + " to Imagefactory server @ #{Tim::ImageFactory::Base.site}") rescue => e # TODO Add proper error handling raise e end end @@ -43,9 +69,19 @@ self.factory_id = factory_provider_image.id self.status_detail = factory_provider_image.status_detail.activity self.progress = factory_provider_image.percent_complete self.provider = factory_provider_image.provider self.external_image_id = factory_provider_image.identifier_on_provider - self.provider_account_id = factory_provider_image.provider_account_identifier + self.factory_provider_account_id = factory_provider_image.provider_account_identifier + end + + # TODO At the moment this method simply sets fields to import defaults. + # We should investigate whether we can check the image exists and if the + # user can access it. Deltacloud? + def create_import + self.status = "COMPLETE" + self.progress = "COMPLETE" + self.status_detail = "Imported Image" + self.save end end end