travis-web/assets/scripts/app/models/job.coffee
Piotr Sarnacki 331ccafc87 Put jobs with 'received' status to the running jobs list
The problem with running jobs list was that it didn't show jobs that went to the
worker. The result was a confusing UI - when you look at the running jobs list
you want to know how many concurrent jobs you are using, including jobs that are
still waiting for a VM to boot.
2015-01-23 10:36:43 +01:00

172 lines
4.1 KiB
CoffeeScript

require 'travis/model'
@Travis.Job = Travis.Model.extend Travis.DurationCalculations,
repoId: Ember.attr('string', key: 'repository_id')
buildId: Ember.attr('string')
commitId: Ember.attr('string')
logId: Ember.attr('string')
queue: Ember.attr('string')
state: Ember.attr('string')
number: Ember.attr('string')
_startedAt: Ember.attr('string', key: 'started_at')
_finishedAt: Ember.attr('string', key: 'finished_at')
allowFailure: Ember.attr('boolean')
repositorySlug: Ember.attr('string')
repo: Ember.belongsTo('Travis.Repo', key: 'repository_id')
build: Ember.belongsTo('Travis.Build')
commit: Ember.belongsTo('Travis.Commit')
annotations: Ember.hasMany('Travis.Annotation')
_config: Ember.attr('object', key: 'config')
log: ( ->
@set('isLogAccessed', true)
Travis.Log.create(job: this)
).property()
startedAt: (->
unless @get('notStarted')
@get('_startedAt')
).property('_startedAt', 'notStarted')
finishedAt: (->
unless @get('notStarted')
@get('_finishedAt')
).property('_finishedAt', 'notStarted')
repoSlug: (->
@get('repositorySlug')
).property('repositorySlug')
config: (->
if config = @get('_config')
Travis.Helpers.compact(config)
else
return if @get('isFetchingConfig')
@set 'isFetchingConfig', true
@reload()
).property('_config')
isFinished: (->
@get('state') in ['passed', 'failed', 'errored', 'canceled']
).property('state')
notStarted: (->
@get('state') in ['queued', 'created']
).property('state')
clearLog: ->
# This is needed if we don't want to fetch log just to clear it
if @get('isLogAccessed')
@get('log').clear()
sponsor: (->
{
name: "Blue Box"
url: "http://bluebox.net"
}
).property()
configValues: (->
config = @get('config')
keys = @get('build.rawConfigKeys')
if config && keys
keys.map (key) -> config[key]
else
[]
).property('config', 'build.rawConfigKeys.length')
canCancel: (->
!@get('isFinished')
).property('state')
cancel: (->
Travis.ajax.post "/jobs/#{@get('id')}/cancel"
)
removeLog: ->
Travis.ajax.patch("/jobs/#{@get('id')}/log").then =>
@reloadLog()
reloadLog: ->
@clearLog()
@get('log').fetch()
requeue: ->
Travis.ajax.post "/jobs/#{@get('id')}/restart"
appendLog: (part) ->
@get('log').append part
subscribe: ->
return if @get('subscribed')
@set('subscribed', true)
if Travis.pusher
Travis.pusher.subscribe "job-#{@get('id')}"
unsubscribe: ->
return unless @get('subscribed')
@set('subscribed', false)
if Travis.pusher
Travis.pusher.unsubscribe "job-#{@get('id')}"
onStateChange: (->
@unsubscribe() if @get('state') == 'finished' && Travis.pusher
).observes('state')
isFinished: (->
@get('state') in ['passed', 'failed', 'errored', 'canceled']
).property('state')
# TODO: such formattings should be done in controller, but in order
# to use it there easily, I would have to refactor job and build
# controllers
formattedFinishedAt: (->
if finishedAt = @get('finishedAt')
moment(finishedAt).format('lll')
).property('finishedAt')
canRemoveLog: (->
!@get('log.removed')
).property('log.removed')
slug: (->
"#{@get('repo.slug')} ##{@get('number')}"
).property()
@Travis.Job.reopenClass
queued: ->
filtered = Ember.FilteredRecordArray.create(
modelClass: Travis.Job
filterFunction: (job) ->
['created', 'queued'].indexOf(job.get('state')) != -1
filterProperties: ['state', 'queue']
)
@fetch().then (array) ->
filtered.updateFilter()
filtered.set('isLoaded', true)
filtered
running: ->
filtered = Ember.FilteredRecordArray.create(
modelClass: Travis.Job
filterFunction: (job) ->
['started', 'received'].indexOf(job.get('state')) != -1
filterProperties: ['state']
)
@fetch(state: 'started').then (array) ->
filtered.updateFilter()
filtered.set('isLoaded', true)
filtered