rosa-build/app/models/product_build_list.rb

183 lines
5.0 KiB
Ruby
Raw Normal View History

2012-01-30 20:39:34 +00:00
# -*- encoding : utf-8 -*-
class ProductBuildList < ActiveRecord::Base
2012-11-06 14:13:16 +00:00
include Modules::Models::CommitAndVersion
include Modules::Models::TimeLiving
include AbfWorker::ModelHelper
2012-11-07 14:32:46 +00:00
delegate :url_helpers, to: 'Rails.application.routes'
2012-11-06 14:13:16 +00:00
BUILD_COMPLETED = 0
BUILD_FAILED = 1
BUILD_PENDING = 2
BUILD_STARTED = 3
BUILD_CANCELED = 4
BUILD_CANCELING = 5
STATUSES = [ BUILD_STARTED,
BUILD_COMPLETED,
BUILD_FAILED,
2012-11-19 16:38:08 +00:00
BUILD_PENDING,
2012-11-19 15:41:59 +00:00
BUILD_CANCELED,
BUILD_CANCELING
]
HUMAN_STATUSES = { BUILD_STARTED => :build_started,
BUILD_COMPLETED => :build_completed,
BUILD_FAILED => :build_failed,
2012-11-19 16:38:08 +00:00
BUILD_PENDING => :build_pending,
2012-11-19 15:41:59 +00:00
BUILD_CANCELED => :build_canceled,
BUILD_CANCELING => :build_canceling
}
belongs_to :product
2012-11-06 14:13:16 +00:00
belongs_to :project
belongs_to :arch
belongs_to :user
2012-11-06 14:13:16 +00:00
validates :product_id,
:status,
:project_id,
:main_script,
:arch_id, :presence => true
validates :status, :inclusion => { :in => STATUSES }
attr_accessor :base_url
2012-11-13 09:27:39 +00:00
attr_accessible :status,
:base_url,
:branch,
:project_id,
:main_script,
:params,
:project_version,
:commit_hash,
:arch_id
attr_readonly :product_id
2012-11-08 21:39:42 +00:00
serialize :results, Array
scope :default_order, order('updated_at DESC')
scope :for_status, lambda {|status| where(:status => status) }
scope :for_user, lambda { |user| where(:user_id => user.id) }
scope :scoped_to_product_name, lambda {|product_name| joins(:product).where('products.name LIKE ?', "%#{product_name}%")}
scope :recent, order("#{table_name}.updated_at DESC")
after_create :add_job_to_abf_worker_queue
before_destroy :can_destroy?
after_destroy :xml_delete_iso_container
state_machine :status, :initial => :build_pending do
event :start_build do
transition :build_pending => :build_started
end
event :cancel do
transition [:build_pending, :build_started] => :build_canceling
end
after_transition :on => :cancel, :do => [:cancel_job]
# :build_canceling => :build_canceled - canceling from UI
# :build_started => :build_canceled - canceling from worker by time-out (time_living has been expired)
event :build_canceled do
2012-12-07 09:10:38 +00:00
transition [:build_canceling, :build_started] => :build_canceled
end
event :build_success do
transition :build_started => :build_completed
end
event :build_error do
transition [:build_started, :build_canceled, :build_canceling] => :build_failed
end
HUMAN_STATUSES.each do |code,name|
state name, :value => code
end
end
2012-11-09 17:42:25 +00:00
def build_started?
status == BUILD_STARTED
end
2012-11-19 15:41:59 +00:00
def build_canceling?
status == BUILD_CANCELING
end
def can_cancel?
[BUILD_STARTED, BUILD_PENDING].include? status
end
def container_path
"/downloads/#{product.platform.name}/product/#{id}/"
end
def event_log_message
{:product => product.name}.inspect
end
def self.human_status(status)
I18n.t("layout.product_build_lists.statuses.#{HUMAN_STATUSES[status]}")
end
def human_status
self.class.human_status(status)
end
def can_destroy?
2012-11-19 16:38:08 +00:00
[BUILD_COMPLETED, BUILD_FAILED, BUILD_CANCELED].include? status
end
protected
2012-12-28 14:00:37 +00:00
def abf_worker_priority
'default'
end
def abf_worker_base_queue
'iso_worker'
end
def abf_worker_base_class
'AbfWorker::IsoWorker'
end
def abf_worker_args
2012-11-07 14:32:46 +00:00
file_name = "#{project.owner.uname}-#{project.name}-#{commit_hash}"
opts = {:host => ActionMailer::Base.default_url_options[:host]}
opts.merge!({:user => user.authentication_token, :password => ''}) if user.present?
2012-11-08 13:04:02 +00:00
srcpath = url_helpers.archive_url(
project.owner,
project.name,
file_name,
'tar.gz',
opts
2012-11-08 13:04:02 +00:00
)
{
2012-11-07 14:32:46 +00:00
:id => id,
2012-11-12 09:41:41 +00:00
# TODO: remove comment
2012-11-19 15:48:14 +00:00
# :srcpath => 'http://dl.dropbox.com/u/945501/avokhmin-test-iso-script-5d9b463d4e9c06ea8e7c89e1b7ff5cb37e99e27f.tar.gz',
:srcpath => srcpath,
2012-11-07 14:32:46 +00:00
:params => params,
:time_living => time_living,
:main_script => main_script,
:arch => arch.name,
:distrib_type => product.platform.distrib_type,
:user => {:uname => user.try(:uname), :email => user.try(:email)}
2012-11-07 14:32:46 +00:00
}
end
def xml_delete_iso_container
# TODO: write new worker for delete
2012-11-09 13:08:56 +00:00
if project
raise "Failed to destroy product_build_list #{id} inside platform #{product.platform.name} (Not Implemented)."
else
2012-11-09 13:08:56 +00:00
result = ProductBuilder.delete_iso_container self
if result == ProductBuilder::SUCCESS
return true
else
raise "Failed to destroy product_build_list #{id} inside platform #{product.platform.name} with code #{result}."
end
end
end
end